{
  "version": 3,
  "sources": ["../../../node_modules/jquery/dist/jquery.js", "../../../node_modules/@rails/actioncable/src/adapters.js", "../../../node_modules/@rails/actioncable/src/logger.js", "../../../node_modules/@rails/actioncable/src/connection_monitor.js", "../../../node_modules/@rails/actioncable/src/internal.js", "../../../node_modules/@rails/actioncable/src/connection.js", "../../../node_modules/@rails/actioncable/src/subscription.js", "../../../node_modules/@rails/actioncable/src/subscription_guarantor.js", "../../../node_modules/@rails/actioncable/src/subscriptions.js", "../../../node_modules/@rails/actioncable/src/consumer.js", "../../../node_modules/@rails/actioncable/src/index.js", "../../../node_modules/@rails/activestorage/app/assets/javascripts/activestorage.js", "../../../node_modules/popper.js/src/utils/isBrowser.js", "../../../node_modules/popper.js/src/utils/debounce.js", "../../../node_modules/popper.js/src/utils/isFunction.js", "../../../node_modules/popper.js/src/utils/getStyleComputedProperty.js", "../../../node_modules/popper.js/src/utils/getParentNode.js", "../../../node_modules/popper.js/src/utils/getScrollParent.js", "../../../node_modules/popper.js/src/utils/getReferenceNode.js", "../../../node_modules/popper.js/src/utils/isIE.js", "../../../node_modules/popper.js/src/utils/getOffsetParent.js", "../../../node_modules/popper.js/src/utils/isOffsetContainer.js", "../../../node_modules/popper.js/src/utils/getRoot.js", "../../../node_modules/popper.js/src/utils/findCommonOffsetParent.js", "../../../node_modules/popper.js/src/utils/getScroll.js", "../../../node_modules/popper.js/src/utils/includeScroll.js", "../../../node_modules/popper.js/src/utils/getBordersSize.js", "../../../node_modules/popper.js/src/utils/getWindowSizes.js", "../../../node_modules/popper.js/src/utils/getClientRect.js", "../../../node_modules/popper.js/src/utils/getBoundingClientRect.js", "../../../node_modules/popper.js/src/utils/getOffsetRectRelativeToArbitraryNode.js", "../../../node_modules/popper.js/src/utils/getViewportOffsetRectRelativeToArtbitraryNode.js", "../../../node_modules/popper.js/src/utils/isFixed.js", "../../../node_modules/popper.js/src/utils/getFixedPositionOffsetParent.js", "../../../node_modules/popper.js/src/utils/getBoundaries.js", "../../../node_modules/popper.js/src/utils/computeAutoPlacement.js", "../../../node_modules/popper.js/src/utils/getReferenceOffsets.js", "../../../node_modules/popper.js/src/utils/getOuterSizes.js", "../../../node_modules/popper.js/src/utils/getOppositePlacement.js", "../../../node_modules/popper.js/src/utils/getPopperOffsets.js", "../../../node_modules/popper.js/src/utils/find.js", "../../../node_modules/popper.js/src/utils/findIndex.js", "../../../node_modules/popper.js/src/utils/runModifiers.js", "../../../node_modules/popper.js/src/methods/update.js", "../../../node_modules/popper.js/src/utils/isModifierEnabled.js", "../../../node_modules/popper.js/src/utils/getSupportedPropertyName.js", "../../../node_modules/popper.js/src/methods/destroy.js", "../../../node_modules/popper.js/src/utils/getWindow.js", "../../../node_modules/popper.js/src/utils/setupEventListeners.js", "../../../node_modules/popper.js/src/methods/enableEventListeners.js", "../../../node_modules/popper.js/src/utils/removeEventListeners.js", "../../../node_modules/popper.js/src/methods/disableEventListeners.js", "../../../node_modules/popper.js/src/utils/isNumeric.js", "../../../node_modules/popper.js/src/utils/setStyles.js", "../../../node_modules/popper.js/src/utils/setAttributes.js", "../../../node_modules/popper.js/src/modifiers/applyStyle.js", "../../../node_modules/popper.js/src/utils/getRoundedOffsets.js", "../../../node_modules/popper.js/src/modifiers/computeStyle.js", "../../../node_modules/popper.js/src/utils/isModifierRequired.js", "../../../node_modules/popper.js/src/modifiers/arrow.js", "../../../node_modules/popper.js/src/utils/getOppositeVariation.js", "../../../node_modules/popper.js/src/methods/placements.js", "../../../node_modules/popper.js/src/utils/clockwise.js", "../../../node_modules/popper.js/src/modifiers/flip.js", "../../../node_modules/popper.js/src/modifiers/keepTogether.js", "../../../node_modules/popper.js/src/modifiers/offset.js", "../../../node_modules/popper.js/src/modifiers/preventOverflow.js", "../../../node_modules/popper.js/src/modifiers/shift.js", "../../../node_modules/popper.js/src/modifiers/hide.js", "../../../node_modules/popper.js/src/modifiers/inner.js", "../../../node_modules/popper.js/src/modifiers/index.js", "../../../node_modules/popper.js/src/methods/defaults.js", "../../../node_modules/popper.js/src/index.js", "../../../node_modules/bootstrap/js/src/util.js", "../../../node_modules/bootstrap/js/src/alert.js", "../../../node_modules/bootstrap/js/src/button.js", "../../../node_modules/bootstrap/js/src/carousel.js", "../../../node_modules/bootstrap/js/src/collapse.js", "../../../node_modules/bootstrap/js/src/dropdown.js", "../../../node_modules/bootstrap/js/src/modal.js", "../../../node_modules/bootstrap/js/src/tools/sanitizer.js", "../../../node_modules/bootstrap/js/src/tooltip.js", "../../../node_modules/bootstrap/js/src/popover.js", "../../../node_modules/bootstrap/js/src/scrollspy.js", "../../../node_modules/bootstrap/js/src/tab.js", "../../../node_modules/bootstrap/js/src/toast.js", "../../../node_modules/bootstrap/js/src/index.js", "../../javascript/jquery.js", "../../../node_modules/@hotwired/turbo/dist/turbo.es2017-esm.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/snakeize.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/cable_stream_source_element.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/fetch_requests.js", "../../../node_modules/@hotwired/turbo-rails/app/javascript/turbo/index.js", "../../javascript/application.js", "../../../node_modules/datatables.net-bs4/js/dataTables.bootstrap4.mjs", "../../../node_modules/datatables.net/js/jquery.dataTables.mjs", "../../javascript/homepage/dropdown-toggle.js", "../../javascript/ems/accordion.js", "../../javascript/ems/auto_submit.js", "../../javascript/ems/toggle_table.js"],
  "sourcesContent": ["/*!\n * jQuery JavaScript Library v3.6.4\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2023-03-08T15:28Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket trac-14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n\t\t// Support: Chrome <=57, Firefox <=52\n\t\t// In some browsers, typeof returns \"function\" for HTML <object> elements\n\t\t// (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n\t\t// We don't want to classify *any* DOM node as a function.\n\t\t// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5\n\t\t// Plus for old WebKit, typeof returns \"function\" for HTML collections\n\t\t// (e.g., `typeof document.getElementsByTagName(\"div\") === \"function\"`). (gh-4756)\n\t\treturn typeof obj === \"function\" && typeof obj.nodeType !== \"number\" &&\n\t\t\ttypeof obj.item !== \"function\";\n\t};\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.6.4\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n\tfunction( _i, name ) {\n\t\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n\t} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.10\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2023-02-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trleadingCombinator = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem && elem.namespaceURI,\n\t\tdocElem = elem && ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t// Make sure the the `:has()` argument is parsed unforgivingly.\n\t// We include `*` in the test to detect buggy implementations that are\n\t// _selectively_ forgiving (specifically when the list includes at least\n\t// one valid selector).\n\t// Note that we treat complete lack of support for `:has()` as if it were\n\t// spec-compliant support, which is fine because use of `:has()` in such\n\t// environments will fail in the qSA path and fall back to jQuery traversal\n\t// anyway.\n\tsupport.cssHas = assert( function() {\n\t\ttry {\n\t\t\tdocument.querySelector( \":has(*,:jqfake)\" );\n\t\t\treturn false;\n\t\t} catch ( e ) {\n\t\t\treturn true;\n\t\t}\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\tif ( !support.cssHas ) {\n\n\t\t// Support: Chrome 105 - 110+, Safari 15.4 - 16.3+\n\t\t// Our regular `try-catch` mechanism fails to detect natively-unsupported\n\t\t// pseudo-classes inside `:has()` (such as `:has(:contains(\"Foo\"))`)\n\t\t// in browsers that parse the `:has()` argument as a forgiving selector list.\n\t\t// https://drafts.csswg.org/selectors/#relational now requires the argument\n\t\t// to be parsed unforgivingly, but browsers have not yet fully adjusted.\n\t\trbuggyQSA.push( \":has\" );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\n\t\t\t// Support: IE <9 only\n\t\t\t// IE doesn't have `contains` on `document` so we need to check for\n\t\t\t// `documentElement` presence.\n\t\t\t// We need to fall back to `a` when `documentElement` is missing\n\t\t\t// as `ownerDocument` of elements within `<template/>` may have\n\t\t\t// a null one - a default behavior of all modern browsers.\n\t\t\tvar adown = a.nodeType === 9 && a.documentElement || a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE <10 only\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rleadingCombinator.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n}\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521)\n\t// Strict HTML recognition (trac-11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the primary Deferred\n\t\t\tprimary = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tprimary.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( primary.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn primary.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );\n\t\t}\n\n\t\treturn primary.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See trac-6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\t\tvalue :\n\t\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (trac-9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see trac-8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (trac-14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (trac-11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (trac-14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (trac-13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (trac-15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (trac-12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar rtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (trac-13208)\n\t\t\t\t// Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (trac-13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\n\t\t\t\t\t\t// Support: Chrome 86+\n\t\t\t\t\t\t// In Chrome, if an element having a focusout handler is blurred by\n\t\t\t\t\t\t// clicking outside of it, it invokes the handler synchronously. If\n\t\t\t\t\t\t// that handler calls `.remove()` on the element, the data is cleared,\n\t\t\t\t\t\t// leaving `result` undefined. We need to guard against this.\n\t\t\t\t\t\treturn result && result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (trac-504, trac-13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\twhich: true\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\t// Suppress native focus or blur if we're currently inside\n\t\t// a leveraged native-event stack\n\t\t_default: function( event ) {\n\t\t\treturn dataPriv.get( event.target, type );\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\n\trcleanScript = /^\\s*<!\\[CDATA\\[|\\]\\]>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (trac-8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Unwrap a CDATA section containing script contents. This shouldn't be\n\t\t\t\t\t\t\t// needed as in XML documents they're already not visible when\n\t\t\t\t\t\t\t// inspecting element contents and in HTML documents they have no\n\t\t\t\t\t\t\t// meaning but we're preserving that logic for backwards compatibility.\n\t\t\t\t\t\t\t// This will be removed completely in 4.0. See gh-4904.\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar rcustomProp = /^--/;\n\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\nvar whitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\";\n\n\nvar rtrimCSS = new RegExp(\n\t\"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\",\n\t\"g\"\n);\n\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (trac-8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\t//\n\t\t// Support: Firefox 70+\n\t\t// Only Firefox includes border widths\n\t\t// in computed dimensions. (gh-4529)\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px;border-collapse:separate\";\n\t\t\t\ttr.style.cssText = \"border:1px solid\";\n\n\t\t\t\t// Support: Chrome 86+\n\t\t\t\t// Height set through cssText does not get applied.\n\t\t\t\t// Computed height then comes back as 0.\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\t// Support: Android 8 Chrome 86+\n\t\t\t\t// In our bodyBackground.html iframe,\n\t\t\t\t// display for all div elements is set to \"inline\",\n\t\t\t\t// which causes a problem only in Android 8 Chrome 86.\n\t\t\t\t// Ensuring the div is display: block\n\t\t\t\t// gets around this issue.\n\t\t\t\ttrChild.style.display = \"block\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderTopWidth, 10 ) +\n\t\t\t\t\tparseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\t\tisCustomProp = rcustomProp.test( name ),\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, trac-12537)\n\t//   .css('--customProperty) (gh-3144)\n\tif ( computed ) {\n\n\t\t// Support: IE <=9 - 11+\n\t\t// IE only supports `\"float\"` in `getPropertyValue`; in computed styles\n\t\t// it's only available as `\"cssFloat\"`. We no longer modify properties\n\t\t// sent to `.css()` apart from camelCasing, so we need to check both.\n\t\t// Normally, this would create difference in behavior: if\n\t\t// `getPropertyValue` returns an empty string, the value returned\n\t\t// by `.css()` would be `undefined`. This is usually the case for\n\t\t// disconnected elements. However, in IE even disconnected elements\n\t\t// with no styles return `\"none\"` for `getPropertyValue( \"float\" )`\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( isCustomProp && ret ) {\n\n\t\t\t// Support: Firefox 105+, Chrome <=105+\n\t\t\t// Spec requires trimming whitespace for custom properties (gh-4926).\n\t\t\t// Firefox only trims leading whitespace. Chrome just collapses\n\t\t\t// both leading & trailing whitespace to a single space.\n\t\t\t//\n\t\t\t// Fall back to `undefined` if empty string returned.\n\t\t\t// This collapses a missing definition with property defined\n\t\t\t// and set to an empty string but there's no standard API\n\t\t\t// allowing us to differentiate them without a performance penalty\n\t\t\t// and returning `undefined` aligns with older jQuery.\n\t\t\t//\n\t\t\t// rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED\n\t\t\t// as whitespace while CSS does not, but this is not a problem\n\t\t\t// because CSS preprocessing replaces them with U+000A LINE FEED\n\t\t\t// (which *is* CSS whitespace)\n\t\t\t// https://www.w3.org/TR/css-syntax-3/#input-preprocessing\n\t\t\tret = ret.replace( rtrimCSS, \"$1\" ) || undefined;\n\t\t}\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (trac-7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug trac-9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (trac-7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t} ) :\n\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\n\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// Use proper attribute retrieval (trac-12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + className + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += className + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classNames, cur, curValue, className, i, finalValue;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\tif ( classNames.length ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tcurValue = getClass( this );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = this.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + className + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + className + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\tthis.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar classNames, className, i, self,\n\t\t\ttype = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tclassNames = classesToArray( value );\n\n\t\treturn this.each( function() {\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\tself = jQuery( this );\n\n\t\t\t\tfor ( i = 0; i < classNames.length; i++ ) {\n\t\t\t\t\tclassName = classNames[ i ];\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (trac-14686, trac-14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (trac-2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (trac-9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || Object.create( null ) )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (trac-6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml, parserErrorElem;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {}\n\n\tparserErrorElem = xml && xml.getElementsByTagName( \"parsererror\" )[ 0 ];\n\tif ( !xml || parserErrorElem ) {\n\t\tjQuery.error( \"Invalid XML: \" + (\n\t\t\tparserErrorElem ?\n\t\t\t\tjQuery.map( parserErrorElem.childNodes, function( el ) {\n\t\t\t\t\treturn el.textContent;\n\t\t\t\t} ).join( \"\\n\" ) :\n\t\t\t\tdata\n\t\t) );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} ).filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} ).map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// trac-7653, trac-8125, trac-8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\noriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes trac-9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (trac-10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket trac-12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// trac-9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script but not if jsonp\n\t\t\tif ( !isSuccess &&\n\t\t\t\tjQuery.inArray( \"script\", s.dataTypes ) > -1 &&\n\t\t\t\tjQuery.inArray( \"json\", s.dataTypes ) < 0 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (trac-11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// trac-1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see trac-8605, trac-14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// trac-14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( {\n\t\tpadding: \"inner\" + name,\n\t\tcontent: type,\n\t\t\"\": \"outer\" + name\n\t}, function( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each(\n\t( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t}\n);\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\n// Require that the \"whitespace run\" starts from a non-whitespace\n// to avoid O(N^2) behavior when the engine would try matching \"\\s+$\" at each space position.\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|([^\\s\\uFEFF\\xA0])[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"$1\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (trac-7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (trac-13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n", "export default {\n  logger: typeof console !== \"undefined\" ? console : undefined,\n  WebSocket: typeof WebSocket !== \"undefined\" ? WebSocket : undefined,\n}\n", "import adapters from \"./adapters\"\n\n// The logger is disabled by default. You can enable it with:\n//\n//   ActionCable.logger.enabled = true\n//\n//   Example:\n//\n//   import * as ActionCable from '@rails/actioncable'\n//\n//   ActionCable.logger.enabled = true\n//   ActionCable.logger.log('Connection Established.')\n//\n\nexport default {\n  log(...messages) {\n    if (this.enabled) {\n      messages.push(Date.now())\n      adapters.logger.log(\"[ActionCable]\", ...messages)\n    }\n  },\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring the cable connection is in good health by validating the heartbeat pings sent from the server, and attempting\n// revival reconnections if things go astray. Internal class, not intended for direct user manipulation.\n\nconst now = () => new Date().getTime()\n\nconst secondsSince = time => (now() - time) / 1000\n\nclass ConnectionMonitor {\n  constructor(connection) {\n    this.visibilityDidChange = this.visibilityDidChange.bind(this)\n    this.connection = connection\n    this.reconnectAttempts = 0\n  }\n\n  start() {\n    if (!this.isRunning()) {\n      this.startedAt = now()\n      delete this.stoppedAt\n      this.startPolling()\n      addEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(`ConnectionMonitor started. stale threshold = ${this.constructor.staleThreshold} s`)\n    }\n  }\n\n  stop() {\n    if (this.isRunning()) {\n      this.stoppedAt = now()\n      this.stopPolling()\n      removeEventListener(\"visibilitychange\", this.visibilityDidChange)\n      logger.log(\"ConnectionMonitor stopped\")\n    }\n  }\n\n  isRunning() {\n    return this.startedAt && !this.stoppedAt\n  }\n\n  recordMessage() {\n    this.pingedAt = now()\n  }\n\n  recordConnect() {\n    this.reconnectAttempts = 0\n    delete this.disconnectedAt\n    logger.log(\"ConnectionMonitor recorded connect\")\n  }\n\n  recordDisconnect() {\n    this.disconnectedAt = now()\n    logger.log(\"ConnectionMonitor recorded disconnect\")\n  }\n\n  // Private\n\n  startPolling() {\n    this.stopPolling()\n    this.poll()\n  }\n\n  stopPolling() {\n    clearTimeout(this.pollTimeout)\n  }\n\n  poll() {\n    this.pollTimeout = setTimeout(() => {\n      this.reconnectIfStale()\n      this.poll()\n    }\n    , this.getPollInterval())\n  }\n\n  getPollInterval() {\n    const { staleThreshold, reconnectionBackoffRate } = this.constructor\n    const backoff = Math.pow(1 + reconnectionBackoffRate, Math.min(this.reconnectAttempts, 10))\n    const jitterMax = this.reconnectAttempts === 0 ? 1.0 : reconnectionBackoffRate\n    const jitter = jitterMax * Math.random()\n    return staleThreshold * 1000 * backoff * (1 + jitter)\n  }\n\n  reconnectIfStale() {\n    if (this.connectionIsStale()) {\n      logger.log(`ConnectionMonitor detected stale connection. reconnectAttempts = ${this.reconnectAttempts}, time stale = ${secondsSince(this.refreshedAt)} s, stale threshold = ${this.constructor.staleThreshold} s`)\n      this.reconnectAttempts++\n      if (this.disconnectedRecently()) {\n        logger.log(`ConnectionMonitor skipping reopening recent disconnect. time disconnected = ${secondsSince(this.disconnectedAt)} s`)\n      } else {\n        logger.log(\"ConnectionMonitor reopening\")\n        this.connection.reopen()\n      }\n    }\n  }\n\n  get refreshedAt() {\n    return this.pingedAt ? this.pingedAt : this.startedAt\n  }\n\n  connectionIsStale() {\n    return secondsSince(this.refreshedAt) > this.constructor.staleThreshold\n  }\n\n  disconnectedRecently() {\n    return this.disconnectedAt && (secondsSince(this.disconnectedAt) < this.constructor.staleThreshold)\n  }\n\n  visibilityDidChange() {\n    if (document.visibilityState === \"visible\") {\n      setTimeout(() => {\n        if (this.connectionIsStale() || !this.connection.isOpen()) {\n          logger.log(`ConnectionMonitor reopening stale connection on visibilitychange. visibilityState = ${document.visibilityState}`)\n          this.connection.reopen()\n        }\n      }\n      , 200)\n    }\n  }\n\n}\n\nConnectionMonitor.staleThreshold = 6 // Server::Connections::BEAT_INTERVAL * 2 (missed two pings)\nConnectionMonitor.reconnectionBackoffRate = 0.15\n\nexport default ConnectionMonitor\n", "export default {\n  \"message_types\": {\n    \"welcome\": \"welcome\",\n    \"disconnect\": \"disconnect\",\n    \"ping\": \"ping\",\n    \"confirmation\": \"confirm_subscription\",\n    \"rejection\": \"reject_subscription\"\n  },\n  \"disconnect_reasons\": {\n    \"unauthorized\": \"unauthorized\",\n    \"invalid_request\": \"invalid_request\",\n    \"server_restart\": \"server_restart\",\n    \"remote\": \"remote\"\n  },\n  \"default_mount_path\": \"/cable\",\n  \"protocols\": [\n    \"actioncable-v1-json\",\n    \"actioncable-unsupported\"\n  ]\n}\n", "import adapters from \"./adapters\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\n\n// Encapsulate the cable connection held by the consumer. This is an internal class not intended for direct user manipulation.\n\nconst {message_types, protocols} = INTERNAL\nconst supportedProtocols = protocols.slice(0, protocols.length - 1)\n\nconst indexOf = [].indexOf\n\nclass Connection {\n  constructor(consumer) {\n    this.open = this.open.bind(this)\n    this.consumer = consumer\n    this.subscriptions = this.consumer.subscriptions\n    this.monitor = new ConnectionMonitor(this)\n    this.disconnected = true\n  }\n\n  send(data) {\n    if (this.isOpen()) {\n      this.webSocket.send(JSON.stringify(data))\n      return true\n    } else {\n      return false\n    }\n  }\n\n  open() {\n    if (this.isActive()) {\n      logger.log(`Attempted to open WebSocket, but existing socket is ${this.getState()}`)\n      return false\n    } else {\n      const socketProtocols = [...protocols, ...this.consumer.subprotocols || []]\n      logger.log(`Opening WebSocket, current state is ${this.getState()}, subprotocols: ${socketProtocols}`)\n      if (this.webSocket) { this.uninstallEventHandlers() }\n      this.webSocket = new adapters.WebSocket(this.consumer.url, socketProtocols)\n      this.installEventHandlers()\n      this.monitor.start()\n      return true\n    }\n  }\n\n  close({allowReconnect} = {allowReconnect: true}) {\n    if (!allowReconnect) { this.monitor.stop() }\n    // Avoid closing websockets in a \"connecting\" state due to Safari 15.1+ bug. See: https://github.com/rails/rails/issues/43835#issuecomment-1002288478\n    if (this.isOpen()) {\n      return this.webSocket.close()\n    }\n  }\n\n  reopen() {\n    logger.log(`Reopening WebSocket, current state is ${this.getState()}`)\n    if (this.isActive()) {\n      try {\n        return this.close()\n      } catch (error) {\n        logger.log(\"Failed to reopen WebSocket\", error)\n      }\n      finally {\n        logger.log(`Reopening WebSocket in ${this.constructor.reopenDelay}ms`)\n        setTimeout(this.open, this.constructor.reopenDelay)\n      }\n    } else {\n      return this.open()\n    }\n  }\n\n  getProtocol() {\n    if (this.webSocket) {\n      return this.webSocket.protocol\n    }\n  }\n\n  isOpen() {\n    return this.isState(\"open\")\n  }\n\n  isActive() {\n    return this.isState(\"open\", \"connecting\")\n  }\n\n  triedToReconnect() {\n    return this.monitor.reconnectAttempts > 0\n  }\n\n  // Private\n\n  isProtocolSupported() {\n    return indexOf.call(supportedProtocols, this.getProtocol()) >= 0\n  }\n\n  isState(...states) {\n    return indexOf.call(states, this.getState()) >= 0\n  }\n\n  getState() {\n    if (this.webSocket) {\n      for (let state in adapters.WebSocket) {\n        if (adapters.WebSocket[state] === this.webSocket.readyState) {\n          return state.toLowerCase()\n        }\n      }\n    }\n    return null\n  }\n\n  installEventHandlers() {\n    for (let eventName in this.events) {\n      const handler = this.events[eventName].bind(this)\n      this.webSocket[`on${eventName}`] = handler\n    }\n  }\n\n  uninstallEventHandlers() {\n    for (let eventName in this.events) {\n      this.webSocket[`on${eventName}`] = function() {}\n    }\n  }\n\n}\n\nConnection.reopenDelay = 500\n\nConnection.prototype.events = {\n  message(event) {\n    if (!this.isProtocolSupported()) { return }\n    const {identifier, message, reason, reconnect, type} = JSON.parse(event.data)\n    this.monitor.recordMessage()\n    switch (type) {\n      case message_types.welcome:\n        if (this.triedToReconnect()) {\n          this.reconnectAttempted = true\n        }\n        this.monitor.recordConnect()\n        return this.subscriptions.reload()\n      case message_types.disconnect:\n        logger.log(`Disconnecting. Reason: ${reason}`)\n        return this.close({allowReconnect: reconnect})\n      case message_types.ping:\n        return null\n      case message_types.confirmation:\n        this.subscriptions.confirmSubscription(identifier)\n        if (this.reconnectAttempted) {\n          this.reconnectAttempted = false\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: true})\n        } else {\n          return this.subscriptions.notify(identifier, \"connected\", {reconnected: false})\n        }\n      case message_types.rejection:\n        return this.subscriptions.reject(identifier)\n      default:\n        return this.subscriptions.notify(identifier, \"received\", message)\n    }\n  },\n\n  open() {\n    logger.log(`WebSocket onopen event, using '${this.getProtocol()}' subprotocol`)\n    this.disconnected = false\n    if (!this.isProtocolSupported()) {\n      logger.log(\"Protocol is unsupported. Stopping monitor and disconnecting.\")\n      return this.close({allowReconnect: false})\n    }\n  },\n\n  close(event) {\n    logger.log(\"WebSocket onclose event\")\n    if (this.disconnected) { return }\n    this.disconnected = true\n    this.monitor.recordDisconnect()\n    return this.subscriptions.notifyAll(\"disconnected\", {willAttemptReconnect: this.monitor.isRunning()})\n  },\n\n  error() {\n    logger.log(\"WebSocket onerror event\")\n  }\n}\n\nexport default Connection\n", "// A new subscription is created through the ActionCable.Subscriptions instance available on the consumer.\n// It provides a number of callbacks and a method for calling remote procedure calls on the corresponding\n// Channel instance on the server side.\n//\n// An example demonstrates the basic functionality:\n//\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\", {\n//     connected() {\n//       // Called once the subscription has been successfully completed\n//     },\n//\n//     disconnected({ willAttemptReconnect: boolean }) {\n//       // Called when the client has disconnected with the server.\n//       // The object will have an `willAttemptReconnect` property which\n//       // says whether the client has the intention of attempting\n//       // to reconnect.\n//     },\n//\n//     appear() {\n//       this.perform('appear', {appearing_on: this.appearingOn()})\n//     },\n//\n//     away() {\n//       this.perform('away')\n//     },\n//\n//     appearingOn() {\n//       $('main').data('appearing-on')\n//     }\n//   })\n//\n// The methods #appear and #away forward their intent to the remote AppearanceChannel instance on the server\n// by calling the `perform` method with the first parameter being the action (which maps to AppearanceChannel#appear/away).\n// The second parameter is a hash that'll get JSON encoded and made available on the server in the data parameter.\n//\n// This is how the server component would look:\n//\n//   class AppearanceChannel < ApplicationActionCable::Channel\n//     def subscribed\n//       current_user.appear\n//     end\n//\n//     def unsubscribed\n//       current_user.disappear\n//     end\n//\n//     def appear(data)\n//       current_user.appear on: data['appearing_on']\n//     end\n//\n//     def away\n//       current_user.away\n//     end\n//   end\n//\n// The \"AppearanceChannel\" name is automatically mapped between the client-side subscription creation and the server-side Ruby class name.\n// The AppearanceChannel#appear/away public methods are exposed automatically to client-side invocation through the perform method.\n\nconst extend = function(object, properties) {\n  if (properties != null) {\n    for (let key in properties) {\n      const value = properties[key]\n      object[key] = value\n    }\n  }\n  return object\n}\n\nexport default class Subscription {\n  constructor(consumer, params = {}, mixin) {\n    this.consumer = consumer\n    this.identifier = JSON.stringify(params)\n    extend(this, mixin)\n  }\n\n  // Perform a channel action with the optional data passed as an attribute\n  perform(action, data = {}) {\n    data.action = action\n    return this.send(data)\n  }\n\n  send(data) {\n    return this.consumer.send({command: \"message\", identifier: this.identifier, data: JSON.stringify(data)})\n  }\n\n  unsubscribe() {\n    return this.consumer.subscriptions.remove(this)\n  }\n}\n", "import logger from \"./logger\"\n\n// Responsible for ensuring channel subscribe command is confirmed, retrying until confirmation is received.\n// Internal class, not intended for direct user manipulation.\n\nclass SubscriptionGuarantor {\n  constructor(subscriptions) {\n    this.subscriptions = subscriptions\n    this.pendingSubscriptions = []\n  }\n\n  guarantee(subscription) {\n    if(this.pendingSubscriptions.indexOf(subscription) == -1){ \n      logger.log(`SubscriptionGuarantor guaranteeing ${subscription.identifier}`)\n      this.pendingSubscriptions.push(subscription) \n    }\n    else {\n      logger.log(`SubscriptionGuarantor already guaranteeing ${subscription.identifier}`)\n    }\n    this.startGuaranteeing()\n  }\n\n  forget(subscription) {\n    logger.log(`SubscriptionGuarantor forgetting ${subscription.identifier}`)\n    this.pendingSubscriptions = (this.pendingSubscriptions.filter((s) => s !== subscription))\n  }\n\n  startGuaranteeing() {\n    this.stopGuaranteeing()\n    this.retrySubscribing()\n  }\n  \n  stopGuaranteeing() {\n    clearTimeout(this.retryTimeout)\n  }\n\n  retrySubscribing() {\n    this.retryTimeout = setTimeout(() => {\n      if (this.subscriptions && typeof(this.subscriptions.subscribe) === \"function\") {\n        this.pendingSubscriptions.map((subscription) => {\n          logger.log(`SubscriptionGuarantor resubscribing ${subscription.identifier}`)\n          this.subscriptions.subscribe(subscription)\n        })\n      }\n    }\n    , 500)\n  }\n}\n\nexport default SubscriptionGuarantor", "import logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\n\n// Collection class for creating (and internally managing) channel subscriptions.\n// The only method intended to be triggered by the user is ActionCable.Subscriptions#create,\n// and it should be called through the consumer like so:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n\nexport default class Subscriptions {\n  constructor(consumer) {\n    this.consumer = consumer\n    this.guarantor = new SubscriptionGuarantor(this)\n    this.subscriptions = []\n  }\n\n  create(channelName, mixin) {\n    const channel = channelName\n    const params = typeof channel === \"object\" ? channel : {channel}\n    const subscription = new Subscription(this.consumer, params, mixin)\n    return this.add(subscription)\n  }\n\n  // Private\n\n  add(subscription) {\n    this.subscriptions.push(subscription)\n    this.consumer.ensureActiveConnection()\n    this.notify(subscription, \"initialized\")\n    this.subscribe(subscription)\n    return subscription\n  }\n\n  remove(subscription) {\n    this.forget(subscription)\n    if (!this.findAll(subscription.identifier).length) {\n      this.sendCommand(subscription, \"unsubscribe\")\n    }\n    return subscription\n  }\n\n  reject(identifier) {\n    return this.findAll(identifier).map((subscription) => {\n      this.forget(subscription)\n      this.notify(subscription, \"rejected\")\n      return subscription\n    })\n  }\n\n  forget(subscription) {\n    this.guarantor.forget(subscription)\n    this.subscriptions = (this.subscriptions.filter((s) => s !== subscription))\n    return subscription\n  }\n\n  findAll(identifier) {\n    return this.subscriptions.filter((s) => s.identifier === identifier)\n  }\n\n  reload() {\n    return this.subscriptions.map((subscription) =>\n      this.subscribe(subscription))\n  }\n\n  notifyAll(callbackName, ...args) {\n    return this.subscriptions.map((subscription) =>\n      this.notify(subscription, callbackName, ...args))\n  }\n\n  notify(subscription, callbackName, ...args) {\n    let subscriptions\n    if (typeof subscription === \"string\") {\n      subscriptions = this.findAll(subscription)\n    } else {\n      subscriptions = [subscription]\n    }\n\n    return subscriptions.map((subscription) =>\n      (typeof subscription[callbackName] === \"function\" ? subscription[callbackName](...args) : undefined))\n  }\n\n  subscribe(subscription) {\n    if (this.sendCommand(subscription, \"subscribe\")) {\n      this.guarantor.guarantee(subscription)\n    }\n  }\n\n  confirmSubscription(identifier) {\n    logger.log(`Subscription confirmed ${identifier}`)\n    this.findAll(identifier).map((subscription) =>\n      this.guarantor.forget(subscription))\n  }\n\n  sendCommand(subscription, command) {\n    const {identifier} = subscription\n    return this.consumer.send({command, identifier})\n  }\n}\n", "import Connection from \"./connection\"\nimport Subscriptions from \"./subscriptions\"\n\n// The ActionCable.Consumer establishes the connection to a server-side Ruby Connection object. Once established,\n// the ActionCable.ConnectionMonitor will ensure that its properly maintained through heartbeats and checking for stale updates.\n// The Consumer instance is also the gateway to establishing subscriptions to desired channels through the #createSubscription\n// method.\n//\n// The following example shows how this can be set up:\n//\n//   App = {}\n//   App.cable = ActionCable.createConsumer(\"ws://example.com/accounts/1\")\n//   App.appearance = App.cable.subscriptions.create(\"AppearanceChannel\")\n//\n// For more details on how you'd configure an actual channel subscription, see ActionCable.Subscription.\n//\n// When a consumer is created, it automatically connects with the server.\n//\n// To disconnect from the server, call\n//\n//   App.cable.disconnect()\n//\n// and to restart the connection:\n//\n//   App.cable.connect()\n//\n// Any channel subscriptions which existed prior to disconnecting will\n// automatically resubscribe.\n\nexport default class Consumer {\n  constructor(url) {\n    this._url = url\n    this.subscriptions = new Subscriptions(this)\n    this.connection = new Connection(this)\n    this.subprotocols = []\n  }\n\n  get url() {\n    return createWebSocketURL(this._url)\n  }\n\n  send(data) {\n    return this.connection.send(data)\n  }\n\n  connect() {\n    return this.connection.open()\n  }\n\n  disconnect() {\n    return this.connection.close({allowReconnect: false})\n  }\n\n  ensureActiveConnection() {\n    if (!this.connection.isActive()) {\n      return this.connection.open()\n    }\n  }\n\n  addSubProtocol(subprotocol) {\n    this.subprotocols = [...this.subprotocols, subprotocol]\n  }\n}\n\nexport function createWebSocketURL(url) {\n  if (typeof url === \"function\") {\n    url = url()\n  }\n\n  if (url && !/^wss?:/i.test(url)) {\n    const a = document.createElement(\"a\")\n    a.href = url\n    // Fix populating Location properties in IE. Otherwise, protocol will be blank.\n    a.href = a.href // eslint-disable-line\n    a.protocol = a.protocol.replace(\"http\", \"ws\")\n    return a.href\n  } else {\n    return url\n  }\n}\n", "import adapters from \"./adapters\"\nimport Connection from \"./connection\"\nimport ConnectionMonitor from \"./connection_monitor\"\nimport Consumer, { createWebSocketURL } from \"./consumer\"\nimport INTERNAL from \"./internal\"\nimport logger from \"./logger\"\nimport Subscription from \"./subscription\"\nimport SubscriptionGuarantor from \"./subscription_guarantor\"\nimport Subscriptions from \"./subscriptions\"\n\nexport {\n  Connection,\n  ConnectionMonitor,\n  Consumer,\n  INTERNAL,\n  Subscription,\n  Subscriptions,\n  SubscriptionGuarantor,\n  adapters,\n  createWebSocketURL,\n  logger,\n}\n\nexport function createConsumer(url = getConfig(\"url\") || INTERNAL.default_mount_path) {\n  return new Consumer(url)\n}\n\nexport function getConfig(name) {\n  const element = document.head.querySelector(`meta[name='action-cable-${name}']`)\n  if (element) {\n    return element.getAttribute(\"content\")\n  }\n}\n", "(function(global, factory) {\n  typeof exports === \"object\" && typeof module !== \"undefined\" ? factory(exports) : typeof define === \"function\" && define.amd ? define([ \"exports\" ], factory) : factory(global.ActiveStorage = {});\n})(this, function(exports) {\n  \"use strict\";\n  function createCommonjsModule(fn, module) {\n    return module = {\n      exports: {}\n    }, fn(module, module.exports), module.exports;\n  }\n  var sparkMd5 = createCommonjsModule(function(module, exports) {\n    (function(factory) {\n      {\n        module.exports = factory();\n      }\n    })(function(undefined) {\n      var hex_chr = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n      function md5cycle(x, k) {\n        var a = x[0], b = x[1], c = x[2], d = x[3];\n        a += (b & c | ~b & d) + k[0] - 680876936 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[1] - 389564586 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[2] + 606105819 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[3] - 1044525330 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[4] - 176418897 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[5] + 1200080426 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[6] - 1473231341 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[7] - 45705983 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[8] + 1770035416 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[9] - 1958414417 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[10] - 42063 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[11] - 1990404162 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & c | ~b & d) + k[12] + 1804603682 | 0;\n        a = (a << 7 | a >>> 25) + b | 0;\n        d += (a & b | ~a & c) + k[13] - 40341101 | 0;\n        d = (d << 12 | d >>> 20) + a | 0;\n        c += (d & a | ~d & b) + k[14] - 1502002290 | 0;\n        c = (c << 17 | c >>> 15) + d | 0;\n        b += (c & d | ~c & a) + k[15] + 1236535329 | 0;\n        b = (b << 22 | b >>> 10) + c | 0;\n        a += (b & d | c & ~d) + k[1] - 165796510 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[6] - 1069501632 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[11] + 643717713 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[0] - 373897302 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[5] - 701558691 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[10] + 38016083 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[15] - 660478335 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[4] - 405537848 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[9] + 568446438 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[14] - 1019803690 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[3] - 187363961 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[8] + 1163531501 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b & d | c & ~d) + k[13] - 1444681467 | 0;\n        a = (a << 5 | a >>> 27) + b | 0;\n        d += (a & c | b & ~c) + k[2] - 51403784 | 0;\n        d = (d << 9 | d >>> 23) + a | 0;\n        c += (d & b | a & ~b) + k[7] + 1735328473 | 0;\n        c = (c << 14 | c >>> 18) + d | 0;\n        b += (c & a | d & ~a) + k[12] - 1926607734 | 0;\n        b = (b << 20 | b >>> 12) + c | 0;\n        a += (b ^ c ^ d) + k[5] - 378558 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[8] - 2022574463 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[11] + 1839030562 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[14] - 35309556 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[1] - 1530992060 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[4] + 1272893353 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[7] - 155497632 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[10] - 1094730640 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[13] + 681279174 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[0] - 358537222 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[3] - 722521979 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[6] + 76029189 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (b ^ c ^ d) + k[9] - 640364487 | 0;\n        a = (a << 4 | a >>> 28) + b | 0;\n        d += (a ^ b ^ c) + k[12] - 421815835 | 0;\n        d = (d << 11 | d >>> 21) + a | 0;\n        c += (d ^ a ^ b) + k[15] + 530742520 | 0;\n        c = (c << 16 | c >>> 16) + d | 0;\n        b += (c ^ d ^ a) + k[2] - 995338651 | 0;\n        b = (b << 23 | b >>> 9) + c | 0;\n        a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;\n        a = (a << 6 | a >>> 26) + b | 0;\n        d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;\n        d = (d << 10 | d >>> 22) + a | 0;\n        c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;\n        c = (c << 15 | c >>> 17) + d | 0;\n        b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;\n        b = (b << 21 | b >>> 11) + c | 0;\n        x[0] = a + x[0] | 0;\n        x[1] = b + x[1] | 0;\n        x[2] = c + x[2] | 0;\n        x[3] = d + x[3] | 0;\n      }\n      function md5blk(s) {\n        var md5blks = [], i;\n        for (i = 0; i < 64; i += 4) {\n          md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);\n        }\n        return md5blks;\n      }\n      function md5blk_array(a) {\n        var md5blks = [], i;\n        for (i = 0; i < 64; i += 4) {\n          md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);\n        }\n        return md5blks;\n      }\n      function md51(s) {\n        var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n        for (i = 64; i <= n; i += 64) {\n          md5cycle(state, md5blk(s.substring(i - 64, i)));\n        }\n        s = s.substring(i - 64);\n        length = s.length;\n        tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);\n        }\n        tail[i >> 2] |= 128 << (i % 4 << 3);\n        if (i > 55) {\n          md5cycle(state, tail);\n          for (i = 0; i < 16; i += 1) {\n            tail[i] = 0;\n          }\n        }\n        tmp = n * 8;\n        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n        lo = parseInt(tmp[2], 16);\n        hi = parseInt(tmp[1], 16) || 0;\n        tail[14] = lo;\n        tail[15] = hi;\n        md5cycle(state, tail);\n        return state;\n      }\n      function md51_array(a) {\n        var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;\n        for (i = 64; i <= n; i += 64) {\n          md5cycle(state, md5blk_array(a.subarray(i - 64, i)));\n        }\n        a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);\n        length = a.length;\n        tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= a[i] << (i % 4 << 3);\n        }\n        tail[i >> 2] |= 128 << (i % 4 << 3);\n        if (i > 55) {\n          md5cycle(state, tail);\n          for (i = 0; i < 16; i += 1) {\n            tail[i] = 0;\n          }\n        }\n        tmp = n * 8;\n        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n        lo = parseInt(tmp[2], 16);\n        hi = parseInt(tmp[1], 16) || 0;\n        tail[14] = lo;\n        tail[15] = hi;\n        md5cycle(state, tail);\n        return state;\n      }\n      function rhex(n) {\n        var s = \"\", j;\n        for (j = 0; j < 4; j += 1) {\n          s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];\n        }\n        return s;\n      }\n      function hex(x) {\n        var i;\n        for (i = 0; i < x.length; i += 1) {\n          x[i] = rhex(x[i]);\n        }\n        return x.join(\"\");\n      }\n      if (hex(md51(\"hello\")) !== \"5d41402abc4b2a76b9719d911017c592\") ;\n      if (typeof ArrayBuffer !== \"undefined\" && !ArrayBuffer.prototype.slice) {\n        (function() {\n          function clamp(val, length) {\n            val = val | 0 || 0;\n            if (val < 0) {\n              return Math.max(val + length, 0);\n            }\n            return Math.min(val, length);\n          }\n          ArrayBuffer.prototype.slice = function(from, to) {\n            var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;\n            if (to !== undefined) {\n              end = clamp(to, length);\n            }\n            if (begin > end) {\n              return new ArrayBuffer(0);\n            }\n            num = end - begin;\n            target = new ArrayBuffer(num);\n            targetArray = new Uint8Array(target);\n            sourceArray = new Uint8Array(this, begin, num);\n            targetArray.set(sourceArray);\n            return target;\n          };\n        })();\n      }\n      function toUtf8(str) {\n        if (/[\\u0080-\\uFFFF]/.test(str)) {\n          str = unescape(encodeURIComponent(str));\n        }\n        return str;\n      }\n      function utf8Str2ArrayBuffer(str, returnUInt8Array) {\n        var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;\n        for (i = 0; i < length; i += 1) {\n          arr[i] = str.charCodeAt(i);\n        }\n        return returnUInt8Array ? arr : buff;\n      }\n      function arrayBuffer2Utf8Str(buff) {\n        return String.fromCharCode.apply(null, new Uint8Array(buff));\n      }\n      function concatenateArrayBuffers(first, second, returnUInt8Array) {\n        var result = new Uint8Array(first.byteLength + second.byteLength);\n        result.set(new Uint8Array(first));\n        result.set(new Uint8Array(second), first.byteLength);\n        return returnUInt8Array ? result : result.buffer;\n      }\n      function hexToBinaryString(hex) {\n        var bytes = [], length = hex.length, x;\n        for (x = 0; x < length - 1; x += 2) {\n          bytes.push(parseInt(hex.substr(x, 2), 16));\n        }\n        return String.fromCharCode.apply(String, bytes);\n      }\n      function SparkMD5() {\n        this.reset();\n      }\n      SparkMD5.prototype.append = function(str) {\n        this.appendBinary(toUtf8(str));\n        return this;\n      };\n      SparkMD5.prototype.appendBinary = function(contents) {\n        this._buff += contents;\n        this._length += contents.length;\n        var length = this._buff.length, i;\n        for (i = 64; i <= length; i += 64) {\n          md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));\n        }\n        this._buff = this._buff.substring(i - 64);\n        return this;\n      };\n      SparkMD5.prototype.end = function(raw) {\n        var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);\n        }\n        this._finish(tail, length);\n        ret = hex(this._hash);\n        if (raw) {\n          ret = hexToBinaryString(ret);\n        }\n        this.reset();\n        return ret;\n      };\n      SparkMD5.prototype.reset = function() {\n        this._buff = \"\";\n        this._length = 0;\n        this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n        return this;\n      };\n      SparkMD5.prototype.getState = function() {\n        return {\n          buff: this._buff,\n          length: this._length,\n          hash: this._hash\n        };\n      };\n      SparkMD5.prototype.setState = function(state) {\n        this._buff = state.buff;\n        this._length = state.length;\n        this._hash = state.hash;\n        return this;\n      };\n      SparkMD5.prototype.destroy = function() {\n        delete this._hash;\n        delete this._buff;\n        delete this._length;\n      };\n      SparkMD5.prototype._finish = function(tail, length) {\n        var i = length, tmp, lo, hi;\n        tail[i >> 2] |= 128 << (i % 4 << 3);\n        if (i > 55) {\n          md5cycle(this._hash, tail);\n          for (i = 0; i < 16; i += 1) {\n            tail[i] = 0;\n          }\n        }\n        tmp = this._length * 8;\n        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);\n        lo = parseInt(tmp[2], 16);\n        hi = parseInt(tmp[1], 16) || 0;\n        tail[14] = lo;\n        tail[15] = hi;\n        md5cycle(this._hash, tail);\n      };\n      SparkMD5.hash = function(str, raw) {\n        return SparkMD5.hashBinary(toUtf8(str), raw);\n      };\n      SparkMD5.hashBinary = function(content, raw) {\n        var hash = md51(content), ret = hex(hash);\n        return raw ? hexToBinaryString(ret) : ret;\n      };\n      SparkMD5.ArrayBuffer = function() {\n        this.reset();\n      };\n      SparkMD5.ArrayBuffer.prototype.append = function(arr) {\n        var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;\n        this._length += arr.byteLength;\n        for (i = 64; i <= length; i += 64) {\n          md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));\n        }\n        this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);\n        return this;\n      };\n      SparkMD5.ArrayBuffer.prototype.end = function(raw) {\n        var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;\n        for (i = 0; i < length; i += 1) {\n          tail[i >> 2] |= buff[i] << (i % 4 << 3);\n        }\n        this._finish(tail, length);\n        ret = hex(this._hash);\n        if (raw) {\n          ret = hexToBinaryString(ret);\n        }\n        this.reset();\n        return ret;\n      };\n      SparkMD5.ArrayBuffer.prototype.reset = function() {\n        this._buff = new Uint8Array(0);\n        this._length = 0;\n        this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];\n        return this;\n      };\n      SparkMD5.ArrayBuffer.prototype.getState = function() {\n        var state = SparkMD5.prototype.getState.call(this);\n        state.buff = arrayBuffer2Utf8Str(state.buff);\n        return state;\n      };\n      SparkMD5.ArrayBuffer.prototype.setState = function(state) {\n        state.buff = utf8Str2ArrayBuffer(state.buff, true);\n        return SparkMD5.prototype.setState.call(this, state);\n      };\n      SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;\n      SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;\n      SparkMD5.ArrayBuffer.hash = function(arr, raw) {\n        var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);\n        return raw ? hexToBinaryString(ret) : ret;\n      };\n      return SparkMD5;\n    });\n  });\n  var classCallCheck = function(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n  var createClass = function() {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n    return function(Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n  var fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;\n  var FileChecksum = function() {\n    createClass(FileChecksum, null, [ {\n      key: \"create\",\n      value: function create(file, callback) {\n        var instance = new FileChecksum(file);\n        instance.create(callback);\n      }\n    } ]);\n    function FileChecksum(file) {\n      classCallCheck(this, FileChecksum);\n      this.file = file;\n      this.chunkSize = 2097152;\n      this.chunkCount = Math.ceil(this.file.size / this.chunkSize);\n      this.chunkIndex = 0;\n    }\n    createClass(FileChecksum, [ {\n      key: \"create\",\n      value: function create(callback) {\n        var _this = this;\n        this.callback = callback;\n        this.md5Buffer = new sparkMd5.ArrayBuffer();\n        this.fileReader = new FileReader();\n        this.fileReader.addEventListener(\"load\", function(event) {\n          return _this.fileReaderDidLoad(event);\n        });\n        this.fileReader.addEventListener(\"error\", function(event) {\n          return _this.fileReaderDidError(event);\n        });\n        this.readNextChunk();\n      }\n    }, {\n      key: \"fileReaderDidLoad\",\n      value: function fileReaderDidLoad(event) {\n        this.md5Buffer.append(event.target.result);\n        if (!this.readNextChunk()) {\n          var binaryDigest = this.md5Buffer.end(true);\n          var base64digest = btoa(binaryDigest);\n          this.callback(null, base64digest);\n        }\n      }\n    }, {\n      key: \"fileReaderDidError\",\n      value: function fileReaderDidError(event) {\n        this.callback(\"Error reading \" + this.file.name);\n      }\n    }, {\n      key: \"readNextChunk\",\n      value: function readNextChunk() {\n        if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {\n          var start = this.chunkIndex * this.chunkSize;\n          var end = Math.min(start + this.chunkSize, this.file.size);\n          var bytes = fileSlice.call(this.file, start, end);\n          this.fileReader.readAsArrayBuffer(bytes);\n          this.chunkIndex++;\n          return true;\n        } else {\n          return false;\n        }\n      }\n    } ]);\n    return FileChecksum;\n  }();\n  function getMetaValue(name) {\n    var element = findElement(document.head, 'meta[name=\"' + name + '\"]');\n    if (element) {\n      return element.getAttribute(\"content\");\n    }\n  }\n  function findElements(root, selector) {\n    if (typeof root == \"string\") {\n      selector = root;\n      root = document;\n    }\n    var elements = root.querySelectorAll(selector);\n    return toArray$1(elements);\n  }\n  function findElement(root, selector) {\n    if (typeof root == \"string\") {\n      selector = root;\n      root = document;\n    }\n    return root.querySelector(selector);\n  }\n  function dispatchEvent(element, type) {\n    var eventInit = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n    var disabled = element.disabled;\n    var bubbles = eventInit.bubbles, cancelable = eventInit.cancelable, detail = eventInit.detail;\n    var event = document.createEvent(\"Event\");\n    event.initEvent(type, bubbles || true, cancelable || true);\n    event.detail = detail || {};\n    try {\n      element.disabled = false;\n      element.dispatchEvent(event);\n    } finally {\n      element.disabled = disabled;\n    }\n    return event;\n  }\n  function toArray$1(value) {\n    if (Array.isArray(value)) {\n      return value;\n    } else if (Array.from) {\n      return Array.from(value);\n    } else {\n      return [].slice.call(value);\n    }\n  }\n  var BlobRecord = function() {\n    function BlobRecord(file, checksum, url) {\n      var _this = this;\n      classCallCheck(this, BlobRecord);\n      this.file = file;\n      this.attributes = {\n        filename: file.name,\n        content_type: file.type,\n        byte_size: file.size,\n        checksum: checksum\n      };\n      this.xhr = new XMLHttpRequest();\n      this.xhr.open(\"POST\", url, true);\n      this.xhr.responseType = \"json\";\n      this.xhr.setRequestHeader(\"Content-Type\", \"application/json\");\n      this.xhr.setRequestHeader(\"Accept\", \"application/json\");\n      this.xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n      var csrfToken = getMetaValue(\"csrf-token\");\n      if (csrfToken != undefined) {\n        this.xhr.setRequestHeader(\"X-CSRF-Token\", csrfToken);\n      }\n      this.xhr.addEventListener(\"load\", function(event) {\n        return _this.requestDidLoad(event);\n      });\n      this.xhr.addEventListener(\"error\", function(event) {\n        return _this.requestDidError(event);\n      });\n    }\n    createClass(BlobRecord, [ {\n      key: \"create\",\n      value: function create(callback) {\n        this.callback = callback;\n        this.xhr.send(JSON.stringify({\n          blob: this.attributes\n        }));\n      }\n    }, {\n      key: \"requestDidLoad\",\n      value: function requestDidLoad(event) {\n        if (this.status >= 200 && this.status < 300) {\n          var response = this.response;\n          var direct_upload = response.direct_upload;\n          delete response.direct_upload;\n          this.attributes = response;\n          this.directUploadData = direct_upload;\n          this.callback(null, this.toJSON());\n        } else {\n          this.requestDidError(event);\n        }\n      }\n    }, {\n      key: \"requestDidError\",\n      value: function requestDidError(event) {\n        this.callback('Error creating Blob for \"' + this.file.name + '\". Status: ' + this.status);\n      }\n    }, {\n      key: \"toJSON\",\n      value: function toJSON() {\n        var result = {};\n        for (var key in this.attributes) {\n          result[key] = this.attributes[key];\n        }\n        return result;\n      }\n    }, {\n      key: \"status\",\n      get: function get$$1() {\n        return this.xhr.status;\n      }\n    }, {\n      key: \"response\",\n      get: function get$$1() {\n        var _xhr = this.xhr, responseType = _xhr.responseType, response = _xhr.response;\n        if (responseType == \"json\") {\n          return response;\n        } else {\n          return JSON.parse(response);\n        }\n      }\n    } ]);\n    return BlobRecord;\n  }();\n  var BlobUpload = function() {\n    function BlobUpload(blob) {\n      var _this = this;\n      classCallCheck(this, BlobUpload);\n      this.blob = blob;\n      this.file = blob.file;\n      var _blob$directUploadDat = blob.directUploadData, url = _blob$directUploadDat.url, headers = _blob$directUploadDat.headers;\n      this.xhr = new XMLHttpRequest();\n      this.xhr.open(\"PUT\", url, true);\n      this.xhr.responseType = \"text\";\n      for (var key in headers) {\n        this.xhr.setRequestHeader(key, headers[key]);\n      }\n      this.xhr.addEventListener(\"load\", function(event) {\n        return _this.requestDidLoad(event);\n      });\n      this.xhr.addEventListener(\"error\", function(event) {\n        return _this.requestDidError(event);\n      });\n    }\n    createClass(BlobUpload, [ {\n      key: \"create\",\n      value: function create(callback) {\n        this.callback = callback;\n        this.xhr.send(this.file.slice());\n      }\n    }, {\n      key: \"requestDidLoad\",\n      value: function requestDidLoad(event) {\n        var _xhr = this.xhr, status = _xhr.status, response = _xhr.response;\n        if (status >= 200 && status < 300) {\n          this.callback(null, response);\n        } else {\n          this.requestDidError(event);\n        }\n      }\n    }, {\n      key: \"requestDidError\",\n      value: function requestDidError(event) {\n        this.callback('Error storing \"' + this.file.name + '\". Status: ' + this.xhr.status);\n      }\n    } ]);\n    return BlobUpload;\n  }();\n  var id = 0;\n  var DirectUpload = function() {\n    function DirectUpload(file, url, delegate) {\n      classCallCheck(this, DirectUpload);\n      this.id = ++id;\n      this.file = file;\n      this.url = url;\n      this.delegate = delegate;\n    }\n    createClass(DirectUpload, [ {\n      key: \"create\",\n      value: function create(callback) {\n        var _this = this;\n        FileChecksum.create(this.file, function(error, checksum) {\n          if (error) {\n            callback(error);\n            return;\n          }\n          var blob = new BlobRecord(_this.file, checksum, _this.url);\n          notify(_this.delegate, \"directUploadWillCreateBlobWithXHR\", blob.xhr);\n          blob.create(function(error) {\n            if (error) {\n              callback(error);\n            } else {\n              var upload = new BlobUpload(blob);\n              notify(_this.delegate, \"directUploadWillStoreFileWithXHR\", upload.xhr);\n              upload.create(function(error) {\n                if (error) {\n                  callback(error);\n                } else {\n                  callback(null, blob.toJSON());\n                }\n              });\n            }\n          });\n        });\n      }\n    } ]);\n    return DirectUpload;\n  }();\n  function notify(object, methodName) {\n    if (object && typeof object[methodName] == \"function\") {\n      for (var _len = arguments.length, messages = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n        messages[_key - 2] = arguments[_key];\n      }\n      return object[methodName].apply(object, messages);\n    }\n  }\n  var DirectUploadController = function() {\n    function DirectUploadController(input, file) {\n      classCallCheck(this, DirectUploadController);\n      this.input = input;\n      this.file = file;\n      this.directUpload = new DirectUpload(this.file, this.url, this);\n      this.dispatch(\"initialize\");\n    }\n    createClass(DirectUploadController, [ {\n      key: \"start\",\n      value: function start(callback) {\n        var _this = this;\n        var hiddenInput = document.createElement(\"input\");\n        hiddenInput.type = \"hidden\";\n        hiddenInput.name = this.input.name;\n        this.input.insertAdjacentElement(\"beforebegin\", hiddenInput);\n        this.dispatch(\"start\");\n        this.directUpload.create(function(error, attributes) {\n          if (error) {\n            hiddenInput.parentNode.removeChild(hiddenInput);\n            _this.dispatchError(error);\n          } else {\n            hiddenInput.value = attributes.signed_id;\n          }\n          _this.dispatch(\"end\");\n          callback(error);\n        });\n      }\n    }, {\n      key: \"uploadRequestDidProgress\",\n      value: function uploadRequestDidProgress(event) {\n        var progress = event.loaded / event.total * 100;\n        if (progress) {\n          this.dispatch(\"progress\", {\n            progress: progress\n          });\n        }\n      }\n    }, {\n      key: \"dispatch\",\n      value: function dispatch(name) {\n        var detail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        detail.file = this.file;\n        detail.id = this.directUpload.id;\n        return dispatchEvent(this.input, \"direct-upload:\" + name, {\n          detail: detail\n        });\n      }\n    }, {\n      key: \"dispatchError\",\n      value: function dispatchError(error) {\n        var event = this.dispatch(\"error\", {\n          error: error\n        });\n        if (!event.defaultPrevented) {\n          alert(error);\n        }\n      }\n    }, {\n      key: \"directUploadWillCreateBlobWithXHR\",\n      value: function directUploadWillCreateBlobWithXHR(xhr) {\n        this.dispatch(\"before-blob-request\", {\n          xhr: xhr\n        });\n      }\n    }, {\n      key: \"directUploadWillStoreFileWithXHR\",\n      value: function directUploadWillStoreFileWithXHR(xhr) {\n        var _this2 = this;\n        this.dispatch(\"before-storage-request\", {\n          xhr: xhr\n        });\n        xhr.upload.addEventListener(\"progress\", function(event) {\n          return _this2.uploadRequestDidProgress(event);\n        });\n      }\n    }, {\n      key: \"url\",\n      get: function get$$1() {\n        return this.input.getAttribute(\"data-direct-upload-url\");\n      }\n    } ]);\n    return DirectUploadController;\n  }();\n  var inputSelector = \"input[type=file][data-direct-upload-url]:not([disabled])\";\n  var DirectUploadsController = function() {\n    function DirectUploadsController(form) {\n      classCallCheck(this, DirectUploadsController);\n      this.form = form;\n      this.inputs = findElements(form, inputSelector).filter(function(input) {\n        return input.files.length;\n      });\n    }\n    createClass(DirectUploadsController, [ {\n      key: \"start\",\n      value: function start(callback) {\n        var _this = this;\n        var controllers = this.createDirectUploadControllers();\n        var startNextController = function startNextController() {\n          var controller = controllers.shift();\n          if (controller) {\n            controller.start(function(error) {\n              if (error) {\n                callback(error);\n                _this.dispatch(\"end\");\n              } else {\n                startNextController();\n              }\n            });\n          } else {\n            callback();\n            _this.dispatch(\"end\");\n          }\n        };\n        this.dispatch(\"start\");\n        startNextController();\n      }\n    }, {\n      key: \"createDirectUploadControllers\",\n      value: function createDirectUploadControllers() {\n        var controllers = [];\n        this.inputs.forEach(function(input) {\n          toArray$1(input.files).forEach(function(file) {\n            var controller = new DirectUploadController(input, file);\n            controllers.push(controller);\n          });\n        });\n        return controllers;\n      }\n    }, {\n      key: \"dispatch\",\n      value: function dispatch(name) {\n        var detail = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        return dispatchEvent(this.form, \"direct-uploads:\" + name, {\n          detail: detail\n        });\n      }\n    } ]);\n    return DirectUploadsController;\n  }();\n  var processingAttribute = \"data-direct-uploads-processing\";\n  var submitButtonsByForm = new WeakMap();\n  var started = false;\n  function start() {\n    if (!started) {\n      started = true;\n      document.addEventListener(\"click\", didClick, true);\n      document.addEventListener(\"submit\", didSubmitForm);\n      document.addEventListener(\"ajax:before\", didSubmitRemoteElement);\n    }\n  }\n  function didClick(event) {\n    var target = event.target;\n    if ((target.tagName == \"INPUT\" || target.tagName == \"BUTTON\") && target.type == \"submit\" && target.form) {\n      submitButtonsByForm.set(target.form, target);\n    }\n  }\n  function didSubmitForm(event) {\n    handleFormSubmissionEvent(event);\n  }\n  function didSubmitRemoteElement(event) {\n    if (event.target.tagName == \"FORM\") {\n      handleFormSubmissionEvent(event);\n    }\n  }\n  function handleFormSubmissionEvent(event) {\n    var form = event.target;\n    if (form.hasAttribute(processingAttribute)) {\n      event.preventDefault();\n      return;\n    }\n    var controller = new DirectUploadsController(form);\n    var inputs = controller.inputs;\n    if (inputs.length) {\n      event.preventDefault();\n      form.setAttribute(processingAttribute, \"\");\n      inputs.forEach(disable);\n      controller.start(function(error) {\n        form.removeAttribute(processingAttribute);\n        if (error) {\n          inputs.forEach(enable);\n        } else {\n          submitForm(form);\n        }\n      });\n    }\n  }\n  function submitForm(form) {\n    var button = submitButtonsByForm.get(form) || findElement(form, \"input[type=submit], button[type=submit]\");\n    if (button) {\n      var _button = button, disabled = _button.disabled;\n      button.disabled = false;\n      button.focus();\n      button.click();\n      button.disabled = disabled;\n    } else {\n      button = document.createElement(\"input\");\n      button.type = \"submit\";\n      button.style.display = \"none\";\n      form.appendChild(button);\n      button.click();\n      form.removeChild(button);\n    }\n    submitButtonsByForm.delete(form);\n  }\n  function disable(input) {\n    input.disabled = true;\n  }\n  function enable(input) {\n    input.disabled = false;\n  }\n  function autostart() {\n    if (window.ActiveStorage) {\n      start();\n    }\n  }\n  setTimeout(autostart, 1);\n  exports.start = start;\n  exports.DirectUpload = DirectUpload;\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n});\n", "export default typeof window !== 'undefined' && typeof document !== 'undefined' && typeof navigator !== 'undefined';\n", "import isBrowser from './isBrowser';\n\nconst timeoutDuration = (function(){\n  const longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  for (let i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      return 1;\n    }\n  }\n  return 0;\n}());\n\nexport function microtaskDebounce(fn) {\n  let called = false\n  return () => {\n    if (called) {\n      return\n    }\n    called = true\n    window.Promise.resolve().then(() => {\n      called = false\n      fn()\n    })\n  }\n}\n\nexport function taskDebounce(fn) {\n  let scheduled = false;\n  return () => {\n    if (!scheduled) {\n      scheduled = true;\n      setTimeout(() => {\n        scheduled = false;\n        fn();\n      }, timeoutDuration);\n    }\n  };\n}\n\nconst supportsMicroTasks = isBrowser && window.Promise\n\n\n/**\n* Create a debounced version of a method, that's asynchronously deferred\n* but called in the minimum time possible.\n*\n* @method\n* @memberof Popper.Utils\n* @argument {Function} fn\n* @returns {Function}\n*/\nexport default (supportsMicroTasks\n  ? microtaskDebounce\n  : taskDebounce);\n", "/**\n * Check if the given variable is a function\n * @method\n * @memberof Popper.Utils\n * @argument {Any} functionToCheck - variable to check\n * @returns {Boolean} answer to: is a function?\n */\nexport default function isFunction(functionToCheck) {\n  const getType = {};\n  return (\n    functionToCheck &&\n    getType.toString.call(functionToCheck) === '[object Function]'\n  );\n}\n", "/**\n * Get CSS computed property of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Eement} element\n * @argument {String} property\n */\nexport default function getStyleComputedProperty(element, property) {\n  if (element.nodeType !== 1) {\n    return [];\n  }\n  // NOTE: 1 DOM access here\n  const window = element.ownerDocument.defaultView;\n  const css = window.getComputedStyle(element, null);\n  return property ? css[property] : css;\n}\n", "/**\n * Returns the parentNode or the host of the element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} parent\n */\nexport default function getParentNode(element) {\n  if (element.nodeName === 'HTML') {\n    return element;\n  }\n  return element.parentNode || element.host;\n}\n", "import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Returns the scrolling parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} scroll parent\n */\nexport default function getScrollParent(element) {\n  // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n  if (!element) {\n    return document.body\n  }\n\n  switch (element.nodeName) {\n    case 'HTML':\n    case 'BODY':\n      return element.ownerDocument.body\n    case '#document':\n      return element.body\n  }\n\n  // Firefox want us to check `-x` and `-y` variations as well\n  const { overflow, overflowX, overflowY } = getStyleComputedProperty(element);\n  if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n    return element;\n  }\n\n  return getScrollParent(getParentNode(element));\n}\n", "/**\n * Returns the reference node of the reference object, or the reference object itself.\n * @method\n * @memberof Popper.Utils\n * @param {Element|Object} reference - the reference element (the popper will be relative to this)\n * @returns {Element} parent\n */\nexport default function getReferenceNode(reference) {\n  return reference && reference.referenceNode ? reference.referenceNode : reference;\n}\n", "import isBrowser from './isBrowser';\n\nconst isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\nconst isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n/**\n * Determines if the browser is Internet Explorer\n * @method\n * @memberof Popper.Utils\n * @param {Number} version to check\n * @returns {Boolean} isIE\n */\nexport default function isIE(version) {\n  if (version === 11) {\n    return isIE11;\n  }\n  if (version === 10) {\n    return isIE10;\n  }\n  return isIE11 || isIE10;\n}\n", "import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Returns the offset parent of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} offset parent\n */\nexport default function getOffsetParent(element) {\n  if (!element) {\n    return document.documentElement;\n  }\n\n  const noOffsetParent = isIE(10) ? document.body : null;\n\n  // NOTE: 1 DOM access here\n  let offsetParent = element.offsetParent || null;\n  // Skip hidden elements which don't have an offsetParent\n  while (offsetParent === noOffsetParent && element.nextElementSibling) {\n    offsetParent = (element = element.nextElementSibling).offsetParent;\n  }\n\n  const nodeName = offsetParent && offsetParent.nodeName;\n\n  if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n    return element ? element.ownerDocument.documentElement : document.documentElement;\n  }\n\n  // .offsetParent will return the closest TH, TD or TABLE in case\n  // no offsetParent is present, I hate this job...\n  if (\n    ['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 &&\n    getStyleComputedProperty(offsetParent, 'position') === 'static'\n  ) {\n    return getOffsetParent(offsetParent);\n  }\n\n  return offsetParent;\n}\n", "import getOffsetParent from './getOffsetParent';\n\nexport default function isOffsetContainer(element) {\n  const { nodeName } = element;\n  if (nodeName === 'BODY') {\n    return false;\n  }\n  return (\n    nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element\n  );\n}\n", "/**\n * Finds the root node (document, shadowDOM root) of the given element\n * @method\n * @memberof Popper.Utils\n * @argument {Element} node\n * @returns {Element} root node\n */\nexport default function getRoot(node) {\n  if (node.parentNode !== null) {\n    return getRoot(node.parentNode);\n  }\n\n  return node;\n}\n", "import isOffsetContainer from './isOffsetContainer';\nimport getRoot from './getRoot';\nimport getOffsetParent from './getOffsetParent';\n\n/**\n * Finds the offset parent common to the two provided nodes\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element1\n * @argument {Element} element2\n * @returns {Element} common offset parent\n */\nexport default function findCommonOffsetParent(element1, element2) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n  if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n    return document.documentElement;\n  }\n\n  // Here we make sure to give as \"start\" the element that comes first in the DOM\n  const order =\n    element1.compareDocumentPosition(element2) &\n    Node.DOCUMENT_POSITION_FOLLOWING;\n  const start = order ? element1 : element2;\n  const end = order ? element2 : element1;\n\n  // Get common ancestor container\n  const range = document.createRange();\n  range.setStart(start, 0);\n  range.setEnd(end, 0);\n  const { commonAncestorContainer } = range;\n\n  // Both nodes are inside #document\n  if (\n    (element1 !== commonAncestorContainer &&\n      element2 !== commonAncestorContainer) ||\n    start.contains(end)\n  ) {\n    if (isOffsetContainer(commonAncestorContainer)) {\n      return commonAncestorContainer;\n    }\n\n    return getOffsetParent(commonAncestorContainer);\n  }\n\n  // one of the nodes is inside shadowDOM, find which one\n  const element1root = getRoot(element1);\n  if (element1root.host) {\n    return findCommonOffsetParent(element1root.host, element2);\n  } else {\n    return findCommonOffsetParent(element1, getRoot(element2).host);\n  }\n}\n", "/**\n * Gets the scroll value of the given element in the given side (top and left)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {String} side `top` or `left`\n * @returns {number} amount of scrolled pixels\n */\nexport default function getScroll(element, side = 'top') {\n  const upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n  const nodeName = element.nodeName;\n\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    const html = element.ownerDocument.documentElement;\n    const scrollingElement = element.ownerDocument.scrollingElement || html;\n    return scrollingElement[upperSide];\n  }\n\n  return element[upperSide];\n}\n", "import getScroll from './getScroll';\n\n/*\n * Sum or subtract the element scroll values (left and top) from a given rect object\n * @method\n * @memberof Popper.Utils\n * @param {Object} rect - Rect object you want to change\n * @param {HTMLElement} element - The element from the function reads the scroll values\n * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n * @return {Object} rect - The modifier rect object\n */\nexport default function includeScroll(rect, element, subtract = false) {\n  const scrollTop = getScroll(element, 'top');\n  const scrollLeft = getScroll(element, 'left');\n  const modifier = subtract ? -1 : 1;\n  rect.top += scrollTop * modifier;\n  rect.bottom += scrollTop * modifier;\n  rect.left += scrollLeft * modifier;\n  rect.right += scrollLeft * modifier;\n  return rect;\n}\n", "/*\n * Helper to detect borders of a given element\n * @method\n * @memberof Popper.Utils\n * @param {CSSStyleDeclaration} styles\n * Result of `getStyleComputedProperty` on the given element\n * @param {String} axis - `x` or `y`\n * @return {number} borders - The borders size of the given axis\n */\n\nexport default function getBordersSize(styles, axis) {\n  const sideA = axis === 'x' ? 'Left' : 'Top';\n  const sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n  return (\n    parseFloat(styles[`border${sideA}Width`], 10) +\n    parseFloat(styles[`border${sideB}Width`], 10)\n  );\n}\n", "import isIE from './isIE';\n\nfunction getSize(axis, body, html, computedStyle) {\n  return Math.max(\n    body[`offset${axis}`],\n    body[`scroll${axis}`],\n    html[`client${axis}`],\n    html[`offset${axis}`],\n    html[`scroll${axis}`],\n    isIE(10)\n      ? (parseInt(html[`offset${axis}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Top' : 'Left'}`]) + \n      parseInt(computedStyle[`margin${axis === 'Height' ? 'Bottom' : 'Right'}`]))\n    : 0 \n  );\n}\n\nexport default function getWindowSizes(document) {\n  const body = document.body;\n  const html = document.documentElement;\n  const computedStyle = isIE(10) && getComputedStyle(html);\n\n  return {\n    height: getSize('Height', body, html, computedStyle),\n    width: getSize('Width', body, html, computedStyle),\n  };\n}\n", "/**\n * Given element offsets, generate an output similar to getBoundingClientRect\n * @method\n * @memberof Popper.Utils\n * @argument {Object} offsets\n * @returns {Object} ClientRect like output\n */\nexport default function getClientRect(offsets) {\n  return {\n    ...offsets,\n    right: offsets.left + offsets.width,\n    bottom: offsets.top + offsets.height,\n  };\n}\n", "import getStyleComputedProperty from './getStyleComputedProperty';\nimport getBordersSize from './getBordersSize';\nimport getWindowSizes from './getWindowSizes';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\nimport isIE from './isIE';\n\n/**\n * Get bounding client rect of given element\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} element\n * @return {Object} client rect\n */\nexport default function getBoundingClientRect(element) {\n  let rect = {};\n\n  // IE10 10 FIX: Please, don't ask, the element isn't\n  // considered in DOM in some circumstances...\n  // This isn't reproducible in IE10 compatibility mode of IE11\n  try {\n    if (isIE(10)) {\n      rect = element.getBoundingClientRect();\n      const scrollTop = getScroll(element, 'top');\n      const scrollLeft = getScroll(element, 'left');\n      rect.top += scrollTop;\n      rect.left += scrollLeft;\n      rect.bottom += scrollTop;\n      rect.right += scrollLeft;\n    }\n    else {\n      rect = element.getBoundingClientRect();\n    }\n  }\n  catch(e){}\n\n  const result = {\n    left: rect.left,\n    top: rect.top,\n    width: rect.right - rect.left,\n    height: rect.bottom - rect.top,\n  };\n\n  // subtract scrollbar size from sizes\n  const sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n  const width =\n    sizes.width || element.clientWidth || result.width;\n  const height =\n    sizes.height || element.clientHeight || result.height;\n\n  let horizScrollbar = element.offsetWidth - width;\n  let vertScrollbar = element.offsetHeight - height;\n\n  // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n  // we make this check conditional for performance reasons\n  if (horizScrollbar || vertScrollbar) {\n    const styles = getStyleComputedProperty(element);\n    horizScrollbar -= getBordersSize(styles, 'x');\n    vertScrollbar -= getBordersSize(styles, 'y');\n\n    result.width -= horizScrollbar;\n    result.height -= vertScrollbar;\n  }\n\n  return getClientRect(result);\n}\n", "import getStyleComputedProperty from './getStyleComputedProperty';\nimport includeScroll from './includeScroll';\nimport getScrollParent from './getScrollParent';\nimport getBoundingClientRect from './getBoundingClientRect';\nimport runIsIE from './isIE';\nimport getClientRect from './getClientRect';\n\nexport default function getOffsetRectRelativeToArbitraryNode(children, parent, fixedPosition = false) {\n  const isIE10 = runIsIE(10);\n  const isHTML = parent.nodeName === 'HTML';\n  const childrenRect = getBoundingClientRect(children);\n  const parentRect = getBoundingClientRect(parent);\n  const scrollParent = getScrollParent(children);\n\n  const styles = getStyleComputedProperty(parent);\n  const borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n  const borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n  // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n  if(fixedPosition && isHTML) {\n    parentRect.top = Math.max(parentRect.top, 0);\n    parentRect.left = Math.max(parentRect.left, 0);\n  }\n  let offsets = getClientRect({\n    top: childrenRect.top - parentRect.top - borderTopWidth,\n    left: childrenRect.left - parentRect.left - borderLeftWidth,\n    width: childrenRect.width,\n    height: childrenRect.height,\n  });\n  offsets.marginTop = 0;\n  offsets.marginLeft = 0;\n\n  // Subtract margins of documentElement in case it's being used as parent\n  // we do this only on HTML because it's the only element that behaves\n  // differently when margins are applied to it. The margins are included in\n  // the box of the documentElement, in the other cases not.\n  if (!isIE10 && isHTML) {\n    const marginTop = parseFloat(styles.marginTop, 10);\n    const marginLeft = parseFloat(styles.marginLeft, 10);\n\n    offsets.top -= borderTopWidth - marginTop;\n    offsets.bottom -= borderTopWidth - marginTop;\n    offsets.left -= borderLeftWidth - marginLeft;\n    offsets.right -= borderLeftWidth - marginLeft;\n\n    // Attach marginTop and marginLeft because in some circumstances we may need them\n    offsets.marginTop = marginTop;\n    offsets.marginLeft = marginLeft;\n  }\n\n  if (\n    isIE10 && !fixedPosition\n      ? parent.contains(scrollParent)\n      : parent === scrollParent && scrollParent.nodeName !== 'BODY'\n  ) {\n    offsets = includeScroll(offsets, parent);\n  }\n\n  return offsets;\n}\n", "import getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getScroll from './getScroll';\nimport getClientRect from './getClientRect';\n\nexport default function getViewportOffsetRectRelativeToArtbitraryNode(element, excludeScroll = false) {\n  const html = element.ownerDocument.documentElement;\n  const relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n  const width = Math.max(html.clientWidth, window.innerWidth || 0);\n  const height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n  const scrollTop = !excludeScroll ? getScroll(html) : 0;\n  const scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n  const offset = {\n    top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n    left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n    width,\n    height,\n  };\n\n  return getClientRect(offset);\n}\n", "import getStyleComputedProperty from './getStyleComputedProperty';\nimport getParentNode from './getParentNode';\n\n/**\n * Check if the given element is fixed or is inside a fixed parent\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @argument {Element} customContainer\n * @returns {Boolean} answer to \"isFixed?\"\n */\nexport default function isFixed(element) {\n  const nodeName = element.nodeName;\n  if (nodeName === 'BODY' || nodeName === 'HTML') {\n    return false;\n  }\n  if (getStyleComputedProperty(element, 'position') === 'fixed') {\n    return true;\n  }\n  const parentNode = getParentNode(element);\n  if (!parentNode) {\n    return false;\n  }\n  return isFixed(parentNode);\n}\n", "import getStyleComputedProperty from './getStyleComputedProperty';\nimport isIE from './isIE';\n/**\n * Finds the first parent of an element that has a transformed property defined\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Element} first transformed parent or documentElement\n */\n\nexport default function getFixedPositionOffsetParent(element) {\n  // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n   if (!element || !element.parentElement || isIE()) {\n    return document.documentElement;\n  }\n  let el = element.parentElement;\n  while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n    el = el.parentElement;\n  }\n  return el || document.documentElement;\n\n}\n", "import getScrollParent from './getScrollParent';\nimport getParentNode from './getParentNode';\nimport getReferenceNode from './getReferenceNode';\nimport findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getViewportOffsetRectRelativeToArtbitraryNode from './getViewportOffsetRectRelativeToArtbitraryNode';\nimport getWindowSizes from './getWindowSizes';\nimport isFixed from './isFixed';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\n\n/**\n * Computed the boundaries limits and return them\n * @method\n * @memberof Popper.Utils\n * @param {HTMLElement} popper\n * @param {HTMLElement} reference\n * @param {number} padding\n * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n * @param {Boolean} fixedPosition - Is in fixed position mode\n * @returns {Object} Coordinates of the boundaries\n */\nexport default function getBoundaries(\n  popper,\n  reference,\n  padding,\n  boundariesElement,\n  fixedPosition = false\n) {\n  // NOTE: 1 DOM access here\n\n  let boundaries = { top: 0, left: 0 };\n  const offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n\n  // Handle viewport case\n  if (boundariesElement === 'viewport' ) {\n    boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n  }\n\n  else {\n    // Handle other cases based on DOM element used as boundaries\n    let boundariesNode;\n    if (boundariesElement === 'scrollParent') {\n      boundariesNode = getScrollParent(getParentNode(reference));\n      if (boundariesNode.nodeName === 'BODY') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      }\n    } else if (boundariesElement === 'window') {\n      boundariesNode = popper.ownerDocument.documentElement;\n    } else {\n      boundariesNode = boundariesElement;\n    }\n\n    const offsets = getOffsetRectRelativeToArbitraryNode(\n      boundariesNode,\n      offsetParent,\n      fixedPosition\n    );\n\n    // In case of HTML, we need a different computation\n    if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n      const { height, width } = getWindowSizes(popper.ownerDocument);\n      boundaries.top += offsets.top - offsets.marginTop;\n      boundaries.bottom = height + offsets.top;\n      boundaries.left += offsets.left - offsets.marginLeft;\n      boundaries.right = width + offsets.left;\n    } else {\n      // for all the other DOM elements, this one is good\n      boundaries = offsets;\n    }\n  }\n\n  // Add paddings\n  padding = padding || 0;\n  const isPaddingNumber = typeof padding === 'number';\n  boundaries.left += isPaddingNumber ? padding : padding.left || 0; \n  boundaries.top += isPaddingNumber ? padding : padding.top || 0; \n  boundaries.right -= isPaddingNumber ? padding : padding.right || 0; \n  boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; \n\n  return boundaries;\n}\n", "import getBoundaries from '../utils/getBoundaries';\n\nfunction getArea({ width, height }) {\n  return width * height;\n}\n\n/**\n * Utility used to transform the `auto` placement to the placement with more\n * available space.\n * @method\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeAutoPlacement(\n  placement,\n  refRect,\n  popper,\n  reference,\n  boundariesElement,\n  padding = 0\n) {\n  if (placement.indexOf('auto') === -1) {\n    return placement;\n  }\n\n  const boundaries = getBoundaries(\n    popper,\n    reference,\n    padding,\n    boundariesElement\n  );\n\n  const rects = {\n    top: {\n      width: boundaries.width,\n      height: refRect.top - boundaries.top,\n    },\n    right: {\n      width: boundaries.right - refRect.right,\n      height: boundaries.height,\n    },\n    bottom: {\n      width: boundaries.width,\n      height: boundaries.bottom - refRect.bottom,\n    },\n    left: {\n      width: refRect.left - boundaries.left,\n      height: boundaries.height,\n    },\n  };\n\n  const sortedAreas = Object.keys(rects)\n    .map(key => ({\n      key,\n      ...rects[key],\n      area: getArea(rects[key]),\n    }))\n    .sort((a, b) => b.area - a.area);\n\n  const filteredAreas = sortedAreas.filter(\n    ({ width, height }) =>\n      width >= popper.clientWidth && height >= popper.clientHeight\n  );\n\n  const computedPlacement = filteredAreas.length > 0\n    ? filteredAreas[0].key\n    : sortedAreas[0].key;\n\n  const variation = placement.split('-')[1];\n\n  return computedPlacement + (variation ? `-${variation}` : '');\n}\n", "import findCommonOffsetParent from './findCommonOffsetParent';\nimport getOffsetRectRelativeToArbitraryNode from './getOffsetRectRelativeToArbitraryNode';\nimport getFixedPositionOffsetParent from './getFixedPositionOffsetParent';\nimport getReferenceNode from './getReferenceNode';\n\n/**\n * Get offsets to the reference element\n * @method\n * @memberof Popper.Utils\n * @param {Object} state\n * @param {Element} popper - the popper element\n * @param {Element} reference - the reference element (the popper will be relative to this)\n * @param {Element} fixedPosition - is in fixed position mode\n * @returns {Object} An object containing the offsets which will be applied to the popper\n */\nexport default function getReferenceOffsets(state, popper, reference, fixedPosition = null) {\n  const commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, getReferenceNode(reference));\n  return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n}\n", "/**\n * Get the outer sizes of the given element (offset size + margins)\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element\n * @returns {Object} object containing width and height properties\n */\nexport default function getOuterSizes(element) {\n  const window = element.ownerDocument.defaultView;\n  const styles = window.getComputedStyle(element);\n  const x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n  const y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n  const result = {\n    width: element.offsetWidth + y,\n    height: element.offsetHeight + x,\n  };\n  return result;\n}\n", "/**\n * Get the opposite placement of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement\n * @returns {String} flipped placement\n */\nexport default function getOppositePlacement(placement) {\n  const hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n  return placement.replace(/left|right|bottom|top/g, matched => hash[matched]);\n}\n", "import getOuterSizes from './getOuterSizes';\nimport getOppositePlacement from './getOppositePlacement';\n\n/**\n * Get offsets to the popper\n * @method\n * @memberof Popper.Utils\n * @param {Object} position - CSS position the Popper will get applied\n * @param {HTMLElement} popper - the popper element\n * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n * @param {String} placement - one of the valid placement options\n * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n */\nexport default function getPopperOffsets(popper, referenceOffsets, placement) {\n  placement = placement.split('-')[0];\n\n  // Get popper node sizes\n  const popperRect = getOuterSizes(popper);\n\n  // Add position, width and height to our offsets object\n  const popperOffsets = {\n    width: popperRect.width,\n    height: popperRect.height,\n  };\n\n  // depending by the popper placement we have to compute its offsets slightly differently\n  const isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n  const mainSide = isHoriz ? 'top' : 'left';\n  const secondarySide = isHoriz ? 'left' : 'top';\n  const measurement = isHoriz ? 'height' : 'width';\n  const secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n  popperOffsets[mainSide] =\n    referenceOffsets[mainSide] +\n    referenceOffsets[measurement] / 2 -\n    popperRect[measurement] / 2;\n  if (placement === secondarySide) {\n    popperOffsets[secondarySide] =\n      referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n  } else {\n    popperOffsets[secondarySide] =\n      referenceOffsets[getOppositePlacement(secondarySide)];\n  }\n\n  return popperOffsets;\n}\n", "/**\n * Mimics the `find` method of Array\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function find(arr, check) {\n  // use native find if supported\n  if (Array.prototype.find) {\n    return arr.find(check);\n  }\n\n  // use `filter` to obtain the same behavior of `find`\n  return arr.filter(check)[0];\n}\n", "import find from './find';\n\n/**\n * Return the index of the matching object\n * @method\n * @memberof Popper.Utils\n * @argument {Array} arr\n * @argument prop\n * @argument value\n * @returns index or -1\n */\nexport default function findIndex(arr, prop, value) {\n  // use native findIndex if supported\n  if (Array.prototype.findIndex) {\n    return arr.findIndex(cur => cur[prop] === value);\n  }\n\n  // use `find` + `indexOf` if `findIndex` isn't supported\n  const match = find(arr, obj => obj[prop] === value);\n  return arr.indexOf(match);\n}\n", "import isFunction from './isFunction';\nimport findIndex from './findIndex';\nimport getClientRect from '../utils/getClientRect';\n\n/**\n * Loop trough the list of modifiers and run them in order,\n * each of them will then edit the data object.\n * @method\n * @memberof Popper.Utils\n * @param {dataObject} data\n * @param {Array} modifiers\n * @param {String} ends - Optional modifier name used as stopper\n * @returns {dataObject}\n */\nexport default function runModifiers(modifiers, data, ends) {\n  const modifiersToRun = ends === undefined\n    ? modifiers\n    : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n  modifiersToRun.forEach(modifier => {\n    if (modifier['function']) { // eslint-disable-line dot-notation\n      console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n    }\n    const fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n    if (modifier.enabled && isFunction(fn)) {\n      // Add properties to offsets to make them a complete clientRect object\n      // we do this before each modifier to make sure the previous one doesn't\n      // mess with these values\n      data.offsets.popper = getClientRect(data.offsets.popper);\n      data.offsets.reference = getClientRect(data.offsets.reference);\n\n      data = fn(data, modifier);\n    }\n  });\n\n  return data;\n}\n", "import computeAutoPlacement from '../utils/computeAutoPlacement';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\n\n/**\n * Updates the position of the popper, computing the new offsets and applying\n * the new style.<br />\n * Prefer `scheduleUpdate` over `update` because of performance reasons.\n * @method\n * @memberof Popper\n */\nexport default function update() {\n  // if popper is destroyed, don't perform any further update\n  if (this.state.isDestroyed) {\n    return;\n  }\n\n  let data = {\n    instance: this,\n    styles: {},\n    arrowStyles: {},\n    attributes: {},\n    flipped: false,\n    offsets: {},\n  };\n\n  // compute reference element offsets\n  data.offsets.reference = getReferenceOffsets(\n    this.state,\n    this.popper,\n    this.reference,\n    this.options.positionFixed\n  );\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  data.placement = computeAutoPlacement(\n    this.options.placement,\n    data.offsets.reference,\n    this.popper,\n    this.reference,\n    this.options.modifiers.flip.boundariesElement,\n    this.options.modifiers.flip.padding\n  );\n\n  // store the computed placement inside `originalPlacement`\n  data.originalPlacement = data.placement;\n\n  data.positionFixed = this.options.positionFixed;\n\n  // compute the popper offsets\n  data.offsets.popper = getPopperOffsets(\n    this.popper,\n    data.offsets.reference,\n    data.placement\n  );\n\n  data.offsets.popper.position = this.options.positionFixed\n    ? 'fixed'\n    : 'absolute';\n\n  // run the modifiers\n  data = runModifiers(this.modifiers, data);\n\n  // the first `update` will call `onCreate` callback\n  // the other ones will call `onUpdate` callback\n  if (!this.state.isCreated) {\n    this.state.isCreated = true;\n    this.options.onCreate(data);\n  } else {\n    this.options.onUpdate(data);\n  }\n}\n", "/**\n * Helper used to know if the given modifier is enabled.\n * @method\n * @memberof Popper.Utils\n * @returns {Boolean}\n */\nexport default function isModifierEnabled(modifiers, modifierName) {\n  return modifiers.some(\n    ({ name, enabled }) => enabled && name === modifierName\n  );\n}\n", "/**\n * Get the prefixed supported property name\n * @method\n * @memberof Popper.Utils\n * @argument {String} property (camelCase)\n * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n */\nexport default function getSupportedPropertyName(property) {\n  const prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n  const upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n  for (let i = 0; i < prefixes.length; i++) {\n    const prefix = prefixes[i];\n    const toCheck = prefix ? `${prefix}${upperProp}` : property;\n    if (typeof document.body.style[toCheck] !== 'undefined') {\n      return toCheck;\n    }\n  }\n  return null;\n}\n", "import isModifierEnabled from '../utils/isModifierEnabled';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * Destroys the popper.\n * @method\n * @memberof Popper\n */\nexport default function destroy() {\n  this.state.isDestroyed = true;\n\n  // touch DOM only if `applyStyle` modifier is enabled\n  if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n    this.popper.removeAttribute('x-placement');\n    this.popper.style.position = '';\n    this.popper.style.top = '';\n    this.popper.style.left = '';\n    this.popper.style.right = '';\n    this.popper.style.bottom = '';\n    this.popper.style.willChange = '';\n    this.popper.style[getSupportedPropertyName('transform')] = '';\n  }\n\n  this.disableEventListeners();\n\n  // remove the popper if user explicitly asked for the deletion on destroy\n  // do not use `remove` because IE11 doesn't support it\n  if (this.options.removeOnDestroy) {\n    this.popper.parentNode.removeChild(this.popper);\n  }\n  return this;\n}\n", "/**\n * Get the window associated with the element\n * @argument {Element} element\n * @returns {Window}\n */\nexport default function getWindow(element) {\n  const ownerDocument = element.ownerDocument;\n  return ownerDocument ? ownerDocument.defaultView : window;\n}\n", "import getScrollParent from './getScrollParent';\nimport getWindow from './getWindow';\n\nfunction attachToScrollParents(scrollParent, event, callback, scrollParents) {\n  const isBody = scrollParent.nodeName === 'BODY';\n  const target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n  target.addEventListener(event, callback, { passive: true });\n\n  if (!isBody) {\n    attachToScrollParents(\n      getScrollParent(target.parentNode),\n      event,\n      callback,\n      scrollParents\n    );\n  }\n  scrollParents.push(target);\n}\n\n/**\n * Setup needed event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function setupEventListeners(\n  reference,\n  options,\n  state,\n  updateBound\n) {\n  // Resize event listener on window\n  state.updateBound = updateBound;\n  getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n  // Scroll event listener on scroll parents\n  const scrollElement = getScrollParent(reference);\n  attachToScrollParents(\n    scrollElement,\n    'scroll',\n    state.updateBound,\n    state.scrollParents\n  );\n  state.scrollElement = scrollElement;\n  state.eventsEnabled = true;\n\n  return state;\n}\n", "import setupEventListeners from '../utils/setupEventListeners';\n\n/**\n * It will add resize/scroll events and start recalculating\n * position of the popper element when they are triggered.\n * @method\n * @memberof Popper\n */\nexport default function enableEventListeners() {\n  if (!this.state.eventsEnabled) {\n    this.state = setupEventListeners(\n      this.reference,\n      this.options,\n      this.state,\n      this.scheduleUpdate\n    );\n  }\n}\n", "import getWindow from './getWindow';\n\n/**\n * Remove event listeners used to update the popper position\n * @method\n * @memberof Popper.Utils\n * @private\n */\nexport default function removeEventListeners(reference, state) {\n  // Remove resize event listener on window\n  getWindow(reference).removeEventListener('resize', state.updateBound);\n\n  // Remove scroll event listener on scroll parents\n  state.scrollParents.forEach(target => {\n    target.removeEventListener('scroll', state.updateBound);\n  });\n\n  // Reset state\n  state.updateBound = null;\n  state.scrollParents = [];\n  state.scrollElement = null;\n  state.eventsEnabled = false;\n  return state;\n}\n", "import removeEventListeners from '../utils/removeEventListeners';\n\n/**\n * It will remove resize/scroll events and won't recalculate popper position\n * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n * unless you call `update` method manually.\n * @method\n * @memberof Popper\n */\nexport default function disableEventListeners() {\n  if (this.state.eventsEnabled) {\n    cancelAnimationFrame(this.scheduleUpdate);\n    this.state = removeEventListeners(this.reference, this.state);\n  }\n}\n", "/**\n * Tells if a given input is a number\n * @method\n * @memberof Popper.Utils\n * @param {*} input to check\n * @return {Boolean}\n */\nexport default function isNumeric(n) {\n  return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n}\n", "import isNumeric from './isNumeric';\n\n/**\n * Set the style to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the style to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setStyles(element, styles) {\n  Object.keys(styles).forEach(prop => {\n    let unit = '';\n    // add unit if the value is numeric and is one of the following\n    if (\n      ['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !==\n        -1 &&\n      isNumeric(styles[prop])\n    ) {\n      unit = 'px';\n    }\n    element.style[prop] = styles[prop] + unit;\n  });\n}\n", "/**\n * Set the attributes to the given popper\n * @method\n * @memberof Popper.Utils\n * @argument {Element} element - Element to apply the attributes to\n * @argument {Object} styles\n * Object with a list of properties and values which will be applied to the element\n */\nexport default function setAttributes(element, attributes) {\n  Object.keys(attributes).forEach(function(prop) {\n    const value = attributes[prop];\n    if (value !== false) {\n      element.setAttribute(prop, attributes[prop]);\n    } else {\n      element.removeAttribute(prop);\n    }\n  });\n}\n", "import setStyles from '../utils/setStyles';\nimport setAttributes from '../utils/setAttributes';\nimport getReferenceOffsets from '../utils/getReferenceOffsets';\nimport computeAutoPlacement from '../utils/computeAutoPlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} data.styles - List of style properties - values to apply to popper element\n * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The same data object\n */\nexport default function applyStyle(data) {\n  // any property present in `data.styles` will be applied to the popper,\n  // in this way we can make the 3rd party modifiers add custom styles to it\n  // Be aware, modifiers could override the properties defined in the previous\n  // lines of this modifier!\n  setStyles(data.instance.popper, data.styles);\n\n  // any property present in `data.attributes` will be applied to the popper,\n  // they will be set as HTML attributes of the element\n  setAttributes(data.instance.popper, data.attributes);\n\n  // if arrowElement is defined and arrowStyles has some properties\n  if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n    setStyles(data.arrowElement, data.arrowStyles);\n  }\n\n  return data;\n}\n\n/**\n * Set the x-placement attribute before everything else because it could be used\n * to add margins to the popper margins needs to be calculated to get the\n * correct popper offsets.\n * @method\n * @memberof Popper.modifiers\n * @param {HTMLElement} reference - The reference element used to position the popper\n * @param {HTMLElement} popper - The HTML element used as popper\n * @param {Object} options - Popper.js options\n */\nexport function applyStyleOnLoad(\n  reference,\n  popper,\n  options,\n  modifierOptions,\n  state\n) {\n  // compute reference element offsets\n  const referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n  // compute auto placement, store placement inside the data object,\n  // modifiers will be able to edit `placement` if needed\n  // and refer to originalPlacement to know the original value\n  const placement = computeAutoPlacement(\n    options.placement,\n    referenceOffsets,\n    popper,\n    reference,\n    options.modifiers.flip.boundariesElement,\n    options.modifiers.flip.padding\n  );\n\n  popper.setAttribute('x-placement', placement);\n\n  // Apply `position` to popper before anything else because\n  // without the position applied we can't guarantee correct computations\n  setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n  return options;\n}\n", "/**\n * @function\n * @memberof Popper.Utils\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n * @returns {Object} The popper's position offsets rounded\n *\n * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n * good as it can be within reason.\n * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n *\n * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n * as well on High DPI screens).\n *\n * Firefox prefers no rounding for positioning and does not have blurriness on\n * high DPI screens.\n *\n * Only horizontal placement and left/right values need to be considered.\n */\nexport default function getRoundedOffsets(data, shouldRound) {\n  const { popper, reference } = data.offsets;\n  const { round, floor } = Math;\n  const noRound = v => v;\n  \n  const referenceWidth = round(reference.width);\n  const popperWidth = round(popper.width);\n  \n  const isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n  const isVariation = data.placement.indexOf('-') !== -1;\n  const sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n  const bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n  const horizontalToInteger = !shouldRound\n    ? noRound\n    : isVertical || isVariation || sameWidthParity\n    ? round\n    : floor;\n  const verticalToInteger = !shouldRound ? noRound : round;\n\n  return {\n    left: horizontalToInteger(\n      bothOddWidth && !isVariation && shouldRound\n        ? popper.left - 1\n        : popper.left\n    ),\n    top: verticalToInteger(popper.top),\n    bottom: verticalToInteger(popper.bottom),\n    right: horizontalToInteger(popper.right),\n  };\n}\n", "import getSupportedPropertyName from '../utils/getSupportedPropertyName';\nimport find from '../utils/find';\nimport getOffsetParent from '../utils/getOffsetParent';\nimport getBoundingClientRect from '../utils/getBoundingClientRect';\nimport getRoundedOffsets from '../utils/getRoundedOffsets';\nimport isBrowser from '../utils/isBrowser';\n\nconst isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function computeStyle(data, options) {\n  const { x, y } = options;\n  const { popper } = data.offsets;\n\n  // Remove this legacy support in Popper.js v2\n  const legacyGpuAccelerationOption = find(\n    data.instance.modifiers,\n    modifier => modifier.name === 'applyStyle'\n  ).gpuAcceleration;\n  if (legacyGpuAccelerationOption !== undefined) {\n    console.warn(\n      'WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'\n    );\n  }\n  const gpuAcceleration =\n    legacyGpuAccelerationOption !== undefined\n      ? legacyGpuAccelerationOption\n      : options.gpuAcceleration;\n\n  const offsetParent = getOffsetParent(data.instance.popper);\n  const offsetParentRect = getBoundingClientRect(offsetParent);\n\n  // Styles\n  const styles = {\n    position: popper.position,\n  };\n\n  const offsets = getRoundedOffsets(\n    data,\n    window.devicePixelRatio < 2 || !isFirefox\n  );\n\n  const sideA = x === 'bottom' ? 'top' : 'bottom';\n  const sideB = y === 'right' ? 'left' : 'right';\n\n  // if gpuAcceleration is set to `true` and transform is supported,\n  //  we use `translate3d` to apply the position to the popper we\n  // automatically use the supported prefixed version if needed\n  const prefixedProperty = getSupportedPropertyName('transform');\n\n  // now, let's make a step back and look at this code closely (wtf?)\n  // If the content of the popper grows once it's been positioned, it\n  // may happen that the popper gets misplaced because of the new content\n  // overflowing its reference element\n  // To avoid this problem, we provide two options (x and y), which allow\n  // the consumer to define the offset origin.\n  // If we position a popper on top of a reference element, we can set\n  // `x` to `top` to make the popper grow towards its top instead of\n  // its bottom.\n  let left, top;\n  if (sideA === 'bottom') {\n    // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n    // and not the bottom of the html element\n    if (offsetParent.nodeName === 'HTML') {\n      top = -offsetParent.clientHeight + offsets.bottom;\n    } else {\n      top = -offsetParentRect.height + offsets.bottom;\n    }\n  } else {\n    top = offsets.top;\n  }\n  if (sideB === 'right') {\n    if (offsetParent.nodeName === 'HTML') {\n      left = -offsetParent.clientWidth + offsets.right;\n    } else {\n      left = -offsetParentRect.width + offsets.right;\n    }\n  } else {\n    left = offsets.left;\n  }\n  if (gpuAcceleration && prefixedProperty) {\n    styles[prefixedProperty] = `translate3d(${left}px, ${top}px, 0)`;\n    styles[sideA] = 0;\n    styles[sideB] = 0;\n    styles.willChange = 'transform';\n  } else {\n    // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n    const invertTop = sideA === 'bottom' ? -1 : 1;\n    const invertLeft = sideB === 'right' ? -1 : 1;\n    styles[sideA] = top * invertTop;\n    styles[sideB] = left * invertLeft;\n    styles.willChange = `${sideA}, ${sideB}`;\n  }\n\n  // Attributes\n  const attributes = {\n    'x-placement': data.placement,\n  };\n\n  // Update `data` attributes, styles and arrowStyles\n  data.attributes = { ...attributes, ...data.attributes };\n  data.styles = { ...styles, ...data.styles };\n  data.arrowStyles = { ...data.offsets.arrow, ...data.arrowStyles };\n\n  return data;\n}\n", "import find from './find';\n\n/**\n * Helper used to know if the given modifier depends from another one.<br />\n * It checks if the needed modifier is listed and enabled.\n * @method\n * @memberof Popper.Utils\n * @param {Array} modifiers - list of modifiers\n * @param {String} requestingName - name of requesting modifier\n * @param {String} requestedName - name of requested modifier\n * @returns {Boolean}\n */\nexport default function isModifierRequired(\n  modifiers,\n  requestingName,\n  requestedName\n) {\n  const requesting = find(modifiers, ({ name }) => name === requestingName);\n\n  const isRequired =\n    !!requesting &&\n    modifiers.some(modifier => {\n      return (\n        modifier.name === requestedName &&\n        modifier.enabled &&\n        modifier.order < requesting.order\n      );\n    });\n\n  if (!isRequired) {\n    const requesting = `\\`${requestingName}\\``;\n    const requested = `\\`${requestedName}\\``;\n    console.warn(\n      `${requested} modifier is required by ${requesting} modifier in order to work, be sure to include it before ${requesting}!`\n    );\n  }\n  return isRequired;\n}\n", "import getClientRect from '../utils/getClientRect';\nimport getOuterSizes from '../utils/getOuterSizes';\nimport isModifierRequired from '../utils/isModifierRequired';\nimport getStyleComputedProperty from '../utils/getStyleComputedProperty';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function arrow(data, options) {\n  // arrow depends on keepTogether in order to work\n  if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n    return data;\n  }\n\n  let arrowElement = options.element;\n\n  // if arrowElement is a string, suppose it's a CSS selector\n  if (typeof arrowElement === 'string') {\n    arrowElement = data.instance.popper.querySelector(arrowElement);\n\n    // if arrowElement is not found, don't run the modifier\n    if (!arrowElement) {\n      return data;\n    }\n  } else {\n    // if the arrowElement isn't a query selector we must check that the\n    // provided DOM node is child of its popper node\n    if (!data.instance.popper.contains(arrowElement)) {\n      console.warn(\n        'WARNING: `arrow.element` must be child of its popper element!'\n      );\n      return data;\n    }\n  }\n\n  const placement = data.placement.split('-')[0];\n  const { popper, reference } = data.offsets;\n  const isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n  const len = isVertical ? 'height' : 'width';\n  const sideCapitalized = isVertical ? 'Top' : 'Left';\n  const side = sideCapitalized.toLowerCase();\n  const altSide = isVertical ? 'left' : 'top';\n  const opSide = isVertical ? 'bottom' : 'right';\n  const arrowElementSize = getOuterSizes(arrowElement)[len];\n\n  //\n  // extends keepTogether behavior making sure the popper and its\n  // reference have enough pixels in conjunction\n  //\n\n  // top/left side\n  if (reference[opSide] - arrowElementSize < popper[side]) {\n    data.offsets.popper[side] -=\n      popper[side] - (reference[opSide] - arrowElementSize);\n  }\n  // bottom/right side\n  if (reference[side] + arrowElementSize > popper[opSide]) {\n    data.offsets.popper[side] +=\n      reference[side] + arrowElementSize - popper[opSide];\n  }\n  data.offsets.popper = getClientRect(data.offsets.popper);\n\n  // compute center of the popper\n  const center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n  // Compute the sideValue using the updated popper offsets\n  // take popper margin in account because we don't have this info available\n  const css = getStyleComputedProperty(data.instance.popper);\n  const popperMarginSide = parseFloat(css[`margin${sideCapitalized}`], 10);\n  const popperBorderSide = parseFloat(css[`border${sideCapitalized}Width`], 10);\n  let sideValue =\n    center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n  // prevent arrowElement from being placed not contiguously to its popper\n  sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n  data.arrowElement = arrowElement;\n  data.offsets.arrow = {\n    [side]: Math.round(sideValue),\n    [altSide]: '', // make sure to unset any eventual altSide value from the DOM node\n  };\n\n  return data;\n}\n", "/**\n * Get the opposite placement variation of the given one\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement variation\n * @returns {String} flipped placement variation\n */\nexport default function getOppositeVariation(variation) {\n  if (variation === 'end') {\n    return 'start';\n  } else if (variation === 'start') {\n    return 'end';\n  }\n  return variation;\n}\n", "/**\n * List of accepted placements to use as values of the `placement` option.<br />\n * Valid placements are:\n * - `auto`\n * - `top`\n * - `right`\n * - `bottom`\n * - `left`\n *\n * Each placement can have a variation from this list:\n * - `-start`\n * - `-end`\n *\n * Variations are interpreted easily if you think of them as the left to right\n * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n * is right.<br />\n * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n *\n * Some valid examples are:\n * - `top-end` (on top of reference, right aligned)\n * - `right-start` (on right of reference, top aligned)\n * - `bottom` (on bottom, centered)\n * - `auto-end` (on the side with more space available, alignment depends by placement)\n *\n * @static\n * @type {Array}\n * @enum {String}\n * @readonly\n * @method placements\n * @memberof Popper\n */\nexport default [\n  'auto-start',\n  'auto',\n  'auto-end',\n  'top-start',\n  'top',\n  'top-end',\n  'right-start',\n  'right',\n  'right-end',\n  'bottom-end',\n  'bottom',\n  'bottom-start',\n  'left-end',\n  'left',\n  'left-start',\n];\n", "import placements from '../methods/placements';\n\n// Get rid of `auto` `auto-start` and `auto-end`\nconst validPlacements = placements.slice(3);\n\n/**\n * Given an initial placement, returns all the subsequent placements\n * clockwise (or counter-clockwise).\n *\n * @method\n * @memberof Popper.Utils\n * @argument {String} placement - A valid placement (it accepts variations)\n * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n * @returns {Array} placements including their variations\n */\nexport default function clockwise(placement, counter = false) {\n  const index = validPlacements.indexOf(placement);\n  const arr = validPlacements\n    .slice(index + 1)\n    .concat(validPlacements.slice(0, index));\n  return counter ? arr.reverse() : arr;\n}\n", "import getOppositePlacement from '../utils/getOppositePlacement';\nimport getOppositeVariation from '../utils/getOppositeVariation';\nimport getPopperOffsets from '../utils/getPopperOffsets';\nimport runModifiers from '../utils/runModifiers';\nimport getBoundaries from '../utils/getBoundaries';\nimport isModifierEnabled from '../utils/isModifierEnabled';\nimport clockwise from '../utils/clockwise';\n\nconst BEHAVIORS = {\n  FLIP: 'flip',\n  CLOCKWISE: 'clockwise',\n  COUNTERCLOCKWISE: 'counterclockwise',\n};\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function flip(data, options) {\n  // if `inner` modifier is enabled, we can't use the `flip` modifier\n  if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n    return data;\n  }\n\n  if (data.flipped && data.placement === data.originalPlacement) {\n    // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n    return data;\n  }\n\n  const boundaries = getBoundaries(\n    data.instance.popper,\n    data.instance.reference,\n    options.padding,\n    options.boundariesElement,\n    data.positionFixed\n  );\n\n  let placement = data.placement.split('-')[0];\n  let placementOpposite = getOppositePlacement(placement);\n  let variation = data.placement.split('-')[1] || '';\n\n  let flipOrder = [];\n\n  switch (options.behavior) {\n    case BEHAVIORS.FLIP:\n      flipOrder = [placement, placementOpposite];\n      break;\n    case BEHAVIORS.CLOCKWISE:\n      flipOrder = clockwise(placement);\n      break;\n    case BEHAVIORS.COUNTERCLOCKWISE:\n      flipOrder = clockwise(placement, true);\n      break;\n    default:\n      flipOrder = options.behavior;\n  }\n\n  flipOrder.forEach((step, index) => {\n    if (placement !== step || flipOrder.length === index + 1) {\n      return data;\n    }\n\n    placement = data.placement.split('-')[0];\n    placementOpposite = getOppositePlacement(placement);\n\n    const popperOffsets = data.offsets.popper;\n    const refOffsets = data.offsets.reference;\n\n    // using floor because the reference offsets may contain decimals we are not going to consider here\n    const floor = Math.floor;\n    const overlapsRef =\n      (placement === 'left' &&\n        floor(popperOffsets.right) > floor(refOffsets.left)) ||\n      (placement === 'right' &&\n        floor(popperOffsets.left) < floor(refOffsets.right)) ||\n      (placement === 'top' &&\n        floor(popperOffsets.bottom) > floor(refOffsets.top)) ||\n      (placement === 'bottom' &&\n        floor(popperOffsets.top) < floor(refOffsets.bottom));\n\n    const overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n    const overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n    const overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n    const overflowsBottom =\n      floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n    const overflowsBoundaries =\n      (placement === 'left' && overflowsLeft) ||\n      (placement === 'right' && overflowsRight) ||\n      (placement === 'top' && overflowsTop) ||\n      (placement === 'bottom' && overflowsBottom);\n\n    // flip the variation if required\n    const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n\n    // flips variation if reference element overflows boundaries\n    const flippedVariationByRef =\n      !!options.flipVariations &&\n      ((isVertical && variation === 'start' && overflowsLeft) ||\n        (isVertical && variation === 'end' && overflowsRight) ||\n        (!isVertical && variation === 'start' && overflowsTop) ||\n        (!isVertical && variation === 'end' && overflowsBottom));\n\n    // flips variation if popper content overflows boundaries\n    const flippedVariationByContent =\n      !!options.flipVariationsByContent &&\n      ((isVertical && variation === 'start' && overflowsRight) ||\n        (isVertical && variation === 'end' && overflowsLeft) ||\n        (!isVertical && variation === 'start' && overflowsBottom) ||\n        (!isVertical && variation === 'end' && overflowsTop));\n\n    const flippedVariation = flippedVariationByRef || flippedVariationByContent;\n\n    if (overlapsRef || overflowsBoundaries || flippedVariation) {\n      // this boolean to detect any flip loop\n      data.flipped = true;\n\n      if (overlapsRef || overflowsBoundaries) {\n        placement = flipOrder[index + 1];\n      }\n\n      if (flippedVariation) {\n        variation = getOppositeVariation(variation);\n      }\n\n      data.placement = placement + (variation ? '-' + variation : '');\n\n      // this object contains `position`, we want to preserve it along with\n      // any additional property we may add in the future\n      data.offsets.popper = {\n        ...data.offsets.popper,\n        ...getPopperOffsets(\n          data.instance.popper,\n          data.offsets.reference,\n          data.placement\n        ),\n      };\n\n      data = runModifiers(data.instance.modifiers, data, 'flip');\n    }\n  });\n  return data;\n}\n", "/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function keepTogether(data) {\n  const { popper, reference } = data.offsets;\n  const placement = data.placement.split('-')[0];\n  const floor = Math.floor;\n  const isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n  const side = isVertical ? 'right' : 'bottom';\n  const opSide = isVertical ? 'left' : 'top';\n  const measurement = isVertical ? 'width' : 'height';\n\n  if (popper[side] < floor(reference[opSide])) {\n    data.offsets.popper[opSide] =\n      floor(reference[opSide]) - popper[measurement];\n  }\n  if (popper[opSide] > floor(reference[side])) {\n    data.offsets.popper[opSide] = floor(reference[side]);\n  }\n\n  return data;\n}\n", "import isNumeric from '../utils/isNumeric';\nimport getClientRect from '../utils/getClientRect';\nimport find from '../utils/find';\n\n/**\n * Converts a string containing value + unit into a px value number\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} str - Value + unit string\n * @argument {String} measurement - `height` or `width`\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @returns {Number|String}\n * Value in pixels, or original string if no values were extracted\n */\nexport function toValue(str, measurement, popperOffsets, referenceOffsets) {\n  // separate value from unit\n  const split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n  const value = +split[1];\n  const unit = split[2];\n\n  // If it's not a number it's an operator, I guess\n  if (!value) {\n    return str;\n  }\n\n  if (unit.indexOf('%') === 0) {\n    let element;\n    switch (unit) {\n      case '%p':\n        element = popperOffsets;\n        break;\n      case '%':\n      case '%r':\n      default:\n        element = referenceOffsets;\n    }\n\n    const rect = getClientRect(element);\n    return rect[measurement] / 100 * value;\n  } else if (unit === 'vh' || unit === 'vw') {\n    // if is a vh or vw, we calculate the size based on the viewport\n    let size;\n    if (unit === 'vh') {\n      size = Math.max(\n        document.documentElement.clientHeight,\n        window.innerHeight || 0\n      );\n    } else {\n      size = Math.max(\n        document.documentElement.clientWidth,\n        window.innerWidth || 0\n      );\n    }\n    return size / 100 * value;\n  } else {\n    // if is an explicit pixel unit, we get rid of the unit and keep the value\n    // if is an implicit unit, it's px, and we return just the value\n    return value;\n  }\n}\n\n/**\n * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n * @function\n * @memberof {modifiers~offset}\n * @private\n * @argument {String} offset\n * @argument {Object} popperOffsets\n * @argument {Object} referenceOffsets\n * @argument {String} basePlacement\n * @returns {Array} a two cells array with x and y offsets in numbers\n */\nexport function parseOffset(\n  offset,\n  popperOffsets,\n  referenceOffsets,\n  basePlacement\n) {\n  const offsets = [0, 0];\n\n  // Use height if placement is left or right and index is 0 otherwise use width\n  // in this way the first offset will use an axis and the second one\n  // will use the other one\n  const useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n  // Split the offset string to obtain a list of values and operands\n  // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n  const fragments = offset.split(/(\\+|\\-)/).map(frag => frag.trim());\n\n  // Detect if the offset string contains a pair of values or a single one\n  // they could be separated by comma or space\n  const divider = fragments.indexOf(\n    find(fragments, frag => frag.search(/,|\\s/) !== -1)\n  );\n\n  if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n    console.warn(\n      'Offsets separated by white space(s) are deprecated, use a comma (,) instead.'\n    );\n  }\n\n  // If divider is found, we divide the list of values and operands to divide\n  // them by ofset X and Y.\n  const splitRegex = /\\s*,\\s*|\\s+/;\n  let ops = divider !== -1\n    ? [\n        fragments\n          .slice(0, divider)\n          .concat([fragments[divider].split(splitRegex)[0]]),\n        [fragments[divider].split(splitRegex)[1]].concat(\n          fragments.slice(divider + 1)\n        ),\n      ]\n    : [fragments];\n\n  // Convert the values with units to absolute pixels to allow our computations\n  ops = ops.map((op, index) => {\n    // Most of the units rely on the orientation of the popper\n    const measurement = (index === 1 ? !useHeight : useHeight)\n      ? 'height'\n      : 'width';\n    let mergeWithPrevious = false;\n    return (\n      op\n        // This aggregates any `+` or `-` sign that aren't considered operators\n        // e.g.: 10 + +5 => [10, +, +5]\n        .reduce((a, b) => {\n          if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n            a[a.length - 1] = b;\n            mergeWithPrevious = true;\n            return a;\n          } else if (mergeWithPrevious) {\n            a[a.length - 1] += b;\n            mergeWithPrevious = false;\n            return a;\n          } else {\n            return a.concat(b);\n          }\n        }, [])\n        // Here we convert the string values into number values (in px)\n        .map(str => toValue(str, measurement, popperOffsets, referenceOffsets))\n    );\n  });\n\n  // Loop trough the offsets arrays and execute the operations\n  ops.forEach((op, index) => {\n    op.forEach((frag, index2) => {\n      if (isNumeric(frag)) {\n        offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n      }\n    });\n  });\n  return offsets;\n}\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @argument {Number|String} options.offset=0\n * The offset value as described in the modifier description\n * @returns {Object} The data object, properly modified\n */\nexport default function offset(data, { offset }) {\n  const { placement, offsets: { popper, reference } } = data;\n  const basePlacement = placement.split('-')[0];\n\n  let offsets;\n  if (isNumeric(+offset)) {\n    offsets = [+offset, 0];\n  } else {\n    offsets = parseOffset(offset, popper, reference, basePlacement);\n  }\n\n  if (basePlacement === 'left') {\n    popper.top += offsets[0];\n    popper.left -= offsets[1];\n  } else if (basePlacement === 'right') {\n    popper.top += offsets[0];\n    popper.left += offsets[1];\n  } else if (basePlacement === 'top') {\n    popper.left += offsets[0];\n    popper.top -= offsets[1];\n  } else if (basePlacement === 'bottom') {\n    popper.left += offsets[0];\n    popper.top += offsets[1];\n  }\n\n  data.popper = popper;\n  return data;\n}\n", "import getOffsetParent from '../utils/getOffsetParent';\nimport getBoundaries from '../utils/getBoundaries';\nimport getSupportedPropertyName from '../utils/getSupportedPropertyName';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function preventOverflow(data, options) {\n  let boundariesElement =\n    options.boundariesElement || getOffsetParent(data.instance.popper);\n\n  // If offsetParent is the reference element, we really want to\n  // go one step up and use the next offsetParent as reference to\n  // avoid to make this modifier completely useless and look like broken\n  if (data.instance.reference === boundariesElement) {\n    boundariesElement = getOffsetParent(boundariesElement);\n  }\n\n  // NOTE: DOM access here\n  // resets the popper's position so that the document size can be calculated excluding\n  // the size of the popper element itself\n  const transformProp = getSupportedPropertyName('transform');\n  const popperStyles = data.instance.popper.style; // assignment to help minification\n  const { top, left, [transformProp]: transform } = popperStyles;\n  popperStyles.top = '';\n  popperStyles.left = '';\n  popperStyles[transformProp] = '';\n\n  const boundaries = getBoundaries(\n    data.instance.popper,\n    data.instance.reference,\n    options.padding,\n    boundariesElement,\n    data.positionFixed\n  );\n\n  // NOTE: DOM access here\n  // restores the original style properties after the offsets have been computed\n  popperStyles.top = top;\n  popperStyles.left = left;\n  popperStyles[transformProp] = transform;\n\n  options.boundaries = boundaries;\n\n  const order = options.priority;\n  let popper = data.offsets.popper;\n\n  const check = {\n    primary(placement) {\n      let value = popper[placement];\n      if (\n        popper[placement] < boundaries[placement] &&\n        !options.escapeWithReference\n      ) {\n        value = Math.max(popper[placement], boundaries[placement]);\n      }\n      return { [placement]: value };\n    },\n    secondary(placement) {\n      const mainSide = placement === 'right' ? 'left' : 'top';\n      let value = popper[mainSide];\n      if (\n        popper[placement] > boundaries[placement] &&\n        !options.escapeWithReference\n      ) {\n        value = Math.min(\n          popper[mainSide],\n          boundaries[placement] -\n            (placement === 'right' ? popper.width : popper.height)\n        );\n      }\n      return { [mainSide]: value };\n    },\n  };\n\n  order.forEach(placement => {\n    const side =\n      ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n    popper = { ...popper, ...check[side](placement) };\n  });\n\n  data.offsets.popper = popper;\n\n  return data;\n}\n", "/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function shift(data) {\n  const placement = data.placement;\n  const basePlacement = placement.split('-')[0];\n  const shiftvariation = placement.split('-')[1];\n\n  // if shift shiftvariation is specified, run the modifier\n  if (shiftvariation) {\n    const { reference, popper } = data.offsets;\n    const isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n    const side = isVertical ? 'left' : 'top';\n    const measurement = isVertical ? 'width' : 'height';\n\n    const shiftOffsets = {\n      start: { [side]: reference[side] },\n      end: {\n        [side]: reference[side] + reference[measurement] - popper[measurement],\n      },\n    };\n\n    data.offsets.popper = { ...popper, ...shiftOffsets[shiftvariation] };\n  }\n\n  return data;\n}\n", "import isModifierRequired from '../utils/isModifierRequired';\nimport find from '../utils/find';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by update method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function hide(data) {\n  if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n    return data;\n  }\n\n  const refRect = data.offsets.reference;\n  const bound = find(\n    data.instance.modifiers,\n    modifier => modifier.name === 'preventOverflow'\n  ).boundaries;\n\n  if (\n    refRect.bottom < bound.top ||\n    refRect.left > bound.right ||\n    refRect.top > bound.bottom ||\n    refRect.right < bound.left\n  ) {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === true) {\n      return data;\n    }\n\n    data.hide = true;\n    data.attributes['x-out-of-boundaries'] = '';\n  } else {\n    // Avoid unnecessary DOM access if visibility hasn't changed\n    if (data.hide === false) {\n      return data;\n    }\n\n    data.hide = false;\n    data.attributes['x-out-of-boundaries'] = false;\n  }\n\n  return data;\n}\n", "import getClientRect from '../utils/getClientRect';\nimport getOppositePlacement from '../utils/getOppositePlacement';\n\n/**\n * @function\n * @memberof Modifiers\n * @argument {Object} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {Object} The data object, properly modified\n */\nexport default function inner(data) {\n  const placement = data.placement;\n  const basePlacement = placement.split('-')[0];\n  const { popper, reference } = data.offsets;\n  const isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n  const subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n  popper[isHoriz ? 'left' : 'top'] =\n    reference[basePlacement] -\n    (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n  data.placement = getOppositePlacement(placement);\n  data.offsets.popper = getClientRect(popper);\n\n  return data;\n}\n", "import applyStyle, { applyStyleOnLoad } from './applyStyle';\nimport computeStyle from './computeStyle';\nimport arrow from './arrow';\nimport flip from './flip';\nimport keepTogether from './keepTogether';\nimport offset from './offset';\nimport preventOverflow from './preventOverflow';\nimport shift from './shift';\nimport hide from './hide';\nimport inner from './inner';\n\n/**\n * Modifier function, each modifier can have a function of this type assigned\n * to its `fn` property.<br />\n * These functions will be called on each update, this means that you must\n * make sure they are performant enough to avoid performance bottlenecks.\n *\n * @function ModifierFn\n * @argument {dataObject} data - The data object generated by `update` method\n * @argument {Object} options - Modifiers configuration and options\n * @returns {dataObject} The data object, properly modified\n */\n\n/**\n * Modifiers are plugins used to alter the behavior of your poppers.<br />\n * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n * needed by the library.\n *\n * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n * All the other properties are configurations that could be tweaked.\n * @namespace modifiers\n */\nexport default {\n  /**\n   * Modifier used to shift the popper on the start or end of its reference\n   * element.<br />\n   * It will read the variation of the `placement` property.<br />\n   * It can be one either `-end` or `-start`.\n   * @memberof modifiers\n   * @inner\n   */\n  shift: {\n    /** @prop {number} order=100 - Index used to define the order of execution */\n    order: 100,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: shift,\n  },\n\n  /**\n   * The `offset` modifier can shift your popper on both its axis.\n   *\n   * It accepts the following units:\n   * - `px` or unit-less, interpreted as pixels\n   * - `%` or `%r`, percentage relative to the length of the reference element\n   * - `%p`, percentage relative to the length of the popper element\n   * - `vw`, CSS viewport width unit\n   * - `vh`, CSS viewport height unit\n   *\n   * For length is intended the main axis relative to the placement of the popper.<br />\n   * This means that if the placement is `top` or `bottom`, the length will be the\n   * `width`. In case of `left` or `right`, it will be the `height`.\n   *\n   * You can provide a single value (as `Number` or `String`), or a pair of values\n   * as `String` divided by a comma or one (or more) white spaces.<br />\n   * The latter is a deprecated method because it leads to confusion and will be\n   * removed in v2.<br />\n   * Additionally, it accepts additions and subtractions between different units.\n   * Note that multiplications and divisions aren't supported.\n   *\n   * Valid examples are:\n   * ```\n   * 10\n   * '10%'\n   * '10, 10'\n   * '10%, 10'\n   * '10 + 10%'\n   * '10 - 5vh + 3%'\n   * '-10px + 5vh, 5px - 6%'\n   * ```\n   * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n   * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n   * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  offset: {\n    /** @prop {number} order=200 - Index used to define the order of execution */\n    order: 200,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: offset,\n    /** @prop {Number|String} offset=0\n     * The offset value as described in the modifier description\n     */\n    offset: 0,\n  },\n\n  /**\n   * Modifier used to prevent the popper from being positioned outside the boundary.\n   *\n   * A scenario exists where the reference itself is not within the boundaries.<br />\n   * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n   * In this case we need to decide whether the popper should either:\n   *\n   * - detach from the reference and remain \"trapped\" in the boundaries, or\n   * - if it should ignore the boundary and \"escape with its reference\"\n   *\n   * When `escapeWithReference` is set to`true` and reference is completely\n   * outside its boundaries, the popper will overflow (or completely leave)\n   * the boundaries in order to remain attached to the edge of the reference.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  preventOverflow: {\n    /** @prop {number} order=300 - Index used to define the order of execution */\n    order: 300,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: preventOverflow,\n    /**\n     * @prop {Array} [priority=['left','right','top','bottom']]\n     * Popper will try to prevent overflow following these priorities by default,\n     * then, it could overflow on the left and on top of the `boundariesElement`\n     */\n    priority: ['left', 'right', 'top', 'bottom'],\n    /**\n     * @prop {number} padding=5\n     * Amount of pixel used to define a minimum distance between the boundaries\n     * and the popper. This makes sure the popper always has a little padding\n     * between the edges of its container\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='scrollParent'\n     * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n     * `viewport` or any DOM element.\n     */\n    boundariesElement: 'scrollParent',\n  },\n\n  /**\n   * Modifier used to make sure the reference and its popper stay near each other\n   * without leaving any gap between the two. Especially useful when the arrow is\n   * enabled and you want to ensure that it points to its reference element.\n   * It cares only about the first axis. You can still have poppers with margin\n   * between the popper and its reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  keepTogether: {\n    /** @prop {number} order=400 - Index used to define the order of execution */\n    order: 400,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: keepTogether,\n  },\n\n  /**\n   * This modifier is used to move the `arrowElement` of the popper to make\n   * sure it is positioned between the reference element and its popper element.\n   * It will read the outer size of the `arrowElement` node to detect how many\n   * pixels of conjunction are needed.\n   *\n   * It has no effect if no `arrowElement` is provided.\n   * @memberof modifiers\n   * @inner\n   */\n  arrow: {\n    /** @prop {number} order=500 - Index used to define the order of execution */\n    order: 500,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: arrow,\n    /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n    element: '[x-arrow]',\n  },\n\n  /**\n   * Modifier used to flip the popper's placement when it starts to overlap its\n   * reference element.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   *\n   * **NOTE:** this modifier will interrupt the current update cycle and will\n   * restart it if it detects the need to flip the placement.\n   * @memberof modifiers\n   * @inner\n   */\n  flip: {\n    /** @prop {number} order=600 - Index used to define the order of execution */\n    order: 600,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: flip,\n    /**\n     * @prop {String|Array} behavior='flip'\n     * The behavior used to change the popper's placement. It can be one of\n     * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n     * placements (with optional variations)\n     */\n    behavior: 'flip',\n    /**\n     * @prop {number} padding=5\n     * The popper will flip if it hits the edges of the `boundariesElement`\n     */\n    padding: 5,\n    /**\n     * @prop {String|HTMLElement} boundariesElement='viewport'\n     * The element which will define the boundaries of the popper position.\n     * The popper will never be placed outside of the defined boundaries\n     * (except if `keepTogether` is enabled)\n     */\n    boundariesElement: 'viewport',\n    /**\n     * @prop {Boolean} flipVariations=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the reference element overlaps its boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariations: false,\n    /**\n     * @prop {Boolean} flipVariationsByContent=false\n     * The popper will switch placement variation between `-start` and `-end` when\n     * the popper element overlaps its reference boundaries.\n     *\n     * The original placement should have a set variation.\n     */\n    flipVariationsByContent: false,\n  },\n\n  /**\n   * Modifier used to make the popper flow toward the inner of the reference element.\n   * By default, when this modifier is disabled, the popper will be placed outside\n   * the reference element.\n   * @memberof modifiers\n   * @inner\n   */\n  inner: {\n    /** @prop {number} order=700 - Index used to define the order of execution */\n    order: 700,\n    /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n    enabled: false,\n    /** @prop {ModifierFn} */\n    fn: inner,\n  },\n\n  /**\n   * Modifier used to hide the popper when its reference element is outside of the\n   * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n   * be used to hide with a CSS selector the popper when its reference is\n   * out of boundaries.\n   *\n   * Requires the `preventOverflow` modifier before it in order to work.\n   * @memberof modifiers\n   * @inner\n   */\n  hide: {\n    /** @prop {number} order=800 - Index used to define the order of execution */\n    order: 800,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: hide,\n  },\n\n  /**\n   * Computes the style that will be applied to the popper element to gets\n   * properly positioned.\n   *\n   * Note that this modifier will not touch the DOM, it just prepares the styles\n   * so that `applyStyle` modifier can apply it. This separation is useful\n   * in case you need to replace `applyStyle` with a custom implementation.\n   *\n   * This modifier has `850` as `order` value to maintain backward compatibility\n   * with previous versions of Popper.js. Expect the modifiers ordering method\n   * to change in future major versions of the library.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  computeStyle: {\n    /** @prop {number} order=850 - Index used to define the order of execution */\n    order: 850,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: computeStyle,\n    /**\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: true,\n    /**\n     * @prop {string} [x='bottom']\n     * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n     * Change this if your popper should grow in a direction different from `bottom`\n     */\n    x: 'bottom',\n    /**\n     * @prop {string} [x='left']\n     * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n     * Change this if your popper should grow in a direction different from `right`\n     */\n    y: 'right',\n  },\n\n  /**\n   * Applies the computed styles to the popper element.\n   *\n   * All the DOM manipulations are limited to this modifier. This is useful in case\n   * you want to integrate Popper.js inside a framework or view library and you\n   * want to delegate all the DOM manipulations to it.\n   *\n   * Note that if you disable this modifier, you must make sure the popper element\n   * has its position set to `absolute` before Popper.js can do its work!\n   *\n   * Just disable this modifier and define your own to achieve the desired effect.\n   *\n   * @memberof modifiers\n   * @inner\n   */\n  applyStyle: {\n    /** @prop {number} order=900 - Index used to define the order of execution */\n    order: 900,\n    /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n    enabled: true,\n    /** @prop {ModifierFn} */\n    fn: applyStyle,\n    /** @prop {Function} */\n    onLoad: applyStyleOnLoad,\n    /**\n     * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n     * @prop {Boolean} gpuAcceleration=true\n     * If true, it uses the CSS 3D transformation to position the popper.\n     * Otherwise, it will use the `top` and `left` properties\n     */\n    gpuAcceleration: undefined,\n  },\n};\n\n/**\n * The `dataObject` is an object containing all the information used by Popper.js.\n * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n * @name dataObject\n * @property {Object} data.instance The Popper.js instance\n * @property {String} data.placement Placement applied to popper\n * @property {String} data.originalPlacement Placement originally defined on init\n * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n * @property {Object} data.boundaries Offsets of the popper boundaries\n * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n */\n", "import modifiers from '../modifiers/index';\n\n/**\n * Default options provided to Popper.js constructor.<br />\n * These can be overridden using the `options` argument of Popper.js.<br />\n * To override an option, simply pass an object with the same\n * structure of the `options` object, as the 3rd argument. For example:\n * ```\n * new Popper(ref, pop, {\n *   modifiers: {\n *     preventOverflow: { enabled: false }\n *   }\n * })\n * ```\n * @type {Object}\n * @static\n * @memberof Popper\n */\nexport default {\n  /**\n   * Popper's placement.\n   * @prop {Popper.placements} placement='bottom'\n   */\n  placement: 'bottom',\n\n  /**\n   * Set this to true if you want popper to position it self in 'fixed' mode\n   * @prop {Boolean} positionFixed=false\n   */\n  positionFixed: false,\n\n  /**\n   * Whether events (resize, scroll) are initially enabled.\n   * @prop {Boolean} eventsEnabled=true\n   */\n  eventsEnabled: true,\n\n  /**\n   * Set to true if you want to automatically remove the popper when\n   * you call the `destroy` method.\n   * @prop {Boolean} removeOnDestroy=false\n   */\n  removeOnDestroy: false,\n\n  /**\n   * Callback called when the popper is created.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onCreate}\n   */\n  onCreate: () => {},\n\n  /**\n   * Callback called when the popper is updated. This callback is not called\n   * on the initialization/creation of the popper, but only on subsequent\n   * updates.<br />\n   * By default, it is set to no-op.<br />\n   * Access Popper.js instance with `data.instance`.\n   * @prop {onUpdate}\n   */\n  onUpdate: () => {},\n\n  /**\n   * List of modifiers used to modify the offsets before they are applied to the popper.\n   * They provide most of the functionalities of Popper.js.\n   * @prop {modifiers}\n   */\n  modifiers,\n};\n\n/**\n * @callback onCreate\n * @param {dataObject} data\n */\n\n/**\n * @callback onUpdate\n * @param {dataObject} data\n */\n", "// Utils\nimport debounce from './utils/debounce';\nimport isFunction from './utils/isFunction';\n\n// Methods\nimport update from './methods/update';\nimport destroy from './methods/destroy';\nimport enableEventListeners from './methods/enableEventListeners';\nimport disableEventListeners from './methods/disableEventListeners';\nimport Defaults from './methods/defaults';\nimport placements from './methods/placements';\n\nexport default class Popper {\n  /**\n   * Creates a new Popper.js instance.\n   * @class Popper\n   * @param {Element|referenceObject} reference - The reference element used to position the popper\n   * @param {Element} popper - The HTML / XML element used as the popper\n   * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n   * @return {Object} instance - The generated Popper.js instance\n   */\n  constructor(reference, popper, options = {}) {\n    // make update() debounced, so that it only runs at most once-per-tick\n    this.update = debounce(this.update.bind(this));\n\n    // with {} we create a new object with the options inside it\n    this.options = { ...Popper.Defaults, ...options };\n\n    // init state\n    this.state = {\n      isDestroyed: false,\n      isCreated: false,\n      scrollParents: [],\n    };\n\n    // get reference and popper elements (allow jQuery wrappers)\n    this.reference = reference && reference.jquery ? reference[0] : reference;\n    this.popper = popper && popper.jquery ? popper[0] : popper;\n\n    // Deep merge modifiers options\n    this.options.modifiers = {};\n    Object.keys({\n      ...Popper.Defaults.modifiers,\n      ...options.modifiers,\n    }).forEach(name => {\n      this.options.modifiers[name] = {\n        // If it's a built-in modifier, use it as base\n        ...(Popper.Defaults.modifiers[name] || {}),\n        // If there are custom options, override and merge with default ones\n        ...(options.modifiers ? options.modifiers[name] : {}),\n      };\n    });\n\n    // Refactoring modifiers' list (Object => Array)\n    this.modifiers = Object.keys(this.options.modifiers)\n      .map(name => ({\n        name,\n        ...this.options.modifiers[name],\n      }))\n      // sort the modifiers by order\n      .sort((a, b) => a.order - b.order);\n\n    // modifiers have the ability to execute arbitrary code when Popper.js get inited\n    // such code is executed in the same order of its modifier\n    // they could add new properties to their options configuration\n    // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n    this.modifiers.forEach(modifierOptions => {\n      if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n        modifierOptions.onLoad(\n          this.reference,\n          this.popper,\n          this.options,\n          modifierOptions,\n          this.state\n        );\n      }\n    });\n\n    // fire the first update to position the popper in the right place\n    this.update();\n\n    const eventsEnabled = this.options.eventsEnabled;\n    if (eventsEnabled) {\n      // setup event listeners, they will take care of update the position in specific situations\n      this.enableEventListeners();\n    }\n\n    this.state.eventsEnabled = eventsEnabled;\n  }\n\n  // We can't use class properties because they don't get listed in the\n  // class prototype and break stuff like Sinon stubs\n  update() {\n    return update.call(this);\n  }\n  destroy() {\n    return destroy.call(this);\n  }\n  enableEventListeners() {\n    return enableEventListeners.call(this);\n  }\n  disableEventListeners() {\n    return disableEventListeners.call(this);\n  }\n\n  /**\n   * Schedules an update. It will run on the next UI update available.\n   * @method scheduleUpdate\n   * @memberof Popper\n   */\n  scheduleUpdate = () => requestAnimationFrame(this.update);\n\n  /**\n   * Collection of utilities useful when writing custom modifiers.\n   * Starting from version 1.7, this method is available only if you\n   * include `popper-utils.js` before `popper.js`.\n   *\n   * **DEPRECATION**: This way to access PopperUtils is deprecated\n   * and will be removed in v2! Use the PopperUtils module directly instead.\n   * Due to the high instability of the methods contained in Utils, we can't\n   * guarantee them to follow semver. Use them at your own risk!\n   * @static\n   * @private\n   * @type {Object}\n   * @deprecated since version 1.8\n   * @member Utils\n   * @memberof Popper\n   */\n  static Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n\n  static placements = placements;\n\n  static Defaults = Defaults;\n}\n\n/**\n * The `referenceObject` is an object that provides an interface compatible with Popper.js\n * and lets you use it as replacement of a real DOM node.<br />\n * You can use this method to position a popper relatively to a set of coordinates\n * in case you don't have a DOM node to use as reference.\n *\n * ```\n * new Popper(referenceObject, popperNode);\n * ```\n *\n * NB: This feature isn't supported in Internet Explorer 10.\n * @name referenceObject\n * @property {Function} data.getBoundingClientRect\n * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n * @property {number} data.clientWidth\n * An ES6 getter that will return the width of the virtual reference element.\n * @property {number} data.clientHeight\n * An ES6 getter that will return the height of the virtual reference element.\n */\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n  return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n  return {\n    bindType: TRANSITION_END,\n    delegateType: TRANSITION_END,\n    handle(event) {\n      if ($(event.target).is(this)) {\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n      }\n      return undefined // eslint-disable-line no-undefined\n    }\n  }\n}\n\nfunction transitionEndEmulator(duration) {\n  let called = false\n\n  $(this).one(Util.TRANSITION_END, () => {\n    called = true\n  })\n\n  setTimeout(() => {\n    if (!called) {\n      Util.triggerTransitionEnd(this)\n    }\n  }, duration)\n\n  return this\n}\n\nfunction setTransitionEndSupport() {\n  $.fn.emulateTransitionEnd = transitionEndEmulator\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n  TRANSITION_END: 'bsTransitionEnd',\n\n  getUID(prefix) {\n    do {\n      // eslint-disable-next-line no-bitwise\n      prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n    } while (document.getElementById(prefix))\n    return prefix\n  },\n\n  getSelectorFromElement(element) {\n    let selector = element.getAttribute('data-target')\n\n    if (!selector || selector === '#') {\n      const hrefAttr = element.getAttribute('href')\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n    }\n\n    try {\n      return document.querySelector(selector) ? selector : null\n    } catch (err) {\n      return null\n    }\n  },\n\n  getTransitionDurationFromElement(element) {\n    if (!element) {\n      return 0\n    }\n\n    // Get transition-duration of the element\n    let transitionDuration = $(element).css('transition-duration')\n    let transitionDelay = $(element).css('transition-delay')\n\n    const floatTransitionDuration = parseFloat(transitionDuration)\n    const floatTransitionDelay = parseFloat(transitionDelay)\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0]\n    transitionDelay = transitionDelay.split(',')[0]\n\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n  },\n\n  reflow(element) {\n    return element.offsetHeight\n  },\n\n  triggerTransitionEnd(element) {\n    $(element).trigger(TRANSITION_END)\n  },\n\n  // TODO: Remove in v5\n  supportsTransitionEnd() {\n    return Boolean(TRANSITION_END)\n  },\n\n  isElement(obj) {\n    return (obj[0] || obj).nodeType\n  },\n\n  typeCheckConfig(componentName, config, configTypes) {\n    for (const property in configTypes) {\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n        const expectedTypes = configTypes[property]\n        const value         = config[property]\n        const valueType     = value && Util.isElement(value)\n          ? 'element' : toType(value)\n\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new Error(\n            `${componentName.toUpperCase()}: ` +\n            `Option \"${property}\" provided type \"${valueType}\" ` +\n            `but expected type \"${expectedTypes}\".`)\n        }\n      }\n    }\n  },\n\n  findShadowRoot(element) {\n    if (!document.documentElement.attachShadow) {\n      return null\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode()\n      return root instanceof ShadowRoot ? root : null\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null\n    }\n\n    return Util.findShadowRoot(element.parentNode)\n  }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                = 'alert'\nconst VERSION             = '4.3.1'\nconst DATA_KEY            = 'bs.alert'\nconst EVENT_KEY           = `.${DATA_KEY}`\nconst DATA_API_KEY        = '.data-api'\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\n\nconst Selector = {\n  DISMISS : '[data-dismiss=\"alert\"]'\n}\n\nconst Event = {\n  CLOSE          : `close${EVENT_KEY}`,\n  CLOSED         : `closed${EVENT_KEY}`,\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  ALERT : 'alert',\n  FADE  : 'fade',\n  SHOW  : 'show'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert {\n  constructor(element) {\n    this._element = element\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  // Public\n\n  close(element) {\n    let rootElement = this._element\n    if (element) {\n      rootElement = this._getRootElement(element)\n    }\n\n    const customEvent = this._triggerCloseEvent(rootElement)\n\n    if (customEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._removeElement(rootElement)\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n  }\n\n  // Private\n\n  _getRootElement(element) {\n    const selector = Util.getSelectorFromElement(element)\n    let parent     = false\n\n    if (selector) {\n      parent = document.querySelector(selector)\n    }\n\n    if (!parent) {\n      parent = $(element).closest(`.${ClassName.ALERT}`)[0]\n    }\n\n    return parent\n  }\n\n  _triggerCloseEvent(element) {\n    const closeEvent = $.Event(Event.CLOSE)\n\n    $(element).trigger(closeEvent)\n    return closeEvent\n  }\n\n  _removeElement(element) {\n    $(element).removeClass(ClassName.SHOW)\n\n    if (!$(element).hasClass(ClassName.FADE)) {\n      this._destroyElement(element)\n      return\n    }\n\n    const transitionDuration = Util.getTransitionDurationFromElement(element)\n\n    $(element)\n      .one(Util.TRANSITION_END, (event) => this._destroyElement(element, event))\n      .emulateTransitionEnd(transitionDuration)\n  }\n\n  _destroyElement(element) {\n    $(element)\n      .detach()\n      .trigger(Event.CLOSED)\n      .remove()\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $element = $(this)\n      let data       = $element.data(DATA_KEY)\n\n      if (!data) {\n        data = new Alert(this)\n        $element.data(DATA_KEY, data)\n      }\n\n      if (config === 'close') {\n        data[config](this)\n      }\n    })\n  }\n\n  static _handleDismiss(alertInstance) {\n    return function (event) {\n      if (event) {\n        event.preventDefault()\n      }\n\n      alertInstance.close(this)\n    }\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(\n  Event.CLICK_DATA_API,\n  Selector.DISMISS,\n  Alert._handleDismiss(new Alert())\n)\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME]             = Alert._jQueryInterface\n$.fn[NAME].Constructor = Alert\n$.fn[NAME].noConflict  = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Alert._jQueryInterface\n}\n\nexport default Alert\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                = 'button'\nconst VERSION             = '4.3.1'\nconst DATA_KEY            = 'bs.button'\nconst EVENT_KEY           = `.${DATA_KEY}`\nconst DATA_API_KEY        = '.data-api'\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\n\nconst ClassName = {\n  ACTIVE : 'active',\n  BUTTON : 'btn',\n  FOCUS  : 'focus'\n}\n\nconst Selector = {\n  DATA_TOGGLE_CARROT : '[data-toggle^=\"button\"]',\n  DATA_TOGGLE        : '[data-toggle=\"buttons\"]',\n  INPUT              : 'input:not([type=\"hidden\"])',\n  ACTIVE             : '.active',\n  BUTTON             : '.btn'\n}\n\nconst Event = {\n  CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,\n  FOCUS_BLUR_DATA_API : `focus${EVENT_KEY}${DATA_API_KEY} ` +\n                          `blur${EVENT_KEY}${DATA_API_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button {\n  constructor(element) {\n    this._element = element\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  // Public\n\n  toggle() {\n    let triggerChangeEvent = true\n    let addAriaPressed = true\n    const rootElement = $(this._element).closest(\n      Selector.DATA_TOGGLE\n    )[0]\n\n    if (rootElement) {\n      const input = this._element.querySelector(Selector.INPUT)\n\n      if (input) {\n        if (input.type === 'radio') {\n          if (input.checked &&\n            this._element.classList.contains(ClassName.ACTIVE)) {\n            triggerChangeEvent = false\n          } else {\n            const activeElement = rootElement.querySelector(Selector.ACTIVE)\n\n            if (activeElement) {\n              $(activeElement).removeClass(ClassName.ACTIVE)\n            }\n          }\n        }\n\n        if (triggerChangeEvent) {\n          if (input.hasAttribute('disabled') ||\n            rootElement.hasAttribute('disabled') ||\n            input.classList.contains('disabled') ||\n            rootElement.classList.contains('disabled')) {\n            return\n          }\n          input.checked = !this._element.classList.contains(ClassName.ACTIVE)\n          $(input).trigger('change')\n        }\n\n        input.focus()\n        addAriaPressed = false\n      }\n    }\n\n    if (addAriaPressed) {\n      this._element.setAttribute('aria-pressed',\n        !this._element.classList.contains(ClassName.ACTIVE))\n    }\n\n    if (triggerChangeEvent) {\n      $(this._element).toggleClass(ClassName.ACTIVE)\n    }\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n\n      if (!data) {\n        data = new Button(this)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (config === 'toggle') {\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n    event.preventDefault()\n\n    let button = event.target\n\n    if (!$(button).hasClass(ClassName.BUTTON)) {\n      button = $(button).closest(Selector.BUTTON)\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle')\n  })\n  .on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, (event) => {\n    const button = $(event.target).closest(Selector.BUTTON)[0]\n    $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type))\n  })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Button._jQueryInterface\n$.fn[NAME].Constructor = Button\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Button._jQueryInterface\n}\n\nexport default Button\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                   = 'carousel'\nconst VERSION                = '4.3.1'\nconst DATA_KEY               = 'bs.carousel'\nconst EVENT_KEY              = `.${DATA_KEY}`\nconst DATA_API_KEY           = '.data-api'\nconst JQUERY_NO_CONFLICT     = $.fn[NAME]\nconst ARROW_LEFT_KEYCODE     = 37 // KeyboardEvent.which value for left arrow key\nconst ARROW_RIGHT_KEYCODE    = 39 // KeyboardEvent.which value for right arrow key\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\nconst SWIPE_THRESHOLD        = 40\n\nconst Default = {\n  interval : 5000,\n  keyboard : true,\n  slide    : false,\n  pause    : 'hover',\n  wrap     : true,\n  touch    : true\n}\n\nconst DefaultType = {\n  interval : '(number|boolean)',\n  keyboard : 'boolean',\n  slide    : '(boolean|string)',\n  pause    : '(string|boolean)',\n  wrap     : 'boolean',\n  touch    : 'boolean'\n}\n\nconst Direction = {\n  NEXT     : 'next',\n  PREV     : 'prev',\n  LEFT     : 'left',\n  RIGHT    : 'right'\n}\n\nconst Event = {\n  SLIDE          : `slide${EVENT_KEY}`,\n  SLID           : `slid${EVENT_KEY}`,\n  KEYDOWN        : `keydown${EVENT_KEY}`,\n  MOUSEENTER     : `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE     : `mouseleave${EVENT_KEY}`,\n  TOUCHSTART     : `touchstart${EVENT_KEY}`,\n  TOUCHMOVE      : `touchmove${EVENT_KEY}`,\n  TOUCHEND       : `touchend${EVENT_KEY}`,\n  POINTERDOWN    : `pointerdown${EVENT_KEY}`,\n  POINTERUP      : `pointerup${EVENT_KEY}`,\n  DRAG_START     : `dragstart${EVENT_KEY}`,\n  LOAD_DATA_API  : `load${EVENT_KEY}${DATA_API_KEY}`,\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  CAROUSEL      : 'carousel',\n  ACTIVE        : 'active',\n  SLIDE         : 'slide',\n  RIGHT         : 'carousel-item-right',\n  LEFT          : 'carousel-item-left',\n  NEXT          : 'carousel-item-next',\n  PREV          : 'carousel-item-prev',\n  ITEM          : 'carousel-item',\n  POINTER_EVENT : 'pointer-event'\n}\n\nconst Selector = {\n  ACTIVE      : '.active',\n  ACTIVE_ITEM : '.active.carousel-item',\n  ITEM        : '.carousel-item',\n  ITEM_IMG    : '.carousel-item img',\n  NEXT_PREV   : '.carousel-item-next, .carousel-item-prev',\n  INDICATORS  : '.carousel-indicators',\n  DATA_SLIDE  : '[data-slide], [data-slide-to]',\n  DATA_RIDE   : '[data-ride=\"carousel\"]'\n}\n\nconst PointerType = {\n  TOUCH : 'touch',\n  PEN   : 'pen'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\nclass Carousel {\n  constructor(element, config) {\n    this._items         = null\n    this._interval      = null\n    this._activeElement = null\n    this._isPaused      = false\n    this._isSliding     = false\n    this.touchTimeout   = null\n    this.touchStartX    = 0\n    this.touchDeltaX    = 0\n\n    this._config            = this._getConfig(config)\n    this._element           = element\n    this._indicatorsElement = this._element.querySelector(Selector.INDICATORS)\n    this._touchSupported    = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n    this._pointerEvent      = Boolean(window.PointerEvent || window.MSPointerEvent)\n\n    this._addEventListeners()\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n\n  next() {\n    if (!this._isSliding) {\n      this._slide(Direction.NEXT)\n    }\n  }\n\n  nextWhenVisible() {\n    // Don't call next when the page isn't visible\n    // or the carousel or its parent isn't visible\n    if (!document.hidden &&\n      ($(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden')) {\n      this.next()\n    }\n  }\n\n  prev() {\n    if (!this._isSliding) {\n      this._slide(Direction.PREV)\n    }\n  }\n\n  pause(event) {\n    if (!event) {\n      this._isPaused = true\n    }\n\n    if (this._element.querySelector(Selector.NEXT_PREV)) {\n      Util.triggerTransitionEnd(this._element)\n      this.cycle(true)\n    }\n\n    clearInterval(this._interval)\n    this._interval = null\n  }\n\n  cycle(event) {\n    if (!event) {\n      this._isPaused = false\n    }\n\n    if (this._interval) {\n      clearInterval(this._interval)\n      this._interval = null\n    }\n\n    if (this._config.interval && !this._isPaused) {\n      this._interval = setInterval(\n        (document.visibilityState ? this.nextWhenVisible : this.next).bind(this),\n        this._config.interval\n      )\n    }\n  }\n\n  to(index) {\n    this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n\n    const activeIndex = this._getItemIndex(this._activeElement)\n\n    if (index > this._items.length - 1 || index < 0) {\n      return\n    }\n\n    if (this._isSliding) {\n      $(this._element).one(Event.SLID, () => this.to(index))\n      return\n    }\n\n    if (activeIndex === index) {\n      this.pause()\n      this.cycle()\n      return\n    }\n\n    const direction = index > activeIndex\n      ? Direction.NEXT\n      : Direction.PREV\n\n    this._slide(direction, this._items[index])\n  }\n\n  dispose() {\n    $(this._element).off(EVENT_KEY)\n    $.removeData(this._element, DATA_KEY)\n\n    this._items             = null\n    this._config            = null\n    this._element           = null\n    this._interval          = null\n    this._isPaused          = null\n    this._isSliding         = null\n    this._activeElement     = null\n    this._indicatorsElement = null\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...config\n    }\n    Util.typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _handleSwipe() {\n    const absDeltax = Math.abs(this.touchDeltaX)\n\n    if (absDeltax <= SWIPE_THRESHOLD) {\n      return\n    }\n\n    const direction = absDeltax / this.touchDeltaX\n\n    // swipe left\n    if (direction > 0) {\n      this.prev()\n    }\n\n    // swipe right\n    if (direction < 0) {\n      this.next()\n    }\n  }\n\n  _addEventListeners() {\n    if (this._config.keyboard) {\n      $(this._element)\n        .on(Event.KEYDOWN, (event) => this._keydown(event))\n    }\n\n    if (this._config.pause === 'hover') {\n      $(this._element)\n        .on(Event.MOUSEENTER, (event) => this.pause(event))\n        .on(Event.MOUSELEAVE, (event) => this.cycle(event))\n    }\n\n    if (this._config.touch) {\n      this._addTouchEventListeners()\n    }\n  }\n\n  _addTouchEventListeners() {\n    if (!this._touchSupported) {\n      return\n    }\n\n    const start = (event) => {\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n        this.touchStartX = event.originalEvent.clientX\n      } else if (!this._pointerEvent) {\n        this.touchStartX = event.originalEvent.touches[0].clientX\n      }\n    }\n\n    const move = (event) => {\n      // ensure swiping with one touch and not pinching\n      if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n        this.touchDeltaX = 0\n      } else {\n        this.touchDeltaX = event.originalEvent.touches[0].clientX - this.touchStartX\n      }\n    }\n\n    const end = (event) => {\n      if (this._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n        this.touchDeltaX = event.originalEvent.clientX - this.touchStartX\n      }\n\n      this._handleSwipe()\n      if (this._config.pause === 'hover') {\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n\n        this.pause()\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout)\n        }\n        this.touchTimeout = setTimeout((event) => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n      }\n    }\n\n    $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, (e) => e.preventDefault())\n    if (this._pointerEvent) {\n      $(this._element).on(Event.POINTERDOWN, (event) => start(event))\n      $(this._element).on(Event.POINTERUP, (event) => end(event))\n\n      this._element.classList.add(ClassName.POINTER_EVENT)\n    } else {\n      $(this._element).on(Event.TOUCHSTART, (event) => start(event))\n      $(this._element).on(Event.TOUCHMOVE, (event) => move(event))\n      $(this._element).on(Event.TOUCHEND, (event) => end(event))\n    }\n  }\n\n  _keydown(event) {\n    if (/input|textarea/i.test(event.target.tagName)) {\n      return\n    }\n\n    switch (event.which) {\n      case ARROW_LEFT_KEYCODE:\n        event.preventDefault()\n        this.prev()\n        break\n      case ARROW_RIGHT_KEYCODE:\n        event.preventDefault()\n        this.next()\n        break\n      default:\n    }\n  }\n\n  _getItemIndex(element) {\n    this._items = element && element.parentNode\n      ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM))\n      : []\n    return this._items.indexOf(element)\n  }\n\n  _getItemByDirection(direction, activeElement) {\n    const isNextDirection = direction === Direction.NEXT\n    const isPrevDirection = direction === Direction.PREV\n    const activeIndex     = this._getItemIndex(activeElement)\n    const lastItemIndex   = this._items.length - 1\n    const isGoingToWrap   = isPrevDirection && activeIndex === 0 ||\n                            isNextDirection && activeIndex === lastItemIndex\n\n    if (isGoingToWrap && !this._config.wrap) {\n      return activeElement\n    }\n\n    const delta     = direction === Direction.PREV ? -1 : 1\n    const itemIndex = (activeIndex + delta) % this._items.length\n\n    return itemIndex === -1\n      ? this._items[this._items.length - 1] : this._items[itemIndex]\n  }\n\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\n    const targetIndex = this._getItemIndex(relatedTarget)\n    const fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM))\n    const slideEvent = $.Event(Event.SLIDE, {\n      relatedTarget,\n      direction: eventDirectionName,\n      from: fromIndex,\n      to: targetIndex\n    })\n\n    $(this._element).trigger(slideEvent)\n\n    return slideEvent\n  }\n\n  _setActiveIndicatorElement(element) {\n    if (this._indicatorsElement) {\n      const indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE))\n      $(indicators)\n        .removeClass(ClassName.ACTIVE)\n\n      const nextIndicator = this._indicatorsElement.children[\n        this._getItemIndex(element)\n      ]\n\n      if (nextIndicator) {\n        $(nextIndicator).addClass(ClassName.ACTIVE)\n      }\n    }\n  }\n\n  _slide(direction, element) {\n    const activeElement = this._element.querySelector(Selector.ACTIVE_ITEM)\n    const activeElementIndex = this._getItemIndex(activeElement)\n    const nextElement   = element || activeElement &&\n      this._getItemByDirection(direction, activeElement)\n    const nextElementIndex = this._getItemIndex(nextElement)\n    const isCycling = Boolean(this._interval)\n\n    let directionalClassName\n    let orderClassName\n    let eventDirectionName\n\n    if (direction === Direction.NEXT) {\n      directionalClassName = ClassName.LEFT\n      orderClassName = ClassName.NEXT\n      eventDirectionName = Direction.LEFT\n    } else {\n      directionalClassName = ClassName.RIGHT\n      orderClassName = ClassName.PREV\n      eventDirectionName = Direction.RIGHT\n    }\n\n    if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) {\n      this._isSliding = false\n      return\n    }\n\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName)\n    if (slideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (!activeElement || !nextElement) {\n      // Some weirdness is happening, so we bail\n      return\n    }\n\n    this._isSliding = true\n\n    if (isCycling) {\n      this.pause()\n    }\n\n    this._setActiveIndicatorElement(nextElement)\n\n    const slidEvent = $.Event(Event.SLID, {\n      relatedTarget: nextElement,\n      direction: eventDirectionName,\n      from: activeElementIndex,\n      to: nextElementIndex\n    })\n\n    if ($(this._element).hasClass(ClassName.SLIDE)) {\n      $(nextElement).addClass(orderClassName)\n\n      Util.reflow(nextElement)\n\n      $(activeElement).addClass(directionalClassName)\n      $(nextElement).addClass(directionalClassName)\n\n      const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10)\n      if (nextElementInterval) {\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval\n        this._config.interval = nextElementInterval\n      } else {\n        this._config.interval = this._config.defaultInterval || this._config.interval\n      }\n\n      const transitionDuration = Util.getTransitionDurationFromElement(activeElement)\n\n      $(activeElement)\n        .one(Util.TRANSITION_END, () => {\n          $(nextElement)\n            .removeClass(`${directionalClassName} ${orderClassName}`)\n            .addClass(ClassName.ACTIVE)\n\n          $(activeElement).removeClass(`${ClassName.ACTIVE} ${orderClassName} ${directionalClassName}`)\n\n          this._isSliding = false\n\n          setTimeout(() => $(this._element).trigger(slidEvent), 0)\n        })\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      $(activeElement).removeClass(ClassName.ACTIVE)\n      $(nextElement).addClass(ClassName.ACTIVE)\n\n      this._isSliding = false\n      $(this._element).trigger(slidEvent)\n    }\n\n    if (isCycling) {\n      this.cycle()\n    }\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      let _config = {\n        ...Default,\n        ...$(this).data()\n      }\n\n      if (typeof config === 'object') {\n        _config = {\n          ..._config,\n          ...config\n        }\n      }\n\n      const action = typeof config === 'string' ? config : _config.slide\n\n      if (!data) {\n        data = new Carousel(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'number') {\n        data.to(config)\n      } else if (typeof action === 'string') {\n        if (typeof data[action] === 'undefined') {\n          throw new TypeError(`No method named \"${action}\"`)\n        }\n        data[action]()\n      } else if (_config.interval && _config.ride) {\n        data.pause()\n        data.cycle()\n      }\n    })\n  }\n\n  static _dataApiClickHandler(event) {\n    const selector = Util.getSelectorFromElement(this)\n\n    if (!selector) {\n      return\n    }\n\n    const target = $(selector)[0]\n\n    if (!target || !$(target).hasClass(ClassName.CAROUSEL)) {\n      return\n    }\n\n    const config = {\n      ...$(target).data(),\n      ...$(this).data()\n    }\n    const slideIndex = this.getAttribute('data-slide-to')\n\n    if (slideIndex) {\n      config.interval = false\n    }\n\n    Carousel._jQueryInterface.call($(target), config)\n\n    if (slideIndex) {\n      $(target).data(DATA_KEY).to(slideIndex)\n    }\n\n    event.preventDefault()\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n  .on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler)\n\n$(window).on(Event.LOAD_DATA_API, () => {\n  const carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE))\n  for (let i = 0, len = carousels.length; i < len; i++) {\n    const $carousel = $(carousels[i])\n    Carousel._jQueryInterface.call($carousel, $carousel.data())\n  }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Carousel._jQueryInterface\n$.fn[NAME].Constructor = Carousel\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Carousel._jQueryInterface\n}\n\nexport default Carousel\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                = 'collapse'\nconst VERSION             = '4.3.1'\nconst DATA_KEY            = 'bs.collapse'\nconst EVENT_KEY           = `.${DATA_KEY}`\nconst DATA_API_KEY        = '.data-api'\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\n\nconst Default = {\n  toggle : true,\n  parent : ''\n}\n\nconst DefaultType = {\n  toggle : 'boolean',\n  parent : '(string|element)'\n}\n\nconst Event = {\n  SHOW           : `show${EVENT_KEY}`,\n  SHOWN          : `shown${EVENT_KEY}`,\n  HIDE           : `hide${EVENT_KEY}`,\n  HIDDEN         : `hidden${EVENT_KEY}`,\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  SHOW       : 'show',\n  COLLAPSE   : 'collapse',\n  COLLAPSING : 'collapsing',\n  COLLAPSED  : 'collapsed'\n}\n\nconst Dimension = {\n  WIDTH  : 'width',\n  HEIGHT : 'height'\n}\n\nconst Selector = {\n  ACTIVES     : '.show, .collapsing',\n  DATA_TOGGLE : '[data-toggle=\"collapse\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse {\n  constructor(element, config) {\n    this._isTransitioning = false\n    this._element         = element\n    this._config          = this._getConfig(config)\n    this._triggerArray    = [].slice.call(document.querySelectorAll(\n      `[data-toggle=\"collapse\"][href=\"#${element.id}\"],` +\n      `[data-toggle=\"collapse\"][data-target=\"#${element.id}\"]`\n    ))\n\n    const toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n    for (let i = 0, len = toggleList.length; i < len; i++) {\n      const elem = toggleList[i]\n      const selector = Util.getSelectorFromElement(elem)\n      const filterElement = [].slice.call(document.querySelectorAll(selector))\n        .filter((foundElem) => foundElem === element)\n\n      if (selector !== null && filterElement.length > 0) {\n        this._selector = selector\n        this._triggerArray.push(elem)\n      }\n    }\n\n    this._parent = this._config.parent ? this._getParent() : null\n\n    if (!this._config.parent) {\n      this._addAriaAndCollapsedClass(this._element, this._triggerArray)\n    }\n\n    if (this._config.toggle) {\n      this.toggle()\n    }\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n\n  toggle() {\n    if ($(this._element).hasClass(ClassName.SHOW)) {\n      this.hide()\n    } else {\n      this.show()\n    }\n  }\n\n  show() {\n    if (this._isTransitioning ||\n      $(this._element).hasClass(ClassName.SHOW)) {\n      return\n    }\n\n    let actives\n    let activesData\n\n    if (this._parent) {\n      actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES))\n        .filter((elem) => {\n          if (typeof this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === this._config.parent\n          }\n\n          return elem.classList.contains(ClassName.COLLAPSE)\n        })\n\n      if (actives.length === 0) {\n        actives = null\n      }\n    }\n\n    if (actives) {\n      activesData = $(actives).not(this._selector).data(DATA_KEY)\n      if (activesData && activesData._isTransitioning) {\n        return\n      }\n    }\n\n    const startEvent = $.Event(Event.SHOW)\n    $(this._element).trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (actives) {\n      Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide')\n      if (!activesData) {\n        $(actives).data(DATA_KEY, null)\n      }\n    }\n\n    const dimension = this._getDimension()\n\n    $(this._element)\n      .removeClass(ClassName.COLLAPSE)\n      .addClass(ClassName.COLLAPSING)\n\n    this._element.style[dimension] = 0\n\n    if (this._triggerArray.length) {\n      $(this._triggerArray)\n        .removeClass(ClassName.COLLAPSED)\n        .attr('aria-expanded', true)\n    }\n\n    this.setTransitioning(true)\n\n    const complete = () => {\n      $(this._element)\n        .removeClass(ClassName.COLLAPSING)\n        .addClass(ClassName.COLLAPSE)\n        .addClass(ClassName.SHOW)\n\n      this._element.style[dimension] = ''\n\n      this.setTransitioning(false)\n\n      $(this._element).trigger(Event.SHOWN)\n    }\n\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n    const scrollSize = `scroll${capitalizedDimension}`\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n    $(this._element)\n      .one(Util.TRANSITION_END, complete)\n      .emulateTransitionEnd(transitionDuration)\n\n    this._element.style[dimension] = `${this._element[scrollSize]}px`\n  }\n\n  hide() {\n    if (this._isTransitioning ||\n      !$(this._element).hasClass(ClassName.SHOW)) {\n      return\n    }\n\n    const startEvent = $.Event(Event.HIDE)\n    $(this._element).trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) {\n      return\n    }\n\n    const dimension = this._getDimension()\n\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n    Util.reflow(this._element)\n\n    $(this._element)\n      .addClass(ClassName.COLLAPSING)\n      .removeClass(ClassName.COLLAPSE)\n      .removeClass(ClassName.SHOW)\n\n    const triggerArrayLength = this._triggerArray.length\n    if (triggerArrayLength > 0) {\n      for (let i = 0; i < triggerArrayLength; i++) {\n        const trigger = this._triggerArray[i]\n        const selector = Util.getSelectorFromElement(trigger)\n\n        if (selector !== null) {\n          const $elem = $([].slice.call(document.querySelectorAll(selector)))\n          if (!$elem.hasClass(ClassName.SHOW)) {\n            $(trigger).addClass(ClassName.COLLAPSED)\n              .attr('aria-expanded', false)\n          }\n        }\n      }\n    }\n\n    this.setTransitioning(true)\n\n    const complete = () => {\n      this.setTransitioning(false)\n      $(this._element)\n        .removeClass(ClassName.COLLAPSING)\n        .addClass(ClassName.COLLAPSE)\n        .trigger(Event.HIDDEN)\n    }\n\n    this._element.style[dimension] = ''\n    const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n    $(this._element)\n      .one(Util.TRANSITION_END, complete)\n      .emulateTransitionEnd(transitionDuration)\n  }\n\n  setTransitioning(isTransitioning) {\n    this._isTransitioning = isTransitioning\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n\n    this._config          = null\n    this._parent          = null\n    this._element         = null\n    this._triggerArray    = null\n    this._isTransitioning = null\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...config\n    }\n    config.toggle = Boolean(config.toggle) // Coerce string values\n    Util.typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _getDimension() {\n    const hasWidth = $(this._element).hasClass(Dimension.WIDTH)\n    return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT\n  }\n\n  _getParent() {\n    let parent\n\n    if (Util.isElement(this._config.parent)) {\n      parent = this._config.parent\n\n      // It's a jQuery object\n      if (typeof this._config.parent.jquery !== 'undefined') {\n        parent = this._config.parent[0]\n      }\n    } else {\n      parent = document.querySelector(this._config.parent)\n    }\n\n    const selector =\n      `[data-toggle=\"collapse\"][data-parent=\"${this._config.parent}\"]`\n\n    const children = [].slice.call(parent.querySelectorAll(selector))\n    $(children).each((i, element) => {\n      this._addAriaAndCollapsedClass(\n        Collapse._getTargetFromElement(element),\n        [element]\n      )\n    })\n\n    return parent\n  }\n\n  _addAriaAndCollapsedClass(element, triggerArray) {\n    const isOpen = $(element).hasClass(ClassName.SHOW)\n\n    if (triggerArray.length) {\n      $(triggerArray)\n        .toggleClass(ClassName.COLLAPSED, !isOpen)\n        .attr('aria-expanded', isOpen)\n    }\n  }\n\n  // Static\n\n  static _getTargetFromElement(element) {\n    const selector = Util.getSelectorFromElement(element)\n    return selector ? document.querySelector(selector) : null\n  }\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $this   = $(this)\n      let data      = $this.data(DATA_KEY)\n      const _config = {\n        ...Default,\n        ...$this.data(),\n        ...typeof config === 'object' && config ? config : {}\n      }\n\n      if (!data && _config.toggle && /show|hide/.test(config)) {\n        _config.toggle = false\n      }\n\n      if (!data) {\n        data = new Collapse(this, _config)\n        $this.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n  if (event.currentTarget.tagName === 'A') {\n    event.preventDefault()\n  }\n\n  const $trigger = $(this)\n  const selector = Util.getSelectorFromElement(this)\n  const selectors = [].slice.call(document.querySelectorAll(selector))\n\n  $(selectors).each(function () {\n    const $target = $(this)\n    const data    = $target.data(DATA_KEY)\n    const config  = data ? 'toggle' : $trigger.data()\n    Collapse._jQueryInterface.call($target, config)\n  })\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Collapse._jQueryInterface\n$.fn[NAME].Constructor = Collapse\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Collapse._jQueryInterface\n}\n\nexport default Collapse\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                     = 'dropdown'\nconst VERSION                  = '4.3.1'\nconst DATA_KEY                 = 'bs.dropdown'\nconst EVENT_KEY                = `.${DATA_KEY}`\nconst DATA_API_KEY             = '.data-api'\nconst JQUERY_NO_CONFLICT       = $.fn[NAME]\nconst ESCAPE_KEYCODE           = 27 // KeyboardEvent.which value for Escape (Esc) key\nconst SPACE_KEYCODE            = 32 // KeyboardEvent.which value for space key\nconst TAB_KEYCODE              = 9 // KeyboardEvent.which value for tab key\nconst ARROW_UP_KEYCODE         = 38 // KeyboardEvent.which value for up arrow key\nconst ARROW_DOWN_KEYCODE       = 40 // KeyboardEvent.which value for down arrow key\nconst RIGHT_MOUSE_BUTTON_WHICH = 3 // MouseEvent.which value for the right button (assuming a right-handed mouse)\nconst REGEXP_KEYDOWN           = new RegExp(`${ARROW_UP_KEYCODE}|${ARROW_DOWN_KEYCODE}|${ESCAPE_KEYCODE}`)\n\nconst Event = {\n  HIDE             : `hide${EVENT_KEY}`,\n  HIDDEN           : `hidden${EVENT_KEY}`,\n  SHOW             : `show${EVENT_KEY}`,\n  SHOWN            : `shown${EVENT_KEY}`,\n  CLICK            : `click${EVENT_KEY}`,\n  CLICK_DATA_API   : `click${EVENT_KEY}${DATA_API_KEY}`,\n  KEYDOWN_DATA_API : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n  KEYUP_DATA_API   : `keyup${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  DISABLED        : 'disabled',\n  SHOW            : 'show',\n  DROPUP          : 'dropup',\n  DROPRIGHT       : 'dropright',\n  DROPLEFT        : 'dropleft',\n  MENURIGHT       : 'dropdown-menu-right',\n  MENULEFT        : 'dropdown-menu-left',\n  POSITION_STATIC : 'position-static'\n}\n\nconst Selector = {\n  DATA_TOGGLE   : '[data-toggle=\"dropdown\"]',\n  FORM_CHILD    : '.dropdown form',\n  MENU          : '.dropdown-menu',\n  NAVBAR_NAV    : '.navbar-nav',\n  VISIBLE_ITEMS : '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n}\n\nconst AttachmentMap = {\n  TOP       : 'top-start',\n  TOPEND    : 'top-end',\n  BOTTOM    : 'bottom-start',\n  BOTTOMEND : 'bottom-end',\n  RIGHT     : 'right-start',\n  RIGHTEND  : 'right-end',\n  LEFT      : 'left-start',\n  LEFTEND   : 'left-end'\n}\n\nconst Default = {\n  offset    : 0,\n  flip      : true,\n  boundary  : 'scrollParent',\n  reference : 'toggle',\n  display   : 'dynamic'\n}\n\nconst DefaultType = {\n  offset    : '(number|string|function)',\n  flip      : 'boolean',\n  boundary  : '(string|element)',\n  reference : '(string|element)',\n  display   : 'string'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown {\n  constructor(element, config) {\n    this._element  = element\n    this._popper   = null\n    this._config   = this._getConfig(config)\n    this._menu     = this._getMenuElement()\n    this._inNavbar = this._detectNavbar()\n\n    this._addEventListeners()\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Public\n\n  toggle() {\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) {\n      return\n    }\n\n    const parent   = Dropdown._getParentFromElement(this._element)\n    const isActive = $(this._menu).hasClass(ClassName.SHOW)\n\n    Dropdown._clearMenus()\n\n    if (isActive) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\n\n    $(parent).trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented()) {\n      return\n    }\n\n    // Disable totally Popper.js for Dropdown in Navbar\n    if (!this._inNavbar) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)')\n      }\n\n      let referenceElement = this._element\n\n      if (this._config.reference === 'parent') {\n        referenceElement = parent\n      } else if (Util.isElement(this._config.reference)) {\n        referenceElement = this._config.reference\n\n        // Check if it's jQuery element\n        if (typeof this._config.reference.jquery !== 'undefined') {\n          referenceElement = this._config.reference[0]\n        }\n      }\n\n      // If boundary is not `scrollParent`, then set position to `static`\n      // to allow the menu to \"escape\" the scroll parent's boundaries\n      // https://github.com/twbs/bootstrap/issues/24251\n      if (this._config.boundary !== 'scrollParent') {\n        $(parent).addClass(ClassName.POSITION_STATIC)\n      }\n      this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig())\n    }\n\n    // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n    if ('ontouchstart' in document.documentElement &&\n        $(parent).closest(Selector.NAVBAR_NAV).length === 0) {\n      $(document.body).children().on('mouseover', null, $.noop)\n    }\n\n    this._element.focus()\n    this._element.setAttribute('aria-expanded', true)\n\n    $(this._menu).toggleClass(ClassName.SHOW)\n    $(parent)\n      .toggleClass(ClassName.SHOW)\n      .trigger($.Event(Event.SHOWN, relatedTarget))\n  }\n\n  show() {\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n    const showEvent = $.Event(Event.SHOW, relatedTarget)\n    const parent = Dropdown._getParentFromElement(this._element)\n\n    $(parent).trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented()) {\n      return\n    }\n\n    $(this._menu).toggleClass(ClassName.SHOW)\n    $(parent)\n      .toggleClass(ClassName.SHOW)\n      .trigger($.Event(Event.SHOWN, relatedTarget))\n  }\n\n  hide() {\n    if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) {\n      return\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    }\n    const hideEvent = $.Event(Event.HIDE, relatedTarget)\n    const parent = Dropdown._getParentFromElement(this._element)\n\n    $(parent).trigger(hideEvent)\n\n    if (hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    $(this._menu).toggleClass(ClassName.SHOW)\n    $(parent)\n      .toggleClass(ClassName.SHOW)\n      .trigger($.Event(Event.HIDDEN, relatedTarget))\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    $(this._element).off(EVENT_KEY)\n    this._element = null\n    this._menu = null\n    if (this._popper !== null) {\n      this._popper.destroy()\n      this._popper = null\n    }\n  }\n\n  update() {\n    this._inNavbar = this._detectNavbar()\n    if (this._popper !== null) {\n      this._popper.scheduleUpdate()\n    }\n  }\n\n  // Private\n\n  _addEventListeners() {\n    $(this._element).on(Event.CLICK, (event) => {\n      event.preventDefault()\n      event.stopPropagation()\n      this.toggle()\n    })\n  }\n\n  _getConfig(config) {\n    config = {\n      ...this.constructor.Default,\n      ...$(this._element).data(),\n      ...config\n    }\n\n    Util.typeCheckConfig(\n      NAME,\n      config,\n      this.constructor.DefaultType\n    )\n\n    return config\n  }\n\n  _getMenuElement() {\n    if (!this._menu) {\n      const parent = Dropdown._getParentFromElement(this._element)\n\n      if (parent) {\n        this._menu = parent.querySelector(Selector.MENU)\n      }\n    }\n    return this._menu\n  }\n\n  _getPlacement() {\n    const $parentDropdown = $(this._element.parentNode)\n    let placement = AttachmentMap.BOTTOM\n\n    // Handle dropup\n    if ($parentDropdown.hasClass(ClassName.DROPUP)) {\n      placement = AttachmentMap.TOP\n      if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n        placement = AttachmentMap.TOPEND\n      }\n    } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) {\n      placement = AttachmentMap.RIGHT\n    } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) {\n      placement = AttachmentMap.LEFT\n    } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) {\n      placement = AttachmentMap.BOTTOMEND\n    }\n    return placement\n  }\n\n  _detectNavbar() {\n    return $(this._element).closest('.navbar').length > 0\n  }\n\n  _getOffset() {\n    const offset = {}\n\n    if (typeof this._config.offset === 'function') {\n      offset.fn = (data) => {\n        data.offsets = {\n          ...data.offsets,\n          ...this._config.offset(data.offsets, this._element) || {}\n        }\n\n        return data\n      }\n    } else {\n      offset.offset = this._config.offset\n    }\n\n    return offset\n  }\n\n  _getPopperConfig() {\n    const popperConfig = {\n      placement: this._getPlacement(),\n      modifiers: {\n        offset: this._getOffset(),\n        flip: {\n          enabled: this._config.flip\n        },\n        preventOverflow: {\n          boundariesElement: this._config.boundary\n        }\n      }\n    }\n\n    // Disable Popper.js if we have a static display\n    if (this._config.display === 'static') {\n      popperConfig.modifiers.applyStyle = {\n        enabled: false\n      }\n    }\n\n    return popperConfig\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' ? config : null\n\n      if (!data) {\n        data = new Dropdown(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config]()\n      }\n    })\n  }\n\n  static _clearMenus(event) {\n    if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH ||\n      event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n      return\n    }\n\n    const toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE))\n\n    for (let i = 0, len = toggles.length; i < len; i++) {\n      const parent = Dropdown._getParentFromElement(toggles[i])\n      const context = $(toggles[i]).data(DATA_KEY)\n      const relatedTarget = {\n        relatedTarget: toggles[i]\n      }\n\n      if (event && event.type === 'click') {\n        relatedTarget.clickEvent = event\n      }\n\n      if (!context) {\n        continue\n      }\n\n      const dropdownMenu = context._menu\n      if (!$(parent).hasClass(ClassName.SHOW)) {\n        continue\n      }\n\n      if (event && (event.type === 'click' &&\n          /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) &&\n          $.contains(parent, event.target)) {\n        continue\n      }\n\n      const hideEvent = $.Event(Event.HIDE, relatedTarget)\n      $(parent).trigger(hideEvent)\n      if (hideEvent.isDefaultPrevented()) {\n        continue\n      }\n\n      // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop)\n      }\n\n      toggles[i].setAttribute('aria-expanded', 'false')\n\n      $(dropdownMenu).removeClass(ClassName.SHOW)\n      $(parent)\n        .removeClass(ClassName.SHOW)\n        .trigger($.Event(Event.HIDDEN, relatedTarget))\n    }\n  }\n\n  static _getParentFromElement(element) {\n    let parent\n    const selector = Util.getSelectorFromElement(element)\n\n    if (selector) {\n      parent = document.querySelector(selector)\n    }\n\n    return parent || element.parentNode\n  }\n\n  // eslint-disable-next-line complexity\n  static _dataApiKeydownHandler(event) {\n    // If not input/textarea:\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n    // If input/textarea:\n    //  - If space key => not a dropdown command\n    //  - If key is other than escape\n    //    - If key is not up or down => not a dropdown command\n    //    - If trigger inside the menu => not a dropdown command\n    if (/input|textarea/i.test(event.target.tagName)\n      ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE &&\n      (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE ||\n        $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n      return\n    }\n\n    event.preventDefault()\n    event.stopPropagation()\n\n    if (this.disabled || $(this).hasClass(ClassName.DISABLED)) {\n      return\n    }\n\n    const parent   = Dropdown._getParentFromElement(this)\n    const isActive = $(parent).hasClass(ClassName.SHOW)\n\n    if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n      if (event.which === ESCAPE_KEYCODE) {\n        const toggle = parent.querySelector(Selector.DATA_TOGGLE)\n        $(toggle).trigger('focus')\n      }\n\n      $(this).trigger('click')\n      return\n    }\n\n    const items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS))\n\n    if (items.length === 0) {\n      return\n    }\n\n    let index = items.indexOf(event.target)\n\n    if (event.which === ARROW_UP_KEYCODE && index > 0) { // Up\n      index--\n    }\n\n    if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { // Down\n      index++\n    }\n\n    if (index < 0) {\n      index = 0\n    }\n\n    items[index].focus()\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n  .on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler)\n  .on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler)\n  .on(`${Event.CLICK_DATA_API} ${Event.KEYUP_DATA_API}`, Dropdown._clearMenus)\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault()\n    event.stopPropagation()\n    Dropdown._jQueryInterface.call($(this), 'toggle')\n  })\n  .on(Event.CLICK_DATA_API, Selector.FORM_CHILD, (e) => {\n    e.stopPropagation()\n  })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Dropdown._jQueryInterface\n$.fn[NAME].Constructor = Dropdown\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Dropdown._jQueryInterface\n}\n\n\nexport default Dropdown\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME               = 'modal'\nconst VERSION            = '4.3.1'\nconst DATA_KEY           = 'bs.modal'\nconst EVENT_KEY          = `.${DATA_KEY}`\nconst DATA_API_KEY       = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\nconst ESCAPE_KEYCODE     = 27 // KeyboardEvent.which value for Escape (Esc) key\n\nconst Default = {\n  backdrop : true,\n  keyboard : true,\n  focus    : true,\n  show     : true\n}\n\nconst DefaultType = {\n  backdrop : '(boolean|string)',\n  keyboard : 'boolean',\n  focus    : 'boolean',\n  show     : 'boolean'\n}\n\nconst Event = {\n  HIDE              : `hide${EVENT_KEY}`,\n  HIDDEN            : `hidden${EVENT_KEY}`,\n  SHOW              : `show${EVENT_KEY}`,\n  SHOWN             : `shown${EVENT_KEY}`,\n  FOCUSIN           : `focusin${EVENT_KEY}`,\n  RESIZE            : `resize${EVENT_KEY}`,\n  CLICK_DISMISS     : `click.dismiss${EVENT_KEY}`,\n  KEYDOWN_DISMISS   : `keydown.dismiss${EVENT_KEY}`,\n  MOUSEUP_DISMISS   : `mouseup.dismiss${EVENT_KEY}`,\n  MOUSEDOWN_DISMISS : `mousedown.dismiss${EVENT_KEY}`,\n  CLICK_DATA_API    : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  SCROLLABLE         : 'modal-dialog-scrollable',\n  SCROLLBAR_MEASURER : 'modal-scrollbar-measure',\n  BACKDROP           : 'modal-backdrop',\n  OPEN               : 'modal-open',\n  FADE               : 'fade',\n  SHOW               : 'show'\n}\n\nconst Selector = {\n  DIALOG         : '.modal-dialog',\n  MODAL_BODY     : '.modal-body',\n  DATA_TOGGLE    : '[data-toggle=\"modal\"]',\n  DATA_DISMISS   : '[data-dismiss=\"modal\"]',\n  FIXED_CONTENT  : '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n  STICKY_CONTENT : '.sticky-top'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal {\n  constructor(element, config) {\n    this._config              = this._getConfig(config)\n    this._element             = element\n    this._dialog              = element.querySelector(Selector.DIALOG)\n    this._backdrop            = null\n    this._isShown             = false\n    this._isBodyOverflowing   = false\n    this._ignoreBackdropClick = false\n    this._isTransitioning     = false\n    this._scrollbarWidth      = 0\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget)\n  }\n\n  show(relatedTarget) {\n    if (this._isShown || this._isTransitioning) {\n      return\n    }\n\n    if ($(this._element).hasClass(ClassName.FADE)) {\n      this._isTransitioning = true\n    }\n\n    const showEvent = $.Event(Event.SHOW, {\n      relatedTarget\n    })\n\n    $(this._element).trigger(showEvent)\n\n    if (this._isShown || showEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._isShown = true\n\n    this._checkScrollbar()\n    this._setScrollbar()\n\n    this._adjustDialog()\n\n    this._setEscapeEvent()\n    this._setResizeEvent()\n\n    $(this._element).on(\n      Event.CLICK_DISMISS,\n      Selector.DATA_DISMISS,\n      (event) => this.hide(event)\n    )\n\n    $(this._dialog).on(Event.MOUSEDOWN_DISMISS, () => {\n      $(this._element).one(Event.MOUSEUP_DISMISS, (event) => {\n        if ($(event.target).is(this._element)) {\n          this._ignoreBackdropClick = true\n        }\n      })\n    })\n\n    this._showBackdrop(() => this._showElement(relatedTarget))\n  }\n\n  hide(event) {\n    if (event) {\n      event.preventDefault()\n    }\n\n    if (!this._isShown || this._isTransitioning) {\n      return\n    }\n\n    const hideEvent = $.Event(Event.HIDE)\n\n    $(this._element).trigger(hideEvent)\n\n    if (!this._isShown || hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    this._isShown = false\n    const transition = $(this._element).hasClass(ClassName.FADE)\n\n    if (transition) {\n      this._isTransitioning = true\n    }\n\n    this._setEscapeEvent()\n    this._setResizeEvent()\n\n    $(document).off(Event.FOCUSIN)\n\n    $(this._element).removeClass(ClassName.SHOW)\n\n    $(this._element).off(Event.CLICK_DISMISS)\n    $(this._dialog).off(Event.MOUSEDOWN_DISMISS)\n\n\n    if (transition) {\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._element)\n\n      $(this._element)\n        .one(Util.TRANSITION_END, (event) => this._hideModal(event))\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      this._hideModal()\n    }\n  }\n\n  dispose() {\n    [window, this._element, this._dialog]\n      .forEach((htmlElement) => $(htmlElement).off(EVENT_KEY))\n\n    /**\n     * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n     * Do not move `document` in `htmlElements` array\n     * It will remove `Event.CLICK_DATA_API` event that should remain\n     */\n    $(document).off(Event.FOCUSIN)\n\n    $.removeData(this._element, DATA_KEY)\n\n    this._config              = null\n    this._element             = null\n    this._dialog              = null\n    this._backdrop            = null\n    this._isShown             = null\n    this._isBodyOverflowing   = null\n    this._ignoreBackdropClick = null\n    this._isTransitioning     = null\n    this._scrollbarWidth      = null\n  }\n\n  handleUpdate() {\n    this._adjustDialog()\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...config\n    }\n    Util.typeCheckConfig(NAME, config, DefaultType)\n    return config\n  }\n\n  _showElement(relatedTarget) {\n    const transition = $(this._element).hasClass(ClassName.FADE)\n\n    if (!this._element.parentNode ||\n        this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n      // Don't move modal's DOM position\n      document.body.appendChild(this._element)\n    }\n\n    this._element.style.display = 'block'\n    this._element.removeAttribute('aria-hidden')\n    this._element.setAttribute('aria-modal', true)\n\n    if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) {\n      this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0\n    } else {\n      this._element.scrollTop = 0\n    }\n\n    if (transition) {\n      Util.reflow(this._element)\n    }\n\n    $(this._element).addClass(ClassName.SHOW)\n\n    if (this._config.focus) {\n      this._enforceFocus()\n    }\n\n    const shownEvent = $.Event(Event.SHOWN, {\n      relatedTarget\n    })\n\n    const transitionComplete = () => {\n      if (this._config.focus) {\n        this._element.focus()\n      }\n      this._isTransitioning = false\n      $(this._element).trigger(shownEvent)\n    }\n\n    if (transition) {\n      const transitionDuration  = Util.getTransitionDurationFromElement(this._dialog)\n\n      $(this._dialog)\n        .one(Util.TRANSITION_END, transitionComplete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      transitionComplete()\n    }\n  }\n\n  _enforceFocus() {\n    $(document)\n      .off(Event.FOCUSIN) // Guard against infinite focus loop\n      .on(Event.FOCUSIN, (event) => {\n        if (document !== event.target &&\n            this._element !== event.target &&\n            $(this._element).has(event.target).length === 0) {\n          this._element.focus()\n        }\n      })\n  }\n\n  _setEscapeEvent() {\n    if (this._isShown && this._config.keyboard) {\n      $(this._element).on(Event.KEYDOWN_DISMISS, (event) => {\n        if (event.which === ESCAPE_KEYCODE) {\n          event.preventDefault()\n          this.hide()\n        }\n      })\n    } else if (!this._isShown) {\n      $(this._element).off(Event.KEYDOWN_DISMISS)\n    }\n  }\n\n  _setResizeEvent() {\n    if (this._isShown) {\n      $(window).on(Event.RESIZE, (event) => this.handleUpdate(event))\n    } else {\n      $(window).off(Event.RESIZE)\n    }\n  }\n\n  _hideModal() {\n    this._element.style.display = 'none'\n    this._element.setAttribute('aria-hidden', true)\n    this._element.removeAttribute('aria-modal')\n    this._isTransitioning = false\n    this._showBackdrop(() => {\n      $(document.body).removeClass(ClassName.OPEN)\n      this._resetAdjustments()\n      this._resetScrollbar()\n      $(this._element).trigger(Event.HIDDEN)\n    })\n  }\n\n  _removeBackdrop() {\n    if (this._backdrop) {\n      $(this._backdrop).remove()\n      this._backdrop = null\n    }\n  }\n\n  _showBackdrop(callback) {\n    const animate = $(this._element).hasClass(ClassName.FADE)\n      ? ClassName.FADE : ''\n\n    if (this._isShown && this._config.backdrop) {\n      this._backdrop = document.createElement('div')\n      this._backdrop.className = ClassName.BACKDROP\n\n      if (animate) {\n        this._backdrop.classList.add(animate)\n      }\n\n      $(this._backdrop).appendTo(document.body)\n\n      $(this._element).on(Event.CLICK_DISMISS, (event) => {\n        if (this._ignoreBackdropClick) {\n          this._ignoreBackdropClick = false\n          return\n        }\n        if (event.target !== event.currentTarget) {\n          return\n        }\n        if (this._config.backdrop === 'static') {\n          this._element.focus()\n        } else {\n          this.hide()\n        }\n      })\n\n      if (animate) {\n        Util.reflow(this._backdrop)\n      }\n\n      $(this._backdrop).addClass(ClassName.SHOW)\n\n      if (!callback) {\n        return\n      }\n\n      if (!animate) {\n        callback()\n        return\n      }\n\n      const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n      $(this._backdrop)\n        .one(Util.TRANSITION_END, callback)\n        .emulateTransitionEnd(backdropTransitionDuration)\n    } else if (!this._isShown && this._backdrop) {\n      $(this._backdrop).removeClass(ClassName.SHOW)\n\n      const callbackRemove = () => {\n        this._removeBackdrop()\n        if (callback) {\n          callback()\n        }\n      }\n\n      if ($(this._element).hasClass(ClassName.FADE)) {\n        const backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop)\n\n        $(this._backdrop)\n          .one(Util.TRANSITION_END, callbackRemove)\n          .emulateTransitionEnd(backdropTransitionDuration)\n      } else {\n        callbackRemove()\n      }\n    } else if (callback) {\n      callback()\n    }\n  }\n\n  // ----------------------------------------------------------------------\n  // the following methods are used to handle overflowing modals\n  // todo (fat): these should probably be refactored out of modal.js\n  // ----------------------------------------------------------------------\n\n  _adjustDialog() {\n    const isModalOverflowing =\n      this._element.scrollHeight > document.documentElement.clientHeight\n\n    if (!this._isBodyOverflowing && isModalOverflowing) {\n      this._element.style.paddingLeft = `${this._scrollbarWidth}px`\n    }\n\n    if (this._isBodyOverflowing && !isModalOverflowing) {\n      this._element.style.paddingRight = `${this._scrollbarWidth}px`\n    }\n  }\n\n  _resetAdjustments() {\n    this._element.style.paddingLeft = ''\n    this._element.style.paddingRight = ''\n  }\n\n  _checkScrollbar() {\n    const rect = document.body.getBoundingClientRect()\n    this._isBodyOverflowing = rect.left + rect.right < window.innerWidth\n    this._scrollbarWidth = this._getScrollbarWidth()\n  }\n\n  _setScrollbar() {\n    if (this._isBodyOverflowing) {\n      // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n      //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n      const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n      const stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT))\n\n      // Adjust fixed content padding\n      $(fixedContent).each((index, element) => {\n        const actualPadding = element.style.paddingRight\n        const calculatedPadding = $(element).css('padding-right')\n        $(element)\n          .data('padding-right', actualPadding)\n          .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n      })\n\n      // Adjust sticky content margin\n      $(stickyContent).each((index, element) => {\n        const actualMargin = element.style.marginRight\n        const calculatedMargin = $(element).css('margin-right')\n        $(element)\n          .data('margin-right', actualMargin)\n          .css('margin-right', `${parseFloat(calculatedMargin) - this._scrollbarWidth}px`)\n      })\n\n      // Adjust body padding\n      const actualPadding = document.body.style.paddingRight\n      const calculatedPadding = $(document.body).css('padding-right')\n      $(document.body)\n        .data('padding-right', actualPadding)\n        .css('padding-right', `${parseFloat(calculatedPadding) + this._scrollbarWidth}px`)\n    }\n\n    $(document.body).addClass(ClassName.OPEN)\n  }\n\n  _resetScrollbar() {\n    // Restore fixed content padding\n    const fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT))\n    $(fixedContent).each((index, element) => {\n      const padding = $(element).data('padding-right')\n      $(element).removeData('padding-right')\n      element.style.paddingRight = padding ? padding : ''\n    })\n\n    // Restore sticky content\n    const elements = [].slice.call(document.querySelectorAll(`${Selector.STICKY_CONTENT}`))\n    $(elements).each((index, element) => {\n      const margin = $(element).data('margin-right')\n      if (typeof margin !== 'undefined') {\n        $(element).css('margin-right', margin).removeData('margin-right')\n      }\n    })\n\n    // Restore body padding\n    const padding = $(document.body).data('padding-right')\n    $(document.body).removeData('padding-right')\n    document.body.style.paddingRight = padding ? padding : ''\n  }\n\n  _getScrollbarWidth() { // thx d.walsh\n    const scrollDiv = document.createElement('div')\n    scrollDiv.className = ClassName.SCROLLBAR_MEASURER\n    document.body.appendChild(scrollDiv)\n    const scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth\n    document.body.removeChild(scrollDiv)\n    return scrollbarWidth\n  }\n\n  // Static\n\n  static _jQueryInterface(config, relatedTarget) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = {\n        ...Default,\n        ...$(this).data(),\n        ...typeof config === 'object' && config ? config : {}\n      }\n\n      if (!data) {\n        data = new Modal(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config](relatedTarget)\n      } else if (_config.show) {\n        data.show(relatedTarget)\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n  let target\n  const selector = Util.getSelectorFromElement(this)\n\n  if (selector) {\n    target = document.querySelector(selector)\n  }\n\n  const config = $(target).data(DATA_KEY)\n    ? 'toggle' : {\n      ...$(target).data(),\n      ...$(this).data()\n    }\n\n  if (this.tagName === 'A' || this.tagName === 'AREA') {\n    event.preventDefault()\n  }\n\n  const $target = $(target).one(Event.SHOW, (showEvent) => {\n    if (showEvent.isDefaultPrevented()) {\n      // Only register focus restorer if modal will actually get shown\n      return\n    }\n\n    $target.one(Event.HIDDEN, () => {\n      if ($(this).is(':visible')) {\n        this.focus()\n      }\n    })\n  })\n\n  Modal._jQueryInterface.call($(target), config, this)\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Modal._jQueryInterface\n$.fn[NAME].Constructor = Modal\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Modal._jQueryInterface\n}\n\nexport default Modal\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tools/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst uriAttrs = [\n  'background',\n  'cite',\n  'href',\n  'itemtype',\n  'longdesc',\n  'poster',\n  'src',\n  'xlink:href'\n]\n\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultWhitelist = {\n  // Global attributes allowed on any supplied element below.\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n  a: ['target', 'href', 'title', 'rel'],\n  area: [],\n  b: [],\n  br: [],\n  col: [],\n  code: [],\n  div: [],\n  em: [],\n  hr: [],\n  h1: [],\n  h2: [],\n  h3: [],\n  h4: [],\n  h5: [],\n  h6: [],\n  i: [],\n  img: ['src', 'alt', 'title', 'width', 'height'],\n  li: [],\n  ol: [],\n  p: [],\n  pre: [],\n  s: [],\n  small: [],\n  span: [],\n  sub: [],\n  sup: [],\n  strong: [],\n  u: [],\n  ul: []\n}\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi\n\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i\n\nfunction allowedAttribute(attr, allowedAttributeList) {\n  const attrName = attr.nodeName.toLowerCase()\n\n  if (allowedAttributeList.indexOf(attrName) !== -1) {\n    if (uriAttrs.indexOf(attrName) !== -1) {\n      return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))\n    }\n\n    return true\n  }\n\n  const regExp = allowedAttributeList.filter((attrRegex) => attrRegex instanceof RegExp)\n\n  // Check if a regular expression validates the attribute.\n  for (let i = 0, l = regExp.length; i < l; i++) {\n    if (attrName.match(regExp[i])) {\n      return true\n    }\n  }\n\n  return false\n}\n\nexport function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n  if (unsafeHtml.length === 0) {\n    return unsafeHtml\n  }\n\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\n    return sanitizeFn(unsafeHtml)\n  }\n\n  const domParser = new window.DOMParser()\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n  const whitelistKeys = Object.keys(whiteList)\n  const elements = [].slice.call(createdDocument.body.querySelectorAll('*'))\n\n  for (let i = 0, len = elements.length; i < len; i++) {\n    const el = elements[i]\n    const elName = el.nodeName.toLowerCase()\n\n    if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n      el.parentNode.removeChild(el)\n\n      continue\n    }\n\n    const attributeList = [].slice.call(el.attributes)\n    const whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])\n\n    attributeList.forEach((attr) => {\n      if (!allowedAttribute(attr, whitelistedAttributes)) {\n        el.removeAttribute(attr.nodeName)\n      }\n    })\n  }\n\n  return createdDocument.body.innerHTML\n}\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport {\n  DefaultWhitelist,\n  sanitizeHtml\n} from './tools/sanitizer'\nimport $ from 'jquery'\nimport Popper from 'popper.js'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                  = 'tooltip'\nconst VERSION               = '4.3.1'\nconst DATA_KEY              = 'bs.tooltip'\nconst EVENT_KEY             = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT    = $.fn[NAME]\nconst CLASS_PREFIX          = 'bs-tooltip'\nconst BSCLS_PREFIX_REGEX    = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\nconst DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']\n\nconst DefaultType = {\n  animation         : 'boolean',\n  template          : 'string',\n  title             : '(string|element|function)',\n  trigger           : 'string',\n  delay             : '(number|object)',\n  html              : 'boolean',\n  selector          : '(string|boolean)',\n  placement         : '(string|function)',\n  offset            : '(number|string|function)',\n  container         : '(string|element|boolean)',\n  fallbackPlacement : '(string|array)',\n  boundary          : '(string|element)',\n  sanitize          : 'boolean',\n  sanitizeFn        : '(null|function)',\n  whiteList         : 'object'\n}\n\nconst AttachmentMap = {\n  AUTO   : 'auto',\n  TOP    : 'top',\n  RIGHT  : 'right',\n  BOTTOM : 'bottom',\n  LEFT   : 'left'\n}\n\nconst Default = {\n  animation         : true,\n  template          : '<div class=\"tooltip\" role=\"tooltip\">' +\n                    '<div class=\"arrow\"></div>' +\n                    '<div class=\"tooltip-inner\"></div></div>',\n  trigger           : 'hover focus',\n  title             : '',\n  delay             : 0,\n  html              : false,\n  selector          : false,\n  placement         : 'top',\n  offset            : 0,\n  container         : false,\n  fallbackPlacement : 'flip',\n  boundary          : 'scrollParent',\n  sanitize          : true,\n  sanitizeFn        : null,\n  whiteList         : DefaultWhitelist\n}\n\nconst HoverState = {\n  SHOW : 'show',\n  OUT  : 'out'\n}\n\nconst Event = {\n  HIDE       : `hide${EVENT_KEY}`,\n  HIDDEN     : `hidden${EVENT_KEY}`,\n  SHOW       : `show${EVENT_KEY}`,\n  SHOWN      : `shown${EVENT_KEY}`,\n  INSERTED   : `inserted${EVENT_KEY}`,\n  CLICK      : `click${EVENT_KEY}`,\n  FOCUSIN    : `focusin${EVENT_KEY}`,\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\nconst ClassName = {\n  FADE : 'fade',\n  SHOW : 'show'\n}\n\nconst Selector = {\n  TOOLTIP       : '.tooltip',\n  TOOLTIP_INNER : '.tooltip-inner',\n  ARROW         : '.arrow'\n}\n\nconst Trigger = {\n  HOVER  : 'hover',\n  FOCUS  : 'focus',\n  CLICK  : 'click',\n  MANUAL : 'manual'\n}\n\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip {\n  constructor(element, config) {\n    /**\n     * Check for Popper dependency\n     * Popper - https://popper.js.org\n     */\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)')\n    }\n\n    // private\n    this._isEnabled     = true\n    this._timeout       = 0\n    this._hoverState    = ''\n    this._activeTrigger = {}\n    this._popper        = null\n\n    // Protected\n    this.element = element\n    this.config  = this._getConfig(config)\n    this.tip     = null\n\n    this._setListeners()\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get DATA_KEY() {\n    return DATA_KEY\n  }\n\n  static get Event() {\n    return Event\n  }\n\n  static get EVENT_KEY() {\n    return EVENT_KEY\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Public\n\n  enable() {\n    this._isEnabled = true\n  }\n\n  disable() {\n    this._isEnabled = false\n  }\n\n  toggleEnabled() {\n    this._isEnabled = !this._isEnabled\n  }\n\n  toggle(event) {\n    if (!this._isEnabled) {\n      return\n    }\n\n    if (event) {\n      const dataKey = this.constructor.DATA_KEY\n      let context = $(event.currentTarget).data(dataKey)\n\n      if (!context) {\n        context = new this.constructor(\n          event.currentTarget,\n          this._getDelegateConfig()\n        )\n        $(event.currentTarget).data(dataKey, context)\n      }\n\n      context._activeTrigger.click = !context._activeTrigger.click\n\n      if (context._isWithActiveTrigger()) {\n        context._enter(null, context)\n      } else {\n        context._leave(null, context)\n      }\n    } else {\n      if ($(this.getTipElement()).hasClass(ClassName.SHOW)) {\n        this._leave(null, this)\n        return\n      }\n\n      this._enter(null, this)\n    }\n  }\n\n  dispose() {\n    clearTimeout(this._timeout)\n\n    $.removeData(this.element, this.constructor.DATA_KEY)\n\n    $(this.element).off(this.constructor.EVENT_KEY)\n    $(this.element).closest('.modal').off('hide.bs.modal')\n\n    if (this.tip) {\n      $(this.tip).remove()\n    }\n\n    this._isEnabled     = null\n    this._timeout       = null\n    this._hoverState    = null\n    this._activeTrigger = null\n    if (this._popper !== null) {\n      this._popper.destroy()\n    }\n\n    this._popper = null\n    this.element = null\n    this.config  = null\n    this.tip     = null\n  }\n\n  show() {\n    if ($(this.element).css('display') === 'none') {\n      throw new Error('Please use show on visible elements')\n    }\n\n    const showEvent = $.Event(this.constructor.Event.SHOW)\n    if (this.isWithContent() && this._isEnabled) {\n      $(this.element).trigger(showEvent)\n\n      const shadowRoot = Util.findShadowRoot(this.element)\n      const isInTheDom = $.contains(\n        shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement,\n        this.element\n      )\n\n      if (showEvent.isDefaultPrevented() || !isInTheDom) {\n        return\n      }\n\n      const tip   = this.getTipElement()\n      const tipId = Util.getUID(this.constructor.NAME)\n\n      tip.setAttribute('id', tipId)\n      this.element.setAttribute('aria-describedby', tipId)\n\n      this.setContent()\n\n      if (this.config.animation) {\n        $(tip).addClass(ClassName.FADE)\n      }\n\n      const placement  = typeof this.config.placement === 'function'\n        ? this.config.placement.call(this, tip, this.element)\n        : this.config.placement\n\n      const attachment = this._getAttachment(placement)\n      this.addAttachmentClass(attachment)\n\n      const container = this._getContainer()\n      $(tip).data(this.constructor.DATA_KEY, this)\n\n      if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n        $(tip).appendTo(container)\n      }\n\n      $(this.element).trigger(this.constructor.Event.INSERTED)\n\n      this._popper = new Popper(this.element, tip, {\n        placement: attachment,\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            behavior: this.config.fallbackPlacement\n          },\n          arrow: {\n            element: Selector.ARROW\n          },\n          preventOverflow: {\n            boundariesElement: this.config.boundary\n          }\n        },\n        onCreate: (data) => {\n          if (data.originalPlacement !== data.placement) {\n            this._handlePopperPlacementChange(data)\n          }\n        },\n        onUpdate: (data) => this._handlePopperPlacementChange(data)\n      })\n\n      $(tip).addClass(ClassName.SHOW)\n\n      // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().on('mouseover', null, $.noop)\n      }\n\n      const complete = () => {\n        if (this.config.animation) {\n          this._fixTransition()\n        }\n        const prevHoverState = this._hoverState\n        this._hoverState     = null\n\n        $(this.element).trigger(this.constructor.Event.SHOWN)\n\n        if (prevHoverState === HoverState.OUT) {\n          this._leave(null, this)\n        }\n      }\n\n      if ($(this.tip).hasClass(ClassName.FADE)) {\n        const transitionDuration = Util.getTransitionDurationFromElement(this.tip)\n\n        $(this.tip)\n          .one(Util.TRANSITION_END, complete)\n          .emulateTransitionEnd(transitionDuration)\n      } else {\n        complete()\n      }\n    }\n  }\n\n  hide(callback) {\n    const tip       = this.getTipElement()\n    const hideEvent = $.Event(this.constructor.Event.HIDE)\n    const complete = () => {\n      if (this._hoverState !== HoverState.SHOW && tip.parentNode) {\n        tip.parentNode.removeChild(tip)\n      }\n\n      this._cleanTipClass()\n      this.element.removeAttribute('aria-describedby')\n      $(this.element).trigger(this.constructor.Event.HIDDEN)\n      if (this._popper !== null) {\n        this._popper.destroy()\n      }\n\n      if (callback) {\n        callback()\n      }\n    }\n\n    $(this.element).trigger(hideEvent)\n\n    if (hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    $(tip).removeClass(ClassName.SHOW)\n\n    // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n    if ('ontouchstart' in document.documentElement) {\n      $(document.body).children().off('mouseover', null, $.noop)\n    }\n\n    this._activeTrigger[Trigger.CLICK] = false\n    this._activeTrigger[Trigger.FOCUS] = false\n    this._activeTrigger[Trigger.HOVER] = false\n\n    if ($(this.tip).hasClass(ClassName.FADE)) {\n      const transitionDuration = Util.getTransitionDurationFromElement(tip)\n\n      $(tip)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n\n    this._hoverState = ''\n  }\n\n  update() {\n    if (this._popper !== null) {\n      this._popper.scheduleUpdate()\n    }\n  }\n\n  // Protected\n\n  isWithContent() {\n    return Boolean(this.getTitle())\n  }\n\n  addAttachmentClass(attachment) {\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n  }\n\n  getTipElement() {\n    this.tip = this.tip || $(this.config.template)[0]\n    return this.tip\n  }\n\n  setContent() {\n    const tip = this.getTipElement()\n    this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle())\n    $(tip).removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n  }\n\n  setElementContent($element, content) {\n    if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n      // Content is a DOM node or a jQuery\n      if (this.config.html) {\n        if (!$(content).parent().is($element)) {\n          $element.empty().append(content)\n        }\n      } else {\n        $element.text($(content).text())\n      }\n\n      return\n    }\n\n    if (this.config.html) {\n      if (this.config.sanitize) {\n        content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn)\n      }\n\n      $element.html(content)\n    } else {\n      $element.text(content)\n    }\n  }\n\n  getTitle() {\n    let title = this.element.getAttribute('data-original-title')\n\n    if (!title) {\n      title = typeof this.config.title === 'function'\n        ? this.config.title.call(this.element)\n        : this.config.title\n    }\n\n    return title\n  }\n\n  // Private\n\n  _getOffset() {\n    const offset = {}\n\n    if (typeof this.config.offset === 'function') {\n      offset.fn = (data) => {\n        data.offsets = {\n          ...data.offsets,\n          ...this.config.offset(data.offsets, this.element) || {}\n        }\n\n        return data\n      }\n    } else {\n      offset.offset = this.config.offset\n    }\n\n    return offset\n  }\n\n  _getContainer() {\n    if (this.config.container === false) {\n      return document.body\n    }\n\n    if (Util.isElement(this.config.container)) {\n      return $(this.config.container)\n    }\n\n    return $(document).find(this.config.container)\n  }\n\n  _getAttachment(placement) {\n    return AttachmentMap[placement.toUpperCase()]\n  }\n\n  _setListeners() {\n    const triggers = this.config.trigger.split(' ')\n\n    triggers.forEach((trigger) => {\n      if (trigger === 'click') {\n        $(this.element).on(\n          this.constructor.Event.CLICK,\n          this.config.selector,\n          (event) => this.toggle(event)\n        )\n      } else if (trigger !== Trigger.MANUAL) {\n        const eventIn = trigger === Trigger.HOVER\n          ? this.constructor.Event.MOUSEENTER\n          : this.constructor.Event.FOCUSIN\n        const eventOut = trigger === Trigger.HOVER\n          ? this.constructor.Event.MOUSELEAVE\n          : this.constructor.Event.FOCUSOUT\n\n        $(this.element)\n          .on(\n            eventIn,\n            this.config.selector,\n            (event) => this._enter(event)\n          )\n          .on(\n            eventOut,\n            this.config.selector,\n            (event) => this._leave(event)\n          )\n      }\n    })\n\n    $(this.element).closest('.modal').on(\n      'hide.bs.modal',\n      () => {\n        if (this.element) {\n          this.hide()\n        }\n      }\n    )\n\n    if (this.config.selector) {\n      this.config = {\n        ...this.config,\n        trigger: 'manual',\n        selector: ''\n      }\n    } else {\n      this._fixTitle()\n    }\n  }\n\n  _fixTitle() {\n    const titleType = typeof this.element.getAttribute('data-original-title')\n\n    if (this.element.getAttribute('title') || titleType !== 'string') {\n      this.element.setAttribute(\n        'data-original-title',\n        this.element.getAttribute('title') || ''\n      )\n\n      this.element.setAttribute('title', '')\n    }\n  }\n\n  _enter(event, context) {\n    const dataKey = this.constructor.DATA_KEY\n    context = context || $(event.currentTarget).data(dataKey)\n\n    if (!context) {\n      context = new this.constructor(\n        event.currentTarget,\n        this._getDelegateConfig()\n      )\n      $(event.currentTarget).data(dataKey, context)\n    }\n\n    if (event) {\n      context._activeTrigger[\n        event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER\n      ] = true\n    }\n\n    if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) {\n      context._hoverState = HoverState.SHOW\n      return\n    }\n\n    clearTimeout(context._timeout)\n\n    context._hoverState = HoverState.SHOW\n\n    if (!context.config.delay || !context.config.delay.show) {\n      context.show()\n      return\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HoverState.SHOW) {\n        context.show()\n      }\n    }, context.config.delay.show)\n  }\n\n  _leave(event, context) {\n    const dataKey = this.constructor.DATA_KEY\n    context = context || $(event.currentTarget).data(dataKey)\n\n    if (!context) {\n      context = new this.constructor(\n        event.currentTarget,\n        this._getDelegateConfig()\n      )\n      $(event.currentTarget).data(dataKey, context)\n    }\n\n    if (event) {\n      context._activeTrigger[\n        event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER\n      ] = false\n    }\n\n    if (context._isWithActiveTrigger()) {\n      return\n    }\n\n    clearTimeout(context._timeout)\n\n    context._hoverState = HoverState.OUT\n\n    if (!context.config.delay || !context.config.delay.hide) {\n      context.hide()\n      return\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HoverState.OUT) {\n        context.hide()\n      }\n    }, context.config.delay.hide)\n  }\n\n  _isWithActiveTrigger() {\n    for (const trigger in this._activeTrigger) {\n      if (this._activeTrigger[trigger]) {\n        return true\n      }\n    }\n\n    return false\n  }\n\n  _getConfig(config) {\n    const dataAttributes = $(this.element).data()\n\n    Object.keys(dataAttributes)\n      .forEach((dataAttr) => {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr]\n        }\n      })\n\n    config = {\n      ...this.constructor.Default,\n      ...dataAttributes,\n      ...typeof config === 'object' && config ? config : {}\n    }\n\n    if (typeof config.delay === 'number') {\n      config.delay = {\n        show: config.delay,\n        hide: config.delay\n      }\n    }\n\n    if (typeof config.title === 'number') {\n      config.title = config.title.toString()\n    }\n\n    if (typeof config.content === 'number') {\n      config.content = config.content.toString()\n    }\n\n    Util.typeCheckConfig(\n      NAME,\n      config,\n      this.constructor.DefaultType\n    )\n\n    if (config.sanitize) {\n      config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn)\n    }\n\n    return config\n  }\n\n  _getDelegateConfig() {\n    const config = {}\n\n    if (this.config) {\n      for (const key in this.config) {\n        if (this.constructor.Default[key] !== this.config[key]) {\n          config[key] = this.config[key]\n        }\n      }\n    }\n\n    return config\n  }\n\n  _cleanTipClass() {\n    const $tip = $(this.getTipElement())\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n    if (tabClass !== null && tabClass.length) {\n      $tip.removeClass(tabClass.join(''))\n    }\n  }\n\n  _handlePopperPlacementChange(popperData) {\n    const popperInstance = popperData.instance\n    this.tip = popperInstance.popper\n    this._cleanTipClass()\n    this.addAttachmentClass(this._getAttachment(popperData.placement))\n  }\n\n  _fixTransition() {\n    const tip = this.getTipElement()\n    const initConfigAnimation = this.config.animation\n\n    if (tip.getAttribute('x-placement') !== null) {\n      return\n    }\n\n    $(tip).removeClass(ClassName.FADE)\n    this.config.animation = false\n    this.hide()\n    this.show()\n    this.config.animation = initConfigAnimation\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' && config\n\n      if (!data && /dispose|hide/.test(config)) {\n        return\n      }\n\n      if (!data) {\n        data = new Tooltip(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tooltip._jQueryInterface\n$.fn[NAME].Constructor = Tooltip\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Tooltip._jQueryInterface\n}\n\nexport default Tooltip\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Tooltip from './tooltip'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME                = 'popover'\nconst VERSION             = '4.3.1'\nconst DATA_KEY            = 'bs.popover'\nconst EVENT_KEY           = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT  = $.fn[NAME]\nconst CLASS_PREFIX        = 'bs-popover'\nconst BSCLS_PREFIX_REGEX  = new RegExp(`(^|\\\\s)${CLASS_PREFIX}\\\\S+`, 'g')\n\nconst Default = {\n  ...Tooltip.Default,\n  placement : 'right',\n  trigger   : 'click',\n  content   : '',\n  template  : '<div class=\"popover\" role=\"tooltip\">' +\n              '<div class=\"arrow\"></div>' +\n              '<h3 class=\"popover-header\"></h3>' +\n              '<div class=\"popover-body\"></div></div>'\n}\n\nconst DefaultType = {\n  ...Tooltip.DefaultType,\n  content : '(string|element|function)'\n}\n\nconst ClassName = {\n  FADE : 'fade',\n  SHOW : 'show'\n}\n\nconst Selector = {\n  TITLE   : '.popover-header',\n  CONTENT : '.popover-body'\n}\n\nconst Event = {\n  HIDE       : `hide${EVENT_KEY}`,\n  HIDDEN     : `hidden${EVENT_KEY}`,\n  SHOW       : `show${EVENT_KEY}`,\n  SHOWN      : `shown${EVENT_KEY}`,\n  INSERTED   : `inserted${EVENT_KEY}`,\n  CLICK      : `click${EVENT_KEY}`,\n  FOCUSIN    : `focusin${EVENT_KEY}`,\n  FOCUSOUT   : `focusout${EVENT_KEY}`,\n  MOUSEENTER : `mouseenter${EVENT_KEY}`,\n  MOUSELEAVE : `mouseleave${EVENT_KEY}`\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  static get NAME() {\n    return NAME\n  }\n\n  static get DATA_KEY() {\n    return DATA_KEY\n  }\n\n  static get Event() {\n    return Event\n  }\n\n  static get EVENT_KEY() {\n    return EVENT_KEY\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  // Overrides\n\n  isWithContent() {\n    return this.getTitle() || this._getContent()\n  }\n\n  addAttachmentClass(attachment) {\n    $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)\n  }\n\n  getTipElement() {\n    this.tip = this.tip || $(this.config.template)[0]\n    return this.tip\n  }\n\n  setContent() {\n    const $tip = $(this.getTipElement())\n\n    // We use append for html objects to maintain js events\n    this.setElementContent($tip.find(Selector.TITLE), this.getTitle())\n    let content = this._getContent()\n    if (typeof content === 'function') {\n      content = content.call(this.element)\n    }\n    this.setElementContent($tip.find(Selector.CONTENT), content)\n\n    $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)\n  }\n\n  // Private\n\n  _getContent() {\n    return this.element.getAttribute('data-content') ||\n      this.config.content\n  }\n\n  _cleanTipClass() {\n    const $tip = $(this.getTipElement())\n    const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)\n    if (tabClass !== null && tabClass.length > 0) {\n      $tip.removeClass(tabClass.join(''))\n    }\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' ? config : null\n\n      if (!data && /dispose|hide/.test(config)) {\n        return\n      }\n\n      if (!data) {\n        data = new Popover(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Popover._jQueryInterface\n$.fn[NAME].Constructor = Popover\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Popover._jQueryInterface\n}\n\nexport default Popover\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME               = 'scrollspy'\nconst VERSION            = '4.3.1'\nconst DATA_KEY           = 'bs.scrollspy'\nconst EVENT_KEY          = `.${DATA_KEY}`\nconst DATA_API_KEY       = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n  offset : 10,\n  method : 'auto',\n  target : ''\n}\n\nconst DefaultType = {\n  offset : 'number',\n  method : 'string',\n  target : '(string|element)'\n}\n\nconst Event = {\n  ACTIVATE      : `activate${EVENT_KEY}`,\n  SCROLL        : `scroll${EVENT_KEY}`,\n  LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  DROPDOWN_ITEM : 'dropdown-item',\n  DROPDOWN_MENU : 'dropdown-menu',\n  ACTIVE        : 'active'\n}\n\nconst Selector = {\n  DATA_SPY        : '[data-spy=\"scroll\"]',\n  ACTIVE          : '.active',\n  NAV_LIST_GROUP  : '.nav, .list-group',\n  NAV_LINKS       : '.nav-link',\n  NAV_ITEMS       : '.nav-item',\n  LIST_ITEMS      : '.list-group-item',\n  DROPDOWN        : '.dropdown',\n  DROPDOWN_ITEMS  : '.dropdown-item',\n  DROPDOWN_TOGGLE : '.dropdown-toggle'\n}\n\nconst OffsetMethod = {\n  OFFSET   : 'offset',\n  POSITION : 'position'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy {\n  constructor(element, config) {\n    this._element       = element\n    this._scrollElement = element.tagName === 'BODY' ? window : element\n    this._config        = this._getConfig(config)\n    this._selector      = `${this._config.target} ${Selector.NAV_LINKS},` +\n                          `${this._config.target} ${Selector.LIST_ITEMS},` +\n                          `${this._config.target} ${Selector.DROPDOWN_ITEMS}`\n    this._offsets       = []\n    this._targets       = []\n    this._activeTarget  = null\n    this._scrollHeight  = 0\n\n    $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))\n\n    this.refresh()\n    this._process()\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n\n  refresh() {\n    const autoMethod = this._scrollElement === this._scrollElement.window\n      ? OffsetMethod.OFFSET : OffsetMethod.POSITION\n\n    const offsetMethod = this._config.method === 'auto'\n      ? autoMethod : this._config.method\n\n    const offsetBase = offsetMethod === OffsetMethod.POSITION\n      ? this._getScrollTop() : 0\n\n    this._offsets = []\n    this._targets = []\n\n    this._scrollHeight = this._getScrollHeight()\n\n    const targets = [].slice.call(document.querySelectorAll(this._selector))\n\n    targets\n      .map((element) => {\n        let target\n        const targetSelector = Util.getSelectorFromElement(element)\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector)\n        }\n\n        if (target) {\n          const targetBCR = target.getBoundingClientRect()\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [\n              $(target)[offsetMethod]().top + offsetBase,\n              targetSelector\n            ]\n          }\n        }\n        return null\n      })\n      .filter((item) => item)\n      .sort((a, b) => a[0] - b[0])\n      .forEach((item) => {\n        this._offsets.push(item[0])\n        this._targets.push(item[1])\n      })\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    $(this._scrollElement).off(EVENT_KEY)\n\n    this._element       = null\n    this._scrollElement = null\n    this._config        = null\n    this._selector      = null\n    this._offsets       = null\n    this._targets       = null\n    this._activeTarget  = null\n    this._scrollHeight  = null\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...typeof config === 'object' && config ? config : {}\n    }\n\n    if (typeof config.target !== 'string') {\n      let id = $(config.target).attr('id')\n      if (!id) {\n        id = Util.getUID(NAME)\n        $(config.target).attr('id', id)\n      }\n      config.target = `#${id}`\n    }\n\n    Util.typeCheckConfig(NAME, config, DefaultType)\n\n    return config\n  }\n\n  _getScrollTop() {\n    return this._scrollElement === window\n      ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop\n  }\n\n  _getScrollHeight() {\n    return this._scrollElement.scrollHeight || Math.max(\n      document.body.scrollHeight,\n      document.documentElement.scrollHeight\n    )\n  }\n\n  _getOffsetHeight() {\n    return this._scrollElement === window\n      ? window.innerHeight : this._scrollElement.getBoundingClientRect().height\n  }\n\n  _process() {\n    const scrollTop    = this._getScrollTop() + this._config.offset\n    const scrollHeight = this._getScrollHeight()\n    const maxScroll    = this._config.offset +\n      scrollHeight -\n      this._getOffsetHeight()\n\n    if (this._scrollHeight !== scrollHeight) {\n      this.refresh()\n    }\n\n    if (scrollTop >= maxScroll) {\n      const target = this._targets[this._targets.length - 1]\n\n      if (this._activeTarget !== target) {\n        this._activate(target)\n      }\n      return\n    }\n\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n      this._activeTarget = null\n      this._clear()\n      return\n    }\n\n    const offsetLength = this._offsets.length\n    for (let i = offsetLength; i--;) {\n      const isActiveTarget = this._activeTarget !== this._targets[i] &&\n          scrollTop >= this._offsets[i] &&\n          (typeof this._offsets[i + 1] === 'undefined' ||\n              scrollTop < this._offsets[i + 1])\n\n      if (isActiveTarget) {\n        this._activate(this._targets[i])\n      }\n    }\n  }\n\n  _activate(target) {\n    this._activeTarget = target\n\n    this._clear()\n\n    const queries = this._selector\n      .split(',')\n      .map((selector) => `${selector}[data-target=\"${target}\"],${selector}[href=\"${target}\"]`)\n\n    const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))\n\n    if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {\n      $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)\n      $link.addClass(ClassName.ACTIVE)\n    } else {\n      // Set triggered link as active\n      $link.addClass(ClassName.ACTIVE)\n      // Set triggered links parents as active\n      // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n      $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)\n      // Handle special case when .nav-link is inside .nav-item\n      $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)\n    }\n\n    $(this._scrollElement).trigger(Event.ACTIVATE, {\n      relatedTarget: target\n    })\n  }\n\n  _clear() {\n    [].slice.call(document.querySelectorAll(this._selector))\n      .filter((node) => node.classList.contains(ClassName.ACTIVE))\n      .forEach((node) => node.classList.remove(ClassName.ACTIVE))\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      let data = $(this).data(DATA_KEY)\n      const _config = typeof config === 'object' && config\n\n      if (!data) {\n        data = new ScrollSpy(this, _config)\n        $(this).data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(window).on(Event.LOAD_DATA_API, () => {\n  const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))\n  const scrollSpysLength = scrollSpys.length\n\n  for (let i = scrollSpysLength; i--;) {\n    const $spy = $(scrollSpys[i])\n    ScrollSpy._jQueryInterface.call($spy, $spy.data())\n  }\n})\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = ScrollSpy._jQueryInterface\n$.fn[NAME].Constructor = ScrollSpy\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return ScrollSpy._jQueryInterface\n}\n\nexport default ScrollSpy\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME               = 'tab'\nconst VERSION            = '4.3.1'\nconst DATA_KEY           = 'bs.tab'\nconst EVENT_KEY          = `.${DATA_KEY}`\nconst DATA_API_KEY       = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Event = {\n  HIDE           : `hide${EVENT_KEY}`,\n  HIDDEN         : `hidden${EVENT_KEY}`,\n  SHOW           : `show${EVENT_KEY}`,\n  SHOWN          : `shown${EVENT_KEY}`,\n  CLICK_DATA_API : `click${EVENT_KEY}${DATA_API_KEY}`\n}\n\nconst ClassName = {\n  DROPDOWN_MENU : 'dropdown-menu',\n  ACTIVE        : 'active',\n  DISABLED      : 'disabled',\n  FADE          : 'fade',\n  SHOW          : 'show'\n}\n\nconst Selector = {\n  DROPDOWN              : '.dropdown',\n  NAV_LIST_GROUP        : '.nav, .list-group',\n  ACTIVE                : '.active',\n  ACTIVE_UL             : '> li > .active',\n  DATA_TOGGLE           : '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n  DROPDOWN_TOGGLE       : '.dropdown-toggle',\n  DROPDOWN_ACTIVE_CHILD : '> .dropdown-menu .active'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab {\n  constructor(element) {\n    this._element = element\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  // Public\n\n  show() {\n    if (this._element.parentNode &&\n        this._element.parentNode.nodeType === Node.ELEMENT_NODE &&\n        $(this._element).hasClass(ClassName.ACTIVE) ||\n        $(this._element).hasClass(ClassName.DISABLED)) {\n      return\n    }\n\n    let target\n    let previous\n    const listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]\n    const selector = Util.getSelectorFromElement(this._element)\n\n    if (listElement) {\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE\n      previous = $.makeArray($(listElement).find(itemSelector))\n      previous = previous[previous.length - 1]\n    }\n\n    const hideEvent = $.Event(Event.HIDE, {\n      relatedTarget: this._element\n    })\n\n    const showEvent = $.Event(Event.SHOW, {\n      relatedTarget: previous\n    })\n\n    if (previous) {\n      $(previous).trigger(hideEvent)\n    }\n\n    $(this._element).trigger(showEvent)\n\n    if (showEvent.isDefaultPrevented() ||\n        hideEvent.isDefaultPrevented()) {\n      return\n    }\n\n    if (selector) {\n      target = document.querySelector(selector)\n    }\n\n    this._activate(\n      this._element,\n      listElement\n    )\n\n    const complete = () => {\n      const hiddenEvent = $.Event(Event.HIDDEN, {\n        relatedTarget: this._element\n      })\n\n      const shownEvent = $.Event(Event.SHOWN, {\n        relatedTarget: previous\n      })\n\n      $(previous).trigger(hiddenEvent)\n      $(this._element).trigger(shownEvent)\n    }\n\n    if (target) {\n      this._activate(target, target.parentNode, complete)\n    } else {\n      complete()\n    }\n  }\n\n  dispose() {\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n  }\n\n  // Private\n\n  _activate(element, container, callback) {\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL')\n      ? $(container).find(Selector.ACTIVE_UL)\n      : $(container).children(Selector.ACTIVE)\n\n    const active = activeElements[0]\n    const isTransitioning = callback && (active && $(active).hasClass(ClassName.FADE))\n    const complete = () => this._transitionComplete(\n      element,\n      active,\n      callback\n    )\n\n    if (active && isTransitioning) {\n      const transitionDuration = Util.getTransitionDurationFromElement(active)\n\n      $(active)\n        .removeClass(ClassName.SHOW)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n  }\n\n  _transitionComplete(element, active, callback) {\n    if (active) {\n      $(active).removeClass(ClassName.ACTIVE)\n\n      const dropdownChild = $(active.parentNode).find(\n        Selector.DROPDOWN_ACTIVE_CHILD\n      )[0]\n\n      if (dropdownChild) {\n        $(dropdownChild).removeClass(ClassName.ACTIVE)\n      }\n\n      if (active.getAttribute('role') === 'tab') {\n        active.setAttribute('aria-selected', false)\n      }\n    }\n\n    $(element).addClass(ClassName.ACTIVE)\n    if (element.getAttribute('role') === 'tab') {\n      element.setAttribute('aria-selected', true)\n    }\n\n    Util.reflow(element)\n\n    if (element.classList.contains(ClassName.FADE)) {\n      element.classList.add(ClassName.SHOW)\n    }\n\n    if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) {\n      const dropdownElement = $(element).closest(Selector.DROPDOWN)[0]\n\n      if (dropdownElement) {\n        const dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE))\n\n        $(dropdownToggleList).addClass(ClassName.ACTIVE)\n      }\n\n      element.setAttribute('aria-expanded', true)\n    }\n\n    if (callback) {\n      callback()\n    }\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $this = $(this)\n      let data = $this.data(DATA_KEY)\n\n      if (!data) {\n        data = new Tab(this)\n        $this.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n        data[config]()\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n$(document)\n  .on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) {\n    event.preventDefault()\n    Tab._jQueryInterface.call($(this), 'show')\n  })\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Tab._jQueryInterface\n$.fn[NAME].Constructor = Tab\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Tab._jQueryInterface\n}\n\nexport default Tab\n", "/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME               = 'toast'\nconst VERSION            = '4.3.1'\nconst DATA_KEY           = 'bs.toast'\nconst EVENT_KEY          = `.${DATA_KEY}`\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Event = {\n  CLICK_DISMISS : `click.dismiss${EVENT_KEY}`,\n  HIDE          : `hide${EVENT_KEY}`,\n  HIDDEN        : `hidden${EVENT_KEY}`,\n  SHOW          : `show${EVENT_KEY}`,\n  SHOWN         : `shown${EVENT_KEY}`\n}\n\nconst ClassName = {\n  FADE    : 'fade',\n  HIDE    : 'hide',\n  SHOW    : 'show',\n  SHOWING : 'showing'\n}\n\nconst DefaultType = {\n  animation : 'boolean',\n  autohide  : 'boolean',\n  delay     : 'number'\n}\n\nconst Default = {\n  animation : true,\n  autohide  : true,\n  delay     : 500\n}\n\nconst Selector = {\n  DATA_DISMISS : '[data-dismiss=\"toast\"]'\n}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast {\n  constructor(element, config) {\n    this._element = element\n    this._config  = this._getConfig(config)\n    this._timeout = null\n    this._setListeners()\n  }\n\n  // Getters\n\n  static get VERSION() {\n    return VERSION\n  }\n\n  static get DefaultType() {\n    return DefaultType\n  }\n\n  static get Default() {\n    return Default\n  }\n\n  // Public\n\n  show() {\n    $(this._element).trigger(Event.SHOW)\n\n    if (this._config.animation) {\n      this._element.classList.add(ClassName.FADE)\n    }\n\n    const complete = () => {\n      this._element.classList.remove(ClassName.SHOWING)\n      this._element.classList.add(ClassName.SHOW)\n\n      $(this._element).trigger(Event.SHOWN)\n\n      if (this._config.autohide) {\n        this.hide()\n      }\n    }\n\n    this._element.classList.remove(ClassName.HIDE)\n    this._element.classList.add(ClassName.SHOWING)\n    if (this._config.animation) {\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n      $(this._element)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n  }\n\n  hide(withoutTimeout) {\n    if (!this._element.classList.contains(ClassName.SHOW)) {\n      return\n    }\n\n    $(this._element).trigger(Event.HIDE)\n\n    if (withoutTimeout) {\n      this._close()\n    } else {\n      this._timeout = setTimeout(() => {\n        this._close()\n      }, this._config.delay)\n    }\n  }\n\n  dispose() {\n    clearTimeout(this._timeout)\n    this._timeout = null\n\n    if (this._element.classList.contains(ClassName.SHOW)) {\n      this._element.classList.remove(ClassName.SHOW)\n    }\n\n    $(this._element).off(Event.CLICK_DISMISS)\n\n    $.removeData(this._element, DATA_KEY)\n    this._element = null\n    this._config  = null\n  }\n\n  // Private\n\n  _getConfig(config) {\n    config = {\n      ...Default,\n      ...$(this._element).data(),\n      ...typeof config === 'object' && config ? config : {}\n    }\n\n    Util.typeCheckConfig(\n      NAME,\n      config,\n      this.constructor.DefaultType\n    )\n\n    return config\n  }\n\n  _setListeners() {\n    $(this._element).on(\n      Event.CLICK_DISMISS,\n      Selector.DATA_DISMISS,\n      () => this.hide(true)\n    )\n  }\n\n  _close() {\n    const complete = () => {\n      this._element.classList.add(ClassName.HIDE)\n      $(this._element).trigger(Event.HIDDEN)\n    }\n\n    this._element.classList.remove(ClassName.SHOW)\n    if (this._config.animation) {\n      const transitionDuration = Util.getTransitionDurationFromElement(this._element)\n\n      $(this._element)\n        .one(Util.TRANSITION_END, complete)\n        .emulateTransitionEnd(transitionDuration)\n    } else {\n      complete()\n    }\n  }\n\n  // Static\n\n  static _jQueryInterface(config) {\n    return this.each(function () {\n      const $element = $(this)\n      let data       = $element.data(DATA_KEY)\n      const _config  = typeof config === 'object' && config\n\n      if (!data) {\n        data = new Toast(this, _config)\n        $element.data(DATA_KEY, data)\n      }\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`)\n        }\n\n        data[config](this)\n      }\n    })\n  }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME]             = Toast._jQueryInterface\n$.fn[NAME].Constructor = Toast\n$.fn[NAME].noConflict  = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Toast._jQueryInterface\n}\n\nexport default Toast\n", "import $ from 'jquery'\nimport Alert from './alert'\nimport Button from './button'\nimport Carousel from './carousel'\nimport Collapse from './collapse'\nimport Dropdown from './dropdown'\nimport Modal from './modal'\nimport Popover from './popover'\nimport Scrollspy from './scrollspy'\nimport Tab from './tab'\nimport Toast from './toast'\nimport Tooltip from './tooltip'\nimport Util from './util'\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n(() => {\n  if (typeof $ === 'undefined') {\n    throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.')\n  }\n\n  const version = $.fn.jquery.split(' ')[0].split('.')\n  const minMajor = 1\n  const ltMajor = 2\n  const minMinor = 9\n  const minPatch = 1\n  const maxMajor = 4\n\n  if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n    throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0')\n  }\n})()\n\nexport {\n  Util,\n  Alert,\n  Button,\n  Carousel,\n  Collapse,\n  Dropdown,\n  Modal,\n  Popover,\n  Scrollspy,\n  Tab,\n  Toast,\n  Tooltip\n}\n", "// Expose jQuery globally before anything else runs: Bootstrap 4, DataTables,\n// the app scripts and inline view scripts use the global $ / jQuery.\nimport jquery from \"jquery\";\n\nwindow.$ = window.jQuery = jquery;\n", "/*!\nTurbo 8.0.23\nCopyright \u00A9 2026 37signals LLC\n */\nconst FrameLoadingStyle = {\n  eager: \"eager\",\n  lazy: \"lazy\"\n};\n\n/**\n * Contains a fragment of HTML which is updated based on navigation within\n * it (e.g. via links or form submissions).\n *\n * @customElement turbo-frame\n * @example\n *   <turbo-frame id=\"messages\">\n *     <a href=\"/messages/expanded\">\n *       Show all expanded messages in this frame.\n *     </a>\n *\n *     <form action=\"/messages\">\n *       Show response from this form within this frame.\n *     </form>\n *   </turbo-frame>\n */\nclass FrameElement extends HTMLElement {\n  static delegateConstructor = undefined\n\n  loaded = Promise.resolve()\n\n  static get observedAttributes() {\n    return [\"disabled\", \"loading\", \"src\"]\n  }\n\n  constructor() {\n    super();\n    this.delegate = new FrameElement.delegateConstructor(this);\n  }\n\n  connectedCallback() {\n    this.delegate.connect();\n  }\n\n  disconnectedCallback() {\n    this.delegate.disconnect();\n  }\n\n  reload() {\n    return this.delegate.sourceURLReloaded()\n  }\n\n  attributeChangedCallback(name) {\n    if (name == \"loading\") {\n      this.delegate.loadingStyleChanged();\n    } else if (name == \"src\") {\n      this.delegate.sourceURLChanged();\n    } else if (name == \"disabled\") {\n      this.delegate.disabledChanged();\n    }\n  }\n\n  /**\n   * Gets the URL to lazily load source HTML from\n   */\n  get src() {\n    return this.getAttribute(\"src\")\n  }\n\n  /**\n   * Sets the URL to lazily load source HTML from\n   */\n  set src(value) {\n    if (value) {\n      this.setAttribute(\"src\", value);\n    } else {\n      this.removeAttribute(\"src\");\n    }\n  }\n\n  /**\n   * Gets the refresh mode for the frame.\n   */\n  get refresh() {\n    return this.getAttribute(\"refresh\")\n  }\n\n  /**\n   * Sets the refresh mode for the frame.\n   */\n  set refresh(value) {\n    if (value) {\n      this.setAttribute(\"refresh\", value);\n    } else {\n      this.removeAttribute(\"refresh\");\n    }\n  }\n\n  get shouldReloadWithMorph() {\n    return this.src && this.refresh === \"morph\"\n  }\n\n  /**\n   * Determines if the element is loading\n   */\n  get loading() {\n    return frameLoadingStyleFromString(this.getAttribute(\"loading\") || \"\")\n  }\n\n  /**\n   * Sets the value of if the element is loading\n   */\n  set loading(value) {\n    if (value) {\n      this.setAttribute(\"loading\", value);\n    } else {\n      this.removeAttribute(\"loading\");\n    }\n  }\n\n  /**\n   * Gets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  get disabled() {\n    return this.hasAttribute(\"disabled\")\n  }\n\n  /**\n   * Sets the disabled state of the frame.\n   *\n   * If disabled, no requests will be intercepted by the frame.\n   */\n  set disabled(value) {\n    if (value) {\n      this.setAttribute(\"disabled\", \"\");\n    } else {\n      this.removeAttribute(\"disabled\");\n    }\n  }\n\n  /**\n   * Gets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  get autoscroll() {\n    return this.hasAttribute(\"autoscroll\")\n  }\n\n  /**\n   * Sets the autoscroll state of the frame.\n   *\n   * If true, the frame will be scrolled into view automatically on update.\n   */\n  set autoscroll(value) {\n    if (value) {\n      this.setAttribute(\"autoscroll\", \"\");\n    } else {\n      this.removeAttribute(\"autoscroll\");\n    }\n  }\n\n  /**\n   * Determines if the element has finished loading\n   */\n  get complete() {\n    return !this.delegate.isLoading\n  }\n\n  /**\n   * Gets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isActive() {\n    return this.ownerDocument === document && !this.isPreview\n  }\n\n  /**\n   * Sets the active state of the frame.\n   *\n   * If inactive, source changes will not be observed.\n   */\n  get isPreview() {\n    return this.ownerDocument?.documentElement?.hasAttribute(\"data-turbo-preview\")\n  }\n}\n\nfunction frameLoadingStyleFromString(style) {\n  switch (style.toLowerCase()) {\n    case \"lazy\":\n      return FrameLoadingStyle.lazy\n    default:\n      return FrameLoadingStyle.eager\n  }\n}\n\nconst drive = {\n  enabled: true,\n  progressBarDelay: 500,\n  unvisitableExtensions: new Set(\n    [\n      \".7z\", \".aac\", \".apk\", \".avi\", \".bmp\", \".bz2\", \".css\", \".csv\", \".deb\", \".dmg\", \".doc\",\n      \".docx\", \".exe\", \".gif\", \".gz\", \".heic\", \".heif\", \".ico\", \".iso\", \".jpeg\", \".jpg\",\n      \".js\", \".json\", \".m4a\", \".mkv\", \".mov\", \".mp3\", \".mp4\", \".mpeg\", \".mpg\", \".msi\",\n      \".ogg\", \".ogv\", \".pdf\", \".pkg\", \".png\", \".ppt\", \".pptx\", \".rar\", \".rtf\",\n      \".svg\", \".tar\", \".tif\", \".tiff\", \".txt\", \".wav\", \".webm\", \".webp\", \".wma\", \".wmv\",\n      \".xls\", \".xlsx\", \".xml\", \".zip\"\n    ]\n  )\n};\n\nfunction activateScriptElement(element) {\n  if (element.getAttribute(\"data-turbo-eval\") == \"false\") {\n    return element\n  } else {\n    const createdScriptElement = document.createElement(\"script\");\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      createdScriptElement.nonce = cspNonce;\n    }\n    createdScriptElement.textContent = element.textContent;\n    createdScriptElement.async = false;\n    copyElementAttributes(createdScriptElement, element);\n    return createdScriptElement\n  }\n}\n\nfunction copyElementAttributes(destinationElement, sourceElement) {\n  for (const { name, value } of sourceElement.attributes) {\n    destinationElement.setAttribute(name, value);\n  }\n}\n\nfunction createDocumentFragment(html) {\n  const template = document.createElement(\"template\");\n  template.innerHTML = html;\n  return template.content\n}\n\nfunction dispatch(eventName, { target, cancelable, detail } = {}) {\n  const event = new CustomEvent(eventName, {\n    cancelable,\n    bubbles: true,\n    composed: true,\n    detail\n  });\n\n  if (target && target.isConnected) {\n    target.dispatchEvent(event);\n  } else {\n    document.documentElement.dispatchEvent(event);\n  }\n\n  return event\n}\n\nfunction cancelEvent(event) {\n  event.preventDefault();\n  event.stopImmediatePropagation();\n}\n\nfunction nextRepaint() {\n  if (document.visibilityState === \"hidden\") {\n    return nextEventLoopTick()\n  } else {\n    return nextAnimationFrame()\n  }\n}\n\nfunction nextAnimationFrame() {\n  return new Promise((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction nextEventLoopTick() {\n  return new Promise((resolve) => setTimeout(() => resolve(), 0))\n}\n\nfunction parseHTMLDocument(html = \"\") {\n  return new DOMParser().parseFromString(html, \"text/html\")\n}\n\nfunction unindent(strings, ...values) {\n  const lines = interpolate(strings, values).replace(/^\\n/, \"\").split(\"\\n\");\n  const match = lines[0].match(/^\\s+/);\n  const indent = match ? match[0].length : 0;\n  return lines.map((line) => line.slice(indent)).join(\"\\n\")\n}\n\nfunction interpolate(strings, values) {\n  return strings.reduce((result, string, i) => {\n    const value = values[i] == undefined ? \"\" : values[i];\n    return result + string + value\n  }, \"\")\n}\n\nfunction uuid() {\n  return Array.from({ length: 36 })\n    .map((_, i) => {\n      if (i == 8 || i == 13 || i == 18 || i == 23) {\n        return \"-\"\n      } else if (i == 14) {\n        return \"4\"\n      } else if (i == 19) {\n        return (Math.floor(Math.random() * 4) + 8).toString(16)\n      } else {\n        return Math.floor(Math.random() * 16).toString(16)\n      }\n    })\n    .join(\"\")\n}\n\nfunction getAttribute(attributeName, ...elements) {\n  for (const value of elements.map((element) => element?.getAttribute(attributeName))) {\n    if (typeof value == \"string\") return value\n  }\n\n  return null\n}\n\nfunction hasAttribute(attributeName, ...elements) {\n  return elements.some((element) => element && element.hasAttribute(attributeName))\n}\n\nfunction markAsBusy(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.setAttribute(\"busy\", \"\");\n    }\n    element.setAttribute(\"aria-busy\", \"true\");\n  }\n}\n\nfunction clearBusyState(...elements) {\n  for (const element of elements) {\n    if (element.localName == \"turbo-frame\") {\n      element.removeAttribute(\"busy\");\n    }\n\n    element.removeAttribute(\"aria-busy\");\n  }\n}\n\nfunction waitForLoad(element, timeoutInMilliseconds = 2000) {\n  return new Promise((resolve) => {\n    const onComplete = () => {\n      element.removeEventListener(\"error\", onComplete);\n      element.removeEventListener(\"load\", onComplete);\n      resolve();\n    };\n\n    element.addEventListener(\"load\", onComplete, { once: true });\n    element.addEventListener(\"error\", onComplete, { once: true });\n    setTimeout(resolve, timeoutInMilliseconds);\n  })\n}\n\nfunction getHistoryMethodForAction(action) {\n  switch (action) {\n    case \"replace\":\n      return history.replaceState\n    case \"advance\":\n    case \"restore\":\n      return history.pushState\n  }\n}\n\nfunction isAction(action) {\n  return action == \"advance\" || action == \"replace\" || action == \"restore\"\n}\n\nfunction getVisitAction(...elements) {\n  const action = getAttribute(\"data-turbo-action\", ...elements);\n\n  return isAction(action) ? action : null\n}\n\nfunction getMetaElement(name) {\n  return document.querySelector(`meta[name=\"${name}\"]`)\n}\n\nfunction getMetaContent(name) {\n  const element = getMetaElement(name);\n  return element && element.content\n}\n\nfunction getCspNonce() {\n  const element = getMetaElement(\"csp-nonce\");\n\n  if (element) {\n    const { nonce, content } = element;\n    return nonce == \"\" ? content : nonce\n  }\n}\n\nfunction setMetaContent(name, content) {\n  let element = getMetaElement(name);\n\n  if (!element) {\n    element = document.createElement(\"meta\");\n    element.setAttribute(\"name\", name);\n\n    document.head.appendChild(element);\n  }\n\n  element.setAttribute(\"content\", content);\n\n  return element\n}\n\nfunction findClosestRecursively(element, selector) {\n  if (element instanceof Element) {\n    return (\n      element.closest(selector) || findClosestRecursively(element.assignedSlot || element.getRootNode()?.host, selector)\n    )\n  }\n}\n\nfunction elementIsFocusable(element) {\n  const inertDisabledOrHidden = \"[inert], :disabled, [hidden], details:not([open]), dialog:not([open])\";\n\n  return !!element && element.closest(inertDisabledOrHidden) == null && typeof element.focus == \"function\"\n}\n\nfunction queryAutofocusableElement(elementOrDocumentFragment) {\n  return Array.from(elementOrDocumentFragment.querySelectorAll(\"[autofocus]\")).find(elementIsFocusable)\n}\n\nasync function around(callback, reader) {\n  const before = reader();\n\n  callback();\n\n  await nextAnimationFrame();\n\n  const after = reader();\n\n  return [before, after]\n}\n\nfunction doesNotTargetIFrame(name) {\n  if (name === \"_blank\") {\n    return false\n  } else if (name) {\n    for (const element of document.getElementsByName(name)) {\n      if (element instanceof HTMLIFrameElement) return false\n    }\n\n    return true\n  } else {\n    return true\n  }\n}\n\nfunction findLinkFromClickTarget(target) {\n  const link = findClosestRecursively(target, \"a[href], a[xlink\\\\:href]\");\n\n  if (!link) return null\n  if (link.href.startsWith(\"#\")) return null\n  if (link.hasAttribute(\"download\")) return null\n\n  const linkTarget = link.getAttribute(\"target\");\n  if (linkTarget && linkTarget !== \"_self\") return null\n\n  return link\n}\n\nfunction debounce(fn, delay) {\n  let timeoutId = null;\n\n  return (...args) => {\n    const callback = () => fn.apply(this, args);\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(callback, delay);\n  }\n}\n\nconst submitter = {\n  \"aria-disabled\": {\n    beforeSubmit: submitter => {\n      submitter.setAttribute(\"aria-disabled\", \"true\");\n      submitter.addEventListener(\"click\", cancelEvent);\n    },\n\n    afterSubmit: submitter => {\n      submitter.removeAttribute(\"aria-disabled\");\n      submitter.removeEventListener(\"click\", cancelEvent);\n    }\n  },\n\n  \"disabled\": {\n    beforeSubmit: submitter => submitter.disabled = true,\n    afterSubmit: submitter => submitter.disabled = false\n  }\n};\n\nclass Config {\n  #submitter = null\n\n  constructor(config) {\n    Object.assign(this, config);\n  }\n\n  get submitter() {\n    return this.#submitter\n  }\n\n  set submitter(value) {\n    this.#submitter = submitter[value] || value;\n  }\n}\n\nconst forms = new Config({\n  mode: \"on\",\n  submitter: \"disabled\"\n});\n\nconst config = {\n  drive,\n  forms\n};\n\nfunction expandURL(locatable) {\n  return new URL(locatable.toString(), document.baseURI)\n}\n\nfunction getAnchor(url) {\n  let anchorMatch;\n  if (url.hash) {\n    return url.hash.slice(1)\n    // eslint-disable-next-line no-cond-assign\n  } else if ((anchorMatch = url.href.match(/#(.*)$/))) {\n    return anchorMatch[1]\n  }\n}\n\nfunction getAction$1(form, submitter) {\n  const action = submitter?.getAttribute(\"formaction\") || form.getAttribute(\"action\") || form.action;\n\n  return expandURL(action)\n}\n\nfunction getExtension(url) {\n  return (getLastPathComponent(url).match(/\\.[^.]*$/) || [])[0] || \"\"\n}\n\nfunction isPrefixedBy(baseURL, url) {\n  const prefix = addTrailingSlash(url.origin + url.pathname);\n  return addTrailingSlash(baseURL.href) === prefix || baseURL.href.startsWith(prefix)\n}\n\nfunction locationIsVisitable(location, rootLocation) {\n  return isPrefixedBy(location, rootLocation) && !config.drive.unvisitableExtensions.has(getExtension(location))\n}\n\nfunction getLocationForLink(link) {\n  return expandURL(link.getAttribute(\"href\") || \"\")\n}\n\nfunction getRequestURL(url) {\n  const anchor = getAnchor(url);\n  return anchor != null ? url.href.slice(0, -(anchor.length + 1)) : url.href\n}\n\nfunction toCacheKey(url) {\n  return getRequestURL(url)\n}\n\nfunction urlsAreEqual(left, right) {\n  return expandURL(left).href == expandURL(right).href\n}\n\nfunction getPathComponents(url) {\n  return url.pathname.split(\"/\").slice(1)\n}\n\nfunction getLastPathComponent(url) {\n  return getPathComponents(url).slice(-1)[0]\n}\n\nfunction addTrailingSlash(value) {\n  return value.endsWith(\"/\") ? value : value + \"/\"\n}\n\nclass FetchResponse {\n  constructor(response) {\n    this.response = response;\n  }\n\n  get succeeded() {\n    return this.response.ok\n  }\n\n  get failed() {\n    return !this.succeeded\n  }\n\n  get clientError() {\n    return this.statusCode >= 400 && this.statusCode <= 499\n  }\n\n  get serverError() {\n    return this.statusCode >= 500 && this.statusCode <= 599\n  }\n\n  get redirected() {\n    return this.response.redirected\n  }\n\n  get location() {\n    return expandURL(this.response.url)\n  }\n\n  get isHTML() {\n    return this.contentType && this.contentType.match(/^(?:text\\/([^\\s;,]+\\b)?html|application\\/xhtml\\+xml)\\b/)\n  }\n\n  get statusCode() {\n    return this.response.status\n  }\n\n  get contentType() {\n    return this.header(\"Content-Type\")\n  }\n\n  get responseText() {\n    return this.response.clone().text()\n  }\n\n  get responseHTML() {\n    if (this.isHTML) {\n      return this.response.clone().text()\n    } else {\n      return Promise.resolve(undefined)\n    }\n  }\n\n  header(name) {\n    return this.response.headers.get(name)\n  }\n}\n\nclass LimitedSet extends Set {\n  constructor(maxSize) {\n    super();\n    this.maxSize = maxSize;\n  }\n\n  add(value) {\n    if (this.size >= this.maxSize) {\n      const iterator = this.values();\n      const oldestValue = iterator.next().value;\n      this.delete(oldestValue);\n    }\n    super.add(value);\n  }\n}\n\nconst recentRequests = new LimitedSet(20);\n\nfunction fetchWithTurboHeaders(url, options = {}) {\n  const modifiedHeaders = new Headers(options.headers || {});\n  const requestUID = uuid();\n  recentRequests.add(requestUID);\n  modifiedHeaders.append(\"X-Turbo-Request-Id\", requestUID);\n\n  return window.fetch(url, {\n    ...options,\n    headers: modifiedHeaders\n  })\n}\n\nfunction fetchMethodFromString(method) {\n  switch (method.toLowerCase()) {\n    case \"get\":\n      return FetchMethod.get\n    case \"post\":\n      return FetchMethod.post\n    case \"put\":\n      return FetchMethod.put\n    case \"patch\":\n      return FetchMethod.patch\n    case \"delete\":\n      return FetchMethod.delete\n  }\n}\n\nconst FetchMethod = {\n  get: \"get\",\n  post: \"post\",\n  put: \"put\",\n  patch: \"patch\",\n  delete: \"delete\"\n};\n\nfunction fetchEnctypeFromString(encoding) {\n  switch (encoding.toLowerCase()) {\n    case FetchEnctype.multipart:\n      return FetchEnctype.multipart\n    case FetchEnctype.plain:\n      return FetchEnctype.plain\n    default:\n      return FetchEnctype.urlEncoded\n  }\n}\n\nconst FetchEnctype = {\n  urlEncoded: \"application/x-www-form-urlencoded\",\n  multipart: \"multipart/form-data\",\n  plain: \"text/plain\"\n};\n\nclass FetchRequest {\n  abortController = new AbortController()\n  #resolveRequestPromise = (_value) => {}\n\n  constructor(delegate, method, location, requestBody = new URLSearchParams(), target = null, enctype = FetchEnctype.urlEncoded) {\n    const [url, body] = buildResourceAndBody(expandURL(location), method, requestBody, enctype);\n\n    this.delegate = delegate;\n    this.url = url;\n    this.target = target;\n    this.fetchOptions = {\n      credentials: \"same-origin\",\n      redirect: \"follow\",\n      method: method.toUpperCase(),\n      headers: { ...this.defaultHeaders },\n      body: body,\n      signal: this.abortSignal,\n      referrer: this.delegate.referrer?.href\n    };\n    this.enctype = enctype;\n  }\n\n  get method() {\n    return this.fetchOptions.method\n  }\n\n  set method(value) {\n    const fetchBody = this.isSafe ? this.url.searchParams : this.fetchOptions.body || new FormData();\n    const fetchMethod = fetchMethodFromString(value) || FetchMethod.get;\n\n    this.url.search = \"\";\n\n    const [url, body] = buildResourceAndBody(this.url, fetchMethod, fetchBody, this.enctype);\n\n    this.url = url;\n    this.fetchOptions.body = body;\n    this.fetchOptions.method = fetchMethod.toUpperCase();\n  }\n\n  get headers() {\n    return this.fetchOptions.headers\n  }\n\n  set headers(value) {\n    this.fetchOptions.headers = value;\n  }\n\n  get body() {\n    if (this.isSafe) {\n      return this.url.searchParams\n    } else {\n      return this.fetchOptions.body\n    }\n  }\n\n  set body(value) {\n    this.fetchOptions.body = value;\n  }\n\n  get location() {\n    return this.url\n  }\n\n  get params() {\n    return this.url.searchParams\n  }\n\n  get entries() {\n    return this.body ? Array.from(this.body.entries()) : []\n  }\n\n  cancel() {\n    this.abortController.abort();\n  }\n\n  async perform() {\n    const { fetchOptions } = this;\n    this.delegate.prepareRequest(this);\n    const event = await this.#allowRequestToBeIntercepted(fetchOptions);\n    try {\n      this.delegate.requestStarted(this);\n\n      if (event.detail.fetchRequest) {\n        this.response = event.detail.fetchRequest.response;\n      } else {\n        this.response = fetchWithTurboHeaders(this.url.href, fetchOptions);\n      }\n\n      const response = await this.response;\n      return await this.receive(response)\n    } catch (error) {\n      if (error.name !== \"AbortError\") {\n        if (this.#willDelegateErrorHandling(error)) {\n          this.delegate.requestErrored(this, error);\n        }\n        throw error\n      }\n    } finally {\n      this.delegate.requestFinished(this);\n    }\n  }\n\n  async receive(response) {\n    const fetchResponse = new FetchResponse(response);\n    const event = dispatch(\"turbo:before-fetch-response\", {\n      cancelable: true,\n      detail: { fetchResponse },\n      target: this.target\n    });\n    if (event.defaultPrevented) {\n      this.delegate.requestPreventedHandlingResponse(this, fetchResponse);\n    } else if (fetchResponse.succeeded) {\n      this.delegate.requestSucceededWithResponse(this, fetchResponse);\n    } else {\n      this.delegate.requestFailedWithResponse(this, fetchResponse);\n    }\n    return fetchResponse\n  }\n\n  get defaultHeaders() {\n    return {\n      Accept: \"text/html, application/xhtml+xml\"\n    }\n  }\n\n  get isSafe() {\n    return isSafe(this.method)\n  }\n\n  get abortSignal() {\n    return this.abortController.signal\n  }\n\n  acceptResponseType(mimeType) {\n    this.headers[\"Accept\"] = [mimeType, this.headers[\"Accept\"]].join(\", \");\n  }\n\n  async #allowRequestToBeIntercepted(fetchOptions) {\n    const requestInterception = new Promise((resolve) => (this.#resolveRequestPromise = resolve));\n    const event = dispatch(\"turbo:before-fetch-request\", {\n      cancelable: true,\n      detail: {\n        fetchOptions,\n        url: this.url,\n        resume: this.#resolveRequestPromise\n      },\n      target: this.target\n    });\n    this.url = event.detail.url;\n    if (event.defaultPrevented) await requestInterception;\n\n    return event\n  }\n\n  #willDelegateErrorHandling(error) {\n    const event = dispatch(\"turbo:fetch-request-error\", {\n      target: this.target,\n      cancelable: true,\n      detail: { request: this, error: error }\n    });\n\n    return !event.defaultPrevented\n  }\n}\n\nfunction isSafe(fetchMethod) {\n  return fetchMethodFromString(fetchMethod) == FetchMethod.get\n}\n\nfunction buildResourceAndBody(resource, method, requestBody, enctype) {\n  const searchParams =\n    Array.from(requestBody).length > 0 ? new URLSearchParams(entriesExcludingFiles(requestBody)) : resource.searchParams;\n\n  if (isSafe(method)) {\n    return [mergeIntoURLSearchParams(resource, searchParams), null]\n  } else if (enctype == FetchEnctype.urlEncoded) {\n    return [resource, searchParams]\n  } else {\n    return [resource, requestBody]\n  }\n}\n\nfunction entriesExcludingFiles(requestBody) {\n  const entries = [];\n\n  for (const [name, value] of requestBody) {\n    if (value instanceof File) continue\n    else entries.push([name, value]);\n  }\n\n  return entries\n}\n\nfunction mergeIntoURLSearchParams(url, requestBody) {\n  const searchParams = new URLSearchParams(entriesExcludingFiles(requestBody));\n\n  url.search = searchParams.toString();\n\n  return url\n}\n\nclass AppearanceObserver {\n  started = false\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n    this.intersectionObserver = new IntersectionObserver(this.intersect);\n  }\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      this.intersectionObserver.observe(this.element);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      this.intersectionObserver.unobserve(this.element);\n    }\n  }\n\n  intersect = (entries) => {\n    const lastEntry = entries.slice(-1)[0];\n    if (lastEntry?.isIntersecting) {\n      this.delegate.elementAppearedInViewport(this.element);\n    }\n  }\n}\n\nclass StreamMessage {\n  static contentType = \"text/vnd.turbo-stream.html\"\n\n  static wrap(message) {\n    if (typeof message == \"string\") {\n      return new this(createDocumentFragment(message))\n    } else {\n      return message\n    }\n  }\n\n  constructor(fragment) {\n    this.fragment = importStreamElements(fragment);\n  }\n}\n\nfunction importStreamElements(fragment) {\n  for (const element of fragment.querySelectorAll(\"turbo-stream\")) {\n    const streamElement = document.importNode(element, true);\n\n    for (const inertScriptElement of streamElement.templateElement.content.querySelectorAll(\"script\")) {\n      inertScriptElement.replaceWith(activateScriptElement(inertScriptElement));\n    }\n\n    element.replaceWith(streamElement);\n  }\n\n  return fragment\n}\n\nconst identity = key => key;\n\nclass LRUCache {\n  keys = []\n  entries = {}\n  #toCacheKey\n\n  constructor(size, toCacheKey = identity) {\n    this.size = size;\n    this.#toCacheKey = toCacheKey;\n  }\n\n  has(key) {\n    return this.#toCacheKey(key) in this.entries\n  }\n\n  get(key) {\n    if (this.has(key)) {\n      const entry = this.read(key);\n      this.touch(key);\n      return entry\n    }\n  }\n\n  put(key, entry) {\n    this.write(key, entry);\n    this.touch(key);\n    return entry\n  }\n\n  clear() {\n    for (const key of Object.keys(this.entries)) {\n      this.evict(key);\n    }\n  }\n\n  // Private\n\n  read(key) {\n    return this.entries[this.#toCacheKey(key)]\n  }\n\n  write(key, entry) {\n    this.entries[this.#toCacheKey(key)] = entry;\n  }\n\n  touch(key) {\n    key = this.#toCacheKey(key);\n    const index = this.keys.indexOf(key);\n    if (index > -1) this.keys.splice(index, 1);\n    this.keys.unshift(key);\n    this.trim();\n  }\n\n  trim() {\n    for (const key of this.keys.splice(this.size)) {\n      this.evict(key);\n    }\n  }\n\n  evict(key) {\n    delete this.entries[key];\n  }\n}\n\nconst PREFETCH_DELAY = 100;\n\nclass PrefetchCache extends LRUCache {\n  #prefetchTimeout = null\n  #maxAges = {}\n\n  constructor(size = 1, prefetchDelay = PREFETCH_DELAY) {\n    super(size, toCacheKey);\n    this.prefetchDelay = prefetchDelay;\n  }\n\n  putLater(url, request, ttl) {\n    this.#prefetchTimeout = setTimeout(() => {\n      request.perform();\n      this.put(url, request, ttl);\n      this.#prefetchTimeout = null;\n    }, this.prefetchDelay);\n  }\n\n  put(url, request, ttl = cacheTtl) {\n    super.put(url, request);\n    this.#maxAges[toCacheKey(url)] = new Date(new Date().getTime() + ttl);\n  }\n\n  clear() {\n    super.clear();\n    if (this.#prefetchTimeout) clearTimeout(this.#prefetchTimeout);\n  }\n\n  evict(key) {\n    super.evict(key);\n    delete this.#maxAges[key];\n  }\n\n  has(key) {\n    if (super.has(key)) {\n      const maxAge = this.#maxAges[toCacheKey(key)];\n\n      return maxAge && maxAge > Date.now()\n    } else {\n      return false\n    }\n  }\n}\n\nconst cacheTtl = 10 * 1000;\nconst prefetchCache = new PrefetchCache();\n\nconst FormSubmissionState = {\n  initialized: \"initialized\",\n  requesting: \"requesting\",\n  waiting: \"waiting\",\n  receiving: \"receiving\",\n  stopping: \"stopping\",\n  stopped: \"stopped\"\n};\n\nclass FormSubmission {\n  state = FormSubmissionState.initialized\n\n  static confirmMethod(message) {\n    return Promise.resolve(confirm(message))\n  }\n\n  constructor(delegate, formElement, submitter, mustRedirect = false) {\n    const method = getMethod(formElement, submitter);\n    const action = getAction(getFormAction(formElement, submitter), method);\n    const body = buildFormData(formElement, submitter);\n    const enctype = getEnctype(formElement, submitter);\n\n    this.delegate = delegate;\n    this.formElement = formElement;\n    this.submitter = submitter;\n    this.fetchRequest = new FetchRequest(this, method, action, body, formElement, enctype);\n    this.mustRedirect = mustRedirect;\n  }\n\n  get method() {\n    return this.fetchRequest.method\n  }\n\n  set method(value) {\n    this.fetchRequest.method = value;\n  }\n\n  get action() {\n    return this.fetchRequest.url.toString()\n  }\n\n  set action(value) {\n    this.fetchRequest.url = expandURL(value);\n  }\n\n  get body() {\n    return this.fetchRequest.body\n  }\n\n  get enctype() {\n    return this.fetchRequest.enctype\n  }\n\n  get isSafe() {\n    return this.fetchRequest.isSafe\n  }\n\n  get location() {\n    return this.fetchRequest.url\n  }\n\n  // The submission process\n\n  async start() {\n    const { initialized, requesting } = FormSubmissionState;\n    const confirmationMessage = getAttribute(\"data-turbo-confirm\", this.submitter, this.formElement);\n\n    if (typeof confirmationMessage === \"string\") {\n      const confirmMethod = typeof config.forms.confirm === \"function\" ?\n        config.forms.confirm :\n        FormSubmission.confirmMethod;\n\n      const answer = await confirmMethod(confirmationMessage, this.formElement, this.submitter);\n      if (!answer) {\n        return\n      }\n    }\n\n    if (this.state == initialized) {\n      this.state = requesting;\n      return this.fetchRequest.perform()\n    }\n  }\n\n  stop() {\n    const { stopping, stopped } = FormSubmissionState;\n    if (this.state != stopping && this.state != stopped) {\n      this.state = stopping;\n      this.fetchRequest.cancel();\n      return true\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (!request.isSafe) {\n      const token = getCookieValue(getMetaContent(\"csrf-param\")) || getMetaContent(\"csrf-token\");\n      if (token) {\n        request.headers[\"X-CSRF-Token\"] = token;\n      }\n    }\n\n    if (this.requestAcceptsTurboStreamResponse(request)) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    this.state = FormSubmissionState.waiting;\n    if (this.submitter) config.forms.submitter.beforeSubmit(this.submitter);\n    this.setSubmitsWith();\n    markAsBusy(this.formElement);\n    dispatch(\"turbo:submit-start\", {\n      target: this.formElement,\n      detail: { formSubmission: this }\n    });\n    this.delegate.formSubmissionStarted(this);\n  }\n\n  requestPreventedHandlingResponse(request, response) {\n    prefetchCache.clear();\n\n    this.result = { success: response.succeeded, fetchResponse: response };\n  }\n\n  requestSucceededWithResponse(request, response) {\n    if (response.clientError || response.serverError) {\n      this.delegate.formSubmissionFailedWithResponse(this, response);\n      return\n    }\n\n    prefetchCache.clear();\n\n    if (this.requestMustRedirect(request) && responseSucceededWithoutRedirect(response)) {\n      const error = new Error(\"Form responses must redirect to another location\");\n      this.delegate.formSubmissionErrored(this, error);\n    } else {\n      this.state = FormSubmissionState.receiving;\n      this.result = { success: true, fetchResponse: response };\n      this.delegate.formSubmissionSucceededWithResponse(this, response);\n    }\n  }\n\n  requestFailedWithResponse(request, response) {\n    this.result = { success: false, fetchResponse: response };\n    this.delegate.formSubmissionFailedWithResponse(this, response);\n  }\n\n  requestErrored(request, error) {\n    this.result = { success: false, error };\n    this.delegate.formSubmissionErrored(this, error);\n  }\n\n  requestFinished(_request) {\n    this.state = FormSubmissionState.stopped;\n    if (this.submitter) config.forms.submitter.afterSubmit(this.submitter);\n    this.resetSubmitterText();\n    clearBusyState(this.formElement);\n    dispatch(\"turbo:submit-end\", {\n      target: this.formElement,\n      detail: { formSubmission: this, ...this.result }\n    });\n    this.delegate.formSubmissionFinished(this);\n  }\n\n  // Private\n\n  setSubmitsWith() {\n    if (!this.submitter || !this.submitsWith) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.originalSubmitText = this.submitter.innerHTML;\n      this.submitter.innerHTML = this.submitsWith;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      this.originalSubmitText = input.value;\n      input.value = this.submitsWith;\n    }\n  }\n\n  resetSubmitterText() {\n    if (!this.submitter || !this.originalSubmitText) return\n\n    if (this.submitter.matches(\"button\")) {\n      this.submitter.innerHTML = this.originalSubmitText;\n    } else if (this.submitter.matches(\"input\")) {\n      const input = this.submitter;\n      input.value = this.originalSubmitText;\n    }\n  }\n\n  requestMustRedirect(request) {\n    return !request.isSafe && this.mustRedirect\n  }\n\n  requestAcceptsTurboStreamResponse(request) {\n    return !request.isSafe || hasAttribute(\"data-turbo-stream\", this.submitter, this.formElement)\n  }\n\n  get submitsWith() {\n    return this.submitter?.getAttribute(\"data-turbo-submits-with\")\n  }\n}\n\nfunction buildFormData(formElement, submitter) {\n  const formData = new FormData(formElement);\n  const name = submitter?.getAttribute(\"name\");\n  const value = submitter?.getAttribute(\"value\");\n\n  if (name) {\n    formData.append(name, value || \"\");\n  }\n\n  return formData\n}\n\nfunction getCookieValue(cookieName) {\n  if (cookieName != null) {\n    const cookies = document.cookie ? document.cookie.split(\"; \") : [];\n    const cookie = cookies.find((cookie) => cookie.startsWith(cookieName));\n    if (cookie) {\n      const value = cookie.split(\"=\").slice(1).join(\"=\");\n      return value ? decodeURIComponent(value) : undefined\n    }\n  }\n}\n\nfunction responseSucceededWithoutRedirect(response) {\n  return response.statusCode == 200 && !response.redirected\n}\n\nfunction getFormAction(formElement, submitter) {\n  const formElementAction = typeof formElement.action === \"string\" ? formElement.action : null;\n\n  if (submitter?.hasAttribute(\"formaction\")) {\n    return submitter.getAttribute(\"formaction\") || \"\"\n  } else {\n    return formElement.getAttribute(\"action\") || formElementAction || \"\"\n  }\n}\n\nfunction getAction(formAction, fetchMethod) {\n  const action = expandURL(formAction);\n\n  if (isSafe(fetchMethod)) {\n    action.search = \"\";\n  }\n\n  return action\n}\n\nfunction getMethod(formElement, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || formElement.getAttribute(\"method\") || \"\";\n  return fetchMethodFromString(method.toLowerCase()) || FetchMethod.get\n}\n\nfunction getEnctype(formElement, submitter) {\n  return fetchEnctypeFromString(submitter?.getAttribute(\"formenctype\") || formElement.enctype)\n}\n\nclass Snapshot {\n  constructor(element) {\n    this.element = element;\n  }\n\n  get activeElement() {\n    return this.element.ownerDocument.activeElement\n  }\n\n  get children() {\n    return [...this.element.children]\n  }\n\n  hasAnchor(anchor) {\n    return this.getElementForAnchor(anchor) != null\n  }\n\n  getElementForAnchor(anchor) {\n    return anchor ? this.element.querySelector(`[id='${anchor}'], a[name='${anchor}']`) : null\n  }\n\n  get isConnected() {\n    return this.element.isConnected\n  }\n\n  get firstAutofocusableElement() {\n    return queryAutofocusableElement(this.element)\n  }\n\n  get permanentElements() {\n    return queryPermanentElementsAll(this.element)\n  }\n\n  getPermanentElementById(id) {\n    return getPermanentElementById(this.element, id)\n  }\n\n  getPermanentElementMapForSnapshot(snapshot) {\n    const permanentElementMap = {};\n\n    for (const currentPermanentElement of this.permanentElements) {\n      const { id } = currentPermanentElement;\n      const newPermanentElement = snapshot.getPermanentElementById(id);\n      if (newPermanentElement) {\n        permanentElementMap[id] = [currentPermanentElement, newPermanentElement];\n      }\n    }\n\n    return permanentElementMap\n  }\n}\n\nfunction getPermanentElementById(node, id) {\n  return node.querySelector(`#${id}[data-turbo-permanent]`)\n}\n\nfunction queryPermanentElementsAll(node) {\n  return node.querySelectorAll(\"[id][data-turbo-permanent]\")\n}\n\nclass FormSubmitObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"submit\", this.submitCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"submit\", this.submitCaptured, true);\n      this.started = false;\n    }\n  }\n\n  submitCaptured = () => {\n    this.eventTarget.removeEventListener(\"submit\", this.submitBubbled, false);\n    this.eventTarget.addEventListener(\"submit\", this.submitBubbled, false);\n  }\n\n  submitBubbled = (event) => {\n    if (!event.defaultPrevented) {\n      const form = event.target instanceof HTMLFormElement ? event.target : undefined;\n      const submitter = event.submitter || undefined;\n\n      if (\n        form &&\n        submissionDoesNotDismissDialog(form, submitter) &&\n        submissionDoesNotTargetIFrame(form, submitter) &&\n        this.delegate.willSubmitForm(form, submitter)\n      ) {\n        event.preventDefault();\n        event.stopImmediatePropagation();\n        this.delegate.formSubmitted(form, submitter);\n      }\n    }\n  }\n}\n\nfunction submissionDoesNotDismissDialog(form, submitter) {\n  const method = submitter?.getAttribute(\"formmethod\") || form.getAttribute(\"method\");\n\n  return method != \"dialog\"\n}\n\nfunction submissionDoesNotTargetIFrame(form, submitter) {\n  const target = submitter?.getAttribute(\"formtarget\") || form.getAttribute(\"target\");\n\n  return doesNotTargetIFrame(target)\n}\n\nclass View {\n  #resolveRenderPromise = (_value) => {}\n  #resolveInterceptionPromise = (_value) => {}\n\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  // Scrolling\n\n  scrollToAnchor(anchor) {\n    const element = this.snapshot.getElementForAnchor(anchor);\n    if (element) {\n      this.focusElement(element);\n      this.scrollToElement(element);\n    } else {\n      this.scrollToPosition({ x: 0, y: 0 });\n    }\n  }\n\n  scrollToAnchorFromLocation(location) {\n    this.scrollToAnchor(getAnchor(location));\n  }\n\n  scrollToElement(element) {\n    element.scrollIntoView();\n  }\n\n  focusElement(element) {\n    if (element instanceof HTMLElement) {\n      if (element.hasAttribute(\"tabindex\")) {\n        element.focus();\n      } else {\n        element.setAttribute(\"tabindex\", \"-1\");\n        element.focus();\n        element.removeAttribute(\"tabindex\");\n      }\n    }\n  }\n\n  scrollToPosition({ x, y }) {\n    this.scrollRoot.scrollTo(x, y);\n  }\n\n  scrollToTop() {\n    this.scrollToPosition({ x: 0, y: 0 });\n  }\n\n  get scrollRoot() {\n    return window\n  }\n\n  // Rendering\n\n  async render(renderer) {\n    const { isPreview, shouldRender, willRender, newSnapshot: snapshot } = renderer;\n\n    // A workaround to ignore tracked element mismatch reloads when performing\n    // a promoted Visit from a frame navigation\n    const shouldInvalidate = willRender;\n\n    if (shouldRender) {\n      try {\n        this.renderPromise = new Promise((resolve) => (this.#resolveRenderPromise = resolve));\n        this.renderer = renderer;\n        await this.prepareToRenderSnapshot(renderer);\n\n        const renderInterception = new Promise((resolve) => (this.#resolveInterceptionPromise = resolve));\n        const options = { resume: this.#resolveInterceptionPromise, render: this.renderer.renderElement, renderMethod: this.renderer.renderMethod };\n        const immediateRender = this.delegate.allowsImmediateRender(snapshot, options);\n        if (!immediateRender) await renderInterception;\n\n        await this.renderSnapshot(renderer);\n        this.delegate.viewRenderedSnapshot(snapshot, isPreview, this.renderer.renderMethod);\n        this.delegate.preloadOnLoadLinksForView(this.element);\n        this.finishRenderingSnapshot(renderer);\n      } finally {\n        delete this.renderer;\n        this.#resolveRenderPromise(undefined);\n        delete this.renderPromise;\n      }\n    } else if (shouldInvalidate) {\n      this.invalidate(renderer.reloadReason);\n    }\n  }\n\n  invalidate(reason) {\n    this.delegate.viewInvalidated(reason);\n  }\n\n  async prepareToRenderSnapshot(renderer) {\n    this.markAsPreview(renderer.isPreview);\n    await renderer.prepareToRender();\n  }\n\n  markAsPreview(isPreview) {\n    if (isPreview) {\n      this.element.setAttribute(\"data-turbo-preview\", \"\");\n    } else {\n      this.element.removeAttribute(\"data-turbo-preview\");\n    }\n  }\n\n  markVisitDirection(direction) {\n    this.element.setAttribute(\"data-turbo-visit-direction\", direction);\n  }\n\n  unmarkVisitDirection() {\n    this.element.removeAttribute(\"data-turbo-visit-direction\");\n  }\n\n  async renderSnapshot(renderer) {\n    await renderer.render();\n  }\n\n  finishRenderingSnapshot(renderer) {\n    renderer.finishRendering();\n  }\n}\n\nclass FrameView extends View {\n  missing() {\n    this.element.innerHTML = `<strong class=\"turbo-frame-error\">Content missing</strong>`;\n  }\n\n  get snapshot() {\n    return new Snapshot(this.element)\n  }\n}\n\nclass LinkInterceptor {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.element = element;\n  }\n\n  start() {\n    this.element.addEventListener(\"click\", this.clickBubbled);\n    document.addEventListener(\"turbo:click\", this.linkClicked);\n    document.addEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  stop() {\n    this.element.removeEventListener(\"click\", this.clickBubbled);\n    document.removeEventListener(\"turbo:click\", this.linkClicked);\n    document.removeEventListener(\"turbo:before-visit\", this.willVisit);\n  }\n\n  clickBubbled = (event) => {\n    if (this.clickEventIsSignificant(event)) {\n      this.clickEvent = event;\n    } else {\n      delete this.clickEvent;\n    }\n  }\n\n  linkClicked = (event) => {\n    if (this.clickEvent && this.clickEventIsSignificant(event)) {\n      if (this.delegate.shouldInterceptLinkClick(event.target, event.detail.url, event.detail.originalEvent)) {\n        this.clickEvent.preventDefault();\n        event.preventDefault();\n        this.delegate.linkClickIntercepted(event.target, event.detail.url, event.detail.originalEvent);\n      }\n    }\n    delete this.clickEvent;\n  }\n\n  willVisit = (_event) => {\n    delete this.clickEvent;\n  }\n\n  clickEventIsSignificant(event) {\n    const target = event.composed ? event.target?.parentElement : event.target;\n    const element = findLinkFromClickTarget(target) || target;\n\n    return element instanceof Element && element.closest(\"turbo-frame, html\") == this.element\n  }\n}\n\nclass LinkClickObserver {\n  started = false\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (!this.started) {\n      this.eventTarget.addEventListener(\"click\", this.clickCaptured, true);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.eventTarget.removeEventListener(\"click\", this.clickCaptured, true);\n      this.started = false;\n    }\n  }\n\n  clickCaptured = () => {\n    this.eventTarget.removeEventListener(\"click\", this.clickBubbled, false);\n    this.eventTarget.addEventListener(\"click\", this.clickBubbled, false);\n  }\n\n  clickBubbled = (event) => {\n    if (event instanceof MouseEvent && this.clickEventIsSignificant(event)) {\n      const target = (event.composedPath && event.composedPath()[0]) || event.target;\n      const link = findLinkFromClickTarget(target);\n      if (link && doesNotTargetIFrame(link.target)) {\n        const location = getLocationForLink(link);\n        if (this.delegate.willFollowLinkToLocation(link, location, event)) {\n          event.preventDefault();\n          this.delegate.followedLinkToLocation(link, location);\n        }\n      }\n    }\n  }\n\n  clickEventIsSignificant(event) {\n    return !(\n      (event.target && event.target.isContentEditable) ||\n      event.defaultPrevented ||\n      event.which > 1 ||\n      event.altKey ||\n      event.ctrlKey ||\n      event.metaKey ||\n      event.shiftKey\n    )\n  }\n}\n\nclass FormLinkClickObserver {\n  constructor(delegate, element) {\n    this.delegate = delegate;\n    this.linkInterceptor = new LinkClickObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n  }\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return false\n  }\n\n  prefetchAndCacheRequestToLocation(link, location) {\n    return\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, originalEvent) {\n    return (\n      this.delegate.willSubmitFormLinkToLocation(link, location, originalEvent) &&\n      (link.hasAttribute(\"data-turbo-method\") || link.hasAttribute(\"data-turbo-stream\"))\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const form = document.createElement(\"form\");\n\n    const type = \"hidden\";\n    for (const [name, value] of location.searchParams) {\n      form.append(Object.assign(document.createElement(\"input\"), { type, name, value }));\n    }\n\n    const action = Object.assign(location, { search: \"\" });\n    form.setAttribute(\"data-turbo\", \"true\");\n    form.setAttribute(\"action\", action.href);\n    form.setAttribute(\"hidden\", \"\");\n\n    const method = link.getAttribute(\"data-turbo-method\");\n    if (method) form.setAttribute(\"method\", method);\n\n    const turboFrame = link.getAttribute(\"data-turbo-frame\");\n    if (turboFrame) form.setAttribute(\"data-turbo-frame\", turboFrame);\n\n    const turboAction = getVisitAction(link);\n    if (turboAction) form.setAttribute(\"data-turbo-action\", turboAction);\n\n    const turboConfirm = link.getAttribute(\"data-turbo-confirm\");\n    if (turboConfirm) form.setAttribute(\"data-turbo-confirm\", turboConfirm);\n\n    const turboStream = link.hasAttribute(\"data-turbo-stream\");\n    if (turboStream) form.setAttribute(\"data-turbo-stream\", \"\");\n\n    this.delegate.submittedFormLinkToLocation(link, location, form);\n\n    document.body.appendChild(form);\n    form.addEventListener(\"turbo:submit-end\", () => form.remove(), { once: true });\n    requestAnimationFrame(() => form.requestSubmit());\n  }\n}\n\nclass Bardo {\n  static async preservingPermanentElements(delegate, permanentElementMap, callback) {\n    const bardo = new this(delegate, permanentElementMap);\n    bardo.enter();\n    await callback();\n    bardo.leave();\n  }\n\n  constructor(delegate, permanentElementMap) {\n    this.delegate = delegate;\n    this.permanentElementMap = permanentElementMap;\n  }\n\n  enter() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement, newPermanentElement] = this.permanentElementMap[id];\n      this.delegate.enteringBardo(currentPermanentElement, newPermanentElement);\n      this.replaceNewPermanentElementWithPlaceholder(newPermanentElement);\n    }\n  }\n\n  leave() {\n    for (const id in this.permanentElementMap) {\n      const [currentPermanentElement] = this.permanentElementMap[id];\n      this.replaceCurrentPermanentElementWithClone(currentPermanentElement);\n      this.replacePlaceholderWithPermanentElement(currentPermanentElement);\n      this.delegate.leavingBardo(currentPermanentElement);\n    }\n  }\n\n  replaceNewPermanentElementWithPlaceholder(permanentElement) {\n    const placeholder = createPlaceholderForPermanentElement(permanentElement);\n    permanentElement.replaceWith(placeholder);\n  }\n\n  replaceCurrentPermanentElementWithClone(permanentElement) {\n    const clone = permanentElement.cloneNode(true);\n    permanentElement.replaceWith(clone);\n  }\n\n  replacePlaceholderWithPermanentElement(permanentElement) {\n    const placeholder = this.getPlaceholderById(permanentElement.id);\n    placeholder?.replaceWith(permanentElement);\n  }\n\n  getPlaceholderById(id) {\n    return this.placeholders.find((element) => element.content == id)\n  }\n\n  get placeholders() {\n    return [...document.querySelectorAll(\"meta[name=turbo-permanent-placeholder][content]\")]\n  }\n}\n\nfunction createPlaceholderForPermanentElement(permanentElement) {\n  const element = document.createElement(\"meta\");\n  element.setAttribute(\"name\", \"turbo-permanent-placeholder\");\n  element.setAttribute(\"content\", permanentElement.id);\n  return element\n}\n\nclass Renderer {\n  #activeElement = null\n\n  static renderElement(currentElement, newElement) {\n    // Abstract method\n  }\n\n  constructor(currentSnapshot, newSnapshot, isPreview, willRender = true) {\n    this.currentSnapshot = currentSnapshot;\n    this.newSnapshot = newSnapshot;\n    this.isPreview = isPreview;\n    this.willRender = willRender;\n    this.renderElement = this.constructor.renderElement;\n    this.promise = new Promise((resolve, reject) => (this.resolvingFunctions = { resolve, reject }));\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  get shouldAutofocus() {\n    return true\n  }\n\n  get reloadReason() {\n    return\n  }\n\n  prepareToRender() {\n    return\n  }\n\n  render() {\n    // Abstract method\n  }\n\n  finishRendering() {\n    if (this.resolvingFunctions) {\n      this.resolvingFunctions.resolve();\n      delete this.resolvingFunctions;\n    }\n  }\n\n  async preservingPermanentElements(callback) {\n    await Bardo.preservingPermanentElements(this, this.permanentElementMap, callback);\n  }\n\n  focusFirstAutofocusableElement() {\n    if (this.shouldAutofocus) {\n      const element = this.connectedSnapshot.firstAutofocusableElement;\n      if (element) {\n        element.focus();\n      }\n    }\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement) {\n    if (this.#activeElement) return\n\n    if (currentPermanentElement.contains(this.currentSnapshot.activeElement)) {\n      this.#activeElement = this.currentSnapshot.activeElement;\n    }\n  }\n\n  leavingBardo(currentPermanentElement) {\n    if (currentPermanentElement.contains(this.#activeElement) && this.#activeElement instanceof HTMLElement) {\n      this.#activeElement.focus();\n\n      this.#activeElement = null;\n    }\n  }\n\n  get connectedSnapshot() {\n    return this.newSnapshot.isConnected ? this.newSnapshot : this.currentSnapshot\n  }\n\n  get currentElement() {\n    return this.currentSnapshot.element\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  get permanentElementMap() {\n    return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)\n  }\n\n  get renderMethod() {\n    return \"replace\"\n  }\n}\n\nclass FrameRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const destinationRange = document.createRange();\n    destinationRange.selectNodeContents(currentElement);\n    destinationRange.deleteContents();\n\n    const frameElement = newElement;\n    const sourceRange = frameElement.ownerDocument?.createRange();\n    if (sourceRange) {\n      sourceRange.selectNodeContents(frameElement);\n      currentElement.appendChild(sourceRange.extractContents());\n    }\n  }\n\n  constructor(delegate, currentSnapshot, newSnapshot, renderElement, isPreview, willRender = true) {\n    super(currentSnapshot, newSnapshot, renderElement, isPreview, willRender);\n    this.delegate = delegate;\n  }\n\n  get shouldRender() {\n    return true\n  }\n\n  async render() {\n    await nextRepaint();\n    this.preservingPermanentElements(() => {\n      this.loadFrameElement();\n    });\n    this.scrollFrameIntoView();\n    await nextRepaint();\n    this.focusFirstAutofocusableElement();\n    await nextRepaint();\n    this.activateScriptElements();\n  }\n\n  loadFrameElement() {\n    this.delegate.willRenderFrame(this.currentElement, this.newElement);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  scrollFrameIntoView() {\n    if (this.currentElement.autoscroll || this.newElement.autoscroll) {\n      const element = this.currentElement.firstElementChild;\n      const block = readScrollLogicalPosition(this.currentElement.getAttribute(\"data-autoscroll-block\"), \"end\");\n      const behavior = readScrollBehavior(this.currentElement.getAttribute(\"data-autoscroll-behavior\"), \"auto\");\n\n      if (element) {\n        element.scrollIntoView({ block, behavior });\n        return true\n      }\n    }\n    return false\n  }\n\n  activateScriptElements() {\n    for (const inertScriptElement of this.newScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  get newScriptElements() {\n    return this.currentElement.querySelectorAll(\"script\")\n  }\n}\n\nfunction readScrollLogicalPosition(value, defaultValue) {\n  if (value == \"end\" || value == \"start\" || value == \"center\" || value == \"nearest\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\nfunction readScrollBehavior(value, defaultValue) {\n  if (value == \"auto\" || value == \"smooth\") {\n    return value\n  } else {\n    return defaultValue\n  }\n}\n\n/**\n * @typedef {object} ConfigHead\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} [style]\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {function(Element): boolean} [shouldPreserve]\n * @property {function(Element): boolean} [shouldReAppend]\n * @property {function(Element): boolean} [shouldRemove]\n * @property {function(Element, {added: Node[], kept: Element[], removed: Element[]}): void} [afterHeadMorphed]\n */\n\n/**\n * @typedef {object} ConfigCallbacks\n *\n * @property {function(Node): boolean} [beforeNodeAdded]\n * @property {function(Node): void} [afterNodeAdded]\n * @property {function(Element, Node): boolean} [beforeNodeMorphed]\n * @property {function(Element, Node): void} [afterNodeMorphed]\n * @property {function(Element): boolean} [beforeNodeRemoved]\n * @property {function(Element): void} [afterNodeRemoved]\n * @property {function(string, Element, \"update\" | \"remove\"): boolean} [beforeAttributeUpdated]\n */\n\n/**\n * @typedef {object} Config\n *\n * @property {'outerHTML' | 'innerHTML'} [morphStyle]\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacks} [callbacks]\n * @property {ConfigHead} [head]\n */\n\n/**\n * @typedef {function} NoOp\n *\n * @returns {void}\n */\n\n/**\n * @typedef {object} ConfigHeadInternal\n *\n * @property {'merge' | 'append' | 'morph' | 'none'} style\n * @property {boolean} [block]\n * @property {boolean} [ignore]\n * @property {(function(Element): boolean) | NoOp} shouldPreserve\n * @property {(function(Element): boolean) | NoOp} shouldReAppend\n * @property {(function(Element): boolean) | NoOp} shouldRemove\n * @property {(function(Element, {added: Node[], kept: Element[], removed: Element[]}): void) | NoOp} afterHeadMorphed\n */\n\n/**\n * @typedef {object} ConfigCallbacksInternal\n *\n * @property {(function(Node): boolean) | NoOp} beforeNodeAdded\n * @property {(function(Node): void) | NoOp} afterNodeAdded\n * @property {(function(Node, Node): boolean) | NoOp} beforeNodeMorphed\n * @property {(function(Node, Node): void) | NoOp} afterNodeMorphed\n * @property {(function(Node): boolean) | NoOp} beforeNodeRemoved\n * @property {(function(Node): void) | NoOp} afterNodeRemoved\n * @property {(function(string, Element, \"update\" | \"remove\"): boolean) | NoOp} beforeAttributeUpdated\n */\n\n/**\n * @typedef {object} ConfigInternal\n *\n * @property {'outerHTML' | 'innerHTML'} morphStyle\n * @property {boolean} [ignoreActive]\n * @property {boolean} [ignoreActiveValue]\n * @property {boolean} [restoreFocus]\n * @property {ConfigCallbacksInternal} callbacks\n * @property {ConfigHeadInternal} head\n */\n\n/**\n * @typedef {Object} IdSets\n * @property {Set<string>} persistentIds\n * @property {Map<Node, Set<string>>} idMap\n */\n\n/**\n * @typedef {Function} Morph\n *\n * @param {Element | Document} oldNode\n * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n * @param {Config} [config]\n * @returns {undefined | Node[]}\n */\n\n// base IIFE to define idiomorph\n/**\n *\n * @type {{defaults: ConfigInternal, morph: Morph}}\n */\nvar Idiomorph = (function () {\n\n  /**\n   * @typedef {object} MorphContext\n   *\n   * @property {Element} target\n   * @property {Element} newContent\n   * @property {ConfigInternal} config\n   * @property {ConfigInternal['morphStyle']} morphStyle\n   * @property {ConfigInternal['ignoreActive']} ignoreActive\n   * @property {ConfigInternal['ignoreActiveValue']} ignoreActiveValue\n   * @property {ConfigInternal['restoreFocus']} restoreFocus\n   * @property {Map<Node, Set<string>>} idMap\n   * @property {Set<string>} persistentIds\n   * @property {ConfigInternal['callbacks']} callbacks\n   * @property {ConfigInternal['head']} head\n   * @property {HTMLDivElement} pantry\n   * @property {Element[]} activeElementAndParents\n   */\n\n  //=============================================================================\n  // AND NOW IT BEGINS...\n  //=============================================================================\n\n  const noOp = () => {};\n  /**\n   * Default configuration values, updatable by users now\n   * @type {ConfigInternal}\n   */\n  const defaults = {\n    morphStyle: \"outerHTML\",\n    callbacks: {\n      beforeNodeAdded: noOp,\n      afterNodeAdded: noOp,\n      beforeNodeMorphed: noOp,\n      afterNodeMorphed: noOp,\n      beforeNodeRemoved: noOp,\n      afterNodeRemoved: noOp,\n      beforeAttributeUpdated: noOp,\n    },\n    head: {\n      style: \"merge\",\n      shouldPreserve: (elt) => elt.getAttribute(\"im-preserve\") === \"true\",\n      shouldReAppend: (elt) => elt.getAttribute(\"im-re-append\") === \"true\",\n      shouldRemove: noOp,\n      afterHeadMorphed: noOp,\n    },\n    restoreFocus: true,\n  };\n\n  /**\n   * Core idiomorph function for morphing one DOM tree to another\n   *\n   * @param {Element | Document} oldNode\n   * @param {Element | Node | HTMLCollection | Node[] | string | null} newContent\n   * @param {Config} [config]\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function morph(oldNode, newContent, config = {}) {\n    oldNode = normalizeElement(oldNode);\n    const newNode = normalizeParent(newContent);\n    const ctx = createMorphContext(oldNode, newNode, config);\n\n    const morphedNodes = saveAndRestoreFocus(ctx, () => {\n      return withHeadBlocking(\n        ctx,\n        oldNode,\n        newNode,\n        /** @param {MorphContext} ctx */ (ctx) => {\n          if (ctx.morphStyle === \"innerHTML\") {\n            morphChildren(ctx, oldNode, newNode);\n            return Array.from(oldNode.childNodes);\n          } else {\n            return morphOuterHTML(ctx, oldNode, newNode);\n          }\n        },\n      );\n    });\n\n    ctx.pantry.remove();\n    return morphedNodes;\n  }\n\n  /**\n   * Morph just the outerHTML of the oldNode to the newContent\n   * We have to be careful because the oldNode could have siblings which need to be untouched\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @returns {Node[]}\n   */\n  function morphOuterHTML(ctx, oldNode, newNode) {\n    const oldParent = normalizeParent(oldNode);\n    morphChildren(\n      ctx,\n      oldParent,\n      newNode,\n      // these two optional params are the secret sauce\n      oldNode, // start point for iteration\n      oldNode.nextSibling, // end point for iteration\n    );\n    // this is safe even with siblings, because normalizeParent returns a SlicedParentNode if needed.\n    return Array.from(oldParent.childNodes);\n  }\n\n  /**\n   * @param {MorphContext} ctx\n   * @param {Function} fn\n   * @returns {Promise<Node[]> | Node[]}\n   */\n  function saveAndRestoreFocus(ctx, fn) {\n    if (!ctx.config.restoreFocus) return fn();\n    let activeElement =\n      /** @type {HTMLInputElement|HTMLTextAreaElement|null} */ (\n        document.activeElement\n      );\n\n    // don't bother if the active element is not an input or textarea\n    if (\n      !(\n        activeElement instanceof HTMLInputElement ||\n        activeElement instanceof HTMLTextAreaElement\n      )\n    ) {\n      return fn();\n    }\n\n    const { id: activeElementId, selectionStart, selectionEnd } = activeElement;\n\n    const results = fn();\n\n    if (\n      activeElementId &&\n      activeElementId !== document.activeElement?.getAttribute(\"id\")\n    ) {\n      activeElement = ctx.target.querySelector(`[id=\"${activeElementId}\"]`);\n      activeElement?.focus();\n    }\n    if (activeElement && !activeElement.selectionEnd && selectionEnd) {\n      activeElement.setSelectionRange(selectionStart, selectionEnd);\n    }\n\n    return results;\n  }\n\n  const morphChildren = (function () {\n    /**\n     * This is the core algorithm for matching up children.  The idea is to use id sets to try to match up\n     * nodes as faithfully as possible.  We greedily match, which allows us to keep the algorithm fast, but\n     * by using id sets, we are able to better match up with content deeper in the DOM.\n     *\n     * Basic algorithm:\n     * - for each node in the new content:\n     *   - search self and siblings for an id set match, falling back to a soft match\n     *   - if match found\n     *     - remove any nodes up to the match:\n     *       - pantry persistent nodes\n     *       - delete the rest\n     *     - morph the match\n     *   - elsif no match found, and node is persistent\n     *     - find its match by querying the old root (future) and pantry (past)\n     *     - move it and its children here\n     *     - morph it\n     *   - else\n     *     - create a new node from scratch as a last result\n     *\n     * @param {MorphContext} ctx the merge context\n     * @param {Element} oldParent the old content that we are merging the new content into\n     * @param {Element} newParent the parent element of the new content\n     * @param {Node|null} [insertionPoint] the point in the DOM we start morphing at (defaults to first child)\n     * @param {Node|null} [endPoint] the point in the DOM we stop morphing at (defaults to after last child)\n     */\n    function morphChildren(\n      ctx,\n      oldParent,\n      newParent,\n      insertionPoint = null,\n      endPoint = null,\n    ) {\n      // normalize\n      if (\n        oldParent instanceof HTMLTemplateElement &&\n        newParent instanceof HTMLTemplateElement\n      ) {\n        // @ts-ignore we can pretend the DocumentFragment is an Element\n        oldParent = oldParent.content;\n        // @ts-ignore ditto\n        newParent = newParent.content;\n      }\n      insertionPoint ||= oldParent.firstChild;\n\n      // run through all the new content\n      for (const newChild of newParent.childNodes) {\n        // once we reach the end of the old parent content skip to the end and insert the rest\n        if (insertionPoint && insertionPoint != endPoint) {\n          const bestMatch = findBestMatch(\n            ctx,\n            newChild,\n            insertionPoint,\n            endPoint,\n          );\n          if (bestMatch) {\n            // if the node to morph is not at the insertion point then remove/move up to it\n            if (bestMatch !== insertionPoint) {\n              removeNodesBetween(ctx, insertionPoint, bestMatch);\n            }\n            morphNode(bestMatch, newChild, ctx);\n            insertionPoint = bestMatch.nextSibling;\n            continue;\n          }\n        }\n\n        // if the matching node is elsewhere in the original content\n        if (newChild instanceof Element) {\n          // we can pretend the id is non-null because the next `.has` line will reject it if not\n          const newChildId = /** @type {String} */ (\n            newChild.getAttribute(\"id\")\n          );\n          if (ctx.persistentIds.has(newChildId)) {\n            // move it and all its children here and morph\n            const movedChild = moveBeforeById(\n              oldParent,\n              newChildId,\n              insertionPoint,\n              ctx,\n            );\n            morphNode(movedChild, newChild, ctx);\n            insertionPoint = movedChild.nextSibling;\n            continue;\n          }\n        }\n\n        // last resort: insert the new node from scratch\n        const insertedNode = createNode(\n          oldParent,\n          newChild,\n          insertionPoint,\n          ctx,\n        );\n        // could be null if beforeNodeAdded prevented insertion\n        if (insertedNode) {\n          insertionPoint = insertedNode.nextSibling;\n        }\n      }\n\n      // remove any remaining old nodes that didn't match up with new content\n      while (insertionPoint && insertionPoint != endPoint) {\n        const tempNode = insertionPoint;\n        insertionPoint = insertionPoint.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n    }\n\n    /**\n     * This performs the action of inserting a new node while handling situations where the node contains\n     * elements with persistent ids and possible state info we can still preserve by moving in and then morphing\n     *\n     * @param {Element} oldParent\n     * @param {Node} newChild\n     * @param {Node|null} insertionPoint\n     * @param {MorphContext} ctx\n     * @returns {Node|null}\n     */\n    function createNode(oldParent, newChild, insertionPoint, ctx) {\n      if (ctx.callbacks.beforeNodeAdded(newChild) === false) return null;\n      if (ctx.idMap.has(newChild)) {\n        // node has children with ids with possible state so create a dummy elt of same type and apply full morph algorithm\n        const newEmptyChild = document.createElement(\n          /** @type {Element} */ (newChild).tagName,\n        );\n        oldParent.insertBefore(newEmptyChild, insertionPoint);\n        morphNode(newEmptyChild, newChild, ctx);\n        ctx.callbacks.afterNodeAdded(newEmptyChild);\n        return newEmptyChild;\n      } else {\n        // optimisation: no id state to preserve so we can just insert a clone of the newChild and its descendants\n        const newClonedChild = document.importNode(newChild, true); // importNode to not mutate newParent\n        oldParent.insertBefore(newClonedChild, insertionPoint);\n        ctx.callbacks.afterNodeAdded(newClonedChild);\n        return newClonedChild;\n      }\n    }\n\n    //=============================================================================\n    // Matching Functions\n    //=============================================================================\n    const findBestMatch = (function () {\n      /**\n       * Scans forward from the startPoint to the endPoint looking for a match\n       * for the node. It looks for an id set match first, then a soft match.\n       * We abort softmatching if we find two future soft matches, to reduce churn.\n       * @param {Node} node\n       * @param {MorphContext} ctx\n       * @param {Node | null} startPoint\n       * @param {Node | null} endPoint\n       * @returns {Node | null}\n       */\n      function findBestMatch(ctx, node, startPoint, endPoint) {\n        let softMatch = null;\n        let nextSibling = node.nextSibling;\n        let siblingSoftMatchCount = 0;\n\n        let cursor = startPoint;\n        while (cursor && cursor != endPoint) {\n          // soft matching is a prerequisite for id set matching\n          if (isSoftMatch(cursor, node)) {\n            if (isIdSetMatch(ctx, cursor, node)) {\n              return cursor; // found an id set match, we're done!\n            }\n\n            // we haven't yet saved a soft match fallback\n            if (softMatch === null) {\n              // the current soft match will hard match something else in the future, leave it\n              if (!ctx.idMap.has(cursor)) {\n                // save this as the fallback if we get through the loop without finding a hard match\n                softMatch = cursor;\n              }\n            }\n          }\n          if (\n            softMatch === null &&\n            nextSibling &&\n            isSoftMatch(cursor, nextSibling)\n          ) {\n            // The next new node has a soft match with this node, so\n            // increment the count of future soft matches\n            siblingSoftMatchCount++;\n            nextSibling = nextSibling.nextSibling;\n\n            // If there are two future soft matches, block soft matching for this node to allow\n            // future siblings to soft match. This is to reduce churn in the DOM when an element\n            // is prepended.\n            if (siblingSoftMatchCount >= 2) {\n              softMatch = undefined;\n            }\n          }\n\n          // if the current node contains active element, stop looking for better future matches,\n          // because if one is found, this node will be moved to the pantry, reparenting it and thus losing focus\n          // @ts-ignore pretend cursor is Element rather than Node, we're just testing for array inclusion\n          if (ctx.activeElementAndParents.includes(cursor)) break;\n\n          cursor = cursor.nextSibling;\n        }\n\n        return softMatch || null;\n      }\n\n      /**\n       *\n       * @param {MorphContext} ctx\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isIdSetMatch(ctx, oldNode, newNode) {\n        let oldSet = ctx.idMap.get(oldNode);\n        let newSet = ctx.idMap.get(newNode);\n\n        if (!newSet || !oldSet) return false;\n\n        for (const id of oldSet) {\n          // a potential match is an id in the new and old nodes that\n          // has not already been merged into the DOM\n          // But the newNode content we call this on has not been\n          // merged yet and we don't allow duplicate IDs so it is simple\n          if (newSet.has(id)) {\n            return true;\n          }\n        }\n        return false;\n      }\n\n      /**\n       *\n       * @param {Node} oldNode\n       * @param {Node} newNode\n       * @returns {boolean}\n       */\n      function isSoftMatch(oldNode, newNode) {\n        // ok to cast: if one is not element, `id` and `tagName` will be undefined and we'll just compare that.\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        return (\n          oldElt.nodeType === newElt.nodeType &&\n          oldElt.tagName === newElt.tagName &&\n          // If oldElt has an `id` with possible state and it doesn't match newElt.id then avoid morphing.\n          // We'll still match an anonymous node with an IDed newElt, though, because if it got this far,\n          // its not persistent, and new nodes can't have any hidden state.\n          // We can't use .id because of form input shadowing, and we can't count on .getAttribute's presence because it could be a document-fragment\n          (!oldElt.getAttribute?.(\"id\") ||\n            oldElt.getAttribute?.(\"id\") === newElt.getAttribute?.(\"id\"))\n        );\n      }\n\n      return findBestMatch;\n    })();\n\n    //=============================================================================\n    // DOM Manipulation Functions\n    //=============================================================================\n\n    /**\n     * Gets rid of an unwanted DOM node; strategy depends on nature of its reuse:\n     * - Persistent nodes will be moved to the pantry for later reuse\n     * - Other nodes will have their hooks called, and then are removed\n     * @param {MorphContext} ctx\n     * @param {Node} node\n     */\n    function removeNode(ctx, node) {\n      // are we going to id set match this later?\n      if (ctx.idMap.has(node)) {\n        // skip callbacks and move to pantry\n        moveBefore(ctx.pantry, node, null);\n      } else {\n        // remove for realsies\n        if (ctx.callbacks.beforeNodeRemoved(node) === false) return;\n        node.parentNode?.removeChild(node);\n        ctx.callbacks.afterNodeRemoved(node);\n      }\n    }\n\n    /**\n     * Remove nodes between the start and end nodes\n     * @param {MorphContext} ctx\n     * @param {Node} startInclusive\n     * @param {Node} endExclusive\n     * @returns {Node|null}\n     */\n    function removeNodesBetween(ctx, startInclusive, endExclusive) {\n      /** @type {Node | null} */\n      let cursor = startInclusive;\n      // remove nodes until the endExclusive node\n      while (cursor && cursor !== endExclusive) {\n        let tempNode = /** @type {Node} */ (cursor);\n        cursor = cursor.nextSibling;\n        removeNode(ctx, tempNode);\n      }\n      return cursor;\n    }\n\n    /**\n     * Search for an element by id within the document and pantry, and move it using moveBefore.\n     *\n     * @param {Element} parentNode - The parent node to which the element will be moved.\n     * @param {string} id - The ID of the element to be moved.\n     * @param {Node | null} after - The reference node to insert the element before.\n     *                              If `null`, the element is appended as the last child.\n     * @param {MorphContext} ctx\n     * @returns {Element} The found element\n     */\n    function moveBeforeById(parentNode, id, after, ctx) {\n      const target =\n        /** @type {Element} - will always be found */\n        (\n          // ctx.target.id unsafe because of form input shadowing\n          // ctx.target could be a document fragment which doesn't have `getAttribute`\n          (ctx.target.getAttribute?.(\"id\") === id && ctx.target) ||\n            ctx.target.querySelector(`[id=\"${id}\"]`) ||\n            ctx.pantry.querySelector(`[id=\"${id}\"]`)\n        );\n      removeElementFromAncestorsIdMaps(target, ctx);\n      moveBefore(parentNode, target, after);\n      return target;\n    }\n\n    /**\n     * Removes an element from its ancestors' id maps. This is needed when an element is moved from the\n     * \"future\" via `moveBeforeId`. Otherwise, its erstwhile ancestors could be mistakenly moved to the\n     * pantry rather than being deleted, preventing their removal hooks from being called.\n     *\n     * @param {Element} element - element to remove from its ancestors' id maps\n     * @param {MorphContext} ctx\n     */\n    function removeElementFromAncestorsIdMaps(element, ctx) {\n      // we know id is non-null String, because this function is only called on elements with ids\n      const id = /** @type {String} */ (element.getAttribute(\"id\"));\n      /** @ts-ignore - safe to loop in this way **/\n      while ((element = element.parentNode)) {\n        let idSet = ctx.idMap.get(element);\n        if (idSet) {\n          idSet.delete(id);\n          if (!idSet.size) {\n            ctx.idMap.delete(element);\n          }\n        }\n      }\n    }\n\n    /**\n     * Moves an element before another element within the same parent.\n     * Uses the proposed `moveBefore` API if available (and working), otherwise falls back to `insertBefore`.\n     * This is essentialy a forward-compat wrapper.\n     *\n     * @param {Element} parentNode - The parent node containing the after element.\n     * @param {Node} element - The element to be moved.\n     * @param {Node | null} after - The reference node to insert `element` before.\n     *                              If `null`, `element` is appended as the last child.\n     */\n    function moveBefore(parentNode, element, after) {\n      // @ts-ignore - use proposed moveBefore feature\n      if (parentNode.moveBefore) {\n        try {\n          // @ts-ignore - use proposed moveBefore feature\n          parentNode.moveBefore(element, after);\n        } catch (e) {\n          // fall back to insertBefore as some browsers may fail on moveBefore when trying to move Dom disconnected nodes to pantry\n          parentNode.insertBefore(element, after);\n        }\n      } else {\n        parentNode.insertBefore(element, after);\n      }\n    }\n\n    return morphChildren;\n  })();\n\n  //=============================================================================\n  // Single Node Morphing Code\n  //=============================================================================\n  const morphNode = (function () {\n    /**\n     * @param {Node} oldNode root node to merge content into\n     * @param {Node} newContent new content to merge\n     * @param {MorphContext} ctx the merge context\n     * @returns {Node | null} the element that ended up in the DOM\n     */\n    function morphNode(oldNode, newContent, ctx) {\n      if (ctx.ignoreActive && oldNode === document.activeElement) {\n        // don't morph focused element\n        return null;\n      }\n\n      if (ctx.callbacks.beforeNodeMorphed(oldNode, newContent) === false) {\n        return oldNode;\n      }\n\n      if (oldNode instanceof HTMLHeadElement && ctx.head.ignore) ; else if (\n        oldNode instanceof HTMLHeadElement &&\n        ctx.head.style !== \"morph\"\n      ) {\n        // ok to cast: if newContent wasn't also a <head>, it would've got caught in the `!isSoftMatch` branch above\n        handleHeadElement(\n          oldNode,\n          /** @type {HTMLHeadElement} */ (newContent),\n          ctx,\n        );\n      } else {\n        morphAttributes(oldNode, newContent, ctx);\n        if (!ignoreValueOfActiveElement(oldNode, ctx)) {\n          // @ts-ignore newContent can be a node here because .firstChild will be null\n          morphChildren(ctx, oldNode, newContent);\n        }\n      }\n      ctx.callbacks.afterNodeMorphed(oldNode, newContent);\n      return oldNode;\n    }\n\n    /**\n     * syncs the oldNode to the newNode, copying over all attributes and\n     * inner element state from the newNode to the oldNode\n     *\n     * @param {Node} oldNode the node to copy attributes & state to\n     * @param {Node} newNode the node to copy attributes & state from\n     * @param {MorphContext} ctx the merge context\n     */\n    function morphAttributes(oldNode, newNode, ctx) {\n      let type = newNode.nodeType;\n\n      // if is an element type, sync the attributes from the\n      // new node into the new node\n      if (type === 1 /* element type */) {\n        const oldElt = /** @type {Element} */ (oldNode);\n        const newElt = /** @type {Element} */ (newNode);\n\n        const oldAttributes = oldElt.attributes;\n        const newAttributes = newElt.attributes;\n        for (const newAttribute of newAttributes) {\n          if (ignoreAttribute(newAttribute.name, oldElt, \"update\", ctx)) {\n            continue;\n          }\n          if (oldElt.getAttribute(newAttribute.name) !== newAttribute.value) {\n            oldElt.setAttribute(newAttribute.name, newAttribute.value);\n          }\n        }\n        // iterate backwards to avoid skipping over items when a delete occurs\n        for (let i = oldAttributes.length - 1; 0 <= i; i--) {\n          const oldAttribute = oldAttributes[i];\n\n          // toAttributes is a live NamedNodeMap, so iteration+mutation is unsafe\n          // e.g. custom element attribute callbacks can remove other attributes\n          if (!oldAttribute) continue;\n\n          if (!newElt.hasAttribute(oldAttribute.name)) {\n            if (ignoreAttribute(oldAttribute.name, oldElt, \"remove\", ctx)) {\n              continue;\n            }\n            oldElt.removeAttribute(oldAttribute.name);\n          }\n        }\n\n        if (!ignoreValueOfActiveElement(oldElt, ctx)) {\n          syncInputValue(oldElt, newElt, ctx);\n        }\n      }\n\n      // sync text nodes\n      if (type === 8 /* comment */ || type === 3 /* text */) {\n        if (oldNode.nodeValue !== newNode.nodeValue) {\n          oldNode.nodeValue = newNode.nodeValue;\n        }\n      }\n    }\n\n    /**\n     * NB: many bothans died to bring us information:\n     *\n     *  https://github.com/patrick-steele-idem/morphdom/blob/master/src/specialElHandlers.js\n     *  https://github.com/choojs/nanomorph/blob/master/lib/morph.jsL113\n     *\n     * @param {Element} oldElement the element to sync the input value to\n     * @param {Element} newElement the element to sync the input value from\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncInputValue(oldElement, newElement, ctx) {\n      if (\n        oldElement instanceof HTMLInputElement &&\n        newElement instanceof HTMLInputElement &&\n        newElement.type !== \"file\"\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n\n        // sync boolean attributes\n        syncBooleanAttribute(oldElement, newElement, \"checked\", ctx);\n        syncBooleanAttribute(oldElement, newElement, \"disabled\", ctx);\n\n        if (!newElement.hasAttribute(\"value\")) {\n          if (!ignoreAttribute(\"value\", oldElement, \"remove\", ctx)) {\n            oldElement.value = \"\";\n            oldElement.removeAttribute(\"value\");\n          }\n        } else if (oldValue !== newValue) {\n          if (!ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n            oldElement.setAttribute(\"value\", newValue);\n            oldElement.value = newValue;\n          }\n        }\n        // TODO: QUESTION(1cg): this used to only check `newElement` unlike the other branches -- why?\n        // did I break something?\n      } else if (\n        oldElement instanceof HTMLOptionElement &&\n        newElement instanceof HTMLOptionElement\n      ) {\n        syncBooleanAttribute(oldElement, newElement, \"selected\", ctx);\n      } else if (\n        oldElement instanceof HTMLTextAreaElement &&\n        newElement instanceof HTMLTextAreaElement\n      ) {\n        let newValue = newElement.value;\n        let oldValue = oldElement.value;\n        if (ignoreAttribute(\"value\", oldElement, \"update\", ctx)) {\n          return;\n        }\n        if (newValue !== oldValue) {\n          oldElement.value = newValue;\n        }\n        if (\n          oldElement.firstChild &&\n          oldElement.firstChild.nodeValue !== newValue\n        ) {\n          oldElement.firstChild.nodeValue = newValue;\n        }\n      }\n    }\n\n    /**\n     * @param {Element} oldElement element to write the value to\n     * @param {Element} newElement element to read the value from\n     * @param {string} attributeName the attribute name\n     * @param {MorphContext} ctx the merge context\n     */\n    function syncBooleanAttribute(oldElement, newElement, attributeName, ctx) {\n      // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n      const newLiveValue = newElement[attributeName],\n        // @ts-ignore ditto\n        oldLiveValue = oldElement[attributeName];\n      if (newLiveValue !== oldLiveValue) {\n        const ignoreUpdate = ignoreAttribute(\n          attributeName,\n          oldElement,\n          \"update\",\n          ctx,\n        );\n        if (!ignoreUpdate) {\n          // update attribute's associated DOM property\n          // @ts-ignore this function is only used on boolean attrs that are reflected as dom properties\n          oldElement[attributeName] = newElement[attributeName];\n        }\n        if (newLiveValue) {\n          if (!ignoreUpdate) {\n            // https://developer.mozilla.org/en-US/docs/Glossary/Boolean/HTML\n            // this is the correct way to set a boolean attribute to \"true\"\n            oldElement.setAttribute(attributeName, \"\");\n          }\n        } else {\n          if (!ignoreAttribute(attributeName, oldElement, \"remove\", ctx)) {\n            oldElement.removeAttribute(attributeName);\n          }\n        }\n      }\n    }\n\n    /**\n     * @param {string} attr the attribute to be mutated\n     * @param {Element} element the element that is going to be updated\n     * @param {\"update\" | \"remove\"} updateType\n     * @param {MorphContext} ctx the merge context\n     * @returns {boolean} true if the attribute should be ignored, false otherwise\n     */\n    function ignoreAttribute(attr, element, updateType, ctx) {\n      if (\n        attr === \"value\" &&\n        ctx.ignoreActiveValue &&\n        element === document.activeElement\n      ) {\n        return true;\n      }\n      return (\n        ctx.callbacks.beforeAttributeUpdated(attr, element, updateType) ===\n        false\n      );\n    }\n\n    /**\n     * @param {Node} possibleActiveElement\n     * @param {MorphContext} ctx\n     * @returns {boolean}\n     */\n    function ignoreValueOfActiveElement(possibleActiveElement, ctx) {\n      return (\n        !!ctx.ignoreActiveValue &&\n        possibleActiveElement === document.activeElement &&\n        possibleActiveElement !== document.body\n      );\n    }\n\n    return morphNode;\n  })();\n\n  //=============================================================================\n  // Head Management Functions\n  //=============================================================================\n  /**\n   * @param {MorphContext} ctx\n   * @param {Element} oldNode\n   * @param {Element} newNode\n   * @param {function} callback\n   * @returns {Node[] | Promise<Node[]>}\n   */\n  function withHeadBlocking(ctx, oldNode, newNode, callback) {\n    if (ctx.head.block) {\n      const oldHead = oldNode.querySelector(\"head\");\n      const newHead = newNode.querySelector(\"head\");\n      if (oldHead && newHead) {\n        const promises = handleHeadElement(oldHead, newHead, ctx);\n        // when head promises resolve, proceed ignoring the head tag\n        return Promise.all(promises).then(() => {\n          const newCtx = Object.assign(ctx, {\n            head: {\n              block: false,\n              ignore: true,\n            },\n          });\n          return callback(newCtx);\n        });\n      }\n    }\n    // just proceed if we not head blocking\n    return callback(ctx);\n  }\n\n  /**\n   *  The HEAD tag can be handled specially, either w/ a 'merge' or 'append' style\n   *\n   * @param {Element} oldHead\n   * @param {Element} newHead\n   * @param {MorphContext} ctx\n   * @returns {Promise<void>[]}\n   */\n  function handleHeadElement(oldHead, newHead, ctx) {\n    let added = [];\n    let removed = [];\n    let preserved = [];\n    let nodesToAppend = [];\n\n    // put all new head elements into a Map, by their outerHTML\n    let srcToNewHeadNodes = new Map();\n    for (const newHeadChild of newHead.children) {\n      srcToNewHeadNodes.set(newHeadChild.outerHTML, newHeadChild);\n    }\n\n    // for each elt in the current head\n    for (const currentHeadElt of oldHead.children) {\n      // If the current head element is in the map\n      let inNewContent = srcToNewHeadNodes.has(currentHeadElt.outerHTML);\n      let isReAppended = ctx.head.shouldReAppend(currentHeadElt);\n      let isPreserved = ctx.head.shouldPreserve(currentHeadElt);\n      if (inNewContent || isPreserved) {\n        if (isReAppended) {\n          // remove the current version and let the new version replace it and re-execute\n          removed.push(currentHeadElt);\n        } else {\n          // this element already exists and should not be re-appended, so remove it from\n          // the new content map, preserving it in the DOM\n          srcToNewHeadNodes.delete(currentHeadElt.outerHTML);\n          preserved.push(currentHeadElt);\n        }\n      } else {\n        if (ctx.head.style === \"append\") {\n          // we are appending and this existing element is not new content\n          // so if and only if it is marked for re-append do we do anything\n          if (isReAppended) {\n            removed.push(currentHeadElt);\n            nodesToAppend.push(currentHeadElt);\n          }\n        } else {\n          // if this is a merge, we remove this content since it is not in the new head\n          if (ctx.head.shouldRemove(currentHeadElt) !== false) {\n            removed.push(currentHeadElt);\n          }\n        }\n      }\n    }\n\n    // Push the remaining new head elements in the Map into the\n    // nodes to append to the head tag\n    nodesToAppend.push(...srcToNewHeadNodes.values());\n\n    let promises = [];\n    for (const newNode of nodesToAppend) {\n      // TODO: This could theoretically be null, based on type\n      let newElt = /** @type {ChildNode} */ (\n        document.createRange().createContextualFragment(newNode.outerHTML)\n          .firstChild\n      );\n      if (ctx.callbacks.beforeNodeAdded(newElt) !== false) {\n        if (\n          (\"href\" in newElt && newElt.href) ||\n          (\"src\" in newElt && newElt.src)\n        ) {\n          /** @type {(result?: any) => void} */ let resolve;\n          let promise = new Promise(function (_resolve) {\n            resolve = _resolve;\n          });\n          newElt.addEventListener(\"load\", function () {\n            resolve();\n          });\n          promises.push(promise);\n        }\n        oldHead.appendChild(newElt);\n        ctx.callbacks.afterNodeAdded(newElt);\n        added.push(newElt);\n      }\n    }\n\n    // remove all removed elements, after we have appended the new elements to avoid\n    // additional network requests for things like style sheets\n    for (const removedElement of removed) {\n      if (ctx.callbacks.beforeNodeRemoved(removedElement) !== false) {\n        oldHead.removeChild(removedElement);\n        ctx.callbacks.afterNodeRemoved(removedElement);\n      }\n    }\n\n    ctx.head.afterHeadMorphed(oldHead, {\n      added: added,\n      kept: preserved,\n      removed: removed,\n    });\n    return promises;\n  }\n\n  //=============================================================================\n  // Create Morph Context Functions\n  //=============================================================================\n  const createMorphContext = (function () {\n    /**\n     *\n     * @param {Element} oldNode\n     * @param {Element} newContent\n     * @param {Config} config\n     * @returns {MorphContext}\n     */\n    function createMorphContext(oldNode, newContent, config) {\n      const { persistentIds, idMap } = createIdMaps(oldNode, newContent);\n\n      const mergedConfig = mergeDefaults(config);\n      const morphStyle = mergedConfig.morphStyle || \"outerHTML\";\n      if (![\"innerHTML\", \"outerHTML\"].includes(morphStyle)) {\n        throw `Do not understand how to morph style ${morphStyle}`;\n      }\n\n      return {\n        target: oldNode,\n        newContent: newContent,\n        config: mergedConfig,\n        morphStyle: morphStyle,\n        ignoreActive: mergedConfig.ignoreActive,\n        ignoreActiveValue: mergedConfig.ignoreActiveValue,\n        restoreFocus: mergedConfig.restoreFocus,\n        idMap: idMap,\n        persistentIds: persistentIds,\n        pantry: createPantry(),\n        activeElementAndParents: createActiveElementAndParents(oldNode),\n        callbacks: mergedConfig.callbacks,\n        head: mergedConfig.head,\n      };\n    }\n\n    /**\n     * Deep merges the config object and the Idiomorph.defaults object to\n     * produce a final configuration object\n     * @param {Config} config\n     * @returns {ConfigInternal}\n     */\n    function mergeDefaults(config) {\n      let finalConfig = Object.assign({}, defaults);\n\n      // copy top level stuff into final config\n      Object.assign(finalConfig, config);\n\n      // copy callbacks into final config (do this to deep merge the callbacks)\n      finalConfig.callbacks = Object.assign(\n        {},\n        defaults.callbacks,\n        config.callbacks,\n      );\n\n      // copy head config into final config  (do this to deep merge the head)\n      finalConfig.head = Object.assign({}, defaults.head, config.head);\n\n      return finalConfig;\n    }\n\n    /**\n     * @returns {HTMLDivElement}\n     */\n    function createPantry() {\n      const pantry = document.createElement(\"div\");\n      pantry.hidden = true;\n      document.body.insertAdjacentElement(\"afterend\", pantry);\n      return pantry;\n    }\n\n    /**\n     * @param {Element} oldNode\n     * @returns {Element[]}\n     */\n    function createActiveElementAndParents(oldNode) {\n      /** @type {Element[]} */\n      let activeElementAndParents = [];\n      let elt = document.activeElement;\n      if (elt?.tagName !== \"BODY\" && oldNode.contains(elt)) {\n        while (elt) {\n          activeElementAndParents.push(elt);\n          if (elt === oldNode) break;\n          elt = elt.parentElement;\n        }\n      }\n      return activeElementAndParents;\n    }\n\n    /**\n     * Returns all elements with an ID contained within the root element and its descendants\n     *\n     * @param {Element} root\n     * @returns {Element[]}\n     */\n    function findIdElements(root) {\n      let elements = Array.from(root.querySelectorAll(\"[id]\"));\n      // root could be a document fragment which doesn't have `getAttribute`\n      if (root.getAttribute?.(\"id\")) {\n        elements.push(root);\n      }\n      return elements;\n    }\n\n    /**\n     * A bottom-up algorithm that populates a map of Element -> IdSet.\n     * The idSet for a given element is the set of all IDs contained within its subtree.\n     * As an optimzation, we filter these IDs through the given list of persistent IDs,\n     * because we don't need to bother considering IDed elements that won't be in the new content.\n     *\n     * @param {Map<Node, Set<string>>} idMap\n     * @param {Set<string>} persistentIds\n     * @param {Element} root\n     * @param {Element[]} elements\n     */\n    function populateIdMapWithTree(idMap, persistentIds, root, elements) {\n      for (const elt of elements) {\n        // we can pretend id is non-null String, because the .has line will reject it immediately if not\n        const id = /** @type {String} */ (elt.getAttribute(\"id\"));\n        if (persistentIds.has(id)) {\n          /** @type {Element|null} */\n          let current = elt;\n          // walk up the parent hierarchy of that element, adding the id\n          // of element to the parent's id set\n          while (current) {\n            let idSet = idMap.get(current);\n            // if the id set doesn't exist, create it and insert it in the map\n            if (idSet == null) {\n              idSet = new Set();\n              idMap.set(current, idSet);\n            }\n            idSet.add(id);\n\n            if (current === root) break;\n            current = current.parentElement;\n          }\n        }\n      }\n    }\n\n    /**\n     * This function computes a map of nodes to all ids contained within that node (inclusive of the\n     * node).  This map can be used to ask if two nodes have intersecting sets of ids, which allows\n     * for a looser definition of \"matching\" than tradition id matching, and allows child nodes\n     * to contribute to a parent nodes matching.\n     *\n     * @param {Element} oldContent  the old content that will be morphed\n     * @param {Element} newContent  the new content to morph to\n     * @returns {IdSets}\n     */\n    function createIdMaps(oldContent, newContent) {\n      const oldIdElements = findIdElements(oldContent);\n      const newIdElements = findIdElements(newContent);\n\n      const persistentIds = createPersistentIds(oldIdElements, newIdElements);\n\n      /** @type {Map<Node, Set<string>>} */\n      let idMap = new Map();\n      populateIdMapWithTree(idMap, persistentIds, oldContent, oldIdElements);\n\n      /** @ts-ignore - if newContent is a duck-typed parent, pass its single child node as the root to halt upwards iteration */\n      const newRoot = newContent.__idiomorphRoot || newContent;\n      populateIdMapWithTree(idMap, persistentIds, newRoot, newIdElements);\n\n      return { persistentIds, idMap };\n    }\n\n    /**\n     * This function computes the set of ids that persist between the two contents excluding duplicates\n     *\n     * @param {Element[]} oldIdElements\n     * @param {Element[]} newIdElements\n     * @returns {Set<string>}\n     */\n    function createPersistentIds(oldIdElements, newIdElements) {\n      let duplicateIds = new Set();\n\n      /** @type {Map<string, string>} */\n      let oldIdTagNameMap = new Map();\n      for (const { id, tagName } of oldIdElements) {\n        if (oldIdTagNameMap.has(id)) {\n          duplicateIds.add(id);\n        } else {\n          oldIdTagNameMap.set(id, tagName);\n        }\n      }\n\n      let persistentIds = new Set();\n      for (const { id, tagName } of newIdElements) {\n        if (persistentIds.has(id)) {\n          duplicateIds.add(id);\n        } else if (oldIdTagNameMap.get(id) === tagName) {\n          persistentIds.add(id);\n        }\n        // skip if tag types mismatch because its not possible to morph one tag into another\n      }\n\n      for (const id of duplicateIds) {\n        persistentIds.delete(id);\n      }\n      return persistentIds;\n    }\n\n    return createMorphContext;\n  })();\n\n  //=============================================================================\n  // HTML Normalization Functions\n  //=============================================================================\n  const { normalizeElement, normalizeParent } = (function () {\n    /** @type {WeakSet<Node>} */\n    const generatedByIdiomorph = new WeakSet();\n\n    /**\n     *\n     * @param {Element | Document} content\n     * @returns {Element}\n     */\n    function normalizeElement(content) {\n      if (content instanceof Document) {\n        return content.documentElement;\n      } else {\n        return content;\n      }\n    }\n\n    /**\n     *\n     * @param {null | string | Node | HTMLCollection | Node[] | Document & {generatedByIdiomorph:boolean}} newContent\n     * @returns {Element}\n     */\n    function normalizeParent(newContent) {\n      if (newContent == null) {\n        return document.createElement(\"div\"); // dummy parent element\n      } else if (typeof newContent === \"string\") {\n        return normalizeParent(parseContent(newContent));\n      } else if (\n        generatedByIdiomorph.has(/** @type {Element} */ (newContent))\n      ) {\n        // the template tag created by idiomorph parsing can serve as a dummy parent\n        return /** @type {Element} */ (newContent);\n      } else if (newContent instanceof Node) {\n        if (newContent.parentNode) {\n          // we can't use the parent directly because newContent may have siblings\n          // that we don't want in the morph, and reparenting might be expensive (TODO is it?),\n          // so instead we create a fake parent node that only sees a slice of its children.\n          /** @type {Element} */\n          return /** @type {any} */ (new SlicedParentNode(newContent));\n        } else {\n          // a single node is added as a child to a dummy parent\n          const dummyParent = document.createElement(\"div\");\n          dummyParent.append(newContent);\n          return dummyParent;\n        }\n      } else {\n        // all nodes in the array or HTMLElement collection are consolidated under\n        // a single dummy parent element\n        const dummyParent = document.createElement(\"div\");\n        for (const elt of [...newContent]) {\n          dummyParent.append(elt);\n        }\n        return dummyParent;\n      }\n    }\n\n    /**\n     * A fake duck-typed parent element to wrap a single node, without actually reparenting it.\n     * This is useful because the node may have siblings that we don't want in the morph, and it may also be moved\n     * or replaced with one or more elements during the morph. This class effectively allows us a window into\n     * a slice of a node's children.\n     * \"If it walks like a duck, and quacks like a duck, then it must be a duck!\" -- James Whitcomb Riley (1849\u20131916)\n     */\n    class SlicedParentNode {\n      /** @param {Node} node */\n      constructor(node) {\n        this.originalNode = node;\n        this.realParentNode = /** @type {Element} */ (node.parentNode);\n        this.previousSibling = node.previousSibling;\n        this.nextSibling = node.nextSibling;\n      }\n\n      /** @returns {Node[]} */\n      get childNodes() {\n        // return slice of realParent's current childNodes, based on previousSibling and nextSibling\n        const nodes = [];\n        let cursor = this.previousSibling\n          ? this.previousSibling.nextSibling\n          : this.realParentNode.firstChild;\n        while (cursor && cursor != this.nextSibling) {\n          nodes.push(cursor);\n          cursor = cursor.nextSibling;\n        }\n        return nodes;\n      }\n\n      /**\n       * @param {string} selector\n       * @returns {Element[]}\n       */\n      querySelectorAll(selector) {\n        return this.childNodes.reduce((results, node) => {\n          if (node instanceof Element) {\n            if (node.matches(selector)) results.push(node);\n            const nodeList = node.querySelectorAll(selector);\n            for (let i = 0; i < nodeList.length; i++) {\n              results.push(nodeList[i]);\n            }\n          }\n          return results;\n        }, /** @type {Element[]} */ ([]));\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      insertBefore(node, referenceNode) {\n        return this.realParentNode.insertBefore(node, referenceNode);\n      }\n\n      /**\n       * @param {Node} node\n       * @param {Node} referenceNode\n       * @returns {Node}\n       */\n      moveBefore(node, referenceNode) {\n        // @ts-ignore - use new moveBefore feature\n        return this.realParentNode.moveBefore(node, referenceNode);\n      }\n\n      /**\n       * for later use with populateIdMapWithTree to halt upwards iteration\n       * @returns {Node}\n       */\n      get __idiomorphRoot() {\n        return this.originalNode;\n      }\n    }\n\n    /**\n     *\n     * @param {string} newContent\n     * @returns {Node | null | DocumentFragment}\n     */\n    function parseContent(newContent) {\n      let parser = new DOMParser();\n\n      // remove svgs to avoid false-positive matches on head, etc.\n      let contentWithSvgsRemoved = newContent.replace(\n        /<svg(\\s[^>]*>|>)([\\s\\S]*?)<\\/svg>/gim,\n        \"\",\n      );\n\n      // if the newContent contains a html, head or body tag, we can simply parse it w/o wrapping\n      if (\n        contentWithSvgsRemoved.match(/<\\/html>/) ||\n        contentWithSvgsRemoved.match(/<\\/head>/) ||\n        contentWithSvgsRemoved.match(/<\\/body>/)\n      ) {\n        let content = parser.parseFromString(newContent, \"text/html\");\n        // if it is a full HTML document, return the document itself as the parent container\n        if (contentWithSvgsRemoved.match(/<\\/html>/)) {\n          generatedByIdiomorph.add(content);\n          return content;\n        } else {\n          // otherwise return the html element as the parent container\n          let htmlElement = content.firstChild;\n          if (htmlElement) {\n            generatedByIdiomorph.add(htmlElement);\n          }\n          return htmlElement;\n        }\n      } else {\n        // if it is partial HTML, wrap it in a template tag to provide a parent element and also to help\n        // deal with touchy tags like tr, tbody, etc.\n        let responseDoc = parser.parseFromString(\n          \"<body><template>\" + newContent + \"</template></body>\",\n          \"text/html\",\n        );\n        let content = /** @type {HTMLTemplateElement} */ (\n          responseDoc.body.querySelector(\"template\")\n        ).content;\n        generatedByIdiomorph.add(content);\n        return content;\n      }\n    }\n\n    return { normalizeElement, normalizeParent };\n  })();\n\n  //=============================================================================\n  // This is what ends up becoming the Idiomorph global object\n  //=============================================================================\n  return {\n    morph,\n    defaults,\n  };\n})();\n\n/**\n * Morph the state of the currentElement based on the attributes and contents of\n * the newElement. Morphing may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing changes\n * @param newElement Element source of morphing changes\n */\nfunction morphElements(currentElement, newElement, { callbacks, ...options } = {}) {\n  Idiomorph.morph(currentElement, newElement, {\n    ...options,\n    callbacks: new DefaultIdiomorphCallbacks(callbacks)\n  });\n}\n\n/**\n * Morph the child elements of the currentElement based on the child elements of\n * the newElement. Morphing children may dispatch turbo:before-morph-element,\n * turbo:before-morph-attribute, and turbo:morph-element events.\n *\n * @param currentElement Element destination of morphing children changes\n * @param newElement Element source of morphing children changes\n */\nfunction morphChildren(currentElement, newElement, options = {}) {\n  morphElements(currentElement, newElement.childNodes, {\n    ...options,\n    morphStyle: \"innerHTML\"\n  });\n}\n\nfunction shouldRefreshFrameWithMorphing(currentFrame, newFrame) {\n  return currentFrame instanceof FrameElement &&\n    currentFrame.shouldReloadWithMorph && (!newFrame || areFramesCompatibleForRefreshing(currentFrame, newFrame)) &&\n    !currentFrame.closest(\"[data-turbo-permanent]\")\n}\n\nfunction areFramesCompatibleForRefreshing(currentFrame, newFrame) {\n  // newFrame cannot yet be an instance of FrameElement because custom\n  // elements don't get initialized until they're attached to the DOM, so\n  // test its Element#nodeName instead\n  return newFrame instanceof Element && newFrame.nodeName === \"TURBO-FRAME\" && currentFrame.id === newFrame.id &&\n  (!newFrame.getAttribute(\"src\") || urlsAreEqual(currentFrame.src, newFrame.getAttribute(\"src\")))\n}\n\nfunction closestFrameReloadableWithMorphing(node) {\n  return node.parentElement.closest(\"turbo-frame[src][refresh=morph]\")\n}\n\nclass DefaultIdiomorphCallbacks {\n  #beforeNodeMorphed\n\n  constructor({ beforeNodeMorphed } = {}) {\n    this.#beforeNodeMorphed = beforeNodeMorphed || (() => true);\n  }\n\n  beforeNodeAdded = (node) => {\n    return !(node.id && node.hasAttribute(\"data-turbo-permanent\") && document.getElementById(node.id))\n  }\n\n  beforeNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      if (!currentElement.hasAttribute(\"data-turbo-permanent\") && this.#beforeNodeMorphed(currentElement, newElement)) {\n        const event = dispatch(\"turbo:before-morph-element\", {\n          cancelable: true,\n          target: currentElement,\n          detail: { currentElement, newElement }\n        });\n\n        return !event.defaultPrevented\n      } else {\n        return false\n      }\n    }\n  }\n\n  beforeAttributeUpdated = (attributeName, target, mutationType) => {\n    const event = dispatch(\"turbo:before-morph-attribute\", {\n      cancelable: true,\n      target,\n      detail: { attributeName, mutationType }\n    });\n\n    return !event.defaultPrevented\n  }\n\n  beforeNodeRemoved = (node) => {\n    return this.beforeNodeMorphed(node)\n  }\n\n  afterNodeMorphed = (currentElement, newElement) => {\n    if (currentElement instanceof Element) {\n      dispatch(\"turbo:morph-element\", {\n        target: currentElement,\n        detail: { currentElement, newElement }\n      });\n    }\n  }\n}\n\nclass MorphingFrameRenderer extends FrameRenderer {\n  static renderElement(currentElement, newElement) {\n    dispatch(\"turbo:before-frame-morph\", {\n      target: currentElement,\n      detail: { currentElement, newElement }\n    });\n\n    morphChildren(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              closestFrameReloadableWithMorphing(node) === currentElement\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n}\n\nclass ProgressBar {\n  static animationDuration = 300 /*ms*/\n\n  static get defaultCSS() {\n    return unindent`\n      .turbo-progress-bar {\n        position: fixed;\n        display: block;\n        top: 0;\n        left: 0;\n        height: 3px;\n        background: #0076ff;\n        z-index: 2147483647;\n        transition:\n          width ${ProgressBar.animationDuration}ms ease-out,\n          opacity ${ProgressBar.animationDuration / 2}ms ${ProgressBar.animationDuration / 2}ms ease-in;\n        transform: translate3d(0, 0, 0);\n      }\n    `\n  }\n\n  hiding = false\n  value = 0\n  visible = false\n\n  constructor() {\n    this.stylesheetElement = this.createStylesheetElement();\n    this.progressElement = this.createProgressElement();\n    this.installStylesheetElement();\n    this.setValue(0);\n  }\n\n  show() {\n    if (!this.visible) {\n      this.visible = true;\n      this.installProgressElement();\n      this.startTrickling();\n    }\n  }\n\n  hide() {\n    if (this.visible && !this.hiding) {\n      this.hiding = true;\n      this.fadeProgressElement(() => {\n        this.uninstallProgressElement();\n        this.stopTrickling();\n        this.visible = false;\n        this.hiding = false;\n      });\n    }\n  }\n\n  setValue(value) {\n    this.value = value;\n    this.refresh();\n  }\n\n  // Private\n\n  installStylesheetElement() {\n    document.head.insertBefore(this.stylesheetElement, document.head.firstChild);\n  }\n\n  installProgressElement() {\n    this.progressElement.style.width = \"0\";\n    this.progressElement.style.opacity = \"1\";\n    document.documentElement.insertBefore(this.progressElement, document.body);\n    this.refresh();\n  }\n\n  fadeProgressElement(callback) {\n    this.progressElement.style.opacity = \"0\";\n    setTimeout(callback, ProgressBar.animationDuration * 1.5);\n  }\n\n  uninstallProgressElement() {\n    if (this.progressElement.parentNode) {\n      document.documentElement.removeChild(this.progressElement);\n    }\n  }\n\n  startTrickling() {\n    if (!this.trickleInterval) {\n      this.trickleInterval = window.setInterval(this.trickle, ProgressBar.animationDuration);\n    }\n  }\n\n  stopTrickling() {\n    window.clearInterval(this.trickleInterval);\n    delete this.trickleInterval;\n  }\n\n  trickle = () => {\n    this.setValue(this.value + Math.random() / 100);\n  }\n\n  refresh() {\n    requestAnimationFrame(() => {\n      this.progressElement.style.width = `${10 + this.value * 90}%`;\n    });\n  }\n\n  createStylesheetElement() {\n    const element = document.createElement(\"style\");\n    element.type = \"text/css\";\n    element.textContent = ProgressBar.defaultCSS;\n    const cspNonce = getCspNonce();\n    if (cspNonce) {\n      element.nonce = cspNonce;\n    }\n    return element\n  }\n\n  createProgressElement() {\n    const element = document.createElement(\"div\");\n    element.className = \"turbo-progress-bar\";\n    return element\n  }\n}\n\nclass HeadSnapshot extends Snapshot {\n  detailsByOuterHTML = this.children\n    .filter((element) => !elementIsNoscript(element))\n    .map((element) => elementWithoutNonce(element))\n    .reduce((result, element) => {\n      const { outerHTML } = element;\n      const details =\n        outerHTML in result\n          ? result[outerHTML]\n          : {\n              type: elementType(element),\n              tracked: elementIsTracked(element),\n              elements: []\n            };\n      return {\n        ...result,\n        [outerHTML]: {\n          ...details,\n          elements: [...details.elements, element]\n        }\n      }\n    }, {})\n\n  get trackedElementSignature() {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => this.detailsByOuterHTML[outerHTML].tracked)\n      .join(\"\")\n  }\n\n  getScriptElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"script\", snapshot)\n  }\n\n  getStylesheetElementsNotInSnapshot(snapshot) {\n    return this.getElementsMatchingTypeNotInSnapshot(\"stylesheet\", snapshot)\n  }\n\n  getElementsMatchingTypeNotInSnapshot(matchedType, snapshot) {\n    return Object.keys(this.detailsByOuterHTML)\n      .filter((outerHTML) => !(outerHTML in snapshot.detailsByOuterHTML))\n      .map((outerHTML) => this.detailsByOuterHTML[outerHTML])\n      .filter(({ type }) => type == matchedType)\n      .map(({ elements: [element] }) => element)\n  }\n\n  get provisionalElements() {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const { type, tracked, elements } = this.detailsByOuterHTML[outerHTML];\n      if (type == null && !tracked) {\n        return [...result, ...elements]\n      } else if (elements.length > 1) {\n        return [...result, ...elements.slice(1)]\n      } else {\n        return result\n      }\n    }, [])\n  }\n\n  getMetaValue(name) {\n    const element = this.findMetaElementByName(name);\n    return element ? element.getAttribute(\"content\") : null\n  }\n\n  findMetaElementByName(name) {\n    return Object.keys(this.detailsByOuterHTML).reduce((result, outerHTML) => {\n      const {\n        elements: [element]\n      } = this.detailsByOuterHTML[outerHTML];\n      return elementIsMetaElementWithName(element, name) ? element : result\n    }, undefined | undefined)\n  }\n}\n\nfunction elementType(element) {\n  if (elementIsScript(element)) {\n    return \"script\"\n  } else if (elementIsStylesheet(element)) {\n    return \"stylesheet\"\n  }\n}\n\nfunction elementIsTracked(element) {\n  return element.getAttribute(\"data-turbo-track\") == \"reload\"\n}\n\nfunction elementIsScript(element) {\n  const tagName = element.localName;\n  return tagName == \"script\"\n}\n\nfunction elementIsNoscript(element) {\n  const tagName = element.localName;\n  return tagName == \"noscript\"\n}\n\nfunction elementIsStylesheet(element) {\n  const tagName = element.localName;\n  return tagName == \"style\" || (tagName == \"link\" && element.getAttribute(\"rel\") == \"stylesheet\")\n}\n\nfunction elementIsMetaElementWithName(element, name) {\n  const tagName = element.localName;\n  return tagName == \"meta\" && element.getAttribute(\"name\") == name\n}\n\nfunction elementWithoutNonce(element) {\n  if (element.hasAttribute(\"nonce\")) {\n    element.setAttribute(\"nonce\", \"\");\n  }\n\n  return element\n}\n\nclass PageSnapshot extends Snapshot {\n  static fromHTMLString(html = \"\") {\n    return this.fromDocument(parseHTMLDocument(html))\n  }\n\n  static fromElement(element) {\n    return this.fromDocument(element.ownerDocument)\n  }\n\n  static fromDocument({ documentElement, body, head }) {\n    return new this(documentElement, body, new HeadSnapshot(head))\n  }\n\n  constructor(documentElement, body, headSnapshot) {\n    super(body);\n    this.documentElement = documentElement;\n    this.headSnapshot = headSnapshot;\n  }\n\n  clone() {\n    const clonedElement = this.element.cloneNode(true);\n\n    const selectElements = this.element.querySelectorAll(\"select\");\n    const clonedSelectElements = clonedElement.querySelectorAll(\"select\");\n\n    for (const [index, source] of selectElements.entries()) {\n      const clone = clonedSelectElements[index];\n      for (const option of clone.selectedOptions) option.selected = false;\n      for (const option of source.selectedOptions) clone.options[option.index].selected = true;\n    }\n\n    for (const clonedPasswordInput of clonedElement.querySelectorAll('input[type=\"password\"]')) {\n      clonedPasswordInput.value = \"\";\n    }\n\n    for (const clonedNoscriptElement of clonedElement.querySelectorAll(\"noscript\")) {\n      clonedNoscriptElement.remove();\n    }\n\n    return new PageSnapshot(this.documentElement, clonedElement, this.headSnapshot)\n  }\n\n  get lang() {\n    return this.documentElement.getAttribute(\"lang\")\n  }\n\n  get dir() {\n    return this.documentElement.getAttribute(\"dir\")\n  }\n\n  get headElement() {\n    return this.headSnapshot.element\n  }\n\n  get rootLocation() {\n    const root = this.getSetting(\"root\") ?? \"/\";\n    return expandURL(root)\n  }\n\n  get cacheControlValue() {\n    return this.getSetting(\"cache-control\")\n  }\n\n  get isPreviewable() {\n    return this.cacheControlValue != \"no-preview\"\n  }\n\n  get isCacheable() {\n    return this.cacheControlValue != \"no-cache\"\n  }\n\n  get isVisitable() {\n    return this.getSetting(\"visit-control\") != \"reload\"\n  }\n\n  get prefersViewTransitions() {\n    const viewTransitionEnabled = this.getSetting(\"view-transition\") === \"true\" || this.headSnapshot.getMetaValue(\"view-transition\") === \"same-origin\";\n    return viewTransitionEnabled && !window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n  }\n\n  get refreshMethod() {\n    return this.getSetting(\"refresh-method\")\n  }\n\n  get refreshScroll() {\n    return this.getSetting(\"refresh-scroll\")\n  }\n\n  // Private\n\n  getSetting(name) {\n    return this.headSnapshot.getMetaValue(`turbo-${name}`)\n  }\n}\n\nclass ViewTransitioner {\n  #viewTransitionStarted = false\n  #lastOperation = Promise.resolve()\n\n  renderChange(useViewTransition, render) {\n    if (useViewTransition && this.viewTransitionsAvailable && !this.#viewTransitionStarted) {\n      this.#viewTransitionStarted = true;\n      this.#lastOperation = this.#lastOperation.then(async () => {\n        await document.startViewTransition(render).finished;\n      });\n    } else {\n      this.#lastOperation = this.#lastOperation.then(render);\n    }\n\n    return this.#lastOperation\n  }\n\n  get viewTransitionsAvailable() {\n    return document.startViewTransition\n  }\n}\n\nconst defaultOptions = {\n  action: \"advance\",\n  historyChanged: false,\n  visitCachedSnapshot: () => {},\n  willRender: true,\n  updateHistory: true,\n  shouldCacheSnapshot: true,\n  acceptsStreamResponse: false,\n  refresh: {}\n};\n\nconst TimingMetric = {\n  visitStart: \"visitStart\",\n  requestStart: \"requestStart\",\n  requestEnd: \"requestEnd\",\n  visitEnd: \"visitEnd\"\n};\n\nconst VisitState = {\n  initialized: \"initialized\",\n  started: \"started\",\n  canceled: \"canceled\",\n  failed: \"failed\",\n  completed: \"completed\"\n};\n\nconst SystemStatusCode = {\n  networkFailure: 0,\n  timeoutFailure: -1,\n  contentTypeMismatch: -2\n};\n\nconst Direction = {\n  advance: \"forward\",\n  restore: \"back\",\n  replace: \"none\"\n};\n\nclass Visit {\n  identifier = uuid() // Required by turbo-ios\n  timingMetrics = {}\n\n  followedRedirect = false\n  historyChanged = false\n  scrolled = false\n  shouldCacheSnapshot = true\n  acceptsStreamResponse = false\n  snapshotCached = false\n  state = VisitState.initialized\n  viewTransitioner = new ViewTransitioner()\n\n  constructor(delegate, location, restorationIdentifier, options = {}) {\n    this.delegate = delegate;\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier || uuid();\n\n    const {\n      action,\n      historyChanged,\n      referrer,\n      snapshot,\n      snapshotHTML,\n      response,\n      visitCachedSnapshot,\n      willRender,\n      updateHistory,\n      shouldCacheSnapshot,\n      acceptsStreamResponse,\n      direction,\n      refresh\n    } = {\n      ...defaultOptions,\n      ...options\n    };\n    this.action = action;\n    this.historyChanged = historyChanged;\n    this.referrer = referrer;\n    this.snapshot = snapshot;\n    this.snapshotHTML = snapshotHTML;\n    this.response = response;\n    this.isPageRefresh = this.view.isPageRefresh(this);\n    this.visitCachedSnapshot = visitCachedSnapshot;\n    this.willRender = willRender;\n    this.updateHistory = updateHistory;\n    this.scrolled = !willRender;\n    this.shouldCacheSnapshot = shouldCacheSnapshot;\n    this.acceptsStreamResponse = acceptsStreamResponse;\n    this.direction = direction || Direction[action];\n    this.refresh = refresh;\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  get restorationData() {\n    return this.history.getRestorationDataForIdentifier(this.restorationIdentifier)\n  }\n\n  start() {\n    if (this.state == VisitState.initialized) {\n      this.recordTimingMetric(TimingMetric.visitStart);\n      this.state = VisitState.started;\n      this.adapter.visitStarted(this);\n      this.delegate.visitStarted(this);\n    }\n  }\n\n  cancel() {\n    if (this.state == VisitState.started) {\n      if (this.request) {\n        this.request.cancel();\n      }\n      this.cancelRender();\n      this.state = VisitState.canceled;\n    }\n  }\n\n  complete() {\n    if (this.state == VisitState.started) {\n      this.recordTimingMetric(TimingMetric.visitEnd);\n      this.adapter.visitCompleted(this);\n      this.state = VisitState.completed;\n      this.followRedirect();\n\n      if (!this.followedRedirect) {\n        this.delegate.visitCompleted(this);\n      }\n    }\n  }\n\n  fail() {\n    if (this.state == VisitState.started) {\n      this.state = VisitState.failed;\n      this.adapter.visitFailed(this);\n      this.delegate.visitCompleted(this);\n    }\n  }\n\n  changeHistory() {\n    if (!this.historyChanged && this.updateHistory) {\n      const actionForHistory = this.location.href === this.referrer?.href ? \"replace\" : this.action;\n      const method = getHistoryMethodForAction(actionForHistory);\n      this.history.update(method, this.location, this.restorationIdentifier);\n      this.historyChanged = true;\n    }\n  }\n\n  issueRequest() {\n    if (this.hasPreloadedResponse()) {\n      this.simulateRequest();\n    } else if (this.shouldIssueRequest() && !this.request) {\n      this.request = new FetchRequest(this, FetchMethod.get, this.location);\n      this.request.perform();\n    }\n  }\n\n  simulateRequest() {\n    if (this.response) {\n      this.startRequest();\n      this.recordResponse();\n      this.finishRequest();\n    }\n  }\n\n  startRequest() {\n    this.recordTimingMetric(TimingMetric.requestStart);\n    this.adapter.visitRequestStarted(this);\n  }\n\n  recordResponse(response = this.response) {\n    this.response = response;\n    if (response) {\n      const { statusCode } = response;\n      if (isSuccessful(statusCode)) {\n        this.adapter.visitRequestCompleted(this);\n      } else {\n        this.adapter.visitRequestFailedWithStatusCode(this, statusCode);\n      }\n    }\n  }\n\n  finishRequest() {\n    this.recordTimingMetric(TimingMetric.requestEnd);\n    this.adapter.visitRequestFinished(this);\n  }\n\n  loadResponse() {\n    if (this.response) {\n      const { statusCode, responseHTML } = this.response;\n      this.render(async () => {\n        if (this.shouldCacheSnapshot) this.cacheSnapshot();\n        if (this.view.renderPromise) await this.view.renderPromise;\n\n        if (isSuccessful(statusCode) && responseHTML != null) {\n          const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n          await this.renderPageSnapshot(snapshot, false);\n\n          this.adapter.visitRendered(this);\n          this.complete();\n        } else {\n          await this.view.renderError(PageSnapshot.fromHTMLString(responseHTML), this);\n          this.adapter.visitRendered(this);\n          this.fail();\n        }\n      });\n    }\n  }\n\n  getCachedSnapshot() {\n    const snapshot = this.view.getCachedSnapshotForLocation(this.location) || this.getPreloadedSnapshot();\n\n    if (snapshot && (!getAnchor(this.location) || snapshot.hasAnchor(getAnchor(this.location)))) {\n      if (this.action == \"restore\" || snapshot.isPreviewable) {\n        return snapshot\n      }\n    }\n  }\n\n  getPreloadedSnapshot() {\n    if (this.snapshotHTML) {\n      return PageSnapshot.fromHTMLString(this.snapshotHTML)\n    }\n  }\n\n  hasCachedSnapshot() {\n    return this.getCachedSnapshot() != null\n  }\n\n  loadCachedSnapshot() {\n    const snapshot = this.getCachedSnapshot();\n    if (snapshot) {\n      const isPreview = this.shouldIssueRequest();\n      this.render(async () => {\n        this.cacheSnapshot();\n        if (this.isPageRefresh) {\n          this.adapter.visitRendered(this);\n        } else {\n          if (this.view.renderPromise) await this.view.renderPromise;\n\n          await this.renderPageSnapshot(snapshot, isPreview);\n\n          this.adapter.visitRendered(this);\n          if (!isPreview) {\n            this.complete();\n          }\n        }\n      });\n    }\n  }\n\n  followRedirect() {\n    if (this.redirectedToLocation && !this.followedRedirect && this.response?.redirected) {\n      this.adapter.visitProposedToLocation(this.redirectedToLocation, {\n        action: \"replace\",\n        response: this.response,\n        shouldCacheSnapshot: false,\n        willRender: false\n      });\n      this.followedRedirect = true;\n    }\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request) {\n    if (this.acceptsStreamResponse) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted() {\n    this.startRequest();\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {}\n\n  async requestSucceededWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.redirectedToLocation = response.redirected ? response.location : undefined;\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  async requestFailedWithResponse(request, response) {\n    const responseHTML = await response.responseHTML;\n    const { redirected, statusCode } = response;\n    if (responseHTML == undefined) {\n      this.recordResponse({\n        statusCode: SystemStatusCode.contentTypeMismatch,\n        redirected\n      });\n    } else {\n      this.recordResponse({ statusCode: statusCode, responseHTML, redirected });\n    }\n  }\n\n  requestErrored(_request, _error) {\n    this.recordResponse({\n      statusCode: SystemStatusCode.networkFailure,\n      redirected: false\n    });\n  }\n\n  requestFinished() {\n    this.finishRequest();\n  }\n\n  // Scrolling\n\n  performScroll() {\n    if (!this.scrolled && !this.view.forceReloaded && !this.view.shouldPreserveScrollPosition(this)) {\n      if (this.action == \"restore\") {\n        this.scrollToRestoredPosition() || this.scrollToAnchor() || this.view.scrollToTop();\n      } else {\n        this.scrollToAnchor() || this.view.scrollToTop();\n      }\n\n      this.scrolled = true;\n    }\n  }\n\n  scrollToRestoredPosition() {\n    const { scrollPosition } = this.restorationData;\n    if (scrollPosition) {\n      this.view.scrollToPosition(scrollPosition);\n      return true\n    }\n  }\n\n  scrollToAnchor() {\n    const anchor = getAnchor(this.location);\n    if (anchor != null) {\n      this.view.scrollToAnchor(anchor);\n      return true\n    }\n  }\n\n  // Instrumentation\n\n  recordTimingMetric(metric) {\n    this.timingMetrics[metric] = new Date().getTime();\n  }\n\n  getTimingMetrics() {\n    return { ...this.timingMetrics }\n  }\n\n  // Private\n\n  hasPreloadedResponse() {\n    return typeof this.response == \"object\"\n  }\n\n  shouldIssueRequest() {\n    if (this.action == \"restore\") {\n      return !this.hasCachedSnapshot()\n    } else {\n      return this.willRender\n    }\n  }\n\n  cacheSnapshot() {\n    if (!this.snapshotCached) {\n      this.view.cacheSnapshot(this.snapshot).then((snapshot) => snapshot && this.visitCachedSnapshot(snapshot));\n      this.snapshotCached = true;\n    }\n  }\n\n  async render(callback) {\n    this.cancelRender();\n    await new Promise((resolve) => {\n      this.frame =\n        document.visibilityState === \"hidden\" ? setTimeout(() => resolve(), 0) : requestAnimationFrame(() => resolve());\n    });\n    await callback();\n    delete this.frame;\n  }\n\n  async renderPageSnapshot(snapshot, isPreview) {\n    await this.viewTransitioner.renderChange(this.view.shouldTransitionTo(snapshot), async () => {\n      await this.view.renderPage(snapshot, isPreview, this.willRender, this);\n      this.performScroll();\n    });\n  }\n\n  cancelRender() {\n    if (this.frame) {\n      cancelAnimationFrame(this.frame);\n      delete this.frame;\n    }\n  }\n}\n\nfunction isSuccessful(statusCode) {\n  return statusCode >= 200 && statusCode < 300\n}\n\nclass BrowserAdapter {\n  progressBar = new ProgressBar()\n\n  constructor(session) {\n    this.session = session;\n  }\n\n  visitProposedToLocation(location, options) {\n    if (locationIsVisitable(location, this.navigator.rootLocation)) {\n      this.navigator.startVisit(location, options?.restorationIdentifier || uuid(), options);\n    } else {\n      window.location.href = location.toString();\n    }\n  }\n\n  visitStarted(visit) {\n    this.location = visit.location;\n    this.redirectedToLocation = null;\n\n    visit.loadCachedSnapshot();\n    visit.issueRequest();\n  }\n\n  visitRequestStarted(visit) {\n    this.progressBar.setValue(0);\n    if (visit.hasCachedSnapshot() || visit.action != \"restore\") {\n      this.showVisitProgressBarAfterDelay();\n    } else {\n      this.showProgressBar();\n    }\n  }\n\n  visitRequestCompleted(visit) {\n    visit.loadResponse();\n\n    if (visit.response.redirected) {\n      this.redirectedToLocation = visit.redirectedToLocation;\n    }\n  }\n\n  visitRequestFailedWithStatusCode(visit, statusCode) {\n    switch (statusCode) {\n      case SystemStatusCode.networkFailure:\n      case SystemStatusCode.timeoutFailure:\n      case SystemStatusCode.contentTypeMismatch:\n        return this.reload({\n          reason: \"request_failed\",\n          context: {\n            statusCode\n          }\n        })\n      default:\n        return visit.loadResponse()\n    }\n  }\n\n  visitRequestFinished(_visit) {}\n\n  visitCompleted(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  pageInvalidated(reason) {\n    this.reload(reason);\n  }\n\n  visitFailed(_visit) {\n    this.progressBar.setValue(1);\n    this.hideVisitProgressBar();\n  }\n\n  visitRendered(_visit) {}\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    return true\n  }\n\n  // Form Submission Delegate\n\n  formSubmissionStarted(_formSubmission) {\n    this.progressBar.setValue(0);\n    this.showFormProgressBarAfterDelay();\n  }\n\n  formSubmissionFinished(_formSubmission) {\n    this.progressBar.setValue(1);\n    this.hideFormProgressBar();\n  }\n\n  // Private\n\n  showVisitProgressBarAfterDelay() {\n    this.visitProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n  }\n\n  hideVisitProgressBar() {\n    this.progressBar.hide();\n    if (this.visitProgressBarTimeout != null) {\n      window.clearTimeout(this.visitProgressBarTimeout);\n      delete this.visitProgressBarTimeout;\n    }\n  }\n\n  showFormProgressBarAfterDelay() {\n    if (this.formProgressBarTimeout == null) {\n      this.formProgressBarTimeout = window.setTimeout(this.showProgressBar, this.session.progressBarDelay);\n    }\n  }\n\n  hideFormProgressBar() {\n    this.progressBar.hide();\n    if (this.formProgressBarTimeout != null) {\n      window.clearTimeout(this.formProgressBarTimeout);\n      delete this.formProgressBarTimeout;\n    }\n  }\n\n  showProgressBar = () => {\n    this.progressBar.show();\n  }\n\n  reload(reason) {\n    dispatch(\"turbo:reload\", { detail: reason });\n\n    window.location.href = (this.redirectedToLocation || this.location)?.toString() || window.location.href;\n  }\n\n  get navigator() {\n    return this.session.navigator\n  }\n}\n\nclass CacheObserver {\n  selector = \"[data-turbo-temporary]\"\n\n  started = false\n\n  start() {\n    if (!this.started) {\n      this.started = true;\n      addEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      this.started = false;\n      removeEventListener(\"turbo:before-cache\", this.removeTemporaryElements, false);\n    }\n  }\n\n  removeTemporaryElements = (_event) => {\n    for (const element of this.temporaryElements) {\n      element.remove();\n    }\n  }\n\n  get temporaryElements() {\n    return [...document.querySelectorAll(this.selector)]\n  }\n}\n\nclass FrameRedirector {\n  constructor(session, element) {\n    this.session = session;\n    this.element = element;\n    this.linkInterceptor = new LinkInterceptor(this, element);\n    this.formSubmitObserver = new FormSubmitObserver(this, element);\n  }\n\n  start() {\n    this.linkInterceptor.start();\n    this.formSubmitObserver.start();\n  }\n\n  stop() {\n    this.linkInterceptor.stop();\n    this.formSubmitObserver.stop();\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldRedirect(element)\n  }\n\n  linkClickIntercepted(element, url, event) {\n    const frame = this.#findFrameElement(element);\n    if (frame) {\n      frame.delegate.linkClickIntercepted(element, url, event);\n    }\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return (\n      element.closest(\"turbo-frame\") == null &&\n      this.#shouldSubmit(element, submitter) &&\n      this.#shouldRedirect(element, submitter)\n    )\n  }\n\n  formSubmitted(element, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n    if (frame) {\n      frame.delegate.formSubmitted(element, submitter);\n    }\n  }\n\n  #shouldSubmit(form, submitter) {\n    const action = getAction$1(form, submitter);\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const rootLocation = expandURL(meta?.content ?? \"/\");\n\n    return this.#shouldRedirect(form, submitter) && locationIsVisitable(action, rootLocation)\n  }\n\n  #shouldRedirect(element, submitter) {\n    const isNavigatable =\n      element instanceof HTMLFormElement\n        ? this.session.submissionIsNavigatable(element, submitter)\n        : this.session.elementIsNavigatable(element);\n\n    if (isNavigatable) {\n      const frame = this.#findFrameElement(element, submitter);\n      return frame ? frame != element.closest(\"turbo-frame\") : false\n    } else {\n      return false\n    }\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = submitter?.getAttribute(\"data-turbo-frame\") || element.getAttribute(\"data-turbo-frame\");\n    if (id && id != \"_top\") {\n      const frame = this.element.querySelector(`#${id}:not([disabled])`);\n      if (frame instanceof FrameElement) {\n        return frame\n      }\n    }\n  }\n}\n\nclass History {\n  location\n  restorationIdentifier = uuid()\n  restorationData = {}\n  started = false\n  currentIndex = 0\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"popstate\", this.onPopState, false);\n      this.currentIndex = history.state?.turbo?.restorationIndex || 0;\n      this.started = true;\n      this.replace(new URL(window.location.href));\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"popstate\", this.onPopState, false);\n      this.started = false;\n    }\n  }\n\n  push(location, restorationIdentifier) {\n    this.update(history.pushState, location, restorationIdentifier);\n  }\n\n  replace(location, restorationIdentifier) {\n    this.update(history.replaceState, location, restorationIdentifier);\n  }\n\n  update(method, location, restorationIdentifier = uuid()) {\n    if (method === history.pushState) ++this.currentIndex;\n\n    const state = { turbo: { restorationIdentifier, restorationIndex: this.currentIndex } };\n    method.call(history, state, \"\", location.href);\n    this.location = location;\n    this.restorationIdentifier = restorationIdentifier;\n  }\n\n  // Restoration data\n\n  getRestorationDataForIdentifier(restorationIdentifier) {\n    return this.restorationData[restorationIdentifier] || {}\n  }\n\n  updateRestorationData(additionalData) {\n    const { restorationIdentifier } = this;\n    const restorationData = this.restorationData[restorationIdentifier];\n    this.restorationData[restorationIdentifier] = {\n      ...restorationData,\n      ...additionalData\n    };\n  }\n\n  // Scroll restoration\n\n  assumeControlOfScrollRestoration() {\n    if (!this.previousScrollRestoration) {\n      this.previousScrollRestoration = history.scrollRestoration ?? \"auto\";\n      history.scrollRestoration = \"manual\";\n    }\n  }\n\n  relinquishControlOfScrollRestoration() {\n    if (this.previousScrollRestoration) {\n      history.scrollRestoration = this.previousScrollRestoration;\n      delete this.previousScrollRestoration;\n    }\n  }\n\n  // Event handlers\n\n  onPopState = (event) => {\n    const { turbo } = event.state || {};\n    this.location = new URL(window.location.href);\n\n    if (turbo) {\n      const { restorationIdentifier, restorationIndex } = turbo;\n      this.restorationIdentifier = restorationIdentifier;\n      const direction = restorationIndex > this.currentIndex ? \"forward\" : \"back\";\n      this.delegate.historyPoppedToLocationWithRestorationIdentifierAndDirection(this.location, restorationIdentifier, direction);\n      this.currentIndex = restorationIndex;\n    } else {\n      this.currentIndex++;\n      this.delegate.historyPoppedWithEmptyState(this.location);\n    }\n  }\n}\n\nclass LinkPrefetchObserver {\n  started = false\n  #prefetchedLink = null\n\n  constructor(delegate, eventTarget) {\n    this.delegate = delegate;\n    this.eventTarget = eventTarget;\n  }\n\n  start() {\n    if (this.started) return\n\n    if (this.eventTarget.readyState === \"loading\") {\n      this.eventTarget.addEventListener(\"DOMContentLoaded\", this.#enable, { once: true });\n    } else {\n      this.#enable();\n    }\n  }\n\n  stop() {\n    if (!this.started) return\n\n    this.eventTarget.removeEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.removeEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.removeEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = false;\n  }\n\n  #enable = () => {\n    this.eventTarget.addEventListener(\"mouseenter\", this.#tryToPrefetchRequest, {\n      capture: true,\n      passive: true\n    });\n    this.eventTarget.addEventListener(\"mouseleave\", this.#cancelRequestIfObsolete, {\n      capture: true,\n      passive: true\n    });\n\n    this.eventTarget.addEventListener(\"turbo:before-fetch-request\", this.#tryToUsePrefetchedRequest, true);\n    this.started = true;\n  }\n\n  #tryToPrefetchRequest = (event) => {\n    if (getMetaContent(\"turbo-prefetch\") === \"false\") return\n\n    const target = event.target;\n    const isLink = target.matches && target.matches(\"a[href]:not([target^=_]):not([download])\");\n\n    if (isLink && this.#isPrefetchable(target)) {\n      const link = target;\n      const location = getLocationForLink(link);\n\n      if (this.delegate.canPrefetchRequestToLocation(link, location)) {\n        this.#prefetchedLink = link;\n\n        const fetchRequest = new FetchRequest(\n          this,\n          FetchMethod.get,\n          location,\n          new URLSearchParams(),\n          target\n        );\n\n        fetchRequest.fetchOptions.priority = \"low\";\n\n        prefetchCache.putLater(location, fetchRequest, this.#cacheTtl);\n      }\n    }\n  }\n\n  #cancelRequestIfObsolete = (event) => {\n    if (event.target === this.#prefetchedLink) this.#cancelPrefetchRequest();\n  }\n\n  #cancelPrefetchRequest = () => {\n    prefetchCache.clear();\n    this.#prefetchedLink = null;\n  }\n\n  #tryToUsePrefetchedRequest = (event) => {\n    if (event.target.tagName !== \"FORM\" && event.detail.fetchOptions.method === \"GET\") {\n      const cached = prefetchCache.get(event.detail.url);\n\n      if (cached) {\n        // User clicked link, use cache response\n        event.detail.fetchRequest = cached;\n      }\n\n      prefetchCache.clear();\n    }\n  }\n\n  prepareRequest(request) {\n    const link = request.target;\n\n    request.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n\n    const turboFrame = link.closest(\"turbo-frame\");\n    const turboFrameTarget = link.getAttribute(\"data-turbo-frame\") || turboFrame?.getAttribute(\"target\") || turboFrame?.id;\n\n    if (turboFrameTarget && turboFrameTarget !== \"_top\") {\n      request.headers[\"Turbo-Frame\"] = turboFrameTarget;\n    }\n  }\n\n  // Fetch request interface\n\n  requestSucceededWithResponse() {}\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  get #cacheTtl() {\n    return Number(getMetaContent(\"turbo-prefetch-cache-time\")) || cacheTtl\n  }\n\n  #isPrefetchable(link) {\n    const href = link.getAttribute(\"href\");\n\n    if (!href) return false\n\n    if (unfetchableLink(link)) return false\n    if (linkToTheSamePage(link)) return false\n    if (linkOptsOut(link)) return false\n    if (nonSafeLink(link)) return false\n    if (eventPrevented(link)) return false\n\n    return true\n  }\n}\n\nconst unfetchableLink = (link) => {\n  return link.origin !== document.location.origin || ![\"http:\", \"https:\"].includes(link.protocol) || link.hasAttribute(\"target\")\n};\n\nconst linkToTheSamePage = (link) => {\n  return (link.pathname + link.search === document.location.pathname + document.location.search) || link.href.startsWith(\"#\")\n};\n\nconst linkOptsOut = (link) => {\n  if (link.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n  if (link.getAttribute(\"data-turbo\") === \"false\") return true\n\n  const turboPrefetchParent = findClosestRecursively(link, \"[data-turbo-prefetch]\");\n  if (turboPrefetchParent && turboPrefetchParent.getAttribute(\"data-turbo-prefetch\") === \"false\") return true\n\n  return false\n};\n\nconst nonSafeLink = (link) => {\n  const turboMethod = link.getAttribute(\"data-turbo-method\");\n  if (turboMethod && turboMethod.toLowerCase() !== \"get\") return true\n\n  if (isUJS(link)) return true\n  if (link.hasAttribute(\"data-turbo-confirm\")) return true\n  if (link.hasAttribute(\"data-turbo-stream\")) return true\n\n  return false\n};\n\nconst isUJS = (link) => {\n  return link.hasAttribute(\"data-remote\") || link.hasAttribute(\"data-behavior\") || link.hasAttribute(\"data-confirm\") || link.hasAttribute(\"data-method\")\n};\n\nconst eventPrevented = (link) => {\n  const event = dispatch(\"turbo:before-prefetch\", { target: link, cancelable: true });\n  return event.defaultPrevented\n};\n\nclass Navigator {\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  proposeVisit(location, options = {}) {\n    if (this.delegate.allowsVisitingLocationWithAction(location, options.action)) {\n      this.delegate.visitProposedToLocation(location, options);\n    }\n  }\n\n  startVisit(locatable, restorationIdentifier, options = {}) {\n    this.stop();\n    this.currentVisit = new Visit(this, expandURL(locatable), restorationIdentifier, {\n      referrer: this.location,\n      ...options\n    });\n    this.currentVisit.start();\n  }\n\n  submitForm(form, submitter) {\n    this.stop();\n    this.formSubmission = new FormSubmission(this, form, submitter, true);\n\n    this.formSubmission.start();\n  }\n\n  stop() {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n      delete this.formSubmission;\n    }\n\n    if (this.currentVisit) {\n      this.currentVisit.cancel();\n      delete this.currentVisit;\n    }\n  }\n\n  get adapter() {\n    return this.delegate.adapter\n  }\n\n  get view() {\n    return this.delegate.view\n  }\n\n  get rootLocation() {\n    return this.view.snapshot.rootLocation\n  }\n\n  get history() {\n    return this.delegate.history\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted(formSubmission) {\n    // Not all adapters implement formSubmissionStarted\n    if (typeof this.adapter.formSubmissionStarted === \"function\") {\n      this.adapter.formSubmissionStarted(formSubmission);\n    }\n  }\n\n  async formSubmissionSucceededWithResponse(formSubmission, fetchResponse) {\n    if (formSubmission == this.formSubmission) {\n      const responseHTML = await fetchResponse.responseHTML;\n      if (responseHTML) {\n        const shouldCacheSnapshot = formSubmission.isSafe;\n        if (!shouldCacheSnapshot) {\n          this.view.clearSnapshotCache();\n        }\n\n        const { statusCode, redirected } = fetchResponse;\n        const action = this.#getActionForFormSubmission(formSubmission, fetchResponse);\n        const visitOptions = {\n          action,\n          shouldCacheSnapshot,\n          response: { statusCode, responseHTML, redirected }\n        };\n        this.proposeVisit(fetchResponse.location, visitOptions);\n      }\n    }\n  }\n\n  async formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    const responseHTML = await fetchResponse.responseHTML;\n\n    if (responseHTML) {\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n      if (fetchResponse.serverError) {\n        await this.view.renderError(snapshot, this.currentVisit);\n      } else {\n        await this.view.renderPage(snapshot, false, true, this.currentVisit);\n      }\n      if (snapshot.refreshScroll !== \"preserve\") {\n        this.view.scrollToTop();\n      }\n      this.view.clearSnapshotCache();\n    }\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished(formSubmission) {\n    // Not all adapters implement formSubmissionFinished\n    if (typeof this.adapter.formSubmissionFinished === \"function\") {\n      this.adapter.formSubmissionFinished(formSubmission);\n    }\n  }\n\n  // Link prefetching\n\n  linkPrefetchingIsEnabledForLocation(location) {\n    // Not all adapters implement linkPrefetchingIsEnabledForLocation\n    if (typeof this.adapter.linkPrefetchingIsEnabledForLocation === \"function\") {\n      return this.adapter.linkPrefetchingIsEnabledForLocation(location)\n    }\n\n    return true\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    this.delegate.visitStarted(visit);\n  }\n\n  visitCompleted(visit) {\n    this.delegate.visitCompleted(visit);\n    delete this.currentVisit;\n  }\n\n  // Same-page links are no longer handled with a Visit.\n  // This method is still needed for Turbo Native adapters.\n  locationWithActionIsSamePage(location, action) {\n    return false\n  }\n\n  // Visits\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  #getActionForFormSubmission(formSubmission, fetchResponse) {\n    const { submitter, formElement } = formSubmission;\n    return getVisitAction(submitter, formElement) || this.#getDefaultAction(fetchResponse)\n  }\n\n  #getDefaultAction(fetchResponse) {\n    const sameLocationRedirect = fetchResponse.redirected && fetchResponse.location.href === this.location?.href;\n    return sameLocationRedirect ? \"replace\" : \"advance\"\n  }\n}\n\nconst PageStage = {\n  initial: 0,\n  loading: 1,\n  interactive: 2,\n  complete: 3\n};\n\nclass PageObserver {\n  stage = PageStage.initial\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      if (this.stage == PageStage.initial) {\n        this.stage = PageStage.loading;\n      }\n      document.addEventListener(\"readystatechange\", this.interpretReadyState, false);\n      addEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      document.removeEventListener(\"readystatechange\", this.interpretReadyState, false);\n      removeEventListener(\"pagehide\", this.pageWillUnload, false);\n      this.started = false;\n    }\n  }\n\n  interpretReadyState = () => {\n    const { readyState } = this;\n    if (readyState == \"interactive\") {\n      this.pageIsInteractive();\n    } else if (readyState == \"complete\") {\n      this.pageIsComplete();\n    }\n  }\n\n  pageIsInteractive() {\n    if (this.stage == PageStage.loading) {\n      this.stage = PageStage.interactive;\n      this.delegate.pageBecameInteractive();\n    }\n  }\n\n  pageIsComplete() {\n    this.pageIsInteractive();\n    if (this.stage == PageStage.interactive) {\n      this.stage = PageStage.complete;\n      this.delegate.pageLoaded();\n    }\n  }\n\n  pageWillUnload = () => {\n    this.delegate.pageWillUnload();\n  }\n\n  get readyState() {\n    return document.readyState\n  }\n}\n\nclass ScrollObserver {\n  started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.started) {\n      addEventListener(\"scroll\", this.onScroll, false);\n      this.onScroll();\n      this.started = true;\n    }\n  }\n\n  stop() {\n    if (this.started) {\n      removeEventListener(\"scroll\", this.onScroll, false);\n      this.started = false;\n    }\n  }\n\n  onScroll = () => {\n    this.updatePosition({ x: window.pageXOffset, y: window.pageYOffset });\n  }\n\n  // Private\n\n  updatePosition(position) {\n    this.delegate.scrollPositionChanged(position);\n  }\n}\n\nclass StreamMessageRenderer {\n  render({ fragment }) {\n    Bardo.preservingPermanentElements(this, getPermanentElementMapForFragment(fragment), () => {\n      withAutofocusFromFragment(fragment, () => {\n        withPreservedFocus(() => {\n          document.documentElement.appendChild(fragment);\n        });\n      });\n    });\n  }\n\n  // Bardo delegate\n\n  enteringBardo(currentPermanentElement, newPermanentElement) {\n    newPermanentElement.replaceWith(currentPermanentElement.cloneNode(true));\n  }\n\n  leavingBardo() {}\n}\n\nfunction getPermanentElementMapForFragment(fragment) {\n  const permanentElementsInDocument = queryPermanentElementsAll(document.documentElement);\n  const permanentElementMap = {};\n  for (const permanentElementInDocument of permanentElementsInDocument) {\n    const { id } = permanentElementInDocument;\n\n    for (const streamElement of fragment.querySelectorAll(\"turbo-stream\")) {\n      const elementInStream = getPermanentElementById(streamElement.templateElement.content, id);\n\n      if (elementInStream) {\n        permanentElementMap[id] = [permanentElementInDocument, elementInStream];\n      }\n    }\n  }\n\n  return permanentElementMap\n}\n\nasync function withAutofocusFromFragment(fragment, callback) {\n  const generatedID = `turbo-stream-autofocus-${uuid()}`;\n  const turboStreams = fragment.querySelectorAll(\"turbo-stream\");\n  const elementWithAutofocus = firstAutofocusableElementInStreams(turboStreams);\n  let willAutofocusId = null;\n\n  if (elementWithAutofocus) {\n    if (elementWithAutofocus.id) {\n      willAutofocusId = elementWithAutofocus.id;\n    } else {\n      willAutofocusId = generatedID;\n    }\n\n    elementWithAutofocus.id = willAutofocusId;\n  }\n\n  callback();\n  await nextRepaint();\n\n  const hasNoActiveElement = document.activeElement == null || document.activeElement == document.body;\n\n  if (hasNoActiveElement && willAutofocusId) {\n    const elementToAutofocus = document.getElementById(willAutofocusId);\n\n    if (elementIsFocusable(elementToAutofocus)) {\n      elementToAutofocus.focus();\n    }\n    if (elementToAutofocus && elementToAutofocus.id == generatedID) {\n      elementToAutofocus.removeAttribute(\"id\");\n    }\n  }\n}\n\nasync function withPreservedFocus(callback) {\n  const [activeElementBeforeRender, activeElementAfterRender] = await around(callback, () => document.activeElement);\n\n  const restoreFocusTo = activeElementBeforeRender && activeElementBeforeRender.id;\n\n  if (restoreFocusTo) {\n    const elementToFocus = document.getElementById(restoreFocusTo);\n\n    if (elementIsFocusable(elementToFocus) && elementToFocus != activeElementAfterRender) {\n      elementToFocus.focus();\n    }\n  }\n}\n\nfunction firstAutofocusableElementInStreams(nodeListOfStreamElements) {\n  for (const streamElement of nodeListOfStreamElements) {\n    const elementWithAutofocus = queryAutofocusableElement(streamElement.templateElement.content);\n\n    if (elementWithAutofocus) return elementWithAutofocus\n  }\n\n  return null\n}\n\nclass StreamObserver {\n  sources = new Set()\n  #started = false\n\n  constructor(delegate) {\n    this.delegate = delegate;\n  }\n\n  start() {\n    if (!this.#started) {\n      this.#started = true;\n      addEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  stop() {\n    if (this.#started) {\n      this.#started = false;\n      removeEventListener(\"turbo:before-fetch-response\", this.inspectFetchResponse, false);\n    }\n  }\n\n  connectStreamSource(source) {\n    if (!this.streamSourceIsConnected(source)) {\n      this.sources.add(source);\n      source.addEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  disconnectStreamSource(source) {\n    if (this.streamSourceIsConnected(source)) {\n      this.sources.delete(source);\n      source.removeEventListener(\"message\", this.receiveMessageEvent, false);\n    }\n  }\n\n  streamSourceIsConnected(source) {\n    return this.sources.has(source)\n  }\n\n  inspectFetchResponse = (event) => {\n    const response = fetchResponseFromEvent(event);\n    if (response && fetchResponseIsStream(response)) {\n      event.preventDefault();\n      this.receiveMessageResponse(response);\n    }\n  }\n\n  receiveMessageEvent = (event) => {\n    if (this.#started && typeof event.data == \"string\") {\n      this.receiveMessageHTML(event.data);\n    }\n  }\n\n  async receiveMessageResponse(response) {\n    const html = await response.responseHTML;\n    if (html) {\n      this.receiveMessageHTML(html);\n    }\n  }\n\n  receiveMessageHTML(html) {\n    this.delegate.receivedMessageFromStream(StreamMessage.wrap(html));\n  }\n}\n\nfunction fetchResponseFromEvent(event) {\n  const fetchResponse = event.detail?.fetchResponse;\n  if (fetchResponse instanceof FetchResponse) {\n    return fetchResponse\n  }\n}\n\nfunction fetchResponseIsStream(response) {\n  const contentType = response.contentType ?? \"\";\n  return contentType.startsWith(StreamMessage.contentType)\n}\n\nclass ErrorRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    const { documentElement, body } = document;\n\n    documentElement.replaceChild(newElement, body);\n  }\n\n  async render() {\n    this.replaceHeadAndBody();\n    this.activateScriptElements();\n  }\n\n  replaceHeadAndBody() {\n    const { documentElement, head } = document;\n    documentElement.replaceChild(this.newHead, head);\n    this.renderElement(this.currentElement, this.newElement);\n  }\n\n  activateScriptElements() {\n    for (const replaceableElement of this.scriptElements) {\n      const parentNode = replaceableElement.parentNode;\n      if (parentNode) {\n        const element = activateScriptElement(replaceableElement);\n        parentNode.replaceChild(element, replaceableElement);\n      }\n    }\n  }\n\n  get newHead() {\n    return this.newSnapshot.headSnapshot.element\n  }\n\n  get scriptElements() {\n    return document.documentElement.querySelectorAll(\"script\")\n  }\n}\n\nclass PageRenderer extends Renderer {\n  static renderElement(currentElement, newElement) {\n    if (document.body && newElement instanceof HTMLBodyElement) {\n      document.body.replaceWith(newElement);\n    } else {\n      document.documentElement.appendChild(newElement);\n    }\n  }\n\n  get shouldRender() {\n    return this.newSnapshot.isVisitable && this.trackedElementsAreIdentical\n  }\n\n  get reloadReason() {\n    if (!this.newSnapshot.isVisitable) {\n      return {\n        reason: \"turbo_visit_control_is_reload\"\n      }\n    }\n\n    if (!this.trackedElementsAreIdentical) {\n      return {\n        reason: \"tracked_element_mismatch\"\n      }\n    }\n  }\n\n  async prepareToRender() {\n    this.#setLanguage();\n    await this.mergeHead();\n  }\n\n  async render() {\n    if (this.willRender) {\n      await this.replaceBody();\n    }\n  }\n\n  finishRendering() {\n    super.finishRendering();\n    if (!this.isPreview) {\n      this.focusFirstAutofocusableElement();\n    }\n  }\n\n  get currentHeadSnapshot() {\n    return this.currentSnapshot.headSnapshot\n  }\n\n  get newHeadSnapshot() {\n    return this.newSnapshot.headSnapshot\n  }\n\n  get newElement() {\n    return this.newSnapshot.element\n  }\n\n  #setLanguage() {\n    const { documentElement } = this.currentSnapshot;\n    const { dir, lang } = this.newSnapshot;\n\n    if (lang) {\n      documentElement.setAttribute(\"lang\", lang);\n    } else {\n      documentElement.removeAttribute(\"lang\");\n    }\n    if (dir) {\n      documentElement.setAttribute(\"dir\", dir);\n    } else {\n      documentElement.removeAttribute(\"dir\");\n    }\n  }\n\n  async mergeHead() {\n    const mergedHeadElements = this.mergeProvisionalElements();\n    const newStylesheetElements = this.copyNewHeadStylesheetElements();\n    this.copyNewHeadScriptElements();\n\n    await mergedHeadElements;\n    await newStylesheetElements;\n\n    if (this.willRender) {\n      this.removeUnusedDynamicStylesheetElements();\n    }\n  }\n\n  async replaceBody() {\n    await this.preservingPermanentElements(async () => {\n      this.activateNewBody();\n      await this.assignNewBody();\n    });\n  }\n\n  get trackedElementsAreIdentical() {\n    return this.currentHeadSnapshot.trackedElementSignature == this.newHeadSnapshot.trackedElementSignature\n  }\n\n  async copyNewHeadStylesheetElements() {\n    const loadingElements = [];\n\n    for (const element of this.newHeadStylesheetElements) {\n      loadingElements.push(waitForLoad(element));\n\n      document.head.appendChild(element);\n    }\n\n    await Promise.all(loadingElements);\n  }\n\n  copyNewHeadScriptElements() {\n    for (const element of this.newHeadScriptElements) {\n      document.head.appendChild(activateScriptElement(element));\n    }\n  }\n\n  removeUnusedDynamicStylesheetElements() {\n    for (const element of this.unusedDynamicStylesheetElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  async mergeProvisionalElements() {\n    const newHeadElements = [...this.newHeadProvisionalElements];\n\n    for (const element of this.currentHeadProvisionalElements) {\n      if (!this.isCurrentElementInElementList(element, newHeadElements)) {\n        document.head.removeChild(element);\n      }\n    }\n\n    for (const element of newHeadElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  isCurrentElementInElementList(element, elementList) {\n    for (const [index, newElement] of elementList.entries()) {\n      // if title element...\n      if (element.tagName == \"TITLE\") {\n        if (newElement.tagName != \"TITLE\") {\n          continue\n        }\n        if (element.innerHTML == newElement.innerHTML) {\n          elementList.splice(index, 1);\n          return true\n        }\n      }\n\n      // if any other element...\n      if (newElement.isEqualNode(element)) {\n        elementList.splice(index, 1);\n        return true\n      }\n    }\n\n    return false\n  }\n\n  removeCurrentHeadProvisionalElements() {\n    for (const element of this.currentHeadProvisionalElements) {\n      document.head.removeChild(element);\n    }\n  }\n\n  copyNewHeadProvisionalElements() {\n    for (const element of this.newHeadProvisionalElements) {\n      document.head.appendChild(element);\n    }\n  }\n\n  activateNewBody() {\n    document.adoptNode(this.newElement);\n    this.removeNoscriptElements();\n    this.activateNewBodyScriptElements();\n  }\n\n  removeNoscriptElements() {\n    for (const noscriptElement of this.newElement.querySelectorAll(\"noscript\")) {\n      noscriptElement.remove();\n    }\n  }\n\n  activateNewBodyScriptElements() {\n    for (const inertScriptElement of this.newBodyScriptElements) {\n      const activatedScriptElement = activateScriptElement(inertScriptElement);\n      inertScriptElement.replaceWith(activatedScriptElement);\n    }\n  }\n\n  async assignNewBody() {\n    await this.renderElement(this.currentElement, this.newElement);\n  }\n\n  get unusedDynamicStylesheetElements() {\n    return this.oldHeadStylesheetElements.filter((element) => {\n      return element.getAttribute(\"data-turbo-track\") === \"dynamic\"\n    })\n  }\n\n  get oldHeadStylesheetElements() {\n    return this.currentHeadSnapshot.getStylesheetElementsNotInSnapshot(this.newHeadSnapshot)\n  }\n\n  get newHeadStylesheetElements() {\n    return this.newHeadSnapshot.getStylesheetElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get newHeadScriptElements() {\n    return this.newHeadSnapshot.getScriptElementsNotInSnapshot(this.currentHeadSnapshot)\n  }\n\n  get currentHeadProvisionalElements() {\n    return this.currentHeadSnapshot.provisionalElements\n  }\n\n  get newHeadProvisionalElements() {\n    return this.newHeadSnapshot.provisionalElements\n  }\n\n  get newBodyScriptElements() {\n    return this.newElement.querySelectorAll(\"script\")\n  }\n}\n\nclass MorphingPageRenderer extends PageRenderer {\n  static renderElement(currentElement, newElement) {\n    morphElements(currentElement, newElement, {\n      callbacks: {\n        beforeNodeMorphed: (node, newNode) => {\n          if (\n            shouldRefreshFrameWithMorphing(node, newNode) &&\n              !closestFrameReloadableWithMorphing(node)\n          ) {\n            node.reload();\n            return false\n          }\n          return true\n        }\n      }\n    });\n\n    dispatch(\"turbo:morph\", { detail: { currentElement, newElement } });\n  }\n\n  async preservingPermanentElements(callback) {\n    return await callback()\n  }\n\n  get renderMethod() {\n    return \"morph\"\n  }\n\n  get shouldAutofocus() {\n    return false\n  }\n}\n\nclass SnapshotCache extends LRUCache {\n  constructor(size) {\n    super(size, toCacheKey);\n  }\n\n  get snapshots() {\n    return this.entries\n  }\n}\n\nclass PageView extends View {\n  snapshotCache = new SnapshotCache(10)\n  lastRenderedLocation = new URL(location.href)\n  forceReloaded = false\n\n  shouldTransitionTo(newSnapshot) {\n    return this.snapshot.prefersViewTransitions && newSnapshot.prefersViewTransitions\n  }\n\n  renderPage(snapshot, isPreview = false, willRender = true, visit) {\n    const shouldMorphPage = this.isPageRefresh(visit) && (visit?.refresh?.method || this.snapshot.refreshMethod) === \"morph\";\n    const rendererClass = shouldMorphPage ? MorphingPageRenderer : PageRenderer;\n\n    const renderer = new rendererClass(this.snapshot, snapshot, isPreview, willRender);\n\n    if (!renderer.shouldRender) {\n      this.forceReloaded = true;\n    } else {\n      visit?.changeHistory();\n    }\n\n    return this.render(renderer)\n  }\n\n  renderError(snapshot, visit) {\n    visit?.changeHistory();\n    const renderer = new ErrorRenderer(this.snapshot, snapshot, false);\n    return this.render(renderer)\n  }\n\n  clearSnapshotCache() {\n    this.snapshotCache.clear();\n  }\n\n  async cacheSnapshot(snapshot = this.snapshot) {\n    if (snapshot.isCacheable) {\n      this.delegate.viewWillCacheSnapshot();\n      const { lastRenderedLocation: location } = this;\n      await nextEventLoopTick();\n      const cachedSnapshot = snapshot.clone();\n      this.snapshotCache.put(location, cachedSnapshot);\n      return cachedSnapshot\n    }\n  }\n\n  getCachedSnapshotForLocation(location) {\n    return this.snapshotCache.get(location)\n  }\n\n  isPageRefresh(visit) {\n    return !visit || (this.lastRenderedLocation.pathname === visit.location.pathname && visit.action === \"replace\")\n  }\n\n  shouldPreserveScrollPosition(visit) {\n    return this.isPageRefresh(visit) && (visit?.refresh?.scroll || this.snapshot.refreshScroll) === \"preserve\"\n  }\n\n  get snapshot() {\n    return PageSnapshot.fromElement(this.element)\n  }\n}\n\nclass Preloader {\n  selector = \"a[data-turbo-preload]\"\n\n  constructor(delegate, snapshotCache) {\n    this.delegate = delegate;\n    this.snapshotCache = snapshotCache;\n  }\n\n  start() {\n    if (document.readyState === \"loading\") {\n      document.addEventListener(\"DOMContentLoaded\", this.#preloadAll);\n    } else {\n      this.preloadOnLoadLinksForView(document.body);\n    }\n  }\n\n  stop() {\n    document.removeEventListener(\"DOMContentLoaded\", this.#preloadAll);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    for (const link of element.querySelectorAll(this.selector)) {\n      if (this.delegate.shouldPreloadLink(link)) {\n        this.preloadURL(link);\n      }\n    }\n  }\n\n  async preloadURL(link) {\n    const location = new URL(link.href);\n\n    if (this.snapshotCache.has(location)) {\n      return\n    }\n\n    const fetchRequest = new FetchRequest(this, FetchMethod.get, location, new URLSearchParams(), link);\n    await fetchRequest.perform();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(fetchRequest) {\n    fetchRequest.headers[\"X-Sec-Purpose\"] = \"prefetch\";\n  }\n\n  async requestSucceededWithResponse(fetchRequest, fetchResponse) {\n    try {\n      const responseHTML = await fetchResponse.responseHTML;\n      const snapshot = PageSnapshot.fromHTMLString(responseHTML);\n\n      this.snapshotCache.put(fetchRequest.url, snapshot);\n    } catch (_) {\n      // If we cannot preload that is ok!\n    }\n  }\n\n  requestStarted(fetchRequest) {}\n\n  requestErrored(fetchRequest) {}\n\n  requestFinished(fetchRequest) {}\n\n  requestPreventedHandlingResponse(fetchRequest, fetchResponse) {}\n\n  requestFailedWithResponse(fetchRequest, fetchResponse) {}\n\n  #preloadAll = () => {\n    this.preloadOnLoadLinksForView(document.body);\n  }\n}\n\nclass Cache {\n  constructor(session) {\n    this.session = session;\n  }\n\n  clear() {\n    this.session.clearCache();\n  }\n\n  resetCacheControl() {\n    this.#setCacheControl(\"\");\n  }\n\n  exemptPageFromCache() {\n    this.#setCacheControl(\"no-cache\");\n  }\n\n  exemptPageFromPreview() {\n    this.#setCacheControl(\"no-preview\");\n  }\n\n  #setCacheControl(value) {\n    setMetaContent(\"turbo-cache-control\", value);\n  }\n}\n\nclass Session {\n  navigator = new Navigator(this)\n  history = new History(this)\n  view = new PageView(this, document.documentElement)\n  adapter = new BrowserAdapter(this)\n\n  pageObserver = new PageObserver(this)\n  cacheObserver = new CacheObserver()\n  linkPrefetchObserver = new LinkPrefetchObserver(this, document)\n  linkClickObserver = new LinkClickObserver(this, window)\n  formSubmitObserver = new FormSubmitObserver(this, document)\n  scrollObserver = new ScrollObserver(this)\n  streamObserver = new StreamObserver(this)\n  formLinkClickObserver = new FormLinkClickObserver(this, document.documentElement)\n  frameRedirector = new FrameRedirector(this, document.documentElement)\n  streamMessageRenderer = new StreamMessageRenderer()\n  cache = new Cache(this)\n\n  enabled = true\n  started = false\n  #pageRefreshDebouncePeriod = 150\n\n  constructor(recentRequests) {\n    this.recentRequests = recentRequests;\n    this.preloader = new Preloader(this, this.view.snapshotCache);\n    this.debouncedRefresh = this.refresh;\n    this.pageRefreshDebouncePeriod = this.pageRefreshDebouncePeriod;\n  }\n\n  start() {\n    if (!this.started) {\n      this.pageObserver.start();\n      this.cacheObserver.start();\n      this.linkPrefetchObserver.start();\n      this.formLinkClickObserver.start();\n      this.linkClickObserver.start();\n      this.formSubmitObserver.start();\n      this.scrollObserver.start();\n      this.streamObserver.start();\n      this.frameRedirector.start();\n      this.history.start();\n      this.preloader.start();\n      this.started = true;\n      this.enabled = true;\n    }\n  }\n\n  disable() {\n    this.enabled = false;\n  }\n\n  stop() {\n    if (this.started) {\n      this.pageObserver.stop();\n      this.cacheObserver.stop();\n      this.linkPrefetchObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkClickObserver.stop();\n      this.formSubmitObserver.stop();\n      this.scrollObserver.stop();\n      this.streamObserver.stop();\n      this.frameRedirector.stop();\n      this.history.stop();\n      this.preloader.stop();\n      this.started = false;\n    }\n  }\n\n  registerAdapter(adapter) {\n    this.adapter = adapter;\n  }\n\n  visit(location, options = {}) {\n    const frameElement = options.frame ? document.getElementById(options.frame) : null;\n\n    if (frameElement instanceof FrameElement) {\n      const action = options.action || getVisitAction(frameElement);\n\n      frameElement.delegate.proposeVisitIfNavigatedWithAction(frameElement, action);\n      frameElement.src = location.toString();\n    } else {\n      this.navigator.proposeVisit(expandURL(location), options);\n    }\n  }\n\n  refresh(url, options = {}) {\n    options = typeof options === \"string\" ? { requestId: options } : options;\n\n    const { method, requestId, scroll } = options;\n    const isRecentRequest = requestId && this.recentRequests.has(requestId);\n    const isCurrentUrl = url === document.baseURI;\n    if (!isRecentRequest && !this.navigator.currentVisit && isCurrentUrl) {\n      this.visit(url, { action: \"replace\", shouldCacheSnapshot: false, refresh: { method, scroll } });\n    }\n  }\n\n  connectStreamSource(source) {\n    this.streamObserver.connectStreamSource(source);\n  }\n\n  disconnectStreamSource(source) {\n    this.streamObserver.disconnectStreamSource(source);\n  }\n\n  renderStreamMessage(message) {\n    this.streamMessageRenderer.render(StreamMessage.wrap(message));\n  }\n\n  clearCache() {\n    this.view.clearSnapshotCache();\n  }\n\n  setProgressBarDelay(delay) {\n    console.warn(\n      \"Please replace `session.setProgressBarDelay(delay)` with `session.progressBarDelay = delay`. The function is deprecated and will be removed in a future version of Turbo.`\"\n    );\n\n    this.progressBarDelay = delay;\n  }\n\n  set progressBarDelay(delay) {\n    config.drive.progressBarDelay = delay;\n  }\n\n  get progressBarDelay() {\n    return config.drive.progressBarDelay\n  }\n\n  set drive(value) {\n    config.drive.enabled = value;\n  }\n\n  get drive() {\n    return config.drive.enabled\n  }\n\n  set formMode(value) {\n    config.forms.mode = value;\n  }\n\n  get formMode() {\n    return config.forms.mode\n  }\n\n  get location() {\n    return this.history.location\n  }\n\n  get restorationIdentifier() {\n    return this.history.restorationIdentifier\n  }\n\n  get pageRefreshDebouncePeriod() {\n    return this.#pageRefreshDebouncePeriod\n  }\n\n  set pageRefreshDebouncePeriod(value) {\n    this.refresh = debounce(this.debouncedRefresh.bind(this), value);\n    this.#pageRefreshDebouncePeriod = value;\n  }\n\n  // Preloader delegate\n\n  shouldPreloadLink(element) {\n    const isUnsafe = element.hasAttribute(\"data-turbo-method\");\n    const isStream = element.hasAttribute(\"data-turbo-stream\");\n    const frameTarget = element.getAttribute(\"data-turbo-frame\");\n    const frame = frameTarget == \"_top\" ?\n      null :\n      document.getElementById(frameTarget) || findClosestRecursively(element, \"turbo-frame:not([disabled])\");\n\n    if (isUnsafe || isStream || frame instanceof FrameElement) {\n      return false\n    } else {\n      const location = new URL(element.href);\n\n      return this.elementIsNavigatable(element) && locationIsVisitable(location, this.snapshot.rootLocation)\n    }\n  }\n\n  // History delegate\n\n  historyPoppedToLocationWithRestorationIdentifierAndDirection(location, restorationIdentifier, direction) {\n    if (this.enabled) {\n      this.navigator.startVisit(location, restorationIdentifier, {\n        action: \"restore\",\n        historyChanged: true,\n        direction\n      });\n    } else {\n      this.adapter.pageInvalidated({\n        reason: \"turbo_disabled\"\n      });\n    }\n  }\n\n  historyPoppedWithEmptyState(location) {\n    this.history.replace(location);\n    this.view.lastRenderedLocation = location;\n    this.view.cacheSnapshot();\n  }\n\n  // Scroll observer delegate\n\n  scrollPositionChanged(position) {\n    this.history.updateRestorationData({ scrollPosition: position });\n  }\n\n  // Form click observer delegate\n\n  willSubmitFormLinkToLocation(link, location) {\n    return this.elementIsNavigatable(link) && locationIsVisitable(location, this.snapshot.rootLocation)\n  }\n\n  submittedFormLinkToLocation() {}\n\n  // Link hover observer delegate\n\n  canPrefetchRequestToLocation(link, location) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.navigator.linkPrefetchingIsEnabledForLocation(location)\n    )\n  }\n\n  // Link click observer delegate\n\n  willFollowLinkToLocation(link, location, event) {\n    return (\n      this.elementIsNavigatable(link) &&\n      locationIsVisitable(location, this.snapshot.rootLocation) &&\n      this.applicationAllowsFollowingLinkToLocation(link, location, event)\n    )\n  }\n\n  followedLinkToLocation(link, location) {\n    const action = this.getActionForLink(link);\n    const acceptsStreamResponse = link.hasAttribute(\"data-turbo-stream\");\n\n    this.visit(location.href, { action, acceptsStreamResponse });\n  }\n\n  // Navigator delegate\n\n  allowsVisitingLocationWithAction(location, action) {\n    return this.applicationAllowsVisitingLocation(location)\n  }\n\n  visitProposedToLocation(location, options) {\n    extendURLWithDeprecatedProperties(location);\n    this.adapter.visitProposedToLocation(location, options);\n  }\n\n  // Visit delegate\n\n  visitStarted(visit) {\n    if (!visit.acceptsStreamResponse) {\n      markAsBusy(document.documentElement);\n      this.view.markVisitDirection(visit.direction);\n    }\n    extendURLWithDeprecatedProperties(visit.location);\n    this.notifyApplicationAfterVisitingLocation(visit.location, visit.action);\n  }\n\n  visitCompleted(visit) {\n    this.view.unmarkVisitDirection();\n    clearBusyState(document.documentElement);\n    this.notifyApplicationAfterPageLoad(visit.getTimingMetrics());\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return (\n      this.submissionIsNavigatable(form, submitter) &&\n      locationIsVisitable(expandURL(action), this.snapshot.rootLocation)\n    )\n  }\n\n  formSubmitted(form, submitter) {\n    this.navigator.submitForm(form, submitter);\n  }\n\n  // Page observer delegate\n\n  pageBecameInteractive() {\n    this.view.lastRenderedLocation = this.location;\n    this.notifyApplicationAfterPageLoad();\n  }\n\n  pageLoaded() {\n    this.history.assumeControlOfScrollRestoration();\n  }\n\n  pageWillUnload() {\n    this.history.relinquishControlOfScrollRestoration();\n  }\n\n  // Stream observer delegate\n\n  receivedMessageFromStream(message) {\n    this.renderStreamMessage(message);\n  }\n\n  // Page view delegate\n\n  viewWillCacheSnapshot() {\n    this.notifyApplicationBeforeCachingSnapshot();\n  }\n\n  allowsImmediateRender({ element }, options) {\n    const event = this.notifyApplicationBeforeRender(element, options);\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, renderMethod) {\n    this.view.lastRenderedLocation = this.history.location;\n    this.notifyApplicationAfterRender(renderMethod);\n  }\n\n  preloadOnLoadLinksForView(element) {\n    this.preloader.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated(reason) {\n    this.adapter.pageInvalidated(reason);\n  }\n\n  // Frame element\n\n  frameLoaded(frame) {\n    this.notifyApplicationAfterFrameLoad(frame);\n  }\n\n  frameRendered(fetchResponse, frame) {\n    this.notifyApplicationAfterFrameRender(fetchResponse, frame);\n  }\n\n  // Application events\n\n  applicationAllowsFollowingLinkToLocation(link, location, ev) {\n    const event = this.notifyApplicationAfterClickingLinkToLocation(link, location, ev);\n    return !event.defaultPrevented\n  }\n\n  applicationAllowsVisitingLocation(location) {\n    const event = this.notifyApplicationBeforeVisitingLocation(location);\n    return !event.defaultPrevented\n  }\n\n  notifyApplicationAfterClickingLinkToLocation(link, location, event) {\n    return dispatch(\"turbo:click\", {\n      target: link,\n      detail: { url: location.href, originalEvent: event },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationBeforeVisitingLocation(location) {\n    return dispatch(\"turbo:before-visit\", {\n      detail: { url: location.href },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterVisitingLocation(location, action) {\n    return dispatch(\"turbo:visit\", { detail: { url: location.href, action } })\n  }\n\n  notifyApplicationBeforeCachingSnapshot() {\n    return dispatch(\"turbo:before-cache\")\n  }\n\n  notifyApplicationBeforeRender(newBody, options) {\n    return dispatch(\"turbo:before-render\", {\n      detail: { newBody, ...options },\n      cancelable: true\n    })\n  }\n\n  notifyApplicationAfterRender(renderMethod) {\n    return dispatch(\"turbo:render\", { detail: { renderMethod } })\n  }\n\n  notifyApplicationAfterPageLoad(timing = {}) {\n    return dispatch(\"turbo:load\", {\n      detail: { url: this.location.href, timing }\n    })\n  }\n\n  notifyApplicationAfterFrameLoad(frame) {\n    return dispatch(\"turbo:frame-load\", { target: frame })\n  }\n\n  notifyApplicationAfterFrameRender(fetchResponse, frame) {\n    return dispatch(\"turbo:frame-render\", {\n      detail: { fetchResponse },\n      target: frame,\n      cancelable: true\n    })\n  }\n\n  // Helpers\n\n  submissionIsNavigatable(form, submitter) {\n    if (config.forms.mode == \"off\") {\n      return false\n    } else {\n      const submitterIsNavigatable = submitter ? this.elementIsNavigatable(submitter) : true;\n\n      if (config.forms.mode == \"optin\") {\n        return submitterIsNavigatable && form.closest('[data-turbo=\"true\"]') != null\n      } else {\n        return submitterIsNavigatable && this.elementIsNavigatable(form)\n      }\n    }\n  }\n\n  elementIsNavigatable(element) {\n    const container = findClosestRecursively(element, \"[data-turbo]\");\n    const withinFrame = findClosestRecursively(element, \"turbo-frame\");\n\n    // Check if Drive is enabled on the session or we're within a Frame.\n    if (config.drive.enabled || withinFrame) {\n      // Element is navigatable by default, unless `data-turbo=\"false\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") != \"false\"\n      } else {\n        return true\n      }\n    } else {\n      // Element isn't navigatable by default, unless `data-turbo=\"true\"`.\n      if (container) {\n        return container.getAttribute(\"data-turbo\") == \"true\"\n      } else {\n        return false\n      }\n    }\n  }\n\n  // Private\n\n  getActionForLink(link) {\n    return getVisitAction(link) || \"advance\"\n  }\n\n  get snapshot() {\n    return this.view.snapshot\n  }\n}\n\n// Older versions of the Turbo Native adapters referenced the\n// `Location#absoluteURL` property in their implementations of\n// the `Adapter#visitProposedToLocation()` and `#visitStarted()`\n// methods. The Location class has since been removed in favor\n// of the DOM URL API, and accordingly all Adapter methods now\n// receive URL objects.\n//\n// We alias #absoluteURL to #toString() here to avoid crashing\n// older adapters which do not expect URL objects. We should\n// consider removing this support at some point in the future.\n\nfunction extendURLWithDeprecatedProperties(url) {\n  Object.defineProperties(url, deprecatedLocationPropertyDescriptors);\n}\n\nconst deprecatedLocationPropertyDescriptors = {\n  absoluteURL: {\n    get() {\n      return this.toString()\n    }\n  }\n};\n\nconst session = new Session(recentRequests);\n\n// Rename `navigator` to avoid shadowing `window.navigator`\nconst { cache, navigator: sessionNavigator } = session;\n\n/**\n * Starts the main session.\n * This initialises any necessary observers such as those to monitor\n * link interactions.\n */\nfunction start() {\n  session.start();\n}\n\n/**\n * Registers an adapter for the main session.\n *\n * @param adapter Adapter to register\n */\nfunction registerAdapter(adapter) {\n  session.registerAdapter(adapter);\n}\n\n/**\n * Performs an application visit to the given location.\n *\n * @param location Location to visit (a URL or path)\n * @param options Options to apply\n * @param options.action Type of history navigation to apply (\"restore\",\n * \"replace\" or \"advance\")\n * @param options.historyChanged Specifies whether the browser history has\n * already been changed for this visit or not\n * @param options.referrer Specifies the referrer of this visit such that\n * navigations to the same page will not result in a new history entry.\n * @param options.snapshotHTML Cached snapshot to render\n * @param options.response Response of the specified location\n */\nfunction visit(location, options) {\n  session.visit(location, options);\n}\n\n/**\n * Connects a stream source to the main session.\n *\n * @param source Stream source to connect\n */\nfunction connectStreamSource(source) {\n  session.connectStreamSource(source);\n}\n\n/**\n * Disconnects a stream source from the main session.\n *\n * @param source Stream source to disconnect\n */\nfunction disconnectStreamSource(source) {\n  session.disconnectStreamSource(source);\n}\n\n/**\n * Renders a stream message to the main session by appending it to the\n * current document.\n *\n * @param message Message to render\n */\nfunction renderStreamMessage(message) {\n  session.renderStreamMessage(message);\n}\n\n/**\n * Sets the delay after which the progress bar will appear during navigation.\n *\n * The progress bar appears after 500ms by default.\n *\n * Note that this method has no effect when used with the iOS or Android\n * adapters.\n *\n * @param delay Time to delay in milliseconds\n */\nfunction setProgressBarDelay(delay) {\n  console.warn(\n    \"Please replace `Turbo.setProgressBarDelay(delay)` with `Turbo.config.drive.progressBarDelay = delay`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.drive.progressBarDelay = delay;\n}\n\nfunction setConfirmMethod(confirmMethod) {\n  console.warn(\n    \"Please replace `Turbo.setConfirmMethod(confirmMethod)` with `Turbo.config.forms.confirm = confirmMethod`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.confirm = confirmMethod;\n}\n\nfunction setFormMode(mode) {\n  console.warn(\n    \"Please replace `Turbo.setFormMode(mode)` with `Turbo.config.forms.mode = mode`. The top-level function is deprecated and will be removed in a future version of Turbo.`\"\n  );\n  config.forms.mode = mode;\n}\n\n/**\n * Morph the state of the currentBody based on the attributes and contents of\n * the newBody. Morphing body elements may dispatch turbo:morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentBody HTMLBodyElement destination of morphing changes\n * @param newBody HTMLBodyElement source of morphing changes\n */\nfunction morphBodyElements(currentBody, newBody) {\n  MorphingPageRenderer.renderElement(currentBody, newBody);\n}\n\n/**\n * Morph the child elements of the currentFrame based on the child elements of\n * the newFrame. Morphing turbo-frame elements may dispatch turbo:before-frame-morph,\n * turbo:before-morph-element, turbo:before-morph-attribute, and\n * turbo:morph-element events.\n *\n * @param currentFrame FrameElement destination of morphing children changes\n * @param newFrame FrameElement source of morphing children changes\n */\nfunction morphTurboFrameElements(currentFrame, newFrame) {\n  MorphingFrameRenderer.renderElement(currentFrame, newFrame);\n}\n\nvar Turbo = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  PageRenderer: PageRenderer,\n  PageSnapshot: PageSnapshot,\n  FrameRenderer: FrameRenderer,\n  fetch: fetchWithTurboHeaders,\n  config: config,\n  session: session,\n  cache: cache,\n  navigator: sessionNavigator,\n  start: start,\n  registerAdapter: registerAdapter,\n  visit: visit,\n  connectStreamSource: connectStreamSource,\n  disconnectStreamSource: disconnectStreamSource,\n  renderStreamMessage: renderStreamMessage,\n  setProgressBarDelay: setProgressBarDelay,\n  setConfirmMethod: setConfirmMethod,\n  setFormMode: setFormMode,\n  morphBodyElements: morphBodyElements,\n  morphTurboFrameElements: morphTurboFrameElements,\n  morphChildren: morphChildren,\n  morphElements: morphElements\n});\n\nclass TurboFrameMissingError extends Error {}\n\nclass FrameController {\n  fetchResponseLoaded = (_fetchResponse) => Promise.resolve()\n  #currentFetchRequest = null\n  #resolveVisitPromise = () => {}\n  #connected = false\n  #hasBeenLoaded = false\n  #ignoredAttributes = new Set()\n  #shouldMorphFrame = false\n  action = null\n\n  constructor(element) {\n    this.element = element;\n    this.view = new FrameView(this, this.element);\n    this.appearanceObserver = new AppearanceObserver(this, this.element);\n    this.formLinkClickObserver = new FormLinkClickObserver(this, this.element);\n    this.linkInterceptor = new LinkInterceptor(this, this.element);\n    this.restorationIdentifier = uuid();\n    this.formSubmitObserver = new FormSubmitObserver(this, this.element);\n  }\n\n  // Frame delegate\n\n  connect() {\n    if (!this.#connected) {\n      this.#connected = true;\n      if (this.loadingStyle == FrameLoadingStyle.lazy) {\n        this.appearanceObserver.start();\n      } else {\n        this.#loadSourceURL();\n      }\n      this.formLinkClickObserver.start();\n      this.linkInterceptor.start();\n      this.formSubmitObserver.start();\n    }\n  }\n\n  disconnect() {\n    if (this.#connected) {\n      this.#connected = false;\n      this.appearanceObserver.stop();\n      this.formLinkClickObserver.stop();\n      this.linkInterceptor.stop();\n      this.formSubmitObserver.stop();\n\n      if (!this.element.hasAttribute(\"recurse\")) {\n        this.#currentFetchRequest?.cancel();\n      }\n    }\n  }\n\n  disabledChanged() {\n    if (this.disabled) {\n      this.#currentFetchRequest?.cancel();\n    } else if (this.loadingStyle == FrameLoadingStyle.eager) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLChanged() {\n    if (this.#isIgnoringChangesTo(\"src\")) return\n\n    if (!this.sourceURL) {\n      this.#currentFetchRequest?.cancel();\n    }\n\n    if (this.element.isConnected) {\n      this.complete = false;\n    }\n\n    if (this.loadingStyle == FrameLoadingStyle.eager || this.#hasBeenLoaded) {\n      this.#loadSourceURL();\n    }\n  }\n\n  sourceURLReloaded() {\n    const { refresh, src } = this.element;\n\n    this.#shouldMorphFrame = src && refresh === \"morph\";\n\n    this.element.removeAttribute(\"complete\");\n    this.element.src = null;\n    this.element.src = src;\n    return this.element.loaded\n  }\n\n  loadingStyleChanged() {\n    if (this.loadingStyle == FrameLoadingStyle.lazy) {\n      this.appearanceObserver.start();\n    } else {\n      this.appearanceObserver.stop();\n      this.#loadSourceURL();\n    }\n  }\n\n  async #loadSourceURL() {\n    if (this.enabled && this.isActive && !this.complete && this.sourceURL) {\n      this.element.loaded = this.#visit(expandURL(this.sourceURL));\n      this.appearanceObserver.stop();\n      await this.element.loaded;\n      this.#hasBeenLoaded = true;\n    }\n  }\n\n  async loadResponse(fetchResponse) {\n    if (fetchResponse.redirected || (fetchResponse.succeeded && fetchResponse.isHTML)) {\n      this.sourceURL = fetchResponse.response.url;\n    }\n\n    try {\n      const html = await fetchResponse.responseHTML;\n      if (html) {\n        const document = parseHTMLDocument(html);\n        const pageSnapshot = PageSnapshot.fromDocument(document);\n\n        if (pageSnapshot.isVisitable) {\n          await this.#loadFrameResponse(fetchResponse, document);\n        } else {\n          await this.#handleUnvisitableFrameResponse(fetchResponse);\n        }\n      }\n    } finally {\n      this.#shouldMorphFrame = false;\n      this.fetchResponseLoaded = () => Promise.resolve();\n    }\n  }\n\n  // Appearance observer delegate\n\n  elementAppearedInViewport(element) {\n    this.proposeVisitIfNavigatedWithAction(element, getVisitAction(element));\n    this.#loadSourceURL();\n  }\n\n  // Form link click observer delegate\n\n  willSubmitFormLinkToLocation(link) {\n    return this.#shouldInterceptNavigation(link)\n  }\n\n  submittedFormLinkToLocation(link, _location, form) {\n    const frame = this.#findFrameElement(link);\n    if (frame) form.setAttribute(\"data-turbo-frame\", frame.id);\n  }\n\n  // Link interceptor delegate\n\n  shouldInterceptLinkClick(element, _location, _event) {\n    return this.#shouldInterceptNavigation(element)\n  }\n\n  linkClickIntercepted(element, location) {\n    this.#navigateFrame(element, location);\n  }\n\n  // Form submit observer delegate\n\n  willSubmitForm(element, submitter) {\n    return element.closest(\"turbo-frame\") == this.element && this.#shouldInterceptNavigation(element, submitter)\n  }\n\n  formSubmitted(element, submitter) {\n    if (this.formSubmission) {\n      this.formSubmission.stop();\n    }\n\n    this.formSubmission = new FormSubmission(this, element, submitter);\n\n    const { fetchRequest } = this.formSubmission;\n    const frame = this.#findFrameElement(element, submitter);\n\n    this.prepareRequest(fetchRequest, frame);\n    this.formSubmission.start();\n  }\n\n  // Fetch request delegate\n\n  prepareRequest(request, frame = this) {\n    request.headers[\"Turbo-Frame\"] = frame.id;\n\n    if (this.currentNavigationElement?.hasAttribute(\"data-turbo-stream\")) {\n      request.acceptResponseType(StreamMessage.contentType);\n    }\n  }\n\n  requestStarted(_request) {\n    markAsBusy(this.element);\n  }\n\n  requestPreventedHandlingResponse(_request, _response) {\n    this.#resolveVisitPromise();\n  }\n\n  async requestSucceededWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  async requestFailedWithResponse(request, response) {\n    await this.loadResponse(response);\n    this.#resolveVisitPromise();\n  }\n\n  requestErrored(request, error) {\n    console.error(error);\n    this.#resolveVisitPromise();\n  }\n\n  requestFinished(_request) {\n    clearBusyState(this.element);\n  }\n\n  // Form submission delegate\n\n  formSubmissionStarted({ formElement }) {\n    markAsBusy(formElement, this.#findFrameElement(formElement));\n  }\n\n  formSubmissionSucceededWithResponse(formSubmission, response) {\n    const frame = this.#findFrameElement(formSubmission.formElement, formSubmission.submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(formSubmission.submitter, formSubmission.formElement, frame));\n    frame.delegate.loadResponse(response);\n\n    if (!formSubmission.isSafe) {\n      session.clearCache();\n    }\n  }\n\n  formSubmissionFailedWithResponse(formSubmission, fetchResponse) {\n    this.element.delegate.loadResponse(fetchResponse);\n    session.clearCache();\n  }\n\n  formSubmissionErrored(formSubmission, error) {\n    console.error(error);\n  }\n\n  formSubmissionFinished({ formElement }) {\n    clearBusyState(formElement, this.#findFrameElement(formElement));\n  }\n\n  // View delegate\n\n  allowsImmediateRender({ element: newFrame }, options) {\n    const event = dispatch(\"turbo:before-frame-render\", {\n      target: this.element,\n      detail: { newFrame, ...options },\n      cancelable: true\n    });\n\n    const {\n      defaultPrevented,\n      detail: { render }\n    } = event;\n\n    if (this.view.renderer && render) {\n      this.view.renderer.renderElement = render;\n    }\n\n    return !defaultPrevented\n  }\n\n  viewRenderedSnapshot(_snapshot, _isPreview, _renderMethod) {}\n\n  preloadOnLoadLinksForView(element) {\n    session.preloadOnLoadLinksForView(element);\n  }\n\n  viewInvalidated() {}\n\n  // Frame renderer delegate\n\n  willRenderFrame(currentElement, _newElement) {\n    this.previousFrameElement = currentElement.cloneNode(true);\n  }\n\n  visitCachedSnapshot = ({ element }) => {\n    const frame = element.querySelector(\"#\" + this.element.id);\n\n    if (frame && this.previousFrameElement) {\n      frame.replaceChildren(...this.previousFrameElement.children);\n    }\n\n    delete this.previousFrameElement;\n  }\n\n  // Private\n\n  async #loadFrameResponse(fetchResponse, document) {\n    const newFrameElement = await this.extractForeignFrameElement(document.body);\n    const rendererClass = this.#shouldMorphFrame ? MorphingFrameRenderer : FrameRenderer;\n\n    if (newFrameElement) {\n      const snapshot = new Snapshot(newFrameElement);\n      const renderer = new rendererClass(this, this.view.snapshot, snapshot, false, false);\n      if (this.view.renderPromise) await this.view.renderPromise;\n      this.changeHistory();\n\n      await this.view.render(renderer);\n      this.complete = true;\n      session.frameRendered(fetchResponse, this.element);\n      session.frameLoaded(this.element);\n      await this.fetchResponseLoaded(fetchResponse);\n    } else if (this.#willHandleFrameMissingFromResponse(fetchResponse)) {\n      this.#handleFrameMissingFromResponse(fetchResponse);\n    }\n  }\n\n  async #visit(url) {\n    const request = new FetchRequest(this, FetchMethod.get, url, new URLSearchParams(), this.element);\n\n    this.#currentFetchRequest?.cancel();\n    this.#currentFetchRequest = request;\n\n    return new Promise((resolve) => {\n      this.#resolveVisitPromise = () => {\n        this.#resolveVisitPromise = () => {};\n        this.#currentFetchRequest = null;\n        resolve();\n      };\n      request.perform();\n    })\n  }\n\n  #navigateFrame(element, url, submitter) {\n    const frame = this.#findFrameElement(element, submitter);\n\n    frame.delegate.proposeVisitIfNavigatedWithAction(frame, getVisitAction(submitter, element, frame));\n\n    this.#withCurrentNavigationElement(element, () => {\n      frame.src = url;\n    });\n  }\n\n  proposeVisitIfNavigatedWithAction(frame, action = null) {\n    this.action = action;\n\n    if (this.action) {\n      const pageSnapshot = PageSnapshot.fromElement(frame).clone();\n      const { visitCachedSnapshot } = frame.delegate;\n\n      frame.delegate.fetchResponseLoaded = async (fetchResponse) => {\n        if (frame.src) {\n          const { statusCode, redirected } = fetchResponse;\n          const responseHTML = await fetchResponse.responseHTML;\n          const response = { statusCode, redirected, responseHTML };\n          const options = {\n            response,\n            visitCachedSnapshot,\n            willRender: false,\n            updateHistory: false,\n            restorationIdentifier: this.restorationIdentifier,\n            snapshot: pageSnapshot\n          };\n\n          if (this.action) options.action = this.action;\n\n          session.visit(frame.src, options);\n        }\n      };\n    }\n  }\n\n  changeHistory() {\n    if (this.action) {\n      const method = getHistoryMethodForAction(this.action);\n      session.history.update(method, expandURL(this.element.src || \"\"), this.restorationIdentifier);\n    }\n  }\n\n  async #handleUnvisitableFrameResponse(fetchResponse) {\n    console.warn(\n      `The response (${fetchResponse.statusCode}) from <turbo-frame id=\"${this.element.id}\"> is performing a full page visit due to turbo-visit-control.`\n    );\n\n    await this.#visitResponse(fetchResponse.response);\n  }\n\n  #willHandleFrameMissingFromResponse(fetchResponse) {\n    this.element.setAttribute(\"complete\", \"\");\n\n    const response = fetchResponse.response;\n    const visit = async (url, options) => {\n      if (url instanceof Response) {\n        this.#visitResponse(url);\n      } else {\n        session.visit(url, options);\n      }\n    };\n\n    const event = dispatch(\"turbo:frame-missing\", {\n      target: this.element,\n      detail: { response, visit },\n      cancelable: true\n    });\n\n    return !event.defaultPrevented\n  }\n\n  #handleFrameMissingFromResponse(fetchResponse) {\n    this.view.missing();\n    this.#throwFrameMissingError(fetchResponse);\n  }\n\n  #throwFrameMissingError(fetchResponse) {\n    const message = `The response (${fetchResponse.statusCode}) did not contain the expected <turbo-frame id=\"${this.element.id}\"> and will be ignored. To perform a full page visit instead, set turbo-visit-control to reload.`;\n    throw new TurboFrameMissingError(message)\n  }\n\n  async #visitResponse(response) {\n    const wrapped = new FetchResponse(response);\n    const responseHTML = await wrapped.responseHTML;\n    const { location, redirected, statusCode } = wrapped;\n\n    return session.visit(location, { response: { redirected, statusCode, responseHTML } })\n  }\n\n  #findFrameElement(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n    const target = this.#getFrameElementById(id);\n\n    return target instanceof FrameElement ? target : this.element\n  }\n\n  async extractForeignFrameElement(container) {\n    let element;\n    const id = CSS.escape(this.id);\n\n    try {\n      element = activateElement(container.querySelector(`turbo-frame#${id}`), this.sourceURL);\n      if (element) {\n        return element\n      }\n\n      element = activateElement(container.querySelector(`turbo-frame[src][recurse~=${id}]`), this.sourceURL);\n      if (element) {\n        await element.loaded;\n        return await this.extractForeignFrameElement(element)\n      }\n    } catch (error) {\n      console.error(error);\n      return new FrameElement()\n    }\n\n    return null\n  }\n\n  #formActionIsVisitable(form, submitter) {\n    const action = getAction$1(form, submitter);\n\n    return locationIsVisitable(expandURL(action), this.rootLocation)\n  }\n\n  #shouldInterceptNavigation(element, submitter) {\n    const id = getAttribute(\"data-turbo-frame\", submitter, element) || this.element.getAttribute(\"target\");\n\n    if (element instanceof HTMLFormElement && !this.#formActionIsVisitable(element, submitter)) {\n      return false\n    }\n\n    if (!this.enabled || id == \"_top\") {\n      return false\n    }\n\n    if (id) {\n      const frameElement = this.#getFrameElementById(id);\n      if (frameElement) {\n        return !frameElement.disabled\n      } else if (id == \"_parent\") {\n        return false\n      }\n    }\n\n    if (!session.elementIsNavigatable(element)) {\n      return false\n    }\n\n    if (submitter && !session.elementIsNavigatable(submitter)) {\n      return false\n    }\n\n    return true\n  }\n\n  // Computed properties\n\n  get id() {\n    return this.element.id\n  }\n\n  get disabled() {\n    return this.element.disabled\n  }\n\n  get enabled() {\n    return !this.disabled\n  }\n\n  get sourceURL() {\n    if (this.element.src) {\n      return this.element.src\n    }\n  }\n\n  set sourceURL(sourceURL) {\n    this.#ignoringChangesToAttribute(\"src\", () => {\n      this.element.src = sourceURL ?? null;\n    });\n  }\n\n  get loadingStyle() {\n    return this.element.loading\n  }\n\n  get isLoading() {\n    return this.formSubmission !== undefined || this.#resolveVisitPromise() !== undefined\n  }\n\n  get complete() {\n    return this.element.hasAttribute(\"complete\")\n  }\n\n  set complete(value) {\n    if (value) {\n      this.element.setAttribute(\"complete\", \"\");\n    } else {\n      this.element.removeAttribute(\"complete\");\n    }\n  }\n\n  get isActive() {\n    return this.element.isActive && this.#connected\n  }\n\n  get rootLocation() {\n    const meta = this.element.ownerDocument.querySelector(`meta[name=\"turbo-root\"]`);\n    const root = meta?.content ?? \"/\";\n    return expandURL(root)\n  }\n\n  #isIgnoringChangesTo(attributeName) {\n    return this.#ignoredAttributes.has(attributeName)\n  }\n\n  #ignoringChangesToAttribute(attributeName, callback) {\n    this.#ignoredAttributes.add(attributeName);\n    callback();\n    this.#ignoredAttributes.delete(attributeName);\n  }\n\n  #withCurrentNavigationElement(element, callback) {\n    this.currentNavigationElement = element;\n    callback();\n    delete this.currentNavigationElement;\n  }\n\n  #getFrameElementById(id) {\n    if (id != null) {\n      const element = id === \"_parent\" ?\n        this.element.parentElement.closest(\"turbo-frame\") :\n        document.getElementById(id);\n      if (element instanceof FrameElement) {\n        return element\n      }\n    }\n  }\n}\n\nfunction activateElement(element, currentURL) {\n  if (element) {\n    const src = element.getAttribute(\"src\");\n    if (src != null && currentURL != null && urlsAreEqual(src, currentURL)) {\n      throw new Error(`Matching <turbo-frame id=\"${element.id}\"> element has a source URL which references itself`)\n    }\n    if (element.ownerDocument !== document) {\n      element = document.importNode(element, true);\n    }\n\n    if (element instanceof FrameElement) {\n      element.connectedCallback();\n      element.disconnectedCallback();\n      return element\n    }\n  }\n}\n\nconst StreamActions = {\n  after() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e.nextSibling));\n  },\n\n  append() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.append(this.templateContent));\n  },\n\n  before() {\n    this.removeDuplicateTargetSiblings();\n    this.targetElements.forEach((e) => e.parentElement?.insertBefore(this.templateContent, e));\n  },\n\n  prepend() {\n    this.removeDuplicateTargetChildren();\n    this.targetElements.forEach((e) => e.prepend(this.templateContent));\n  },\n\n  remove() {\n    this.targetElements.forEach((e) => e.remove());\n  },\n\n  replace() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphElements(targetElement, this.templateContent);\n      } else {\n        targetElement.replaceWith(this.templateContent);\n      }\n    });\n  },\n\n  update() {\n    const method = this.getAttribute(\"method\");\n\n    this.targetElements.forEach((targetElement) => {\n      if (method === \"morph\") {\n        morphChildren(targetElement, this.templateContent);\n      } else {\n        targetElement.innerHTML = \"\";\n        targetElement.append(this.templateContent);\n      }\n    });\n  },\n\n  refresh() {\n    const method = this.getAttribute(\"method\");\n    const requestId = this.requestId;\n    const scroll = this.getAttribute(\"scroll\");\n\n    session.refresh(this.baseURI, { method, requestId, scroll });\n  }\n};\n\n// <turbo-stream action=replace target=id><template>...\n\n/**\n * Renders updates to the page from a stream of messages.\n *\n * Using the `action` attribute, this can be configured one of eight ways:\n *\n * - `after` - inserts the result after the target\n * - `append` - appends the result to the target\n * - `before` - inserts the result before the target\n * - `prepend` - prepends the result to the target\n * - `refresh` - initiates a page refresh\n * - `remove` - removes the target\n * - `replace` - replaces the outer HTML of the target\n * - `update` - replaces the inner HTML of the target\n *\n * @customElement turbo-stream\n * @example\n *   <turbo-stream action=\"append\" target=\"dom_id\">\n *     <template>\n *       Content to append to target designated with the dom_id.\n *     </template>\n *   </turbo-stream>\n */\nclass StreamElement extends HTMLElement {\n  static async renderElement(newElement) {\n    await newElement.performAction();\n  }\n\n  async connectedCallback() {\n    try {\n      await this.render();\n    } catch (error) {\n      console.error(error);\n    } finally {\n      this.disconnect();\n    }\n  }\n\n  async render() {\n    return (this.renderPromise ??= (async () => {\n      const event = this.beforeRenderEvent;\n\n      if (this.dispatchEvent(event)) {\n        await nextRepaint();\n        await event.detail.render(this);\n      }\n    })())\n  }\n\n  disconnect() {\n    try {\n      this.remove();\n      // eslint-disable-next-line no-empty\n    } catch {}\n  }\n\n  /**\n   * Removes duplicate children (by ID)\n   */\n  removeDuplicateTargetChildren() {\n    this.duplicateChildren.forEach((c) => c.remove());\n  }\n\n  /**\n   * Gets the list of duplicate children (i.e. those with the same ID)\n   */\n  get duplicateChildren() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.children]).filter((c) => !!c.getAttribute(\"id\"));\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.getAttribute(\"id\")).map((c) => c.getAttribute(\"id\"));\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.getAttribute(\"id\")))\n  }\n\n  /**\n  * Removes duplicate siblings (by ID)\n  */\n  removeDuplicateTargetSiblings() {\n    this.duplicateSiblings.forEach((c) => c.remove());\n  }\n\n  /**\n  * Gets the list of duplicate siblings (i.e. those with the same ID)\n  */\n  get duplicateSiblings() {\n    const existingChildren = this.targetElements.flatMap((e) => [...e.parentElement.children]).filter((c) => !!c.id);\n    const newChildrenIds = [...(this.templateContent?.children || [])].filter((c) => !!c.id).map((c) => c.id);\n\n    return existingChildren.filter((c) => newChildrenIds.includes(c.id))\n  }\n\n  /**\n   * Gets the action function to be performed.\n   */\n  get performAction() {\n    if (this.action) {\n      const actionFunction = StreamActions[this.action];\n      if (actionFunction) {\n        return actionFunction\n      }\n      this.#raise(\"unknown action\");\n    }\n    this.#raise(\"action attribute is missing\");\n  }\n\n  /**\n   * Gets the target elements which the template will be rendered to.\n   */\n  get targetElements() {\n    if (this.target) {\n      return this.targetElementsById\n    } else if (this.targets) {\n      return this.targetElementsByQuery\n    } else {\n      this.#raise(\"target or targets attribute is missing\");\n    }\n  }\n\n  /**\n   * Gets the contents of the main `<template>`.\n   */\n  get templateContent() {\n    return this.templateElement.content.cloneNode(true)\n  }\n\n  /**\n   * Gets the main `<template>` used for rendering\n   */\n  get templateElement() {\n    if (this.firstElementChild === null) {\n      const template = this.ownerDocument.createElement(\"template\");\n      this.appendChild(template);\n      return template\n    } else if (this.firstElementChild instanceof HTMLTemplateElement) {\n      return this.firstElementChild\n    }\n    this.#raise(\"first child element must be a <template> element\");\n  }\n\n  /**\n   * Gets the current action.\n   */\n  get action() {\n    return this.getAttribute(\"action\")\n  }\n\n  /**\n   * Gets the current target (an element ID) to which the result will\n   * be rendered.\n   */\n  get target() {\n    return this.getAttribute(\"target\")\n  }\n\n  /**\n   * Gets the current \"targets\" selector (a CSS selector)\n   */\n  get targets() {\n    return this.getAttribute(\"targets\")\n  }\n\n  /**\n   * Reads the request-id attribute\n   */\n  get requestId() {\n    return this.getAttribute(\"request-id\")\n  }\n\n  #raise(message) {\n    throw new Error(`${this.description}: ${message}`)\n  }\n\n  get description() {\n    return (this.outerHTML.match(/<[^>]+>/) ?? [])[0] ?? \"<turbo-stream>\"\n  }\n\n  get beforeRenderEvent() {\n    return new CustomEvent(\"turbo:before-stream-render\", {\n      bubbles: true,\n      cancelable: true,\n      detail: { newStream: this, render: StreamElement.renderElement }\n    })\n  }\n\n  get targetElementsById() {\n    const element = this.ownerDocument?.getElementById(this.target);\n\n    if (element !== null) {\n      return [element]\n    } else {\n      return []\n    }\n  }\n\n  get targetElementsByQuery() {\n    const elements = this.ownerDocument?.querySelectorAll(this.targets);\n\n    if (elements.length !== 0) {\n      return Array.prototype.slice.call(elements)\n    } else {\n      return []\n    }\n  }\n}\n\nclass StreamSourceElement extends HTMLElement {\n  streamSource = null\n\n  connectedCallback() {\n    this.streamSource = this.src.match(/^ws{1,2}:/) ? new WebSocket(this.src) : new EventSource(this.src);\n\n    connectStreamSource(this.streamSource);\n  }\n\n  disconnectedCallback() {\n    if (this.streamSource) {\n      this.streamSource.close();\n\n      disconnectStreamSource(this.streamSource);\n    }\n  }\n\n  get src() {\n    return this.getAttribute(\"src\") || \"\"\n  }\n}\n\nFrameElement.delegateConstructor = FrameController;\n\nif (customElements.get(\"turbo-frame\") === undefined) {\n  customElements.define(\"turbo-frame\", FrameElement);\n}\n\nif (customElements.get(\"turbo-stream\") === undefined) {\n  customElements.define(\"turbo-stream\", StreamElement);\n}\n\nif (customElements.get(\"turbo-stream-source\") === undefined) {\n  customElements.define(\"turbo-stream-source\", StreamSourceElement);\n}\n\n(() => {\n  const scriptElement = document.currentScript;\n  if (!scriptElement) return\n  if (scriptElement.hasAttribute(\"data-turbo-suppress-warning\")) return\n\n  let element = scriptElement.parentElement;\n  while (element) {\n    if (element == document.body) {\n      return console.warn(\n        unindent`\n        You are loading Turbo from a <script> element inside the <body> element. This is probably not what you meant to do!\n\n        Load your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\n        For more information, see: https://turbo.hotwired.dev/handbook/building#working-with-script-elements\n\n        \u2014\u2014\n        Suppress this warning by adding a \"data-turbo-suppress-warning\" attribute to: %s\n      `,\n        scriptElement.outerHTML\n      )\n    }\n\n    element = element.parentElement;\n  }\n})();\n\nwindow.Turbo = { ...Turbo, StreamActions };\nstart();\n\nexport { FetchEnctype, FetchMethod, FetchRequest, FetchResponse, FrameElement, FrameLoadingStyle, FrameRenderer, PageRenderer, PageSnapshot, StreamActions, StreamElement, StreamSourceElement, cache, config, connectStreamSource, disconnectStreamSource, fetchWithTurboHeaders as fetch, fetchEnctypeFromString, fetchMethodFromString, isSafe, morphBodyElements, morphChildren, morphElements, morphTurboFrameElements, sessionNavigator as navigator, registerAdapter, renderStreamMessage, session, setConfirmMethod, setFormMode, setProgressBarDelay, start, visit };\n", "let consumer\n\nexport async function getConsumer() {\n  return consumer || setConsumer(createConsumer().then(setConsumer))\n}\n\nexport function setConsumer(newConsumer) {\n  return consumer = newConsumer\n}\n\nexport async function createConsumer() {\n  const { createConsumer } = await import(/* webpackChunkName: \"actioncable\" */ \"@rails/actioncable/src\")\n  return createConsumer()\n}\n\nexport async function subscribeTo(channel, mixin) {\n  const { subscriptions } = await getConsumer()\n  return subscriptions.create(channel, mixin)\n}\n", "// Based on https://github.com/nathan7/snakeize\n//\n// This software is released under the MIT license:\n// Permission is hereby granted, free of charge, to any person obtaining a copy of\n// this software and associated documentation files (the \"Software\"), to deal in\n// the Software without restriction, including without limitation the rights to\n// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n// the Software, and to permit persons to whom the Software is furnished to do so,\n// subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\nexport default function walk (obj) {\n    if (!obj || typeof obj !== 'object') return obj;\n    if (obj instanceof Date || obj instanceof RegExp) return obj;\n    if (Array.isArray(obj)) return obj.map(walk);\n    return Object.keys(obj).reduce(function (acc, key) {\n        var camel = key[0].toLowerCase() + key.slice(1).replace(/([A-Z]+)/g, function (m, x) {\n            return '_' + x.toLowerCase();\n        });\n        acc[camel] = walk(obj[key]);\n        return acc;\n    }, {});\n};", "import { connectStreamSource, disconnectStreamSource } from \"@hotwired/turbo\"\nimport { subscribeTo } from \"./cable\"\nimport snakeize from \"./snakeize\"\n\nclass TurboCableStreamSourceElement extends HTMLElement {\n  static observedAttributes = [\"channel\", \"signed-stream-name\"]\n\n  async connectedCallback() {\n    connectStreamSource(this)\n    this.subscription = await subscribeTo(this.channel, {\n      received: this.dispatchMessageEvent.bind(this),\n      connected: this.subscriptionConnected.bind(this),\n      disconnected: this.subscriptionDisconnected.bind(this)\n    })\n  }\n\n  disconnectedCallback() {\n    disconnectStreamSource(this)\n    if (this.subscription) this.subscription.unsubscribe()\n    this.subscriptionDisconnected()\n  }\n\n  attributeChangedCallback() {\n    if (this.subscription) {\n      this.disconnectedCallback()\n      this.connectedCallback()\n    }\n  }\n\n  dispatchMessageEvent(data) {\n    const event = new MessageEvent(\"message\", { data })\n    return this.dispatchEvent(event)\n  }\n\n  subscriptionConnected() {\n    this.setAttribute(\"connected\", \"\")\n  }\n\n  subscriptionDisconnected() {\n    this.removeAttribute(\"connected\")\n  }\n\n  get channel() {\n    const channel = this.getAttribute(\"channel\")\n    const signed_stream_name = this.getAttribute(\"signed-stream-name\")\n    return { channel, signed_stream_name, ...snakeize({ ...this.dataset }) }\n  }\n}\n\n\nif (customElements.get(\"turbo-cable-stream-source\") === undefined) {\n  customElements.define(\"turbo-cable-stream-source\", TurboCableStreamSourceElement)\n}\n", "export function encodeMethodIntoRequestBody(event) {\n  if (event.target instanceof HTMLFormElement) {\n    const { target: form, detail: { fetchOptions } } = event\n\n    form.addEventListener(\"turbo:submit-start\", ({ detail: { formSubmission: { submitter } } }) => {\n      const body = isBodyInit(fetchOptions.body) ? fetchOptions.body : new URLSearchParams()\n      const method = determineFetchMethod(submitter, body, form)\n\n      if (!/get/i.test(method)) {\n        if (/post/i.test(method)) {\n          body.delete(\"_method\")\n        } else {\n          body.set(\"_method\", method)\n        }\n\n        fetchOptions.method = \"post\"\n      }\n    }, { once: true })\n  }\n}\n\nfunction determineFetchMethod(submitter, body, form) {\n  const formMethod = determineFormMethod(submitter)\n  const overrideMethod = body.get(\"_method\")\n  const method = form.getAttribute(\"method\") || \"get\"\n\n  if (typeof formMethod == \"string\") {\n    return formMethod\n  } else if (typeof overrideMethod == \"string\") {\n    return overrideMethod\n  } else {\n    return method\n  }\n}\n\nfunction determineFormMethod(submitter) {\n  if (submitter instanceof HTMLButtonElement || submitter instanceof HTMLInputElement) {\n    // Rails 7 ActionView::Helpers::FormBuilder#button method has an override\n    // for formmethod if the button does not have name or value attributes\n    // set, which is the default. This means that if you use <%= f.button\n    // formmethod: :delete %>, it will generate a <button name=\"_method\"\n    // value=\"delete\" formmethod=\"post\">. Therefore, if the submitter's name\n    // is already _method, it's value attribute already contains the desired\n    // method.\n    if (submitter.name === '_method') {\n      return submitter.value\n    } else if (submitter.hasAttribute(\"formmethod\")) {\n      return submitter.formMethod\n    } else {\n      return null\n    }\n  } else {\n    return null\n  }\n}\n\nfunction isBodyInit(body) {\n  return body instanceof FormData || body instanceof URLSearchParams\n}\n", "import \"./cable_stream_source_element\"\n\nimport * as Turbo from \"@hotwired/turbo\"\nexport { Turbo }\n\nimport * as cable from \"./cable\"\nexport { cable }\n\nimport { encodeMethodIntoRequestBody } from \"./fetch_requests\"\n\nwindow.Turbo = Turbo\n\naddEventListener(\"turbo:before-fetch-request\", encodeMethodIntoRequestBody)\n", "// Public site entry point (built by esbuild into app/assets/builds).\nimport \"./jquery\";\nimport \"@hotwired/turbo-rails\";\nimport * as ActiveStorage from \"@rails/activestorage\";\nimport \"bootstrap/dist/js/bootstrap\";\nimport \"datatables.net-bs4\";\n\nimport \"./homepage/dropdown-toggle\";\nimport \"./ems/accordion\";\nimport \"./ems/auto_submit\";\nimport \"./ems/toggle_table\";\n\nActiveStorage.start();\n", "/*! DataTables Bootstrap 4 integration\n * \u00A92011-2017 SpryMedia Ltd - datatables.net/license\n */\n\nimport $ from 'jquery';\nimport DataTable from 'datatables.net';\n\n\n/**\n * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and\n * DataTables 1.10 or newer.\n *\n * This file sets the defaults and adds options to DataTables to style its\n * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap\n * for further information.\n */\n\n/* Set the defaults for DataTables initialisation */\n$.extend( true, DataTable.defaults, {\n\tdom:\n\t\t\"<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>\" +\n\t\t\"<'row'<'col-sm-12'tr>>\" +\n\t\t\"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>\",\n\trenderer: 'bootstrap'\n} );\n\n\n/* Default class modification */\n$.extend( DataTable.ext.classes, {\n\tsWrapper:      \"dataTables_wrapper dt-bootstrap4\",\n\tsFilterInput:  \"form-control form-control-sm\",\n\tsLengthSelect: \"custom-select custom-select-sm form-control form-control-sm\",\n\tsProcessing:   \"dataTables_processing card\",\n\tsPageButton:   \"paginate_button page-item\"\n} );\n\n\n/* Bootstrap paging button renderer */\nDataTable.ext.renderer.pageButton.bootstrap = function ( settings, host, idx, buttons, page, pages ) {\n\tvar api     = new DataTable.Api( settings );\n\tvar classes = settings.oClasses;\n\tvar lang    = settings.oLanguage.oPaginate;\n\tvar aria = settings.oLanguage.oAria.paginate || {};\n\tvar btnDisplay, btnClass;\n\n\tvar attach = function( container, buttons ) {\n\t\tvar i, ien, node, button;\n\t\tvar clickHandler = function ( e ) {\n\t\t\te.preventDefault();\n\t\t\tif ( !$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action ) {\n\t\t\t\tapi.page( e.data.action ).draw( 'page' );\n\t\t\t}\n\t\t};\n\n\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\tbutton = buttons[i];\n\n\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\tattach( container, button );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbtnDisplay = '';\n\t\t\t\tbtnClass = '';\n\n\t\t\t\tswitch ( button ) {\n\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\tbtnDisplay = '&#x2026;';\n\t\t\t\t\t\tbtnClass = 'disabled';\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'first':\n\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\t\t\t\t\t\tbtnClass = button + (page > 0 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'next':\n\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'last':\n\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\t\t\t\t\t\tbtnClass = button + (page < pages-1 ?\n\t\t\t\t\t\t\t'' : ' disabled');\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbtnDisplay = button + 1;\n\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t'active' : '';\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif ( btnDisplay ) {\n\t\t\t\t\tvar disabled = btnClass.indexOf('disabled') !== -1;\n\n\t\t\t\t\tnode = $('<li>', {\n\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append( $('<a>', {\n\t\t\t\t\t\t\t\t'href': disabled ? null : '#',\n\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t'aria-disabled': disabled ? 'true' : null,\n\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t'aria-role': 'link',\n\t\t\t\t\t\t\t\t'aria-current': btnClass === 'active' ? 'page' : null,\n\t\t\t\t\t\t\t\t'data-dt-idx': button,\n\t\t\t\t\t\t\t\t'tabindex': settings.iTabIndex,\n\t\t\t\t\t\t\t\t'class': 'page-link'\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\tsettings.oApi._fnBindAction(\n\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t// inside an iframe or frame. \n\tvar activeEl;\n\n\ttry {\n\t\t// Because this approach is destroying and recreating the paging\n\t\t// elements, focus is lost on the select button which is bad for\n\t\t// accessibility. So we want to restore focus once the draw has\n\t\t// completed\n\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t}\n\tcatch (e) {}\n\n\tattach(\n\t\t$(host).empty().html('<ul class=\"pagination\"/>').children('ul'),\n\t\tbuttons\n\t);\n\n\tif ( activeEl !== undefined ) {\n\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t}\n};\n\n\nexport default DataTable;\n", "/*! DataTables 1.13.4\n * \u00A92008-2023 SpryMedia Ltd - datatables.net/license\n */\n\nimport jQuery from 'jquery';\n\n// DataTables code uses $ internally, but we want to be able to\n// reassign $ with the `use` method, so it is a regular var.\nlet $ = jQuery;\n\n\nvar DataTable = function ( selector, options )\n{\n\t// Check if called with a window or jQuery object for DOM less applications\n\t// This is for backwards compatibility\n\tif (DataTable.factory(selector, options)) {\n\t\treturn DataTable;\n\t}\n\n\t// When creating with `new`, create a new DataTable, returning the API instance\n\tif (this instanceof DataTable) {\n\t\treturn $(selector).DataTable(options);\n\t}\n\telse {\n\t\t// Argument switching\n\t\toptions = selector;\n\t}\n\n\t/**\n\t * Perform a jQuery selector action on the table's TR elements (from the tbody) and\n\t * return the resulting jQuery object.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select TR elements that meet the current filter\n\t *    criterion (\"applied\") or all TR elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the TR elements in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {object} jQuery object, filtered by the given selector.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Highlight every second row\n\t *      oTable.$('tr:odd').css('backgroundColor', 'blue');\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to rows with 'Webkit' in them, add a background colour and then\n\t *      // remove the filter, thus highlighting the 'Webkit' rows only.\n\t *      oTable.fnFilter('Webkit');\n\t *      oTable.$('tr', {\"search\": \"applied\"}).css('backgroundColor', 'blue');\n\t *      oTable.fnFilter('');\n\t *    } );\n\t */\n\tthis.$ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).$( sSelector, oOpts );\n\t};\n\t\n\t\n\t/**\n\t * Almost identical to $ in operation, but in this case returns the data for the matched\n\t * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes\n\t * rather than any descendants, so the data can be obtained for the row/cell. If matching\n\t * rows are found, the data returned is the original data array/object that was used to\n\t * create the row (or a generated array if from a DOM source).\n\t *\n\t * This method is often useful in-combination with $ where both functions are given the\n\t * same parameters and the array indexes will match identically.\n\t *  @param {string|node|jQuery} sSelector jQuery selector or node collection to act on\n\t *  @param {object} [oOpts] Optional parameters for modifying the rows to be included\n\t *  @param {string} [oOpts.filter=none] Select elements that meet the current filter\n\t *    criterion (\"applied\") or all elements (i.e. no filter).\n\t *  @param {string} [oOpts.order=current] Order of the data in the processed array.\n\t *    Can be either 'current', whereby the current sorting of the table is used, or\n\t *    'original' whereby the original order the data was read into the table is used.\n\t *  @param {string} [oOpts.page=all] Limit the selection to the currently displayed page\n\t *    (\"current\") or not (\"all\"). If 'current' is given, then order is assumed to be\n\t *    'current' and filter is 'applied', regardless of what they might be given as.\n\t *  @returns {array} Data for the matched elements. If any elements, as a result of the\n\t *    selector, were not TR, TD or TH elements in the DataTable, they will have a null\n\t *    entry in the array.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the data from the first row in the table\n\t *      var data = oTable._('tr:first');\n\t *\n\t *      // Do something useful with the data\n\t *      alert( \"First cell is: \"+data[0] );\n\t *    } );\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Filter to 'Webkit' and get all data for\n\t *      oTable.fnFilter('Webkit');\n\t *      var data = oTable._('tr', {\"search\": \"applied\"});\n\t *\n\t *      // Do something with the data\n\t *      alert( data.length+\" rows matched the search\" );\n\t *    } );\n\t */\n\tthis._ = function ( sSelector, oOpts )\n\t{\n\t\treturn this.api(true).rows( sSelector, oOpts ).data();\n\t};\n\t\n\t\n\t/**\n\t * Create a DataTables Api instance, with the currently selected tables for\n\t * the Api's context.\n\t * @param {boolean} [traditional=false] Set the API instance's context to be\n\t *   only the table referred to by the `DataTable.ext.iApiIndex` option, as was\n\t *   used in the API presented by DataTables 1.9- (i.e. the traditional mode),\n\t *   or if all tables captured in the jQuery object should be used.\n\t * @return {DataTables.Api}\n\t */\n\tthis.api = function ( traditional )\n\t{\n\t\treturn traditional ?\n\t\t\tnew _Api(\n\t\t\t\t_fnSettingsFromNode( this[ _ext.iApiIndex ] )\n\t\t\t) :\n\t\t\tnew _Api( this );\n\t};\n\t\n\t\n\t/**\n\t * Add a single new row or multiple rows of data to the table. Please note\n\t * that this is suitable for client-side processing only - if you are using\n\t * server-side processing (i.e. \"bServerSide\": true), then to add data, you\n\t * must add it to the data source, i.e. the server-side, through an Ajax call.\n\t *  @param {array|object} data The data to be added to the table. This can be:\n\t *    <ul>\n\t *      <li>1D array of data - add a single row with the data provided</li>\n\t *      <li>2D array of arrays - add multiple rows in a single call</li>\n\t *      <li>object - data object when using <i>mData</i></li>\n\t *      <li>array of objects - multiple data objects when using <i>mData</i></li>\n\t *    </ul>\n\t *  @param {bool} [redraw=true] redraw the table or not\n\t *  @returns {array} An array of integers, representing the list of indexes in\n\t *    <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to\n\t *    the table.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Global var for counter\n\t *    var giCount = 2;\n\t *\n\t *    $(document).ready(function() {\n\t *      $('#example').dataTable();\n\t *    } );\n\t *\n\t *    function fnClickAddRow() {\n\t *      $('#example').dataTable().fnAddData( [\n\t *        giCount+\".1\",\n\t *        giCount+\".2\",\n\t *        giCount+\".3\",\n\t *        giCount+\".4\" ]\n\t *      );\n\t *\n\t *      giCount++;\n\t *    }\n\t */\n\tthis.fnAddData = function( data, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\t/* Check if we want to add multiple rows or not */\n\t\tvar rows = Array.isArray(data) && ( Array.isArray(data[0]) || $.isPlainObject(data[0]) ) ?\n\t\t\tapi.rows.add( data ) :\n\t\t\tapi.row.add( data );\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn rows.flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * This function will make DataTables recalculate the column sizes, based on the data\n\t * contained in the table and the sizes applied to the columns (in the DOM, CSS or\n\t * through the sWidth parameter). This can be useful when the width of the table's\n\t * parent element changes (for example a window resize).\n\t *  @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable( {\n\t *        \"sScrollY\": \"200px\",\n\t *        \"bPaginate\": false\n\t *      } );\n\t *\n\t *      $(window).on('resize', function () {\n\t *        oTable.fnAdjustColumnSizing();\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnAdjustColumnSizing = function ( bRedraw )\n\t{\n\t\tvar api = this.api( true ).columns.adjust();\n\t\tvar settings = api.settings()[0];\n\t\tvar scroll = settings.oScroll;\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw( false );\n\t\t}\n\t\telse if ( scroll.sX !== \"\" || scroll.sY !== \"\" ) {\n\t\t\t/* If not redrawing, but scrolling, we want to apply the new column sizes anyway */\n\t\t\t_fnScrollDraw( settings );\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Quickly and simply clear a table\n\t *  @param {bool} [bRedraw=true] redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)\n\t *      oTable.fnClearTable();\n\t *    } );\n\t */\n\tthis.fnClearTable = function( bRedraw )\n\t{\n\t\tvar api = this.api( true ).clear();\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * The exact opposite of 'opening' a row, this function will close any rows which\n\t * are currently 'open'.\n\t *  @param {node} nTr the table row to 'close'\n\t *  @returns {int} 0 on success, or 1 if failed (can't find the row)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnClose = function( nTr )\n\t{\n\t\tthis.api( true ).row( nTr ).child.hide();\n\t};\n\t\n\t\n\t/**\n\t * Remove a row for the table\n\t *  @param {mixed} target The index of the row from aoData to be deleted, or\n\t *    the TR element you want to delete\n\t *  @param {function|null} [callBack] Callback function\n\t *  @param {bool} [redraw=true] Redraw the table or not\n\t *  @returns {array} The row that was deleted\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Immediately remove the first row\n\t *      oTable.fnDeleteRow( 0 );\n\t *    } );\n\t */\n\tthis.fnDeleteRow = function( target, callback, redraw )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar rows = api.rows( target );\n\t\tvar settings = rows.settings()[0];\n\t\tvar data = settings.aoData[ rows[0][0] ];\n\t\n\t\trows.remove();\n\t\n\t\tif ( callback ) {\n\t\t\tcallback.call( this, settings, data );\n\t\t}\n\t\n\t\tif ( redraw === undefined || redraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\n\t\treturn data;\n\t};\n\t\n\t\n\t/**\n\t * Restore the table to it's original state in the DOM by removing all of DataTables\n\t * enhancements, alterations to the DOM structure of the table and event listeners.\n\t *  @param {boolean} [remove=false] Completely remove the table from the DOM\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      // This example is fairly pointless in reality, but shows how fnDestroy can be used\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnDestroy();\n\t *    } );\n\t */\n\tthis.fnDestroy = function ( remove )\n\t{\n\t\tthis.api( true ).destroy( remove );\n\t};\n\t\n\t\n\t/**\n\t * Redraw the table\n\t *  @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Re-draw the table - you wouldn't want to do it here, but it's an example :-)\n\t *      oTable.fnDraw();\n\t *    } );\n\t */\n\tthis.fnDraw = function( complete )\n\t{\n\t\t// Note that this isn't an exact match to the old call to _fnDraw - it takes\n\t\t// into account the new data, but can hold position.\n\t\tthis.api( true ).draw( complete );\n\t};\n\t\n\t\n\t/**\n\t * Filter the input based on data\n\t *  @param {string} sInput String to filter the table on\n\t *  @param {int|null} [iColumn] Column to limit filtering to\n\t *  @param {bool} [bRegex=false] Treat as regular expression or not\n\t *  @param {bool} [bSmart=true] Perform smart filtering or not\n\t *  @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)\n\t *  @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sometime later - filter...\n\t *      oTable.fnFilter( 'test string' );\n\t *    } );\n\t */\n\tthis.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === null || iColumn === undefined ) {\n\t\t\tapi.search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\telse {\n\t\t\tapi.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );\n\t\t}\n\t\n\t\tapi.draw();\n\t};\n\t\n\t\n\t/**\n\t * Get the data for the whole table, an individual row or an individual cell based on the\n\t * provided parameters.\n\t *  @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as\n\t *    a TR node then the data source for the whole row will be returned. If given as a\n\t *    TD/TH cell node then iCol will be automatically calculated and the data for the\n\t *    cell returned. If given as an integer, then this is treated as the aoData internal\n\t *    data index for the row (see fnGetPosition) and the data for that row used.\n\t *  @param {int} [col] Optional column index that you want the data of.\n\t *  @returns {array|object|string} If mRow is undefined, then the data for all rows is\n\t *    returned. If mRow is defined, just data for that row, and is iCol is\n\t *    defined, only data for the designated cell is returned.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    // Row data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('tr').click( function () {\n\t *        var data = oTable.fnGetData( this );\n\t *        // ... do something with the array / object of data for the row\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Individual cell data\n\t *    $(document).ready(function() {\n\t *      oTable = $('#example').dataTable();\n\t *\n\t *      oTable.$('td').click( function () {\n\t *        var sData = oTable.fnGetData( this );\n\t *        alert( 'The cell clicked on had the value of '+sData );\n\t *      } );\n\t *    } );\n\t */\n\tthis.fnGetData = function( src, col )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( src !== undefined ) {\n\t\t\tvar type = src.nodeName ? src.nodeName.toLowerCase() : '';\n\t\n\t\t\treturn col !== undefined || type == 'td' || type == 'th' ?\n\t\t\t\tapi.cell( src, col ).data() :\n\t\t\t\tapi.row( src ).data() || null;\n\t\t}\n\t\n\t\treturn api.data().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get an array of the TR nodes that are used in the table's body. Note that you will\n\t * typically want to use the '$' API method in preference to this as it is more\n\t * flexible.\n\t *  @param {int} [iRow] Optional row index for the TR element you want\n\t *  @returns {array|node} If iRow is undefined, returns an array of all TR elements\n\t *    in the table's body, or iRow is defined, just the TR element requested.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Get the nodes from the table\n\t *      var nNodes = oTable.fnGetNodes( );\n\t *    } );\n\t */\n\tthis.fnGetNodes = function( iRow )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\treturn iRow !== undefined ?\n\t\t\tapi.row( iRow ).node() :\n\t\t\tapi.rows().nodes().flatten().toArray();\n\t};\n\t\n\t\n\t/**\n\t * Get the array indexes of a particular cell from it's DOM element\n\t * and column index including hidden columns\n\t *  @param {node} node this can either be a TR, TD or TH in the table's body\n\t *  @returns {int} If nNode is given as a TR, then a single index is returned, or\n\t *    if given as a cell, an array of [row index, column index (visible),\n\t *    column index (all)] is given.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      $('#example tbody td').click( function () {\n\t *        // Get the position of the current data from the node\n\t *        var aPos = oTable.fnGetPosition( this );\n\t *\n\t *        // Get the data array for this row\n\t *        var aData = oTable.fnGetData( aPos[0] );\n\t *\n\t *        // Update the data array and return the value\n\t *        aData[ aPos[1] ] = 'clicked';\n\t *        this.innerHTML = 'clicked';\n\t *      } );\n\t *\n\t *      // Init DataTables\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnGetPosition = function( node )\n\t{\n\t\tvar api = this.api( true );\n\t\tvar nodeName = node.nodeName.toUpperCase();\n\t\n\t\tif ( nodeName == 'TR' ) {\n\t\t\treturn api.row( node ).index();\n\t\t}\n\t\telse if ( nodeName == 'TD' || nodeName == 'TH' ) {\n\t\t\tvar cell = api.cell( node ).index();\n\t\n\t\t\treturn [\n\t\t\t\tcell.row,\n\t\t\t\tcell.columnVisible,\n\t\t\t\tcell.column\n\t\t\t];\n\t\t}\n\t\treturn null;\n\t};\n\t\n\t\n\t/**\n\t * Check to see if a row is 'open' or not.\n\t *  @param {node} nTr the table row to check\n\t *  @returns {boolean} true if the row is currently open, false otherwise\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnIsOpen = function( nTr )\n\t{\n\t\treturn this.api( true ).row( nTr ).child.isShown();\n\t};\n\t\n\t\n\t/**\n\t * This function will place a new row directly after a row which is currently\n\t * on display on the page, with the HTML contents that is passed into the\n\t * function. This can be used, for example, to ask for confirmation that a\n\t * particular record should be deleted.\n\t *  @param {node} nTr The table row to 'open'\n\t *  @param {string|node|jQuery} mHtml The HTML to put into the row\n\t *  @param {string} sClass Class to give the new TD cell\n\t *  @returns {node} The row opened. Note that if the table row passed in as the\n\t *    first parameter, is not found in the table, this method will silently\n\t *    return.\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable;\n\t *\n\t *      // 'open' an information row when a row is clicked on\n\t *      $('#example tbody tr').click( function () {\n\t *        if ( oTable.fnIsOpen(this) ) {\n\t *          oTable.fnClose( this );\n\t *        } else {\n\t *          oTable.fnOpen( this, \"Temporary row opened\", \"info_row\" );\n\t *        }\n\t *      } );\n\t *\n\t *      oTable = $('#example').dataTable();\n\t *    } );\n\t */\n\tthis.fnOpen = function( nTr, mHtml, sClass )\n\t{\n\t\treturn this.api( true )\n\t\t\t.row( nTr )\n\t\t\t.child( mHtml, sClass )\n\t\t\t.show()\n\t\t\t.child()[0];\n\t};\n\t\n\t\n\t/**\n\t * Change the pagination - provides the internal logic for pagination in a simple API\n\t * function. With this function you can have a DataTables table go to the next,\n\t * previous, first or last pages.\n\t *  @param {string|int} mAction Paging action to take: \"first\", \"previous\", \"next\" or \"last\"\n\t *    or page number to jump to (integer), note that page 0 is the first page.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnPageChange( 'next' );\n\t *    } );\n\t */\n\tthis.fnPageChange = function ( mAction, bRedraw )\n\t{\n\t\tvar api = this.api( true ).page( mAction );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw(false);\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Show a particular column\n\t *  @param {int} iCol The column whose display should be changed\n\t *  @param {bool} bShow Show (true) or hide (false) the column\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Hide the second column after initialisation\n\t *      oTable.fnSetColumnVis( 1, false );\n\t *    } );\n\t */\n\tthis.fnSetColumnVis = function ( iCol, bShow, bRedraw )\n\t{\n\t\tvar api = this.api( true ).column( iCol ).visible( bShow );\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.columns.adjust().draw();\n\t\t}\n\t};\n\t\n\t\n\t/**\n\t * Get the settings for a particular table for external manipulation\n\t *  @returns {object} DataTables settings object. See\n\t *    {@link DataTable.models.oSettings}\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      var oSettings = oTable.fnSettings();\n\t *\n\t *      // Show an example parameter from the settings\n\t *      alert( oSettings._iDisplayStart );\n\t *    } );\n\t */\n\tthis.fnSettings = function()\n\t{\n\t\treturn _fnSettingsFromNode( this[_ext.iApiIndex] );\n\t};\n\t\n\t\n\t/**\n\t * Sort the table by a particular column\n\t *  @param {int} iCol the data index to sort on. Note that this will not match the\n\t *    'display index' if you have hidden data entries\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort immediately with columns 0 and 1\n\t *      oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );\n\t *    } );\n\t */\n\tthis.fnSort = function( aaSort )\n\t{\n\t\tthis.api( true ).order( aaSort ).draw();\n\t};\n\t\n\t\n\t/**\n\t * Attach a sort listener to an element for a given column\n\t *  @param {node} nNode the element to attach the sort listener to\n\t *  @param {int} iColumn the column that a click on this node will sort on\n\t *  @param {function} [fnCallback] callback function when sort is run\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *\n\t *      // Sort on column 1, when 'sorter' is clicked on\n\t *      oTable.fnSortListener( document.getElementById('sorter'), 1 );\n\t *    } );\n\t */\n\tthis.fnSortListener = function( nNode, iColumn, fnCallback )\n\t{\n\t\tthis.api( true ).order.listener( nNode, iColumn, fnCallback );\n\t};\n\t\n\t\n\t/**\n\t * Update a table cell or row - this method will accept either a single value to\n\t * update the cell with, an array of values with one element for each column or\n\t * an object in the same format as the original data source. The function is\n\t * self-referencing in order to make the multi column updates easier.\n\t *  @param {object|array|string} mData Data to update the cell/row with\n\t *  @param {node|int} mRow TR element you want to update or the aoData index\n\t *  @param {int} [iColumn] The column to update, give as null or undefined to\n\t *    update a whole row.\n\t *  @param {bool} [bRedraw=true] Redraw the table or not\n\t *  @param {bool} [bAction=true] Perform pre-draw actions or not\n\t *  @returns {int} 0 on success, 1 on error\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell\n\t *      oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row\n\t *    } );\n\t */\n\tthis.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )\n\t{\n\t\tvar api = this.api( true );\n\t\n\t\tif ( iColumn === undefined || iColumn === null ) {\n\t\t\tapi.row( mRow ).data( mData );\n\t\t}\n\t\telse {\n\t\t\tapi.cell( mRow, iColumn ).data( mData );\n\t\t}\n\t\n\t\tif ( bAction === undefined || bAction ) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t\n\t\tif ( bRedraw === undefined || bRedraw ) {\n\t\t\tapi.draw();\n\t\t}\n\t\treturn 0;\n\t};\n\t\n\t\n\t/**\n\t * Provide a common method for plug-ins to check the version of DataTables being used, in order\n\t * to ensure compatibility.\n\t *  @param {string} sVersion Version string to check for, in the format \"X.Y.Z\". Note that the\n\t *    formats \"X\" and \"X.Y\" are also acceptable.\n\t *  @returns {boolean} true if this version of DataTables is greater or equal to the required\n\t *    version, or false if this version of DataTales is not suitable\n\t *  @method\n\t *  @dtopt API\n\t *  @deprecated Since v1.10\n\t *\n\t *  @example\n\t *    $(document).ready(function() {\n\t *      var oTable = $('#example').dataTable();\n\t *      alert( oTable.fnVersionCheck( '1.9.0' ) );\n\t *    } );\n\t */\n\tthis.fnVersionCheck = _ext.fnVersionCheck;\n\t\n\n\tvar _that = this;\n\tvar emptyInit = options === undefined;\n\tvar len = this.length;\n\n\tif ( emptyInit ) {\n\t\toptions = {};\n\t}\n\n\tthis.oApi = this.internal = _ext.internal;\n\n\t// Extend with old style plug-in API methods\n\tfor ( var fn in DataTable.ext.internal ) {\n\t\tif ( fn ) {\n\t\t\tthis[fn] = _fnExternApiFunc(fn);\n\t\t}\n\t}\n\n\tthis.each(function() {\n\t\t// For each initialisation we want to give it a clean initialisation\n\t\t// object that can be bashed around\n\t\tvar o = {};\n\t\tvar oInit = len > 1 ? // optimisation for single table case\n\t\t\t_fnExtend( o, options, true ) :\n\t\t\toptions;\n\n\t\t/*global oInit,_that,emptyInit*/\n\t\tvar i=0, iLen, j, jLen, k, kLen;\n\t\tvar sId = this.getAttribute( 'id' );\n\t\tvar bInitHandedOff = false;\n\t\tvar defaults = DataTable.defaults;\n\t\tvar $this = $(this);\n\t\t\n\t\t\n\t\t/* Sanity check */\n\t\tif ( this.nodeName.toLowerCase() != 'table' )\n\t\t{\n\t\t\t_fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );\n\t\t\treturn;\n\t\t}\n\t\t\n\t\t/* Backwards compatibility for the defaults */\n\t\t_fnCompatOpts( defaults );\n\t\t_fnCompatCols( defaults.column );\n\t\t\n\t\t/* Convert the camel-case defaults to Hungarian */\n\t\t_fnCamelToHungarian( defaults, defaults, true );\n\t\t_fnCamelToHungarian( defaults.column, defaults.column, true );\n\t\t\n\t\t/* Setting up the initialisation object */\n\t\t_fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ), true );\n\t\t\n\t\t\n\t\t\n\t\t/* Check to see if we are re-initialising a table */\n\t\tvar allSettings = DataTable.settings;\n\t\tfor ( i=0, iLen=allSettings.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tvar s = allSettings[i];\n\t\t\n\t\t\t/* Base check on table node */\n\t\t\tif (\n\t\t\t\ts.nTable == this ||\n\t\t\t\t(s.nTHead && s.nTHead.parentNode == this) ||\n\t\t\t\t(s.nTFoot && s.nTFoot.parentNode == this)\n\t\t\t) {\n\t\t\t\tvar bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;\n\t\t\t\tvar bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;\n\t\t\n\t\t\t\tif ( emptyInit || bRetrieve )\n\t\t\t\t{\n\t\t\t\t\treturn s.oInstance;\n\t\t\t\t}\n\t\t\t\telse if ( bDestroy )\n\t\t\t\t{\n\t\t\t\t\ts.oInstance.fnDestroy();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\t_fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* If the element we are initialising has the same ID as a table which was previously\n\t\t\t * initialised, but the table nodes don't match (from before) then we destroy the old\n\t\t\t * instance by simply deleting it. This is under the assumption that the table has been\n\t\t\t * destroyed by other methods. Anyone using non-id selectors will need to do this manually\n\t\t\t */\n\t\t\tif ( s.sTableId == this.id )\n\t\t\t{\n\t\t\t\tallSettings.splice( i, 1 );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Ensure the table has an ID - required for accessibility */\n\t\tif ( sId === null || sId === \"\" )\n\t\t{\n\t\t\tsId = \"DataTables_Table_\"+(DataTable.ext._unique++);\n\t\t\tthis.id = sId;\n\t\t}\n\t\t\n\t\t/* Create the settings object for this table and set some of the default parameters */\n\t\tvar oSettings = $.extend( true, {}, DataTable.models.oSettings, {\n\t\t\t\"sDestroyWidth\": $this[0].style.width,\n\t\t\t\"sInstance\":     sId,\n\t\t\t\"sTableId\":      sId\n\t\t} );\n\t\toSettings.nTable = this;\n\t\toSettings.oApi   = _that.internal;\n\t\toSettings.oInit  = oInit;\n\t\t\n\t\tallSettings.push( oSettings );\n\t\t\n\t\t// Need to add the instance after the instance after the settings object has been added\n\t\t// to the settings array, so we can self reference the table instance if more than one\n\t\toSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();\n\t\t\n\t\t// Backwards compatibility, before we apply all the defaults\n\t\t_fnCompatOpts( oInit );\n\t\t_fnLanguageCompat( oInit.oLanguage );\n\t\t\n\t\t// If the length menu is given, but the init display length is not, use the length menu\n\t\tif ( oInit.aLengthMenu && ! oInit.iDisplayLength )\n\t\t{\n\t\t\toInit.iDisplayLength = Array.isArray( oInit.aLengthMenu[0] ) ?\n\t\t\t\toInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];\n\t\t}\n\t\t\n\t\t// Apply the defaults and init options to make a single init object will all\n\t\t// options defined from defaults and instance options.\n\t\toInit = _fnExtend( $.extend( true, {}, defaults ), oInit );\n\t\t\n\t\t\n\t\t// Map the initialisation options onto the settings object\n\t\t_fnMap( oSettings.oFeatures, oInit, [\n\t\t\t\"bPaginate\",\n\t\t\t\"bLengthChange\",\n\t\t\t\"bFilter\",\n\t\t\t\"bSort\",\n\t\t\t\"bSortMulti\",\n\t\t\t\"bInfo\",\n\t\t\t\"bProcessing\",\n\t\t\t\"bAutoWidth\",\n\t\t\t\"bSortClasses\",\n\t\t\t\"bServerSide\",\n\t\t\t\"bDeferRender\"\n\t\t] );\n\t\t_fnMap( oSettings, oInit, [\n\t\t\t\"asStripeClasses\",\n\t\t\t\"ajax\",\n\t\t\t\"fnServerData\",\n\t\t\t\"fnFormatNumber\",\n\t\t\t\"sServerMethod\",\n\t\t\t\"aaSorting\",\n\t\t\t\"aaSortingFixed\",\n\t\t\t\"aLengthMenu\",\n\t\t\t\"sPaginationType\",\n\t\t\t\"sAjaxSource\",\n\t\t\t\"sAjaxDataProp\",\n\t\t\t\"iStateDuration\",\n\t\t\t\"sDom\",\n\t\t\t\"bSortCellsTop\",\n\t\t\t\"iTabIndex\",\n\t\t\t\"fnStateLoadCallback\",\n\t\t\t\"fnStateSaveCallback\",\n\t\t\t\"renderer\",\n\t\t\t\"searchDelay\",\n\t\t\t\"rowId\",\n\t\t\t[ \"iCookieDuration\", \"iStateDuration\" ], // backwards compat\n\t\t\t[ \"oSearch\", \"oPreviousSearch\" ],\n\t\t\t[ \"aoSearchCols\", \"aoPreSearchCols\" ],\n\t\t\t[ \"iDisplayLength\", \"_iDisplayLength\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oScroll, oInit, [\n\t\t\t[ \"sScrollX\", \"sX\" ],\n\t\t\t[ \"sScrollXInner\", \"sXInner\" ],\n\t\t\t[ \"sScrollY\", \"sY\" ],\n\t\t\t[ \"bScrollCollapse\", \"bCollapse\" ]\n\t\t] );\n\t\t_fnMap( oSettings.oLanguage, oInit, \"fnInfoCallback\" );\n\t\t\n\t\t/* Callback functions which are array driven */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback',       oInit.fnDrawCallback,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoServerParams',       oInit.fnServerParams,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateSaveParams',    oInit.fnStateSaveParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoadParams',    oInit.fnStateLoadParams,   'user' );\n\t\t_fnCallbackReg( oSettings, 'aoStateLoaded',        oInit.fnStateLoaded,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCallback',        oInit.fnRowCallback,       'user' );\n\t\t_fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow,        'user' );\n\t\t_fnCallbackReg( oSettings, 'aoHeaderCallback',     oInit.fnHeaderCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoFooterCallback',     oInit.fnFooterCallback,    'user' );\n\t\t_fnCallbackReg( oSettings, 'aoInitComplete',       oInit.fnInitComplete,      'user' );\n\t\t_fnCallbackReg( oSettings, 'aoPreDrawCallback',    oInit.fnPreDrawCallback,   'user' );\n\t\t\n\t\toSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );\n\t\t\n\t\t/* Browser support detection */\n\t\t_fnBrowserDetect( oSettings );\n\t\t\n\t\tvar oClasses = oSettings.oClasses;\n\t\t\n\t\t$.extend( oClasses, DataTable.ext.classes, oInit.oClasses );\n\t\t$this.addClass( oClasses.sTable );\n\t\t\n\t\t\n\t\tif ( oSettings.iInitDisplayStart === undefined )\n\t\t{\n\t\t\t/* Display start point, taking into account the save saving */\n\t\t\toSettings.iInitDisplayStart = oInit.iDisplayStart;\n\t\t\toSettings._iDisplayStart = oInit.iDisplayStart;\n\t\t}\n\t\t\n\t\tif ( oInit.iDeferLoading !== null )\n\t\t{\n\t\t\toSettings.bDeferLoading = true;\n\t\t\tvar tmp = Array.isArray( oInit.iDeferLoading );\n\t\t\toSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;\n\t\t\toSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;\n\t\t}\n\t\t\n\t\t/* Language definitions */\n\t\tvar oLanguage = oSettings.oLanguage;\n\t\t$.extend( true, oLanguage, oInit.oLanguage );\n\t\t\n\t\tif ( oLanguage.sUrl )\n\t\t{\n\t\t\t/* Get the language definitions from a file - because this Ajax call makes the language\n\t\t\t * get async to the remainder of this function we use bInitHandedOff to indicate that\n\t\t\t * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor\n\t\t\t */\n\t\t\t$.ajax( {\n\t\t\t\tdataType: 'json',\n\t\t\t\turl: oLanguage.sUrl,\n\t\t\t\tsuccess: function ( json ) {\n\t\t\t\t\t_fnCamelToHungarian( defaults.oLanguage, json );\n\t\t\t\t\t_fnLanguageCompat( json );\n\t\t\t\t\t$.extend( true, oLanguage, json, oSettings.oInit.oLanguage );\n\t\t\n\t\t\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t},\n\t\t\t\terror: function () {\n\t\t\t\t\t// Error occurred loading language file, continue on as best we can\n\t\t\t\t\t_fnInitialise( oSettings );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tbInitHandedOff = true;\n\t\t}\n\t\telse {\n\t\t\t_fnCallbackFire( oSettings, null, 'i18n', [oSettings]);\n\t\t}\n\t\t\n\t\t/*\n\t\t * Stripes\n\t\t */\n\t\tif ( oInit.asStripeClasses === null )\n\t\t{\n\t\t\toSettings.asStripeClasses =[\n\t\t\t\toClasses.sStripeOdd,\n\t\t\t\toClasses.sStripeEven\n\t\t\t];\n\t\t}\n\t\t\n\t\t/* Remove row stripe classes if they are already on the table row */\n\t\tvar stripeClasses = oSettings.asStripeClasses;\n\t\tvar rowOne = $this.children('tbody').find('tr').eq(0);\n\t\tif ( $.inArray( true, $.map( stripeClasses, function(el, i) {\n\t\t\treturn rowOne.hasClass(el);\n\t\t} ) ) !== -1 ) {\n\t\t\t$('tbody tr', this).removeClass( stripeClasses.join(' ') );\n\t\t\toSettings.asDestroyStripes = stripeClasses.slice();\n\t\t}\n\t\t\n\t\t/*\n\t\t * Columns\n\t\t * See if we should load columns automatically or use defined ones\n\t\t */\n\t\tvar anThs = [];\n\t\tvar aoColumnsInit;\n\t\tvar nThead = this.getElementsByTagName('thead');\n\t\tif ( nThead.length !== 0 )\n\t\t{\n\t\t\t_fnDetectHeader( oSettings.aoHeader, nThead[0] );\n\t\t\tanThs = _fnGetUniqueThs( oSettings );\n\t\t}\n\t\t\n\t\t/* If not given a column array, generate one with nulls */\n\t\tif ( oInit.aoColumns === null )\n\t\t{\n\t\t\taoColumnsInit = [];\n\t\t\tfor ( i=0, iLen=anThs.length ; i<iLen ; i++ )\n\t\t\t{\n\t\t\t\taoColumnsInit.push( null );\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\taoColumnsInit = oInit.aoColumns;\n\t\t}\n\t\t\n\t\t/* Add the columns */\n\t\tfor ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )\n\t\t{\n\t\t\t_fnAddColumn( oSettings, anThs ? anThs[i] : null );\n\t\t}\n\t\t\n\t\t/* Apply the column definitions */\n\t\t_fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {\n\t\t\t_fnColumnOptions( oSettings, iCol, oDef );\n\t\t} );\n\t\t\n\t\t/* HTML5 attribute detection - build an mData object automatically if the\n\t\t * attributes are found\n\t\t */\n\t\tif ( rowOne.length ) {\n\t\t\tvar a = function ( cell, name ) {\n\t\t\t\treturn cell.getAttribute( 'data-'+name ) !== null ? name : null;\n\t\t\t};\n\t\t\n\t\t\t$( rowOne[0] ).children('th, td').each( function (i, cell) {\n\t\t\t\tvar col = oSettings.aoColumns[i];\n\t\t\n\t\t\t\tif (! col) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t\t}\n\t\t\n\t\t\t\tif ( col.mData === i ) {\n\t\t\t\t\tvar sort = a( cell, 'sort' ) || a( cell, 'order' );\n\t\t\t\t\tvar filter = a( cell, 'filter' ) || a( cell, 'search' );\n\t\t\n\t\t\t\t\tif ( sort !== null || filter !== null ) {\n\t\t\t\t\t\tcol.mData = {\n\t\t\t\t\t\t\t_:      i+'.display',\n\t\t\t\t\t\t\tsort:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\ttype:   sort !== null   ? i+'.@data-'+sort   : undefined,\n\t\t\t\t\t\t\tfilter: filter !== null ? i+'.@data-'+filter : undefined\n\t\t\t\t\t\t};\n\t\t\t\t\t\tcol._isArrayHost = true;\n\t\t\n\t\t\t\t\t\t_fnColumnOptions( oSettings, i );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\t\n\t\tvar features = oSettings.oFeatures;\n\t\tvar loadedInit = function () {\n\t\t\t/*\n\t\t\t * Sorting\n\t\t\t * @todo For modularisation (1.11) this needs to do into a sort start up handler\n\t\t\t */\n\t\t\n\t\t\t// If aaSorting is not defined, then we use the first indicator in asSorting\n\t\t\t// in case that has been altered, so the default sort reflects that option\n\t\t\tif ( oInit.aaSorting === undefined ) {\n\t\t\t\tvar sorting = oSettings.aaSorting;\n\t\t\t\tfor ( i=0, iLen=sorting.length ; i<iLen ; i++ ) {\n\t\t\t\t\tsorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\t/* Do a first pass on the sorting classes (allows any size changes to be taken into\n\t\t\t * account, and also will apply sorting disabled classes if disabled\n\t\t\t */\n\t\t\t_fnSortingClasses( oSettings );\n\t\t\n\t\t\tif ( features.bSort ) {\n\t\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\t\tif ( oSettings.bSorted ) {\n\t\t\t\t\t\tvar aSort = _fnSortFlatten( oSettings );\n\t\t\t\t\t\tvar sortedColumns = {};\n\t\t\n\t\t\t\t\t\t$.each( aSort, function (i, val) {\n\t\t\t\t\t\t\tsortedColumns[ val.src ] = val.dir;\n\t\t\t\t\t\t} );\n\t\t\n\t\t\t\t\t\t_fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );\n\t\t\t\t\t\t_fnSortAria( oSettings );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t\n\t\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', function () {\n\t\t\t\tif ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {\n\t\t\t\t\t_fnSortingClasses( oSettings );\n\t\t\t\t}\n\t\t\t}, 'sc' );\n\t\t\n\t\t\n\t\t\t/*\n\t\t\t * Final init\n\t\t\t * Cache the header, body and footer as required, creating them if needed\n\t\t\t */\n\t\t\n\t\t\t// Work around for Webkit bug 83867 - store the caption-side before removing from doc\n\t\t\tvar captions = $this.children('caption').each( function () {\n\t\t\t\tthis._captionSide = $(this).css('caption-side');\n\t\t\t} );\n\t\t\n\t\t\tvar thead = $this.children('thead');\n\t\t\tif ( thead.length === 0 ) {\n\t\t\t\tthead = $('<thead/>').appendTo($this);\n\t\t\t}\n\t\t\toSettings.nTHead = thead[0];\n\t\t\n\t\t\tvar tbody = $this.children('tbody');\n\t\t\tif ( tbody.length === 0 ) {\n\t\t\t\ttbody = $('<tbody/>').insertAfter(thead);\n\t\t\t}\n\t\t\toSettings.nTBody = tbody[0];\n\t\t\n\t\t\tvar tfoot = $this.children('tfoot');\n\t\t\tif ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== \"\" || oSettings.oScroll.sY !== \"\") ) {\n\t\t\t\t// If we are a scrolling table, and no footer has been given, then we need to create\n\t\t\t\t// a tfoot element for the caption element to be appended to\n\t\t\t\ttfoot = $('<tfoot/>').appendTo($this);\n\t\t\t}\n\t\t\n\t\t\tif ( tfoot.length === 0 || tfoot.children().length === 0 ) {\n\t\t\t\t$this.addClass( oClasses.sNoFooter );\n\t\t\t}\n\t\t\telse if ( tfoot.length > 0 ) {\n\t\t\t\toSettings.nTFoot = tfoot[0];\n\t\t\t\t_fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );\n\t\t\t}\n\t\t\n\t\t\t/* Check if there is data passing into the constructor */\n\t\t\tif ( oInit.aaData ) {\n\t\t\t\tfor ( i=0 ; i<oInit.aaData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( oSettings, oInit.aaData[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) {\n\t\t\t\t/* Grab the data from the page - only do this when deferred loading or no Ajax\n\t\t\t\t * source since there is no point in reading the DOM data if we are then going\n\t\t\t\t * to replace it with Ajax data\n\t\t\t\t */\n\t\t\t\t_fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );\n\t\t\t}\n\t\t\n\t\t\t/* Copy the data index array */\n\t\t\toSettings.aiDisplay = oSettings.aiDisplayMaster.slice();\n\t\t\n\t\t\t/* Initialisation complete - table can be drawn */\n\t\t\toSettings.bInitialised = true;\n\t\t\n\t\t\t/* Check if we need to initialise the table (it might not have been handed off to the\n\t\t\t * language processor)\n\t\t\t */\n\t\t\tif ( bInitHandedOff === false ) {\n\t\t\t\t_fnInitialise( oSettings );\n\t\t\t}\n\t\t};\n\t\t\n\t\t/* Must be done after everything which can be overridden by the state saving! */\n\t\t_fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );\n\t\t\n\t\tif ( oInit.bStateSave )\n\t\t{\n\t\t\tfeatures.bStateSave = true;\n\t\t\t_fnLoadState( oSettings, oInit, loadedInit );\n\t\t}\n\t\telse {\n\t\t\tloadedInit();\n\t\t}\n\t\t\n\t} );\n\t_that = null;\n\treturn this;\n};\n\n\n/*\n * It is useful to have variables which are scoped locally so only the\n * DataTables functions can access them and they don't leak into global space.\n * At the same time these functions are often useful over multiple files in the\n * core and API, so we list, or at least document, all variables which are used\n * by DataTables as private variables here. This also ensures that there is no\n * clashing of variable names and that they can easily referenced for reuse.\n */\n\n\n// Defined else where\n//  _selector_run\n//  _selector_opts\n//  _selector_first\n//  _selector_row_indexes\n\nvar _ext; // DataTable.ext\nvar _Api; // DataTable.Api\nvar _api_register; // DataTable.Api.register\nvar _api_registerPlural; // DataTable.Api.registerPlural\n\nvar _re_dic = {};\nvar _re_new_lines = /[\\r\\n\\u2028]/g;\nvar _re_html = /<.*?>/g;\n\n// This is not strict ISO8601 - Date.parse() is quite lax, although\n// implementations differ between browsers.\nvar _re_date = /^\\d{2,4}[\\.\\/\\-]\\d{1,2}[\\.\\/\\-]\\d{1,2}([T ]{1}\\d{1,2}[:\\.]\\d{2}([\\.:]\\d{2})?)?$/;\n\n// Escape regular expression special characters\nvar _re_escape_regex = new RegExp( '(\\\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\', '$', '^', '-' ].join('|\\\\') + ')', 'g' );\n\n// http://en.wikipedia.org/wiki/Foreign_exchange_market\n// - \\u20BD - Russian ruble.\n// - \\u20a9 - South Korean Won\n// - \\u20BA - Turkish Lira\n// - \\u20B9 - Indian Rupee\n// - R - Brazil (R$) and South Africa\n// - fr - Swiss Franc\n// - kr - Swedish krona, Norwegian krone and Danish krone\n// - \\u2009 is thin space and \\u202F is narrow no-break space, both used in many\n// - \u0243 - Bitcoin\n// - \u039E - Ethereum\n//   standards as thousands separators.\nvar _re_formatted_numeric = /['\\u00A0,$\u00A3\u20AC\u00A5%\\u2009\\u202F\\u20BD\\u20a9\\u20BArfk\u0243\u039E]/gi;\n\n\nvar _empty = function ( d ) {\n\treturn !d || d === true || d === '-' ? true : false;\n};\n\n\nvar _intVal = function ( s ) {\n\tvar integer = parseInt( s, 10 );\n\treturn !isNaN(integer) && isFinite(s) ? integer : null;\n};\n\n// Convert from a formatted number with characters other than `.` as the\n// decimal place, to a Javascript number\nvar _numToDecimal = function ( num, decimalPoint ) {\n\t// Cache created regular expressions for speed as this function is called often\n\tif ( ! _re_dic[ decimalPoint ] ) {\n\t\t_re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );\n\t}\n\treturn typeof num === 'string' && decimalPoint !== '.' ?\n\t\tnum.replace( /\\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :\n\t\tnum;\n};\n\n\nvar _isNumber = function ( d, decimalPoint, formatted ) {\n\tlet type = typeof d;\n\tvar strType = type === 'string';\n\n\tif ( type === 'number' || type === 'bigint') {\n\t\treturn true;\n\t}\n\n\t// If empty return immediately so there must be a number if it is a\n\t// formatted string (this stops the string \"k\", or \"kr\", etc being detected\n\t// as a formatted number for currency\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tif ( decimalPoint && strType ) {\n\t\td = _numToDecimal( d, decimalPoint );\n\t}\n\n\tif ( formatted && strType ) {\n\t\td = d.replace( _re_formatted_numeric, '' );\n\t}\n\n\treturn !isNaN( parseFloat(d) ) && isFinite( d );\n};\n\n\n// A string without HTML in it can be considered to be HTML still\nvar _isHtml = function ( d ) {\n\treturn _empty( d ) || typeof d === 'string';\n};\n\n\nvar _htmlNumeric = function ( d, decimalPoint, formatted ) {\n\tif ( _empty( d ) ) {\n\t\treturn true;\n\t}\n\n\tvar html = _isHtml( d );\n\treturn ! html ?\n\t\tnull :\n\t\t_isNumber( _stripHtml( d ), decimalPoint, formatted ) ?\n\t\t\ttrue :\n\t\t\tnull;\n};\n\n\nvar _pluck = function ( a, prop, prop2 ) {\n\tvar out = [];\n\tvar i=0, ien=a.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] && a[i][ prop ] ) {\n\t\t\t\tout.push( a[i][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[i] ) {\n\t\t\t\tout.push( a[i][ prop ] );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\n// Basically the same as _pluck, but rather than looping over `a` we use `order`\n// as the indexes to pick from `a`\nvar _pluck_order = function ( a, order, prop, prop2 )\n{\n\tvar out = [];\n\tvar i=0, ien=order.length;\n\n\t// Could have the test in the loop for slightly smaller code, but speed\n\t// is essential here\n\tif ( prop2 !== undefined ) {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tif ( a[ order[i] ][ prop ] ) {\n\t\t\t\tout.push( a[ order[i] ][ prop ][ prop2 ] );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tfor ( ; i<ien ; i++ ) {\n\t\t\tout.push( a[ order[i] ][ prop ] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _range = function ( len, start )\n{\n\tvar out = [];\n\tvar end;\n\n\tif ( start === undefined ) {\n\t\tstart = 0;\n\t\tend = len;\n\t}\n\telse {\n\t\tend = start;\n\t\tstart = len;\n\t}\n\n\tfor ( var i=start ; i<end ; i++ ) {\n\t\tout.push( i );\n\t}\n\n\treturn out;\n};\n\n\nvar _removeEmpty = function ( a )\n{\n\tvar out = [];\n\n\tfor ( var i=0, ien=a.length ; i<ien ; i++ ) {\n\t\tif ( a[i] ) { // careful - will remove all falsy values!\n\t\t\tout.push( a[i] );\n\t\t}\n\t}\n\n\treturn out;\n};\n\n\nvar _stripHtml = function ( d ) {\n\treturn d.replace( _re_html, '' );\n};\n\n\n/**\n * Determine if all values in the array are unique. This means we can short\n * cut the _unique method at the cost of a single loop. A sorted array is used\n * to easily check the values.\n *\n * @param  {array} src Source array\n * @return {boolean} true if all unique, false otherwise\n * @ignore\n */\nvar _areAllUnique = function ( src ) {\n\tif ( src.length < 2 ) {\n\t\treturn true;\n\t}\n\n\tvar sorted = src.slice().sort();\n\tvar last = sorted[0];\n\n\tfor ( var i=1, ien=sorted.length ; i<ien ; i++ ) {\n\t\tif ( sorted[i] === last ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tlast = sorted[i];\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Find the unique elements in a source array.\n *\n * @param  {array} src Source array\n * @return {array} Array of unique items\n * @ignore\n */\nvar _unique = function ( src )\n{\n\tif ( _areAllUnique( src ) ) {\n\t\treturn src.slice();\n\t}\n\n\t// A faster unique method is to use object keys to identify used values,\n\t// but this doesn't work with arrays or objects, which we must also\n\t// consider. See jsperf.com/compare-array-unique-versions/4 for more\n\t// information.\n\tvar\n\t\tout = [],\n\t\tval,\n\t\ti, ien=src.length,\n\t\tj, k=0;\n\n\tagain: for ( i=0 ; i<ien ; i++ ) {\n\t\tval = src[i];\n\n\t\tfor ( j=0 ; j<k ; j++ ) {\n\t\t\tif ( out[j] === val ) {\n\t\t\t\tcontinue again;\n\t\t\t}\n\t\t}\n\n\t\tout.push( val );\n\t\tk++;\n\t}\n\n\treturn out;\n};\n\n// Surprisingly this is faster than [].concat.apply\n// https://jsperf.com/flatten-an-array-loop-vs-reduce/2\nvar _flatten = function (out, val) {\n\tif (Array.isArray(val)) {\n\t\tfor (var i=0 ; i<val.length ; i++) {\n\t\t\t_flatten(out, val[i]);\n\t\t}\n\t}\n\telse {\n\t\tout.push(val);\n\t}\n  \n\treturn out;\n}\n\nvar _includes = function (search, start) {\n\tif (start === undefined) {\n\t\tstart = 0;\n\t}\n\n\treturn this.indexOf(search, start) !== -1;\t\n};\n\n// Array.isArray polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\nif (! Array.isArray) {\n    Array.isArray = function(arg) {\n        return Object.prototype.toString.call(arg) === '[object Array]';\n    };\n}\n\nif (! Array.prototype.includes) {\n\tArray.prototype.includes = _includes;\n}\n\n// .trim() polyfill\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/trim\nif (!String.prototype.trim) {\n  String.prototype.trim = function () {\n    return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n  };\n}\n\nif (! String.prototype.includes) {\n\tString.prototype.includes = _includes;\n}\n\n/**\n * DataTables utility methods\n * \n * This namespace provides helper methods that DataTables uses internally to\n * create a DataTable, but which are not exclusively used only for DataTables.\n * These methods can be used by extension authors to save the duplication of\n * code.\n *\n *  @namespace\n */\nDataTable.util = {\n\t/**\n\t * Throttle the calls to a function. Arguments and context are maintained\n\t * for the throttled function.\n\t *\n\t * @param {function} fn Function to be called\n\t * @param {integer} freq Call frequency in mS\n\t * @return {function} Wrapped function\n\t */\n\tthrottle: function ( fn, freq ) {\n\t\tvar\n\t\t\tfrequency = freq !== undefined ? freq : 200,\n\t\t\tlast,\n\t\t\ttimer;\n\n\t\treturn function () {\n\t\t\tvar\n\t\t\t\tthat = this,\n\t\t\t\tnow  = +new Date(),\n\t\t\t\targs = arguments;\n\n\t\t\tif ( last && now < last + frequency ) {\n\t\t\t\tclearTimeout( timer );\n\n\t\t\t\ttimer = setTimeout( function () {\n\t\t\t\t\tlast = undefined;\n\t\t\t\t\tfn.apply( that, args );\n\t\t\t\t}, frequency );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlast = now;\n\t\t\t\tfn.apply( that, args );\n\t\t\t}\n\t\t};\n\t},\n\n\n\t/**\n\t * Escape a string such that it can be used in a regular expression\n\t *\n\t *  @param {string} val string to escape\n\t *  @returns {string} escaped string\n\t */\n\tescapeRegex: function ( val ) {\n\t\treturn val.replace( _re_escape_regex, '\\\\$1' );\n\t},\n\n\t/**\n\t * Create a function that will write to a nested object or array\n\t * @param {*} source JSON notation string\n\t * @returns Write function\n\t */\n\tset: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t/* Unlike get, only the underscore (global) option is used for for\n\t\t\t * setting data since we don't know the type here. This is why an object\n\t\t\t * option is not documented for `mData` (which is read/write), but it is\n\t\t\t * for `mRender` which is read only.\n\t\t\t */\n\t\t\treturn DataTable.util.set( source._ );\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Nothing to do when the data source is null\n\t\t\treturn function () {};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, val, meta) {\n\t\t\t\tsource( data, 'set', val, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t// Like the get, we need to get data from a nested object\n\t\t\tvar setData = function (data, val, src) {\n\t\t\t\tvar a = _fnSplitObjNotation( src ), b;\n\t\t\t\tvar aLast = a[a.length-1];\n\t\t\t\tvar arrayNotation, funcNotation, o, innerSrc;\n\t\n\t\t\t\tfor ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) {\n\t\t\t\t\t// Protect against prototype pollution\n\t\t\t\t\tif (a[i] === '__proto__' || a[i] === 'constructor') {\n\t\t\t\t\t\tthrow new Error('Cannot set prototype values');\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// Check if we are dealing with an array notation request\n\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\t\t\t\t\tdata[ a[i] ] = [];\n\t\n\t\t\t\t\t\t// Get the remainder of the nested object to set so we can recurse\n\t\t\t\t\t\tb = a.slice();\n\t\t\t\t\t\tb.splice( 0, i+1 );\n\t\t\t\t\t\tinnerSrc = b.join('.');\n\t\n\t\t\t\t\t\t// Traverse each entry in the array setting the properties requested\n\t\t\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\t\t\tfor ( var j=0, jLen=val.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\to = {};\n\t\t\t\t\t\t\t\tsetData( o, val[j], innerSrc );\n\t\t\t\t\t\t\t\tdata[ a[i] ].push( o );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// We've been asked to save data to an array, but it\n\t\t\t\t\t\t\t// isn't array data to be saved. Best that can be done\n\t\t\t\t\t\t\t// is to just save the value.\n\t\t\t\t\t\t\tdata[ a[i] ] = val;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t// The inner call to setData has already traversed through the remainder\n\t\t\t\t\t\t// of the source and has set the data, thus we can exit here\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t// Function call\n\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\tdata = data[ a[i] ]( val );\n\t\t\t\t\t}\n\t\n\t\t\t\t\t// If the nested object doesn't currently exist - since we are\n\t\t\t\t\t// trying to set the value - create it\n\t\t\t\t\tif ( data[ a[i] ] === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\tdata[ a[i] ] = {};\n\t\t\t\t\t}\n\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t}\n\t\n\t\t\t\t// Last item in the input - i.e, the actual set\n\t\t\t\tif ( aLast.match(__reFn ) ) {\n\t\t\t\t\t// Function call\n\t\t\t\t\tdata = data[ aLast.replace(__reFn, '') ]( val );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// If array notation is used, we just want to strip it and use the property name\n\t\t\t\t\t// and assign the value. If it isn't used, then we get the result we want anyway\n\t\t\t\t\tdata[ aLast.replace(__reArray, '') ] = val;\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\treturn setData( data, val, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, val) { // meta is also passed in, but not used\n\t\t\t\tdata[source] = val;\n\t\t\t};\n\t\t}\n\t},\n\n\t/**\n\t * Create a function that will read nested objects from arrays, based on JSON notation\n\t * @param {*} source JSON notation string\n\t * @returns Value read\n\t */\n\tget: function ( source ) {\n\t\tif ( $.isPlainObject( source ) ) {\n\t\t\t// Build an object of get functions, and wrap them in a single call\n\t\t\tvar o = {};\n\t\t\t$.each( source, function (key, val) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\to[key] = DataTable.util.get( val );\n\t\t\t\t}\n\t\t\t} );\n\t\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\tvar t = o[type] || o._;\n\t\t\t\treturn t !== undefined ?\n\t\t\t\t\tt(data, type, row, meta) :\n\t\t\t\t\tdata;\n\t\t\t};\n\t\t}\n\t\telse if ( source === null ) {\n\t\t\t// Give an empty string for rendering / sorting etc\n\t\t\treturn function (data) { // type, row and meta also passed, but not used\n\t\t\t\treturn data;\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'function' ) {\n\t\t\treturn function (data, type, row, meta) {\n\t\t\t\treturn source( data, type, row, meta );\n\t\t\t};\n\t\t}\n\t\telse if ( typeof source === 'string' && (source.indexOf('.') !== -1 ||\n\t\t\t\t  source.indexOf('[') !== -1 || source.indexOf('(') !== -1) )\n\t\t{\n\t\t\t/* If there is a . in the source string then the data source is in a\n\t\t\t * nested object so we loop over the data for each level to get the next\n\t\t\t * level down. On each loop we test for undefined, and if found immediately\n\t\t\t * return. This allows entire objects to be missing and sDefaultContent to\n\t\t\t * be used if defined, rather than throwing an error\n\t\t\t */\n\t\t\tvar fetchData = function (data, type, src) {\n\t\t\t\tvar arrayNotation, funcNotation, out, innerSrc;\n\t\n\t\t\t\tif ( src !== \"\" ) {\n\t\t\t\t\tvar a = _fnSplitObjNotation( src );\n\t\n\t\t\t\t\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ ) {\n\t\t\t\t\t\t// Check if we are dealing with special notation\n\t\t\t\t\t\tarrayNotation = a[i].match(__reArray);\n\t\t\t\t\t\tfuncNotation = a[i].match(__reFn);\n\t\n\t\t\t\t\t\tif ( arrayNotation ) {\n\t\t\t\t\t\t\t// Array notation\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reArray, '');\n\t\n\t\t\t\t\t\t\t// Condition allows simply [] to be passed in\n\t\t\t\t\t\t\tif ( a[i] !== \"\" ) {\n\t\t\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tout = [];\n\t\n\t\t\t\t\t\t\t// Get the remainder of the nested object to get\n\t\t\t\t\t\t\ta.splice( 0, i+1 );\n\t\t\t\t\t\t\tinnerSrc = a.join('.');\n\t\n\t\t\t\t\t\t\t// Traverse each entry in the array getting the properties requested\n\t\t\t\t\t\t\tif ( Array.isArray( data ) ) {\n\t\t\t\t\t\t\t\tfor ( var j=0, jLen=data.length ; j<jLen ; j++ ) {\n\t\t\t\t\t\t\t\t\tout.push( fetchData( data[j], type, innerSrc ) );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\t\t// If a string is given in between the array notation indicators, that\n\t\t\t\t\t\t\t// is used to join the strings together, otherwise an array is returned\n\t\t\t\t\t\t\tvar join = arrayNotation[0].substring(1, arrayNotation[0].length-1);\n\t\t\t\t\t\t\tdata = (join===\"\") ? out : out.join(join);\n\t\n\t\t\t\t\t\t\t// The inner call to fetchData has already traversed through the remainder\n\t\t\t\t\t\t\t// of the source requested, so we exit from the loop\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if ( funcNotation ) {\n\t\t\t\t\t\t\t// Function call\n\t\t\t\t\t\t\ta[i] = a[i].replace(__reFn, '');\n\t\t\t\t\t\t\tdata = data[ a[i] ]();\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tif ( data === null || data[ a[i] ] === undefined ) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = data[ a[i] ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\n\t\t\t\treturn data;\n\t\t\t};\n\t\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn fetchData( data, type, source );\n\t\t\t};\n\t\t}\n\t\telse {\n\t\t\t// Array or flat object mapping\n\t\t\treturn function (data, type) { // row and meta also passed, but not used\n\t\t\t\treturn data[source];\n\t\t\t};\n\t\t}\n\t}\n};\n\n\n\n/**\n * Create a mapping object that allows camel case parameters to be looked up\n * for their Hungarian counterparts. The mapping is stored in a private\n * parameter called `_hungarianMap` which can be accessed on the source object.\n *  @param {object} o\n *  @memberof DataTable#oApi\n */\nfunction _fnHungarianMap ( o )\n{\n\tvar\n\t\thungarian = 'a aa ai ao as b fn i m o s ',\n\t\tmatch,\n\t\tnewKey,\n\t\tmap = {};\n\n\t$.each( o, function (key, val) {\n\t\tmatch = key.match(/^([^A-Z]+?)([A-Z])/);\n\n\t\tif ( match && hungarian.indexOf(match[1]+' ') !== -1 )\n\t\t{\n\t\t\tnewKey = key.replace( match[0], match[2].toLowerCase() );\n\t\t\tmap[ newKey ] = key;\n\n\t\t\tif ( match[1] === 'o' )\n\t\t\t{\n\t\t\t\t_fnHungarianMap( o[key] );\n\t\t\t}\n\t\t}\n\t} );\n\n\to._hungarianMap = map;\n}\n\n\n/**\n * Convert from camel case parameters to Hungarian, based on a Hungarian map\n * created by _fnHungarianMap.\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n *  @memberof DataTable#oApi\n */\nfunction _fnCamelToHungarian ( src, user, force )\n{\n\tif ( ! src._hungarianMap ) {\n\t\t_fnHungarianMap( src );\n\t}\n\n\tvar hungarianKey;\n\n\t$.each( user, function (key, val) {\n\t\thungarianKey = src._hungarianMap[ key ];\n\n\t\tif ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )\n\t\t{\n\t\t\t// For objects, we need to buzz down into the object to copy parameters\n\t\t\tif ( hungarianKey.charAt(0) === 'o' )\n\t\t\t{\n\t\t\t\t// Copy the camelCase options over to the hungarian\n\t\t\t\tif ( ! user[ hungarianKey ] ) {\n\t\t\t\t\tuser[ hungarianKey ] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, user[hungarianKey], user[key] );\n\n\t\t\t\t_fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tuser[hungarianKey] = user[ key ];\n\t\t\t}\n\t\t}\n\t} );\n}\n\n\n/**\n * Language compatibility - when certain options are given, and others aren't, we\n * need to duplicate the values over, in order to provide backwards compatibility\n * with older language files.\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnLanguageCompat( lang )\n{\n\t// Note the use of the Hungarian notation for the parameters in this method as\n\t// this is called after the mapping of camelCase to Hungarian\n\tvar defaults = DataTable.defaults.oLanguage;\n\n\t// Default mapping\n\tvar defaultDecimal = defaults.sDecimal;\n\tif ( defaultDecimal ) {\n\t\t_addNumericSort( defaultDecimal );\n\t}\n\n\tif ( lang ) {\n\t\tvar zeroRecords = lang.sZeroRecords;\n\n\t\t// Backwards compatibility - if there is no sEmptyTable given, then use the same as\n\t\t// sZeroRecords - assuming that is given.\n\t\tif ( ! lang.sEmptyTable && zeroRecords &&\n\t\t\tdefaults.sEmptyTable === \"No data available in table\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );\n\t\t}\n\n\t\t// Likewise with loading records\n\t\tif ( ! lang.sLoadingRecords && zeroRecords &&\n\t\t\tdefaults.sLoadingRecords === \"Loading...\" )\n\t\t{\n\t\t\t_fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );\n\t\t}\n\n\t\t// Old parameter name of the thousands separator mapped onto the new\n\t\tif ( lang.sInfoThousands ) {\n\t\t\tlang.sThousands = lang.sInfoThousands;\n\t\t}\n\n\t\tvar decimal = lang.sDecimal;\n\t\tif ( decimal && defaultDecimal !== decimal ) {\n\t\t\t_addNumericSort( decimal );\n\t\t}\n\t}\n}\n\n\n/**\n * Map one parameter onto another\n *  @param {object} o Object to map\n *  @param {*} knew The new parameter name\n *  @param {*} old The old parameter name\n */\nvar _fnCompatMap = function ( o, knew, old ) {\n\tif ( o[ knew ] !== undefined ) {\n\t\to[ old ] = o[ knew ];\n\t}\n};\n\n\n/**\n * Provide backwards compatibility for the main DT options. Note that the new\n * options are mapped onto the old parameters, so this is an external interface\n * change only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatOpts ( init )\n{\n\t_fnCompatMap( init, 'ordering',      'bSort' );\n\t_fnCompatMap( init, 'orderMulti',    'bSortMulti' );\n\t_fnCompatMap( init, 'orderClasses',  'bSortClasses' );\n\t_fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );\n\t_fnCompatMap( init, 'order',         'aaSorting' );\n\t_fnCompatMap( init, 'orderFixed',    'aaSortingFixed' );\n\t_fnCompatMap( init, 'paging',        'bPaginate' );\n\t_fnCompatMap( init, 'pagingType',    'sPaginationType' );\n\t_fnCompatMap( init, 'pageLength',    'iDisplayLength' );\n\t_fnCompatMap( init, 'searching',     'bFilter' );\n\n\t// Boolean initialisation of x-scrolling\n\tif ( typeof init.sScrollX === 'boolean' ) {\n\t\tinit.sScrollX = init.sScrollX ? '100%' : '';\n\t}\n\tif ( typeof init.scrollX === 'boolean' ) {\n\t\tinit.scrollX = init.scrollX ? '100%' : '';\n\t}\n\n\t// Column search objects are in an array, so it needs to be converted\n\t// element by element\n\tvar searchCols = init.aoSearchCols;\n\n\tif ( searchCols ) {\n\t\tfor ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {\n\t\t\tif ( searchCols[i] ) {\n\t\t\t\t_fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Provide backwards compatibility for column options. Note that the new options\n * are mapped onto the old parameters, so this is an external interface change\n * only.\n *  @param {object} init Object to map\n */\nfunction _fnCompatCols ( init )\n{\n\t_fnCompatMap( init, 'orderable',     'bSortable' );\n\t_fnCompatMap( init, 'orderData',     'aDataSort' );\n\t_fnCompatMap( init, 'orderSequence', 'asSorting' );\n\t_fnCompatMap( init, 'orderDataType', 'sortDataType' );\n\n\t// orderData can be given as an integer\n\tvar dataSort = init.aDataSort;\n\tif ( typeof dataSort === 'number' && ! Array.isArray( dataSort ) ) {\n\t\tinit.aDataSort = [ dataSort ];\n\t}\n}\n\n\n/**\n * Browser feature detection for capabilities, quirks\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBrowserDetect( settings )\n{\n\t// We don't need to do this every time DataTables is constructed, the values\n\t// calculated are specific to the browser and OS configuration which we\n\t// don't expect to change between initialisations\n\tif ( ! DataTable.__browser ) {\n\t\tvar browser = {};\n\t\tDataTable.__browser = browser;\n\n\t\t// Scrolling feature / quirks detection\n\t\tvar n = $('<div/>')\n\t\t\t.css( {\n\t\t\t\tposition: 'fixed',\n\t\t\t\ttop: 0,\n\t\t\t\tleft: $(window).scrollLeft()*-1, // allow for scrolling\n\t\t\t\theight: 1,\n\t\t\t\twidth: 1,\n\t\t\t\toverflow: 'hidden'\n\t\t\t} )\n\t\t\t.append(\n\t\t\t\t$('<div/>')\n\t\t\t\t\t.css( {\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: 1,\n\t\t\t\t\t\tleft: 1,\n\t\t\t\t\t\twidth: 100,\n\t\t\t\t\t\toverflow: 'scroll'\n\t\t\t\t\t} )\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('<div/>')\n\t\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t\twidth: '100%',\n\t\t\t\t\t\t\t\theight: 10\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t)\n\t\t\t)\n\t\t\t.appendTo( 'body' );\n\n\t\tvar outer = n.children();\n\t\tvar inner = outer.children();\n\n\t\t// Numbers below, in order, are:\n\t\t// inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth\n\t\t//\n\t\t// IE6 XP:                           100 100 100  83\n\t\t// IE7 Vista:                        100 100 100  83\n\t\t// IE 8+ Windows:                     83  83 100  83\n\t\t// Evergreen Windows:                 83  83 100  83\n\t\t// Evergreen Mac with scrollbars:     85  85 100  85\n\t\t// Evergreen Mac without scrollbars: 100 100 100 100\n\n\t\t// Get scrollbar width\n\t\tbrowser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;\n\n\t\t// IE6/7 will oversize a width 100% element inside a scrolling element, to\n\t\t// include the width of the scrollbar, while other browsers ensure the inner\n\t\t// element is contained without forcing scrolling\n\t\tbrowser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;\n\n\t\t// In rtl text layout, some browsers (most, but not all) will place the\n\t\t// scrollbar on the left, rather than the right.\n\t\tbrowser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;\n\n\t\t// IE8- don't provide height and width for getBoundingClientRect\n\t\tbrowser.bBounding = n[0].getBoundingClientRect().width ? true : false;\n\n\t\tn.remove();\n\t}\n\n\t$.extend( settings.oBrowser, DataTable.__browser );\n\tsettings.oScroll.iBarWidth = DataTable.__browser.barWidth;\n}\n\n\n/**\n * Array.prototype reduce[Right] method, used for browsers which don't support\n * JS 1.6. Done this way to reduce code size, since we iterate either way\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnReduce ( that, fn, init, start, end, inc )\n{\n\tvar\n\t\ti = start,\n\t\tvalue,\n\t\tisSet = false;\n\n\tif ( init !== undefined ) {\n\t\tvalue = init;\n\t\tisSet = true;\n\t}\n\n\twhile ( i !== end ) {\n\t\tif ( ! that.hasOwnProperty(i) ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalue = isSet ?\n\t\t\tfn( value, that[i], i, that ) :\n\t\t\tthat[i];\n\n\t\tisSet = true;\n\t\ti += inc;\n\t}\n\n\treturn value;\n}\n\n/**\n * Add a column to the list used for the table with default values\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nTh The th element for this column\n *  @memberof DataTable#oApi\n */\nfunction _fnAddColumn( oSettings, nTh )\n{\n\t// Add column to aoColumns array\n\tvar oDefaults = DataTable.defaults.column;\n\tvar iCol = oSettings.aoColumns.length;\n\tvar oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {\n\t\t\"nTh\": nTh ? nTh : document.createElement('th'),\n\t\t\"sTitle\":    oDefaults.sTitle    ? oDefaults.sTitle    : nTh ? nTh.innerHTML : '',\n\t\t\"aDataSort\": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],\n\t\t\"mData\": oDefaults.mData ? oDefaults.mData : iCol,\n\t\tidx: iCol\n\t} );\n\toSettings.aoColumns.push( oCol );\n\n\t// Add search object for column specific search. Note that the `searchCols[ iCol ]`\n\t// passed into extend can be undefined. This allows the user to give a default\n\t// with only some of the parameters defined, and also not give a default\n\tvar searchCols = oSettings.aoPreSearchCols;\n\tsearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );\n\n\t// Use the default column options function to initialise classes etc\n\t_fnColumnOptions( oSettings, iCol, $(nTh).data() );\n}\n\n\n/**\n * Apply options for a column\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iCol column index to consider\n *  @param {object} oOptions object with sType, bVisible and bSearchable etc\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnOptions( oSettings, iCol, oOptions )\n{\n\tvar oCol = oSettings.aoColumns[ iCol ];\n\tvar oClasses = oSettings.oClasses;\n\tvar th = $(oCol.nTh);\n\n\t// Try to get width information from the DOM. We can't get it from CSS\n\t// as we'd need to parse the CSS stylesheet. `width` option can override\n\tif ( ! oCol.sWidthOrig ) {\n\t\t// Width attribute\n\t\toCol.sWidthOrig = th.attr('width') || null;\n\n\t\t// Style attribute\n\t\tvar t = (th.attr('style') || '').match(/width:\\s*(\\d+[pxem%]+)/);\n\t\tif ( t ) {\n\t\t\toCol.sWidthOrig = t[1];\n\t\t}\n\t}\n\n\t/* User specified column options */\n\tif ( oOptions !== undefined && oOptions !== null )\n\t{\n\t\t// Backwards compatibility\n\t\t_fnCompatCols( oOptions );\n\n\t\t// Map camel case parameters to their Hungarian counterparts\n\t\t_fnCamelToHungarian( DataTable.defaults.column, oOptions, true );\n\n\t\t/* Backwards compatibility for mDataProp */\n\t\tif ( oOptions.mDataProp !== undefined && !oOptions.mData )\n\t\t{\n\t\t\toOptions.mData = oOptions.mDataProp;\n\t\t}\n\n\t\tif ( oOptions.sType )\n\t\t{\n\t\t\toCol._sManualType = oOptions.sType;\n\t\t}\n\n\t\t// `class` is a reserved word in Javascript, so we need to provide\n\t\t// the ability to use a valid name for the camel case input\n\t\tif ( oOptions.className && ! oOptions.sClass )\n\t\t{\n\t\t\toOptions.sClass = oOptions.className;\n\t\t}\n\t\tif ( oOptions.sClass ) {\n\t\t\tth.addClass( oOptions.sClass );\n\t\t}\n\n\t\tvar origClass = oCol.sClass;\n\n\t\t$.extend( oCol, oOptions );\n\t\t_fnMap( oCol, oOptions, \"sWidth\", \"sWidthOrig\" );\n\n\t\t// Merge class from previously defined classes with this one, rather than just\n\t\t// overwriting it in the extend above\n\t\tif (origClass !== oCol.sClass) {\n\t\t\toCol.sClass = origClass + ' ' + oCol.sClass;\n\t\t}\n\n\t\t/* iDataSort to be applied (backwards compatibility), but aDataSort will take\n\t\t * priority if defined\n\t\t */\n\t\tif ( oOptions.iDataSort !== undefined )\n\t\t{\n\t\t\toCol.aDataSort = [ oOptions.iDataSort ];\n\t\t}\n\t\t_fnMap( oCol, oOptions, \"aDataSort\" );\n\t}\n\n\t/* Cache the data get and set functions for speed */\n\tvar mDataSrc = oCol.mData;\n\tvar mData = _fnGetObjectDataFn( mDataSrc );\n\tvar mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;\n\n\tvar attrTest = function( src ) {\n\t\treturn typeof src === 'string' && src.indexOf('@') !== -1;\n\t};\n\toCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (\n\t\tattrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)\n\t);\n\toCol._setter = null;\n\n\toCol.fnGetData = function (rowData, type, meta) {\n\t\tvar innerData = mData( rowData, type, undefined, meta );\n\n\t\treturn mRender && type ?\n\t\t\tmRender( innerData, type, rowData, meta ) :\n\t\t\tinnerData;\n\t};\n\toCol.fnSetData = function ( rowData, val, meta ) {\n\t\treturn _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );\n\t};\n\n\t// Indicate if DataTables should read DOM data as an object or array\n\t// Used in _fnGetRowElements\n\tif ( typeof mDataSrc !== 'number' && ! oCol._isArrayHost ) {\n\t\toSettings._rowReadObject = true;\n\t}\n\n\t/* Feature sorting overrides column specific when off */\n\tif ( !oSettings.oFeatures.bSort )\n\t{\n\t\toCol.bSortable = false;\n\t\tth.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called\n\t}\n\n\t/* Check that the class assignment is correct for sorting */\n\tvar bAsc = $.inArray('asc', oCol.asSorting) !== -1;\n\tvar bDesc = $.inArray('desc', oCol.asSorting) !== -1;\n\tif ( !oCol.bSortable || (!bAsc && !bDesc) )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableNone;\n\t\toCol.sSortingClassJUI = \"\";\n\t}\n\telse if ( bAsc && !bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableAsc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;\n\t}\n\telse if ( !bAsc && bDesc )\n\t{\n\t\toCol.sSortingClass = oClasses.sSortableDesc;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;\n\t}\n\telse\n\t{\n\t\toCol.sSortingClass = oClasses.sSortable;\n\t\toCol.sSortingClassJUI = oClasses.sSortJUI;\n\t}\n}\n\n\n/**\n * Adjust the table column widths for new data. Note: you would probably want to\n * do a redraw after calling this function!\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAdjustColumnSizing ( settings )\n{\n\t/* Not interested in doing column width calculation if auto-width is disabled */\n\tif ( settings.oFeatures.bAutoWidth !== false )\n\t{\n\t\tvar columns = settings.aoColumns;\n\n\t\t_fnCalculateColumnWidths( settings );\n\t\tfor ( var i=0 , iLen=columns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tcolumns[i].nTh.style.width = columns[i].sWidth;\n\t\t}\n\t}\n\n\tvar scroll = settings.oScroll;\n\tif ( scroll.sY !== '' || scroll.sX !== '')\n\t{\n\t\t_fnScrollDraw( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'column-sizing', [settings] );\n}\n\n\n/**\n * Convert the index of a visible column to the index in the data array (take account\n * of hidden columns)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iMatch Visible column index to lookup\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnVisibleToColumnIndex( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\n\treturn typeof aiVis[iMatch] === 'number' ?\n\t\taiVis[iMatch] :\n\t\tnull;\n}\n\n\n/**\n * Convert the index of an index in the data array and convert it to the visible\n *   column index (take account of hidden columns)\n *  @param {int} iMatch Column index to lookup\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the data index\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnIndexToVisible( oSettings, iMatch )\n{\n\tvar aiVis = _fnGetColumns( oSettings, 'bVisible' );\n\tvar iPos = $.inArray( iMatch, aiVis );\n\n\treturn iPos !== -1 ? iPos : null;\n}\n\n\n/**\n * Get the number of visible columns\n *  @param {object} oSettings dataTables settings object\n *  @returns {int} i the number of visible columns\n *  @memberof DataTable#oApi\n */\nfunction _fnVisbleColumns( oSettings )\n{\n\tvar vis = 0;\n\n\t// No reduce in IE8, use a loop for now\n\t$.each( oSettings.aoColumns, function ( i, col ) {\n\t\tif ( col.bVisible && $(col.nTh).css('display') !== 'none' ) {\n\t\t\tvis++;\n\t\t}\n\t} );\n\n\treturn vis;\n}\n\n\n/**\n * Get an array of column indexes that match a given property\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sParam Parameter in aoColumns to look for - typically\n *    bVisible or bSearchable\n *  @returns {array} Array of indexes with matched properties\n *  @memberof DataTable#oApi\n */\nfunction _fnGetColumns( oSettings, sParam )\n{\n\tvar a = [];\n\n\t$.map( oSettings.aoColumns, function(val, i) {\n\t\tif ( val[sParam] ) {\n\t\t\ta.push( i );\n\t\t}\n\t} );\n\n\treturn a;\n}\n\n\n/**\n * Calculate the 'type' of a column\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnColumnTypes ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar data = settings.aoData;\n\tvar types = DataTable.ext.type.detect;\n\tvar i, ien, j, jen, k, ken;\n\tvar col, cell, detectedType, cache;\n\n\t// For each column, spin over the \n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcol = columns[i];\n\t\tcache = [];\n\n\t\tif ( ! col.sType && col._sManualType ) {\n\t\t\tcol.sType = col._sManualType;\n\t\t}\n\t\telse if ( ! col.sType ) {\n\t\t\tfor ( j=0, jen=types.length ; j<jen ; j++ ) {\n\t\t\t\tfor ( k=0, ken=data.length ; k<ken ; k++ ) {\n\t\t\t\t\t// Use a cache array so we only need to get the type data\n\t\t\t\t\t// from the formatter once (when using multiple detectors)\n\t\t\t\t\tif ( cache[k] === undefined ) {\n\t\t\t\t\t\tcache[k] = _fnGetCellData( settings, k, i, 'type' );\n\t\t\t\t\t}\n\n\t\t\t\t\tdetectedType = types[j]( cache[k], settings );\n\n\t\t\t\t\t// If null, then this type can't apply to this column, so\n\t\t\t\t\t// rather than testing all cells, break out. There is an\n\t\t\t\t\t// exception for the last type which is `html`. We need to\n\t\t\t\t\t// scan all rows since it is possible to mix string and HTML\n\t\t\t\t\t// types\n\t\t\t\t\tif ( ! detectedType && j !== types.length-1 ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only a single match is needed for html type since it is\n\t\t\t\t\t// bottom of the pile and very similar to string - but it\n\t\t\t\t\t// must not be empty\n\t\t\t\t\tif ( detectedType === 'html' && ! _empty(cache[k]) ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Type is valid for all data points in the column - use this\n\t\t\t\t// type\n\t\t\t\tif ( detectedType ) {\n\t\t\t\t\tcol.sType = detectedType;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Fall back - if no type was detected, always use string\n\t\t\tif ( ! col.sType ) {\n\t\t\t\tcol.sType = 'string';\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Take the column definitions and static columns arrays and calculate how\n * they relate to column indexes. The callback function will then apply the\n * definition found for a column to a suitable configuration object.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aoColDefs The aoColumnDefs array that is to be applied\n *  @param {array} aoCols The aoColumns array that defines columns individually\n *  @param {function} fn Callback function - takes two parameters, the calculated\n *    column index and the definition for that column.\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )\n{\n\tvar i, iLen, j, jLen, k, kLen, def;\n\tvar columns = oSettings.aoColumns;\n\n\t// Column definitions with aTargets\n\tif ( aoColDefs )\n\t{\n\t\t/* Loop over the definitions array - loop in reverse so first instance has priority */\n\t\tfor ( i=aoColDefs.length-1 ; i>=0 ; i-- )\n\t\t{\n\t\t\tdef = aoColDefs[i];\n\n\t\t\t/* Each definition can target multiple columns, as it is an array */\n\t\t\tvar aTargets = def.target !== undefined\n\t\t\t\t? def.target\n\t\t\t\t: def.targets !== undefined\n\t\t\t\t\t? def.targets\n\t\t\t\t\t: def.aTargets;\n\n\t\t\tif ( ! Array.isArray( aTargets ) )\n\t\t\t{\n\t\t\t\taTargets = [ aTargets ];\n\t\t\t}\n\n\t\t\tfor ( j=0, jLen=aTargets.length ; j<jLen ; j++ )\n\t\t\t{\n\t\t\t\tif ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Add columns that we don't yet know about */\n\t\t\t\t\twhile( columns.length <= aTargets[j] )\n\t\t\t\t\t{\n\t\t\t\t\t\t_fnAddColumn( oSettings );\n\t\t\t\t\t}\n\n\t\t\t\t\t/* Integer, basic index */\n\t\t\t\t\tfn( aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )\n\t\t\t\t{\n\t\t\t\t\t/* Negative integer, right to left column counting */\n\t\t\t\t\tfn( columns.length+aTargets[j], def );\n\t\t\t\t}\n\t\t\t\telse if ( typeof aTargets[j] === 'string' )\n\t\t\t\t{\n\t\t\t\t\t/* Class name matching on TH element */\n\t\t\t\t\tfor ( k=0, kLen=columns.length ; k<kLen ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\tif ( aTargets[j] == \"_all\" ||\n\t\t\t\t\t\t     $(columns[k].nTh).hasClass( aTargets[j] ) )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfn( k, def );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Statically defined columns array\n\tif ( aoCols )\n\t{\n\t\tfor ( i=0, iLen=aoCols.length ; i<iLen ; i++ )\n\t\t{\n\t\t\tfn( i, aoCols[i] );\n\t\t}\n\t}\n}\n\n/**\n * Add a data array to the table, creating DOM node etc. This is the parallel to\n * _fnGatherData, but for adding rows from a Javascript source, rather than a\n * DOM source.\n *  @param {object} oSettings dataTables settings object\n *  @param {array} aData data array to be added\n *  @param {node} [nTr] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @returns {int} >=0 if successful (index of new aoData entry), -1 if failed\n *  @memberof DataTable#oApi\n */\nfunction _fnAddData ( oSettings, aDataIn, nTr, anTds )\n{\n\t/* Create the object for storing information about this new row */\n\tvar iRow = oSettings.aoData.length;\n\tvar oData = $.extend( true, {}, DataTable.models.oRow, {\n\t\tsrc: nTr ? 'dom' : 'data',\n\t\tidx: iRow\n\t} );\n\n\toData._aData = aDataIn;\n\toSettings.aoData.push( oData );\n\n\t/* Create the cells */\n\tvar nTd, sThisType;\n\tvar columns = oSettings.aoColumns;\n\n\t// Invalidate the column types as the new data needs to be revalidated\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tcolumns[i].sType = null;\n\t}\n\n\t/* Add to the display array */\n\toSettings.aiDisplayMaster.push( iRow );\n\n\tvar id = oSettings.rowIdFn( aDataIn );\n\tif ( id !== undefined ) {\n\t\toSettings.aIds[ id ] = oData;\n\t}\n\n\t/* Create the DOM information, or register it if already present */\n\tif ( nTr || ! oSettings.oFeatures.bDeferRender )\n\t{\n\t\t_fnCreateTr( oSettings, iRow, nTr, anTds );\n\t}\n\n\treturn iRow;\n}\n\n\n/**\n * Add one or more TR elements to the table. Generally we'd expect to\n * use this for reading data from a DOM sourced table, but it could be\n * used for an TR element. Note that if a TR is given, it is used (i.e.\n * it is not cloned).\n *  @param {object} settings dataTables settings object\n *  @param {array|node|jQuery} trs The TR element(s) to add to the table\n *  @returns {array} Array of indexes for the added rows\n *  @memberof DataTable#oApi\n */\nfunction _fnAddTr( settings, trs )\n{\n\tvar row;\n\n\t// Allow an individual node to be passed in\n\tif ( ! (trs instanceof $) ) {\n\t\ttrs = $(trs);\n\t}\n\n\treturn trs.map( function (i, el) {\n\t\trow = _fnGetRowElements( settings, el );\n\t\treturn _fnAddData( settings, row.data, el, row.cells );\n\t} );\n}\n\n\n/**\n * Take a TR element and convert it to an index in aoData\n *  @param {object} oSettings dataTables settings object\n *  @param {node} n the TR element to find\n *  @returns {int} index if the node is found, null if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToDataIndex( oSettings, n )\n{\n\treturn (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;\n}\n\n\n/**\n * Take a TD element and convert it into a column data index (not the visible index)\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow The row number the TD/TH can be found in\n *  @param {node} n The TD/TH element to find\n *  @returns {int} index if the node is found, -1 if not\n *  @memberof DataTable#oApi\n */\nfunction _fnNodeToColumnIndex( oSettings, iRow, n )\n{\n\treturn $.inArray( n, oSettings.aoData[ iRow ].anCells );\n}\n\n\n/**\n * Get the data for a given cell from the internal cache, taking into account data mapping\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {string} type data get type ('display', 'type' 'filter|search' 'sort|order')\n *  @returns {*} Cell data\n *  @memberof DataTable#oApi\n */\nfunction _fnGetCellData( settings, rowIdx, colIdx, type )\n{\n\tif (type === 'search') {\n\t\ttype = 'filter';\n\t}\n\telse if (type === 'order') {\n\t\ttype = 'sort';\n\t}\n\n\tvar draw           = settings.iDraw;\n\tvar col            = settings.aoColumns[colIdx];\n\tvar rowData        = settings.aoData[rowIdx]._aData;\n\tvar defaultContent = col.sDefaultContent;\n\tvar cellData       = col.fnGetData( rowData, type, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t} );\n\n\tif ( cellData === undefined ) {\n\t\tif ( settings.iDrawError != draw && defaultContent === null ) {\n\t\t\t_fnLog( settings, 0, \"Requested unknown parameter \"+\n\t\t\t\t(typeof col.mData=='function' ? '{function}' : \"'\"+col.mData+\"'\")+\n\t\t\t\t\" for row \"+rowIdx+\", column \"+colIdx, 4 );\n\t\t\tsettings.iDrawError = draw;\n\t\t}\n\t\treturn defaultContent;\n\t}\n\n\t// When the data source is null and a specific data type is requested (i.e.\n\t// not the original data), we can use default column data\n\tif ( (cellData === rowData || cellData === null) && defaultContent !== null && type !== undefined ) {\n\t\tcellData = defaultContent;\n\t}\n\telse if ( typeof cellData === 'function' ) {\n\t\t// If the data source is a function, then we run it and use the return,\n\t\t// executing in the scope of the data object (for instances)\n\t\treturn cellData.call( rowData );\n\t}\n\n\tif ( cellData === null && type === 'display' ) {\n\t\treturn '';\n\t}\n\n\tif ( type === 'filter' ) {\n\t\tvar fomatters = DataTable.ext.type.search;\n\n\t\tif ( fomatters[ col.sType ] ) {\n\t\t\tcellData = fomatters[ col.sType ]( cellData );\n\t\t}\n\t}\n\n\treturn cellData;\n}\n\n\n/**\n * Set the value for a specific cell, into the internal data cache\n *  @param {object} settings dataTables settings object\n *  @param {int} rowIdx aoData row id\n *  @param {int} colIdx Column index\n *  @param {*} val Value to set\n *  @memberof DataTable#oApi\n */\nfunction _fnSetCellData( settings, rowIdx, colIdx, val )\n{\n\tvar col     = settings.aoColumns[colIdx];\n\tvar rowData = settings.aoData[rowIdx]._aData;\n\n\tcol.fnSetData( rowData, val, {\n\t\tsettings: settings,\n\t\trow:      rowIdx,\n\t\tcol:      colIdx\n\t}  );\n}\n\n\n// Private variable that is used to match action syntax in the data property object\nvar __reArray = /\\[.*?\\]$/;\nvar __reFn = /\\(\\)$/;\n\n/**\n * Split string on periods, taking into account escaped periods\n * @param  {string} str String to split\n * @return {array} Split string\n */\nfunction _fnSplitObjNotation( str )\n{\n\treturn $.map( str.match(/(\\\\.|[^\\.])+/g) || [''], function ( s ) {\n\t\treturn s.replace(/\\\\\\./g, '.');\n\t} );\n}\n\n\n/**\n * Return a function that can be used to get data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data get function\n *  @memberof DataTable#oApi\n */\nvar _fnGetObjectDataFn = DataTable.util.get;\n\n\n/**\n * Return a function that can be used to set data from a source object, taking\n * into account the ability to use nested objects as a source\n *  @param {string|int|function} mSource The data source for the object\n *  @returns {function} Data set function\n *  @memberof DataTable#oApi\n */\nvar _fnSetObjectDataFn = DataTable.util.set;\n\n\n/**\n * Return an array with the full table data\n *  @param {object} oSettings dataTables settings object\n *  @returns array {array} aData Master data array\n *  @memberof DataTable#oApi\n */\nfunction _fnGetDataMaster ( settings )\n{\n\treturn _pluck( settings.aoData, '_aData' );\n}\n\n\n/**\n * Nuke the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnClearTable( settings )\n{\n\tsettings.aoData.length = 0;\n\tsettings.aiDisplayMaster.length = 0;\n\tsettings.aiDisplay.length = 0;\n\tsettings.aIds = {};\n}\n\n\n /**\n * Take an array of integers (index array) and remove a target integer (value - not\n * the key!)\n *  @param {array} a Index array to target\n *  @param {int} iTarget value to find\n *  @memberof DataTable#oApi\n */\nfunction _fnDeleteIndex( a, iTarget, splice )\n{\n\tvar iTargetIndex = -1;\n\n\tfor ( var i=0, iLen=a.length ; i<iLen ; i++ )\n\t{\n\t\tif ( a[i] == iTarget )\n\t\t{\n\t\t\tiTargetIndex = i;\n\t\t}\n\t\telse if ( a[i] > iTarget )\n\t\t{\n\t\t\ta[i]--;\n\t\t}\n\t}\n\n\tif ( iTargetIndex != -1 && splice === undefined )\n\t{\n\t\ta.splice( iTargetIndex, 1 );\n\t}\n}\n\n\n/**\n * Mark cached data as invalid such that a re-read of the data will occur when\n * the cached data is next requested. Also update from the data source object.\n *\n * @param {object} settings DataTables settings object\n * @param {int}    rowIdx   Row index to invalidate\n * @param {string} [src]    Source to invalidate from: undefined, 'auto', 'dom'\n *     or 'data'\n * @param {int}    [colIdx] Column index to invalidate. If undefined the whole\n *     row will be invalidated\n * @memberof DataTable#oApi\n *\n * @todo For the modularisation of v1.11 this will need to become a callback, so\n *   the sort and filter methods can subscribe to it. That will required\n *   initialisation options for sorting, which is why it is not already baked in\n */\nfunction _fnInvalidate( settings, rowIdx, src, colIdx )\n{\n\tvar row = settings.aoData[ rowIdx ];\n\tvar i, ien;\n\tvar cellWrite = function ( cell, col ) {\n\t\t// This is very frustrating, but in IE if you just write directly\n\t\t// to innerHTML, and elements that are overwritten are GC'ed,\n\t\t// even if there is a reference to them elsewhere\n\t\twhile ( cell.childNodes.length ) {\n\t\t\tcell.removeChild( cell.firstChild );\n\t\t}\n\n\t\tcell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );\n\t};\n\n\t// Are we reading last data from DOM or the data object?\n\tif ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {\n\t\t// Read the data from the DOM\n\t\trow._aData = _fnGetRowElements(\n\t\t\t\tsettings, row, colIdx, colIdx === undefined ? undefined : row._aData\n\t\t\t)\n\t\t\t.data;\n\t}\n\telse {\n\t\t// Reading from data object, update the DOM\n\t\tvar cells = row.anCells;\n\n\t\tif ( cells ) {\n\t\t\tif ( colIdx !== undefined ) {\n\t\t\t\tcellWrite( cells[colIdx], colIdx );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\t\t\tcellWrite( cells[i], i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// For both row and cell invalidation, the cached data for sorting and\n\t// filtering is nulled out\n\trow._aSortData = null;\n\trow._aFilterData = null;\n\n\t// Invalidate the type for a specific column (if given) or all columns since\n\t// the data might have changed\n\tvar cols = settings.aoColumns;\n\tif ( colIdx !== undefined ) {\n\t\tcols[ colIdx ].sType = null;\n\t}\n\telse {\n\t\tfor ( i=0, ien=cols.length ; i<ien ; i++ ) {\n\t\t\tcols[i].sType = null;\n\t\t}\n\n\t\t// Update DataTables special `DT_*` attributes for the row\n\t\t_fnRowAttributes( settings, row );\n\t}\n}\n\n\n/**\n * Build a data source object from an HTML row, reading the contents of the\n * cells that are in the row.\n *\n * @param {object} settings DataTables settings object\n * @param {node|object} TR element from which to read data or existing row\n *   object from which to re-read the data from the cells\n * @param {int} [colIdx] Optional column index\n * @param {array|object} [d] Data source object. If `colIdx` is given then this\n *   parameter should also be given and will be used to write the data into.\n *   Only the column in question will be written\n * @returns {object} Object with two parameters: `data` the data read, in\n *   document order, and `cells` and array of nodes (they can be useful to the\n *   caller, so rather than needing a second traversal to get them, just return\n *   them from here).\n * @memberof DataTable#oApi\n */\nfunction _fnGetRowElements( settings, row, colIdx, d )\n{\n\tvar\n\t\ttds = [],\n\t\ttd = row.firstChild,\n\t\tname, col, o, i=0, contents,\n\t\tcolumns = settings.aoColumns,\n\t\tobjectRead = settings._rowReadObject;\n\n\t// Allow the data object to be passed in, or construct\n\td = d !== undefined ?\n\t\td :\n\t\tobjectRead ?\n\t\t\t{} :\n\t\t\t[];\n\n\tvar attr = function ( str, td  ) {\n\t\tif ( typeof str === 'string' ) {\n\t\t\tvar idx = str.indexOf('@');\n\n\t\t\tif ( idx !== -1 ) {\n\t\t\t\tvar attr = str.substring( idx+1 );\n\t\t\t\tvar setter = _fnSetObjectDataFn( str );\n\t\t\t\tsetter( d, td.getAttribute( attr ) );\n\t\t\t}\n\t\t}\n\t};\n\n\t// Read data from a cell and store into the data object\n\tvar cellProcess = function ( cell ) {\n\t\tif ( colIdx === undefined || colIdx === i ) {\n\t\t\tcol = columns[i];\n\t\t\tcontents = (cell.innerHTML).trim();\n\n\t\t\tif ( col && col._bAttrSrc ) {\n\t\t\t\tvar setter = _fnSetObjectDataFn( col.mData._ );\n\t\t\t\tsetter( d, contents );\n\n\t\t\t\tattr( col.mData.sort, cell );\n\t\t\t\tattr( col.mData.type, cell );\n\t\t\t\tattr( col.mData.filter, cell );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Depending on the `data` option for the columns the data can\n\t\t\t\t// be read to either an object or an array.\n\t\t\t\tif ( objectRead ) {\n\t\t\t\t\tif ( ! col._setter ) {\n\t\t\t\t\t\t// Cache the setter function\n\t\t\t\t\t\tcol._setter = _fnSetObjectDataFn( col.mData );\n\t\t\t\t\t}\n\t\t\t\t\tcol._setter( d, contents );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td[i] = contents;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ti++;\n\t};\n\n\tif ( td ) {\n\t\t// `tr` element was passed in\n\t\twhile ( td ) {\n\t\t\tname = td.nodeName.toUpperCase();\n\n\t\t\tif ( name == \"TD\" || name == \"TH\" ) {\n\t\t\t\tcellProcess( td );\n\t\t\t\ttds.push( td );\n\t\t\t}\n\n\t\t\ttd = td.nextSibling;\n\t\t}\n\t}\n\telse {\n\t\t// Existing row object passed in\n\t\ttds = row.anCells;\n\n\t\tfor ( var j=0, jen=tds.length ; j<jen ; j++ ) {\n\t\t\tcellProcess( tds[j] );\n\t\t}\n\t}\n\n\t// Read the ID from the DOM if present\n\tvar rowNode = row.firstChild ? row : row.nTr;\n\n\tif ( rowNode ) {\n\t\tvar id = rowNode.getAttribute( 'id' );\n\n\t\tif ( id ) {\n\t\t\t_fnSetObjectDataFn( settings.rowId )( d, id );\n\t\t}\n\t}\n\n\treturn {\n\t\tdata: d,\n\t\tcells: tds\n\t};\n}\n/**\n * Create a new TR element (and it's TD children) for a row\n *  @param {object} oSettings dataTables settings object\n *  @param {int} iRow Row to consider\n *  @param {node} [nTrIn] TR element to add to the table - optional. If not given,\n *    DataTables will create a row automatically\n *  @param {array} [anTds] Array of TD|TH elements for the row - must be given\n *    if nTr is.\n *  @memberof DataTable#oApi\n */\nfunction _fnCreateTr ( oSettings, iRow, nTrIn, anTds )\n{\n\tvar\n\t\trow = oSettings.aoData[iRow],\n\t\trowData = row._aData,\n\t\tcells = [],\n\t\tnTr, nTd, oCol,\n\t\ti, iLen, create;\n\n\tif ( row.nTr === null )\n\t{\n\t\tnTr = nTrIn || document.createElement('tr');\n\n\t\trow.nTr = nTr;\n\t\trow.anCells = cells;\n\n\t\t/* Use a private property on the node to allow reserve mapping from the node\n\t\t * to the aoData array for fast look up\n\t\t */\n\t\tnTr._DT_RowIndex = iRow;\n\n\t\t/* Special parameters can be given by the data source to be used on the row */\n\t\t_fnRowAttributes( oSettings, row );\n\n\t\t/* Process each column */\n\t\tfor ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )\n\t\t{\n\t\t\toCol = oSettings.aoColumns[i];\n\t\t\tcreate = nTrIn ? false : true;\n\n\t\t\tnTd = create ? document.createElement( oCol.sCellType ) : anTds[i];\n\n\t\t\tif (! nTd) {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\n\t\t\tnTd._DT_CellIndex = {\n\t\t\t\trow: iRow,\n\t\t\t\tcolumn: i\n\t\t\t};\n\t\t\t\n\t\t\tcells.push( nTd );\n\n\t\t\t// Need to create the HTML if new, or if a rendering function is defined\n\t\t\tif ( create || ((oCol.mRender || oCol.mData !== i) &&\n\t\t\t\t (!$.isPlainObject(oCol.mData) || oCol.mData._ !== i+'.display')\n\t\t\t)) {\n\t\t\t\tnTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );\n\t\t\t}\n\n\t\t\t/* Add user defined class */\n\t\t\tif ( oCol.sClass )\n\t\t\t{\n\t\t\t\tnTd.className += ' '+oCol.sClass;\n\t\t\t}\n\n\t\t\t// Visibility - add or remove as required\n\t\t\tif ( oCol.bVisible && ! nTrIn )\n\t\t\t{\n\t\t\t\tnTr.appendChild( nTd );\n\t\t\t}\n\t\t\telse if ( ! oCol.bVisible && nTrIn )\n\t\t\t{\n\t\t\t\tnTd.parentNode.removeChild( nTd );\n\t\t\t}\n\n\t\t\tif ( oCol.fnCreatedCell )\n\t\t\t{\n\t\t\t\toCol.fnCreatedCell.call( oSettings.oInstance,\n\t\t\t\t\tnTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t_fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow, cells] );\n\t}\n}\n\n\n/**\n * Add attributes to a row based on the special `DT_*` parameters in a data\n * source object.\n *  @param {object} settings DataTables settings object\n *  @param {object} DataTables row object for the row to be modified\n *  @memberof DataTable#oApi\n */\nfunction _fnRowAttributes( settings, row )\n{\n\tvar tr = row.nTr;\n\tvar data = row._aData;\n\n\tif ( tr ) {\n\t\tvar id = settings.rowIdFn( data );\n\n\t\tif ( id ) {\n\t\t\ttr.id = id;\n\t\t}\n\n\t\tif ( data.DT_RowClass ) {\n\t\t\t// Remove any classes added by DT_RowClass before\n\t\t\tvar a = data.DT_RowClass.split(' ');\n\t\t\trow.__rowc = row.__rowc ?\n\t\t\t\t_unique( row.__rowc.concat( a ) ) :\n\t\t\t\ta;\n\n\t\t\t$(tr)\n\t\t\t\t.removeClass( row.__rowc.join(' ') )\n\t\t\t\t.addClass( data.DT_RowClass );\n\t\t}\n\n\t\tif ( data.DT_RowAttr ) {\n\t\t\t$(tr).attr( data.DT_RowAttr );\n\t\t}\n\n\t\tif ( data.DT_RowData ) {\n\t\t\t$(tr).data( data.DT_RowData );\n\t\t}\n\t}\n}\n\n\n/**\n * Create the HTML header for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnBuildHead( oSettings )\n{\n\tvar i, ien, cell, row, column;\n\tvar thead = oSettings.nTHead;\n\tvar tfoot = oSettings.nTFoot;\n\tvar createHeader = $('th, td', thead).length === 0;\n\tvar classes = oSettings.oClasses;\n\tvar columns = oSettings.aoColumns;\n\n\tif ( createHeader ) {\n\t\trow = $('<tr/>').appendTo( thead );\n\t}\n\n\tfor ( i=0, ien=columns.length ; i<ien ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcell = $( column.nTh ).addClass( column.sClass );\n\n\t\tif ( createHeader ) {\n\t\t\tcell.appendTo( row );\n\t\t}\n\n\t\t// 1.11 move into sorting\n\t\tif ( oSettings.oFeatures.bSort ) {\n\t\t\tcell.addClass( column.sSortingClass );\n\n\t\t\tif ( column.bSortable !== false ) {\n\t\t\t\tcell\n\t\t\t\t\t.attr( 'tabindex', oSettings.iTabIndex )\n\t\t\t\t\t.attr( 'aria-controls', oSettings.sTableId );\n\n\t\t\t\t_fnSortAttachListener( oSettings, column.nTh, i );\n\t\t\t}\n\t\t}\n\n\t\tif ( column.sTitle != cell[0].innerHTML ) {\n\t\t\tcell.html( column.sTitle );\n\t\t}\n\n\t\t_fnRenderer( oSettings, 'header' )(\n\t\t\toSettings, cell, column, classes\n\t\t);\n\t}\n\n\tif ( createHeader ) {\n\t\t_fnDetectHeader( oSettings.aoHeader, thead );\n\t}\n\n\t/* Deal with the footer - add classes if required */\n\t$(thead).children('tr').children('th, td').addClass( classes.sHeaderTH );\n\t$(tfoot).children('tr').children('th, td').addClass( classes.sFooterTH );\n\n\t// Cache the footer cells. Note that we only take the cells from the first\n\t// row in the footer. If there is more than one row the user wants to\n\t// interact with, they need to use the table().foot() method. Note also this\n\t// allows cells to be used for multiple columns using colspan\n\tif ( tfoot !== null ) {\n\t\tvar cells = oSettings.aoFooter[0];\n\n\t\tfor ( i=0, ien=cells.length ; i<ien ; i++ ) {\n\t\t\tcolumn = columns[i];\n\n\t\t\tif (column) {\n\t\t\t\tcolumn.nTf = cells[i].cell;\n\t\n\t\t\t\tif ( column.sClass ) {\n\t\t\t\t\t$(column.nTf).addClass( column.sClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnLog( oSettings, 0, 'Incorrect column count', 18 );\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the header (or footer) element based on the column visibility states. The\n * methodology here is to use the layout array from _fnDetectHeader, modified for\n * the instantaneous column visibility, to construct the new layout. The grid is\n * traversed over cell at a time in a rows x columns grid fashion, although each\n * cell insert can cover multiple elements in the grid - which is tracks using the\n * aApplied array. Cell inserts in the grid will only occur where there isn't\n * already a cell in that position.\n *  @param {object} oSettings dataTables settings object\n *  @param array {objects} aoSource Layout array from _fnDetectHeader\n *  @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,\n *  @memberof DataTable#oApi\n */\nfunction _fnDrawHead( oSettings, aoSource, bIncludeHidden )\n{\n\tvar i, iLen, j, jLen, k, kLen, n, nLocalTr;\n\tvar aoLocal = [];\n\tvar aApplied = [];\n\tvar iColumns = oSettings.aoColumns.length;\n\tvar iRowspan, iColspan;\n\n\tif ( ! aoSource )\n\t{\n\t\treturn;\n\t}\n\n\tif (  bIncludeHidden === undefined )\n\t{\n\t\tbIncludeHidden = false;\n\t}\n\n\t/* Make a copy of the master layout array, but without the visible columns in it */\n\tfor ( i=0, iLen=aoSource.length ; i<iLen ; i++ )\n\t{\n\t\taoLocal[i] = aoSource[i].slice();\n\t\taoLocal[i].nTr = aoSource[i].nTr;\n\n\t\t/* Remove any columns which are currently hidden */\n\t\tfor ( j=iColumns-1 ; j>=0 ; j-- )\n\t\t{\n\t\t\tif ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )\n\t\t\t{\n\t\t\t\taoLocal[i].splice( j, 1 );\n\t\t\t}\n\t\t}\n\n\t\t/* Prep the applied array - it needs an element for each row */\n\t\taApplied.push( [] );\n\t}\n\n\tfor ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )\n\t{\n\t\tnLocalTr = aoLocal[i].nTr;\n\n\t\t/* All cells are going to be replaced, so empty out the row */\n\t\tif ( nLocalTr )\n\t\t{\n\t\t\twhile( (n = nLocalTr.firstChild) )\n\t\t\t{\n\t\t\t\tnLocalTr.removeChild( n );\n\t\t\t}\n\t\t}\n\n\t\tfor ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tiRowspan = 1;\n\t\t\tiColspan = 1;\n\n\t\t\t/* Check to see if there is already a cell (row/colspan) covering our target\n\t\t\t * insert point. If there is, then there is nothing to do.\n\t\t\t */\n\t\t\tif ( aApplied[i][j] === undefined )\n\t\t\t{\n\t\t\t\tnLocalTr.appendChild( aoLocal[i][j].cell );\n\t\t\t\taApplied[i][j] = 1;\n\n\t\t\t\t/* Expand the cell to cover as many rows as needed */\n\t\t\t\twhile ( aoLocal[i+iRowspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )\n\t\t\t\t{\n\t\t\t\t\taApplied[i+iRowspan][j] = 1;\n\t\t\t\t\tiRowspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Expand the cell to cover as many columns as needed */\n\t\t\t\twhile ( aoLocal[i][j+iColspan] !== undefined &&\n\t\t\t\t        aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )\n\t\t\t\t{\n\t\t\t\t\t/* Must update the applied array over the rows for the columns */\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taApplied[i+k][j+iColspan] = 1;\n\t\t\t\t\t}\n\t\t\t\t\tiColspan++;\n\t\t\t\t}\n\n\t\t\t\t/* Do the actual expansion in the DOM */\n\t\t\t\t$(aoLocal[i][j].cell)\n\t\t\t\t\t.attr('rowspan', iRowspan)\n\t\t\t\t\t.attr('colspan', iColspan);\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n/**\n * Insert the required TR nodes into the table for display\n *  @param {object} oSettings dataTables settings object\n *  @param ajaxComplete true after ajax call to complete rendering\n *  @memberof DataTable#oApi\n */\nfunction _fnDraw( oSettings, ajaxComplete )\n{\n\t// Allow for state saving and a custom start position\n\t_fnStart( oSettings );\n\n\t/* Provide a pre-callback function which can be used to cancel the draw is false is returned */\n\tvar aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );\n\tif ( $.inArray( false, aPreDraw ) !== -1 )\n\t{\n\t\t_fnProcessingDisplay( oSettings, false );\n\t\treturn;\n\t}\n\n\tvar anRows = [];\n\tvar iRowCount = 0;\n\tvar asStripeClasses = oSettings.asStripeClasses;\n\tvar iStripes = asStripeClasses.length;\n\tvar oLang = oSettings.oLanguage;\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar aiDisplay = oSettings.aiDisplay;\n\tvar iDisplayStart = oSettings._iDisplayStart;\n\tvar iDisplayEnd = oSettings.fnDisplayEnd();\n\n\toSettings.bDrawing = true;\n\n\t/* Server-side processing draw intercept */\n\tif ( oSettings.bDeferLoading )\n\t{\n\t\toSettings.bDeferLoading = false;\n\t\toSettings.iDraw++;\n\t\t_fnProcessingDisplay( oSettings, false );\n\t}\n\telse if ( !bServerSide )\n\t{\n\t\toSettings.iDraw++;\n\t}\n\telse if ( !oSettings.bDestroying && !ajaxComplete)\n\t{\n\t\t_fnAjaxUpdate( oSettings );\n\t\treturn;\n\t}\n\n\tif ( aiDisplay.length !== 0 )\n\t{\n\t\tvar iStart = bServerSide ? 0 : iDisplayStart;\n\t\tvar iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;\n\n\t\tfor ( var j=iStart ; j<iEnd ; j++ )\n\t\t{\n\t\t\tvar iDataIndex = aiDisplay[j];\n\t\t\tvar aoData = oSettings.aoData[ iDataIndex ];\n\t\t\tif ( aoData.nTr === null )\n\t\t\t{\n\t\t\t\t_fnCreateTr( oSettings, iDataIndex );\n\t\t\t}\n\n\t\t\tvar nRow = aoData.nTr;\n\n\t\t\t/* Remove the old striping classes and then add the new one */\n\t\t\tif ( iStripes !== 0 )\n\t\t\t{\n\t\t\t\tvar sStripe = asStripeClasses[ iRowCount % iStripes ];\n\t\t\t\tif ( aoData._sRowStripe != sStripe )\n\t\t\t\t{\n\t\t\t\t\t$(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );\n\t\t\t\t\taoData._sRowStripe = sStripe;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Row callback functions - might want to manipulate the row\n\t\t\t// iRowCount and j are not currently documented. Are they at all\n\t\t\t// useful?\n\t\t\t_fnCallbackFire( oSettings, 'aoRowCallback', null,\n\t\t\t\t[nRow, aoData._aData, iRowCount, j, iDataIndex] );\n\n\t\t\tanRows.push( nRow );\n\t\t\tiRowCount++;\n\t\t}\n\t}\n\telse\n\t{\n\t\t/* Table is empty - create a row with an empty message in it */\n\t\tvar sZero = oLang.sZeroRecords;\n\t\tif ( oSettings.iDraw == 1 &&  _fnDataSource( oSettings ) == 'ajax' )\n\t\t{\n\t\t\tsZero = oLang.sLoadingRecords;\n\t\t}\n\t\telse if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )\n\t\t{\n\t\t\tsZero = oLang.sEmptyTable;\n\t\t}\n\n\t\tanRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )\n\t\t\t.append( $('<td />', {\n\t\t\t\t'valign':  'top',\n\t\t\t\t'colSpan': _fnVisbleColumns( oSettings ),\n\t\t\t\t'class':   oSettings.oClasses.sRowEmpty\n\t\t\t} ).html( sZero ) )[0];\n\t}\n\n\t/* Header and footer callbacks */\n\t_fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\t_fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],\n\t\t_fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );\n\n\tvar body = $(oSettings.nTBody);\n\n\tbody.children().detach();\n\tbody.append( $(anRows) );\n\n\t/* Call all required callback functions for the end of a draw */\n\t_fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );\n\n\t/* Draw is complete, sorting and filtering must be as well */\n\toSettings.bSorted = false;\n\toSettings.bFiltered = false;\n\toSettings.bDrawing = false;\n}\n\n\n/**\n * Redraw the table - taking account of the various features which are enabled\n *  @param {object} oSettings dataTables settings object\n *  @param {boolean} [holdPosition] Keep the current paging position. By default\n *    the paging is reset to the first page\n *  @memberof DataTable#oApi\n */\nfunction _fnReDraw( settings, holdPosition )\n{\n\tvar\n\t\tfeatures = settings.oFeatures,\n\t\tsort     = features.bSort,\n\t\tfilter   = features.bFilter;\n\n\tif ( sort ) {\n\t\t_fnSort( settings );\n\t}\n\n\tif ( filter ) {\n\t\t_fnFilterComplete( settings, settings.oPreviousSearch );\n\t}\n\telse {\n\t\t// No filtering, so we want to just use the display master\n\t\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\t}\n\n\tif ( holdPosition !== true ) {\n\t\tsettings._iDisplayStart = 0;\n\t}\n\n\t// Let any modules know about the draw hold position state (used by\n\t// scrolling internally)\n\tsettings._drawHold = holdPosition;\n\n\t_fnDraw( settings );\n\n\tsettings._drawHold = false;\n}\n\n\n/**\n * Add the options to the page HTML for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnAddOptionsHtml ( oSettings )\n{\n\tvar classes = oSettings.oClasses;\n\tvar table = $(oSettings.nTable);\n\tvar holding = $('<div/>').insertBefore( table ); // Holding element for speed\n\tvar features = oSettings.oFeatures;\n\n\t// All DataTables are wrapped in a div\n\tvar insert = $('<div/>', {\n\t\tid:      oSettings.sTableId+'_wrapper',\n\t\t'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)\n\t} );\n\n\toSettings.nHolding = holding[0];\n\toSettings.nTableWrapper = insert[0];\n\toSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;\n\n\t/* Loop over the user set positioning and place the elements as needed */\n\tvar aDom = oSettings.sDom.split('');\n\tvar featureNode, cOption, nNewNode, cNext, sAttr, j;\n\tfor ( var i=0 ; i<aDom.length ; i++ )\n\t{\n\t\tfeatureNode = null;\n\t\tcOption = aDom[i];\n\n\t\tif ( cOption == '<' )\n\t\t{\n\t\t\t/* New container div */\n\t\t\tnNewNode = $('<div/>')[0];\n\n\t\t\t/* Check to see if we should append an id and/or a class name to the container */\n\t\t\tcNext = aDom[i+1];\n\t\t\tif ( cNext == \"'\" || cNext == '\"' )\n\t\t\t{\n\t\t\t\tsAttr = \"\";\n\t\t\t\tj = 2;\n\t\t\t\twhile ( aDom[i+j] != cNext )\n\t\t\t\t{\n\t\t\t\t\tsAttr += aDom[i+j];\n\t\t\t\t\tj++;\n\t\t\t\t}\n\n\t\t\t\t/* Replace jQuery UI constants @todo depreciated */\n\t\t\t\tif ( sAttr == \"H\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIHeader;\n\t\t\t\t}\n\t\t\t\telse if ( sAttr == \"F\" )\n\t\t\t\t{\n\t\t\t\t\tsAttr = classes.sJUIFooter;\n\t\t\t\t}\n\n\t\t\t\t/* The attribute can be in the format of \"#id.class\", \"#id\" or \"class\" This logic\n\t\t\t\t * breaks the string into parts and applies them as needed\n\t\t\t\t */\n\t\t\t\tif ( sAttr.indexOf('.') != -1 )\n\t\t\t\t{\n\t\t\t\t\tvar aSplit = sAttr.split('.');\n\t\t\t\t\tnNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);\n\t\t\t\t\tnNewNode.className = aSplit[1];\n\t\t\t\t}\n\t\t\t\telse if ( sAttr.charAt(0) == \"#\" )\n\t\t\t\t{\n\t\t\t\t\tnNewNode.id = sAttr.substr(1, sAttr.length-1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tnNewNode.className = sAttr;\n\t\t\t\t}\n\n\t\t\t\ti += j; /* Move along the position array */\n\t\t\t}\n\n\t\t\tinsert.append( nNewNode );\n\t\t\tinsert = $(nNewNode);\n\t\t}\n\t\telse if ( cOption == '>' )\n\t\t{\n\t\t\t/* End container div */\n\t\t\tinsert = insert.parent();\n\t\t}\n\t\t// @todo Move options into their own plugins?\n\t\telse if ( cOption == 'l' && features.bPaginate && features.bLengthChange )\n\t\t{\n\t\t\t/* Length */\n\t\t\tfeatureNode = _fnFeatureHtmlLength( oSettings );\n\t\t}\n\t\telse if ( cOption == 'f' && features.bFilter )\n\t\t{\n\t\t\t/* Filter */\n\t\t\tfeatureNode = _fnFeatureHtmlFilter( oSettings );\n\t\t}\n\t\telse if ( cOption == 'r' && features.bProcessing )\n\t\t{\n\t\t\t/* pRocessing */\n\t\t\tfeatureNode = _fnFeatureHtmlProcessing( oSettings );\n\t\t}\n\t\telse if ( cOption == 't' )\n\t\t{\n\t\t\t/* Table */\n\t\t\tfeatureNode = _fnFeatureHtmlTable( oSettings );\n\t\t}\n\t\telse if ( cOption ==  'i' && features.bInfo )\n\t\t{\n\t\t\t/* Info */\n\t\t\tfeatureNode = _fnFeatureHtmlInfo( oSettings );\n\t\t}\n\t\telse if ( cOption == 'p' && features.bPaginate )\n\t\t{\n\t\t\t/* Pagination */\n\t\t\tfeatureNode = _fnFeatureHtmlPaginate( oSettings );\n\t\t}\n\t\telse if ( DataTable.ext.feature.length !== 0 )\n\t\t{\n\t\t\t/* Plug-in features */\n\t\t\tvar aoFeatures = DataTable.ext.feature;\n\t\t\tfor ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )\n\t\t\t{\n\t\t\t\tif ( cOption == aoFeatures[k].cFeature )\n\t\t\t\t{\n\t\t\t\t\tfeatureNode = aoFeatures[k].fnInit( oSettings );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Add to the 2D features array */\n\t\tif ( featureNode )\n\t\t{\n\t\t\tvar aanFeatures = oSettings.aanFeatures;\n\n\t\t\tif ( ! aanFeatures[cOption] )\n\t\t\t{\n\t\t\t\taanFeatures[cOption] = [];\n\t\t\t}\n\n\t\t\taanFeatures[cOption].push( featureNode );\n\t\t\tinsert.append( featureNode );\n\t\t}\n\t}\n\n\t/* Built our DOM structure - replace the holding div with what we want */\n\tholding.replaceWith( insert );\n\toSettings.nHolding = null;\n}\n\n\n/**\n * Use the DOM source to create up an array of header cells. The idea here is to\n * create a layout grid (array) of rows x columns, which contains a reference\n * to the cell that that point in the grid (regardless of col/rowspan), such that\n * any column / row could be removed and the new grid constructed\n *  @param array {object} aLayout Array to store the calculated layout in\n *  @param {node} nThead The header/footer element for the table\n *  @memberof DataTable#oApi\n */\nfunction _fnDetectHeader ( aLayout, nThead )\n{\n\tvar nTrs = $(nThead).children('tr');\n\tvar nTr, nCell;\n\tvar i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;\n\tvar bUnique;\n\tvar fnShiftCol = function ( a, i, j ) {\n\t\tvar k = a[i];\n                while ( k[j] ) {\n\t\t\tj++;\n\t\t}\n\t\treturn j;\n\t};\n\n\taLayout.splice( 0, aLayout.length );\n\n\t/* We know how many rows there are in the layout - so prep it */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\taLayout.push( [] );\n\t}\n\n\t/* Calculate a layout array */\n\tfor ( i=0, iLen=nTrs.length ; i<iLen ; i++ )\n\t{\n\t\tnTr = nTrs[i];\n\t\tiColumn = 0;\n\n\t\t/* For every cell in the row... */\n\t\tnCell = nTr.firstChild;\n\t\twhile ( nCell ) {\n\t\t\tif ( nCell.nodeName.toUpperCase() == \"TD\" ||\n\t\t\t     nCell.nodeName.toUpperCase() == \"TH\" )\n\t\t\t{\n\t\t\t\t/* Get the col and rowspan attributes from the DOM and sanitise them */\n\t\t\t\tiColspan = nCell.getAttribute('colspan') * 1;\n\t\t\t\tiRowspan = nCell.getAttribute('rowspan') * 1;\n\t\t\t\tiColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;\n\t\t\t\tiRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;\n\n\t\t\t\t/* There might be colspan cells already in this row, so shift our target\n\t\t\t\t * accordingly\n\t\t\t\t */\n\t\t\t\tiColShifted = fnShiftCol( aLayout, i, iColumn );\n\n\t\t\t\t/* Cache calculation for unique columns */\n\t\t\t\tbUnique = iColspan === 1 ? true : false;\n\n\t\t\t\t/* If there is col / rowspan, copy the information into the layout grid */\n\t\t\t\tfor ( l=0 ; l<iColspan ; l++ )\n\t\t\t\t{\n\t\t\t\t\tfor ( k=0 ; k<iRowspan ; k++ )\n\t\t\t\t\t{\n\t\t\t\t\t\taLayout[i+k][iColShifted+l] = {\n\t\t\t\t\t\t\t\"cell\": nCell,\n\t\t\t\t\t\t\t\"unique\": bUnique\n\t\t\t\t\t\t};\n\t\t\t\t\t\taLayout[i+k].nTr = nTr;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tnCell = nCell.nextSibling;\n\t\t}\n\t}\n}\n\n\n/**\n * Get an array of unique th elements, one for each column\n *  @param {object} oSettings dataTables settings object\n *  @param {node} nHeader automatically detect the layout from this node - optional\n *  @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional\n *  @returns array {node} aReturn list of unique th's\n *  @memberof DataTable#oApi\n */\nfunction _fnGetUniqueThs ( oSettings, nHeader, aLayout )\n{\n\tvar aReturn = [];\n\tif ( !aLayout )\n\t{\n\t\taLayout = oSettings.aoHeader;\n\t\tif ( nHeader )\n\t\t{\n\t\t\taLayout = [];\n\t\t\t_fnDetectHeader( aLayout, nHeader );\n\t\t}\n\t}\n\n\tfor ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )\n\t{\n\t\tfor ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )\n\t\t{\n\t\t\tif ( aLayout[i][j].unique &&\n\t\t\t\t (!aReturn[j] || !oSettings.bSortCellsTop) )\n\t\t\t{\n\t\t\t\taReturn[j] = aLayout[i][j].cell;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn aReturn;\n}\n\n/**\n * Set the start position for draw\n *  @param {object} oSettings dataTables settings object\n */\nfunction _fnStart( oSettings )\n{\n\tvar bServerSide = _fnDataSource( oSettings ) == 'ssp';\n\tvar iInitDisplayStart = oSettings.iInitDisplayStart;\n\n\t// Check and see if we have an initial draw position from state saving\n\tif ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )\n\t{\n\t\toSettings._iDisplayStart = bServerSide ?\n\t\t\tiInitDisplayStart :\n\t\t\tiInitDisplayStart >= oSettings.fnRecordsDisplay() ?\n\t\t\t\t0 :\n\t\t\t\tiInitDisplayStart;\n\n\t\toSettings.iInitDisplayStart = -1;\n\t}\n}\n\n/**\n * Create an Ajax call based on the table's settings, taking into account that\n * parameters can have multiple forms, and backwards compatibility.\n *\n * @param {object} oSettings dataTables settings object\n * @param {array} data Data to send to the server, required by\n *     DataTables - may be augmented by developer callbacks\n * @param {function} fn Callback function to run when data is obtained\n */\nfunction _fnBuildAjax( oSettings, data, fn )\n{\n\t// Compatibility with 1.9-, allow fnServerData and event to manipulate\n\t_fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );\n\n\t// Convert to object based for 1.10+ if using the old array scheme which can\n\t// come from server-side processing or serverParams\n\tif ( data && Array.isArray(data) ) {\n\t\tvar tmp = {};\n\t\tvar rbracket = /(.*?)\\[\\]$/;\n\n\t\t$.each( data, function (key, val) {\n\t\t\tvar match = val.name.match(rbracket);\n\n\t\t\tif ( match ) {\n\t\t\t\t// Support for arrays\n\t\t\t\tvar name = match[0];\n\n\t\t\t\tif ( ! tmp[ name ] ) {\n\t\t\t\t\ttmp[ name ] = [];\n\t\t\t\t}\n\t\t\t\ttmp[ name ].push( val.value );\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttmp[val.name] = val.value;\n\t\t\t}\n\t\t} );\n\t\tdata = tmp;\n\t}\n\n\tvar ajaxData;\n\tvar ajax = oSettings.ajax;\n\tvar instance = oSettings.oInstance;\n\tvar callback = function ( json ) {\n\t\tvar status = oSettings.jqXHR\n\t\t\t? oSettings.jqXHR.status\n\t\t\t: null;\n\n\t\tif ( json === null || (typeof status === 'number' && status == 204 ) ) {\n\t\t\tjson = {};\n\t\t\t_fnAjaxDataSrc( oSettings, json, [] );\n\t\t}\n\n\t\tvar error = json.error || json.sError;\n\t\tif ( error ) {\n\t\t\t_fnLog( oSettings, 0, error );\n\t\t}\n\n\t\toSettings.json = json;\n\n\t\t_fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );\n\t\tfn( json );\n\t};\n\n\tif ( $.isPlainObject( ajax ) && ajax.data )\n\t{\n\t\tajaxData = ajax.data;\n\n\t\tvar newData = typeof ajaxData === 'function' ?\n\t\t\tajaxData( data, oSettings ) :  // fn can manipulate data or return\n\t\t\tajaxData;                      // an object object or array to merge\n\n\t\t// If the function returned something, use that alone\n\t\tdata = typeof ajaxData === 'function' && newData ?\n\t\t\tnewData :\n\t\t\t$.extend( true, data, newData );\n\n\t\t// Remove the data property as we've resolved it already and don't want\n\t\t// jQuery to do it again (it is restored at the end of the function)\n\t\tdelete ajax.data;\n\t}\n\n\tvar baseAjax = {\n\t\t\"data\": data,\n\t\t\"success\": callback,\n\t\t\"dataType\": \"json\",\n\t\t\"cache\": false,\n\t\t\"type\": oSettings.sServerMethod,\n\t\t\"error\": function (xhr, error, thrown) {\n\t\t\tvar ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );\n\n\t\t\tif ( $.inArray( true, ret ) === -1 ) {\n\t\t\t\tif ( error == \"parsererror\" ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Invalid JSON response', 1 );\n\t\t\t\t}\n\t\t\t\telse if ( xhr.readyState === 4 ) {\n\t\t\t\t\t_fnLog( oSettings, 0, 'Ajax error', 7 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t_fnProcessingDisplay( oSettings, false );\n\t\t}\n\t};\n\n\t// Store the data submitted for the API\n\toSettings.oAjaxData = data;\n\n\t// Allow plug-ins and external processes to modify the data\n\t_fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );\n\n\tif ( oSettings.fnServerData )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.fnServerData.call( instance,\n\t\t\toSettings.sAjaxSource,\n\t\t\t$.map( data, function (val, key) { // Need to convert back to 1.9 trad format\n\t\t\t\treturn { name: key, value: val };\n\t\t\t} ),\n\t\t\tcallback,\n\t\t\toSettings\n\t\t);\n\t}\n\telse if ( oSettings.sAjaxSource || typeof ajax === 'string' )\n\t{\n\t\t// DataTables 1.9- compatibility\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, {\n\t\t\turl: ajax || oSettings.sAjaxSource\n\t\t} ) );\n\t}\n\telse if ( typeof ajax === 'function' )\n\t{\n\t\t// Is a function - let the caller define what needs to be done\n\t\toSettings.jqXHR = ajax.call( instance, data, callback, oSettings );\n\t}\n\telse\n\t{\n\t\t// Object to extend the base settings\n\t\toSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );\n\n\t\t// Restore for next time around\n\t\tajax.data = ajaxData;\n\t}\n}\n\n\n/**\n * Update the table using an Ajax call\n *  @param {object} settings dataTables settings object\n *  @returns {boolean} Block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdate( settings )\n{\n\tsettings.iDraw++;\n\t_fnProcessingDisplay( settings, true );\n\n\t_fnBuildAjax(\n\t\tsettings,\n\t\t_fnAjaxParameters( settings ),\n\t\tfunction(json) {\n\t\t\t_fnAjaxUpdateDraw( settings, json );\n\t\t}\n\t);\n}\n\n\n/**\n * Build up the parameters in an object needed for a server-side processing\n * request. Note that this is basically done twice, is different ways - a modern\n * method which is used by default in DataTables 1.10 which uses objects and\n * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if\n * the sAjaxSource option is used in the initialisation, or the legacyAjax\n * option is set.\n *  @param {object} oSettings dataTables settings object\n *  @returns {bool} block the table drawing or not\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxParameters( settings )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tcolumnCount = columns.length,\n\t\tfeatures = settings.oFeatures,\n\t\tpreSearch = settings.oPreviousSearch,\n\t\tpreColSearch = settings.aoPreSearchCols,\n\t\ti, data = [], dataProp, column, columnSearch,\n\t\tsort = _fnSortFlatten( settings ),\n\t\tdisplayStart = settings._iDisplayStart,\n\t\tdisplayLength = features.bPaginate !== false ?\n\t\t\tsettings._iDisplayLength :\n\t\t\t-1;\n\n\tvar param = function ( name, value ) {\n\t\tdata.push( { 'name': name, 'value': value } );\n\t};\n\n\t// DataTables 1.9- compatible method\n\tparam( 'sEcho',          settings.iDraw );\n\tparam( 'iColumns',       columnCount );\n\tparam( 'sColumns',       _pluck( columns, 'sName' ).join(',') );\n\tparam( 'iDisplayStart',  displayStart );\n\tparam( 'iDisplayLength', displayLength );\n\n\t// DataTables 1.10+ method\n\tvar d = {\n\t\tdraw:    settings.iDraw,\n\t\tcolumns: [],\n\t\torder:   [],\n\t\tstart:   displayStart,\n\t\tlength:  displayLength,\n\t\tsearch:  {\n\t\t\tvalue: preSearch.sSearch,\n\t\t\tregex: preSearch.bRegex\n\t\t}\n\t};\n\n\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\tcolumn = columns[i];\n\t\tcolumnSearch = preColSearch[i];\n\t\tdataProp = typeof column.mData==\"function\" ? 'function' : column.mData ;\n\n\t\td.columns.push( {\n\t\t\tdata:       dataProp,\n\t\t\tname:       column.sName,\n\t\t\tsearchable: column.bSearchable,\n\t\t\torderable:  column.bSortable,\n\t\t\tsearch:     {\n\t\t\t\tvalue: columnSearch.sSearch,\n\t\t\t\tregex: columnSearch.bRegex\n\t\t\t}\n\t\t} );\n\n\t\tparam( \"mDataProp_\"+i, dataProp );\n\n\t\tif ( features.bFilter ) {\n\t\t\tparam( 'sSearch_'+i,     columnSearch.sSearch );\n\t\t\tparam( 'bRegex_'+i,      columnSearch.bRegex );\n\t\t\tparam( 'bSearchable_'+i, column.bSearchable );\n\t\t}\n\n\t\tif ( features.bSort ) {\n\t\t\tparam( 'bSortable_'+i, column.bSortable );\n\t\t}\n\t}\n\n\tif ( features.bFilter ) {\n\t\tparam( 'sSearch', preSearch.sSearch );\n\t\tparam( 'bRegex', preSearch.bRegex );\n\t}\n\n\tif ( features.bSort ) {\n\t\t$.each( sort, function ( i, val ) {\n\t\t\td.order.push( { column: val.col, dir: val.dir } );\n\n\t\t\tparam( 'iSortCol_'+i, val.col );\n\t\t\tparam( 'sSortDir_'+i, val.dir );\n\t\t} );\n\n\t\tparam( 'iSortingCols', sort.length );\n\t}\n\n\t// If the legacy.ajax parameter is null, then we automatically decide which\n\t// form to use, based on sAjaxSource\n\tvar legacy = DataTable.ext.legacy.ajax;\n\tif ( legacy === null ) {\n\t\treturn settings.sAjaxSource ? data : d;\n\t}\n\n\t// Otherwise, if legacy has been specified then we use that to decide on the\n\t// form\n\treturn legacy ? data : d;\n}\n\n\n/**\n * Data the data from the server (nuking the old) and redraw the table\n *  @param {object} oSettings dataTables settings object\n *  @param {object} json json data return from the server.\n *  @param {string} json.sEcho Tracking flag for DataTables to match requests\n *  @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering\n *  @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering\n *  @param {array} json.aaData The data to display on this page\n *  @param {string} [json.sColumns] Column ordering (sName, comma separated)\n *  @memberof DataTable#oApi\n */\nfunction _fnAjaxUpdateDraw ( settings, json )\n{\n\t// v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.\n\t// Support both\n\tvar compat = function ( old, modern ) {\n\t\treturn json[old] !== undefined ? json[old] : json[modern];\n\t};\n\n\tvar data = _fnAjaxDataSrc( settings, json );\n\tvar draw            = compat( 'sEcho',                'draw' );\n\tvar recordsTotal    = compat( 'iTotalRecords',        'recordsTotal' );\n\tvar recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );\n\n\tif ( draw !== undefined ) {\n\t\t// Protect against out of sequence returns\n\t\tif ( draw*1 < settings.iDraw ) {\n\t\t\treturn;\n\t\t}\n\t\tsettings.iDraw = draw * 1;\n\t}\n\n\t// No data in returned object, so rather than an array, we show an empty table\n\tif ( ! data ) {\n\t\tdata = [];\n\t}\n\n\t_fnClearTable( settings );\n\tsettings._iRecordsTotal   = parseInt(recordsTotal, 10);\n\tsettings._iRecordsDisplay = parseInt(recordsFiltered, 10);\n\n\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t_fnAddData( settings, data[i] );\n\t}\n\tsettings.aiDisplay = settings.aiDisplayMaster.slice();\n\n\t_fnDraw( settings, true );\n\n\tif ( ! settings._bInitComplete ) {\n\t\t_fnInitComplete( settings, json );\n\t}\n\n\t_fnProcessingDisplay( settings, false );\n}\n\n\n/**\n * Get the data from the JSON data source to use for drawing a table. Using\n * `_fnGetObjectDataFn` allows the data to be sourced from a property of the\n * source object, or from a processing function.\n *  @param {object} oSettings dataTables settings object\n *  @param  {object} json Data source object / array from the server\n *  @return {array} Array of data to use\n */\n function _fnAjaxDataSrc ( oSettings, json, write )\n {\n\tvar dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?\n\t\toSettings.ajax.dataSrc :\n\t\toSettings.sAjaxDataProp; // Compatibility with 1.9-.\n\n\tif ( ! write ) {\n\t\tif ( dataSrc === 'data' ) {\n\t\t\t// If the default, then we still want to support the old style, and safely ignore\n\t\t\t// it if possible\n\t\t\treturn json.aaData || json[dataSrc];\n\t\t}\n\n\t\treturn dataSrc !== \"\" ?\n\t\t\t_fnGetObjectDataFn( dataSrc )( json ) :\n\t\t\tjson;\n\t}\n\n\t// set\n\t_fnSetObjectDataFn( dataSrc )( json, write );\n}\n\n/**\n * Generate the node required for filtering text\n *  @returns {node} Filter control element\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlFilter ( settings )\n{\n\tvar classes = settings.oClasses;\n\tvar tableId = settings.sTableId;\n\tvar language = settings.oLanguage;\n\tvar previousSearch = settings.oPreviousSearch;\n\tvar features = settings.aanFeatures;\n\tvar input = '<input type=\"search\" class=\"'+classes.sFilterInput+'\"/>';\n\n\tvar str = language.sSearch;\n\tstr = str.match(/_INPUT_/) ?\n\t\tstr.replace('_INPUT_', input) :\n\t\tstr+input;\n\n\tvar filter = $('<div/>', {\n\t\t\t'id': ! features.f ? tableId+'_filter' : null,\n\t\t\t'class': classes.sFilter\n\t\t} )\n\t\t.append( $('<label/>' ).append( str ) );\n\n\tvar searchFn = function(event) {\n\t\t/* Update all other filter input elements for the new display */\n\t\tvar n = features.f;\n\t\tvar val = !this.value ? \"\" : this.value; // mental IE8 fix :-(\n\t\tif(previousSearch.return && event.key !== \"Enter\") {\n\t\t\treturn;\n\t\t}\n\t\t/* Now do the filter */\n\t\tif ( val != previousSearch.sSearch ) {\n\t\t\t_fnFilterComplete( settings, {\n\t\t\t\t\"sSearch\": val,\n\t\t\t\t\"bRegex\": previousSearch.bRegex,\n\t\t\t\t\"bSmart\": previousSearch.bSmart ,\n\t\t\t\t\"bCaseInsensitive\": previousSearch.bCaseInsensitive,\n\t\t\t\t\"return\": previousSearch.return\n\t\t\t} );\n\n\t\t\t// Need to redraw, without resorting\n\t\t\tsettings._iDisplayStart = 0;\n\t\t\t_fnDraw( settings );\n\t\t}\n\t};\n\n\tvar searchDelay = settings.searchDelay !== null ?\n\t\tsettings.searchDelay :\n\t\t_fnDataSource( settings ) === 'ssp' ?\n\t\t\t400 :\n\t\t\t0;\n\n\tvar jqFilter = $('input', filter)\n\t\t.val( previousSearch.sSearch )\n\t\t.attr( 'placeholder', language.sSearchPlaceholder )\n\t\t.on(\n\t\t\t'keyup.DT search.DT input.DT paste.DT cut.DT',\n\t\t\tsearchDelay ?\n\t\t\t\t_fnThrottle( searchFn, searchDelay ) :\n\t\t\t\tsearchFn\n\t\t)\n\t\t.on( 'mouseup', function(e) {\n\t\t\t// Edge fix! Edge 17 does not trigger anything other than mouse events when clicking\n\t\t\t// on the clear icon (Edge bug 17584515). This is safe in other browsers as `searchFn`\n\t\t\t// checks the value to see if it has changed. In other browsers it won't have.\n\t\t\tsetTimeout( function () {\n\t\t\t\tsearchFn.call(jqFilter[0], e);\n\t\t\t}, 10);\n\t\t} )\n\t\t.on( 'keypress.DT', function(e) {\n\t\t\t/* Prevent form submission */\n\t\t\tif ( e.keyCode == 13 ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} )\n\t\t.attr('aria-controls', tableId);\n\n\t// Update the input elements whenever the table is filtered\n\t$(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {\n\t\tif ( settings === s ) {\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame...\n\t\t\ttry {\n\t\t\t\tif ( jqFilter[0] !== document.activeElement ) {\n\t\t\t\t\tjqFilter.val( previousSearch.sSearch );\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch ( e ) {}\n\t\t}\n\t} );\n\n\treturn filter[0];\n}\n\n\n/**\n * Filter the table using both the global filter and column based filtering\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oSearch search information\n *  @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterComplete ( oSettings, oInput, iForce )\n{\n\tvar oPrevSearch = oSettings.oPreviousSearch;\n\tvar aoPrevSearch = oSettings.aoPreSearchCols;\n\tvar fnSaveFilter = function ( oFilter ) {\n\t\t/* Save the filtering values */\n\t\toPrevSearch.sSearch = oFilter.sSearch;\n\t\toPrevSearch.bRegex = oFilter.bRegex;\n\t\toPrevSearch.bSmart = oFilter.bSmart;\n\t\toPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;\n\t\toPrevSearch.return = oFilter.return;\n\t};\n\tvar fnRegex = function ( o ) {\n\t\t// Backwards compatibility with the bEscapeRegex option\n\t\treturn o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;\n\t};\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo As per sort - can this be moved into an event handler?\n\t_fnColumnTypes( oSettings );\n\n\t/* In server-side processing all filtering is done by the server, so no point hanging around here */\n\tif ( _fnDataSource( oSettings ) != 'ssp' )\n\t{\n\t\t/* Global filter */\n\t\t_fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive, oInput.return );\n\t\tfnSaveFilter( oInput );\n\n\t\t/* Now do the individual column filter */\n\t\tfor ( var i=0 ; i<aoPrevSearch.length ; i++ )\n\t\t{\n\t\t\t_fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),\n\t\t\t\taoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );\n\t\t}\n\n\t\t/* Custom filtering */\n\t\t_fnFilterCustom( oSettings );\n\t}\n\telse\n\t{\n\t\tfnSaveFilter( oInput );\n\t}\n\n\t/* Tell the draw function we have been filtering */\n\toSettings.bFiltered = true;\n\t_fnCallbackFire( oSettings, null, 'search', [oSettings] );\n}\n\n\n/**\n * Apply custom filtering functions\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCustom( settings )\n{\n\tvar filters = DataTable.ext.search;\n\tvar displayRows = settings.aiDisplay;\n\tvar row, rowIdx;\n\n\tfor ( var i=0, ien=filters.length ; i<ien ; i++ ) {\n\t\tvar rows = [];\n\n\t\t// Loop over each row and see if it should be included\n\t\tfor ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {\n\t\t\trowIdx = displayRows[ j ];\n\t\t\trow = settings.aoData[ rowIdx ];\n\n\t\t\tif ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {\n\t\t\t\trows.push( rowIdx );\n\t\t\t}\n\t\t}\n\n\t\t// So the array reference doesn't break set the results into the\n\t\t// existing array\n\t\tdisplayRows.length = 0;\n\t\t$.merge( displayRows, rows );\n\t}\n}\n\n\n/**\n * Filter the table on a per-column basis\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sInput string to filter on\n *  @param {int} iColumn column to filter\n *  @param {bool} bRegex treat search string as a regular expression or not\n *  @param {bool} bSmart use smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )\n{\n\tif ( searchStr === '' ) {\n\t\treturn;\n\t}\n\n\tvar data;\n\tvar out = [];\n\tvar display = settings.aiDisplay;\n\tvar rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );\n\n\tfor ( var i=0 ; i<display.length ; i++ ) {\n\t\tdata = settings.aoData[ display[i] ]._aFilterData[ colIdx ];\n\n\t\tif ( rpSearch.test( data ) ) {\n\t\t\tout.push( display[i] );\n\t\t}\n\t}\n\n\tsettings.aiDisplay = out;\n}\n\n\n/**\n * Filter the data table based on user input and draw the table\n *  @param {object} settings dataTables settings object\n *  @param {string} input string to filter on\n *  @param {int} force optional - force a research of the master array (1) or not (undefined or 0)\n *  @param {bool} regex treat as a regular expression or not\n *  @param {bool} smart perform smart filtering or not\n *  @param {bool} caseInsensitive Do case insensitive matching or not\n *  @memberof DataTable#oApi\n */\nfunction _fnFilter( settings, input, force, regex, smart, caseInsensitive )\n{\n\tvar rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );\n\tvar prevSearch = settings.oPreviousSearch.sSearch;\n\tvar displayMaster = settings.aiDisplayMaster;\n\tvar display, invalidated, i;\n\tvar filtered = [];\n\n\t// Need to take account of custom filtering functions - always filter\n\tif ( DataTable.ext.search.length !== 0 ) {\n\t\tforce = true;\n\t}\n\n\t// Check if any of the rows were invalidated\n\tinvalidated = _fnFilterData( settings );\n\n\t// If the input is blank - we just want the full data set\n\tif ( input.length <= 0 ) {\n\t\tsettings.aiDisplay = displayMaster.slice();\n\t}\n\telse {\n\t\t// New search - start from the master array\n\t\tif ( invalidated ||\n\t\t\t force ||\n\t\t\t regex ||\n\t\t\t prevSearch.length > input.length ||\n\t\t\t input.indexOf(prevSearch) !== 0 ||\n\t\t\t settings.bSorted // On resort, the display master needs to be\n\t\t\t                  // re-filtered since indexes will have changed\n\t\t) {\n\t\t\tsettings.aiDisplay = displayMaster.slice();\n\t\t}\n\n\t\t// Search the display array\n\t\tdisplay = settings.aiDisplay;\n\n\t\tfor ( i=0 ; i<display.length ; i++ ) {\n\t\t\tif ( rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {\n\t\t\t\tfiltered.push( display[i] );\n\t\t\t}\n\t\t}\n\n\t\tsettings.aiDisplay = filtered;\n\t}\n}\n\n\n/**\n * Build a regular expression object suitable for searching a table\n *  @param {string} sSearch string to search for\n *  @param {bool} bRegex treat as a regular expression or not\n *  @param {bool} bSmart perform smart filtering or not\n *  @param {bool} bCaseInsensitive Do case insensitive matching or not\n *  @returns {RegExp} constructed object\n *  @memberof DataTable#oApi\n */\nfunction _fnFilterCreateSearch( search, regex, smart, caseInsensitive )\n{\n\tsearch = regex ?\n\t\tsearch :\n\t\t_fnEscapeRegex( search );\n\t\n\tif ( smart ) {\n\t\t/* For smart filtering we want to allow the search to work regardless of\n\t\t * word order. We also want double quoted text to be preserved, so word\n\t\t * order is important - a la google. So this is what we want to\n\t\t * generate:\n\t\t * \n\t\t * ^(?=.*?\\bone\\b)(?=.*?\\btwo three\\b)(?=.*?\\bfour\\b).*$\n\t\t */\n\t\tvar a = $.map( search.match( /\"[^\"]+\"|[^ ]+/g ) || [''], function ( word ) {\n\t\t\tif ( word.charAt(0) === '\"' ) {\n\t\t\t\tvar m = word.match( /^\"(.*)\"$/ );\n\t\t\t\tword = m ? m[1] : word;\n\t\t\t}\n\n\t\t\treturn word.replace('\"', '');\n\t\t} );\n\n\t\tsearch = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';\n\t}\n\n\treturn new RegExp( search, caseInsensitive ? 'i' : '' );\n}\n\n\n/**\n * Escape a string such that it can be used in a regular expression\n *  @param {string} sVal string to escape\n *  @returns {string} escaped string\n *  @memberof DataTable#oApi\n */\nvar _fnEscapeRegex = DataTable.util.escapeRegex;\n\nvar __filter_div = $('<div>')[0];\nvar __filter_div_textContent = __filter_div.textContent !== undefined;\n\n// Update the filtering data for each row if needed (by invalidation or first run)\nfunction _fnFilterData ( settings )\n{\n\tvar columns = settings.aoColumns;\n\tvar column;\n\tvar i, j, ien, jen, filterData, cellData, row;\n\tvar wasInvalidated = false;\n\n\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aFilterData ) {\n\t\t\tfilterData = [];\n\n\t\t\tfor ( j=0, jen=columns.length ; j<jen ; j++ ) {\n\t\t\t\tcolumn = columns[j];\n\n\t\t\t\tif ( column.bSearchable ) {\n\t\t\t\t\tcellData = _fnGetCellData( settings, i, j, 'filter' );\n\n\t\t\t\t\t// Search in DataTables 1.10 is string based. In 1.11 this\n\t\t\t\t\t// should be altered to also allow strict type checking.\n\t\t\t\t\tif ( cellData === null ) {\n\t\t\t\t\t\tcellData = '';\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof cellData !== 'string' && cellData.toString ) {\n\t\t\t\t\t\tcellData = cellData.toString();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcellData = '';\n\t\t\t\t}\n\n\t\t\t\t// If it looks like there is an HTML entity in the string,\n\t\t\t\t// attempt to decode it so sorting works as expected. Note that\n\t\t\t\t// we could use a single line of jQuery to do this, but the DOM\n\t\t\t\t// method used here is much faster http://jsperf.com/html-decode\n\t\t\t\tif ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {\n\t\t\t\t\t__filter_div.innerHTML = cellData;\n\t\t\t\t\tcellData = __filter_div_textContent ?\n\t\t\t\t\t\t__filter_div.textContent :\n\t\t\t\t\t\t__filter_div.innerText;\n\t\t\t\t}\n\n\t\t\t\tif ( cellData.replace ) {\n\t\t\t\t\tcellData = cellData.replace(/[\\r\\n\\u2028]/g, '');\n\t\t\t\t}\n\n\t\t\t\tfilterData.push( cellData );\n\t\t\t}\n\n\t\t\trow._aFilterData = filterData;\n\t\t\trow._sFilterRow = filterData.join('  ');\n\t\t\twasInvalidated = true;\n\t\t}\n\t}\n\n\treturn wasInvalidated;\n}\n\n\n/**\n * Convert from the internal Hungarian notation to camelCase for external\n * interaction\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToCamel ( obj )\n{\n\treturn {\n\t\tsearch:          obj.sSearch,\n\t\tsmart:           obj.bSmart,\n\t\tregex:           obj.bRegex,\n\t\tcaseInsensitive: obj.bCaseInsensitive\n\t};\n}\n\n\n\n/**\n * Convert from camelCase notation to the internal Hungarian. We could use the\n * Hungarian convert function here, but this is cleaner\n *  @param {object} obj Object to convert\n *  @returns {object} Inverted object\n *  @memberof DataTable#oApi\n */\nfunction _fnSearchToHung ( obj )\n{\n\treturn {\n\t\tsSearch:          obj.search,\n\t\tbSmart:           obj.smart,\n\t\tbRegex:           obj.regex,\n\t\tbCaseInsensitive: obj.caseInsensitive\n\t};\n}\n\n/**\n * Generate the node required for the info display\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Information element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlInfo ( settings )\n{\n\tvar\n\t\ttid = settings.sTableId,\n\t\tnodes = settings.aanFeatures.i,\n\t\tn = $('<div/>', {\n\t\t\t'class': settings.oClasses.sInfo,\n\t\t\t'id': ! nodes ? tid+'_info' : null\n\t\t} );\n\n\tif ( ! nodes ) {\n\t\t// Update display on each draw\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": _fnUpdateInfo,\n\t\t\t\"sName\": \"information\"\n\t\t} );\n\n\t\tn\n\t\t\t.attr( 'role', 'status' )\n\t\t\t.attr( 'aria-live', 'polite' );\n\n\t\t// Table is described by our info div\n\t\t$(settings.nTable).attr( 'aria-describedby', tid+'_info' );\n\t}\n\n\treturn n[0];\n}\n\n\n/**\n * Update the information elements in the display\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnUpdateInfo ( settings )\n{\n\t/* Show information about the table */\n\tvar nodes = settings.aanFeatures.i;\n\tif ( nodes.length === 0 ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\tlang  = settings.oLanguage,\n\t\tstart = settings._iDisplayStart+1,\n\t\tend   = settings.fnDisplayEnd(),\n\t\tmax   = settings.fnRecordsTotal(),\n\t\ttotal = settings.fnRecordsDisplay(),\n\t\tout   = total ?\n\t\t\tlang.sInfo :\n\t\t\tlang.sInfoEmpty;\n\n\tif ( total !== max ) {\n\t\t/* Record set after filtering */\n\t\tout += ' ' + lang.sInfoFiltered;\n\t}\n\n\t// Convert the macros\n\tout += lang.sInfoPostFix;\n\tout = _fnInfoMacros( settings, out );\n\n\tvar callback = lang.fnInfoCallback;\n\tif ( callback !== null ) {\n\t\tout = callback.call( settings.oInstance,\n\t\t\tsettings, start, end, max, total, out\n\t\t);\n\t}\n\n\t$(nodes).html( out );\n}\n\n\nfunction _fnInfoMacros ( settings, str )\n{\n\t// When infinite scrolling, we are always starting at 1. _iDisplayStart is used only\n\t// internally\n\tvar\n\t\tformatter  = settings.fnFormatNumber,\n\t\tstart      = settings._iDisplayStart+1,\n\t\tlen        = settings._iDisplayLength,\n\t\tvis        = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn str.\n\t\treplace(/_START_/g, formatter.call( settings, start ) ).\n\t\treplace(/_END_/g,   formatter.call( settings, settings.fnDisplayEnd() ) ).\n\t\treplace(/_MAX_/g,   formatter.call( settings, settings.fnRecordsTotal() ) ).\n\t\treplace(/_TOTAL_/g, formatter.call( settings, vis ) ).\n\t\treplace(/_PAGE_/g,  formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).\n\t\treplace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );\n}\n\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnInitialise ( settings )\n{\n\tvar i, iLen, iAjaxStart=settings.iInitDisplayStart;\n\tvar columns = settings.aoColumns, column;\n\tvar features = settings.oFeatures;\n\tvar deferLoading = settings.bDeferLoading; // value modified by the draw\n\n\t/* Ensure that the table data is fully initialised */\n\tif ( ! settings.bInitialised ) {\n\t\tsetTimeout( function(){ _fnInitialise( settings ); }, 200 );\n\t\treturn;\n\t}\n\n\t/* Show the display HTML options */\n\t_fnAddOptionsHtml( settings );\n\n\t/* Build and draw the header / footer for the table */\n\t_fnBuildHead( settings );\n\t_fnDrawHead( settings, settings.aoHeader );\n\t_fnDrawHead( settings, settings.aoFooter );\n\n\t/* Okay to show that something is going on now */\n\t_fnProcessingDisplay( settings, true );\n\n\t/* Calculate sizes for columns */\n\tif ( features.bAutoWidth ) {\n\t\t_fnCalculateColumnWidths( settings );\n\t}\n\n\tfor ( i=0, iLen=columns.length ; i<iLen ; i++ ) {\n\t\tcolumn = columns[i];\n\n\t\tif ( column.sWidth ) {\n\t\t\tcolumn.nTh.style.width = _fnStringToCss( column.sWidth );\n\t\t}\n\t}\n\n\t_fnCallbackFire( settings, null, 'preInit', [settings] );\n\n\t// If there is default sorting required - let's do it. The sort function\n\t// will do the drawing for us. Otherwise we draw the table regardless of the\n\t// Ajax source - this allows the table to look initialised for Ajax sourcing\n\t// data (show 'loading' message possibly)\n\t_fnReDraw( settings );\n\n\t// Server-side processing init complete is done by _fnAjaxUpdateDraw\n\tvar dataSrc = _fnDataSource( settings );\n\tif ( dataSrc != 'ssp' || deferLoading ) {\n\t\t// if there is an ajax source load the data\n\t\tif ( dataSrc == 'ajax' ) {\n\t\t\t_fnBuildAjax( settings, [], function(json) {\n\t\t\t\tvar aData = _fnAjaxDataSrc( settings, json );\n\n\t\t\t\t// Got the data - add it to the table\n\t\t\t\tfor ( i=0 ; i<aData.length ; i++ ) {\n\t\t\t\t\t_fnAddData( settings, aData[i] );\n\t\t\t\t}\n\n\t\t\t\t// Reset the init display for cookie saving. We've already done\n\t\t\t\t// a filter, and therefore cleared it before. So we need to make\n\t\t\t\t// it appear 'fresh'\n\t\t\t\tsettings.iInitDisplayStart = iAjaxStart;\n\n\t\t\t\t_fnReDraw( settings );\n\n\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t_fnInitComplete( settings, json );\n\t\t\t}, settings );\n\t\t}\n\t\telse {\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t_fnInitComplete( settings );\n\t\t}\n\t}\n}\n\n\n/**\n * Draw the table for the first time, adding all required features\n *  @param {object} oSettings dataTables settings object\n *  @param {object} [json] JSON from the server that completed the table, if using Ajax source\n *    with client-side processing (optional)\n *  @memberof DataTable#oApi\n */\nfunction _fnInitComplete ( settings, json )\n{\n\tsettings._bInitComplete = true;\n\n\t// When data was added after the initialisation (data or Ajax) we need to\n\t// calculate the column sizing\n\tif ( json || settings.oInit.aaData ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}\n\n\t_fnCallbackFire( settings, null, 'plugin-init', [settings, json] );\n\t_fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );\n}\n\n\nfunction _fnLengthChange ( settings, val )\n{\n\tvar len = parseInt( val, 10 );\n\tsettings._iDisplayLength = len;\n\n\t_fnLengthOverflow( settings );\n\n\t// Fire length change event\n\t_fnCallbackFire( settings, null, 'length', [settings, len] );\n}\n\n\n/**\n * Generate the node required for user display length changing\n *  @param {object} settings dataTables settings object\n *  @returns {node} Display length feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlLength ( settings )\n{\n\tvar\n\t\tclasses  = settings.oClasses,\n\t\ttableId  = settings.sTableId,\n\t\tmenu     = settings.aLengthMenu,\n\t\td2       = Array.isArray( menu[0] ),\n\t\tlengths  = d2 ? menu[0] : menu,\n\t\tlanguage = d2 ? menu[1] : menu;\n\n\tvar select = $('<select/>', {\n\t\t'name':          tableId+'_length',\n\t\t'aria-controls': tableId,\n\t\t'class':         classes.sLengthSelect\n\t} );\n\n\tfor ( var i=0, ien=lengths.length ; i<ien ; i++ ) {\n\t\tselect[0][ i ] = new Option(\n\t\t\ttypeof language[i] === 'number' ?\n\t\t\t\tsettings.fnFormatNumber( language[i] ) :\n\t\t\t\tlanguage[i],\n\t\t\tlengths[i]\n\t\t);\n\t}\n\n\tvar div = $('<div><label/></div>').addClass( classes.sLength );\n\tif ( ! settings.aanFeatures.l ) {\n\t\tdiv[0].id = tableId+'_length';\n\t}\n\n\tdiv.children().append(\n\t\tsettings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )\n\t);\n\n\t// Can't use `select` variable as user might provide their own and the\n\t// reference is broken by the use of outerHTML\n\t$('select', div)\n\t\t.val( settings._iDisplayLength )\n\t\t.on( 'change.DT', function(e) {\n\t\t\t_fnLengthChange( settings, $(this).val() );\n\t\t\t_fnDraw( settings );\n\t\t} );\n\n\t// Update node value whenever anything changes the table's length\n\t$(settings.nTable).on( 'length.dt.DT', function (e, s, len) {\n\t\tif ( settings === s ) {\n\t\t\t$('select', div).val( len );\n\t\t}\n\t} );\n\n\treturn div[0];\n}\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Note that most of the paging logic is done in\n * DataTable.ext.pager\n */\n\n/**\n * Generate the node required for default pagination\n *  @param {object} oSettings dataTables settings object\n *  @returns {node} Pagination feature node\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlPaginate ( settings )\n{\n\tvar\n\t\ttype   = settings.sPaginationType,\n\t\tplugin = DataTable.ext.pager[ type ],\n\t\tmodern = typeof plugin === 'function',\n\t\tredraw = function( settings ) {\n\t\t\t_fnDraw( settings );\n\t\t},\n\t\tnode = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],\n\t\tfeatures = settings.aanFeatures;\n\n\tif ( ! modern ) {\n\t\tplugin.fnInit( settings, node, redraw );\n\t}\n\n\t/* Add a draw callback for the pagination on first instance, to update the paging display */\n\tif ( ! features.p )\n\t{\n\t\tnode.id = settings.sTableId+'_paginate';\n\n\t\tsettings.aoDrawCallback.push( {\n\t\t\t\"fn\": function( settings ) {\n\t\t\t\tif ( modern ) {\n\t\t\t\t\tvar\n\t\t\t\t\t\tstart      = settings._iDisplayStart,\n\t\t\t\t\t\tlen        = settings._iDisplayLength,\n\t\t\t\t\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\t\t\t\t\tall        = len === -1,\n\t\t\t\t\t\tpage = all ? 0 : Math.ceil( start / len ),\n\t\t\t\t\t\tpages = all ? 1 : Math.ceil( visRecords / len ),\n\t\t\t\t\t\tbuttons = plugin(page, pages),\n\t\t\t\t\t\ti, ien;\n\n\t\t\t\t\tfor ( i=0, ien=features.p.length ; i<ien ; i++ ) {\n\t\t\t\t\t\t_fnRenderer( settings, 'pageButton' )(\n\t\t\t\t\t\t\tsettings, features.p[i], i, buttons, page, pages\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tplugin.fnUpdate( settings, redraw );\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"sName\": \"pagination\"\n\t\t} );\n\t}\n\n\treturn node;\n}\n\n\n/**\n * Alter the display settings to change the page\n *  @param {object} settings DataTables settings object\n *  @param {string|int} action Paging action to take: \"first\", \"previous\",\n *    \"next\" or \"last\" or page number to jump to (integer)\n *  @param [bool] redraw Automatically draw the update or not\n *  @returns {bool} true page has changed, false - no change\n *  @memberof DataTable#oApi\n */\nfunction _fnPageChange ( settings, action, redraw )\n{\n\tvar\n\t\tstart     = settings._iDisplayStart,\n\t\tlen       = settings._iDisplayLength,\n\t\trecords   = settings.fnRecordsDisplay();\n\n\tif ( records === 0 || len === -1 )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( typeof action === \"number\" )\n\t{\n\t\tstart = action * len;\n\n\t\tif ( start > records )\n\t\t{\n\t\t\tstart = 0;\n\t\t}\n\t}\n\telse if ( action == \"first\" )\n\t{\n\t\tstart = 0;\n\t}\n\telse if ( action == \"previous\" )\n\t{\n\t\tstart = len >= 0 ?\n\t\t\tstart - len :\n\t\t\t0;\n\n\t\tif ( start < 0 )\n\t\t{\n\t\t  start = 0;\n\t\t}\n\t}\n\telse if ( action == \"next\" )\n\t{\n\t\tif ( start + len < records )\n\t\t{\n\t\t\tstart += len;\n\t\t}\n\t}\n\telse if ( action == \"last\" )\n\t{\n\t\tstart = Math.floor( (records-1) / len) * len;\n\t}\n\telse\n\t{\n\t\t_fnLog( settings, 0, \"Unknown paging action: \"+action, 5 );\n\t}\n\n\tvar changed = settings._iDisplayStart !== start;\n\tsettings._iDisplayStart = start;\n\n\tif ( changed ) {\n\t\t_fnCallbackFire( settings, null, 'page', [settings] );\n\n\t\tif ( redraw ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t}\n\telse {\n\t\t// No change event - paging was called, but no change\n\t\t_fnCallbackFire( settings, null, 'page-nc', [settings] );\n\t}\n\n\treturn changed;\n}\n\n\n\n/**\n * Generate the node required for the processing node\n *  @param {object} settings dataTables settings object\n *  @returns {node} Processing element\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlProcessing ( settings )\n{\n\treturn $('<div/>', {\n\t\t\t'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,\n\t\t\t'class': settings.oClasses.sProcessing,\n\t\t\t'role': 'status'\n\t\t} )\n\t\t.html( settings.oLanguage.sProcessing )\n\t\t.append('<div><div></div><div></div><div></div><div></div></div>')\n\t\t.insertBefore( settings.nTable )[0];\n}\n\n\n/**\n * Display or hide the processing indicator\n *  @param {object} settings dataTables settings object\n *  @param {bool} show Show the processing indicator (true) or not (false)\n *  @memberof DataTable#oApi\n */\nfunction _fnProcessingDisplay ( settings, show )\n{\n\tif ( settings.oFeatures.bProcessing ) {\n\t\t$(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );\n\t}\n\n\t_fnCallbackFire( settings, null, 'processing', [settings, show] );\n}\n\n/**\n * Add any control elements for the table - specifically scrolling\n *  @param {object} settings dataTables settings object\n *  @returns {node} Node to add to the DOM\n *  @memberof DataTable#oApi\n */\nfunction _fnFeatureHtmlTable ( settings )\n{\n\tvar table = $(settings.nTable);\n\n\t// Scrolling from here on in\n\tvar scroll = settings.oScroll;\n\n\tif ( scroll.sX === '' && scroll.sY === '' ) {\n\t\treturn settings.nTable;\n\t}\n\n\tvar scrollX = scroll.sX;\n\tvar scrollY = scroll.sY;\n\tvar classes = settings.oClasses;\n\tvar caption = table.children('caption');\n\tvar captionSide = caption.length ? caption[0]._captionSide : null;\n\tvar headerClone = $( table[0].cloneNode(false) );\n\tvar footerClone = $( table[0].cloneNode(false) );\n\tvar footer = table.children('tfoot');\n\tvar _div = '<div/>';\n\tvar size = function ( s ) {\n\t\treturn !s ? null : _fnStringToCss( s );\n\t};\n\n\tif ( ! footer.length ) {\n\t\tfooter = null;\n\t}\n\n\t/*\n\t * The HTML structure that we want to generate in this function is:\n\t *  div - scroller\n\t *    div - scroll head\n\t *      div - scroll head inner\n\t *        table - scroll head table\n\t *          thead - thead\n\t *    div - scroll body\n\t *      table - table (master table)\n\t *        thead - thead clone for sizing\n\t *        tbody - tbody\n\t *    div - scroll foot\n\t *      div - scroll foot inner\n\t *        table - scroll foot table\n\t *          tfoot - tfoot\n\t */\n\tvar scroller = $( _div, { 'class': classes.sScrollWrapper } )\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollHead } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollHeadInner } )\n\t\t\t\t\t\t.css( {\n\t\t\t\t\t\t\t'box-sizing': 'content-box',\n\t\t\t\t\t\t\twidth: scroll.sXInner || '100%'\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\theaderClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'top' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('thead')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t)\n\t\t.append(\n\t\t\t$(_div, { 'class': classes.sScrollBody } )\n\t\t\t\t.css( {\n\t\t\t\t\tposition: 'relative',\n\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\twidth: size( scrollX )\n\t\t\t\t} )\n\t\t\t\t.append( table )\n\t\t);\n\n\tif ( footer ) {\n\t\tscroller.append(\n\t\t\t$(_div, { 'class': classes.sScrollFoot } )\n\t\t\t\t.css( {\n\t\t\t\t\toverflow: 'hidden',\n\t\t\t\t\tborder: 0,\n\t\t\t\t\twidth: scrollX ? size(scrollX) : '100%'\n\t\t\t\t} )\n\t\t\t\t.append(\n\t\t\t\t\t$(_div, { 'class': classes.sScrollFootInner } )\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\tfooterClone\n\t\t\t\t\t\t\t\t.removeAttr('id')\n\t\t\t\t\t\t\t\t.css( 'margin-left', 0 )\n\t\t\t\t\t\t\t\t.append( captionSide === 'bottom' ? caption : null )\n\t\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t\ttable.children('tfoot')\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t);\n\t}\n\n\tvar children = scroller.children();\n\tvar scrollHead = children[0];\n\tvar scrollBody = children[1];\n\tvar scrollFoot = footer ? children[2] : null;\n\n\t// When the body is scrolled, then we also want to scroll the headers\n\tif ( scrollX ) {\n\t\t$(scrollBody).on( 'scroll.DT', function (e) {\n\t\t\tvar scrollLeft = this.scrollLeft;\n\n\t\t\tscrollHead.scrollLeft = scrollLeft;\n\n\t\t\tif ( footer ) {\n\t\t\t\tscrollFoot.scrollLeft = scrollLeft;\n\t\t\t}\n\t\t} );\n\t}\n\n\t$(scrollBody).css('max-height', scrollY);\n\tif (! scroll.bCollapse) {\n\t\t$(scrollBody).css('height', scrollY);\n\t}\n\n\tsettings.nScrollHead = scrollHead;\n\tsettings.nScrollBody = scrollBody;\n\tsettings.nScrollFoot = scrollFoot;\n\n\t// On redraw - align columns\n\tsettings.aoDrawCallback.push( {\n\t\t\"fn\": _fnScrollDraw,\n\t\t\"sName\": \"scrolling\"\n\t} );\n\n\treturn scroller[0];\n}\n\n\n\n/**\n * Update the header, footer and body tables for resizing - i.e. column\n * alignment.\n *\n * Welcome to the most horrible function DataTables. The process that this\n * function follows is basically:\n *   1. Re-create the table inside the scrolling div\n *   2. Take live measurements from the DOM\n *   3. Apply the measurements to align the columns\n *   4. Clean up\n *\n *  @param {object} settings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnScrollDraw ( settings )\n{\n\t// Given that this is such a monster function, a lot of variables are use\n\t// to try and keep the minimised size as small as possible\n\tvar\n\t\tscroll         = settings.oScroll,\n\t\tscrollX        = scroll.sX,\n\t\tscrollXInner   = scroll.sXInner,\n\t\tscrollY        = scroll.sY,\n\t\tbarWidth       = scroll.iBarWidth,\n\t\tdivHeader      = $(settings.nScrollHead),\n\t\tdivHeaderStyle = divHeader[0].style,\n\t\tdivHeaderInner = divHeader.children('div'),\n\t\tdivHeaderInnerStyle = divHeaderInner[0].style,\n\t\tdivHeaderTable = divHeaderInner.children('table'),\n\t\tdivBodyEl      = settings.nScrollBody,\n\t\tdivBody        = $(divBodyEl),\n\t\tdivBodyStyle   = divBodyEl.style,\n\t\tdivFooter      = $(settings.nScrollFoot),\n\t\tdivFooterInner = divFooter.children('div'),\n\t\tdivFooterTable = divFooterInner.children('table'),\n\t\theader         = $(settings.nTHead),\n\t\ttable          = $(settings.nTable),\n\t\ttableEl        = table[0],\n\t\ttableStyle     = tableEl.style,\n\t\tfooter         = settings.nTFoot ? $(settings.nTFoot) : null,\n\t\tbrowser        = settings.oBrowser,\n\t\tie67           = browser.bScrollOversize,\n\t\tdtHeaderCells  = _pluck( settings.aoColumns, 'nTh' ),\n\t\theaderTrgEls, footerTrgEls,\n\t\theaderSrcEls, footerSrcEls,\n\t\theaderCopy, footerCopy,\n\t\theaderWidths=[], footerWidths=[],\n\t\theaderContent=[], footerContent=[],\n\t\tidx, correction, sanityWidth,\n\t\tzeroOut = function(nSizer) {\n\t\t\tvar style = nSizer.style;\n\t\t\tstyle.paddingTop = \"0\";\n\t\t\tstyle.paddingBottom = \"0\";\n\t\t\tstyle.borderTopWidth = \"0\";\n\t\t\tstyle.borderBottomWidth = \"0\";\n\t\t\tstyle.height = 0;\n\t\t};\n\n\t// If the scrollbar visibility has changed from the last draw, we need to\n\t// adjust the column sizes as the table width will have changed to account\n\t// for the scrollbar\n\tvar scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;\n\t\n\tif ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t\t_fnAdjustColumnSizing( settings );\n\t\treturn; // adjust column sizing will call this function again\n\t}\n\telse {\n\t\tsettings.scrollBarVis = scrollBarVis;\n\t}\n\n\t/*\n\t * 1. Re-create the table inside the scrolling div\n\t */\n\n\t// Remove the old minimised thead and tfoot elements in the inner table\n\ttable.children('thead, tfoot').remove();\n\n\tif ( footer ) {\n\t\tfooterCopy = footer.clone().prependTo( table );\n\t\tfooterTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized\n\t\tfooterSrcEls = footerCopy.find('tr');\n\t\tfooterCopy.find('[id]').removeAttr('id');\n\t}\n\n\t// Clone the current header and footer elements and then place it into the inner table\n\theaderCopy = header.clone().prependTo( table );\n\theaderTrgEls = header.find('tr'); // original header is in its own table\n\theaderSrcEls = headerCopy.find('tr');\n\theaderCopy.find('th, td').removeAttr('tabindex');\n\theaderCopy.find('[id]').removeAttr('id');\n\n\n\t/*\n\t * 2. Take live measurements from the DOM - do not alter the DOM itself!\n\t */\n\n\t// Remove old sizing and apply the calculated column widths\n\t// Get the unique column headers in the newly created (cloned) header. We want to apply the\n\t// calculated sizes to this header\n\tif ( ! scrollX )\n\t{\n\t\tdivBodyStyle.width = '100%';\n\t\tdivHeader[0].style.width = '100%';\n\t}\n\n\t$.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {\n\t\tidx = _fnVisibleToColumnIndex( settings, i );\n\t\tel.style.width = settings.aoColumns[idx].sWidth;\n\t} );\n\n\tif ( footer ) {\n\t\t_fnApplyToChildren( function(n) {\n\t\t\tn.style.width = \"\";\n\t\t}, footerSrcEls );\n\t}\n\n\t// Size the table as a whole\n\tsanityWidth = table.outerWidth();\n\tif ( scrollX === \"\" ) {\n\t\t// No x scrolling\n\t\ttableStyle.width = \"100%\";\n\n\t\t// IE7 will make the width of the table when 100% include the scrollbar\n\t\t// - which is shouldn't. When there is a scrollbar we need to take this\n\t\t// into account.\n\t\tif ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);\n\t\t}\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\telse if ( scrollXInner !== \"\" ) {\n\t\t// legacy x scroll inner has been given - use it\n\t\ttableStyle.width = _fnStringToCss(scrollXInner);\n\n\t\t// Recalculate the sanity width\n\t\tsanityWidth = table.outerWidth();\n\t}\n\n\t// Hidden header should have zero height, so remove padding and borders. Then\n\t// set the width based on the real headers\n\n\t// Apply all styles in one pass\n\t_fnApplyToChildren( zeroOut, headerSrcEls );\n\n\t// Read all widths in next pass\n\t_fnApplyToChildren( function(nSizer) {\n\t\tvar style = window.getComputedStyle ?\n\t\t\twindow.getComputedStyle(nSizer).width :\n\t\t\t_fnStringToCss( $(nSizer).width() );\n\n\t\theaderContent.push( nSizer.innerHTML );\n\t\theaderWidths.push( style );\n\t}, headerSrcEls );\n\n\t// Apply all widths in final pass\n\t_fnApplyToChildren( function(nToSize, i) {\n\t\tnToSize.style.width = headerWidths[i];\n\t}, headerTrgEls );\n\n\t$(headerSrcEls).css('height', 0);\n\n\t/* Same again with the footer if we have one */\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( zeroOut, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nSizer) {\n\t\t\tfooterContent.push( nSizer.innerHTML );\n\t\t\tfooterWidths.push( _fnStringToCss( $(nSizer).css('width') ) );\n\t\t}, footerSrcEls );\n\n\t\t_fnApplyToChildren( function(nToSize, i) {\n\t\t\tnToSize.style.width = footerWidths[i];\n\t\t}, footerTrgEls );\n\n\t\t$(footerSrcEls).height(0);\n\t}\n\n\n\t/*\n\t * 3. Apply the measurements\n\t */\n\n\t// \"Hide\" the header and footer that we used for the sizing. We need to keep\n\t// the content of the cell so that the width applied to the header and body\n\t// both match, but we want to hide it completely. We want to also fix their\n\t// width to what they currently are\n\t_fnApplyToChildren( function(nSizer, i) {\n\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+headerContent[i]+'</div>';\n\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\tnSizer.style.width = headerWidths[i];\n\t}, headerSrcEls );\n\n\tif ( footer )\n\t{\n\t\t_fnApplyToChildren( function(nSizer, i) {\n\t\t\tnSizer.innerHTML = '<div class=\"dataTables_sizing\">'+footerContent[i]+'</div>';\n\t\t\tnSizer.childNodes[0].style.height = \"0\";\n\t\t\tnSizer.childNodes[0].style.overflow = \"hidden\";\n\t\t\tnSizer.style.width = footerWidths[i];\n\t\t}, footerSrcEls );\n\t}\n\n\t// Sanity check that the table is of a sensible width. If not then we are going to get\n\t// misalignment - try to prevent this by not allowing the table to shrink below its min width\n\tif ( Math.round(table.outerWidth()) < Math.round(sanityWidth) )\n\t{\n\t\t// The min width depends upon if we have a vertical scrollbar visible or not */\n\t\tcorrection = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||\n\t\t\tdivBody.css('overflow-y') == \"scroll\")) ?\n\t\t\t\tsanityWidth+barWidth :\n\t\t\t\tsanityWidth;\n\n\t\t// IE6/7 are a law unto themselves...\n\t\tif ( ie67 && (divBodyEl.scrollHeight >\n\t\t\tdivBodyEl.offsetHeight || divBody.css('overflow-y') == \"scroll\")\n\t\t) {\n\t\t\ttableStyle.width = _fnStringToCss( correction-barWidth );\n\t\t}\n\n\t\t// And give the user a warning that we've stopped the table getting too small\n\t\tif ( scrollX === \"\" || scrollXInner !== \"\" ) {\n\t\t\t_fnLog( settings, 1, 'Possible column misalignment', 6 );\n\t\t}\n\t}\n\telse\n\t{\n\t\tcorrection = '100%';\n\t}\n\n\t// Apply to the container elements\n\tdivBodyStyle.width = _fnStringToCss( correction );\n\tdivHeaderStyle.width = _fnStringToCss( correction );\n\n\tif ( footer ) {\n\t\tsettings.nScrollFoot.style.width = _fnStringToCss( correction );\n\t}\n\n\n\t/*\n\t * 4. Clean up\n\t */\n\tif ( ! scrollY ) {\n\t\t/* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting\n\t\t * the scrollbar height from the visible display, rather than adding it on. We need to\n\t\t * set the height in order to sort this. Don't want to do it in any other browsers.\n\t\t */\n\t\tif ( ie67 ) {\n\t\t\tdivBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );\n\t\t}\n\t}\n\n\t/* Finally set the width's of the header and footer tables */\n\tvar iOuterWidth = table.outerWidth();\n\tdivHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );\n\tdivHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );\n\n\t// Figure out if there are scrollbar present - if so then we need a the header and footer to\n\t// provide a bit more space to allow \"overflow\" scrolling (i.e. past the scrollbar)\n\tvar bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == \"scroll\";\n\tvar padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );\n\tdivHeaderInnerStyle[ padding ] = bScrolling ? barWidth+\"px\" : \"0px\";\n\n\tif ( footer ) {\n\t\tdivFooterTable[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style.width = _fnStringToCss( iOuterWidth );\n\t\tdivFooterInner[0].style[padding] = bScrolling ? barWidth+\"px\" : \"0px\";\n\t}\n\n\t// Correct DOM ordering for colgroup - comes before the thead\n\ttable.children('colgroup').insertBefore( table.children('thead') );\n\n\t/* Adjust the position of the header in case we loose the y-scrollbar */\n\tdivBody.trigger('scroll');\n\n\t// If sorting or filtering has occurred, jump the scrolling back to the top\n\t// only if we aren't holding the position\n\tif ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {\n\t\tdivBodyEl.scrollTop = 0;\n\t}\n}\n\n\n\n/**\n * Apply a given function to the display child nodes of an element array (typically\n * TD children of TR rows\n *  @param {function} fn Method to apply to the objects\n *  @param array {nodes} an1 List of elements to look through for display children\n *  @param array {nodes} an2 Another list (identical structure to the first) - optional\n *  @memberof DataTable#oApi\n */\nfunction _fnApplyToChildren( fn, an1, an2 )\n{\n\tvar index=0, i=0, iLen=an1.length;\n\tvar nNode1, nNode2;\n\n\twhile ( i < iLen ) {\n\t\tnNode1 = an1[i].firstChild;\n\t\tnNode2 = an2 ? an2[i].firstChild : null;\n\n\t\twhile ( nNode1 ) {\n\t\t\tif ( nNode1.nodeType === 1 ) {\n\t\t\t\tif ( an2 ) {\n\t\t\t\t\tfn( nNode1, nNode2, index );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfn( nNode1, index );\n\t\t\t\t}\n\n\t\t\t\tindex++;\n\t\t\t}\n\n\t\t\tnNode1 = nNode1.nextSibling;\n\t\t\tnNode2 = an2 ? nNode2.nextSibling : null;\n\t\t}\n\n\t\ti++;\n\t}\n}\n\n\n\nvar __re_html_remove = /<.*?>/g;\n\n\n/**\n * Calculate the width of columns for the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnCalculateColumnWidths ( oSettings )\n{\n\tvar\n\t\ttable = oSettings.nTable,\n\t\tcolumns = oSettings.aoColumns,\n\t\tscroll = oSettings.oScroll,\n\t\tscrollY = scroll.sY,\n\t\tscrollX = scroll.sX,\n\t\tscrollXInner = scroll.sXInner,\n\t\tcolumnCount = columns.length,\n\t\tvisibleColumns = _fnGetColumns( oSettings, 'bVisible' ),\n\t\theaderCells = $('th', oSettings.nTHead),\n\t\ttableWidthAttr = table.getAttribute('width'), // from DOM element\n\t\ttableContainer = table.parentNode,\n\t\tuserInputs = false,\n\t\ti, column, columnIdx, width, outerWidth,\n\t\tbrowser = oSettings.oBrowser,\n\t\tie67 = browser.bScrollOversize;\n\n\tvar styleWidth = table.style.width;\n\tif ( styleWidth && styleWidth.indexOf('%') !== -1 ) {\n\t\ttableWidthAttr = styleWidth;\n\t}\n\n\t/* Convert any user input sizes into pixel sizes */\n\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\tif ( column.sWidth !== null ) {\n\t\t\tcolumn.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );\n\n\t\t\tuserInputs = true;\n\t\t}\n\t}\n\n\t/* If the number of columns in the DOM equals the number that we have to\n\t * process in DataTables, then we can use the offsets that are created by\n\t * the web- browser. No custom sizes can be set in order for this to happen,\n\t * nor scrolling used\n\t */\n\tif ( ie67 || ! userInputs && ! scrollX && ! scrollY &&\n\t     columnCount == _fnVisbleColumns( oSettings ) &&\n\t     columnCount == headerCells.length\n\t) {\n\t\tfor ( i=0 ; i<columnCount ; i++ ) {\n\t\t\tvar colIdx = _fnVisibleToColumnIndex( oSettings, i );\n\n\t\t\tif ( colIdx !== null ) {\n\t\t\t\tcolumns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t// Otherwise construct a single row, worst case, table with the widest\n\t\t// node in the data, assign any user defined widths, then insert it into\n\t\t// the DOM and allow the browser to do all the hard work of calculating\n\t\t// table widths\n\t\tvar tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table\n\t\t\t.css( 'visibility', 'hidden' )\n\t\t\t.removeAttr( 'id' );\n\n\t\t// Clean up the table body\n\t\ttmpTable.find('tbody tr').remove();\n\t\tvar tr = $('<tr/>').appendTo( tmpTable.find('tbody') );\n\n\t\t// Clone the table header and footer - we can't use the header / footer\n\t\t// from the cloned table, since if scrolling is active, the table's\n\t\t// real header and footer are contained in different table tags\n\t\ttmpTable.find('thead, tfoot').remove();\n\t\ttmpTable\n\t\t\t.append( $(oSettings.nTHead).clone() )\n\t\t\t.append( $(oSettings.nTFoot).clone() );\n\n\t\t// Remove any assigned widths from the footer (from scrolling)\n\t\ttmpTable.find('tfoot th, tfoot td').css('width', '');\n\n\t\t// Apply custom sizing to the cloned header\n\t\theaderCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );\n\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tcolumn = columns[ visibleColumns[i] ];\n\n\t\t\theaderCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?\n\t\t\t\t_fnStringToCss( column.sWidthOrig ) :\n\t\t\t\t'';\n\n\t\t\t// For scrollX we need to force the column width otherwise the\n\t\t\t// browser will collapse it. If this width is smaller than the\n\t\t\t// width the column requires, then it will have no effect\n\t\t\tif ( column.sWidthOrig && scrollX ) {\n\t\t\t\t$( headerCells[i] ).append( $('<div/>').css( {\n\t\t\t\t\twidth: column.sWidthOrig,\n\t\t\t\t\tmargin: 0,\n\t\t\t\t\tpadding: 0,\n\t\t\t\t\tborder: 0,\n\t\t\t\t\theight: 1\n\t\t\t\t} ) );\n\t\t\t}\n\t\t}\n\n\t\t// Find the widest cell for each column and put it into the table\n\t\tif ( oSettings.aoData.length ) {\n\t\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\t\tcolumnIdx = visibleColumns[i];\n\t\t\t\tcolumn = columns[ columnIdx ];\n\n\t\t\t\t$( _fnGetWidestNode( oSettings, columnIdx ) )\n\t\t\t\t\t.clone( false )\n\t\t\t\t\t.append( column.sContentPadding )\n\t\t\t\t\t.appendTo( tr );\n\t\t\t}\n\t\t}\n\n\t\t// Tidy the temporary table - remove name attributes so there aren't\n\t\t// duplicated in the dom (radio elements for example)\n\t\t$('[name]', tmpTable).removeAttr('name');\n\n\t\t// Table has been built, attach to the document so we can work with it.\n\t\t// A holding element is used, positioned at the top of the container\n\t\t// with minimal height, so it has no effect on if the container scrolls\n\t\t// or not. Otherwise it might trigger scrolling when it actually isn't\n\t\t// needed\n\t\tvar holder = $('<div/>').css( scrollX || scrollY ?\n\t\t\t\t{\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\ttop: 0,\n\t\t\t\t\tleft: 0,\n\t\t\t\t\theight: 1,\n\t\t\t\t\tright: 0,\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t} :\n\t\t\t\t{}\n\t\t\t)\n\t\t\t.append( tmpTable )\n\t\t\t.appendTo( tableContainer );\n\n\t\t// When scrolling (X or Y) we want to set the width of the table as \n\t\t// appropriate. However, when not scrolling leave the table width as it\n\t\t// is. This results in slightly different, but I think correct behaviour\n\t\tif ( scrollX && scrollXInner ) {\n\t\t\ttmpTable.width( scrollXInner );\n\t\t}\n\t\telse if ( scrollX ) {\n\t\t\ttmpTable.css( 'width', 'auto' );\n\t\t\ttmpTable.removeAttr('width');\n\n\t\t\t// If there is no width attribute or style, then allow the table to\n\t\t\t// collapse\n\t\t\tif ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {\n\t\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t\t}\n\t\t}\n\t\telse if ( scrollY ) {\n\t\t\ttmpTable.width( tableContainer.clientWidth );\n\t\t}\n\t\telse if ( tableWidthAttr ) {\n\t\t\ttmpTable.width( tableWidthAttr );\n\t\t}\n\n\t\t// Get the width of each column in the constructed table - we need to\n\t\t// know the inner width (so it can be assigned to the other table's\n\t\t// cells) and the outer width so we can calculate the full width of the\n\t\t// table. This is safe since DataTables requires a unique cell for each\n\t\t// column, but if ever a header can span multiple columns, this will\n\t\t// need to be modified.\n\t\tvar total = 0;\n\t\tfor ( i=0 ; i<visibleColumns.length ; i++ ) {\n\t\t\tvar cell = $(headerCells[i]);\n\t\t\tvar border = cell.outerWidth() - cell.width();\n\n\t\t\t// Use getBounding... where possible (not IE8-) because it can give\n\t\t\t// sub-pixel accuracy, which we then want to round up!\n\t\t\tvar bounding = browser.bBounding ?\n\t\t\t\tMath.ceil( headerCells[i].getBoundingClientRect().width ) :\n\t\t\t\tcell.outerWidth();\n\n\t\t\t// Total is tracked to remove any sub-pixel errors as the outerWidth\n\t\t\t// of the table might not equal the total given here (IE!).\n\t\t\ttotal += bounding;\n\n\t\t\t// Width for each column to use\n\t\t\tcolumns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );\n\t\t}\n\n\t\ttable.style.width = _fnStringToCss( total );\n\n\t\t// Finished with the table - ditch it\n\t\tholder.remove();\n\t}\n\n\t// If there is a width attr, we want to attach an event listener which\n\t// allows the table sizing to automatically adjust when the window is\n\t// resized. Use the width attr rather than CSS, since we can't know if the\n\t// CSS is a relative value or absolute - DOM read is always px.\n\tif ( tableWidthAttr ) {\n\t\ttable.style.width = _fnStringToCss( tableWidthAttr );\n\t}\n\n\tif ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {\n\t\tvar bindResize = function () {\n\t\t\t$(window).on('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {\n\t\t\t\t_fnAdjustColumnSizing( oSettings );\n\t\t\t} ) );\n\t\t};\n\n\t\t// IE6/7 will crash if we bind a resize event handler on page load.\n\t\t// To be removed in 1.11 which drops IE6/7 support\n\t\tif ( ie67 ) {\n\t\t\tsetTimeout( bindResize, 1000 );\n\t\t}\n\t\telse {\n\t\t\tbindResize();\n\t\t}\n\n\t\toSettings._reszEvt = true;\n\t}\n}\n\n\n/**\n * Throttle the calls to a function. Arguments and context are maintained for\n * the throttled function\n *  @param {function} fn Function to be called\n *  @param {int} [freq=200] call frequency in mS\n *  @returns {function} wrapped function\n *  @memberof DataTable#oApi\n */\nvar _fnThrottle = DataTable.util.throttle;\n\n\n/**\n * Convert a CSS unit width to pixels (e.g. 2em)\n *  @param {string} width width to be converted\n *  @param {node} parent parent to get the with for (required for relative widths) - optional\n *  @returns {int} width in pixels\n *  @memberof DataTable#oApi\n */\nfunction _fnConvertToWidth ( width, parent )\n{\n\tif ( ! width ) {\n\t\treturn 0;\n\t}\n\n\tvar n = $('<div/>')\n\t\t.css( 'width', _fnStringToCss( width ) )\n\t\t.appendTo( parent || document.body );\n\n\tvar val = n[0].offsetWidth;\n\tn.remove();\n\n\treturn val;\n}\n\n\n/**\n * Get the widest node\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {node} widest table node\n *  @memberof DataTable#oApi\n */\nfunction _fnGetWidestNode( settings, colIdx )\n{\n\tvar idx = _fnGetMaxLenString( settings, colIdx );\n\tif ( idx < 0 ) {\n\t\treturn null;\n\t}\n\n\tvar data = settings.aoData[ idx ];\n\treturn ! data.nTr ? // Might not have been created when deferred rendering\n\t\t$('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :\n\t\tdata.anCells[ colIdx ];\n}\n\n\n/**\n * Get the maximum strlen for each data column\n *  @param {object} settings dataTables settings object\n *  @param {int} colIdx column of interest\n *  @returns {string} max string length for each column\n *  @memberof DataTable#oApi\n */\nfunction _fnGetMaxLenString( settings, colIdx )\n{\n\tvar s, max=-1, maxIdx = -1;\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\ts = _fnGetCellData( settings, i, colIdx, 'display' )+'';\n\t\ts = s.replace( __re_html_remove, '' );\n\t\ts = s.replace( /&nbsp;/g, ' ' );\n\n\t\tif ( s.length > max ) {\n\t\t\tmax = s.length;\n\t\t\tmaxIdx = i;\n\t\t}\n\t}\n\n\treturn maxIdx;\n}\n\n\n/**\n * Append a CSS unit (only if required) to a string\n *  @param {string} value to css-ify\n *  @returns {string} value with css unit\n *  @memberof DataTable#oApi\n */\nfunction _fnStringToCss( s )\n{\n\tif ( s === null ) {\n\t\treturn '0px';\n\t}\n\n\tif ( typeof s == 'number' ) {\n\t\treturn s < 0 ?\n\t\t\t'0px' :\n\t\t\ts+'px';\n\t}\n\n\t// Check it has a unit character already\n\treturn s.match(/\\d$/) ?\n\t\ts+'px' :\n\t\ts;\n}\n\n\n\nfunction _fnSortFlatten ( settings )\n{\n\tvar\n\t\ti, iLen, k, kLen,\n\t\taSort = [],\n\t\taiOrig = [],\n\t\taoColumns = settings.aoColumns,\n\t\taDataSort, iCol, sType, srcCol,\n\t\tfixed = settings.aaSortingFixed,\n\t\tfixedObj = $.isPlainObject( fixed ),\n\t\tnestedSort = [],\n\t\tadd = function ( a ) {\n\t\t\tif ( a.length && ! Array.isArray( a[0] ) ) {\n\t\t\t\t// 1D array\n\t\t\t\tnestedSort.push( a );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// 2D array\n\t\t\t\t$.merge( nestedSort, a );\n\t\t\t}\n\t\t};\n\n\t// Build the sort array, with pre-fix and post-fix options if they have been\n\t// specified\n\tif ( Array.isArray( fixed ) ) {\n\t\tadd( fixed );\n\t}\n\n\tif ( fixedObj && fixed.pre ) {\n\t\tadd( fixed.pre );\n\t}\n\n\tadd( settings.aaSorting );\n\n\tif (fixedObj && fixed.post ) {\n\t\tadd( fixed.post );\n\t}\n\n\tfor ( i=0 ; i<nestedSort.length ; i++ )\n\t{\n\t\tsrcCol = nestedSort[i][0];\n\t\taDataSort = aoColumns[ srcCol ].aDataSort;\n\n\t\tfor ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )\n\t\t{\n\t\t\tiCol = aDataSort[k];\n\t\t\tsType = aoColumns[ iCol ].sType || 'string';\n\n\t\t\tif ( nestedSort[i]._idx === undefined ) {\n\t\t\t\tnestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );\n\t\t\t}\n\n\t\t\taSort.push( {\n\t\t\t\tsrc:       srcCol,\n\t\t\t\tcol:       iCol,\n\t\t\t\tdir:       nestedSort[i][1],\n\t\t\t\tindex:     nestedSort[i]._idx,\n\t\t\t\ttype:      sType,\n\t\t\t\tformatter: DataTable.ext.type.order[ sType+\"-pre\" ]\n\t\t\t} );\n\t\t}\n\t}\n\n\treturn aSort;\n}\n\n/**\n * Change the order of the table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n *  @todo This really needs split up!\n */\nfunction _fnSort ( oSettings )\n{\n\tvar\n\t\ti, ien, iLen, j, jLen, k, kLen,\n\t\tsDataType, nTh,\n\t\taiOrig = [],\n\t\toExtSort = DataTable.ext.type.order,\n\t\taoData = oSettings.aoData,\n\t\taoColumns = oSettings.aoColumns,\n\t\taDataSort, data, iCol, sType, oSort,\n\t\tformatters = 0,\n\t\tsortCol,\n\t\tdisplayMaster = oSettings.aiDisplayMaster,\n\t\taSort;\n\n\t// Resolve any column types that are unknown due to addition or invalidation\n\t// @todo Can this be moved into a 'data-ready' handler which is called when\n\t//   data is going to be used in the table?\n\t_fnColumnTypes( oSettings );\n\n\taSort = _fnSortFlatten( oSettings );\n\n\tfor ( i=0, ien=aSort.length ; i<ien ; i++ ) {\n\t\tsortCol = aSort[i];\n\n\t\t// Track if we can use the fast sort algorithm\n\t\tif ( sortCol.formatter ) {\n\t\t\tformatters++;\n\t\t}\n\n\t\t// Load the data needed for the sort, for each cell\n\t\t_fnSortData( oSettings, sortCol.col );\n\t}\n\n\t/* No sorting required if server-side or no sorting array */\n\tif ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )\n\t{\n\t\t// Create a value - key array of the current row positions such that we can use their\n\t\t// current position during the sort, if values match, in order to perform stable sorting\n\t\tfor ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {\n\t\t\taiOrig[ displayMaster[i] ] = i;\n\t\t}\n\n\t\t/* Do the sort - here we want multi-column sorting based on a given data source (column)\n\t\t * and sorting function (from oSort) in a certain direction. It's reasonably complex to\n\t\t * follow on it's own, but this is what we want (example two column sorting):\n\t\t *  fnLocalSorting = function(a,b){\n\t\t *    var iTest;\n\t\t *    iTest = oSort['string-asc']('data11', 'data12');\n\t\t *      if (iTest !== 0)\n\t\t *        return iTest;\n\t\t *    iTest = oSort['numeric-desc']('data21', 'data22');\n\t\t *    if (iTest !== 0)\n\t\t *      return iTest;\n\t\t *    return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );\n\t\t *  }\n\t\t * Basically we have a test for each sorting column, if the data in that column is equal,\n\t\t * test the next column. If all columns match, then we use a numeric sort on the row\n\t\t * positions in the original data array to provide a stable sort.\n\t\t *\n\t\t * Note - I know it seems excessive to have two sorting methods, but the first is around\n\t\t * 15% faster, so the second is only maintained for backwards compatibility with sorting\n\t\t * methods which do not have a pre-sort formatting function.\n\t\t */\n\t\tif ( formatters === aSort.length ) {\n\t\t\t// All sort types have formatting functions\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, test, sort,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\ttest = x<y ? -1 : x>y ? 1 : 0;\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn sort.dir === 'asc' ? test : -test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t\telse {\n\t\t\t// Depreciated - remove in 1.11 (providing a plug-in option)\n\t\t\t// Not all sort types have formatting methods, so we have to call their sorting\n\t\t\t// methods.\n\t\t\tdisplayMaster.sort( function ( a, b ) {\n\t\t\t\tvar\n\t\t\t\t\tx, y, k, l, test, sort, fn,\n\t\t\t\t\tlen=aSort.length,\n\t\t\t\t\tdataA = aoData[a]._aSortData,\n\t\t\t\t\tdataB = aoData[b]._aSortData;\n\n\t\t\t\tfor ( k=0 ; k<len ; k++ ) {\n\t\t\t\t\tsort = aSort[k];\n\n\t\t\t\t\tx = dataA[ sort.col ];\n\t\t\t\t\ty = dataB[ sort.col ];\n\n\t\t\t\t\tfn = oExtSort[ sort.type+\"-\"+sort.dir ] || oExtSort[ \"string-\"+sort.dir ];\n\t\t\t\t\ttest = fn( x, y );\n\t\t\t\t\tif ( test !== 0 ) {\n\t\t\t\t\t\treturn test;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tx = aiOrig[a];\n\t\t\t\ty = aiOrig[b];\n\t\t\t\treturn x<y ? -1 : x>y ? 1 : 0;\n\t\t\t} );\n\t\t}\n\t}\n\n\t/* Tell the draw function that we have sorted the data */\n\toSettings.bSorted = true;\n}\n\n\nfunction _fnSortAria ( settings )\n{\n\tvar label;\n\tvar nextSort;\n\tvar columns = settings.aoColumns;\n\tvar aSort = _fnSortFlatten( settings );\n\tvar oAria = settings.oLanguage.oAria;\n\n\t// ARIA attributes - need to loop all columns, to update all (removing old\n\t// attributes as needed)\n\tfor ( var i=0, iLen=columns.length ; i<iLen ; i++ )\n\t{\n\t\tvar col = columns[i];\n\t\tvar asSorting = col.asSorting;\n\t\tvar sTitle = col.ariaTitle || col.sTitle.replace( /<.*?>/g, \"\" );\n\t\tvar th = col.nTh;\n\n\t\t// IE7 is throwing an error when setting these properties with jQuery's\n\t\t// attr() and removeAttr() methods...\n\t\tth.removeAttribute('aria-sort');\n\n\t\t/* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */\n\t\tif ( col.bSortable ) {\n\t\t\tif ( aSort.length > 0 && aSort[0].col == i ) {\n\t\t\t\tth.setAttribute('aria-sort', aSort[0].dir==\"asc\" ? \"ascending\" : \"descending\" );\n\t\t\t\tnextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tnextSort = asSorting[0];\n\t\t\t}\n\n\t\t\tlabel = sTitle + ( nextSort === \"asc\" ?\n\t\t\t\toAria.sSortAscending :\n\t\t\t\toAria.sSortDescending\n\t\t\t);\n\t\t}\n\t\telse {\n\t\t\tlabel = sTitle;\n\t\t}\n\n\t\tth.setAttribute('aria-label', label);\n\t}\n}\n\n\n/**\n * Function to run on user sort request\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {boolean} [append=false] Append the requested sort to the existing\n *    sort if true (i.e. multi-column sort)\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortListener ( settings, colIdx, append, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\tvar sorting = settings.aaSorting;\n\tvar asSorting = col.asSorting;\n\tvar nextSortIdx;\n\tvar next = function ( a, overflow ) {\n\t\tvar idx = a._idx;\n\t\tif ( idx === undefined ) {\n\t\t\tidx = $.inArray( a[1], asSorting );\n\t\t}\n\n\t\treturn idx+1 < asSorting.length ?\n\t\t\tidx+1 :\n\t\t\toverflow ?\n\t\t\t\tnull :\n\t\t\t\t0;\n\t};\n\n\t// Convert to 2D array if needed\n\tif ( typeof sorting[0] === 'number' ) {\n\t\tsorting = settings.aaSorting = [ sorting ];\n\t}\n\n\t// If appending the sort then we are multi-column sorting\n\tif ( append && settings.oFeatures.bSortMulti ) {\n\t\t// Are we already doing some kind of sort on this column?\n\t\tvar sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );\n\n\t\tif ( sortIdx !== -1 ) {\n\t\t\t// Yes, modify the sort\n\t\t\tnextSortIdx = next( sorting[sortIdx], true );\n\n\t\t\tif ( nextSortIdx === null && sorting.length === 1 ) {\n\t\t\t\tnextSortIdx = 0; // can't remove sorting completely\n\t\t\t}\n\n\t\t\tif ( nextSortIdx === null ) {\n\t\t\t\tsorting.splice( sortIdx, 1 );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tsorting[sortIdx][1] = asSorting[ nextSortIdx ];\n\t\t\t\tsorting[sortIdx]._idx = nextSortIdx;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// No sort on this column yet\n\t\t\tsorting.push( [ colIdx, asSorting[0], 0 ] );\n\t\t\tsorting[sorting.length-1]._idx = 0;\n\t\t}\n\t}\n\telse if ( sorting.length && sorting[0][0] == colIdx ) {\n\t\t// Single column - already sorting on this column, modify the sort\n\t\tnextSortIdx = next( sorting[0] );\n\n\t\tsorting.length = 1;\n\t\tsorting[0][1] = asSorting[ nextSortIdx ];\n\t\tsorting[0]._idx = nextSortIdx;\n\t}\n\telse {\n\t\t// Single column - sort only on this column\n\t\tsorting.length = 0;\n\t\tsorting.push( [ colIdx, asSorting[0] ] );\n\t\tsorting[0]._idx = 0;\n\t}\n\n\t// Run the sort by calling a full redraw\n\t_fnReDraw( settings );\n\n\t// callback used for async user interaction\n\tif ( typeof callback == 'function' ) {\n\t\tcallback( settings );\n\t}\n}\n\n\n/**\n * Attach a sort handler (click) to a node\n *  @param {object} settings dataTables settings object\n *  @param {node} attachTo node to attach the handler to\n *  @param {int} colIdx column sorting index\n *  @param {function} [callback] callback function\n *  @memberof DataTable#oApi\n */\nfunction _fnSortAttachListener ( settings, attachTo, colIdx, callback )\n{\n\tvar col = settings.aoColumns[ colIdx ];\n\n\t_fnBindAction( attachTo, {}, function (e) {\n\t\t/* If the column is not sortable - don't to anything */\n\t\tif ( col.bSortable === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If processing is enabled use a timeout to allow the processing\n\t\t// display to be shown - otherwise to it synchronously\n\t\tif ( settings.oFeatures.bProcessing ) {\n\t\t\t_fnProcessingDisplay( settings, true );\n\n\t\t\tsetTimeout( function() {\n\t\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\n\t\t\t\t// In server-side processing, the draw callback will remove the\n\t\t\t\t// processing display\n\t\t\t\tif ( _fnDataSource( settings ) !== 'ssp' ) {\n\t\t\t\t\t_fnProcessingDisplay( settings, false );\n\t\t\t\t}\n\t\t\t}, 0 );\n\t\t}\n\t\telse {\n\t\t\t_fnSortListener( settings, colIdx, e.shiftKey, callback );\n\t\t}\n\t} );\n}\n\n\n/**\n * Set the sorting classes on table's body, Note: it is safe to call this function\n * when bSort and bSortClasses are false\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSortingClasses( settings )\n{\n\tvar oldSort = settings.aLastSort;\n\tvar sortClass = settings.oClasses.sSortColumn;\n\tvar sort = _fnSortFlatten( settings );\n\tvar features = settings.oFeatures;\n\tvar i, ien, colIdx;\n\n\tif ( features.bSort && features.bSortClasses ) {\n\t\t// Remove old sorting classes\n\t\tfor ( i=0, ien=oldSort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = oldSort[i].src;\n\n\t\t\t// Remove column sorting\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.removeClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\n\t\t// Add new column sorting\n\t\tfor ( i=0, ien=sort.length ; i<ien ; i++ ) {\n\t\t\tcolIdx = sort[i].src;\n\n\t\t\t$( _pluck( settings.aoData, 'anCells', colIdx ) )\n\t\t\t\t.addClass( sortClass + (i<2 ? i+1 : 3) );\n\t\t}\n\t}\n\n\tsettings.aLastSort = sort;\n}\n\n\n// Get the data to sort a column, be it from cache, fresh (populating the\n// cache), or from a sort formatter\nfunction _fnSortData( settings, idx )\n{\n\t// Custom sorting function - provided by the sort data type\n\tvar column = settings.aoColumns[ idx ];\n\tvar customSort = DataTable.ext.order[ column.sSortDataType ];\n\tvar customData;\n\n\tif ( customSort ) {\n\t\tcustomData = customSort.call( settings.oInstance, settings, idx,\n\t\t\t_fnColumnIndexToVisible( settings, idx )\n\t\t);\n\t}\n\n\t// Use / populate cache\n\tvar row, cellData;\n\tvar formatter = DataTable.ext.type.order[ column.sType+\"-pre\" ];\n\n\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\trow = settings.aoData[i];\n\n\t\tif ( ! row._aSortData ) {\n\t\t\trow._aSortData = [];\n\t\t}\n\n\t\tif ( ! row._aSortData[idx] || customSort ) {\n\t\t\tcellData = customSort ?\n\t\t\t\tcustomData[i] : // If there was a custom sort function, use data from there\n\t\t\t\t_fnGetCellData( settings, i, idx, 'sort' );\n\n\t\t\trow._aSortData[ idx ] = formatter ?\n\t\t\t\tformatter( cellData ) :\n\t\t\t\tcellData;\n\t\t}\n\t}\n}\n\n\n\n/**\n * Save the state of a table\n *  @param {object} oSettings dataTables settings object\n *  @memberof DataTable#oApi\n */\nfunction _fnSaveState ( settings )\n{\n\tif (settings._bLoadingState) {\n\t\treturn;\n\t}\n\n\t/* Store the interesting variables */\n\tvar state = {\n\t\ttime:    +new Date(),\n\t\tstart:   settings._iDisplayStart,\n\t\tlength:  settings._iDisplayLength,\n\t\torder:   $.extend( true, [], settings.aaSorting ),\n\t\tsearch:  _fnSearchToCamel( settings.oPreviousSearch ),\n\t\tcolumns: $.map( settings.aoColumns, function ( col, i ) {\n\t\t\treturn {\n\t\t\t\tvisible: col.bVisible,\n\t\t\t\tsearch: _fnSearchToCamel( settings.aoPreSearchCols[i] )\n\t\t\t};\n\t\t} )\n\t};\n\n\tsettings.oSavedState = state;\n\t_fnCallbackFire( settings, \"aoStateSaveParams\", 'stateSaveParams', [settings, state] );\n\t\n\tif ( settings.oFeatures.bStateSave && !settings.bDestroying )\n\t{\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, state );\n\t}\t\n}\n\n\n/**\n * Attempt to load a saved table state\n *  @param {object} oSettings dataTables settings object\n *  @param {object} oInit DataTables init object so we can override settings\n *  @param {function} callback Callback to execute when the state has been loaded\n *  @memberof DataTable#oApi\n */\nfunction _fnLoadState ( settings, oInit, callback )\n{\n\tif ( ! settings.oFeatures.bStateSave ) {\n\t\tcallback();\n\t\treturn;\n\t}\n\n\tvar loaded = function(state) {\n\t\t_fnImplementState(settings, state, callback);\n\t}\n\n\tvar state = settings.fnStateLoadCallback.call( settings.oInstance, settings, loaded );\n\n\tif ( state !== undefined ) {\n\t\t_fnImplementState( settings, state, callback );\n\t}\n\t// otherwise, wait for the loaded callback to be executed\n\n\treturn true;\n}\n\nfunction _fnImplementState ( settings, s, callback) {\n\tvar i, ien;\n\tvar columns = settings.aoColumns;\n\tsettings._bLoadingState = true;\n\n\t// When StateRestore was introduced the state could now be implemented at any time\n\t// Not just initialisation. To do this an api instance is required in some places\n\tvar api = settings._bInitComplete ? new DataTable.Api(settings) : null;\n\n\tif ( ! s || ! s.time ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Allow custom and plug-in manipulation functions to alter the saved data set and\n\t// cancelling of loading by returning false\n\tvar abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, s] );\n\tif ( $.inArray( false, abStateLoad ) !== -1 ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Reject old data\n\tvar duration = settings.iStateDuration;\n\tif ( duration > 0 && s.time < +new Date() - (duration*1000) ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Number of columns have changed - all bets are off, no restore of settings\n\tif ( s.columns && columns.length !== s.columns.length ) {\n\t\tsettings._bLoadingState = false;\n\t\tcallback();\n\t\treturn;\n\t}\n\n\t// Store the saved state so it might be accessed at any time\n\tsettings.oLoadedState = $.extend( true, {}, s );\n\n\t// Page Length\n\tif ( s.length !== undefined ) {\n\t\t// If already initialised just set the value directly so that the select element is also updated\n\t\tif (api) {\n\t\t\tapi.page.len(s.length)\n\t\t}\n\t\telse {\n\t\t\tsettings._iDisplayLength   = s.length;\n\t\t}\n\t}\n\n\t// Restore key features - todo - for 1.11 this needs to be done by\n\t// subscribed events\n\tif ( s.start !== undefined ) {\n\t\tif(api === null) {\n\t\t\tsettings._iDisplayStart    = s.start;\n\t\t\tsettings.iInitDisplayStart = s.start;\n\t\t}\n\t\telse {\n\t\t\t_fnPageChange(settings, s.start/settings._iDisplayLength);\n\t\t}\n\t}\n\n\t// Order\n\tif ( s.order !== undefined ) {\n\t\tsettings.aaSorting = [];\n\t\t$.each( s.order, function ( i, col ) {\n\t\t\tsettings.aaSorting.push( col[0] >= columns.length ?\n\t\t\t\t[ 0, col[1] ] :\n\t\t\t\tcol\n\t\t\t);\n\t\t} );\n\t}\n\n\t// Search\n\tif ( s.search !== undefined ) {\n\t\t$.extend( settings.oPreviousSearch, _fnSearchToHung( s.search ) );\n\t}\n\n\t// Columns\n\tif ( s.columns ) {\n\t\tfor ( i=0, ien=s.columns.length ; i<ien ; i++ ) {\n\t\t\tvar col = s.columns[i];\n\n\t\t\t// Visibility\n\t\t\tif ( col.visible !== undefined ) {\n\t\t\t\t// If the api is defined, the table has been initialised so we need to use it rather than internal settings\n\t\t\t\tif (api) {\n\t\t\t\t\t// Don't redraw the columns on every iteration of this loop, we will do this at the end instead\n\t\t\t\t\tapi.column(i).visible(col.visible, false);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcolumns[i].bVisible = col.visible;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Search\n\t\t\tif ( col.search !== undefined ) {\n\t\t\t\t$.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );\n\t\t\t}\n\t\t}\n\t\t\n\t\t// If the api is defined then we need to adjust the columns once the visibility has been changed\n\t\tif (api) {\n\t\t\tapi.columns.adjust();\n\t\t}\n\t}\n\n\tsettings._bLoadingState = false;\n\t_fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, s] );\n\tcallback();\n};\n\n\n/**\n * Return the settings object for a particular table\n *  @param {node} table table we are using as a dataTable\n *  @returns {object} Settings object - or null if not found\n *  @memberof DataTable#oApi\n */\nfunction _fnSettingsFromNode ( table )\n{\n\tvar settings = DataTable.settings;\n\tvar idx = $.inArray( table, _pluck( settings, 'nTable' ) );\n\n\treturn idx !== -1 ?\n\t\tsettings[ idx ] :\n\t\tnull;\n}\n\n\n/**\n * Log an error message\n *  @param {object} settings dataTables settings object\n *  @param {int} level log error messages, or display them to the user\n *  @param {string} msg error message\n *  @param {int} tn Technical note id to get more information about the error.\n *  @memberof DataTable#oApi\n */\nfunction _fnLog( settings, level, msg, tn )\n{\n\tmsg = 'DataTables warning: '+\n\t\t(settings ? 'table id='+settings.sTableId+' - ' : '')+msg;\n\n\tif ( tn ) {\n\t\tmsg += '. For more information about this error, please see '+\n\t\t'http://datatables.net/tn/'+tn;\n\t}\n\n\tif ( ! level  ) {\n\t\t// Backwards compatibility pre 1.10\n\t\tvar ext = DataTable.ext;\n\t\tvar type = ext.sErrMode || ext.errMode;\n\n\t\tif ( settings ) {\n\t\t\t_fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );\n\t\t}\n\n\t\tif ( type == 'alert' ) {\n\t\t\talert( msg );\n\t\t}\n\t\telse if ( type == 'throw' ) {\n\t\t\tthrow new Error(msg);\n\t\t}\n\t\telse if ( typeof type == 'function' ) {\n\t\t\ttype( settings, tn, msg );\n\t\t}\n\t}\n\telse if ( window.console && console.log ) {\n\t\tconsole.log( msg );\n\t}\n}\n\n\n/**\n * See if a property is defined on one object, if so assign it to the other object\n *  @param {object} ret target object\n *  @param {object} src source object\n *  @param {string} name property\n *  @param {string} [mappedName] name to map too - optional, name used if not given\n *  @memberof DataTable#oApi\n */\nfunction _fnMap( ret, src, name, mappedName )\n{\n\tif ( Array.isArray( name ) ) {\n\t\t$.each( name, function (i, val) {\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t_fnMap( ret, src, val[0], val[1] );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_fnMap( ret, src, val );\n\t\t\t}\n\t\t} );\n\n\t\treturn;\n\t}\n\n\tif ( mappedName === undefined ) {\n\t\tmappedName = name;\n\t}\n\n\tif ( src[name] !== undefined ) {\n\t\tret[mappedName] = src[name];\n\t}\n}\n\n\n/**\n * Extend objects - very similar to jQuery.extend, but deep copy objects, and\n * shallow copy arrays. The reason we need to do this, is that we don't want to\n * deep copy array init values (such as aaSorting) since the dev wouldn't be\n * able to override them, but we do want to deep copy arrays.\n *  @param {object} out Object to extend\n *  @param {object} extender Object from which the properties will be applied to\n *      out\n *  @param {boolean} breakRefs If true, then arrays will be sliced to take an\n *      independent copy with the exception of the `data` or `aaData` parameters\n *      if they are present. This is so you can pass in a collection to\n *      DataTables and have that used as your data source without breaking the\n *      references\n *  @returns {object} out Reference, just for convenience - out === the return.\n *  @memberof DataTable#oApi\n *  @todo This doesn't take account of arrays inside the deep copied objects.\n */\nfunction _fnExtend( out, extender, breakRefs )\n{\n\tvar val;\n\n\tfor ( var prop in extender ) {\n\t\tif ( extender.hasOwnProperty(prop) ) {\n\t\t\tval = extender[prop];\n\n\t\t\tif ( $.isPlainObject( val ) ) {\n\t\t\t\tif ( ! $.isPlainObject( out[prop] ) ) {\n\t\t\t\t\tout[prop] = {};\n\t\t\t\t}\n\t\t\t\t$.extend( true, out[prop], val );\n\t\t\t}\n\t\t\telse if ( breakRefs && prop !== 'data' && prop !== 'aaData' && Array.isArray(val) ) {\n\t\t\t\tout[prop] = val.slice();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tout[prop] = val;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out;\n}\n\n\n/**\n * Bind an event handers to allow a click or return key to activate the callback.\n * This is good for accessibility since a return on the keyboard will have the\n * same effect as a click, if the element has focus.\n *  @param {element} n Element to bind the action to\n *  @param {object} oData Data object to pass to the triggered function\n *  @param {function} fn Callback function for when the event is triggered\n *  @memberof DataTable#oApi\n */\nfunction _fnBindAction( n, oData, fn )\n{\n\t$(n)\n\t\t.on( 'click.DT', oData, function (e) {\n\t\t\t\t$(n).trigger('blur'); // Remove focus outline for mouse users\n\t\t\t\tfn(e);\n\t\t\t} )\n\t\t.on( 'keypress.DT', oData, function (e){\n\t\t\t\tif ( e.which === 13 ) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tfn(e);\n\t\t\t\t}\n\t\t\t} )\n\t\t.on( 'selectstart.DT', function () {\n\t\t\t\t/* Take the brutal approach to cancelling text selection */\n\t\t\t\treturn false;\n\t\t\t} );\n}\n\n\n/**\n * Register a callback function. Easily allows a callback function to be added to\n * an array store of callback functions that can then all be called together.\n *  @param {object} oSettings dataTables settings object\n *  @param {string} sStore Name of the array storage for the callbacks in oSettings\n *  @param {function} fn Function to be called back\n *  @param {string} sName Identifying name for the callback (i.e. a label)\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackReg( oSettings, sStore, fn, sName )\n{\n\tif ( fn )\n\t{\n\t\toSettings[sStore].push( {\n\t\t\t\"fn\": fn,\n\t\t\t\"sName\": sName\n\t\t} );\n\t}\n}\n\n\n/**\n * Fire callback functions and trigger events. Note that the loop over the\n * callback array store is done backwards! Further note that you do not want to\n * fire off triggers in time sensitive applications (for example cell creation)\n * as its slow.\n *  @param {object} settings dataTables settings object\n *  @param {string} callbackArr Name of the array storage for the callbacks in\n *      oSettings\n *  @param {string} eventName Name of the jQuery custom event to trigger. If\n *      null no trigger is fired\n *  @param {array} args Array of arguments to pass to the callback function /\n *      trigger\n *  @memberof DataTable#oApi\n */\nfunction _fnCallbackFire( settings, callbackArr, eventName, args )\n{\n\tvar ret = [];\n\n\tif ( callbackArr ) {\n\t\tret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {\n\t\t\treturn val.fn.apply( settings.oInstance, args );\n\t\t} );\n\t}\n\n\tif ( eventName !== null ) {\n\t\tvar e = $.Event( eventName+'.dt' );\n\t\tvar table = $(settings.nTable);\n\n\t\ttable.trigger( e, args );\n\n\t\t// If not yet attached to the document, trigger the event\n\t\t// on the body directly to sort of simulate the bubble\n\t\tif (table.parents('body').length === 0) {\n\t\t\t$('body').trigger( e, args );\n\t\t}\n\n\t\tret.push( e.result );\n\t}\n\n\treturn ret;\n}\n\n\nfunction _fnLengthOverflow ( settings )\n{\n\tvar\n\t\tstart = settings._iDisplayStart,\n\t\tend = settings.fnDisplayEnd(),\n\t\tlen = settings._iDisplayLength;\n\n\t/* If we have space to show extra rows (backing up from the end point - then do so */\n\tif ( start >= end )\n\t{\n\t\tstart = end - len;\n\t}\n\n\t// Keep the start record on the current page\n\tstart -= (start % len);\n\n\tif ( len === -1 || start < 0 )\n\t{\n\t\tstart = 0;\n\t}\n\n\tsettings._iDisplayStart = start;\n}\n\n\nfunction _fnRenderer( settings, type )\n{\n\tvar renderer = settings.renderer;\n\tvar host = DataTable.ext.renderer[type];\n\n\tif ( $.isPlainObject( renderer ) && renderer[type] ) {\n\t\t// Specific renderer for this type. If available use it, otherwise use\n\t\t// the default.\n\t\treturn host[renderer[type]] || host._;\n\t}\n\telse if ( typeof renderer === 'string' ) {\n\t\t// Common renderer - if there is one available for this type use it,\n\t\t// otherwise use the default\n\t\treturn host[renderer] || host._;\n\t}\n\n\t// Use the default\n\treturn host._;\n}\n\n\n/**\n * Detect the data source being used for the table. Used to simplify the code\n * a little (ajax) and to make it compress a little smaller.\n *\n *  @param {object} settings dataTables settings object\n *  @returns {string} Data source\n *  @memberof DataTable#oApi\n */\nfunction _fnDataSource ( settings )\n{\n\tif ( settings.oFeatures.bServerSide ) {\n\t\treturn 'ssp';\n\t}\n\telse if ( settings.ajax || settings.sAjaxSource ) {\n\t\treturn 'ajax';\n\t}\n\treturn 'dom';\n}\n\n\n\n\n/**\n * Computed structure of the DataTables API, defined by the options passed to\n * `DataTable.Api.register()` when building the API.\n *\n * The structure is built in order to speed creation and extension of the Api\n * objects since the extensions are effectively pre-parsed.\n *\n * The array is an array of objects with the following structure, where this\n * base array represents the Api prototype base:\n *\n *     [\n *       {\n *         name:      'data'                -- string   - Property name\n *         val:       function () {},       -- function - Api method (or undefined if just an object\n *         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n *         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n *       },\n *       {\n *         name:     'row'\n *         val:       {},\n *         methodExt: [ ... ],\n *         propExt:   [\n *           {\n *             name:      'data'\n *             val:       function () {},\n *             methodExt: [ ... ],\n *             propExt:   [ ... ]\n *           },\n *           ...\n *         ]\n *       }\n *     ]\n *\n * @type {Array}\n * @ignore\n */\nvar __apiStruct = [];\n\n\n/**\n * `Array.prototype` reference.\n *\n * @type object\n * @ignore\n */\nvar __arrayProto = Array.prototype;\n\n\n/**\n * Abstraction for `context` parameter of the `Api` constructor to allow it to\n * take several different forms for ease of use.\n *\n * Each of the input parameter types will be converted to a DataTables settings\n * object where possible.\n *\n * @param  {string|node|jQuery|object} mixed DataTable identifier. Can be one\n *   of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n *   * `DataTables.Api` - API instance\n * @return {array|null} Matching DataTables settings objects. `null` or\n *   `undefined` is returned if no matching DataTable is found.\n * @ignore\n */\nvar _toSettings = function ( mixed )\n{\n\tvar idx, jq;\n\tvar settings = DataTable.settings;\n\tvar tables = $.map( settings, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\tif ( ! mixed ) {\n\t\treturn [];\n\t}\n\telse if ( mixed.nTable && mixed.oApi ) {\n\t\t// DataTables settings object\n\t\treturn [ mixed ];\n\t}\n\telse if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {\n\t\t// Table node\n\t\tidx = $.inArray( mixed, tables );\n\t\treturn idx !== -1 ? [ settings[idx] ] : null;\n\t}\n\telse if ( mixed && typeof mixed.settings === 'function' ) {\n\t\treturn mixed.settings().toArray();\n\t}\n\telse if ( typeof mixed === 'string' ) {\n\t\t// jQuery selector\n\t\tjq = $(mixed);\n\t}\n\telse if ( mixed instanceof $ ) {\n\t\t// jQuery object (also DataTables instance)\n\t\tjq = mixed;\n\t}\n\n\tif ( jq ) {\n\t\treturn jq.map( function(i) {\n\t\t\tidx = $.inArray( this, tables );\n\t\t\treturn idx !== -1 ? settings[idx] : null;\n\t\t} ).toArray();\n\t}\n};\n\n\n/**\n * DataTables API class - used to control and interface with  one or more\n * DataTables enhanced tables.\n *\n * The API class is heavily based on jQuery, presenting a chainable interface\n * that you can use to interact with tables. Each instance of the API class has\n * a \"context\" - i.e. the tables that it will operate on. This could be a single\n * table, all tables on a page or a sub-set thereof.\n *\n * Additionally the API is designed to allow you to easily work with the data in\n * the tables, retrieving and manipulating it as required. This is done by\n * presenting the API class as an array like interface. The contents of the\n * array depend upon the actions requested by each method (for example\n * `rows().nodes()` will return an array of nodes, while `rows().data()` will\n * return an array of objects or arrays depending upon your table's\n * configuration). The API object has a number of array like methods (`push`,\n * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,\n * `unique` etc) to assist your working with the data held in a table.\n *\n * Most methods (those which return an Api instance) are chainable, which means\n * the return from a method call also has all of the methods available that the\n * top level object had. For example, these two calls are equivalent:\n *\n *     // Not chained\n *     api.row.add( {...} );\n *     api.draw();\n *\n *     // Chained\n *     api.row.add( {...} ).draw();\n *\n * @class DataTable.Api\n * @param {array|object|string|jQuery} context DataTable identifier. This is\n *   used to define which DataTables enhanced tables this API will operate on.\n *   Can be one of:\n *\n *   * `string` - jQuery selector. Any DataTables' matching the given selector\n *     with be found and used.\n *   * `node` - `TABLE` node which has already been formed into a DataTable.\n *   * `jQuery` - A jQuery object of `TABLE` nodes.\n *   * `object` - DataTables settings object\n * @param {array} [data] Data to initialise the Api instance with.\n *\n * @example\n *   // Direct initialisation during DataTables construction\n *   var api = $('#example').DataTable();\n *\n * @example\n *   // Initialisation using a DataTables jQuery object\n *   var api = $('#example').dataTable().api();\n *\n * @example\n *   // Initialisation as a constructor\n *   var api = new $.fn.DataTable.Api( 'table.dataTable' );\n */\n_Api = function ( context, data )\n{\n\tif ( ! (this instanceof _Api) ) {\n\t\treturn new _Api( context, data );\n\t}\n\n\tvar settings = [];\n\tvar ctxSettings = function ( o ) {\n\t\tvar a = _toSettings( o );\n\t\tif ( a ) {\n\t\t\tsettings.push.apply( settings, a );\n\t\t}\n\t};\n\n\tif ( Array.isArray( context ) ) {\n\t\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tctxSettings( context[i] );\n\t\t}\n\t}\n\telse {\n\t\tctxSettings( context );\n\t}\n\n\t// Remove duplicates\n\tthis.context = _unique( settings );\n\n\t// Initial data\n\tif ( data ) {\n\t\t$.merge( this, data );\n\t}\n\n\t// selector\n\tthis.selector = {\n\t\trows: null,\n\t\tcols: null,\n\t\topts: null\n\t};\n\n\t_Api.extend( this, this, __apiStruct );\n};\n\nDataTable.Api = _Api;\n\n// Don't destroy the existing prototype, just extend it. Required for jQuery 2's\n// isPlainObject.\n$.extend( _Api.prototype, {\n\tany: function ()\n\t{\n\t\treturn this.count() !== 0;\n\t},\n\n\n\tconcat:  __arrayProto.concat,\n\n\n\tcontext: [], // array of table settings objects\n\n\n\tcount: function ()\n\t{\n\t\treturn this.flatten().length;\n\t},\n\n\n\teach: function ( fn )\n\t{\n\t\tfor ( var i=0, ien=this.length ; i<ien; i++ ) {\n\t\t\tfn.call( this, this[i], i, this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\n\teq: function ( idx )\n\t{\n\t\tvar ctx = this.context;\n\n\t\treturn ctx.length > idx ?\n\t\t\tnew _Api( ctx[idx], this[idx] ) :\n\t\t\tnull;\n\t},\n\n\n\tfilter: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.filter ) {\n\t\t\ta = __arrayProto.filter.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\tif ( fn.call( this, this[i], i, this ) ) {\n\t\t\t\t\ta.push( this[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tflatten: function ()\n\t{\n\t\tvar a = [];\n\t\treturn new _Api( this.context, a.concat.apply( a, this.toArray() ) );\n\t},\n\n\n\tjoin:    __arrayProto.join,\n\n\n\tindexOf: __arrayProto.indexOf || function (obj, start)\n\t{\n\t\tfor ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {\n\t\t\tif ( this[i] === obj ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\titerator: function ( flatten, type, fn, alwaysNew ) {\n\t\tvar\n\t\t\ta = [], ret,\n\t\t\ti, ien, j, jen,\n\t\t\tcontext = this.context,\n\t\t\trows, items, item,\n\t\t\tselector = this.selector;\n\n\t\t// Argument shifting\n\t\tif ( typeof flatten === 'string' ) {\n\t\t\talwaysNew = fn;\n\t\t\tfn = type;\n\t\t\ttype = flatten;\n\t\t\tflatten = false;\n\t\t}\n\n\t\tfor ( i=0, ien=context.length ; i<ien ; i++ ) {\n\t\t\tvar apiInst = new _Api( context[i] );\n\n\t\t\tif ( type === 'table' ) {\n\t\t\t\tret = fn.call( apiInst, context[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'columns' || type === 'rows' ) {\n\t\t\t\t// this has same length as context - one entry for each table\n\t\t\t\tret = fn.call( apiInst, context[i], this[i], i );\n\n\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\ta.push( ret );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {\n\t\t\t\t// columns and rows share the same structure.\n\t\t\t\t// 'this' is an array of column indexes for each context\n\t\t\t\titems = this[i];\n\n\t\t\t\tif ( type === 'column-rows' ) {\n\t\t\t\t\trows = _selector_row_indexes( context[i], selector.opts );\n\t\t\t\t}\n\n\t\t\t\tfor ( j=0, jen=items.length ; j<jen ; j++ ) {\n\t\t\t\t\titem = items[j];\n\n\t\t\t\t\tif ( type === 'cell' ) {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item.row, item.column, i, j );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tret = fn.call( apiInst, context[i], item, i, j, rows );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\ta.push( ret );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( a.length || alwaysNew ) {\n\t\t\tvar api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );\n\t\t\tvar apiSelector = api.selector;\n\t\t\tapiSelector.rows = selector.rows;\n\t\t\tapiSelector.cols = selector.cols;\n\t\t\tapiSelector.opts = selector.opts;\n\t\t\treturn api;\n\t\t}\n\t\treturn this;\n\t},\n\n\n\tlastIndexOf: __arrayProto.lastIndexOf || function (obj, start)\n\t{\n\t\t// Bit cheeky...\n\t\treturn this.indexOf.apply( this.toArray.reverse(), arguments );\n\t},\n\n\n\tlength:  0,\n\n\n\tmap: function ( fn )\n\t{\n\t\tvar a = [];\n\n\t\tif ( __arrayProto.map ) {\n\t\t\ta = __arrayProto.map.call( this, fn, this );\n\t\t}\n\t\telse {\n\t\t\t// Compatibility for browsers without EMCA-252-5 (JS 1.6)\n\t\t\tfor ( var i=0, ien=this.length ; i<ien ; i++ ) {\n\t\t\t\ta.push( fn.call( this, this[i], i ) );\n\t\t\t}\n\t\t}\n\n\t\treturn new _Api( this.context, a );\n\t},\n\n\n\tpluck: function ( prop )\n\t{\n\t\tvar fn = DataTable.util.get(prop);\n\n\t\treturn this.map( function ( el ) {\n\t\t\treturn fn(el);\n\t\t} );\n\t},\n\n\tpop:     __arrayProto.pop,\n\n\n\tpush:    __arrayProto.push,\n\n\n\t// Does not return an API instance\n\treduce: __arrayProto.reduce || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, 0, this.length, 1 );\n\t},\n\n\n\treduceRight: __arrayProto.reduceRight || function ( fn, init )\n\t{\n\t\treturn _fnReduce( this, fn, init, this.length-1, -1, -1 );\n\t},\n\n\n\treverse: __arrayProto.reverse,\n\n\n\t// Object with rows, columns and opts\n\tselector: null,\n\n\n\tshift:   __arrayProto.shift,\n\n\n\tslice: function () {\n\t\treturn new _Api( this.context, this );\n\t},\n\n\n\tsort:    __arrayProto.sort, // ? name - order?\n\n\n\tsplice:  __arrayProto.splice,\n\n\n\ttoArray: function ()\n\t{\n\t\treturn __arrayProto.slice.call( this );\n\t},\n\n\n\tto$: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\ttoJQuery: function ()\n\t{\n\t\treturn $( this );\n\t},\n\n\n\tunique: function ()\n\t{\n\t\treturn new _Api( this.context, _unique(this) );\n\t},\n\n\n\tunshift: __arrayProto.unshift\n} );\n\n\n_Api.extend = function ( scope, obj, ext )\n{\n\t// Only extend API instances and static properties of the API\n\tif ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\tstruct,\n\t\tmethodScoping = function ( scope, fn, struc ) {\n\t\t\treturn function () {\n\t\t\t\tvar ret = fn.apply( scope, arguments );\n\n\t\t\t\t// Method extension\n\t\t\t\t_Api.extend( ret, ret, struc.methodExt );\n\t\t\t\treturn ret;\n\t\t\t};\n\t\t};\n\n\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\tstruct = ext[i];\n\n\t\t// Value\n\t\tobj[ struct.name ] = struct.type === 'function' ?\n\t\t\tmethodScoping( scope, struct.val, struct ) :\n\t\t\tstruct.type === 'object' ?\n\t\t\t\t{} :\n\t\t\t\tstruct.val;\n\n\t\tobj[ struct.name ].__dt_wrapper = true;\n\n\t\t// Property extension\n\t\t_Api.extend( scope, obj[ struct.name ], struct.propExt );\n\t}\n};\n\n\n// @todo - Is there need for an augment function?\n// _Api.augment = function ( inst, name )\n// {\n// \t// Find src object in the structure from the name\n// \tvar parts = name.split('.');\n\n// \t_Api.extend( inst, obj );\n// };\n\n\n//     [\n//       {\n//         name:      'data'                -- string   - Property name\n//         val:       function () {},       -- function - Api method (or undefined if just an object\n//         methodExt: [ ... ],              -- array    - Array of Api object definitions to extend the method result\n//         propExt:   [ ... ]               -- array    - Array of Api object definitions to extend the property\n//       },\n//       {\n//         name:     'row'\n//         val:       {},\n//         methodExt: [ ... ],\n//         propExt:   [\n//           {\n//             name:      'data'\n//             val:       function () {},\n//             methodExt: [ ... ],\n//             propExt:   [ ... ]\n//           },\n//           ...\n//         ]\n//       }\n//     ]\n\n_Api.register = _api_register = function ( name, val )\n{\n\tif ( Array.isArray( name ) ) {\n\t\tfor ( var j=0, jen=name.length ; j<jen ; j++ ) {\n\t\t\t_Api.register( name[j], val );\n\t\t}\n\t\treturn;\n\t}\n\n\tvar\n\t\ti, ien,\n\t\their = name.split('.'),\n\t\tstruct = __apiStruct,\n\t\tkey, method;\n\n\tvar find = function ( src, name ) {\n\t\tfor ( var i=0, ien=src.length ; i<ien ; i++ ) {\n\t\t\tif ( src[i].name === name ) {\n\t\t\t\treturn src[i];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t};\n\n\tfor ( i=0, ien=heir.length ; i<ien ; i++ ) {\n\t\tmethod = heir[i].indexOf('()') !== -1;\n\t\tkey = method ?\n\t\t\their[i].replace('()', '') :\n\t\t\their[i];\n\n\t\tvar src = find( struct, key );\n\t\tif ( ! src ) {\n\t\t\tsrc = {\n\t\t\t\tname:      key,\n\t\t\t\tval:       {},\n\t\t\t\tmethodExt: [],\n\t\t\t\tpropExt:   [],\n\t\t\t\ttype:      'object'\n\t\t\t};\n\t\t\tstruct.push( src );\n\t\t}\n\n\t\tif ( i === ien-1 ) {\n\t\t\tsrc.val = val;\n\t\t\tsrc.type = typeof val === 'function' ?\n\t\t\t\t'function' :\n\t\t\t\t$.isPlainObject( val ) ?\n\t\t\t\t\t'object' :\n\t\t\t\t\t'other';\n\t\t}\n\t\telse {\n\t\t\tstruct = method ?\n\t\t\t\tsrc.methodExt :\n\t\t\t\tsrc.propExt;\n\t\t}\n\t}\n};\n\n_Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {\n\t_Api.register( pluralName, val );\n\n\t_Api.register( singularName, function () {\n\t\tvar ret = val.apply( this, arguments );\n\n\t\tif ( ret === this ) {\n\t\t\t// Returned item is the API instance that was passed in, return it\n\t\t\treturn this;\n\t\t}\n\t\telse if ( ret instanceof _Api ) {\n\t\t\t// New API instance returned, want the value from the first item\n\t\t\t// in the returned array for the singular result.\n\t\t\treturn ret.length ?\n\t\t\t\tArray.isArray( ret[0] ) ?\n\t\t\t\t\tnew _Api( ret.context, ret[0] ) : // Array results are 'enhanced'\n\t\t\t\t\tret[0] :\n\t\t\t\tundefined;\n\t\t}\n\n\t\t// Non-API return - just fire it back\n\t\treturn ret;\n\t} );\n};\n\n\n/**\n * Selector for HTML tables. Apply the given selector to the give array of\n * DataTables settings objects.\n *\n * @param {string|integer} [selector] jQuery selector string or integer\n * @param  {array} Array of DataTables settings objects to be filtered\n * @return {array}\n * @ignore\n */\nvar __table_selector = function ( selector, a )\n{\n\tif ( Array.isArray(selector) ) {\n\t\treturn $.map( selector, function (item) {\n\t\t\treturn __table_selector(item, a);\n\t\t} );\n\t}\n\n\t// Integer is used to pick out a table by index\n\tif ( typeof selector === 'number' ) {\n\t\treturn [ a[ selector ] ];\n\t}\n\n\t// Perform a jQuery selector on the table nodes\n\tvar nodes = $.map( a, function (el, i) {\n\t\treturn el.nTable;\n\t} );\n\n\treturn $(nodes)\n\t\t.filter( selector )\n\t\t.map( function (i) {\n\t\t\t// Need to translate back from the table node to the settings\n\t\t\tvar idx = $.inArray( this, nodes );\n\t\t\treturn a[ idx ];\n\t\t} )\n\t\t.toArray();\n};\n\n\n\n/**\n * Context selector for the API's context (i.e. the tables the API instance\n * refers to.\n *\n * @name    DataTable.Api#tables\n * @param {string|integer} [selector] Selector to pick which tables the iterator\n *   should operate on. If not given, all tables in the current context are\n *   used. This can be given as a jQuery selector (for example `':gt(0)'`) to\n *   select multiple tables or as an integer to select a single table.\n * @returns {DataTable.Api} Returns a new API instance if a selector is given.\n */\n_api_register( 'tables()', function ( selector ) {\n\t// A new instance is created if there was a selector specified\n\treturn selector !== undefined && selector !== null ?\n\t\tnew _Api( __table_selector( selector, this.context ) ) :\n\t\tthis;\n} );\n\n\n_api_register( 'table()', function ( selector ) {\n\tvar tables = this.tables( selector );\n\tvar ctx = tables.context;\n\n\t// Truncate to the first matched table\n\treturn ctx.length ?\n\t\tnew _Api( ctx[0] ) :\n\t\ttables;\n} );\n\n\n_api_registerPlural( 'tables().nodes()', 'table().node()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTable;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().body()', 'table().body()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTBody;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().header()', 'table().header()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTHead;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().footer()', 'table().footer()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTFoot;\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'tables().containers()', 'table().container()' , function () {\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\treturn ctx.nTableWrapper;\n\t}, 1 );\n} );\n\n\n\n/**\n * Redraw the tables in the current context.\n */\n_api_register( 'draw()', function ( paging ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( paging === 'page' ) {\n\t\t\t_fnDraw( settings );\n\t\t}\n\t\telse {\n\t\t\tif ( typeof paging === 'string' ) {\n\t\t\t\tpaging = paging === 'full-hold' ?\n\t\t\t\t\tfalse :\n\t\t\t\t\ttrue;\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, paging===false );\n\t\t}\n\t} );\n} );\n\n\n\n/**\n * Get the current page index.\n *\n * @return {integer} Current page index (zero based)\n *//**\n * Set the current page.\n *\n * Note that if you attempt to show a page which does not exist, DataTables will\n * not throw an error, but rather reset the paging.\n *\n * @param {integer|string} action The paging action to take. This can be one of:\n *  * `integer` - The page index to jump to\n *  * `string` - An action to take:\n *    * `first` - Jump to first page.\n *    * `next` - Jump to the next page\n *    * `previous` - Jump to previous page\n *    * `last` - Jump to the last page.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page()', function ( action ) {\n\tif ( action === undefined ) {\n\t\treturn this.page.info().page; // not an expensive call\n\t}\n\n\t// else, have an action to take on all tables\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnPageChange( settings, action );\n\t} );\n} );\n\n\n/**\n * Paging information for the first table in the current context.\n *\n * If you require paging information for another table, use the `table()` method\n * with a suitable selector.\n *\n * @return {object} Object with the following properties set:\n *  * `page` - Current page index (zero based - i.e. the first page is `0`)\n *  * `pages` - Total number of pages\n *  * `start` - Display index for the first record shown on the current page\n *  * `end` - Display index for the last record shown on the current page\n *  * `length` - Display length (number of records). Note that generally `start\n *    + length = end`, but this is not always true, for example if there are\n *    only 2 records to show on the final page, with a length of 10.\n *  * `recordsTotal` - Full data set length\n *  * `recordsDisplay` - Data set length once the current filtering criterion\n *    are applied.\n */\n_api_register( 'page.info()', function ( action ) {\n\tif ( this.context.length === 0 ) {\n\t\treturn undefined;\n\t}\n\n\tvar\n\t\tsettings   = this.context[0],\n\t\tstart      = settings._iDisplayStart,\n\t\tlen        = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,\n\t\tvisRecords = settings.fnRecordsDisplay(),\n\t\tall        = len === -1;\n\n\treturn {\n\t\t\"page\":           all ? 0 : Math.floor( start / len ),\n\t\t\"pages\":          all ? 1 : Math.ceil( visRecords / len ),\n\t\t\"start\":          start,\n\t\t\"end\":            settings.fnDisplayEnd(),\n\t\t\"length\":         len,\n\t\t\"recordsTotal\":   settings.fnRecordsTotal(),\n\t\t\"recordsDisplay\": visRecords,\n\t\t\"serverSide\":     _fnDataSource( settings ) === 'ssp'\n\t};\n} );\n\n\n/**\n * Get the current page length.\n *\n * @return {integer} Current page length. Note `-1` indicates that all records\n *   are to be shown.\n *//**\n * Set the current page length.\n *\n * @param {integer} Page length to set. Use `-1` to show all records.\n * @returns {DataTables.Api} this\n */\n_api_register( 'page.len()', function ( len ) {\n\t// Note that we can't call this function 'length()' because `length`\n\t// is a Javascript property of functions which defines how many arguments\n\t// the function expects.\n\tif ( len === undefined ) {\n\t\treturn this.context.length !== 0 ?\n\t\t\tthis.context[0]._iDisplayLength :\n\t\t\tundefined;\n\t}\n\n\t// else, set the page length\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnLengthChange( settings, len );\n\t} );\n} );\n\n\n\nvar __reload = function ( settings, holdPosition, callback ) {\n\t// Use the draw event to trigger a callback\n\tif ( callback ) {\n\t\tvar api = new _Api( settings );\n\n\t\tapi.one( 'draw', function () {\n\t\t\tcallback( api.ajax.json() );\n\t\t} );\n\t}\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t_fnReDraw( settings, holdPosition );\n\t}\n\telse {\n\t\t_fnProcessingDisplay( settings, true );\n\n\t\t// Cancel an existing request\n\t\tvar xhr = settings.jqXHR;\n\t\tif ( xhr && xhr.readyState !== 4 ) {\n\t\t\txhr.abort();\n\t\t}\n\n\t\t// Trigger xhr\n\t\t_fnBuildAjax( settings, [], function( json ) {\n\t\t\t_fnClearTable( settings );\n\n\t\t\tvar data = _fnAjaxDataSrc( settings, json );\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\t_fnAddData( settings, data[i] );\n\t\t\t}\n\n\t\t\t_fnReDraw( settings, holdPosition );\n\t\t\t_fnProcessingDisplay( settings, false );\n\t\t} );\n\t}\n};\n\n\n/**\n * Get the JSON response from the last Ajax request that DataTables made to the\n * server. Note that this returns the JSON from the first table in the current\n * context.\n *\n * @return {object} JSON received from the server.\n */\n_api_register( 'ajax.json()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].json;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Get the data submitted in the last Ajax request\n */\n_api_register( 'ajax.params()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length > 0 ) {\n\t\treturn ctx[0].oAjaxData;\n\t}\n\n\t// else return undefined;\n} );\n\n\n/**\n * Reload tables from the Ajax data source. Note that this function will\n * automatically re-draw the table when the remote data has been loaded.\n *\n * @param {boolean} [reset=true] Reset (default) or hold the current paging\n *   position. A full re-sort and re-filter is performed when this method is\n *   called, which is why the pagination reset is the default action.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.reload()', function ( callback, resetPaging ) {\n\treturn this.iterator( 'table', function (settings) {\n\t\t__reload( settings, resetPaging===false, callback );\n\t} );\n} );\n\n\n/**\n * Get the current Ajax URL. Note that this returns the URL from the first\n * table in the current context.\n *\n * @return {string} Current Ajax source URL\n *//**\n * Set the Ajax URL. Note that this will set the URL for all tables in the\n * current context.\n *\n * @param {string} url URL to set.\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url()', function ( url ) {\n\tvar ctx = this.context;\n\n\tif ( url === undefined ) {\n\t\t// get\n\t\tif ( ctx.length === 0 ) {\n\t\t\treturn undefined;\n\t\t}\n\t\tctx = ctx[0];\n\n\t\treturn ctx.ajax ?\n\t\t\t$.isPlainObject( ctx.ajax ) ?\n\t\t\t\tctx.ajax.url :\n\t\t\t\tctx.ajax :\n\t\t\tctx.sAjaxSource;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( $.isPlainObject( settings.ajax ) ) {\n\t\t\tsettings.ajax.url = url;\n\t\t}\n\t\telse {\n\t\t\tsettings.ajax = url;\n\t\t}\n\t\t// No need to consider sAjaxSource here since DataTables gives priority\n\t\t// to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any\n\t\t// value of `sAjaxSource` redundant.\n\t} );\n} );\n\n\n/**\n * Load data from the newly set Ajax URL. Note that this method is only\n * available when `ajax.url()` is used to set a URL. Additionally, this method\n * has the same effect as calling `ajax.reload()` but is provided for\n * convenience when setting a new URL. Like `ajax.reload()` it will\n * automatically redraw the table once the remote data has been loaded.\n *\n * @returns {DataTables.Api} this\n */\n_api_register( 'ajax.url().load()', function ( callback, resetPaging ) {\n\t// Same as a reload, but makes sense to present it for easy access after a\n\t// url change\n\treturn this.iterator( 'table', function ( ctx ) {\n\t\t__reload( ctx, resetPaging===false, callback );\n\t} );\n} );\n\n\n\n\nvar _selector_run = function ( type, selector, selectFn, settings, opts )\n{\n\tvar\n\t\tout = [], res,\n\t\ta, i, ien, j, jen,\n\t\tselectorType = typeof selector;\n\n\t// Can't just check for isArray here, as an API or jQuery instance might be\n\t// given with their array like look\n\tif ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {\n\t\tselector = [ selector ];\n\t}\n\n\tfor ( i=0, ien=selector.length ; i<ien ; i++ ) {\n\t\t// Only split on simple strings - complex expressions will be jQuery selectors\n\t\ta = selector[i] && selector[i].split && ! selector[i].match(/[\\[\\(:]/) ?\n\t\t\tselector[i].split(',') :\n\t\t\t[ selector[i] ];\n\n\t\tfor ( j=0, jen=a.length ; j<jen ; j++ ) {\n\t\t\tres = selectFn( typeof a[j] === 'string' ? (a[j]).trim() : a[j] );\n\n\t\t\tif ( res && res.length ) {\n\t\t\t\tout = out.concat( res );\n\t\t\t}\n\t\t}\n\t}\n\n\t// selector extensions\n\tvar ext = _ext.selector[ type ];\n\tif ( ext.length ) {\n\t\tfor ( i=0, ien=ext.length ; i<ien ; i++ ) {\n\t\t\tout = ext[i]( settings, opts, out );\n\t\t}\n\t}\n\n\treturn _unique( out );\n};\n\n\nvar _selector_opts = function ( opts )\n{\n\tif ( ! opts ) {\n\t\topts = {};\n\t}\n\n\t// Backwards compatibility for 1.9- which used the terminology filter rather\n\t// than search\n\tif ( opts.filter && opts.search === undefined ) {\n\t\topts.search = opts.filter;\n\t}\n\n\treturn $.extend( {\n\t\tsearch: 'none',\n\t\torder: 'current',\n\t\tpage: 'all'\n\t}, opts );\n};\n\n\nvar _selector_first = function ( inst )\n{\n\t// Reduce the API instance to the first item found\n\tfor ( var i=0, ien=inst.length ; i<ien ; i++ ) {\n\t\tif ( inst[i].length > 0 ) {\n\t\t\t// Assign the first element to the first item in the instance\n\t\t\t// and truncate the instance and context\n\t\t\tinst[0] = inst[i];\n\t\t\tinst[0].length = 1;\n\t\t\tinst.length = 1;\n\t\t\tinst.context = [ inst.context[i] ];\n\n\t\t\treturn inst;\n\t\t}\n\t}\n\n\t// Not found - return an empty instance\n\tinst.length = 0;\n\treturn inst;\n};\n\n\nvar _selector_row_indexes = function ( settings, opts )\n{\n\tvar\n\t\ti, ien, tmp, a=[],\n\t\tdisplayFiltered = settings.aiDisplay,\n\t\tdisplayMaster = settings.aiDisplayMaster;\n\n\tvar\n\t\tsearch = opts.search,  // none, applied, removed\n\t\torder  = opts.order,   // applied, current, index (original - compatibility with 1.9)\n\t\tpage   = opts.page;    // all, current\n\n\tif ( _fnDataSource( settings ) == 'ssp' ) {\n\t\t// In server-side processing mode, most options are irrelevant since\n\t\t// rows not shown don't exist and the index order is the applied order\n\t\t// Removed is a special case - for consistency just return an empty\n\t\t// array\n\t\treturn search === 'removed' ?\n\t\t\t[] :\n\t\t\t_range( 0, displayMaster.length );\n\t}\n\telse if ( page == 'current' ) {\n\t\t// Current page implies that order=current and filter=applied, since it is\n\t\t// fairly senseless otherwise, regardless of what order and search actually\n\t\t// are\n\t\tfor ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {\n\t\t\ta.push( displayFiltered[i] );\n\t\t}\n\t}\n\telse if ( order == 'current' || order == 'applied' ) {\n\t\tif ( search == 'none') {\n\t\t\ta = displayMaster.slice();\n\t\t}\n\t\telse if ( search == 'applied' ) {\n\t\t\ta = displayFiltered.slice();\n\t\t}\n\t\telse if ( search == 'removed' ) {\n\t\t\t// O(n+m) solution by creating a hash map\n\t\t\tvar displayFilteredMap = {};\n\n\t\t\tfor ( var i=0, ien=displayFiltered.length ; i<ien ; i++ ) {\n\t\t\t\tdisplayFilteredMap[displayFiltered[i]] = null;\n\t\t\t}\n\n\t\t\ta = $.map( displayMaster, function (el) {\n\t\t\t\treturn ! displayFilteredMap.hasOwnProperty(el) ?\n\t\t\t\t\tel :\n\t\t\t\t\tnull;\n\t\t\t} );\n\t\t}\n\t}\n\telse if ( order == 'index' || order == 'original' ) {\n\t\tfor ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tif ( search == 'none' ) {\n\t\t\t\ta.push( i );\n\t\t\t}\n\t\t\telse { // applied | removed\n\t\t\t\ttmp = $.inArray( i, displayFiltered );\n\n\t\t\t\tif ((tmp === -1 && search == 'removed') ||\n\t\t\t\t\t(tmp >= 0   && search == 'applied') )\n\t\t\t\t{\n\t\t\t\t\ta.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a;\n};\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Rows\n *\n * {}          - no selector - use all available rows\n * {integer}   - row aoData index\n * {node}      - TR node\n * {string}    - jQuery selector to apply to the TR elements\n * {array}     - jQuery array of nodes, or simply an array of TR nodes\n *\n */\nvar __row_selector = function ( settings, selector, opts )\n{\n\tvar rows;\n\tvar run = function ( sel ) {\n\t\tvar selInt = _intVal( sel );\n\t\tvar i, ien;\n\t\tvar aoData = settings.aoData;\n\n\t\t// Short cut - selector is a number and no options provided (default is\n\t\t// all records, so no need to check if the index is in there, since it\n\t\t// must be - dev error if the index doesn't exist).\n\t\tif ( selInt !== null && ! opts ) {\n\t\t\treturn [ selInt ];\n\t\t}\n\n\t\tif ( ! rows ) {\n\t\t\trows = _selector_row_indexes( settings, opts );\n\t\t}\n\n\t\tif ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {\n\t\t\t// Selector - integer\n\t\t\treturn [ selInt ];\n\t\t}\n\t\telse if ( sel === null || sel === undefined || sel === '' ) {\n\t\t\t// Selector - none\n\t\t\treturn rows;\n\t\t}\n\n\t\t// Selector - function\n\t\tif ( typeof sel === 'function' ) {\n\t\t\treturn $.map( rows, function (idx) {\n\t\t\t\tvar row = aoData[ idx ];\n\t\t\t\treturn sel( idx, row._aData, row.nTr ) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// Selector - node\n\t\tif ( sel.nodeName ) {\n\t\t\tvar rowIdx = sel._DT_RowIndex;  // Property added by DT for fast lookup\n\t\t\tvar cellIdx = sel._DT_CellIndex;\n\n\t\t\tif ( rowIdx !== undefined ) {\n\t\t\t\t// Make sure that the row is actually still present in the table\n\t\t\t\treturn aoData[ rowIdx ] && aoData[ rowIdx ].nTr === sel ?\n\t\t\t\t\t[ rowIdx ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse if ( cellIdx ) {\n\t\t\t\treturn aoData[ cellIdx.row ] && aoData[ cellIdx.row ].nTr === sel.parentNode ?\n\t\t\t\t\t[ cellIdx.row ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t\telse {\n\t\t\t\tvar host = $(sel).closest('*[data-dt-row]');\n\t\t\t\treturn host.length ?\n\t\t\t\t\t[ host.data('dt-row') ] :\n\t\t\t\t\t[];\n\t\t\t}\n\t\t}\n\n\t\t// ID selector. Want to always be able to select rows by id, regardless\n\t\t// of if the tr element has been created or not, so can't rely upon\n\t\t// jQuery here - hence a custom implementation. This does not match\n\t\t// Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,\n\t\t// but to select it using a CSS selector engine (like Sizzle or\n\t\t// querySelect) it would need to need to be escaped for some characters.\n\t\t// DataTables simplifies this for row selectors since you can select\n\t\t// only a row. A # indicates an id any anything that follows is the id -\n\t\t// unescaped.\n\t\tif ( typeof sel === 'string' && sel.charAt(0) === '#' ) {\n\t\t\t// get row index from id\n\t\t\tvar rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];\n\t\t\tif ( rowObj !== undefined ) {\n\t\t\t\treturn [ rowObj.idx ];\n\t\t\t}\n\n\t\t\t// need to fall through to jQuery in case there is DOM id that\n\t\t\t// matches\n\t\t}\n\t\t\n\t\t// Get nodes in the order from the `rows` array with null values removed\n\t\tvar nodes = _removeEmpty(\n\t\t\t_pluck_order( settings.aoData, rows, 'nTr' )\n\t\t);\n\n\t\t// Selector - jQuery selector string, array of nodes or jQuery object/\n\t\t// As jQuery's .filter() allows jQuery objects to be passed in filter,\n\t\t// it also allows arrays, so this will cope with all three options\n\t\treturn $(nodes)\n\t\t\t.filter( sel )\n\t\t\t.map( function () {\n\t\t\t\treturn this._DT_RowIndex;\n\t\t\t} )\n\t\t\t.toArray();\n\t};\n\n\treturn _selector_run( 'row', selector, run, settings, opts );\n};\n\n\n_api_register( 'rows()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __row_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in __row_selector?\n\tinst.selector.rows = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_register( 'rows().nodes()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn settings.aoData[ row ].nTr || undefined;\n\t}, 1 );\n} );\n\n_api_register( 'rows().data()', function () {\n\treturn this.iterator( true, 'rows', function ( settings, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, '_aData' );\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\tvar r = settings.aoData[ row ];\n\t\treturn type === 'search' ? r._aFilterData : r._aSortData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\t_fnInvalidate( settings, row, src );\n\t} );\n} );\n\n_api_registerPlural( 'rows().indexes()', 'row().index()', function () {\n\treturn this.iterator( 'row', function ( settings, row ) {\n\t\treturn row;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {\n\tvar a = [];\n\tvar context = this.context;\n\n\t// `iterator` will drop undefined values, but in this case we want them\n\tfor ( var i=0, ien=context.length ; i<ien ; i++ ) {\n\t\tfor ( var j=0, jen=this[i].length ; j<jen ; j++ ) {\n\t\t\tvar id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );\n\t\t\ta.push( (hash === true ? '#' : '' )+ id );\n\t\t}\n\t}\n\n\treturn new _Api( context, a );\n} );\n\n_api_registerPlural( 'rows().remove()', 'row().remove()', function () {\n\tvar that = this;\n\n\tthis.iterator( 'row', function ( settings, row, thatIdx ) {\n\t\tvar data = settings.aoData;\n\t\tvar rowData = data[ row ];\n\t\tvar i, ien, j, jen;\n\t\tvar loopRow, loopCells;\n\n\t\tdata.splice( row, 1 );\n\n\t\t// Update the cached indexes\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\tloopRow = data[i];\n\t\t\tloopCells = loopRow.anCells;\n\n\t\t\t// Rows\n\t\t\tif ( loopRow.nTr !== null ) {\n\t\t\t\tloopRow.nTr._DT_RowIndex = i;\n\t\t\t}\n\n\t\t\t// Cells\n\t\t\tif ( loopCells !== null ) {\n\t\t\t\tfor ( j=0, jen=loopCells.length ; j<jen ; j++ ) {\n\t\t\t\t\tloopCells[j]._DT_CellIndex.row = i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Delete from the display arrays\n\t\t_fnDeleteIndex( settings.aiDisplayMaster, row );\n\t\t_fnDeleteIndex( settings.aiDisplay, row );\n\t\t_fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes\n\n\t\t// For server-side processing tables - subtract the deleted row from the count\n\t\tif ( settings._iRecordsDisplay > 0 ) {\n\t\t\tsettings._iRecordsDisplay--;\n\t\t}\n\n\t\t// Check for an 'overflow' they case for displaying the table\n\t\t_fnLengthOverflow( settings );\n\n\t\t// Remove the row's ID reference if there is one\n\t\tvar id = settings.rowIdFn( rowData._aData );\n\t\tif ( id !== undefined ) {\n\t\t\tdelete settings.aIds[ id ];\n\t\t}\n\t} );\n\n\tthis.iterator( 'table', function ( settings ) {\n\t\tfor ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {\n\t\t\tsettings.aoData[i].idx = i;\n\t\t}\n\t} );\n\n\treturn this;\n} );\n\n\n_api_register( 'rows.add()', function ( rows ) {\n\tvar newRows = this.iterator( 'table', function ( settings ) {\n\t\t\tvar row, i, ien;\n\t\t\tvar out = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\t\t\tout.push( _fnAddTr( settings, row )[0] );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tout.push( _fnAddData( settings, row ) );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn out;\n\t\t}, 1 );\n\n\t// Return an Api.rows() extended instance, so rows().nodes() etc can be used\n\tvar modRows = this.rows( -1 );\n\tmodRows.pop();\n\t$.merge( modRows, newRows );\n\n\treturn modRows;\n} );\n\n\n\n\n\n/**\n *\n */\n_api_register( 'row()', function ( selector, opts ) {\n\treturn _selector_first( this.rows( selector, opts ) );\n} );\n\n\n_api_register( 'row().data()', function ( data ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._aData :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\tvar row = ctx[0].aoData[ this[0] ];\n\trow._aData = data;\n\n\t// If the DOM has an id, and the data source is an array\n\tif ( Array.isArray( data ) && row.nTr && row.nTr.id ) {\n\t\t_fnSetObjectDataFn( ctx[0].rowId )( data, row.nTr.id );\n\t}\n\n\t// Automatically invalidate\n\t_fnInvalidate( ctx[0], this[0], 'data' );\n\n\treturn this;\n} );\n\n\n_api_register( 'row().node()', function () {\n\tvar ctx = this.context;\n\n\treturn ctx.length && this.length ?\n\t\tctx[0].aoData[ this[0] ].nTr || null :\n\t\tnull;\n} );\n\n\n_api_register( 'row.add()', function ( row ) {\n\t// Allow a jQuery object to be passed in - only a single row is added from\n\t// it though - the first element in the set\n\tif ( row instanceof $ && row.length ) {\n\t\trow = row[0];\n\t}\n\n\tvar rows = this.iterator( 'table', function ( settings ) {\n\t\tif ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {\n\t\t\treturn _fnAddTr( settings, row )[0];\n\t\t}\n\t\treturn _fnAddData( settings, row );\n\t} );\n\n\t// Return an Api.rows() extended instance, with the newly added row selected\n\treturn this.row( rows[0] );\n} );\n\n\n$(document).on('plugin-init.dt', function (e, context) {\n\tvar api = new _Api( context );\n\tvar namespace = 'on-plugin-init';\n\tvar stateSaveParamsEvent = 'stateSaveParams.' + namespace;\n\tvar destroyEvent = 'destroy. ' + namespace;\n\n\tapi.on( stateSaveParamsEvent, function ( e, settings, d ) {\n\t\t// This could be more compact with the API, but it is a lot faster as a simple\n\t\t// internal loop\n\t\tvar idFn = settings.rowIdFn;\n\t\tvar data = settings.aoData;\n\t\tvar ids = [];\n\n\t\tfor (var i=0 ; i<data.length ; i++) {\n\t\t\tif (data[i]._detailsShow) {\n\t\t\t\tids.push( '#' + idFn(data[i]._aData) );\n\t\t\t}\n\t\t}\n\n\t\td.childRows = ids;\n\t});\n\n\tapi.on( destroyEvent, function () {\n\t\tapi.off(stateSaveParamsEvent + ' ' + destroyEvent);\n\t});\n\n\tvar loaded = api.state.loaded();\n\n\tif ( loaded && loaded.childRows ) {\n\t\tapi\n\t\t\t.rows( $.map(loaded.childRows, function (id){\n\t\t\t\treturn id.replace(/:/g, '\\\\:')\n\t\t\t}) )\n\t\t\t.every( function () {\n\t\t\t\t_fnCallbackFire( context, null, 'requestChild', [ this ] )\n\t\t\t});\n\t}\n});\n\nvar __details_add = function ( ctx, row, data, klass )\n{\n\t// Convert to array of TR elements\n\tvar rows = [];\n\tvar addRow = function ( r, k ) {\n\t\t// Recursion to allow for arrays of jQuery objects\n\t\tif ( Array.isArray( r ) || r instanceof $ ) {\n\t\t\tfor ( var i=0, ien=r.length ; i<ien ; i++ ) {\n\t\t\t\taddRow( r[i], k );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// If we get a TR element, then just add it directly - up to the dev\n\t\t// to add the correct number of columns etc\n\t\tif ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {\n\t\t\trows.push( r );\n\t\t}\n\t\telse {\n\t\t\t// Otherwise create a row with a wrapper\n\t\t\tvar created = $('<tr><td></td></tr>').addClass( k );\n\t\t\t$('td', created)\n\t\t\t\t.addClass( k )\n\t\t\t\t.html( r )\n\t\t\t\t[0].colSpan = _fnVisbleColumns( ctx );\n\n\t\t\trows.push( created[0] );\n\t\t}\n\t};\n\n\taddRow( data, klass );\n\n\tif ( row._details ) {\n\t\trow._details.detach();\n\t}\n\n\trow._details = $(rows);\n\n\t// If the children were already shown, that state should be retained\n\tif ( row._detailsShow ) {\n\t\trow._details.insertAfter( row.nTr );\n\t}\n};\n\n\n// Make state saving of child row details async to allow them to be batch processed\nvar __details_state = DataTable.util.throttle(\n\tfunction (ctx) {\n\t\t_fnSaveState( ctx[0] )\n\t},\n\t500\n);\n\n\nvar __details_remove = function ( api, idx )\n{\n\tvar ctx = api.context;\n\n\tif ( ctx.length ) {\n\t\tvar row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];\n\n\t\tif ( row && row._details ) {\n\t\t\trow._details.remove();\n\n\t\t\trow._detailsShow = undefined;\n\t\t\trow._details = undefined;\n\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_display = function ( api, show ) {\n\tvar ctx = api.context;\n\n\tif ( ctx.length && api.length ) {\n\t\tvar row = ctx[0].aoData[ api[0] ];\n\n\t\tif ( row._details ) {\n\t\t\trow._detailsShow = show;\n\n\t\t\tif ( show ) {\n\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t$( row.nTr ).addClass( 'dt-hasChild' );\n\t\t\t}\n\t\t\telse {\n\t\t\t\trow._details.detach();\n\t\t\t\t$( row.nTr ).removeClass( 'dt-hasChild' );\n\t\t\t}\n\n\t\t\t_fnCallbackFire( ctx[0], null, 'childRow', [ show, api.row( api[0] ) ] )\n\n\t\t\t__details_events( ctx[0] );\n\t\t\t__details_state( ctx );\n\t\t}\n\t}\n};\n\n\nvar __details_events = function ( settings )\n{\n\tvar api = new _Api( settings );\n\tvar namespace = '.dt.DT_details';\n\tvar drawEvent = 'draw'+namespace;\n\tvar colvisEvent = 'column-sizing'+namespace;\n\tvar destroyEvent = 'destroy'+namespace;\n\tvar data = settings.aoData;\n\n\tapi.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );\n\n\tif ( _pluck( data, '_details' ).length > 0 ) {\n\t\t// On each draw, insert the required elements into the document\n\t\tapi.on( drawEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tapi.rows( {page:'current'} ).eq(0).each( function (idx) {\n\t\t\t\t// Internal data grab\n\t\t\t\tvar row = data[ idx ];\n\n\t\t\t\tif ( row._detailsShow ) {\n\t\t\t\t\trow._details.insertAfter( row.nTr );\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\n\t\t// Column visibility change - update the colspan\n\t\tapi.on( colvisEvent, function ( e, ctx, idx, vis ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Update the colspan for the details rows (note, only if it already has\n\t\t\t// a colspan)\n\t\t\tvar row, visible = _fnVisbleColumns( ctx );\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\trow = data[i];\n\n\t\t\t\tif ( row._details ) {\n\t\t\t\t\trow._details.children('td[colspan]').attr('colspan', visible );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Table destroyed - nuke any child rows\n\t\tapi.on( destroyEvent, function ( e, ctx ) {\n\t\t\tif ( settings !== ctx ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor ( var i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\t\tif ( data[i]._details ) {\n\t\t\t\t\t__details_remove( api, i );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n};\n\n// Strings for the method names to help minification\nvar _emp = '';\nvar _child_obj = _emp+'row().child';\nvar _child_mth = _child_obj+'()';\n\n// data can be:\n//  tr\n//  string\n//  jQuery or array of any of the above\n_api_register( _child_mth, function ( data, klass ) {\n\tvar ctx = this.context;\n\n\tif ( data === undefined ) {\n\t\t// get\n\t\treturn ctx.length && this.length ?\n\t\t\tctx[0].aoData[ this[0] ]._details :\n\t\t\tundefined;\n\t}\n\telse if ( data === true ) {\n\t\t// show\n\t\tthis.child.show();\n\t}\n\telse if ( data === false ) {\n\t\t// remove\n\t\t__details_remove( this );\n\t}\n\telse if ( ctx.length && this.length ) {\n\t\t// set\n\t\t__details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );\n\t}\n\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.show()',\n\t_child_mth+'.show()' // only when `child()` was called with parameters (without\n], function ( show ) {   // it returns an object and this method is not executed)\n\t__details_display( this, true );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.hide()',\n\t_child_mth+'.hide()' // only when `child()` was called with parameters (without\n], function () {         // it returns an object and this method is not executed)\n\t__details_display( this, false );\n\treturn this;\n} );\n\n\n_api_register( [\n\t_child_obj+'.remove()',\n\t_child_mth+'.remove()' // only when `child()` was called with parameters (without\n], function () {           // it returns an object and this method is not executed)\n\t__details_remove( this );\n\treturn this;\n} );\n\n\n_api_register( _child_obj+'.isShown()', function () {\n\tvar ctx = this.context;\n\n\tif ( ctx.length && this.length ) {\n\t\t// _detailsShown as false or undefined will fall through to return false\n\t\treturn ctx[0].aoData[ this[0] ]._detailsShow || false;\n\t}\n\treturn false;\n} );\n\n\n\n/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n * Columns\n *\n * {integer}           - column index (>=0 count from left, <0 count from right)\n * \"{integer}:visIdx\"  - visible column index (i.e. translate to column index)  (>=0 count from left, <0 count from right)\n * \"{integer}:visible\" - alias for {integer}:visIdx  (>=0 count from left, <0 count from right)\n * \"{string}:name\"     - column name\n * \"{string}\"          - jQuery selector on column header nodes\n *\n */\n\n// can be an array of these items, comma separated list, or an array of comma\n// separated lists\n\nvar __re_column_selector = /^([^:]+):(name|visIdx|visible)$/;\n\n\n// r1 and r2 are redundant - but it means that the parameters match for the\n// iterator callback in columns().data()\nvar __columnData = function ( settings, column, r1, r2, rows ) {\n\tvar a = [];\n\tfor ( var row=0, ien=rows.length ; row<ien ; row++ ) {\n\t\ta.push( _fnGetCellData( settings, rows[row], column ) );\n\t}\n\treturn a;\n};\n\n\nvar __column_selector = function ( settings, selector, opts )\n{\n\tvar\n\t\tcolumns = settings.aoColumns,\n\t\tnames = _pluck( columns, 'sName' ),\n\t\tnodes = _pluck( columns, 'nTh' );\n\n\tvar run = function ( s ) {\n\t\tvar selInt = _intVal( s );\n\n\t\t// Selector - all\n\t\tif ( s === '' ) {\n\t\t\treturn _range( columns.length );\n\t\t}\n\n\t\t// Selector - index\n\t\tif ( selInt !== null ) {\n\t\t\treturn [ selInt >= 0 ?\n\t\t\t\tselInt : // Count from left\n\t\t\t\tcolumns.length + selInt // Count from right (+ because its a negative value)\n\t\t\t];\n\t\t}\n\n\t\t// Selector = function\n\t\tif ( typeof s === 'function' ) {\n\t\t\tvar rows = _selector_row_indexes( settings, opts );\n\n\t\t\treturn $.map( columns, function (col, idx) {\n\t\t\t\treturn s(\n\t\t\t\t\t\tidx,\n\t\t\t\t\t\t__columnData( settings, idx, 0, 0, rows ),\n\t\t\t\t\t\tnodes[ idx ]\n\t\t\t\t\t) ? idx : null;\n\t\t\t} );\n\t\t}\n\n\t\t// jQuery or string selector\n\t\tvar match = typeof s === 'string' ?\n\t\t\ts.match( __re_column_selector ) :\n\t\t\t'';\n\n\t\tif ( match ) {\n\t\t\tswitch( match[2] ) {\n\t\t\t\tcase 'visIdx':\n\t\t\t\tcase 'visible':\n\t\t\t\t\tvar idx = parseInt( match[1], 10 );\n\t\t\t\t\t// Visible index given, convert to column index\n\t\t\t\t\tif ( idx < 0 ) {\n\t\t\t\t\t\t// Counting from the right\n\t\t\t\t\t\tvar visColumns = $.map( columns, function (col,i) {\n\t\t\t\t\t\t\treturn col.bVisible ? i : null;\n\t\t\t\t\t\t} );\n\t\t\t\t\t\treturn [ visColumns[ visColumns.length + idx ] ];\n\t\t\t\t\t}\n\t\t\t\t\t// Counting from the left\n\t\t\t\t\treturn [ _fnVisibleToColumnIndex( settings, idx ) ];\n\n\t\t\t\tcase 'name':\n\t\t\t\t\t// match by name. `names` is column index complete and in order\n\t\t\t\t\treturn $.map( names, function (name, i) {\n\t\t\t\t\t\treturn name === match[1] ? i : null;\n\t\t\t\t\t} );\n\n\t\t\t\tdefault:\n\t\t\t\t\treturn [];\n\t\t\t}\n\t\t}\n\n\t\t// Cell in the table body\n\t\tif ( s.nodeName && s._DT_CellIndex ) {\n\t\t\treturn [ s._DT_CellIndex.column ];\n\t\t}\n\n\t\t// jQuery selector on the TH elements for the columns\n\t\tvar jqResult = $( nodes )\n\t\t\t.filter( s )\n\t\t\t.map( function () {\n\t\t\t\treturn $.inArray( this, nodes ); // `nodes` is column index complete and in order\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise a node which might have a `dt-column` data attribute, or be\n\t\t// a child or such an element\n\t\tvar host = $(s).closest('*[data-dt-column]');\n\t\treturn host.length ?\n\t\t\t[ host.data('dt-column') ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'column', selector, run, settings, opts );\n};\n\n\nvar __setColumnVis = function ( settings, column, vis ) {\n\tvar\n\t\tcols = settings.aoColumns,\n\t\tcol  = cols[ column ],\n\t\tdata = settings.aoData,\n\t\trow, cells, i, ien, tr;\n\n\t// Get\n\tif ( vis === undefined ) {\n\t\treturn col.bVisible;\n\t}\n\n\t// Set\n\t// No change\n\tif ( col.bVisible === vis ) {\n\t\treturn;\n\t}\n\n\tif ( vis ) {\n\t\t// Insert column\n\t\t// Need to decide if we should use appendChild or insertBefore\n\t\tvar insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );\n\n\t\tfor ( i=0, ien=data.length ; i<ien ; i++ ) {\n\t\t\ttr = data[i].nTr;\n\t\t\tcells = data[i].anCells;\n\n\t\t\tif ( tr ) {\n\t\t\t\t// insertBefore can act like appendChild if 2nd arg is null\n\t\t\t\ttr.insertBefore( cells[ column ], cells[ insertBefore ] || null );\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\t// Remove column\n\t\t$( _pluck( settings.aoData, 'anCells', column ) ).detach();\n\t}\n\n\t// Common actions\n\tcol.bVisible = vis;\n};\n\n\n_api_register( 'columns()', function ( selector, opts ) {\n\t// argument shifting\n\tif ( selector === undefined ) {\n\t\tselector = '';\n\t}\n\telse if ( $.isPlainObject( selector ) ) {\n\t\topts = selector;\n\t\tselector = '';\n\t}\n\n\topts = _selector_opts( opts );\n\n\tvar inst = this.iterator( 'table', function ( settings ) {\n\t\treturn __column_selector( settings, selector, opts );\n\t}, 1 );\n\n\t// Want argument shifting here and in _row_selector?\n\tinst.selector.cols = selector;\n\tinst.selector.opts = opts;\n\n\treturn inst;\n} );\n\n_api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTh;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].nTf;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().data()', 'column().data()', function () {\n\treturn this.iterator( 'column-rows', __columnData, 1 );\n} );\n\n_api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn settings.aoColumns[column].mData;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows,\n\t\t\ttype === 'search' ? '_aFilterData' : '_aSortData', column\n\t\t);\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {\n\treturn this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {\n\t\treturn _pluck_order( settings.aoData, rows, 'anCells', column ) ;\n\t}, 1 );\n} );\n\n_api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {\n\tvar that = this;\n\tvar ret = this.iterator( 'column', function ( settings, column ) {\n\t\tif ( vis === undefined ) {\n\t\t\treturn settings.aoColumns[ column ].bVisible;\n\t\t} // else\n\t\t__setColumnVis( settings, column, vis );\n\t} );\n\n\t// Group the column visibility changes\n\tif ( vis !== undefined ) {\n\t\tthis.iterator( 'table', function ( settings ) {\n\t\t\t// Redraw the header after changes\n\t\t\t_fnDrawHead( settings, settings.aoHeader );\n\t\t\t_fnDrawHead( settings, settings.aoFooter );\n\t\n\t\t\t// Update colspan for no records display. Child rows and extensions will use their own\n\t\t\t// listeners to do this - only need to update the empty table item here\n\t\t\tif ( ! settings.aiDisplay.length ) {\n\t\t\t\t$(settings.nTBody).find('td[colspan]').attr('colspan', _fnVisbleColumns(settings));\n\t\t\t}\n\t\n\t\t\t_fnSaveState( settings );\n\n\t\t\t// Second loop once the first is done for events\n\t\t\tthat.iterator( 'column', function ( settings, column ) {\n\t\t\t\t_fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, calc] );\n\t\t\t} );\n\n\t\t\tif ( calc === undefined || calc ) {\n\t\t\t\tthat.columns.adjust();\n\t\t\t}\n\t\t});\n\t}\n\n\treturn ret;\n} );\n\n_api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {\n\treturn this.iterator( 'column', function ( settings, column ) {\n\t\treturn type === 'visible' ?\n\t\t\t_fnColumnIndexToVisible( settings, column ) :\n\t\t\tcolumn;\n\t}, 1 );\n} );\n\n_api_register( 'columns.adjust()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnAdjustColumnSizing( settings );\n\t}, 1 );\n} );\n\n_api_register( 'column.index()', function ( type, idx ) {\n\tif ( this.context.length !== 0 ) {\n\t\tvar ctx = this.context[0];\n\n\t\tif ( type === 'fromVisible' || type === 'toData' ) {\n\t\t\treturn _fnVisibleToColumnIndex( ctx, idx );\n\t\t}\n\t\telse if ( type === 'fromData' || type === 'toVisible' ) {\n\t\t\treturn _fnColumnIndexToVisible( ctx, idx );\n\t\t}\n\t}\n} );\n\n_api_register( 'column()', function ( selector, opts ) {\n\treturn _selector_first( this.columns( selector, opts ) );\n} );\n\nvar __cell_selector = function ( settings, selector, opts )\n{\n\tvar data = settings.aoData;\n\tvar rows = _selector_row_indexes( settings, opts );\n\tvar cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );\n\tvar allCells = $(_flatten( [], cells ));\n\tvar row;\n\tvar columns = settings.aoColumns.length;\n\tvar a, i, ien, j, o, host;\n\n\tvar run = function ( s ) {\n\t\tvar fnSelector = typeof s === 'function';\n\n\t\tif ( s === null || s === undefined || fnSelector ) {\n\t\t\t// All cells and function selectors\n\t\t\ta = [];\n\n\t\t\tfor ( i=0, ien=rows.length ; i<ien ; i++ ) {\n\t\t\t\trow = rows[i];\n\n\t\t\t\tfor ( j=0 ; j<columns ; j++ ) {\n\t\t\t\t\to = {\n\t\t\t\t\t\trow: row,\n\t\t\t\t\t\tcolumn: j\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( fnSelector ) {\n\t\t\t\t\t\t// Selector - function\n\t\t\t\t\t\thost = data[ row ];\n\n\t\t\t\t\t\tif ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {\n\t\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Selector - all\n\t\t\t\t\t\ta.push( o );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn a;\n\t\t}\n\t\t\n\t\t// Selector - index\n\t\tif ( $.isPlainObject( s ) ) {\n\t\t\t// Valid cell index and its in the array of selectable rows\n\t\t\treturn s.column !== undefined && s.row !== undefined && $.inArray( s.row, rows ) !== -1 ?\n\t\t\t\t[s] :\n\t\t\t\t[];\n\t\t}\n\n\t\t// Selector - jQuery filtered cells\n\t\tvar jqResult = allCells\n\t\t\t.filter( s )\n\t\t\t.map( function (i, el) {\n\t\t\t\treturn { // use a new object, in case someone changes the values\n\t\t\t\t\trow:    el._DT_CellIndex.row,\n\t\t\t\t\tcolumn: el._DT_CellIndex.column\n \t\t\t\t};\n\t\t\t} )\n\t\t\t.toArray();\n\n\t\tif ( jqResult.length || ! s.nodeName ) {\n\t\t\treturn jqResult;\n\t\t}\n\n\t\t// Otherwise the selector is a node, and there is one last option - the\n\t\t// element might be a child of an element which has dt-row and dt-column\n\t\t// data attributes\n\t\thost = $(s).closest('*[data-dt-row]');\n\t\treturn host.length ?\n\t\t\t[ {\n\t\t\t\trow: host.data('dt-row'),\n\t\t\t\tcolumn: host.data('dt-column')\n\t\t\t} ] :\n\t\t\t[];\n\t};\n\n\treturn _selector_run( 'cell', selector, run, settings, opts );\n};\n\n\n\n\n_api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {\n\t// Argument shifting\n\tif ( $.isPlainObject( rowSelector ) ) {\n\t\t// Indexes\n\t\tif ( rowSelector.row === undefined ) {\n\t\t\t// Selector options in first parameter\n\t\t\topts = rowSelector;\n\t\t\trowSelector = null;\n\t\t}\n\t\telse {\n\t\t\t// Cell index objects in first parameter\n\t\t\topts = columnSelector;\n\t\t\tcolumnSelector = null;\n\t\t}\n\t}\n\tif ( $.isPlainObject( columnSelector ) ) {\n\t\topts = columnSelector;\n\t\tcolumnSelector = null;\n\t}\n\n\t// Cell selector\n\tif ( columnSelector === null || columnSelector === undefined ) {\n\t\treturn this.iterator( 'table', function ( settings ) {\n\t\t\treturn __cell_selector( settings, rowSelector, _selector_opts( opts ) );\n\t\t} );\n\t}\n\n\t// The default built in options need to apply to row and columns\n\tvar internalOpts = opts ? {\n\t\tpage: opts.page,\n\t\torder: opts.order,\n\t\tsearch: opts.search\n\t} : {};\n\n\t// Row + column selector\n\tvar columns = this.columns( columnSelector, internalOpts );\n\tvar rows = this.rows( rowSelector, internalOpts );\n\tvar i, ien, j, jen;\n\n\tvar cellsNoOpts = this.iterator( 'table', function ( settings, idx ) {\n\t\tvar a = [];\n\n\t\tfor ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {\n\t\t\tfor ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {\n\t\t\t\ta.push( {\n\t\t\t\t\trow:    rows[idx][i],\n\t\t\t\t\tcolumn: columns[idx][j]\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\treturn a;\n\t}, 1 );\n\n\t// There is currently only one extension which uses a cell selector extension\n\t// It is a _major_ performance drag to run this if it isn't needed, so this is\n\t// an extension specific check at the moment\n\tvar cells = opts && opts.selected ?\n\t\tthis.cells( cellsNoOpts, opts ) :\n\t\tcellsNoOpts;\n\n\t$.extend( cells.selector, {\n\t\tcols: columnSelector,\n\t\trows: rowSelector,\n\t\topts: opts\n\t} );\n\n\treturn cells;\n} );\n\n\n_api_registerPlural( 'cells().nodes()', 'cell().node()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\tvar data = settings.aoData[ row ];\n\n\t\treturn data && data.anCells ?\n\t\t\tdata.anCells[ column ] :\n\t\t\tundefined;\n\t}, 1 );\n} );\n\n\n_api_register( 'cells().data()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {\n\ttype = type === 'search' ? '_aFilterData' : '_aSortData';\n\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn settings.aoData[ row ][ type ][ column ];\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn _fnGetCellData( settings, row, column, type );\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().indexes()', 'cell().index()', function () {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\treturn {\n\t\t\trow: row,\n\t\t\tcolumn: column,\n\t\t\tcolumnVisible: _fnColumnIndexToVisible( settings, column )\n\t\t};\n\t}, 1 );\n} );\n\n\n_api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {\n\treturn this.iterator( 'cell', function ( settings, row, column ) {\n\t\t_fnInvalidate( settings, row, src, column );\n\t} );\n} );\n\n\n\n_api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {\n\treturn _selector_first( this.cells( rowSelector, columnSelector, opts ) );\n} );\n\n\n_api_register( 'cell().data()', function ( data ) {\n\tvar ctx = this.context;\n\tvar cell = this[0];\n\n\tif ( data === undefined ) {\n\t\t// Get\n\t\treturn ctx.length && cell.length ?\n\t\t\t_fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :\n\t\t\tundefined;\n\t}\n\n\t// Set\n\t_fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );\n\t_fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );\n\n\treturn this;\n} );\n\n\n\n/**\n * Get current ordering (sorting) that has been applied to the table.\n *\n * @returns {array} 2D array containing the sorting information for the first\n *   table in the current context. Each element in the parent array represents\n *   a column being sorted upon (i.e. multi-sorting with two columns would have\n *   2 inner arrays). The inner arrays may have 2 or 3 elements. The first is\n *   the column index that the sorting condition applies to, the second is the\n *   direction of the sort (`desc` or `asc`) and, optionally, the third is the\n *   index of the sorting order from the `column.sorting` initialisation array.\n *//**\n * Set the ordering for the table.\n *\n * @param {integer} order Column index to sort upon.\n * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 1D array of sorting information to be applied.\n * @param {array} [...] Optional additional sorting conditions\n * @returns {DataTables.Api} this\n *//**\n * Set the ordering for the table.\n *\n * @param {array} order 2D array of sorting information to be applied.\n * @returns {DataTables.Api} this\n */\n_api_register( 'order()', function ( order, dir ) {\n\tvar ctx = this.context;\n\n\tif ( order === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].aaSorting :\n\t\t\tundefined;\n\t}\n\n\t// set\n\tif ( typeof order === 'number' ) {\n\t\t// Simple column / direction passed in\n\t\torder = [ [ order, dir ] ];\n\t}\n\telse if ( order.length && ! Array.isArray( order[0] ) ) {\n\t\t// Arguments passed in (list of 1D arrays)\n\t\torder = Array.prototype.slice.call( arguments );\n\t}\n\t// otherwise a 2D array was passed in\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSorting = order.slice();\n\t} );\n} );\n\n\n/**\n * Attach a sort listener to an element for a given column\n *\n * @param {node|jQuery|string} node Identifier for the element(s) to attach the\n *   listener to. This can take the form of a single DOM node, a jQuery\n *   collection of nodes or a jQuery selector which will identify the node(s).\n * @param {integer} column the column that a click on this node will sort on\n * @param {function} [callback] callback function when sort is run\n * @returns {DataTables.Api} this\n */\n_api_register( 'order.listener()', function ( node, column, callback ) {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSortAttachListener( settings, node, column, callback );\n\t} );\n} );\n\n\n_api_register( 'order.fixed()', function ( set ) {\n\tif ( ! set ) {\n\t\tvar ctx = this.context;\n\t\tvar fixed = ctx.length ?\n\t\t\tctx[0].aaSortingFixed :\n\t\t\tundefined;\n\n\t\treturn Array.isArray( fixed ) ?\n\t\t\t{ pre: fixed } :\n\t\t\tfixed;\n\t}\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tsettings.aaSortingFixed = $.extend( true, {}, set );\n\t} );\n} );\n\n\n// Order by the selected column(s)\n_api_register( [\n\t'columns().order()',\n\t'column().order()'\n], function ( dir ) {\n\tvar that = this;\n\n\treturn this.iterator( 'table', function ( settings, i ) {\n\t\tvar sort = [];\n\n\t\t$.each( that[i], function (j, col) {\n\t\t\tsort.push( [ col, dir ] );\n\t\t} );\n\n\t\tsettings.aaSorting = sort;\n\t} );\n} );\n\n\n\n_api_register( 'search()', function ( input, regex, smart, caseInsen ) {\n\tvar ctx = this.context;\n\n\tif ( input === undefined ) {\n\t\t// get\n\t\treturn ctx.length !== 0 ?\n\t\t\tctx[0].oPreviousSearch.sSearch :\n\t\t\tundefined;\n\t}\n\n\t// set\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\treturn;\n\t\t}\n\n\t\t_fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {\n\t\t\t\"sSearch\": input+\"\",\n\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t} ), 1 );\n\t} );\n} );\n\n\n_api_registerPlural(\n\t'columns().search()',\n\t'column().search()',\n\tfunction ( input, regex, smart, caseInsen ) {\n\t\treturn this.iterator( 'column', function ( settings, column ) {\n\t\t\tvar preSearch = settings.aoPreSearchCols;\n\n\t\t\tif ( input === undefined ) {\n\t\t\t\t// get\n\t\t\t\treturn preSearch[ column ].sSearch;\n\t\t\t}\n\n\t\t\t// set\n\t\t\tif ( ! settings.oFeatures.bFilter ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$.extend( preSearch[ column ], {\n\t\t\t\t\"sSearch\": input+\"\",\n\t\t\t\t\"bRegex\":  regex === null ? false : regex,\n\t\t\t\t\"bSmart\":  smart === null ? true  : smart,\n\t\t\t\t\"bCaseInsensitive\": caseInsen === null ? true : caseInsen\n\t\t\t} );\n\n\t\t\t_fnFilterComplete( settings, settings.oPreviousSearch, 1 );\n\t\t} );\n\t}\n);\n\n/*\n * State API methods\n */\n\n_api_register( 'state()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oSavedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t// Save an empty object\n\t\tsettings.fnStateSaveCallback.call( settings.oInstance, settings, {} );\n\t} );\n} );\n\n\n_api_register( 'state.loaded()', function () {\n\treturn this.context.length ?\n\t\tthis.context[0].oLoadedState :\n\t\tnull;\n} );\n\n\n_api_register( 'state.save()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnSaveState( settings );\n\t} );\n} );\n\n\n\n/**\n * Set the jQuery or window object to be used by DataTables\n *\n * @param {*} module Library / container object\n * @param {string} type Library or container type `lib` or `win`.\n */\nDataTable.use = function (module, type) {\n\tif (type === 'lib' || module.fn) {\n\t\t$ = module;\n\t}\n\telse if (type == 'win' || module.document) {\n\t\twindow = module;\n\t\tdocument = module.document;\n\t}\n}\n\n/**\n * CommonJS factory function pass through. This will check if the arguments\n * given are a window object or a jQuery object. If so they are set\n * accordingly.\n * @param {*} root Window\n * @param {*} jq jQUery\n * @returns {boolean} Indicator\n */\nDataTable.factory = function (root, jq) {\n\tvar is = false;\n\n\t// Test if the first parameter is a window object\n\tif (root && root.document) {\n\t\twindow = root;\n\t\tdocument = root.document;\n\t}\n\n\t// Test if the second parameter is a jQuery object\n\tif (jq && jq.fn && jq.fn.jquery) {\n\t\t$ = jq;\n\t\tis = true;\n\t}\n\n\treturn is;\n}\n\n/**\n * Provide a common method for plug-ins to check the version of DataTables being\n * used, in order to ensure compatibility.\n *\n *  @param {string} version Version string to check for, in the format \"X.Y.Z\".\n *    Note that the formats \"X\" and \"X.Y\" are also acceptable.\n *  @returns {boolean} true if this version of DataTables is greater or equal to\n *    the required version, or false if this version of DataTales is not\n *    suitable\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    alert( $.fn.dataTable.versionCheck( '1.9.0' ) );\n */\nDataTable.versionCheck = DataTable.fnVersionCheck = function( version )\n{\n\tvar aThis = DataTable.version.split('.');\n\tvar aThat = version.split('.');\n\tvar iThis, iThat;\n\n\tfor ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {\n\t\tiThis = parseInt( aThis[i], 10 ) || 0;\n\t\tiThat = parseInt( aThat[i], 10 ) || 0;\n\n\t\t// Parts are the same, keep comparing\n\t\tif (iThis === iThat) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Parts are different, return immediately\n\t\treturn iThis > iThat;\n\t}\n\n\treturn true;\n};\n\n\n/**\n * Check if a `<table>` node is a DataTable table already or not.\n *\n *  @param {node|jquery|string} table Table node, jQuery object or jQuery\n *      selector for the table to test. Note that if more than more than one\n *      table is passed on, only the first will be checked\n *  @returns {boolean} true the table given is a DataTable, or false otherwise\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {\n *      $('#example').dataTable();\n *    }\n */\nDataTable.isDataTable = DataTable.fnIsDataTable = function ( table )\n{\n\tvar t = $(table).get(0);\n\tvar is = false;\n\n\tif ( table instanceof DataTable.Api ) {\n\t\treturn true;\n\t}\n\n\t$.each( DataTable.settings, function (i, o) {\n\t\tvar head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;\n\t\tvar foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;\n\n\t\tif ( o.nTable === t || head === t || foot === t ) {\n\t\t\tis = true;\n\t\t}\n\t} );\n\n\treturn is;\n};\n\n\n/**\n * Get all DataTable tables that have been initialised - optionally you can\n * select to get only currently visible tables.\n *\n *  @param {boolean} [visible=false] Flag to indicate if you want all (default)\n *    or visible tables only.\n *  @returns {array} Array of `table` nodes (not DataTable instances) which are\n *    DataTables\n *  @static\n *  @dtopt API-Static\n *\n *  @example\n *    $.each( $.fn.dataTable.tables(true), function () {\n *      $(table).DataTable().columns.adjust();\n *    } );\n */\nDataTable.tables = DataTable.fnTables = function ( visible )\n{\n\tvar api = false;\n\n\tif ( $.isPlainObject( visible ) ) {\n\t\tapi = visible.api;\n\t\tvisible = visible.visible;\n\t}\n\n\tvar a = $.map( DataTable.settings, function (o) {\n\t\tif ( !visible || (visible && $(o.nTable).is(':visible')) ) {\n\t\t\treturn o.nTable;\n\t\t}\n\t} );\n\n\treturn api ?\n\t\tnew _Api( a ) :\n\t\ta;\n};\n\n\n/**\n * Convert from camel case parameters to Hungarian notation. This is made public\n * for the extensions to provide the same ability as DataTables core to accept\n * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase\n * parameters.\n *\n *  @param {object} src The model object which holds all parameters that can be\n *    mapped.\n *  @param {object} user The object to convert from camel case to Hungarian.\n *  @param {boolean} force When set to `true`, properties which already have a\n *    Hungarian value in the `user` object will be overwritten. Otherwise they\n *    won't be.\n */\nDataTable.camelToHungarian = _fnCamelToHungarian;\n\n\n\n/**\n *\n */\n_api_register( '$()', function ( selector, opts ) {\n\tvar\n\t\trows   = this.rows( opts ).nodes(), // Get all rows\n\t\tjqRows = $(rows);\n\n\treturn $( [].concat(\n\t\tjqRows.filter( selector ).toArray(),\n\t\tjqRows.find( selector ).toArray()\n\t) );\n} );\n\n\n// jQuery functions to operate on the tables\n$.each( [ 'on', 'one', 'off' ], function (i, key) {\n\t_api_register( key+'()', function ( /* event, handler */ ) {\n\t\tvar args = Array.prototype.slice.call(arguments);\n\n\t\t// Add the `dt` namespace automatically if it isn't already present\n\t\targs[0] = $.map( args[0].split( /\\s/ ), function ( e ) {\n\t\t\treturn ! e.match(/\\.dt\\b/) ?\n\t\t\t\te+'.dt' :\n\t\t\t\te;\n\t\t\t} ).join( ' ' );\n\n\t\tvar inst = $( this.tables().nodes() );\n\t\tinst[key].apply( inst, args );\n\t\treturn this;\n\t} );\n} );\n\n\n_api_register( 'clear()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\t_fnClearTable( settings );\n\t} );\n} );\n\n\n_api_register( 'settings()', function () {\n\treturn new _Api( this.context, this.context );\n} );\n\n\n_api_register( 'init()', function () {\n\tvar ctx = this.context;\n\treturn ctx.length ? ctx[0].oInit : null;\n} );\n\n\n_api_register( 'data()', function () {\n\treturn this.iterator( 'table', function ( settings ) {\n\t\treturn _pluck( settings.aoData, '_aData' );\n\t} ).flatten();\n} );\n\n\n_api_register( 'destroy()', function ( remove ) {\n\tremove = remove || false;\n\n\treturn this.iterator( 'table', function ( settings ) {\n\t\tvar classes   = settings.oClasses;\n\t\tvar table     = settings.nTable;\n\t\tvar tbody     = settings.nTBody;\n\t\tvar thead     = settings.nTHead;\n\t\tvar tfoot     = settings.nTFoot;\n\t\tvar jqTable   = $(table);\n\t\tvar jqTbody   = $(tbody);\n\t\tvar jqWrapper = $(settings.nTableWrapper);\n\t\tvar rows      = $.map( settings.aoData, function (r) { return r.nTr; } );\n\t\tvar i, ien;\n\n\t\t// Flag to note that the table is currently being destroyed - no action\n\t\t// should be taken\n\t\tsettings.bDestroying = true;\n\n\t\t// Fire off the destroy callbacks for plug-ins etc\n\t\t_fnCallbackFire( settings, \"aoDestroyCallback\", \"destroy\", [settings] );\n\n\t\t// If not being removed from the document, make all columns visible\n\t\tif ( ! remove ) {\n\t\t\tnew _Api( settings ).columns().visible( true );\n\t\t}\n\n\t\t// Blitz all `DT` namespaced events (these are internal events, the\n\t\t// lowercase, `dt` events are user subscribed and they are responsible\n\t\t// for removing them\n\t\tjqWrapper.off('.DT').find(':not(tbody *)').off('.DT');\n\t\t$(window).off('.DT-'+settings.sInstance);\n\n\t\t// When scrolling we had to break the table up - restore it\n\t\tif ( table != thead.parentNode ) {\n\t\t\tjqTable.children('thead').detach();\n\t\t\tjqTable.append( thead );\n\t\t}\n\n\t\tif ( tfoot && table != tfoot.parentNode ) {\n\t\t\tjqTable.children('tfoot').detach();\n\t\t\tjqTable.append( tfoot );\n\t\t}\n\n\t\tsettings.aaSorting = [];\n\t\tsettings.aaSortingFixed = [];\n\t\t_fnSortingClasses( settings );\n\n\t\t$( rows ).removeClass( settings.asStripeClasses.join(' ') );\n\n\t\t$('th, td', thead).removeClass( classes.sSortable+' '+\n\t\t\tclasses.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone\n\t\t);\n\n\t\t// Add the TR elements back into the table in their original order\n\t\tjqTbody.children().detach();\n\t\tjqTbody.append( rows );\n\n\t\tvar orig = settings.nTableWrapper.parentNode;\n\n\t\t// Remove the DataTables generated nodes, events and classes\n\t\tvar removedMethod = remove ? 'remove' : 'detach';\n\t\tjqTable[ removedMethod ]();\n\t\tjqWrapper[ removedMethod ]();\n\n\t\t// If we need to reattach the table to the document\n\t\tif ( ! remove && orig ) {\n\t\t\t// insertBefore acts like appendChild if !arg[1]\n\t\t\torig.insertBefore( table, settings.nTableReinsertBefore );\n\n\t\t\t// Restore the width of the original table - was read from the style property,\n\t\t\t// so we can restore directly to that\n\t\t\tjqTable\n\t\t\t\t.css( 'width', settings.sDestroyWidth )\n\t\t\t\t.removeClass( classes.sTable );\n\n\t\t\t// If the were originally stripe classes - then we add them back here.\n\t\t\t// Note this is not fool proof (for example if not all rows had stripe\n\t\t\t// classes - but it's a good effort without getting carried away\n\t\t\tien = settings.asDestroyStripes.length;\n\n\t\t\tif ( ien ) {\n\t\t\t\tjqTbody.children().each( function (i) {\n\t\t\t\t\t$(this).addClass( settings.asDestroyStripes[i % ien] );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\n\t\t/* Remove the settings object from the settings array */\n\t\tvar idx = $.inArray( settings, DataTable.settings );\n\t\tif ( idx !== -1 ) {\n\t\t\tDataTable.settings.splice( idx, 1 );\n\t\t}\n\t} );\n} );\n\n\n// Add the `every()` method for rows, columns and cells in a compact form\n$.each( [ 'column', 'row', 'cell' ], function ( i, type ) {\n\t_api_register( type+'s().every()', function ( fn ) {\n\t\tvar opts = this.selector.opts;\n\t\tvar api = this;\n\n\t\treturn this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {\n\t\t\t// Rows and columns:\n\t\t\t//  arg1 - index\n\t\t\t//  arg2 - table counter\n\t\t\t//  arg3 - loop counter\n\t\t\t//  arg4 - undefined\n\t\t\t// Cells:\n\t\t\t//  arg1 - row index\n\t\t\t//  arg2 - column index\n\t\t\t//  arg3 - table counter\n\t\t\t//  arg4 - loop counter\n\t\t\tfn.call(\n\t\t\t\tapi[ type ](\n\t\t\t\t\targ1,\n\t\t\t\t\ttype==='cell' ? arg2 : opts,\n\t\t\t\t\ttype==='cell' ? opts : undefined\n\t\t\t\t),\n\t\t\t\targ1, arg2, arg3, arg4\n\t\t\t);\n\t\t} );\n\t} );\n} );\n\n\n// i18n method for extensions to be able to use the language object from the\n// DataTable\n_api_register( 'i18n()', function ( token, def, plural ) {\n\tvar ctx = this.context[0];\n\tvar resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );\n\n\tif ( resolved === undefined ) {\n\t\tresolved = def;\n\t}\n\n\tif ( plural !== undefined && $.isPlainObject( resolved ) ) {\n\t\tresolved = resolved[ plural ] !== undefined ?\n\t\t\tresolved[ plural ] :\n\t\t\tresolved._;\n\t}\n\n\treturn resolved.replace( '%d', plural ); // nb: plural might be undefined,\n} );\n/**\n * Version string for plug-ins to check compatibility. Allowed format is\n * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used\n * only for non-release builds. See http://semver.org/ for more information.\n *  @member\n *  @type string\n *  @default Version number\n */\nDataTable.version = \"1.13.4\";\n\n/**\n * Private data store, containing all of the settings objects that are\n * created for the tables on a given page.\n *\n * Note that the `DataTable.settings` object is aliased to\n * `jQuery.fn.dataTableExt` through which it may be accessed and\n * manipulated, or `jQuery.fn.dataTable.settings`.\n *  @member\n *  @type array\n *  @default []\n *  @private\n */\nDataTable.settings = [];\n\n/**\n * Object models container, for the various models that DataTables has\n * available to it. These models define the objects that are used to hold\n * the active state and configuration of the table.\n *  @namespace\n */\nDataTable.models = {};\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * search information for the global filter and individual column filters.\n *  @namespace\n */\nDataTable.models.oSearch = {\n\t/**\n\t * Flag to indicate if the filtering should be case insensitive or not\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bCaseInsensitive\": true,\n\n\t/**\n\t * Applied search term\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sSearch\": \"\",\n\n\t/**\n\t * Flag to indicate if the search term should be interpreted as a\n\t * regular expression (true) or not (false) and therefore and special\n\t * regex characters escaped.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bRegex\": false,\n\n\t/**\n\t * Flag to indicate if DataTables is to use its smart filtering or not.\n\t *  @type boolean\n\t *  @default true\n\t */\n\t\"bSmart\": true,\n\n\t/**\n\t * Flag to indicate if DataTables should only trigger a search when\n\t * the return key is pressed.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"return\": false\n};\n\n\n\n\n/**\n * Template object for the way in which DataTables holds information about\n * each individual row. This is the object format used for the settings\n * aoData array.\n *  @namespace\n */\nDataTable.models.oRow = {\n\t/**\n\t * TR element for the row\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTr\": null,\n\n\t/**\n\t * Array of TD elements for each row. This is null until the row has been\n\t * created.\n\t *  @type array nodes\n\t *  @default []\n\t */\n\t\"anCells\": null,\n\n\t/**\n\t * Data object from the original data source for the row. This is either\n\t * an array if using the traditional form of DataTables, or an object if\n\t * using mData options. The exact type will depend on the passed in\n\t * data from the data source, or will be an array if using DOM a data\n\t * source.\n\t *  @type array|object\n\t *  @default []\n\t */\n\t\"_aData\": [],\n\n\t/**\n\t * Sorting data cache - this array is ostensibly the same length as the\n\t * number of columns (although each index is generated only as it is\n\t * needed), and holds the data that is used for sorting each column in the\n\t * row. We do this cache generation at the start of the sort in order that\n\t * the formatting of the sort data need be done only once for each cell\n\t * per sort. This array should not be read from or written to by anything\n\t * other than the master sorting methods.\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aSortData\": null,\n\n\t/**\n\t * Per cell filtering data cache. As per the sort data cache, used to\n\t * increase the performance of the filtering in DataTables\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_aFilterData\": null,\n\n\t/**\n\t * Filtering data cache. This is the same as the cell filtering cache, but\n\t * in this case a string rather than an array. This is easily computed with\n\t * a join on `_aFilterData`, but is provided as a cache so the join isn't\n\t * needed on every search (memory traded for performance)\n\t *  @type array\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sFilterRow\": null,\n\n\t/**\n\t * Cache of the class name that DataTables has applied to the row, so we\n\t * can quickly look at this variable rather than needing to do a DOM check\n\t * on className for the nTr property.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *  @private\n\t */\n\t\"_sRowStripe\": \"\",\n\n\t/**\n\t * Denote if the original data source was from the DOM, or the data source\n\t * object. This is used for invalidating data, so DataTables can\n\t * automatically read data from the original source, unless uninstructed\n\t * otherwise.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"src\": null,\n\n\t/**\n\t * Index in the aoData array. This saves an indexOf lookup when we have the\n\t * object, but want to know the index\n\t *  @type integer\n\t *  @default -1\n\t *  @private\n\t */\n\t\"idx\": -1\n};\n\n\n/**\n * Template object for the column information object in DataTables. This object\n * is held in the settings aoColumns array and contains all the information that\n * DataTables needs about each individual column.\n *\n * Note that this object is related to {@link DataTable.defaults.column}\n * but this one is the internal data store for DataTables's cache of columns.\n * It should NOT be manipulated outside of DataTables. Any configuration should\n * be done through the initialisation options.\n *  @namespace\n */\nDataTable.models.oColumn = {\n\t/**\n\t * Column index. This could be worked out on-the-fly with $.inArray, but it\n\t * is faster to just hold it as a variable\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"idx\": null,\n\n\t/**\n\t * A list of the columns that sorting should occur on when this column\n\t * is sorted. That this property is an array allows multi-column sorting\n\t * to be defined for a column (for example first name / last name columns\n\t * would benefit from this). The values are integers pointing to the\n\t * columns to be sorted on (typically it will be a single integer pointing\n\t * at itself, but that doesn't need to be the case).\n\t *  @type array\n\t */\n\t\"aDataSort\": null,\n\n\t/**\n\t * Define the sorting directions that are applied to the column, in sequence\n\t * as the column is repeatedly sorted upon - i.e. the first value is used\n\t * as the sorting direction when the column if first sorted (clicked on).\n\t * Sort it again (click again) and it will move on to the next index.\n\t * Repeat until loop.\n\t *  @type array\n\t */\n\t\"asSorting\": null,\n\n\t/**\n\t * Flag to indicate if the column is searchable, and thus should be included\n\t * in the filtering or not.\n\t *  @type boolean\n\t */\n\t\"bSearchable\": null,\n\n\t/**\n\t * Flag to indicate if the column is sortable or not.\n\t *  @type boolean\n\t */\n\t\"bSortable\": null,\n\n\t/**\n\t * Flag to indicate if the column is currently visible in the table or not\n\t *  @type boolean\n\t */\n\t\"bVisible\": null,\n\n\t/**\n\t * Store for manual type assignment using the `column.type` option. This\n\t * is held in store so we can manipulate the column's `sType` property.\n\t *  @type string\n\t *  @default null\n\t *  @private\n\t */\n\t\"_sManualType\": null,\n\n\t/**\n\t * Flag to indicate if HTML5 data attributes should be used as the data\n\t * source for filtering or sorting. True is either are.\n\t *  @type boolean\n\t *  @default false\n\t *  @private\n\t */\n\t\"_bAttrSrc\": false,\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} nTd The TD node that has been created\n\t *  @param {*} sData The Data for the cell\n\t *  @param {array|object} oData The data for the whole row\n\t *  @param {int} iRow The row index for the aoData data store\n\t *  @default null\n\t */\n\t\"fnCreatedCell\": null,\n\n\t/**\n\t * Function to get data from a cell in a column. You should <b>never</b>\n\t * access data directly through _aData internally in DataTables - always use\n\t * the method attached to this property. It allows mData to function as\n\t * required. This function is automatically assigned by the column\n\t * initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {string} sSpecific The specific data type you want to get -\n\t *    'display', 'type' 'filter' 'sort'\n\t *  @returns {*} The data for the cell from the given row's data\n\t *  @default null\n\t */\n\t\"fnGetData\": null,\n\n\t/**\n\t * Function to set data for a cell in the column. You should <b>never</b>\n\t * set the data directly to _aData internally in DataTables - always use\n\t * this method. It allows mData to function as required. This function\n\t * is automatically assigned by the column initialisation method\n\t *  @type function\n\t *  @param {array|object} oData The data array/object for the array\n\t *    (i.e. aoData[]._aData)\n\t *  @param {*} sValue Value to set\n\t *  @default null\n\t */\n\t\"fnSetData\": null,\n\n\t/**\n\t * Property to read the value for the cells in the column from the data\n\t * source array / object. If null, then the default content is used, if a\n\t * function is given then the return from the function is used.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mData\": null,\n\n\t/**\n\t * Partner property to mData which is used (only when defined) to get\n\t * the data - i.e. it is basically the same as mData, but without the\n\t * 'set' option, and also the data fed to it is the result from mData.\n\t * This is the rendering method to match the data method of mData.\n\t *  @type function|int|string|null\n\t *  @default null\n\t */\n\t\"mRender\": null,\n\n\t/**\n\t * Unique header TH/TD element for this column - this is what the sorting\n\t * listener is attached to (if sorting is enabled.)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTh\": null,\n\n\t/**\n\t * Unique footer TH/TD element for this column (if there is one). Not used\n\t * in DataTables as such, but can be used for plug-ins to reference the\n\t * footer for each column.\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTf\": null,\n\n\t/**\n\t * The class to apply to all TD elements in the table's TBODY for the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sClass\": null,\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t *  @type string\n\t */\n\t\"sContentPadding\": null,\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because mData\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDefaultContent\": null,\n\n\t/**\n\t * Name for the column, allowing reference to the column by name as well as\n\t * by index (needs a lookup to work by name).\n\t *  @type string\n\t */\n\t\"sName\": null,\n\n\t/**\n\t * Custom sorting data type - defines which of the available plug-ins in\n\t * afnSortData the custom sorting will use - if any is defined.\n\t *  @type string\n\t *  @default std\n\t */\n\t\"sSortDataType\": 'std',\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClass\": null,\n\n\t/**\n\t * Class to be applied to the header element when sorting on this column -\n\t * when jQuery UI theming is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sSortingClassJUI\": null,\n\n\t/**\n\t * Title of the column - what is seen in the TH element (nTh).\n\t *  @type string\n\t */\n\t\"sTitle\": null,\n\n\t/**\n\t * Column sorting and filtering type\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sType\": null,\n\n\t/**\n\t * Width of the column\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidth\": null,\n\n\t/**\n\t * Width of the column when it was first \"encountered\"\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sWidthOrig\": null\n};\n\n\n/*\n * Developer note: The properties of the object below are given in Hungarian\n * notation, that was used as the interface for DataTables prior to v1.10, however\n * from v1.10 onwards the primary interface is camel case. In order to avoid\n * breaking backwards compatibility utterly with this change, the Hungarian\n * version is still, internally the primary interface, but is is not documented\n * - hence the @name tags in each doc comment. This allows a Javascript function\n * to create a map from Hungarian notation to camel case (going the other direction\n * would require each property to be listed, which would add around 3K to the size\n * of DataTables, while this method is about a 0.5K hit).\n *\n * Ultimately this does pave the way for Hungarian notation to be dropped\n * completely, but that is a massive amount of work and will break current\n * installs (therefore is on-hold until v2).\n */\n\n/**\n * Initialisation options that can be given to DataTables at initialisation\n * time.\n *  @namespace\n */\nDataTable.defaults = {\n\t/**\n\t * An array of data to use for the table, passed in at initialisation which\n\t * will be used in preference to any data which is already in the DOM. This is\n\t * particularly useful for constructing tables purely in Javascript, for\n\t * example with a custom Ajax call.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.data\n\t *\n\t *  @example\n\t *    // Using a 2D array data source\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],\n\t *          ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\" },\n\t *          { \"title\": \"Browser\" },\n\t *          { \"title\": \"Platform\" },\n\t *          { \"title\": \"Version\" },\n\t *          { \"title\": \"Grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using an array of objects as a data source (`data`)\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"data\": [\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 4.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  4,\n\t *            \"grade\":    \"X\"\n\t *          },\n\t *          {\n\t *            \"engine\":   \"Trident\",\n\t *            \"browser\":  \"Internet Explorer 5.0\",\n\t *            \"platform\": \"Win 95+\",\n\t *            \"version\":  5,\n\t *            \"grade\":    \"C\"\n\t *          }\n\t *        ],\n\t *        \"columns\": [\n\t *          { \"title\": \"Engine\",   \"data\": \"engine\" },\n\t *          { \"title\": \"Browser\",  \"data\": \"browser\" },\n\t *          { \"title\": \"Platform\", \"data\": \"platform\" },\n\t *          { \"title\": \"Version\",  \"data\": \"version\" },\n\t *          { \"title\": \"Grade\",    \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aaData\": null,\n\n\n\t/**\n\t * If ordering is enabled, then DataTables will perform a first pass sort on\n\t * initialisation. You can define which column(s) the sort is performed\n\t * upon, and the sorting direction, with this variable. The `sorting` array\n\t * should contain an array for each column to be sorted initially containing\n\t * the column's index and a direction string ('asc' or 'desc').\n\t *  @type array\n\t *  @default [[0,'asc']]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.order\n\t *\n\t *  @example\n\t *    // Sort by 3rd column first, and then 4th column\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": [[2,'asc'], [3,'desc']]\n\t *      } );\n\t *    } );\n\t *\n\t *    // No initial sorting\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"order\": []\n\t *      } );\n\t *    } );\n\t */\n\t\"aaSorting\": [[0,'asc']],\n\n\n\t/**\n\t * This parameter is basically identical to the `sorting` parameter, but\n\t * cannot be overridden by user interaction with the table. What this means\n\t * is that you could have a column (visible or hidden) which the sorting\n\t * will always be forced on first - any sorting after that (from the user)\n\t * will then be performed as required. This can be useful for grouping rows\n\t * together.\n\t *  @type array\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.orderFixed\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderFixed\": [[0,'asc']]\n\t *      } );\n\t *    } )\n\t */\n\t\"aaSortingFixed\": [],\n\n\n\t/**\n\t * DataTables can be instructed to load data to display in the table from a\n\t * Ajax source. This option defines how that Ajax call is made and where to.\n\t *\n\t * The `ajax` property has three different modes of operation, depending on\n\t * how it is defined. These are:\n\t *\n\t * * `string` - Set the URL from where the data should be loaded from.\n\t * * `object` - Define properties for `jQuery.ajax`.\n\t * * `function` - Custom data get function\n\t *\n\t * `string`\n\t * --------\n\t *\n\t * As a string, the `ajax` property simply defines the URL from which\n\t * DataTables will load data.\n\t *\n\t * `object`\n\t * --------\n\t *\n\t * As an object, the parameters in the object are passed to\n\t * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control\n\t * of the Ajax request. DataTables has a number of default parameters which\n\t * you can override using this option. Please refer to the jQuery\n\t * documentation for a full description of the options available, although\n\t * the following parameters provide additional options in DataTables or\n\t * require special consideration:\n\t *\n\t * * `data` - As with jQuery, `data` can be provided as an object, but it\n\t *   can also be used as a function to manipulate the data DataTables sends\n\t *   to the server. The function takes a single parameter, an object of\n\t *   parameters with the values that DataTables has readied for sending. An\n\t *   object may be returned which will be merged into the DataTables\n\t *   defaults, or you can add the items to the object that was passed in and\n\t *   not return anything from the function. This supersedes `fnServerParams`\n\t *   from DataTables 1.9-.\n\t *\n\t * * `dataSrc` - By default DataTables will look for the property `data` (or\n\t *   `aaData` for compatibility with DataTables 1.9-) when obtaining data\n\t *   from an Ajax source or for server-side processing - this parameter\n\t *   allows that property to be changed. You can use Javascript dotted\n\t *   object notation to get a data source for multiple levels of nesting, or\n\t *   it my be used as a function. As a function it takes a single parameter,\n\t *   the JSON returned from the server, which can be manipulated as\n\t *   required, with the returned value being that used by DataTables as the\n\t *   data source for the table. This supersedes `sAjaxDataProp` from\n\t *   DataTables 1.9-.\n\t *\n\t * * `success` - Should not be overridden it is used internally in\n\t *   DataTables. To manipulate / transform the data returned by the server\n\t *   use `ajax.dataSrc`, or use `ajax` as a function (see below).\n\t *\n\t * `function`\n\t * ----------\n\t *\n\t * As a function, making the Ajax call is left up to yourself allowing\n\t * complete control of the Ajax request. Indeed, if desired, a method other\n\t * than Ajax could be used to obtain the required data, such as Web storage\n\t * or an AIR database.\n\t *\n\t * The function is given four parameters and no return is required. The\n\t * parameters are:\n\t *\n\t * 1. _object_ - Data to send to the server\n\t * 2. _function_ - Callback function that must be executed when the required\n\t *    data has been obtained. That data should be passed into the callback\n\t *    as the only parameter\n\t * 3. _object_ - DataTables settings object for the table\n\t *\n\t * Note that this supersedes `fnServerData` from DataTables 1.9-.\n\t *\n\t *  @type string|object|function\n\t *  @default null\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.ajax\n\t *  @since 1.10.0\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax.\n\t *   // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": \"data.json\"\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to change\n\t *   // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"tableData\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get JSON data from a file via Ajax, using `dataSrc` to read data\n\t *   // from a plain array rather than an array in an object\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": \"\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Manipulate the data returned from the server - add a link to data\n\t *   // (note this can, should, be done using `render` for the column - this\n\t *   // is just a simple example of how the data can be manipulated).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"dataSrc\": function ( json ) {\n\t *         for ( var i=0, ien=json.length ; i<ien ; i++ ) {\n\t *           json[i][0] = '<a href=\"/message/'+json[i][0]+'>View message</a>';\n\t *         }\n\t *         return json;\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Add data to the request\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"data\": function ( d ) {\n\t *         return {\n\t *           \"extra_search\": $('#extra').val()\n\t *         };\n\t *       }\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Send request as POST\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": {\n\t *       \"url\": \"data.json\",\n\t *       \"type\": \"POST\"\n\t *     }\n\t *   } );\n\t *\n\t * @example\n\t *   // Get the data from localStorage (could interface with a form for\n\t *   // adding, editing and removing rows).\n\t *   $('#example').dataTable( {\n\t *     \"ajax\": function (data, callback, settings) {\n\t *       callback(\n\t *         JSON.parse( localStorage.getItem('dataTablesData') )\n\t *       );\n\t *     }\n\t *   } );\n\t */\n\t\"ajax\": null,\n\n\n\t/**\n\t * This parameter allows you to readily specify the entries in the length drop\n\t * down menu that DataTables shows when pagination is enabled. It can be\n\t * either a 1D array of options which will be used for both the displayed\n\t * option and the value, or a 2D array which will use the array in the first\n\t * position as the value, and the array in the second position as the\n\t * displayed options (useful for language strings such as 'All').\n\t *\n\t * Note that the `pageLength` property will be automatically set to the\n\t * first value given in this array, unless `pageLength` is also provided.\n\t *  @type array\n\t *  @default [ 10, 25, 50, 100 ]\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.lengthMenu\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"lengthMenu\": [[10, 25, 50, -1], [10, 25, 50, \"All\"]]\n\t *      } );\n\t *    } );\n\t */\n\t\"aLengthMenu\": [ 10, 25, 50, 100 ],\n\n\n\t/**\n\t * The `columns` option in the initialisation parameter allows you to define\n\t * details about the way individual columns behave. For a full list of\n\t * column options that can be set, please see\n\t * {@link DataTable.defaults.column}. Note that if you use `columns` to\n\t * define your columns, you must have an entry in the array for every single\n\t * column that you have in your table (these can be null if you don't which\n\t * to specify any options).\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.column\n\t */\n\t\"aoColumns\": null,\n\n\t/**\n\t * Very similar to `columns`, `columnDefs` allows you to target a specific\n\t * column, multiple columns, or all columns, using the `targets` property of\n\t * each object in the array. This allows great flexibility when creating\n\t * tables, as the `columnDefs` arrays can be of any length, targeting the\n\t * columns you specifically want. `columnDefs` may use any of the column\n\t * options available: {@link DataTable.defaults.column}, but it _must_\n\t * have `targets` defined in each object in the array. Values in the `targets`\n\t * array may be:\n\t *   <ul>\n\t *     <li>a string - class name will be matched on the TH for the column</li>\n\t *     <li>0 or a positive integer - column index counting from the left</li>\n\t *     <li>a negative integer - column index counting from the right</li>\n\t *     <li>the string \"_all\" - all columns (i.e. assign a default)</li>\n\t *   </ul>\n\t *  @member\n\t *\n\t *  @name DataTable.defaults.columnDefs\n\t */\n\t\"aoColumnDefs\": null,\n\n\n\t/**\n\t * Basically the same as `search`, this parameter defines the individual column\n\t * filtering state at initialisation time. The array must be of the same size\n\t * as the number of columns, and each element be an object with the parameters\n\t * `search` and `escapeRegex` (the latter is optional). 'null' is also\n\t * accepted and the default will be used.\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.searchCols\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchCols\": [\n\t *          null,\n\t *          { \"search\": \"My filter\" },\n\t *          null,\n\t *          { \"search\": \"^[0-9]\", \"escapeRegex\": false }\n\t *        ]\n\t *      } );\n\t *    } )\n\t */\n\t\"aoSearchCols\": [],\n\n\n\t/**\n\t * An array of CSS classes that should be applied to displayed rows. This\n\t * array may be of any length, and DataTables will apply each class\n\t * sequentially, looping when required.\n\t *  @type array\n\t *  @default null <i>Will take the values determined by the `oClasses.stripe*`\n\t *    options</i>\n\t *\n\t *  @dtopt Option\n\t *  @name DataTable.defaults.stripeClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stripeClasses\": [ 'strip1', 'strip2', 'strip3' ]\n\t *      } );\n\t *    } )\n\t */\n\t\"asStripeClasses\": null,\n\n\n\t/**\n\t * Enable or disable automatic column width calculation. This can be disabled\n\t * as an optimisation (it takes some time to calculate the widths) if the\n\t * tables widths are passed in using `columns`.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.autoWidth\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"autoWidth\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bAutoWidth\": true,\n\n\n\t/**\n\t * Deferred rendering can provide DataTables with a huge speed boost when you\n\t * are using an Ajax or JS data source for the table. This option, when set to\n\t * true, will cause DataTables to defer the creation of the table elements for\n\t * each row until they are needed for a draw - saving a significant amount of\n\t * time.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.deferRender\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajax\": \"sources/arrays.txt\",\n\t *        \"deferRender\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDeferRender\": false,\n\n\n\t/**\n\t * Replace a DataTable which matches the given selector and replace it with\n\t * one which has the properties of the new initialisation object passed. If no\n\t * table matches the selector, then the new DataTable will be constructed as\n\t * per normal.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.destroy\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"srollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *\n\t *      // Some time later....\n\t *      $('#example').dataTable( {\n\t *        \"filter\": false,\n\t *        \"destroy\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bDestroy\": false,\n\n\n\t/**\n\t * Enable or disable filtering of data. Filtering in DataTables is \"smart\" in\n\t * that it allows the end user to input multiple words (space separated) and\n\t * will match a row containing those words, even if not in the order that was\n\t * specified (this allow matching across multiple columns). Note that if you\n\t * wish to use filtering in DataTables this must remain 'true' - to remove the\n\t * default filtering input box and retain filtering abilities, please use\n\t * {@link DataTable.defaults.dom}.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.searching\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"searching\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bFilter\": true,\n\n\n\t/**\n\t * Enable or disable the table information display. This shows information\n\t * about the data that is currently visible on the page, including information\n\t * about filtered data if that action is being performed.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.info\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"info\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bInfo\": true,\n\n\n\t/**\n\t * Allows the end user to select the size of a formatted page from a select\n\t * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.lengthChange\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"lengthChange\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bLengthChange\": true,\n\n\n\t/**\n\t * Enable or disable pagination.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.paging\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"paging\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bPaginate\": true,\n\n\n\t/**\n\t * Enable or disable the display of a 'processing' indicator when the table is\n\t * being processed (e.g. a sort). This is particularly useful for tables with\n\t * large amounts of data where it can take a noticeable amount of time to sort\n\t * the entries.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.processing\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"processing\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bProcessing\": false,\n\n\n\t/**\n\t * Retrieve the DataTables object for the given selector. Note that if the\n\t * table has already been initialised, this parameter will cause DataTables\n\t * to simply return the object that has already been set up - it will not take\n\t * account of any changes you might have made to the initialisation object\n\t * passed to DataTables (setting this parameter to true is an acknowledgement\n\t * that you understand this). `destroy` can be used to reinitialise a table if\n\t * you need.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.retrieve\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      initTable();\n\t *      tableActions();\n\t *    } );\n\t *\n\t *    function initTable ()\n\t *    {\n\t *      return $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false,\n\t *        \"retrieve\": true\n\t *      } );\n\t *    }\n\t *\n\t *    function tableActions ()\n\t *    {\n\t *      var table = initTable();\n\t *      // perform API operations with oTable\n\t *    }\n\t */\n\t\"bRetrieve\": false,\n\n\n\t/**\n\t * When vertical (y) scrolling is enabled, DataTables will force the height of\n\t * the table's viewport to the given height at all times (useful for layout).\n\t * However, this can look odd when filtering data down to a small data set,\n\t * and the footer is left \"floating\" further down. This parameter (when\n\t * enabled) will cause DataTables to collapse the table's viewport down when\n\t * the result set will fit within the given Y height.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollCollapse\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200\",\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bScrollCollapse\": false,\n\n\n\t/**\n\t * Configure DataTables to use server-side processing. Note that the\n\t * `ajax` parameter must also be given in order to give DataTables a\n\t * source to obtain the required data for each draw.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverSide\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"xhr.php\"\n\t *      } );\n\t *    } );\n\t */\n\t\"bServerSide\": false,\n\n\n\t/**\n\t * Enable or disable sorting of columns. Sorting of individual columns can be\n\t * disabled by the `sortable` option for each column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.ordering\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"ordering\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSort\": true,\n\n\n\t/**\n\t * Enable or display DataTables' ability to sort multiple columns at the\n\t * same time (activated by shift-click by the user).\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderMulti\n\t *\n\t *  @example\n\t *    // Disable multiple column sorting ability\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderMulti\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortMulti\": true,\n\n\n\t/**\n\t * Allows control over whether DataTables should use the top (true) unique\n\t * cell that is found for a single column, or the bottom (false - default).\n\t * This is useful when using complex headers.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.orderCellsTop\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"orderCellsTop\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortCellsTop\": false,\n\n\n\t/**\n\t * Enable or disable the addition of the classes `sorting\\_1`, `sorting\\_2` and\n\t * `sorting\\_3` to the columns which are currently being sorted on. This is\n\t * presented as a feature switch as it can increase processing time (while\n\t * classes are removed and added) so for large data sets you might want to\n\t * turn this off.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.orderClasses\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"orderClasses\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"bSortClasses\": true,\n\n\n\t/**\n\t * Enable or disable state saving. When enabled HTML5 `localStorage` will be\n\t * used to save table display information such as pagination information,\n\t * display length, filtering and sorting. As such when the end user reloads\n\t * the page the display display will match what thy had previously set up.\n\t *\n\t * Due to the use of `localStorage` the default state saving is not supported\n\t * in IE6 or 7. If state saving is required in those browsers, use\n\t * `stateSaveCallback` to provide a storage solution such as cookies.\n\t *  @type boolean\n\t *  @default false\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.stateSave\n\t *\n\t *  @example\n\t *    $(document).ready( function () {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"bStateSave\": false,\n\n\n\t/**\n\t * This function is called when a TR element is created (and all TD child\n\t * elements have been inserted), or registered if using a DOM source, allowing\n\t * manipulation of the TR element (adding classes etc).\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} dataIndex The index of this row in the internal aoData array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.createdRow\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"createdRow\": function( row, data, dataIndex ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" )\n\t *          {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnCreatedRow\": null,\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify any aspect you want about the created DOM.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.drawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"drawCallback\": function( settings ) {\n\t *          alert( 'DataTables has redrawn the table' );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnDrawCallback\": null,\n\n\n\t/**\n\t * Identical to fnHeaderCallback() but for the table footer this function\n\t * allows you to modify the table footer on every 'draw' event.\n\t *  @type function\n\t *  @param {node} foot \"TR\" element for the footer\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.footerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"footerCallback\": function( tfoot, data, start, end, display ) {\n\t *          tfoot.getElementsByTagName('th')[0].innerHTML = \"Starting index is \"+start;\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnFooterCallback\": null,\n\n\n\t/**\n\t * When rendering large numbers in the information element for the table\n\t * (i.e. \"Showing 1 to 10 of 57 entries\") DataTables will render large numbers\n\t * to have a comma separator for the 'thousands' units (e.g. 1 million is\n\t * rendered as \"1,000,000\") to help readability for the end user. This\n\t * function will override the default method DataTables uses.\n\t *  @type function\n\t *  @member\n\t *  @param {int} toFormat number to be formatted\n\t *  @returns {string} formatted string for DataTables to show the number\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.formatNumber\n\t *\n\t *  @example\n\t *    // Format a number using a single quote for the separator (note that\n\t *    // this can also be done with the language.thousands option)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"formatNumber\": function ( toFormat ) {\n\t *          return toFormat.toString().replace(\n\t *            /\\B(?=(\\d{3})+(?!\\d))/g, \"'\"\n\t *          );\n\t *        };\n\t *      } );\n\t *    } );\n\t */\n\t\"fnFormatNumber\": function ( toFormat ) {\n\t\treturn toFormat.toString().replace(\n\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g,\n\t\t\tthis.oLanguage.sThousands\n\t\t);\n\t},\n\n\n\t/**\n\t * This function is called on every 'draw' event, and allows you to\n\t * dynamically modify the header row. This can be used to calculate and\n\t * display useful information about the table.\n\t *  @type function\n\t *  @param {node} head \"TR\" element for the header\n\t *  @param {array} data Full table data (as derived from the original HTML)\n\t *  @param {int} start Index for the current display starting point in the\n\t *    display array\n\t *  @param {int} end Index for the current display ending point in the\n\t *    display array\n\t *  @param {array int} display Index array to translate the visual position\n\t *    to the full data array\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.headerCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"fheaderCallback\": function( head, data, start, end, display ) {\n\t *          head.getElementsByTagName('th')[0].innerHTML = \"Displaying \"+(end-start)+\" records\";\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnHeaderCallback\": null,\n\n\n\t/**\n\t * The information element can be used to convey information about the current\n\t * state of the table. Although the internationalisation options presented by\n\t * DataTables are quite capable of dealing with most customisations, there may\n\t * be times where you wish to customise the string further. This callback\n\t * allows you to do exactly that.\n\t *  @type function\n\t *  @param {object} oSettings DataTables settings object\n\t *  @param {int} start Starting position in data for the draw\n\t *  @param {int} end End position in data for the draw\n\t *  @param {int} max Total number of rows in the table (regardless of\n\t *    filtering)\n\t *  @param {int} total Total number of rows in the data set, after filtering\n\t *  @param {string} pre The string that DataTables has formatted using it's\n\t *    own rules\n\t *  @returns {string} The string to be displayed in the information element.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.infoCallback\n\t *\n\t *  @example\n\t *    $('#example').dataTable( {\n\t *      \"infoCallback\": function( settings, start, end, max, total, pre ) {\n\t *        return start +\" to \"+ end;\n\t *      }\n\t *    } );\n\t */\n\t\"fnInfoCallback\": null,\n\n\n\t/**\n\t * Called when the table has been initialised. Normally DataTables will\n\t * initialise sequentially and there will be no need for this function,\n\t * however, this does not hold true when using external language information\n\t * since that is obtained using an async XHR call.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} json The JSON object request from the server - only\n\t *    present if client-side Ajax sourced data is used\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.initComplete\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"initComplete\": function(settings, json) {\n\t *          alert( 'DataTables has finished its initialisation.' );\n\t *        }\n\t *      } );\n\t *    } )\n\t */\n\t\"fnInitComplete\": null,\n\n\n\t/**\n\t * Called at the very start of each table draw and can be used to cancel the\n\t * draw by returning false, any other return (including undefined) results in\n\t * the full draw occurring).\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @returns {boolean} False will cancel the draw, anything else (including no\n\t *    return) will allow it to complete.\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.preDrawCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"preDrawCallback\": function( settings ) {\n\t *          if ( $('#test').val() == 1 ) {\n\t *            return false;\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnPreDrawCallback\": null,\n\n\n\t/**\n\t * This function allows you to 'post process' each row after it have been\n\t * generated for each table draw, but before it is rendered on screen. This\n\t * function might be used for setting the row class name etc.\n\t *  @type function\n\t *  @param {node} row \"TR\" element for the current row\n\t *  @param {array} data Raw data array for this row\n\t *  @param {int} displayIndex The display index for the current table draw\n\t *  @param {int} displayIndexFull The index of the data in the full list of\n\t *    rows (after filtering)\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.rowCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"rowCallback\": function( row, data, displayIndex, displayIndexFull ) {\n\t *          // Bold the grade for all 'A' grade browsers\n\t *          if ( data[4] == \"A\" ) {\n\t *            $('td:eq(4)', row).html( '<b>A</b>' );\n\t *          }\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnRowCallback\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * This parameter allows you to override the default function which obtains\n\t * the data from the server so something more suitable for your application.\n\t * For example you could use POST data, or pull information from a Gears or\n\t * AIR database.\n\t *  @type function\n\t *  @member\n\t *  @param {string} source HTTP source to obtain the data from (`ajax`)\n\t *  @param {array} data A key/value pair object containing the data to send\n\t *    to the server\n\t *  @param {function} callback to be called on completion of the data get\n\t *    process that will draw the data on the page.\n\t *  @param {object} settings DataTables settings object\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverData\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerData\": null,\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t *  It is often useful to send extra data to the server when making an Ajax\n\t * request - for example custom filtering information, and this callback\n\t * function makes it trivial to send extra information to the server. The\n\t * passed in parameter is the data set that has been constructed by\n\t * DataTables, and you can add to this or modify it as you require.\n\t *  @type function\n\t *  @param {array} data Data array (array of objects which are name/value\n\t *    pairs) that has been constructed by DataTables and will be sent to the\n\t *    server. In the case of Ajax sourced data with server-side processing\n\t *    this will be an empty array, for server-side processing there will be a\n\t *    significant number of parameters!\n\t *  @returns {undefined} Ensure that you modify the data array passed in,\n\t *    as this is passed by reference.\n\t *\n\t *  @dtopt Callbacks\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverParams\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"fnServerParams\": null,\n\n\n\t/**\n\t * Load the table state. With this function you can define from where, and how, the\n\t * state of a table is loaded. By default DataTables will load from `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} callback Callback that can be executed when done. It\n\t *    should be passed the loaded state object.\n\t *  @return {object} The DataTables state object to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadCallback\": function (settings, callback) {\n\t *          $.ajax( {\n\t *            \"url\": \"/state_load\",\n\t *            \"dataType\": \"json\",\n\t *            \"success\": function (json) {\n\t *              callback( json );\n\t *            }\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadCallback\": function ( settings ) {\n\t\ttry {\n\t\t\treturn JSON.parse(\n\t\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(\n\t\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname\n\t\t\t\t)\n\t\t\t);\n\t\t} catch (e) {\n\t\t\treturn {};\n\t\t}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the saved state prior to loading that state.\n\t * This callback is called when the table is loading state from the stored data, but\n\t * prior to the settings object being modified by the saved state. Note that for\n\t * plug-in authors, you should use the `stateLoadParams` event to load parameters for\n\t * a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that is to be loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoadParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never loaded\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Disallow state loading by returning false\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoadParams\": function (settings, data) {\n\t *          return false;\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoadParams\": null,\n\n\n\t/**\n\t * Callback that is called when the state has been loaded from the state saving method\n\t * and the DataTables settings object has been modified as a result of the loaded state.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object that was loaded\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateLoaded\n\t *\n\t *  @example\n\t *    // Show an alert with the filtering value that was saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateLoaded\": function (settings, data) {\n\t *          alert( 'Saved filter was: '+data.oSearch.sSearch );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateLoaded\": null,\n\n\n\t/**\n\t * Save the table state. This function allows you to define where and how the state\n\t * information for the table is stored By default DataTables will use `localStorage`\n\t * but you might wish to use a server-side database or cookies.\n\t *  @type function\n\t *  @member\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveCallback\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveCallback\": function (settings, data) {\n\t *          // Send an Ajax request to the server with the state object\n\t *          $.ajax( {\n\t *            \"url\": \"/state_save\",\n\t *            \"data\": data,\n\t *            \"dataType\": \"json\",\n\t *            \"method\": \"POST\"\n\t *            \"success\": function () {}\n\t *          } );\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveCallback\": function ( settings, data ) {\n\t\ttry {\n\t\t\t(settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(\n\t\t\t\t'DataTables_'+settings.sInstance+'_'+location.pathname,\n\t\t\t\tJSON.stringify( data )\n\t\t\t);\n\t\t} catch (e) {}\n\t},\n\n\n\t/**\n\t * Callback which allows modification of the state to be saved. Called when the table\n\t * has changed state a new state save is required. This method allows modification of\n\t * the state saving object prior to actually doing the save, including addition or\n\t * other state properties or modification. Note that for plug-in authors, you should\n\t * use the `stateSaveParams` event to save parameters for a plug-in.\n\t *  @type function\n\t *  @param {object} settings DataTables settings object\n\t *  @param {object} data The state object to be saved\n\t *\n\t *  @dtopt Callbacks\n\t *  @name DataTable.defaults.stateSaveParams\n\t *\n\t *  @example\n\t *    // Remove a saved filter, so filtering is never saved\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateSave\": true,\n\t *        \"stateSaveParams\": function (settings, data) {\n\t *          data.oSearch.sSearch = \"\";\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"fnStateSaveParams\": null,\n\n\n\t/**\n\t * Duration for which the saved state information is considered valid. After this period\n\t * has elapsed the state will be returned to the default.\n\t * Value is given in seconds.\n\t *  @type int\n\t *  @default 7200 <i>(2 hours)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.stateDuration\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"stateDuration\": 60*60*24; // 1 day\n\t *      } );\n\t *    } )\n\t */\n\t\"iStateDuration\": 7200,\n\n\n\t/**\n\t * When enabled DataTables will not make a request to the server for the first\n\t * page draw - rather it will use the data already on the page (no sorting etc\n\t * will be applied to it), thus saving on an XHR at load time. `deferLoading`\n\t * is used to indicate that deferred loading is required, but it is also used\n\t * to tell DataTables how many records there are in the full table (allowing\n\t * the information element and pagination to be displayed correctly). In the case\n\t * where a filtering is applied to the table on initial load, this can be\n\t * indicated by giving the parameter as an array, where the first element is\n\t * the number of records available after filtering and the second element is the\n\t * number of records without filtering (allowing the table information element\n\t * to be shown correctly).\n\t *  @type int | array\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.deferLoading\n\t *\n\t *  @example\n\t *    // 57 records available in the table, no filtering applied\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": 57\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // 57 records after filtering, 100 without filtering (an initial filter applied)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"serverSide\": true,\n\t *        \"ajax\": \"scripts/server_processing.php\",\n\t *        \"deferLoading\": [ 57, 100 ],\n\t *        \"search\": {\n\t *          \"search\": \"my_filter\"\n\t *        }\n\t *      } );\n\t *    } );\n\t */\n\t\"iDeferLoading\": null,\n\n\n\t/**\n\t * Number of rows to display on a single page when using pagination. If\n\t * feature enabled (`lengthChange`) then the end user will be able to override\n\t * this to a custom setting using a pop-up menu.\n\t *  @type int\n\t *  @default 10\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pageLength\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pageLength\": 50\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayLength\": 10,\n\n\n\t/**\n\t * Define the starting point for data display when using DataTables with\n\t * pagination. Note that this parameter is the number of records, rather than\n\t * the page number, so if you have 10 records per page and want to start on\n\t * the third page, it should be \"20\".\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.displayStart\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"displayStart\": 20\n\t *      } );\n\t *    } )\n\t */\n\t\"iDisplayStart\": 0,\n\n\n\t/**\n\t * By default DataTables allows keyboard navigation of the table (sorting, paging,\n\t * and filtering) by adding a `tabindex` attribute to the required elements. This\n\t * allows you to tab through the controls and press the enter key to activate them.\n\t * The tabindex is default 0, meaning that the tab follows the flow of the document.\n\t * You can overrule this using this parameter if you wish. Use a value of -1 to\n\t * disable built-in keyboard navigation.\n\t *  @type int\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.tabIndex\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"tabIndex\": 1\n\t *      } );\n\t *    } );\n\t */\n\t\"iTabIndex\": 0,\n\n\n\t/**\n\t * Classes that DataTables assigns to the various components and features\n\t * that it adds to the HTML table. This allows classes to be configured\n\t * during initialisation in addition to through the static\n\t * {@link DataTable.ext.oStdClasses} object).\n\t *  @namespace\n\t *  @name DataTable.defaults.classes\n\t */\n\t\"oClasses\": {},\n\n\n\t/**\n\t * All strings that DataTables uses in the user interface that it creates\n\t * are defined in this object, allowing you to modified them individually or\n\t * completely replace them all as required.\n\t *  @namespace\n\t *  @name DataTable.defaults.language\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Strings that are used for WAI-ARIA labels and controls only (these are not\n\t\t * actually visible on the page, but will be read by screenreaders, and thus\n\t\t * must be internationalised as well).\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.aria\n\t\t */\n\t\t\"oAria\": {\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted ascending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortAscending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortAscending\": \" - click/return to sort ascending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortAscending\": \": activate to sort column ascending\",\n\n\t\t\t/**\n\t\t\t * ARIA label that is added to the table headers when the column may be\n\t\t\t * sorted descending by activing the column (click or return when focused).\n\t\t\t * Note that the column header is prefixed to this string.\n\t\t\t *  @type string\n\t\t\t *  @default : activate to sort column ascending\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.aria.sortDescending\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"aria\": {\n\t\t\t *            \"sortDescending\": \" - click/return to sort descending\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sSortDescending\": \": activate to sort column descending\"\n\t\t},\n\n\t\t/**\n\t\t * Pagination string used by DataTables for the built-in pagination\n\t\t * control types.\n\t\t *  @namespace\n\t\t *  @name DataTable.defaults.language.paginate\n\t\t */\n\t\t\"oPaginate\": {\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the first page.\n\t\t\t *  @type string\n\t\t\t *  @default First\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.first\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"first\": \"First page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sFirst\": \"First\",\n\n\n\t\t\t/**\n\t\t\t * Text to use when using the 'full_numbers' type of pagination for the\n\t\t\t * button to take the user to the last page.\n\t\t\t *  @type string\n\t\t\t *  @default Last\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.last\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"last\": \"Last page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sLast\": \"Last\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'next' pagination button (to take the user to the\n\t\t\t * next page).\n\t\t\t *  @type string\n\t\t\t *  @default Next\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.next\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"next\": \"Next page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sNext\": \"Next\",\n\n\n\t\t\t/**\n\t\t\t * Text to use for the 'previous' pagination button (to take the user to\n\t\t\t * the previous page).\n\t\t\t *  @type string\n\t\t\t *  @default Previous\n\t\t\t *\n\t\t\t *  @dtopt Language\n\t\t\t *  @name DataTable.defaults.language.paginate.previous\n\t\t\t *\n\t\t\t *  @example\n\t\t\t *    $(document).ready( function() {\n\t\t\t *      $('#example').dataTable( {\n\t\t\t *        \"language\": {\n\t\t\t *          \"paginate\": {\n\t\t\t *            \"previous\": \"Previous page\"\n\t\t\t *          }\n\t\t\t *        }\n\t\t\t *      } );\n\t\t\t *    } );\n\t\t\t */\n\t\t\t\"sPrevious\": \"Previous\"\n\t\t},\n\n\t\t/**\n\t\t * This string is shown in preference to `zeroRecords` when the table is\n\t\t * empty of data (regardless of filtering). Note that this is an optional\n\t\t * parameter - if it is not given, the value of `zeroRecords` will be used\n\t\t * instead (either the default or given value).\n\t\t *  @type string\n\t\t *  @default No data available in table\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.emptyTable\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"emptyTable\": \"No data available in table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sEmptyTable\": \"No data available in table\",\n\n\n\t\t/**\n\t\t * This string gives information to the end user about the information\n\t\t * that is current on display on the page. The following tokens can be\n\t\t * used in the string and will be dynamically replaced as the table\n\t\t * display updates. This tokens can be placed anywhere in the string, or\n\t\t * removed as needed by the language requires:\n\t\t *\n\t\t * * `\\_START\\_` - Display index of the first record on the current page\n\t\t * * `\\_END\\_` - Display index of the last record on the current page\n\t\t * * `\\_TOTAL\\_` - Number of records in the table after filtering\n\t\t * * `\\_MAX\\_` - Number of records in the table without filtering\n\t\t * * `\\_PAGE\\_` - Current page number\n\t\t * * `\\_PAGES\\_` - Total number of pages of data in the table\n\t\t *\n\t\t *  @type string\n\t\t *  @default Showing _START_ to _END_ of _TOTAL_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.info\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"info\": \"Showing page _PAGE_ of _PAGES_\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfo\": \"Showing _START_ to _END_ of _TOTAL_ entries\",\n\n\n\t\t/**\n\t\t * Display information string for when the table is empty. Typically the\n\t\t * format of this string should match `info`.\n\t\t *  @type string\n\t\t *  @default Showing 0 to 0 of 0 entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoEmpty\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoEmpty\": \"No entries to show\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoEmpty\": \"Showing 0 to 0 of 0 entries\",\n\n\n\t\t/**\n\t\t * When a user filters the information in a table, this string is appended\n\t\t * to the information (`info`) to give an idea of how strong the filtering\n\t\t * is. The variable _MAX_ is dynamically updated.\n\t\t *  @type string\n\t\t *  @default (filtered from _MAX_ total entries)\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoFiltered\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoFiltered\": \" - filtering from _MAX_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoFiltered\": \"(filtered from _MAX_ total entries)\",\n\n\n\t\t/**\n\t\t * If can be useful to append extra information to the info string at times,\n\t\t * and this variable does exactly that. This information will be appended to\n\t\t * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are\n\t\t * being used) at all times.\n\t\t *  @type string\n\t\t *  @default <i>Empty string</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.infoPostFix\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"infoPostFix\": \"All records shown are derived from real information.\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sInfoPostFix\": \"\",\n\n\n\t\t/**\n\t\t * This decimal place operator is a little different from the other\n\t\t * language options since DataTables doesn't output floating point\n\t\t * numbers, so it won't ever use this for display of a number. Rather,\n\t\t * what this parameter does is modify the sort methods of the table so\n\t\t * that numbers which are in a format which has a character other than\n\t\t * a period (`.`) as a decimal place will be sorted numerically.\n\t\t *\n\t\t * Note that numbers with different decimal places cannot be shown in\n\t\t * the same table and still be sortable, the table must be consistent.\n\t\t * However, multiple different tables on the page can use different\n\t\t * decimal place characters.\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.decimal\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"decimal\": \",\"\n\t\t *          \"thousands\": \".\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sDecimal\": \"\",\n\n\n\t\t/**\n\t\t * DataTables has a build in number formatter (`formatNumber`) which is\n\t\t * used to format large numbers that are used in the table information.\n\t\t * By default a comma is used, but this can be trivially changed to any\n\t\t * character you wish with this parameter.\n\t\t *  @type string\n\t\t *  @default ,\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.thousands\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"thousands\": \"'\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sThousands\": \",\",\n\n\n\t\t/**\n\t\t * Detail the action that will be taken when the drop down menu for the\n\t\t * pagination length option is changed. The '_MENU_' variable is replaced\n\t\t * with a default select list of 10, 25, 50 and 100, and can be replaced\n\t\t * with a custom select box if required.\n\t\t *  @type string\n\t\t *  @default Show _MENU_ entries\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.lengthMenu\n\t\t *\n\t\t *  @example\n\t\t *    // Language change only\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": \"Display _MENU_ records\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Language and options change\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"lengthMenu\": 'Display <select>'+\n\t\t *            '<option value=\"10\">10</option>'+\n\t\t *            '<option value=\"20\">20</option>'+\n\t\t *            '<option value=\"30\">30</option>'+\n\t\t *            '<option value=\"40\">40</option>'+\n\t\t *            '<option value=\"50\">50</option>'+\n\t\t *            '<option value=\"-1\">All</option>'+\n\t\t *            '</select> records'\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLengthMenu\": \"Show _MENU_ entries\",\n\n\n\t\t/**\n\t\t * When using Ajax sourced data and during the first draw when DataTables is\n\t\t * gathering the data, this message is shown in an empty row in the table to\n\t\t * indicate to the end user the the data is being loaded. Note that this\n\t\t * parameter is not used when loading data by server-side processing, just\n\t\t * Ajax sourced data with client-side processing.\n\t\t *  @type string\n\t\t *  @default Loading...\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.loadingRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"loadingRecords\": \"Please wait - loading...\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sLoadingRecords\": \"Loading...\",\n\n\n\t\t/**\n\t\t * Text which is displayed when the table is processing a user action\n\t\t * (usually a sort command or similar).\n\t\t *  @type string\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.processing\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"processing\": \"DataTables is currently busy\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sProcessing\": \"\",\n\n\n\t\t/**\n\t\t * Details the actions that will be taken when the user types into the\n\t\t * filtering input text box. The variable \"_INPUT_\", if used in the string,\n\t\t * is replaced with the HTML text box for the filtering input allowing\n\t\t * control over where it appears in the string. If \"_INPUT_\" is not given\n\t\t * then the input box is appended to the string automatically.\n\t\t *  @type string\n\t\t *  @default Search:\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.search\n\t\t *\n\t\t *  @example\n\t\t *    // Input text box will be appended at the end automatically\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Filter records:\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Specify where the filter should appear\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"search\": \"Apply filter _INPUT_ to table\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sSearch\": \"Search:\",\n\n\n\t\t/**\n\t\t * Assign a `placeholder` attribute to the search `input` element\n\t\t *  @type string\n\t\t *  @default \n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.searchPlaceholder\n\t\t */\n\t\t\"sSearchPlaceholder\": \"\",\n\n\n\t\t/**\n\t\t * All of the language information can be stored in a file on the\n\t\t * server-side, which DataTables will look up if this parameter is passed.\n\t\t * It must store the URL of the language file, which is in a JSON format,\n\t\t * and the object has the same properties as the oLanguage object in the\n\t\t * initialiser object (i.e. the above parameters). Please refer to one of\n\t\t * the example language files to see how this works in action.\n\t\t *  @type string\n\t\t *  @default <i>Empty string - i.e. disabled</i>\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.url\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"url\": \"http://www.sprymedia.co.uk/dataTables/lang.txt\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sUrl\": \"\",\n\n\n\t\t/**\n\t\t * Text shown inside the table records when the is no information to be\n\t\t * displayed after filtering. `emptyTable` is shown when there is simply no\n\t\t * information in the table at all (regardless of filtering).\n\t\t *  @type string\n\t\t *  @default No matching records found\n\t\t *\n\t\t *  @dtopt Language\n\t\t *  @name DataTable.defaults.language.zeroRecords\n\t\t *\n\t\t *  @example\n\t\t *    $(document).ready( function() {\n\t\t *      $('#example').dataTable( {\n\t\t *        \"language\": {\n\t\t *          \"zeroRecords\": \"No records to display\"\n\t\t *        }\n\t\t *      } );\n\t\t *    } );\n\t\t */\n\t\t\"sZeroRecords\": \"No matching records found\"\n\t},\n\n\n\t/**\n\t * This parameter allows you to have define the global filtering state at\n\t * initialisation time. As an object the `search` parameter must be\n\t * defined, but all other parameters are optional. When `regex` is true,\n\t * the search string will be treated as a regular expression, when false\n\t * (default) it will be treated as a straight string. When `smart`\n\t * DataTables will use it's smart filtering methods (to word match at\n\t * any point in the data), when false this will not be done.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.search\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"search\": {\"search\": \"Initial search\"}\n\t *      } );\n\t *    } )\n\t */\n\t\"oSearch\": $.extend( {}, DataTable.models.oSearch ),\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * By default DataTables will look for the property `data` (or `aaData` for\n\t * compatibility with DataTables 1.9-) when obtaining data from an Ajax\n\t * source or for server-side processing - this parameter allows that\n\t * property to be changed. You can use Javascript dotted object notation to\n\t * get a data source for multiple levels of nesting.\n\t *  @type string\n\t *  @default data\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxDataProp\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxDataProp\": \"data\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * You can instruct DataTables to load data from an external\n\t * source using this parameter (use aData if you want to pass data in you\n\t * already have). Simply provide a url a JSON object can be obtained from.\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.ajaxSource\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sAjaxSource\": null,\n\n\n\t/**\n\t * This initialisation variable allows you to specify exactly where in the\n\t * DOM you want DataTables to inject the various controls it adds to the page\n\t * (for example you might want the pagination controls at the top of the\n\t * table). DIV elements (with or without a custom class) can also be added to\n\t * aid styling. The follow syntax is used:\n\t *   <ul>\n\t *     <li>The following options are allowed:\n\t *       <ul>\n\t *         <li>'l' - Length changing</li>\n\t *         <li>'f' - Filtering input</li>\n\t *         <li>'t' - The table!</li>\n\t *         <li>'i' - Information</li>\n\t *         <li>'p' - Pagination</li>\n\t *         <li>'r' - pRocessing</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following constants are allowed:\n\t *       <ul>\n\t *         <li>'H' - jQueryUI theme \"header\" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>\n\t *         <li>'F' - jQueryUI theme \"footer\" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>The following syntax is expected:\n\t *       <ul>\n\t *         <li>'&lt;' and '&gt;' - div elements</li>\n\t *         <li>'&lt;\"class\" and '&gt;' - div with a class</li>\n\t *         <li>'&lt;\"#id\" and '&gt;' - div with an ID</li>\n\t *       </ul>\n\t *     </li>\n\t *     <li>Examples:\n\t *       <ul>\n\t *         <li>'&lt;\"wrapper\"flipt&gt;'</li>\n\t *         <li>'&lt;lf&lt;t&gt;ip&gt;'</li>\n\t *       </ul>\n\t *     </li>\n\t *   </ul>\n\t *  @type string\n\t *  @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>\n\t *    <\"H\"lfr>t<\"F\"ip> <i>(when `jQueryUI` is true)</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.dom\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"dom\": '&lt;\"top\"i&gt;rt&lt;\"bottom\"flp&gt;&lt;\"clear\"&gt;'\n\t *      } );\n\t *    } );\n\t */\n\t\"sDom\": \"lfrtip\",\n\n\n\t/**\n\t * Search delay option. This will throttle full table searches that use the\n\t * DataTables provided search input element (it does not effect calls to\n\t * `dt-api search()`, providing a delay before the search is made.\n\t *  @type integer\n\t *  @default 0\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.searchDelay\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"searchDelay\": 200\n\t *      } );\n\t *    } )\n\t */\n\t\"searchDelay\": null,\n\n\n\t/**\n\t * DataTables features six different built-in options for the buttons to\n\t * display for pagination control:\n\t *\n\t * * `numbers` - Page number buttons only\n\t * * `simple` - 'Previous' and 'Next' buttons only\n\t * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers\n\t * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons\n\t * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus page numbers\n\t * * `first_last_numbers` - 'First' and 'Last' buttons, plus page numbers\n\t *  \n\t * Further methods can be added using {@link DataTable.ext.oPagination}.\n\t *  @type string\n\t *  @default simple_numbers\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.pagingType\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"pagingType\": \"full_numbers\"\n\t *      } );\n\t *    } )\n\t */\n\t\"sPaginationType\": \"simple_numbers\",\n\n\n\t/**\n\t * Enable horizontal scrolling. When a table is too wide to fit into a\n\t * certain layout, or you have a large number of columns in the table, you\n\t * can enable x-scrolling to show the table in a viewport, which can be\n\t * scrolled. This property can be `true` which will allow the table to\n\t * scroll horizontally when needed, or any CSS unit, or a number (in which\n\t * case it will be treated as a pixel measurement). Setting as simply `true`\n\t * is recommended.\n\t *  @type boolean|string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollX\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": true,\n\t *        \"scrollCollapse\": true\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollX\": \"\",\n\n\n\t/**\n\t * This property can be used to force a DataTable to use more width than it\n\t * might otherwise do when x-scrolling is enabled. For example if you have a\n\t * table which requires to be well spaced, this parameter is useful for\n\t * \"over-sizing\" the table, and thus forcing scrolling. This property can by\n\t * any CSS unit, or a number (in which case it will be treated as a pixel\n\t * measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Options\n\t *  @name DataTable.defaults.scrollXInner\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollX\": \"100%\",\n\t *        \"scrollXInner\": \"110%\"\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollXInner\": \"\",\n\n\n\t/**\n\t * Enable vertical scrolling. Vertical scrolling will constrain the DataTable\n\t * to the given height, and enable scrolling for any data which overflows the\n\t * current viewport. This can be used as an alternative to paging to display\n\t * a lot of data in a small area (although paging and scrolling can both be\n\t * enabled at the same time). This property can be any CSS unit, or a number\n\t * (in which case it will be treated as a pixel measurement).\n\t *  @type string\n\t *  @default <i>blank string - i.e. disabled</i>\n\t *\n\t *  @dtopt Features\n\t *  @name DataTable.defaults.scrollY\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"scrollY\": \"200px\",\n\t *        \"paginate\": false\n\t *      } );\n\t *    } );\n\t */\n\t\"sScrollY\": \"\",\n\n\n\t/**\n\t * __Deprecated__ The functionality provided by this parameter has now been\n\t * superseded by that provided through `ajax`, which should be used instead.\n\t *\n\t * Set the HTTP method that is used to make the Ajax call for server-side\n\t * processing or Ajax sourced data.\n\t *  @type string\n\t *  @default GET\n\t *\n\t *  @dtopt Options\n\t *  @dtopt Server-side\n\t *  @name DataTable.defaults.serverMethod\n\t *\n\t *  @deprecated 1.10. Please use `ajax` for this functionality now.\n\t */\n\t\"sServerMethod\": \"GET\",\n\n\n\t/**\n\t * DataTables makes use of renderers when displaying HTML elements for\n\t * a table. These renderers can be added or modified by plug-ins to\n\t * generate suitable mark-up for a site. For example the Bootstrap\n\t * integration plug-in for DataTables uses a paging button renderer to\n\t * display pagination buttons in the mark-up required by Bootstrap.\n\t *\n\t * For further information about the renderers available see\n\t * DataTable.ext.renderer\n\t *  @type string|object\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.renderer\n\t *\n\t */\n\t\"renderer\": null,\n\n\n\t/**\n\t * Set the data property name that DataTables should use to get a row's id\n\t * to set as the `id` property in the node.\n\t *  @type string\n\t *  @default DT_RowId\n\t *\n\t *  @name DataTable.defaults.rowId\n\t */\n\t\"rowId\": \"DT_RowId\"\n};\n\n_fnHungarianMap( DataTable.defaults );\n\n\n\n/*\n * Developer note - See note in model.defaults.js about the use of Hungarian\n * notation and camel case.\n */\n\n/**\n * Column options that can be given to DataTables at initialisation time.\n *  @namespace\n */\nDataTable.defaults.column = {\n\t/**\n\t * Define which column(s) an order will occur on for this column. This\n\t * allows a column's ordering to take multiple columns into account when\n\t * doing a sort or use the data from a different column. For example first\n\t * name / last name columns make sense to do a multi-column sort over the\n\t * two columns.\n\t *  @type array|int\n\t *  @default null <i>Takes the value of the column index automatically</i>\n\t *\n\t *  @name DataTable.defaults.column.orderData\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderData\": [ 0, 1 ], \"targets\": [ 0 ] },\n\t *          { \"orderData\": [ 1, 0 ], \"targets\": [ 1 ] },\n\t *          { \"orderData\": 2, \"targets\": [ 2 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderData\": [ 0, 1 ] },\n\t *          { \"orderData\": [ 1, 0 ] },\n\t *          { \"orderData\": 2 },\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"aDataSort\": null,\n\t\"iDataSort\": -1,\n\n\n\t/**\n\t * You can control the default ordering direction, and even alter the\n\t * behaviour of the sort handler (i.e. only allow ascending ordering etc)\n\t * using this parameter.\n\t *  @type array\n\t *  @default [ 'asc', 'desc' ]\n\t *\n\t *  @name DataTable.defaults.column.orderSequence\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderSequence\": [ \"asc\" ], \"targets\": [ 1 ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ], \"targets\": [ 2 ] },\n\t *          { \"orderSequence\": [ \"desc\" ], \"targets\": [ 3 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          { \"orderSequence\": [ \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\", \"asc\", \"asc\" ] },\n\t *          { \"orderSequence\": [ \"desc\" ] },\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"asSorting\": [ 'asc', 'desc' ],\n\n\n\t/**\n\t * Enable or disable filtering on the data in this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.searchable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"searchable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"searchable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSearchable\": true,\n\n\n\t/**\n\t * Enable or disable ordering on this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.orderable\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderable\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"orderable\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bSortable\": true,\n\n\n\t/**\n\t * Enable or disable the display of this column.\n\t *  @type boolean\n\t *  @default true\n\t *\n\t *  @name DataTable.defaults.column.visible\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"visible\": false, \"targets\": [ 0 ] }\n\t *        ] } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"visible\": false },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ] } );\n\t *    } );\n\t */\n\t\"bVisible\": true,\n\n\n\t/**\n\t * Developer definable function that is called whenever a cell is created (Ajax source,\n\t * etc) or processed for input (DOM source). This can be used as a compliment to mRender\n\t * allowing you to modify the DOM element (add background colour for example) when the\n\t * element is available.\n\t *  @type function\n\t *  @param {element} td The TD node that has been created\n\t *  @param {*} cellData The Data for the cell\n\t *  @param {array|object} rowData The data for the whole row\n\t *  @param {int} row The row index for the aoData data store\n\t *  @param {int} col The column index for aoColumns\n\t *\n\t *  @name DataTable.defaults.column.createdCell\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [3],\n\t *          \"createdCell\": function (td, cellData, rowData, row, col) {\n\t *            if ( cellData == \"1.7\" ) {\n\t *              $(td).css('color', 'blue')\n\t *            }\n\t *          }\n\t *        } ]\n\t *      });\n\t *    } );\n\t */\n\t\"fnCreatedCell\": null,\n\n\n\t/**\n\t * This parameter has been replaced by `data` in DataTables to ensure naming\n\t * consistency. `dataProp` can still be used, as there is backwards\n\t * compatibility in DataTables for this option, but it is strongly\n\t * recommended that you use `data` in preference to `dataProp`.\n\t *  @name DataTable.defaults.column.dataProp\n\t */\n\n\n\t/**\n\t * This property can be used to read data from any data source property,\n\t * including deeply nested objects / properties. `data` can be given in a\n\t * number of different ways which effect its behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object. Note that\n\t *      function notation is recommended for use in `render` rather than\n\t *      `data` as it is much simpler to use as a renderer.\n\t * * `null` - use the original data source for the row rather than plucking\n\t *   data directly from it. This action has effects on two other\n\t *   initialisation options:\n\t *    * `defaultContent` - When null is given as the `data` option and\n\t *      `defaultContent` is specified for the column, the value defined by\n\t *      `defaultContent` will be used for the cell.\n\t *    * `render` - When null is used for the `data` option and the `render`\n\t *      option is specified for the column, the whole data source for the\n\t *      row is used for the renderer.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * `{array|object}` The data source for the row\n\t *      * `{string}` The type call data requested - this will be 'set' when\n\t *        setting data or 'filter', 'display', 'type', 'sort' or undefined\n\t *        when gathering data. Note that when `undefined` is given for the\n\t *        type DataTables expects to get the raw data for the object back<\n\t *      * `{*}` Data to set when the second parameter is 'set'.\n\t *    * Return:\n\t *      * The return value from the function is not required when 'set' is\n\t *        the type of call, but otherwise the return is what will be used\n\t *        for the data requested.\n\t *\n\t * Note that `data` is a getter and setter option. If you just require\n\t * formatting of data for output, you will likely want to use `render` which\n\t * is simply a getter and thus simpler to use.\n\t *\n\t * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The\n\t * name change reflects the flexibility of this property and is consistent\n\t * with the naming of mRender. If 'mDataProp' is given, then it will still\n\t * be used by DataTables, as it automatically maps the old name to the new\n\t * if required.\n\t *\n\t *  @type string|int|function|null\n\t *  @default null <i>Use automatically calculated column index</i>\n\t *\n\t *  @name DataTable.defaults.column.data\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Read table data from objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {value},\n\t *    //      \"version\": {value},\n\t *    //      \"grade\": {value}\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/objects.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform\" },\n\t *          { \"data\": \"version\" },\n\t *          { \"data\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Read information from deeply nested objects\n\t *    // JSON structure for each row:\n\t *    //   {\n\t *    //      \"engine\": {value},\n\t *    //      \"browser\": {value},\n\t *    //      \"platform\": {\n\t *    //         \"inner\": {value}\n\t *    //      },\n\t *    //      \"details\": [\n\t *    //         {value}, {value}\n\t *    //      ]\n\t *    //   }\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          { \"data\": \"platform.inner\" },\n\t *          { \"data\": \"details.0\" },\n\t *          { \"data\": \"details.1\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `data` as a function to provide different information for\n\t *    // sorting, filtering and display. In this case, currency (price)\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": function ( source, type, val ) {\n\t *            if (type === 'set') {\n\t *              source.price = val;\n\t *              // Store the computed display and filter values for efficiency\n\t *              source.price_display = val==\"\" ? \"\" : \"$\"+numberFormat(val);\n\t *              source.price_filter  = val==\"\" ? \"\" : \"$\"+numberFormat(val)+\" \"+val;\n\t *              return;\n\t *            }\n\t *            else if (type === 'display') {\n\t *              return source.price_display;\n\t *            }\n\t *            else if (type === 'filter') {\n\t *              return source.price_filter;\n\t *            }\n\t *            // 'sort', 'type' and undefined all just use the integer\n\t *            return source.price;\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using default content\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null,\n\t *          \"defaultContent\": \"Click to edit\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using array notation - outputting a list from an array\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"name[, ]\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t */\n\t\"mData\": null,\n\n\n\t/**\n\t * This property is the rendering partner to `data` and it is suggested that\n\t * when you want to manipulate data for display (including filtering,\n\t * sorting etc) without altering the underlying data for the table, use this\n\t * property. `render` can be considered to be the the read only companion to\n\t * `data` which is read / write (then as such more complex). Like `data`\n\t * this option can be given in a number of different ways to effect its\n\t * behaviour:\n\t *\n\t * * `integer` - treated as an array index for the data source. This is the\n\t *   default that DataTables uses (incrementally increased for each column).\n\t * * `string` - read an object property from the data source. There are\n\t *   three 'special' options that can be used in the string to alter how\n\t *   DataTables reads the data from the source object:\n\t *    * `.` - Dotted Javascript notation. Just as you use a `.` in\n\t *      Javascript to read from nested objects, so to can the options\n\t *      specified in `data`. For example: `browser.version` or\n\t *      `browser.name`. If your object parameter name contains a period, use\n\t *      `\\\\` to escape it - i.e. `first\\\\.name`.\n\t *    * `[]` - Array notation. DataTables can automatically combine data\n\t *      from and array source, joining the data with the characters provided\n\t *      between the two brackets. For example: `name[, ]` would provide a\n\t *      comma-space separated list from the source array. If no characters\n\t *      are provided between the brackets, the original array source is\n\t *      returned.\n\t *    * `()` - Function notation. Adding `()` to the end of a parameter will\n\t *      execute a function of the name given. For example: `browser()` for a\n\t *      simple function on the data source, `browser.version()` for a\n\t *      function in a nested property or even `browser().version` to get an\n\t *      object property if the function called returns an object.\n\t * * `object` - use different data for the different data types requested by\n\t *   DataTables ('filter', 'display', 'type' or 'sort'). The property names\n\t *   of the object is the data type the property refers to and the value can\n\t *   defined using an integer, string or function using the same rules as\n\t *   `render` normally does. Note that an `_` option _must_ be specified.\n\t *   This is the default value to use if you haven't specified a value for\n\t *   the data type requested by DataTables.\n\t * * `function` - the function given will be executed whenever DataTables\n\t *   needs to set or get the data for a cell in the column. The function\n\t *   takes three parameters:\n\t *    * Parameters:\n\t *      * {array|object} The data source for the row (based on `data`)\n\t *      * {string} The type call data requested - this will be 'filter',\n\t *        'display', 'type' or 'sort'.\n\t *      * {array|object} The full data source for the row (not based on\n\t *        `data`)\n\t *    * Return:\n\t *      * The return value from the function is what will be used for the\n\t *        data requested.\n\t *\n\t *  @type string|int|function|object|null\n\t *  @default null Use the data source value.\n\t *\n\t *  @name DataTable.defaults.column.render\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Create a comma separated list from an array of objects\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"ajaxSource\": \"sources/deep.txt\",\n\t *        \"columns\": [\n\t *          { \"data\": \"engine\" },\n\t *          { \"data\": \"browser\" },\n\t *          {\n\t *            \"data\": \"platform\",\n\t *            \"render\": \"[, ].name\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Execute a function to obtain data\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": \"browserName()\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // As an object, extracting different data for the different types\n\t *    // This would be used with a data source such as:\n\t *    //   { \"phone\": 5552368, \"phone_filter\": \"5552368 555-2368\", \"phone_display\": \"555-2368\" }\n\t *    // Here the `phone` integer is used for sorting and type detection, while `phone_filter`\n\t *    // (which has both forms) is used for filtering for if a user inputs either format, while\n\t *    // the formatted phone number is the one that is shown in the table.\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": null, // Use the full data source object for the renderer's source\n\t *          \"render\": {\n\t *            \"_\": \"phone\",\n\t *            \"filter\": \"phone_filter\",\n\t *            \"display\": \"phone_display\"\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Use as a function to create a link from the data source\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"data\": \"download_link\",\n\t *          \"render\": function ( data, type, full ) {\n\t *            return '<a href=\"'+data+'\">Download</a>';\n\t *          }\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"mRender\": null,\n\n\n\t/**\n\t * Change the cell type created for the column - either TD cells or TH cells. This\n\t * can be useful as TH cells have semantic meaning in the table body, allowing them\n\t * to act as a header for a row (you may wish to add scope='row' to the TH elements).\n\t *  @type string\n\t *  @default td\n\t *\n\t *  @name DataTable.defaults.column.cellType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Make the first column use TH cells\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [ {\n\t *          \"targets\": [ 0 ],\n\t *          \"cellType\": \"th\"\n\t *        } ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sCellType\": \"td\",\n\n\n\t/**\n\t * Class to give to each cell in this column.\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.class\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"class\": \"my_class\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"class\": \"my_class\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sClass\": \"\",\n\n\t/**\n\t * When DataTables calculates the column widths to assign to each column,\n\t * it finds the longest string in each column and then constructs a\n\t * temporary table and reads the widths from that. The problem with this\n\t * is that \"mmm\" is much wider then \"iiii\", but the latter is a longer\n\t * string - thus the calculation can go wrong (doing it properly and putting\n\t * it into an DOM object and measuring that is horribly(!) slow). Thus as\n\t * a \"work around\" we provide this option. It will append its value to the\n\t * text that is found to be the longest string for the column - i.e. padding.\n\t * Generally you shouldn't need this!\n\t *  @type string\n\t *  @default <i>Empty string<i>\n\t *\n\t *  @name DataTable.defaults.column.contentPadding\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"contentPadding\": \"mmm\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sContentPadding\": \"\",\n\n\n\t/**\n\t * Allows a default value to be given for a column's data, and will be used\n\t * whenever a null data source is encountered (this can be because `data`\n\t * is set to null, or because the data source itself is null).\n\t *  @type string\n\t *  @default null\n\t *\n\t *  @name DataTable.defaults.column.defaultContent\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\",\n\t *            \"targets\": [ -1 ]\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          {\n\t *            \"data\": null,\n\t *            \"defaultContent\": \"Edit\"\n\t *          }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sDefaultContent\": null,\n\n\n\t/**\n\t * This parameter is only used in DataTables' server-side processing. It can\n\t * be exceptionally useful to know what columns are being displayed on the\n\t * client side, and to map these to database fields. When defined, the names\n\t * also allow DataTables to reorder information from the server if it comes\n\t * back in an unexpected order (i.e. if you switch your columns around on the\n\t * client-side, your server-side code does not also need updating).\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t *\n\t *  @name DataTable.defaults.column.name\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"name\": \"engine\", \"targets\": [ 0 ] },\n\t *          { \"name\": \"browser\", \"targets\": [ 1 ] },\n\t *          { \"name\": \"platform\", \"targets\": [ 2 ] },\n\t *          { \"name\": \"version\", \"targets\": [ 3 ] },\n\t *          { \"name\": \"grade\", \"targets\": [ 4 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"name\": \"engine\" },\n\t *          { \"name\": \"browser\" },\n\t *          { \"name\": \"platform\" },\n\t *          { \"name\": \"version\" },\n\t *          { \"name\": \"grade\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sName\": \"\",\n\n\n\t/**\n\t * Defines a data source type for the ordering which can be used to read\n\t * real-time information from the table (updating the internally cached\n\t * version) prior to ordering. This allows ordering to occur on user\n\t * editable elements such as form inputs.\n\t *  @type string\n\t *  @default std\n\t *\n\t *  @name DataTable.defaults.column.orderDataType\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"orderDataType\": \"dom-text\", \"targets\": [ 2, 3 ] },\n\t *          { \"type\": \"numeric\", \"targets\": [ 3 ] },\n\t *          { \"orderDataType\": \"dom-select\", \"targets\": [ 4 ] },\n\t *          { \"orderDataType\": \"dom-checkbox\", \"targets\": [ 5 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          null,\n\t *          null,\n\t *          { \"orderDataType\": \"dom-text\" },\n\t *          { \"orderDataType\": \"dom-text\", \"type\": \"numeric\" },\n\t *          { \"orderDataType\": \"dom-select\" },\n\t *          { \"orderDataType\": \"dom-checkbox\" }\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sSortDataType\": \"std\",\n\n\n\t/**\n\t * The title of this column.\n\t *  @type string\n\t *  @default null <i>Derived from the 'TH' value for this column in the\n\t *    original HTML table.</i>\n\t *\n\t *  @name DataTable.defaults.column.title\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"title\": \"My column title\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"title\": \"My column title\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sTitle\": null,\n\n\n\t/**\n\t * The type allows you to specify how the data for this column will be\n\t * ordered. Four types (string, numeric, date and html (which will strip\n\t * HTML tags before ordering)) are currently available. Note that only date\n\t * formats understood by Javascript's Date() object will be accepted as type\n\t * date. For example: \"Mar 26, 2008 5:03 PM\". May take the values: 'string',\n\t * 'numeric', 'date' or 'html' (by default). Further types can be adding\n\t * through plug-ins.\n\t *  @type string\n\t *  @default null <i>Auto-detected from raw data</i>\n\t *\n\t *  @name DataTable.defaults.column.type\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"type\": \"html\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"type\": \"html\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sType\": null,\n\n\n\t/**\n\t * Defining the width of the column, this parameter may take any CSS value\n\t * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not\n\t * been given a specific width through this interface ensuring that the table\n\t * remains readable.\n\t *  @type string\n\t *  @default null <i>Automatic</i>\n\t *\n\t *  @name DataTable.defaults.column.width\n\t *  @dtopt Columns\n\t *\n\t *  @example\n\t *    // Using `columnDefs`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columnDefs\": [\n\t *          { \"width\": \"20%\", \"targets\": [ 0 ] }\n\t *        ]\n\t *      } );\n\t *    } );\n\t *\n\t *  @example\n\t *    // Using `columns`\n\t *    $(document).ready( function() {\n\t *      $('#example').dataTable( {\n\t *        \"columns\": [\n\t *          { \"width\": \"20%\" },\n\t *          null,\n\t *          null,\n\t *          null,\n\t *          null\n\t *        ]\n\t *      } );\n\t *    } );\n\t */\n\t\"sWidth\": null\n};\n\n_fnHungarianMap( DataTable.defaults.column );\n\n\n\n/**\n * DataTables settings object - this holds all the information needed for a\n * given table, including configuration, data and current application of the\n * table options. DataTables does not have a single instance for each DataTable\n * with the settings attached to that instance, but rather instances of the\n * DataTable \"class\" are created on-the-fly as needed (typically by a\n * $().dataTable() call) and the settings object is then applied to that\n * instance.\n *\n * Note that this object is related to {@link DataTable.defaults} but this\n * one is the internal data store for DataTables's cache of columns. It should\n * NOT be manipulated outside of DataTables. Any configuration should be done\n * through the initialisation options.\n *  @namespace\n *  @todo Really should attach the settings object to individual instances so we\n *    don't need to create new instances on each $().dataTable() call (if the\n *    table already exists). It would also save passing oSettings around and\n *    into every single function. However, this is a very significant\n *    architecture change for DataTables and will almost certainly break\n *    backwards compatibility with older installations. This is something that\n *    will be done in 2.0.\n */\nDataTable.models.oSettings = {\n\t/**\n\t * Primary features of DataTables and their enablement state.\n\t *  @namespace\n\t */\n\t\"oFeatures\": {\n\n\t\t/**\n\t\t * Flag to say if DataTables should automatically try to calculate the\n\t\t * optimum table and columns widths (true) or not (false).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bAutoWidth\": null,\n\n\t\t/**\n\t\t * Delay the creation of TR and TD elements until they are actually\n\t\t * needed by a driven page draw. This can give a significant speed\n\t\t * increase for Ajax source and Javascript source data, but makes no\n\t\t * difference at all for DOM and server-side processing tables.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bDeferRender\": null,\n\n\t\t/**\n\t\t * Enable filtering on the table or not. Note that if this is disabled\n\t\t * then there is no filtering at all on the table, including fnFilter.\n\t\t * To just remove the filtering input use sDom and remove the 'f' option.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bFilter\": null,\n\n\t\t/**\n\t\t * Table information element (the 'Showing x of y records' div) enable\n\t\t * flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bInfo\": null,\n\n\t\t/**\n\t\t * Present a user control allowing the end user to change the page size\n\t\t * when pagination is enabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bLengthChange\": null,\n\n\t\t/**\n\t\t * Pagination enabled or not. Note that if this is disabled then length\n\t\t * changing must also be disabled.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bPaginate\": null,\n\n\t\t/**\n\t\t * Processing indicator enable flag whenever DataTables is enacting a\n\t\t * user request - typically an Ajax request for server-side processing.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bProcessing\": null,\n\n\t\t/**\n\t\t * Server-side processing enabled flag - when enabled DataTables will\n\t\t * get all data from the server for every draw - there is no filtering,\n\t\t * sorting or paging done on the client-side.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bServerSide\": null,\n\n\t\t/**\n\t\t * Sorting enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSort\": null,\n\n\t\t/**\n\t\t * Multi-column sorting\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortMulti\": null,\n\n\t\t/**\n\t\t * Apply a class to the columns which are being sorted to provide a\n\t\t * visual highlight or not. This can slow things down when enabled since\n\t\t * there is a lot of DOM interaction.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bSortClasses\": null,\n\n\t\t/**\n\t\t * State saving enablement flag.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bStateSave\": null\n\t},\n\n\n\t/**\n\t * Scrolling settings for a table.\n\t *  @namespace\n\t */\n\t\"oScroll\": {\n\t\t/**\n\t\t * When the table is shorter in height than sScrollY, collapse the\n\t\t * table container down to the height of the table (when true).\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type boolean\n\t\t */\n\t\t\"bCollapse\": null,\n\n\t\t/**\n\t\t * Width of the scrollbar for the web-browser's platform. Calculated\n\t\t * during table initialisation.\n\t\t *  @type int\n\t\t *  @default 0\n\t\t */\n\t\t\"iBarWidth\": 0,\n\n\t\t/**\n\t\t * Viewport width for horizontal scrolling. Horizontal scrolling is\n\t\t * disabled if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sX\": null,\n\n\t\t/**\n\t\t * Width to expand the table to when using x-scrolling. Typically you\n\t\t * should not need to use this.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t *  @deprecated\n\t\t */\n\t\t\"sXInner\": null,\n\n\t\t/**\n\t\t * Viewport height for vertical scrolling. Vertical scrolling is disabled\n\t\t * if an empty string.\n\t\t * Note that this parameter will be set by the initialisation routine. To\n\t\t * set a default use {@link DataTable.defaults}.\n\t\t *  @type string\n\t\t */\n\t\t\"sY\": null\n\t},\n\n\t/**\n\t * Language information for the table.\n\t *  @namespace\n\t *  @extends DataTable.defaults.oLanguage\n\t */\n\t\"oLanguage\": {\n\t\t/**\n\t\t * Information callback function. See\n\t\t * {@link DataTable.defaults.fnInfoCallback}\n\t\t *  @type function\n\t\t *  @default null\n\t\t */\n\t\t\"fnInfoCallback\": null\n\t},\n\n\t/**\n\t * Browser support parameters\n\t *  @namespace\n\t */\n\t\"oBrowser\": {\n\t\t/**\n\t\t * Indicate if the browser incorrectly calculates width:100% inside a\n\t\t * scrolling element (IE6/7)\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollOversize\": false,\n\n\t\t/**\n\t\t * Determine if the vertical scrollbar is on the right or left of the\n\t\t * scrolling container - needed for rtl language layout, although not\n\t\t * all browsers move the scrollbar (Safari).\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bScrollbarLeft\": false,\n\n\t\t/**\n\t\t * Flag for if `getBoundingClientRect` is fully supported or not\n\t\t *  @type boolean\n\t\t *  @default false\n\t\t */\n\t\t\"bBounding\": false,\n\n\t\t/**\n\t\t * Browser scrollbar width\n\t\t *  @type integer\n\t\t *  @default 0\n\t\t */\n\t\t\"barWidth\": 0\n\t},\n\n\n\t\"ajax\": null,\n\n\n\t/**\n\t * Array referencing the nodes which are used for the features. The\n\t * parameters of this object match what is allowed by sDom - i.e.\n\t *   <ul>\n\t *     <li>'l' - Length changing</li>\n\t *     <li>'f' - Filtering input</li>\n\t *     <li>'t' - The table!</li>\n\t *     <li>'i' - Information</li>\n\t *     <li>'p' - Pagination</li>\n\t *     <li>'r' - pRocessing</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aanFeatures\": [],\n\n\t/**\n\t * Store data information - see {@link DataTable.models.oRow} for detailed\n\t * information.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoData\": [],\n\n\t/**\n\t * Array of indexes which are in the current display (after filtering etc)\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplay\": [],\n\n\t/**\n\t * Array of indexes for display - no filtering\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aiDisplayMaster\": [],\n\n\t/**\n\t * Map of row ids to data indexes\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"aIds\": {},\n\n\t/**\n\t * Store information about each column that is in use\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoColumns\": [],\n\n\t/**\n\t * Store information about the table's header\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeader\": [],\n\n\t/**\n\t * Store information about the table's footer\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooter\": [],\n\n\t/**\n\t * Store the applied global search information in case we want to force a\n\t * research or compare the old search to a new one.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @namespace\n\t *  @extends DataTable.models.oSearch\n\t */\n\t\"oPreviousSearch\": {},\n\n\t/**\n\t * Store the applied search for each column - see\n\t * {@link DataTable.models.oSearch} for the format that is used for the\n\t * filtering information for each column.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreSearchCols\": [],\n\n\t/**\n\t * Sorting that is applied to the table. Note that the inner arrays are\n\t * used in the following manner:\n\t * <ul>\n\t *   <li>Index 0 - column number</li>\n\t *   <li>Index 1 - current sorting direction</li>\n\t * </ul>\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @todo These inner arrays should really be objects\n\t */\n\t\"aaSorting\": null,\n\n\t/**\n\t * Sorting that is always applied to the table (i.e. prefixed in front of\n\t * aaSorting).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aaSortingFixed\": [],\n\n\t/**\n\t * Classes to use for the striping of a table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asStripeClasses\": null,\n\n\t/**\n\t * If restoring a table - we should restore its striping classes as well\n\t *  @type array\n\t *  @default []\n\t */\n\t\"asDestroyStripes\": [],\n\n\t/**\n\t * If restoring a table - we should restore its width\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"sDestroyWidth\": 0,\n\n\t/**\n\t * Callback functions array for every time a row is inserted (i.e. on a draw).\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCallback\": [],\n\n\t/**\n\t * Callback functions for the header on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoHeaderCallback\": [],\n\n\t/**\n\t * Callback function for the footer on each draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoFooterCallback\": [],\n\n\t/**\n\t * Array of callback functions for draw callback functions\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDrawCallback\": [],\n\n\t/**\n\t * Array of callback functions for row created function\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoRowCreatedCallback\": [],\n\n\t/**\n\t * Callback functions for just before the table is redrawn. A return of\n\t * false will be used to cancel the draw.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoPreDrawCallback\": [],\n\n\t/**\n\t * Callback functions for when the table has been initialised.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoInitComplete\": [],\n\n\n\t/**\n\t * Callbacks for modifying the settings to be stored for state saving, prior to\n\t * saving state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSaveParams\": [],\n\n\t/**\n\t * Callbacks for modifying the settings that have been stored for state saving\n\t * prior to using the stored values to restore the state.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoadParams\": [],\n\n\t/**\n\t * Callbacks for operating on the settings object once the saved state has been\n\t * loaded\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoaded\": [],\n\n\t/**\n\t * Cache the table ID for quick access\n\t *  @type string\n\t *  @default <i>Empty string</i>\n\t */\n\t\"sTableId\": \"\",\n\n\t/**\n\t * The TABLE node for the main table\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTable\": null,\n\n\t/**\n\t * Permanent ref to the thead element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTHead\": null,\n\n\t/**\n\t * Permanent ref to the tfoot element - if it exists\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTFoot\": null,\n\n\t/**\n\t * Permanent ref to the tbody element\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTBody\": null,\n\n\t/**\n\t * Cache the wrapper node (contains all DataTables controlled elements)\n\t *  @type node\n\t *  @default null\n\t */\n\t\"nTableWrapper\": null,\n\n\t/**\n\t * Indicate if when using server-side processing the loading of data\n\t * should be deferred until the second draw.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDeferLoading\": false,\n\n\t/**\n\t * Indicate if all required information has been read in\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bInitialised\": false,\n\n\t/**\n\t * Information about open rows. Each object in the array has the parameters\n\t * 'nTr' and 'nParent'\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoOpenRows\": [],\n\n\t/**\n\t * Dictate the positioning of DataTables' control elements - see\n\t * {@link DataTable.model.oInit.sDom}.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sDom\": null,\n\n\t/**\n\t * Search delay (in mS)\n\t *  @type integer\n\t *  @default null\n\t */\n\t\"searchDelay\": null,\n\n\t/**\n\t * Which type of pagination should be used.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default two_button\n\t */\n\t\"sPaginationType\": \"two_button\",\n\n\t/**\n\t * The state duration (for `stateSave`) in seconds.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iStateDuration\": 0,\n\n\t/**\n\t * Array of callback functions for state saving. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the JSON string to save that has been thus far created. Returns\n\t *       a JSON string to be inserted into a json object\n\t *       (i.e. '\"param\": [ 0, 1, 2]')</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateSave\": [],\n\n\t/**\n\t * Array of callback functions for state loading. Each array element is an\n\t * object with the following parameters:\n\t *   <ul>\n\t *     <li>function:fn - function to call. Takes two parameters, oSettings\n\t *       and the object stored. May return false to cancel state loading</li>\n\t *     <li>string:sName - name of callback</li>\n\t *   </ul>\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoStateLoad\": [],\n\n\t/**\n\t * State that was saved. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oSavedState\": null,\n\n\t/**\n\t * State that was loaded. Useful for back reference\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oLoadedState\": null,\n\n\t/**\n\t * Source url for AJAX data for the table.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sAjaxSource\": null,\n\n\t/**\n\t * Property from a given object from which to read the table data from. This\n\t * can be an empty string (when not server-side processing), in which case\n\t * it is  assumed an an array is given directly.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sAjaxDataProp\": null,\n\n\t/**\n\t * The last jQuery XHR object that was used for server-side data gathering.\n\t * This can be used for working with the XHR information in one of the\n\t * callbacks\n\t *  @type object\n\t *  @default null\n\t */\n\t\"jqXHR\": null,\n\n\t/**\n\t * JSON returned from the server in the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"json\": undefined,\n\n\t/**\n\t * Data submitted as part of the last Ajax request\n\t *  @type object\n\t *  @default undefined\n\t */\n\t\"oAjaxData\": undefined,\n\n\t/**\n\t * Function to get the server-side data.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnServerData\": null,\n\n\t/**\n\t * Functions which are called prior to sending an Ajax request so extra\n\t * parameters can easily be sent to the server\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoServerParams\": [],\n\n\t/**\n\t * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if\n\t * required).\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type string\n\t */\n\t\"sServerMethod\": null,\n\n\t/**\n\t * Format numbers for display.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type function\n\t */\n\t\"fnFormatNumber\": null,\n\n\t/**\n\t * List of options that can be used for the user selectable length menu.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLengthMenu\": null,\n\n\t/**\n\t * Counter for the draws that the table does. Also used as a tracker for\n\t * server-side processing\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"iDraw\": 0,\n\n\t/**\n\t * Indicate if a redraw is being done - useful for Ajax\n\t *  @type boolean\n\t *  @default false\n\t */\n\t\"bDrawing\": false,\n\n\t/**\n\t * Draw index (iDraw) of the last error when parsing the returned data\n\t *  @type int\n\t *  @default -1\n\t */\n\t\"iDrawError\": -1,\n\n\t/**\n\t * Paging display length\n\t *  @type int\n\t *  @default 10\n\t */\n\t\"_iDisplayLength\": 10,\n\n\t/**\n\t * Paging start point - aiDisplay index\n\t *  @type int\n\t *  @default 0\n\t */\n\t\"_iDisplayStart\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the result set\n\t * (i.e. before filtering), Use fnRecordsTotal rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type int\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsTotal\": 0,\n\n\t/**\n\t * Server-side processing - number of records in the current display set\n\t * (i.e. after filtering). Use fnRecordsDisplay rather than\n\t * this property to get the value of the number of records, regardless of\n\t * the server-side processing setting.\n\t *  @type boolean\n\t *  @default 0\n\t *  @private\n\t */\n\t\"_iRecordsDisplay\": 0,\n\n\t/**\n\t * The classes to use for the table\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oClasses\": {},\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if filtering has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bFiltered\": false,\n\n\t/**\n\t * Flag attached to the settings object so you can check in the draw\n\t * callback if sorting has been done in the draw. Deprecated in favour of\n\t * events.\n\t *  @type boolean\n\t *  @default false\n\t *  @deprecated\n\t */\n\t\"bSorted\": false,\n\n\t/**\n\t * Indicate that if multiple rows are in the header and there is more than\n\t * one unique cell per column, if the top one (true) or bottom one (false)\n\t * should be used for sorting / title by DataTables.\n\t * Note that this parameter will be set by the initialisation routine. To\n\t * set a default use {@link DataTable.defaults}.\n\t *  @type boolean\n\t */\n\t\"bSortCellsTop\": null,\n\n\t/**\n\t * Initialisation object that is used for the table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInit\": null,\n\n\t/**\n\t * Destroy callback functions - for plug-ins to attach themselves to the\n\t * destroy so they can clean up markup and events.\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aoDestroyCallback\": [],\n\n\n\t/**\n\t * Get the number of records in the current record set, before filtering\n\t *  @type function\n\t */\n\t\"fnRecordsTotal\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsTotal * 1 :\n\t\t\tthis.aiDisplayMaster.length;\n\t},\n\n\t/**\n\t * Get the number of records in the current record set, after filtering\n\t *  @type function\n\t */\n\t\"fnRecordsDisplay\": function ()\n\t{\n\t\treturn _fnDataSource( this ) == 'ssp' ?\n\t\t\tthis._iRecordsDisplay * 1 :\n\t\t\tthis.aiDisplay.length;\n\t},\n\n\t/**\n\t * Get the display end point - aiDisplay index\n\t *  @type function\n\t */\n\t\"fnDisplayEnd\": function ()\n\t{\n\t\tvar\n\t\t\tlen      = this._iDisplayLength,\n\t\t\tstart    = this._iDisplayStart,\n\t\t\tcalc     = start + len,\n\t\t\trecords  = this.aiDisplay.length,\n\t\t\tfeatures = this.oFeatures,\n\t\t\tpaginate = features.bPaginate;\n\n\t\tif ( features.bServerSide ) {\n\t\t\treturn paginate === false || len === -1 ?\n\t\t\t\tstart + records :\n\t\t\t\tMath.min( start+len, this._iRecordsDisplay );\n\t\t}\n\t\telse {\n\t\t\treturn ! paginate || calc>records || len===-1 ?\n\t\t\t\trecords :\n\t\t\t\tcalc;\n\t\t}\n\t},\n\n\t/**\n\t * The DataTables object for this table\n\t *  @type object\n\t *  @default null\n\t */\n\t\"oInstance\": null,\n\n\t/**\n\t * Unique identifier for each instance of the DataTables object. If there\n\t * is an ID on the table node, then it takes that value, otherwise an\n\t * incrementing internal counter is used.\n\t *  @type string\n\t *  @default null\n\t */\n\t\"sInstance\": null,\n\n\t/**\n\t * tabindex attribute value that is added to DataTables control elements, allowing\n\t * keyboard navigation of the table and its controls.\n\t */\n\t\"iTabIndex\": 0,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollHead\": null,\n\n\t/**\n\t * DIV container for the footer scrolling table if scrolling\n\t */\n\t\"nScrollFoot\": null,\n\n\t/**\n\t * Last applied sort\n\t *  @type array\n\t *  @default []\n\t */\n\t\"aLastSort\": [],\n\n\t/**\n\t * Stored plug-in instances\n\t *  @type object\n\t *  @default {}\n\t */\n\t\"oPlugins\": {},\n\n\t/**\n\t * Function used to get a row's id from the row's data\n\t *  @type function\n\t *  @default null\n\t */\n\t\"rowIdFn\": null,\n\n\t/**\n\t * Data location where to store a row's id\n\t *  @type string\n\t *  @default null\n\t */\n\t\"rowId\": null\n};\n\n/**\n * Extension object for DataTables that is used to provide all extension\n * options.\n *\n * Note that the `DataTable.ext` object is available through\n * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is\n * also aliased to `jQuery.fn.dataTableExt` for historic reasons.\n *  @namespace\n *  @extends DataTable.models.ext\n */\n\n\n/**\n * DataTables extensions\n * \n * This namespace acts as a collection area for plug-ins that can be used to\n * extend DataTables capabilities. Indeed many of the build in methods\n * use this method to provide their own capabilities (sorting methods for\n * example).\n *\n * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy\n * reasons\n *\n *  @namespace\n */\nDataTable.ext = _ext = {\n\t/**\n\t * Buttons. For use with the Buttons extension for DataTables. This is\n\t * defined here so other extensions can define buttons regardless of load\n\t * order. It is _not_ used by DataTables core.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tbuttons: {},\n\n\n\t/**\n\t * Element class names\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tclasses: {},\n\n\n\t/**\n\t * DataTables build type (expanded by the download builder)\n\t *\n\t *  @type string\n\t */\n\tbuilder: \"-source-\",\n\n\n\t/**\n\t * Error reporting.\n\t * \n\t * How should DataTables report an error. Can take the value 'alert',\n\t * 'throw', 'none' or a function.\n\t *\n\t *  @type string|function\n\t *  @default alert\n\t */\n\terrMode: \"alert\",\n\n\n\t/**\n\t * Feature plug-ins.\n\t * \n\t * This is an array of objects which describe the feature plug-ins that are\n\t * available to DataTables. These feature plug-ins are then available for\n\t * use through the `dom` initialisation option.\n\t * \n\t * Each feature plug-in is described by an object which must have the\n\t * following properties:\n\t * \n\t * * `fnInit` - function that is used to initialise the plug-in,\n\t * * `cFeature` - a character so the feature can be enabled by the `dom`\n\t *   instillation option. This is case sensitive.\n\t *\n\t * The `fnInit` function has the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t *\n\t * And the following return is expected:\n\t * \n\t * * {node|null} The element which contains your feature. Note that the\n\t *   return may also be void if your plug-in does not require to inject any\n\t *   DOM elements into DataTables control (`dom`) - for example this might\n\t *   be useful when developing a plug-in which allows table control via\n\t *   keyboard entry\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    $.fn.dataTable.ext.features.push( {\n\t *      \"fnInit\": function( oSettings ) {\n\t *        return new TableTools( { \"oDTSettings\": oSettings } );\n\t *      },\n\t *      \"cFeature\": \"T\"\n\t *    } );\n\t */\n\tfeature: [],\n\n\n\t/**\n\t * Row searching.\n\t * \n\t * This method of searching is complimentary to the default type based\n\t * searching, and a lot more comprehensive as it allows you complete control\n\t * over the searching logic. Each element in this array is a function\n\t * (parameters described below) that is called for every row in the table,\n\t * and your logic decides if it should be included in the searching data set\n\t * or not.\n\t *\n\t * Searching functions have the following input parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{array|object}` Data for the row to be processed (same as the\n\t *    original format that was passed in as the data source, or an array\n\t *    from a DOM data source\n\t * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which\n\t *    can be useful to retrieve the `TR` element if you need DOM interaction.\n\t *\n\t * And the following return is expected:\n\t *\n\t * * {boolean} Include the row in the searched result set (true) or not\n\t *   (false)\n\t *\n\t * Note that as with the main search ability in DataTables, technically this\n\t * is \"filtering\", since it is subtractive. However, for consistency in\n\t * naming we call it searching here.\n\t *\n\t *  @type array\n\t *  @default []\n\t *\n\t *  @example\n\t *    // The following example shows custom search being applied to the\n\t *    // fourth column (i.e. the data[3] index) based on two input values\n\t *    // from the end-user, matching the data in a certain range.\n\t *    $.fn.dataTable.ext.search.push(\n\t *      function( settings, data, dataIndex ) {\n\t *        var min = document.getElementById('min').value * 1;\n\t *        var max = document.getElementById('max').value * 1;\n\t *        var version = data[3] == \"-\" ? 0 : data[3]*1;\n\t *\n\t *        if ( min == \"\" && max == \"\" ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min == \"\" && version < max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && \"\" == max ) {\n\t *          return true;\n\t *        }\n\t *        else if ( min < version && version < max ) {\n\t *          return true;\n\t *        }\n\t *        return false;\n\t *      }\n\t *    );\n\t */\n\tsearch: [],\n\n\n\t/**\n\t * Selector extensions\n\t *\n\t * The `selector` option can be used to extend the options available for the\n\t * selector modifier options (`selector-modifier` object data type) that\n\t * each of the three built in selector types offer (row, column and cell +\n\t * their plural counterparts). For example the Select extension uses this\n\t * mechanism to provide an option to select only rows, columns and cells\n\t * that have been marked as selected by the end user (`{selected: true}`),\n\t * which can be used in conjunction with the existing built in selector\n\t * options.\n\t *\n\t * Each property is an array to which functions can be pushed. The functions\n\t * take three attributes:\n\t *\n\t * * Settings object for the host table\n\t * * Options object (`selector-modifier` object type)\n\t * * Array of selected item indexes\n\t *\n\t * The return is an array of the resulting item indexes after the custom\n\t * selector has been applied.\n\t *\n\t *  @type object\n\t */\n\tselector: {\n\t\tcell: [],\n\t\tcolumn: [],\n\t\trow: []\n\t},\n\n\n\t/**\n\t * Internal functions, exposed for used in plug-ins.\n\t * \n\t * Please note that you should not need to use the internal methods for\n\t * anything other than a plug-in (and even then, try to avoid if possible).\n\t * The internal function may change between releases.\n\t *\n\t *  @type object\n\t *  @default {}\n\t */\n\tinternal: {},\n\n\n\t/**\n\t * Legacy configuration options. Enable and disable legacy options that\n\t * are available in DataTables.\n\t *\n\t *  @type object\n\t */\n\tlegacy: {\n\t\t/**\n\t\t * Enable / disable DataTables 1.9 compatible server-side processing\n\t\t * requests\n\t\t *\n\t\t *  @type boolean\n\t\t *  @default null\n\t\t */\n\t\tajax: null\n\t},\n\n\n\t/**\n\t * Pagination plug-in methods.\n\t * \n\t * Each entry in this object is a function and defines which buttons should\n\t * be shown by the pagination rendering method that is used for the table:\n\t * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the\n\t * buttons are displayed in the document, while the functions here tell it\n\t * what buttons to display. This is done by returning an array of button\n\t * descriptions (what each button will do).\n\t *\n\t * Pagination types (the four built in options and any additional plug-in\n\t * options defined here) can be used through the `paginationType`\n\t * initialisation parameter.\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{int} page` The current page index\n\t * 2. `{int} pages` The number of pages in the table\n\t *\n\t * Each function is expected to return an array where each element of the\n\t * array can be one of:\n\t *\n\t * * `first` - Jump to first page when activated\n\t * * `last` - Jump to last page when activated\n\t * * `previous` - Show previous page when activated\n\t * * `next` - Show next page when activated\n\t * * `{int}` - Show page of the index given\n\t * * `{array}` - A nested array containing the above elements to add a\n\t *   containing 'DIV' element (might be useful for styling).\n\t *\n\t * Note that DataTables v1.9- used this object slightly differently whereby\n\t * an object with two functions would be defined for each plug-in. That\n\t * ability is still supported by DataTables 1.10+ to provide backwards\n\t * compatibility, but this option of use is now decremented and no longer\n\t * documented in DataTables 1.10+.\n\t *\n\t *  @type object\n\t *  @default {}\n\t *\n\t *  @example\n\t *    // Show previous, next and current page buttons only\n\t *    $.fn.dataTableExt.oPagination.current = function ( page, pages ) {\n\t *      return [ 'previous', page, 'next' ];\n\t *    };\n\t */\n\tpager: {},\n\n\n\trenderer: {\n\t\tpageButton: {},\n\t\theader: {}\n\t},\n\n\n\t/**\n\t * Ordering plug-ins - custom data source\n\t * \n\t * The extension options for ordering of data available here is complimentary\n\t * to the default type based ordering that DataTables typically uses. It\n\t * allows much greater control over the the data that is being used to\n\t * order a column, but is necessarily therefore more complex.\n\t * \n\t * This type of ordering is useful if you want to do ordering based on data\n\t * live from the DOM (for example the contents of an 'input' element) rather\n\t * than just the static string that DataTables knows of.\n\t * \n\t * The way these plug-ins work is that you create an array of the values you\n\t * wish to be ordering for the column in question and then return that\n\t * array. The data in the array much be in the index order of the rows in\n\t * the table (not the currently ordering order!). Which order data gathering\n\t * function is run here depends on the `dt-init columns.orderDataType`\n\t * parameter that is used for the column (if any).\n\t *\n\t * The functions defined take two parameters:\n\t *\n\t * 1. `{object}` DataTables settings object: see\n\t *    {@link DataTable.models.oSettings}\n\t * 2. `{int}` Target column index\n\t *\n\t * Each function is expected to return an array:\n\t *\n\t * * `{array}` Data for the column to be ordering upon\n\t *\n\t *  @type array\n\t *\n\t *  @example\n\t *    // Ordering using `input` node values\n\t *    $.fn.dataTable.ext.order['dom-text'] = function  ( settings, col )\n\t *    {\n\t *      return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {\n\t *        return $('input', td).val();\n\t *      } );\n\t *    }\n\t */\n\torder: {},\n\n\n\t/**\n\t * Type based plug-ins.\n\t *\n\t * Each column in DataTables has a type assigned to it, either by automatic\n\t * detection or by direct assignment using the `type` option for the column.\n\t * The type of a column will effect how it is ordering and search (plug-ins\n\t * can also make use of the column type if required).\n\t *\n\t * @namespace\n\t */\n\ttype: {\n\t\t/**\n\t\t * Type detection functions.\n\t\t *\n\t\t * The functions defined in this object are used to automatically detect\n\t\t * a column's type, making initialisation of DataTables super easy, even\n\t\t * when complex data is in the table.\n\t\t *\n\t\t * The functions defined take two parameters:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be analysed\n\t     *  2. `{settings}` DataTables settings object. This can be used to\n\t     *     perform context specific type detection - for example detection\n\t     *     based on language settings such as using a comma for a decimal\n\t     *     place. Generally speaking the options from the settings will not\n\t     *     be required\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Data type detected, or null if unknown (and thus\n\t\t *   pass it on to the other type detection functions.\n\t\t *\n\t\t *  @type array\n\t\t *\n\t\t *  @example\n\t\t *    // Currency type detection plug-in:\n\t\t *    $.fn.dataTable.ext.type.detect.push(\n\t\t *      function ( data, settings ) {\n\t\t *        // Check the numeric part\n\t\t *        if ( ! data.substring(1).match(/[0-9]/) ) {\n\t\t *          return null;\n\t\t *        }\n\t\t *\n\t\t *        // Check prefixed by currency\n\t\t *        if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {\n\t\t *          return 'currency';\n\t\t *        }\n\t\t *        return null;\n\t\t *      }\n\t\t *    );\n\t\t */\n\t\tdetect: [],\n\n\n\t\t/**\n\t\t * Type based search formatting.\n\t\t *\n\t\t * The type based searching functions can be used to pre-format the\n\t\t * data to be search on. For example, it can be used to strip HTML\n\t\t * tags or to de-format telephone numbers for numeric only searching.\n\t\t *\n\t\t * Note that is a search is not defined for a column of a given type,\n\t\t * no search formatting will be performed.\n\t\t * \n\t\t * Pre-processing of searching data plug-ins - When you assign the sType\n\t\t * for a column (or have it automatically detected for you by DataTables\n\t\t * or a type detection plug-in), you will typically be using this for\n\t\t * custom sorting, but it can also be used to provide custom searching\n\t\t * by allowing you to pre-processing the data and returning the data in\n\t\t * the format that should be searched upon. This is done by adding\n\t\t * functions this object with a parameter name which matches the sType\n\t\t * for that target column. This is the corollary of <i>afnSortData</i>\n\t\t * for searching data.\n\t\t *\n\t\t * The functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for searching\n\t\t *\n\t\t * Each function is expected to return:\n\t\t *\n\t\t * * `{string|null}` Formatted string that will be used for the searching.\n\t\t *\n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {\n\t\t *      return d.replace(/\\n/g,\" \").replace( /<.*?>/g, \"\" );\n\t\t *    }\n\t\t */\n\t\tsearch: {},\n\n\n\t\t/**\n\t\t * Type based ordering.\n\t\t *\n\t\t * The column type tells DataTables what ordering to apply to the table\n\t\t * when a column is sorted upon. The order for each type that is defined,\n\t\t * is defined by the functions available in this object.\n\t\t *\n\t\t * Each ordering option can be described by three properties added to\n\t\t * this object:\n\t\t *\n\t\t * * `{type}-pre` - Pre-formatting function\n\t\t * * `{type}-asc` - Ascending order function\n\t\t * * `{type}-desc` - Descending order function\n\t\t *\n\t\t * All three can be used together, only `{type}-pre` or only\n\t\t * `{type}-asc` and `{type}-desc` together. It is generally recommended\n\t\t * that only `{type}-pre` is used, as this provides the optimal\n\t\t * implementation in terms of speed, although the others are provided\n\t\t * for compatibility with existing Javascript sort functions.\n\t\t *\n\t\t * `{type}-pre`: Functions defined take a single parameter:\n\t\t *\n\t     *  1. `{*}` Data from the column cell to be prepared for ordering\n\t\t *\n\t\t * And return:\n\t\t *\n\t\t * * `{*}` Data to be sorted upon\n\t\t *\n\t\t * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort\n\t\t * functions, taking two parameters:\n\t\t *\n\t     *  1. `{*}` Data to compare to the second parameter\n\t     *  2. `{*}` Data to compare to the first parameter\n\t\t *\n\t\t * And returning:\n\t\t *\n\t\t * * `{*}` Ordering match: <0 if first parameter should be sorted lower\n\t\t *   than the second parameter, ===0 if the two parameters are equal and\n\t\t *   >0 if the first parameter should be sorted height than the second\n\t\t *   parameter.\n\t\t * \n\t\t *  @type object\n\t\t *  @default {}\n\t\t *\n\t\t *  @example\n\t\t *    // Numeric ordering of formatted numbers with a pre-formatter\n\t\t *    $.extend( $.fn.dataTable.ext.type.order, {\n\t\t *      \"string-pre\": function(x) {\n\t\t *        a = (a === \"-\" || a === \"\") ? 0 : a.replace( /[^\\d\\-\\.]/g, \"\" );\n\t\t *        return parseFloat( a );\n\t\t *      }\n\t\t *    } );\n\t\t *\n\t\t *  @example\n\t\t *    // Case-sensitive string ordering, with no pre-formatting method\n\t\t *    $.extend( $.fn.dataTable.ext.order, {\n\t\t *      \"string-case-asc\": function(x,y) {\n\t\t *        return ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t\t *      },\n\t\t *      \"string-case-desc\": function(x,y) {\n\t\t *        return ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t\t *      }\n\t\t *    } );\n\t\t */\n\t\torder: {}\n\t},\n\n\t/**\n\t * Unique DataTables instance counter\n\t *\n\t * @type int\n\t * @private\n\t */\n\t_unique: 0,\n\n\n\t//\n\t// Depreciated\n\t// The following properties are retained for backwards compatibility only.\n\t// The should not be used in new projects and will be removed in a future\n\t// version\n\t//\n\n\t/**\n\t * Version check function.\n\t *  @type function\n\t *  @depreciated Since 1.10\n\t */\n\tfnVersionCheck: DataTable.fnVersionCheck,\n\n\n\t/**\n\t * Index for what 'this' index API functions should use\n\t *  @type int\n\t *  @deprecated Since v1.10\n\t */\n\tiApiIndex: 0,\n\n\n\t/**\n\t * jQuery UI class container\n\t *  @type object\n\t *  @deprecated Since v1.10\n\t */\n\toJUIClasses: {},\n\n\n\t/**\n\t * Software version\n\t *  @type string\n\t *  @deprecated Since v1.10\n\t */\n\tsVersion: DataTable.version\n};\n\n\n//\n// Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts\n//\n$.extend( _ext, {\n\tafnFiltering: _ext.search,\n\taTypes:       _ext.type.detect,\n\tofnSearch:    _ext.type.search,\n\toSort:        _ext.type.order,\n\tafnSortData:  _ext.order,\n\taoFeatures:   _ext.feature,\n\toApi:         _ext.internal,\n\toStdClasses:  _ext.classes,\n\toPagination:  _ext.pager\n} );\n\n\n$.extend( DataTable.ext.classes, {\n\t\"sTable\": \"dataTable\",\n\t\"sNoFooter\": \"no-footer\",\n\n\t/* Paging buttons */\n\t\"sPageButton\": \"paginate_button\",\n\t\"sPageButtonActive\": \"current\",\n\t\"sPageButtonDisabled\": \"disabled\",\n\n\t/* Striping classes */\n\t\"sStripeOdd\": \"odd\",\n\t\"sStripeEven\": \"even\",\n\n\t/* Empty row */\n\t\"sRowEmpty\": \"dataTables_empty\",\n\n\t/* Features */\n\t\"sWrapper\": \"dataTables_wrapper\",\n\t\"sFilter\": \"dataTables_filter\",\n\t\"sInfo\": \"dataTables_info\",\n\t\"sPaging\": \"dataTables_paginate paging_\", /* Note that the type is postfixed */\n\t\"sLength\": \"dataTables_length\",\n\t\"sProcessing\": \"dataTables_processing\",\n\n\t/* Sorting */\n\t\"sSortAsc\": \"sorting_asc\",\n\t\"sSortDesc\": \"sorting_desc\",\n\t\"sSortable\": \"sorting\", /* Sortable in both directions */\n\t\"sSortableAsc\": \"sorting_desc_disabled\",\n\t\"sSortableDesc\": \"sorting_asc_disabled\",\n\t\"sSortableNone\": \"sorting_disabled\",\n\t\"sSortColumn\": \"sorting_\", /* Note that an int is postfixed for the sorting order */\n\n\t/* Filtering */\n\t\"sFilterInput\": \"\",\n\n\t/* Page length */\n\t\"sLengthSelect\": \"\",\n\n\t/* Scrolling */\n\t\"sScrollWrapper\": \"dataTables_scroll\",\n\t\"sScrollHead\": \"dataTables_scrollHead\",\n\t\"sScrollHeadInner\": \"dataTables_scrollHeadInner\",\n\t\"sScrollBody\": \"dataTables_scrollBody\",\n\t\"sScrollFoot\": \"dataTables_scrollFoot\",\n\t\"sScrollFootInner\": \"dataTables_scrollFootInner\",\n\n\t/* Misc */\n\t\"sHeaderTH\": \"\",\n\t\"sFooterTH\": \"\",\n\n\t// Deprecated\n\t\"sSortJUIAsc\": \"\",\n\t\"sSortJUIDesc\": \"\",\n\t\"sSortJUI\": \"\",\n\t\"sSortJUIAscAllowed\": \"\",\n\t\"sSortJUIDescAllowed\": \"\",\n\t\"sSortJUIWrapper\": \"\",\n\t\"sSortIcon\": \"\",\n\t\"sJUIHeader\": \"\",\n\t\"sJUIFooter\": \"\"\n} );\n\n\nvar extPagination = DataTable.ext.pager;\n\nfunction _numbers ( page, pages ) {\n\tvar\n\t\tnumbers = [],\n\t\tbuttons = extPagination.numbers_length,\n\t\thalf = Math.floor( buttons / 2 ),\n\t\ti = 1;\n\n\tif ( pages <= buttons ) {\n\t\tnumbers = _range( 0, pages );\n\t}\n\telse if ( page <= half ) {\n\t\tnumbers = _range( 0, buttons-2 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t}\n\telse if ( page >= pages - 1 - half ) {\n\t\tnumbers = _range( pages-(buttons-2), pages );\n\t\tnumbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\telse {\n\t\tnumbers = _range( page-half+2, page+half-1 );\n\t\tnumbers.push( 'ellipsis' );\n\t\tnumbers.push( pages-1 );\n\t\tnumbers.splice( 0, 0, 'ellipsis' );\n\t\tnumbers.splice( 0, 0, 0 );\n\t}\n\n\tnumbers.DT_el = 'span';\n\treturn numbers;\n}\n\n\n$.extend( extPagination, {\n\tsimple: function ( page, pages ) {\n\t\treturn [ 'previous', 'next' ];\n\t},\n\n\tfull: function ( page, pages ) {\n\t\treturn [  'first', 'previous', 'next', 'last' ];\n\t},\n\n\tnumbers: function ( page, pages ) {\n\t\treturn [ _numbers(page, pages) ];\n\t},\n\n\tsimple_numbers: function ( page, pages ) {\n\t\treturn [ 'previous', _numbers(page, pages), 'next' ];\n\t},\n\n\tfull_numbers: function ( page, pages ) {\n\t\treturn [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];\n\t},\n\t\n\tfirst_last_numbers: function (page, pages) {\n \t\treturn ['first', _numbers(page, pages), 'last'];\n \t},\n\n\t// For testing and plug-ins to use\n\t_numbers: _numbers,\n\n\t// Number of number buttons (including ellipsis) to show. _Must be odd!_\n\tnumbers_length: 7\n} );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\tpageButton: {\n\t\t_: function ( settings, host, idx, buttons, page, pages ) {\n\t\t\tvar classes = settings.oClasses;\n\t\t\tvar lang = settings.oLanguage.oPaginate;\n\t\t\tvar aria = settings.oLanguage.oAria.paginate || {};\n\t\t\tvar btnDisplay, btnClass;\n\n\t\t\tvar attach = function( container, buttons ) {\n\t\t\t\tvar i, ien, node, button, tabIndex;\n\t\t\t\tvar disabledClass = classes.sPageButtonDisabled;\n\t\t\t\tvar clickHandler = function ( e ) {\n\t\t\t\t\t_fnPageChange( settings, e.data.action, true );\n\t\t\t\t};\n\n\t\t\t\tfor ( i=0, ien=buttons.length ; i<ien ; i++ ) {\n\t\t\t\t\tbutton = buttons[i];\n\n\t\t\t\t\tif ( Array.isArray( button ) ) {\n\t\t\t\t\t\tvar inner = $( '<'+(button.DT_el || 'div')+'/>' )\n\t\t\t\t\t\t\t.appendTo( container );\n\t\t\t\t\t\tattach( inner, button );\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tbtnDisplay = null;\n\t\t\t\t\t\tbtnClass = button;\n\t\t\t\t\t\ttabIndex = settings.iTabIndex;\n\n\t\t\t\t\t\tswitch ( button ) {\n\t\t\t\t\t\t\tcase 'ellipsis':\n\t\t\t\t\t\t\t\tcontainer.append('<span class=\"ellipsis\">&#x2026;</span>');\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'first':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sFirst;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'previous':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sPrevious;\n\n\t\t\t\t\t\t\t\tif ( page === 0 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'next':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sNext;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'last':\n\t\t\t\t\t\t\t\tbtnDisplay = lang.sLast;\n\n\t\t\t\t\t\t\t\tif ( pages === 0 || page === pages-1 ) {\n\t\t\t\t\t\t\t\t\ttabIndex = -1;\n\t\t\t\t\t\t\t\t\tbtnClass += ' ' + disabledClass;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbtnDisplay = settings.fnFormatNumber( button + 1 );\n\t\t\t\t\t\t\t\tbtnClass = page === button ?\n\t\t\t\t\t\t\t\t\tclasses.sPageButtonActive : '';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( btnDisplay !== null ) {\n\t\t\t\t\t\t\tvar tag = settings.oInit.pagingTag || 'a';\n\t\t\t\t\t\t\tvar disabled = btnClass.indexOf(disabledClass) !== -1;\n\t\t\n\n\t\t\t\t\t\t\tnode = $('<'+tag+'>', {\n\t\t\t\t\t\t\t\t\t'class': classes.sPageButton+' '+btnClass,\n\t\t\t\t\t\t\t\t\t'aria-controls': settings.sTableId,\n\t\t\t\t\t\t\t\t\t'aria-disabled': disabled ? 'true' : null,\n\t\t\t\t\t\t\t\t\t'aria-label': aria[ button ],\n\t\t\t\t\t\t\t\t\t'aria-role': 'link',\n\t\t\t\t\t\t\t\t\t'aria-current': btnClass === classes.sPageButtonActive ? 'page' : null,\n\t\t\t\t\t\t\t\t\t'data-dt-idx': button,\n\t\t\t\t\t\t\t\t\t'tabindex': tabIndex,\n\t\t\t\t\t\t\t\t\t'id': idx === 0 && typeof button === 'string' ?\n\t\t\t\t\t\t\t\t\t\tsettings.sTableId +'_'+ button :\n\t\t\t\t\t\t\t\t\t\tnull\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.html( btnDisplay )\n\t\t\t\t\t\t\t\t.appendTo( container );\n\n\t\t\t\t\t\t\t_fnBindAction(\n\t\t\t\t\t\t\t\tnode, {action: button}, clickHandler\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// IE9 throws an 'unknown error' if document.activeElement is used\n\t\t\t// inside an iframe or frame. Try / catch the error. Not good for\n\t\t\t// accessibility, but neither are frames.\n\t\t\tvar activeEl;\n\n\t\t\ttry {\n\t\t\t\t// Because this approach is destroying and recreating the paging\n\t\t\t\t// elements, focus is lost on the select button which is bad for\n\t\t\t\t// accessibility. So we want to restore focus once the draw has\n\t\t\t\t// completed\n\t\t\t\tactiveEl = $(host).find(document.activeElement).data('dt-idx');\n\t\t\t}\n\t\t\tcatch (e) {}\n\n\t\t\tattach( $(host).empty(), buttons );\n\n\t\t\tif ( activeEl !== undefined ) {\n\t\t\t\t$(host).find( '[data-dt-idx='+activeEl+']' ).trigger('focus');\n\t\t\t}\n\t\t}\n\t}\n} );\n\n\n\n// Built in type detection. See model.ext.aTypes for information about\n// what is required from this methods.\n$.extend( DataTable.ext.type.detect, [\n\t// Plain numbers - first since V8 detects some plain numbers as dates\n\t// e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal ) ? 'num'+decimal : null;\n\t},\n\n\t// Dates (only those recognised by the browser's Date.parse)\n\tfunction ( d, settings )\n\t{\n\t\t// V8 tries _very_ hard to make a string passed into `Date.parse()`\n\t\t// valid, so we need to use a regex to restrict date formats. Use a\n\t\t// plug-in for anything other than ISO8601 style strings\n\t\tif ( d && !(d instanceof Date) && ! _re_date.test(d) ) {\n\t\t\treturn null;\n\t\t}\n\t\tvar parsed = Date.parse(d);\n\t\treturn (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;\n\t},\n\n\t// Formatted numbers\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;\n\t},\n\n\t// HTML numeric\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;\n\t},\n\n\t// HTML numeric, formatted\n\tfunction ( d, settings )\n\t{\n\t\tvar decimal = settings.oLanguage.sDecimal;\n\t\treturn _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;\n\t},\n\n\t// HTML (this is strict checking - there must be html)\n\tfunction ( d, settings )\n\t{\n\t\treturn _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?\n\t\t\t'html' : null;\n\t}\n] );\n\n\n\n// Filter formatting functions. See model.ext.ofnSearch for information about\n// what is required from these methods.\n// \n// Note that additional search methods are added for the html numbers and\n// html formatted numbers by `_addNumericSort()` when we know what the decimal\n// place is\n\n\n$.extend( DataTable.ext.type.search, {\n\thtml: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata\n\t\t\t\t\t.replace( _re_new_lines, \" \" )\n\t\t\t\t\t.replace( _re_html, \"\" ) :\n\t\t\t\t'';\n\t},\n\n\tstring: function ( data ) {\n\t\treturn _empty(data) ?\n\t\t\tdata :\n\t\t\ttypeof data === 'string' ?\n\t\t\t\tdata.replace( _re_new_lines, \" \" ) :\n\t\t\t\tdata;\n\t}\n} );\n\n\n\nvar __numericReplace = function ( d, decimalPlace, re1, re2 ) {\n\tif ( d !== 0 && (!d || d === '-') ) {\n\t\treturn -Infinity;\n\t}\n\t\n\tlet type = typeof d;\n\n\tif (type === 'number' || type === 'bigint') {\n\t\treturn d;\n\t}\n\n\t// If a decimal place other than `.` is used, it needs to be given to the\n\t// function so we can detect it and replace with a `.` which is the only\n\t// decimal place Javascript recognises - it is not locale aware.\n\tif ( decimalPlace ) {\n\t\td = _numToDecimal( d, decimalPlace );\n\t}\n\n\tif ( d.replace ) {\n\t\tif ( re1 ) {\n\t\t\td = d.replace( re1, '' );\n\t\t}\n\n\t\tif ( re2 ) {\n\t\t\td = d.replace( re2, '' );\n\t\t}\n\t}\n\n\treturn d * 1;\n};\n\n\n// Add the numeric 'deformatting' functions for sorting and search. This is done\n// in a function to provide an easy ability for the language options to add\n// additional methods if a non-period decimal place is used.\nfunction _addNumericSort ( decimalPlace ) {\n\t$.each(\n\t\t{\n\t\t\t// Plain numbers\n\t\t\t\"num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace );\n\t\t\t},\n\n\t\t\t// Formatted numbers\n\t\t\t\"num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_formatted_numeric );\n\t\t\t},\n\n\t\t\t// HTML numeric\n\t\t\t\"html-num\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html );\n\t\t\t},\n\n\t\t\t// HTML numeric, formatted\n\t\t\t\"html-num-fmt\": function ( d ) {\n\t\t\t\treturn __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );\n\t\t\t}\n\t\t},\n\t\tfunction ( key, fn ) {\n\t\t\t// Add the ordering method\n\t\t\t_ext.type.order[ key+decimalPlace+'-pre' ] = fn;\n\n\t\t\t// For HTML types add a search formatter that will strip the HTML\n\t\t\tif ( key.match(/^html\\-/) ) {\n\t\t\t\t_ext.type.search[ key+decimalPlace ] = _ext.type.search.html;\n\t\t\t}\n\t\t}\n\t);\n}\n\n\n// Default sort methods\n$.extend( _ext.type.order, {\n\t// Dates\n\t\"date-pre\": function ( d ) {\n\t\tvar ts = Date.parse( d );\n\t\treturn isNaN(ts) ? -Infinity : ts;\n\t},\n\n\t// html\n\t\"html-pre\": function ( a ) {\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ta.replace ?\n\t\t\t\ta.replace( /<.*?>/g, \"\" ).toLowerCase() :\n\t\t\t\ta+'';\n\t},\n\n\t// string\n\t\"string-pre\": function ( a ) {\n\t\t// This is a little complex, but faster than always calling toString,\n\t\t// http://jsperf.com/tostring-v-check\n\t\treturn _empty(a) ?\n\t\t\t'' :\n\t\t\ttypeof a === 'string' ?\n\t\t\t\ta.toLowerCase() :\n\t\t\t\t! a.toString ?\n\t\t\t\t\t'' :\n\t\t\t\t\ta.toString();\n\t},\n\n\t// string-asc and -desc are retained only for compatibility with the old\n\t// sort methods\n\t\"string-asc\": function ( x, y ) {\n\t\treturn ((x < y) ? -1 : ((x > y) ? 1 : 0));\n\t},\n\n\t\"string-desc\": function ( x, y ) {\n\t\treturn ((x < y) ? 1 : ((x > y) ? -1 : 0));\n\t}\n} );\n\n\n// Numeric sorting types - order doesn't matter here\n_addNumericSort( '' );\n\n\n$.extend( true, DataTable.ext.renderer, {\n\theader: {\n\t\t_: function ( settings, cell, column, classes ) {\n\t\t\t// No additional mark-up required\n\t\t\t// Attach a sort listener to update on sort - note that using the\n\t\t\t// `DT` namespace will allow the event to be removed automatically\n\t\t\t// on destroy, while the `dt` namespaced event is the one we are\n\t\t\t// listening for\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) { // need to check this this is the host\n\t\t\t\t\treturn;               // table, not a nested one\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortAsc +' '+\n\t\t\t\t\t\tclasses.sSortDesc\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\t\t\t} );\n\t\t},\n\n\t\tjqueryui: function ( settings, cell, column, classes ) {\n\t\t\t$('<div/>')\n\t\t\t\t.addClass( classes.sSortJUIWrapper )\n\t\t\t\t.append( cell.contents() )\n\t\t\t\t.append( $('<span/>')\n\t\t\t\t\t.addClass( classes.sSortIcon+' '+column.sSortingClassJUI )\n\t\t\t\t)\n\t\t\t\t.appendTo( cell );\n\n\t\t\t// Attach a sort listener to update on sort\n\t\t\t$(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {\n\t\t\t\tif ( settings !== ctx ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar colIdx = column.idx;\n\n\t\t\t\tcell\n\t\t\t\t\t.removeClass( classes.sSortAsc +\" \"+classes.sSortDesc )\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClass\n\t\t\t\t\t);\n\n\t\t\t\tcell\n\t\t\t\t\t.find( 'span.'+classes.sSortIcon )\n\t\t\t\t\t.removeClass(\n\t\t\t\t\t\tclasses.sSortJUIAsc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDesc +\" \"+\n\t\t\t\t\t\tclasses.sSortJUI +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIAscAllowed +\" \"+\n\t\t\t\t\t\tclasses.sSortJUIDescAllowed\n\t\t\t\t\t)\n\t\t\t\t\t.addClass( columns[ colIdx ] == 'asc' ?\n\t\t\t\t\t\tclasses.sSortJUIAsc : columns[ colIdx ] == 'desc' ?\n\t\t\t\t\t\t\tclasses.sSortJUIDesc :\n\t\t\t\t\t\t\tcolumn.sSortingClassJUI\n\t\t\t\t\t);\n\t\t\t} );\n\t\t}\n\t}\n} );\n\n/*\n * Public helper functions. These aren't used internally by DataTables, or\n * called by any of the options passed into DataTables, but they can be used\n * externally by developers working with DataTables. They are helper functions\n * to make working with DataTables a little bit easier.\n */\n\nvar __htmlEscapeEntities = function ( d ) {\n\tif (Array.isArray(d)) {\n\t\td = d.join(',');\n\t}\n\n\treturn typeof d === 'string' ?\n\t\td\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;') :\n\t\td;\n};\n\n// Common logic for moment, luxon or a date action\nfunction __mld( dt, momentFn, luxonFn, dateFn, arg1 ) {\n\tif (window.moment) {\n\t\treturn dt[momentFn]( arg1 );\n\t}\n\telse if (window.luxon) {\n\t\treturn dt[luxonFn]( arg1 );\n\t}\n\t\n\treturn dateFn ? dt[dateFn]( arg1 ) : dt;\n}\n\n\nvar __mlWarning = false;\nfunction __mldObj (d, format, locale) {\n\tvar dt;\n\n\tif (window.moment) {\n\t\tdt = window.moment.utc( d, format, locale, true );\n\n\t\tif (! dt.isValid()) {\n\t\t\treturn null;\n\t\t}\n\t}\n\telse if (window.luxon) {\n\t\tdt = format && typeof d === 'string'\n\t\t\t? window.luxon.DateTime.fromFormat( d, format )\n\t\t\t: window.luxon.DateTime.fromISO( d );\n\n\t\tif (! dt.isValid) {\n\t\t\treturn null;\n\t\t}\n\n\t\tdt.setLocale(locale);\n\t}\n\telse if (! format) {\n\t\t// No format given, must be ISO\n\t\tdt = new Date(d);\n\t}\n\telse {\n\t\tif (! __mlWarning) {\n\t\t\talert('DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17');\n\t\t}\n\n\t\t__mlWarning = true;\n\t}\n\n\treturn dt;\n}\n\n// Wrapper for date, datetime and time which all operate the same way with the exception of\n// the output string for auto locale support\nfunction __mlHelper (localeString) {\n\treturn function ( from, to, locale, def ) {\n\t\t// Luxon and Moment support\n\t\t// Argument shifting\n\t\tif ( arguments.length === 0 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = null; // means toLocaleString\n\t\t\tfrom = null; // means iso8601\n\t\t}\n\t\telse if ( arguments.length === 1 ) {\n\t\t\tlocale = 'en';\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\t\telse if ( arguments.length === 2 ) {\n\t\t\tlocale = to;\n\t\t\tto = from;\n\t\t\tfrom = null;\n\t\t}\n\n\t\tvar typeName = 'datetime-' + to;\n\n\t\t// Add type detection and sorting specific to this date format - we need to be able to identify\n\t\t// date type columns as such, rather than as numbers in extensions. Hence the need for this.\n\t\tif (! DataTable.ext.type.order[typeName]) {\n\t\t\t// The renderer will give the value to type detect as the type!\n\t\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\t\treturn d === typeName ? typeName : false;\n\t\t\t});\n\n\t\t\t// The renderer gives us Moment, Luxon or Date obects for the sorting, all of which have a\n\t\t\t// `valueOf` which gives milliseconds epoch\n\t\t\tDataTable.ext.type.order[typeName + '-asc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x < y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\n\t\t\tDataTable.ext.type.order[typeName + '-desc'] = function (a, b) {\n\t\t\t\tvar x = a.valueOf();\n\t\t\t\tvar y = b.valueOf();\n\n\t\t\t\treturn x === y\n\t\t\t\t\t? 0\n\t\t\t\t\t: x > y\n\t\t\t\t\t\t? -1\n\t\t\t\t\t\t: 1;\n\t\t\t}\n\t\t}\n\t\n\t\treturn function ( d, type ) {\n\t\t\t// Allow for a default value\n\t\t\tif (d === null || d === undefined) {\n\t\t\t\tif (def === '--now') {\n\t\t\t\t\t// We treat everything as UTC further down, so no changes are\n\t\t\t\t\t// made, as such need to get the local date / time as if it were\n\t\t\t\t\t// UTC\n\t\t\t\t\tvar local = new Date();\n\t\t\t\t\td = new Date( Date.UTC(\n\t\t\t\t\t\tlocal.getFullYear(), local.getMonth(), local.getDate(),\n\t\t\t\t\t\tlocal.getHours(), local.getMinutes(), local.getSeconds()\n\t\t\t\t\t) );\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\td = '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === 'type') {\n\t\t\t\t// Typing uses the type name for fast matching\n\t\t\t\treturn typeName;\n\t\t\t}\n\n\t\t\tif (d === '') {\n\t\t\t\treturn type !== 'sort'\n\t\t\t\t\t? ''\n\t\t\t\t\t: __mldObj('0000-01-01 00:00:00', null, locale);\n\t\t\t}\n\n\t\t\t// Shortcut. If `from` and `to` are the same, we are using the renderer to\n\t\t\t// format for ordering, not display - its already in the display format.\n\t\t\tif ( to !== null && from === to && type !== 'sort' && type !== 'type' && ! (d instanceof Date) ) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tvar dt = __mldObj(d, from, locale);\n\n\t\t\tif (dt === null) {\n\t\t\t\treturn d;\n\t\t\t}\n\n\t\t\tif (type === 'sort') {\n\t\t\t\treturn dt;\n\t\t\t}\n\t\t\t\n\t\t\tvar formatted = to === null\n\t\t\t\t? __mld(dt, 'toDate', 'toJSDate', '')[localeString]()\n\t\t\t\t: __mld(dt, 'format', 'toFormat', 'toISOString', to);\n\n\t\t\t// XSS protection\n\t\t\treturn type === 'display' ?\n\t\t\t\t__htmlEscapeEntities( formatted ) :\n\t\t\t\tformatted;\n\t\t};\n\t}\n}\n\n// Based on locale, determine standard number formatting\n// Fallback for legacy browsers is US English\nvar __thousands = ',';\nvar __decimal = '.';\n\nif (Intl) {\n\ttry {\n\t\tvar num = new Intl.NumberFormat().formatToParts(100000.1);\n\t\n\t\tfor (var i=0 ; i<num.length ; i++) {\n\t\t\tif (num[i].type === 'group') {\n\t\t\t\t__thousands = num[i].value;\n\t\t\t}\n\t\t\telse if (num[i].type === 'decimal') {\n\t\t\t\t__decimal = num[i].value;\n\t\t\t}\n\t\t}\n\t}\n\tcatch (e) {\n\t\t// noop\n\t}\n}\n\n// Formatted date time detection - use by declaring the formats you are going to use\nDataTable.datetime = function ( format, locale ) {\n\tvar typeName = 'datetime-detect-' + format;\n\n\tif (! locale) {\n\t\tlocale = 'en';\n\t}\n\n\tif (! DataTable.ext.type.order[typeName]) {\n\t\tDataTable.ext.type.detect.unshift(function (d) {\n\t\t\tvar dt = __mldObj(d, format, locale);\n\t\t\treturn d === '' || dt ? typeName : false;\n\t\t});\n\n\t\tDataTable.ext.type.order[typeName + '-pre'] = function (d) {\n\t\t\treturn __mldObj(d, format, locale) || 0;\n\t\t}\n\t}\n}\n\n/**\n * Helpers for `columns.render`.\n *\n * The options defined here can be used with the `columns.render` initialisation\n * option to provide a display renderer. The following functions are defined:\n *\n * * `number` - Will format numeric data (defined by `columns.data`) for\n *   display, retaining the original unformatted data for sorting and filtering.\n *   It takes 5 parameters:\n *   * `string` - Thousands grouping separator\n *   * `string` - Decimal point indicator\n *   * `integer` - Number of decimal points to show\n *   * `string` (optional) - Prefix.\n *   * `string` (optional) - Postfix (/suffix).\n * * `text` - Escape HTML to help prevent XSS attacks. It has no optional\n *   parameters.\n *\n * @example\n *   // Column definition using the number renderer\n *   {\n *     data: \"salary\",\n *     render: $.fn.dataTable.render.number( '\\'', '.', 0, '$' )\n *   }\n *\n * @namespace\n */\nDataTable.render = {\n\tdate: __mlHelper('toLocaleDateString'),\n\tdatetime: __mlHelper('toLocaleString'),\n\ttime: __mlHelper('toLocaleTimeString'),\n\tnumber: function ( thousands, decimal, precision, prefix, postfix ) {\n\t\t// Auto locale detection\n\t\tif (thousands === null || thousands === undefined) {\n\t\t\tthousands = __thousands;\n\t\t}\n\n\t\tif (decimal === null || decimal === undefined) {\n\t\t\tdecimal = __decimal;\n\t\t}\n\n\t\treturn {\n\t\t\tdisplay: function ( d ) {\n\t\t\t\tif ( typeof d !== 'number' && typeof d !== 'string' ) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tif (d === '' || d === null) {\n\t\t\t\t\treturn d;\n\t\t\t\t}\n\n\t\t\t\tvar negative = d < 0 ? '-' : '';\n\t\t\t\tvar flo = parseFloat( d );\n\n\t\t\t\t// If NaN then there isn't much formatting that we can do - just\n\t\t\t\t// return immediately, escaping any HTML (this was supposed to\n\t\t\t\t// be a number after all)\n\t\t\t\tif ( isNaN( flo ) ) {\n\t\t\t\t\treturn __htmlEscapeEntities( d );\n\t\t\t\t}\n\n\t\t\t\tflo = flo.toFixed( precision );\n\t\t\t\td = Math.abs( flo );\n\n\t\t\t\tvar intPart = parseInt( d, 10 );\n\t\t\t\tvar floatPart = precision ?\n\t\t\t\t\tdecimal+(d - intPart).toFixed( precision ).substring( 2 ):\n\t\t\t\t\t'';\n\n\t\t\t\t// If zero, then can't have a negative prefix\n\t\t\t\tif (intPart === 0 && parseFloat(floatPart) === 0) {\n\t\t\t\t\tnegative = '';\n\t\t\t\t}\n\n\t\t\t\treturn negative + (prefix||'') +\n\t\t\t\t\tintPart.toString().replace(\n\t\t\t\t\t\t/\\B(?=(\\d{3})+(?!\\d))/g, thousands\n\t\t\t\t\t) +\n\t\t\t\t\tfloatPart +\n\t\t\t\t\t(postfix||'');\n\t\t\t}\n\t\t};\n\t},\n\n\ttext: function () {\n\t\treturn {\n\t\t\tdisplay: __htmlEscapeEntities,\n\t\t\tfilter: __htmlEscapeEntities\n\t\t};\n\t}\n};\n\n\n/*\n * This is really a good bit rubbish this method of exposing the internal methods\n * publicly... - To be fixed in 2.0 using methods on the prototype\n */\n\n\n/**\n * Create a wrapper function for exporting an internal functions to an external API.\n *  @param {string} fn API function name\n *  @returns {function} wrapped function\n *  @memberof DataTable#internal\n */\nfunction _fnExternApiFunc (fn)\n{\n\treturn function() {\n\t\tvar args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(\n\t\t\tArray.prototype.slice.call(arguments)\n\t\t);\n\t\treturn DataTable.ext.internal[fn].apply( this, args );\n\t};\n}\n\n\n/**\n * Reference to internal functions for use by plug-in developers. Note that\n * these methods are references to internal functions and are considered to be\n * private. If you use these methods, be aware that they are liable to change\n * between versions.\n *  @namespace\n */\n$.extend( DataTable.ext.internal, {\n\t_fnExternApiFunc: _fnExternApiFunc,\n\t_fnBuildAjax: _fnBuildAjax,\n\t_fnAjaxUpdate: _fnAjaxUpdate,\n\t_fnAjaxParameters: _fnAjaxParameters,\n\t_fnAjaxUpdateDraw: _fnAjaxUpdateDraw,\n\t_fnAjaxDataSrc: _fnAjaxDataSrc,\n\t_fnAddColumn: _fnAddColumn,\n\t_fnColumnOptions: _fnColumnOptions,\n\t_fnAdjustColumnSizing: _fnAdjustColumnSizing,\n\t_fnVisibleToColumnIndex: _fnVisibleToColumnIndex,\n\t_fnColumnIndexToVisible: _fnColumnIndexToVisible,\n\t_fnVisbleColumns: _fnVisbleColumns,\n\t_fnGetColumns: _fnGetColumns,\n\t_fnColumnTypes: _fnColumnTypes,\n\t_fnApplyColumnDefs: _fnApplyColumnDefs,\n\t_fnHungarianMap: _fnHungarianMap,\n\t_fnCamelToHungarian: _fnCamelToHungarian,\n\t_fnLanguageCompat: _fnLanguageCompat,\n\t_fnBrowserDetect: _fnBrowserDetect,\n\t_fnAddData: _fnAddData,\n\t_fnAddTr: _fnAddTr,\n\t_fnNodeToDataIndex: _fnNodeToDataIndex,\n\t_fnNodeToColumnIndex: _fnNodeToColumnIndex,\n\t_fnGetCellData: _fnGetCellData,\n\t_fnSetCellData: _fnSetCellData,\n\t_fnSplitObjNotation: _fnSplitObjNotation,\n\t_fnGetObjectDataFn: _fnGetObjectDataFn,\n\t_fnSetObjectDataFn: _fnSetObjectDataFn,\n\t_fnGetDataMaster: _fnGetDataMaster,\n\t_fnClearTable: _fnClearTable,\n\t_fnDeleteIndex: _fnDeleteIndex,\n\t_fnInvalidate: _fnInvalidate,\n\t_fnGetRowElements: _fnGetRowElements,\n\t_fnCreateTr: _fnCreateTr,\n\t_fnBuildHead: _fnBuildHead,\n\t_fnDrawHead: _fnDrawHead,\n\t_fnDraw: _fnDraw,\n\t_fnReDraw: _fnReDraw,\n\t_fnAddOptionsHtml: _fnAddOptionsHtml,\n\t_fnDetectHeader: _fnDetectHeader,\n\t_fnGetUniqueThs: _fnGetUniqueThs,\n\t_fnFeatureHtmlFilter: _fnFeatureHtmlFilter,\n\t_fnFilterComplete: _fnFilterComplete,\n\t_fnFilterCustom: _fnFilterCustom,\n\t_fnFilterColumn: _fnFilterColumn,\n\t_fnFilter: _fnFilter,\n\t_fnFilterCreateSearch: _fnFilterCreateSearch,\n\t_fnEscapeRegex: _fnEscapeRegex,\n\t_fnFilterData: _fnFilterData,\n\t_fnFeatureHtmlInfo: _fnFeatureHtmlInfo,\n\t_fnUpdateInfo: _fnUpdateInfo,\n\t_fnInfoMacros: _fnInfoMacros,\n\t_fnInitialise: _fnInitialise,\n\t_fnInitComplete: _fnInitComplete,\n\t_fnLengthChange: _fnLengthChange,\n\t_fnFeatureHtmlLength: _fnFeatureHtmlLength,\n\t_fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,\n\t_fnPageChange: _fnPageChange,\n\t_fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,\n\t_fnProcessingDisplay: _fnProcessingDisplay,\n\t_fnFeatureHtmlTable: _fnFeatureHtmlTable,\n\t_fnScrollDraw: _fnScrollDraw,\n\t_fnApplyToChildren: _fnApplyToChildren,\n\t_fnCalculateColumnWidths: _fnCalculateColumnWidths,\n\t_fnThrottle: _fnThrottle,\n\t_fnConvertToWidth: _fnConvertToWidth,\n\t_fnGetWidestNode: _fnGetWidestNode,\n\t_fnGetMaxLenString: _fnGetMaxLenString,\n\t_fnStringToCss: _fnStringToCss,\n\t_fnSortFlatten: _fnSortFlatten,\n\t_fnSort: _fnSort,\n\t_fnSortAria: _fnSortAria,\n\t_fnSortListener: _fnSortListener,\n\t_fnSortAttachListener: _fnSortAttachListener,\n\t_fnSortingClasses: _fnSortingClasses,\n\t_fnSortData: _fnSortData,\n\t_fnSaveState: _fnSaveState,\n\t_fnLoadState: _fnLoadState,\n\t_fnImplementState: _fnImplementState,\n\t_fnSettingsFromNode: _fnSettingsFromNode,\n\t_fnLog: _fnLog,\n\t_fnMap: _fnMap,\n\t_fnBindAction: _fnBindAction,\n\t_fnCallbackReg: _fnCallbackReg,\n\t_fnCallbackFire: _fnCallbackFire,\n\t_fnLengthOverflow: _fnLengthOverflow,\n\t_fnRenderer: _fnRenderer,\n\t_fnDataSource: _fnDataSource,\n\t_fnRowAttributes: _fnRowAttributes,\n\t_fnExtend: _fnExtend,\n\t_fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant\n\t                                // in 1.10, so this dead-end function is\n\t                                // added to prevent errors\n} );\n\n\n// jQuery access\n$.fn.dataTable = DataTable;\n\n// Provide access to the host jQuery object (circular reference)\nDataTable.$ = $;\n\n// Legacy aliases\n$.fn.dataTableSettings = DataTable.settings;\n$.fn.dataTableExt = DataTable.ext;\n\n// With a capital `D` we return a DataTables API instance rather than a\n// jQuery object\n$.fn.DataTable = function ( opts ) {\n\treturn $(this).dataTable( opts ).api();\n};\n\n// All properties that are available to $.fn.dataTable should also be\n// available on $.fn.DataTable\n$.each( DataTable, function ( prop, val ) {\n\t$.fn.DataTable[ prop ] = val;\n} );\n\nexport default DataTable;\n", "function toggleDropdown() {\n  // ON / OFF BUTTON\n  let btn = document.getElementById(\"nav-icon1\");\n  if (btn != null) {\n    btn.addEventListener(\"click\", () => {\n      document.getElementById(\"dropdown-menu\").classList.toggle(\"hidden\");\n      btn.classList.toggle(\"open\");\n    });\n  }\n}\n\ndocument.addEventListener(\"turbo:load\", toggleDropdown);\n", "\nfunction styleAccordion() {\n  let headings = Array.from(document.getElementsByClassName(\"panel-heading\"))\n\n  headings.forEach(clickedHeading => {\n    clickedHeading.addEventListener('click', () => {\n      setTimeout(() => {\n        headings.forEach(element => {\n          element.style.backgroundColor = \"#ffffff\";\n          let content = element.nextElementSibling;\n          if (element  == clickedHeading) {\n            content.classList.toggle(\"show\");\n          }\n          content.classList.remove(\"show\");\n        });\n        clickedHeading.style.background = \"#e2e2e2\"\n      })\n    }, 500);\n    });\n}\n\nfunction flipArrows() {\n  let btns = Array.from(document.getElementsByClassName('sub-accordion-btn'))\n  btns.forEach(btn => {\n    btn.addEventListener('click', () => {\n      let arrow = btn.lastElementChild;\n      arrow.classList.toggle('v-flip')\n    })\n  });\n}\n\ndocument.addEventListener('turbo:load', styleAccordion);\ndocument.addEventListener('turbo:load', flipArrows);\n", "function autoSubmit() {\n  $('#filter_form .filter-input').change(function() {\n    $(\"#filter_submit\").click();\n  })\n}\n\ndocument.addEventListener('turbo:load', autoSubmit);\n", "\n\n\nfunction toggleTable() {\n  setupTable();\n  $('#show_table').click(function () {\n    $(\"#ems_table_container\").show();\n    $(window).scrollTop(\"0px\");\n    $(document.body).css(\"overflow\", \"hidden\");\n    $('#meter-table').DataTable().draw();\n  })\n  $('#close_table').click(function () {\n    $(\"#ems_table_container\").hide();\n    $(document.body).css(\"overflow\", \"initial\");\n  })\n\n  window.onclick = function (event) {\n    if (event.target == document.getElementById(\"ems_table_container\")) {\n      $(document.body).css(\"overflow\", \"initial\");\n      $(\"#ems_table_container\").hide();\n    }\n  }\n}\n\nfunction setupTable() {\n  var table = $('#meter-table');\n  let dataT = table.DataTable({\n    paginate: false,\n    scrollY: \"600px\",\n    scrollX: true,\n    scrollCollapse: true,\n    languange: {\n      search: \"Zoeken:\",\n      zeroRecords: \"Geen resultaten gevonden\",\n    }\n  });\n}\n\ndocument.addEventListener('turbo:load', toggleTable);\n\n\nfunction clearTable() {\n  $('#meter-table').DataTable().destroy();\n}\n\ndocument.addEventListener(\"turbo:before-cache\", clearTable)\n"],
  "mappings": "kpDAAA,IAAAA,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAaE,SAAUC,EAAQC,EAAU,CAE7B,aAEK,OAAOF,IAAW,UAAY,OAAOA,GAAO,SAAY,SAS5DA,GAAO,QAAUC,EAAO,SACvBC,EAASD,EAAQ,EAAK,EACtB,SAAUE,EAAI,CACb,GAAK,CAACA,EAAE,SACP,MAAM,IAAI,MAAO,0CAA2C,EAE7D,OAAOD,EAASC,CAAE,CACnB,EAEDD,EAASD,CAAO,CAIlB,GAAK,OAAO,QAAW,YAAc,OAASF,GAAM,SAAUK,EAAQC,EAAW,CAMjF,aAEA,IAAIC,EAAM,CAAC,EAEPC,EAAW,OAAO,eAElBC,EAAQF,EAAI,MAEZG,EAAOH,EAAI,KAAO,SAAUI,EAAQ,CACvC,OAAOJ,EAAI,KAAK,KAAMI,CAAM,CAC7B,EAAI,SAAUA,EAAQ,CACrB,OAAOJ,EAAI,OAAO,MAAO,CAAC,EAAGI,CAAM,CACpC,EAGIC,EAAOL,EAAI,KAEXM,EAAUN,EAAI,QAEdO,EAAa,CAAC,EAEdC,EAAWD,EAAW,SAEtBE,EAASF,EAAW,eAEpBG,EAAaD,EAAO,SAEpBE,EAAuBD,EAAW,KAAM,MAAO,EAE/CE,EAAU,CAAC,EAEXC,EAAa,SAAqBC,EAAM,CAS1C,OAAO,OAAOA,GAAQ,YAAc,OAAOA,EAAI,UAAa,UAC3D,OAAOA,EAAI,MAAS,UACtB,EAGGC,EAAW,SAAmBD,EAAM,CACtC,OAAOA,GAAO,MAAQA,IAAQA,EAAI,MACnC,EAGGE,EAAWlB,EAAO,SAIjBmB,GAA4B,CAC/B,KAAM,GACN,IAAK,GACL,MAAO,GACP,SAAU,EACX,EAEA,SAASC,EAASC,EAAMC,EAAMC,EAAM,CACnCA,EAAMA,GAAOL,EAEb,IAAIM,EAAGC,EACNC,EAASH,EAAI,cAAe,QAAS,EAGtC,GADAG,EAAO,KAAOL,EACTC,EACJ,IAAME,KAAKL,GAYVM,EAAMH,EAAME,CAAE,GAAKF,EAAK,cAAgBA,EAAK,aAAcE,CAAE,EACxDC,GACJC,EAAO,aAAcF,EAAGC,CAAI,EAI/BF,EAAI,KAAK,YAAaG,CAAO,EAAE,WAAW,YAAaA,CAAO,CAC/D,CAGD,SAASC,EAAQX,EAAM,CACtB,OAAKA,GAAO,KACJA,EAAM,GAIP,OAAOA,GAAQ,UAAY,OAAOA,GAAQ,WAChDP,EAAYC,EAAS,KAAMM,CAAI,CAAE,GAAK,SACtC,OAAOA,CACT,CAOA,IACCY,EAAU,QAGVC,EAAS,SAAUC,EAAUC,EAAU,CAItC,OAAO,IAAIF,EAAO,GAAG,KAAMC,EAAUC,CAAQ,CAC9C,EAEDF,EAAO,GAAKA,EAAO,UAAY,CAG9B,OAAQD,EAER,YAAaC,EAGb,OAAQ,EAER,QAAS,UAAW,CACnB,OAAOzB,EAAM,KAAM,IAAK,CACzB,EAIA,IAAK,SAAU4B,EAAM,CAGpB,OAAKA,GAAO,KACJ5B,EAAM,KAAM,IAAK,EAIlB4B,EAAM,EAAI,KAAMA,EAAM,KAAK,MAAO,EAAI,KAAMA,CAAI,CACxD,EAIA,UAAW,SAAUC,EAAQ,CAG5B,IAAIC,EAAML,EAAO,MAAO,KAAK,YAAY,EAAGI,CAAM,EAGlD,OAAAC,EAAI,WAAa,KAGVA,CACR,EAGA,KAAM,SAAUC,EAAW,CAC1B,OAAON,EAAO,KAAM,KAAMM,CAAS,CACpC,EAEA,IAAK,SAAUA,EAAW,CACzB,OAAO,KAAK,UAAWN,EAAO,IAAK,KAAM,SAAUO,EAAMZ,EAAI,CAC5D,OAAOW,EAAS,KAAMC,EAAMZ,EAAGY,CAAK,CACrC,CAAE,CAAE,CACL,EAEA,MAAO,UAAW,CACjB,OAAO,KAAK,UAAWhC,EAAM,MAAO,KAAM,SAAU,CAAE,CACvD,EAEA,MAAO,UAAW,CACjB,OAAO,KAAK,GAAI,CAAE,CACnB,EAEA,KAAM,UAAW,CAChB,OAAO,KAAK,GAAI,EAAG,CACpB,EAEA,KAAM,UAAW,CAChB,OAAO,KAAK,UAAWyB,EAAO,KAAM,KAAM,SAAUQ,EAAOb,EAAI,CAC9D,OAASA,EAAI,GAAM,CACpB,CAAE,CAAE,CACL,EAEA,IAAK,UAAW,CACf,OAAO,KAAK,UAAWK,EAAO,KAAM,KAAM,SAAUQ,EAAOb,EAAI,CAC9D,OAAOA,EAAI,CACZ,CAAE,CAAE,CACL,EAEA,GAAI,SAAUA,EAAI,CACjB,IAAIc,EAAM,KAAK,OACdC,EAAI,CAACf,GAAMA,EAAI,EAAIc,EAAM,GAC1B,OAAO,KAAK,UAAWC,GAAK,GAAKA,EAAID,EAAM,CAAE,KAAMC,CAAE,CAAE,EAAI,CAAC,CAAE,CAC/D,EAEA,IAAK,UAAW,CACf,OAAO,KAAK,YAAc,KAAK,YAAY,CAC5C,EAIA,KAAMhC,EACN,KAAML,EAAI,KACV,OAAQA,EAAI,MACb,EAEA2B,EAAO,OAASA,EAAO,GAAG,OAAS,UAAW,CAC7C,IAAIW,EAASC,EAAMC,EAAKC,EAAMC,EAAaC,EAC1CC,EAAS,UAAW,CAAE,GAAK,CAAC,EAC5BtB,EAAI,EACJuB,EAAS,UAAU,OACnBC,EAAO,GAsBR,IAnBK,OAAOF,GAAW,YACtBE,EAAOF,EAGPA,EAAS,UAAWtB,CAAE,GAAK,CAAC,EAC5BA,KAII,OAAOsB,GAAW,UAAY,CAAC/B,EAAY+B,CAAO,IACtDA,EAAS,CAAC,GAINtB,IAAMuB,IACVD,EAAS,KACTtB,KAGOA,EAAIuB,EAAQvB,IAGnB,IAAOgB,EAAU,UAAWhB,CAAE,IAAO,KAGpC,IAAMiB,KAAQD,EACbG,EAAOH,EAASC,CAAK,EAIhB,EAAAA,IAAS,aAAeK,IAAWH,KAKnCK,GAAQL,IAAUd,EAAO,cAAec,CAAK,IAC/CC,EAAc,MAAM,QAASD,CAAK,KACpCD,EAAMI,EAAQL,CAAK,EAGdG,GAAe,CAAC,MAAM,QAASF,CAAI,EACvCG,EAAQ,CAAC,EACE,CAACD,GAAe,CAACf,EAAO,cAAea,CAAI,EACtDG,EAAQ,CAAC,EAETA,EAAQH,EAETE,EAAc,GAGdE,EAAQL,CAAK,EAAIZ,EAAO,OAAQmB,EAAMH,EAAOF,CAAK,GAGvCA,IAAS,SACpBG,EAAQL,CAAK,EAAIE,IAOrB,OAAOG,CACR,EAEAjB,EAAO,OAAQ,CAGd,QAAS,UAAaD,EAAU,KAAK,OAAO,GAAI,QAAS,MAAO,EAAG,EAGnE,QAAS,GAET,MAAO,SAAUqB,EAAM,CACtB,MAAM,IAAI,MAAOA,CAAI,CACtB,EAEA,KAAM,UAAW,CAAC,EAElB,cAAe,SAAUjC,EAAM,CAC9B,IAAIkC,EAAOC,EAIX,MAAK,CAACnC,GAAON,EAAS,KAAMM,CAAI,IAAM,kBAC9B,IAGRkC,EAAQ/C,EAAUa,CAAI,EAGhBkC,GAKNC,EAAOxC,EAAO,KAAMuC,EAAO,aAAc,GAAKA,EAAM,YAC7C,OAAOC,GAAS,YAAcvC,EAAW,KAAMuC,CAAK,IAAMtC,GALzD,GAMT,EAEA,cAAe,SAAUG,EAAM,CAC9B,IAAIyB,EAEJ,IAAMA,KAAQzB,EACb,MAAO,GAER,MAAO,EACR,EAIA,WAAY,SAAUK,EAAMmB,EAASjB,EAAM,CAC1CH,EAASC,EAAM,CAAE,MAAOmB,GAAWA,EAAQ,KAAM,EAAGjB,CAAI,CACzD,EAEA,KAAM,SAAUP,EAAKmB,EAAW,CAC/B,IAAIY,EAAQvB,EAAI,EAEhB,GAAK4B,EAAapC,CAAI,EAErB,IADA+B,EAAS/B,EAAI,OACLQ,EAAIuB,GACNZ,EAAS,KAAMnB,EAAKQ,CAAE,EAAGA,EAAGR,EAAKQ,CAAE,CAAE,IAAM,GAD7BA,IACnB,KAKD,KAAMA,KAAKR,EACV,GAAKmB,EAAS,KAAMnB,EAAKQ,CAAE,EAAGA,EAAGR,EAAKQ,CAAE,CAAE,IAAM,GAC/C,MAKH,OAAOR,CACR,EAGA,UAAW,SAAUd,EAAKmD,EAAU,CACnC,IAAInB,EAAMmB,GAAW,CAAC,EAEtB,OAAKnD,GAAO,OACNkD,EAAa,OAAQlD,CAAI,CAAE,EAC/B2B,EAAO,MAAOK,EACb,OAAOhC,GAAQ,SACd,CAAEA,CAAI,EAAIA,CACZ,EAEAK,EAAK,KAAM2B,EAAKhC,CAAI,GAIfgC,CACR,EAEA,QAAS,SAAUE,EAAMlC,EAAKsB,EAAI,CACjC,OAAOtB,GAAO,KAAO,GAAKM,EAAQ,KAAMN,EAAKkC,EAAMZ,CAAE,CACtD,EAIA,MAAO,SAAU8B,EAAOC,EAAS,CAKhC,QAJIjB,EAAM,CAACiB,EAAO,OACjBhB,EAAI,EACJf,EAAI8B,EAAM,OAEHf,EAAID,EAAKC,IAChBe,EAAO9B,GAAI,EAAI+B,EAAQhB,CAAE,EAG1B,OAAAe,EAAM,OAAS9B,EAER8B,CACR,EAEA,KAAM,SAAUrB,EAAOE,EAAUqB,EAAS,CASzC,QARIC,EACHC,EAAU,CAAC,EACXlC,EAAI,EACJuB,EAASd,EAAM,OACf0B,EAAiB,CAACH,EAIXhC,EAAIuB,EAAQvB,IACnBiC,EAAkB,CAACtB,EAAUF,EAAOT,CAAE,EAAGA,CAAE,EACtCiC,IAAoBE,GACxBD,EAAQ,KAAMzB,EAAOT,CAAE,CAAE,EAI3B,OAAOkC,CACR,EAGA,IAAK,SAAUzB,EAAOE,EAAUyB,EAAM,CACrC,IAAIb,EAAQc,EACXrC,EAAI,EACJU,EAAM,CAAC,EAGR,GAAKkB,EAAanB,CAAM,EAEvB,IADAc,EAASd,EAAM,OACPT,EAAIuB,EAAQvB,IACnBqC,EAAQ1B,EAAUF,EAAOT,CAAE,EAAGA,EAAGoC,CAAI,EAEhCC,GAAS,MACb3B,EAAI,KAAM2B,CAAM,MAMlB,KAAMrC,KAAKS,EACV4B,EAAQ1B,EAAUF,EAAOT,CAAE,EAAGA,EAAGoC,CAAI,EAEhCC,GAAS,MACb3B,EAAI,KAAM2B,CAAM,EAMnB,OAAOxD,EAAM6B,CAAI,CAClB,EAGA,KAAM,EAIN,QAASpB,CACV,CAAE,EAEG,OAAO,QAAW,aACtBe,EAAO,GAAI,OAAO,QAAS,EAAI3B,EAAK,OAAO,QAAS,GAIrD2B,EAAO,KAAM,uEAAuE,MAAO,GAAI,EAC9F,SAAUiC,EAAIrB,EAAO,CACpBhC,EAAY,WAAagC,EAAO,GAAI,EAAIA,EAAK,YAAY,CAC1D,CAAE,EAEH,SAASW,EAAapC,EAAM,CAM3B,IAAI+B,EAAS,CAAC,CAAC/B,GAAO,WAAYA,GAAOA,EAAI,OAC5C+C,EAAOpC,EAAQX,CAAI,EAEpB,OAAKD,EAAYC,CAAI,GAAKC,EAAUD,CAAI,EAChC,GAGD+C,IAAS,SAAWhB,IAAW,GACrC,OAAOA,GAAW,UAAYA,EAAS,GAAOA,EAAS,KAAO/B,CAChE,CACA,IAAIgD,IAWF,SAAUhE,EAAS,CACrB,IAAIwB,EACHV,EACAmD,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxD,EACAyD,GACAC,GACAC,GACAC,GACApB,GACAqB,GAGAC,GAAU,SAAW,EAAI,IAAI,KAC7BC,GAAejF,EAAO,SACtBkF,GAAU,EACVC,GAAO,EACPC,GAAaC,GAAY,EACzBC,GAAaD,GAAY,EACzBE,GAAgBF,GAAY,EAC5BG,GAAyBH,GAAY,EACrCI,GAAY,SAAUC,EAAGC,EAAI,CAC5B,OAAKD,IAAMC,IACVlB,EAAe,IAET,CACR,EAGA9D,GAAW,CAAC,EAAI,eAChBT,GAAM,CAAC,EACP0F,GAAM1F,GAAI,IACV2F,GAAa3F,GAAI,KACjBK,GAAOL,GAAI,KACXE,GAAQF,GAAI,MAIZM,GAAU,SAAUsF,EAAM1D,EAAO,CAGhC,QAFIZ,EAAI,EACPc,EAAMwD,EAAK,OACJtE,EAAIc,EAAKd,IAChB,GAAKsE,EAAMtE,CAAE,IAAMY,EAClB,OAAOZ,EAGT,MAAO,EACR,EAEAuE,GAAW,6HAMXC,GAAa,sBAGbC,GAAa,0BAA4BD,GACxC,0CAGDE,GAAa,MAAQF,GAAa,KAAOC,GAAa,OAASD,GAG9D,gBAAkBA,GAIlB,wDAA6DC,GAAa,OAC1ED,GAAa,OAEdG,GAAU,KAAOF,GAAa,qFAOAC,GAAa,eAO3CE,GAAc,IAAI,OAAQJ,GAAa,IAAK,GAAI,EAChDK,GAAQ,IAAI,OAAQ,IAAML,GAAa,8BACtCA,GAAa,KAAM,GAAI,EAExBM,GAAS,IAAI,OAAQ,IAAMN,GAAa,KAAOA,GAAa,GAAI,EAChEO,GAAqB,IAAI,OAAQ,IAAMP,GAAa,WAAaA,GAAa,IAAMA,GACnF,GAAI,EACLQ,GAAW,IAAI,OAAQR,GAAa,IAAK,EAEzCS,GAAU,IAAI,OAAQN,EAAQ,EAC9BO,GAAc,IAAI,OAAQ,IAAMT,GAAa,GAAI,EAEjDU,GAAY,CACX,GAAM,IAAI,OAAQ,MAAQV,GAAa,GAAI,EAC3C,MAAS,IAAI,OAAQ,QAAUA,GAAa,GAAI,EAChD,IAAO,IAAI,OAAQ,KAAOA,GAAa,OAAQ,EAC/C,KAAQ,IAAI,OAAQ,IAAMC,EAAW,EACrC,OAAU,IAAI,OAAQ,IAAMC,EAAQ,EACpC,MAAS,IAAI,OAAQ,yDACpBH,GAAa,+BAAiCA,GAAa,cAC3DA,GAAa,aAAeA,GAAa,SAAU,GAAI,EACxD,KAAQ,IAAI,OAAQ,OAASD,GAAW,KAAM,GAAI,EAIlD,aAAgB,IAAI,OAAQ,IAAMC,GACjC,mDAAqDA,GACrD,mBAAqBA,GAAa,mBAAoB,GAAI,CAC5D,EAEAY,GAAQ,SACRC,GAAU,sCACVC,GAAU,SAEVC,GAAU,yBAGVC,GAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAI,OAAQ,uBAAyBlB,GAAa,uBAAwB,GAAI,EAC1FmB,GAAY,SAAUC,EAAQC,EAAS,CACtC,IAAIC,EAAO,KAAOF,EAAO,MAAO,CAAE,EAAI,MAEtC,OAAOC,IASNC,EAAO,EACN,OAAO,aAAcA,EAAO,KAAQ,EACpC,OAAO,aAAcA,GAAQ,GAAK,MAAQA,EAAO,KAAQ,KAAO,EACnE,EAIAC,GAAa,sDACbC,GAAa,SAAUC,EAAIC,EAAc,CACxC,OAAKA,EAGCD,IAAO,KACJ,SAIDA,EAAG,MAAO,EAAG,EAAG,EAAI,KAC1BA,EAAG,WAAYA,EAAG,OAAS,CAAE,EAAE,SAAU,EAAG,EAAI,IAI3C,KAAOA,CACf,EAMAE,GAAgB,UAAW,CAC1BjD,EAAY,CACb,EAEAkD,GAAqBC,GACpB,SAAUzF,EAAO,CAChB,OAAOA,EAAK,WAAa,IAAQA,EAAK,SAAS,YAAY,IAAM,UAClE,EACA,CAAE,IAAK,aAAc,KAAM,QAAS,CACrC,EAGD,GAAI,CACH7B,GAAK,MACFL,GAAME,GAAM,KAAM6E,GAAa,UAAW,EAC5CA,GAAa,UACd,EAKA/E,GAAK+E,GAAa,WAAW,MAAO,EAAE,QACvC,OAAU6C,EAAI,CACbvH,GAAO,CAAE,MAAOL,GAAI,OAGnB,SAAU4C,EAAQiF,EAAM,CACvBlC,GAAW,MAAO/C,EAAQ1C,GAAM,KAAM2H,CAAI,CAAE,CAC7C,EAIA,SAAUjF,EAAQiF,EAAM,CAKvB,QAJIxF,EAAIO,EAAO,OACdtB,EAAI,EAGKsB,EAAQP,GAAI,EAAIwF,EAAKvG,GAAI,GAAM,CACzCsB,EAAO,OAASP,EAAI,CACrB,CACD,CACD,CAEA,SAASyB,GAAQlC,EAAUC,EAASsB,EAAS2E,EAAO,CACnD,IAAIC,EAAGzG,GAAGY,GAAM8F,GAAKC,GAAOC,GAAQC,GACnCC,GAAavG,GAAWA,EAAQ,cAGhCwG,GAAWxG,EAAUA,EAAQ,SAAW,EAKzC,GAHAsB,EAAUA,GAAW,CAAC,EAGjB,OAAOvB,GAAa,UAAY,CAACA,GACrCyG,KAAa,GAAKA,KAAa,GAAKA,KAAa,GAEjD,OAAOlF,EAIR,GAAK,CAAC2E,IACLtD,EAAa3C,CAAQ,EACrBA,EAAUA,GAAWb,EAEhB0D,IAAiB,CAIrB,GAAK2D,KAAa,KAAQJ,GAAQnB,GAAW,KAAMlF,CAAS,GAG3D,GAAOmG,EAAIE,GAAO,CAAE,GAGnB,GAAKI,KAAa,EACjB,GAAOnG,GAAOL,EAAQ,eAAgBkG,CAAE,GAKvC,GAAK7F,GAAK,KAAO6F,EAChB,OAAA5E,EAAQ,KAAMjB,EAAK,EACZiB,MAGR,QAAOA,UASHiF,KAAgBlG,GAAOkG,GAAW,eAAgBL,CAAE,IACxDlD,GAAUhD,EAASK,EAAK,GACxBA,GAAK,KAAO6F,EAEZ,OAAA5E,EAAQ,KAAMjB,EAAK,EACZiB,MAKH,IAAK8E,GAAO,CAAE,EACpB,OAAA5H,GAAK,MAAO8C,EAAStB,EAAQ,qBAAsBD,CAAS,CAAE,EACvDuB,EAGD,IAAO4E,EAAIE,GAAO,CAAE,IAAOrH,EAAQ,wBACzCiB,EAAQ,uBAER,OAAAxB,GAAK,MAAO8C,EAAStB,EAAQ,uBAAwBkG,CAAE,CAAE,EAClD5E,EAKT,GAAKvC,EAAQ,KACZ,CAAC0E,GAAwB1D,EAAW,GAAI,IACtC,CAAC+C,IAAa,CAACA,GAAU,KAAM/C,CAAS,KAIxCyG,KAAa,GAAKxG,EAAQ,SAAS,YAAY,IAAM,UAAa,CAYpE,GAVAsG,GAAcvG,EACdwG,GAAavG,EASRwG,KAAa,IACf/B,GAAS,KAAM1E,CAAS,GAAKyE,GAAmB,KAAMzE,CAAS,GAAM,CAqBvE,IAlBAwG,GAAarB,GAAS,KAAMnF,CAAS,GAAK0G,GAAazG,EAAQ,UAAW,GACzEA,GAIIuG,KAAevG,GAAW,CAACjB,EAAQ,UAGhCoH,GAAMnG,EAAQ,aAAc,IAAK,GACvCmG,GAAMA,GAAI,QAASX,GAAYC,EAAW,EAE1CzF,EAAQ,aAAc,KAAQmG,GAAMlD,EAAU,GAKhDoD,GAAShE,EAAUtC,CAAS,EAC5BN,GAAI4G,GAAO,OACH5G,MACP4G,GAAQ5G,EAAE,GAAM0G,GAAM,IAAMA,GAAM,UAAa,IAC9CO,GAAYL,GAAQ5G,EAAE,CAAE,EAE1B6G,GAAcD,GAAO,KAAM,GAAI,CAChC,CAEA,GAAI,CACH,OAAA7H,GAAK,MAAO8C,EACXiF,GAAW,iBAAkBD,EAAY,CAC1C,EACOhF,CACR,OAAUqF,GAAW,CACpBlD,GAAwB1D,EAAU,EAAK,CACxC,QAAE,CACIoG,KAAQlD,IACZjD,EAAQ,gBAAiB,IAAK,CAEhC,CACD,CACD,CAID,OAAOuC,EAAQxC,EAAS,QAASuE,GAAO,IAAK,EAAGtE,EAASsB,EAAS2E,CAAK,CACxE,CAQA,SAAS3C,IAAc,CACtB,IAAIsD,EAAO,CAAC,EAEZ,SAASC,EAAOC,EAAKhF,EAAQ,CAG5B,OAAK8E,EAAK,KAAME,EAAM,GAAI,EAAI5E,EAAK,aAGlC,OAAO2E,EAAOD,EAAK,MAAM,CAAE,EAEnBC,EAAOC,EAAM,GAAI,EAAIhF,CAC/B,CACA,OAAO+E,CACR,CAMA,SAASE,GAAcC,EAAK,CAC3B,OAAAA,EAAI/D,EAAQ,EAAI,GACT+D,CACR,CAMA,SAASC,GAAQD,EAAK,CACrB,IAAIE,EAAK/H,EAAS,cAAe,UAAW,EAE5C,GAAI,CACH,MAAO,CAAC,CAAC6H,EAAIE,CAAG,CACjB,OAAUnB,EAAI,CACb,MAAO,EACR,QAAE,CAGImB,EAAG,YACPA,EAAG,WAAW,YAAaA,CAAG,EAI/BA,EAAK,IACN,CACD,CAOA,SAASC,GAAWC,EAAOC,EAAU,CAIpC,QAHIlJ,EAAMiJ,EAAM,MAAO,GAAI,EAC1B3H,EAAItB,EAAI,OAEDsB,KACPyC,EAAK,WAAY/D,EAAKsB,CAAE,CAAE,EAAI4H,CAEhC,CAQA,SAASC,GAAc3D,EAAGC,EAAI,CAC7B,IAAI2D,EAAM3D,GAAKD,EACd6D,EAAOD,GAAO5D,EAAE,WAAa,GAAKC,EAAE,WAAa,GAChDD,EAAE,YAAcC,EAAE,YAGpB,GAAK4D,EACJ,OAAOA,EAIR,GAAKD,GACJ,KAAUA,EAAMA,EAAI,aACnB,GAAKA,IAAQ3D,EACZ,MAAO,GAKV,OAAOD,EAAI,EAAI,EAChB,CAMA,SAAS8D,GAAmBzF,EAAO,CAClC,OAAO,SAAU3B,EAAO,CACvB,IAAIK,EAAOL,EAAK,SAAS,YAAY,EACrC,OAAOK,IAAS,SAAWL,EAAK,OAAS2B,CAC1C,CACD,CAMA,SAAS0F,GAAoB1F,EAAO,CACnC,OAAO,SAAU3B,EAAO,CACvB,IAAIK,EAAOL,EAAK,SAAS,YAAY,EACrC,OAASK,IAAS,SAAWA,IAAS,WAAcL,EAAK,OAAS2B,CACnE,CACD,CAMA,SAAS2F,GAAsBC,EAAW,CAGzC,OAAO,SAAUvH,EAAO,CAKvB,MAAK,SAAUA,EASTA,EAAK,YAAcA,EAAK,WAAa,GAGpC,UAAWA,EACV,UAAWA,EAAK,WACbA,EAAK,WAAW,WAAauH,EAE7BvH,EAAK,WAAauH,EAMpBvH,EAAK,aAAeuH,GAI1BvH,EAAK,aAAe,CAACuH,GACrB/B,GAAoBxF,CAAK,IAAMuH,EAG1BvH,EAAK,WAAauH,EAKd,UAAWvH,EACfA,EAAK,WAAauH,EAInB,EACR,CACD,CAMA,SAASC,GAAwBb,EAAK,CACrC,OAAOD,GAAc,SAAUe,EAAW,CACzC,OAAAA,EAAW,CAACA,EACLf,GAAc,SAAUd,EAAMtE,EAAU,CAM9C,QALInB,EACHuH,GAAef,EAAI,CAAC,EAAGf,EAAK,OAAQ6B,CAAS,EAC7CrI,GAAIsI,GAAa,OAGVtI,MACFwG,EAAQzF,EAAIuH,GAActI,EAAE,CAAI,IACpCwG,EAAMzF,CAAE,EAAI,EAAGmB,EAASnB,CAAE,EAAIyF,EAAMzF,CAAE,GAGzC,CAAE,CACH,CAAE,CACH,CAOA,SAASiG,GAAazG,EAAU,CAC/B,OAAOA,GAAW,OAAOA,EAAQ,sBAAyB,aAAeA,CAC1E,CAGAjB,EAAUkD,GAAO,QAAU,CAAC,EAO5BG,EAAQH,GAAO,MAAQ,SAAU5B,EAAO,CACvC,IAAI2H,EAAY3H,GAAQA,EAAK,aAC5BuC,EAAUvC,IAAUA,EAAK,eAAiBA,GAAO,gBAKlD,MAAO,CAACwE,GAAM,KAAMmD,GAAapF,GAAWA,EAAQ,UAAY,MAAO,CACxE,EAOAD,EAAcV,GAAO,YAAc,SAAU1C,EAAO,CACnD,IAAI0I,EAAYC,EACf1I,EAAMD,EAAOA,EAAK,eAAiBA,EAAO2D,GAO3C,OAAK1D,GAAOL,GAAYK,EAAI,WAAa,GAAK,CAACA,EAAI,kBAKnDL,EAAWK,EACXoD,GAAUzD,EAAS,gBACnB0D,GAAiB,CAACT,EAAOjD,CAAS,EAQ7B+D,IAAgB/D,IAClB+I,EAAY/I,EAAS,cAAiB+I,EAAU,MAAQA,IAGrDA,EAAU,iBACdA,EAAU,iBAAkB,SAAUtC,GAAe,EAAM,EAGhDsC,EAAU,aACrBA,EAAU,YAAa,WAAYtC,EAAc,GASnD7G,EAAQ,MAAQkI,GAAQ,SAAUC,EAAK,CACtC,OAAAtE,GAAQ,YAAasE,CAAG,EAAE,YAAa/H,EAAS,cAAe,KAAM,CAAE,EAChE,OAAO+H,EAAG,kBAAqB,aACrC,CAACA,EAAG,iBAAkB,qBAAsB,EAAE,MAChD,CAAE,EAWFnI,EAAQ,OAASkI,GAAQ,UAAW,CACnC,GAAI,CACH,OAAA9H,EAAS,cAAe,iBAAkB,EACnC,EACR,OAAU4G,EAAI,CACb,MAAO,EACR,CACD,CAAE,EAQFhH,EAAQ,WAAakI,GAAQ,SAAUC,EAAK,CAC3C,OAAAA,EAAG,UAAY,IACR,CAACA,EAAG,aAAc,WAAY,CACtC,CAAE,EAMFnI,EAAQ,qBAAuBkI,GAAQ,SAAUC,EAAK,CACrD,OAAAA,EAAG,YAAa/H,EAAS,cAAe,EAAG,CAAE,EACtC,CAAC+H,EAAG,qBAAsB,GAAI,EAAE,MACxC,CAAE,EAGFnI,EAAQ,uBAAyBiG,GAAQ,KAAM7F,EAAS,sBAAuB,EAM/EJ,EAAQ,QAAUkI,GAAQ,SAAUC,EAAK,CACxC,OAAAtE,GAAQ,YAAasE,CAAG,EAAE,GAAKjE,GACxB,CAAC9D,EAAS,mBAAqB,CAACA,EAAS,kBAAmB8D,EAAQ,EAAE,MAC9E,CAAE,EAGGlE,EAAQ,SACZmD,EAAK,OAAQ,GAAS,SAAUiG,EAAK,CACpC,IAAIC,GAASD,EAAG,QAAShD,GAAWC,EAAU,EAC9C,OAAO,SAAU/E,GAAO,CACvB,OAAOA,GAAK,aAAc,IAAK,IAAM+H,EACtC,CACD,EACAlG,EAAK,KAAM,GAAS,SAAUiG,EAAInI,GAAU,CAC3C,GAAK,OAAOA,GAAQ,gBAAmB,aAAe6C,GAAiB,CACtE,IAAIxC,GAAOL,GAAQ,eAAgBmI,CAAG,EACtC,OAAO9H,GAAO,CAAEA,EAAK,EAAI,CAAC,CAC3B,CACD,IAEA6B,EAAK,OAAQ,GAAU,SAAUiG,EAAK,CACrC,IAAIC,GAASD,EAAG,QAAShD,GAAWC,EAAU,EAC9C,OAAO,SAAU/E,GAAO,CACvB,IAAId,GAAO,OAAOc,GAAK,kBAAqB,aAC3CA,GAAK,iBAAkB,IAAK,EAC7B,OAAOd,IAAQA,GAAK,QAAU6I,EAC/B,CACD,EAIAlG,EAAK,KAAM,GAAS,SAAUiG,EAAInI,GAAU,CAC3C,GAAK,OAAOA,GAAQ,gBAAmB,aAAe6C,GAAiB,CACtE,IAAItD,GAAME,GAAGS,GACZG,GAAOL,GAAQ,eAAgBmI,CAAG,EAEnC,GAAK9H,GAAO,CAIX,GADAd,GAAOc,GAAK,iBAAkB,IAAK,EAC9Bd,IAAQA,GAAK,QAAU4I,EAC3B,MAAO,CAAE9H,EAAK,EAMf,IAFAH,GAAQF,GAAQ,kBAAmBmI,CAAG,EACtC1I,GAAI,EACMY,GAAOH,GAAOT,IAAI,GAE3B,GADAF,GAAOc,GAAK,iBAAkB,IAAK,EAC9Bd,IAAQA,GAAK,QAAU4I,EAC3B,MAAO,CAAE9H,EAAK,CAGjB,CAEA,MAAO,CAAC,CACT,CACD,GAID6B,EAAK,KAAM,IAAUnD,EAAQ,qBAC5B,SAAUsJ,EAAKrI,GAAU,CACxB,GAAK,OAAOA,GAAQ,sBAAyB,YAC5C,OAAOA,GAAQ,qBAAsBqI,CAAI,EAGnC,GAAKtJ,EAAQ,IACnB,OAAOiB,GAAQ,iBAAkBqI,CAAI,CAEvC,EAEA,SAAUA,EAAKrI,GAAU,CACxB,IAAIK,GACHiI,GAAM,CAAC,EACP7I,GAAI,EAGJ6B,GAAUtB,GAAQ,qBAAsBqI,CAAI,EAG7C,GAAKA,IAAQ,IAAM,CAClB,KAAUhI,GAAOiB,GAAS7B,IAAI,GACxBY,GAAK,WAAa,GACtBiI,GAAI,KAAMjI,EAAK,EAIjB,OAAOiI,EACR,CACA,OAAOhH,EACR,EAGDY,EAAK,KAAM,MAAYnD,EAAQ,wBAA0B,SAAUwJ,EAAWvI,GAAU,CACvF,GAAK,OAAOA,GAAQ,wBAA2B,aAAe6C,GAC7D,OAAO7C,GAAQ,uBAAwBuI,CAAU,CAEnD,EAQAxF,GAAgB,CAAC,EAOjBD,GAAY,CAAC,GAEN/D,EAAQ,IAAMiG,GAAQ,KAAM7F,EAAS,gBAAiB,KAI5D8H,GAAQ,SAAUC,EAAK,CAEtB,IAAIsB,GAOJ5F,GAAQ,YAAasE,CAAG,EAAE,UAAY,UAAYjE,GAAU,qBAC1CA,GAAU,kEAOvBiE,EAAG,iBAAkB,sBAAuB,EAAE,QAClDpE,GAAU,KAAM,SAAWmB,GAAa,YAAe,EAKlDiD,EAAG,iBAAkB,YAAa,EAAE,QACzCpE,GAAU,KAAM,MAAQmB,GAAa,aAAeD,GAAW,GAAI,EAI9DkD,EAAG,iBAAkB,QAAUjE,GAAU,IAAK,EAAE,QACrDH,GAAU,KAAM,IAAK,EAQtB0F,GAAQrJ,EAAS,cAAe,OAAQ,EACxCqJ,GAAM,aAAc,OAAQ,EAAG,EAC/BtB,EAAG,YAAasB,EAAM,EAChBtB,EAAG,iBAAkB,WAAY,EAAE,QACxCpE,GAAU,KAAM,MAAQmB,GAAa,QAAUA,GAAa,KAC3DA,GAAa,YAAe,EAMxBiD,EAAG,iBAAkB,UAAW,EAAE,QACvCpE,GAAU,KAAM,UAAW,EAMtBoE,EAAG,iBAAkB,KAAOjE,GAAU,IAAK,EAAE,QAClDH,GAAU,KAAM,UAAW,EAK5BoE,EAAG,iBAAkB,MAAO,EAC5BpE,GAAU,KAAM,aAAc,CAC/B,CAAE,EAEFmE,GAAQ,SAAUC,EAAK,CACtBA,EAAG,UAAY,oFAKf,IAAIsB,GAAQrJ,EAAS,cAAe,OAAQ,EAC5CqJ,GAAM,aAAc,OAAQ,QAAS,EACrCtB,EAAG,YAAasB,EAAM,EAAE,aAAc,OAAQ,GAAI,EAI7CtB,EAAG,iBAAkB,UAAW,EAAE,QACtCpE,GAAU,KAAM,OAASmB,GAAa,aAAc,EAKhDiD,EAAG,iBAAkB,UAAW,EAAE,SAAW,GACjDpE,GAAU,KAAM,WAAY,WAAY,EAKzCF,GAAQ,YAAasE,CAAG,EAAE,SAAW,GAChCA,EAAG,iBAAkB,WAAY,EAAE,SAAW,GAClDpE,GAAU,KAAM,WAAY,WAAY,EAKzCoE,EAAG,iBAAkB,MAAO,EAC5BpE,GAAU,KAAM,MAAO,CACxB,CAAE,IAGI/D,EAAQ,gBAAkBiG,GAAQ,KAAQrD,GAAUiB,GAAQ,SAClEA,GAAQ,uBACRA,GAAQ,oBACRA,GAAQ,kBACRA,GAAQ,iBAAoB,IAE5BqE,GAAQ,SAAUC,EAAK,CAItBnI,EAAQ,kBAAoB4C,GAAQ,KAAMuF,EAAI,GAAI,EAIlDvF,GAAQ,KAAMuF,EAAI,WAAY,EAC9BnE,GAAc,KAAM,KAAMqB,EAAQ,CACnC,CAAE,EAGGrF,EAAQ,QAQb+D,GAAU,KAAM,MAAO,EAGxBA,GAAYA,GAAU,QAAU,IAAI,OAAQA,GAAU,KAAM,GAAI,CAAE,EAClEC,GAAgBA,GAAc,QAAU,IAAI,OAAQA,GAAc,KAAM,GAAI,CAAE,EAI9EkF,EAAajD,GAAQ,KAAMpC,GAAQ,uBAAwB,EAK3DI,GAAWiF,GAAcjD,GAAQ,KAAMpC,GAAQ,QAAS,EACvD,SAAUe,EAAGC,GAAI,CAQhB,IAAI6E,GAAQ9E,EAAE,WAAa,GAAKA,EAAE,iBAAmBA,EACpD+E,GAAM9E,IAAKA,GAAE,WACd,OAAOD,IAAM+E,IAAO,CAAC,EAAGA,IAAOA,GAAI,WAAa,IAC/CD,GAAM,SACLA,GAAM,SAAUC,EAAI,EACpB/E,EAAE,yBAA2BA,EAAE,wBAAyB+E,EAAI,EAAI,IAEnE,EACA,SAAU/E,EAAGC,GAAI,CAChB,GAAKA,IACJ,KAAUA,GAAIA,GAAE,YACf,GAAKA,KAAMD,EACV,MAAO,GAIV,MAAO,EACR,EAMDD,GAAYuE,EACZ,SAAUtE,EAAGC,GAAI,CAGhB,GAAKD,IAAMC,GACV,OAAAlB,EAAe,GACR,EAIR,IAAIiG,GAAU,CAAChF,EAAE,wBAA0B,CAACC,GAAE,wBAC9C,OAAK+E,KASLA,IAAYhF,EAAE,eAAiBA,KAASC,GAAE,eAAiBA,IAC1DD,EAAE,wBAAyBC,EAAE,EAG7B,EAGI+E,GAAU,GACZ,CAAC5J,EAAQ,cAAgB6E,GAAE,wBAAyBD,CAAE,IAAMgF,GAOzDhF,GAAKxE,GAAYwE,EAAE,eAAiBT,IACxCF,GAAUE,GAAcS,CAAE,EACnB,GAOHC,IAAKzE,GAAYyE,GAAE,eAAiBV,IACxCF,GAAUE,GAAcU,EAAE,EACnB,EAIDnB,EACJhE,GAASgE,EAAWkB,CAAE,EAAIlF,GAASgE,EAAWmB,EAAE,EAClD,EAGK+E,GAAU,EAAI,GAAK,EAC3B,EACA,SAAUhF,EAAGC,GAAI,CAGhB,GAAKD,IAAMC,GACV,OAAAlB,EAAe,GACR,EAGR,IAAI6E,GACH9H,GAAI,EACJmJ,GAAMjF,EAAE,WACR+E,GAAM9E,GAAE,WACRiF,GAAK,CAAElF,CAAE,EACTmF,GAAK,CAAElF,EAAE,EAGV,GAAK,CAACgF,IAAO,CAACF,GAMb,OAAO/E,GAAKxE,EAAW,GACtByE,IAAKzE,EAAW,EAEhByJ,GAAM,GACNF,GAAM,EACNjG,EACEhE,GAASgE,EAAWkB,CAAE,EAAIlF,GAASgE,EAAWmB,EAAE,EAClD,EAGK,GAAKgF,KAAQF,GACnB,OAAOpB,GAAc3D,EAAGC,EAAE,EAK3B,IADA2D,GAAM5D,EACI4D,GAAMA,GAAI,YACnBsB,GAAG,QAAStB,EAAI,EAGjB,IADAA,GAAM3D,GACI2D,GAAMA,GAAI,YACnBuB,GAAG,QAASvB,EAAI,EAIjB,KAAQsB,GAAIpJ,EAAE,IAAMqJ,GAAIrJ,EAAE,GACzBA,KAGD,OAAOA,GAGN6H,GAAcuB,GAAIpJ,EAAE,EAAGqJ,GAAIrJ,EAAE,CAAE,EAO/BoJ,GAAIpJ,EAAE,GAAKyD,GAAe,GAC1B4F,GAAIrJ,EAAE,GAAKyD,GAAe,EAE1B,CACF,GAEO/D,CACR,EAEA8C,GAAO,QAAU,SAAU8G,EAAMC,EAAW,CAC3C,OAAO/G,GAAQ8G,EAAM,KAAM,KAAMC,CAAS,CAC3C,EAEA/G,GAAO,gBAAkB,SAAU5B,EAAM0I,EAAO,CAG/C,GAFApG,EAAatC,CAAK,EAEbtB,EAAQ,iBAAmB8D,IAC/B,CAACY,GAAwBsF,EAAO,GAAI,IAClC,CAAChG,IAAiB,CAACA,GAAc,KAAMgG,CAAK,KAC5C,CAACjG,IAAiB,CAACA,GAAU,KAAMiG,CAAK,GAE1C,GAAI,CACH,IAAI5I,EAAMwB,GAAQ,KAAMtB,EAAM0I,CAAK,EAGnC,GAAK5I,GAAOpB,EAAQ,mBAInBsB,EAAK,UAAYA,EAAK,SAAS,WAAa,GAC5C,OAAOF,CAET,OAAU4F,EAAI,CACbtC,GAAwBsF,EAAM,EAAK,CACpC,CAGD,OAAO9G,GAAQ8G,EAAM5J,EAAU,KAAM,CAAEkB,CAAK,CAAE,EAAE,OAAS,CAC1D,EAEA4B,GAAO,SAAW,SAAUjC,EAASK,EAAO,CAO3C,OAAOL,EAAQ,eAAiBA,IAAab,GAC5CwD,EAAa3C,CAAQ,EAEfgD,GAAUhD,EAASK,CAAK,CAChC,EAEA4B,GAAO,KAAO,SAAU5B,EAAMK,EAAO,EAO7BL,EAAK,eAAiBA,IAAUlB,GACtCwD,EAAatC,CAAK,EAGnB,IAAI2G,EAAK9E,EAAK,WAAYxB,EAAK,YAAY,CAAE,EAG5ChB,EAAMsH,GAAMpI,GAAO,KAAMsD,EAAK,WAAYxB,EAAK,YAAY,CAAE,EAC5DsG,EAAI3G,EAAMK,EAAM,CAACmC,EAAe,EAChC,OAEF,OAAOnD,IAAQ,OACdA,EACAX,EAAQ,YAAc,CAAC8D,GACtBxC,EAAK,aAAcK,CAAK,GACtBhB,EAAMW,EAAK,iBAAkBK,CAAK,IAAOhB,EAAI,UAC9CA,EAAI,MACJ,IACJ,EAEAuC,GAAO,OAAS,SAAUgH,EAAM,CAC/B,OAASA,EAAM,IAAK,QAASzD,GAAYC,EAAW,CACrD,EAEAxD,GAAO,MAAQ,SAAUf,EAAM,CAC9B,MAAM,IAAI,MAAO,0CAA4CA,CAAI,CAClE,EAMAe,GAAO,WAAa,SAAUX,EAAU,CACvC,IAAIjB,EACH6I,EAAa,CAAC,EACd1I,EAAI,EACJf,EAAI,EAOL,GAJAiD,EAAe,CAAC3D,EAAQ,iBACxB0D,EAAY,CAAC1D,EAAQ,YAAcuC,EAAQ,MAAO,CAAE,EACpDA,EAAQ,KAAMoC,EAAU,EAEnBhB,EAAe,CACnB,KAAUrC,EAAOiB,EAAS7B,GAAI,GACxBY,IAASiB,EAAS7B,CAAE,IACxBe,EAAI0I,EAAW,KAAMzJ,CAAE,GAGzB,KAAQe,KACPc,EAAQ,OAAQ4H,EAAY1I,CAAE,EAAG,CAAE,CAErC,CAIA,OAAAiC,EAAY,KAELnB,CACR,EAMAa,EAAUF,GAAO,QAAU,SAAU5B,EAAO,CAC3C,IAAId,EACHY,EAAM,GACNV,EAAI,EACJ+G,EAAWnG,EAAK,SAEjB,GAAMmG,GAQC,GAAKA,IAAa,GAAKA,IAAa,GAAKA,IAAa,GAAK,CAIjE,GAAK,OAAOnG,EAAK,aAAgB,SAChC,OAAOA,EAAK,YAIZ,IAAMA,EAAOA,EAAK,WAAYA,EAAMA,EAAOA,EAAK,YAC/CF,GAAOgC,EAAS9B,CAAK,CAGxB,SAAYmG,IAAa,GAAKA,IAAa,EAC1C,OAAOnG,EAAK,cAnBZ,MAAUd,EAAOc,EAAMZ,GAAI,GAG1BU,GAAOgC,EAAS5C,CAAK,EAqBvB,OAAOY,CACR,EAEA+B,EAAOD,GAAO,UAAY,CAGzB,YAAa,GAEb,aAAc8E,GAEd,MAAOnC,GAEP,WAAY,CAAC,EAEb,KAAM,CAAC,EAEP,SAAU,CACT,IAAK,CAAE,IAAK,aAAc,MAAO,EAAK,EACtC,IAAK,CAAE,IAAK,YAAa,EACzB,IAAK,CAAE,IAAK,kBAAmB,MAAO,EAAK,EAC3C,IAAK,CAAE,IAAK,iBAAkB,CAC/B,EAEA,UAAW,CACV,KAAQ,SAAUwB,EAAQ,CACzB,OAAAA,EAAO,CAAE,EAAIA,EAAO,CAAE,EAAE,QAASjB,GAAWC,EAAU,EAGtDgB,EAAO,CAAE,GAAMA,EAAO,CAAE,GAAKA,EAAO,CAAE,GACrCA,EAAO,CAAE,GAAK,IAAK,QAASjB,GAAWC,EAAU,EAE7CgB,EAAO,CAAE,IAAM,OACnBA,EAAO,CAAE,EAAI,IAAMA,EAAO,CAAE,EAAI,KAG1BA,EAAM,MAAO,EAAG,CAAE,CAC1B,EAEA,MAAS,SAAUA,EAAQ,CAY1B,OAAAA,EAAO,CAAE,EAAIA,EAAO,CAAE,EAAE,YAAY,EAE/BA,EAAO,CAAE,EAAE,MAAO,EAAG,CAAE,IAAM,OAG3BA,EAAO,CAAE,GACdnE,GAAO,MAAOmE,EAAO,CAAE,CAAE,EAK1BA,EAAO,CAAE,EAAI,EAAGA,EAAO,CAAE,EACxBA,EAAO,CAAE,GAAMA,EAAO,CAAE,GAAK,GAC7B,GAAMA,EAAO,CAAE,IAAM,QAAUA,EAAO,CAAE,IAAM,QAC/CA,EAAO,CAAE,EAAI,EAAKA,EAAO,CAAE,EAAIA,EAAO,CAAE,GAAOA,EAAO,CAAE,IAAM,QAGnDA,EAAO,CAAE,GACpBnE,GAAO,MAAOmE,EAAO,CAAE,CAAE,EAGnBA,CACR,EAEA,OAAU,SAAUA,EAAQ,CAC3B,IAAI+C,EACHC,EAAW,CAAChD,EAAO,CAAE,GAAKA,EAAO,CAAE,EAEpC,OAAKxB,GAAW,MAAU,KAAMwB,EAAO,CAAE,CAAE,EACnC,MAIHA,EAAO,CAAE,EACbA,EAAO,CAAE,EAAIA,EAAO,CAAE,GAAKA,EAAO,CAAE,GAAK,GAG9BgD,GAAY1E,GAAQ,KAAM0E,CAAS,IAG5CD,EAAS9G,EAAU+G,EAAU,EAAK,KAGlCD,EAASC,EAAS,QAAS,IAAKA,EAAS,OAASD,CAAO,EAAIC,EAAS,UAGxEhD,EAAO,CAAE,EAAIA,EAAO,CAAE,EAAE,MAAO,EAAG+C,CAAO,EACzC/C,EAAO,CAAE,EAAIgD,EAAS,MAAO,EAAGD,CAAO,GAIjC/C,EAAM,MAAO,EAAG,CAAE,EAC1B,CACD,EAEA,OAAQ,CAEP,IAAO,SAAUiD,EAAmB,CACnC,IAAIC,EAAWD,EAAiB,QAASlE,GAAWC,EAAU,EAAE,YAAY,EAC5E,OAAOiE,IAAqB,IAC3B,UAAW,CACV,MAAO,EACR,EACA,SAAUhJ,EAAO,CAChB,OAAOA,EAAK,UAAYA,EAAK,SAAS,YAAY,IAAMiJ,CACzD,CACF,EAEA,MAAS,SAAUf,EAAY,CAC9B,IAAIgB,EAAUlG,GAAYkF,EAAY,GAAI,EAE1C,OAAOgB,IACJA,EAAU,IAAI,OAAQ,MAAQtF,GAC/B,IAAMsE,EAAY,IAAMtE,GAAa,KAAM,IAAOZ,GACjDkF,EAAW,SAAUlI,EAAO,CAC3B,OAAOkJ,EAAQ,KACd,OAAOlJ,EAAK,WAAc,UAAYA,EAAK,WAC3C,OAAOA,EAAK,cAAiB,aAC5BA,EAAK,aAAc,OAAQ,GAC5B,EACD,CACH,CAAE,CACJ,EAEA,KAAQ,SAAUK,EAAM8I,EAAUC,EAAQ,CACzC,OAAO,SAAUpJ,EAAO,CACvB,IAAIqJ,EAASzH,GAAO,KAAM5B,EAAMK,CAAK,EAErC,OAAKgJ,GAAU,KACPF,IAAa,KAEfA,GAINE,GAAU,GAIHF,IAAa,IAAME,IAAWD,EACpCD,IAAa,KAAOE,IAAWD,EAC/BD,IAAa,KAAOC,GAASC,EAAO,QAASD,CAAM,IAAM,EACzDD,IAAa,KAAOC,GAASC,EAAO,QAASD,CAAM,EAAI,GACvDD,IAAa,KAAOC,GAASC,EAAO,MAAO,CAACD,EAAM,MAAO,IAAMA,EAC/DD,IAAa,MAAS,IAAME,EAAO,QAASrF,GAAa,GAAI,EAAI,KAAM,QAASoF,CAAM,EAAI,GAC1FD,IAAa,KAAOE,IAAWD,GAASC,EAAO,MAAO,EAAGD,EAAM,OAAS,CAAE,IAAMA,EAAQ,IACxF,IAdO,EAiBT,CACD,EAEA,MAAS,SAAUzH,EAAM2H,EAAMC,EAAWrI,EAAOsI,EAAO,CACvD,IAAIC,GAAS9H,EAAK,MAAO,EAAG,CAAE,IAAM,MACnC+H,GAAU/H,EAAK,MAAO,EAAG,IAAM,OAC/BgI,GAASL,IAAS,UAEnB,OAAOpI,IAAU,GAAKsI,IAAS,EAG9B,SAAUxJ,GAAO,CAChB,MAAO,CAAC,CAACA,GAAK,UACf,EAEA,SAAUA,GAAM4J,GAAUC,GAAM,CAC/B,IAAIrD,GAAOsD,GAAaC,GAAY7K,GAAM8K,GAAWC,GACpDC,GAAMT,KAAWC,GAAU,cAAgB,kBAC3CS,GAASnK,GAAK,WACdK,GAAOsJ,IAAU3J,GAAK,SAAS,YAAY,EAC3CoK,GAAW,CAACP,IAAO,CAACF,GACpBxC,GAAO,GAER,GAAKgD,GAAS,CAGb,GAAKV,GAAS,CACb,KAAQS,IAAM,CAEb,IADAhL,GAAOc,GACGd,GAAOA,GAAMgL,EAAI,GAC1B,GAAKP,GACJzK,GAAK,SAAS,YAAY,IAAMmB,GAChCnB,GAAK,WAAa,EAElB,MAAO,GAKT+K,GAAQC,GAAMvI,IAAS,QAAU,CAACsI,IAAS,aAC5C,CACA,MAAO,EACR,CAKA,GAHAA,GAAQ,CAAEP,GAAUS,GAAO,WAAaA,GAAO,SAAU,EAGpDT,IAAWU,IAkBf,IAbAlL,GAAOiL,GACPJ,GAAa7K,GAAM0D,EAAQ,IAAO1D,GAAM0D,EAAQ,EAAI,CAAC,GAIrDkH,GAAcC,GAAY7K,GAAK,QAAS,IACrC6K,GAAY7K,GAAK,QAAS,EAAI,CAAC,GAElCsH,GAAQsD,GAAanI,CAAK,GAAK,CAAC,EAChCqI,GAAYxD,GAAO,CAAE,IAAM1D,IAAW0D,GAAO,CAAE,EAC/CW,GAAO6C,IAAaxD,GAAO,CAAE,EAC7BtH,GAAO8K,IAAaG,GAAO,WAAYH,EAAU,EAEvC9K,GAAO,EAAE8K,IAAa9K,IAAQA,GAAMgL,EAAI,IAG/C/C,GAAO6C,GAAY,IAAOC,GAAM,IAAI,GAGtC,GAAK/K,GAAK,WAAa,GAAK,EAAEiI,IAAQjI,KAASc,GAAO,CACrD8J,GAAanI,CAAK,EAAI,CAAEmB,GAASkH,GAAW7C,EAAK,EACjD,KACD,UAMIiD,KAGJlL,GAAOc,GACP+J,GAAa7K,GAAM0D,EAAQ,IAAO1D,GAAM0D,EAAQ,EAAI,CAAC,GAIrDkH,GAAcC,GAAY7K,GAAK,QAAS,IACrC6K,GAAY7K,GAAK,QAAS,EAAI,CAAC,GAElCsH,GAAQsD,GAAanI,CAAK,GAAK,CAAC,EAChCqI,GAAYxD,GAAO,CAAE,IAAM1D,IAAW0D,GAAO,CAAE,EAC/CW,GAAO6C,IAKH7C,KAAS,GAGb,MAAUjI,GAAO,EAAE8K,IAAa9K,IAAQA,GAAMgL,EAAI,IAC/C/C,GAAO6C,GAAY,IAAOC,GAAM,IAAI,IAE/B,GAAAN,GACNzK,GAAK,SAAS,YAAY,IAAMmB,GAChCnB,GAAK,WAAa,IAClB,EAAEiI,KAGGiD,KACJL,GAAa7K,GAAM0D,EAAQ,IACxB1D,GAAM0D,EAAQ,EAAI,CAAC,GAItBkH,GAAcC,GAAY7K,GAAK,QAAS,IACrC6K,GAAY7K,GAAK,QAAS,EAAI,CAAC,GAElC4K,GAAanI,CAAK,EAAI,CAAEmB,GAASqE,EAAK,GAGlCjI,KAASc,MAlBf,CA2BH,OAAAmH,IAAQqC,EACDrC,KAASjG,GAAWiG,GAAOjG,IAAU,GAAKiG,GAAOjG,GAAS,CAClE,CACD,CACF,EAEA,OAAU,SAAUmJ,EAAQ5C,EAAW,CAMtC,IAAI6C,EACH3D,EAAK9E,EAAK,QAASwI,CAAO,GAAKxI,EAAK,WAAYwI,EAAO,YAAY,CAAE,GACpEzI,GAAO,MAAO,uBAAyByI,CAAO,EAKhD,OAAK1D,EAAI/D,EAAQ,EACT+D,EAAIc,CAAS,EAIhBd,EAAG,OAAS,GAChB2D,EAAO,CAAED,EAAQA,EAAQ,GAAI5C,CAAS,EAC/B5F,EAAK,WAAW,eAAgBwI,EAAO,YAAY,CAAE,EAC3D3D,GAAc,SAAUd,EAAMtE,GAAU,CAIvC,QAHIiJ,GACHC,GAAU7D,EAAIf,EAAM6B,CAAS,EAC7BrI,GAAIoL,GAAQ,OACLpL,MACPmL,GAAMnM,GAASwH,EAAM4E,GAASpL,EAAE,CAAE,EAClCwG,EAAM2E,EAAI,EAAI,EAAGjJ,GAASiJ,EAAI,EAAIC,GAASpL,EAAE,EAE/C,CAAE,EACF,SAAUY,EAAO,CAChB,OAAO2G,EAAI3G,EAAM,EAAGsK,CAAK,CAC1B,GAGK3D,CACR,CACD,EAEA,QAAS,CAGR,IAAOD,GAAc,SAAUhH,EAAW,CAKzC,IAAIyI,EAAQ,CAAC,EACZlH,EAAU,CAAC,EACXwJ,EAAUxI,EAASvC,EAAS,QAASuE,GAAO,IAAK,CAAE,EAEpD,OAAOwG,EAAS7H,EAAQ,EACvB8D,GAAc,SAAUd,EAAMtE,GAASsI,GAAUC,GAAM,CAMtD,QALI7J,GACH0K,GAAYD,EAAS7E,EAAM,KAAMiE,GAAK,CAAC,CAAE,EACzCzK,GAAIwG,EAAK,OAGFxG,OACAY,GAAO0K,GAAWtL,EAAE,KAC1BwG,EAAMxG,EAAE,EAAI,EAAGkC,GAASlC,EAAE,EAAIY,IAGjC,CAAE,EACF,SAAUA,EAAM4J,GAAUC,GAAM,CAC/B,OAAA1B,EAAO,CAAE,EAAInI,EACbyK,EAAStC,EAAO,KAAM0B,GAAK5I,CAAQ,EAGnCkH,EAAO,CAAE,EAAI,KACN,CAAClH,EAAQ,IAAI,CACrB,CACF,CAAE,EAEF,IAAOyF,GAAc,SAAUhH,EAAW,CACzC,OAAO,SAAUM,EAAO,CACvB,OAAO4B,GAAQlC,EAAUM,CAAK,EAAE,OAAS,CAC1C,CACD,CAAE,EAEF,SAAY0G,GAAc,SAAUiE,EAAO,CAC1C,OAAAA,EAAOA,EAAK,QAAS7F,GAAWC,EAAU,EACnC,SAAU/E,EAAO,CACvB,OAASA,EAAK,aAAe8B,EAAS9B,CAAK,GAAI,QAAS2K,CAAK,EAAI,EAClE,CACD,CAAE,EASF,KAAQjE,GAAc,SAAUkE,EAAO,CAGtC,OAAMtG,GAAY,KAAMsG,GAAQ,EAAG,GAClChJ,GAAO,MAAO,qBAAuBgJ,CAAK,EAE3CA,EAAOA,EAAK,QAAS9F,GAAWC,EAAU,EAAE,YAAY,EACjD,SAAU/E,EAAO,CACvB,IAAI6K,EACJ,EACC,IAAOA,EAAWrI,GACjBxC,EAAK,KACLA,EAAK,aAAc,UAAW,GAAKA,EAAK,aAAc,MAAO,EAE7D,OAAA6K,EAAWA,EAAS,YAAY,EACzBA,IAAaD,GAAQC,EAAS,QAASD,EAAO,GAAI,IAAM,SAErD5K,EAAOA,EAAK,aAAgBA,EAAK,WAAa,GAC1D,MAAO,EACR,CACD,CAAE,EAGF,OAAU,SAAUA,EAAO,CAC1B,IAAI8K,EAAOlN,EAAO,UAAYA,EAAO,SAAS,KAC9C,OAAOkN,GAAQA,EAAK,MAAO,CAAE,IAAM9K,EAAK,EACzC,EAEA,KAAQ,SAAUA,EAAO,CACxB,OAAOA,IAASuC,EACjB,EAEA,MAAS,SAAUvC,EAAO,CACzB,OAAOA,IAASlB,EAAS,gBACtB,CAACA,EAAS,UAAYA,EAAS,SAAS,IAC1C,CAAC,EAAGkB,EAAK,MAAQA,EAAK,MAAQ,CAACA,EAAK,SACtC,EAGA,QAAWsH,GAAsB,EAAM,EACvC,SAAYA,GAAsB,EAAK,EAEvC,QAAW,SAAUtH,EAAO,CAI3B,IAAIiJ,EAAWjJ,EAAK,SAAS,YAAY,EACzC,OAASiJ,IAAa,SAAW,CAAC,CAACjJ,EAAK,SACrCiJ,IAAa,UAAY,CAAC,CAACjJ,EAAK,QACpC,EAEA,SAAY,SAAUA,EAAO,CAI5B,OAAKA,EAAK,YAETA,EAAK,WAAW,cAGVA,EAAK,WAAa,EAC1B,EAGA,MAAS,SAAUA,EAAO,CAMzB,IAAMA,EAAOA,EAAK,WAAYA,EAAMA,EAAOA,EAAK,YAC/C,GAAKA,EAAK,SAAW,EACpB,MAAO,GAGT,MAAO,EACR,EAEA,OAAU,SAAUA,EAAO,CAC1B,MAAO,CAAC6B,EAAK,QAAS,MAAW7B,CAAK,CACvC,EAGA,OAAU,SAAUA,EAAO,CAC1B,OAAO0E,GAAQ,KAAM1E,EAAK,QAAS,CACpC,EAEA,MAAS,SAAUA,EAAO,CACzB,OAAOyE,GAAQ,KAAMzE,EAAK,QAAS,CACpC,EAEA,OAAU,SAAUA,EAAO,CAC1B,IAAIK,EAAOL,EAAK,SAAS,YAAY,EACrC,OAAOK,IAAS,SAAWL,EAAK,OAAS,UAAYK,IAAS,QAC/D,EAEA,KAAQ,SAAUL,EAAO,CACxB,IAAI+K,EACJ,OAAO/K,EAAK,SAAS,YAAY,IAAM,SACtCA,EAAK,OAAS,UAIV+K,EAAO/K,EAAK,aAAc,MAAO,IAAO,MAC3C+K,EAAK,YAAY,IAAM,OAC1B,EAGA,MAASvD,GAAwB,UAAW,CAC3C,MAAO,CAAE,CAAE,CACZ,CAAE,EAEF,KAAQA,GAAwB,SAAUwD,EAAerK,EAAS,CACjE,MAAO,CAAEA,EAAS,CAAE,CACrB,CAAE,EAEF,GAAM6G,GAAwB,SAAUwD,EAAerK,EAAQ8G,EAAW,CACzE,MAAO,CAAEA,EAAW,EAAIA,EAAW9G,EAAS8G,CAAS,CACtD,CAAE,EAEF,KAAQD,GAAwB,SAAUE,EAAc/G,EAAS,CAEhE,QADIvB,EAAI,EACAA,EAAIuB,EAAQvB,GAAK,EACxBsI,EAAa,KAAMtI,CAAE,EAEtB,OAAOsI,CACR,CAAE,EAEF,IAAOF,GAAwB,SAAUE,EAAc/G,EAAS,CAE/D,QADIvB,EAAI,EACAA,EAAIuB,EAAQvB,GAAK,EACxBsI,EAAa,KAAMtI,CAAE,EAEtB,OAAOsI,CACR,CAAE,EAEF,GAAMF,GAAwB,SAAUE,EAAc/G,EAAQ8G,EAAW,CAMxE,QALIrI,EAAIqI,EAAW,EAClBA,EAAW9G,EACX8G,EAAW9G,EACVA,EACA8G,EACM,EAAErI,GAAK,GACdsI,EAAa,KAAMtI,CAAE,EAEtB,OAAOsI,CACR,CAAE,EAEF,GAAMF,GAAwB,SAAUE,EAAc/G,EAAQ8G,EAAW,CAExE,QADIrI,EAAIqI,EAAW,EAAIA,EAAW9G,EAAS8G,EACnC,EAAErI,EAAIuB,GACb+G,EAAa,KAAMtI,CAAE,EAEtB,OAAOsI,CACR,CAAE,CACH,CACD,EAEA7F,EAAK,QAAS,IAAUA,EAAK,QAAS,GAGtC,IAAMzC,IAAK,CAAE,MAAO,GAAM,SAAU,GAAM,KAAM,GAAM,SAAU,GAAM,MAAO,EAAK,EACjFyC,EAAK,QAASzC,CAAE,EAAIgI,GAAmBhI,CAAE,EAE1C,IAAMA,IAAK,CAAE,OAAQ,GAAM,MAAO,EAAK,EACtCyC,EAAK,QAASzC,CAAE,EAAIiI,GAAoBjI,CAAE,EAI3C,SAAS6L,IAAa,CAAC,CACvBA,GAAW,UAAYpJ,EAAK,QAAUA,EAAK,QAC3CA,EAAK,WAAa,IAAIoJ,GAEtBjJ,EAAWJ,GAAO,SAAW,SAAUlC,EAAUwL,EAAY,CAC5D,IAAIV,EAASzE,EAAOoF,EAAQxJ,GAC3ByJ,GAAOpF,GAAQqF,GACfC,GAASpI,GAAYxD,EAAW,GAAI,EAErC,GAAK4L,GACJ,OAAOJ,EAAY,EAAII,GAAO,MAAO,CAAE,EAOxC,IAJAF,GAAQ1L,EACRsG,GAAS,CAAC,EACVqF,GAAaxJ,EAAK,UAEVuJ,IAAQ,EAGV,CAACZ,IAAazE,EAAQ7B,GAAO,KAAMkH,EAAM,MACxCrF,IAGJqF,GAAQA,GAAM,MAAOrF,EAAO,CAAE,EAAE,MAAO,GAAKqF,IAE7CpF,GAAO,KAAQmF,EAAS,CAAC,CAAI,GAG9BX,EAAU,IAGHzE,EAAQ5B,GAAmB,KAAMiH,EAAM,KAC7CZ,EAAUzE,EAAM,MAAM,EACtBoF,EAAO,KAAM,CACZ,MAAOX,EAGP,KAAMzE,EAAO,CAAE,EAAE,QAAS9B,GAAO,GAAI,CACtC,CAAE,EACFmH,GAAQA,GAAM,MAAOZ,EAAQ,MAAO,GAIrC,IAAM7I,MAAQE,EAAK,QACXkE,EAAQxB,GAAW5C,EAAK,EAAE,KAAMyJ,EAAM,KAAS,CAACC,GAAY1J,EAAK,IACrEoE,EAAQsF,GAAY1J,EAAK,EAAGoE,CAAM,MACpCyE,EAAUzE,EAAM,MAAM,EACtBoF,EAAO,KAAM,CACZ,MAAOX,EACP,KAAM7I,GACN,QAASoE,CACV,CAAE,EACFqF,GAAQA,GAAM,MAAOZ,EAAQ,MAAO,GAItC,GAAK,CAACA,EACL,KAEF,CAKA,OAAOU,EACNE,GAAM,OACNA,GACCxJ,GAAO,MAAOlC,CAAS,EAGvBwD,GAAYxD,EAAUsG,EAAO,EAAE,MAAO,CAAE,CAC3C,EAEA,SAASK,GAAY8E,EAAS,CAI7B,QAHI/L,EAAI,EACPc,EAAMiL,EAAO,OACbzL,EAAW,GACJN,EAAIc,EAAKd,IAChBM,GAAYyL,EAAQ/L,CAAE,EAAE,MAEzB,OAAOM,CACR,CAEA,SAAS+F,GAAegF,EAASc,EAAYC,EAAO,CACnD,IAAItB,EAAMqB,EAAW,IACpBE,EAAOF,EAAW,KAClB9E,GAAMgF,GAAQvB,EACdwB,GAAmBF,GAAQ/E,KAAQ,aACnCkF,GAAW5I,KAEZ,OAAOwI,EAAW,MAGjB,SAAUvL,GAAML,GAASkK,GAAM,CAC9B,KAAU7J,GAAOA,GAAMkK,CAAI,GAC1B,GAAKlK,GAAK,WAAa,GAAK0L,GAC3B,OAAOjB,EAASzK,GAAML,GAASkK,EAAI,EAGrC,MAAO,EACR,EAGA,SAAU7J,GAAML,GAASkK,GAAM,CAC9B,IAAI+B,GAAU9B,GAAaC,GAC1B8B,GAAW,CAAE/I,GAAS6I,EAAS,EAGhC,GAAK9B,IACJ,KAAU7J,GAAOA,GAAMkK,CAAI,GAC1B,IAAKlK,GAAK,WAAa,GAAK0L,KACtBjB,EAASzK,GAAML,GAASkK,EAAI,EAChC,MAAO,OAKV,MAAU7J,GAAOA,GAAMkK,CAAI,GAC1B,GAAKlK,GAAK,WAAa,GAAK0L,GAQ3B,GAPA3B,GAAa/J,GAAM4C,EAAQ,IAAO5C,GAAM4C,EAAQ,EAAI,CAAC,GAIrDkH,GAAcC,GAAY/J,GAAK,QAAS,IACrC+J,GAAY/J,GAAK,QAAS,EAAI,CAAC,GAE7ByL,GAAQA,IAASzL,GAAK,SAAS,YAAY,EAC/CA,GAAOA,GAAMkK,CAAI,GAAKlK,OAChB,KAAO4L,GAAW9B,GAAarD,EAAI,IACzCmF,GAAU,CAAE,IAAM9I,IAAW8I,GAAU,CAAE,IAAMD,GAG/C,OAASE,GAAU,CAAE,EAAID,GAAU,CAAE,EAOrC,GAHA9B,GAAarD,EAAI,EAAIoF,GAGdA,GAAU,CAAE,EAAIpB,EAASzK,GAAML,GAASkK,EAAI,EAClD,MAAO,GAMZ,MAAO,EACR,CACF,CAEA,SAASiC,GAAgBC,EAAW,CACnC,OAAOA,EAAS,OAAS,EACxB,SAAU/L,EAAML,EAASkK,EAAM,CAE9B,QADIzK,EAAI2M,EAAS,OACT3M,KACP,GAAK,CAAC2M,EAAU3M,CAAE,EAAGY,EAAML,EAASkK,CAAI,EACvC,MAAO,GAGT,MAAO,EACR,EACAkC,EAAU,CAAE,CACd,CAEA,SAASC,GAAkBtM,EAAUuM,EAAUhL,EAAU,CAGxD,QAFI7B,EAAI,EACPc,EAAM+L,EAAS,OACR7M,EAAIc,EAAKd,IAChBwC,GAAQlC,EAAUuM,EAAU7M,CAAE,EAAG6B,CAAQ,EAE1C,OAAOA,CACR,CAEA,SAASiL,GAAUxB,EAAWyB,EAAKC,EAAQzM,EAASkK,EAAM,CAOzD,QANI7J,GACHqM,GAAe,CAAC,EAChBjN,GAAI,EACJc,GAAMwK,EAAU,OAChB4B,GAASH,GAAO,KAET/M,GAAIc,GAAKd,MACTY,GAAO0K,EAAWtL,EAAE,KACrB,CAACgN,GAAUA,EAAQpM,GAAML,EAASkK,CAAI,KAC1CwC,GAAa,KAAMrM,EAAK,EACnBsM,IACJH,EAAI,KAAM/M,EAAE,GAMhB,OAAOiN,EACR,CAEA,SAASE,GAAYC,EAAW9M,EAAU+K,EAASgC,EAAYC,EAAYC,GAAe,CACzF,OAAKF,GAAc,CAACA,EAAY7J,EAAQ,IACvC6J,EAAaF,GAAYE,CAAW,GAEhCC,GAAc,CAACA,EAAY9J,EAAQ,IACvC8J,EAAaH,GAAYG,EAAYC,EAAa,GAE5CjG,GAAc,SAAUd,GAAM3E,GAAStB,GAASkK,GAAM,CAC5D,IAAI+C,GAAMxN,GAAGY,GACZ6M,GAAS,CAAC,EACVC,GAAU,CAAC,EACXC,GAAc9L,GAAQ,OAGtBpB,GAAQ+F,IAAQoG,GACftM,GAAY,IACZC,GAAQ,SAAW,CAAEA,EAAQ,EAAIA,GACjC,CAAC,CACF,EAGAqN,GAAYR,IAAe5G,IAAQ,CAAClG,GACnCwM,GAAUrM,GAAOgN,GAAQL,EAAW7M,GAASkK,EAAI,EACjDhK,GAEDoN,GAAaxC,EAGZiC,IAAgB9G,GAAO4G,EAAYO,IAAeN,GAGjD,CAAC,EAGDxL,GACD+L,GAQF,GALKvC,GACJA,EAASuC,GAAWC,GAAYtN,GAASkK,EAAI,EAIzC4C,EAMJ,IALAG,GAAOV,GAAUe,GAAYH,EAAQ,EACrCL,EAAYG,GAAM,CAAC,EAAGjN,GAASkK,EAAI,EAGnCzK,GAAIwN,GAAK,OACDxN,OACAY,GAAO4M,GAAMxN,EAAE,KACrB6N,GAAYH,GAAS1N,EAAE,CAAE,EAAI,EAAG4N,GAAWF,GAAS1N,EAAE,CAAE,EAAIY,KAK/D,GAAK4F,IACJ,GAAK8G,GAAcF,EAAY,CAC9B,GAAKE,EAAa,CAKjB,IAFAE,GAAO,CAAC,EACRxN,GAAI6N,GAAW,OACP7N,OACAY,GAAOiN,GAAY7N,EAAE,IAG3BwN,GAAK,KAAQI,GAAW5N,EAAE,EAAIY,EAAO,EAGvC0M,EAAY,KAAQO,GAAa,CAAC,EAAKL,GAAM/C,EAAI,CAClD,CAIA,IADAzK,GAAI6N,GAAW,OACP7N,OACAY,GAAOiN,GAAY7N,EAAE,KACzBwN,GAAOF,EAAatO,GAASwH,GAAM5F,EAAK,EAAI6M,GAAQzN,EAAE,GAAM,KAE9DwG,GAAMgH,EAAK,EAAI,EAAG3L,GAAS2L,EAAK,EAAI5M,IAGvC,OAIAiN,GAAaf,GACZe,KAAehM,GACdgM,GAAW,OAAQF,GAAaE,GAAW,MAAO,EAClDA,EACF,EACKP,EACJA,EAAY,KAAMzL,GAASgM,GAAYpD,EAAI,EAE3C1L,GAAK,MAAO8C,GAASgM,EAAW,CAGnC,CAAE,CACH,CAEA,SAASC,GAAmB/B,EAAS,CAyBpC,QAxBIgC,EAAc1C,EAAStK,EAC1BD,EAAMiL,EAAO,OACbiC,GAAkBvL,EAAK,SAAUsJ,EAAQ,CAAE,EAAE,IAAK,EAClDkC,GAAmBD,IAAmBvL,EAAK,SAAU,GAAI,EACzDzC,GAAIgO,GAAkB,EAAI,EAG1BE,GAAe7H,GAAe,SAAUzF,GAAO,CAC9C,OAAOA,KAASmN,CACjB,EAAGE,GAAkB,EAAK,EAC1BE,GAAkB9H,GAAe,SAAUzF,GAAO,CACjD,OAAO5B,GAAS+O,EAAcnN,EAAK,EAAI,EACxC,EAAGqN,GAAkB,EAAK,EAC1BtB,GAAW,CAAE,SAAU/L,GAAML,GAASkK,GAAM,CAC3C,IAAI/J,GAAQ,CAACsN,KAAqBvD,IAAOlK,KAAYwC,MAClDgL,EAAexN,IAAU,SAC1B2N,GAActN,GAAML,GAASkK,EAAI,EACjC0D,GAAiBvN,GAAML,GAASkK,EAAI,GAGtC,OAAAsD,EAAe,KACRrN,EACR,CAAE,EAEKV,GAAIc,EAAKd,KAChB,GAAOqL,EAAU5I,EAAK,SAAUsJ,EAAQ/L,EAAE,EAAE,IAAK,EAChD2M,GAAW,CAAEtG,GAAeqG,GAAgBC,EAAS,EAAGtB,CAAQ,CAAE,MAC5D,CAIN,GAHAA,EAAU5I,EAAK,OAAQsJ,EAAQ/L,EAAE,EAAE,IAAK,EAAE,MAAO,KAAM+L,EAAQ/L,EAAE,EAAE,OAAQ,EAGtEqL,EAAS7H,EAAQ,EAAI,CAIzB,IADAzC,EAAI,EAAEf,GACEe,EAAID,GACN,CAAA2B,EAAK,SAAUsJ,EAAQhL,CAAE,EAAE,IAAK,EADrBA,IAChB,CAID,OAAOoM,GACNnN,GAAI,GAAK0M,GAAgBC,EAAS,EAClC3M,GAAI,GAAKiH,GAGT8E,EACE,MAAO,EAAG/L,GAAI,CAAE,EAChB,OAAQ,CAAE,MAAO+L,EAAQ/L,GAAI,CAAE,EAAE,OAAS,IAAM,IAAM,EAAG,CAAE,CAC7D,EAAE,QAAS6E,GAAO,IAAK,EACvBwG,EACArL,GAAIe,GAAK+M,GAAmB/B,EAAO,MAAO/L,GAAGe,CAAE,CAAE,EACjDA,EAAID,GAAOgN,GAAqB/B,EAASA,EAAO,MAAOhL,CAAE,CAAI,EAC7DA,EAAID,GAAOmG,GAAY8E,CAAO,CAC/B,CACD,CACAY,GAAS,KAAMtB,CAAQ,CACxB,CAGD,OAAOqB,GAAgBC,EAAS,CACjC,CAEA,SAASyB,GAA0BC,EAAiBC,EAAc,CACjE,IAAIC,EAAQD,EAAY,OAAS,EAChCE,EAAYH,EAAgB,OAAS,EACrCI,EAAe,SAAUjI,GAAMjG,GAASkK,GAAK5I,GAAS6M,GAAY,CACjE,IAAI9N,GAAMG,GAAGsK,GACZsD,GAAe,EACf3O,GAAI,IACJsL,GAAY9E,IAAQ,CAAC,EACrBoI,GAAa,CAAC,EACdC,GAAgB9L,EAGhBtC,GAAQ+F,IAAQgI,GAAa/L,EAAK,KAAM,IAAS,IAAKiM,EAAU,EAGhEI,GAAkBpL,IAAWmL,IAAiB,KAAO,EAAI,KAAK,OAAO,GAAK,GAC1E/N,GAAML,GAAM,OAcb,IAZKiO,KAMJ3L,EAAmBxC,IAAWb,GAAYa,IAAWmO,IAM9C1O,KAAMc,KAASF,GAAOH,GAAOT,EAAE,IAAO,KAAMA,KAAM,CACzD,GAAKwO,GAAa5N,GAAO,CAWxB,IAVAG,GAAI,EAMC,CAACR,IAAWK,GAAK,eAAiBlB,IACtCwD,EAAatC,EAAK,EAClB6J,GAAM,CAACrH,IAEEiI,GAAUgD,EAAiBtN,IAAI,GACxC,GAAKsK,GAASzK,GAAML,IAAWb,EAAU+K,EAAI,EAAI,CAChD5I,GAAQ,KAAMjB,EAAK,EACnB,KACD,CAEI8N,KACJhL,GAAUoL,GAEZ,CAGKP,KAGG3N,GAAO,CAACyK,IAAWzK,KACzB+N,KAIInI,IACJ8E,GAAU,KAAM1K,EAAK,EAGxB,CAaA,GATA+N,IAAgB3O,GASXuO,GAASvO,KAAM2O,GAAe,CAElC,IADA5N,GAAI,EACMsK,GAAUiD,EAAavN,IAAI,GACpCsK,GAASC,GAAWsD,GAAYrO,GAASkK,EAAI,EAG9C,GAAKjE,GAAO,CAGX,GAAKmI,GAAe,EACnB,KAAQ3O,MACCsL,GAAWtL,EAAE,GAAK4O,GAAY5O,EAAE,IACvC4O,GAAY5O,EAAE,EAAIoE,GAAI,KAAMvC,EAAQ,GAMvC+M,GAAa9B,GAAU8B,EAAW,CACnC,CAGA7P,GAAK,MAAO8C,GAAS+M,EAAW,EAG3BF,IAAa,CAAClI,IAAQoI,GAAW,OAAS,GAC5CD,GAAeL,EAAY,OAAW,GAExC9L,GAAO,WAAYX,EAAQ,CAE7B,CAGA,OAAK6M,KACJhL,GAAUoL,GACV/L,EAAmB8L,IAGbvD,EACR,EAED,OAAOiD,EACNjH,GAAcmH,CAAa,EAC3BA,CACF,CAEA,OAAA5L,EAAUL,GAAO,QAAU,SAAUlC,EAAUqG,EAAgC,CAC9E,IAAI3G,EACHsO,EAAc,CAAC,EACfD,EAAkB,CAAC,EACnBnC,GAASnI,GAAezD,EAAW,GAAI,EAExC,GAAK,CAAC4L,GAAS,CAOd,IAJMvF,IACLA,EAAQ/D,EAAUtC,CAAS,GAE5BN,EAAI2G,EAAM,OACF3G,KACPkM,GAAS4B,GAAmBnH,EAAO3G,CAAE,CAAE,EAClCkM,GAAQ1I,EAAQ,EACpB8K,EAAY,KAAMpC,EAAO,EAEzBmC,EAAgB,KAAMnC,EAAO,EAK/BA,GAASnI,GACRzD,EACA8N,GAA0BC,EAAiBC,CAAY,CACxD,EAGApC,GAAO,SAAW5L,CACnB,CACA,OAAO4L,EACR,EAWApJ,EAASN,GAAO,OAAS,SAAUlC,EAAUC,EAASsB,EAAS2E,EAAO,CACrE,IAAIxG,EAAG+L,GAAQgD,GAAOxM,GAAMyM,GAC3BC,GAAW,OAAO3O,GAAa,YAAcA,EAC7CqG,GAAQ,CAACH,GAAQ5D,EAAYtC,EAAW2O,GAAS,UAAY3O,CAAW,EAMzE,GAJAuB,EAAUA,GAAW,CAAC,EAIjB8E,GAAM,SAAW,EAAI,CAIzB,GADAoF,GAASpF,GAAO,CAAE,EAAIA,GAAO,CAAE,EAAE,MAAO,CAAE,EACrCoF,GAAO,OAAS,IAAOgD,GAAQhD,GAAQ,CAAE,GAAI,OAAS,MAC1DxL,EAAQ,WAAa,GAAK6C,IAAkBX,EAAK,SAAUsJ,GAAQ,CAAE,EAAE,IAAK,EAAI,CAIhF,GAFAxL,GAAYkC,EAAK,KAAM,GAAQsM,GAAM,QAAS,CAAE,EAC9C,QAASrJ,GAAWC,EAAU,EAAGpF,CAAQ,GAAK,CAAC,GAAK,CAAE,EAClDA,EAIM0O,KACX1O,EAAUA,EAAQ,gBAJlB,QAAOsB,EAORvB,EAAWA,EAAS,MAAOyL,GAAO,MAAM,EAAE,MAAM,MAAO,CACxD,CAIA,IADA/L,EAAImF,GAAW,aAAiB,KAAM7E,CAAS,EAAI,EAAIyL,GAAO,OACtD/L,MACP+O,GAAQhD,GAAQ/L,CAAE,EAGb,CAAAyC,EAAK,SAAYF,GAAOwM,GAAM,IAAO,IAG1C,IAAOC,GAAOvM,EAAK,KAAMF,EAAK,KAGtBiE,EAAOwI,GACbD,GAAM,QAAS,CAAE,EAAE,QAASrJ,GAAWC,EAAU,EACjDF,GAAS,KAAMsG,GAAQ,CAAE,EAAE,IAAK,GAAK/E,GAAazG,EAAQ,UAAW,GACpEA,CACF,GAAM,CAKL,GAFAwL,GAAO,OAAQ/L,EAAG,CAAE,EACpBM,EAAWkG,EAAK,QAAUS,GAAY8E,EAAO,EACxC,CAACzL,EACL,OAAAvB,GAAK,MAAO8C,EAAS2E,CAAK,EACnB3E,EAGR,KACD,CAGH,CAIA,OAAEoN,IAAYpM,EAASvC,EAAUqG,EAAM,GACtCH,EACAjG,EACA,CAAC6C,GACDvB,EACA,CAACtB,GAAWkF,GAAS,KAAMnF,CAAS,GAAK0G,GAAazG,EAAQ,UAAW,GAAKA,CAC/E,EACOsB,CACR,EAKAvC,EAAQ,WAAakE,GAAQ,MAAO,EAAG,EAAE,KAAMS,EAAU,EAAE,KAAM,EAAG,IAAMT,GAI1ElE,EAAQ,iBAAmB,CAAC,CAAC2D,EAG7BC,EAAY,EAIZ5D,EAAQ,aAAekI,GAAQ,SAAUC,EAAK,CAG7C,OAAOA,EAAG,wBAAyB/H,EAAS,cAAe,UAAW,CAAE,EAAI,CAC7E,CAAE,EAKI8H,GAAQ,SAAUC,EAAK,CAC5B,OAAAA,EAAG,UAAY,mBACRA,EAAG,WAAW,aAAc,MAAO,IAAM,GACjD,CAAE,GACDC,GAAW,yBAA0B,SAAU9G,EAAMK,EAAM0B,EAAQ,CAClE,GAAK,CAACA,EACL,OAAO/B,EAAK,aAAcK,EAAMA,EAAK,YAAY,IAAM,OAAS,EAAI,CAAE,CAExE,CAAE,GAKE,CAAC3B,EAAQ,YAAc,CAACkI,GAAQ,SAAUC,EAAK,CACnD,OAAAA,EAAG,UAAY,WACfA,EAAG,WAAW,aAAc,QAAS,EAAG,EACjCA,EAAG,WAAW,aAAc,OAAQ,IAAM,EAClD,CAAE,IACDC,GAAW,QAAS,SAAU9G,EAAMsO,EAAOvM,EAAQ,CAClD,GAAK,CAACA,GAAS/B,EAAK,SAAS,YAAY,IAAM,QAC9C,OAAOA,EAAK,YAEd,CAAE,EAKG4G,GAAQ,SAAUC,EAAK,CAC5B,OAAOA,EAAG,aAAc,UAAW,GAAK,IACzC,CAAE,GACDC,GAAWnD,GAAU,SAAU3D,EAAMK,EAAM0B,EAAQ,CAClD,IAAI1C,EACJ,GAAK,CAAC0C,EACL,OAAO/B,EAAMK,CAAK,IAAM,GAAOA,EAAK,YAAY,GAC7ChB,EAAMW,EAAK,iBAAkBK,CAAK,IAAOhB,EAAI,UAC9CA,EAAI,MACJ,IAEJ,CAAE,EAGIuC,EAEP,GAAKhE,CAAO,EAIZ6B,EAAO,KAAOmC,GACdnC,EAAO,KAAOmC,GAAO,UAGrBnC,EAAO,KAAM,GAAI,EAAIA,EAAO,KAAK,QACjCA,EAAO,WAAaA,EAAO,OAASmC,GAAO,WAC3CnC,EAAO,KAAOmC,GAAO,QACrBnC,EAAO,SAAWmC,GAAO,MACzBnC,EAAO,SAAWmC,GAAO,SACzBnC,EAAO,eAAiBmC,GAAO,OAK/B,IAAIsI,GAAM,SAAUlK,EAAMkK,EAAKqE,EAAQ,CAItC,QAHI/D,EAAU,CAAC,EACdgE,EAAWD,IAAU,QAEZvO,EAAOA,EAAMkK,CAAI,IAAOlK,EAAK,WAAa,GACnD,GAAKA,EAAK,WAAa,EAAI,CAC1B,GAAKwO,GAAY/O,EAAQO,CAAK,EAAE,GAAIuO,CAAM,EACzC,MAED/D,EAAQ,KAAMxK,CAAK,CACpB,CAED,OAAOwK,CACR,EAGIiE,GAAW,SAAU,EAAGzO,EAAO,CAGlC,QAFIwK,EAAU,CAAC,EAEP,EAAG,EAAI,EAAE,YACX,EAAE,WAAa,GAAK,IAAMxK,GAC9BwK,EAAQ,KAAM,CAAE,EAIlB,OAAOA,CACR,EAGIkE,GAAgBjP,EAAO,KAAK,MAAM,aAItC,SAASwJ,GAAUjJ,EAAMK,EAAO,CAE/B,OAAOL,EAAK,UAAYA,EAAK,SAAS,YAAY,IAAMK,EAAK,YAAY,CAE1E,CACA,IAAIsO,GAAe,kEAKnB,SAASC,GAAQjG,EAAUkG,EAAWC,EAAM,CAC3C,OAAKnQ,EAAYkQ,CAAU,EACnBpP,EAAO,KAAMkJ,EAAU,SAAU3I,EAAMZ,EAAI,CACjD,MAAO,CAAC,CAACyP,EAAU,KAAM7O,EAAMZ,EAAGY,CAAK,IAAM8O,CAC9C,CAAE,EAIED,EAAU,SACPpP,EAAO,KAAMkJ,EAAU,SAAU3I,EAAO,CAC9C,OAASA,IAAS6O,IAAgBC,CACnC,CAAE,EAIE,OAAOD,GAAc,SAClBpP,EAAO,KAAMkJ,EAAU,SAAU3I,EAAO,CAC9C,OAAS5B,EAAQ,KAAMyQ,EAAW7O,CAAK,EAAI,KAAS8O,CACrD,CAAE,EAIIrP,EAAO,OAAQoP,EAAWlG,EAAUmG,CAAI,CAChD,CAEArP,EAAO,OAAS,SAAUiJ,EAAM7I,EAAOiP,EAAM,CAC5C,IAAI9O,EAAOH,EAAO,CAAE,EAMpB,OAJKiP,IACJpG,EAAO,QAAUA,EAAO,KAGpB7I,EAAM,SAAW,GAAKG,EAAK,WAAa,EACrCP,EAAO,KAAK,gBAAiBO,EAAM0I,CAAK,EAAI,CAAE1I,CAAK,EAAI,CAAC,EAGzDP,EAAO,KAAK,QAASiJ,EAAMjJ,EAAO,KAAMI,EAAO,SAAUG,EAAO,CACtE,OAAOA,EAAK,WAAa,CAC1B,CAAE,CAAE,CACL,EAEAP,EAAO,GAAG,OAAQ,CACjB,KAAM,SAAUC,EAAW,CAC1B,IAAIN,EAAGU,EACNI,EAAM,KAAK,OACX6O,EAAO,KAER,GAAK,OAAOrP,GAAa,SACxB,OAAO,KAAK,UAAWD,EAAQC,CAAS,EAAE,OAAQ,UAAW,CAC5D,IAAMN,EAAI,EAAGA,EAAIc,EAAKd,IACrB,GAAKK,EAAO,SAAUsP,EAAM3P,CAAE,EAAG,IAAK,EACrC,MAAO,EAGV,CAAE,CAAE,EAKL,IAFAU,EAAM,KAAK,UAAW,CAAC,CAAE,EAEnBV,EAAI,EAAGA,EAAIc,EAAKd,IACrBK,EAAO,KAAMC,EAAUqP,EAAM3P,CAAE,EAAGU,CAAI,EAGvC,OAAOI,EAAM,EAAIT,EAAO,WAAYK,CAAI,EAAIA,CAC7C,EACA,OAAQ,SAAUJ,EAAW,CAC5B,OAAO,KAAK,UAAWkP,GAAQ,KAAMlP,GAAY,CAAC,EAAG,EAAM,CAAE,CAC9D,EACA,IAAK,SAAUA,EAAW,CACzB,OAAO,KAAK,UAAWkP,GAAQ,KAAMlP,GAAY,CAAC,EAAG,EAAK,CAAE,CAC7D,EACA,GAAI,SAAUA,EAAW,CACxB,MAAO,CAAC,CAACkP,GACR,KAIA,OAAOlP,GAAa,UAAYgP,GAAc,KAAMhP,CAAS,EAC5DD,EAAQC,CAAS,EACjBA,GAAY,CAAC,EACd,EACD,EAAE,MACH,CACD,CAAE,EAOF,IAAIsP,GAMHpK,GAAa,sCAEbqK,GAAOxP,EAAO,GAAG,KAAO,SAAUC,EAAUC,EAASuP,EAAO,CAC3D,IAAInJ,EAAO/F,EAGX,GAAK,CAACN,EACL,OAAO,KAQR,GAHAwP,EAAOA,GAAQF,GAGV,OAAOtP,GAAa,SAaxB,GAZKA,EAAU,CAAE,IAAM,KACtBA,EAAUA,EAAS,OAAS,CAAE,IAAM,KACpCA,EAAS,QAAU,EAGnBqG,EAAQ,CAAE,KAAMrG,EAAU,IAAK,EAG/BqG,EAAQnB,GAAW,KAAMlF,CAAS,EAI9BqG,IAAWA,EAAO,CAAE,GAAK,CAACpG,GAG9B,GAAKoG,EAAO,CAAE,EAAI,CAYjB,GAXApG,EAAUA,aAAmBF,EAASE,EAAS,CAAE,EAAIA,EAIrDF,EAAO,MAAO,KAAMA,EAAO,UAC1BsG,EAAO,CAAE,EACTpG,GAAWA,EAAQ,SAAWA,EAAQ,eAAiBA,EAAUb,EACjE,EACD,CAAE,EAGG6P,GAAW,KAAM5I,EAAO,CAAE,CAAE,GAAKtG,EAAO,cAAeE,CAAQ,EACnE,IAAMoG,KAASpG,EAGThB,EAAY,KAAMoH,CAAM,CAAE,EAC9B,KAAMA,CAAM,EAAGpG,EAASoG,CAAM,CAAE,EAIhC,KAAK,KAAMA,EAAOpG,EAASoG,CAAM,CAAE,EAKtC,OAAO,IAGR,KACC,QAAA/F,EAAOlB,EAAS,eAAgBiH,EAAO,CAAE,CAAE,EAEtC/F,IAGJ,KAAM,CAAE,EAAIA,EACZ,KAAK,OAAS,GAER,SAIF,OAAK,CAACL,GAAWA,EAAQ,QACtBA,GAAWuP,GAAO,KAAMxP,CAAS,EAKnC,KAAK,YAAaC,CAAQ,EAAE,KAAMD,CAAS,MAI7C,IAAKA,EAAS,SACpB,YAAM,CAAE,EAAIA,EACZ,KAAK,OAAS,EACP,KAID,GAAKf,EAAYe,CAAS,EAChC,OAAOwP,EAAK,QAAU,OACrBA,EAAK,MAAOxP,CAAS,EAGrBA,EAAUD,CAAO,EAGnB,OAAOA,EAAO,UAAWC,EAAU,IAAK,CACzC,EAGDuP,GAAK,UAAYxP,EAAO,GAGxBuP,GAAavP,EAAQX,CAAS,EAG9B,IAAIqQ,GAAe,iCAGlBC,EAAmB,CAClB,SAAU,GACV,SAAU,GACV,KAAM,GACN,KAAM,EACP,EAED3P,EAAO,GAAG,OAAQ,CACjB,IAAK,SAAUiB,EAAS,CACvB,IAAI2O,EAAU5P,EAAQiB,EAAQ,IAAK,EAClC,EAAI2O,EAAQ,OAEb,OAAO,KAAK,OAAQ,UAAW,CAE9B,QADIjQ,EAAI,EACAA,EAAI,EAAGA,IACd,GAAKK,EAAO,SAAU,KAAM4P,EAASjQ,CAAE,CAAE,EACxC,MAAO,EAGV,CAAE,CACH,EAEA,QAAS,SAAUkQ,EAAW3P,EAAU,CACvC,IAAIuH,EACH9H,EAAI,EACJmQ,EAAI,KAAK,OACT/E,EAAU,CAAC,EACX6E,EAAU,OAAOC,GAAc,UAAY7P,EAAQ6P,CAAU,EAG9D,GAAK,CAACZ,GAAc,KAAMY,CAAU,GACnC,KAAQlQ,EAAImQ,EAAGnQ,IACd,IAAM8H,EAAM,KAAM9H,CAAE,EAAG8H,GAAOA,IAAQvH,EAASuH,EAAMA,EAAI,WAGxD,GAAKA,EAAI,SAAW,KAAQmI,EAC3BA,EAAQ,MAAOnI,CAAI,EAAI,GAGvBA,EAAI,WAAa,GAChBzH,EAAO,KAAK,gBAAiByH,EAAKoI,CAAU,GAAM,CAEnD9E,EAAQ,KAAMtD,CAAI,EAClB,KACD,EAKH,OAAO,KAAK,UAAWsD,EAAQ,OAAS,EAAI/K,EAAO,WAAY+K,CAAQ,EAAIA,CAAQ,CACpF,EAGA,MAAO,SAAUxK,EAAO,CAGvB,OAAMA,EAKD,OAAOA,GAAS,SACb5B,EAAQ,KAAMqB,EAAQO,CAAK,EAAG,KAAM,CAAE,CAAE,EAIzC5B,EAAQ,KAAM,KAGpB4B,EAAK,OAASA,EAAM,CAAE,EAAIA,CAC3B,EAbU,KAAM,CAAE,GAAK,KAAM,CAAE,EAAE,WAAe,KAAK,MAAM,EAAE,QAAQ,EAAE,OAAS,EAcjF,EAEA,IAAK,SAAUN,EAAUC,EAAU,CAClC,OAAO,KAAK,UACXF,EAAO,WACNA,EAAO,MAAO,KAAK,IAAI,EAAGA,EAAQC,EAAUC,CAAQ,CAAE,CACvD,CACD,CACD,EAEA,QAAS,SAAUD,EAAW,CAC7B,OAAO,KAAK,IAAKA,GAAY,KAC5B,KAAK,WAAa,KAAK,WAAW,OAAQA,CAAS,CACpD,CACD,CACD,CAAE,EAEF,SAAS8P,GAAStI,EAAKgD,EAAM,CAC5B,MAAUhD,EAAMA,EAAKgD,CAAI,IAAOhD,EAAI,WAAa,GAAI,CACrD,OAAOA,CACR,CAEAzH,EAAO,KAAM,CACZ,OAAQ,SAAUO,EAAO,CACxB,IAAImK,EAASnK,EAAK,WAClB,OAAOmK,GAAUA,EAAO,WAAa,GAAKA,EAAS,IACpD,EACA,QAAS,SAAUnK,EAAO,CACzB,OAAOkK,GAAKlK,EAAM,YAAa,CAChC,EACA,aAAc,SAAUA,EAAM0B,EAAI6M,EAAQ,CACzC,OAAOrE,GAAKlK,EAAM,aAAcuO,CAAM,CACvC,EACA,KAAM,SAAUvO,EAAO,CACtB,OAAOwP,GAASxP,EAAM,aAAc,CACrC,EACA,KAAM,SAAUA,EAAO,CACtB,OAAOwP,GAASxP,EAAM,iBAAkB,CACzC,EACA,QAAS,SAAUA,EAAO,CACzB,OAAOkK,GAAKlK,EAAM,aAAc,CACjC,EACA,QAAS,SAAUA,EAAO,CACzB,OAAOkK,GAAKlK,EAAM,iBAAkB,CACrC,EACA,UAAW,SAAUA,EAAM0B,EAAI6M,EAAQ,CACtC,OAAOrE,GAAKlK,EAAM,cAAeuO,CAAM,CACxC,EACA,UAAW,SAAUvO,EAAM0B,EAAI6M,EAAQ,CACtC,OAAOrE,GAAKlK,EAAM,kBAAmBuO,CAAM,CAC5C,EACA,SAAU,SAAUvO,EAAO,CAC1B,OAAOyO,IAAYzO,EAAK,YAAc,CAAC,GAAI,WAAYA,CAAK,CAC7D,EACA,SAAU,SAAUA,EAAO,CAC1B,OAAOyO,GAAUzO,EAAK,UAAW,CAClC,EACA,SAAU,SAAUA,EAAO,CAC1B,OAAKA,EAAK,iBAAmB,MAK5BjC,EAAUiC,EAAK,eAAgB,EAExBA,EAAK,iBAMRiJ,GAAUjJ,EAAM,UAAW,IAC/BA,EAAOA,EAAK,SAAWA,GAGjBP,EAAO,MAAO,CAAC,EAAGO,EAAK,UAAW,EAC1C,CACD,EAAG,SAAUK,EAAMsG,EAAK,CACvBlH,EAAO,GAAIY,CAAK,EAAI,SAAUkO,EAAO7O,EAAW,CAC/C,IAAI8K,EAAU/K,EAAO,IAAK,KAAMkH,EAAI4H,CAAM,EAE1C,OAAKlO,EAAK,MAAO,EAAG,IAAM,UACzBX,EAAW6O,GAGP7O,GAAY,OAAOA,GAAa,WACpC8K,EAAU/K,EAAO,OAAQC,EAAU8K,CAAQ,GAGvC,KAAK,OAAS,IAGZ4E,EAAkB/O,CAAK,GAC5BZ,EAAO,WAAY+K,CAAQ,EAIvB2E,GAAa,KAAM9O,CAAK,GAC5BmK,EAAQ,QAAQ,GAIX,KAAK,UAAWA,CAAQ,CAChC,CACD,CAAE,EACF,IAAIiF,GAAkB,oBAKtB,SAASC,GAAetP,EAAU,CACjC,IAAIuP,EAAS,CAAC,EACd,OAAAlQ,EAAO,KAAMW,EAAQ,MAAOqP,EAAc,GAAK,CAAC,EAAG,SAAUG,EAAGC,EAAO,CACtEF,EAAQE,CAAK,EAAI,EAClB,CAAE,EACKF,CACR,CAwBAlQ,EAAO,UAAY,SAAUW,EAAU,CAItCA,EAAU,OAAOA,GAAY,SAC5BsP,GAAetP,CAAQ,EACvBX,EAAO,OAAQ,CAAC,EAAGW,CAAQ,EAE5B,IACC0P,EAGAC,EAGAC,EAGAC,EAGAvM,EAAO,CAAC,EAGRwM,EAAQ,CAAC,EAGTC,EAAc,GAGdC,EAAO,UAAW,CAQjB,IALAH,EAASA,GAAU7P,EAAQ,KAI3B4P,EAAQF,EAAS,GACTI,EAAM,OAAQC,EAAc,GAEnC,IADAJ,EAASG,EAAM,MAAM,EACb,EAAEC,EAAczM,EAAK,QAGvBA,EAAMyM,CAAY,EAAE,MAAOJ,EAAQ,CAAE,EAAGA,EAAQ,CAAE,CAAE,IAAM,IAC9D3P,EAAQ,cAGR+P,EAAczM,EAAK,OACnBqM,EAAS,IAMN3P,EAAQ,SACb2P,EAAS,IAGVD,EAAS,GAGJG,IAGCF,EACJrM,EAAO,CAAC,EAIRA,EAAO,GAGV,EAGAqL,EAAO,CAGN,IAAK,UAAW,CACf,OAAKrL,IAGCqM,GAAU,CAACD,IACfK,EAAczM,EAAK,OAAS,EAC5BwM,EAAM,KAAMH,CAAO,IAGlB,SAASM,EAAK/F,EAAO,CACtB7K,EAAO,KAAM6K,EAAM,SAAUsF,EAAGpO,EAAM,CAChC7C,EAAY6C,CAAI,GACf,CAACpB,EAAQ,QAAU,CAAC2O,EAAK,IAAKvN,CAAI,IACtCkC,EAAK,KAAMlC,CAAI,EAELA,GAAOA,EAAI,QAAUjC,EAAQiC,CAAI,IAAM,UAGlD6O,EAAK7O,CAAI,CAEX,CAAE,CACH,GAAK,SAAU,EAEVuO,GAAU,CAACD,GACfM,EAAK,GAGA,IACR,EAGA,OAAQ,UAAW,CAClB,OAAA3Q,EAAO,KAAM,UAAW,SAAU,EAAG+B,EAAM,CAE1C,QADI8O,GACMA,EAAQ7Q,EAAO,QAAS+B,EAAKkC,EAAM4M,CAAM,GAAM,IACxD5M,EAAK,OAAQ4M,EAAO,CAAE,EAGjBA,GAASH,GACbA,GAGH,CAAE,EACK,IACR,EAIA,IAAK,SAAUxJ,EAAK,CACnB,OAAOA,EACNlH,EAAO,QAASkH,EAAIjD,CAAK,EAAI,GAC7BA,EAAK,OAAS,CAChB,EAGA,MAAO,UAAW,CACjB,OAAKA,IACJA,EAAO,CAAC,GAEF,IACR,EAKA,QAAS,UAAW,CACnB,OAAAuM,EAASC,EAAQ,CAAC,EAClBxM,EAAOqM,EAAS,GACT,IACR,EACA,SAAU,UAAW,CACpB,MAAO,CAACrM,CACT,EAKA,KAAM,UAAW,CAChB,OAAAuM,EAASC,EAAQ,CAAC,EACb,CAACH,GAAU,CAACD,IAChBpM,EAAOqM,EAAS,IAEV,IACR,EACA,OAAQ,UAAW,CAClB,MAAO,CAAC,CAACE,CACV,EAGA,SAAU,SAAUtQ,EAAS2K,EAAO,CACnC,OAAM2F,IACL3F,EAAOA,GAAQ,CAAC,EAChBA,EAAO,CAAE3K,EAAS2K,EAAK,MAAQA,EAAK,MAAM,EAAIA,CAAK,EACnD4F,EAAM,KAAM5F,CAAK,EACXwF,GACLM,EAAK,GAGA,IACR,EAGA,KAAM,UAAW,CAChB,OAAArB,EAAK,SAAU,KAAM,SAAU,EACxB,IACR,EAGA,MAAO,UAAW,CACjB,MAAO,CAAC,CAACiB,CACV,CACD,EAED,OAAOjB,CACR,EAGA,SAASwB,GAAUC,EAAI,CACtB,OAAOA,CACR,CACA,SAASC,GAASC,EAAK,CACtB,MAAMA,CACP,CAEA,SAASC,GAAYlP,EAAOmP,EAASC,EAAQC,EAAU,CACtD,IAAIC,EAEJ,GAAI,CAGEtP,GAAS9C,EAAcoS,EAAStP,EAAM,OAAU,EACpDsP,EAAO,KAAMtP,CAAM,EAAE,KAAMmP,CAAQ,EAAE,KAAMC,CAAO,EAGvCpP,GAAS9C,EAAcoS,EAAStP,EAAM,IAAO,EACxDsP,EAAO,KAAMtP,EAAOmP,EAASC,CAAO,EAQpCD,EAAQ,MAAO,OAAW,CAAEnP,CAAM,EAAE,MAAOqP,CAAQ,CAAE,CAMvD,OAAUrP,EAAQ,CAIjBoP,EAAO,MAAO,OAAW,CAAEpP,CAAM,CAAE,CACpC,CACD,CAEAhC,EAAO,OAAQ,CAEd,SAAU,SAAUuR,EAAO,CAC1B,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYxR,EAAO,UAAW,QAAS,EAClDA,EAAO,UAAW,QAAS,EAAG,CAAE,EACjC,CAAE,UAAW,OAAQA,EAAO,UAAW,aAAc,EACpDA,EAAO,UAAW,aAAc,EAAG,EAAG,UAAW,EAClD,CAAE,SAAU,OAAQA,EAAO,UAAW,aAAc,EACnDA,EAAO,UAAW,aAAc,EAAG,EAAG,UAAW,CACnD,EACAyR,EAAQ,UACRC,EAAU,CACT,MAAO,UAAW,CACjB,OAAOD,CACR,EACA,OAAQ,UAAW,CAClB,OAAAE,EAAS,KAAM,SAAU,EAAE,KAAM,SAAU,EACpC,IACR,EACA,MAAS,SAAUzK,EAAK,CACvB,OAAOwK,EAAQ,KAAM,KAAMxK,CAAG,CAC/B,EAGA,KAAM,UAA6C,CAClD,IAAI0K,EAAM,UAEV,OAAO5R,EAAO,SAAU,SAAU6R,EAAW,CAC5C7R,EAAO,KAAMwR,EAAQ,SAAUvP,EAAI6P,EAAQ,CAG1C,IAAI5K,EAAKhI,EAAY0S,EAAKE,EAAO,CAAE,CAAE,CAAE,GAAKF,EAAKE,EAAO,CAAE,CAAE,EAK5DH,EAAUG,EAAO,CAAE,CAAE,EAAG,UAAW,CAClC,IAAIC,EAAW7K,GAAMA,EAAG,MAAO,KAAM,SAAU,EAC1C6K,GAAY7S,EAAY6S,EAAS,OAAQ,EAC7CA,EAAS,QAAQ,EACf,SAAUF,EAAS,MAAO,EAC1B,KAAMA,EAAS,OAAQ,EACvB,KAAMA,EAAS,MAAO,EAExBA,EAAUC,EAAO,CAAE,EAAI,MAAO,EAC7B,KACA5K,EAAK,CAAE6K,CAAS,EAAI,SACrB,CAEF,CAAE,CACH,CAAE,EACFH,EAAM,IACP,CAAE,EAAE,QAAQ,CACb,EACA,KAAM,SAAUI,EAAaC,EAAYC,EAAa,CACrD,IAAIC,EAAW,EACf,SAAShB,EAASiB,EAAOT,EAAUpK,EAAS8K,EAAU,CACrD,OAAO,UAAW,CACjB,IAAIC,GAAO,KACVzH,GAAO,UACP0H,GAAa,UAAW,CACvB,IAAIR,GAAUS,GAKd,GAAK,EAAAJ,EAAQD,GAQb,IAJAJ,GAAWxK,EAAQ,MAAO+K,GAAMzH,EAAK,EAIhCkH,KAAaJ,EAAS,QAAQ,EAClC,MAAM,IAAI,UAAW,0BAA2B,EAOjDa,GAAOT,KAKJ,OAAOA,IAAa,UACrB,OAAOA,IAAa,aACrBA,GAAS,KAGL7S,EAAYsT,EAAK,EAGhBH,EACJG,GAAK,KACJT,GACAZ,EAASgB,EAAUR,EAAUb,GAAUuB,CAAQ,EAC/ClB,EAASgB,EAAUR,EAAUX,GAASqB,CAAQ,CAC/C,GAMAF,IAEAK,GAAK,KACJT,GACAZ,EAASgB,EAAUR,EAAUb,GAAUuB,CAAQ,EAC/ClB,EAASgB,EAAUR,EAAUX,GAASqB,CAAQ,EAC9ClB,EAASgB,EAAUR,EAAUb,GAC5Ba,EAAS,UAAW,CACtB,IAQIpK,IAAYuJ,KAChBwB,GAAO,OACPzH,GAAO,CAAEkH,EAAS,IAKjBM,GAAWV,EAAS,aAAeW,GAAMzH,EAAK,GAElD,EAGA4H,GAAUJ,EACTE,GACA,UAAW,CACV,GAAI,CACHA,GAAW,CACZ,OAAUtM,GAAI,CAERjG,EAAO,SAAS,eACpBA,EAAO,SAAS,cAAeiG,GAC9BwM,GAAQ,UAAW,EAMhBL,EAAQ,GAAKD,IAIZ5K,IAAYyJ,KAChBsB,GAAO,OACPzH,GAAO,CAAE5E,EAAE,GAGZ0L,EAAS,WAAYW,GAAMzH,EAAK,EAElC,CACD,EAMGuH,EACJK,GAAQ,GAKHzS,EAAO,SAAS,eACpByS,GAAQ,WAAazS,EAAO,SAAS,aAAa,GAEnD7B,EAAO,WAAYsU,EAAQ,EAE7B,CACD,CAEA,OAAOzS,EAAO,SAAU,SAAU6R,EAAW,CAG5CL,EAAQ,CAAE,EAAG,CAAE,EAAE,IAChBL,EACC,EACAU,EACA3S,EAAYgT,CAAW,EACtBA,EACApB,GACDe,EAAS,UACV,CACD,EAGAL,EAAQ,CAAE,EAAG,CAAE,EAAE,IAChBL,EACC,EACAU,EACA3S,EAAY8S,CAAY,EACvBA,EACAlB,EACF,CACD,EAGAU,EAAQ,CAAE,EAAG,CAAE,EAAE,IAChBL,EACC,EACAU,EACA3S,EAAY+S,CAAW,EACtBA,EACAjB,EACF,CACD,CACD,CAAE,EAAE,QAAQ,CACb,EAIA,QAAS,SAAU7R,EAAM,CACxB,OAAOA,GAAO,KAAOa,EAAO,OAAQb,EAAKuS,CAAQ,EAAIA,CACtD,CACD,EACAC,EAAW,CAAC,EAGb,OAAA3R,EAAO,KAAMwR,EAAQ,SAAU7R,EAAGmS,EAAQ,CACzC,IAAI7N,EAAO6N,EAAO,CAAE,EACnBY,EAAcZ,EAAO,CAAE,EAKxBJ,EAASI,EAAO,CAAE,CAAE,EAAI7N,EAAK,IAGxByO,GACJzO,EAAK,IACJ,UAAW,CAIVwN,EAAQiB,CACT,EAIAlB,EAAQ,EAAI7R,CAAE,EAAG,CAAE,EAAE,QAIrB6R,EAAQ,EAAI7R,CAAE,EAAG,CAAE,EAAE,QAGrB6R,EAAQ,CAAE,EAAG,CAAE,EAAE,KAGjBA,EAAQ,CAAE,EAAG,CAAE,EAAE,IAClB,EAMDvN,EAAK,IAAK6N,EAAO,CAAE,EAAE,IAAK,EAK1BH,EAAUG,EAAO,CAAE,CAAE,EAAI,UAAW,CACnC,OAAAH,EAAUG,EAAO,CAAE,EAAI,MAAO,EAAG,OAASH,EAAW,OAAY,KAAM,SAAU,EAC1E,IACR,EAKAA,EAAUG,EAAO,CAAE,EAAI,MAAO,EAAI7N,EAAK,QACxC,CAAE,EAGFyN,EAAQ,QAASC,CAAS,EAGrBJ,GACJA,EAAK,KAAMI,EAAUA,CAAS,EAIxBA,CACR,EAGA,KAAM,SAAUgB,EAAc,CAC7B,IAGCC,EAAY,UAAU,OAGtBjT,EAAIiT,EAGJC,EAAkB,MAAOlT,CAAE,EAC3BmT,EAAgBvU,EAAM,KAAM,SAAU,EAGtCwU,EAAU/S,EAAO,SAAS,EAG1BgT,EAAa,SAAUrT,EAAI,CAC1B,OAAO,SAAUqC,EAAQ,CACxB6Q,EAAiBlT,CAAE,EAAI,KACvBmT,EAAenT,CAAE,EAAI,UAAU,OAAS,EAAIpB,EAAM,KAAM,SAAU,EAAIyD,EAC9D,EAAE4Q,GACTG,EAAQ,YAAaF,EAAiBC,CAAc,CAEtD,CACD,EAGD,GAAKF,GAAa,IACjB1B,GAAYyB,EAAaI,EAAQ,KAAMC,EAAYrT,CAAE,CAAE,EAAE,QAASoT,EAAQ,OACzE,CAACH,CAAU,EAGPG,EAAQ,MAAM,IAAM,WACxB7T,EAAY4T,EAAenT,CAAE,GAAKmT,EAAenT,CAAE,EAAE,IAAK,GAE1D,OAAOoT,EAAQ,KAAK,EAKtB,KAAQpT,KACPuR,GAAY4B,EAAenT,CAAE,EAAGqT,EAAYrT,CAAE,EAAGoT,EAAQ,MAAO,EAGjE,OAAOA,EAAQ,QAAQ,CACxB,CACD,CAAE,EAKF,IAAIE,GAAc,yDAElBjT,EAAO,SAAS,cAAgB,SAAUkT,EAAOC,EAAQ,CAInDhV,EAAO,SAAWA,EAAO,QAAQ,MAAQ+U,GAASD,GAAY,KAAMC,EAAM,IAAK,GACnF/U,EAAO,QAAQ,KAAM,8BAAgC+U,EAAM,QAASA,EAAM,MAAOC,CAAM,CAEzF,EAKAnT,EAAO,eAAiB,SAAUkT,EAAQ,CACzC/U,EAAO,WAAY,UAAW,CAC7B,MAAM+U,CACP,CAAE,CACH,EAMA,IAAIE,GAAYpT,EAAO,SAAS,EAEhCA,EAAO,GAAG,MAAQ,SAAUkH,EAAK,CAEhC,OAAAkM,GACE,KAAMlM,CAAG,EAKT,MAAO,SAAUgM,EAAQ,CACzBlT,EAAO,eAAgBkT,CAAM,CAC9B,CAAE,EAEI,IACR,EAEAlT,EAAO,OAAQ,CAGd,QAAS,GAIT,UAAW,EAGX,MAAO,SAAUqT,EAAO,EAGlBA,IAAS,GAAO,EAAErT,EAAO,UAAYA,EAAO,WAKjDA,EAAO,QAAU,GAGZ,EAAAqT,IAAS,IAAQ,EAAErT,EAAO,UAAY,IAK3CoT,GAAU,YAAa/T,EAAU,CAAEW,CAAO,CAAE,EAC7C,CACD,CAAE,EAEFA,EAAO,MAAM,KAAOoT,GAAU,KAG9B,SAASE,IAAY,CACpBjU,EAAS,oBAAqB,mBAAoBiU,EAAU,EAC5DnV,EAAO,oBAAqB,OAAQmV,EAAU,EAC9CtT,EAAO,MAAM,CACd,CAMKX,EAAS,aAAe,YAC1BA,EAAS,aAAe,WAAa,CAACA,EAAS,gBAAgB,SAGjElB,EAAO,WAAY6B,EAAO,KAAM,GAKhCX,EAAS,iBAAkB,mBAAoBiU,EAAU,EAGzDnV,EAAO,iBAAkB,OAAQmV,EAAU,GAQ5C,IAAIC,GAAS,SAAUnT,EAAO8G,EAAIF,EAAKhF,EAAOwR,EAAWC,EAAUC,EAAM,CACxE,IAAI/T,EAAI,EACPc,EAAML,EAAM,OACZuT,EAAO3M,GAAO,KAGf,GAAKlH,EAAQkH,CAAI,IAAM,SAAW,CACjCwM,EAAY,GACZ,IAAM7T,KAAKqH,EACVuM,GAAQnT,EAAO8G,EAAIvH,EAAGqH,EAAKrH,CAAE,EAAG,GAAM8T,EAAUC,CAAI,CAItD,SAAY1R,IAAU,SACrBwR,EAAY,GAENtU,EAAY8C,CAAM,IACvB0R,EAAM,IAGFC,IAGCD,GACJxM,EAAG,KAAM9G,EAAO4B,CAAM,EACtBkF,EAAK,OAILyM,EAAOzM,EACPA,EAAK,SAAU3G,EAAMqT,EAAM5R,EAAQ,CAClC,OAAO2R,EAAK,KAAM3T,EAAQO,CAAK,EAAGyB,CAAM,CACzC,IAIGkF,GACJ,KAAQvH,EAAIc,EAAKd,IAChBuH,EACC9G,EAAOT,CAAE,EAAGqH,EAAK0M,EAChB1R,EACAA,EAAM,KAAM5B,EAAOT,CAAE,EAAGA,EAAGuH,EAAI9G,EAAOT,CAAE,EAAGqH,CAAI,CAAE,CACnD,EAKH,OAAKwM,EACGpT,EAIHuT,EACGzM,EAAG,KAAM9G,CAAM,EAGhBK,EAAMyG,EAAI9G,EAAO,CAAE,EAAG4G,CAAI,EAAIyM,CACtC,EAIII,GAAY,QACfC,GAAa,YAGd,SAASC,GAAYC,EAAMC,EAAS,CACnC,OAAOA,EAAO,YAAY,CAC3B,CAKA,SAASC,GAAWC,EAAS,CAC5B,OAAOA,EAAO,QAASN,GAAW,KAAM,EAAE,QAASC,GAAYC,EAAW,CAC3E,CACA,IAAIK,EAAa,SAAUC,EAAQ,CAQlC,OAAOA,EAAM,WAAa,GAAKA,EAAM,WAAa,GAAK,CAAG,CAACA,EAAM,QAClE,EAKA,SAASC,GAAO,CACf,KAAK,QAAUtU,EAAO,QAAUsU,EAAK,KACtC,CAEAA,EAAK,IAAM,EAEXA,EAAK,UAAY,CAEhB,MAAO,SAAUD,EAAQ,CAGxB,IAAIrS,EAAQqS,EAAO,KAAK,OAAQ,EAGhC,OAAMrS,IACLA,EAAQ,CAAC,EAKJoS,EAAYC,CAAM,IAIjBA,EAAM,SACVA,EAAO,KAAK,OAAQ,EAAIrS,EAMxB,OAAO,eAAgBqS,EAAO,KAAK,QAAS,CAC3C,MAAOrS,EACP,aAAc,EACf,CAAE,IAKEA,CACR,EACA,IAAK,SAAUqS,EAAOE,EAAMvS,EAAQ,CACnC,IAAIwS,EACHzN,EAAQ,KAAK,MAAOsN,CAAM,EAI3B,GAAK,OAAOE,GAAS,SACpBxN,EAAOmN,GAAWK,CAAK,CAAE,EAAIvS,MAM7B,KAAMwS,KAAQD,EACbxN,EAAOmN,GAAWM,CAAK,CAAE,EAAID,EAAMC,CAAK,EAG1C,OAAOzN,CACR,EACA,IAAK,SAAUsN,EAAOrN,EAAM,CAC3B,OAAOA,IAAQ,OACd,KAAK,MAAOqN,CAAM,EAGlBA,EAAO,KAAK,OAAQ,GAAKA,EAAO,KAAK,OAAQ,EAAGH,GAAWlN,CAAI,CAAE,CACnE,EACA,OAAQ,SAAUqN,EAAOrN,EAAKhF,EAAQ,CAarC,OAAKgF,IAAQ,QACPA,GAAO,OAAOA,GAAQ,UAAchF,IAAU,OAE5C,KAAK,IAAKqS,EAAOrN,CAAI,GAS7B,KAAK,IAAKqN,EAAOrN,EAAKhF,CAAM,EAIrBA,IAAU,OAAYA,EAAQgF,EACtC,EACA,OAAQ,SAAUqN,EAAOrN,EAAM,CAC9B,IAAIrH,EACHoH,EAAQsN,EAAO,KAAK,OAAQ,EAE7B,GAAKtN,IAAU,OAIf,IAAKC,IAAQ,OAoBZ,IAjBK,MAAM,QAASA,CAAI,EAIvBA,EAAMA,EAAI,IAAKkN,EAAU,GAEzBlN,EAAMkN,GAAWlN,CAAI,EAIrBA,EAAMA,KAAOD,EACZ,CAAEC,CAAI,EACJA,EAAI,MAAOgJ,EAAc,GAAK,CAAC,GAGnCrQ,EAAIqH,EAAI,OAEArH,KACP,OAAOoH,EAAOC,EAAKrH,CAAE,CAAE,GAKpBqH,IAAQ,QAAahH,EAAO,cAAe+G,CAAM,KAMhDsN,EAAM,SACVA,EAAO,KAAK,OAAQ,EAAI,OAExB,OAAOA,EAAO,KAAK,OAAQ,GAG9B,EACA,QAAS,SAAUA,EAAQ,CAC1B,IAAItN,EAAQsN,EAAO,KAAK,OAAQ,EAChC,OAAOtN,IAAU,QAAa,CAAC/G,EAAO,cAAe+G,CAAM,CAC5D,CACD,EACA,IAAI0N,EAAW,IAAIH,EAEfI,EAAW,IAAIJ,EAcfK,EAAS,gCACZC,EAAa,SAEd,SAASC,GAASN,EAAO,CACxB,OAAKA,IAAS,OACN,GAGHA,IAAS,QACN,GAGHA,IAAS,OACN,KAIHA,IAAS,CAACA,EAAO,GACd,CAACA,EAGJI,EAAO,KAAMJ,CAAK,EACf,KAAK,MAAOA,CAAK,EAGlBA,CACR,CAEA,SAASO,GAAUvU,EAAMyG,EAAKuN,EAAO,CACpC,IAAI3T,EAIJ,GAAK2T,IAAS,QAAahU,EAAK,WAAa,EAI5C,GAHAK,EAAO,QAAUoG,EAAI,QAAS4N,EAAY,KAAM,EAAE,YAAY,EAC9DL,EAAOhU,EAAK,aAAcK,CAAK,EAE1B,OAAO2T,GAAS,SAAW,CAC/B,GAAI,CACHA,EAAOM,GAASN,CAAK,CACtB,OAAUtO,EAAI,CAAC,CAGfyO,EAAS,IAAKnU,EAAMyG,EAAKuN,CAAK,CAC/B,MACCA,EAAO,OAGT,OAAOA,CACR,CAEAvU,EAAO,OAAQ,CACd,QAAS,SAAUO,EAAO,CACzB,OAAOmU,EAAS,QAASnU,CAAK,GAAKkU,EAAS,QAASlU,CAAK,CAC3D,EAEA,KAAM,SAAUA,EAAMK,EAAM2T,EAAO,CAClC,OAAOG,EAAS,OAAQnU,EAAMK,EAAM2T,CAAK,CAC1C,EAEA,WAAY,SAAUhU,EAAMK,EAAO,CAClC8T,EAAS,OAAQnU,EAAMK,CAAK,CAC7B,EAIA,MAAO,SAAUL,EAAMK,EAAM2T,EAAO,CACnC,OAAOE,EAAS,OAAQlU,EAAMK,EAAM2T,CAAK,CAC1C,EAEA,YAAa,SAAUhU,EAAMK,EAAO,CACnC6T,EAAS,OAAQlU,EAAMK,CAAK,CAC7B,CACD,CAAE,EAEFZ,EAAO,GAAG,OAAQ,CACjB,KAAM,SAAUgH,EAAKhF,EAAQ,CAC5B,IAAIrC,EAAGiB,EAAM2T,EACZhU,EAAO,KAAM,CAAE,EACf+G,EAAQ/G,GAAQA,EAAK,WAGtB,GAAKyG,IAAQ,OAAY,CACxB,GAAK,KAAK,SACTuN,EAAOG,EAAS,IAAKnU,CAAK,EAErBA,EAAK,WAAa,GAAK,CAACkU,EAAS,IAAKlU,EAAM,cAAe,GAAI,CAEnE,IADAZ,EAAI2H,EAAM,OACF3H,KAIF2H,EAAO3H,CAAE,IACbiB,EAAO0G,EAAO3H,CAAE,EAAE,KACbiB,EAAK,QAAS,OAAQ,IAAM,IAChCA,EAAOsT,GAAWtT,EAAK,MAAO,CAAE,CAAE,EAClCkU,GAAUvU,EAAMK,EAAM2T,EAAM3T,CAAK,CAAE,IAItC6T,EAAS,IAAKlU,EAAM,eAAgB,EAAK,CAC1C,CAGD,OAAOgU,CACR,CAGA,OAAK,OAAOvN,GAAQ,SACZ,KAAK,KAAM,UAAW,CAC5B0N,EAAS,IAAK,KAAM1N,CAAI,CACzB,CAAE,EAGIuM,GAAQ,KAAM,SAAUvR,EAAQ,CACtC,IAAIuS,EAOJ,GAAKhU,GAAQyB,IAAU,OAYtB,OARAuS,EAAOG,EAAS,IAAKnU,EAAMyG,CAAI,EAC1BuN,IAAS,SAMdA,EAAOO,GAAUvU,EAAMyG,CAAI,EACtBuN,IAAS,QACNA,EAIR,OAID,KAAK,KAAM,UAAW,CAGrBG,EAAS,IAAK,KAAM1N,EAAKhF,CAAM,CAChC,CAAE,CACH,EAAG,KAAMA,EAAO,UAAU,OAAS,EAAG,KAAM,EAAK,CAClD,EAEA,WAAY,SAAUgF,EAAM,CAC3B,OAAO,KAAK,KAAM,UAAW,CAC5B0N,EAAS,OAAQ,KAAM1N,CAAI,CAC5B,CAAE,CACH,CACD,CAAE,EAGFhH,EAAO,OAAQ,CACd,MAAO,SAAUO,EAAM2B,EAAMqS,EAAO,CACnC,IAAI9D,EAEJ,GAAKlQ,EACJ,OAAA2B,GAASA,GAAQ,MAAS,QAC1BuO,EAAQgE,EAAS,IAAKlU,EAAM2B,CAAK,EAG5BqS,IACC,CAAC9D,GAAS,MAAM,QAAS8D,CAAK,EAClC9D,EAAQgE,EAAS,OAAQlU,EAAM2B,EAAMlC,EAAO,UAAWuU,CAAK,CAAE,EAE9D9D,EAAM,KAAM8D,CAAK,GAGZ9D,GAAS,CAAC,CAEnB,EAEA,QAAS,SAAUlQ,EAAM2B,EAAO,CAC/BA,EAAOA,GAAQ,KAEf,IAAIuO,EAAQzQ,EAAO,MAAOO,EAAM2B,CAAK,EACpC6S,EAActE,EAAM,OACpBvJ,EAAKuJ,EAAM,MAAM,EACjBuE,EAAQhV,EAAO,YAAaO,EAAM2B,CAAK,EACvC+S,EAAO,UAAW,CACjBjV,EAAO,QAASO,EAAM2B,CAAK,CAC5B,EAGIgF,IAAO,eACXA,EAAKuJ,EAAM,MAAM,EACjBsE,KAGI7N,IAIChF,IAAS,MACbuO,EAAM,QAAS,YAAa,EAI7B,OAAOuE,EAAM,KACb9N,EAAG,KAAM3G,EAAM0U,EAAMD,CAAM,GAGvB,CAACD,GAAeC,GACpBA,EAAM,MAAM,KAAK,CAEnB,EAGA,YAAa,SAAUzU,EAAM2B,EAAO,CACnC,IAAI8E,EAAM9E,EAAO,aACjB,OAAOuS,EAAS,IAAKlU,EAAMyG,CAAI,GAAKyN,EAAS,OAAQlU,EAAMyG,EAAK,CAC/D,MAAOhH,EAAO,UAAW,aAAc,EAAE,IAAK,UAAW,CACxDyU,EAAS,OAAQlU,EAAM,CAAE2B,EAAO,QAAS8E,CAAI,CAAE,CAChD,CAAE,CACH,CAAE,CACH,CACD,CAAE,EAEFhH,EAAO,GAAG,OAAQ,CACjB,MAAO,SAAUkC,EAAMqS,EAAO,CAC7B,IAAIW,EAAS,EAQb,OANK,OAAOhT,GAAS,WACpBqS,EAAOrS,EACPA,EAAO,KACPgT,KAGI,UAAU,OAASA,EAChBlV,EAAO,MAAO,KAAM,CAAE,EAAGkC,CAAK,EAG/BqS,IAAS,OACf,KACA,KAAK,KAAM,UAAW,CACrB,IAAI9D,EAAQzQ,EAAO,MAAO,KAAMkC,EAAMqS,CAAK,EAG3CvU,EAAO,YAAa,KAAMkC,CAAK,EAE1BA,IAAS,MAAQuO,EAAO,CAAE,IAAM,cACpCzQ,EAAO,QAAS,KAAMkC,CAAK,CAE7B,CAAE,CACJ,EACA,QAAS,SAAUA,EAAO,CACzB,OAAO,KAAK,KAAM,UAAW,CAC5BlC,EAAO,QAAS,KAAMkC,CAAK,CAC5B,CAAE,CACH,EACA,WAAY,SAAUA,EAAO,CAC5B,OAAO,KAAK,MAAOA,GAAQ,KAAM,CAAC,CAAE,CACrC,EAIA,QAAS,SAAUA,EAAM/C,EAAM,CAC9B,IAAIqJ,EACH2M,EAAQ,EACRC,EAAQpV,EAAO,SAAS,EACxBkJ,EAAW,KACXvJ,EAAI,KAAK,OACTwR,EAAU,UAAW,CACZ,EAAEgE,GACTC,EAAM,YAAalM,EAAU,CAAEA,CAAS,CAAE,CAE5C,EAQD,IANK,OAAOhH,GAAS,WACpB/C,EAAM+C,EACNA,EAAO,QAERA,EAAOA,GAAQ,KAEPvC,KACP6I,EAAMiM,EAAS,IAAKvL,EAAUvJ,CAAE,EAAGuC,EAAO,YAAa,EAClDsG,GAAOA,EAAI,QACf2M,IACA3M,EAAI,MAAM,IAAK2I,CAAQ,GAGzB,OAAAA,EAAQ,EACDiE,EAAM,QAASjW,CAAI,CAC3B,CACD,CAAE,EACF,IAAIkW,GAAS,sCAAwC,OAEjDC,GAAU,IAAI,OAAQ,iBAAmBD,GAAO,cAAe,GAAI,EAGnEE,GAAY,CAAE,MAAO,QAAS,SAAU,MAAO,EAE/CC,GAAkBnW,EAAS,gBAI1BoW,GAAa,SAAUlV,EAAO,CAChC,OAAOP,EAAO,SAAUO,EAAK,cAAeA,CAAK,CAClD,EACAmV,GAAW,CAAE,SAAU,EAAK,EAOxBF,GAAgB,cACpBC,GAAa,SAAUlV,EAAO,CAC7B,OAAOP,EAAO,SAAUO,EAAK,cAAeA,CAAK,GAChDA,EAAK,YAAamV,EAAS,IAAMnV,EAAK,aACxC,GAEF,IAAIoV,GAAqB,SAAUpV,EAAM6G,EAAK,CAI5C,OAAA7G,EAAO6G,GAAM7G,EAGNA,EAAK,MAAM,UAAY,QAC7BA,EAAK,MAAM,UAAY,IAMvBkV,GAAYlV,CAAK,GAEjBP,EAAO,IAAKO,EAAM,SAAU,IAAM,MACpC,EAID,SAASqV,GAAWrV,EAAMiU,EAAMqB,EAAYC,EAAQ,CACnD,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,UAAW,CACV,OAAOA,EAAM,IAAI,CAClB,EACA,UAAW,CACV,OAAO9V,EAAO,IAAKO,EAAMiU,EAAM,EAAG,CACnC,EACD2B,EAAUD,EAAa,EACvBE,EAAOP,GAAcA,EAAY,CAAE,IAAO7V,EAAO,UAAWwU,CAAK,EAAI,GAAK,MAG1E6B,EAAgB9V,EAAK,WAClBP,EAAO,UAAWwU,CAAK,GAAK4B,IAAS,MAAQ,CAACD,IAChDb,GAAQ,KAAMtV,EAAO,IAAKO,EAAMiU,CAAK,CAAE,EAEzC,GAAK6B,GAAiBA,EAAe,CAAE,IAAMD,EAAO,CAYnD,IARAD,EAAUA,EAAU,EAGpBC,EAAOA,GAAQC,EAAe,CAAE,EAGhCA,EAAgB,CAACF,GAAW,EAEpBF,KAIPjW,EAAO,MAAOO,EAAMiU,EAAM6B,EAAgBD,CAAK,GACxC,EAAIJ,IAAY,GAAMA,EAAQE,EAAa,EAAIC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBI,EAAgBA,EAAgBL,EAIjCK,EAAgBA,EAAgB,EAChCrW,EAAO,MAAOO,EAAMiU,EAAM6B,EAAgBD,CAAK,EAG/CP,EAAaA,GAAc,CAAC,CAC7B,CAEA,OAAKA,IACJQ,EAAgB,CAACA,GAAiB,CAACF,GAAW,EAG9CJ,EAAWF,EAAY,CAAE,EACxBQ,GAAkBR,EAAY,CAAE,EAAI,GAAMA,EAAY,CAAE,EACxD,CAACA,EAAY,CAAE,EACXC,IACJA,EAAM,KAAOM,EACbN,EAAM,MAAQO,EACdP,EAAM,IAAMC,IAGPA,CACR,CAGA,IAAIO,GAAoB,CAAC,EAEzB,SAASC,GAAmBhW,EAAO,CAClC,IAAI4M,EACHzN,EAAMa,EAAK,cACXiJ,EAAWjJ,EAAK,SAChBiW,EAAUF,GAAmB9M,CAAS,EAEvC,OAAKgN,IAILrJ,EAAOzN,EAAI,KAAK,YAAaA,EAAI,cAAe8J,CAAS,CAAE,EAC3DgN,EAAUxW,EAAO,IAAKmN,EAAM,SAAU,EAEtCA,EAAK,WAAW,YAAaA,CAAK,EAE7BqJ,IAAY,SAChBA,EAAU,SAEXF,GAAmB9M,CAAS,EAAIgN,EAEzBA,EACR,CAEA,SAASC,GAAUvN,EAAUwN,EAAO,CAOnC,QANIF,EAASjW,EACZoW,EAAS,CAAC,EACV9F,EAAQ,EACR3P,EAASgI,EAAS,OAGX2H,EAAQ3P,EAAQ2P,IACvBtQ,EAAO2I,EAAU2H,CAAM,EACjBtQ,EAAK,QAIXiW,EAAUjW,EAAK,MAAM,QAChBmW,GAKCF,IAAY,SAChBG,EAAQ9F,CAAM,EAAI4D,EAAS,IAAKlU,EAAM,SAAU,GAAK,KAC/CoW,EAAQ9F,CAAM,IACnBtQ,EAAK,MAAM,QAAU,KAGlBA,EAAK,MAAM,UAAY,IAAMoV,GAAoBpV,CAAK,IAC1DoW,EAAQ9F,CAAM,EAAI0F,GAAmBhW,CAAK,IAGtCiW,IAAY,SAChBG,EAAQ9F,CAAM,EAAI,OAGlB4D,EAAS,IAAKlU,EAAM,UAAWiW,CAAQ,IAM1C,IAAM3F,EAAQ,EAAGA,EAAQ3P,EAAQ2P,IAC3B8F,EAAQ9F,CAAM,GAAK,OACvB3H,EAAU2H,CAAM,EAAE,MAAM,QAAU8F,EAAQ9F,CAAM,GAIlD,OAAO3H,CACR,CAEAlJ,EAAO,GAAG,OAAQ,CACjB,KAAM,UAAW,CAChB,OAAOyW,GAAU,KAAM,EAAK,CAC7B,EACA,KAAM,UAAW,CAChB,OAAOA,GAAU,IAAK,CACvB,EACA,OAAQ,SAAUhF,EAAQ,CACzB,OAAK,OAAOA,GAAU,UACdA,EAAQ,KAAK,KAAK,EAAI,KAAK,KAAK,EAGjC,KAAK,KAAM,UAAW,CACvBkE,GAAoB,IAAK,EAC7B3V,EAAQ,IAAK,EAAE,KAAK,EAEpBA,EAAQ,IAAK,EAAE,KAAK,CAEtB,CAAE,CACH,CACD,CAAE,EACF,IAAI4W,GAAmB,wBAEnBC,GAAa,iCAEbC,GAAgB,sCAIlB,UAAW,CACZ,IAAIC,EAAW1X,EAAS,uBAAuB,EAC9C2X,EAAMD,EAAS,YAAa1X,EAAS,cAAe,KAAM,CAAE,EAC5DqJ,EAAQrJ,EAAS,cAAe,OAAQ,EAMzCqJ,EAAM,aAAc,OAAQ,OAAQ,EACpCA,EAAM,aAAc,UAAW,SAAU,EACzCA,EAAM,aAAc,OAAQ,GAAI,EAEhCsO,EAAI,YAAatO,CAAM,EAIvBzJ,EAAQ,WAAa+X,EAAI,UAAW,EAAK,EAAE,UAAW,EAAK,EAAE,UAAU,QAIvEA,EAAI,UAAY,yBAChB/X,EAAQ,eAAiB,CAAC,CAAC+X,EAAI,UAAW,EAAK,EAAE,UAAU,aAK3DA,EAAI,UAAY,oBAChB/X,EAAQ,OAAS,CAAC,CAAC+X,EAAI,SACxB,GAAI,EAIJ,IAAIC,GAAU,CAKb,MAAO,CAAE,EAAG,UAAW,UAAW,EAClC,IAAK,CAAE,EAAG,oBAAqB,qBAAsB,EACrD,GAAI,CAAE,EAAG,iBAAkB,kBAAmB,EAC9C,GAAI,CAAE,EAAG,qBAAsB,uBAAwB,EAEvD,SAAU,CAAE,EAAG,GAAI,EAAG,CACvB,EAEAA,GAAQ,MAAQA,GAAQ,MAAQA,GAAQ,SAAWA,GAAQ,QAAUA,GAAQ,MAC7EA,GAAQ,GAAKA,GAAQ,GAGfhY,EAAQ,SACbgY,GAAQ,SAAWA,GAAQ,OAAS,CAAE,EAAG,+BAAgC,WAAY,GAItF,SAASC,GAAQhX,EAASqI,EAAM,CAI/B,IAAIlI,EAYJ,OAVK,OAAOH,EAAQ,sBAAyB,YAC5CG,EAAMH,EAAQ,qBAAsBqI,GAAO,GAAI,EAEpC,OAAOrI,EAAQ,kBAAqB,YAC/CG,EAAMH,EAAQ,iBAAkBqI,GAAO,GAAI,EAG3ClI,EAAM,CAAC,EAGHkI,IAAQ,QAAaA,GAAOiB,GAAUtJ,EAASqI,CAAI,EAChDvI,EAAO,MAAO,CAAEE,CAAQ,EAAGG,CAAI,EAGhCA,CACR,CAIA,SAAS8W,GAAe/W,EAAOgX,EAAc,CAI5C,QAHIzX,EAAI,EACPmQ,EAAI1P,EAAM,OAEHT,EAAImQ,EAAGnQ,IACd8U,EAAS,IACRrU,EAAOT,CAAE,EACT,aACA,CAACyX,GAAe3C,EAAS,IAAK2C,EAAazX,CAAE,EAAG,YAAa,CAC9D,CAEF,CAGA,IAAIoF,GAAQ,YAEZ,SAASsS,GAAejX,EAAOF,EAASoX,EAASC,EAAWC,EAAU,CAOrE,QANIjX,EAAMiI,EAAKD,EAAKkP,EAAMC,EAAUhX,EACnCqW,EAAW7W,EAAQ,uBAAuB,EAC1CyX,EAAQ,CAAC,EACThY,EAAI,EACJmQ,GAAI1P,EAAM,OAEHT,EAAImQ,GAAGnQ,IAGd,GAFAY,EAAOH,EAAOT,CAAE,EAEXY,GAAQA,IAAS,EAGrB,GAAKT,EAAQS,CAAK,IAAM,SAIvBP,EAAO,MAAO2X,EAAOpX,EAAK,SAAW,CAAEA,CAAK,EAAIA,CAAK,UAG1C,CAACwE,GAAM,KAAMxE,CAAK,EAC7BoX,EAAM,KAAMzX,EAAQ,eAAgBK,CAAK,CAAE,MAGrC,CAUN,IATAiI,EAAMA,GAAOuO,EAAS,YAAa7W,EAAQ,cAAe,KAAM,CAAE,EAGlEqI,GAAQsO,GAAS,KAAMtW,CAAK,GAAK,CAAE,GAAI,EAAG,GAAK,CAAE,EAAE,YAAY,EAC/DkX,EAAOR,GAAS1O,CAAI,GAAK0O,GAAQ,SACjCzO,EAAI,UAAYiP,EAAM,CAAE,EAAIzX,EAAO,cAAeO,CAAK,EAAIkX,EAAM,CAAE,EAGnE/W,EAAI+W,EAAM,CAAE,EACJ/W,KACP8H,EAAMA,EAAI,UAKXxI,EAAO,MAAO2X,EAAOnP,EAAI,UAAW,EAGpCA,EAAMuO,EAAS,WAGfvO,EAAI,YAAc,EACnB,CAQF,IAHAuO,EAAS,YAAc,GAEvBpX,EAAI,EACMY,EAAOoX,EAAOhY,GAAI,GAAM,CAGjC,GAAK4X,GAAavX,EAAO,QAASO,EAAMgX,CAAU,EAAI,GAAK,CACrDC,GACJA,EAAQ,KAAMjX,CAAK,EAEpB,QACD,CAaA,GAXAmX,EAAWjC,GAAYlV,CAAK,EAG5BiI,EAAM0O,GAAQH,EAAS,YAAaxW,CAAK,EAAG,QAAS,EAGhDmX,GACJP,GAAe3O,CAAI,EAIf8O,EAEJ,IADA5W,EAAI,EACMH,EAAOiI,EAAK9H,GAAI,GACpBoW,GAAY,KAAMvW,EAAK,MAAQ,EAAG,GACtC+W,EAAQ,KAAM/W,CAAK,CAIvB,CAEA,OAAOwW,CACR,CAGA,IAAIa,GAAiB,sBAErB,SAASC,IAAa,CACrB,MAAO,EACR,CAEA,SAASC,IAAc,CACtB,MAAO,EACR,CAQA,SAASC,GAAYxX,EAAM2B,EAAO,CACjC,OAAS3B,IAASyX,EAAkB,IAAU9V,IAAS,QACxD,CAKA,SAAS8V,GAAoB,CAC5B,GAAI,CACH,OAAO3Y,EAAS,aACjB,OAAU4Y,EAAM,CAAE,CACnB,CAEA,SAASC,EAAI3X,EAAM4X,EAAOlY,EAAUsU,EAAMrN,EAAIkR,EAAM,CACnD,IAAIC,EAAQnW,EAGZ,GAAK,OAAOiW,GAAU,SAAW,CAG3B,OAAOlY,GAAa,WAGxBsU,EAAOA,GAAQtU,EACfA,EAAW,QAEZ,IAAMiC,KAAQiW,EACbD,EAAI3X,EAAM2B,EAAMjC,EAAUsU,EAAM4D,EAAOjW,CAAK,EAAGkW,CAAI,EAEpD,OAAO7X,CACR,CAqBA,GAnBKgU,GAAQ,MAAQrN,GAAM,MAG1BA,EAAKjH,EACLsU,EAAOtU,EAAW,QACPiH,GAAM,OACZ,OAAOjH,GAAa,UAGxBiH,EAAKqN,EACLA,EAAO,SAIPrN,EAAKqN,EACLA,EAAOtU,EACPA,EAAW,SAGRiH,IAAO,GACXA,EAAK4Q,WACM,CAAC5Q,EACZ,OAAO3G,EAGR,OAAK6X,IAAQ,IACZC,EAASnR,EACTA,EAAK,SAAUoR,EAAQ,CAGtB,OAAAtY,EAAO,EAAE,IAAKsY,CAAM,EACbD,EAAO,MAAO,KAAM,SAAU,CACtC,EAGAnR,EAAG,KAAOmR,EAAO,OAAUA,EAAO,KAAOrY,EAAO,SAE1CO,EAAK,KAAM,UAAW,CAC5BP,EAAO,MAAM,IAAK,KAAMmY,EAAOjR,EAAIqN,EAAMtU,CAAS,CACnD,CAAE,CACH,CAMAD,EAAO,MAAQ,CAEd,OAAQ,CAAC,EAET,IAAK,SAAUO,EAAM4X,EAAO5Q,EAASgN,EAAMtU,EAAW,CAErD,IAAIsY,EAAaC,EAAahQ,EAC7BiQ,EAAQC,EAAGC,EACXtG,EAASuG,EAAU1W,EAAM2W,GAAYC,GACrCC,GAAWtE,EAAS,IAAKlU,CAAK,EAG/B,GAAM6T,EAAY7T,CAAK,EAuCvB,IAlCKgH,EAAQ,UACZgR,EAAchR,EACdA,EAAUgR,EAAY,QACtBtY,EAAWsY,EAAY,UAKnBtY,GACJD,EAAO,KAAK,gBAAiBwV,GAAiBvV,CAAS,EAIlDsH,EAAQ,OACbA,EAAQ,KAAOvH,EAAO,SAIfyY,EAASM,GAAS,UACzBN,EAASM,GAAS,OAAS,OAAO,OAAQ,IAAK,IAExCP,EAAcO,GAAS,UAC9BP,EAAcO,GAAS,OAAS,SAAU9S,GAAI,CAI7C,OAAO,OAAOjG,GAAW,aAAeA,EAAO,MAAM,YAAciG,GAAE,KACpEjG,EAAO,MAAM,SAAS,MAAOO,EAAM,SAAU,EAAI,MACnD,GAID4X,GAAUA,GAAS,IAAK,MAAOnI,EAAc,GAAK,CAAE,EAAG,EACvD0I,EAAIP,EAAM,OACFO,KACPlQ,EAAMoP,GAAe,KAAMO,EAAOO,CAAE,CAAE,GAAK,CAAC,EAC5CxW,EAAO4W,GAAWtQ,EAAK,CAAE,EACzBqQ,IAAerQ,EAAK,CAAE,GAAK,IAAK,MAAO,GAAI,EAAE,KAAK,EAG5CtG,IAKNmQ,EAAUrS,EAAO,MAAM,QAASkC,CAAK,GAAK,CAAC,EAG3CA,GAASjC,EAAWoS,EAAQ,aAAeA,EAAQ,WAAcnQ,EAGjEmQ,EAAUrS,EAAO,MAAM,QAASkC,CAAK,GAAK,CAAC,EAG3CyW,EAAY3Y,EAAO,OAAQ,CAC1B,KAAMkC,EACN,SAAU4W,GACV,KAAMvE,EACN,QAAShN,EACT,KAAMA,EAAQ,KACd,SAAUtH,EACV,aAAcA,GAAYD,EAAO,KAAK,MAAM,aAAa,KAAMC,CAAS,EACxE,UAAW4Y,GAAW,KAAM,GAAI,CACjC,EAAGN,CAAY,GAGPK,EAAWH,EAAQvW,CAAK,KAC/B0W,EAAWH,EAAQvW,CAAK,EAAI,CAAC,EAC7B0W,EAAS,cAAgB,GAGpB,CAACvG,EAAQ,OACbA,EAAQ,MAAM,KAAM9R,EAAMgU,EAAMsE,GAAYL,CAAY,IAAM,KAEzDjY,EAAK,kBACTA,EAAK,iBAAkB2B,EAAMsW,CAAY,GAKvCnG,EAAQ,MACZA,EAAQ,IAAI,KAAM9R,EAAMoY,CAAU,EAE5BA,EAAU,QAAQ,OACvBA,EAAU,QAAQ,KAAOpR,EAAQ,OAK9BtH,EACJ2Y,EAAS,OAAQA,EAAS,gBAAiB,EAAGD,CAAU,EAExDC,EAAS,KAAMD,CAAU,EAI1B3Y,EAAO,MAAM,OAAQkC,CAAK,EAAI,GAGhC,EAGA,OAAQ,SAAU3B,EAAM4X,EAAO5Q,EAAStH,EAAU+Y,EAAc,CAE/D,IAAItY,EAAGuY,EAAWzQ,EACjBiQ,EAAQC,EAAGC,EACXtG,EAASuG,EAAU1W,EAAM2W,GAAYC,GACrCC,GAAWtE,EAAS,QAASlU,CAAK,GAAKkU,EAAS,IAAKlU,CAAK,EAE3D,GAAK,GAACwY,IAAY,EAAGN,EAASM,GAAS,SAOvC,KAFAZ,GAAUA,GAAS,IAAK,MAAOnI,EAAc,GAAK,CAAE,EAAG,EACvD0I,EAAIP,EAAM,OACFO,KAAM,CAMb,GALAlQ,EAAMoP,GAAe,KAAMO,EAAOO,CAAE,CAAE,GAAK,CAAC,EAC5CxW,EAAO4W,GAAWtQ,EAAK,CAAE,EACzBqQ,IAAerQ,EAAK,CAAE,GAAK,IAAK,MAAO,GAAI,EAAE,KAAK,EAG7C,CAACtG,EAAO,CACZ,IAAMA,KAAQuW,EACbzY,EAAO,MAAM,OAAQO,EAAM2B,EAAOiW,EAAOO,CAAE,EAAGnR,EAAStH,EAAU,EAAK,EAEvE,QACD,CAUA,IARAoS,EAAUrS,EAAO,MAAM,QAASkC,CAAK,GAAK,CAAC,EAC3CA,GAASjC,EAAWoS,EAAQ,aAAeA,EAAQ,WAAcnQ,EACjE0W,EAAWH,EAAQvW,CAAK,GAAK,CAAC,EAC9BsG,EAAMA,EAAK,CAAE,GACZ,IAAI,OAAQ,UAAYqQ,GAAW,KAAM,eAAgB,EAAI,SAAU,EAGxEI,EAAYvY,EAAIkY,EAAS,OACjBlY,KACPiY,EAAYC,EAAUlY,CAAE,GAEjBsY,GAAeF,KAAaH,EAAU,YAC1C,CAACpR,GAAWA,EAAQ,OAASoR,EAAU,QACvC,CAACnQ,GAAOA,EAAI,KAAMmQ,EAAU,SAAU,KACtC,CAAC1Y,GAAYA,IAAa0Y,EAAU,UACrC1Y,IAAa,MAAQ0Y,EAAU,YAChCC,EAAS,OAAQlY,EAAG,CAAE,EAEjBiY,EAAU,UACdC,EAAS,gBAELvG,EAAQ,QACZA,EAAQ,OAAO,KAAM9R,EAAMoY,CAAU,GAOnCM,GAAa,CAACL,EAAS,UACtB,CAACvG,EAAQ,UACbA,EAAQ,SAAS,KAAM9R,EAAMsY,GAAYE,GAAS,MAAO,IAAM,KAE/D/Y,EAAO,YAAaO,EAAM2B,EAAM6W,GAAS,MAAO,EAGjD,OAAON,EAAQvW,CAAK,EAEtB,CAGKlC,EAAO,cAAeyY,CAAO,GACjChE,EAAS,OAAQlU,EAAM,eAAgB,EAEzC,EAEA,SAAU,SAAU2Y,EAAc,CAEjC,IAAIvZ,EAAGe,EAAGL,EAAK0K,EAAS4N,EAAWQ,EAClCtO,EAAO,IAAI,MAAO,UAAU,MAAO,EAGnCyN,EAAQtY,EAAO,MAAM,IAAKkZ,CAAY,EAEtCN,GACCnE,EAAS,IAAK,KAAM,QAAS,GAAK,OAAO,OAAQ,IAAK,GACpD6D,EAAM,IAAK,GAAK,CAAC,EACpBjG,EAAUrS,EAAO,MAAM,QAASsY,EAAM,IAAK,GAAK,CAAC,EAKlD,IAFAzN,EAAM,CAAE,EAAIyN,EAEN3Y,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAClCkL,EAAMlL,CAAE,EAAI,UAAWA,CAAE,EAM1B,GAHA2Y,EAAM,eAAiB,KAGlB,EAAAjG,EAAQ,aAAeA,EAAQ,YAAY,KAAM,KAAMiG,CAAM,IAAM,IASxE,KAJAa,EAAenZ,EAAO,MAAM,SAAS,KAAM,KAAMsY,EAAOM,CAAS,EAGjEjZ,EAAI,GACMoL,EAAUoO,EAAcxZ,GAAI,IAAO,CAAC2Y,EAAM,qBAAqB,GAIxE,IAHAA,EAAM,cAAgBvN,EAAQ,KAE9BrK,EAAI,GACMiY,EAAY5N,EAAQ,SAAUrK,GAAI,IAC3C,CAAC4X,EAAM,8BAA8B,IAIhC,CAACA,EAAM,YAAcK,EAAU,YAAc,IACjDL,EAAM,WAAW,KAAMK,EAAU,SAAU,KAE3CL,EAAM,UAAYK,EAClBL,EAAM,KAAOK,EAAU,KAEvBtY,IAAUL,EAAO,MAAM,QAAS2Y,EAAU,QAAS,GAAK,CAAC,GAAI,QAC5DA,EAAU,SAAU,MAAO5N,EAAQ,KAAMF,CAAK,EAE1CxK,IAAQ,SACLiY,EAAM,OAASjY,KAAU,KAC/BiY,EAAM,eAAe,EACrBA,EAAM,gBAAgB,IAQ3B,OAAKjG,EAAQ,cACZA,EAAQ,aAAa,KAAM,KAAMiG,CAAM,EAGjCA,EAAM,OACd,EAEA,SAAU,SAAUA,EAAOM,EAAW,CACrC,IAAIjZ,EAAGgZ,EAAWxP,EAAKiQ,EAAiBC,EACvCF,EAAe,CAAC,EAChBG,EAAgBV,EAAS,cACzBnR,EAAM6Q,EAAM,OAGb,GAAKgB,GAIJ7R,EAAI,UAOJ,EAAG6Q,EAAM,OAAS,SAAWA,EAAM,QAAU,IAE7C,KAAQ7Q,IAAQ,KAAMA,EAAMA,EAAI,YAAc,KAI7C,GAAKA,EAAI,WAAa,GAAK,EAAG6Q,EAAM,OAAS,SAAW7Q,EAAI,WAAa,IAAS,CAGjF,IAFA2R,EAAkB,CAAC,EACnBC,EAAmB,CAAC,EACd1Z,EAAI,EAAGA,EAAI2Z,EAAe3Z,IAC/BgZ,EAAYC,EAAUjZ,CAAE,EAGxBwJ,EAAMwP,EAAU,SAAW,IAEtBU,EAAkBlQ,CAAI,IAAM,SAChCkQ,EAAkBlQ,CAAI,EAAIwP,EAAU,aACnC3Y,EAAQmJ,EAAK,IAAK,EAAE,MAAO1B,CAAI,EAAI,GACnCzH,EAAO,KAAMmJ,EAAK,KAAM,KAAM,CAAE1B,CAAI,CAAE,EAAE,QAErC4R,EAAkBlQ,CAAI,GAC1BiQ,EAAgB,KAAMT,CAAU,EAG7BS,EAAgB,QACpBD,EAAa,KAAM,CAAE,KAAM1R,EAAK,SAAU2R,CAAgB,CAAE,CAE9D,EAKF,OAAA3R,EAAM,KACD6R,EAAgBV,EAAS,QAC7BO,EAAa,KAAM,CAAE,KAAM1R,EAAK,SAAUmR,EAAS,MAAOU,CAAc,CAAE,CAAE,EAGtEH,CACR,EAEA,QAAS,SAAUvY,EAAM2Y,EAAO,CAC/B,OAAO,eAAgBvZ,EAAO,MAAM,UAAWY,EAAM,CACpD,WAAY,GACZ,aAAc,GAEd,IAAK1B,EAAYqa,CAAK,EACrB,UAAW,CACV,GAAK,KAAK,cACT,OAAOA,EAAM,KAAK,aAAc,CAElC,EACA,UAAW,CACV,GAAK,KAAK,cACT,OAAO,KAAK,cAAe3Y,CAAK,CAElC,EAED,IAAK,SAAUoB,EAAQ,CACtB,OAAO,eAAgB,KAAMpB,EAAM,CAClC,WAAY,GACZ,aAAc,GACd,SAAU,GACV,MAAOoB,CACR,CAAE,CACH,CACD,CAAE,CACH,EAEA,IAAK,SAAUwX,EAAgB,CAC9B,OAAOA,EAAexZ,EAAO,OAAQ,EACpCwZ,EACA,IAAIxZ,EAAO,MAAOwZ,CAAc,CAClC,EAEA,QAAS,CACR,KAAM,CAGL,SAAU,EACX,EACA,MAAO,CAGN,MAAO,SAAUjF,EAAO,CAIvB,IAAInN,EAAK,MAAQmN,EAGjB,OAAKqC,GAAe,KAAMxP,EAAG,IAAK,GACjCA,EAAG,OAASoC,GAAUpC,EAAI,OAAQ,GAGlCqS,EAAgBrS,EAAI,QAASyQ,EAAW,EAIlC,EACR,EACA,QAAS,SAAUtD,EAAO,CAIzB,IAAInN,EAAK,MAAQmN,EAGjB,OAAKqC,GAAe,KAAMxP,EAAG,IAAK,GACjCA,EAAG,OAASoC,GAAUpC,EAAI,OAAQ,GAElCqS,EAAgBrS,EAAI,OAAQ,EAItB,EACR,EAIA,SAAU,SAAUkR,EAAQ,CAC3B,IAAIrX,EAASqX,EAAM,OACnB,OAAO1B,GAAe,KAAM3V,EAAO,IAAK,GACvCA,EAAO,OAASuI,GAAUvI,EAAQ,OAAQ,GAC1CwT,EAAS,IAAKxT,EAAQ,OAAQ,GAC9BuI,GAAUvI,EAAQ,GAAI,CACxB,CACD,EAEA,aAAc,CACb,aAAc,SAAUqX,EAAQ,CAI1BA,EAAM,SAAW,QAAaA,EAAM,gBACxCA,EAAM,cAAc,YAAcA,EAAM,OAE1C,CACD,CACD,CACD,EAMA,SAASmB,EAAgBrS,EAAIlF,EAAM6V,EAAa,CAG/C,GAAK,CAACA,EAAa,CACbtD,EAAS,IAAKrN,EAAIlF,CAAK,IAAM,QACjClC,EAAO,MAAM,IAAKoH,EAAIlF,EAAM2V,EAAW,EAExC,MACD,CAGApD,EAAS,IAAKrN,EAAIlF,EAAM,EAAM,EAC9BlC,EAAO,MAAM,IAAKoH,EAAIlF,EAAM,CAC3B,UAAW,GACX,QAAS,SAAUoW,EAAQ,CAC1B,IAAIoB,EAAU9P,EACb+P,EAAQlF,EAAS,IAAK,KAAMvS,CAAK,EAElC,GAAOoW,EAAM,UAAY,GAAO,KAAMpW,CAAK,GAK1C,GAAMyX,EAAM,QAuCE3Z,EAAO,MAAM,QAASkC,CAAK,GAAK,CAAC,GAAI,cAClDoW,EAAM,gBAAgB,UAnCtBqB,EAAQpb,EAAM,KAAM,SAAU,EAC9BkW,EAAS,IAAK,KAAMvS,EAAMyX,CAAM,EAKhCD,EAAW3B,EAAY,KAAM7V,CAAK,EAClC,KAAMA,CAAK,EAAE,EACb0H,EAAS6K,EAAS,IAAK,KAAMvS,CAAK,EAC7ByX,IAAU/P,GAAU8P,EACxBjF,EAAS,IAAK,KAAMvS,EAAM,EAAM,EAEhC0H,EAAS,CAAC,EAEN+P,IAAU/P,EAGd,OAAA0O,EAAM,yBAAyB,EAC/BA,EAAM,eAAe,EAOd1O,GAAUA,EAAO,WAef+P,EAAM,SAGjBlF,EAAS,IAAK,KAAMvS,EAAM,CACzB,MAAOlC,EAAO,MAAM,QAInBA,EAAO,OAAQ2Z,EAAO,CAAE,EAAG3Z,EAAO,MAAM,SAAU,EAClD2Z,EAAM,MAAO,CAAE,EACf,IACD,CACD,CAAE,EAGFrB,EAAM,yBAAyB,EAEjC,CACD,CAAE,CACH,CAEAtY,EAAO,YAAc,SAAUO,EAAM2B,EAAM0X,EAAS,CAG9CrZ,EAAK,qBACTA,EAAK,oBAAqB2B,EAAM0X,CAAO,CAEzC,EAEA5Z,EAAO,MAAQ,SAAUa,EAAKgZ,EAAQ,CAGrC,GAAK,EAAG,gBAAgB7Z,EAAO,OAC9B,OAAO,IAAIA,EAAO,MAAOa,EAAKgZ,CAAM,EAIhChZ,GAAOA,EAAI,MACf,KAAK,cAAgBA,EACrB,KAAK,KAAOA,EAAI,KAIhB,KAAK,mBAAqBA,EAAI,kBAC5BA,EAAI,mBAAqB,QAGzBA,EAAI,cAAgB,GACrBgX,GACAC,GAKD,KAAK,OAAWjX,EAAI,QAAUA,EAAI,OAAO,WAAa,EACrDA,EAAI,OAAO,WACXA,EAAI,OAEL,KAAK,cAAgBA,EAAI,cACzB,KAAK,cAAgBA,EAAI,eAIzB,KAAK,KAAOA,EAIRgZ,GACJ7Z,EAAO,OAAQ,KAAM6Z,CAAM,EAI5B,KAAK,UAAYhZ,GAAOA,EAAI,WAAa,KAAK,IAAI,EAGlD,KAAMb,EAAO,OAAQ,EAAI,EAC1B,EAIAA,EAAO,MAAM,UAAY,CACxB,YAAaA,EAAO,MACpB,mBAAoB8X,GACpB,qBAAsBA,GACtB,8BAA+BA,GAC/B,YAAa,GAEb,eAAgB,UAAW,CAC1B,IAAI7R,EAAI,KAAK,cAEb,KAAK,mBAAqB4R,GAErB5R,GAAK,CAAC,KAAK,aACfA,EAAE,eAAe,CAEnB,EACA,gBAAiB,UAAW,CAC3B,IAAIA,EAAI,KAAK,cAEb,KAAK,qBAAuB4R,GAEvB5R,GAAK,CAAC,KAAK,aACfA,EAAE,gBAAgB,CAEpB,EACA,yBAA0B,UAAW,CACpC,IAAIA,EAAI,KAAK,cAEb,KAAK,8BAAgC4R,GAEhC5R,GAAK,CAAC,KAAK,aACfA,EAAE,yBAAyB,EAG5B,KAAK,gBAAgB,CACtB,CACD,EAGAjG,EAAO,KAAM,CACZ,OAAQ,GACR,QAAS,GACT,WAAY,GACZ,eAAgB,GAChB,QAAS,GACT,OAAQ,GACR,WAAY,GACZ,QAAS,GACT,MAAO,GACP,MAAO,GACP,SAAU,GACV,KAAM,GACN,KAAQ,GACR,KAAM,GACN,SAAU,GACV,IAAK,GACL,QAAS,GACT,OAAQ,GACR,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,QAAS,GACT,UAAW,GACX,YAAa,GACb,QAAS,GACT,QAAS,GACT,cAAe,GACf,UAAW,GACX,QAAS,GACT,MAAO,EACR,EAAGA,EAAO,MAAM,OAAQ,EAExBA,EAAO,KAAM,CAAE,MAAO,UAAW,KAAM,UAAW,EAAG,SAAUkC,EAAM4X,EAAe,CACnF9Z,EAAO,MAAM,QAASkC,CAAK,EAAI,CAG9B,MAAO,UAAW,CAKjB,OAAAuX,EAAgB,KAAMvX,EAAM6V,EAAW,EAGhC,EACR,EACA,QAAS,UAAW,CAGnB,OAAA0B,EAAgB,KAAMvX,CAAK,EAGpB,EACR,EAIA,SAAU,SAAUoW,EAAQ,CAC3B,OAAO7D,EAAS,IAAK6D,EAAM,OAAQpW,CAAK,CACzC,EAEA,aAAc4X,CACf,CACD,CAAE,EAUF9Z,EAAO,KAAM,CACZ,WAAY,YACZ,WAAY,WACZ,aAAc,cACd,aAAc,YACf,EAAG,SAAU+Z,EAAMC,EAAM,CACxBha,EAAO,MAAM,QAAS+Z,CAAK,EAAI,CAC9B,aAAcC,EACd,SAAUA,EAEV,OAAQ,SAAU1B,EAAQ,CACzB,IAAIjY,EACHY,EAAS,KACTgZ,EAAU3B,EAAM,cAChBK,EAAYL,EAAM,UAInB,OAAK,CAAC2B,GAAaA,IAAYhZ,GAAU,CAACjB,EAAO,SAAUiB,EAAQgZ,CAAQ,KAC1E3B,EAAM,KAAOK,EAAU,SACvBtY,EAAMsY,EAAU,QAAQ,MAAO,KAAM,SAAU,EAC/CL,EAAM,KAAO0B,GAEP3Z,CACR,CACD,CACD,CAAE,EAEFL,EAAO,GAAG,OAAQ,CAEjB,GAAI,SAAUmY,EAAOlY,EAAUsU,EAAMrN,EAAK,CACzC,OAAOgR,EAAI,KAAMC,EAAOlY,EAAUsU,EAAMrN,CAAG,CAC5C,EACA,IAAK,SAAUiR,EAAOlY,EAAUsU,EAAMrN,EAAK,CAC1C,OAAOgR,EAAI,KAAMC,EAAOlY,EAAUsU,EAAMrN,EAAI,CAAE,CAC/C,EACA,IAAK,SAAUiR,EAAOlY,EAAUiH,EAAK,CACpC,IAAIyR,EAAWzW,EACf,GAAKiW,GAASA,EAAM,gBAAkBA,EAAM,UAG3C,OAAAQ,EAAYR,EAAM,UAClBnY,EAAQmY,EAAM,cAAe,EAAE,IAC9BQ,EAAU,UACTA,EAAU,SAAW,IAAMA,EAAU,UACrCA,EAAU,SACXA,EAAU,SACVA,EAAU,OACX,EACO,KAER,GAAK,OAAOR,GAAU,SAAW,CAGhC,IAAMjW,KAAQiW,EACb,KAAK,IAAKjW,EAAMjC,EAAUkY,EAAOjW,CAAK,CAAE,EAEzC,OAAO,IACR,CACA,OAAKjC,IAAa,IAAS,OAAOA,GAAa,cAG9CiH,EAAKjH,EACLA,EAAW,QAEPiH,IAAO,KACXA,EAAK4Q,IAEC,KAAK,KAAM,UAAW,CAC5B9X,EAAO,MAAM,OAAQ,KAAMmY,EAAOjR,EAAIjH,CAAS,CAChD,CAAE,CACH,CACD,CAAE,EAGF,IAKCia,EAAe,wBAGfC,GAAW,oCAEXC,GAAe,6BAGhB,SAASC,GAAoB9Z,EAAM+Z,EAAU,CAC5C,OAAK9Q,GAAUjJ,EAAM,OAAQ,GAC5BiJ,GAAU8Q,EAAQ,WAAa,GAAKA,EAAUA,EAAQ,WAAY,IAAK,GAEhEta,EAAQO,CAAK,EAAE,SAAU,OAAQ,EAAG,CAAE,GAAKA,CAIpD,CAGA,SAASga,GAAeha,EAAO,CAC9B,OAAAA,EAAK,MAASA,EAAK,aAAc,MAAO,IAAM,MAAS,IAAMA,EAAK,KAC3DA,CACR,CACA,SAASia,GAAeja,EAAO,CAC9B,OAAOA,EAAK,MAAQ,IAAK,MAAO,EAAG,CAAE,IAAM,QAC1CA,EAAK,KAAOA,EAAK,KAAK,MAAO,CAAE,EAE/BA,EAAK,gBAAiB,MAAO,EAGvBA,CACR,CAEA,SAASka,GAAgB5Z,EAAK6Z,EAAO,CACpC,IAAI/a,EAAGmQ,EAAG5N,EAAMyY,EAAUC,EAAUC,EAAUpC,EAE9C,GAAKiC,EAAK,WAAa,EAKvB,IAAKjG,EAAS,QAAS5T,CAAI,IAC1B8Z,EAAWlG,EAAS,IAAK5T,CAAI,EAC7B4X,EAASkC,EAAS,OAEblC,GAAS,CACbhE,EAAS,OAAQiG,EAAM,eAAgB,EAEvC,IAAMxY,KAAQuW,EACb,IAAM9Y,EAAI,EAAGmQ,EAAI2I,EAAQvW,CAAK,EAAE,OAAQvC,EAAImQ,EAAGnQ,IAC9CK,EAAO,MAAM,IAAK0a,EAAMxY,EAAMuW,EAAQvW,CAAK,EAAGvC,CAAE,CAAE,CAGrD,CAII+U,EAAS,QAAS7T,CAAI,IAC1B+Z,EAAWlG,EAAS,OAAQ7T,CAAI,EAChCga,EAAW7a,EAAO,OAAQ,CAAC,EAAG4a,CAAS,EAEvClG,EAAS,IAAKgG,EAAMG,CAAS,GAE/B,CAGA,SAASC,GAAUja,EAAK6Z,EAAO,CAC9B,IAAIlR,EAAWkR,EAAK,SAAS,YAAY,EAGpClR,IAAa,SAAWoN,GAAe,KAAM/V,EAAI,IAAK,EAC1D6Z,EAAK,QAAU7Z,EAAI,SAGR2I,IAAa,SAAWA,IAAa,cAChDkR,EAAK,aAAe7Z,EAAI,aAE1B,CAEA,SAASka,GAAUC,EAAYnQ,EAAMvK,EAAUkX,EAAU,CAGxD3M,EAAOrM,EAAMqM,CAAK,EAElB,IAAIkM,EAAUtV,EAAO6V,EAAS2D,EAAYxb,EAAMC,EAC/CC,EAAI,EACJmQ,EAAIkL,EAAW,OACfE,EAAWpL,EAAI,EACf9N,EAAQ6I,EAAM,CAAE,EAChBsQ,GAAkBjc,EAAY8C,CAAM,EAGrC,GAAKmZ,IACDrL,EAAI,GAAK,OAAO9N,GAAU,UAC3B,CAAC/C,EAAQ,YAAckb,GAAS,KAAMnY,CAAM,EAC9C,OAAOgZ,EAAW,KAAM,SAAUnK,GAAQ,CACzC,IAAIvB,GAAO0L,EAAW,GAAInK,EAAM,EAC3BsK,KACJtQ,EAAM,CAAE,EAAI7I,EAAM,KAAM,KAAM6O,GAAOvB,GAAK,KAAK,CAAE,GAElDyL,GAAUzL,GAAMzE,EAAMvK,EAAUkX,CAAQ,CACzC,CAAE,EAGH,GAAK1H,IACJiH,EAAWM,GAAexM,EAAMmQ,EAAY,CAAE,EAAE,cAAe,GAAOA,EAAYxD,CAAQ,EAC1F/V,EAAQsV,EAAS,WAEZA,EAAS,WAAW,SAAW,IACnCA,EAAWtV,GAIPA,GAAS+V,GAAU,CAOvB,IANAF,EAAUtX,EAAO,IAAKkX,GAAQH,EAAU,QAAS,EAAGwD,EAAc,EAClEU,EAAa3D,EAAQ,OAKb3X,EAAImQ,EAAGnQ,IACdF,EAAOsX,EAEFpX,IAAMub,IACVzb,EAAOO,EAAO,MAAOP,EAAM,GAAM,EAAK,EAGjCwb,GAIJjb,EAAO,MAAOsX,EAASJ,GAAQzX,EAAM,QAAS,CAAE,GAIlDa,EAAS,KAAM0a,EAAYrb,CAAE,EAAGF,EAAME,CAAE,EAGzC,GAAKsb,EAOJ,IANAvb,EAAM4X,EAASA,EAAQ,OAAS,CAAE,EAAE,cAGpCtX,EAAO,IAAKsX,EAASkD,EAAc,EAG7B7a,EAAI,EAAGA,EAAIsb,EAAYtb,IAC5BF,EAAO6X,EAAS3X,CAAE,EACbmX,GAAY,KAAMrX,EAAK,MAAQ,EAAG,GACtC,CAACgV,EAAS,OAAQhV,EAAM,YAAa,GACrCO,EAAO,SAAUN,EAAKD,CAAK,IAEtBA,EAAK,MAASA,EAAK,MAAQ,IAAK,YAAY,IAAO,SAGlDO,EAAO,UAAY,CAACP,EAAK,UAC7BO,EAAO,SAAUP,EAAK,IAAK,CAC1B,MAAOA,EAAK,OAASA,EAAK,aAAc,OAAQ,CACjD,EAAGC,CAAI,EASRH,EAASE,EAAK,YAAY,QAAS2a,GAAc,EAAG,EAAG3a,EAAMC,CAAI,EAKtE,CAGD,OAAOsb,CACR,CAEA,SAASI,GAAQ7a,EAAMN,EAAUob,EAAW,CAK3C,QAJI5b,EACHkY,EAAQ1X,EAAWD,EAAO,OAAQC,EAAUM,CAAK,EAAIA,EACrDZ,EAAI,GAEKF,EAAOkY,EAAOhY,CAAE,IAAO,KAAMA,IACjC,CAAC0b,GAAY5b,EAAK,WAAa,GACnCO,EAAO,UAAWkX,GAAQzX,CAAK,CAAE,EAG7BA,EAAK,aACJ4b,GAAY5F,GAAYhW,CAAK,GACjC0X,GAAeD,GAAQzX,EAAM,QAAS,CAAE,EAEzCA,EAAK,WAAW,YAAaA,CAAK,GAIpC,OAAOc,CACR,CAEAP,EAAO,OAAQ,CACd,cAAe,SAAUsb,EAAO,CAC/B,OAAOA,CACR,EAEA,MAAO,SAAU/a,EAAMgb,EAAeC,EAAoB,CACzD,IAAI7b,EAAGmQ,EAAG2L,EAAaC,EACtB1a,EAAQT,EAAK,UAAW,EAAK,EAC7Bob,EAASlG,GAAYlV,CAAK,EAG3B,GAAK,CAACtB,EAAQ,iBAAoBsB,EAAK,WAAa,GAAKA,EAAK,WAAa,KACzE,CAACP,EAAO,SAAUO,CAAK,EAMxB,IAHAmb,EAAexE,GAAQlW,CAAM,EAC7Bya,EAAcvE,GAAQ3W,CAAK,EAErBZ,EAAI,EAAGmQ,EAAI2L,EAAY,OAAQ9b,EAAImQ,EAAGnQ,IAC3Cmb,GAAUW,EAAa9b,CAAE,EAAG+b,EAAc/b,CAAE,CAAE,EAKhD,GAAK4b,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAevE,GAAQ3W,CAAK,EAC1Cmb,EAAeA,GAAgBxE,GAAQlW,CAAM,EAEvCrB,EAAI,EAAGmQ,EAAI2L,EAAY,OAAQ9b,EAAImQ,EAAGnQ,IAC3C8a,GAAgBgB,EAAa9b,CAAE,EAAG+b,EAAc/b,CAAE,CAAE,OAGrD8a,GAAgBla,EAAMS,CAAM,EAK9B,OAAA0a,EAAexE,GAAQlW,EAAO,QAAS,EAClC0a,EAAa,OAAS,GAC1BvE,GAAeuE,EAAc,CAACC,GAAUzE,GAAQ3W,EAAM,QAAS,CAAE,EAI3DS,CACR,EAEA,UAAW,SAAUZ,EAAQ,CAK5B,QAJImU,EAAMhU,EAAM2B,EACfmQ,EAAUrS,EAAO,MAAM,QACvBL,EAAI,GAEKY,EAAOH,EAAOT,CAAE,KAAQ,OAAWA,IAC5C,GAAKyU,EAAY7T,CAAK,EAAI,CACzB,GAAOgU,EAAOhU,EAAMkU,EAAS,OAAQ,EAAM,CAC1C,GAAKF,EAAK,OACT,IAAMrS,KAAQqS,EAAK,OACblC,EAASnQ,CAAK,EAClBlC,EAAO,MAAM,OAAQO,EAAM2B,CAAK,EAIhClC,EAAO,YAAaO,EAAM2B,EAAMqS,EAAK,MAAO,EAO/ChU,EAAMkU,EAAS,OAAQ,EAAI,MAC5B,CACKlU,EAAMmU,EAAS,OAAQ,IAI3BnU,EAAMmU,EAAS,OAAQ,EAAI,OAE7B,CAEF,CACD,CAAE,EAEF1U,EAAO,GAAG,OAAQ,CACjB,OAAQ,SAAUC,EAAW,CAC5B,OAAOmb,GAAQ,KAAMnb,EAAU,EAAK,CACrC,EAEA,OAAQ,SAAUA,EAAW,CAC5B,OAAOmb,GAAQ,KAAMnb,CAAS,CAC/B,EAEA,KAAM,SAAU+B,EAAQ,CACvB,OAAOuR,GAAQ,KAAM,SAAUvR,EAAQ,CACtC,OAAOA,IAAU,OAChBhC,EAAO,KAAM,IAAK,EAClB,KAAK,MAAM,EAAE,KAAM,UAAW,EACxB,KAAK,WAAa,GAAK,KAAK,WAAa,IAAM,KAAK,WAAa,KACrE,KAAK,YAAcgC,EAErB,CAAE,CACJ,EAAG,KAAMA,EAAO,UAAU,MAAO,CAClC,EAEA,OAAQ,UAAW,CAClB,OAAO+Y,GAAU,KAAM,UAAW,SAAUxa,EAAO,CAClD,GAAK,KAAK,WAAa,GAAK,KAAK,WAAa,IAAM,KAAK,WAAa,EAAI,CACzE,IAAIU,EAASoZ,GAAoB,KAAM9Z,CAAK,EAC5CU,EAAO,YAAaV,CAAK,CAC1B,CACD,CAAE,CACH,EAEA,QAAS,UAAW,CACnB,OAAOwa,GAAU,KAAM,UAAW,SAAUxa,EAAO,CAClD,GAAK,KAAK,WAAa,GAAK,KAAK,WAAa,IAAM,KAAK,WAAa,EAAI,CACzE,IAAIU,EAASoZ,GAAoB,KAAM9Z,CAAK,EAC5CU,EAAO,aAAcV,EAAMU,EAAO,UAAW,CAC9C,CACD,CAAE,CACH,EAEA,OAAQ,UAAW,CAClB,OAAO8Z,GAAU,KAAM,UAAW,SAAUxa,EAAO,CAC7C,KAAK,YACT,KAAK,WAAW,aAAcA,EAAM,IAAK,CAE3C,CAAE,CACH,EAEA,MAAO,UAAW,CACjB,OAAOwa,GAAU,KAAM,UAAW,SAAUxa,EAAO,CAC7C,KAAK,YACT,KAAK,WAAW,aAAcA,EAAM,KAAK,WAAY,CAEvD,CAAE,CACH,EAEA,MAAO,UAAW,CAIjB,QAHIA,EACHZ,EAAI,GAEKY,EAAO,KAAMZ,CAAE,IAAO,KAAMA,IAChCY,EAAK,WAAa,IAGtBP,EAAO,UAAWkX,GAAQ3W,EAAM,EAAM,CAAE,EAGxCA,EAAK,YAAc,IAIrB,OAAO,IACR,EAEA,MAAO,SAAUgb,EAAeC,EAAoB,CACnD,OAAAD,EAAgBA,GAAiB,KAAO,GAAQA,EAChDC,EAAoBA,GAAqB,KAAOD,EAAgBC,EAEzD,KAAK,IAAK,UAAW,CAC3B,OAAOxb,EAAO,MAAO,KAAMub,EAAeC,CAAkB,CAC7D,CAAE,CACH,EAEA,KAAM,SAAUxZ,EAAQ,CACvB,OAAOuR,GAAQ,KAAM,SAAUvR,EAAQ,CACtC,IAAIzB,EAAO,KAAM,CAAE,GAAK,CAAC,EACxBZ,EAAI,EACJmQ,EAAI,KAAK,OAEV,GAAK9N,IAAU,QAAazB,EAAK,WAAa,EAC7C,OAAOA,EAAK,UAIb,GAAK,OAAOyB,GAAU,UAAY,CAACkY,EAAa,KAAMlY,CAAM,GAC3D,CAACiV,IAAWJ,GAAS,KAAM7U,CAAM,GAAK,CAAE,GAAI,EAAG,GAAK,CAAE,EAAE,YAAY,CAAE,EAAI,CAE1EA,EAAQhC,EAAO,cAAegC,CAAM,EAEpC,GAAI,CACH,KAAQrC,EAAImQ,EAAGnQ,IACdY,EAAO,KAAMZ,CAAE,GAAK,CAAC,EAGhBY,EAAK,WAAa,IACtBP,EAAO,UAAWkX,GAAQ3W,EAAM,EAAM,CAAE,EACxCA,EAAK,UAAYyB,GAInBzB,EAAO,CAGR,OAAU0F,EAAI,CAAC,CAChB,CAEK1F,GACJ,KAAK,MAAM,EAAE,OAAQyB,CAAM,CAE7B,EAAG,KAAMA,EAAO,UAAU,MAAO,CAClC,EAEA,YAAa,UAAW,CACvB,IAAIwV,EAAU,CAAC,EAGf,OAAOuD,GAAU,KAAM,UAAW,SAAUxa,EAAO,CAClD,IAAImK,EAAS,KAAK,WAEb1K,EAAO,QAAS,KAAMwX,CAAQ,EAAI,IACtCxX,EAAO,UAAWkX,GAAQ,IAAK,CAAE,EAC5BxM,GACJA,EAAO,aAAcnK,EAAM,IAAK,EAKnC,EAAGiX,CAAQ,CACZ,CACD,CAAE,EAEFxX,EAAO,KAAM,CACZ,SAAU,SACV,UAAW,UACX,aAAc,SACd,YAAa,QACb,WAAY,aACb,EAAG,SAAUY,EAAMgb,EAAW,CAC7B5b,EAAO,GAAIY,CAAK,EAAI,SAAUX,EAAW,CAOxC,QANIG,EACHC,EAAM,CAAC,EACPwb,EAAS7b,EAAQC,CAAS,EAC1B8J,EAAO8R,EAAO,OAAS,EACvBlc,EAAI,EAEGA,GAAKoK,EAAMpK,IAClBS,EAAQT,IAAMoK,EAAO,KAAO,KAAK,MAAO,EAAK,EAC7C/J,EAAQ6b,EAAQlc,CAAE,CAAE,EAAGic,CAAS,EAAGxb,CAAM,EAIzC1B,EAAK,MAAO2B,EAAKD,EAAM,IAAI,CAAE,EAG9B,OAAO,KAAK,UAAWC,CAAI,CAC5B,CACD,CAAE,EACF,IAAIyb,GAAY,IAAI,OAAQ,KAAOzG,GAAO,kBAAmB,GAAI,EAE7D0G,GAAc,MAGdC,GAAY,SAAUzb,EAAO,CAK/B,IAAI0b,EAAO1b,EAAK,cAAc,YAE9B,OAAK,CAAC0b,GAAQ,CAACA,EAAK,UACnBA,EAAO9d,GAGD8d,EAAK,iBAAkB1b,CAAK,CACpC,EAEG2b,GAAO,SAAU3b,EAAMI,EAASL,EAAW,CAC9C,IAAID,EAAKO,EACRub,EAAM,CAAC,EAGR,IAAMvb,KAAQD,EACbwb,EAAKvb,CAAK,EAAIL,EAAK,MAAOK,CAAK,EAC/BL,EAAK,MAAOK,CAAK,EAAID,EAASC,CAAK,EAGpCP,EAAMC,EAAS,KAAMC,CAAK,EAG1B,IAAMK,KAAQD,EACbJ,EAAK,MAAOK,CAAK,EAAIub,EAAKvb,CAAK,EAGhC,OAAOP,CACR,EAGI+b,GAAY,IAAI,OAAQ7G,GAAU,KAAM,GAAI,EAAG,GAAI,EAEnDpR,GAAa,sBAGbkY,GAAW,IAAI,OAClB,IAAMlY,GAAa,8BAAgCA,GAAa,KAChE,GACD,GAKE,UAAW,CAIZ,SAASmY,GAAoB,CAG5B,GAAMtF,EAIN,CAAAuF,EAAU,MAAM,QAAU,+EAE1BvF,EAAI,MAAM,QACT,4HAGDxB,GAAgB,YAAa+G,CAAU,EAAE,YAAavF,CAAI,EAE1D,IAAIwF,EAAWre,EAAO,iBAAkB6Y,CAAI,EAC5CyF,EAAmBD,EAAS,MAAQ,KAGpCE,EAAwBC,EAAoBH,EAAS,UAAW,IAAM,GAItExF,EAAI,MAAM,MAAQ,MAClB4F,EAAoBD,EAAoBH,EAAS,KAAM,IAAM,GAI7DK,EAAuBF,EAAoBH,EAAS,KAAM,IAAM,GAMhExF,EAAI,MAAM,SAAW,WACrB8F,EAAmBH,EAAoB3F,EAAI,YAAc,CAAE,IAAM,GAEjExB,GAAgB,YAAa+G,CAAU,EAIvCvF,EAAM,KACP,CAEA,SAAS2F,EAAoBI,EAAU,CACtC,OAAO,KAAK,MAAO,WAAYA,CAAQ,CAAE,CAC1C,CAEA,IAAIN,EAAkBI,EAAsBC,EAAkBF,EAC7DI,EAAyBN,EACzBH,EAAYld,EAAS,cAAe,KAAM,EAC1C2X,EAAM3X,EAAS,cAAe,KAAM,EAG/B2X,EAAI,QAMVA,EAAI,MAAM,eAAiB,cAC3BA,EAAI,UAAW,EAAK,EAAE,MAAM,eAAiB,GAC7C/X,EAAQ,gBAAkB+X,EAAI,MAAM,iBAAmB,cAEvDhX,EAAO,OAAQf,EAAS,CACvB,kBAAmB,UAAW,CAC7B,OAAAqd,EAAkB,EACXO,CACR,EACA,eAAgB,UAAW,CAC1B,OAAAP,EAAkB,EACXM,CACR,EACA,cAAe,UAAW,CACzB,OAAAN,EAAkB,EACXG,CACR,EACA,mBAAoB,UAAW,CAC9B,OAAAH,EAAkB,EACXI,CACR,EACA,cAAe,UAAW,CACzB,OAAAJ,EAAkB,EACXQ,CACR,EAWA,qBAAsB,UAAW,CAChC,IAAIG,EAAOC,EAAIC,EAASC,EACxB,OAAKJ,GAA2B,OAC/BC,EAAQ5d,EAAS,cAAe,OAAQ,EACxC6d,EAAK7d,EAAS,cAAe,IAAK,EAClC8d,EAAU9d,EAAS,cAAe,KAAM,EAExC4d,EAAM,MAAM,QAAU,2DACtBC,EAAG,MAAM,QAAU,mBAKnBA,EAAG,MAAM,OAAS,MAClBC,EAAQ,MAAM,OAAS,MAQvBA,EAAQ,MAAM,QAAU,QAExB3H,GACE,YAAayH,CAAM,EACnB,YAAaC,CAAG,EAChB,YAAaC,CAAQ,EAEvBC,EAAUjf,EAAO,iBAAkB+e,CAAG,EACtCF,EAA4B,SAAUI,EAAQ,OAAQ,EAAG,EACxD,SAAUA,EAAQ,eAAgB,EAAG,EACrC,SAAUA,EAAQ,kBAAmB,EAAG,IAAQF,EAAG,aAEpD1H,GAAgB,YAAayH,CAAM,GAE7BD,CACR,CACD,CAAE,EACH,GAAI,EAGJ,SAASK,GAAQ9c,EAAMK,EAAM0c,EAAW,CACvC,IAAIC,EAAOC,EAAUC,EAAUpd,EAC9Bqd,EAAe3B,GAAY,KAAMnb,CAAK,EAMtC+c,EAAQpd,EAAK,MAEd,OAAA+c,EAAWA,GAAYtB,GAAWzb,CAAK,EAKlC+c,IAWJjd,EAAMid,EAAS,iBAAkB1c,CAAK,GAAK0c,EAAU1c,CAAK,EAErD8c,GAAgBrd,IAkBpBA,EAAMA,EAAI,QAASgc,GAAU,IAAK,GAAK,QAGnChc,IAAQ,IAAM,CAACoV,GAAYlV,CAAK,IACpCF,EAAML,EAAO,MAAOO,EAAMK,CAAK,GAQ3B,CAAC3B,EAAQ,eAAe,GAAK6c,GAAU,KAAMzb,CAAI,GAAK+b,GAAU,KAAMxb,CAAK,IAG/E2c,EAAQI,EAAM,MACdH,EAAWG,EAAM,SACjBF,EAAWE,EAAM,SAGjBA,EAAM,SAAWA,EAAM,SAAWA,EAAM,MAAQtd,EAChDA,EAAMid,EAAS,MAGfK,EAAM,MAAQJ,EACdI,EAAM,SAAWH,EACjBG,EAAM,SAAWF,IAIZpd,IAAQ,OAIdA,EAAM,GACNA,CACF,CAGA,SAASud,GAAcC,EAAaC,EAAS,CAG5C,MAAO,CACN,IAAK,UAAW,CACf,GAAKD,EAAY,EAAI,CAIpB,OAAO,KAAK,IACZ,MACD,CAGA,OAAS,KAAK,IAAMC,GAAS,MAAO,KAAM,SAAU,CACrD,CACD,CACD,CAGA,IAAIC,GAAc,CAAE,SAAU,MAAO,IAAK,EACzCC,GAAa3e,EAAS,cAAe,KAAM,EAAE,MAC7C4e,GAAc,CAAC,EAGhB,SAASC,GAAgBtd,EAAO,CAM/B,QAHIud,EAAUvd,EAAM,CAAE,EAAE,YAAY,EAAIA,EAAK,MAAO,CAAE,EACrDjB,EAAIoe,GAAY,OAETpe,KAEP,GADAiB,EAAOmd,GAAape,CAAE,EAAIwe,EACrBvd,KAAQod,GACZ,OAAOpd,CAGV,CAGA,SAASwd,GAAexd,EAAO,CAC9B,IAAIyd,EAAQre,EAAO,SAAUY,CAAK,GAAKqd,GAAard,CAAK,EAEzD,OAAKyd,IAGAzd,KAAQod,GACLpd,EAEDqd,GAAard,CAAK,EAAIsd,GAAgBtd,CAAK,GAAKA,EACxD,CAGA,IAKC0d,GAAe,4BACfC,GAAU,CAAE,SAAU,WAAY,WAAY,SAAU,QAAS,OAAQ,EACzEC,GAAqB,CACpB,cAAe,IACf,WAAY,KACb,EAED,SAASC,GAAmBje,EAAOwB,EAAO0c,EAAW,CAIpD,IAAI7c,EAAUyT,GAAQ,KAAMtT,CAAM,EAClC,OAAOH,EAGN,KAAK,IAAK,EAAGA,EAAS,CAAE,GAAM6c,GAAY,EAAI,GAAM7c,EAAS,CAAE,GAAK,MACpEG,CACF,CAEA,SAAS2c,GAAoBpe,EAAMqe,EAAWC,EAAKC,EAAaC,EAAQC,EAAc,CACrF,IAAIrf,EAAIif,IAAc,QAAU,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,MAAO,GAGR,KAAQnf,EAAI,EAAGA,GAAK,EAGdkf,IAAQ,WACZK,GAASlf,EAAO,IAAKO,EAAMse,EAAMtJ,GAAW5V,CAAE,EAAG,GAAMof,CAAO,GAIzDD,GAmBAD,IAAQ,YACZK,GAASlf,EAAO,IAAKO,EAAM,UAAYgV,GAAW5V,CAAE,EAAG,GAAMof,CAAO,GAIhEF,IAAQ,WACZK,GAASlf,EAAO,IAAKO,EAAM,SAAWgV,GAAW5V,CAAE,EAAI,QAAS,GAAMof,CAAO,KAtB9EG,GAASlf,EAAO,IAAKO,EAAM,UAAYgV,GAAW5V,CAAE,EAAG,GAAMof,CAAO,EAG/DF,IAAQ,UACZK,GAASlf,EAAO,IAAKO,EAAM,SAAWgV,GAAW5V,CAAE,EAAI,QAAS,GAAMof,CAAO,EAI7EE,GAASjf,EAAO,IAAKO,EAAM,SAAWgV,GAAW5V,CAAE,EAAI,QAAS,GAAMof,CAAO,GAoBhF,MAAK,CAACD,GAAeE,GAAe,IAInCE,GAAS,KAAK,IAAK,EAAG,KAAK,KAC1B3e,EAAM,SAAWqe,EAAW,CAAE,EAAE,YAAY,EAAIA,EAAU,MAAO,CAAE,CAAE,EACrEI,EACAE,EACAD,EACA,EAID,CAAE,GAAK,GAGDC,CACR,CAEA,SAASC,GAAkB5e,EAAMqe,EAAWK,EAAQ,CAGnD,IAAIF,EAAS/C,GAAWzb,CAAK,EAI5B6e,EAAkB,CAACngB,EAAQ,kBAAkB,GAAKggB,EAClDH,EAAcM,GACbpf,EAAO,IAAKO,EAAM,YAAa,GAAOwe,CAAO,IAAM,aACpDM,EAAmBP,EAEnBlf,EAAMyd,GAAQ9c,EAAMqe,EAAWG,CAAO,EACtCO,EAAa,SAAWV,EAAW,CAAE,EAAE,YAAY,EAAIA,EAAU,MAAO,CAAE,EAI3E,GAAK9C,GAAU,KAAMlc,CAAI,EAAI,CAC5B,GAAK,CAACqf,EACL,OAAOrf,EAERA,EAAM,MACP,CAMA,OAAO,CAACX,EAAQ,kBAAkB,GAAK6f,GAMtC,CAAC7f,EAAQ,qBAAqB,GAAKuK,GAAUjJ,EAAM,IAAK,GAIxDX,IAAQ,QAIR,CAAC,WAAYA,CAAI,GAAKI,EAAO,IAAKO,EAAM,UAAW,GAAOwe,CAAO,IAAM,WAGvExe,EAAK,eAAe,EAAE,SAEtBue,EAAc9e,EAAO,IAAKO,EAAM,YAAa,GAAOwe,CAAO,IAAM,aAKjEM,EAAmBC,KAAc/e,EAC5B8e,IACJzf,EAAMW,EAAM+e,CAAW,IAKzB1f,EAAM,WAAYA,CAAI,GAAK,EAGlBA,EACR+e,GACCpe,EACAqe,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAnf,CACD,EACG,IACL,CAEAI,EAAO,OAAQ,CAId,SAAU,CACT,QAAS,CACR,IAAK,SAAUO,EAAM+c,EAAW,CAC/B,GAAKA,EAAW,CAGf,IAAIjd,EAAMgd,GAAQ9c,EAAM,SAAU,EAClC,OAAOF,IAAQ,GAAK,IAAMA,CAC3B,CACD,CACD,CACD,EAGA,UAAW,CACV,wBAA2B,GAC3B,YAAe,GACf,YAAe,GACf,SAAY,GACZ,WAAc,GACd,WAAc,GACd,SAAY,GACZ,WAAc,GACd,cAAiB,GACjB,gBAAmB,GACnB,QAAW,GACX,WAAc,GACd,aAAgB,GAChB,WAAc,GACd,QAAW,GACX,MAAS,GACT,QAAW,GACX,OAAU,GACV,OAAU,GACV,KAAQ,EACT,EAIA,SAAU,CAAC,EAGX,MAAO,SAAUE,EAAMK,EAAMoB,EAAOid,EAAQ,CAG3C,GAAK,GAAC1e,GAAQA,EAAK,WAAa,GAAKA,EAAK,WAAa,GAAK,CAACA,EAAK,OAKlE,KAAIF,EAAK6B,EAAM8S,EACduK,EAAWrL,GAAWtT,CAAK,EAC3B8c,EAAe3B,GAAY,KAAMnb,CAAK,EACtC+c,EAAQpd,EAAK,MAad,GARMmd,IACL9c,EAAOwd,GAAemB,CAAS,GAIhCvK,EAAQhV,EAAO,SAAUY,CAAK,GAAKZ,EAAO,SAAUuf,CAAS,EAGxDvd,IAAU,OAAY,CAY1B,GAXAE,EAAO,OAAOF,EAGTE,IAAS,WAAc7B,EAAMiV,GAAQ,KAAMtT,CAAM,IAAO3B,EAAK,CAAE,IACnE2B,EAAQ4T,GAAWrV,EAAMK,EAAMP,CAAI,EAGnC6B,EAAO,UAIHF,GAAS,MAAQA,IAAUA,EAC/B,OAMIE,IAAS,UAAY,CAACwb,IAC1B1b,GAAS3B,GAAOA,EAAK,CAAE,IAAOL,EAAO,UAAWuf,CAAS,EAAI,GAAK,OAI9D,CAACtgB,EAAQ,iBAAmB+C,IAAU,IAAMpB,EAAK,QAAS,YAAa,IAAM,IACjF+c,EAAO/c,CAAK,EAAI,YAIZ,CAACoU,GAAS,EAAG,QAASA,KACxBhT,EAAQgT,EAAM,IAAKzU,EAAMyB,EAAOid,CAAM,KAAQ,UAE3CvB,EACJC,EAAM,YAAa/c,EAAMoB,CAAM,EAE/B2b,EAAO/c,CAAK,EAAIoB,EAInB,KAGC,QAAKgT,GAAS,QAASA,IACpB3U,EAAM2U,EAAM,IAAKzU,EAAM,GAAO0e,CAAM,KAAQ,OAEvC5e,EAIDsd,EAAO/c,CAAK,EAErB,EAEA,IAAK,SAAUL,EAAMK,EAAMqe,EAAOF,EAAS,CAC1C,IAAInf,EAAKO,EAAK6U,EACbuK,EAAWrL,GAAWtT,CAAK,EAC3B8c,EAAe3B,GAAY,KAAMnb,CAAK,EA4BvC,OAvBM8c,IACL9c,EAAOwd,GAAemB,CAAS,GAIhCvK,EAAQhV,EAAO,SAAUY,CAAK,GAAKZ,EAAO,SAAUuf,CAAS,EAGxDvK,GAAS,QAASA,IACtBpV,EAAMoV,EAAM,IAAKzU,EAAM,GAAM0e,CAAM,GAI/Brf,IAAQ,SACZA,EAAMyd,GAAQ9c,EAAMK,EAAMme,CAAO,GAI7Bnf,IAAQ,UAAYgB,KAAQ4d,KAChC5e,EAAM4e,GAAoB5d,CAAK,GAI3Bqe,IAAU,IAAMA,GACpB9e,EAAM,WAAYP,CAAI,EACfqf,IAAU,IAAQ,SAAU9e,CAAI,EAAIA,GAAO,EAAIP,GAGhDA,CACR,CACD,CAAE,EAEFI,EAAO,KAAM,CAAE,SAAU,OAAQ,EAAG,SAAUiC,EAAI2c,EAAY,CAC7D5e,EAAO,SAAU4e,CAAU,EAAI,CAC9B,IAAK,SAAUre,EAAM+c,EAAU2B,EAAQ,CACtC,GAAK3B,EAIJ,OAAOgB,GAAa,KAAMte,EAAO,IAAKO,EAAM,SAAU,CAAE,IAQrD,CAACA,EAAK,eAAe,EAAE,QAAU,CAACA,EAAK,sBAAsB,EAAE,OACjE2b,GAAM3b,EAAMge,GAAS,UAAW,CAC/B,OAAOY,GAAkB5e,EAAMqe,EAAWK,CAAM,CACjD,CAAE,EACFE,GAAkB5e,EAAMqe,EAAWK,CAAM,CAE5C,EAEA,IAAK,SAAU1e,EAAMyB,EAAOid,EAAQ,CACnC,IAAIpd,EACHkd,EAAS/C,GAAWzb,CAAK,EAIzBif,EAAqB,CAACvgB,EAAQ,cAAc,GAC3C8f,EAAO,WAAa,WAGrBK,EAAkBI,GAAsBP,EACxCH,EAAcM,GACbpf,EAAO,IAAKO,EAAM,YAAa,GAAOwe,CAAO,IAAM,aACpDL,EAAWO,EACVN,GACCpe,EACAqe,EACAK,EACAH,EACAC,CACD,EACA,EAIF,OAAKD,GAAeU,IACnBd,GAAY,KAAK,KAChBne,EAAM,SAAWqe,EAAW,CAAE,EAAE,YAAY,EAAIA,EAAU,MAAO,CAAE,CAAE,EACrE,WAAYG,EAAQH,CAAU,CAAE,EAChCD,GAAoBpe,EAAMqe,EAAW,SAAU,GAAOG,CAAO,EAC7D,EACD,GAIIL,IAAc7c,EAAUyT,GAAQ,KAAMtT,CAAM,KAC9CH,EAAS,CAAE,GAAK,QAAW,OAE7BtB,EAAK,MAAOqe,CAAU,EAAI5c,EAC1BA,EAAQhC,EAAO,IAAKO,EAAMqe,CAAU,GAG9BH,GAAmBle,EAAMyB,EAAO0c,CAAS,CACjD,CACD,CACD,CAAE,EAEF1e,EAAO,SAAS,WAAa4d,GAAc3e,EAAQ,mBAClD,SAAUsB,EAAM+c,EAAW,CAC1B,GAAKA,EACJ,OAAS,WAAYD,GAAQ9c,EAAM,YAAa,CAAE,GACjDA,EAAK,sBAAsB,EAAE,KAC5B2b,GAAM3b,EAAM,CAAE,WAAY,CAAE,EAAG,UAAW,CACzC,OAAOA,EAAK,sBAAsB,EAAE,IACrC,CAAE,GACA,IAEN,CACD,EAGAP,EAAO,KAAM,CACZ,OAAQ,GACR,QAAS,GACT,OAAQ,OACT,EAAG,SAAUyf,EAAQC,EAAS,CAC7B1f,EAAO,SAAUyf,EAASC,CAAO,EAAI,CACpC,OAAQ,SAAU1d,EAAQ,CAOzB,QANIrC,EAAI,EACPggB,EAAW,CAAC,EAGZC,EAAQ,OAAO5d,GAAU,SAAWA,EAAM,MAAO,GAAI,EAAI,CAAEA,CAAM,EAE1DrC,EAAI,EAAGA,IACdggB,EAAUF,EAASlK,GAAW5V,CAAE,EAAI+f,CAAO,EAC1CE,EAAOjgB,CAAE,GAAKigB,EAAOjgB,EAAI,CAAE,GAAKigB,EAAO,CAAE,EAG3C,OAAOD,CACR,CACD,EAEKF,IAAW,WACfzf,EAAO,SAAUyf,EAASC,CAAO,EAAE,IAAMjB,GAE3C,CAAE,EAEFze,EAAO,GAAG,OAAQ,CACjB,IAAK,SAAUY,EAAMoB,EAAQ,CAC5B,OAAOuR,GAAQ,KAAM,SAAUhT,EAAMK,EAAMoB,EAAQ,CAClD,IAAI+c,EAAQte,EACXiM,EAAM,CAAC,EACP/M,EAAI,EAEL,GAAK,MAAM,QAASiB,CAAK,EAAI,CAI5B,IAHAme,EAAS/C,GAAWzb,CAAK,EACzBE,EAAMG,EAAK,OAEHjB,EAAIc,EAAKd,IAChB+M,EAAK9L,EAAMjB,CAAE,CAAE,EAAIK,EAAO,IAAKO,EAAMK,EAAMjB,CAAE,EAAG,GAAOof,CAAO,EAG/D,OAAOrS,CACR,CAEA,OAAO1K,IAAU,OAChBhC,EAAO,MAAOO,EAAMK,EAAMoB,CAAM,EAChChC,EAAO,IAAKO,EAAMK,CAAK,CACzB,EAAGA,EAAMoB,EAAO,UAAU,OAAS,CAAE,CACtC,CACD,CAAE,EAGF,SAAS6d,GAAOtf,EAAMI,EAAS6T,EAAMsL,EAAKC,EAAS,CAClD,OAAO,IAAIF,GAAM,UAAU,KAAMtf,EAAMI,EAAS6T,EAAMsL,EAAKC,CAAO,CACnE,CACA/f,EAAO,MAAQ6f,GAEfA,GAAM,UAAY,CACjB,YAAaA,GACb,KAAM,SAAUtf,EAAMI,EAAS6T,EAAMsL,EAAKC,EAAQ3J,EAAO,CACxD,KAAK,KAAO7V,EACZ,KAAK,KAAOiU,EACZ,KAAK,OAASuL,GAAU/f,EAAO,OAAO,SACtC,KAAK,QAAUW,EACf,KAAK,MAAQ,KAAK,IAAM,KAAK,IAAI,EACjC,KAAK,IAAMmf,EACX,KAAK,KAAO1J,IAAUpW,EAAO,UAAWwU,CAAK,EAAI,GAAK,KACvD,EACA,IAAK,UAAW,CACf,IAAIQ,EAAQ6K,GAAM,UAAW,KAAK,IAAK,EAEvC,OAAO7K,GAASA,EAAM,IACrBA,EAAM,IAAK,IAAK,EAChB6K,GAAM,UAAU,SAAS,IAAK,IAAK,CACrC,EACA,IAAK,SAAUG,EAAU,CACxB,IAAIC,EACHjL,EAAQ6K,GAAM,UAAW,KAAK,IAAK,EAEpC,OAAK,KAAK,QAAQ,SACjB,KAAK,IAAMI,EAAQjgB,EAAO,OAAQ,KAAK,MAAO,EAC7CggB,EAAS,KAAK,QAAQ,SAAWA,EAAS,EAAG,EAAG,KAAK,QAAQ,QAC9D,EAEA,KAAK,IAAMC,EAAQD,EAEpB,KAAK,KAAQ,KAAK,IAAM,KAAK,OAAUC,EAAQ,KAAK,MAE/C,KAAK,QAAQ,MACjB,KAAK,QAAQ,KAAK,KAAM,KAAK,KAAM,KAAK,IAAK,IAAK,EAG9CjL,GAASA,EAAM,IACnBA,EAAM,IAAK,IAAK,EAEhB6K,GAAM,UAAU,SAAS,IAAK,IAAK,EAE7B,IACR,CACD,EAEAA,GAAM,UAAU,KAAK,UAAYA,GAAM,UAEvCA,GAAM,UAAY,CACjB,SAAU,CACT,IAAK,SAAU/J,EAAQ,CACtB,IAAIlM,EAIJ,OAAKkM,EAAM,KAAK,WAAa,GAC5BA,EAAM,KAAMA,EAAM,IAAK,GAAK,MAAQA,EAAM,KAAK,MAAOA,EAAM,IAAK,GAAK,KAC/DA,EAAM,KAAMA,EAAM,IAAK,GAO/BlM,EAAS5J,EAAO,IAAK8V,EAAM,KAAMA,EAAM,KAAM,EAAG,EAGzC,CAAClM,GAAUA,IAAW,OAAS,EAAIA,EAC3C,EACA,IAAK,SAAUkM,EAAQ,CAKjB9V,EAAO,GAAG,KAAM8V,EAAM,IAAK,EAC/B9V,EAAO,GAAG,KAAM8V,EAAM,IAAK,EAAGA,CAAM,EACzBA,EAAM,KAAK,WAAa,IACnC9V,EAAO,SAAU8V,EAAM,IAAK,GAC3BA,EAAM,KAAK,MAAOsI,GAAetI,EAAM,IAAK,CAAE,GAAK,MACpD9V,EAAO,MAAO8V,EAAM,KAAMA,EAAM,KAAMA,EAAM,IAAMA,EAAM,IAAK,EAE7DA,EAAM,KAAMA,EAAM,IAAK,EAAIA,EAAM,GAEnC,CACD,CACD,EAIA+J,GAAM,UAAU,UAAYA,GAAM,UAAU,WAAa,CACxD,IAAK,SAAU/J,EAAQ,CACjBA,EAAM,KAAK,UAAYA,EAAM,KAAK,aACtCA,EAAM,KAAMA,EAAM,IAAK,EAAIA,EAAM,IAEnC,CACD,EAEA9V,EAAO,OAAS,CACf,OAAQ,SAAUkgB,EAAI,CACrB,OAAOA,CACR,EACA,MAAO,SAAUA,EAAI,CACpB,MAAO,IAAM,KAAK,IAAKA,EAAI,KAAK,EAAG,EAAI,CACxC,EACA,SAAU,OACX,EAEAlgB,EAAO,GAAK6f,GAAM,UAAU,KAG5B7f,EAAO,GAAG,KAAO,CAAC,EAKlB,IACCmgB,GAAOC,GACPC,GAAW,yBACXC,GAAO,cAER,SAASC,IAAW,CACdH,KACC/gB,EAAS,SAAW,IAASlB,EAAO,sBACxCA,EAAO,sBAAuBoiB,EAAS,EAEvCpiB,EAAO,WAAYoiB,GAAUvgB,EAAO,GAAG,QAAS,EAGjDA,EAAO,GAAG,KAAK,EAEjB,CAGA,SAASwgB,IAAc,CACtB,OAAAriB,EAAO,WAAY,UAAW,CAC7BgiB,GAAQ,MACT,CAAE,EACOA,GAAQ,KAAK,IAAI,CAC3B,CAGA,SAASM,GAAOve,EAAMwe,EAAe,CACpC,IAAIC,EACHhhB,EAAI,EACJ2H,EAAQ,CAAE,OAAQpF,CAAK,EAKxB,IADAwe,EAAeA,EAAe,EAAI,EAC1B/gB,EAAI,EAAGA,GAAK,EAAI+gB,EACvBC,EAAQpL,GAAW5V,CAAE,EACrB2H,EAAO,SAAWqZ,CAAM,EAAIrZ,EAAO,UAAYqZ,CAAM,EAAIze,EAG1D,OAAKwe,IACJpZ,EAAM,QAAUA,EAAM,MAAQpF,GAGxBoF,CACR,CAEA,SAASsZ,GAAa5e,EAAOwS,EAAMqM,EAAY,CAK9C,QAJI/K,EACHkF,GAAe8F,GAAU,SAAUtM,CAAK,GAAK,CAAC,GAAI,OAAQsM,GAAU,SAAU,GAAI,CAAE,EACpFjQ,EAAQ,EACR3P,EAAS8Z,EAAW,OACbnK,EAAQ3P,EAAQ2P,IACvB,GAAOiF,EAAQkF,EAAYnK,CAAM,EAAE,KAAMgQ,EAAWrM,EAAMxS,CAAM,EAG/D,OAAO8T,CAGV,CAEA,SAASiL,GAAkBxgB,EAAMsZ,EAAOmH,EAAO,CAC9C,IAAIxM,EAAMxS,EAAOif,EAAQjM,EAAOkM,EAASC,EAAWC,EAAgB5K,EACnE6K,EAAQ,UAAWxH,GAAS,WAAYA,EACxCyH,EAAO,KACPvH,EAAO,CAAC,EACR4D,GAAQpd,EAAK,MACbghB,GAAShhB,EAAK,UAAYoV,GAAoBpV,CAAK,EACnDihB,GAAW/M,EAAS,IAAKlU,EAAM,QAAS,EAGnCygB,EAAK,QACVhM,EAAQhV,EAAO,YAAaO,EAAM,IAAK,EAClCyU,EAAM,UAAY,OACtBA,EAAM,SAAW,EACjBkM,EAAUlM,EAAM,MAAM,KACtBA,EAAM,MAAM,KAAO,UAAW,CACvBA,EAAM,UACXkM,EAAQ,CAEV,GAEDlM,EAAM,WAENsM,EAAK,OAAQ,UAAW,CAGvBA,EAAK,OAAQ,UAAW,CACvBtM,EAAM,WACAhV,EAAO,MAAOO,EAAM,IAAK,EAAE,QAChCyU,EAAM,MAAM,KAAK,CAEnB,CAAE,CACH,CAAE,GAIH,IAAMR,KAAQqF,EAEb,GADA7X,EAAQ6X,EAAOrF,CAAK,EACf6L,GAAS,KAAMre,CAAM,EAAI,CAG7B,GAFA,OAAO6X,EAAOrF,CAAK,EACnByM,EAASA,GAAUjf,IAAU,SACxBA,KAAYuf,GAAS,OAAS,QAIlC,GAAKvf,IAAU,QAAUwf,IAAYA,GAAUhN,CAAK,IAAM,OACzD+M,GAAS,OAIT,UAGFxH,EAAMvF,CAAK,EAAIgN,IAAYA,GAAUhN,CAAK,GAAKxU,EAAO,MAAOO,EAAMiU,CAAK,CACzE,CAKD,GADA2M,EAAY,CAACnhB,EAAO,cAAe6Z,CAAM,EACpC,GAACsH,GAAanhB,EAAO,cAAe+Z,CAAK,GAK9C,CAAKsH,GAAS9gB,EAAK,WAAa,IAM/BygB,EAAK,SAAW,CAAErD,GAAM,SAAUA,GAAM,UAAWA,GAAM,SAAU,EAGnEyD,EAAiBI,IAAYA,GAAS,QACjCJ,GAAkB,OACtBA,EAAiB3M,EAAS,IAAKlU,EAAM,SAAU,GAEhDiW,EAAUxW,EAAO,IAAKO,EAAM,SAAU,EACjCiW,IAAY,SACX4K,EACJ5K,EAAU4K,GAIV3K,GAAU,CAAElW,CAAK,EAAG,EAAK,EACzB6gB,EAAiB7gB,EAAK,MAAM,SAAW6gB,EACvC5K,EAAUxW,EAAO,IAAKO,EAAM,SAAU,EACtCkW,GAAU,CAAElW,CAAK,CAAE,KAKhBiW,IAAY,UAAYA,IAAY,gBAAkB4K,GAAkB,OACvEphB,EAAO,IAAKO,EAAM,OAAQ,IAAM,SAG9B4gB,IACLG,EAAK,KAAM,UAAW,CACrB3D,GAAM,QAAUyD,CACjB,CAAE,EACGA,GAAkB,OACtB5K,EAAUmH,GAAM,QAChByD,EAAiB5K,IAAY,OAAS,GAAKA,IAG7CmH,GAAM,QAAU,iBAKdqD,EAAK,WACTrD,GAAM,SAAW,SACjB2D,EAAK,OAAQ,UAAW,CACvB3D,GAAM,SAAWqD,EAAK,SAAU,CAAE,EAClCrD,GAAM,UAAYqD,EAAK,SAAU,CAAE,EACnCrD,GAAM,UAAYqD,EAAK,SAAU,CAAE,CACpC,CAAE,GAIHG,EAAY,GACZ,IAAM3M,KAAQuF,EAGPoH,IACAK,GACC,WAAYA,KAChBD,GAASC,GAAS,QAGnBA,GAAW/M,EAAS,OAAQlU,EAAM,SAAU,CAAE,QAAS6gB,CAAe,CAAE,EAIpEH,IACJO,GAAS,OAAS,CAACD,IAIfA,IACJ9K,GAAU,CAAElW,CAAK,EAAG,EAAK,EAK1B+gB,EAAK,KAAM,UAAW,CAKfC,IACL9K,GAAU,CAAElW,CAAK,CAAE,EAEpBkU,EAAS,OAAQlU,EAAM,QAAS,EAChC,IAAMiU,KAAQuF,EACb/Z,EAAO,MAAOO,EAAMiU,EAAMuF,EAAMvF,CAAK,CAAE,CAEzC,CAAE,GAIH2M,EAAYP,GAAaW,GAASC,GAAUhN,CAAK,EAAI,EAAGA,EAAM8M,CAAK,EAC3D9M,KAAQgN,KACfA,GAAUhN,CAAK,EAAI2M,EAAU,MACxBI,KACJJ,EAAU,IAAMA,EAAU,MAC1BA,EAAU,MAAQ,IAItB,CAEA,SAASM,GAAY5H,EAAO6H,EAAgB,CAC3C,IAAI7Q,EAAOjQ,EAAMmf,EAAQ/d,EAAOgT,EAGhC,IAAMnE,KAASgJ,EAed,GAdAjZ,EAAOsT,GAAWrD,CAAM,EACxBkP,EAAS2B,EAAe9gB,CAAK,EAC7BoB,EAAQ6X,EAAOhJ,CAAM,EAChB,MAAM,QAAS7O,CAAM,IACzB+d,EAAS/d,EAAO,CAAE,EAClBA,EAAQ6X,EAAOhJ,CAAM,EAAI7O,EAAO,CAAE,GAG9B6O,IAAUjQ,IACdiZ,EAAOjZ,CAAK,EAAIoB,EAChB,OAAO6X,EAAOhJ,CAAM,GAGrBmE,EAAQhV,EAAO,SAAUY,CAAK,EACzBoU,GAAS,WAAYA,EAAQ,CACjChT,EAAQgT,EAAM,OAAQhT,CAAM,EAC5B,OAAO6X,EAAOjZ,CAAK,EAInB,IAAMiQ,KAAS7O,EACN6O,KAASgJ,IAChBA,EAAOhJ,CAAM,EAAI7O,EAAO6O,CAAM,EAC9B6Q,EAAe7Q,CAAM,EAAIkP,EAG5B,MACC2B,EAAe9gB,CAAK,EAAImf,CAG3B,CAEA,SAASe,GAAWvgB,EAAMohB,EAAYhhB,EAAU,CAC/C,IAAIiJ,EACHgY,EACA/Q,EAAQ,EACR3P,EAAS4f,GAAU,WAAW,OAC9BnP,EAAW3R,EAAO,SAAS,EAAE,OAAQ,UAAW,CAG/C,OAAO6hB,EAAK,IACb,CAAE,EACFA,EAAO,UAAW,CACjB,GAAKD,EACJ,MAAO,GAYR,QAVIE,EAAc3B,IAASK,GAAY,EACtC5N,EAAY,KAAK,IAAK,EAAGiO,EAAU,UAAYA,EAAU,SAAWiB,CAAY,EAIhF3U,EAAOyF,EAAYiO,EAAU,UAAY,EACzCb,GAAU,EAAI7S,EACd0D,GAAQ,EACR3P,GAAS2f,EAAU,OAAO,OAEnBhQ,GAAQ3P,GAAQ2P,KACvBgQ,EAAU,OAAQhQ,EAAM,EAAE,IAAKmP,EAAQ,EAMxC,OAHArO,EAAS,WAAYpR,EAAM,CAAEsgB,EAAWb,GAASpN,CAAU,CAAE,EAGxDoN,GAAU,GAAK9e,GACZ0R,GAIF1R,IACLyQ,EAAS,WAAYpR,EAAM,CAAEsgB,EAAW,EAAG,CAAE,CAAE,EAIhDlP,EAAS,YAAapR,EAAM,CAAEsgB,CAAU,CAAE,EACnC,GACR,EACAA,EAAYlP,EAAS,QAAS,CAC7B,KAAMpR,EACN,MAAOP,EAAO,OAAQ,CAAC,EAAG2hB,CAAW,EACrC,KAAM3hB,EAAO,OAAQ,GAAM,CAC1B,cAAe,CAAC,EAChB,OAAQA,EAAO,OAAO,QACvB,EAAGW,CAAQ,EACX,mBAAoBghB,EACpB,gBAAiBhhB,EACjB,UAAWwf,IAASK,GAAY,EAChC,SAAU7f,EAAQ,SAClB,OAAQ,CAAC,EACT,YAAa,SAAU6T,EAAMsL,EAAM,CAClC,IAAIhK,EAAQ9V,EAAO,MAAOO,EAAMsgB,EAAU,KAAMrM,EAAMsL,EACrDe,EAAU,KAAK,cAAerM,CAAK,GAAKqM,EAAU,KAAK,MAAO,EAC/D,OAAAA,EAAU,OAAO,KAAM/K,CAAM,EACtBA,CACR,EACA,KAAM,SAAUiM,EAAU,CACzB,IAAIlR,EAAQ,EAIX3P,EAAS6gB,EAAUlB,EAAU,OAAO,OAAS,EAC9C,GAAKe,EACJ,OAAO,KAGR,IADAA,EAAU,GACF/Q,EAAQ3P,EAAQ2P,IACvBgQ,EAAU,OAAQhQ,CAAM,EAAE,IAAK,CAAE,EAIlC,OAAKkR,GACJpQ,EAAS,WAAYpR,EAAM,CAAEsgB,EAAW,EAAG,CAAE,CAAE,EAC/ClP,EAAS,YAAapR,EAAM,CAAEsgB,EAAWkB,CAAQ,CAAE,GAEnDpQ,EAAS,WAAYpR,EAAM,CAAEsgB,EAAWkB,CAAQ,CAAE,EAE5C,IACR,CACD,CAAE,EACFlI,EAAQgH,EAAU,MAInB,IAFAY,GAAY5H,EAAOgH,EAAU,KAAK,aAAc,EAExChQ,EAAQ3P,EAAQ2P,IAEvB,GADAjH,EAASkX,GAAU,WAAYjQ,CAAM,EAAE,KAAMgQ,EAAWtgB,EAAMsZ,EAAOgH,EAAU,IAAK,EAC/EjX,EACJ,OAAK1K,EAAY0K,EAAO,IAAK,IAC5B5J,EAAO,YAAa6gB,EAAU,KAAMA,EAAU,KAAK,KAAM,EAAE,KAC1DjX,EAAO,KAAK,KAAMA,CAAO,GAEpBA,EAIT,OAAA5J,EAAO,IAAK6Z,EAAO+G,GAAaC,CAAU,EAErC3hB,EAAY2hB,EAAU,KAAK,KAAM,GACrCA,EAAU,KAAK,MAAM,KAAMtgB,EAAMsgB,CAAU,EAI5CA,EACE,SAAUA,EAAU,KAAK,QAAS,EAClC,KAAMA,EAAU,KAAK,KAAMA,EAAU,KAAK,QAAS,EACnD,KAAMA,EAAU,KAAK,IAAK,EAC1B,OAAQA,EAAU,KAAK,MAAO,EAEhC7gB,EAAO,GAAG,MACTA,EAAO,OAAQ6hB,EAAM,CACpB,KAAMthB,EACN,KAAMsgB,EACN,MAAOA,EAAU,KAAK,KACvB,CAAE,CACH,EAEOA,CACR,CAEA7gB,EAAO,UAAYA,EAAO,OAAQ8gB,GAAW,CAE5C,SAAU,CACT,IAAK,CAAE,SAAUtM,EAAMxS,EAAQ,CAC9B,IAAI8T,EAAQ,KAAK,YAAatB,EAAMxS,CAAM,EAC1C,OAAA4T,GAAWE,EAAM,KAAMtB,EAAMc,GAAQ,KAAMtT,CAAM,EAAG8T,CAAM,EACnDA,CACR,CAAE,CACH,EAEA,QAAS,SAAU+D,EAAOvZ,EAAW,CAC/BpB,EAAY2a,CAAM,GACtBvZ,EAAWuZ,EACXA,EAAQ,CAAE,GAAI,GAEdA,EAAQA,EAAM,MAAO7J,EAAc,EAOpC,QAJIwE,EACH3D,EAAQ,EACR3P,EAAS2Y,EAAM,OAERhJ,EAAQ3P,EAAQ2P,IACvB2D,EAAOqF,EAAOhJ,CAAM,EACpBiQ,GAAU,SAAUtM,CAAK,EAAIsM,GAAU,SAAUtM,CAAK,GAAK,CAAC,EAC5DsM,GAAU,SAAUtM,CAAK,EAAE,QAASlU,CAAS,CAE/C,EAEA,WAAY,CAAEygB,EAAiB,EAE/B,UAAW,SAAUzgB,EAAU0hB,EAAU,CACnCA,EACJlB,GAAU,WAAW,QAASxgB,CAAS,EAEvCwgB,GAAU,WAAW,KAAMxgB,CAAS,CAEtC,CACD,CAAE,EAEFN,EAAO,MAAQ,SAAUiiB,EAAOlC,EAAQ7Y,EAAK,CAC5C,IAAIgb,EAAMD,GAAS,OAAOA,GAAU,SAAWjiB,EAAO,OAAQ,CAAC,EAAGiiB,CAAM,EAAI,CAC3E,SAAU/a,GAAM,CAACA,GAAM6Y,GACtB7gB,EAAY+iB,CAAM,GAAKA,EACxB,SAAUA,EACV,OAAQ/a,GAAM6Y,GAAUA,GAAU,CAAC7gB,EAAY6gB,CAAO,GAAKA,CAC5D,EAGA,OAAK/f,EAAO,GAAG,IACdkiB,EAAI,SAAW,EAGV,OAAOA,EAAI,UAAa,WACvBA,EAAI,YAAYliB,EAAO,GAAG,OAC9BkiB,EAAI,SAAWliB,EAAO,GAAG,OAAQkiB,EAAI,QAAS,EAG9CA,EAAI,SAAWliB,EAAO,GAAG,OAAO,WAM9BkiB,EAAI,OAAS,MAAQA,EAAI,QAAU,MACvCA,EAAI,MAAQ,MAIbA,EAAI,IAAMA,EAAI,SAEdA,EAAI,SAAW,UAAW,CACpBhjB,EAAYgjB,EAAI,GAAI,GACxBA,EAAI,IAAI,KAAM,IAAK,EAGfA,EAAI,OACRliB,EAAO,QAAS,KAAMkiB,EAAI,KAAM,CAElC,EAEOA,CACR,EAEAliB,EAAO,GAAG,OAAQ,CACjB,OAAQ,SAAUiiB,EAAOE,EAAIpC,EAAQzf,EAAW,CAG/C,OAAO,KAAK,OAAQqV,EAAmB,EAAE,IAAK,UAAW,CAAE,EAAE,KAAK,EAGhE,IAAI,EAAE,QAAS,CAAE,QAASwM,CAAG,EAAGF,EAAOlC,EAAQzf,CAAS,CAC3D,EACA,QAAS,SAAUkU,EAAMyN,EAAOlC,EAAQzf,EAAW,CAClD,IAAI8hB,EAAQpiB,EAAO,cAAewU,CAAK,EACtC6N,EAASriB,EAAO,MAAOiiB,EAAOlC,EAAQzf,CAAS,EAC/CgiB,EAAc,UAAW,CAGxB,IAAIhB,EAAOR,GAAW,KAAM9gB,EAAO,OAAQ,CAAC,EAAGwU,CAAK,EAAG6N,CAAO,GAGzDD,GAAS3N,EAAS,IAAK,KAAM,QAAS,IAC1C6M,EAAK,KAAM,EAAK,CAElB,EAED,OAAAgB,EAAY,OAASA,EAEdF,GAASC,EAAO,QAAU,GAChC,KAAK,KAAMC,CAAY,EACvB,KAAK,MAAOD,EAAO,MAAOC,CAAY,CACxC,EACA,KAAM,SAAUpgB,EAAMqgB,EAAYR,EAAU,CAC3C,IAAIS,EAAY,SAAUxN,EAAQ,CACjC,IAAIyN,EAAOzN,EAAM,KACjB,OAAOA,EAAM,KACbyN,EAAMV,CAAQ,CACf,EAEA,OAAK,OAAO7f,GAAS,WACpB6f,EAAUQ,EACVA,EAAargB,EACbA,EAAO,QAEHqgB,GACJ,KAAK,MAAOrgB,GAAQ,KAAM,CAAC,CAAE,EAGvB,KAAK,KAAM,UAAW,CAC5B,IAAIwgB,EAAU,GACb7R,EAAQ3O,GAAQ,MAAQA,EAAO,aAC/BygB,EAAS3iB,EAAO,OAChBuU,EAAOE,EAAS,IAAK,IAAK,EAE3B,GAAK5D,EACC0D,EAAM1D,CAAM,GAAK0D,EAAM1D,CAAM,EAAE,MACnC2R,EAAWjO,EAAM1D,CAAM,CAAE,MAG1B,KAAMA,KAAS0D,EACTA,EAAM1D,CAAM,GAAK0D,EAAM1D,CAAM,EAAE,MAAQyP,GAAK,KAAMzP,CAAM,GAC5D2R,EAAWjO,EAAM1D,CAAM,CAAE,EAK5B,IAAMA,EAAQ8R,EAAO,OAAQ9R,KACvB8R,EAAQ9R,CAAM,EAAE,OAAS,OAC3B3O,GAAQ,MAAQygB,EAAQ9R,CAAM,EAAE,QAAU3O,KAE5CygB,EAAQ9R,CAAM,EAAE,KAAK,KAAMkR,CAAQ,EACnCW,EAAU,GACVC,EAAO,OAAQ9R,EAAO,CAAE,IAOrB6R,GAAW,CAACX,IAChB/hB,EAAO,QAAS,KAAMkC,CAAK,CAE7B,CAAE,CACH,EACA,OAAQ,SAAUA,EAAO,CACxB,OAAKA,IAAS,KACbA,EAAOA,GAAQ,MAET,KAAK,KAAM,UAAW,CAC5B,IAAI2O,EACH0D,EAAOE,EAAS,IAAK,IAAK,EAC1BhE,EAAQ8D,EAAMrS,EAAO,OAAQ,EAC7B8S,EAAQT,EAAMrS,EAAO,YAAa,EAClCygB,EAAS3iB,EAAO,OAChBkB,EAASuP,EAAQA,EAAM,OAAS,EAajC,IAVA8D,EAAK,OAAS,GAGdvU,EAAO,MAAO,KAAMkC,EAAM,CAAC,CAAE,EAExB8S,GAASA,EAAM,MACnBA,EAAM,KAAK,KAAM,KAAM,EAAK,EAIvBnE,EAAQ8R,EAAO,OAAQ9R,KACvB8R,EAAQ9R,CAAM,EAAE,OAAS,MAAQ8R,EAAQ9R,CAAM,EAAE,QAAU3O,IAC/DygB,EAAQ9R,CAAM,EAAE,KAAK,KAAM,EAAK,EAChC8R,EAAO,OAAQ9R,EAAO,CAAE,GAK1B,IAAMA,EAAQ,EAAGA,EAAQ3P,EAAQ2P,IAC3BJ,EAAOI,CAAM,GAAKJ,EAAOI,CAAM,EAAE,QACrCJ,EAAOI,CAAM,EAAE,OAAO,KAAM,IAAK,EAKnC,OAAO0D,EAAK,MACb,CAAE,CACH,CACD,CAAE,EAEFvU,EAAO,KAAM,CAAE,SAAU,OAAQ,MAAO,EAAG,SAAUiC,EAAIrB,EAAO,CAC/D,IAAIgiB,EAAQ5iB,EAAO,GAAIY,CAAK,EAC5BZ,EAAO,GAAIY,CAAK,EAAI,SAAUqhB,EAAOlC,EAAQzf,EAAW,CACvD,OAAO2hB,GAAS,MAAQ,OAAOA,GAAU,UACxCW,EAAM,MAAO,KAAM,SAAU,EAC7B,KAAK,QAASnC,GAAO7f,EAAM,EAAK,EAAGqhB,EAAOlC,EAAQzf,CAAS,CAC7D,CACD,CAAE,EAGFN,EAAO,KAAM,CACZ,UAAWygB,GAAO,MAAO,EACzB,QAASA,GAAO,MAAO,EACvB,YAAaA,GAAO,QAAS,EAC7B,OAAQ,CAAE,QAAS,MAAO,EAC1B,QAAS,CAAE,QAAS,MAAO,EAC3B,WAAY,CAAE,QAAS,QAAS,CACjC,EAAG,SAAU7f,EAAMiZ,EAAQ,CAC1B7Z,EAAO,GAAIY,CAAK,EAAI,SAAUqhB,EAAOlC,EAAQzf,EAAW,CACvD,OAAO,KAAK,QAASuZ,EAAOoI,EAAOlC,EAAQzf,CAAS,CACrD,CACD,CAAE,EAEFN,EAAO,OAAS,CAAC,EACjBA,EAAO,GAAG,KAAO,UAAW,CAC3B,IAAI6iB,EACHljB,EAAI,EACJgjB,EAAS3iB,EAAO,OAIjB,IAFAmgB,GAAQ,KAAK,IAAI,EAETxgB,EAAIgjB,EAAO,OAAQhjB,IAC1BkjB,EAAQF,EAAQhjB,CAAE,EAGb,CAACkjB,EAAM,GAAKF,EAAQhjB,CAAE,IAAMkjB,GAChCF,EAAO,OAAQhjB,IAAK,CAAE,EAIlBgjB,EAAO,QACZ3iB,EAAO,GAAG,KAAK,EAEhBmgB,GAAQ,MACT,EAEAngB,EAAO,GAAG,MAAQ,SAAU6iB,EAAQ,CACnC7iB,EAAO,OAAO,KAAM6iB,CAAM,EAC1B7iB,EAAO,GAAG,MAAM,CACjB,EAEAA,EAAO,GAAG,SAAW,GACrBA,EAAO,GAAG,MAAQ,UAAW,CACvBogB,KAILA,GAAa,GACbG,GAAS,EACV,EAEAvgB,EAAO,GAAG,KAAO,UAAW,CAC3BogB,GAAa,IACd,EAEApgB,EAAO,GAAG,OAAS,CAClB,KAAM,IACN,KAAM,IAGN,SAAU,GACX,EAIAA,EAAO,GAAG,MAAQ,SAAU8iB,EAAM5gB,EAAO,CACxC,OAAA4gB,EAAO9iB,EAAO,IAAKA,EAAO,GAAG,OAAQ8iB,CAAK,GAAKA,EAC/C5gB,EAAOA,GAAQ,KAER,KAAK,MAAOA,EAAM,SAAU+S,EAAMD,EAAQ,CAChD,IAAI+N,EAAU5kB,EAAO,WAAY8W,EAAM6N,CAAK,EAC5C9N,EAAM,KAAO,UAAW,CACvB7W,EAAO,aAAc4kB,CAAQ,CAC9B,CACD,CAAE,CACH,GAGE,UAAW,CACZ,IAAIra,EAAQrJ,EAAS,cAAe,OAAQ,EAC3CoD,EAASpD,EAAS,cAAe,QAAS,EAC1C6iB,EAAMzf,EAAO,YAAapD,EAAS,cAAe,QAAS,CAAE,EAE9DqJ,EAAM,KAAO,WAIbzJ,EAAQ,QAAUyJ,EAAM,QAAU,GAIlCzJ,EAAQ,YAAcijB,EAAI,SAI1BxZ,EAAQrJ,EAAS,cAAe,OAAQ,EACxCqJ,EAAM,MAAQ,IACdA,EAAM,KAAO,QACbzJ,EAAQ,WAAayJ,EAAM,QAAU,GACtC,GAAI,EAGJ,IAAIsa,GACHC,GAAajjB,EAAO,KAAK,WAE1BA,EAAO,GAAG,OAAQ,CACjB,KAAM,SAAUY,EAAMoB,EAAQ,CAC7B,OAAOuR,GAAQ,KAAMvT,EAAO,KAAMY,EAAMoB,EAAO,UAAU,OAAS,CAAE,CACrE,EAEA,WAAY,SAAUpB,EAAO,CAC5B,OAAO,KAAK,KAAM,UAAW,CAC5BZ,EAAO,WAAY,KAAMY,CAAK,CAC/B,CAAE,CACH,CACD,CAAE,EAEFZ,EAAO,OAAQ,CACd,KAAM,SAAUO,EAAMK,EAAMoB,EAAQ,CACnC,IAAI3B,EAAK2U,EACRkO,EAAQ3iB,EAAK,SAGd,GAAK,EAAA2iB,IAAU,GAAKA,IAAU,GAAKA,IAAU,GAK7C,IAAK,OAAO3iB,EAAK,cAAiB,YACjC,OAAOP,EAAO,KAAMO,EAAMK,EAAMoB,CAAM,EAUvC,IALKkhB,IAAU,GAAK,CAACljB,EAAO,SAAUO,CAAK,KAC1CyU,EAAQhV,EAAO,UAAWY,EAAK,YAAY,CAAE,IAC1CZ,EAAO,KAAK,MAAM,KAAK,KAAMY,CAAK,EAAIoiB,GAAW,SAGhDhhB,IAAU,OAAY,CAC1B,GAAKA,IAAU,KAAO,CACrBhC,EAAO,WAAYO,EAAMK,CAAK,EAC9B,MACD,CAEA,OAAKoU,GAAS,QAASA,IACpB3U,EAAM2U,EAAM,IAAKzU,EAAMyB,EAAOpB,CAAK,KAAQ,OACtCP,GAGRE,EAAK,aAAcK,EAAMoB,EAAQ,EAAG,EAC7BA,EACR,CAEA,OAAKgT,GAAS,QAASA,IAAW3U,EAAM2U,EAAM,IAAKzU,EAAMK,CAAK,KAAQ,KAC9DP,GAGRA,EAAML,EAAO,KAAK,KAAMO,EAAMK,CAAK,EAG5BP,GAAO,KAAO,OAAYA,GAClC,EAEA,UAAW,CACV,KAAM,CACL,IAAK,SAAUE,EAAMyB,EAAQ,CAC5B,GAAK,CAAC/C,EAAQ,YAAc+C,IAAU,SACrCwH,GAAUjJ,EAAM,OAAQ,EAAI,CAC5B,IAAIX,EAAMW,EAAK,MACf,OAAAA,EAAK,aAAc,OAAQyB,CAAM,EAC5BpC,IACJW,EAAK,MAAQX,GAEPoC,CACR,CACD,CACD,CACD,EAEA,WAAY,SAAUzB,EAAMyB,EAAQ,CACnC,IAAIpB,EACHjB,EAAI,EAIJwjB,EAAYnhB,GAASA,EAAM,MAAOgO,EAAc,EAEjD,GAAKmT,GAAa5iB,EAAK,WAAa,EACnC,KAAUK,EAAOuiB,EAAWxjB,GAAI,GAC/BY,EAAK,gBAAiBK,CAAK,CAG9B,CACD,CAAE,EAGFoiB,GAAW,CACV,IAAK,SAAUziB,EAAMyB,EAAOpB,EAAO,CAClC,OAAKoB,IAAU,GAGdhC,EAAO,WAAYO,EAAMK,CAAK,EAE9BL,EAAK,aAAcK,EAAMA,CAAK,EAExBA,CACR,CACD,EAEAZ,EAAO,KAAMA,EAAO,KAAK,MAAM,KAAK,OAAO,MAAO,MAAO,EAAG,SAAUiC,EAAIrB,EAAO,CAChF,IAAIwiB,EAASH,GAAYriB,CAAK,GAAKZ,EAAO,KAAK,KAE/CijB,GAAYriB,CAAK,EAAI,SAAUL,EAAMK,EAAM0B,EAAQ,CAClD,IAAIjC,EAAKuZ,EACRyJ,EAAgBziB,EAAK,YAAY,EAElC,OAAM0B,IAGLsX,EAASqJ,GAAYI,CAAc,EACnCJ,GAAYI,CAAc,EAAIhjB,EAC9BA,EAAM+iB,EAAQ7iB,EAAMK,EAAM0B,CAAM,GAAK,KACpC+gB,EACA,KACDJ,GAAYI,CAAc,EAAIzJ,GAExBvZ,CACR,CACD,CAAE,EAKF,IAAIijB,GAAa,sCAChBC,GAAa,gBAEdvjB,EAAO,GAAG,OAAQ,CACjB,KAAM,SAAUY,EAAMoB,EAAQ,CAC7B,OAAOuR,GAAQ,KAAMvT,EAAO,KAAMY,EAAMoB,EAAO,UAAU,OAAS,CAAE,CACrE,EAEA,WAAY,SAAUpB,EAAO,CAC5B,OAAO,KAAK,KAAM,UAAW,CAC5B,OAAO,KAAMZ,EAAO,QAASY,CAAK,GAAKA,CAAK,CAC7C,CAAE,CACH,CACD,CAAE,EAEFZ,EAAO,OAAQ,CACd,KAAM,SAAUO,EAAMK,EAAMoB,EAAQ,CACnC,IAAI3B,EAAK2U,EACRkO,EAAQ3iB,EAAK,SAGd,GAAK,EAAA2iB,IAAU,GAAKA,IAAU,GAAKA,IAAU,GAW7C,OAPKA,IAAU,GAAK,CAACljB,EAAO,SAAUO,CAAK,KAG1CK,EAAOZ,EAAO,QAASY,CAAK,GAAKA,EACjCoU,EAAQhV,EAAO,UAAWY,CAAK,GAG3BoB,IAAU,OACTgT,GAAS,QAASA,IACpB3U,EAAM2U,EAAM,IAAKzU,EAAMyB,EAAOpB,CAAK,KAAQ,OACtCP,EAGCE,EAAMK,CAAK,EAAIoB,EAGpBgT,GAAS,QAASA,IAAW3U,EAAM2U,EAAM,IAAKzU,EAAMK,CAAK,KAAQ,KAC9DP,EAGDE,EAAMK,CAAK,CACnB,EAEA,UAAW,CACV,SAAU,CACT,IAAK,SAAUL,EAAO,CAMrB,IAAIijB,EAAWxjB,EAAO,KAAK,KAAMO,EAAM,UAAW,EAElD,OAAKijB,EACG,SAAUA,EAAU,EAAG,EAI9BF,GAAW,KAAM/iB,EAAK,QAAS,GAC/BgjB,GAAW,KAAMhjB,EAAK,QAAS,GAC/BA,EAAK,KAEE,EAGD,EACR,CACD,CACD,EAEA,QAAS,CACR,IAAO,UACP,MAAS,WACV,CACD,CAAE,EAUItB,EAAQ,cACbe,EAAO,UAAU,SAAW,CAC3B,IAAK,SAAUO,EAAO,CAIrB,IAAImK,EAASnK,EAAK,WAClB,OAAKmK,GAAUA,EAAO,YACrBA,EAAO,WAAW,cAEZ,IACR,EACA,IAAK,SAAUnK,EAAO,CAIrB,IAAImK,EAASnK,EAAK,WACbmK,IACJA,EAAO,cAEFA,EAAO,YACXA,EAAO,WAAW,cAGrB,CACD,GAGD1K,EAAO,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,iBACD,EAAG,UAAW,CACbA,EAAO,QAAS,KAAK,YAAY,CAAE,EAAI,IACxC,CAAE,EAOD,SAASyjB,GAAkBzhB,EAAQ,CAClC,IAAI0J,EAAS1J,EAAM,MAAOgO,EAAc,GAAK,CAAC,EAC9C,OAAOtE,EAAO,KAAM,GAAI,CACzB,CAGD,SAASgY,GAAUnjB,EAAO,CACzB,OAAOA,EAAK,cAAgBA,EAAK,aAAc,OAAQ,GAAK,EAC7D,CAEA,SAASojB,GAAgB3hB,EAAQ,CAChC,OAAK,MAAM,QAASA,CAAM,EAClBA,EAEH,OAAOA,GAAU,SACdA,EAAM,MAAOgO,EAAc,GAAK,CAAC,EAElC,CAAC,CACT,CAEAhQ,EAAO,GAAG,OAAQ,CACjB,SAAU,SAAUgC,EAAQ,CAC3B,IAAI4hB,EAAYnc,EAAKoc,EAAUpb,EAAW9I,EAAGmkB,EAE7C,OAAK5kB,EAAY8C,CAAM,EACf,KAAK,KAAM,SAAUtB,EAAI,CAC/BV,EAAQ,IAAK,EAAE,SAAUgC,EAAM,KAAM,KAAMtB,EAAGgjB,GAAU,IAAK,CAAE,CAAE,CAClE,CAAE,GAGHE,EAAaD,GAAgB3hB,CAAM,EAE9B4hB,EAAW,OACR,KAAK,KAAM,UAAW,CAI5B,GAHAC,EAAWH,GAAU,IAAK,EAC1Bjc,EAAM,KAAK,WAAa,GAAO,IAAMgc,GAAkBI,CAAS,EAAI,IAE/Dpc,EAAM,CACV,IAAM9H,EAAI,EAAGA,EAAIikB,EAAW,OAAQjkB,IACnC8I,EAAYmb,EAAYjkB,CAAE,EACrB8H,EAAI,QAAS,IAAMgB,EAAY,GAAI,EAAI,IAC3ChB,GAAOgB,EAAY,KAKrBqb,EAAaL,GAAkBhc,CAAI,EAC9Boc,IAAaC,GACjB,KAAK,aAAc,QAASA,CAAW,CAEzC,CACD,CAAE,EAGI,KACR,EAEA,YAAa,SAAU9hB,EAAQ,CAC9B,IAAI4hB,EAAYnc,EAAKoc,EAAUpb,EAAW9I,EAAGmkB,EAE7C,OAAK5kB,EAAY8C,CAAM,EACf,KAAK,KAAM,SAAUtB,EAAI,CAC/BV,EAAQ,IAAK,EAAE,YAAagC,EAAM,KAAM,KAAMtB,EAAGgjB,GAAU,IAAK,CAAE,CAAE,CACrE,CAAE,EAGG,UAAU,QAIhBE,EAAaD,GAAgB3hB,CAAM,EAE9B4hB,EAAW,OACR,KAAK,KAAM,UAAW,CAM5B,GALAC,EAAWH,GAAU,IAAK,EAG1Bjc,EAAM,KAAK,WAAa,GAAO,IAAMgc,GAAkBI,CAAS,EAAI,IAE/Dpc,EAAM,CACV,IAAM9H,EAAI,EAAGA,EAAIikB,EAAW,OAAQjkB,IAInC,IAHA8I,EAAYmb,EAAYjkB,CAAE,EAGlB8H,EAAI,QAAS,IAAMgB,EAAY,GAAI,EAAI,IAC9ChB,EAAMA,EAAI,QAAS,IAAMgB,EAAY,IAAK,GAAI,EAKhDqb,EAAaL,GAAkBhc,CAAI,EAC9Boc,IAAaC,GACjB,KAAK,aAAc,QAASA,CAAW,CAEzC,CACD,CAAE,EAGI,MA/BC,KAAK,KAAM,QAAS,EAAG,CAgChC,EAEA,YAAa,SAAU9hB,EAAO+hB,EAAW,CACxC,IAAIH,EAAYnb,EAAW9I,EAAG2P,EAC7BpN,EAAO,OAAOF,EACdgiB,EAAe9hB,IAAS,UAAY,MAAM,QAASF,CAAM,EAE1D,OAAK9C,EAAY8C,CAAM,EACf,KAAK,KAAM,SAAUrC,EAAI,CAC/BK,EAAQ,IAAK,EAAE,YACdgC,EAAM,KAAM,KAAMrC,EAAG+jB,GAAU,IAAK,EAAGK,CAAS,EAChDA,CACD,CACD,CAAE,EAGE,OAAOA,GAAa,WAAaC,EAC9BD,EAAW,KAAK,SAAU/hB,CAAM,EAAI,KAAK,YAAaA,CAAM,GAGpE4hB,EAAaD,GAAgB3hB,CAAM,EAE5B,KAAK,KAAM,UAAW,CAC5B,GAAKgiB,EAKJ,IAFA1U,EAAOtP,EAAQ,IAAK,EAEdL,EAAI,EAAGA,EAAIikB,EAAW,OAAQjkB,IACnC8I,EAAYmb,EAAYjkB,CAAE,EAGrB2P,EAAK,SAAU7G,CAAU,EAC7B6G,EAAK,YAAa7G,CAAU,EAE5B6G,EAAK,SAAU7G,CAAU,OAKhBzG,IAAU,QAAaE,IAAS,aAC3CuG,EAAYib,GAAU,IAAK,EACtBjb,GAGJgM,EAAS,IAAK,KAAM,gBAAiBhM,CAAU,EAO3C,KAAK,cACT,KAAK,aAAc,QAClBA,GAAazG,IAAU,GACtB,GACAyS,EAAS,IAAK,KAAM,eAAgB,GAAK,EAC3C,EAGH,CAAE,EACH,EAEA,SAAU,SAAUxU,EAAW,CAC9B,IAAIwI,EAAWlI,EACdZ,EAAI,EAGL,IADA8I,EAAY,IAAMxI,EAAW,IACnBM,EAAO,KAAMZ,GAAI,GAC1B,GAAKY,EAAK,WAAa,IACpB,IAAMkjB,GAAkBC,GAAUnjB,CAAK,CAAE,EAAI,KAAM,QAASkI,CAAU,EAAI,GAC5E,MAAO,GAIT,MAAO,EACR,CACD,CAAE,EAKF,IAAIwb,GAAU,MAEdjkB,EAAO,GAAG,OAAQ,CACjB,IAAK,SAAUgC,EAAQ,CACtB,IAAIgT,EAAO3U,EAAK8a,EACf5a,EAAO,KAAM,CAAE,EAEhB,OAAM,UAAU,QA0BhB4a,EAAkBjc,EAAY8C,CAAM,EAE7B,KAAK,KAAM,SAAUrC,EAAI,CAC/B,IAAIC,EAEC,KAAK,WAAa,IAIlBub,EACJvb,EAAMoC,EAAM,KAAM,KAAMrC,EAAGK,EAAQ,IAAK,EAAE,IAAI,CAAE,EAEhDJ,EAAMoC,EAIFpC,GAAO,KACXA,EAAM,GAEK,OAAOA,GAAQ,SAC1BA,GAAO,GAEI,MAAM,QAASA,CAAI,IAC9BA,EAAMI,EAAO,IAAKJ,EAAK,SAAUoC,EAAQ,CACxC,OAAOA,GAAS,KAAO,GAAKA,EAAQ,EACrC,CAAE,GAGHgT,EAAQhV,EAAO,SAAU,KAAK,IAAK,GAAKA,EAAO,SAAU,KAAK,SAAS,YAAY,CAAE,GAGhF,CAACgV,GAAS,EAAG,QAASA,IAAWA,EAAM,IAAK,KAAMpV,EAAK,OAAQ,IAAM,UACzE,KAAK,MAAQA,GAEf,CAAE,GA3DIW,GACJyU,EAAQhV,EAAO,SAAUO,EAAK,IAAK,GAClCP,EAAO,SAAUO,EAAK,SAAS,YAAY,CAAE,EAEzCyU,GACJ,QAASA,IACP3U,EAAM2U,EAAM,IAAKzU,EAAM,OAAQ,KAAQ,OAElCF,GAGRA,EAAME,EAAK,MAGN,OAAOF,GAAQ,SACZA,EAAI,QAAS4jB,GAAS,EAAG,EAI1B5jB,GAAO,KAAO,GAAKA,IAG3B,MAsCF,CACD,CAAE,EAEFL,EAAO,OAAQ,CACd,SAAU,CACT,OAAQ,CACP,IAAK,SAAUO,EAAO,CAErB,IAAIX,EAAMI,EAAO,KAAK,KAAMO,EAAM,OAAQ,EAC1C,OAAOX,GAAO,KACbA,EAMA6jB,GAAkBzjB,EAAO,KAAMO,CAAK,CAAE,CACxC,CACD,EACA,OAAQ,CACP,IAAK,SAAUA,EAAO,CACrB,IAAIyB,EAAOkiB,EAAQvkB,EAClBgB,EAAUJ,EAAK,QACfsQ,EAAQtQ,EAAK,cACb6X,EAAM7X,EAAK,OAAS,aACpBoW,EAASyB,EAAM,KAAO,CAAC,EACvB+L,EAAM/L,EAAMvH,EAAQ,EAAIlQ,EAAQ,OAUjC,IARKkQ,EAAQ,EACZlR,EAAIwkB,EAGJxkB,EAAIyY,EAAMvH,EAAQ,EAIXlR,EAAIwkB,EAAKxkB,IAKhB,GAJAukB,EAASvjB,EAAShB,CAAE,GAIbukB,EAAO,UAAYvkB,IAAMkR,IAG9B,CAACqT,EAAO,WACN,CAACA,EAAO,WAAW,UACpB,CAAC1a,GAAU0a,EAAO,WAAY,UAAW,GAAM,CAMjD,GAHAliB,EAAQhC,EAAQkkB,CAAO,EAAE,IAAI,EAGxB9L,EACJ,OAAOpW,EAIR2U,EAAO,KAAM3U,CAAM,CACpB,CAGD,OAAO2U,CACR,EAEA,IAAK,SAAUpW,EAAMyB,EAAQ,CAM5B,QALIoiB,EAAWF,EACdvjB,EAAUJ,EAAK,QACfoW,EAAS3W,EAAO,UAAWgC,CAAM,EACjCrC,EAAIgB,EAAQ,OAELhB,KACPukB,EAASvjB,EAAShB,CAAE,GAIfukB,EAAO,SACXlkB,EAAO,QAASA,EAAO,SAAS,OAAO,IAAKkkB,CAAO,EAAGvN,CAAO,EAAI,MAEjEyN,EAAY,IAOd,OAAMA,IACL7jB,EAAK,cAAgB,IAEfoW,CACR,CACD,CACD,CACD,CAAE,EAGF3W,EAAO,KAAM,CAAE,QAAS,UAAW,EAAG,UAAW,CAChDA,EAAO,SAAU,IAAK,EAAI,CACzB,IAAK,SAAUO,EAAMyB,EAAQ,CAC5B,GAAK,MAAM,QAASA,CAAM,EACzB,OAASzB,EAAK,QAAUP,EAAO,QAASA,EAAQO,CAAK,EAAE,IAAI,EAAGyB,CAAM,EAAI,EAE1E,CACD,EACM/C,EAAQ,UACbe,EAAO,SAAU,IAAK,EAAE,IAAM,SAAUO,EAAO,CAC9C,OAAOA,EAAK,aAAc,OAAQ,IAAM,KAAO,KAAOA,EAAK,KAC5D,EAEF,CAAE,EAQFtB,EAAQ,QAAU,cAAed,EAGjC,IAAIkmB,GAAc,kCACjBC,GAA0B,SAAUre,EAAI,CACvCA,EAAE,gBAAgB,CACnB,EAEDjG,EAAO,OAAQA,EAAO,MAAO,CAE5B,QAAS,SAAUsY,EAAO/D,EAAMhU,EAAMgkB,EAAe,CAEpD,IAAI5kB,EAAG8H,EAAKe,EAAKgc,EAAYC,EAAQ7K,EAAQvH,EAASqS,EACrDC,EAAY,CAAEpkB,GAAQlB,CAAS,EAC/B6C,EAAOpD,EAAO,KAAMwZ,EAAO,MAAO,EAAIA,EAAM,KAAOA,EACnDO,GAAa/Z,EAAO,KAAMwZ,EAAO,WAAY,EAAIA,EAAM,UAAU,MAAO,GAAI,EAAI,CAAC,EAKlF,GAHA7Q,EAAMid,EAAclc,EAAMjI,EAAOA,GAAQlB,EAGpC,EAAAkB,EAAK,WAAa,GAAKA,EAAK,WAAa,IAKzC,CAAA8jB,GAAY,KAAMniB,EAAOlC,EAAO,MAAM,SAAU,IAIhDkC,EAAK,QAAS,GAAI,EAAI,KAG1B2W,GAAa3W,EAAK,MAAO,GAAI,EAC7BA,EAAO2W,GAAW,MAAM,EACxBA,GAAW,KAAK,GAEjB4L,EAASviB,EAAK,QAAS,GAAI,EAAI,GAAK,KAAOA,EAG3CoW,EAAQA,EAAOtY,EAAO,OAAQ,EAC7BsY,EACA,IAAItY,EAAO,MAAOkC,EAAM,OAAOoW,GAAU,UAAYA,CAAM,EAG5DA,EAAM,UAAYiM,EAAe,EAAI,EACrCjM,EAAM,UAAYO,GAAW,KAAM,GAAI,EACvCP,EAAM,WAAaA,EAAM,UACxB,IAAI,OAAQ,UAAYO,GAAW,KAAM,eAAgB,EAAI,SAAU,EACvE,KAGDP,EAAM,OAAS,OACTA,EAAM,SACXA,EAAM,OAAS/X,GAIhBgU,EAAOA,GAAQ,KACd,CAAE+D,CAAM,EACRtY,EAAO,UAAWuU,EAAM,CAAE+D,CAAM,CAAE,EAGnCjG,EAAUrS,EAAO,MAAM,QAASkC,CAAK,GAAK,CAAC,EACtC,GAACqiB,GAAgBlS,EAAQ,SAAWA,EAAQ,QAAQ,MAAO9R,EAAMgU,CAAK,IAAM,KAMjF,IAAK,CAACgQ,GAAgB,CAAClS,EAAQ,UAAY,CAACjT,EAAUmB,CAAK,EAAI,CAM9D,IAJAikB,EAAanS,EAAQ,cAAgBnQ,EAC/BmiB,GAAY,KAAMG,EAAatiB,CAAK,IACzCuF,EAAMA,EAAI,YAEHA,EAAKA,EAAMA,EAAI,WACtBkd,EAAU,KAAMld,CAAI,EACpBe,EAAMf,EAIFe,KAAUjI,EAAK,eAAiBlB,IACpCslB,EAAU,KAAMnc,EAAI,aAAeA,EAAI,cAAgBrK,CAAO,CAEhE,CAIA,IADAwB,EAAI,GACM8H,EAAMkd,EAAWhlB,GAAI,IAAO,CAAC2Y,EAAM,qBAAqB,GACjEoM,EAAcjd,EACd6Q,EAAM,KAAO3Y,EAAI,EAChB6kB,EACAnS,EAAQ,UAAYnQ,EAGrB0X,GAAWnF,EAAS,IAAKhN,EAAK,QAAS,GAAK,OAAO,OAAQ,IAAK,GAAK6Q,EAAM,IAAK,GAC/E7D,EAAS,IAAKhN,EAAK,QAAS,EACxBmS,GACJA,EAAO,MAAOnS,EAAK8M,CAAK,EAIzBqF,EAAS6K,GAAUhd,EAAKgd,CAAO,EAC1B7K,GAAUA,EAAO,OAASxF,EAAY3M,CAAI,IAC9C6Q,EAAM,OAASsB,EAAO,MAAOnS,EAAK8M,CAAK,EAClC+D,EAAM,SAAW,IACrBA,EAAM,eAAe,GAIxB,OAAAA,EAAM,KAAOpW,EAGR,CAACqiB,GAAgB,CAACjM,EAAM,mBAAmB,IAExC,CAACjG,EAAQ,UACfA,EAAQ,SAAS,MAAOsS,EAAU,IAAI,EAAGpQ,CAAK,IAAM,KACpDH,EAAY7T,CAAK,GAIZkkB,GAAUvlB,EAAYqB,EAAM2B,CAAK,CAAE,GAAK,CAAC9C,EAAUmB,CAAK,IAG5DiI,EAAMjI,EAAMkkB,CAAO,EAEdjc,IACJjI,EAAMkkB,CAAO,EAAI,MAIlBzkB,EAAO,MAAM,UAAYkC,EAEpBoW,EAAM,qBAAqB,GAC/BoM,EAAY,iBAAkBxiB,EAAMoiB,EAAwB,EAG7D/jB,EAAM2B,CAAK,EAAE,EAERoW,EAAM,qBAAqB,GAC/BoM,EAAY,oBAAqBxiB,EAAMoiB,EAAwB,EAGhEtkB,EAAO,MAAM,UAAY,OAEpBwI,IACJjI,EAAMkkB,CAAO,EAAIjc,IAMd8P,EAAM,OACd,EAIA,SAAU,SAAUpW,EAAM3B,EAAM+X,EAAQ,CACvC,IAAIrS,EAAIjG,EAAO,OACd,IAAIA,EAAO,MACXsY,EACA,CACC,KAAMpW,EACN,YAAa,EACd,CACD,EAEAlC,EAAO,MAAM,QAASiG,EAAG,KAAM1F,CAAK,CACrC,CAED,CAAE,EAEFP,EAAO,GAAG,OAAQ,CAEjB,QAAS,SAAUkC,EAAMqS,EAAO,CAC/B,OAAO,KAAK,KAAM,UAAW,CAC5BvU,EAAO,MAAM,QAASkC,EAAMqS,EAAM,IAAK,CACxC,CAAE,CACH,EACA,eAAgB,SAAUrS,EAAMqS,EAAO,CACtC,IAAIhU,EAAO,KAAM,CAAE,EACnB,GAAKA,EACJ,OAAOP,EAAO,MAAM,QAASkC,EAAMqS,EAAMhU,EAAM,EAAK,CAEtD,CACD,CAAE,EAWItB,EAAQ,SACbe,EAAO,KAAM,CAAE,MAAO,UAAW,KAAM,UAAW,EAAG,SAAU+Z,EAAMC,EAAM,CAG1E,IAAIzS,EAAU,SAAU+Q,EAAQ,CAC/BtY,EAAO,MAAM,SAAUga,EAAK1B,EAAM,OAAQtY,EAAO,MAAM,IAAKsY,CAAM,CAAE,CACrE,EAEAtY,EAAO,MAAM,QAASga,CAAI,EAAI,CAC7B,MAAO,UAAW,CAIjB,IAAIta,EAAM,KAAK,eAAiB,KAAK,UAAY,KAChDklB,EAAWnQ,EAAS,OAAQ/U,EAAKsa,CAAI,EAEhC4K,GACLllB,EAAI,iBAAkBqa,EAAMxS,EAAS,EAAK,EAE3CkN,EAAS,OAAQ/U,EAAKsa,GAAO4K,GAAY,GAAM,CAAE,CAClD,EACA,SAAU,UAAW,CACpB,IAAIllB,EAAM,KAAK,eAAiB,KAAK,UAAY,KAChDklB,EAAWnQ,EAAS,OAAQ/U,EAAKsa,CAAI,EAAI,EAEpC4K,EAKLnQ,EAAS,OAAQ/U,EAAKsa,EAAK4K,CAAS,GAJpCllB,EAAI,oBAAqBqa,EAAMxS,EAAS,EAAK,EAC7CkN,EAAS,OAAQ/U,EAAKsa,CAAI,EAK5B,CACD,CACD,CAAE,EAEH,IAAI6K,GAAW1mB,EAAO,SAElB2mB,GAAQ,CAAE,KAAM,KAAK,IAAI,CAAE,EAE3BC,GAAW,KAKf/kB,EAAO,SAAW,SAAUuU,EAAO,CAClC,IAAInK,EAAK4a,EACT,GAAK,CAACzQ,GAAQ,OAAOA,GAAS,SAC7B,OAAO,KAKR,GAAI,CACHnK,EAAQ,IAAIjM,EAAO,UAAU,EAAI,gBAAiBoW,EAAM,UAAW,CACpE,OAAUtO,EAAI,CAAC,CAEf,OAAA+e,EAAkB5a,GAAOA,EAAI,qBAAsB,aAAc,EAAG,CAAE,GACjE,CAACA,GAAO4a,IACZhlB,EAAO,MAAO,iBACbglB,EACChlB,EAAO,IAAKglB,EAAgB,WAAY,SAAU5d,EAAK,CACtD,OAAOA,EAAG,WACX,CAAE,EAAE,KAAM;AAAA,CAAK,EACfmN,EACA,EAEInK,CACR,EAGA,IACC6a,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa5F,EAAQtgB,EAAKmmB,EAAa1U,EAAM,CACrD,IAAIhQ,EAEJ,GAAK,MAAM,QAASzB,CAAI,EAGvBa,EAAO,KAAMb,EAAK,SAAUQ,EAAGoR,EAAI,CAC7BuU,GAAeL,GAAS,KAAMxF,CAAO,EAGzC7O,EAAK6O,EAAQ1O,CAAE,EAKfsU,GACC5F,EAAS,KAAQ,OAAO1O,GAAM,UAAYA,GAAK,KAAOpR,EAAI,IAAO,IACjEoR,EACAuU,EACA1U,CACD,CAEF,CAAE,UAES,CAAC0U,GAAexlB,EAAQX,CAAI,IAAM,SAG7C,IAAMyB,KAAQzB,EACbkmB,GAAa5F,EAAS,IAAM7e,EAAO,IAAKzB,EAAKyB,CAAK,EAAG0kB,EAAa1U,CAAI,OAMvEA,EAAK6O,EAAQtgB,CAAI,CAEnB,CAIAa,EAAO,MAAQ,SAAU6D,EAAGyhB,EAAc,CACzC,IAAI7F,EACH8F,EAAI,CAAC,EACL3U,EAAM,SAAU5J,EAAKwe,EAAkB,CAGtC,IAAIxjB,EAAQ9C,EAAYsmB,CAAgB,EACvCA,EAAgB,EAChBA,EAEDD,EAAGA,EAAE,MAAO,EAAI,mBAAoBve,CAAI,EAAI,IAC3C,mBAAoBhF,GAAS,KAAO,GAAKA,CAAM,CACjD,EAED,GAAK6B,GAAK,KACT,MAAO,GAIR,GAAK,MAAM,QAASA,CAAE,GAAOA,EAAE,QAAU,CAAC7D,EAAO,cAAe6D,CAAE,EAGjE7D,EAAO,KAAM6D,EAAG,UAAW,CAC1B+M,EAAK,KAAK,KAAM,KAAK,KAAM,CAC5B,CAAE,MAMF,KAAM6O,KAAU5b,EACfwhB,GAAa5F,EAAQ5b,EAAG4b,CAAO,EAAG6F,EAAa1U,CAAI,EAKrD,OAAO2U,EAAE,KAAM,GAAI,CACpB,EAEAvlB,EAAO,GAAG,OAAQ,CACjB,UAAW,UAAW,CACrB,OAAOA,EAAO,MAAO,KAAK,eAAe,CAAE,CAC5C,EACA,eAAgB,UAAW,CAC1B,OAAO,KAAK,IAAK,UAAW,CAG3B,IAAIkJ,EAAWlJ,EAAO,KAAM,KAAM,UAAW,EAC7C,OAAOkJ,EAAWlJ,EAAO,UAAWkJ,CAAS,EAAI,IAClD,CAAE,EAAE,OAAQ,UAAW,CACtB,IAAIhH,EAAO,KAAK,KAGhB,OAAO,KAAK,MAAQ,CAAClC,EAAQ,IAAK,EAAE,GAAI,WAAY,GACnDolB,GAAa,KAAM,KAAK,QAAS,GAAK,CAACD,GAAgB,KAAMjjB,CAAK,IAChE,KAAK,SAAW,CAAC0U,GAAe,KAAM1U,CAAK,EAC/C,CAAE,EAAE,IAAK,SAAUD,EAAI1B,EAAO,CAC7B,IAAIX,EAAMI,EAAQ,IAAK,EAAE,IAAI,EAE7B,OAAKJ,GAAO,KACJ,KAGH,MAAM,QAASA,CAAI,EAChBI,EAAO,IAAKJ,EAAK,SAAUA,EAAM,CACvC,MAAO,CAAE,KAAMW,EAAK,KAAM,MAAOX,EAAI,QAASslB,GAAO;AAAA,CAAO,CAAE,CAC/D,CAAE,EAGI,CAAE,KAAM3kB,EAAK,KAAM,MAAOX,EAAI,QAASslB,GAAO;AAAA,CAAO,CAAE,CAC/D,CAAE,EAAE,IAAI,CACT,CACD,CAAE,EAGF,IACCO,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAGXC,GAAiB,4DACjBC,GAAa,iBACbC,GAAY,QAWZC,GAAa,CAAC,EAOdC,GAAa,CAAC,EAGdC,GAAW,KAAK,OAAQ,GAAI,EAG5BC,GAAe9mB,EAAS,cAAe,GAAI,EAE5C8mB,GAAa,KAAOtB,GAAS,KAG7B,SAASuB,GAA6BC,EAAY,CAGjD,OAAO,SAAUC,EAAoB/U,EAAO,CAEtC,OAAO+U,GAAuB,WAClC/U,EAAO+U,EACPA,EAAqB,KAGtB,IAAIC,EACH5mB,EAAI,EACJ6mB,EAAYF,EAAmB,YAAY,EAAE,MAAOtW,EAAc,GAAK,CAAC,EAEzE,GAAK9Q,EAAYqS,CAAK,EAGrB,KAAUgV,EAAWC,EAAW7mB,GAAI,GAG9B4mB,EAAU,CAAE,IAAM,KACtBA,EAAWA,EAAS,MAAO,CAAE,GAAK,KAChCF,EAAWE,CAAS,EAAIF,EAAWE,CAAS,GAAK,CAAC,GAAI,QAAShV,CAAK,IAIpE8U,EAAWE,CAAS,EAAIF,EAAWE,CAAS,GAAK,CAAC,GAAI,KAAMhV,CAAK,CAIvE,CACD,CAGA,SAASkV,GAA+BJ,EAAW1lB,EAAS+lB,EAAiBC,EAAQ,CAEpF,IAAIC,EAAY,CAAC,EAChBC,EAAqBR,IAAcJ,GAEpC,SAASa,EAASP,EAAW,CAC5B,IAAIQ,EACJ,OAAAH,EAAWL,CAAS,EAAI,GACxBvmB,EAAO,KAAMqmB,EAAWE,CAAS,GAAK,CAAC,EAAG,SAAUpW,EAAG6W,EAAqB,CAC3E,IAAIC,EAAsBD,EAAoBrmB,EAAS+lB,EAAiBC,CAAM,EAC9E,GAAK,OAAOM,GAAwB,UACnC,CAACJ,GAAoB,CAACD,EAAWK,CAAoB,EAErD,OAAAtmB,EAAQ,UAAU,QAASsmB,CAAoB,EAC/CH,EAASG,CAAoB,EACtB,GACD,GAAKJ,EACX,MAAO,EAAGE,EAAWE,EAEvB,CAAE,EACKF,CACR,CAEA,OAAOD,EAASnmB,EAAQ,UAAW,CAAE,CAAE,GAAK,CAACimB,EAAW,GAAI,GAAKE,EAAS,GAAI,CAC/E,CAKA,SAASI,GAAYjmB,EAAQJ,EAAM,CAClC,IAAImG,EAAK7F,EACRgmB,EAAcnnB,EAAO,aAAa,aAAe,CAAC,EAEnD,IAAMgH,KAAOnG,EACPA,EAAKmG,CAAI,IAAM,UACjBmgB,EAAangB,CAAI,EAAI/F,EAAWE,IAAUA,EAAO,CAAC,IAAS6F,CAAI,EAAInG,EAAKmG,CAAI,GAGhF,OAAK7F,GACJnB,EAAO,OAAQ,GAAMiB,EAAQE,CAAK,EAG5BF,CACR,CAMA,SAASmmB,GAAqB7B,EAAGoB,EAAOU,EAAY,CAOnD,QALIC,EAAIplB,EAAMqlB,EAAeC,EAC5BC,EAAWlC,EAAE,SACbiB,EAAYjB,EAAE,UAGPiB,EAAW,CAAE,IAAM,KAC1BA,EAAU,MAAM,EACXc,IAAO,SACXA,EAAK/B,EAAE,UAAYoB,EAAM,kBAAmB,cAAe,GAK7D,GAAKW,GACJ,IAAMplB,KAAQulB,EACb,GAAKA,EAAUvlB,CAAK,GAAKulB,EAAUvlB,CAAK,EAAE,KAAMolB,CAAG,EAAI,CACtDd,EAAU,QAAStkB,CAAK,EACxB,KACD,EAKF,GAAKskB,EAAW,CAAE,IAAKa,EACtBE,EAAgBf,EAAW,CAAE,MACvB,CAGN,IAAMtkB,KAAQmlB,EAAY,CACzB,GAAK,CAACb,EAAW,CAAE,GAAKjB,EAAE,WAAYrjB,EAAO,IAAMskB,EAAW,CAAE,CAAE,EAAI,CACrEe,EAAgBrlB,EAChB,KACD,CACMslB,IACLA,EAAgBtlB,EAElB,CAGAqlB,EAAgBA,GAAiBC,CAClC,CAKA,GAAKD,EACJ,OAAKA,IAAkBf,EAAW,CAAE,GACnCA,EAAU,QAASe,CAAc,EAE3BF,EAAWE,CAAc,CAElC,CAKA,SAASG,GAAanC,EAAGoC,EAAUhB,EAAOiB,EAAY,CACrD,IAAIC,EAAOC,EAASC,EAAMvf,EAAKwf,EAC9BC,EAAa,CAAC,EAGdzB,EAAYjB,EAAE,UAAU,MAAM,EAG/B,GAAKiB,EAAW,CAAE,EACjB,IAAMuB,KAAQxC,EAAE,WACf0C,EAAYF,EAAK,YAAY,CAAE,EAAIxC,EAAE,WAAYwC,CAAK,EAOxD,IAHAD,EAAUtB,EAAU,MAAM,EAGlBsB,GAcP,GAZKvC,EAAE,eAAgBuC,CAAQ,IAC9BnB,EAAOpB,EAAE,eAAgBuC,CAAQ,CAAE,EAAIH,GAInC,CAACK,GAAQJ,GAAarC,EAAE,aAC5BoC,EAAWpC,EAAE,WAAYoC,EAAUpC,EAAE,QAAS,GAG/CyC,EAAOF,EACPA,EAAUtB,EAAU,MAAM,EAErBsB,GAGJ,GAAKA,IAAY,IAEhBA,EAAUE,UAGCA,IAAS,KAAOA,IAASF,EAAU,CAM9C,GAHAC,EAAOE,EAAYD,EAAO,IAAMF,CAAQ,GAAKG,EAAY,KAAOH,CAAQ,EAGnE,CAACC,GACL,IAAMF,KAASI,EAId,GADAzf,EAAMqf,EAAM,MAAO,GAAI,EAClBrf,EAAK,CAAE,IAAMsf,IAGjBC,EAAOE,EAAYD,EAAO,IAAMxf,EAAK,CAAE,CAAE,GACxCyf,EAAY,KAAOzf,EAAK,CAAE,CAAE,EACxBuf,GAAO,CAGNA,IAAS,GACbA,EAAOE,EAAYJ,CAAM,EAGdI,EAAYJ,CAAM,IAAM,KACnCC,EAAUtf,EAAK,CAAE,EACjBge,EAAU,QAAShe,EAAK,CAAE,CAAE,GAE7B,KACD,EAMH,GAAKuf,IAAS,GAGb,GAAKA,GAAQxC,EAAE,OACdoC,EAAWI,EAAMJ,CAAS,MAE1B,IAAI,CACHA,EAAWI,EAAMJ,CAAS,CAC3B,OAAU1hB,EAAI,CACb,MAAO,CACN,MAAO,cACP,MAAO8hB,EAAO9hB,EAAI,sBAAwB+hB,EAAO,OAASF,CAC3D,CACD,CAGH,EAIF,MAAO,CAAE,MAAO,UAAW,KAAMH,CAAS,CAC3C,CAEA3nB,EAAO,OAAQ,CAGd,OAAQ,EAGR,aAAc,CAAC,EACf,KAAM,CAAC,EAEP,aAAc,CACb,IAAK6kB,GAAS,KACd,KAAM,MACN,QAASgB,GAAe,KAAMhB,GAAS,QAAS,EAChD,OAAQ,GACR,YAAa,GACb,MAAO,GACP,YAAa,mDAcb,QAAS,CACR,IAAKqB,GACL,KAAM,aACN,KAAM,YACN,IAAK,4BACL,KAAM,mCACP,EAEA,SAAU,CACT,IAAK,UACL,KAAM,SACN,KAAM,UACP,EAEA,eAAgB,CACf,IAAK,cACL,KAAM,eACN,KAAM,cACP,EAIA,WAAY,CAGX,SAAU,OAGV,YAAa,GAGb,YAAa,KAAK,MAGlB,WAAYlmB,EAAO,QACpB,EAMA,YAAa,CACZ,IAAK,GACL,QAAS,EACV,CACD,EAKA,UAAW,SAAUiB,EAAQinB,EAAW,CACvC,OAAOA,EAGNhB,GAAYA,GAAYjmB,EAAQjB,EAAO,YAAa,EAAGkoB,CAAS,EAGhEhB,GAAYlnB,EAAO,aAAciB,CAAO,CAC1C,EAEA,cAAemlB,GAA6BJ,EAAW,EACvD,cAAeI,GAA6BH,EAAW,EAGvD,KAAM,SAAUkC,EAAKxnB,EAAU,CAGzB,OAAOwnB,GAAQ,WACnBxnB,EAAUwnB,EACVA,EAAM,QAIPxnB,EAAUA,GAAW,CAAC,EAEtB,IAAIynB,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGAnV,EAGAoV,EAGA/oB,EAGAgpB,EAGApD,EAAIvlB,EAAO,UAAW,CAAC,EAAGW,CAAQ,EAGlCioB,EAAkBrD,EAAE,SAAWA,EAG/BsD,GAAqBtD,EAAE,UACpBqD,EAAgB,UAAYA,EAAgB,QAC9C5oB,EAAQ4oB,CAAgB,EACxB5oB,EAAO,MAGR2R,GAAW3R,EAAO,SAAS,EAC3B8oB,GAAmB9oB,EAAO,UAAW,aAAc,EAGnD+oB,GAAaxD,EAAE,YAAc,CAAC,EAG9ByD,GAAiB,CAAC,EAClBC,GAAsB,CAAC,EAGvBC,GAAW,WAGXvC,GAAQ,CACP,WAAY,EAGZ,kBAAmB,SAAU3f,GAAM,CAClC,IAAIV,GACJ,GAAKgN,EAAY,CAChB,GAAK,CAACiV,EAEL,IADAA,EAAkB,CAAC,EACTjiB,GAAQsf,GAAS,KAAM0C,CAAsB,GACtDC,EAAiBjiB,GAAO,CAAE,EAAE,YAAY,EAAI,GAAI,GAC7CiiB,EAAiBjiB,GAAO,CAAE,EAAE,YAAY,EAAI,GAAI,GAAK,CAAC,GACtD,OAAQA,GAAO,CAAE,CAAE,EAGxBA,GAAQiiB,EAAiBvhB,GAAI,YAAY,EAAI,GAAI,CAClD,CACA,OAAOV,IAAS,KAAO,KAAOA,GAAM,KAAM,IAAK,CAChD,EAGA,sBAAuB,UAAW,CACjC,OAAOgN,EAAYgV,EAAwB,IAC5C,EAGA,iBAAkB,SAAU1nB,GAAMoB,GAAQ,CACzC,OAAKsR,GAAa,OACjB1S,GAAOqoB,GAAqBroB,GAAK,YAAY,CAAE,EAC9CqoB,GAAqBroB,GAAK,YAAY,CAAE,GAAKA,GAC9CooB,GAAgBpoB,EAAK,EAAIoB,IAEnB,IACR,EAGA,iBAAkB,SAAUE,GAAO,CAClC,OAAKoR,GAAa,OACjBiS,EAAE,SAAWrjB,IAEP,IACR,EAGA,WAAY,SAAUwK,GAAM,CAC3B,IAAIlN,GACJ,GAAKkN,GACJ,GAAK4G,EAGJqT,GAAM,OAAQja,GAAKia,GAAM,MAAO,CAAE,MAIlC,KAAMnnB,MAAQkN,GACbqc,GAAYvpB,EAAK,EAAI,CAAEupB,GAAYvpB,EAAK,EAAGkN,GAAKlN,EAAK,CAAE,EAI1D,OAAO,IACR,EAGA,MAAO,SAAU2pB,GAAa,CAC7B,IAAIC,GAAYD,IAAcD,GAC9B,OAAKd,GACJA,EAAU,MAAOgB,EAAU,EAE5B9lB,GAAM,EAAG8lB,EAAU,EACZ,IACR,CACD,EAkBD,GAfAzX,GAAS,QAASgV,EAAM,EAKxBpB,EAAE,MAAU4C,GAAO5C,EAAE,KAAOV,GAAS,MAAS,IAC5C,QAASkB,GAAWlB,GAAS,SAAW,IAAK,EAG/CU,EAAE,KAAO5kB,EAAQ,QAAUA,EAAQ,MAAQ4kB,EAAE,QAAUA,EAAE,KAGzDA,EAAE,WAAcA,EAAE,UAAY,KAAM,YAAY,EAAE,MAAOvV,EAAc,GAAK,CAAE,EAAG,EAG5EuV,EAAE,aAAe,KAAO,CAC5BkD,EAAYppB,EAAS,cAAe,GAAI,EAKxC,GAAI,CACHopB,EAAU,KAAOlD,EAAE,IAInBkD,EAAU,KAAOA,EAAU,KAC3BlD,EAAE,YAAcY,GAAa,SAAW,KAAOA,GAAa,MAC3DsC,EAAU,SAAW,KAAOA,EAAU,IACxC,OAAUxiB,GAAI,CAIbsf,EAAE,YAAc,EACjB,CACD,CAWA,GARKA,EAAE,MAAQA,EAAE,aAAe,OAAOA,EAAE,MAAS,WACjDA,EAAE,KAAOvlB,EAAO,MAAOulB,EAAE,KAAMA,EAAE,WAAY,GAI9CkB,GAA+BT,GAAYT,EAAG5kB,EAASgmB,EAAM,EAGxDrT,EACJ,OAAOqT,GAKR+B,EAAc1oB,EAAO,OAASulB,EAAE,OAG3BmD,GAAe1oB,EAAO,WAAa,GACvCA,EAAO,MAAM,QAAS,WAAY,EAInCulB,EAAE,KAAOA,EAAE,KAAK,YAAY,EAG5BA,EAAE,WAAa,CAACO,GAAW,KAAMP,EAAE,IAAK,EAKxC8C,EAAW9C,EAAE,IAAI,QAASG,GAAO,EAAG,EAG9BH,EAAE,WAwBIA,EAAE,MAAQA,EAAE,cACrBA,EAAE,aAAe,IAAK,QAAS,mCAAoC,IAAM,IAC3EA,EAAE,KAAOA,EAAE,KAAK,QAASE,GAAK,GAAI,IAvBlCkD,EAAWpD,EAAE,IAAI,MAAO8C,EAAS,MAAO,EAGnC9C,EAAE,OAAUA,EAAE,aAAe,OAAOA,EAAE,MAAS,YACnD8C,IAActD,GAAO,KAAMsD,CAAS,EAAI,IAAM,KAAQ9C,EAAE,KAGxD,OAAOA,EAAE,MAILA,EAAE,QAAU,KAChB8C,EAAWA,EAAS,QAAS1C,GAAY,IAAK,EAC9CgD,GAAa5D,GAAO,KAAMsD,CAAS,EAAI,IAAM,KAAQ,KAASvD,GAAM,OACnE6D,GAIFpD,EAAE,IAAM8C,EAAWM,GASfpD,EAAE,aACDvlB,EAAO,aAAcqoB,CAAS,GAClC1B,GAAM,iBAAkB,oBAAqB3mB,EAAO,aAAcqoB,CAAS,CAAE,EAEzEroB,EAAO,KAAMqoB,CAAS,GAC1B1B,GAAM,iBAAkB,gBAAiB3mB,EAAO,KAAMqoB,CAAS,CAAE,IAK9D9C,EAAE,MAAQA,EAAE,YAAcA,EAAE,cAAgB,IAAS5kB,EAAQ,cACjEgmB,GAAM,iBAAkB,eAAgBpB,EAAE,WAAY,EAIvDoB,GAAM,iBACL,SACApB,EAAE,UAAW,CAAE,GAAKA,EAAE,QAASA,EAAE,UAAW,CAAE,CAAE,EAC/CA,EAAE,QAASA,EAAE,UAAW,CAAE,CAAE,GACzBA,EAAE,UAAW,CAAE,IAAM,IAAM,KAAOW,GAAW,WAAa,IAC7DX,EAAE,QAAS,GAAI,CACjB,EAGA,IAAM5lB,KAAK4lB,EAAE,QACZoB,GAAM,iBAAkBhnB,EAAG4lB,EAAE,QAAS5lB,CAAE,CAAE,EAI3C,GAAK4lB,EAAE,aACJA,EAAE,WAAW,KAAMqD,EAAiBjC,GAAOpB,CAAE,IAAM,IAASjS,GAG9D,OAAOqT,GAAM,MAAM,EAepB,GAXAuC,GAAW,QAGXJ,GAAiB,IAAKvD,EAAE,QAAS,EACjCoB,GAAM,KAAMpB,EAAE,OAAQ,EACtBoB,GAAM,KAAMpB,EAAE,KAAM,EAGpB6C,EAAY3B,GAA+BR,GAAYV,EAAG5kB,EAASgmB,EAAM,EAGpE,CAACyB,EACL9kB,GAAM,GAAI,cAAe,MACnB,CASN,GARAqjB,GAAM,WAAa,EAGd+B,GACJG,GAAmB,QAAS,WAAY,CAAElC,GAAOpB,CAAE,CAAE,EAIjDjS,EACJ,OAAOqT,GAIHpB,EAAE,OAASA,EAAE,QAAU,IAC3BiD,EAAerqB,EAAO,WAAY,UAAW,CAC5CwoB,GAAM,MAAO,SAAU,CACxB,EAAGpB,EAAE,OAAQ,GAGd,GAAI,CACHjS,EAAY,GACZ8U,EAAU,KAAMY,GAAgB1lB,EAAK,CACtC,OAAU2C,GAAI,CAGb,GAAKqN,EACJ,MAAMrN,GAIP3C,GAAM,GAAI2C,EAAE,CACb,CACD,CAGA,SAAS3C,GAAM+lB,GAAQC,GAAkBjC,GAAWkC,GAAU,CAC7D,IAAI3B,GAAW4B,GAAStW,GAAOyU,GAAU8B,GACxCN,GAAaG,GAGThW,IAILA,EAAY,GAGPkV,GACJrqB,EAAO,aAAcqqB,CAAa,EAKnCJ,EAAY,OAGZE,EAAwBiB,IAAW,GAGnC5C,GAAM,WAAa0C,GAAS,EAAI,EAAI,EAGpCzB,GAAYyB,IAAU,KAAOA,GAAS,KAAOA,KAAW,IAGnDhC,KACJM,GAAWP,GAAqB7B,EAAGoB,GAAOU,EAAU,GAIhD,CAACO,IACL5nB,EAAO,QAAS,SAAUulB,EAAE,SAAU,EAAI,IAC1CvlB,EAAO,QAAS,OAAQulB,EAAE,SAAU,EAAI,IACxCA,EAAE,WAAY,aAAc,EAAI,UAAW,CAAC,GAI7CoC,GAAWD,GAAanC,EAAGoC,GAAUhB,GAAOiB,EAAU,EAGjDA,IAGCrC,EAAE,aACNkE,GAAW9C,GAAM,kBAAmB,eAAgB,EAC/C8C,KACJzpB,EAAO,aAAcqoB,CAAS,EAAIoB,IAEnCA,GAAW9C,GAAM,kBAAmB,MAAO,EACtC8C,KACJzpB,EAAO,KAAMqoB,CAAS,EAAIoB,KAKvBJ,KAAW,KAAO9D,EAAE,OAAS,OACjC4D,GAAa,YAGFE,KAAW,IACtBF,GAAa,eAIbA,GAAaxB,GAAS,MACtB6B,GAAU7B,GAAS,KACnBzU,GAAQyU,GAAS,MACjBC,GAAY,CAAC1U,MAKdA,GAAQiW,IACHE,IAAU,CAACF,MACfA,GAAa,QACRE,GAAS,IACbA,GAAS,KAMZ1C,GAAM,OAAS0C,GACf1C,GAAM,YAAe2C,IAAoBH,IAAe,GAGnDvB,GACJjW,GAAS,YAAaiX,EAAiB,CAAEY,GAASL,GAAYxC,EAAM,CAAE,EAEtEhV,GAAS,WAAYiX,EAAiB,CAAEjC,GAAOwC,GAAYjW,EAAM,CAAE,EAIpEyT,GAAM,WAAYoC,EAAW,EAC7BA,GAAa,OAERL,GACJG,GAAmB,QAASjB,GAAY,cAAgB,YACvD,CAAEjB,GAAOpB,EAAGqC,GAAY4B,GAAUtW,EAAM,CAAE,EAI5C4V,GAAiB,SAAUF,EAAiB,CAAEjC,GAAOwC,EAAW,CAAE,EAE7DT,IACJG,GAAmB,QAAS,eAAgB,CAAElC,GAAOpB,CAAE,CAAE,EAGjD,EAAEvlB,EAAO,QAChBA,EAAO,MAAM,QAAS,UAAW,GAGpC,CAEA,OAAO2mB,EACR,EAEA,QAAS,SAAUwB,EAAK5T,EAAMjU,EAAW,CACxC,OAAON,EAAO,IAAKmoB,EAAK5T,EAAMjU,EAAU,MAAO,CAChD,EAEA,UAAW,SAAU6nB,EAAK7nB,EAAW,CACpC,OAAON,EAAO,IAAKmoB,EAAK,OAAW7nB,EAAU,QAAS,CACvD,CACD,CAAE,EAEFN,EAAO,KAAM,CAAE,MAAO,MAAO,EAAG,SAAUiC,EAAIqP,EAAS,CACtDtR,EAAQsR,CAAO,EAAI,SAAU6W,EAAK5T,EAAMjU,EAAU4B,EAAO,CAGxD,OAAKhD,EAAYqV,CAAK,IACrBrS,EAAOA,GAAQ5B,EACfA,EAAWiU,EACXA,EAAO,QAIDvU,EAAO,KAAMA,EAAO,OAAQ,CAClC,IAAKmoB,EACL,KAAM7W,EACN,SAAUpP,EACV,KAAMqS,EACN,QAASjU,CACV,EAAGN,EAAO,cAAemoB,CAAI,GAAKA,CAAI,CAAE,CACzC,CACD,CAAE,EAEFnoB,EAAO,cAAe,SAAUulB,EAAI,CACnC,IAAI5lB,EACJ,IAAMA,KAAK4lB,EAAE,QACP5lB,EAAE,YAAY,IAAM,iBACxB4lB,EAAE,YAAcA,EAAE,QAAS5lB,CAAE,GAAK,GAGrC,CAAE,EAGFK,EAAO,SAAW,SAAUmoB,EAAKxnB,EAASjB,EAAM,CAC/C,OAAOM,EAAO,KAAM,CACnB,IAAKmoB,EAGL,KAAM,MACN,SAAU,SACV,MAAO,GACP,MAAO,GACP,OAAQ,GAKR,WAAY,CACX,cAAe,UAAW,CAAC,CAC5B,EACA,WAAY,SAAUR,EAAW,CAChC3nB,EAAO,WAAY2nB,EAAUhnB,EAASjB,CAAI,CAC3C,CACD,CAAE,CACH,EAGAM,EAAO,GAAG,OAAQ,CACjB,QAAS,SAAUsb,EAAO,CACzB,IAAI7D,EAEJ,OAAK,KAAM,CAAE,IACPvY,EAAYoc,CAAK,IACrBA,EAAOA,EAAK,KAAM,KAAM,CAAE,CAAE,GAI7B7D,EAAOzX,EAAQsb,EAAM,KAAM,CAAE,EAAE,aAAc,EAAE,GAAI,CAAE,EAAE,MAAO,EAAK,EAE9D,KAAM,CAAE,EAAE,YACd7D,EAAK,aAAc,KAAM,CAAE,CAAE,EAG9BA,EAAK,IAAK,UAAW,CAGpB,QAFIlX,EAAO,KAEHA,EAAK,mBACZA,EAAOA,EAAK,kBAGb,OAAOA,CACR,CAAE,EAAE,OAAQ,IAAK,GAGX,IACR,EAEA,UAAW,SAAU+a,EAAO,CAC3B,OAAKpc,EAAYoc,CAAK,EACd,KAAK,KAAM,SAAU3b,EAAI,CAC/BK,EAAQ,IAAK,EAAE,UAAWsb,EAAK,KAAM,KAAM3b,CAAE,CAAE,CAChD,CAAE,EAGI,KAAK,KAAM,UAAW,CAC5B,IAAI2P,EAAOtP,EAAQ,IAAK,EACvBynB,EAAWnY,EAAK,SAAS,EAErBmY,EAAS,OACbA,EAAS,QAASnM,CAAK,EAGvBhM,EAAK,OAAQgM,CAAK,CAEpB,CAAE,CACH,EAEA,KAAM,SAAUA,EAAO,CACtB,IAAIoO,EAAiBxqB,EAAYoc,CAAK,EAEtC,OAAO,KAAK,KAAM,SAAU3b,EAAI,CAC/BK,EAAQ,IAAK,EAAE,QAAS0pB,EAAiBpO,EAAK,KAAM,KAAM3b,CAAE,EAAI2b,CAAK,CACtE,CAAE,CACH,EAEA,OAAQ,SAAUrb,EAAW,CAC5B,YAAK,OAAQA,CAAS,EAAE,IAAK,MAAO,EAAE,KAAM,UAAW,CACtDD,EAAQ,IAAK,EAAE,YAAa,KAAK,UAAW,CAC7C,CAAE,EACK,IACR,CACD,CAAE,EAGFA,EAAO,KAAK,QAAQ,OAAS,SAAUO,EAAO,CAC7C,MAAO,CAACP,EAAO,KAAK,QAAQ,QAASO,CAAK,CAC3C,EACAP,EAAO,KAAK,QAAQ,QAAU,SAAUO,EAAO,CAC9C,MAAO,CAAC,EAAGA,EAAK,aAAeA,EAAK,cAAgBA,EAAK,eAAe,EAAE,OAC3E,EAKAP,EAAO,aAAa,IAAM,UAAW,CACpC,GAAI,CACH,OAAO,IAAI7B,EAAO,cACnB,OAAU8H,EAAI,CAAC,CAChB,EAEA,IAAI0jB,GAAmB,CAGrB,EAAG,IAIH,KAAM,GACP,EACAC,GAAe5pB,EAAO,aAAa,IAAI,EAExCf,EAAQ,KAAO,CAAC,CAAC2qB,IAAkB,oBAAqBA,GACxD3qB,EAAQ,KAAO2qB,GAAe,CAAC,CAACA,GAEhC5pB,EAAO,cAAe,SAAUW,EAAU,CACzC,IAAIL,EAAUupB,EAGd,GAAK5qB,EAAQ,MAAQ2qB,IAAgB,CAACjpB,EAAQ,YAC7C,MAAO,CACN,KAAM,SAAU4oB,EAASO,EAAW,CACnC,IAAInqB,EACHoqB,EAAMppB,EAAQ,IAAI,EAWnB,GATAopB,EAAI,KACHppB,EAAQ,KACRA,EAAQ,IACRA,EAAQ,MACRA,EAAQ,SACRA,EAAQ,QACT,EAGKA,EAAQ,UACZ,IAAMhB,KAAKgB,EAAQ,UAClBopB,EAAKpqB,CAAE,EAAIgB,EAAQ,UAAWhB,CAAE,EAK7BgB,EAAQ,UAAYopB,EAAI,kBAC5BA,EAAI,iBAAkBppB,EAAQ,QAAS,EAQnC,CAACA,EAAQ,aAAe,CAAC4oB,EAAS,kBAAmB,IACzDA,EAAS,kBAAmB,EAAI,kBAIjC,IAAM5pB,KAAK4pB,EACVQ,EAAI,iBAAkBpqB,EAAG4pB,EAAS5pB,CAAE,CAAE,EAIvCW,EAAW,SAAU4B,EAAO,CAC3B,OAAO,UAAW,CACZ5B,IACJA,EAAWupB,EAAgBE,EAAI,OAC9BA,EAAI,QAAUA,EAAI,QAAUA,EAAI,UAC/BA,EAAI,mBAAqB,KAEtB7nB,IAAS,QACb6nB,EAAI,MAAM,EACC7nB,IAAS,QAKf,OAAO6nB,EAAI,QAAW,SAC1BD,EAAU,EAAG,OAAQ,EAErBA,EAGCC,EAAI,OACJA,EAAI,UACL,EAGDD,EACCH,GAAkBI,EAAI,MAAO,GAAKA,EAAI,OACtCA,EAAI,YAKFA,EAAI,cAAgB,UAAa,QACnC,OAAOA,EAAI,cAAiB,SAC3B,CAAE,OAAQA,EAAI,QAAS,EACvB,CAAE,KAAMA,EAAI,YAAa,EAC1BA,EAAI,sBAAsB,CAC3B,EAGH,CACD,EAGAA,EAAI,OAASzpB,EAAS,EACtBupB,EAAgBE,EAAI,QAAUA,EAAI,UAAYzpB,EAAU,OAAQ,EAK3DypB,EAAI,UAAY,OACpBA,EAAI,QAAUF,EAEdE,EAAI,mBAAqB,UAAW,CAG9BA,EAAI,aAAe,GAMvB5rB,EAAO,WAAY,UAAW,CACxBmC,GACJupB,EAAc,CAEhB,CAAE,CAEJ,EAIDvpB,EAAWA,EAAU,OAAQ,EAE7B,GAAI,CAGHypB,EAAI,KAAMppB,EAAQ,YAAcA,EAAQ,MAAQ,IAAK,CACtD,OAAUsF,EAAI,CAGb,GAAK3F,EACJ,MAAM2F,CAER,CACD,EAEA,MAAO,UAAW,CACZ3F,GACJA,EAAS,CAEX,CACD,CAEF,CAAE,EAMFN,EAAO,cAAe,SAAUulB,EAAI,CAC9BA,EAAE,cACNA,EAAE,SAAS,OAAS,GAEtB,CAAE,EAGFvlB,EAAO,UAAW,CACjB,QAAS,CACR,OAAQ,2FAET,EACA,SAAU,CACT,OAAQ,yBACT,EACA,WAAY,CACX,cAAe,SAAUkL,EAAO,CAC/B,OAAAlL,EAAO,WAAYkL,CAAK,EACjBA,CACR,CACD,CACD,CAAE,EAGFlL,EAAO,cAAe,SAAU,SAAUulB,EAAI,CACxCA,EAAE,QAAU,SAChBA,EAAE,MAAQ,IAENA,EAAE,cACNA,EAAE,KAAO,MAEX,CAAE,EAGFvlB,EAAO,cAAe,SAAU,SAAUulB,EAAI,CAG7C,GAAKA,EAAE,aAAeA,EAAE,YAAc,CACrC,IAAI1lB,EAAQS,EACZ,MAAO,CACN,KAAM,SAAU6P,EAAG2Z,EAAW,CAC7BjqB,EAASG,EAAQ,UAAW,EAC1B,KAAMulB,EAAE,aAAe,CAAC,CAAE,EAC1B,KAAM,CAAE,QAASA,EAAE,cAAe,IAAKA,EAAE,GAAI,CAAE,EAC/C,GAAI,aAAcjlB,EAAW,SAAU0pB,EAAM,CAC7CnqB,EAAO,OAAO,EACdS,EAAW,KACN0pB,GACJF,EAAUE,EAAI,OAAS,QAAU,IAAM,IAAKA,EAAI,IAAK,CAEvD,CAAE,EAGH3qB,EAAS,KAAK,YAAaQ,EAAQ,CAAE,CAAE,CACxC,EACA,MAAO,UAAW,CACZS,GACJA,EAAS,CAEX,CACD,CACD,CACD,CAAE,EAKF,IAAI2pB,GAAe,CAAC,EACnBC,GAAS,oBAGVlqB,EAAO,UAAW,CACjB,MAAO,WACP,cAAe,UAAW,CACzB,IAAIM,EAAW2pB,GAAa,IAAI,GAAOjqB,EAAO,QAAU,IAAQ8kB,GAAM,OACtE,YAAMxkB,CAAS,EAAI,GACZA,CACR,CACD,CAAE,EAGFN,EAAO,cAAe,aAAc,SAAUulB,EAAG4E,EAAkBxD,EAAQ,CAE1E,IAAIyD,EAAcC,EAAaC,EAC9BC,EAAWhF,EAAE,QAAU,KAAW2E,GAAO,KAAM3E,EAAE,GAAI,EACpD,MACA,OAAOA,EAAE,MAAS,WACfA,EAAE,aAAe,IACjB,QAAS,mCAAoC,IAAM,GACrD2E,GAAO,KAAM3E,EAAE,IAAK,GAAK,QAI5B,GAAKgF,GAAYhF,EAAE,UAAW,CAAE,IAAM,QAGrC,OAAA6E,EAAe7E,EAAE,cAAgBrmB,EAAYqmB,EAAE,aAAc,EAC5DA,EAAE,cAAc,EAChBA,EAAE,cAGEgF,EACJhF,EAAGgF,CAAS,EAAIhF,EAAGgF,CAAS,EAAE,QAASL,GAAQ,KAAOE,CAAa,EACxD7E,EAAE,QAAU,KACvBA,EAAE,MAASR,GAAO,KAAMQ,EAAE,GAAI,EAAI,IAAM,KAAQA,EAAE,MAAQ,IAAM6E,GAIjE7E,EAAE,WAAY,aAAc,EAAI,UAAW,CAC1C,OAAM+E,GACLtqB,EAAO,MAAOoqB,EAAe,iBAAkB,EAEzCE,EAAmB,CAAE,CAC7B,EAGA/E,EAAE,UAAW,CAAE,EAAI,OAGnB8E,EAAclsB,EAAQisB,CAAa,EACnCjsB,EAAQisB,CAAa,EAAI,UAAW,CACnCE,EAAoB,SACrB,EAGA3D,EAAM,OAAQ,UAAW,CAGnB0D,IAAgB,OACpBrqB,EAAQ7B,CAAO,EAAE,WAAYisB,CAAa,EAI1CjsB,EAAQisB,CAAa,EAAIC,EAIrB9E,EAAG6E,CAAa,IAGpB7E,EAAE,cAAgB4E,EAAiB,cAGnCF,GAAa,KAAMG,CAAa,GAI5BE,GAAqBprB,EAAYmrB,CAAY,GACjDA,EAAaC,EAAmB,CAAE,CAAE,EAGrCA,EAAoBD,EAAc,MACnC,CAAE,EAGK,QAET,CAAE,EAUFprB,EAAQ,oBAAuB,UAAW,CACzC,IAAIurB,EAAOnrB,EAAS,eAAe,mBAAoB,EAAG,EAAE,KAC5D,OAAAmrB,EAAK,UAAY,6BACVA,EAAK,WAAW,SAAW,CACnC,GAAI,EAOJxqB,EAAO,UAAY,SAAUuU,EAAMrU,EAASuqB,EAAc,CACzD,GAAK,OAAOlW,GAAS,SACpB,MAAO,CAAC,EAEJ,OAAOrU,GAAY,YACvBuqB,EAAcvqB,EACdA,EAAU,IAGX,IAAI6L,EAAM2e,EAAQpT,EAwBlB,OAtBMpX,IAIAjB,EAAQ,oBACZiB,EAAUb,EAAS,eAAe,mBAAoB,EAAG,EAKzD0M,EAAO7L,EAAQ,cAAe,MAAO,EACrC6L,EAAK,KAAO1M,EAAS,SAAS,KAC9Ba,EAAQ,KAAK,YAAa6L,CAAK,GAE/B7L,EAAUb,GAIZqrB,EAASxb,GAAW,KAAMqF,CAAK,EAC/B+C,EAAU,CAACmT,GAAe,CAAC,EAGtBC,EACG,CAAExqB,EAAQ,cAAewqB,EAAQ,CAAE,CAAE,CAAE,GAG/CA,EAASrT,GAAe,CAAE9C,CAAK,EAAGrU,EAASoX,CAAQ,EAE9CA,GAAWA,EAAQ,QACvBtX,EAAQsX,CAAQ,EAAE,OAAO,EAGnBtX,EAAO,MAAO,CAAC,EAAG0qB,EAAO,UAAW,EAC5C,EAMA1qB,EAAO,GAAG,KAAO,SAAUmoB,EAAKwC,EAAQrqB,EAAW,CAClD,IAAIL,EAAUiC,EAAMylB,EACnBrY,EAAO,KACPsb,EAAMzC,EAAI,QAAS,GAAI,EAExB,OAAKyC,EAAM,KACV3qB,EAAWwjB,GAAkB0E,EAAI,MAAOyC,CAAI,CAAE,EAC9CzC,EAAMA,EAAI,MAAO,EAAGyC,CAAI,GAIpB1rB,EAAYyrB,CAAO,GAGvBrqB,EAAWqqB,EACXA,EAAS,QAGEA,GAAU,OAAOA,GAAW,WACvCzoB,EAAO,QAIHoN,EAAK,OAAS,GAClBtP,EAAO,KAAM,CACZ,IAAKmoB,EAKL,KAAMjmB,GAAQ,MACd,SAAU,OACV,KAAMyoB,CACP,CAAE,EAAE,KAAM,SAAUE,EAAe,CAGlClD,EAAW,UAEXrY,EAAK,KAAMrP,EAIVD,EAAQ,OAAQ,EAAE,OAAQA,EAAO,UAAW6qB,CAAa,CAAE,EAAE,KAAM5qB,CAAS,EAG5E4qB,CAAa,CAKf,CAAE,EAAE,OAAQvqB,GAAY,SAAUqmB,EAAO0C,EAAS,CACjD/Z,EAAK,KAAM,UAAW,CACrBhP,EAAS,MAAO,KAAMqnB,GAAY,CAAEhB,EAAM,aAAc0C,EAAQ1C,CAAM,CAAE,CACzE,CAAE,CACH,CAAE,EAGI,IACR,EAKA3mB,EAAO,KAAK,QAAQ,SAAW,SAAUO,EAAO,CAC/C,OAAOP,EAAO,KAAMA,EAAO,OAAQ,SAAUkH,EAAK,CACjD,OAAO3G,IAAS2G,EAAG,IACpB,CAAE,EAAE,MACL,EAKAlH,EAAO,OAAS,CACf,UAAW,SAAUO,EAAMI,EAAShB,EAAI,CACvC,IAAImrB,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EAAYC,EACnEC,EAAWrrB,EAAO,IAAKO,EAAM,UAAW,EACxC+qB,EAAUtrB,EAAQO,CAAK,EACvBsZ,EAAQ,CAAC,EAGLwR,IAAa,WACjB9qB,EAAK,MAAM,SAAW,YAGvB2qB,EAAYI,EAAQ,OAAO,EAC3BN,EAAYhrB,EAAO,IAAKO,EAAM,KAAM,EACpC4qB,EAAanrB,EAAO,IAAKO,EAAM,MAAO,EACtC6qB,GAAsBC,IAAa,YAAcA,IAAa,WAC3DL,EAAYG,GAAa,QAAS,MAAO,EAAI,GAI3CC,GACJN,EAAcQ,EAAQ,SAAS,EAC/BL,EAASH,EAAY,IACrBC,EAAUD,EAAY,OAGtBG,EAAS,WAAYD,CAAU,GAAK,EACpCD,EAAU,WAAYI,CAAW,GAAK,GAGlCjsB,EAAYyB,CAAQ,IAGxBA,EAAUA,EAAQ,KAAMJ,EAAMZ,EAAGK,EAAO,OAAQ,CAAC,EAAGkrB,CAAU,CAAE,GAG5DvqB,EAAQ,KAAO,OACnBkZ,EAAM,IAAQlZ,EAAQ,IAAMuqB,EAAU,IAAQD,GAE1CtqB,EAAQ,MAAQ,OACpBkZ,EAAM,KAASlZ,EAAQ,KAAOuqB,EAAU,KAASH,GAG7C,UAAWpqB,EACfA,EAAQ,MAAM,KAAMJ,EAAMsZ,CAAM,EAGhCyR,EAAQ,IAAKzR,CAAM,CAErB,CACD,EAEA7Z,EAAO,GAAG,OAAQ,CAGjB,OAAQ,SAAUW,EAAU,CAG3B,GAAK,UAAU,OACd,OAAOA,IAAY,OAClB,KACA,KAAK,KAAM,SAAUhB,EAAI,CACxBK,EAAO,OAAO,UAAW,KAAMW,EAAShB,CAAE,CAC3C,CAAE,EAGJ,IAAI4rB,EAAMC,EACTjrB,EAAO,KAAM,CAAE,EAEhB,GAAMA,EAQN,OAAMA,EAAK,eAAe,EAAE,QAK5BgrB,EAAOhrB,EAAK,sBAAsB,EAClCirB,EAAMjrB,EAAK,cAAc,YAClB,CACN,IAAKgrB,EAAK,IAAMC,EAAI,YACpB,KAAMD,EAAK,KAAOC,EAAI,WACvB,GATQ,CAAE,IAAK,EAAG,KAAM,CAAE,CAU3B,EAIA,SAAU,UAAW,CACpB,GAAM,KAAM,CAAE,EAId,KAAIC,EAAcC,EAAQhsB,EACzBa,EAAO,KAAM,CAAE,EACforB,EAAe,CAAE,IAAK,EAAG,KAAM,CAAE,EAGlC,GAAK3rB,EAAO,IAAKO,EAAM,UAAW,IAAM,QAGvCmrB,EAASnrB,EAAK,sBAAsB,MAE9B,CAON,IANAmrB,EAAS,KAAK,OAAO,EAIrBhsB,EAAMa,EAAK,cACXkrB,EAAelrB,EAAK,cAAgBb,EAAI,gBAChC+rB,IACLA,IAAiB/rB,EAAI,MAAQ+rB,IAAiB/rB,EAAI,kBACpDM,EAAO,IAAKyrB,EAAc,UAAW,IAAM,UAE3CA,EAAeA,EAAa,WAExBA,GAAgBA,IAAiBlrB,GAAQkrB,EAAa,WAAa,IAGvEE,EAAe3rB,EAAQyrB,CAAa,EAAE,OAAO,EAC7CE,EAAa,KAAO3rB,EAAO,IAAKyrB,EAAc,iBAAkB,EAAK,EACrEE,EAAa,MAAQ3rB,EAAO,IAAKyrB,EAAc,kBAAmB,EAAK,EAEzE,CAGA,MAAO,CACN,IAAKC,EAAO,IAAMC,EAAa,IAAM3rB,EAAO,IAAKO,EAAM,YAAa,EAAK,EACzE,KAAMmrB,EAAO,KAAOC,EAAa,KAAO3rB,EAAO,IAAKO,EAAM,aAAc,EAAK,CAC9E,EACD,EAYA,aAAc,UAAW,CACxB,OAAO,KAAK,IAAK,UAAW,CAG3B,QAFIkrB,EAAe,KAAK,aAEhBA,GAAgBzrB,EAAO,IAAKyrB,EAAc,UAAW,IAAM,UAClEA,EAAeA,EAAa,aAG7B,OAAOA,GAAgBjW,EACxB,CAAE,CACH,CACD,CAAE,EAGFxV,EAAO,KAAM,CAAE,WAAY,cAAe,UAAW,aAAc,EAAG,SAAUsR,EAAQkD,EAAO,CAC9F,IAAIoX,EAAwBpX,IAAlB,cAEVxU,EAAO,GAAIsR,CAAO,EAAI,SAAU1R,EAAM,CACrC,OAAO2T,GAAQ,KAAM,SAAUhT,EAAM+Q,EAAQ1R,EAAM,CAGlD,IAAI4rB,EAOJ,GANKpsB,EAAUmB,CAAK,EACnBirB,EAAMjrB,EACKA,EAAK,WAAa,IAC7BirB,EAAMjrB,EAAK,aAGPX,IAAQ,OACZ,OAAO4rB,EAAMA,EAAKhX,CAAK,EAAIjU,EAAM+Q,CAAO,EAGpCka,EACJA,EAAI,SACFI,EAAYJ,EAAI,YAAV5rB,EACPgsB,EAAMhsB,EAAM4rB,EAAI,WACjB,EAGAjrB,EAAM+Q,CAAO,EAAI1R,CAEnB,EAAG0R,EAAQ1R,EAAK,UAAU,MAAO,CAClC,CACD,CAAE,EAQFI,EAAO,KAAM,CAAE,MAAO,MAAO,EAAG,SAAUiC,EAAIuS,EAAO,CACpDxU,EAAO,SAAUwU,CAAK,EAAIoJ,GAAc3e,EAAQ,cAC/C,SAAUsB,EAAM+c,EAAW,CAC1B,GAAKA,EACJ,OAAAA,EAAWD,GAAQ9c,EAAMiU,CAAK,EAGvBsH,GAAU,KAAMwB,CAAS,EAC/Btd,EAAQO,CAAK,EAAE,SAAS,EAAGiU,CAAK,EAAI,KACpC8I,CAEH,CACD,CACD,CAAE,EAIFtd,EAAO,KAAM,CAAE,OAAQ,SAAU,MAAO,OAAQ,EAAG,SAAUY,EAAMsB,EAAO,CACzElC,EAAO,KAAM,CACZ,QAAS,QAAUY,EACnB,QAASsB,EACT,GAAI,QAAUtB,CACf,EAAG,SAAUirB,EAAcC,EAAW,CAGrC9rB,EAAO,GAAI8rB,CAAS,EAAI,SAAUC,EAAQ/pB,EAAQ,CACjD,IAAIwR,EAAY,UAAU,SAAYqY,GAAgB,OAAOE,GAAW,WACvE9M,EAAQ4M,IAAkBE,IAAW,IAAQ/pB,IAAU,GAAO,SAAW,UAE1E,OAAOuR,GAAQ,KAAM,SAAUhT,EAAM2B,EAAMF,EAAQ,CAClD,IAAItC,EAEJ,OAAKN,EAAUmB,CAAK,EAGZurB,EAAS,QAAS,OAAQ,IAAM,EACtCvrB,EAAM,QAAUK,CAAK,EACrBL,EAAK,SAAS,gBAAiB,SAAWK,CAAK,EAI5CL,EAAK,WAAa,GACtBb,EAAMa,EAAK,gBAIJ,KAAK,IACXA,EAAK,KAAM,SAAWK,CAAK,EAAGlB,EAAK,SAAWkB,CAAK,EACnDL,EAAK,KAAM,SAAWK,CAAK,EAAGlB,EAAK,SAAWkB,CAAK,EACnDlB,EAAK,SAAWkB,CAAK,CACtB,GAGMoB,IAAU,OAGhBhC,EAAO,IAAKO,EAAM2B,EAAM+c,CAAM,EAG9Bjf,EAAO,MAAOO,EAAM2B,EAAMF,EAAOid,CAAM,CACzC,EAAG/c,EAAMsR,EAAYuY,EAAS,OAAWvY,CAAU,CACpD,CACD,CAAE,CACH,CAAE,EAGFxT,EAAO,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,UACD,EAAG,SAAUiC,EAAIC,EAAO,CACvBlC,EAAO,GAAIkC,CAAK,EAAI,SAAUgF,EAAK,CAClC,OAAO,KAAK,GAAIhF,EAAMgF,CAAG,CAC1B,CACD,CAAE,EAKFlH,EAAO,GAAG,OAAQ,CAEjB,KAAM,SAAUmY,EAAO5D,EAAMrN,EAAK,CACjC,OAAO,KAAK,GAAIiR,EAAO,KAAM5D,EAAMrN,CAAG,CACvC,EACA,OAAQ,SAAUiR,EAAOjR,EAAK,CAC7B,OAAO,KAAK,IAAKiR,EAAO,KAAMjR,CAAG,CAClC,EAEA,SAAU,SAAUjH,EAAUkY,EAAO5D,EAAMrN,EAAK,CAC/C,OAAO,KAAK,GAAIiR,EAAOlY,EAAUsU,EAAMrN,CAAG,CAC3C,EACA,WAAY,SAAUjH,EAAUkY,EAAOjR,EAAK,CAG3C,OAAO,UAAU,SAAW,EAC3B,KAAK,IAAKjH,EAAU,IAAK,EACzB,KAAK,IAAKkY,EAAOlY,GAAY,KAAMiH,CAAG,CACxC,EAEA,MAAO,SAAU8kB,EAAQC,EAAQ,CAChC,OAAO,KAAK,WAAYD,CAAO,EAAE,WAAYC,GAASD,CAAO,CAC9D,CACD,CAAE,EAEFhsB,EAAO,KACJ,wLAE0D,MAAO,GAAI,EACvE,SAAUiC,EAAIrB,EAAO,CAGpBZ,EAAO,GAAIY,CAAK,EAAI,SAAU2T,EAAMrN,EAAK,CACxC,OAAO,UAAU,OAAS,EACzB,KAAK,GAAItG,EAAM,KAAM2T,EAAMrN,CAAG,EAC9B,KAAK,QAAStG,CAAK,CACrB,CACD,CACD,EASA,IAAI4D,GAAQ,sDAMZxE,EAAO,MAAQ,SAAUkH,EAAIhH,EAAU,CACtC,IAAIsI,EAAKqC,EAAMqhB,EAUf,GARK,OAAOhsB,GAAY,WACvBsI,EAAMtB,EAAIhH,CAAQ,EAClBA,EAAUgH,EACVA,EAAKsB,GAKD,EAACtJ,EAAYgI,CAAG,EAKrB,OAAA2D,EAAOtM,EAAM,KAAM,UAAW,CAAE,EAChC2tB,EAAQ,UAAW,CAClB,OAAOhlB,EAAG,MAAOhH,GAAW,KAAM2K,EAAK,OAAQtM,EAAM,KAAM,SAAU,CAAE,CAAE,CAC1E,EAGA2tB,EAAM,KAAOhlB,EAAG,KAAOA,EAAG,MAAQlH,EAAO,OAElCksB,CACR,EAEAlsB,EAAO,UAAY,SAAUmsB,EAAO,CAC9BA,EACJnsB,EAAO,YAEPA,EAAO,MAAO,EAAK,CAErB,EACAA,EAAO,QAAU,MAAM,QACvBA,EAAO,UAAY,KAAK,MACxBA,EAAO,SAAWwJ,GAClBxJ,EAAO,WAAad,EACpBc,EAAO,SAAWZ,EAClBY,EAAO,UAAYkU,GACnBlU,EAAO,KAAOF,EAEdE,EAAO,IAAM,KAAK,IAElBA,EAAO,UAAY,SAAUb,EAAM,CAKlC,IAAI+C,EAAOlC,EAAO,KAAMb,CAAI,EAC5B,OAAS+C,IAAS,UAAYA,IAAS,WAKtC,CAAC,MAAO/C,EAAM,WAAYA,CAAI,CAAE,CAClC,EAEAa,EAAO,KAAO,SAAUkL,EAAO,CAC9B,OAAOA,GAAQ,KACd,IACEA,EAAO,IAAK,QAAS1G,GAAO,IAAK,CACrC,EAiBK,OAAO,QAAW,YAAc,OAAO,KAC3C,OAAQ,SAAU,CAAC,EAAG,UAAW,CAChC,OAAOxE,CACR,CAAE,EAMH,IAGCosB,GAAUjuB,EAAO,OAGjBkuB,GAAKluB,EAAO,EAEb,OAAA6B,EAAO,WAAa,SAAUmB,EAAO,CACpC,OAAKhD,EAAO,IAAM6B,IACjB7B,EAAO,EAAIkuB,IAGPlrB,GAAQhD,EAAO,SAAW6B,IAC9B7B,EAAO,OAASiuB,IAGVpsB,CACR,EAKK,OAAO5B,GAAa,cACxBD,EAAO,OAASA,EAAO,EAAI6B,GAMrBA,CACP,CAAE,ICptVF,IAAOssB,GAAPC,GAAAC,GAAA,KAAOF,GAAQ,CACb,OAAQ,OAAO,SAAY,YAAc,QAAU,OACnD,UAAW,OAAO,WAAc,YAAc,UAAY,MAC5D,ICHA,IAcOG,GAdPC,GAAAC,GAAA,KAAAC,KAcOH,GAAQ,CACb,OAAOI,EAAU,CACX,KAAK,UACPA,EAAS,KAAK,KAAK,IAAI,CAAC,EACxBC,GAAS,OAAO,IAAI,gBAAiB,GAAGD,CAAQ,EAEpD,CACF,ICrBA,IAKME,GAEAC,GAEAC,GAkHCC,GA3HPC,GAAAC,GAAA,KAAAC,KAKMN,GAAM,IAAM,IAAI,KAAK,EAAE,QAAQ,EAE/BC,GAAeM,IAASP,GAAI,EAAIO,GAAQ,IAExCL,GAAN,KAAwB,CACtB,YAAYM,EAAY,CACtB,KAAK,oBAAsB,KAAK,oBAAoB,KAAK,IAAI,EAC7D,KAAK,WAAaA,EAClB,KAAK,kBAAoB,CAC3B,CAEA,OAAQ,CACD,KAAK,UAAU,IAClB,KAAK,UAAYR,GAAI,EACrB,OAAO,KAAK,UACZ,KAAK,aAAa,EAClB,iBAAiB,mBAAoB,KAAK,mBAAmB,EAC7DS,GAAO,IAAI,gDAAgD,KAAK,YAAY,cAAc,IAAI,EAElG,CAEA,MAAO,CACD,KAAK,UAAU,IACjB,KAAK,UAAYT,GAAI,EACrB,KAAK,YAAY,EACjB,oBAAoB,mBAAoB,KAAK,mBAAmB,EAChES,GAAO,IAAI,2BAA2B,EAE1C,CAEA,WAAY,CACV,OAAO,KAAK,WAAa,CAAC,KAAK,SACjC,CAEA,eAAgB,CACd,KAAK,SAAWT,GAAI,CACtB,CAEA,eAAgB,CACd,KAAK,kBAAoB,EACzB,OAAO,KAAK,eACZS,GAAO,IAAI,oCAAoC,CACjD,CAEA,kBAAmB,CACjB,KAAK,eAAiBT,GAAI,EAC1BS,GAAO,IAAI,uCAAuC,CACpD,CAIA,cAAe,CACb,KAAK,YAAY,EACjB,KAAK,KAAK,CACZ,CAEA,aAAc,CACZ,aAAa,KAAK,WAAW,CAC/B,CAEA,MAAO,CACL,KAAK,YAAc,WAAW,IAAM,CAClC,KAAK,iBAAiB,EACtB,KAAK,KAAK,CACZ,EACE,KAAK,gBAAgB,CAAC,CAC1B,CAEA,iBAAkB,CAChB,GAAM,CAAE,eAAAC,EAAgB,wBAAAC,CAAwB,EAAI,KAAK,YACnDC,EAAU,KAAK,IAAI,EAAID,EAAyB,KAAK,IAAI,KAAK,kBAAmB,EAAE,CAAC,EAEpFE,GADY,KAAK,oBAAsB,EAAI,EAAMF,GAC5B,KAAK,OAAO,EACvC,OAAOD,EAAiB,IAAOE,GAAW,EAAIC,EAChD,CAEA,kBAAmB,CACb,KAAK,kBAAkB,IACzBJ,GAAO,IAAI,oEAAoE,KAAK,iBAAiB,kBAAkBR,GAAa,KAAK,WAAW,CAAC,yBAAyB,KAAK,YAAY,cAAc,IAAI,EACjN,KAAK,oBACD,KAAK,qBAAqB,EAC5BQ,GAAO,IAAI,+EAA+ER,GAAa,KAAK,cAAc,CAAC,IAAI,GAE/HQ,GAAO,IAAI,6BAA6B,EACxC,KAAK,WAAW,OAAO,GAG7B,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,SAAW,KAAK,SAAW,KAAK,SAC9C,CAEA,mBAAoB,CAClB,OAAOR,GAAa,KAAK,WAAW,EAAI,KAAK,YAAY,cAC3D,CAEA,sBAAuB,CACrB,OAAO,KAAK,gBAAmBA,GAAa,KAAK,cAAc,EAAI,KAAK,YAAY,cACtF,CAEA,qBAAsB,CAChB,SAAS,kBAAoB,WAC/B,WAAW,IAAM,EACX,KAAK,kBAAkB,GAAK,CAAC,KAAK,WAAW,OAAO,KACtDQ,GAAO,IAAI,uFAAuF,SAAS,eAAe,EAAE,EAC5H,KAAK,WAAW,OAAO,EAE3B,EACE,GAAG,CAET,CAEF,EAEAP,GAAkB,eAAiB,EACnCA,GAAkB,wBAA0B,IAErCC,GAAQD,KC3Hf,IAAOY,GAAPC,GAAAC,GAAA,KAAOF,GAAQ,CACb,cAAiB,CACf,QAAW,UACX,WAAc,aACd,KAAQ,OACR,aAAgB,uBAChB,UAAa,qBACf,EACA,mBAAsB,CACpB,aAAgB,eAChB,gBAAmB,kBACnB,eAAkB,iBAClB,OAAU,QACZ,EACA,mBAAsB,SACtB,UAAa,CACX,sBACA,yBACF,CACF,ICnBA,IAOOG,GAAeC,GAChBC,GAEAC,GAEAC,GAwKCC,GApLPC,GAAAC,GAAA,KAAAC,KACAC,KACAC,KACAC,MAIM,CAAC,cAAAX,GAAe,UAAAC,IAAaW,IAC7BV,GAAqBD,GAAU,MAAM,EAAGA,GAAU,OAAS,CAAC,EAE5DE,GAAU,CAAC,EAAE,QAEbC,GAAN,KAAiB,CACf,YAAYS,EAAU,CACpB,KAAK,KAAO,KAAK,KAAK,KAAK,IAAI,EAC/B,KAAK,SAAWA,EAChB,KAAK,cAAgB,KAAK,SAAS,cACnC,KAAK,QAAU,IAAIC,GAAkB,IAAI,EACzC,KAAK,aAAe,EACtB,CAEA,KAAKC,EAAM,CACT,OAAI,KAAK,OAAO,GACd,KAAK,UAAU,KAAK,KAAK,UAAUA,CAAI,CAAC,EACjC,IAEA,EAEX,CAEA,MAAO,CACL,GAAI,KAAK,SAAS,EAChB,OAAAC,GAAO,IAAI,uDAAuD,KAAK,SAAS,CAAC,EAAE,EAC5E,GACF,CACL,IAAMC,EAAkB,CAAC,GAAGhB,GAAW,GAAG,KAAK,SAAS,cAAgB,CAAC,CAAC,EAC1E,OAAAe,GAAO,IAAI,uCAAuC,KAAK,SAAS,CAAC,mBAAmBC,CAAe,EAAE,EACjG,KAAK,WAAa,KAAK,uBAAuB,EAClD,KAAK,UAAY,IAAIC,GAAS,UAAU,KAAK,SAAS,IAAKD,CAAe,EAC1E,KAAK,qBAAqB,EAC1B,KAAK,QAAQ,MAAM,EACZ,EACT,CACF,CAEA,MAAM,CAAC,eAAAE,CAAc,EAAI,CAAC,eAAgB,EAAI,EAAG,CAG/C,GAFKA,GAAkB,KAAK,QAAQ,KAAK,EAErC,KAAK,OAAO,EACd,OAAO,KAAK,UAAU,MAAM,CAEhC,CAEA,QAAS,CAEP,GADAH,GAAO,IAAI,yCAAyC,KAAK,SAAS,CAAC,EAAE,EACjE,KAAK,SAAS,EAChB,GAAI,CACF,OAAO,KAAK,MAAM,CACpB,OAASI,EAAO,CACdJ,GAAO,IAAI,6BAA8BI,CAAK,CAChD,QACA,CACEJ,GAAO,IAAI,0BAA0B,KAAK,YAAY,WAAW,IAAI,EACrE,WAAW,KAAK,KAAM,KAAK,YAAY,WAAW,CACpD,KAEA,QAAO,KAAK,KAAK,CAErB,CAEA,aAAc,CACZ,GAAI,KAAK,UACP,OAAO,KAAK,UAAU,QAE1B,CAEA,QAAS,CACP,OAAO,KAAK,QAAQ,MAAM,CAC5B,CAEA,UAAW,CACT,OAAO,KAAK,QAAQ,OAAQ,YAAY,CAC1C,CAEA,kBAAmB,CACjB,OAAO,KAAK,QAAQ,kBAAoB,CAC1C,CAIA,qBAAsB,CACpB,OAAOb,GAAQ,KAAKD,GAAoB,KAAK,YAAY,CAAC,GAAK,CACjE,CAEA,WAAWmB,EAAQ,CACjB,OAAOlB,GAAQ,KAAKkB,EAAQ,KAAK,SAAS,CAAC,GAAK,CAClD,CAEA,UAAW,CACT,GAAI,KAAK,WACP,QAASC,KAASJ,GAAS,UACzB,GAAIA,GAAS,UAAUI,CAAK,IAAM,KAAK,UAAU,WAC/C,OAAOA,EAAM,YAAY,EAI/B,OAAO,IACT,CAEA,sBAAuB,CACrB,QAASC,KAAa,KAAK,OAAQ,CACjC,IAAMC,EAAU,KAAK,OAAOD,CAAS,EAAE,KAAK,IAAI,EAChD,KAAK,UAAU,KAAKA,CAAS,EAAE,EAAIC,CACrC,CACF,CAEA,wBAAyB,CACvB,QAASD,KAAa,KAAK,OACzB,KAAK,UAAU,KAAKA,CAAS,EAAE,EAAI,UAAW,CAAC,CAEnD,CAEF,EAEAnB,GAAW,YAAc,IAEzBA,GAAW,UAAU,OAAS,CAC5B,QAAQqB,EAAO,CACb,GAAI,CAAC,KAAK,oBAAoB,EAAK,OACnC,GAAM,CAAC,WAAAC,EAAY,QAAAC,EAAS,OAAAC,EAAQ,UAAAC,EAAW,KAAAC,CAAI,EAAI,KAAK,MAAML,EAAM,IAAI,EAE5E,OADA,KAAK,QAAQ,cAAc,EACnBK,EAAM,CACZ,KAAK9B,GAAc,QACjB,OAAI,KAAK,iBAAiB,IACxB,KAAK,mBAAqB,IAE5B,KAAK,QAAQ,cAAc,EACpB,KAAK,cAAc,OAAO,EACnC,KAAKA,GAAc,WACjB,OAAAgB,GAAO,IAAI,0BAA0BY,CAAM,EAAE,EACtC,KAAK,MAAM,CAAC,eAAgBC,CAAS,CAAC,EAC/C,KAAK7B,GAAc,KACjB,OAAO,KACT,KAAKA,GAAc,aAEjB,OADA,KAAK,cAAc,oBAAoB0B,CAAU,EAC7C,KAAK,oBACP,KAAK,mBAAqB,GACnB,KAAK,cAAc,OAAOA,EAAY,YAAa,CAAC,YAAa,EAAI,CAAC,GAEtE,KAAK,cAAc,OAAOA,EAAY,YAAa,CAAC,YAAa,EAAK,CAAC,EAElF,KAAK1B,GAAc,UACjB,OAAO,KAAK,cAAc,OAAO0B,CAAU,EAC7C,QACE,OAAO,KAAK,cAAc,OAAOA,EAAY,WAAYC,CAAO,CACpE,CACF,EAEA,MAAO,CAGL,GAFAX,GAAO,IAAI,kCAAkC,KAAK,YAAY,CAAC,eAAe,EAC9E,KAAK,aAAe,GAChB,CAAC,KAAK,oBAAoB,EAC5B,OAAAA,GAAO,IAAI,8DAA8D,EAClE,KAAK,MAAM,CAAC,eAAgB,EAAK,CAAC,CAE7C,EAEA,MAAMS,EAAO,CAEX,GADAT,GAAO,IAAI,yBAAyB,EAChC,MAAK,aACT,YAAK,aAAe,GACpB,KAAK,QAAQ,iBAAiB,EACvB,KAAK,cAAc,UAAU,eAAgB,CAAC,qBAAsB,KAAK,QAAQ,UAAU,CAAC,CAAC,CACtG,EAEA,OAAQ,CACNA,GAAO,IAAI,yBAAyB,CACtC,CACF,EAEOX,GAAQD,KCpLf,IA0DM2B,GAUeC,GApErBC,GAAAC,GAAA,KA0DMH,GAAS,SAASI,EAAQC,EAAY,CAC1C,GAAIA,GAAc,KAChB,QAASC,KAAOD,EAAY,CAC1B,IAAME,EAAQF,EAAWC,CAAG,EAC5BF,EAAOE,CAAG,EAAIC,CAChB,CAEF,OAAOH,CACT,EAEqBH,GAArB,KAAkC,CAChC,YAAYO,EAAUC,EAAS,CAAC,EAAGC,EAAO,CACxC,KAAK,SAAWF,EAChB,KAAK,WAAa,KAAK,UAAUC,CAAM,EACvCT,GAAO,KAAMU,CAAK,CACpB,CAGA,QAAQC,EAAQC,EAAO,CAAC,EAAG,CACzB,OAAAA,EAAK,OAASD,EACP,KAAK,KAAKC,CAAI,CACvB,CAEA,KAAKA,EAAM,CACT,OAAO,KAAK,SAAS,KAAK,CAAC,QAAS,UAAW,WAAY,KAAK,WAAY,KAAM,KAAK,UAAUA,CAAI,CAAC,CAAC,CACzG,CAEA,aAAc,CACZ,OAAO,KAAK,SAAS,cAAc,OAAO,IAAI,CAChD,CACF,ICxFA,IAKMC,GA4CCC,GAjDPC,GAAAC,GAAA,KAAAC,KAKMJ,GAAN,KAA4B,CAC1B,YAAYK,EAAe,CACzB,KAAK,cAAgBA,EACrB,KAAK,qBAAuB,CAAC,CAC/B,CAEA,UAAUC,EAAc,CACnB,KAAK,qBAAqB,QAAQA,CAAY,GAAK,IACpDC,GAAO,IAAI,sCAAsCD,EAAa,UAAU,EAAE,EAC1E,KAAK,qBAAqB,KAAKA,CAAY,GAG3CC,GAAO,IAAI,8CAA8CD,EAAa,UAAU,EAAE,EAEpF,KAAK,kBAAkB,CACzB,CAEA,OAAOA,EAAc,CACnBC,GAAO,IAAI,oCAAoCD,EAAa,UAAU,EAAE,EACxE,KAAK,qBAAwB,KAAK,qBAAqB,OAAQE,GAAMA,IAAMF,CAAY,CACzF,CAEA,mBAAoB,CAClB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,CACxB,CAEA,kBAAmB,CACjB,aAAa,KAAK,YAAY,CAChC,CAEA,kBAAmB,CACjB,KAAK,aAAe,WAAW,IAAM,CAC/B,KAAK,eAAiB,OAAO,KAAK,cAAc,WAAe,YACjE,KAAK,qBAAqB,IAAKA,GAAiB,CAC9CC,GAAO,IAAI,uCAAuCD,EAAa,UAAU,EAAE,EAC3E,KAAK,cAAc,UAAUA,CAAY,CAC3C,CAAC,CAEL,EACE,GAAG,CACP,CACF,EAEOL,GAAQD,KCjDf,IAcqBS,GAdrBC,GAAAC,GAAA,KAAAC,KACAC,KACAC,KAYqBL,GAArB,KAAmC,CACjC,YAAYM,EAAU,CACpB,KAAK,SAAWA,EAChB,KAAK,UAAY,IAAIC,GAAsB,IAAI,EAC/C,KAAK,cAAgB,CAAC,CACxB,CAEA,OAAOC,EAAaC,EAAO,CACzB,IAAMC,EAAUF,EACVG,EAAS,OAAOD,GAAY,SAAWA,EAAU,CAAC,QAAAA,CAAO,EACzDE,EAAe,IAAIC,GAAa,KAAK,SAAUF,EAAQF,CAAK,EAClE,OAAO,KAAK,IAAIG,CAAY,CAC9B,CAIA,IAAIA,EAAc,CAChB,YAAK,cAAc,KAAKA,CAAY,EACpC,KAAK,SAAS,uBAAuB,EACrC,KAAK,OAAOA,EAAc,aAAa,EACvC,KAAK,UAAUA,CAAY,EACpBA,CACT,CAEA,OAAOA,EAAc,CACnB,YAAK,OAAOA,CAAY,EACnB,KAAK,QAAQA,EAAa,UAAU,EAAE,QACzC,KAAK,YAAYA,EAAc,aAAa,EAEvCA,CACT,CAEA,OAAOE,EAAY,CACjB,OAAO,KAAK,QAAQA,CAAU,EAAE,IAAKF,IACnC,KAAK,OAAOA,CAAY,EACxB,KAAK,OAAOA,EAAc,UAAU,EAC7BA,EACR,CACH,CAEA,OAAOA,EAAc,CACnB,YAAK,UAAU,OAAOA,CAAY,EAClC,KAAK,cAAiB,KAAK,cAAc,OAAQG,GAAMA,IAAMH,CAAY,EAClEA,CACT,CAEA,QAAQE,EAAY,CAClB,OAAO,KAAK,cAAc,OAAQC,GAAMA,EAAE,aAAeD,CAAU,CACrE,CAEA,QAAS,CACP,OAAO,KAAK,cAAc,IAAKF,GAC7B,KAAK,UAAUA,CAAY,CAAC,CAChC,CAEA,UAAUI,KAAiBC,EAAM,CAC/B,OAAO,KAAK,cAAc,IAAKL,GAC7B,KAAK,OAAOA,EAAcI,EAAc,GAAGC,CAAI,CAAC,CACpD,CAEA,OAAOL,EAAcI,KAAiBC,EAAM,CAC1C,IAAIC,EACJ,OAAI,OAAON,GAAiB,SAC1BM,EAAgB,KAAK,QAAQN,CAAY,EAEzCM,EAAgB,CAACN,CAAY,EAGxBM,EAAc,IAAKN,GACvB,OAAOA,EAAaI,CAAY,GAAM,WAAaJ,EAAaI,CAAY,EAAE,GAAGC,CAAI,EAAI,MAAU,CACxG,CAEA,UAAUL,EAAc,CAClB,KAAK,YAAYA,EAAc,WAAW,GAC5C,KAAK,UAAU,UAAUA,CAAY,CAEzC,CAEA,oBAAoBE,EAAY,CAC9BK,GAAO,IAAI,0BAA0BL,CAAU,EAAE,EACjD,KAAK,QAAQA,CAAU,EAAE,IAAKF,GAC5B,KAAK,UAAU,OAAOA,CAAY,CAAC,CACvC,CAEA,YAAYA,EAAcQ,EAAS,CACjC,GAAM,CAAC,WAAAN,CAAU,EAAIF,EACrB,OAAO,KAAK,SAAS,KAAK,CAAC,QAAAQ,EAAS,WAAAN,CAAU,CAAC,CACjD,CACF,ICtCO,SAASO,GAAmBC,EAAK,CAKtC,GAJI,OAAOA,GAAQ,aACjBA,EAAMA,EAAI,GAGRA,GAAO,CAAC,UAAU,KAAKA,CAAG,EAAG,CAC/B,IAAMC,EAAI,SAAS,cAAc,GAAG,EACpC,OAAAA,EAAE,KAAOD,EAETC,EAAE,KAAOA,EAAE,KACXA,EAAE,SAAWA,EAAE,SAAS,QAAQ,OAAQ,IAAI,EACrCA,EAAE,IACX,KACE,QAAOD,CAEX,CA/EA,IA6BqBE,GA7BrBC,GAAAC,GAAA,KAAAC,KACAC,KA4BqBJ,GAArB,KAA8B,CAC5B,YAAYF,EAAK,CACf,KAAK,KAAOA,EACZ,KAAK,cAAgB,IAAIO,GAAc,IAAI,EAC3C,KAAK,WAAa,IAAIC,GAAW,IAAI,EACrC,KAAK,aAAe,CAAC,CACvB,CAEA,IAAI,KAAM,CACR,OAAOT,GAAmB,KAAK,IAAI,CACrC,CAEA,KAAKU,EAAM,CACT,OAAO,KAAK,WAAW,KAAKA,CAAI,CAClC,CAEA,SAAU,CACR,OAAO,KAAK,WAAW,KAAK,CAC9B,CAEA,YAAa,CACX,OAAO,KAAK,WAAW,MAAM,CAAC,eAAgB,EAAK,CAAC,CACtD,CAEA,wBAAyB,CACvB,GAAI,CAAC,KAAK,WAAW,SAAS,EAC5B,OAAO,KAAK,WAAW,KAAK,CAEhC,CAEA,eAAeC,EAAa,CAC1B,KAAK,aAAe,CAAC,GAAG,KAAK,aAAcA,CAAW,CACxD,CACF,IC9DA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,gBAAAE,GAAA,sBAAAC,GAAA,aAAAC,GAAA,aAAAC,GAAA,iBAAAC,GAAA,0BAAAC,GAAA,kBAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,uBAAAC,GAAA,cAAAC,GAAA,WAAAC,KAuBO,SAASH,GAAeI,EAAMF,GAAU,KAAK,GAAKP,GAAS,mBAAoB,CACpF,OAAO,IAAID,GAASU,CAAG,CACzB,CAEO,SAASF,GAAUG,EAAM,CAC9B,IAAMC,EAAU,SAAS,KAAK,cAAc,2BAA2BD,CAAI,IAAI,EAC/E,GAAIC,EACF,OAAOA,EAAQ,aAAa,SAAS,CAEzC,CAhCA,IAAAC,GAAAC,GAAA,KAAAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,OCRA,IAAAC,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAAC,SAASC,EAAQC,EAAS,CACzB,OAAOH,IAAY,UAAY,OAAOC,IAAW,YAAcE,EAAQH,EAAO,EAAI,OAAO,QAAW,YAAc,OAAO,IAAM,OAAO,CAAE,SAAU,EAAGG,CAAO,EAAIA,EAAQD,EAAO,cAAgB,CAAC,CAAC,CACnM,GAAGF,GAAM,SAASA,EAAS,CACzB,aACA,SAASI,EAAqBC,GAAIJ,GAAQ,CACxC,OAAOA,GAAS,CACd,QAAS,CAAC,CACZ,EAAGI,GAAGJ,GAAQA,GAAO,OAAO,EAAGA,GAAO,OACxC,CACA,IAAIK,EAAWF,EAAqB,SAASH,GAAQD,GAAS,EAC3D,SAASG,EAAS,CAEfF,GAAO,QAAUE,EAAQ,CAE7B,GAAG,SAASI,EAAW,CACrB,IAAIC,GAAU,CAAE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,EAC/F,SAASC,GAASC,EAAGC,EAAG,CACtB,IAAIC,EAAIF,EAAE,CAAC,EAAGG,EAAIH,EAAE,CAAC,EAAGI,EAAIJ,EAAE,CAAC,EAAGK,EAAIL,EAAE,CAAC,EACzCE,IAAMC,EAAIC,EAAI,CAACD,EAAIE,GAAKJ,EAAE,CAAC,EAAI,UAAY,EAC3CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAI,CAACD,EAAIE,GAAKH,EAAE,CAAC,EAAI,UAAY,EAC3CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAI,CAACG,EAAIF,GAAKF,EAAE,CAAC,EAAI,UAAY,EAC3CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIF,GAAKD,EAAE,CAAC,EAAI,WAAa,EAC5CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIE,GAAKJ,EAAE,CAAC,EAAI,UAAY,EAC3CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAI,CAACD,EAAIE,GAAKH,EAAE,CAAC,EAAI,WAAa,EAC5CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAI,CAACG,EAAIF,GAAKF,EAAE,CAAC,EAAI,WAAa,EAC5CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIF,GAAKD,EAAE,CAAC,EAAI,SAAW,EAC1CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIE,GAAKJ,EAAE,CAAC,EAAI,WAAa,EAC5CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAI,CAACD,EAAIE,GAAKH,EAAE,CAAC,EAAI,WAAa,EAC5CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAI,CAACG,EAAIF,GAAKF,EAAE,EAAE,EAAI,MAAQ,EACxCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIF,GAAKD,EAAE,EAAE,EAAI,WAAa,EAC7CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIE,GAAKJ,EAAE,EAAE,EAAI,WAAa,EAC7CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAI,CAACD,EAAIE,GAAKH,EAAE,EAAE,EAAI,SAAW,EAC3CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAI,CAACG,EAAIF,GAAKF,EAAE,EAAE,EAAI,WAAa,EAC7CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAI,CAACD,EAAIF,GAAKD,EAAE,EAAE,EAAI,WAAa,EAC7CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIE,EAAID,EAAI,CAACC,GAAKJ,EAAE,CAAC,EAAI,UAAY,EAC3CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIE,EAAID,EAAI,CAACC,GAAKH,EAAE,CAAC,EAAI,WAAa,EAC5CI,GAAKA,GAAK,EAAIA,IAAM,IAAMH,EAAI,EAC9BE,IAAMC,EAAIF,EAAID,EAAI,CAACC,GAAKF,EAAE,EAAE,EAAI,UAAY,EAC5CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIF,EAAIG,EAAI,CAACH,GAAKD,EAAE,CAAC,EAAI,UAAY,EAC3CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIE,EAAID,EAAI,CAACC,GAAKJ,EAAE,CAAC,EAAI,UAAY,EAC3CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIE,EAAID,EAAI,CAACC,GAAKH,EAAE,EAAE,EAAI,SAAW,EAC3CI,GAAKA,GAAK,EAAIA,IAAM,IAAMH,EAAI,EAC9BE,IAAMC,EAAIF,EAAID,EAAI,CAACC,GAAKF,EAAE,EAAE,EAAI,UAAY,EAC5CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIF,EAAIG,EAAI,CAACH,GAAKD,EAAE,CAAC,EAAI,UAAY,EAC3CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIE,EAAID,EAAI,CAACC,GAAKJ,EAAE,CAAC,EAAI,UAAY,EAC3CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIE,EAAID,EAAI,CAACC,GAAKH,EAAE,EAAE,EAAI,WAAa,EAC7CI,GAAKA,GAAK,EAAIA,IAAM,IAAMH,EAAI,EAC9BE,IAAMC,EAAIF,EAAID,EAAI,CAACC,GAAKF,EAAE,CAAC,EAAI,UAAY,EAC3CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIF,EAAIG,EAAI,CAACH,GAAKD,EAAE,CAAC,EAAI,WAAa,EAC5CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIE,EAAID,EAAI,CAACC,GAAKJ,EAAE,EAAE,EAAI,WAAa,EAC7CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIE,EAAID,EAAI,CAACC,GAAKH,EAAE,CAAC,EAAI,SAAW,EAC1CI,GAAKA,GAAK,EAAIA,IAAM,IAAMH,EAAI,EAC9BE,IAAMC,EAAIF,EAAID,EAAI,CAACC,GAAKF,EAAE,CAAC,EAAI,WAAa,EAC5CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIF,EAAIG,EAAI,CAACH,GAAKD,EAAE,EAAE,EAAI,WAAa,EAC7CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAIC,GAAKJ,EAAE,CAAC,EAAI,OAAS,EACnCC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAIC,GAAKH,EAAE,CAAC,EAAI,WAAa,EACvCI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAIC,GAAKF,EAAE,EAAE,EAAI,WAAa,EACxCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAIH,GAAKD,EAAE,EAAE,EAAI,SAAW,EACtCE,GAAKA,GAAK,GAAKA,IAAM,GAAKC,EAAI,EAC9BF,IAAMC,EAAIC,EAAIC,GAAKJ,EAAE,CAAC,EAAI,WAAa,EACvCC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAIC,GAAKH,EAAE,CAAC,EAAI,WAAa,EACvCI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAIC,GAAKF,EAAE,CAAC,EAAI,UAAY,EACtCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAIH,GAAKD,EAAE,EAAE,EAAI,WAAa,EACxCE,GAAKA,GAAK,GAAKA,IAAM,GAAKC,EAAI,EAC9BF,IAAMC,EAAIC,EAAIC,GAAKJ,EAAE,EAAE,EAAI,UAAY,EACvCC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAIC,GAAKH,EAAE,CAAC,EAAI,UAAY,EACtCI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAIC,GAAKF,EAAE,CAAC,EAAI,UAAY,EACtCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAIH,GAAKD,EAAE,CAAC,EAAI,SAAW,EACrCE,GAAKA,GAAK,GAAKA,IAAM,GAAKC,EAAI,EAC9BF,IAAMC,EAAIC,EAAIC,GAAKJ,EAAE,CAAC,EAAI,UAAY,EACtCC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMH,EAAIC,EAAIC,GAAKH,EAAE,EAAE,EAAI,UAAY,EACvCI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMC,EAAIH,EAAIC,GAAKF,EAAE,EAAE,EAAI,UAAY,EACvCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAMC,EAAIC,EAAIH,GAAKD,EAAE,CAAC,EAAI,UAAY,EACtCE,GAAKA,GAAK,GAAKA,IAAM,GAAKC,EAAI,EAC9BF,IAAME,GAAKD,EAAI,CAACE,IAAMJ,EAAE,CAAC,EAAI,UAAY,EACzCC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMF,GAAKD,EAAI,CAACE,IAAMH,EAAE,CAAC,EAAI,WAAa,EAC1CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMF,GAAKG,EAAI,CAACF,IAAMF,EAAE,EAAE,EAAI,WAAa,EAC3CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACF,IAAMD,EAAE,CAAC,EAAI,SAAW,EACxCE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACE,IAAMJ,EAAE,EAAE,EAAI,WAAa,EAC3CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMF,GAAKD,EAAI,CAACE,IAAMH,EAAE,CAAC,EAAI,WAAa,EAC1CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMF,GAAKG,EAAI,CAACF,IAAMF,EAAE,EAAE,EAAI,QAAU,EACxCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACF,IAAMD,EAAE,CAAC,EAAI,WAAa,EAC1CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACE,IAAMJ,EAAE,CAAC,EAAI,WAAa,EAC1CC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMF,GAAKD,EAAI,CAACE,IAAMH,EAAE,EAAE,EAAI,SAAW,EACzCI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMF,GAAKG,EAAI,CAACF,IAAMF,EAAE,CAAC,EAAI,WAAa,EAC1CG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACF,IAAMD,EAAE,EAAE,EAAI,WAAa,EAC3CE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACE,IAAMJ,EAAE,CAAC,EAAI,UAAY,EACzCC,GAAKA,GAAK,EAAIA,IAAM,IAAMC,EAAI,EAC9BE,IAAMF,GAAKD,EAAI,CAACE,IAAMH,EAAE,EAAE,EAAI,WAAa,EAC3CI,GAAKA,GAAK,GAAKA,IAAM,IAAMH,EAAI,EAC/BE,IAAMF,GAAKG,EAAI,CAACF,IAAMF,EAAE,CAAC,EAAI,UAAY,EACzCG,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BF,IAAME,GAAKD,EAAI,CAACF,IAAMD,EAAE,CAAC,EAAI,UAAY,EACzCE,GAAKA,GAAK,GAAKA,IAAM,IAAMC,EAAI,EAC/BJ,EAAE,CAAC,EAAIE,EAAIF,EAAE,CAAC,EAAI,EAClBA,EAAE,CAAC,EAAIG,EAAIH,EAAE,CAAC,EAAI,EAClBA,EAAE,CAAC,EAAII,EAAIJ,EAAE,CAAC,EAAI,EAClBA,EAAE,CAAC,EAAIK,EAAIL,EAAE,CAAC,EAAI,CACpB,CACA,SAASM,GAAOC,EAAG,CACjB,IAAIC,EAAU,CAAC,EAAGC,EAClB,IAAKA,EAAI,EAAGA,EAAI,GAAIA,GAAK,EACvBD,EAAQC,GAAK,CAAC,EAAIF,EAAE,WAAWE,CAAC,GAAKF,EAAE,WAAWE,EAAI,CAAC,GAAK,IAAMF,EAAE,WAAWE,EAAI,CAAC,GAAK,KAAOF,EAAE,WAAWE,EAAI,CAAC,GAAK,IAEzH,OAAOD,CACT,CACA,SAASE,GAAaR,EAAG,CACvB,IAAIM,EAAU,CAAC,EAAGC,EAClB,IAAKA,EAAI,EAAGA,EAAI,GAAIA,GAAK,EACvBD,EAAQC,GAAK,CAAC,EAAIP,EAAEO,CAAC,GAAKP,EAAEO,EAAI,CAAC,GAAK,IAAMP,EAAEO,EAAI,CAAC,GAAK,KAAOP,EAAEO,EAAI,CAAC,GAAK,IAE7E,OAAOD,CACT,CACA,SAASG,GAAKJ,EAAG,CACf,IAAIK,EAAIL,EAAE,OAAQM,EAAQ,CAAE,WAAY,WAAY,YAAa,SAAU,EAAGJ,EAAGK,EAAQC,EAAMC,GAAKC,GAAIC,GACxG,IAAKT,EAAI,GAAIA,GAAKG,EAAGH,GAAK,GACxBV,GAASc,EAAOP,GAAOC,EAAE,UAAUE,EAAI,GAAIA,CAAC,CAAC,CAAC,EAKhD,IAHAF,EAAIA,EAAE,UAAUE,EAAI,EAAE,EACtBK,EAASP,EAAE,OACXQ,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EACnDN,EAAI,EAAGA,EAAIK,EAAQL,GAAK,EAC3BM,EAAKN,GAAK,CAAC,GAAKF,EAAE,WAAWE,CAAC,IAAMA,EAAI,GAAK,GAG/C,GADAM,EAAKN,GAAK,CAAC,GAAK,MAAQA,EAAI,GAAK,GAC7BA,EAAI,GAEN,IADAV,GAASc,EAAOE,CAAI,EACfN,EAAI,EAAGA,EAAI,GAAIA,GAAK,EACvBM,EAAKN,CAAC,EAAI,EAGd,OAAAO,GAAMJ,EAAI,EACVI,GAAMA,GAAI,SAAS,EAAE,EAAE,MAAM,gBAAgB,EAC7CC,GAAK,SAASD,GAAI,CAAC,EAAG,EAAE,EACxBE,GAAK,SAASF,GAAI,CAAC,EAAG,EAAE,GAAK,EAC7BD,EAAK,EAAE,EAAIE,GACXF,EAAK,EAAE,EAAIG,GACXnB,GAASc,EAAOE,CAAI,EACbF,CACT,CACA,SAASM,GAAWjB,EAAG,CACrB,IAAIU,EAAIV,EAAE,OAAQW,EAAQ,CAAE,WAAY,WAAY,YAAa,SAAU,EAAGJ,EAAGK,EAAQC,EAAMC,GAAKC,GAAIC,GACxG,IAAKT,EAAI,GAAIA,GAAKG,EAAGH,GAAK,GACxBV,GAASc,EAAOH,GAAaR,EAAE,SAASO,EAAI,GAAIA,CAAC,CAAC,CAAC,EAKrD,IAHAP,EAAIO,EAAI,GAAKG,EAAIV,EAAE,SAASO,EAAI,EAAE,EAAI,IAAI,WAAW,CAAC,EACtDK,EAASZ,EAAE,OACXa,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EACnDN,EAAI,EAAGA,EAAIK,EAAQL,GAAK,EAC3BM,EAAKN,GAAK,CAAC,GAAKP,EAAEO,CAAC,IAAMA,EAAI,GAAK,GAGpC,GADAM,EAAKN,GAAK,CAAC,GAAK,MAAQA,EAAI,GAAK,GAC7BA,EAAI,GAEN,IADAV,GAASc,EAAOE,CAAI,EACfN,EAAI,EAAGA,EAAI,GAAIA,GAAK,EACvBM,EAAKN,CAAC,EAAI,EAGd,OAAAO,GAAMJ,EAAI,EACVI,GAAMA,GAAI,SAAS,EAAE,EAAE,MAAM,gBAAgB,EAC7CC,GAAK,SAASD,GAAI,CAAC,EAAG,EAAE,EACxBE,GAAK,SAASF,GAAI,CAAC,EAAG,EAAE,GAAK,EAC7BD,EAAK,EAAE,EAAIE,GACXF,EAAK,EAAE,EAAIG,GACXnB,GAASc,EAAOE,CAAI,EACbF,CACT,CACA,SAASO,GAAKR,EAAG,CACf,IAAIL,EAAI,GAAIc,EACZ,IAAKA,EAAI,EAAGA,EAAI,EAAGA,GAAK,EACtBd,GAAKT,GAAQc,GAAKS,EAAI,EAAI,EAAI,EAAE,EAAIvB,GAAQc,GAAKS,EAAI,EAAI,EAAE,EAE7D,OAAOd,CACT,CACA,SAASe,GAAItB,EAAG,CACd,IAAIS,EACJ,IAAKA,EAAI,EAAGA,EAAIT,EAAE,OAAQS,GAAK,EAC7BT,EAAES,CAAC,EAAIW,GAAKpB,EAAES,CAAC,CAAC,EAElB,OAAOT,EAAE,KAAK,EAAE,CAClB,CACIsB,GAAIX,GAAK,OAAO,CAAC,EACjB,OAAO,aAAgB,aAAe,CAAC,YAAY,UAAU,QAC9D,UAAW,CACV,SAASY,EAAMC,EAAKV,EAAQ,CAE1B,OADAU,EAAMA,EAAM,GAAK,EACbA,EAAM,EACD,KAAK,IAAIA,EAAMV,EAAQ,CAAC,EAE1B,KAAK,IAAIU,EAAKV,CAAM,CAC7B,CACA,YAAY,UAAU,MAAQ,SAASW,EAAMC,EAAI,CAC/C,IAAIZ,EAAS,KAAK,WAAYa,EAAQJ,EAAME,EAAMX,CAAM,EAAGc,EAAMd,EAAQe,GAAKC,GAAQC,GAAaC,GAInG,OAHIN,IAAO7B,IACT+B,EAAML,EAAMG,EAAIZ,CAAM,GAEpBa,EAAQC,EACH,IAAI,YAAY,CAAC,GAE1BC,GAAMD,EAAMD,EACZG,GAAS,IAAI,YAAYD,EAAG,EAC5BE,GAAc,IAAI,WAAWD,EAAM,EACnCE,GAAc,IAAI,WAAW,KAAML,EAAOE,EAAG,EAC7CE,GAAY,IAAIC,EAAW,EACpBF,GACT,CACF,GAAG,EAEL,SAASG,GAAOC,EAAK,CACnB,MAAI,kBAAkB,KAAKA,CAAG,IAC5BA,EAAM,SAAS,mBAAmBA,CAAG,CAAC,GAEjCA,CACT,CACA,SAASC,GAAoBD,EAAKE,EAAkB,CAClD,IAAItB,EAASoB,EAAI,OAAQG,EAAO,IAAI,YAAYvB,CAAM,EAAGwB,EAAM,IAAI,WAAWD,CAAI,EAAG5B,EACrF,IAAKA,EAAI,EAAGA,EAAIK,EAAQL,GAAK,EAC3B6B,EAAI7B,CAAC,EAAIyB,EAAI,WAAWzB,CAAC,EAE3B,OAAO2B,EAAmBE,EAAMD,CAClC,CACA,SAASE,GAAoBF,EAAM,CACjC,OAAO,OAAO,aAAa,MAAM,KAAM,IAAI,WAAWA,CAAI,CAAC,CAC7D,CACA,SAASG,GAAwBC,EAAOC,EAAQN,EAAkB,CAChE,IAAIO,EAAS,IAAI,WAAWF,EAAM,WAAaC,EAAO,UAAU,EAChE,OAAAC,EAAO,IAAI,IAAI,WAAWF,CAAK,CAAC,EAChCE,EAAO,IAAI,IAAI,WAAWD,CAAM,EAAGD,EAAM,UAAU,EAC5CL,EAAmBO,EAASA,EAAO,MAC5C,CACA,SAASC,GAAkBtB,EAAK,CAC9B,IAAIuB,EAAQ,CAAC,EAAG/B,EAASQ,EAAI,OAAQ,EACrC,IAAK,EAAI,EAAG,EAAIR,EAAS,EAAG,GAAK,EAC/B+B,EAAM,KAAK,SAASvB,EAAI,OAAO,EAAG,CAAC,EAAG,EAAE,CAAC,EAE3C,OAAO,OAAO,aAAa,MAAM,OAAQuB,CAAK,CAChD,CACA,SAASC,IAAW,CAClB,KAAK,MAAM,CACb,CACA,OAAAA,GAAS,UAAU,OAAS,SAASZ,EAAK,CACxC,YAAK,aAAaD,GAAOC,CAAG,CAAC,EACtB,IACT,EACAY,GAAS,UAAU,aAAe,SAASC,EAAU,CACnD,KAAK,OAASA,EACd,KAAK,SAAWA,EAAS,OACzB,IAAIjC,EAAS,KAAK,MAAM,OAAQL,EAChC,IAAKA,EAAI,GAAIA,GAAKK,EAAQL,GAAK,GAC7BV,GAAS,KAAK,MAAOO,GAAO,KAAK,MAAM,UAAUG,EAAI,GAAIA,CAAC,CAAC,CAAC,EAE9D,YAAK,MAAQ,KAAK,MAAM,UAAUA,EAAI,EAAE,EACjC,IACT,EACAqC,GAAS,UAAU,IAAM,SAASE,EAAK,CACrC,IAAIX,EAAO,KAAK,MAAOvB,EAASuB,EAAK,OAAQ5B,EAAGM,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAGkC,EAC3G,IAAKxC,EAAI,EAAGA,EAAIK,EAAQL,GAAK,EAC3BM,EAAKN,GAAK,CAAC,GAAK4B,EAAK,WAAW5B,CAAC,IAAMA,EAAI,GAAK,GAElD,YAAK,QAAQM,EAAMD,CAAM,EACzBmC,EAAM3B,GAAI,KAAK,KAAK,EAChB0B,IACFC,EAAML,GAAkBK,CAAG,GAE7B,KAAK,MAAM,EACJA,CACT,EACAH,GAAS,UAAU,MAAQ,UAAW,CACpC,YAAK,MAAQ,GACb,KAAK,QAAU,EACf,KAAK,MAAQ,CAAE,WAAY,WAAY,YAAa,SAAU,EACvD,IACT,EACAA,GAAS,UAAU,SAAW,UAAW,CACvC,MAAO,CACL,KAAM,KAAK,MACX,OAAQ,KAAK,QACb,KAAM,KAAK,KACb,CACF,EACAA,GAAS,UAAU,SAAW,SAASjC,EAAO,CAC5C,YAAK,MAAQA,EAAM,KACnB,KAAK,QAAUA,EAAM,OACrB,KAAK,MAAQA,EAAM,KACZ,IACT,EACAiC,GAAS,UAAU,QAAU,UAAW,CACtC,OAAO,KAAK,MACZ,OAAO,KAAK,MACZ,OAAO,KAAK,OACd,EACAA,GAAS,UAAU,QAAU,SAAS/B,EAAMD,EAAQ,CAClD,IAAIL,EAAIK,EAAQE,EAAKC,EAAIC,EAEzB,GADAH,EAAKN,GAAK,CAAC,GAAK,MAAQA,EAAI,GAAK,GAC7BA,EAAI,GAEN,IADAV,GAAS,KAAK,MAAOgB,CAAI,EACpBN,EAAI,EAAGA,EAAI,GAAIA,GAAK,EACvBM,EAAKN,CAAC,EAAI,EAGdO,EAAM,KAAK,QAAU,EACrBA,EAAMA,EAAI,SAAS,EAAE,EAAE,MAAM,gBAAgB,EAC7CC,EAAK,SAASD,EAAI,CAAC,EAAG,EAAE,EACxBE,EAAK,SAASF,EAAI,CAAC,EAAG,EAAE,GAAK,EAC7BD,EAAK,EAAE,EAAIE,EACXF,EAAK,EAAE,EAAIG,EACXnB,GAAS,KAAK,MAAOgB,CAAI,CAC3B,EACA+B,GAAS,KAAO,SAASZ,EAAKc,EAAK,CACjC,OAAOF,GAAS,WAAWb,GAAOC,CAAG,EAAGc,CAAG,CAC7C,EACAF,GAAS,WAAa,SAASI,EAASF,EAAK,CAC3C,IAAIG,EAAOxC,GAAKuC,CAAO,EAAGD,EAAM3B,GAAI6B,CAAI,EACxC,OAAOH,EAAMJ,GAAkBK,CAAG,EAAIA,CACxC,EACAH,GAAS,YAAc,UAAW,CAChC,KAAK,MAAM,CACb,EACAA,GAAS,YAAY,UAAU,OAAS,SAASR,EAAK,CACpD,IAAID,EAAOG,GAAwB,KAAK,MAAM,OAAQF,EAAK,EAAI,EAAGxB,EAASuB,EAAK,OAAQ5B,EAExF,IADA,KAAK,SAAW6B,EAAI,WACf7B,EAAI,GAAIA,GAAKK,EAAQL,GAAK,GAC7BV,GAAS,KAAK,MAAOW,GAAa2B,EAAK,SAAS5B,EAAI,GAAIA,CAAC,CAAC,CAAC,EAE7D,YAAK,MAAQA,EAAI,GAAKK,EAAS,IAAI,WAAWuB,EAAK,OAAO,MAAM5B,EAAI,EAAE,CAAC,EAAI,IAAI,WAAW,CAAC,EACpF,IACT,EACAqC,GAAS,YAAY,UAAU,IAAM,SAASE,EAAK,CACjD,IAAIX,EAAO,KAAK,MAAOvB,EAASuB,EAAK,OAAQtB,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAGN,EAAGwC,EAC3G,IAAKxC,EAAI,EAAGA,EAAIK,EAAQL,GAAK,EAC3BM,EAAKN,GAAK,CAAC,GAAK4B,EAAK5B,CAAC,IAAMA,EAAI,GAAK,GAEvC,YAAK,QAAQM,EAAMD,CAAM,EACzBmC,EAAM3B,GAAI,KAAK,KAAK,EAChB0B,IACFC,EAAML,GAAkBK,CAAG,GAE7B,KAAK,MAAM,EACJA,CACT,EACAH,GAAS,YAAY,UAAU,MAAQ,UAAW,CAChD,YAAK,MAAQ,IAAI,WAAW,CAAC,EAC7B,KAAK,QAAU,EACf,KAAK,MAAQ,CAAE,WAAY,WAAY,YAAa,SAAU,EACvD,IACT,EACAA,GAAS,YAAY,UAAU,SAAW,UAAW,CACnD,IAAIjC,EAAQiC,GAAS,UAAU,SAAS,KAAK,IAAI,EACjD,OAAAjC,EAAM,KAAO0B,GAAoB1B,EAAM,IAAI,EACpCA,CACT,EACAiC,GAAS,YAAY,UAAU,SAAW,SAASjC,EAAO,CACxD,OAAAA,EAAM,KAAOsB,GAAoBtB,EAAM,KAAM,EAAI,EAC1CiC,GAAS,UAAU,SAAS,KAAK,KAAMjC,CAAK,CACrD,EACAiC,GAAS,YAAY,UAAU,QAAUA,GAAS,UAAU,QAC5DA,GAAS,YAAY,UAAU,QAAUA,GAAS,UAAU,QAC5DA,GAAS,YAAY,KAAO,SAASR,EAAKU,EAAK,CAC7C,IAAIG,EAAOhC,GAAW,IAAI,WAAWmB,CAAG,CAAC,EAAGW,EAAM3B,GAAI6B,CAAI,EAC1D,OAAOH,EAAMJ,GAAkBK,CAAG,EAAIA,CACxC,EACOH,EACT,CAAC,CACH,CAAC,EACGM,EAAiB,SAASC,GAAUC,GAAa,CACnD,GAAI,EAAED,cAAoBC,IACxB,MAAM,IAAI,UAAU,mCAAmC,CAE3D,EACIC,GAAc,UAAW,CAC3B,SAASC,GAAiB1B,GAAQ2B,EAAO,CACvC,QAAShD,GAAI,EAAGA,GAAIgD,EAAM,OAAQhD,KAAK,CACrC,IAAIiD,GAAaD,EAAMhD,EAAC,EACxBiD,GAAW,WAAaA,GAAW,YAAc,GACjDA,GAAW,aAAe,GACtB,UAAWA,KAAYA,GAAW,SAAW,IACjD,OAAO,eAAe5B,GAAQ4B,GAAW,IAAKA,EAAU,CAC1D,CACF,CACA,OAAO,SAASJ,GAAaK,EAAYC,GAAa,CACpD,OAAID,GAAYH,GAAiBF,GAAY,UAAWK,CAAU,EAC9DC,IAAaJ,GAAiBF,GAAaM,EAAW,EACnDN,EACT,CACF,GAAE,EACEO,EAAY,KAAK,UAAU,OAAS,KAAK,UAAU,UAAY,KAAK,UAAU,YAC9EC,GAAe,UAAW,CAC5BP,EAAYO,GAAc,KAAM,CAAE,CAChC,IAAK,SACL,MAAO,SAAgBC,EAAMC,GAAU,CACrC,IAAIX,GAAW,IAAIS,GAAaC,CAAI,EACpCV,GAAS,OAAOW,EAAQ,CAC1B,CACF,CAAE,CAAC,EACH,SAASF,GAAaC,GAAM,CAC1BX,EAAe,KAAMU,EAAY,EACjC,KAAK,KAAOC,GACZ,KAAK,UAAY,QACjB,KAAK,WAAa,KAAK,KAAK,KAAK,KAAK,KAAO,KAAK,SAAS,EAC3D,KAAK,WAAa,CACpB,CACA,OAAAR,EAAYO,GAAc,CAAE,CAC1B,IAAK,SACL,MAAO,SAAgBE,EAAU,CAC/B,IAAIC,GAAQ,KACZ,KAAK,SAAWD,EAChB,KAAK,UAAY,IAAIpE,EAAS,YAC9B,KAAK,WAAa,IAAI,WACtB,KAAK,WAAW,iBAAiB,OAAQ,SAASsE,GAAO,CACvD,OAAOD,GAAM,kBAAkBC,EAAK,CACtC,CAAC,EACD,KAAK,WAAW,iBAAiB,QAAS,SAASA,GAAO,CACxD,OAAOD,GAAM,mBAAmBC,EAAK,CACvC,CAAC,EACD,KAAK,cAAc,CACrB,CACF,EAAG,CACD,IAAK,oBACL,MAAO,SAA2BA,EAAO,CAEvC,GADA,KAAK,UAAU,OAAOA,EAAM,OAAO,MAAM,EACrC,CAAC,KAAK,cAAc,EAAG,CACzB,IAAIC,GAAe,KAAK,UAAU,IAAI,EAAI,EACtCC,GAAe,KAAKD,EAAY,EACpC,KAAK,SAAS,KAAMC,EAAY,CAClC,CACF,CACF,EAAG,CACD,IAAK,qBACL,MAAO,SAA4BF,EAAO,CACxC,KAAK,SAAS,iBAAmB,KAAK,KAAK,IAAI,CACjD,CACF,EAAG,CACD,IAAK,gBACL,MAAO,UAAyB,CAC9B,GAAI,KAAK,WAAa,KAAK,YAAc,KAAK,YAAc,GAAK,KAAK,YAAc,EAAG,CACrF,IAAIG,EAAQ,KAAK,WAAa,KAAK,UAC/BzC,GAAM,KAAK,IAAIyC,EAAQ,KAAK,UAAW,KAAK,KAAK,IAAI,EACrDxB,GAAQgB,EAAU,KAAK,KAAK,KAAMQ,EAAOzC,EAAG,EAChD,YAAK,WAAW,kBAAkBiB,EAAK,EACvC,KAAK,aACE,EACT,KACE,OAAO,EAEX,CACF,CAAE,CAAC,EACIiB,EACT,GAAE,EACF,SAASQ,EAAaC,GAAM,CAC1B,IAAIC,GAAUC,EAAY,SAAS,KAAM,cAAgBF,GAAO,IAAI,EACpE,GAAIC,GACF,OAAOA,GAAQ,aAAa,SAAS,CAEzC,CACA,SAASE,EAAaC,GAAMC,GAAU,CAChC,OAAOD,IAAQ,WACjBC,GAAWD,GACXA,GAAO,UAET,IAAIE,EAAWF,GAAK,iBAAiBC,EAAQ,EAC7C,OAAOE,EAAUD,CAAQ,CAC3B,CACA,SAASJ,EAAYE,GAAMC,GAAU,CACnC,OAAI,OAAOD,IAAQ,WACjBC,GAAWD,GACXA,GAAO,UAEFA,GAAK,cAAcC,EAAQ,CACpC,CACA,SAASG,EAAcP,GAASQ,GAAM,CACpC,IAAIC,EAAY,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAC,EACjFC,GAAWV,GAAQ,SACnBW,GAAUF,EAAU,QAASG,GAAaH,EAAU,WAAYI,GAASJ,EAAU,OACnFf,GAAQ,SAAS,YAAY,OAAO,EACxCA,GAAM,UAAUc,GAAMG,IAAW,GAAMC,IAAc,EAAI,EACzDlB,GAAM,OAASmB,IAAU,CAAC,EAC1B,GAAI,CACFb,GAAQ,SAAW,GACnBA,GAAQ,cAAcN,EAAK,CAC7B,QAAE,CACAM,GAAQ,SAAWU,EACrB,CACA,OAAOhB,EACT,CACA,SAASY,EAAUQ,GAAO,CACxB,OAAI,MAAM,QAAQA,EAAK,EACdA,GACE,MAAM,KACR,MAAM,KAAKA,EAAK,EAEhB,CAAC,EAAE,MAAM,KAAKA,EAAK,CAE9B,CACA,IAAIC,GAAa,UAAW,CAC1B,SAASA,GAAWxB,GAAMyB,EAAUC,GAAK,CACvC,IAAIxB,GAAQ,KACZb,EAAe,KAAMmC,EAAU,EAC/B,KAAK,KAAOxB,GACZ,KAAK,WAAa,CAChB,SAAUA,GAAK,KACf,aAAcA,GAAK,KACnB,UAAWA,GAAK,KAChB,SAAUyB,CACZ,EACA,KAAK,IAAM,IAAI,eACf,KAAK,IAAI,KAAK,OAAQC,GAAK,EAAI,EAC/B,KAAK,IAAI,aAAe,OACxB,KAAK,IAAI,iBAAiB,eAAgB,kBAAkB,EAC5D,KAAK,IAAI,iBAAiB,SAAU,kBAAkB,EACtD,KAAK,IAAI,iBAAiB,mBAAoB,gBAAgB,EAC9D,IAAIC,GAAYpB,EAAa,YAAY,EACrCoB,IAAa,MACf,KAAK,IAAI,iBAAiB,eAAgBA,EAAS,EAErD,KAAK,IAAI,iBAAiB,OAAQ,SAASxB,GAAO,CAChD,OAAOD,GAAM,eAAeC,EAAK,CACnC,CAAC,EACD,KAAK,IAAI,iBAAiB,QAAS,SAASA,GAAO,CACjD,OAAOD,GAAM,gBAAgBC,EAAK,CACpC,CAAC,CACH,CACA,OAAAX,EAAYgC,GAAY,CAAE,CACxB,IAAK,SACL,MAAO,SAAgBvB,EAAU,CAC/B,KAAK,SAAWA,EAChB,KAAK,IAAI,KAAK,KAAK,UAAU,CAC3B,KAAM,KAAK,UACb,CAAC,CAAC,CACJ,CACF,EAAG,CACD,IAAK,iBACL,MAAO,SAAwBE,EAAO,CACpC,GAAI,KAAK,QAAU,KAAO,KAAK,OAAS,IAAK,CAC3C,IAAIyB,GAAW,KAAK,SAChBC,GAAgBD,GAAS,cAC7B,OAAOA,GAAS,cAChB,KAAK,WAAaA,GAClB,KAAK,iBAAmBC,GACxB,KAAK,SAAS,KAAM,KAAK,OAAO,CAAC,CACnC,MACE,KAAK,gBAAgB1B,CAAK,CAE9B,CACF,EAAG,CACD,IAAK,kBACL,MAAO,SAAyBA,EAAO,CACrC,KAAK,SAAS,4BAA8B,KAAK,KAAK,KAAO,cAAgB,KAAK,MAAM,CAC1F,CACF,EAAG,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,IAAIvB,EAAS,CAAC,EACd,QAASkD,MAAO,KAAK,WACnBlD,EAAOkD,EAAG,EAAI,KAAK,WAAWA,EAAG,EAEnC,OAAOlD,CACT,CACF,EAAG,CACD,IAAK,SACL,IAAK,UAAkB,CACrB,OAAO,KAAK,IAAI,MAClB,CACF,EAAG,CACD,IAAK,WACL,IAAK,UAAkB,CACrB,IAAImD,EAAO,KAAK,IAAKC,GAAeD,EAAK,aAAcH,GAAWG,EAAK,SACvE,OAAIC,IAAgB,OACXJ,GAEA,KAAK,MAAMA,EAAQ,CAE9B,CACF,CAAE,CAAC,EACIJ,EACT,GAAE,EACES,GAAa,UAAW,CAC1B,SAASA,GAAWC,GAAM,CACxB,IAAIhC,EAAQ,KACZb,EAAe,KAAM4C,EAAU,EAC/B,KAAK,KAAOC,GACZ,KAAK,KAAOA,GAAK,KACjB,IAAIC,GAAwBD,GAAK,iBAAkBR,GAAMS,GAAsB,IAAKC,GAAUD,GAAsB,QACpH,KAAK,IAAM,IAAI,eACf,KAAK,IAAI,KAAK,MAAOT,GAAK,EAAI,EAC9B,KAAK,IAAI,aAAe,OACxB,QAASI,MAAOM,GACd,KAAK,IAAI,iBAAiBN,GAAKM,GAAQN,EAAG,CAAC,EAE7C,KAAK,IAAI,iBAAiB,OAAQ,SAAS3B,GAAO,CAChD,OAAOD,EAAM,eAAeC,EAAK,CACnC,CAAC,EACD,KAAK,IAAI,iBAAiB,QAAS,SAASA,GAAO,CACjD,OAAOD,EAAM,gBAAgBC,EAAK,CACpC,CAAC,CACH,CACA,OAAAX,EAAYyC,GAAY,CAAE,CACxB,IAAK,SACL,MAAO,SAAgBhC,EAAU,CAC/B,KAAK,SAAWA,EAChB,KAAK,IAAI,KAAK,KAAK,KAAK,MAAM,CAAC,CACjC,CACF,EAAG,CACD,IAAK,iBACL,MAAO,SAAwBE,EAAO,CACpC,IAAI4B,GAAO,KAAK,IAAKM,GAASN,GAAK,OAAQH,GAAWG,GAAK,SACvDM,IAAU,KAAOA,GAAS,IAC5B,KAAK,SAAS,KAAMT,EAAQ,EAE5B,KAAK,gBAAgBzB,CAAK,CAE9B,CACF,EAAG,CACD,IAAK,kBACL,MAAO,SAAyBA,EAAO,CACrC,KAAK,SAAS,kBAAoB,KAAK,KAAK,KAAO,cAAgB,KAAK,IAAI,MAAM,CACpF,CACF,CAAE,CAAC,EACI8B,EACT,GAAE,EACEK,EAAK,EACLC,GAAe,UAAW,CAC5B,SAASA,GAAavC,GAAM0B,EAAKc,GAAU,CACzCnD,EAAe,KAAMkD,EAAY,EACjC,KAAK,GAAK,EAAED,EACZ,KAAK,KAAOtC,GACZ,KAAK,IAAM0B,EACX,KAAK,SAAWc,EAClB,CACA,OAAAhD,EAAY+C,GAAc,CAAE,CAC1B,IAAK,SACL,MAAO,SAAgBtC,EAAU,CAC/B,IAAIC,GAAQ,KACZH,EAAa,OAAO,KAAK,KAAM,SAAS0C,GAAOhB,GAAU,CACvD,GAAIgB,GAAO,CACTxC,EAASwC,EAAK,EACd,MACF,CACA,IAAIP,GAAO,IAAIV,EAAWtB,GAAM,KAAMuB,GAAUvB,GAAM,GAAG,EACzDwC,EAAOxC,GAAM,SAAU,oCAAqCgC,GAAK,GAAG,EACpEA,GAAK,OAAO,SAASO,GAAO,CAC1B,GAAIA,GACFxC,EAASwC,EAAK,MACT,CACL,IAAIE,GAAS,IAAIV,EAAWC,EAAI,EAChCQ,EAAOxC,GAAM,SAAU,mCAAoCyC,GAAO,GAAG,EACrEA,GAAO,OAAO,SAASF,GAAO,CACxBA,GACFxC,EAASwC,EAAK,EAEdxC,EAAS,KAAMiC,GAAK,OAAO,CAAC,CAEhC,CAAC,CACH,CACF,CAAC,CACH,CAAC,CACH,CACF,CAAE,CAAC,EACIK,EACT,GAAE,EACF,SAASG,EAAOE,GAAQC,GAAY,CAClC,GAAID,IAAU,OAAOA,GAAOC,EAAU,GAAK,WAAY,CACrD,QAASC,EAAO,UAAU,OAAQC,GAAW,MAAMD,EAAO,EAAIA,EAAO,EAAI,CAAC,EAAGE,GAAO,EAAGA,GAAOF,EAAME,KAClGD,GAASC,GAAO,CAAC,EAAI,UAAUA,EAAI,EAErC,OAAOJ,GAAOC,EAAU,EAAE,MAAMD,GAAQG,EAAQ,CAClD,CACF,CACA,IAAIE,IAAyB,UAAW,CACtC,SAASA,GAAuBC,GAAOlD,EAAM,CAC3CX,EAAe,KAAM4D,EAAsB,EAC3C,KAAK,MAAQC,GACb,KAAK,KAAOlD,EACZ,KAAK,aAAe,IAAIuC,EAAa,KAAK,KAAM,KAAK,IAAK,IAAI,EAC9D,KAAK,SAAS,YAAY,CAC5B,CACA,OAAA/C,EAAYyD,GAAwB,CAAE,CACpC,IAAK,QACL,MAAO,SAAehD,EAAU,CAC9B,IAAIC,GAAQ,KACRiD,GAAc,SAAS,cAAc,OAAO,EAChDA,GAAY,KAAO,SACnBA,GAAY,KAAO,KAAK,MAAM,KAC9B,KAAK,MAAM,sBAAsB,cAAeA,EAAW,EAC3D,KAAK,SAAS,OAAO,EACrB,KAAK,aAAa,OAAO,SAASV,GAAOW,GAAY,CAC/CX,IACFU,GAAY,WAAW,YAAYA,EAAW,EAC9CjD,GAAM,cAAcuC,EAAK,GAEzBU,GAAY,MAAQC,GAAW,UAEjClD,GAAM,SAAS,KAAK,EACpBD,EAASwC,EAAK,CAChB,CAAC,CACH,CACF,EAAG,CACD,IAAK,2BACL,MAAO,SAAkCtC,EAAO,CAC9C,IAAIkD,GAAWlD,EAAM,OAASA,EAAM,MAAQ,IACxCkD,IACF,KAAK,SAAS,WAAY,CACxB,SAAUA,EACZ,CAAC,CAEL,CACF,EAAG,CACD,IAAK,WACL,MAAO,SAAkB7C,EAAM,CAC7B,IAAIc,GAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAC,EAClF,OAAAA,GAAO,KAAO,KAAK,KACnBA,GAAO,GAAK,KAAK,aAAa,GACvBN,EAAc,KAAK,MAAO,iBAAmBR,EAAM,CACxD,OAAQc,EACV,CAAC,CACH,CACF,EAAG,CACD,IAAK,gBACL,MAAO,SAAuBmB,EAAO,CACnC,IAAItC,GAAQ,KAAK,SAAS,QAAS,CACjC,MAAOsC,CACT,CAAC,EACItC,GAAM,kBACT,MAAMsC,CAAK,CAEf,CACF,EAAG,CACD,IAAK,oCACL,MAAO,SAA2Ca,EAAK,CACrD,KAAK,SAAS,sBAAuB,CACnC,IAAKA,CACP,CAAC,CACH,CACF,EAAG,CACD,IAAK,mCACL,MAAO,SAA0CA,EAAK,CACpD,IAAIC,GAAS,KACb,KAAK,SAAS,yBAA0B,CACtC,IAAKD,CACP,CAAC,EACDA,EAAI,OAAO,iBAAiB,WAAY,SAASnD,GAAO,CACtD,OAAOoD,GAAO,yBAAyBpD,EAAK,CAC9C,CAAC,CACH,CACF,EAAG,CACD,IAAK,MACL,IAAK,UAAkB,CACrB,OAAO,KAAK,MAAM,aAAa,wBAAwB,CACzD,CACF,CAAE,CAAC,EACI8C,EACT,GAAE,EACEO,EAAgB,2DAChBC,GAA0B,UAAW,CACvC,SAASA,GAAwBC,GAAM,CACrCrE,EAAe,KAAMoE,EAAuB,EAC5C,KAAK,KAAOC,GACZ,KAAK,OAAS/C,EAAa+C,GAAMF,CAAa,EAAE,OAAO,SAASN,EAAO,CACrE,OAAOA,EAAM,MAAM,MACrB,CAAC,CACH,CACA,OAAA1D,EAAYiE,GAAyB,CAAE,CACrC,IAAK,QACL,MAAO,SAAexD,EAAU,CAC9B,IAAIC,GAAQ,KACRyD,GAAc,KAAK,8BAA8B,EACjDC,GAAsB,SAASA,IAAsB,CACvD,IAAIC,GAAaF,GAAY,MAAM,EAC/BE,GACFA,GAAW,MAAM,SAASpB,GAAO,CAC3BA,IACFxC,EAASwC,EAAK,EACdvC,GAAM,SAAS,KAAK,GAEpB0D,GAAoB,CAExB,CAAC,GAED3D,EAAS,EACTC,GAAM,SAAS,KAAK,EAExB,EACA,KAAK,SAAS,OAAO,EACrB0D,GAAoB,CACtB,CACF,EAAG,CACD,IAAK,gCACL,MAAO,UAAyC,CAC9C,IAAID,EAAc,CAAC,EACnB,YAAK,OAAO,QAAQ,SAAST,GAAO,CAClCnC,EAAUmC,GAAM,KAAK,EAAE,QAAQ,SAASlD,GAAM,CAC5C,IAAI6D,GAAa,IAAIZ,GAAuBC,GAAOlD,EAAI,EACvD2D,EAAY,KAAKE,EAAU,CAC7B,CAAC,CACH,CAAC,EACMF,CACT,CACF,EAAG,CACD,IAAK,WACL,MAAO,SAAkBnD,EAAM,CAC7B,IAAIc,GAAS,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAI,CAAC,EAClF,OAAON,EAAc,KAAK,KAAM,kBAAoBR,EAAM,CACxD,OAAQc,EACV,CAAC,CACH,CACF,CAAE,CAAC,EACImC,EACT,GAAE,EACEK,EAAsB,iCACtBC,EAAsB,IAAI,QAC1BC,EAAU,GACd,SAAS1D,IAAQ,CACV0D,IACHA,EAAU,GACV,SAAS,iBAAiB,QAASC,GAAU,EAAI,EACjD,SAAS,iBAAiB,SAAUC,EAAa,EACjD,SAAS,iBAAiB,cAAeC,EAAsB,EAEnE,CACA,SAASF,GAAS9D,GAAO,CACvB,IAAIpC,GAASoC,GAAM,QACdpC,GAAO,SAAW,SAAWA,GAAO,SAAW,WAAaA,GAAO,MAAQ,UAAYA,GAAO,MACjGgG,EAAoB,IAAIhG,GAAO,KAAMA,EAAM,CAE/C,CACA,SAASmG,GAAc/D,GAAO,CAC5BiE,GAA0BjE,EAAK,CACjC,CACA,SAASgE,GAAuBhE,GAAO,CACjCA,GAAM,OAAO,SAAW,QAC1BiE,GAA0BjE,EAAK,CAEnC,CACA,SAASiE,GAA0BjE,GAAO,CACxC,IAAIuD,GAAOvD,GAAM,OACjB,GAAIuD,GAAK,aAAaI,CAAmB,EAAG,CAC1C3D,GAAM,eAAe,EACrB,MACF,CACA,IAAI0D,EAAa,IAAIJ,EAAwBC,EAAI,EAC7CW,GAASR,EAAW,OACpBQ,GAAO,SACTlE,GAAM,eAAe,EACrBuD,GAAK,aAAaI,EAAqB,EAAE,EACzCO,GAAO,QAAQC,EAAO,EACtBT,EAAW,MAAM,SAASpB,GAAO,CAC/BiB,GAAK,gBAAgBI,CAAmB,EACpCrB,GACF4B,GAAO,QAAQE,EAAM,EAErBC,GAAWd,EAAI,CAEnB,CAAC,EAEL,CACA,SAASc,GAAWd,GAAM,CACxB,IAAIe,GAASV,EAAoB,IAAIL,EAAI,GAAKhD,EAAYgD,GAAM,yCAAyC,EACzG,GAAIe,GAAQ,CACV,IAAIC,EAAUD,GAAQtD,GAAWuD,EAAQ,SACzCD,GAAO,SAAW,GAClBA,GAAO,MAAM,EACbA,GAAO,MAAM,EACbA,GAAO,SAAWtD,EACpB,MACEsD,GAAS,SAAS,cAAc,OAAO,EACvCA,GAAO,KAAO,SACdA,GAAO,MAAM,QAAU,OACvBf,GAAK,YAAYe,EAAM,EACvBA,GAAO,MAAM,EACbf,GAAK,YAAYe,EAAM,EAEzBV,EAAoB,OAAOL,EAAI,CACjC,CACA,SAASY,GAAQpB,GAAO,CACtBA,GAAM,SAAW,EACnB,CACA,SAASqB,GAAOrB,GAAO,CACrBA,GAAM,SAAW,EACnB,CACA,SAASyB,IAAY,CACf,OAAO,eACTrE,GAAM,CAEV,CACA,WAAWqE,GAAW,CAAC,EACvBpJ,EAAQ,MAAQ+E,GAChB/E,EAAQ,aAAegH,EACvB,OAAO,eAAehH,EAAS,aAAc,CAC3C,MAAO,EACT,CAAC,CACH,CAAC,6LC76BD,IAAAqJ,EAAe,OAAOC,QAAW,aAAe,OAAOC,UAAa,aAAe,OAAOC,WAAc,YCElGC,GAAmB,UAAU,SAC3BC,EAAwB,CAAC,OAAQ,UAAW,SAApB,EACrBC,EAAI,EAAGA,EAAID,EAAsBE,OAAQD,GAAK,KACjDN,GAAaG,UAAUK,UAAUC,QAAQJ,EAAsBC,CAAtB,CAA5B,GAAyD,QACjE,SAGJ,KAPgB,EAUlB,SAASI,EAAkBC,EAAI,KAChCC,EAAS,UACN,UAAM,CACPA,MAGK,UACFC,QAAQC,QAAf,EAAyBC,KAAK,UAAM,GACzB,OADX,IAOG,SAASC,EAAaL,EAAI,KAC3BM,EAAY,UACT,UAAM,CACNA,MACS,cACD,UAAM,GACH,QAEXb,CAHH,IAQN,IAAMc,EAAqBlB,GAAaC,OAAOY,QAY/CM,EAAgBD,EACZR,EACAM,EC9CW,SAASI,EAAWC,EAAiB,KAC5CC,EAAU,CAAA,SAEdD,GACAC,EAAQC,SAASC,KAAKH,CAAtB,IAA2C,oBCJhC,SAASI,EAAyBC,EAASC,EAAU,IAC9DD,EAAQE,WAAa,QAChB,CAAA,MAGH3B,EAASyB,EAAQG,cAAcC,YAC/BC,EAAM9B,EAAO+B,iBAAiBN,EAAS,IAAjC,SACLC,EAAWI,EAAIJ,CAAJ,EAAgBI,ECPrB,SAASE,EAAcP,EAAS,QACzCA,EAAQQ,WAAa,OAChBR,EAEFA,EAAQS,YAAcT,EAAQU,KCDxB,SAASC,EAAgBX,EAAS,IAE3C,CAACA,SACIxB,SAASoC,YAGVZ,EAAQQ,SAAhB,KACO,WACA,cACIR,EAAQG,cAAcS,SAC1B,mBACIZ,EAAQY,WAIwBb,EAAyBC,CAAzB,EAAnCa,EAfuCC,EAevCD,SAAUE,EAf6BD,EAe7BC,UAAWC,GAfkBF,EAelBE,gBACzB,wBAAwBC,KAAKJ,EAAWG,GAAYD,CAApD,EACKf,EAGFW,EAAgBJ,EAAcP,CAAd,CAAhB,ECvBM,SAASkB,EAAiBC,EAAW,QAC3CA,GAAaA,EAAUC,cAAgBD,EAAUC,cAAgBD,ECN1E,IAAME,EAAS/C,GAAa,CAAC,EAAEC,OAAO+C,sBAAwB9C,SAAS+C,cACjEC,EAASlD,GAAa,UAAU2C,KAAKxC,UAAUK,SAAzB,EASb,SAAS2C,EAAKC,EAAS,QAChCA,IAAY,GACPL,EAELK,IAAY,GACPF,EAEFH,GAAUG,ECVJ,SAASG,EAAgB3B,EAAS,IAC3C,CAACA,SACIxB,SAASoD,wBAGZC,EAAiBJ,EAAK,EAAL,EAAWjD,SAASoC,KAAO,KAG9CkB,EAAe9B,EAAQ8B,cAAgB,KAEpCA,IAAiBD,GAAkB7B,EAAQ+B,uBAChC/B,EAAUA,EAAQ+B,oBAAoBD,iBAGlDtB,EAAWsB,GAAgBA,EAAatB,eAE1C,CAACA,GAAYA,IAAa,QAAUA,IAAa,OAC5CR,EAAUA,EAAQG,cAAcyB,gBAAkBpD,SAASoD,gBAMlE,CAAC,KAAM,KAAM,OAAb,EAAsB7C,QAAQ+C,EAAatB,QAA3C,IAAyD,IACzDT,EAAyB+B,EAAc,UAAvC,IAAuD,SAEhDH,EAAgBG,CAAhB,EAGFA,ECpCM,SAASE,EAAkBhC,EAAS,KACzCQ,EAAaR,EAAbQ,gBACJA,IAAa,OACR,GAGPA,IAAa,QAAUmB,EAAgB3B,EAAQiC,iBAAxB,IAA+CjC,ECD3D,SAASkC,EAAQC,EAAM,QAChCA,EAAK1B,aAAe,KACfyB,EAAQC,EAAK1B,UAAb,EAGF0B,ECAM,SAASC,GAAuBC,EAAUC,EAAU,IAE7D,CAACD,GAAY,CAACA,EAASnC,UAAY,CAACoC,GAAY,CAACA,EAASpC,gBACrD1B,SAASoD,oBAIZW,EACJF,EAASG,wBAAwBF,CAAjC,EACAG,KAAKC,4BACDC,EAAQJ,EAAQF,EAAWC,EAC3BM,GAAML,EAAQD,EAAWD,EAGzBQ,GAAQrE,SAASsE,YAAT,KACRC,SAASJ,EAAO,CAAtB,KACMK,OAAOJ,GAAK,CAAlB,MACQK,GAA4BJ,GAA5BI,2BAILZ,IAAaY,IACZX,IAAaW,IACfN,EAAMO,SAASN,EAAf,SAEIZ,EAAkBiB,EAAlB,EACKA,GAGFtB,EAAgBsB,EAAhB,MAIHE,GAAejB,EAAQG,CAAR,SACjBc,GAAazC,KACR0B,GAAuBe,GAAazC,KAAM4B,CAA1C,EAEAF,GAAuBC,EAAUH,EAAQI,CAAR,EAAkB5B,IAAnD,ECzCI,SAAS0C,EAAUpD,EAAuB,KAAdqD,EAAc,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAP,MAC1CC,EAAYD,IAAS,MAAQ,YAAc,aAC3C7C,EAAWR,EAAQQ,YAErBA,IAAa,QAAUA,IAAa,OAAQ,KACxC+C,GAAOvD,EAAQG,cAAcyB,gBAC7B4B,GAAmBxD,EAAQG,cAAcqD,kBAAoBD,UAC5DC,GAAiBF,CAAjB,SAGFtD,EAAQsD,CAAR,ECPM,SAASG,EAAcC,EAAM1D,EAA2B,KAAlB2D,EAAkB,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAP,GACxDC,EAAYR,EAAUpD,EAAS,KAAnB,EACZ6D,GAAaT,EAAUpD,EAAS,MAAnB,EACb8D,GAAWH,EAAW,GAAK,WAC5BI,KAAOH,EAAYE,KACnBE,QAAUJ,EAAYE,KACtBG,MAAQJ,GAAaC,KACrBI,OAASL,GAAaC,GACpBJ,ECTM,SAASS,EAAeC,EAAQC,EAAM,KAC7CC,EAAQD,IAAS,IAAM,OAAS,MAChCE,EAAQD,IAAU,OAAS,QAAU,gBAGzCE,WAAWJ,EAAAA,SAAgBE,EAAhB,OAAA,EAA+B,EAA1C,EACAE,WAAWJ,EAAAA,SAAgBG,EAAhB,OAAA,EAA+B,EAA1C,ECdJ,SAASE,EAAQJ,EAAMzD,EAAM2C,EAAMmB,EAAe,QACzCC,KAAKC,IACVhE,EAAAA,SAAcyD,CAAd,EACAzD,EAAAA,SAAcyD,CAAd,EACAd,EAAAA,SAAcc,CAAd,EACAd,EAAAA,SAAcc,CAAd,EACAd,EAAAA,SAAcc,CAAd,EACA5C,EAAK,EAAL,EACKoD,SAAStB,EAAAA,SAAcc,CAAd,CAAT,EACHQ,SAASH,EAAAA,UAAuBL,IAAS,SAAW,MAAQ,OAAnD,CAAT,EACAQ,SAASH,EAAAA,UAAuBL,IAAS,SAAW,SAAW,QAAtD,CAAT,EACA,CAVG,EAcM,SAASS,EAAetG,EAAU,KACzCoC,EAAOpC,EAASoC,KAChB2C,EAAO/E,EAASoD,gBAChB8C,EAAgBjD,EAAK,EAAL,GAAYnB,iBAAiBiD,CAAjB,QAE3B,QACGkB,EAAQ,SAAU7D,EAAM2C,EAAMmB,CAA9B,QACDD,EAAQ,QAAS7D,EAAM2C,EAAMmB,CAA7B,soBCjBI,SAASK,GAAcC,EAAS,cAExCA,EADL,OAESA,EAAQf,KAAOe,EAAQC,aACtBD,EAAQjB,IAAMiB,EAAQE,SCGnB,SAASC,GAAsBnF,EAAS,KACjD0D,EAAO,CAAA,KAKP,IACEjC,EAAK,EAAL,EAAU,GACLzB,EAAQmF,sBAAR,MACDvB,EAAYR,EAAUpD,EAAS,KAAnB,EACZ6D,EAAaT,EAAUpD,EAAS,MAAnB,IACd+D,KAAOH,IACPK,MAAQJ,IACRG,QAAUJ,IACVM,OAASL,SAGP7D,EAAQmF,sBAAR,QAGLC,GAAE,CAAA,KAEFC,GAAS,MACP3B,EAAKO,SACNP,EAAKK,UACHL,EAAKQ,MAAQR,EAAKO,YACjBP,EAAKM,OAASN,EAAKK,KAIvBuB,GAAQtF,EAAQQ,WAAa,OAASsE,EAAe9E,EAAQG,aAAvB,EAAwC,CAAA,EAC9E8E,GACJK,GAAML,OAASjF,EAAQuF,aAAeF,GAAOJ,MACzCC,GACJI,GAAMJ,QAAUlF,EAAQwF,cAAgBH,GAAOH,OAE7CO,GAAiBzF,EAAQ0F,YAAcT,GACvCU,GAAgB3F,EAAQ4F,aAAeV,MAIvCO,IAAkBE,GAAe,KAC7BvB,GAASrE,EAAyBC,CAAzB,MACGmE,EAAeC,GAAQ,GAAvB,MACDD,EAAeC,GAAQ,GAAvB,KAEVa,OAASQ,MACTP,QAAUS,UAGZZ,GAAcM,EAAd,ECzDM,SAASQ,GAAqCC,EAAUC,EAA+B,KAAvBC,EAAuB,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAP,GACvFxE,EAASyE,EAAQ,EAAR,EACTC,GAASH,EAAOvF,WAAa,OAC7B2F,GAAehB,GAAsBW,CAAtB,EACfM,GAAajB,GAAsBY,CAAtB,EACbM,GAAe1F,EAAgBmF,CAAhB,EAEf1B,GAASrE,EAAyBgG,CAAzB,EACTO,GAAiB9B,WAAWJ,GAAOkC,eAAgB,EAAlC,EACjBC,GAAkB/B,WAAWJ,GAAOmC,gBAAiB,EAAnC,EAGrBP,GAAiBE,QACPnC,IAAMY,KAAKC,IAAIwB,GAAWrC,IAAK,CAAzB,KACNE,KAAOU,KAAKC,IAAIwB,GAAWnC,KAAM,CAA1B,OAEhBe,GAAUD,GAAc,KACrBoB,GAAapC,IAAMqC,GAAWrC,IAAMuC,QACnCH,GAAalC,KAAOmC,GAAWnC,KAAOsC,SACrCJ,GAAalB,aACZkB,GAAajB,OAJT,QAMNsB,UAAY,KACZC,WAAa,EAMjB,CAACjF,GAAU0E,GAAQ,KACfM,GAAYhC,WAAWJ,GAAOoC,UAAW,EAA7B,EACZC,GAAajC,WAAWJ,GAAOqC,WAAY,EAA9B,KAEX1C,KAAOuC,GAAiBE,MACxBxC,QAAUsC,GAAiBE,MAC3BvC,MAAQsC,GAAkBE,MAC1BvC,OAASqC,GAAkBE,MAG3BD,UAAYA,MACZC,WAAaA,UAIrBjF,GAAU,CAACwE,EACPD,EAAO7C,SAASmD,EAAhB,EACAN,IAAWM,IAAgBA,GAAa7F,WAAa,aAE/CiD,EAAcuB,GAASe,CAAvB,GAGLf,GCtDM,SAAS0B,GAA8C1G,EAAgC,KAAvB2G,EAAuB,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAP,GACvFpD,EAAOvD,EAAQG,cAAcyB,gBAC7BgF,EAAiBf,GAAqC7F,EAASuD,CAA9C,EACjB0B,GAAQN,KAAKC,IAAIrB,EAAKgC,YAAahH,OAAOsI,YAAc,CAAhD,EACR3B,GAASP,KAAKC,IAAIrB,EAAKiC,aAAcjH,OAAOuI,aAAe,CAAlD,EAETlD,GAAa+C,EAAkC,EAAlBvD,EAAUG,CAAV,EAC7BM,GAAc8C,EAA0C,EAA1BvD,EAAUG,EAAM,MAAhB,EAE9BwD,GAAS,KACRnD,GAAYgD,EAAe7C,IAAM6C,EAAeJ,eAC/C3C,GAAa+C,EAAe3C,KAAO2C,EAAeH,sCAKnD1B,GAAcgC,EAAd,ECTM,SAASC,GAAQhH,EAAS,KACjCQ,EAAWR,EAAQQ,YACrBA,IAAa,QAAUA,IAAa,aAC/B,MAELT,EAAyBC,EAAS,UAAlC,IAAkD,cAC7C,OAEHS,EAAaF,EAAcP,CAAd,SACdS,EAGEuG,GAAQvG,CAAR,EAFE,GCXI,SAASwG,GAA6BjH,EAAS,IAEvD,CAACA,GAAW,CAACA,EAAQkH,eAAiBzF,EAAAA,SAClCjD,SAASoD,wBAEduF,EAAKnH,EAAQkH,cACVC,GAAMpH,EAAyBoH,EAAI,WAA7B,IAA8C,UACpDA,EAAGD,qBAEHC,GAAM3I,SAASoD,gBCET,SAASwF,GACtBC,EACAlG,EACAmG,EACAC,EAEA,KADAvB,GACA,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EADgB,GAIZwB,GAAa,CAAEzD,IAAK,EAAGE,KAAM,CAAhB,EACXnC,GAAekE,GAAgBiB,GAA6BI,CAA7B,EAAuCjF,GAAuBiF,EAAQnG,EAAiBC,CAAjB,CAA/B,KAGxEoG,IAAsB,cACXb,GAA8C5E,GAAckE,EAA5D,MAGV,KAECyB,GAAAA,OACAF,IAAsB,mBACP5G,EAAgBJ,EAAcY,CAAd,CAAhB,EACbsG,GAAejH,WAAa,YACb6G,EAAOlH,cAAcyB,kBAE/B2F,IAAsB,YACdF,EAAOlH,cAAcyB,mBAErB2F,MAGbvC,GAAUa,GACd4B,GACA3F,GACAkE,EAHc,KAOZyB,GAAejH,WAAa,QAAU,CAACwG,GAAQlF,EAAR,EAAuB,QACtCgD,EAAeuC,EAAOlH,aAAtB,EAAlB+E,GADwDwC,GACxDxC,OAAQD,GADgDyC,GAChDzC,SACLlB,KAAOiB,GAAQjB,IAAMiB,GAAQwB,aAC7BxC,OAASkB,GAASF,GAAQjB,OAC1BE,MAAQe,GAAQf,KAAOe,GAAQyB,cAC/BvC,MAAQe,GAAQD,GAAQf,aAGtBe,KAKPsC,GAAW,MACfK,GAAkB,OAAOL,GAAY,mBAChCrD,MAAQ0D,GAAkBL,EAAUA,EAAQrD,MAAQ,KACpDF,KAAO4D,GAAkBL,EAAUA,EAAQvD,KAAO,KAClDG,OAASyD,GAAkBL,EAAUA,EAAQpD,OAAS,KACtDF,QAAU2D,GAAkBL,EAAUA,EAAQtD,QAAU,EAE5DwD,GC7ET,SAASI,EAATC,EAAoC,KAAjB5C,EAAiB4C,EAAjB5C,MAAOC,EAAU2C,EAAV3C,cACjBD,EAAQC,EAYF,SAAS4C,GACtBC,EACAC,EACAX,EACAlG,EACAoG,GAEA,KADAD,GACA,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EADU,KAENS,EAAUhJ,QAAQ,MAAlB,IAA8B,UACzBgJ,MAGHP,GAAaJ,GACjBC,EACAlG,EACAmG,GACAC,EAJiB,EAObU,GAAQ,KACP,OACIT,GAAWvC,aACV+C,EAAQjE,IAAMyD,GAAWzD,WAE5B,OACEyD,GAAWtD,MAAQ8D,EAAQ9D,aAC1BsD,GAAWtC,eAEb,OACCsC,GAAWvC,aACVuC,GAAWxD,OAASgE,EAAQhE,aAEhC,OACGgE,EAAQ/D,KAAOuD,GAAWvD,YACzBuD,GAAWtC,SAIjBgD,GAAcC,OAAOC,KAAKH,EAAZ,EACjBI,IAAI,SAAAC,GAAA,oBAEAL,GAAMK,EAAN,EAFA,MAGGV,EAAQK,GAAMK,EAAN,CAAR,IAJU,EAMjBC,KAAK,SAACC,GAAGC,GAAJ,QAAUA,GAAEC,KAAOF,GAAEE,KANT,EAQdC,GAAgBT,GAAYU,OAChC,SAAAC,GAAA,KAAG5D,GAAH4D,GAAG5D,MAAOC,GAAV2D,GAAU3D,cACRD,IAASoC,EAAO9B,aAAeL,IAAUmC,EAAO7B,aAF9B,EAKhBsD,GAAoBH,GAAc9J,OAAS,EAC7C8J,GAAc,CAAd,EAAiBL,IACjBJ,GAAY,CAAZ,EAAeI,IAEbS,GAAYhB,EAAUiB,MAAM,GAAhB,EAAqB,CAArB,SAEXF,IAAqBC,GAAAA,IAAgBA,GAAc,ICzD7C,SAASE,GAAoBC,EAAO7B,EAAQlG,EAAiC,KAAtB6E,EAAsB,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAN,KAC9EmD,GAAqBnD,EAAgBiB,GAA6BI,CAA7B,EAAuCjF,GAAuBiF,EAAQnG,EAAiBC,CAAjB,CAA/B,SAC3E0E,GAAqC1E,EAAWgI,GAAoBnD,CAApE,ECVM,SAASoD,GAAcpJ,EAAS,KACvCzB,EAASyB,EAAQG,cAAcC,YAC/BgE,EAAS7F,EAAO+B,iBAAiBN,CAAxB,EACTqJ,EAAI7E,WAAWJ,EAAOoC,WAAa,CAA/B,EAAoChC,WAAWJ,EAAOkF,cAAgB,CAAlC,EACxCC,GAAI/E,WAAWJ,EAAOqC,YAAc,CAAhC,EAAqCjC,WAAWJ,EAAOoF,aAAe,CAAjC,EACzCnE,GAAS,OACNrF,EAAQ0F,YAAc6D,UACrBvJ,EAAQ4F,aAAeyD,UAE1BhE,GCTM,SAASoE,GAAqB1B,EAAW,KAChD2B,EAAO,CAAEzF,KAAM,QAASC,MAAO,OAAQF,OAAQ,MAAOD,IAAK,QAApD,SACNgE,EAAU4B,QAAQ,yBAA0B,SAAAC,EAAA,QAAWF,EAAKE,CAAL,EAAvD,ECIM,SAASC,GAAiBxC,EAAQyC,EAAkB/B,EAAW,GAChEA,EAAUiB,MAAM,GAAhB,EAAqB,CAArB,MAGNe,EAAaX,GAAc/B,CAAd,EAGb2C,GAAgB,OACbD,EAAW9E,aACV8E,EAAW7E,QAIf+E,GAAU,CAAC,QAAS,MAAV,EAAkBlL,QAAQgJ,CAA1B,IAAyC,GACnDmC,GAAWD,GAAU,MAAQ,OAC7BE,GAAgBF,GAAU,OAAS,MACnCG,GAAcH,GAAU,SAAW,QACnCI,GAAwBJ,GAAqB,QAAX,mBAE1BC,EAAd,EACEJ,EAAiBI,EAAjB,EACAJ,EAAiBM,EAAjB,EAAgC,EAChCL,EAAWK,EAAX,EAA0B,EACxBrC,IAAcoC,MACFA,EAAd,EACEL,EAAiBK,EAAjB,EAAkCJ,EAAWM,EAAX,KAEtBF,EAAd,EACEL,EAAiBL,GAAqBU,EAArB,CAAjB,EAGGH,GCnCM,SAASM,GAAKC,EAAKC,EAAO,QAEnCC,MAAMC,UAAUJ,KACXC,EAAID,KAAKE,CAAT,EAIFD,EAAI3B,OAAO4B,CAAX,EAAkB,CAAlB,ECLM,SAASG,GAAUJ,EAAKK,EAAMC,EAAO,IAE9CJ,MAAMC,UAAUC,iBACXJ,EAAII,UAAU,SAAAG,GAAA,QAAOA,GAAIF,CAAJ,IAAcC,EAAnC,MAIHE,EAAQT,GAAKC,EAAK,SAAAS,GAAA,QAAOA,GAAIJ,CAAJ,IAAcC,EAA/B,SACPN,EAAIxL,QAAQgM,CAAZ,ECLM,SAASE,GAAaC,EAAWC,EAAMC,EAAM,KACpDC,EAAiBD,IAASE,OAC5BJ,EACAA,EAAUK,MAAM,EAAGZ,GAAUO,EAAW,OAAQE,CAA7B,CAAnB,WAEWI,QAAQ,SAAA1H,GAAY,CAC7BA,GAAS,kBACH2H,KAAK,uDAAb,MAEIxM,GAAK6E,GAAS,UAAeA,GAAS7E,GACxC6E,GAAS4H,SAAWhM,EAAWT,EAAX,MAIjB+F,QAAQqC,OAAStC,GAAcoG,EAAKnG,QAAQqC,MAA3B,IACjBrC,QAAQ7D,UAAY4D,GAAcoG,EAAKnG,QAAQ7D,SAA3B,IAElBlC,GAAGkM,EAAMrH,EAAT,GAZX,EAgBOqH,ECvBM,SAASQ,IAAS,IAE3B,MAAKzC,MAAM0C,iBAIXT,EAAO,UACC,YACF,CAAA,cACK,CAAA,aACD,CAAA,UACH,WACA,CAAA,KAINnG,QAAQ7D,UAAY8H,GACvB,KAAKC,MACL,KAAK7B,OACL,KAAKlG,UACL,KAAK0K,QAAQC,aAJU,IAUpB/D,UAAYD,GACf,KAAK+D,QAAQ9D,UACboD,EAAKnG,QAAQ7D,UACb,KAAKkG,OACL,KAAKlG,UACL,KAAK0K,QAAQX,UAAUa,KAAKxE,kBAC5B,KAAKsE,QAAQX,UAAUa,KAAKzE,OANb,IAUZ0E,kBAAoBb,EAAKpD,YAEzB+D,cAAgB,KAAKD,QAAQC,gBAG7B9G,QAAQqC,OAASwC,GACpB,KAAKxC,OACL8D,EAAKnG,QAAQ7D,UACbgK,EAAKpD,SAHe,IAMjB/C,QAAQqC,OAAO4E,SAAW,KAAKJ,QAAQC,cACxC,QACA,aAGGb,GAAa,KAAKC,UAAWC,CAA7B,EAIF,KAAKjC,MAAMgD,eAITL,QAAQM,SAAShB,CAAtB,QAHKjC,MAAMgD,UAAY,QAClBL,QAAQO,SAASjB,CAAtB,IChEW,SAASkB,GAAkBnB,EAAWoB,EAAc,QAC1DpB,EAAUqB,KACf,SAAA1E,EAAA,KAAG2E,EAAH3E,EAAG2E,KAAMd,GAAT7D,EAAS6D,eAAcA,IAAWc,IAASF,EADtC,ECAM,SAASG,GAAyBxM,EAAU,SACnDyM,EAAW,CAAC,GAAO,KAAM,SAAU,MAAO,GAA/B,EACXC,EAAY1M,EAAS2M,OAAO,CAAhB,EAAmBC,YAAnB,EAAmC5M,EAASsL,MAAM,CAAf,EAE5C3M,EAAI,EAAGA,EAAI8N,EAAS7N,OAAQD,IAAK,KAClCkO,GAASJ,EAAS9N,CAAT,EACTmO,GAAUD,GAAAA,GAAYA,GAASH,EAAc1M,KAC/C,OAAOzB,SAASoC,KAAKoM,MAAMD,EAApB,GAAiC,mBACnCA,UAGJ,KCVM,SAASE,IAAU,aAC3B/D,MAAM0C,YAAc,GAGrBS,GAAkB,KAAKnB,UAAW,YAAlC,SACG7D,OAAO6F,gBAAgB,aAA5B,OACK7F,OAAO2F,MAAMf,SAAW,QACxB5E,OAAO2F,MAAMjJ,IAAM,QACnBsD,OAAO2F,MAAM/I,KAAO,QACpBoD,OAAO2F,MAAM9I,MAAQ,QACrBmD,OAAO2F,MAAMhJ,OAAS,QACtBqD,OAAO2F,MAAMG,WAAa,QAC1B9F,OAAO2F,MAAMP,GAAyB,WAAzB,CAAlB,EAA2D,SAGxDW,sBAAL,EAII,KAAKvB,QAAQwB,sBACVhG,OAAO5G,WAAW6M,YAAY,KAAKjG,MAAxC,EAEK,KCzBM,SAASkG,GAAUvN,EAAS,KACnCG,EAAgBH,EAAQG,qBACvBA,EAAgBA,EAAcC,YAAc7B,OCJrD,SAASiP,GAAsBnH,EAAcoH,EAAOC,EAAUC,EAAe,KACrEC,GAASvH,EAAa7F,WAAa,OACnCqN,GAASD,GAASvH,EAAalG,cAAcC,YAAciG,KAC1DyH,iBAAiBL,EAAOC,EAAU,CAAEK,QAAS,EAAX,CAAzC,EAEKH,OAEDjN,EAAgBkN,GAAOpN,UAAvB,EACAgN,EACAC,EACAC,CAJF,IAOYK,KAAKH,EAAnB,EASa,SAASI,EACtB9M,EACA0K,EACA3C,EACAgF,EACA,GAEMA,YAAcA,KACV/M,CAAV,EAAqB2M,iBAAiB,SAAU5E,EAAMgF,YAAa,CAAEH,QAAS,EAAX,CAAnE,MAGMI,GAAgBxN,EAAgBQ,CAAhB,YAEpBgN,GACA,SACAjF,EAAMgF,YACNhF,EAAMyE,aAJR,IAMMQ,cAAgBA,KAChBC,cAAgB,GAEflF,ECtCM,SAASmF,GAAuB,CACxC,KAAKnF,MAAMkF,qBACTlF,MAAQ+E,EACX,KAAK9M,UACL,KAAK0K,QACL,KAAK3C,MACL,KAAKoF,cAJM,GCFF,SAASC,EAAqBpN,EAAW+H,EAAO,WAEnD/H,CAAV,EAAqBqN,oBAAoB,SAAUtF,EAAMgF,WAAzD,IAGMP,cAAcnC,QAAQ,SAAAqC,EAAU,GAC7BW,oBAAoB,SAAUtF,EAAMgF,WAA3C,EADF,IAKMA,YAAc,OACdP,cAAgB,CAAA,IAChBQ,cAAgB,OAChBC,cAAgB,GACflF,ECbM,SAASkE,GAAwB,CAC1C,KAAKlE,MAAMkF,qCACQ,KAAKE,cAA1B,OACKpF,MAAQqF,EAAqB,KAAKpN,UAAW,KAAK+H,KAA1C,GCLF,SAASuF,EAAUC,EAAG,QAC5BA,IAAM,IAAM,CAACC,MAAMnK,WAAWkK,CAAX,CAAN,GAAwBE,SAASF,CAAT,ECE/B,SAASG,EAAU7O,EAASoE,EAAQ,QAC1CgE,KAAKhE,CAAZ,EAAoBoH,QAAQ,SAAAZ,EAAQ,KAC9BkE,EAAO,GAGT,CAAC,QAAS,SAAU,MAAO,QAAS,SAAU,MAA9C,EAAsD/P,QAAQ6L,CAA9D,IACE,IACF6D,EAAUrK,EAAOwG,CAAP,CAAV,MAEO,QAEDoC,MAAMpC,CAAd,EAAsBxG,EAAOwG,CAAP,EAAekE,EAVvC,ECHa,SAASC,GAAc/O,EAASgP,EAAY,QAClD5G,KAAK4G,CAAZ,EAAwBxD,QAAQ,SAASZ,EAAM,KACvCC,EAAQmE,EAAWpE,CAAX,EACVC,IAAU,KACJoE,aAAarE,EAAMoE,EAAWpE,CAAX,CAA3B,IAEQsC,gBAAgBtC,CAAxB,EALJ,ECKa,SAASsE,GAAW/D,EAAM,UAK7BA,EAAKgE,SAAS9H,OAAQ8D,EAAK/G,MAArC,KAIc+G,EAAKgE,SAAS9H,OAAQ8D,EAAK6D,UAAzC,EAGI7D,EAAKiE,cAAgBjH,OAAOC,KAAK+C,EAAKkE,WAAjB,EAA8BxQ,UAC3CsM,EAAKiE,aAAcjE,EAAKkE,WAAlC,EAGKlE,EAaF,SAASmE,GACdnO,EACAkG,EACAwE,EACA0D,EACArG,GACA,KAEMY,GAAmBb,GAAoBC,GAAO7B,EAAQlG,EAAW0K,EAAQC,aAAtD,EAKnB/D,GAAYD,GAChB+D,EAAQ9D,UACR+B,GACAzC,EACAlG,EACA0K,EAAQX,UAAUa,KAAKxE,kBACvBsE,EAAQX,UAAUa,KAAKzE,OANP,WASX2H,aAAa,cAAelH,EAAnC,IAIUV,EAAQ,CAAE4E,SAAUJ,EAAQC,cAAgB,QAAU,UAA9C,CAAlB,EAEOD,ECpDM,SAAS2D,GAAkBrE,EAAMsE,EAAa,OAC7BtE,EAAKnG,QAA3BqC,EADmDqI,EACnDrI,OAAQlG,GAD2CuO,EAC3CvO,UACRwO,GAAiBhL,KAAjBgL,MAAOC,GAAUjL,KAAViL,MACTC,GAAU,SAAAC,GAAA,QAAKA,IAEfC,GAAiBJ,GAAMxO,GAAU8D,KAAhB,EACjB+K,GAAcL,GAAMtI,EAAOpC,KAAb,EAEdgL,GAAa,CAAC,OAAQ,OAAT,EAAkBlR,QAAQoM,EAAKpD,SAA/B,IAA8C,GAC3DmI,GAAc/E,EAAKpD,UAAUhJ,QAAQ,GAAvB,IAAgC,GAC9CoR,GAAkBJ,GAAiB,IAAMC,GAAc,EACvDI,GAAeL,GAAiB,IAAM,GAAKC,GAAc,IAAM,EAE/DK,GAAuBZ,EAEzBQ,IAAcC,IAAeC,GAC7BR,GACAC,GAHAC,GAIES,GAAqBb,EAAwBE,GAAVE,SAElC,MACCQ,GACJD,IAAgB,CAACF,IAAeT,EAC5BpI,EAAOpD,KAAO,EACdoD,EAAOpD,IAHP,MAKDqM,GAAkBjJ,EAAOtD,GAAzB,SACGuM,GAAkBjJ,EAAOrD,MAAzB,QACDqM,GAAoBhJ,EAAOnD,KAA3B,GCxCX,IAAMqM,GAAYjS,GAAa,WAAW2C,KAAKxC,UAAUK,SAA1B,EAShB,SAAS0R,GAAarF,EAAMU,EAAS,KAC1CxC,EAASwC,EAATxC,EAAGE,EAAMsC,EAANtC,EACHlC,GAAW8D,EAAKnG,QAAhBqC,OAGFoJ,GAA8BnG,GAClCa,EAAKgE,SAASjE,UACd,SAAApH,GAAA,QAAYA,GAAS0I,OAAS,aAFI,EAGlCkE,gBACED,KAAgCnF,gBAC1BG,KACN,+HADF,MAIIiF,GACJD,KAAgCnF,OAC5BmF,GACA5E,EAAQ6E,gBAER5O,GAAeH,EAAgBwJ,EAAKgE,SAAS9H,MAA9B,EACfsJ,GAAmBxL,GAAsBrD,EAAtB,EAGnBsC,GAAS,UACHiD,GAAO4E,UAGbjH,GAAUwK,GACdrE,EACA5M,OAAOqS,iBAAmB,GAAK,CAACL,EAFlB,EAKVjM,GAAQ+E,IAAM,SAAW,MAAQ,SACjC9E,GAAQgF,IAAM,QAAU,OAAS,QAKjCsH,GAAmBpE,GAAyB,WAAzB,EAWrBxI,GAAAA,OAAMF,GAAAA,UACNO,KAAU,SAGRxC,GAAatB,WAAa,UACtB,CAACsB,GAAa0D,aAAeR,GAAQhB,UAErC,CAAC2M,GAAiBzL,OAASF,GAAQhB,UAGrCgB,GAAQjB,IAEZQ,KAAU,QACRzC,GAAatB,WAAa,UACrB,CAACsB,GAAayD,YAAcP,GAAQd,SAEpC,CAACyM,GAAiB1L,MAAQD,GAAQd,SAGpCc,GAAQf,KAEbyM,IAAmBG,MACdA,EAAP,EAAA,eAA0C5M,GAA1C,OAAqDF,GAArD,YACOO,EAAP,EAAgB,KACTC,EAAP,EAAgB,KACT4I,WAAa,gBACf,KAEC2D,GAAYxM,KAAU,SAAW,GAAK,EACtCyM,GAAaxM,KAAU,QAAU,GAAK,KACrCD,EAAP,EAAgBP,GAAM+M,MACfvM,EAAP,EAAgBN,GAAO8M,MAChB5D,WAAgB7I,GAAvB,KAAiCC,OAI7ByK,GAAa,eACF7D,EAAKpD,oBAIjBiH,WAALgC,GAAA,CAAA,EAAuBhC,GAAe7D,EAAK6D,UAA3C,IACK5K,OAAL4M,GAAA,CAAA,EAAmB5M,GAAW+G,EAAK/G,MAAnC,IACKiL,YAAL2B,GAAA,CAAA,EAAwB7F,EAAKnG,QAAQiM,MAAU9F,EAAKkE,WAApD,EAEOlE,EClGM,SAAS+F,GACtBhG,EACAiG,EACAC,EACA,KACMC,EAAa/G,GAAKY,EAAW,SAAArD,GAAA,KAAG2E,GAAH3E,GAAG2E,YAAWA,KAAS2E,EAAvC,EAEbG,GACJ,CAAC,CAACD,GACFnG,EAAUqB,KAAK,SAAAzI,GAAY,QAEvBA,GAAS0I,OAAS4E,GAClBtN,GAAS4H,SACT5H,GAASvB,MAAQ8O,EAAW9O,MAJhC,KAQE,CAAC+O,GAAY,KACTD,GAAAA,IAAkBF,EAAlB,IACAI,GAAAA,IAAiBH,EAAjB,YACE3F,KACH8F,GADL,4BAC0CF,GAD1C,4DACgHA,GADhH,GAAA,SAIKC,GCxBM,SAASL,GAAM9F,EAAMU,EAAS,UAEvC,CAACqF,GAAmB/F,EAAKgE,SAASjE,UAAW,QAAS,cAArD,SACIC,MAGLiE,EAAevD,EAAQ7L,WAGvB,OAAOoP,GAAiB,eACXjE,EAAKgE,SAAS9H,OAAOmK,cAAcpC,CAAnC,EAGX,CAACA,SACIjE,UAKL,CAACA,EAAKgE,SAAS9H,OAAOnE,SAASkM,CAA9B,iBACK3D,KACN,+DADF,EAGON,MAILpD,GAAYoD,EAAKpD,UAAUiB,MAAM,GAArB,EAA0B,CAA1B,KACYmC,EAAKnG,QAA3BqC,GA5BmCqI,GA4BnCrI,OAAQlG,GA5B2BuO,GA4B3BvO,UACV8O,GAAa,CAAC,OAAQ,OAAT,EAAkBlR,QAAQgJ,EAA1B,IAAyC,GAEtD0J,GAAMxB,GAAa,SAAW,QAC9ByB,GAAkBzB,GAAa,MAAQ,OACvC5M,GAAOqO,GAAgBC,YAAhB,EACPC,GAAU3B,GAAa,OAAS,MAChC4B,GAAS5B,GAAa,SAAW,QACjC6B,GAAmB1I,GAAcgG,CAAd,EAA4BqC,EAA5B,EAQrBtQ,GAAU0Q,EAAV,EAAoBC,GAAmBzK,GAAOhE,EAAP,MACpC2B,QAAQqC,OAAOhE,EAApB,GACEgE,GAAOhE,EAAP,GAAgBlC,GAAU0Q,EAAV,EAAoBC,KAGpC3Q,GAAUkC,EAAV,EAAkByO,GAAmBzK,GAAOwK,EAAP,MAClC7M,QAAQqC,OAAOhE,EAApB,GACElC,GAAUkC,EAAV,EAAkByO,GAAmBzK,GAAOwK,EAAP,KAEpC7M,QAAQqC,OAAStC,GAAcoG,EAAKnG,QAAQqC,MAA3B,MAGhB0K,GAAS5Q,GAAUkC,EAAV,EAAkBlC,GAAUsQ,EAAV,EAAiB,EAAIK,GAAmB,EAInEzR,GAAMN,EAAyBoL,EAAKgE,SAAS9H,MAAvC,EACN2K,GAAmBxN,WAAWnE,GAAAA,SAAaqR,EAAb,EAAiC,EAA5C,EACnBO,GAAmBzN,WAAWnE,GAAAA,SAAaqR,GAAb,OAAA,EAAsC,EAAjD,EACrBQ,GACFH,GAAS5G,EAAKnG,QAAQqC,OAAOhE,EAApB,EAA4B2O,GAAmBC,aAG9CtN,KAAKC,IAAID,KAAKwN,IAAI9K,GAAOoK,EAAP,EAAcK,GAAkBI,EAAzC,EAAqD,CAA9D,IAEP9C,aAAeA,IACfpK,QAAQiM,OAAbmB,EAAA,CAAA,EAAAC,GAAAD,EACG/O,GAAOsB,KAAKgL,MAAMuC,EAAX,CADV,EAAAG,GAAAD,EAEGR,GAAU,EAFb,EAAAQ,GAKOjH,EChFM,SAASmH,GAAqBvJ,EAAW,QAClDA,IAAc,MACT,QACEA,IAAc,QAChB,MAEFA,ECkBT,IAAAwJ,GAAe,CACb,aACA,OACA,WACA,YACA,MACA,UACA,cACA,QACA,YACA,aACA,SACA,eACA,WACA,OACA,YAfa,EC5BTC,GAAkBD,GAAWhH,MAAM,CAAjB,EAYT,SAASkH,GAAU1K,EAA4B,KAAjB2K,EAAiB,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAP,GAC/CC,EAAQH,GAAgBzT,QAAQgJ,CAAxB,EACRwC,EAAMiI,GACTjH,MAAMoH,EAAQ,CADL,EAETC,OAAOJ,GAAgBjH,MAAM,EAAGoH,CAAzB,CAFE,SAGLD,EAAUnI,EAAIsI,QAAJ,EAAgBtI,ECZnC,IAAMuI,GAAY,MACV,iBACK,6BACO,oBAUL,SAAS/G,GAAKZ,EAAMU,EAAS,IAEtCQ,GAAkBlB,EAAKgE,SAASjE,UAAW,OAA3C,GAIAC,EAAK4H,SAAW5H,EAAKpD,YAAcoD,EAAKa,yBAEnCb,MAGH3D,EAAaJ,GACjB+D,EAAKgE,SAAS9H,OACd8D,EAAKgE,SAAShO,UACd0K,EAAQvE,QACRuE,EAAQtE,kBACR4D,EAAKW,aALY,EAQf/D,EAAYoD,EAAKpD,UAAUiB,MAAM,GAArB,EAA0B,CAA1B,EACZgK,GAAoBvJ,GAAqB1B,CAArB,EACpBgB,GAAYoC,EAAKpD,UAAUiB,MAAM,GAArB,EAA0B,CAA1B,GAAgC,GAE5CiK,GAAY,CAAA,SAERpH,EAAQqH,SAAhB,MACOJ,GAAUK,QACD,CAACpL,EAAWiL,EAAZ,aAETF,GAAUM,aACDX,GAAU1K,CAAV,aAET+K,GAAUO,oBACDZ,GAAU1K,EAAW,EAArB,mBAGA8D,EAAQqH,mBAGd1H,QAAQ,SAAC8H,GAAMX,GAAU,IAC7B5K,IAAcuL,IAAQL,GAAUpU,SAAW8T,GAAQ,SAC9CxH,IAGGA,EAAKpD,UAAUiB,MAAM,GAArB,EAA0B,CAA1B,KACQS,GAAqB1B,CAArB,MAEdiC,GAAgBmB,EAAKnG,QAAQqC,OAC7BkM,GAAapI,EAAKnG,QAAQ7D,UAG1ByO,GAAQjL,KAAKiL,MACb4D,GACHzL,IAAc,QACb6H,GAAM5F,GAAc9F,KAApB,EAA6B0L,GAAM2D,GAAWtP,IAAjB,GAC9B8D,IAAc,SACb6H,GAAM5F,GAAc/F,IAApB,EAA4B2L,GAAM2D,GAAWrP,KAAjB,GAC7B6D,IAAc,OACb6H,GAAM5F,GAAchG,MAApB,EAA8B4L,GAAM2D,GAAWxP,GAAjB,GAC/BgE,IAAc,UACb6H,GAAM5F,GAAcjG,GAApB,EAA2B6L,GAAM2D,GAAWvP,MAAjB,EAEzByP,GAAgB7D,GAAM5F,GAAc/F,IAApB,EAA4B2L,GAAMpI,EAAWvD,IAAjB,EAC5CyP,GAAiB9D,GAAM5F,GAAc9F,KAApB,EAA6B0L,GAAMpI,EAAWtD,KAAjB,EAC9CyP,GAAe/D,GAAM5F,GAAcjG,GAApB,EAA2B6L,GAAMpI,EAAWzD,GAAjB,EAC1C6P,GACJhE,GAAM5F,GAAchG,MAApB,EAA8B4L,GAAMpI,EAAWxD,MAAjB,EAE1B6P,GACH9L,IAAc,QAAU0L,IACxB1L,IAAc,SAAW2L,IACzB3L,IAAc,OAAS4L,IACvB5L,IAAc,UAAY6L,GAGvB3D,GAAa,CAAC,MAAO,QAAR,EAAkBlR,QAAQgJ,CAA1B,IAAyC,GAGtD+L,GACJ,CAAC,CAACjI,EAAQkI,iBACR9D,IAAclH,KAAc,SAAW0K,IACtCxD,IAAclH,KAAc,OAAS2K,IACrC,CAACzD,IAAclH,KAAc,SAAW4K,IACxC,CAAC1D,IAAclH,KAAc,OAAS6K,IAGrCI,GACJ,CAAC,CAACnI,EAAQoI,0BACRhE,IAAclH,KAAc,SAAW2K,IACtCzD,IAAclH,KAAc,OAAS0K,IACrC,CAACxD,IAAclH,KAAc,SAAW6K,IACxC,CAAC3D,IAAclH,KAAc,OAAS4K,IAErCO,GAAmBJ,IAAyBE,IAE9CR,IAAeK,IAAuBK,QAEnCnB,QAAU,IAEXS,IAAeK,QACLZ,GAAUN,GAAQ,CAAlB,GAGVuB,QACU5B,GAAqBvJ,EAArB,KAGThB,UAAYA,GAAagB,GAAY,IAAMA,GAAY,MAIvD/D,QAAQqC,OAAb2J,GAAA,CAAA,EACK7F,EAAKnG,QAAQqC,OACbwC,GACDsB,EAAKgE,SAAS9H,OACd8D,EAAKnG,QAAQ7D,UACbgK,EAAKpD,SAHJ,CAFL,IASOkD,GAAaE,EAAKgE,SAASjE,UAAWC,EAAM,MAA5C,GAjFX,EAoFOA,ECzIM,SAASgJ,GAAahJ,EAAM,OACXA,EAAKnG,QAA3BqC,EADiCqI,EACjCrI,OAAQlG,EADyBuO,EACzBvO,UACV4G,GAAYoD,EAAKpD,UAAUiB,MAAM,GAArB,EAA0B,CAA1B,EACZ4G,GAAQjL,KAAKiL,MACbK,GAAa,CAAC,MAAO,QAAR,EAAkBlR,QAAQgJ,EAA1B,IAAyC,GACtD1E,GAAO4M,GAAa,QAAU,SAC9B4B,GAAS5B,GAAa,OAAS,MAC/B7F,GAAc6F,GAAa,QAAU,gBAEvC5I,EAAOhE,EAAP,EAAeuM,GAAMzO,EAAU0Q,EAAV,CAAN,MACZ7M,QAAQqC,OAAOwK,EAApB,EACEjC,GAAMzO,EAAU0Q,EAAV,CAAN,EAA2BxK,EAAO+C,EAAP,GAE3B/C,EAAOwK,EAAP,EAAiBjC,GAAMzO,EAAUkC,EAAV,CAAN,MACd2B,QAAQqC,OAAOwK,EAApB,EAA8BjC,GAAMzO,EAAUkC,EAAV,CAAN,GAGzB8H,ECRF,SAASiJ,GAAQC,EAAKjK,EAAaJ,EAAeF,EAAkB,KAEnEd,GAAQqL,EAAItJ,MAAM,2BAAV,EACRF,GAAQ,CAAC7B,GAAM,CAAN,EACT8F,GAAO9F,GAAM,CAAN,KAGT,CAAC6B,UACIwJ,KAGLvF,GAAK/P,QAAQ,GAAb,IAAsB,EAAG,KACvBiB,GAAAA,OACI8O,KACD,QACO9E,KAKAF,MAGRpG,GAAOqB,GAAc/E,EAAd,SACN0D,GAAK0G,CAAL,EAAoB,IAAMS,WACxBiE,KAAS,MAAQA,KAAS,KAAM,KAErCwF,GAAAA,cACAxF,KAAS,QACJnK,KAAKC,IACVpG,SAASoD,gBAAgB4D,aACzBjH,OAAOuI,aAAe,CAFjB,KAKAnC,KAAKC,IACVpG,SAASoD,gBAAgB2D,YACzBhH,OAAOsI,YAAc,CAFhB,EAKFyN,GAAO,IAAMzJ,eAIbA,GAeJ,SAAS0J,GACdxN,EACAiD,EACAF,EACA0K,EACA,KACMxP,GAAU,CAAC,EAAG,CAAJ,EAKVyP,GAAY,CAAC,QAAS,MAAV,EAAkB1V,QAAQyV,CAA1B,IAA6C,GAIzDE,GAAY3N,EAAOiC,MAAM,SAAb,EAAwBX,IAAI,SAAAsM,GAAA,QAAQA,GAAKC,KAAL,EAApC,EAIZC,GAAUH,GAAU3V,QACxBuL,GAAKoK,GAAW,SAAAC,GAAA,QAAQA,GAAKG,OAAO,MAAZ,IAAwB,GAAhD,CADc,EAIZJ,GAAUG,EAAV,GAAsBH,GAAUG,EAAV,EAAmB9V,QAAQ,GAA3B,IAAoC,YACpD0M,KACN,8EADF,MAOIsJ,GAAa,cACfC,GAAMH,KAAY,GAClB,CACEH,GACGnJ,MAAM,EAAGsJ,EADZ,EAEGjC,OAAO,CAAC8B,GAAUG,EAAV,EAAmB7L,MAAM+L,EAAzB,EAAqC,CAArC,CAAD,CAFV,EAGA,CAACL,GAAUG,EAAV,EAAmB7L,MAAM+L,EAAzB,EAAqC,CAArC,CAAD,EAA0CnC,OACxC8B,GAAUnJ,MAAMsJ,GAAU,CAA1B,CADF,CAJF,EAQA,CAACH,EAAD,YAGEM,GAAI3M,IAAI,SAAC4M,GAAItC,GAAU,KAErBvI,IAAeuI,KAAU,EAAI,CAAC8B,GAAYA,IAC5C,SACA,QACAS,GAAoB,UAEtBD,GAGGE,OAAO,SAAC3M,GAAGC,GAAM,QACZD,GAAEA,GAAE3J,OAAS,CAAb,IAAoB,IAAM,CAAC,IAAK,GAAN,EAAWE,QAAQ0J,EAAnB,IAA0B,OACpDD,GAAE3J,OAAS,CAAb,EAAkB4J,MACE,GACbD,IACE0M,OACP1M,GAAE3J,OAAS,CAAb,GAAmB4J,MACC,GACbD,IAEAA,GAAEoK,OAAOnK,EAAT,GAER,CAAA,CAfL,EAiBGJ,IAAI,SAAAgM,GAAA,QAAOD,GAAQC,GAAKjK,GAAaJ,EAAeF,CAAzC,EAjBd,EAPE,KA6BF0B,QAAQ,SAACyJ,GAAItC,GAAU,IACtBnH,QAAQ,SAACmJ,GAAMS,GAAW,CACvB3G,EAAUkG,EAAV,OACMhC,EAAR,GAAkBgC,IAAQM,GAAGG,GAAS,CAAZ,IAAmB,IAAM,GAAK,IAF5D,EADF,EAOOpQ,GAYM,SAAS+B,GAAOoE,EAAhBtD,EAAkC,KAAVd,EAAUc,EAAVd,OAC7BgB,EAA8CoD,EAA9CpD,aAA8CoD,EAAnCnG,QAAWqC,GADiBqI,GACjBrI,OAAQlG,GADSuO,GACTvO,UAChCqT,GAAgBzM,EAAUiB,MAAM,GAAhB,EAAqB,CAArB,EAElBhE,GAAAA,cACAyJ,EAAU,CAAC1H,CAAX,KACQ,CAAC,CAACA,EAAQ,CAAV,KAEAwN,GAAYxN,EAAQM,GAAQlG,GAAWqT,EAAvC,EAGRA,KAAkB,WACbzQ,KAAOiB,GAAQ,CAAR,KACPf,MAAQe,GAAQ,CAAR,GACNwP,KAAkB,YACpBzQ,KAAOiB,GAAQ,CAAR,KACPf,MAAQe,GAAQ,CAAR,GACNwP,KAAkB,UACpBvQ,MAAQe,GAAQ,CAAR,KACRjB,KAAOiB,GAAQ,CAAR,GACLwP,KAAkB,cACpBvQ,MAAQe,GAAQ,CAAR,KACRjB,KAAOiB,GAAQ,CAAR,KAGXqC,OAASA,GACP8D,ECrLM,SAASkK,GAAgBlK,EAAMU,EAAS,KACjDtE,EACFsE,EAAQtE,mBAAqB5F,EAAgBwJ,EAAKgE,SAAS9H,MAA9B,EAK3B8D,EAAKgE,SAAShO,YAAcoG,MACV5F,EAAgB4F,CAAhB,OAMhB+N,EAAgB7I,GAAyB,WAAzB,EAChB8I,GAAepK,EAAKgE,SAAS9H,OAAO2F,MAClCjJ,GAA0CwR,GAA1CxR,IAAKE,GAAqCsR,GAArCtR,KAAuBuR,GAAcD,GAA9BD,CAhBiC,KAiBxCvR,IAAM,MACNE,KAAO,MACPqR,CAAb,EAA8B,OAExB9N,GAAaJ,GACjB+D,EAAKgE,SAAS9H,OACd8D,EAAKgE,SAAShO,UACd0K,EAAQvE,QACRC,EACA4D,EAAKW,aALY,KAUN/H,IAAMA,MACNE,KAAOA,MACPqR,CAAb,EAA8BE,KAEtBhO,WAAaA,OAEfjF,GAAQsJ,EAAQ4J,SAClBpO,GAAS8D,EAAKnG,QAAQqC,OAEpBmD,GAAQ,SAAA,SACJzC,GAAW,KACb8C,GAAQxD,GAAOU,EAAP,SAEVV,GAAOU,EAAP,EAAoBP,GAAWO,EAAX,GACpB,CAAC8D,EAAQ6J,yBAED/Q,KAAKC,IAAIyC,GAAOU,EAAP,EAAmBP,GAAWO,EAAX,CAA5B,SAEAA,GAAY8C,EAAtB,aATU,SAWF9C,GAAW,KACbmC,GAAWnC,KAAc,QAAU,OAAS,MAC9C8C,GAAQxD,GAAO6C,EAAP,SAEV7C,GAAOU,EAAP,EAAoBP,GAAWO,EAAX,GACpB,CAAC8D,EAAQ6J,yBAED/Q,KAAKwN,IACX9K,GAAO6C,EAAP,EACA1C,GAAWO,EAAX,GACGA,KAAc,QAAUV,GAAOpC,MAAQoC,GAAOnC,OAH3C,SAMAgF,GAAWW,EAArB,cAIEW,QAAQ,SAAAzD,GAAa,KACnB1E,GACJ,CAAC,OAAQ,KAAT,EAAgBtE,QAAQgJ,EAAxB,IAAuC,GAAK,UAAY,qBAC5CV,GAAWmD,GAAMnH,EAAN,EAAY0E,EAAZ,CAAzB,EAHF,IAMK/C,QAAQqC,OAASA,GAEf8D,EChFM,SAASwK,GAAMxK,EAAM,KAC5BpD,EAAYoD,EAAKpD,UACjByM,EAAgBzM,EAAUiB,MAAM,GAAhB,EAAqB,CAArB,EAChB4M,EAAiB7N,EAAUiB,MAAM,GAAhB,EAAqB,CAArB,KAGnB4M,EAAgB,QACYzK,EAAKnG,QAA3B7D,GADUuO,GACVvO,UAAWkG,GADDqI,GACCrI,OACb4I,GAAa,CAAC,SAAU,KAAX,EAAkBlR,QAAQyV,CAA1B,IAA6C,GAC1DnR,GAAO4M,GAAa,OAAS,MAC7B7F,GAAc6F,GAAa,QAAU,SAErC4F,GAAe,aACTxS,GAAOlC,GAAUkC,EAAV,CAAjB,YAEGA,GAAOlC,GAAUkC,EAAV,EAAkBlC,GAAUiJ,EAAV,EAAyB/C,GAAO+C,EAAP,CADrD,KAKGpF,QAAQqC,OAAb2J,GAAA,CAAA,EAA2B3J,GAAWwO,GAAaD,CAAb,CAAtC,SAGKzK,ECnBM,SAAS2K,GAAK3K,EAAM,IAC7B,CAAC+F,GAAmB/F,EAAKgE,SAASjE,UAAW,OAAQ,iBAApD,SACIC,MAGHnD,EAAUmD,EAAKnG,QAAQ7D,UACvB4U,EAAQzL,GACZa,EAAKgE,SAASjE,UACd,SAAApH,EAAA,QAAYA,EAAS0I,OAAS,kBAFlB,EAGZhF,cAGAQ,EAAQhE,OAAS+R,EAAMhS,KACvBiE,EAAQ/D,KAAO8R,EAAM7R,OACrB8D,EAAQjE,IAAMgS,EAAM/R,QACpBgE,EAAQ9D,MAAQ6R,EAAM9R,KACtB,IAEIkH,EAAK2K,OAAS,UACT3K,IAGJ2K,KAAO,KACP9G,WAAW,qBAAhB,EAAyC,OACpC,IAED7D,EAAK2K,OAAS,UACT3K,IAGJ2K,KAAO,KACP9G,WAAW,qBAAhB,EAAyC,UAGpC7D,EClCM,SAAS6K,GAAM7K,EAAM,KAC5BpD,EAAYoD,EAAKpD,UACjByM,EAAgBzM,EAAUiB,MAAM,GAAhB,EAAqB,CAArB,IACQmC,EAAKnG,QAA3BqC,GAH0BqI,EAG1BrI,OAAQlG,GAHkBuO,EAGlBvO,UACV8I,GAAU,CAAC,OAAQ,OAAT,EAAkBlL,QAAQyV,CAA1B,IAA6C,GAEvDyB,GAAiB,CAAC,MAAO,MAAR,EAAgBlX,QAAQyV,CAAxB,IAA2C,aAE3DvK,GAAU,OAAS,KAA1B,EACE9I,GAAUqT,CAAV,GACCyB,GAAiB5O,GAAO4C,GAAU,QAAU,QAA3B,EAAuC,KAEtDlC,UAAY0B,GAAqB1B,CAArB,IACZ/C,QAAQqC,OAAStC,GAAcsC,EAAd,EAEf8D,ECOT,IAAAD,GAAe,OASN,OAEE,YAEE,MAELyK,WAyCE,OAEC,YAEE,MAEL5O,UAII,mBAoBO,OAER,YAEE,MAELsO,YAMM,CAAC,OAAQ,QAAS,MAAO,QAAzB,UAOD,oBAMU,6BAYP,OAEL,YAEE,MAELlB,UAaC,OAEE,YAEE,MAELlD,WAEK,kBAcL,OAEG,YAEE,MAELlF,YAOM,eAKD,oBAOU,0BAQH,2BAQS,UAUpB,OAEE,YAEE,MAELiK,SAaA,OAEG,YAEE,MAELF,iBAkBQ,OAEL,YAEE,MAELtF,mBAMa,KAMd,WAMA,oBAkBO,OAEH,YAEE,MAELtB,UAEII,mBAOShE,SCzUrB4K,GAAe,WAKF,uBAMI,iBAMA,mBAOE,YAQP,UAAM,CAAA,WAUN,UAAM,CAAA,gBChDGC,IAAAA,UAAAA,YASPhV,EAAWkG,EAAsB,YAAdwE,GAAc,UAAA,OAAA,GAAA,UAAA,CAAA,IAAA,OAAA,UAAA,CAAA,EAAJ,CAAA,kBAyFzCyC,eAAiB,UAAA,QAAM8H,sBAAsBC,EAAK1K,MAA3B,QAvFhBA,OAASlM,EAAS,KAAKkM,OAAO2K,KAAK,IAAjB,CAAT,OAGTzK,QAALmF,GAAA,CAAA,EAAoBmF,EAAOD,SAAarK,EAAxC,OAGK3C,MAAQ,aACE,aACF,iBACI,CAAA,QAIZ/H,UAAYA,GAAaA,EAAUoV,OAASpV,EAAU,CAAV,EAAeA,OAC3DkG,OAASA,GAAUA,EAAOkP,OAASlP,EAAO,CAAP,EAAYA,OAG/CwE,QAAQX,UAAY,CAAA,SAClB9C,KAAP4I,GAAA,CAAA,EACKmF,EAAOD,SAAShL,UAChBW,GAAQX,SAFb,CAAA,EAGGM,QAAQ,SAAAgB,GAAQ,GACZX,QAAQX,UAAUsB,EAAvB,EAAAwE,GAAA,CAAA,EAEMmF,EAAOD,SAAShL,UAAUsB,EAA1B,GAAmC,CAAA,EAEnCX,GAAQX,UAAYW,GAAQX,UAAUsB,EAAlB,EAA0B,CAAA,CAJpD,EAJF,OAaKtB,UAAY/C,OAAOC,KAAK,KAAKyD,QAAQX,SAAzB,EACd7C,IAAI,SAAAmE,GAAA,qBAEA6J,EAAKxK,QAAQX,UAAUsB,EAAvB,CAFA,EADU,EAMdjE,KAAK,SAACC,GAAGC,GAAJ,QAAUD,GAAEjG,MAAQkG,GAAElG,MANb,OAYZ2I,UAAUM,QAAQ,SAAA+D,GAAmB,CACpCA,GAAgB7D,SAAWhM,EAAW6P,GAAgBiH,MAA3B,MACbA,OACdH,EAAKlV,UACLkV,EAAKhP,OACLgP,EAAKxK,QACL0D,GACA8G,EAAKnN,KALP,EAFJ,OAaKyC,OAAL,MAEMyC,GAAgB,KAAKvC,QAAQuC,cAC/BA,SAEGC,qBAAL,OAGGnF,MAAMkF,cAAgBA,8CAKpB,QACAzC,GAAO7L,KAAK,IAAZ,mCAEC,QACDmN,GAAQnN,KAAK,IAAb,gDAEc,QACduO,EAAqBvO,KAAK,IAA1B,iDAEe,QACfsN,EAAsBtN,KAAK,IAA3B,YA1FUqW,OAAAA,GAoHZM,OAAS,OAAOlY,QAAW,YAAcA,OAASmY,QAAQC,YApH9CR,GAsHZ5D,WAAaA,GAtHD4D,GAwHZD,SAAWA,imCCrHpB,IAAMU,EAAiB,gBACjBC,EAAU,IACVC,EAA0B,IAGhC,SAASC,EAAOC,EAAK,CACnB,MAAO,CAAA,EAAGC,SAASC,KAAKF,CAAjB,EAAsBG,MAAM,aAA5B,EAA2C,CAA3C,EAA8CC,YAA9C,CACR,CAED,SAASC,GAA+B,CACtC,MAAO,CACLC,SAAUV,EACVW,aAAcX,EACdY,OAHK,SAGEC,EAAO,CACZ,GAAIC,EAAED,EAAME,MAAP,EAAeC,GAAG,IAAnB,EACF,OAAOH,EAAMI,UAAUC,QAAQC,MAAM,KAAMC,SAApC,CAGV,CARI,CAUR,CAED,SAASC,EAAsBC,EAAU,CAAA,IAAAC,EAAA,KACnCC,EAAS,GAEbV,OAAAA,EAAE,IAAD,EAAOW,IAAIC,EAAK1B,eAAgB,UAAM,CACrCwB,EAAS,EACV,CAFD,EAIAG,WAAW,UAAM,CACVH,GACHE,EAAKE,qBAAqBL,CAA1B,CAEH,EAAED,CAJO,EAMH,IACR,CAED,SAASO,GAA0B,CACjCf,EAAEgB,GAAGC,qBAAuBV,EAC5BP,EAAED,MAAMmB,QAAQN,EAAK1B,cAArB,EAAuCS,EAA4B,CACpE,CAQD,IAAMiB,EAAO,CAEX1B,eAAgB,kBAEhBiC,OAJW,SAIJC,EAAQ,CACb,GAEEA,GAAU,CAAC,EAAEC,KAAKC,OAAL,EAAgBnC,SACtBoC,SAASC,eAAeJ,CAAxB,GACT,OAAOA,CACR,EAEDK,uBAZW,SAYYC,EAAS,CAC9B,IAAIC,EAAWD,EAAQE,aAAa,aAArB,EAEf,GAAI,CAACD,GAAYA,IAAa,IAAK,CACjC,IAAME,EAAWH,EAAQE,aAAa,MAArB,EACjBD,EAAWE,GAAYA,IAAa,IAAMA,EAASC,KAAT,EAAkB,EAC7D,CAED,GAAI,CACF,OAAOP,SAASQ,cAAcJ,CAAvB,EAAmCA,EAAW,IACtD,OAAQK,EAAK,CACZ,OAAO,IACR,CACF,EAEDC,iCA3BW,SA2BsBP,EAAS,CACxC,GAAI,CAACA,EACH,MAAO,GAIT,IAAIQ,EAAqBlC,EAAE0B,CAAD,EAAUS,IAAI,qBAAf,EACrBC,EAAkBpC,EAAE0B,CAAD,EAAUS,IAAI,kBAAf,EAEhBE,EAA0BC,WAAWJ,CAAD,EACpCK,EAAuBD,WAAWF,CAAD,EAGvC,MAAI,CAACC,GAA2B,CAACE,EACxB,GAITL,EAAqBA,EAAmBM,MAAM,GAAzB,EAA8B,CAA9B,EACrBJ,EAAkBA,EAAgBI,MAAM,GAAtB,EAA2B,CAA3B,GAEVF,WAAWJ,CAAD,EAAuBI,WAAWF,CAAD,GAAqBhD,EACzE,EAEDqD,OAnDW,SAmDJf,EAAS,CACd,OAAOA,EAAQgB,YAChB,EAED5B,qBAvDW,SAuDUY,EAAS,CAC5B1B,EAAE0B,CAAD,EAAUiB,QAAQzD,CAAnB,CACD,EAGD0D,sBA5DW,UA4Da,CACtB,MAAOC,EAAQ3D,CAChB,EAED4D,UAhEW,SAgEDxD,EAAK,CACb,OAAQA,EAAI,CAAD,GAAOA,GAAKyD,QACxB,EAEDC,gBApEW,SAoEKC,EAAeC,EAAQC,EAAa,CAClD,QAAWC,KAAYD,EACrB,GAAIE,OAAOC,UAAUC,eAAe/D,KAAK2D,EAAaC,CAAlD,EAA6D,CAC/D,IAAMI,EAAgBL,EAAYC,CAAD,EAC3BK,EAAgBP,EAAOE,CAAD,EACtBM,EAAgBD,GAAS7C,EAAKkC,UAAUW,CAAf,EAC3B,UAAYpE,EAAOoE,CAAD,EAEtB,GAAI,CAAC,IAAIE,OAAOH,CAAX,EAA0BI,KAAKF,CAA/B,EACH,MAAM,IAAIG,MACLZ,EAAca,YAAd,EAAH,MAAA,WACWV,EADX,oBACuCM,EADvC,OAAA,sBAEsBF,EAFtB,KADI,CAKT,CAEJ,EAEDO,eAtFW,SAsFIrC,EAAS,CACtB,GAAI,CAACH,SAASyC,gBAAgBC,aAC5B,OAAO,KAIT,GAAI,OAAOvC,EAAQwC,aAAgB,WAAY,CAC7C,IAAMC,EAAOzC,EAAQwC,YAAR,EACb,OAAOC,aAAgBC,WAAaD,EAAO,IAC5C,CAED,OAAIzC,aAAmB0C,WACd1C,EAIJA,EAAQ2C,WAINzD,EAAKmD,eAAerC,EAAQ2C,UAA5B,EAHE,IAIV,CA3GU,EA8GbtD,EAAuB,EC9JvB,IAAMuD,EAAsB,QACtBC,GAAsB,QACtBC,EAAsB,WACtBC,EAAS,IAAiBD,EAC1BE,EAAsB,YACtBC,EAAsB3E,EAAEgB,GAAGsD,CAAL,EAEtBM,EAAW,CACfC,QAAU,wBADK,EAIXC,GAAQ,CACZC,MAAK,QAAoBN,EACzBO,OAAM,SAAoBP,EAC1BQ,eAAc,QAAWR,EAAYC,CAHzB,EAMRQ,GAAY,CAChBC,MAAQ,QACRC,KAAQ,OACRC,KAAQ,MAHQ,EAYZC,eACJ,SAAAA,EAAY5D,EAAS,CACnB,KAAK6D,SAAW7D,CACjB,4BAUD8D,MAAA,SAAM9D,EAAS,CACb,IAAI+D,EAAc,KAAKF,SACnB7D,IACF+D,EAAc,KAAKC,gBAAgBhE,CAArB,GAGhB,IAAMiE,EAAc,KAAKC,mBAAmBH,CAAxB,EAEhBE,EAAYE,mBAAZ,GAIJ,KAAKC,eAAeL,CAApB,CACD,IAEDM,QAAA,UAAU,CACR/F,EAAEgG,WAAW,KAAKT,SAAUf,CAA5B,EACA,KAAKe,SAAW,IACjB,IAIDG,gBAAA,SAAgBhE,EAAS,CACvB,IAAMC,EAAWf,EAAKa,uBAAuBC,CAA5B,EACbuE,EAAa,GAEjB,OAAItE,IACFsE,EAAS1E,SAASQ,cAAcJ,CAAvB,GAGNsE,IACHA,EAASjG,EAAE0B,CAAD,EAAUwE,QAAX,IAAuBhB,GAAUC,KAAjC,EAA0C,CAA1C,GAGJc,CACR,IAEDL,mBAAA,SAAmBlE,EAAS,CAC1B,IAAMyE,EAAanG,EAAE8E,MAAMA,GAAMC,KAAd,EAEnB/E,OAAAA,EAAE0B,CAAD,EAAUiB,QAAQwD,CAAnB,EACOA,CACR,IAEDL,eAAA,SAAepE,EAAS,CAAA,IAAAjB,EAAA,KAGtB,GAFAT,EAAE0B,CAAD,EAAU0E,YAAYlB,GAAUG,IAAjC,EAEI,CAACrF,EAAE0B,CAAD,EAAU2E,SAASnB,GAAUE,IAA9B,EAAqC,CACxC,KAAKkB,gBAAgB5E,CAArB,EACA,MACD,CAED,IAAMQ,EAAqBtB,EAAKqB,iCAAiCP,CAAtC,EAE3B1B,EAAE0B,CAAD,EACEf,IAAIC,EAAK1B,eAAgB,SAACa,EAAD,CAAA,OAAWU,EAAK6F,gBAAgB5E,EAAS3B,CAA9B,CAAX,CAD5B,EAEGkB,qBAAqBiB,CAFxB,CAGD,IAEDoE,gBAAA,SAAgB5E,EAAS,CACvB1B,EAAE0B,CAAD,EACE6E,OADH,EAEG5D,QAAQmC,GAAME,MAFjB,EAGGwB,OAHH,CAID,IAIMC,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAMC,EAAW3G,EAAE,IAAD,EACd4G,EAAaD,EAASC,KAAKpC,CAAd,EAEZoC,IACHA,EAAO,IAAItB,EAAM,IAAV,EACPqB,EAASC,KAAKpC,EAAUoC,CAAxB,GAGE1D,IAAW,SACb0D,EAAK1D,CAAD,EAAS,IAAb,CAEH,CAZM,CAaR,IAEM2D,eAAP,SAAsBC,EAAe,CACnC,OAAO,SAAU/G,EAAO,CAClBA,GACFA,EAAMgH,eAAN,EAGFD,EAActB,MAAM,IAApB,CACD,CACF,yCAlGoB,CACnB,OAAOjB,EACR,WAyGHvE,EAAEuB,QAAD,EAAWyF,GACVlC,GAAMG,eACNL,EAASC,QACTS,GAAMuB,eAAe,IAAIvB,EAAzB,CAHF,EAYAtF,EAAEgB,GAAGsD,CAAL,EAAyBgB,GAAMmB,iBAC/BzG,EAAEgB,GAAGsD,CAAL,EAAW2C,YAAc3B,GACzBtF,EAAEgB,GAAGsD,CAAL,EAAW4C,WAAc,UAAM,CAC7BlH,OAAAA,EAAEgB,GAAGsD,CAAL,EAAaK,EACNW,GAAMmB,gBACd,ECjKD,IAAMnC,GAAsB,SACtBC,GAAsB,QACtBC,GAAsB,YACtBC,GAAS,IAAiBD,GAC1BE,GAAsB,YACtBC,GAAsB3E,EAAEgB,GAAGsD,EAAL,EAEtBY,GAAY,CAChBiC,OAAS,SACTC,OAAS,MACTC,MAAS,OAHO,EAMZzC,GAAW,CACf0C,mBAAqB,0BACrBC,YAAqB,0BACrBC,MAAqB,6BACrBL,OAAqB,UACrBC,OAAqB,MALN,EAQXtC,EAAQ,CACZG,eAAc,QAAgBR,GAAYC,GAC1C+C,oBAAsB,QAAQhD,GAAYC,GAApB,KAAA,OACSD,GAAYC,GAH/B,EAYRgD,eACJ,SAAAA,EAAYhG,EAAS,CACnB,KAAK6D,SAAW7D,CACjB,4BAUDiG,OAAA,UAAS,CACP,IAAIC,EAAqB,GACrBC,EAAiB,GACfpC,EAAczF,EAAE,KAAKuF,QAAN,EAAgBW,QACnCtB,GAAS2C,WADS,EAElB,CAFkB,EAIpB,GAAI9B,EAAa,CACf,IAAMqC,EAAQ,KAAKvC,SAASxD,cAAc6C,GAAS4C,KAArC,EAEd,GAAIM,EAAO,CACT,GAAIA,EAAMC,OAAS,QACjB,GAAID,EAAME,SACR,KAAKzC,SAAS0C,UAAUC,SAAShD,GAAUiC,MAA3C,EACAS,EAAqB,OAChB,CACL,IAAMO,EAAgB1C,EAAY1D,cAAc6C,GAASuC,MAAnC,EAElBgB,GACFnI,EAAEmI,CAAD,EAAgB/B,YAAYlB,GAAUiC,MAAvC,CAEH,CAGH,GAAIS,EAAoB,CACtB,GAAIE,EAAMM,aAAa,UAAnB,GACF3C,EAAY2C,aAAa,UAAzB,GACAN,EAAMG,UAAUC,SAAS,UAAzB,GACAzC,EAAYwC,UAAUC,SAAS,UAA/B,EACA,OAEFJ,EAAME,QAAU,CAAC,KAAKzC,SAAS0C,UAAUC,SAAShD,GAAUiC,MAA3C,EACjBnH,EAAE8H,CAAD,EAAQnF,QAAQ,QAAjB,CACD,CAEDmF,EAAMO,MAAN,EACAR,EAAiB,EAClB,CACF,CAEGA,GACF,KAAKtC,SAAS+C,aAAa,eACzB,CAAC,KAAK/C,SAAS0C,UAAUC,SAAShD,GAAUiC,MAA3C,CADH,EAIES,GACF5H,EAAE,KAAKuF,QAAN,EAAgBgD,YAAYrD,GAAUiC,MAAvC,CAEH,IAEDpB,QAAA,UAAU,CACR/F,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EACA,KAAKe,SAAW,IACjB,IAIMkB,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EAENoC,IACHA,EAAO,IAAIc,EAAO,IAAX,EACP1H,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE1D,IAAW,UACb0D,EAAK1D,CAAD,EAAJ,CAEH,CAXM,CAYR,yCA5EoB,CACnB,OAAOqB,EACR,WAmFHvE,EAAEuB,QAAD,EACEyF,GAAGlC,EAAMG,eAAgBL,GAAS0C,mBAAoB,SAACvH,EAAU,CAChEA,EAAMgH,eAAN,EAEA,IAAIyB,EAASzI,EAAME,OAEdD,EAAEwI,CAAD,EAASnC,SAASnB,GAAUkC,MAA7B,IACHoB,EAASxI,EAAEwI,CAAD,EAAStC,QAAQtB,GAASwC,MAA3B,GAGXM,GAAOjB,iBAAiBjH,KAAKQ,EAAEwI,CAAD,EAAU,QAAxC,CACD,CAXH,EAYGxB,GAAGlC,EAAM2C,oBAAqB7C,GAAS0C,mBAAoB,SAACvH,EAAU,CACrE,IAAMyI,EAASxI,EAAED,EAAME,MAAP,EAAeiG,QAAQtB,GAASwC,MAAjC,EAAyC,CAAzC,EACfpH,EAAEwI,CAAD,EAASD,YAAYrD,GAAUmC,MAAO,eAAezD,KAAK7D,EAAMgI,IAA1B,CAAvC,CACD,CAfH,EAuBA/H,EAAEgB,GAAGsD,EAAL,EAAaoD,GAAOjB,iBACpBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAcS,GACzB1H,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACN+C,GAAOjB,gBACf,ECxJD,IAAMnC,GAAyB,WACzBC,GAAyB,QACzBC,GAAyB,cACzBC,GAAS,IAAoBD,GAC7BE,GAAyB,YACzBC,GAAyB3E,EAAEgB,GAAGsD,EAAL,EACzBmE,GAAyB,GACzBC,GAAyB,GACzBC,GAAyB,IACzBC,GAAyB,GAEzBC,GAAU,CACdC,SAAW,IACXC,SAAW,GACXC,MAAW,GACXC,MAAW,QACXC,KAAW,GACXC,MAAW,EANG,EASVC,GAAc,CAClBN,SAAW,mBACXC,SAAW,UACXC,MAAW,mBACXC,MAAW,mBACXC,KAAW,UACXC,MAAW,SANO,EASdE,GAAY,CAChBC,KAAW,OACXC,KAAW,OACXC,KAAW,OACXC,MAAW,OAJK,EAOZ3E,EAAQ,CACZ4E,MAAK,QAAoBjF,GACzBkF,KAAI,OAAoBlF,GACxBmF,QAAO,UAAoBnF,GAC3BoF,WAAU,aAAoBpF,GAC9BqF,WAAU,aAAoBrF,GAC9BsF,WAAU,aAAoBtF,GAC9BuF,UAAS,YAAoBvF,GAC7BwF,SAAQ,WAAoBxF,GAC5ByF,YAAW,cAAoBzF,GAC/B0F,UAAS,YAAoB1F,GAC7B2F,WAAU,YAAmB3F,GAC7B4F,cAAa,OAAW5F,GAAYC,GACpCO,eAAc,QAAWR,GAAYC,EAbzB,EAgBRQ,EAAY,CAChBoF,SAAgB,WAChBnD,OAAgB,SAChBuC,MAAgB,QAChBD,MAAgB,sBAChBD,KAAgB,qBAChBF,KAAgB,qBAChBC,KAAgB,qBAChBgB,KAAgB,gBAChBC,cAAgB,eATA,EAYZ5F,EAAW,CACfuC,OAAc,UACdsD,YAAc,wBACdF,KAAc,iBACdG,SAAc,qBACdC,UAAc,2CACdC,WAAc,uBACdC,WAAc,gCACdC,UAAc,wBARC,EAWXC,EAAc,CAClBC,MAAQ,QACRC,IAAQ,KAFU,EAUdC,cACJ,SAAAA,EAAYxJ,EAASwB,EAAQ,CAC3B,KAAKiI,OAAiB,KACtB,KAAKC,UAAiB,KACtB,KAAKC,eAAiB,KACtB,KAAKC,UAAiB,GACtB,KAAKC,WAAiB,GACtB,KAAKC,aAAiB,KACtB,KAAKC,YAAiB,EACtB,KAAKC,YAAiB,EAEtB,KAAKC,QAAqB,KAAKC,WAAW1I,CAAhB,EAC1B,KAAKqC,SAAqB7D,EAC1B,KAAKmK,mBAAqB,KAAKtG,SAASxD,cAAc6C,EAASgG,UAArC,EAC1B,KAAKkB,gBAAqB,iBAAkBvK,SAASyC,iBAAmB+H,UAAUC,eAAiB,EACnG,KAAKC,cAAqBpJ,GAAQqJ,OAAOC,cAAgBD,OAAOE,gBAEhE,KAAKC,mBAAL,CACD,4BAcDC,KAAA,UAAO,CACA,KAAKf,YACR,KAAKgB,OAAOlD,GAAUC,IAAtB,CAEH,IAEDkD,gBAAA,UAAkB,CAGZ,CAACjL,SAASkL,QACXzM,EAAE,KAAKuF,QAAN,EAAgBrF,GAAG,UAApB,GAAmCF,EAAE,KAAKuF,QAAN,EAAgBpD,IAAI,YAArB,IAAuC,UAC3E,KAAKmK,KAAL,CAEH,IAEDI,KAAA,UAAO,CACA,KAAKnB,YACR,KAAKgB,OAAOlD,GAAUE,IAAtB,CAEH,IAEDN,MAAA,SAAMlJ,EAAO,CACNA,IACH,KAAKuL,UAAY,IAGf,KAAK/F,SAASxD,cAAc6C,EAAS+F,SAArC,IACF/J,EAAKE,qBAAqB,KAAKyE,QAA/B,EACA,KAAKoH,MAAM,EAAX,GAGFC,cAAc,KAAKxB,SAAN,EACb,KAAKA,UAAY,IAClB,IAEDuB,MAAA,SAAM5M,EAAO,CACNA,IACH,KAAKuL,UAAY,IAGf,KAAKF,YACPwB,cAAc,KAAKxB,SAAN,EACb,KAAKA,UAAY,MAGf,KAAKO,QAAQ7C,UAAY,CAAC,KAAKwC,YACjC,KAAKF,UAAYyB,aACdtL,SAASuL,gBAAkB,KAAKN,gBAAkB,KAAKF,MAAMS,KAAK,IAAnE,EACA,KAAKpB,QAAQ7C,QAFa,EAK/B,IAEDkE,GAAA,SAAGC,EAAO,CAAA,IAAAxM,EAAA,KACR,KAAK4K,eAAiB,KAAK9F,SAASxD,cAAc6C,EAAS6F,WAArC,EAEtB,IAAMyC,EAAc,KAAKC,cAAc,KAAK9B,cAAxB,EAEpB,GAAI4B,EAAAA,EAAQ,KAAK9B,OAAOiC,OAAS,GAAKH,EAAQ,GAI9C,IAAI,KAAK1B,WAAY,CACnBvL,EAAE,KAAKuF,QAAN,EAAgB5E,IAAImE,EAAM6E,KAAM,UAAA,CAAA,OAAMlJ,EAAKuM,GAAGC,CAAR,CAAN,CAAjC,EACA,MACD,CAED,GAAIC,IAAgBD,EAAO,CACzB,KAAKhE,MAAL,EACA,KAAK0D,MAAL,EACA,MACD,CAED,IAAMU,EAAYJ,EAAQC,EACtB7D,GAAUC,KACVD,GAAUE,KAEd,KAAKgD,OAAOc,EAAW,KAAKlC,OAAO8B,CAAZ,CAAvB,EACD,IAEDlH,QAAA,UAAU,CACR/F,EAAE,KAAKuF,QAAN,EAAgB+H,IAAI7I,EAArB,EACAzE,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EAEA,KAAK2G,OAAqB,KAC1B,KAAKQ,QAAqB,KAC1B,KAAKpG,SAAqB,KAC1B,KAAK6F,UAAqB,KAC1B,KAAKE,UAAqB,KAC1B,KAAKC,WAAqB,KAC1B,KAAKF,eAAqB,KAC1B,KAAKQ,mBAAqB,IAC3B,IAIDD,WAAA,SAAW1I,EAAQ,CACjBA,OAAAA,EAAMqK,EAAA,CAAA,EACD1E,GACA3F,CAFC,EAINtC,EAAKoC,gBAAgBsB,GAAMpB,EAAQkG,EAAnC,EACOlG,CACR,IAEDsK,aAAA,UAAe,CACb,IAAMC,EAAYpM,KAAKqM,IAAI,KAAKhC,WAAd,EAElB,GAAI+B,EAAAA,GAAa7E,IAIjB,KAAMyE,EAAYI,EAAY,KAAK/B,YAG/B2B,EAAY,GACd,KAAKX,KAAL,EAIEW,EAAY,GACd,KAAKf,KAAL,EAEH,IAEDD,mBAAA,UAAqB,CAAA,IAAAsB,EAAA,KACf,KAAKhC,QAAQ5C,UACf/I,EAAE,KAAKuF,QAAN,EACEyB,GAAGlC,EAAM8E,QAAS,SAAC7J,EAAD,CAAA,OAAW4N,EAAKC,SAAS7N,CAAd,CAAX,CADrB,EAIE,KAAK4L,QAAQ1C,QAAU,SACzBjJ,EAAE,KAAKuF,QAAN,EACEyB,GAAGlC,EAAM+E,WAAY,SAAC9J,EAAD,CAAA,OAAW4N,EAAK1E,MAAMlJ,CAAX,CAAX,CADxB,EAEGiH,GAAGlC,EAAMgF,WAAY,SAAC/J,EAAD,CAAA,OAAW4N,EAAKhB,MAAM5M,CAAX,CAAX,CAFxB,EAKE,KAAK4L,QAAQxC,OACf,KAAK0E,wBAAL,CAEH,IAEDA,wBAAA,UAA0B,CAAA,IAAAC,EAAA,KACxB,GAAK,KAAKhC,gBAIV,KAAMiC,EAAQ,SAAChO,EAAU,CACnB+N,EAAK7B,eAAiBlB,EAAYhL,EAAMiO,cAAcC,YAAYnK,YAAhC,CAAD,EACnCgK,EAAKrC,YAAc1L,EAAMiO,cAAcE,QAC7BJ,EAAK7B,gBACf6B,EAAKrC,YAAc1L,EAAMiO,cAAcG,QAAQ,CAA5B,EAA+BD,QAErD,EAEKE,EAAO,SAACrO,EAAU,CAElBA,EAAMiO,cAAcG,SAAWpO,EAAMiO,cAAcG,QAAQf,OAAS,EACtEU,EAAKpC,YAAc,EAEnBoC,EAAKpC,YAAc3L,EAAMiO,cAAcG,QAAQ,CAA5B,EAA+BD,QAAUJ,EAAKrC,WAEpE,EAEK4C,EAAM,SAACtO,EAAU,CACjB+N,EAAK7B,eAAiBlB,EAAYhL,EAAMiO,cAAcC,YAAYnK,YAAhC,CAAD,IACnCgK,EAAKpC,YAAc3L,EAAMiO,cAAcE,QAAUJ,EAAKrC,aAGxDqC,EAAKN,aAAL,EACIM,EAAKnC,QAAQ1C,QAAU,UASzB6E,EAAK7E,MAAL,EACI6E,EAAKtC,cACP8C,aAAaR,EAAKtC,YAAN,EAEdsC,EAAKtC,aAAe3K,WAAW,SAACd,GAAD,CAAA,OAAW+N,EAAKnB,MAAM5M,EAAX,CAAX,EAA8B4I,GAAyBmF,EAAKnC,QAAQ7C,QAArE,EAEjC,EAED9I,EAAE,KAAKuF,SAASgJ,iBAAiB3J,EAAS8F,QAAxC,CAAD,EAAoD1D,GAAGlC,EAAMsF,WAAY,SAACoE,EAAD,CAAA,OAAOA,EAAEzH,eAAF,CAAP,CAA1E,EACI,KAAKkF,eACPjM,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,EAAMoF,YAAa,SAACnK,EAAD,CAAA,OAAWgO,EAAMhO,CAAD,CAAhB,CAAvC,EACAC,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,EAAMqF,UAAW,SAACpK,EAAD,CAAA,OAAWsO,EAAItO,CAAD,CAAd,CAArC,EAEA,KAAKwF,SAAS0C,UAAUwG,IAAIvJ,EAAUsF,aAAtC,IAEAxK,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,EAAMiF,WAAY,SAAChK,EAAD,CAAA,OAAWgO,EAAMhO,CAAD,CAAhB,CAAtC,EACAC,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,EAAMkF,UAAW,SAACjK,EAAD,CAAA,OAAWqO,EAAKrO,CAAD,CAAf,CAArC,EACAC,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,EAAMmF,SAAU,SAAClK,EAAD,CAAA,OAAWsO,EAAItO,CAAD,CAAd,CAApC,GAEH,IAED6N,SAAA,SAAS7N,EAAO,CACd,GAAI,mBAAkB6D,KAAK7D,EAAME,OAAOyO,OAApC,EAIJ,OAAQ3O,EAAM4O,MAAd,CACE,KAAKlG,GACH1I,EAAMgH,eAAN,EACA,KAAK2F,KAAL,EACA,MACF,KAAKhE,GACH3I,EAAMgH,eAAN,EACA,KAAKuF,KAAL,EACA,MACF,QATF,CAWD,IAEDa,cAAA,SAAczL,EAAS,CACrB,YAAKyJ,OAASzJ,GAAWA,EAAQ2C,WAC7B,CAAA,EAAGuK,MAAMpP,KAAKkC,EAAQ2C,WAAWkK,iBAAiB3J,EAAS2F,IAA7C,CAAd,EACA,CAAA,EACG,KAAKY,OAAO0D,QAAQnN,CAApB,CACR,IAEDoN,oBAAA,SAAoBzB,EAAWlF,EAAe,CAC5C,IAAM4G,EAAkB1B,IAAchE,GAAUC,KAC1C0F,EAAkB3B,IAAchE,GAAUE,KAC1C2D,EAAkB,KAAKC,cAAchF,CAAnB,EAClB8G,EAAkB,KAAK9D,OAAOiC,OAAS,EACvC8B,GAAkBF,GAAmB9B,IAAgB,GACnC6B,GAAmB7B,IAAgB+B,EAE3D,GAAIC,IAAiB,CAAC,KAAKvD,QAAQzC,KACjC,OAAOf,EAGT,IAAMgH,GAAY9B,IAAchE,GAAUE,KAAO,GAAK,EAChD6F,IAAalC,EAAciC,IAAS,KAAKhE,OAAOiC,OAEtD,OAAOgC,KAAc,GACjB,KAAKjE,OAAO,KAAKA,OAAOiC,OAAS,CAAjC,EAAsC,KAAKjC,OAAOiE,EAAZ,CAC3C,IAEDC,mBAAA,SAAmBC,EAAeC,EAAoB,CACpD,IAAMC,EAAc,KAAKrC,cAAcmC,CAAnB,EACdG,EAAY,KAAKtC,cAAc,KAAK5H,SAASxD,cAAc6C,EAAS6F,WAArC,CAAnB,EACZiF,EAAa1P,EAAE8E,MAAMA,EAAM4E,MAAO,CACtC4F,cAAAA,EACAjC,UAAWkC,EACXI,KAAMF,EACNzC,GAAIwC,CAJkC,CAArB,EAOnBxP,OAAAA,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQ+M,CAAzB,EAEOA,CACR,IAEDE,2BAAA,SAA2BlO,EAAS,CAClC,GAAI,KAAKmK,mBAAoB,CAC3B,IAAMgE,EAAa,CAAA,EAAGjB,MAAMpP,KAAK,KAAKqM,mBAAmB0C,iBAAiB3J,EAASuC,MAAlD,CAAd,EACnBnH,EAAE6P,CAAD,EACEzJ,YAAYlB,EAAUiC,MADzB,EAGA,IAAM2I,EAAgB,KAAKjE,mBAAmBkE,SAC5C,KAAK5C,cAAczL,CAAnB,CADoB,EAIlBoO,GACF9P,EAAE8P,CAAD,EAAgBE,SAAS9K,EAAUiC,MAApC,CAEH,CACF,IAEDoF,OAAA,SAAOc,EAAW3L,EAAS,CAAA,IAAAuO,EAAA,KACnB9H,EAAgB,KAAK5C,SAASxD,cAAc6C,EAAS6F,WAArC,EAChByF,EAAqB,KAAK/C,cAAchF,CAAnB,EACrBgI,EAAgBzO,GAAWyG,GAC/B,KAAK2G,oBAAoBzB,EAAWlF,CAApC,EACIiI,GAAmB,KAAKjD,cAAcgD,CAAnB,EACnBE,GAAYxN,EAAQ,KAAKuI,UAE3BkF,GACAC,GACAhB,GAYJ,GAVIlC,IAAchE,GAAUC,MAC1BgH,GAAuBpL,EAAUsE,KACjC+G,GAAiBrL,EAAUoE,KAC3BiG,GAAqBlG,GAAUG,OAE/B8G,GAAuBpL,EAAUuE,MACjC8G,GAAiBrL,EAAUqE,KAC3BgG,GAAqBlG,GAAUI,OAG7B0G,GAAenQ,EAAEmQ,CAAD,EAAc9J,SAASnB,EAAUiC,MAAlC,EAA2C,CAC5D,KAAKoE,WAAa,GAClB,MACD,CAED,IAAMmE,GAAa,KAAKL,mBAAmBc,EAAaZ,EAArC,EACnB,GAAIG,CAAAA,GAAW7J,mBAAX,GAIA,GAACsC,GAAiB,CAACgI,GAKvB,MAAK5E,WAAa,GAEd8E,IACF,KAAKpH,MAAL,EAGF,KAAK2G,2BAA2BO,CAAhC,EAEA,IAAMK,GAAYxQ,EAAE8E,MAAMA,EAAM6E,KAAM,CACpC2F,cAAea,EACf9C,UAAWkC,GACXI,KAAMO,EACNlD,GAAIoD,EAJgC,CAApB,EAOlB,GAAIpQ,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,EAAUwE,KAApC,EAA4C,CAC9C1J,EAAEmQ,CAAD,EAAcH,SAASO,EAAxB,EAEA3P,EAAK6B,OAAO0N,CAAZ,EAEAnQ,EAAEmI,CAAD,EAAgB6H,SAASM,EAA1B,EACAtQ,EAAEmQ,CAAD,EAAcH,SAASM,EAAxB,EAEA,IAAMG,GAAsBC,SAASP,EAAYvO,aAAa,eAAzB,EAA2C,EAA5C,EAChC6O,IACF,KAAK9E,QAAQgF,gBAAkB,KAAKhF,QAAQgF,iBAAmB,KAAKhF,QAAQ7C,SAC5E,KAAK6C,QAAQ7C,SAAW2H,IAExB,KAAK9E,QAAQ7C,SAAW,KAAK6C,QAAQgF,iBAAmB,KAAKhF,QAAQ7C,SAGvE,IAAM5G,GAAqBtB,EAAKqB,iCAAiCkG,CAAtC,EAE3BnI,EAAEmI,CAAD,EACExH,IAAIC,EAAK1B,eAAgB,UAAM,CAC9Bc,EAAEmQ,CAAD,EACE/J,YAAekK,GADlB,IAC0CC,EAD1C,EAEGP,SAAS9K,EAAUiC,MAFtB,EAIAnH,EAAEmI,CAAD,EAAgB/B,YAAelB,EAAUiC,OAA1C,IAAoDoJ,GAApD,IAAsED,EAAtE,EAEAL,EAAK1E,WAAa,GAElB1K,WAAW,UAAA,CAAA,OAAMb,EAAEiQ,EAAK1K,QAAN,EAAgB5C,QAAQ6N,EAAzB,CAAN,EAA2C,CAA5C,CACX,CAXH,EAYGvP,qBAAqBiB,EAZxB,CAaD,MACClC,EAAEmI,CAAD,EAAgB/B,YAAYlB,EAAUiC,MAAvC,EACAnH,EAAEmQ,CAAD,EAAcH,SAAS9K,EAAUiC,MAAlC,EAEA,KAAKoE,WAAa,GAClBvL,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQ6N,EAAzB,EAGEH,IACF,KAAK1D,MAAL,EAEH,IAIMlG,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EACPmH,EAAO4B,EAAA,CAAA,EACN1E,GACA7I,EAAE,IAAD,EAAO4G,KAAR,CAFM,EAKP,OAAO1D,GAAW,WACpByI,EAAO4B,EAAA,CAAA,EACF5B,EACAzI,CAFE,GAMT,IAAM0N,EAAS,OAAO1N,GAAW,SAAWA,EAASyI,EAAQ3C,MAO7D,GALKpC,IACHA,EAAO,IAAIsE,EAAS,KAAMS,CAAnB,EACP3L,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE,OAAO1D,GAAW,SACpB0D,EAAKoG,GAAG9J,CAAR,UACS,OAAO0N,GAAW,SAAU,CACrC,GAAI,OAAOhK,EAAKgK,CAAD,GAAa,YAC1B,MAAM,IAAIC,UAAJ,oBAAkCD,EAAlC,GAAA,EAERhK,EAAKgK,CAAD,EAAJ,CACD,MAAUjF,EAAQ7C,UAAY6C,EAAQmF,OACrClK,EAAKqC,MAAL,EACArC,EAAK+F,MAAL,EAEH,CAhCM,CAiCR,IAEMoE,qBAAP,SAA4BhR,EAAO,CACjC,IAAM4B,EAAWf,EAAKa,uBAAuB,IAA5B,EAEjB,GAAKE,EAIL,KAAM1B,EAASD,EAAE2B,CAAD,EAAW,CAAZ,EAEf,GAAI,GAAC1B,GAAU,CAACD,EAAEC,CAAD,EAASoG,SAASnB,EAAUoF,QAA7B,GAIhB,KAAMpH,EAAMqK,EAAA,CAAA,EACPvN,EAAEC,CAAD,EAAS2G,KAAV,EACA5G,EAAE,IAAD,EAAO4G,KAAR,CAFO,EAINoK,EAAa,KAAKpP,aAAa,eAAlB,EAEfoP,IACF9N,EAAO4F,SAAW,IAGpBoC,EAASzE,iBAAiBjH,KAAKQ,EAAEC,CAAD,EAAUiD,CAA1C,EAEI8N,GACFhR,EAAEC,CAAD,EAAS2G,KAAKpC,EAAf,EAAyBwI,GAAGgE,CAA5B,EAGFjR,EAAMgH,eAAN,GACD,yCAjcoB,CACnB,OAAOxC,EACR,gCAEoB,CACnB,OAAOsE,EACR,WAocH7I,EAAEuB,QAAD,EACEyF,GAAGlC,EAAMG,eAAgBL,EAASiG,WAAYK,EAAS6F,oBAD1D,EAGA/Q,EAAEkM,MAAD,EAASlF,GAAGlC,EAAMuF,cAAe,UAAM,CAEtC,QADM4G,EAAY,CAAA,EAAGrC,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,EAASkG,SAAnC,CAAd,EACToG,EAAI,EAAGC,EAAMF,EAAU7D,OAAQ8D,EAAIC,EAAKD,IAAK,CACpD,IAAME,EAAYpR,EAAEiR,EAAUC,CAAD,CAAV,EACnBhG,EAASzE,iBAAiBjH,KAAK4R,EAAWA,EAAUxK,KAAV,CAA1C,CACD,CACF,CAND,EAcA5G,EAAEgB,GAAGsD,EAAL,EAAa4G,EAASzE,iBACtBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAciE,EACzBlL,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACNuG,EAASzE,gBACjB,EC3kBD,IAAMnC,EAAsB,WACtBC,GAAsB,QACtBC,GAAsB,cACtBC,GAAS,IAAiBD,GAC1BE,GAAsB,YACtBC,GAAsB3E,EAAEgB,GAAGsD,CAAL,EAEtBuE,GAAU,CACdlB,OAAS,GACT1B,OAAS,EAFK,EAKVmD,GAAc,CAClBzB,OAAS,UACT1B,OAAS,kBAFS,EAKdnB,GAAQ,CACZO,KAAI,OAAoBZ,GACxB4M,MAAK,QAAoB5M,GACzB6M,KAAI,OAAoB7M,GACxB8M,OAAM,SAAoB9M,GAC1BQ,eAAc,QAAWR,GAAYC,EALzB,EAQRQ,GAAY,CAChBG,KAAa,OACbmM,SAAa,WACbC,WAAa,aACbC,UAAa,WAJG,EAOZC,GAAY,CAChBC,MAAS,QACTC,OAAS,QAFO,EAKZjN,GAAW,CACfkN,QAAc,qBACdvK,YAAc,0BAFC,EAWXwK,eACJ,SAAAA,EAAYrQ,EAASwB,EAAQ,CAC3B,KAAK8O,iBAAmB,GACxB,KAAKzM,SAAmB7D,EACxB,KAAKiK,QAAmB,KAAKC,WAAW1I,CAAhB,EACxB,KAAK+O,cAAmB,CAAA,EAAGrD,MAAMpP,KAAK+B,SAASgN,iBAC7C,mCAAmC7M,EAAQwQ,GAA3C,OAAA,0CAC0CxQ,EAAQwQ,GADlD,KADoC,CAAd,EAMxB,QADMC,EAAa,CAAA,EAAGvD,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,GAAS2C,WAAnC,CAAd,EACV2J,EAAI,EAAGC,EAAMgB,EAAW/E,OAAQ8D,EAAIC,EAAKD,IAAK,CACrD,IAAMkB,EAAOD,EAAWjB,CAAD,EACjBvP,EAAWf,EAAKa,uBAAuB2Q,CAA5B,EACXC,GAAgB,CAAA,EAAGzD,MAAMpP,KAAK+B,SAASgN,iBAAiB5M,CAA1B,CAAd,EACnB2Q,OAAO,SAACC,GAAD,CAAA,OAAeA,KAAc7Q,CAA7B,CADY,EAGlBC,IAAa,MAAQ0Q,GAAcjF,OAAS,IAC9C,KAAKoF,UAAY7Q,EACjB,KAAKsQ,cAAcQ,KAAKL,CAAxB,EAEH,CAED,KAAKM,QAAU,KAAK/G,QAAQ1F,OAAS,KAAK0M,WAAL,EAAoB,KAEpD,KAAKhH,QAAQ1F,QAChB,KAAK2M,0BAA0B,KAAKrN,SAAU,KAAK0M,aAAnD,EAGE,KAAKtG,QAAQhE,QACf,KAAKA,OAAL,CAEH,4BAcDA,OAAA,UAAS,CACH3H,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUG,IAApC,EACF,KAAKwN,KAAL,EAEA,KAAKC,KAAL,CAEH,IAEDA,KAAA,UAAO,CAAA,IAAArS,EAAA,KACL,GAAI,OAAKuR,kBACPhS,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUG,IAApC,GAIF,KAAI0N,EACAC,EAiBJ,GAfI,KAAKN,UACPK,EAAU,CAAA,EAAGnE,MAAMpP,KAAK,KAAKkT,QAAQnE,iBAAiB3J,GAASkN,OAAvC,CAAd,EACPQ,OAAO,SAACF,GAAS,CAChB,OAAI,OAAO3R,EAAKkL,QAAQ1F,QAAW,SAC1BmM,GAAKxQ,aAAa,aAAlB,IAAqCnB,EAAKkL,QAAQ1F,OAGpDmM,GAAKnK,UAAUC,SAAShD,GAAUsM,QAAlC,CACR,CAPO,EASNuB,EAAQ3F,SAAW,IACrB2F,EAAU,OAIVA,EAAAA,IACFC,EAAchT,EAAE+S,CAAD,EAAUE,IAAI,KAAKT,SAApB,EAA+B5L,KAAKpC,EAApC,EACVwO,GAAeA,EAAYhB,mBAKjC,KAAMkB,EAAalT,EAAE8E,MAAMA,GAAMO,IAAd,EAEnB,GADArF,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQuQ,CAAzB,EACIA,CAAAA,EAAWrN,mBAAX,EAIJ,CAAIkN,IACFhB,EAAStL,iBAAiBjH,KAAKQ,EAAE+S,CAAD,EAAUE,IAAI,KAAKT,SAApB,EAAgC,MAA/D,EACKQ,GACHhT,EAAE+S,CAAD,EAAUnM,KAAKpC,GAAU,IAA1B,GAIJ,IAAM2O,EAAY,KAAKC,cAAL,EAElBpT,EAAE,KAAKuF,QAAN,EACEa,YAAYlB,GAAUsM,QADzB,EAEGxB,SAAS9K,GAAUuM,UAFtB,EAIA,KAAKlM,SAAS8N,MAAMF,CAApB,EAAiC,EAE7B,KAAKlB,cAAc7E,QACrBpN,EAAE,KAAKiS,aAAN,EACE7L,YAAYlB,GAAUwM,SADzB,EAEG4B,KAAK,gBAAiB,EAFzB,EAKF,KAAKC,iBAAiB,EAAtB,EAEA,IAAMC,EAAW,UAAM,CACrBxT,EAAES,EAAK8E,QAAN,EACEa,YAAYlB,GAAUuM,UADzB,EAEGzB,SAAS9K,GAAUsM,QAFtB,EAGGxB,SAAS9K,GAAUG,IAHtB,EAKA5E,EAAK8E,SAAS8N,MAAMF,CAApB,EAAiC,GAEjC1S,EAAK8S,iBAAiB,EAAtB,EAEAvT,EAAES,EAAK8E,QAAN,EAAgB5C,QAAQmC,GAAMuM,KAA/B,CACD,EAEKoC,GAAuBN,EAAU,CAAD,EAAIrP,YAAb,EAA6BqP,EAAUvE,MAAM,CAAhB,EACpD8E,GAAU,SAAYD,GACtBvR,GAAqBtB,EAAKqB,iCAAiC,KAAKsD,QAA3C,EAE3BvF,EAAE,KAAKuF,QAAN,EACE5E,IAAIC,EAAK1B,eAAgBsU,CAD5B,EAEGvS,qBAAqBiB,EAFxB,EAIA,KAAKqD,SAAS8N,MAAMF,CAApB,EAAoC,KAAK5N,SAASmO,EAAd,EAApC,OACD,IAEDb,KAAA,UAAO,CAAA,IAAAlF,EAAA,KACL,GAAI,OAAKqE,kBACP,CAAChS,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUG,IAApC,GAIH,KAAM6N,EAAalT,EAAE8E,MAAMA,GAAMwM,IAAd,EAEnB,GADAtR,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQuQ,CAAzB,EACIA,CAAAA,EAAWrN,mBAAX,EAIJ,KAAMsN,EAAY,KAAKC,cAAL,EAElB,KAAK7N,SAAS8N,MAAMF,CAApB,EAAoC,KAAK5N,SAASoO,sBAAd,EAAsCR,CAAtC,EAApC,KAEAvS,EAAK6B,OAAO,KAAK8C,QAAjB,EAEAvF,EAAE,KAAKuF,QAAN,EACEyK,SAAS9K,GAAUuM,UADtB,EAEGrL,YAAYlB,GAAUsM,QAFzB,EAGGpL,YAAYlB,GAAUG,IAHzB,EAKA,IAAMuO,EAAqB,KAAK3B,cAAc7E,OAC9C,GAAIwG,EAAqB,EACvB,QAAS1C,EAAI,EAAGA,EAAI0C,EAAoB1C,IAAK,CAC3C,IAAMvO,EAAU,KAAKsP,cAAcf,CAAnB,EACVvP,GAAWf,EAAKa,uBAAuBkB,CAA5B,EAEjB,GAAIhB,KAAa,KAAM,CACrB,IAAMkS,GAAQ7T,EAAE,CAAA,EAAG4O,MAAMpP,KAAK+B,SAASgN,iBAAiB5M,EAA1B,CAAd,CAAD,EACVkS,GAAMxN,SAASnB,GAAUG,IAAzB,GACHrF,EAAE2C,CAAD,EAAUqN,SAAS9K,GAAUwM,SAA9B,EACG4B,KAAK,gBAAiB,EADzB,CAGH,CACF,CAGH,KAAKC,iBAAiB,EAAtB,EAEA,IAAMC,GAAW,UAAM,CACrB7F,EAAK4F,iBAAiB,EAAtB,EACAvT,EAAE2N,EAAKpI,QAAN,EACEa,YAAYlB,GAAUuM,UADzB,EAEGzB,SAAS9K,GAAUsM,QAFtB,EAGG7O,QAAQmC,GAAMyM,MAHjB,CAID,EAED,KAAKhM,SAAS8N,MAAMF,CAApB,EAAiC,GACjC,IAAMjR,GAAqBtB,EAAKqB,iCAAiC,KAAKsD,QAA3C,EAE3BvF,EAAE,KAAKuF,QAAN,EACE5E,IAAIC,EAAK1B,eAAgBsU,EAD5B,EAEGvS,qBAAqBiB,EAFxB,GAGD,IAEDqR,iBAAA,SAAiBO,EAAiB,CAChC,KAAK9B,iBAAmB8B,CACzB,IAED/N,QAAA,UAAU,CACR/F,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EAEA,KAAKmH,QAAmB,KACxB,KAAK+G,QAAmB,KACxB,KAAKnN,SAAmB,KACxB,KAAK0M,cAAmB,KACxB,KAAKD,iBAAmB,IACzB,IAIDpG,WAAA,SAAW1I,EAAQ,CACjBA,OAAAA,EAAMqK,EAAA,CAAA,EACD1E,GACA3F,CAFC,EAINA,EAAOyE,OAAS9E,EAAQK,EAAOyE,OAC/B/G,EAAKoC,gBAAgBsB,EAAMpB,EAAQkG,EAAnC,EACOlG,CACR,IAEDkQ,cAAA,UAAgB,CACd,IAAMW,EAAW/T,EAAE,KAAKuF,QAAN,EAAgBc,SAASsL,GAAUC,KAApC,EACjB,OAAOmC,EAAWpC,GAAUC,MAAQD,GAAUE,MAC/C,IAEDc,WAAA,UAAa,CAAA,IAAA7E,EAAA,KACP7H,EAEArF,EAAKkC,UAAU,KAAK6I,QAAQ1F,MAA5B,GACFA,EAAS,KAAK0F,QAAQ1F,OAGlB,OAAO,KAAK0F,QAAQ1F,OAAO+N,QAAW,cACxC/N,EAAS,KAAK0F,QAAQ1F,OAAO,CAApB,IAGXA,EAAS1E,SAASQ,cAAc,KAAK4J,QAAQ1F,MAApC,EAGX,IAAMtE,EAAQ,yCAC6B,KAAKgK,QAAQ1F,OAD1C,KAGR8J,EAAW,CAAA,EAAGnB,MAAMpP,KAAKyG,EAAOsI,iBAAiB5M,CAAxB,CAAd,EACjB3B,OAAAA,EAAE+P,CAAD,EAAWrJ,KAAK,SAACwK,EAAGxP,EAAY,CAC/BoM,EAAK8E,0BACHb,EAASkC,sBAAsBvS,CAA/B,EACA,CAACA,CAAD,CAFF,CAID,CALD,EAOOuE,CACR,IAED2M,0BAAA,SAA0BlR,EAASwS,EAAc,CAC/C,IAAMC,EAASnU,EAAE0B,CAAD,EAAU2E,SAASnB,GAAUG,IAA9B,EAEX6O,EAAa9G,QACfpN,EAAEkU,CAAD,EACE3L,YAAYrD,GAAUwM,UAAW,CAACyC,CADrC,EAEGb,KAAK,gBAAiBa,CAFzB,CAIH,IAIMF,sBAAP,SAA6BvS,EAAS,CACpC,IAAMC,EAAWf,EAAKa,uBAAuBC,CAA5B,EACjB,OAAOC,EAAWJ,SAASQ,cAAcJ,CAAvB,EAAmC,IACtD,IAEM8E,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAM0N,EAAUpU,EAAE,IAAD,EACb4G,EAAYwN,EAAMxN,KAAKpC,EAAX,EACVmH,EAAO4B,EAAA,CAAA,EACR1E,GACAuL,EAAMxN,KAAN,EACA,OAAO1D,GAAW,UAAYA,EAASA,EAAS,CAAA,CAHxC,EAeb,GATI,CAAC0D,GAAQ+E,EAAQhE,QAAU,YAAY/D,KAAKV,CAAjB,IAC7ByI,EAAQhE,OAAS,IAGdf,IACHA,EAAO,IAAImL,EAAS,KAAMpG,CAAnB,EACPyI,EAAMxN,KAAKpC,GAAUoC,CAArB,GAGE,OAAO1D,GAAW,SAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAAJ,CACD,CACF,CAxBM,CAyBR,yCArQoB,CACnB,OAAOqB,EACR,gCAEoB,CACnB,OAAOsE,EACR,WAwQH7I,EAAEuB,QAAD,EAAWyF,GAAGlC,GAAMG,eAAgBL,GAAS2C,YAAa,SAAUxH,EAAO,CAEtEA,EAAMsU,cAAc3F,UAAY,KAClC3O,EAAMgH,eAAN,EAGF,IAAMuN,EAAWtU,EAAE,IAAD,EACZ2B,EAAWf,EAAKa,uBAAuB,IAA5B,EACX8S,EAAY,CAAA,EAAG3F,MAAMpP,KAAK+B,SAASgN,iBAAiB5M,CAA1B,CAAd,EAElB3B,EAAEuU,CAAD,EAAY7N,KAAK,UAAY,CAC5B,IAAM8N,EAAUxU,EAAE,IAAD,EACX4G,EAAU4N,EAAQ5N,KAAKpC,EAAb,EACVtB,EAAU0D,EAAO,SAAW0N,EAAS1N,KAAT,EAClCmL,GAAStL,iBAAiBjH,KAAKgV,EAAStR,CAAxC,CACD,CALD,CAMD,CAhBD,EAwBAlD,EAAEgB,GAAGsD,CAAL,EAAayN,GAAStL,iBACtBzG,EAAEgB,GAAGsD,CAAL,EAAW2C,YAAc8K,GACzB/R,EAAEgB,GAAGsD,CAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,CAAL,EAAaK,GACNoN,GAAStL,gBACjB,EC9XD,IAAMnC,GAA2B,WAC3BC,GAA2B,QAC3BC,GAA2B,cAC3BC,GAAS,IAAsBD,GAC/BE,GAA2B,YAC3BC,GAA2B3E,EAAEgB,GAAGsD,EAAL,EAC3BmQ,GAA2B,GAC3BC,GAA2B,GAC3BC,GAA2B,EAC3BC,GAA2B,GAC3BC,GAA2B,GAC3BC,GAA2B,EAC3BC,GAA2B,IAAIpR,OAAUiR,GAAd,IAAkCC,GAAlC,IAAwDJ,EAAxD,EAE3B3P,EAAQ,CACZwM,KAAI,OAAsB7M,GAC1B8M,OAAM,SAAsB9M,GAC5BY,KAAI,OAAsBZ,GAC1B4M,MAAK,QAAsB5M,GAC3BuQ,MAAK,QAAsBvQ,GAC3BQ,eAAc,QAAaR,GAAYC,GACvCuQ,iBAAgB,UAAaxQ,GAAYC,GACzCwQ,eAAc,QAAazQ,GAAYC,EAR3B,EAWRQ,EAAY,CAChBiQ,SAAkB,WAClB9P,KAAkB,OAClB+P,OAAkB,SAClBC,UAAkB,YAClBC,SAAkB,WAClBC,UAAkB,sBAClBC,SAAkB,qBAClBC,gBAAkB,iBARF,EAWZ7Q,EAAW,CACf2C,YAAgB,2BAChBmO,WAAgB,iBAChBC,KAAgB,iBAChBC,WAAgB,cAChBC,cAAgB,6DALD,EAQXC,EAAgB,CACpBC,IAAY,YACZC,OAAY,UACZC,OAAY,eACZC,UAAY,aACZzM,MAAY,cACZ0M,SAAY,YACZ3M,KAAY,aACZ4M,QAAY,UARQ,EAWhBvN,GAAU,CACdwN,OAAY,EACZC,KAAY,GACZC,SAAY,eACZC,UAAY,SACZC,QAAY,SALE,EAQVrN,GAAc,CAClBiN,OAAY,2BACZC,KAAY,UACZC,SAAY,mBACZC,UAAY,mBACZC,QAAY,QALM,EAcdC,eACJ,SAAAA,EAAYhV,EAASwB,EAAQ,CAC3B,KAAKqC,SAAY7D,EACjB,KAAKiV,QAAY,KACjB,KAAKhL,QAAY,KAAKC,WAAW1I,CAAhB,EACjB,KAAK0T,MAAY,KAAKC,gBAAL,EACjB,KAAKC,UAAY,KAAKC,cAAL,EAEjB,KAAK1K,mBAAL,CACD,4BAkBD1E,OAAA,UAAS,CACP,GAAI,OAAKpC,SAASyR,UAAYhX,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,EAAUiQ,QAApC,GAI9B,KAAMlP,EAAWyQ,EAASO,sBAAsB,KAAK1R,QAApC,EACX2R,EAAWlX,EAAE,KAAK4W,KAAN,EAAavQ,SAASnB,EAAUG,IAAjC,EAIjB,GAFAqR,EAASS,YAAT,EAEID,CAAAA,EAIJ,KAAM5H,EAAgB,CACpBA,cAAe,KAAK/J,QADA,EAGhB6R,EAAYpX,EAAE8E,MAAMA,EAAMO,KAAMiK,CAApB,EAIlB,GAFAtP,EAAEiG,CAAD,EAAStD,QAAQyU,CAAlB,EAEIA,CAAAA,EAAUvR,mBAAV,EAKJ,IAAI,CAAC,KAAKiR,UAAW,CAKnB,GAAI,OAAOO,GAAW,YACpB,MAAM,IAAIxG,UAAU,kEAAd,EAGR,IAAIyG,EAAmB,KAAK/R,SAExB,KAAKoG,QAAQ6K,YAAc,SAC7Bc,EAAmBrR,EACVrF,EAAKkC,UAAU,KAAK6I,QAAQ6K,SAA5B,IACTc,EAAmB,KAAK3L,QAAQ6K,UAG5B,OAAO,KAAK7K,QAAQ6K,UAAUxC,QAAW,cAC3CsD,EAAmB,KAAK3L,QAAQ6K,UAAU,CAAvB,IAOnB,KAAK7K,QAAQ4K,WAAa,gBAC5BvW,EAAEiG,CAAD,EAAS+J,SAAS9K,EAAUuQ,eAA7B,EAEF,KAAKkB,QAAU,IAAIU,EAAOC,EAAkB,KAAKV,MAAO,KAAKW,iBAAL,CAAzC,CAChB,CAMG,iBAAkBhW,SAASyC,iBAC3BhE,EAAEiG,CAAD,EAASC,QAAQtB,EAASgR,UAA3B,EAAuCxI,SAAW,GACpDpN,EAAEuB,SAASiW,IAAV,EAAgBzH,SAAjB,EAA4B/I,GAAG,YAAa,KAAMhH,EAAEyX,IAApD,EAGF,KAAKlS,SAAS8C,MAAd,EACA,KAAK9C,SAAS+C,aAAa,gBAAiB,EAA5C,EAEAtI,EAAE,KAAK4W,KAAN,EAAarO,YAAYrD,EAAUG,IAApC,EACArF,EAAEiG,CAAD,EACEsC,YAAYrD,EAAUG,IADzB,EAEG1C,QAAQ3C,EAAE8E,MAAMA,EAAMuM,MAAO/B,CAArB,CAFX,IAGD,IAEDwD,KAAA,UAAO,CACL,GAAI,OAAKvN,SAASyR,UAAYhX,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,EAAUiQ,QAApC,GAAiDnV,EAAE,KAAK4W,KAAN,EAAavQ,SAASnB,EAAUG,IAAjC,GAI/E,KAAMiK,EAAgB,CACpBA,cAAe,KAAK/J,QADA,EAGhB6R,EAAYpX,EAAE8E,MAAMA,EAAMO,KAAMiK,CAApB,EACZrJ,EAASyQ,EAASO,sBAAsB,KAAK1R,QAApC,EAEfvF,EAAEiG,CAAD,EAAStD,QAAQyU,CAAlB,EAEIA,CAAAA,EAAUvR,mBAAV,IAIJ7F,EAAE,KAAK4W,KAAN,EAAarO,YAAYrD,EAAUG,IAApC,EACArF,EAAEiG,CAAD,EACEsC,YAAYrD,EAAUG,IADzB,EAEG1C,QAAQ3C,EAAE8E,MAAMA,EAAMuM,MAAO/B,CAArB,CAFX,GAGD,IAEDuD,KAAA,UAAO,CACL,GAAI,OAAKtN,SAASyR,UAAYhX,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,EAAUiQ,QAApC,GAAiD,CAACnV,EAAE,KAAK4W,KAAN,EAAavQ,SAASnB,EAAUG,IAAjC,GAIhF,KAAMiK,EAAgB,CACpBA,cAAe,KAAK/J,QADA,EAGhBmS,EAAY1X,EAAE8E,MAAMA,EAAMwM,KAAMhC,CAApB,EACZrJ,EAASyQ,EAASO,sBAAsB,KAAK1R,QAApC,EAEfvF,EAAEiG,CAAD,EAAStD,QAAQ+U,CAAlB,EAEIA,CAAAA,EAAU7R,mBAAV,IAIJ7F,EAAE,KAAK4W,KAAN,EAAarO,YAAYrD,EAAUG,IAApC,EACArF,EAAEiG,CAAD,EACEsC,YAAYrD,EAAUG,IADzB,EAEG1C,QAAQ3C,EAAE8E,MAAMA,EAAMyM,OAAQjC,CAAtB,CAFX,GAGD,IAEDvJ,QAAA,UAAU,CACR/F,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EACAxE,EAAE,KAAKuF,QAAN,EAAgB+H,IAAI7I,EAArB,EACA,KAAKc,SAAW,KAChB,KAAKqR,MAAQ,KACT,KAAKD,UAAY,OACnB,KAAKA,QAAQgB,QAAb,EACA,KAAKhB,QAAU,KAElB,IAEDiB,OAAA,UAAS,CACP,KAAKd,UAAY,KAAKC,cAAL,EACb,KAAKJ,UAAY,MACnB,KAAKA,QAAQkB,eAAb,CAEH,IAIDxL,mBAAA,UAAqB,CAAA,IAAA5L,EAAA,KACnBT,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,EAAMkQ,MAAO,SAACjV,EAAU,CAC1CA,EAAMgH,eAAN,EACAhH,EAAM+X,gBAAN,EACArX,EAAKkH,OAAL,CACD,CAJD,CAKD,IAEDiE,WAAA,SAAW1I,EAAQ,CACjBA,OAAAA,EAAMqK,EAAA,CAAA,EACD,KAAKwK,YAAYlP,QACjB7I,EAAE,KAAKuF,QAAN,EAAgBqB,KAAjB,EACA1D,CAHC,EAMNtC,EAAKoC,gBACHsB,GACApB,EACA,KAAK6U,YAAY3O,WAHnB,EAMOlG,CACR,IAED2T,gBAAA,UAAkB,CAChB,GAAI,CAAC,KAAKD,MAAO,CACf,IAAM3Q,EAASyQ,EAASO,sBAAsB,KAAK1R,QAApC,EAEXU,IACF,KAAK2Q,MAAQ3Q,EAAOlE,cAAc6C,EAAS+Q,IAA9B,EAEhB,CACD,OAAO,KAAKiB,KACb,IAEDoB,cAAA,UAAgB,CACd,IAAMC,EAAkBjY,EAAE,KAAKuF,SAASlB,UAAf,EACrB6T,EAAYpC,EAAcG,OAG9B,OAAIgC,EAAgB5R,SAASnB,EAAUkQ,MAAnC,GACF8C,EAAYpC,EAAcC,IACtB/V,EAAE,KAAK4W,KAAN,EAAavQ,SAASnB,EAAUqQ,SAAjC,IACF2C,EAAYpC,EAAcE,SAEnBiC,EAAgB5R,SAASnB,EAAUmQ,SAAnC,EACT6C,EAAYpC,EAAcrM,MACjBwO,EAAgB5R,SAASnB,EAAUoQ,QAAnC,EACT4C,EAAYpC,EAActM,KACjBxJ,EAAE,KAAK4W,KAAN,EAAavQ,SAASnB,EAAUqQ,SAAjC,IACT2C,EAAYpC,EAAcI,WAErBgC,CACR,IAEDnB,cAAA,UAAgB,CACd,OAAO/W,EAAE,KAAKuF,QAAN,EAAgBW,QAAQ,SAAzB,EAAoCkH,OAAS,CACrD,IAED+K,WAAA,UAAa,CAAA,IAAAxK,EAAA,KACL0I,EAAS,CAAA,EAEf,OAAI,OAAO,KAAK1K,QAAQ0K,QAAW,WACjCA,EAAOrV,GAAK,SAAC4F,EAAS,CACpBA,OAAAA,EAAKwR,QAAL7K,EAAA,CAAA,EACK3G,EAAKwR,QACLzK,EAAKhC,QAAQ0K,OAAOzP,EAAKwR,QAASzK,EAAKpI,QAAvC,GAAoD,CAAA,CAFzD,EAKOqB,CACR,EAEDyP,EAAOA,OAAS,KAAK1K,QAAQ0K,OAGxBA,CACR,IAEDkB,iBAAA,UAAmB,CACjB,IAAMc,EAAe,CACnBH,UAAW,KAAKF,cAAL,EACXM,UAAW,CACTjC,OAAQ,KAAK8B,WAAL,EACR7B,KAAM,CACJiC,QAAS,KAAK5M,QAAQ2K,IADlB,EAGNkC,gBAAiB,CACfC,kBAAmB,KAAK9M,QAAQ4K,QADjB,CALR,CAFQ,EAcrB,OAAI,KAAK5K,QAAQ8K,UAAY,WAC3B4B,EAAaC,UAAUI,WAAa,CAClCH,QAAS,EADyB,GAK/BF,CACR,IAIM5R,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EACLmH,EAAU,OAAOzI,GAAW,SAAWA,EAAS,KAOtD,GALK0D,IACHA,EAAO,IAAI8P,EAAS,KAAM/K,CAAnB,EACP3L,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE,OAAO1D,GAAW,SAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAAJ,CACD,CACF,CAfM,CAgBR,IAEMiU,YAAP,SAAmBpX,EAAO,CACxB,GAAIA,EAAAA,IAAUA,EAAM4O,QAAUmG,IAC5B/U,EAAMgI,OAAS,SAAWhI,EAAM4O,QAAUgG,KAM5C,QAFMgE,EAAU,CAAA,EAAG/J,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,EAAS2C,WAAnC,CAAd,EAEP2J,EAAI,EAAGC,EAAMwH,EAAQvL,OAAQ8D,EAAIC,EAAKD,IAAK,CAClD,IAAMjL,EAASyQ,EAASO,sBAAsB0B,EAAQzH,CAAD,CAAtC,EACT0H,EAAU5Y,EAAE2Y,EAAQzH,CAAD,CAAR,EAAatK,KAAKpC,EAAnB,EACV8K,GAAgB,CACpBA,cAAeqJ,EAAQzH,CAAD,CADF,EAQtB,GAJInR,GAASA,EAAMgI,OAAS,UAC1BuH,GAAcuJ,WAAa9Y,GAGzB,EAAC6Y,EAIL,KAAME,GAAeF,EAAQhC,MAC7B,GAAK5W,EAAEiG,CAAD,EAASI,SAASnB,EAAUG,IAA7B,GAIDtF,EAAAA,IAAUA,EAAMgI,OAAS,SACzB,kBAAkBnE,KAAK7D,EAAME,OAAOyO,OAApC,GAAgD3O,EAAMgI,OAAS,SAAWhI,EAAM4O,QAAUgG,KAC1F3U,EAAEkI,SAASjC,EAAQlG,EAAME,MAAzB,GAIJ,KAAMyX,GAAY1X,EAAE8E,MAAMA,EAAMwM,KAAMhC,EAApB,EAClBtP,EAAEiG,CAAD,EAAStD,QAAQ+U,EAAlB,EACIA,CAAAA,GAAU7R,mBAAV,IAMA,iBAAkBtE,SAASyC,iBAC7BhE,EAAEuB,SAASiW,IAAV,EAAgBzH,SAAjB,EAA4BzC,IAAI,YAAa,KAAMtN,EAAEyX,IAArD,EAGFkB,EAAQzH,CAAD,EAAI5I,aAAa,gBAAiB,OAAzC,EAEAtI,EAAE8Y,EAAD,EAAe1S,YAAYlB,EAAUG,IAAtC,EACArF,EAAEiG,CAAD,EACEG,YAAYlB,EAAUG,IADzB,EAEG1C,QAAQ3C,EAAE8E,MAAMA,EAAMyM,OAAQjC,EAAtB,CAFX,IAGD,CACF,IAEM2H,sBAAP,SAA6BvV,EAAS,CACpC,IAAIuE,EACEtE,EAAWf,EAAKa,uBAAuBC,CAA5B,EAEjB,OAAIC,IACFsE,EAAS1E,SAASQ,cAAcJ,CAAvB,GAGJsE,GAAUvE,EAAQ2C,UAC1B,IAGM0U,uBAAP,SAA8BhZ,EAAO,CAQnC,GAAI,oBAAkB6D,KAAK7D,EAAME,OAAOyO,OAApC,EACA3O,EAAM4O,QAAU+F,IAAiB3U,EAAM4O,QAAU8F,KAClD1U,EAAM4O,QAAUkG,IAAsB9U,EAAM4O,QAAUiG,IACrD5U,EAAED,EAAME,MAAP,EAAeiG,QAAQtB,EAAS+Q,IAAjC,EAAuCvI,QAAU,CAAC2H,GAAenR,KAAK7D,EAAM4O,KAA1B,KAItD5O,EAAMgH,eAAN,EACAhH,EAAM+X,gBAAN,EAEI,OAAKd,UAAYhX,EAAE,IAAD,EAAOqG,SAASnB,EAAUiQ,QAA3B,IAIrB,KAAMlP,EAAWyQ,EAASO,sBAAsB,IAA/B,EACXC,EAAWlX,EAAEiG,CAAD,EAASI,SAASnB,EAAUG,IAA7B,EAEjB,GAAI,CAAC6R,GAAYA,IAAanX,EAAM4O,QAAU8F,IAAkB1U,EAAM4O,QAAU+F,IAAgB,CAC9F,GAAI3U,EAAM4O,QAAU8F,GAAgB,CAClC,IAAM9M,EAAS1B,EAAOlE,cAAc6C,EAAS2C,WAA9B,EACfvH,EAAE2H,CAAD,EAAShF,QAAQ,OAAlB,CACD,CAED3C,EAAE,IAAD,EAAO2C,QAAQ,OAAhB,EACA,MACD,CAED,IAAMqW,EAAQ,CAAA,EAAGpK,MAAMpP,KAAKyG,EAAOsI,iBAAiB3J,EAASiR,aAAjC,CAAd,EAEd,GAAImD,EAAM5L,SAAW,EAIrB,KAAIH,EAAQ+L,EAAMnK,QAAQ9O,EAAME,MAApB,EAERF,EAAM4O,QAAUiG,IAAoB3H,EAAQ,GAC9CA,IAGElN,EAAM4O,QAAUkG,IAAsB5H,EAAQ+L,EAAM5L,OAAS,GAC/DH,IAGEA,EAAQ,IACVA,EAAQ,GAGV+L,EAAM/L,CAAD,EAAQ5E,MAAb,GACD,yCAjZoB,CACnB,OAAO9D,EACR,gCAEoB,CACnB,OAAOsE,EACR,oCAEwB,CACvB,OAAOO,EACR,WAgZHpJ,EAAEuB,QAAD,EACEyF,GAAGlC,EAAMmQ,iBAAkBrQ,EAAS2C,YAAamP,GAASqC,sBAD7D,EAEG/R,GAAGlC,EAAMmQ,iBAAkBrQ,EAAS+Q,KAAMe,GAASqC,sBAFtD,EAGG/R,GAAMlC,EAAMG,eAHf,IAGiCH,EAAMoQ,eAAkBwB,GAASS,WAHlE,EAIGnQ,GAAGlC,EAAMG,eAAgBL,EAAS2C,YAAa,SAAUxH,EAAO,CAC/DA,EAAMgH,eAAN,EACAhH,EAAM+X,gBAAN,EACApB,GAASjQ,iBAAiBjH,KAAKQ,EAAE,IAAD,EAAQ,QAAxC,CACD,CARH,EASGgH,GAAGlC,EAAMG,eAAgBL,EAAS8Q,WAAY,SAAClH,EAAM,CACpDA,EAAEsJ,gBAAF,CACD,CAXH,EAmBA9X,EAAEgB,GAAGsD,EAAL,EAAaoS,GAASjQ,iBACtBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAcyP,GACzB1W,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACN+R,GAASjQ,gBACjB,EC7gBD,IAAMnC,GAAqB,QACrBC,GAAqB,QACrBC,GAAqB,WACrBC,GAAS,IAAgBD,GACzBE,GAAqB,YACrBC,GAAqB3E,EAAEgB,GAAGsD,EAAL,EACrBmQ,GAAqB,GAErB5L,GAAU,CACdoQ,SAAW,GACXlQ,SAAW,GACXV,MAAW,GACXyK,KAAW,EAJG,EAOV1J,GAAc,CAClB6P,SAAW,mBACXlQ,SAAW,UACXV,MAAW,UACXyK,KAAW,SAJO,EAOdhO,GAAQ,CACZwM,KAAI,OAAuB7M,GAC3B8M,OAAM,SAAuB9M,GAC7BY,KAAI,OAAuBZ,GAC3B4M,MAAK,QAAuB5M,GAC5ByU,QAAO,UAAuBzU,GAC9B0U,OAAM,SAAuB1U,GAC7B2U,cAAa,gBAAuB3U,GACpC4U,gBAAe,kBAAuB5U,GACtC6U,gBAAe,kBAAuB7U,GACtC8U,kBAAiB,oBAAuB9U,GACxCQ,eAAc,QAAcR,GAAYC,EAX5B,EAcRQ,GAAY,CAChBsU,WAAqB,0BACrBC,mBAAqB,0BACrBC,SAAqB,iBACrBC,KAAqB,aACrBvU,KAAqB,OACrBC,KAAqB,MANL,EASZT,GAAW,CACfgV,OAAiB,gBACjBC,WAAiB,cACjBtS,YAAiB,wBACjBuS,aAAiB,yBACjBC,cAAiB,oDACjBC,eAAiB,aANF,EAeXC,eACJ,SAAAA,EAAYvY,EAASwB,EAAQ,CAC3B,KAAKyI,QAAuB,KAAKC,WAAW1I,CAAhB,EAC5B,KAAKqC,SAAuB7D,EAC5B,KAAKwY,QAAuBxY,EAAQK,cAAc6C,GAASgV,MAA/B,EAC5B,KAAKO,UAAuB,KAC5B,KAAKC,SAAuB,GAC5B,KAAKC,mBAAuB,GAC5B,KAAKC,qBAAuB,GAC5B,KAAKtI,iBAAuB,GAC5B,KAAKuI,gBAAuB,CAC7B,4BAcD5S,OAAA,SAAO2H,EAAe,CACpB,OAAO,KAAK8K,SAAW,KAAKvH,KAAL,EAAc,KAAKC,KAAKxD,CAAV,CACtC,IAEDwD,KAAA,SAAKxD,EAAe,CAAA,IAAA7O,EAAA,KAClB,GAAI,OAAK2Z,UAAY,KAAKpI,kBAI1B,CAAIhS,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUE,IAApC,IACF,KAAK4M,iBAAmB,IAG1B,IAAMoF,EAAYpX,EAAE8E,MAAMA,GAAMO,KAAM,CACpCiK,cAAAA,CADoC,CAApB,EAIlBtP,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQyU,CAAzB,EAEI,OAAKgD,UAAYhD,EAAUvR,mBAAV,KAIrB,KAAKuU,SAAW,GAEhB,KAAKI,gBAAL,EACA,KAAKC,cAAL,EAEA,KAAKC,cAAL,EAEA,KAAKC,gBAAL,EACA,KAAKC,gBAAL,EAEA5a,EAAE,KAAKuF,QAAN,EAAgByB,GACflC,GAAMsU,cACNxU,GAASkV,aACT,SAAC/Z,EAAD,CAAA,OAAWU,EAAKoS,KAAK9S,CAAV,CAAX,CAHF,EAMAC,EAAE,KAAKka,OAAN,EAAelT,GAAGlC,GAAMyU,kBAAmB,UAAM,CAChDvZ,EAAES,EAAK8E,QAAN,EAAgB5E,IAAImE,GAAMwU,gBAAiB,SAACvZ,EAAU,CACjDC,EAAED,EAAME,MAAP,EAAeC,GAAGO,EAAK8E,QAAxB,IACF9E,EAAK6Z,qBAAuB,GAE/B,CAJD,CAKD,CAND,EAQA,KAAKO,cAAc,UAAA,CAAA,OAAMpa,EAAKqa,aAAaxL,CAAlB,CAAN,CAAnB,GACD,IAEDuD,KAAA,SAAK9S,EAAO,CAAA,IAAA4N,EAAA,KAKV,GAJI5N,GACFA,EAAMgH,eAAN,EAGE,GAAC,KAAKqT,UAAY,KAAKpI,kBAI3B,KAAM0F,EAAY1X,EAAE8E,MAAMA,GAAMwM,IAAd,EAIlB,GAFAtR,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQ+U,CAAzB,EAEI,GAAC,KAAK0C,UAAY1C,EAAU7R,mBAAV,GAItB,MAAKuU,SAAW,GAChB,IAAMW,EAAa/a,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUE,IAApC,EAiBnB,GAfI2V,IACF,KAAK/I,iBAAmB,IAG1B,KAAK2I,gBAAL,EACA,KAAKC,gBAAL,EAEA5a,EAAEuB,QAAD,EAAW+L,IAAIxI,GAAMoU,OAAtB,EAEAlZ,EAAE,KAAKuF,QAAN,EAAgBa,YAAYlB,GAAUG,IAAvC,EAEArF,EAAE,KAAKuF,QAAN,EAAgB+H,IAAIxI,GAAMsU,aAA3B,EACApZ,EAAE,KAAKka,OAAN,EAAe5M,IAAIxI,GAAMyU,iBAA1B,EAGIwB,EAAY,CACd,IAAM7Y,EAAsBtB,EAAKqB,iCAAiC,KAAKsD,QAA3C,EAE5BvF,EAAE,KAAKuF,QAAN,EACE5E,IAAIC,EAAK1B,eAAgB,SAACa,EAAD,CAAA,OAAW4N,EAAKqN,WAAWjb,CAAhB,CAAX,CAD5B,EAEGkB,qBAAqBiB,CAFxB,CAGD,MACC,KAAK8Y,WAAL,GAEH,IAEDjV,QAAA,UAAU,CACR,CAACmG,OAAQ,KAAK3G,SAAU,KAAK2U,OAA7B,EACGe,QAAQ,SAACC,EAAD,CAAA,OAAiBlb,EAAEkb,CAAD,EAAc5N,IAAI7I,EAAnB,CAAjB,CADX,EAQAzE,EAAEuB,QAAD,EAAW+L,IAAIxI,GAAMoU,OAAtB,EAEAlZ,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EAEA,KAAKmH,QAAuB,KAC5B,KAAKpG,SAAuB,KAC5B,KAAK2U,QAAuB,KAC5B,KAAKC,UAAuB,KAC5B,KAAKC,SAAuB,KAC5B,KAAKC,mBAAuB,KAC5B,KAAKC,qBAAuB,KAC5B,KAAKtI,iBAAuB,KAC5B,KAAKuI,gBAAuB,IAC7B,IAEDY,aAAA,UAAe,CACb,KAAKT,cAAL,CACD,IAID9O,WAAA,SAAW1I,EAAQ,CACjBA,OAAAA,EAAMqK,EAAA,CAAA,EACD1E,GACA3F,CAFC,EAINtC,EAAKoC,gBAAgBsB,GAAMpB,EAAQkG,EAAnC,EACOlG,CACR,IAED4X,aAAA,SAAaxL,EAAe,CAAA,IAAAxB,EAAA,KACpBiN,EAAa/a,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUE,IAApC,GAEf,CAAC,KAAKG,SAASlB,YACf,KAAKkB,SAASlB,WAAWtB,WAAaqY,KAAKC,eAE7C9Z,SAASiW,KAAK8D,YAAY,KAAK/V,QAA/B,EAGF,KAAKA,SAAS8N,MAAMoD,QAAU,QAC9B,KAAKlR,SAASgW,gBAAgB,aAA9B,EACA,KAAKhW,SAAS+C,aAAa,aAAc,EAAzC,EAEItI,EAAE,KAAKka,OAAN,EAAe7T,SAASnB,GAAUsU,UAAnC,EACF,KAAKU,QAAQnY,cAAc6C,GAASiV,UAApC,EAAgD2B,UAAY,EAE5D,KAAKjW,SAASiW,UAAY,EAGxBT,GACFna,EAAK6B,OAAO,KAAK8C,QAAjB,EAGFvF,EAAE,KAAKuF,QAAN,EAAgByK,SAAS9K,GAAUG,IAApC,EAEI,KAAKsG,QAAQtD,OACf,KAAKoT,cAAL,EAGF,IAAMC,EAAa1b,EAAE8E,MAAMA,GAAMuM,MAAO,CACtC/B,cAAAA,CADsC,CAArB,EAIbqM,EAAqB,UAAM,CAC3B7N,EAAKnC,QAAQtD,OACfyF,EAAKvI,SAAS8C,MAAd,EAEFyF,EAAKkE,iBAAmB,GACxBhS,EAAE8N,EAAKvI,QAAN,EAAgB5C,QAAQ+Y,CAAzB,CACD,EAED,GAAIX,EAAY,CACd,IAAM7Y,EAAsBtB,EAAKqB,iCAAiC,KAAKiY,OAA3C,EAE5Bla,EAAE,KAAKka,OAAN,EACEvZ,IAAIC,EAAK1B,eAAgByc,CAD5B,EAEG1a,qBAAqBiB,CAFxB,CAGD,MACCyZ,EAAkB,CAErB,IAEDF,cAAA,UAAgB,CAAA,IAAAxL,EAAA,KACdjQ,EAAEuB,QAAD,EACE+L,IAAIxI,GAAMoU,OADb,EAEGlS,GAAGlC,GAAMoU,QAAS,SAACnZ,EAAU,CACxBwB,WAAaxB,EAAME,QACnBgQ,EAAK1K,WAAaxF,EAAME,QACxBD,EAAEiQ,EAAK1K,QAAN,EAAgBqW,IAAI7b,EAAME,MAA3B,EAAmCmN,SAAW,GAChD6C,EAAK1K,SAAS8C,MAAd,CAEH,CARH,CASD,IAEDsS,gBAAA,UAAkB,CAAA,IAAAkB,EAAA,KACZ,KAAKzB,UAAY,KAAKzO,QAAQ5C,SAChC/I,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,GAAMuU,gBAAiB,SAACtZ,EAAU,CAChDA,EAAM4O,QAAU8F,KAClB1U,EAAMgH,eAAN,EACA8U,EAAKhJ,KAAL,EAEH,CALD,EAMU,KAAKuH,UACfpa,EAAE,KAAKuF,QAAN,EAAgB+H,IAAIxI,GAAMuU,eAA3B,CAEH,IAEDuB,gBAAA,UAAkB,CAAA,IAAAkB,EAAA,KACZ,KAAK1B,SACPpa,EAAEkM,MAAD,EAASlF,GAAGlC,GAAMqU,OAAQ,SAACpZ,EAAD,CAAA,OAAW+b,EAAKX,aAAapb,CAAlB,CAAX,CAA3B,EAEAC,EAAEkM,MAAD,EAASoB,IAAIxI,GAAMqU,MAApB,CAEH,IAED6B,WAAA,UAAa,CAAA,IAAAe,EAAA,KACX,KAAKxW,SAAS8N,MAAMoD,QAAU,OAC9B,KAAKlR,SAAS+C,aAAa,cAAe,EAA1C,EACA,KAAK/C,SAASgW,gBAAgB,YAA9B,EACA,KAAKvJ,iBAAmB,GACxB,KAAK6I,cAAc,UAAM,CACvB7a,EAAEuB,SAASiW,IAAV,EAAgBpR,YAAYlB,GAAUyU,IAAvC,EACAoC,EAAKC,kBAAL,EACAD,EAAKE,gBAAL,EACAjc,EAAE+b,EAAKxW,QAAN,EAAgB5C,QAAQmC,GAAMyM,MAA/B,CACD,CALD,CAMD,IAED2K,gBAAA,UAAkB,CACZ,KAAK/B,YACPna,EAAE,KAAKma,SAAN,EAAiB3T,OAAlB,EACA,KAAK2T,UAAY,KAEpB,IAEDU,cAAA,SAAcsB,EAAU,CAAA,IAAAC,EAAA,KAChBC,EAAUrc,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUE,IAApC,EACZF,GAAUE,KAAO,GAErB,GAAI,KAAKgV,UAAY,KAAKzO,QAAQsN,SAAU,CA+B1C,GA9BA,KAAKkB,UAAY5Y,SAAS+a,cAAc,KAAvB,EACjB,KAAKnC,UAAUoC,UAAYrX,GAAUwU,SAEjC2C,GACF,KAAKlC,UAAUlS,UAAUwG,IAAI4N,CAA7B,EAGFrc,EAAE,KAAKma,SAAN,EAAiBqC,SAASjb,SAASiW,IAApC,EAEAxX,EAAE,KAAKuF,QAAN,EAAgByB,GAAGlC,GAAMsU,cAAe,SAACrZ,GAAU,CAClD,GAAIqc,EAAK9B,qBAAsB,CAC7B8B,EAAK9B,qBAAuB,GAC5B,MACD,CACGva,GAAME,SAAWF,GAAMsU,gBAGvB+H,EAAKzQ,QAAQsN,WAAa,SAC5BmD,EAAK7W,SAAS8C,MAAd,EAEA+T,EAAKvJ,KAAL,EAEH,CAbD,EAeIwJ,GACFzb,EAAK6B,OAAO,KAAK0X,SAAjB,EAGFna,EAAE,KAAKma,SAAN,EAAiBnK,SAAS9K,GAAUG,IAArC,EAEI,CAAC8W,EACH,OAGF,GAAI,CAACE,EAAS,CACZF,EAAQ,EACR,MACD,CAED,IAAMM,EAA6B7b,EAAKqB,iCAAiC,KAAKkY,SAA3C,EAEnCna,EAAE,KAAKma,SAAN,EACExZ,IAAIC,EAAK1B,eAAgBid,CAD5B,EAEGlb,qBAAqBwb,CAFxB,CAGD,SAAU,CAAC,KAAKrC,UAAY,KAAKD,UAAW,CAC3Cna,EAAE,KAAKma,SAAN,EAAiB/T,YAAYlB,GAAUG,IAAxC,EAEA,IAAMqX,EAAiB,UAAM,CAC3BN,EAAKF,gBAAL,EACIC,GACFA,EAAQ,CAEX,EAED,GAAInc,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUE,IAApC,EAA2C,CAC7C,IAAMqX,EAA6B7b,EAAKqB,iCAAiC,KAAKkY,SAA3C,EAEnCna,EAAE,KAAKma,SAAN,EACExZ,IAAIC,EAAK1B,eAAgBwd,CAD5B,EAEGzb,qBAAqBwb,CAFxB,CAGD,MACCC,EAAc,CAEjB,MAAUP,GACTA,EAAQ,CAEX,IAODzB,cAAA,UAAgB,CACd,IAAMiC,EACJ,KAAKpX,SAASqX,aAAerb,SAASyC,gBAAgB6Y,aAEpD,CAAC,KAAKxC,oBAAsBsC,IAC9B,KAAKpX,SAAS8N,MAAMyJ,YAAiB,KAAKvC,gBAA1C,MAGE,KAAKF,oBAAsB,CAACsC,IAC9B,KAAKpX,SAAS8N,MAAM0J,aAAkB,KAAKxC,gBAA3C,KAEH,IAEDyB,kBAAA,UAAoB,CAClB,KAAKzW,SAAS8N,MAAMyJ,YAAc,GAClC,KAAKvX,SAAS8N,MAAM0J,aAAe,EACpC,IAEDvC,gBAAA,UAAkB,CAChB,IAAMwC,EAAOzb,SAASiW,KAAK7D,sBAAd,EACb,KAAK0G,mBAAqB2C,EAAKC,KAAOD,EAAKE,MAAQhR,OAAOiR,WAC1D,KAAK5C,gBAAkB,KAAK6C,mBAAL,CACxB,IAED3C,cAAA,UAAgB,CAAA,IAAA4C,EAAA,KACd,GAAI,KAAKhD,mBAAoB,CAG3B,IAAMiD,EAAe,CAAA,EAAG1O,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,GAASmV,aAAnC,CAAd,EACfwD,EAAgB,CAAA,EAAG3O,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,GAASoV,cAAnC,CAAd,EAGtBha,EAAEsd,CAAD,EAAe5W,KAAK,SAACuG,EAAOvL,GAAY,CACvC,IAAM8b,GAAgB9b,GAAQ2R,MAAM0J,aAC9BU,GAAoBzd,EAAE0B,EAAD,EAAUS,IAAI,eAAf,EAC1BnC,EAAE0B,EAAD,EACEkF,KAAK,gBAAiB4W,EADzB,EAEGrb,IAAI,gBAAoBG,WAAWmb,EAAD,EAAsBJ,EAAK9C,gBAFhE,IAAA,CAGD,CAND,EASAva,EAAEud,CAAD,EAAgB7W,KAAK,SAACuG,EAAOvL,GAAY,CACxC,IAAMgc,GAAehc,GAAQ2R,MAAMsK,YAC7BC,GAAmB5d,EAAE0B,EAAD,EAAUS,IAAI,cAAf,EACzBnC,EAAE0B,EAAD,EACEkF,KAAK,eAAgB8W,EADxB,EAEGvb,IAAI,eAAmBG,WAAWsb,EAAD,EAAqBP,EAAK9C,gBAF9D,IAAA,CAGD,CAND,EASA,IAAMiD,EAAgBjc,SAASiW,KAAKnE,MAAM0J,aACpCU,EAAoBzd,EAAEuB,SAASiW,IAAV,EAAgBrV,IAAI,eAArB,EAC1BnC,EAAEuB,SAASiW,IAAV,EACE5Q,KAAK,gBAAiB4W,CADzB,EAEGrb,IAAI,gBAAoBG,WAAWmb,CAAD,EAAsB,KAAKlD,gBAFhE,IAAA,CAGD,CAEDva,EAAEuB,SAASiW,IAAV,EAAgBxH,SAAS9K,GAAUyU,IAApC,CACD,IAEDsC,gBAAA,UAAkB,CAEhB,IAAMqB,EAAe,CAAA,EAAG1O,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,GAASmV,aAAnC,CAAd,EACrB/Z,EAAEsd,CAAD,EAAe5W,KAAK,SAACuG,EAAOvL,EAAY,CACvC,IAAMmc,EAAU7d,EAAE0B,CAAD,EAAUkF,KAAK,eAAhB,EAChB5G,EAAE0B,CAAD,EAAUsE,WAAW,eAAtB,EACAtE,EAAQ2R,MAAM0J,aAAec,GAAoB,EAClD,CAJD,EAOA,IAAMC,EAAW,CAAA,EAAGlP,MAAMpP,KAAK+B,SAASgN,iBAAT,GAA6B3J,GAASoV,cAAtC,CAAd,EACjBha,EAAE8d,CAAD,EAAWpX,KAAK,SAACuG,EAAOvL,EAAY,CACnC,IAAMqc,EAAS/d,EAAE0B,CAAD,EAAUkF,KAAK,cAAhB,EACX,OAAOmX,GAAW,aACpB/d,EAAE0B,CAAD,EAAUS,IAAI,eAAgB4b,CAA/B,EAAuC/X,WAAW,cAAlD,CAEH,CALD,EAQA,IAAM6X,EAAU7d,EAAEuB,SAASiW,IAAV,EAAgB5Q,KAAK,eAAtB,EAChB5G,EAAEuB,SAASiW,IAAV,EAAgBxR,WAAW,eAA5B,EACAzE,SAASiW,KAAKnE,MAAM0J,aAAec,GAAoB,EACxD,IAEDT,mBAAA,UAAqB,CACnB,IAAMY,EAAYzc,SAAS+a,cAAc,KAAvB,EAClB0B,EAAUzB,UAAYrX,GAAUuU,mBAChClY,SAASiW,KAAK8D,YAAY0C,CAA1B,EACA,IAAMC,EAAiBD,EAAUrK,sBAAV,EAAkCuK,MAAQF,EAAUG,YAC3E5c,gBAASiW,KAAK4G,YAAYJ,CAA1B,EACOC,CACR,IAIMxX,iBAAP,SAAwBvD,EAAQoM,EAAe,CAC7C,OAAO,KAAK5I,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EACLmH,EAAO4B,EAAA,CAAA,EACR1E,GACA7I,EAAE,IAAD,EAAO4G,KAAR,EACA,OAAO1D,GAAW,UAAYA,EAASA,EAAS,CAAA,CAHxC,EAWb,GALK0D,IACHA,EAAO,IAAIqT,EAAM,KAAMtO,CAAhB,EACP3L,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE,OAAO1D,GAAW,SAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAASoM,CAAb,CACD,MAAU3D,EAAQmH,MACjBlM,EAAKkM,KAAKxD,CAAV,CAEH,CArBM,CAsBR,yCA9boB,CACnB,OAAO/K,EACR,gCAEoB,CACnB,OAAOsE,EACR,WAicH7I,EAAEuB,QAAD,EAAWyF,GAAGlC,GAAMG,eAAgBL,GAAS2C,YAAa,SAAUxH,EAAO,CAAA,IAAAse,EAAA,KACtEpe,EACE0B,EAAWf,EAAKa,uBAAuB,IAA5B,EAEbE,IACF1B,EAASsB,SAASQ,cAAcJ,CAAvB,GAGX,IAAMuB,EAASlD,EAAEC,CAAD,EAAS2G,KAAKpC,EAAf,EACX,SADW+I,EAAA,CAAA,EAERvN,EAAEC,CAAD,EAAS2G,KAAV,EACA5G,EAAE,IAAD,EAAO4G,KAAR,CAHQ,GAMX,KAAK8H,UAAY,KAAO,KAAKA,UAAY,SAC3C3O,EAAMgH,eAAN,EAGF,IAAMyN,EAAUxU,EAAEC,CAAD,EAASU,IAAImE,GAAMO,KAAM,SAAC+R,EAAc,CACnDA,EAAUvR,mBAAV,GAKJ2O,EAAQ7T,IAAImE,GAAMyM,OAAQ,UAAM,CAC1BvR,EAAEqe,CAAD,EAAOne,GAAG,UAAX,GACFme,EAAKhW,MAAL,CAEH,CAJD,CAKD,CAXe,EAahB4R,GAAMxT,iBAAiBjH,KAAKQ,EAAEC,CAAD,EAAUiD,EAAQ,IAA/C,CACD,CAhCD,EAwCAlD,EAAEgB,GAAGsD,EAAL,EAAa2V,GAAMxT,iBACnBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAcgT,GACzBja,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACNsV,GAAMxT,gBACd,ECxkBD,IAAM6X,GAAW,CACf,aACA,OACA,OACA,WACA,WACA,SACA,MACA,YARe,EAWXC,GAAyB,iBAElBC,GAAmB,CAE9B,IAAK,CAAC,QAAS,MAAO,KAAM,OAAQ,OAAQD,EAAvC,EACLE,EAAG,CAAC,SAAU,OAAQ,QAAS,KAA5B,EACHC,KAAM,CAAA,EACNC,EAAG,CAAA,EACHC,GAAI,CAAA,EACJC,IAAK,CAAA,EACLC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJrO,EAAG,CAAA,EACHsO,IAAK,CAAC,MAAO,MAAO,QAAS,QAAS,QAAjC,EACLC,GAAI,CAAA,EACJC,GAAI,CAAA,EACJC,EAAG,CAAA,EACHC,IAAK,CAAA,EACLC,EAAG,CAAA,EACHC,MAAO,CAAA,EACPC,KAAM,CAAA,EACNC,IAAK,CAAA,EACLC,IAAK,CAAA,EACLC,OAAQ,CAAA,EACRC,EAAG,CAAA,EACHC,GAAI,CAAA,CA/B0B,EAuC1BC,GAAmB,8DAOnBC,GAAmB,sIAEzB,SAASC,GAAiBjN,EAAMkN,EAAsB,CACpD,IAAMC,EAAWnN,EAAKoN,SAAShhB,YAAd,EAEjB,GAAI8gB,EAAqB3R,QAAQ4R,CAA7B,IAA2C,GAC7C,OAAInC,GAASzP,QAAQ4R,CAAjB,IAA+B,GAC1B5d,GAAQyQ,EAAKqN,UAAUlhB,MAAM4gB,EAArB,GAA0C/M,EAAKqN,UAAUlhB,MAAM6gB,EAArB,GAGpD,GAMT,QAHMM,EAASJ,EAAqBlO,OAAO,SAACuO,EAAD,CAAA,OAAeA,aAAqBld,MAApC,CAA5B,EAGNuN,EAAI,EAAG4P,EAAIF,EAAOxT,OAAQ8D,EAAI4P,EAAG5P,IACxC,GAAIuP,EAAShhB,MAAMmhB,EAAO1P,CAAD,CAArB,EACF,MAAO,GAIX,MAAO,EACR,CAEM,SAAS6P,GAAaC,EAAYC,EAAWC,EAAY,CAC9D,GAAIF,EAAW5T,SAAW,EACxB,OAAO4T,EAGT,GAAIE,GAAc,OAAOA,GAAe,WACtC,OAAOA,EAAWF,CAAD,EAQnB,QALMG,EAAY,IAAIjV,OAAOkV,UACvBC,EAAkBF,EAAUG,gBAAgBN,EAAY,WAAtC,EAClBO,EAAgBle,OAAOme,KAAKP,CAAZ,EAChBnD,EAAW,CAAA,EAAGlP,MAAMpP,KAAK6hB,EAAgB7J,KAAKjJ,iBAAiB,GAAtC,CAAd,EAZ6CkT,EAAA,SAcrDvQ,GAAOC,GAd8C,CAe5D,IAAMuQ,GAAK5D,EAAS5M,EAAD,EACbyQ,GAASD,GAAGhB,SAAShhB,YAAZ,EAEf,GAAI6hB,EAAc1S,QAAQ6S,GAAGhB,SAAShhB,YAAZ,CAAtB,IAAqD,GACvDgiB,OAAAA,GAAGrd,WAAW+Z,YAAYsD,EAA1B,EAEA,WAGF,IAAME,GAAgB,CAAA,EAAGhT,MAAMpP,KAAKkiB,GAAGG,UAAjB,EAChBC,GAAwB,CAAA,EAAGC,OAAOd,EAAU,GAAD,GAAS,CAAA,EAAIA,EAAUU,EAAD,GAAY,CAAA,CAArD,EAE9BC,GAAc3G,QAAQ,SAAC3H,GAAS,CACzBiN,GAAiBjN,GAAMwO,EAAP,GACnBJ,GAAGnG,gBAAgBjI,GAAKoN,QAAxB,CAEH,CAJD,CA3B4D,EAcrDxP,EAAI,EAAGC,GAAM2M,EAAS1Q,OAAQ8D,EAAIC,GAAKD,IAAK,IAAA8Q,GAAAP,EAA5CvQ,EAAOC,EAAqC,EAoBrD,OAAOkQ,EAAgB7J,KAAKyK,SAC7B,CCzGD,IAAM3d,GAAwB,UACxBC,GAAwB,QACxBC,GAAwB,aACxBC,GAAS,IAAmBD,GAC5BG,GAAwB3E,EAAEgB,GAAGsD,EAAL,EACxB4d,GAAwB,aACxBC,GAAwB,IAAIxe,OAAJ,UAAqBue,GAArB,OAAyC,GAAzC,EACxBE,GAAwB,CAAC,WAAY,YAAa,YAA1B,EAExBhZ,GAAc,CAClBiZ,UAAoB,UACpBC,SAAoB,SACpBC,MAAoB,4BACpB5f,QAAoB,SACpB6f,MAAoB,kBACpBC,KAAoB,UACpB9gB,SAAoB,mBACpBuW,UAAoB,oBACpB7B,OAAoB,2BACpBqM,UAAoB,2BACpBC,kBAAoB,iBACpBpM,SAAoB,mBACpBqM,SAAoB,UACpB1B,WAAoB,kBACpBD,UAAoB,QAfF,EAkBdnL,GAAgB,CACpB+M,KAAS,OACT9M,IAAS,MACTtM,MAAS,QACTwM,OAAS,SACTzM,KAAS,MALW,EAQhBX,GAAU,CACdwZ,UAAoB,GACpBC,SAAoB,uGAGpB3f,QAAoB,cACpB4f,MAAoB,GACpBC,MAAoB,EACpBC,KAAoB,GACpB9gB,SAAoB,GACpBuW,UAAoB,MACpB7B,OAAoB,EACpBqM,UAAoB,GACpBC,kBAAoB,OACpBpM,SAAoB,eACpBqM,SAAoB,GACpB1B,WAAoB,KACpBD,UAAoBzC,EAjBN,EAoBVsE,GAAa,CACjBzd,KAAO,OACP0d,IAAO,KAFU,EAKbje,GAAQ,CACZwM,KAAI,OAAgB7M,GACpB8M,OAAM,SAAgB9M,GACtBY,KAAI,OAAgBZ,GACpB4M,MAAK,QAAgB5M,GACrBue,SAAQ,WAAgBve,GACxBuQ,MAAK,QAAgBvQ,GACrByU,QAAO,UAAgBzU,GACvBwe,SAAQ,WAAgBxe,GACxBoF,WAAU,aAAgBpF,GAC1BqF,WAAU,aAAgBrF,EAVd,EAaRS,GAAY,CAChBE,KAAO,OACPC,KAAO,MAFS,EAKZT,GAAW,CACfse,QAAgB,WAChBC,cAAgB,iBAChBC,MAAgB,QAHD,EAMXC,GAAU,CACdC,MAAS,QACTjc,MAAS,QACT2N,MAAS,QACTuO,OAAS,QAJK,EAcVC,eACJ,SAAAA,EAAY9hB,EAASwB,EAAQ,CAK3B,GAAI,OAAOmU,GAAW,YACpB,MAAM,IAAIxG,UAAU,iEAAd,EAIR,KAAK4S,WAAiB,GACtB,KAAKC,SAAiB,EACtB,KAAKC,YAAiB,GACtB,KAAKC,eAAiB,CAAA,EACtB,KAAKjN,QAAiB,KAGtB,KAAKjV,QAAUA,EACf,KAAKwB,OAAU,KAAK0I,WAAW1I,CAAhB,EACf,KAAK2gB,IAAU,KAEf,KAAKC,cAAL,CACD,4BAkCDC,OAAA,UAAS,CACP,KAAKN,WAAa,EACnB,IAEDO,QAAA,UAAU,CACR,KAAKP,WAAa,EACnB,IAEDQ,cAAA,UAAgB,CACd,KAAKR,WAAa,CAAC,KAAKA,UACzB,IAED9b,OAAA,SAAO5H,EAAO,CACZ,GAAK,KAAK0jB,WAIV,GAAI1jB,EAAO,CACT,IAAMmkB,EAAU,KAAKnM,YAAYvT,SAC7BoU,EAAU5Y,EAAED,EAAMsU,aAAP,EAAsBzN,KAAKsd,CAA5B,EAETtL,IACHA,EAAU,IAAI,KAAKb,YACjBhY,EAAMsU,cACN,KAAK8P,mBAAL,CAFQ,EAIVnkB,EAAED,EAAMsU,aAAP,EAAsBzN,KAAKsd,EAAStL,CAArC,GAGFA,EAAQgL,eAAeQ,MAAQ,CAACxL,EAAQgL,eAAeQ,MAEnDxL,EAAQyL,qBAAR,EACFzL,EAAQ0L,OAAO,KAAM1L,CAArB,EAEAA,EAAQ2L,OAAO,KAAM3L,CAArB,CAEH,KAAM,CACL,GAAI5Y,EAAE,KAAKwkB,cAAL,CAAD,EAAuBne,SAASnB,GAAUG,IAA3C,EAAkD,CACpD,KAAKkf,OAAO,KAAM,IAAlB,EACA,MACD,CAED,KAAKD,OAAO,KAAM,IAAlB,CACD,CACF,IAEDve,QAAA,UAAU,CACRuI,aAAa,KAAKoV,QAAN,EAEZ1jB,EAAEgG,WAAW,KAAKtE,QAAS,KAAKqW,YAAYvT,QAA5C,EAEAxE,EAAE,KAAK0B,OAAN,EAAe4L,IAAI,KAAKyK,YAAYtT,SAArC,EACAzE,EAAE,KAAK0B,OAAN,EAAewE,QAAQ,QAAxB,EAAkCoH,IAAI,eAAtC,EAEI,KAAKuW,KACP7jB,EAAE,KAAK6jB,GAAN,EAAWrd,OAAZ,EAGF,KAAKid,WAAiB,KACtB,KAAKC,SAAiB,KACtB,KAAKC,YAAiB,KACtB,KAAKC,eAAiB,KAClB,KAAKjN,UAAY,MACnB,KAAKA,QAAQgB,QAAb,EAGF,KAAKhB,QAAU,KACf,KAAKjV,QAAU,KACf,KAAKwB,OAAU,KACf,KAAK2gB,IAAU,IAChB,IAED/Q,KAAA,UAAO,CAAA,IAAArS,EAAA,KACL,GAAIT,EAAE,KAAK0B,OAAN,EAAeS,IAAI,SAApB,IAAmC,OACrC,MAAM,IAAI0B,MAAM,qCAAV,EAGR,IAAMuT,EAAYpX,EAAE8E,MAAM,KAAKiT,YAAYjT,MAAMO,IAA/B,EAClB,GAAI,KAAKof,cAAL,GAAwB,KAAKhB,WAAY,CAC3CzjB,EAAE,KAAK0B,OAAN,EAAeiB,QAAQyU,CAAxB,EAEA,IAAMsN,EAAa9jB,EAAKmD,eAAe,KAAKrC,OAAzB,EACbijB,EAAa3kB,EAAEkI,SACnBwc,IAAe,KAAOA,EAAa,KAAKhjB,QAAQkjB,cAAc5gB,gBAC9D,KAAKtC,OAFY,EAKnB,GAAI0V,EAAUvR,mBAAV,GAAkC,CAAC8e,EACrC,OAGF,IAAMd,EAAQ,KAAKW,cAAL,EACRK,EAAQjkB,EAAKO,OAAO,KAAK4W,YAAYzT,IAA7B,EAEduf,EAAIvb,aAAa,KAAMuc,CAAvB,EACA,KAAKnjB,QAAQ4G,aAAa,mBAAoBuc,CAA9C,EAEA,KAAKC,WAAL,EAEI,KAAK5hB,OAAOmf,WACdriB,EAAE6jB,CAAD,EAAM7T,SAAS9K,GAAUE,IAA1B,EAGF,IAAM8S,GAAa,OAAO,KAAKhV,OAAOgV,WAAc,WAChD,KAAKhV,OAAOgV,UAAU1Y,KAAK,KAAMqkB,EAAK,KAAKniB,OAA3C,EACA,KAAKwB,OAAOgV,UAEV6M,GAAa,KAAKC,eAAe9M,EAApB,EACnB,KAAK+M,mBAAmBF,EAAxB,EAEA,IAAMrC,GAAY,KAAKwC,cAAL,EAClBllB,EAAE6jB,CAAD,EAAMjd,KAAK,KAAKmR,YAAYvT,SAAU,IAAvC,EAEKxE,EAAEkI,SAAS,KAAKxG,QAAQkjB,cAAc5gB,gBAAiB,KAAK6f,GAA5D,GACH7jB,EAAE6jB,CAAD,EAAMrH,SAASkG,EAAhB,EAGF1iB,EAAE,KAAK0B,OAAN,EAAeiB,QAAQ,KAAKoV,YAAYjT,MAAMke,QAA/C,EAEA,KAAKrM,QAAU,IAAIU,EAAO,KAAK3V,QAASmiB,EAAK,CAC3C3L,UAAW6M,GACXzM,UAAW,CACTjC,OAAQ,KAAK8B,WAAL,EACR7B,KAAM,CACJ6O,SAAU,KAAKjiB,OAAOyf,iBADlB,EAGNyC,MAAO,CACL1jB,QAASkD,GAASwe,KADb,EAGP5K,gBAAiB,CACfC,kBAAmB,KAAKvV,OAAOqT,QADhB,CARR,EAYX8O,SAAU,SAACze,GAAS,CACdA,GAAK0e,oBAAsB1e,GAAKsR,WAClCzX,EAAK8kB,6BAA6B3e,EAAlC,CAEH,EACD4e,SAAU,SAAC5e,GAAD,CAAA,OAAUnG,EAAK8kB,6BAA6B3e,EAAlC,CAAV,CAnBiC,CAA9B,EAsBf5G,EAAE6jB,CAAD,EAAM7T,SAAS9K,GAAUG,IAA1B,EAMI,iBAAkB9D,SAASyC,iBAC7BhE,EAAEuB,SAASiW,IAAV,EAAgBzH,SAAjB,EAA4B/I,GAAG,YAAa,KAAMhH,EAAEyX,IAApD,EAGF,IAAMjE,GAAW,UAAM,CACjB/S,EAAKyC,OAAOmf,WACd5hB,EAAKglB,eAAL,EAEF,IAAMC,GAAiBjlB,EAAKkjB,YAC5BljB,EAAKkjB,YAAkB,KAEvB3jB,EAAES,EAAKiB,OAAN,EAAeiB,QAAQlC,EAAKsX,YAAYjT,MAAMuM,KAA/C,EAEIqU,KAAmB5C,GAAWC,KAChCtiB,EAAK8jB,OAAO,KAAM9jB,CAAlB,CAEH,EAED,GAAIT,EAAE,KAAK6jB,GAAN,EAAWxd,SAASnB,GAAUE,IAA/B,EAAsC,CACxC,IAAMlD,GAAqBtB,EAAKqB,iCAAiC,KAAK4hB,GAA3C,EAE3B7jB,EAAE,KAAK6jB,GAAN,EACEljB,IAAIC,EAAK1B,eAAgBsU,EAD5B,EAEGvS,qBAAqBiB,EAFxB,CAGD,MACCsR,GAAQ,CAEX,CACF,IAEDX,KAAA,SAAKsJ,EAAU,CAAA,IAAAxO,EAAA,KACPkW,EAAY,KAAKW,cAAL,EACZ9M,EAAY1X,EAAE8E,MAAM,KAAKiT,YAAYjT,MAAMwM,IAA/B,EACZkC,EAAW,UAAM,CACjB7F,EAAKgW,cAAgBb,GAAWzd,MAAQwe,EAAIxf,YAC9Cwf,EAAIxf,WAAW+Z,YAAYyF,CAA3B,EAGFlW,EAAKgY,eAAL,EACAhY,EAAKjM,QAAQ6Z,gBAAgB,kBAA7B,EACAvb,EAAE2N,EAAKjM,OAAN,EAAeiB,QAAQgL,EAAKoK,YAAYjT,MAAMyM,MAA/C,EACI5D,EAAKgJ,UAAY,MACnBhJ,EAAKgJ,QAAQgB,QAAb,EAGEwE,GACFA,EAAQ,CAEX,EAID,GAFAnc,EAAE,KAAK0B,OAAN,EAAeiB,QAAQ+U,CAAxB,EAEIA,CAAAA,EAAU7R,mBAAV,EAgBJ,IAZA7F,EAAE6jB,CAAD,EAAMzd,YAAYlB,GAAUG,IAA7B,EAII,iBAAkB9D,SAASyC,iBAC7BhE,EAAEuB,SAASiW,IAAV,EAAgBzH,SAAjB,EAA4BzC,IAAI,YAAa,KAAMtN,EAAEyX,IAArD,EAGF,KAAKmM,eAAeP,GAAQrO,KAA5B,EAAqC,GACrC,KAAK4O,eAAeP,GAAQhc,KAA5B,EAAqC,GACrC,KAAKuc,eAAeP,GAAQC,KAA5B,EAAqC,GAEjCtjB,EAAE,KAAK6jB,GAAN,EAAWxd,SAASnB,GAAUE,IAA/B,EAAsC,CACxC,IAAMlD,EAAqBtB,EAAKqB,iCAAiC4hB,CAAtC,EAE3B7jB,EAAE6jB,CAAD,EACEljB,IAAIC,EAAK1B,eAAgBsU,CAD5B,EAEGvS,qBAAqBiB,CAFxB,CAGD,MACCsR,EAAQ,EAGV,KAAKmQ,YAAc,GACpB,IAED/L,OAAA,UAAS,CACH,KAAKjB,UAAY,MACnB,KAAKA,QAAQkB,eAAb,CAEH,IAID4M,cAAA,UAAgB,CACd,MAAO5hB,EAAQ,KAAK+iB,SAAL,CAChB,IAEDX,mBAAA,SAAmBF,EAAY,CAC7B/kB,EAAE,KAAKwkB,cAAL,CAAD,EAAuBxU,SAAYkS,GAApC,IAAoD6C,CAApD,CACD,IAEDP,cAAA,UAAgB,CACd,YAAKX,IAAM,KAAKA,KAAO7jB,EAAE,KAAKkD,OAAOof,QAAb,EAAuB,CAAxB,EAChB,KAAKuB,GACb,IAEDiB,WAAA,UAAa,CACX,IAAMjB,EAAM,KAAKW,cAAL,EACZ,KAAKqB,kBAAkB7lB,EAAE6jB,EAAItV,iBAAiB3J,GAASue,aAA9B,CAAD,EAAgD,KAAKyC,SAAL,CAAxE,EACA5lB,EAAE6jB,CAAD,EAAMzd,YAAelB,GAAUE,KAAhC,IAAwCF,GAAUG,IAAlD,CACD,IAEDwgB,kBAAA,SAAkBlf,EAAUmf,EAAS,CACnC,GAAI,OAAOA,GAAY,WAAaA,EAAQ/iB,UAAY+iB,EAAQ9R,QAAS,CAEnE,KAAK9Q,OAAOuf,KACTziB,EAAE8lB,CAAD,EAAU7f,OAAX,EAAoB/F,GAAGyG,CAAvB,GACHA,EAASof,MAAT,EAAiBC,OAAOF,CAAxB,EAGFnf,EAASsf,KAAKjmB,EAAE8lB,CAAD,EAAUG,KAAX,CAAd,EAGF,MACD,CAEG,KAAK/iB,OAAOuf,MACV,KAAKvf,OAAO0f,WACdkD,EAAU/E,GAAa+E,EAAS,KAAK5iB,OAAO+d,UAAW,KAAK/d,OAAOge,UAA7C,GAGxBva,EAAS8b,KAAKqD,CAAd,GAEAnf,EAASsf,KAAKH,CAAd,CAEH,IAEDF,SAAA,UAAW,CACT,IAAIrD,EAAQ,KAAK7gB,QAAQE,aAAa,qBAA1B,EAEZ,OAAK2gB,IACHA,EAAQ,OAAO,KAAKrf,OAAOqf,OAAU,WACjC,KAAKrf,OAAOqf,MAAM/iB,KAAK,KAAKkC,OAA5B,EACA,KAAKwB,OAAOqf,OAGXA,CACR,IAIDpK,WAAA,UAAa,CAAA,IAAArK,EAAA,KACLuI,EAAS,CAAA,EAEf,OAAI,OAAO,KAAKnT,OAAOmT,QAAW,WAChCA,EAAOrV,GAAK,SAAC4F,EAAS,CACpBA,OAAAA,EAAKwR,QAAL7K,EAAA,CAAA,EACK3G,EAAKwR,QACLtK,EAAK5K,OAAOmT,OAAOzP,EAAKwR,QAAStK,EAAKpM,OAAtC,GAAkD,CAAA,CAFvD,EAKOkF,CACR,EAEDyP,EAAOA,OAAS,KAAKnT,OAAOmT,OAGvBA,CACR,IAED6O,cAAA,UAAgB,CACd,OAAI,KAAKhiB,OAAOwf,YAAc,GACrBnhB,SAASiW,KAGd5W,EAAKkC,UAAU,KAAKI,OAAOwf,SAA3B,EACK1iB,EAAE,KAAKkD,OAAOwf,SAAb,EAGH1iB,EAAEuB,QAAD,EAAW2kB,KAAK,KAAKhjB,OAAOwf,SAA7B,CACR,IAEDsC,eAAA,SAAe9M,EAAW,CACxB,OAAOpC,GAAcoC,EAAUpU,YAAV,CAAD,CACrB,IAEDggB,cAAA,UAAgB,CAAA,IAAA7T,EAAA,KACRkW,EAAW,KAAKjjB,OAAOP,QAAQH,MAAM,GAA1B,EAEjB2jB,EAASlL,QAAQ,SAACtY,EAAY,CAC5B,GAAIA,IAAY,QACd3C,EAAEiQ,EAAKvO,OAAN,EAAesF,GACdiJ,EAAK8H,YAAYjT,MAAMkQ,MACvB/E,EAAK/M,OAAOvB,SACZ,SAAC5B,EAAD,CAAA,OAAWkQ,EAAKtI,OAAO5H,CAAZ,CAAX,CAHF,UAKS4C,IAAY0gB,GAAQE,OAAQ,CACrC,IAAM6C,EAAUzjB,IAAY0gB,GAAQC,MAChCrT,EAAK8H,YAAYjT,MAAM+E,WACvBoG,EAAK8H,YAAYjT,MAAMoU,QACrBmN,EAAW1jB,IAAY0gB,GAAQC,MACjCrT,EAAK8H,YAAYjT,MAAMgF,WACvBmG,EAAK8H,YAAYjT,MAAMme,SAE3BjjB,EAAEiQ,EAAKvO,OAAN,EACEsF,GACCof,EACAnW,EAAK/M,OAAOvB,SACZ,SAAC5B,EAAD,CAAA,OAAWkQ,EAAKqU,OAAOvkB,CAAZ,CAAX,CAJJ,EAMGiH,GACCqf,EACApW,EAAK/M,OAAOvB,SACZ,SAAC5B,EAAD,CAAA,OAAWkQ,EAAKsU,OAAOxkB,CAAZ,CAAX,CATJ,CAWD,CACF,CA3BD,EA6BAC,EAAE,KAAK0B,OAAN,EAAewE,QAAQ,QAAxB,EAAkCc,GAChC,gBACA,UAAM,CACAiJ,EAAKvO,SACPuO,EAAK4C,KAAL,CAEH,CANH,EASI,KAAK3P,OAAOvB,SACd,KAAKuB,OAALqK,EAAA,CAAA,EACK,KAAKrK,OADV,CAEEP,QAAS,SACThB,SAAU,EAHZ,CAAA,EAMA,KAAK2kB,UAAL,CAEH,IAEDA,UAAA,UAAY,CACV,IAAMC,EAAY,OAAO,KAAK7kB,QAAQE,aAAa,qBAA1B,GAErB,KAAKF,QAAQE,aAAa,OAA1B,GAAsC2kB,IAAc,YACtD,KAAK7kB,QAAQ4G,aACX,sBACA,KAAK5G,QAAQE,aAAa,OAA1B,GAAsC,EAFxC,EAKA,KAAKF,QAAQ4G,aAAa,QAAS,EAAnC,EAEH,IAEDgc,OAAA,SAAOvkB,EAAO6Y,EAAS,CACrB,IAAMsL,EAAU,KAAKnM,YAAYvT,SAiBjC,GAhBAoU,EAAUA,GAAW5Y,EAAED,EAAMsU,aAAP,EAAsBzN,KAAKsd,CAA5B,EAEhBtL,IACHA,EAAU,IAAI,KAAKb,YACjBhY,EAAMsU,cACN,KAAK8P,mBAAL,CAFQ,EAIVnkB,EAAED,EAAMsU,aAAP,EAAsBzN,KAAKsd,EAAStL,CAArC,GAGE7Y,IACF6Y,EAAQgL,eACN7jB,EAAMgI,OAAS,UAAYsb,GAAQhc,MAAQgc,GAAQC,KADrD,EAEI,IAGFtjB,EAAE4Y,EAAQ4L,cAAR,CAAD,EAA0Bne,SAASnB,GAAUG,IAA9C,GAAuDuT,EAAQ+K,cAAgBb,GAAWzd,KAAM,CAClGuT,EAAQ+K,YAAcb,GAAWzd,KACjC,MACD,CAMD,GAJAiJ,aAAasK,EAAQ8K,QAAT,EAEZ9K,EAAQ+K,YAAcb,GAAWzd,KAE7B,CAACuT,EAAQ1V,OAAOsf,OAAS,CAAC5J,EAAQ1V,OAAOsf,MAAM1P,KAAM,CACvD8F,EAAQ9F,KAAR,EACA,MACD,CAED8F,EAAQ8K,SAAW7iB,WAAW,UAAM,CAC9B+X,EAAQ+K,cAAgBb,GAAWzd,MACrCuT,EAAQ9F,KAAR,CAEH,EAAE8F,EAAQ1V,OAAOsf,MAAM1P,IAJK,CAK9B,IAEDyR,OAAA,SAAOxkB,EAAO6Y,EAAS,CACrB,IAAMsL,EAAU,KAAKnM,YAAYvT,SAiBjC,GAhBAoU,EAAUA,GAAW5Y,EAAED,EAAMsU,aAAP,EAAsBzN,KAAKsd,CAA5B,EAEhBtL,IACHA,EAAU,IAAI,KAAKb,YACjBhY,EAAMsU,cACN,KAAK8P,mBAAL,CAFQ,EAIVnkB,EAAED,EAAMsU,aAAP,EAAsBzN,KAAKsd,EAAStL,CAArC,GAGE7Y,IACF6Y,EAAQgL,eACN7jB,EAAMgI,OAAS,WAAasb,GAAQhc,MAAQgc,GAAQC,KADtD,EAEI,IAGF1K,CAAAA,EAAQyL,qBAAR,EAQJ,IAJA/V,aAAasK,EAAQ8K,QAAT,EAEZ9K,EAAQ+K,YAAcb,GAAWC,IAE7B,CAACnK,EAAQ1V,OAAOsf,OAAS,CAAC5J,EAAQ1V,OAAOsf,MAAM3P,KAAM,CACvD+F,EAAQ/F,KAAR,EACA,MACD,CAED+F,EAAQ8K,SAAW7iB,WAAW,UAAM,CAC9B+X,EAAQ+K,cAAgBb,GAAWC,KACrCnK,EAAQ/F,KAAR,CAEH,EAAE+F,EAAQ1V,OAAOsf,MAAM3P,IAJK,EAK9B,IAEDwR,qBAAA,UAAuB,CACrB,QAAW1hB,KAAW,KAAKihB,eACzB,GAAI,KAAKA,eAAejhB,CAApB,EACF,MAAO,GAIX,MAAO,EACR,IAEDiJ,WAAA,SAAW1I,EAAQ,CACjB,IAAMsjB,EAAiBxmB,EAAE,KAAK0B,OAAN,EAAekF,KAAhB,EAEvBvD,cAAOme,KAAKgF,CAAZ,EACGvL,QAAQ,SAACwL,EAAa,CACjBrE,GAAsBvT,QAAQ4X,CAA9B,IAA4C,IAC9C,OAAOD,EAAeC,CAAD,CAExB,CALH,EAOAvjB,EAAMqK,EAAA,CAAA,EACD,KAAKwK,YAAYlP,QACjB2d,EACA,OAAOtjB,GAAW,UAAYA,EAASA,EAAS,CAAA,CAH/C,EAMF,OAAOA,EAAOsf,OAAU,WAC1Btf,EAAOsf,MAAQ,CACb1P,KAAM5P,EAAOsf,MACb3P,KAAM3P,EAAOsf,KAFA,GAMb,OAAOtf,EAAOqf,OAAU,WAC1Brf,EAAOqf,MAAQrf,EAAOqf,MAAMhjB,SAAb,GAGb,OAAO2D,EAAO4iB,SAAY,WAC5B5iB,EAAO4iB,QAAU5iB,EAAO4iB,QAAQvmB,SAAf,GAGnBqB,EAAKoC,gBACHsB,GACApB,EACA,KAAK6U,YAAY3O,WAHnB,EAMIlG,EAAO0f,WACT1f,EAAOof,SAAWvB,GAAa7d,EAAOof,SAAUpf,EAAO+d,UAAW/d,EAAOge,UAA3C,GAGzBhe,CACR,IAEDihB,mBAAA,UAAqB,CACnB,IAAMjhB,EAAS,CAAA,EAEf,GAAI,KAAKA,OACP,QAAWwjB,KAAO,KAAKxjB,OACjB,KAAK6U,YAAYlP,QAAQ6d,CAAzB,IAAkC,KAAKxjB,OAAOwjB,CAAZ,IACpCxjB,EAAOwjB,CAAD,EAAQ,KAAKxjB,OAAOwjB,CAAZ,GAKpB,OAAOxjB,CACR,IAEDyiB,eAAA,UAAiB,CACf,IAAMgB,EAAO3mB,EAAE,KAAKwkB,cAAL,CAAD,EACRoC,EAAWD,EAAKrT,KAAK,OAAV,EAAmB7T,MAAM0iB,EAAzB,EACbyE,IAAa,MAAQA,EAASxZ,QAChCuZ,EAAKvgB,YAAYwgB,EAASC,KAAK,EAAd,CAAjB,CAEH,IAEDtB,6BAAA,SAA6BuB,EAAY,CACvC,IAAMC,EAAiBD,EAAWE,SAClC,KAAKnD,IAAMkD,EAAeE,OAC1B,KAAKtB,eAAL,EACA,KAAKV,mBAAmB,KAAKD,eAAe8B,EAAW5O,SAA/B,CAAxB,CACD,IAEDuN,eAAA,UAAiB,CACf,IAAM5B,EAAM,KAAKW,cAAL,EACN0C,EAAsB,KAAKhkB,OAAOmf,UAEpCwB,EAAIjiB,aAAa,aAAjB,IAAoC,OAIxC5B,EAAE6jB,CAAD,EAAMzd,YAAYlB,GAAUE,IAA7B,EACA,KAAKlC,OAAOmf,UAAY,GACxB,KAAKxP,KAAL,EACA,KAAKC,KAAL,EACA,KAAK5P,OAAOmf,UAAY6E,EACzB,IAIMzgB,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EACLmH,EAAU,OAAOzI,GAAW,UAAYA,EAE9C,GAAI,GAAC0D,GAAQ,eAAehD,KAAKV,CAApB,KAIR0D,IACHA,EAAO,IAAI4c,EAAQ,KAAM7X,CAAlB,EACP3L,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE,OAAO1D,GAAW,UAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAAJ,CACD,CACF,CAnBM,CAoBR,yCA9mBoB,CACnB,OAAOqB,EACR,gCAEoB,CACnB,OAAOsE,EACR,6BAEiB,CAChB,OAAOvE,EACR,iCAEqB,CACpB,OAAOE,EACR,8BAEkB,CACjB,OAAOM,EACR,kCAEsB,CACrB,OAAOL,EACR,oCAEwB,CACvB,OAAO2E,EACR,WA6lBHpJ,EAAEgB,GAAGsD,EAAL,EAAakf,GAAQ/c,iBACrBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAcuc,GACzBxjB,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACN6e,GAAQ/c,gBAChB,EC9vBD,IAAMnC,GAAsB,UACtBC,GAAsB,QACtBC,GAAsB,aACtBC,GAAS,IAAiBD,GAC1BG,GAAsB3E,EAAEgB,GAAGsD,EAAL,EACtB4d,GAAsB,aACtBC,GAAsB,IAAIxe,OAAJ,UAAqBue,GAArB,OAAyC,GAAzC,EAEtBrZ,GAAO0E,EAAA,CAAA,EACRiW,GAAQ3a,QADA,CAEXqP,UAAY,QACZvV,QAAY,QACZmjB,QAAY,GACZxD,SAAY,qIALD,CAAA,EAWPlZ,GAAWmE,EAAA,CAAA,EACZiW,GAAQpa,YADI,CAEf0c,QAAU,2BAFK,CAAA,EAKX5gB,GAAY,CAChBE,KAAO,OACPC,KAAO,MAFS,EAKZT,GAAW,CACfuiB,MAAU,kBACVC,QAAU,eAFK,EAKXtiB,GAAQ,CACZwM,KAAI,OAAgB7M,GACpB8M,OAAM,SAAgB9M,GACtBY,KAAI,OAAgBZ,GACpB4M,MAAK,QAAgB5M,GACrBue,SAAQ,WAAgBve,GACxBuQ,MAAK,QAAgBvQ,GACrByU,QAAO,UAAgBzU,GACvBwe,SAAQ,WAAgBxe,GACxBoF,WAAU,aAAgBpF,GAC1BqF,WAAU,aAAgBrF,EAVd,EAmBR4iB,oGAiCJ5C,cAAA,UAAgB,CACd,OAAO,KAAKmB,SAAL,GAAmB,KAAK0B,YAAL,CAC3B,IAEDrC,mBAAA,SAAmBF,EAAY,CAC7B/kB,EAAE,KAAKwkB,cAAL,CAAD,EAAuBxU,SAAYkS,GAApC,IAAoD6C,CAApD,CACD,IAEDP,cAAA,UAAgB,CACd,YAAKX,IAAM,KAAKA,KAAO7jB,EAAE,KAAKkD,OAAOof,QAAb,EAAuB,CAAxB,EAChB,KAAKuB,GACb,IAEDiB,WAAA,UAAa,CACX,IAAM6B,EAAO3mB,EAAE,KAAKwkB,cAAL,CAAD,EAGd,KAAKqB,kBAAkBc,EAAKT,KAAKthB,GAASuiB,KAAnB,EAA2B,KAAKvB,SAAL,CAAlD,EACA,IAAIE,EAAU,KAAKwB,YAAL,EACV,OAAOxB,GAAY,aACrBA,EAAUA,EAAQtmB,KAAK,KAAKkC,OAAlB,GAEZ,KAAKmkB,kBAAkBc,EAAKT,KAAKthB,GAASwiB,OAAnB,EAA6BtB,CAApD,EAEAa,EAAKvgB,YAAelB,GAAUE,KAA9B,IAAsCF,GAAUG,IAAhD,CACD,IAIDiiB,YAAA,UAAc,CACZ,OAAO,KAAK5lB,QAAQE,aAAa,cAA1B,GACL,KAAKsB,OAAO4iB,OACf,IAEDH,eAAA,UAAiB,CACf,IAAMgB,EAAO3mB,EAAE,KAAKwkB,cAAL,CAAD,EACRoC,EAAWD,EAAKrT,KAAK,OAAV,EAAmB7T,MAAM0iB,EAAzB,EACbyE,IAAa,MAAQA,EAASxZ,OAAS,GACzCuZ,EAAKvgB,YAAYwgB,EAASC,KAAK,EAAd,CAAjB,CAEH,IAIMpgB,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EACLmH,EAAU,OAAOzI,GAAW,SAAWA,EAAS,KAEtD,GAAI,GAAC0D,GAAQ,eAAehD,KAAKV,CAApB,KAIR0D,IACHA,EAAO,IAAIygB,EAAQ,KAAM1b,CAAlB,EACP3L,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE,OAAO1D,GAAW,UAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAAJ,CACD,CACF,CAnBM,CAoBR,yCA/FoB,CACnB,OAAOqB,EACR,gCAEoB,CACnB,OAAOsE,EACR,6BAEiB,CAChB,OAAOvE,EACR,iCAEqB,CACpB,OAAOE,EACR,8BAEkB,CACjB,OAAOM,EACR,kCAEsB,CACrB,OAAOL,EACR,oCAEwB,CACvB,OAAO2E,EACR,SA7BmBoa,EAAAA,EA2GtBxjB,EAAEgB,GAAGsD,EAAL,EAAa+iB,GAAQ5gB,iBACrBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAcogB,GACzBrnB,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACN0iB,GAAQ5gB,gBAChB,ECrKD,IAAMnC,GAAqB,YACrBC,GAAqB,QACrBC,GAAqB,eACrBC,GAAS,IAAgBD,GACzBE,GAAqB,YACrBC,GAAqB3E,EAAEgB,GAAGsD,EAAL,EAErBuE,GAAU,CACdwN,OAAS,GACTkR,OAAS,OACTtnB,OAAS,EAHK,EAMVmJ,GAAc,CAClBiN,OAAS,SACTkR,OAAS,SACTtnB,OAAS,kBAHS,EAMd6E,GAAQ,CACZ0iB,SAAQ,WAAmB/iB,GAC3BgjB,OAAM,SAAmBhjB,GACzB4F,cAAa,OAAU5F,GAAYC,EAHvB,EAMRQ,GAAY,CAChBwiB,cAAgB,gBAChBC,cAAgB,gBAChBxgB,OAAgB,QAHA,EAMZvC,GAAW,CACfgjB,SAAkB,sBAClBzgB,OAAkB,UAClB0gB,eAAkB,oBAClBC,UAAkB,YAClBC,UAAkB,YAClBC,WAAkB,mBAClBC,SAAkB,YAClBC,eAAkB,iBAClBC,gBAAkB,kBATH,EAYXC,GAAe,CACnBC,OAAW,SACXC,SAAW,UAFQ,EAWfC,eACJ,SAAAA,EAAY7mB,EAASwB,EAAQ,CAAA,IAAAzC,EAAA,KAC3B,KAAK8E,SAAiB7D,EACtB,KAAK8mB,eAAiB9mB,EAAQgN,UAAY,OAASxC,OAASxK,EAC5D,KAAKiK,QAAiB,KAAKC,WAAW1I,CAAhB,EACtB,KAAKsP,UAAoB,KAAK7G,QAAQ1L,OAAhB,IAA0B2E,GAASkjB,UAAnC,KACG,KAAKnc,QAAQ1L,OADhB,IAC0B2E,GAASojB,WADnC,MAEG,KAAKrc,QAAQ1L,OAFhB,IAE0B2E,GAASsjB,gBACzD,KAAKO,SAAiB,CAAA,EACtB,KAAKC,SAAiB,CAAA,EACtB,KAAKC,cAAiB,KACtB,KAAKC,cAAiB,EAEtB5oB,EAAE,KAAKwoB,cAAN,EAAsBxhB,GAAGlC,GAAM2iB,OAAQ,SAAC1nB,EAAD,CAAA,OAAWU,EAAKooB,SAAS9oB,CAAd,CAAX,CAAxC,EAEA,KAAK+oB,QAAL,EACA,KAAKD,SAAL,CACD,4BAcDC,QAAA,UAAU,CAAA,IAAAnb,EAAA,KACFob,EAAa,KAAKP,iBAAmB,KAAKA,eAAetc,OAC3Dkc,GAAaC,OAASD,GAAaE,SAEjCU,EAAe,KAAKrd,QAAQ4b,SAAW,OACzCwB,EAAa,KAAKpd,QAAQ4b,OAExB0B,EAAaD,IAAiBZ,GAAaE,SAC7C,KAAKY,cAAL,EAAuB,EAE3B,KAAKT,SAAW,CAAA,EAChB,KAAKC,SAAW,CAAA,EAEhB,KAAKE,cAAgB,KAAKO,iBAAL,EAErB,IAAMC,EAAU,CAAA,EAAGxa,MAAMpP,KAAK+B,SAASgN,iBAAiB,KAAKiE,SAA/B,CAAd,EAEhB4W,EACGC,IAAI,SAAC3nB,EAAY,CAChB,IAAIzB,GACEqpB,GAAiB1oB,EAAKa,uBAAuBC,CAA5B,EAMvB,GAJI4nB,KACFrpB,GAASsB,SAASQ,cAAcunB,EAAvB,GAGPrpB,GAAQ,CACV,IAAMspB,GAAYtpB,GAAO0T,sBAAP,EAClB,GAAI4V,GAAUrL,OAASqL,GAAUC,OAE/B,MAAO,CACLxpB,EAAEC,EAAD,EAAS+oB,CAAV,EAAA,EAA0BS,IAAMR,EAChCK,EAFK,CAKV,CACD,OAAO,IACR,CApBH,EAqBGhX,OAAO,SAACoX,EAAD,CAAA,OAAUA,CAAV,CArBV,EAsBGC,KAAK,SAAClL,EAAGE,GAAJ,CAAA,OAAUF,EAAE,CAAD,EAAME,GAAE,CAAD,CAAlB,CAtBR,EAuBG1D,QAAQ,SAACyO,EAAS,CACjB/b,EAAK8a,SAAShW,KAAKiX,EAAK,CAAD,CAAvB,EACA/b,EAAK+a,SAASjW,KAAKiX,EAAK,CAAD,CAAvB,CACD,CA1BH,CA2BD,IAED3jB,QAAA,UAAU,CACR/F,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EACAxE,EAAE,KAAKwoB,cAAN,EAAsBlb,IAAI7I,EAA3B,EAEA,KAAKc,SAAiB,KACtB,KAAKijB,eAAiB,KACtB,KAAK7c,QAAiB,KACtB,KAAK6G,UAAiB,KACtB,KAAKiW,SAAiB,KACtB,KAAKC,SAAiB,KACtB,KAAKC,cAAiB,KACtB,KAAKC,cAAiB,IACvB,IAIDhd,WAAA,SAAW1I,EAAQ,CAMjB,GALAA,EAAMqK,EAAA,CAAA,EACD1E,GACA,OAAO3F,GAAW,UAAYA,EAASA,EAAS,CAAA,CAF/C,EAKF,OAAOA,EAAOjD,QAAW,SAAU,CACrC,IAAIiS,EAAKlS,EAAEkD,EAAOjD,MAAR,EAAgBqT,KAAK,IAAtB,EACJpB,IACHA,EAAKtR,EAAKO,OAAOmD,EAAZ,EACLtE,EAAEkD,EAAOjD,MAAR,EAAgBqT,KAAK,KAAMpB,CAA5B,GAEFhP,EAAOjD,OAAP,IAAoBiS,CACrB,CAEDtR,OAAAA,EAAKoC,gBAAgBsB,GAAMpB,EAAQkG,EAAnC,EAEOlG,CACR,IAEDgmB,cAAA,UAAgB,CACd,OAAO,KAAKV,iBAAmBtc,OAC3B,KAAKsc,eAAeoB,YAAc,KAAKpB,eAAehN,SAC3D,IAED2N,iBAAA,UAAmB,CACjB,OAAO,KAAKX,eAAe5L,cAAgBvb,KAAKwoB,IAC9CtoB,SAASiW,KAAKoF,aACdrb,SAASyC,gBAAgB4Y,YAFgB,CAI5C,IAEDkN,iBAAA,UAAmB,CACjB,OAAO,KAAKtB,iBAAmBtc,OAC3BA,OAAO6d,YAAc,KAAKvB,eAAe7U,sBAApB,EAA4C6V,MACtE,IAEDX,SAAA,UAAW,CACT,IAAMrN,EAAe,KAAK0N,cAAL,EAAuB,KAAKvd,QAAQ0K,OACnDuG,EAAe,KAAKuM,iBAAL,EACfa,EAAe,KAAKre,QAAQ0K,OAChCuG,EACA,KAAKkN,iBAAL,EAMF,GAJI,KAAKlB,gBAAkBhM,GACzB,KAAKkM,QAAL,EAGEtN,GAAawO,EAAW,CAC1B,IAAM/pB,EAAS,KAAKyoB,SAAS,KAAKA,SAAStb,OAAS,CAArC,EAEX,KAAKub,gBAAkB1oB,GACzB,KAAKgqB,UAAUhqB,CAAf,EAEF,MACD,CAED,GAAI,KAAK0oB,eAAiBnN,EAAY,KAAKiN,SAAS,CAAd,GAAoB,KAAKA,SAAS,CAAd,EAAmB,EAAG,CAC9E,KAAKE,cAAgB,KACrB,KAAKuB,OAAL,EACA,MACD,CAGD,QADMC,EAAe,KAAK1B,SAASrb,OAC1B8D,EAAIiZ,EAAcjZ,KAAM,CAC/B,IAAMkZ,GAAiB,KAAKzB,gBAAkB,KAAKD,SAASxX,CAAd,GAC1CsK,GAAa,KAAKiN,SAASvX,CAAd,IACZ,OAAO,KAAKuX,SAASvX,EAAI,CAAlB,GAAyB,aAC7BsK,EAAY,KAAKiN,SAASvX,EAAI,CAAlB,GAEhBkZ,IACF,KAAKH,UAAU,KAAKvB,SAASxX,CAAd,CAAf,CAEH,CACF,IAED+Y,UAAA,SAAUhqB,EAAQ,CAChB,KAAK0oB,cAAgB1oB,EAErB,KAAKiqB,OAAL,EAEA,IAAMG,EAAU,KAAK7X,UAClBhQ,MAAM,GADO,EAEb6mB,IAAI,SAAC1nB,EAAD,CAAA,OAAiBA,EAAjB,iBAA0C1B,EAA1C,MAAsD0B,EAAtD,UAAwE1B,EAAxE,IAAA,CAFS,EAIVqqB,EAAQtqB,EAAE,CAAA,EAAG4O,MAAMpP,KAAK+B,SAASgN,iBAAiB8b,EAAQxD,KAAK,GAAb,CAA1B,CAAd,CAAD,EAEXyD,EAAMjkB,SAASnB,GAAUwiB,aAAzB,GACF4C,EAAMpkB,QAAQtB,GAASqjB,QAAvB,EAAiC/B,KAAKthB,GAASujB,eAA/C,EAAgEnY,SAAS9K,GAAUiC,MAAnF,EACAmjB,EAAMta,SAAS9K,GAAUiC,MAAzB,IAGAmjB,EAAMta,SAAS9K,GAAUiC,MAAzB,EAGAmjB,EAAMC,QAAQ3lB,GAASijB,cAAvB,EAAuCnb,KAAQ9H,GAASkjB,UAAxD,KAAsEljB,GAASojB,UAA/E,EAA6FhY,SAAS9K,GAAUiC,MAAhH,EAEAmjB,EAAMC,QAAQ3lB,GAASijB,cAAvB,EAAuCnb,KAAK9H,GAASmjB,SAArD,EAAgEhY,SAASnL,GAASkjB,SAAlF,EAA6F9X,SAAS9K,GAAUiC,MAAhH,GAGFnH,EAAE,KAAKwoB,cAAN,EAAsB7lB,QAAQmC,GAAM0iB,SAAU,CAC7ClY,cAAerP,CAD8B,CAA/C,CAGD,IAEDiqB,OAAA,UAAS,CACP,CAAA,EAAGtb,MAAMpP,KAAK+B,SAASgN,iBAAiB,KAAKiE,SAA/B,CAAd,EACGF,OAAO,SAACkY,EAAD,CAAA,OAAUA,EAAKviB,UAAUC,SAAShD,GAAUiC,MAAlC,CAAV,CADV,EAEG8T,QAAQ,SAACuP,EAAD,CAAA,OAAUA,EAAKviB,UAAUzB,OAAOtB,GAAUiC,MAAhC,CAAV,CAFX,CAGD,IAIMV,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAIE,EAAO5G,EAAE,IAAD,EAAO4G,KAAKpC,EAAb,EACLmH,EAAU,OAAOzI,GAAW,UAAYA,EAO9C,GALK0D,IACHA,EAAO,IAAI2hB,EAAU,KAAM5c,CAApB,EACP3L,EAAE,IAAD,EAAO4G,KAAKpC,GAAUoC,CAAvB,GAGE,OAAO1D,GAAW,SAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAAJ,CACD,CACF,CAfM,CAgBR,yCA1MoB,CACnB,OAAOqB,EACR,gCAEoB,CACnB,OAAOsE,EACR,WA6MH7I,EAAEkM,MAAD,EAASlF,GAAGlC,GAAMuF,cAAe,UAAM,CAItC,QAHMogB,EAAa,CAAA,EAAG7b,MAAMpP,KAAK+B,SAASgN,iBAAiB3J,GAASgjB,QAAnC,CAAd,EACb8C,EAAmBD,EAAWrd,OAE3B8D,EAAIwZ,EAAkBxZ,KAAM,CACnC,IAAMyZ,EAAO3qB,EAAEyqB,EAAWvZ,CAAD,CAAX,EACdqX,GAAU9hB,iBAAiBjH,KAAKmrB,EAAMA,EAAK/jB,KAAL,CAAtC,CACD,CACF,CARD,EAgBA5G,EAAEgB,GAAGsD,EAAL,EAAaikB,GAAU9hB,iBACvBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAcshB,GACzBvoB,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACN4jB,GAAU9hB,gBAClB,ECnTD,IAAMnC,GAAqB,MACrBC,GAAqB,QACrBC,GAAqB,SACrBC,GAAS,IAAgBD,GACzBE,GAAqB,YACrBC,GAAqB3E,EAAEgB,GAAGsD,EAAL,EAErBQ,GAAQ,CACZwM,KAAI,OAAoB7M,GACxB8M,OAAM,SAAoB9M,GAC1BY,KAAI,OAAoBZ,GACxB4M,MAAK,QAAoB5M,GACzBQ,eAAc,QAAWR,GAAYC,EALzB,EAQRQ,GAAY,CAChByiB,cAAgB,gBAChBxgB,OAAgB,SAChBgO,SAAgB,WAChB/P,KAAgB,OAChBC,KAAgB,MALA,EAQZT,GAAW,CACfqjB,SAAwB,YACxBJ,eAAwB,oBACxB1gB,OAAwB,UACxByjB,UAAwB,iBACxBrjB,YAAwB,kEACxB4gB,gBAAwB,mBACxB0C,sBAAwB,0BAPT,EAgBXC,eACJ,SAAAA,EAAYppB,EAAS,CACnB,KAAK6D,SAAW7D,CACjB,4BAUDoR,KAAA,UAAO,CAAA,IAAArS,EAAA,KACL,GAAI,OAAK8E,SAASlB,YACd,KAAKkB,SAASlB,WAAWtB,WAAaqY,KAAKC,cAC3Crb,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUiC,MAApC,GACAnH,EAAE,KAAKuF,QAAN,EAAgBc,SAASnB,GAAUiQ,QAApC,GAIJ,KAAIlV,EACA8qB,EACEC,EAAchrB,EAAE,KAAKuF,QAAN,EAAgBW,QAAQtB,GAASijB,cAAlC,EAAkD,CAAlD,EACdlmB,EAAWf,EAAKa,uBAAuB,KAAK8D,QAAjC,EAEjB,GAAIylB,EAAa,CACf,IAAMC,EAAeD,EAAYtK,WAAa,MAAQsK,EAAYtK,WAAa,KAAO9b,GAASgmB,UAAYhmB,GAASuC,OACpH4jB,EAAW/qB,EAAEkrB,UAAUlrB,EAAEgrB,CAAD,EAAc9E,KAAK+E,CAApB,CAAZ,EACXF,EAAWA,EAASA,EAAS3d,OAAS,CAAnB,CACpB,CAED,IAAMsK,GAAY1X,EAAE8E,MAAMA,GAAMwM,KAAM,CACpChC,cAAe,KAAK/J,QADgB,CAApB,EAIZ6R,GAAYpX,EAAE8E,MAAMA,GAAMO,KAAM,CACpCiK,cAAeyb,CADqB,CAApB,EAUlB,GANIA,GACF/qB,EAAE+qB,CAAD,EAAWpoB,QAAQ+U,EAApB,EAGF1X,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQyU,EAAzB,EAEIA,EAAAA,GAAUvR,mBAAV,GACA6R,GAAU7R,mBAAV,GAIJ,CAAIlE,IACF1B,EAASsB,SAASQ,cAAcJ,CAAvB,GAGX,KAAKsoB,UACH,KAAK1kB,SACLylB,CAFF,EAKA,IAAMxX,GAAW,UAAM,CACrB,IAAM2X,GAAcnrB,EAAE8E,MAAMA,GAAMyM,OAAQ,CACxCjC,cAAe7O,EAAK8E,QADoB,CAAtB,EAIdmW,GAAa1b,EAAE8E,MAAMA,GAAMuM,MAAO,CACtC/B,cAAeyb,CADuB,CAArB,EAInB/qB,EAAE+qB,CAAD,EAAWpoB,QAAQwoB,EAApB,EACAnrB,EAAES,EAAK8E,QAAN,EAAgB5C,QAAQ+Y,EAAzB,CACD,EAEGzb,EACF,KAAKgqB,UAAUhqB,EAAQA,EAAOoE,WAAYmP,EAA1C,EAEAA,GAAQ,GAEX,IAEDzN,QAAA,UAAU,CACR/F,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EACA,KAAKe,SAAW,IACjB,IAID0kB,UAAA,SAAUvoB,EAASghB,EAAWvG,EAAU,CAAA,IAAAxO,EAAA,KAChCyd,EAAiB1I,IAAcA,EAAUhC,WAAa,MAAQgC,EAAUhC,WAAa,MACvF1gB,EAAE0iB,CAAD,EAAYwD,KAAKthB,GAASgmB,SAA3B,EACA5qB,EAAE0iB,CAAD,EAAY3S,SAASnL,GAASuC,MAA/B,EAEEkkB,EAASD,EAAe,CAAD,EACvBtX,GAAkBqI,GAAakP,GAAUrrB,EAAEqrB,CAAD,EAAShlB,SAASnB,GAAUE,IAA7B,EACzCoO,GAAW,UAAA,CAAA,OAAM7F,EAAK2d,oBAC1B5pB,EACA2pB,EACAlP,CAHqB,CAAN,EAMjB,GAAIkP,GAAUvX,GAAiB,CAC7B,IAAM5R,GAAqBtB,EAAKqB,iCAAiCopB,CAAtC,EAE3BrrB,EAAEqrB,CAAD,EACEjlB,YAAYlB,GAAUG,IADzB,EAEG1E,IAAIC,EAAK1B,eAAgBsU,EAF5B,EAGGvS,qBAAqBiB,EAHxB,CAID,MACCsR,GAAQ,CAEX,IAED8X,oBAAA,SAAoB5pB,EAAS2pB,EAAQlP,EAAU,CAC7C,GAAIkP,EAAQ,CACVrrB,EAAEqrB,CAAD,EAASjlB,YAAYlB,GAAUiC,MAAhC,EAEA,IAAMokB,EAAgBvrB,EAAEqrB,EAAOhnB,UAAR,EAAoB6hB,KACzCthB,GAASimB,qBADW,EAEpB,CAFoB,EAIlBU,GACFvrB,EAAEurB,CAAD,EAAgBnlB,YAAYlB,GAAUiC,MAAvC,EAGEkkB,EAAOzpB,aAAa,MAApB,IAAgC,OAClCypB,EAAO/iB,aAAa,gBAAiB,EAArC,CAEH,CAaD,GAXAtI,EAAE0B,CAAD,EAAUsO,SAAS9K,GAAUiC,MAA9B,EACIzF,EAAQE,aAAa,MAArB,IAAiC,OACnCF,EAAQ4G,aAAa,gBAAiB,EAAtC,EAGF1H,EAAK6B,OAAOf,CAAZ,EAEIA,EAAQuG,UAAUC,SAAShD,GAAUE,IAArC,GACF1D,EAAQuG,UAAUwG,IAAIvJ,GAAUG,IAAhC,EAGE3D,EAAQ2C,YAAcrE,EAAE0B,EAAQ2C,UAAT,EAAqBgC,SAASnB,GAAUyiB,aAAzC,EAAyD,CACjF,IAAM6D,EAAkBxrB,EAAE0B,CAAD,EAAUwE,QAAQtB,GAASqjB,QAA5B,EAAsC,CAAtC,EAExB,GAAIuD,EAAiB,CACnB,IAAMC,EAAqB,CAAA,EAAG7c,MAAMpP,KAAKgsB,EAAgBjd,iBAAiB3J,GAASujB,eAA1C,CAAd,EAE3BnoB,EAAEyrB,CAAD,EAAqBzb,SAAS9K,GAAUiC,MAAzC,CACD,CAEDzF,EAAQ4G,aAAa,gBAAiB,EAAtC,CACD,CAEG6T,GACFA,EAAQ,CAEX,IAIM1V,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAM0N,EAAQpU,EAAE,IAAD,EACX4G,EAAOwN,EAAMxN,KAAKpC,EAAX,EAOX,GALKoC,IACHA,EAAO,IAAIkkB,EAAI,IAAR,EACP1W,EAAMxN,KAAKpC,GAAUoC,CAArB,GAGE,OAAO1D,GAAW,SAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAER0D,EAAK1D,CAAD,EAAJ,CACD,CACF,CAfM,CAgBR,yCAzKoB,CACnB,OAAOqB,EACR,WAgLHvE,EAAEuB,QAAD,EACEyF,GAAGlC,GAAMG,eAAgBL,GAAS2C,YAAa,SAAUxH,EAAO,CAC/DA,EAAMgH,eAAN,EACA+jB,GAAIrkB,iBAAiBjH,KAAKQ,EAAE,IAAD,EAAQ,MAAnC,CACD,CAJH,EAYAA,EAAEgB,GAAGsD,EAAL,EAAawmB,GAAIrkB,iBACjBzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAc6jB,GACzB9qB,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAa,UAAM,CAC5BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACNmmB,GAAIrkB,gBACZ,ECjPD,IAAMnC,GAAqB,QACrBC,GAAqB,QACrBC,GAAqB,WACrBC,GAAS,IAAgBD,GACzBG,GAAqB3E,EAAEgB,GAAGsD,EAAL,EAErBQ,GAAQ,CACZsU,cAAa,gBAAmB3U,GAChC6M,KAAI,OAAmB7M,GACvB8M,OAAM,SAAmB9M,GACzBY,KAAI,OAAmBZ,GACvB4M,MAAK,QAAmB5M,EALZ,EAQRS,EAAY,CAChBE,KAAU,OACVkM,KAAU,OACVjM,KAAU,OACVqmB,QAAU,SAJM,EAOZtiB,EAAc,CAClBiZ,UAAY,UACZsJ,SAAY,UACZnJ,MAAY,QAHM,EAMd3Z,EAAU,CACdwZ,UAAY,GACZsJ,SAAY,GACZnJ,MAAY,GAHE,EAMV5d,EAAW,CACfkV,aAAe,wBADA,EAUX8R,cACJ,SAAAA,EAAYlqB,EAASwB,EAAQ,CAC3B,KAAKqC,SAAW7D,EAChB,KAAKiK,QAAW,KAAKC,WAAW1I,CAAhB,EAChB,KAAKwgB,SAAW,KAChB,KAAKI,cAAL,CACD,4BAkBDhR,KAAA,UAAO,CAAA,IAAArS,EAAA,KACLT,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQmC,GAAMO,IAA/B,EAEI,KAAKsG,QAAQ0W,WACf,KAAK9c,SAAS0C,UAAUwG,IAAIvJ,EAAUE,IAAtC,EAGF,IAAMoO,EAAW,UAAM,CACrB/S,EAAK8E,SAAS0C,UAAUzB,OAAOtB,EAAUwmB,OAAzC,EACAjrB,EAAK8E,SAAS0C,UAAUwG,IAAIvJ,EAAUG,IAAtC,EAEArF,EAAES,EAAK8E,QAAN,EAAgB5C,QAAQmC,GAAMuM,KAA/B,EAEI5Q,EAAKkL,QAAQggB,UACflrB,EAAKoS,KAAL,CAEH,EAID,GAFA,KAAKtN,SAAS0C,UAAUzB,OAAOtB,EAAUoM,IAAzC,EACA,KAAK/L,SAAS0C,UAAUwG,IAAIvJ,EAAUwmB,OAAtC,EACI,KAAK/f,QAAQ0W,UAAW,CAC1B,IAAMngB,EAAqBtB,EAAKqB,iCAAiC,KAAKsD,QAA3C,EAE3BvF,EAAE,KAAKuF,QAAN,EACE5E,IAAIC,EAAK1B,eAAgBsU,CAD5B,EAEGvS,qBAAqBiB,CAFxB,CAGD,MACCsR,EAAQ,CAEX,IAEDX,KAAA,SAAKgZ,EAAgB,CAAA,IAAAle,EAAA,KACd,KAAKpI,SAAS0C,UAAUC,SAAShD,EAAUG,IAA3C,IAILrF,EAAE,KAAKuF,QAAN,EAAgB5C,QAAQmC,GAAMwM,IAA/B,EAEIua,EACF,KAAKC,OAAL,EAEA,KAAKpI,SAAW7iB,WAAW,UAAM,CAC/B8M,EAAKme,OAAL,CACD,EAAE,KAAKngB,QAAQ6W,KAFU,EAI7B,IAEDzc,QAAA,UAAU,CACRuI,aAAa,KAAKoV,QAAN,EACZ,KAAKA,SAAW,KAEZ,KAAKne,SAAS0C,UAAUC,SAAShD,EAAUG,IAA3C,GACF,KAAKE,SAAS0C,UAAUzB,OAAOtB,EAAUG,IAAzC,EAGFrF,EAAE,KAAKuF,QAAN,EAAgB+H,IAAIxI,GAAMsU,aAA3B,EAEApZ,EAAEgG,WAAW,KAAKT,SAAUf,EAA5B,EACA,KAAKe,SAAW,KAChB,KAAKoG,QAAW,IACjB,IAIDC,WAAA,SAAW1I,EAAQ,CACjBA,OAAAA,EAAMqK,EAAA,CAAA,EACD1E,EACA7I,EAAE,KAAKuF,QAAN,EAAgBqB,KAAjB,EACA,OAAO1D,GAAW,UAAYA,EAASA,EAAS,CAAA,CAH/C,EAMNtC,EAAKoC,gBACHsB,GACApB,EACA,KAAK6U,YAAY3O,WAHnB,EAMOlG,CACR,IAED4gB,cAAA,UAAgB,CAAA,IAAAhW,EAAA,KACd9N,EAAE,KAAKuF,QAAN,EAAgByB,GACflC,GAAMsU,cACNxU,EAASkV,aACT,UAAA,CAAA,OAAMhM,EAAK+E,KAAK,EAAV,CAAN,CAHF,CAKD,IAEDiZ,OAAA,UAAS,CAAA,IAAA7b,EAAA,KACDuD,EAAW,UAAM,CACrBvD,EAAK1K,SAAS0C,UAAUwG,IAAIvJ,EAAUoM,IAAtC,EACAtR,EAAEiQ,EAAK1K,QAAN,EAAgB5C,QAAQmC,GAAMyM,MAA/B,CACD,EAGD,GADA,KAAKhM,SAAS0C,UAAUzB,OAAOtB,EAAUG,IAAzC,EACI,KAAKsG,QAAQ0W,UAAW,CAC1B,IAAMngB,EAAqBtB,EAAKqB,iCAAiC,KAAKsD,QAA3C,EAE3BvF,EAAE,KAAKuF,QAAN,EACE5E,IAAIC,EAAK1B,eAAgBsU,CAD5B,EAEGvS,qBAAqBiB,CAFxB,CAGD,MACCsR,EAAQ,CAEX,IAIM/M,iBAAP,SAAwBvD,EAAQ,CAC9B,OAAO,KAAKwD,KAAK,UAAY,CAC3B,IAAMC,EAAW3G,EAAE,IAAD,EACd4G,EAAaD,EAASC,KAAKpC,EAAd,EACXmH,EAAW,OAAOzI,GAAW,UAAYA,EAO/C,GALK0D,IACHA,EAAO,IAAIglB,EAAM,KAAMjgB,CAAhB,EACPhF,EAASC,KAAKpC,GAAUoC,CAAxB,GAGE,OAAO1D,GAAW,SAAU,CAC9B,GAAI,OAAO0D,EAAK1D,CAAD,GAAa,YAC1B,MAAM,IAAI2N,UAAJ,oBAAkC3N,EAAlC,GAAA,EAGR0D,EAAK1D,CAAD,EAAS,IAAb,CACD,CACF,CAjBM,CAkBR,yCA7IoB,CACnB,OAAOqB,EACR,oCAEwB,CACvB,OAAO6E,CACR,gCAEoB,CACnB,OAAOP,CACR,WA4IH7I,EAAEgB,GAAGsD,EAAL,EAAyBsnB,EAAMnlB,iBAC/BzG,EAAEgB,GAAGsD,EAAL,EAAW2C,YAAc2kB,EACzB5rB,EAAEgB,GAAGsD,EAAL,EAAW4C,WAAc,UAAM,CAC7BlH,OAAAA,EAAEgB,GAAGsD,EAAL,EAAaK,GACNinB,EAAMnlB,gBACd,GC3MA,UAAM,CACL,GAAI,OAAOzG,GAAM,YACf,MAAM,IAAI6Q,UAAU,gGAAd,EAGR,IAAMkb,EAAU/rB,EAAEgB,GAAGgT,OAAOxR,MAAM,GAAlB,EAAuB,CAAvB,EAA0BA,MAAM,GAAhC,EACVwpB,EAAW,EACXC,EAAU,EACVC,EAAW,EACXC,EAAW,EACXC,EAAW,EAEjB,GAAIL,EAAQ,CAAD,EAAME,GAAWF,EAAQ,CAAD,EAAMG,GAAYH,EAAQ,CAAD,IAAQC,GAAYD,EAAQ,CAAD,IAAQG,GAAYH,EAAQ,CAAD,EAAMI,GAAYJ,EAAQ,CAAD,GAAOK,EAChJ,MAAM,IAAIvoB,MAAM,6EAAV,CAET,GAfD,uMCnBA,IAAAwoB,GAAmB,SAEnB,OAAO,EAAI,OAAO,OAAS,GAAAC,QCJ3B,IAAAC,GAAA,GAAAC,GAAAD,GAAA,kBAAAE,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,wBAAAC,GAAA,UAAAC,GAAA,WAAAC,GAAA,wBAAAC,GAAA,2BAAAC,GAAA,UAAAC,GAAA,2BAAAC,GAAA,0BAAAC,GAAA,WAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,4BAAAC,GAAA,cAAAC,GAAA,oBAAAC,GAAA,wBAAAC,GAAA,YAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,wBAAAC,GAAA,UAAAC,GAAA,UAAAC,KAIA,IAAMC,GAAoB,CACxB,MAAO,QACP,KAAM,MACR,EAkBMC,GAAN,MAAMA,WAAqB,WAAY,CASrC,aAAc,CACZ,MAAM,EAPRC,GAAA,cAAS,QAAQ,QAAQ,GAQvB,KAAK,SAAW,IAAID,GAAa,oBAAoB,IAAI,CAC3D,CAPA,WAAW,oBAAqB,CAC9B,MAAO,CAAC,WAAY,UAAW,KAAK,CACtC,CAOA,mBAAoB,CAClB,KAAK,SAAS,QAAQ,CACxB,CAEA,sBAAuB,CACrB,KAAK,SAAS,WAAW,CAC3B,CAEA,QAAS,CACP,OAAO,KAAK,SAAS,kBAAkB,CACzC,CAEA,yBAAyBE,EAAM,CACzBA,GAAQ,UACV,KAAK,SAAS,oBAAoB,EACzBA,GAAQ,MACjB,KAAK,SAAS,iBAAiB,EACtBA,GAAQ,YACjB,KAAK,SAAS,gBAAgB,CAElC,CAKA,IAAI,KAAM,CACR,OAAO,KAAK,aAAa,KAAK,CAChC,CAKA,IAAI,IAAIC,EAAO,CACTA,EACF,KAAK,aAAa,MAAOA,CAAK,EAE9B,KAAK,gBAAgB,KAAK,CAE9B,CAKA,IAAI,SAAU,CACZ,OAAO,KAAK,aAAa,SAAS,CACpC,CAKA,IAAI,QAAQA,EAAO,CACbA,EACF,KAAK,aAAa,UAAWA,CAAK,EAElC,KAAK,gBAAgB,SAAS,CAElC,CAEA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,KAAO,KAAK,UAAY,OACtC,CAKA,IAAI,SAAU,CACZ,OAAOC,GAA4B,KAAK,aAAa,SAAS,GAAK,EAAE,CACvE,CAKA,IAAI,QAAQD,EAAO,CACbA,EACF,KAAK,aAAa,UAAWA,CAAK,EAElC,KAAK,gBAAgB,SAAS,CAElC,CAOA,IAAI,UAAW,CACb,OAAO,KAAK,aAAa,UAAU,CACrC,CAOA,IAAI,SAASA,EAAO,CACdA,EACF,KAAK,aAAa,WAAY,EAAE,EAEhC,KAAK,gBAAgB,UAAU,CAEnC,CAOA,IAAI,YAAa,CACf,OAAO,KAAK,aAAa,YAAY,CACvC,CAOA,IAAI,WAAWA,EAAO,CAChBA,EACF,KAAK,aAAa,aAAc,EAAE,EAElC,KAAK,gBAAgB,YAAY,CAErC,CAKA,IAAI,UAAW,CACb,MAAO,CAAC,KAAK,SAAS,SACxB,CAOA,IAAI,UAAW,CACb,OAAO,KAAK,gBAAkB,UAAY,CAAC,KAAK,SAClD,CAOA,IAAI,WAAY,CAxLlB,IAAAE,EAAAC,EAyLI,OAAOA,GAAAD,EAAA,KAAK,gBAAL,YAAAA,EAAoB,kBAApB,YAAAC,EAAqC,aAAa,qBAC3D,CACF,EAjKEL,GADID,GACG,uBADT,IAAMO,GAANP,GAoKA,SAASI,GAA4BI,EAAO,CAC1C,OAAQA,EAAM,YAAY,IACnB,OACIT,GAAkB,KAElBA,GAAkB,KAE/B,CAEA,IAAMU,GAAQ,CACZ,QAAS,GACT,iBAAkB,IAClB,sBAAuB,IAAI,IACzB,CACE,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAC/E,QAAS,OAAQ,OAAQ,MAAO,QAAS,QAAS,OAAQ,OAAQ,QAAS,OAC3E,MAAO,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OACzE,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OACjE,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAAS,QAAS,OAAQ,OAC3E,OAAQ,QAAS,OAAQ,MAC3B,CACF,CACF,EAEA,SAASC,GAAsBC,EAAS,CACtC,GAAIA,EAAQ,aAAa,iBAAiB,GAAK,QAC7C,OAAOA,EACF,CACL,IAAMC,EAAuB,SAAS,cAAc,QAAQ,EACtDC,EAAWC,GAAY,EAC7B,OAAID,IACFD,EAAqB,MAAQC,GAE/BD,EAAqB,YAAcD,EAAQ,YAC3CC,EAAqB,MAAQ,GAC7BG,GAAsBH,EAAsBD,CAAO,EAC5CC,CACT,CACF,CAEA,SAASG,GAAsBC,EAAoBC,EAAe,CAChE,OAAW,CAAE,KAAAf,EAAM,MAAAC,CAAM,IAAKc,EAAc,WAC1CD,EAAmB,aAAad,EAAMC,CAAK,CAE/C,CAEA,SAASe,GAAuBC,EAAM,CACpC,IAAMC,EAAW,SAAS,cAAc,UAAU,EAClD,OAAAA,EAAS,UAAYD,EACdC,EAAS,OAClB,CAEA,SAASC,GAASC,EAAW,CAAE,OAAAC,EAAQ,WAAAC,EAAY,OAAAC,CAAO,EAAI,CAAC,EAAG,CAChE,IAAMC,EAAQ,IAAI,YAAYJ,EAAW,CACvC,WAAAE,EACA,QAAS,GACT,SAAU,GACV,OAAAC,CACF,CAAC,EAED,OAAIF,GAAUA,EAAO,YACnBA,EAAO,cAAcG,CAAK,EAE1B,SAAS,gBAAgB,cAAcA,CAAK,EAGvCA,CACT,CAEA,SAASC,GAAYD,EAAO,CAC1BA,EAAM,eAAe,EACrBA,EAAM,yBAAyB,CACjC,CAEA,SAASE,IAAc,CACrB,OAAI,SAAS,kBAAoB,SACxBC,GAAkB,EAElBC,GAAmB,CAE9B,CAEA,SAASA,IAAqB,CAC5B,OAAO,IAAI,QAASC,GAAY,sBAAsB,IAAMA,EAAQ,CAAC,CAAC,CACxE,CAEA,SAASF,IAAoB,CAC3B,OAAO,IAAI,QAASE,GAAY,WAAW,IAAMA,EAAQ,EAAG,CAAC,CAAC,CAChE,CAEA,SAASC,GAAkBb,EAAO,GAAI,CACpC,OAAO,IAAI,UAAU,EAAE,gBAAgBA,EAAM,WAAW,CAC1D,CAEA,SAASc,GAASC,KAAYC,EAAQ,CACpC,IAAMC,EAAQC,GAAYH,EAASC,CAAM,EAAE,QAAQ,MAAO,EAAE,EAAE,MAAM;AAAA,CAAI,EAClEG,EAAQF,EAAM,CAAC,EAAE,MAAM,MAAM,EAC7BG,EAASD,EAAQA,EAAM,CAAC,EAAE,OAAS,EACzC,OAAOF,EAAM,IAAKI,GAASA,EAAK,MAAMD,CAAM,CAAC,EAAE,KAAK;AAAA,CAAI,CAC1D,CAEA,SAASF,GAAYH,EAASC,EAAQ,CACpC,OAAOD,EAAQ,OAAO,CAACO,EAAQC,EAAQC,IAAM,CAC3C,IAAMxC,EAAQgC,EAAOQ,CAAC,GAAK,KAAY,GAAKR,EAAOQ,CAAC,EACpD,OAAOF,EAASC,EAASvC,CAC3B,EAAG,EAAE,CACP,CAEA,SAASyC,IAAO,CACd,OAAO,MAAM,KAAK,CAAE,OAAQ,EAAG,CAAC,EAC7B,IAAI,CAACC,EAAGF,IACHA,GAAK,GAAKA,GAAK,IAAMA,GAAK,IAAMA,GAAK,GAChC,IACEA,GAAK,GACP,IACEA,GAAK,IACN,KAAK,MAAM,KAAK,OAAO,EAAI,CAAC,EAAI,GAAG,SAAS,EAAE,EAE/C,KAAK,MAAM,KAAK,OAAO,EAAI,EAAE,EAAE,SAAS,EAAE,CAEpD,EACA,KAAK,EAAE,CACZ,CAEA,SAASG,GAAaC,KAAkBC,EAAU,CAChD,QAAW7C,KAAS6C,EAAS,IAAKrC,GAAYA,GAAA,YAAAA,EAAS,aAAaoC,EAAc,EAChF,GAAI,OAAO5C,GAAS,SAAU,OAAOA,EAGvC,OAAO,IACT,CAEA,SAAS8C,GAAaF,KAAkBC,EAAU,CAChD,OAAOA,EAAS,KAAMrC,GAAYA,GAAWA,EAAQ,aAAaoC,CAAa,CAAC,CAClF,CAEA,SAASG,MAAcF,EAAU,CAC/B,QAAWrC,KAAWqC,EAChBrC,EAAQ,WAAa,eACvBA,EAAQ,aAAa,OAAQ,EAAE,EAEjCA,EAAQ,aAAa,YAAa,MAAM,CAE5C,CAEA,SAASwC,MAAkBH,EAAU,CACnC,QAAWrC,KAAWqC,EAChBrC,EAAQ,WAAa,eACvBA,EAAQ,gBAAgB,MAAM,EAGhCA,EAAQ,gBAAgB,WAAW,CAEvC,CAEA,SAASyC,GAAYzC,EAAS0C,EAAwB,IAAM,CAC1D,OAAO,IAAI,QAAStB,GAAY,CAC9B,IAAMuB,EAAa,IAAM,CACvB3C,EAAQ,oBAAoB,QAAS2C,CAAU,EAC/C3C,EAAQ,oBAAoB,OAAQ2C,CAAU,EAC9CvB,EAAQ,CACV,EAEApB,EAAQ,iBAAiB,OAAQ2C,EAAY,CAAE,KAAM,EAAK,CAAC,EAC3D3C,EAAQ,iBAAiB,QAAS2C,EAAY,CAAE,KAAM,EAAK,CAAC,EAC5D,WAAWvB,EAASsB,CAAqB,CAC3C,CAAC,CACH,CAEA,SAASE,GAA0BC,EAAQ,CACzC,OAAQA,EAAQ,CACd,IAAK,UACH,OAAO,QAAQ,aACjB,IAAK,UACL,IAAK,UACH,OAAO,QAAQ,SACnB,CACF,CAEA,SAASC,GAASD,EAAQ,CACxB,OAAOA,GAAU,WAAaA,GAAU,WAAaA,GAAU,SACjE,CAEA,SAASE,MAAkBV,EAAU,CACnC,IAAMQ,EAASV,GAAa,oBAAqB,GAAGE,CAAQ,EAE5D,OAAOS,GAASD,CAAM,EAAIA,EAAS,IACrC,CAEA,SAASG,GAAezD,EAAM,CAC5B,OAAO,SAAS,cAAc,cAAcA,CAAI,IAAI,CACtD,CAEA,SAAS0D,GAAe1D,EAAM,CAC5B,IAAMS,EAAUgD,GAAezD,CAAI,EACnC,OAAOS,GAAWA,EAAQ,OAC5B,CAEA,SAASG,IAAc,CACrB,IAAMH,EAAUgD,GAAe,WAAW,EAE1C,GAAIhD,EAAS,CACX,GAAM,CAAE,MAAAkD,EAAO,QAAAC,CAAQ,EAAInD,EAC3B,OAAOkD,GAAS,GAAKC,EAAUD,CACjC,CACF,CAEA,SAASE,GAAe7D,EAAM4D,EAAS,CACrC,IAAInD,EAAUgD,GAAezD,CAAI,EAEjC,OAAKS,IACHA,EAAU,SAAS,cAAc,MAAM,EACvCA,EAAQ,aAAa,OAAQT,CAAI,EAEjC,SAAS,KAAK,YAAYS,CAAO,GAGnCA,EAAQ,aAAa,UAAWmD,CAAO,EAEhCnD,CACT,CAEA,SAASqD,GAAuBrD,EAASsD,EAAU,CA3ZnD,IAAA5D,EA4ZE,GAAIM,aAAmB,QACrB,OACEA,EAAQ,QAAQsD,CAAQ,GAAKD,GAAuBrD,EAAQ,gBAAgBN,EAAAM,EAAQ,YAAY,IAApB,YAAAN,EAAuB,MAAM4D,CAAQ,CAGvH,CAEA,SAASC,GAAmBvD,EAAS,CAGnC,MAAO,CAAC,CAACA,GAAWA,EAAQ,QAFE,uEAE2B,GAAK,MAAQ,OAAOA,EAAQ,OAAS,UAChG,CAEA,SAASwD,GAA0BC,EAA2B,CAC5D,OAAO,MAAM,KAAKA,EAA0B,iBAAiB,aAAa,CAAC,EAAE,KAAKF,EAAkB,CACtG,CAEA,eAAeG,GAAOC,EAAUC,EAAQ,CACtC,IAAMC,EAASD,EAAO,EAEtBD,EAAS,EAET,MAAMxC,GAAmB,EAEzB,IAAM2C,EAAQF,EAAO,EAErB,MAAO,CAACC,EAAQC,CAAK,CACvB,CAEA,SAASC,GAAoBxE,EAAM,CACjC,GAAIA,IAAS,SACX,MAAO,GACF,GAAIA,EAAM,CACf,QAAWS,KAAW,SAAS,kBAAkBT,CAAI,EACnD,GAAIS,aAAmB,kBAAmB,MAAO,GAGnD,MAAO,EACT,KACE,OAAO,EAEX,CAEA,SAASgE,GAAwBpD,EAAQ,CACvC,IAAMqD,EAAOZ,GAAuBzC,EAAQ,0BAA0B,EAItE,GAFI,CAACqD,GACDA,EAAK,KAAK,WAAW,GAAG,GACxBA,EAAK,aAAa,UAAU,EAAG,OAAO,KAE1C,IAAMC,EAAaD,EAAK,aAAa,QAAQ,EAC7C,OAAIC,GAAcA,IAAe,QAAgB,KAE1CD,CACT,CAEA,SAASE,GAASC,EAAIC,EAAO,CAC3B,IAAIC,EAAY,KAEhB,MAAO,IAAIC,IAAS,CAClB,IAAMZ,EAAW,IAAMS,EAAG,MAAM,KAAMG,CAAI,EAC1C,aAAaD,CAAS,EACtBA,EAAY,WAAWX,EAAUU,CAAK,CACxC,CACF,CAEA,IAAMG,GAAY,CAChB,gBAAiB,CACf,aAAcA,GAAa,CACzBA,EAAU,aAAa,gBAAiB,MAAM,EAC9CA,EAAU,iBAAiB,QAASxD,EAAW,CACjD,EAEA,YAAawD,GAAa,CACxBA,EAAU,gBAAgB,eAAe,EACzCA,EAAU,oBAAoB,QAASxD,EAAW,CACpD,CACF,EAEA,SAAY,CACV,aAAcwD,GAAaA,EAAU,SAAW,GAChD,YAAaA,GAAaA,EAAU,SAAW,EACjD,CACF,EA/eAC,GAifMC,GAAN,KAAa,CAGX,YAAYC,EAAQ,CAFpBC,GAAA,KAAAH,GAAa,MAGX,OAAO,OAAO,KAAME,CAAM,CAC5B,CAEA,IAAI,WAAY,CACd,OAAOE,GAAA,KAAKJ,GACd,CAEA,IAAI,UAAUjF,EAAO,CACnBsF,GAAA,KAAKL,GAAaD,GAAUhF,CAAK,GAAKA,EACxC,CACF,EAbEiF,GAAA,YAeF,IAAMM,GAAQ,IAAIL,GAAO,CACvB,KAAM,KACN,UAAW,UACb,CAAC,EAEKC,GAAS,CACb,MAAA7E,GACA,MAAAiF,EACF,EAEA,SAASC,GAAUC,EAAW,CAC5B,OAAO,IAAI,IAAIA,EAAU,SAAS,EAAG,SAAS,OAAO,CACvD,CAEA,SAASC,GAAUC,EAAK,CACtB,IAAIC,EACJ,GAAID,EAAI,KACN,OAAOA,EAAI,KAAK,MAAM,CAAC,EAElB,GAAKC,EAAcD,EAAI,KAAK,MAAM,QAAQ,EAC/C,OAAOC,EAAY,CAAC,CAExB,CAEA,SAASC,GAAYC,EAAMd,EAAW,CACpC,IAAM3B,GAAS2B,GAAA,YAAAA,EAAW,aAAa,gBAAiBc,EAAK,aAAa,QAAQ,GAAKA,EAAK,OAE5F,OAAON,GAAUnC,CAAM,CACzB,CAEA,SAAS0C,GAAaJ,EAAK,CACzB,OAAQK,GAAqBL,CAAG,EAAE,MAAM,UAAU,GAAK,CAAC,GAAG,CAAC,GAAK,EACnE,CAEA,SAASM,GAAaC,EAASP,EAAK,CAClC,IAAMQ,EAASC,GAAiBT,EAAI,OAASA,EAAI,QAAQ,EACzD,OAAOS,GAAiBF,EAAQ,IAAI,IAAMC,GAAUD,EAAQ,KAAK,WAAWC,CAAM,CACpF,CAEA,SAASE,GAAoBC,EAAUC,EAAc,CACnD,OAAON,GAAaK,EAAUC,CAAY,GAAK,CAACpB,GAAO,MAAM,sBAAsB,IAAIY,GAAaO,CAAQ,CAAC,CAC/G,CAEA,SAASE,GAAmB/B,EAAM,CAChC,OAAOe,GAAUf,EAAK,aAAa,MAAM,GAAK,EAAE,CAClD,CAEA,SAASgC,GAAcd,EAAK,CAC1B,IAAMe,EAAShB,GAAUC,CAAG,EAC5B,OAAOe,GAAU,KAAOf,EAAI,KAAK,MAAM,EAAG,EAAEe,EAAO,OAAS,EAAE,EAAIf,EAAI,IACxE,CAEA,SAASgB,GAAWhB,EAAK,CACvB,OAAOc,GAAcd,CAAG,CAC1B,CAEA,SAASiB,GAAaC,EAAMC,EAAO,CACjC,OAAOtB,GAAUqB,CAAI,EAAE,MAAQrB,GAAUsB,CAAK,EAAE,IAClD,CAEA,SAASC,GAAkBpB,EAAK,CAC9B,OAAOA,EAAI,SAAS,MAAM,GAAG,EAAE,MAAM,CAAC,CACxC,CAEA,SAASK,GAAqBL,EAAK,CACjC,OAAOoB,GAAkBpB,CAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAC3C,CAEA,SAASS,GAAiBpG,EAAO,CAC/B,OAAOA,EAAM,SAAS,GAAG,EAAIA,EAAQA,EAAQ,GAC/C,CAEA,IAAMgH,GAAN,KAAoB,CAClB,YAAYC,EAAU,CACpB,KAAK,SAAWA,CAClB,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,SAAS,EACvB,CAEA,IAAI,QAAS,CACX,MAAO,CAAC,KAAK,SACf,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,YAAc,KAAO,KAAK,YAAc,GACtD,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,YAAc,KAAO,KAAK,YAAc,GACtD,CAEA,IAAI,YAAa,CACf,OAAO,KAAK,SAAS,UACvB,CAEA,IAAI,UAAW,CACb,OAAOzB,GAAU,KAAK,SAAS,GAAG,CACpC,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,aAAe,KAAK,YAAY,MAAM,wDAAwD,CAC5G,CAEA,IAAI,YAAa,CACf,OAAO,KAAK,SAAS,MACvB,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,OAAO,cAAc,CACnC,CAEA,IAAI,cAAe,CACjB,OAAO,KAAK,SAAS,MAAM,EAAE,KAAK,CACpC,CAEA,IAAI,cAAe,CACjB,OAAI,KAAK,OACA,KAAK,SAAS,MAAM,EAAE,KAAK,EAE3B,QAAQ,QAAQ,MAAS,CAEpC,CAEA,OAAOzF,EAAM,CACX,OAAO,KAAK,SAAS,QAAQ,IAAIA,CAAI,CACvC,CACF,EAEMmH,GAAN,cAAyB,GAAI,CAC3B,YAAYC,EAAS,CACnB,MAAM,EACN,KAAK,QAAUA,CACjB,CAEA,IAAInH,EAAO,CACT,GAAI,KAAK,MAAQ,KAAK,QAAS,CAE7B,IAAMoH,EADW,KAAK,OAAO,EACA,KAAK,EAAE,MACpC,KAAK,OAAOA,CAAW,CACzB,CACA,MAAM,IAAIpH,CAAK,CACjB,CACF,EAEMqH,GAAiB,IAAIH,GAAW,EAAE,EAExC,SAASI,GAAsB3B,EAAK4B,EAAU,CAAC,EAAG,CAChD,IAAMC,EAAkB,IAAI,QAAQD,EAAQ,SAAW,CAAC,CAAC,EACnDE,EAAahF,GAAK,EACxB,OAAA4E,GAAe,IAAII,CAAU,EAC7BD,EAAgB,OAAO,qBAAsBC,CAAU,EAEhD,OAAO,MAAM9B,EAAK+B,GAAAC,GAAA,GACpBJ,GADoB,CAEvB,QAASC,CACX,EAAC,CACH,CAEA,SAASI,GAAsBC,EAAQ,CACrC,OAAQA,EAAO,YAAY,EAAG,CAC5B,IAAK,MACH,OAAOC,GAAY,IACrB,IAAK,OACH,OAAOA,GAAY,KACrB,IAAK,MACH,OAAOA,GAAY,IACrB,IAAK,QACH,OAAOA,GAAY,MACrB,IAAK,SACH,OAAOA,GAAY,MACvB,CACF,CAEA,IAAMA,GAAc,CAClB,IAAK,MACL,KAAM,OACN,IAAK,MACL,MAAO,QACP,OAAQ,QACV,EAEA,SAASC,GAAuBC,EAAU,CACxC,OAAQA,EAAS,YAAY,EAAG,CAC9B,KAAKC,GAAa,UAChB,OAAOA,GAAa,UACtB,KAAKA,GAAa,MAChB,OAAOA,GAAa,MACtB,QACE,OAAOA,GAAa,UACxB,CACF,CAEA,IAAMA,GAAe,CACnB,WAAY,oCACZ,UAAW,sBACX,MAAO,YACT,EAvsBAC,GAAAC,GAAAC,GAAAC,GAysBMC,GAAN,KAAmB,CAIjB,YAAYC,EAAUV,EAAQvB,EAAUkC,EAAc,IAAI,gBAAmBpH,EAAS,KAAMqH,EAAUR,GAAa,WAAY,CAJjI7C,GAAA,KAAA+C,IACErI,GAAA,uBAAkB,IAAI,iBACtBsF,GAAA,KAAA8C,GAA0BQ,GAAW,CAAC,GA3sBxC,IAAAxI,EA8sBI,GAAM,CAACyF,EAAKgD,CAAI,EAAIC,GAAqBpD,GAAUc,CAAQ,EAAGuB,EAAQW,EAAaC,CAAO,EAE1F,KAAK,SAAWF,EAChB,KAAK,IAAM5C,EACX,KAAK,OAASvE,EACd,KAAK,aAAe,CAClB,YAAa,cACb,SAAU,SACV,OAAQyG,EAAO,YAAY,EAC3B,QAASF,GAAA,GAAK,KAAK,gBACnB,KAAMgB,EACN,OAAQ,KAAK,YACb,UAAUzI,EAAA,KAAK,SAAS,WAAd,YAAAA,EAAwB,IACpC,EACA,KAAK,QAAUuI,CACjB,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,aAAa,MAC3B,CAEA,IAAI,OAAOzI,EAAO,CAChB,IAAM6I,EAAY,KAAK,OAAS,KAAK,IAAI,aAAe,KAAK,aAAa,MAAQ,IAAI,SAChFC,EAAclB,GAAsB5H,CAAK,GAAK8H,GAAY,IAEhE,KAAK,IAAI,OAAS,GAElB,GAAM,CAACnC,EAAKgD,CAAI,EAAIC,GAAqB,KAAK,IAAKE,EAAaD,EAAW,KAAK,OAAO,EAEvF,KAAK,IAAMlD,EACX,KAAK,aAAa,KAAOgD,EACzB,KAAK,aAAa,OAASG,EAAY,YAAY,CACrD,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,aAAa,OAC3B,CAEA,IAAI,QAAQ9I,EAAO,CACjB,KAAK,aAAa,QAAUA,CAC9B,CAEA,IAAI,MAAO,CACT,OAAI,KAAK,OACA,KAAK,IAAI,aAET,KAAK,aAAa,IAE7B,CAEA,IAAI,KAAKA,EAAO,CACd,KAAK,aAAa,KAAOA,CAC3B,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,GACd,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,IAAI,YAClB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,KAAO,MAAM,KAAK,KAAK,KAAK,QAAQ,CAAC,EAAI,CAAC,CACxD,CAEA,QAAS,CACP,KAAK,gBAAgB,MAAM,CAC7B,CAEA,MAAM,SAAU,CACd,GAAM,CAAE,aAAA+I,CAAa,EAAI,KACzB,KAAK,SAAS,eAAe,IAAI,EACjC,IAAMxH,EAAQ,MAAMyH,GAAA,KAAKb,GAAAC,IAAL,UAAkCW,GACtD,GAAI,CACF,KAAK,SAAS,eAAe,IAAI,EAE7BxH,EAAM,OAAO,aACf,KAAK,SAAWA,EAAM,OAAO,aAAa,SAE1C,KAAK,SAAW+F,GAAsB,KAAK,IAAI,KAAMyB,CAAY,EAGnE,IAAM9B,EAAW,MAAM,KAAK,SAC5B,OAAO,MAAM,KAAK,QAAQA,CAAQ,CACpC,OAASgC,EAAO,CACd,GAAIA,EAAM,OAAS,aACjB,MAAID,GAAA,KAAKb,GAAAE,IAAL,UAAgCY,IAClC,KAAK,SAAS,eAAe,KAAMA,CAAK,EAEpCA,CAEV,QAAE,CACA,KAAK,SAAS,gBAAgB,IAAI,CACpC,CACF,CAEA,MAAM,QAAQhC,EAAU,CACtB,IAAMiC,EAAgB,IAAIlC,GAAcC,CAAQ,EAMhD,OALc/F,GAAS,8BAA+B,CACpD,WAAY,GACZ,OAAQ,CAAE,cAAAgI,CAAc,EACxB,OAAQ,KAAK,MACf,CAAC,EACS,iBACR,KAAK,SAAS,iCAAiC,KAAMA,CAAa,EACzDA,EAAc,UACvB,KAAK,SAAS,6BAA6B,KAAMA,CAAa,EAE9D,KAAK,SAAS,0BAA0B,KAAMA,CAAa,EAEtDA,CACT,CAEA,IAAI,gBAAiB,CACnB,MAAO,CACL,OAAQ,kCACV,CACF,CAEA,IAAI,QAAS,CACX,OAAOC,GAAO,KAAK,MAAM,CAC3B,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,gBAAgB,MAC9B,CAEA,mBAAmBC,EAAU,CAC3B,KAAK,QAAQ,OAAY,CAACA,EAAU,KAAK,QAAQ,MAAS,EAAE,KAAK,IAAI,CACvE,CA4BF,EAjKElB,GAAA,YAFFC,GAAA,YAyIQC,GAA4B,eAACW,EAAc,CAC/C,IAAMM,EAAsB,IAAI,QAASzH,GAAa0D,GAAA,KAAK4C,GAAyBtG,EAAQ,EACtFL,EAAQL,GAAS,6BAA8B,CACnD,WAAY,GACZ,OAAQ,CACN,aAAA6H,EACA,IAAK,KAAK,IACV,OAAQ1D,GAAA,KAAK6C,GACf,EACA,OAAQ,KAAK,MACf,CAAC,EACD,YAAK,IAAM3G,EAAM,OAAO,IACpBA,EAAM,kBAAkB,MAAM8H,EAE3B9H,CACT,EAEA8G,GAA0B,SAACY,EAAO,CAOhC,MAAO,CANO/H,GAAS,4BAA6B,CAClD,OAAQ,KAAK,OACb,WAAY,GACZ,OAAQ,CAAE,QAAS,KAAM,MAAO+H,CAAM,CACxC,CAAC,EAEa,gBAChB,EAGF,SAASE,GAAOL,EAAa,CAC3B,OAAOlB,GAAsBkB,CAAW,GAAKhB,GAAY,GAC3D,CAEA,SAASc,GAAqBU,EAAUzB,EAAQW,EAAaC,EAAS,CACpE,IAAMc,EACJ,MAAM,KAAKf,CAAW,EAAE,OAAS,EAAI,IAAI,gBAAgBgB,GAAsBhB,CAAW,CAAC,EAAIc,EAAS,aAE1G,OAAIH,GAAOtB,CAAM,EACR,CAAC4B,GAAyBH,EAAUC,CAAY,EAAG,IAAI,EACrDd,GAAWR,GAAa,WAC1B,CAACqB,EAAUC,CAAY,EAEvB,CAACD,EAAUd,CAAW,CAEjC,CAEA,SAASgB,GAAsBhB,EAAa,CAC1C,IAAMkB,EAAU,CAAC,EAEjB,OAAW,CAAC3J,EAAMC,CAAK,IAAKwI,EACtBxI,aAAiB,MAChB0J,EAAQ,KAAK,CAAC3J,EAAMC,CAAK,CAAC,EAGjC,OAAO0J,CACT,CAEA,SAASD,GAAyB9D,EAAK6C,EAAa,CAClD,IAAMe,EAAe,IAAI,gBAAgBC,GAAsBhB,CAAW,CAAC,EAE3E,OAAA7C,EAAI,OAAS4D,EAAa,SAAS,EAE5B5D,CACT,CAEA,IAAMgE,GAAN,KAAyB,CAGvB,YAAYpB,EAAU/H,EAAS,CAF/BV,GAAA,eAAU,IAsBVA,GAAA,iBAAa4J,GAAY,CACvB,IAAME,EAAYF,EAAQ,MAAM,EAAE,EAAE,CAAC,EACjCE,GAAA,MAAAA,EAAW,gBACb,KAAK,SAAS,0BAA0B,KAAK,OAAO,CAExD,GAxBE,KAAK,SAAWrB,EAChB,KAAK,QAAU/H,EACf,KAAK,qBAAuB,IAAI,qBAAqB,KAAK,SAAS,CACrE,CAEA,OAAQ,CACD,KAAK,UACR,KAAK,QAAU,GACf,KAAK,qBAAqB,QAAQ,KAAK,OAAO,EAElD,CAEA,MAAO,CACD,KAAK,UACP,KAAK,QAAU,GACf,KAAK,qBAAqB,UAAU,KAAK,OAAO,EAEpD,CAQF,EAEMqJ,GAAN,KAAoB,CAGlB,OAAO,KAAKC,EAAS,CACnB,OAAI,OAAOA,GAAW,SACb,IAAI,KAAK/I,GAAuB+I,CAAO,CAAC,EAExCA,CAEX,CAEA,YAAYC,EAAU,CACpB,KAAK,SAAWC,GAAqBD,CAAQ,CAC/C,CACF,EAbEjK,GADI+J,GACG,cAAc,8BAevB,SAASG,GAAqBD,EAAU,CACtC,QAAWvJ,KAAWuJ,EAAS,iBAAiB,cAAc,EAAG,CAC/D,IAAME,EAAgB,SAAS,WAAWzJ,EAAS,EAAI,EAEvD,QAAW0J,KAAsBD,EAAc,gBAAgB,QAAQ,iBAAiB,QAAQ,EAC9FC,EAAmB,YAAY3J,GAAsB2J,CAAkB,CAAC,EAG1E1J,EAAQ,YAAYyJ,CAAa,CACnC,CAEA,OAAOF,CACT,CAEA,IAAMI,GAAWC,GAAOA,EA/8BxBC,GAi9BMC,GAAN,KAAe,CAKb,YAAYC,EAAM5D,EAAawD,GAAU,CAJzCrK,GAAA,YAAO,CAAC,GACRA,GAAA,eAAU,CAAC,GACXsF,GAAA,KAAAiF,IAGE,KAAK,KAAOE,EACZjF,GAAA,KAAK+E,GAAc1D,EACrB,CAEA,IAAIyD,EAAK,CACP,OAAO/E,GAAA,KAAKgF,IAAL,UAAiBD,KAAQ,KAAK,OACvC,CAEA,IAAIA,EAAK,CACP,GAAI,KAAK,IAAIA,CAAG,EAAG,CACjB,IAAMI,EAAQ,KAAK,KAAKJ,CAAG,EAC3B,YAAK,MAAMA,CAAG,EACPI,CACT,CACF,CAEA,IAAIJ,EAAKI,EAAO,CACd,YAAK,MAAMJ,EAAKI,CAAK,EACrB,KAAK,MAAMJ,CAAG,EACPI,CACT,CAEA,OAAQ,CACN,QAAWJ,KAAO,OAAO,KAAK,KAAK,OAAO,EACxC,KAAK,MAAMA,CAAG,CAElB,CAIA,KAAKA,EAAK,CACR,OAAO,KAAK,QAAQ/E,GAAA,KAAKgF,IAAL,UAAiBD,EAAI,CAC3C,CAEA,MAAMA,EAAKI,EAAO,CAChB,KAAK,QAAQnF,GAAA,KAAKgF,IAAL,UAAiBD,EAAI,EAAII,CACxC,CAEA,MAAMJ,EAAK,CACTA,EAAM/E,GAAA,KAAKgF,IAAL,UAAiBD,GACvB,IAAMK,EAAQ,KAAK,KAAK,QAAQL,CAAG,EAC/BK,EAAQ,IAAI,KAAK,KAAK,OAAOA,EAAO,CAAC,EACzC,KAAK,KAAK,QAAQL,CAAG,EACrB,KAAK,KAAK,CACZ,CAEA,MAAO,CACL,QAAWA,KAAO,KAAK,KAAK,OAAO,KAAK,IAAI,EAC1C,KAAK,MAAMA,CAAG,CAElB,CAEA,MAAMA,EAAK,CACT,OAAO,KAAK,QAAQA,CAAG,CACzB,CACF,EA1DEC,GAAA,YA4DF,IAAMK,GAAiB,IAhhCvBC,GAAAC,GAkhCMC,GAAN,cAA4BP,EAAS,CAInC,YAAYC,EAAO,EAAGO,EAAgBJ,GAAgB,CACpD,MAAMH,EAAM5D,EAAU,EAJxBvB,GAAA,KAAAuF,GAAmB,MACnBvF,GAAA,KAAAwF,GAAW,CAAC,GAIV,KAAK,cAAgBE,CACvB,CAEA,SAASnF,EAAKoF,EAASC,EAAK,CAC1B1F,GAAA,KAAKqF,GAAmB,WAAW,IAAM,CACvCI,EAAQ,QAAQ,EAChB,KAAK,IAAIpF,EAAKoF,EAASC,CAAG,EAC1B1F,GAAA,KAAKqF,GAAmB,KAC1B,EAAG,KAAK,aAAa,EACvB,CAEA,IAAIhF,EAAKoF,EAASC,EAAMC,GAAU,CAChC,MAAM,IAAItF,EAAKoF,CAAO,EACtB1F,GAAA,KAAKuF,IAASjE,GAAWhB,CAAG,CAAC,EAAI,IAAI,KAAK,IAAI,KAAK,EAAE,QAAQ,EAAIqF,CAAG,CACtE,CAEA,OAAQ,CACN,MAAM,MAAM,EACR3F,GAAA,KAAKsF,KAAkB,aAAatF,GAAA,KAAKsF,GAAgB,CAC/D,CAEA,MAAMP,EAAK,CACT,MAAM,MAAMA,CAAG,EACf,OAAO/E,GAAA,KAAKuF,IAASR,CAAG,CAC1B,CAEA,IAAIA,EAAK,CACP,GAAI,MAAM,IAAIA,CAAG,EAAG,CAClB,IAAMc,EAAS7F,GAAA,KAAKuF,IAASjE,GAAWyD,CAAG,CAAC,EAE5C,OAAOc,GAAUA,EAAS,KAAK,IAAI,CACrC,KACE,OAAO,EAEX,CACF,EAxCEP,GAAA,YACAC,GAAA,YAyCF,IAAMK,GAAW,GAAK,IAChBE,GAAgB,IAAIN,GAEpBO,GAAsB,CAC1B,YAAa,cACb,WAAY,aACZ,QAAS,UACT,UAAW,YACX,SAAU,WACV,QAAS,SACX,EAEMC,GAAN,MAAMC,CAAe,CAOnB,YAAY/C,EAAUgD,EAAavG,EAAWwG,EAAe,GAAO,CANpE1L,GAAA,aAAQsL,GAAoB,aAO1B,IAAMvD,EAAS4D,GAAUF,EAAavG,CAAS,EACzC3B,EAASqI,GAAUC,GAAcJ,EAAavG,CAAS,EAAG6C,CAAM,EAChEc,EAAOiD,GAAcL,EAAavG,CAAS,EAC3CyD,EAAUoD,GAAWN,EAAavG,CAAS,EAEjD,KAAK,SAAWuD,EAChB,KAAK,YAAcgD,EACnB,KAAK,UAAYvG,EACjB,KAAK,aAAe,IAAIsD,GAAa,KAAMT,EAAQxE,EAAQsF,EAAM4C,EAAa9C,CAAO,EACrF,KAAK,aAAe+C,CACtB,CAfA,OAAO,cAAc1B,EAAS,CAC5B,OAAO,QAAQ,QAAQ,QAAQA,CAAO,CAAC,CACzC,CAeA,IAAI,QAAS,CACX,OAAO,KAAK,aAAa,MAC3B,CAEA,IAAI,OAAO9J,EAAO,CAChB,KAAK,aAAa,OAASA,CAC7B,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,aAAa,IAAI,SAAS,CACxC,CAEA,IAAI,OAAOA,EAAO,CAChB,KAAK,aAAa,IAAMwF,GAAUxF,CAAK,CACzC,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,aAAa,IAC3B,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,aAAa,OAC3B,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,aAAa,MAC3B,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,aAAa,GAC3B,CAIA,MAAM,OAAQ,CACZ,GAAM,CAAE,YAAA8L,EAAa,WAAAC,CAAW,EAAIX,GAC9BY,EAAsBrJ,GAAa,qBAAsB,KAAK,UAAW,KAAK,WAAW,EAE/F,GAAI,SAAOqJ,GAAwB,UAM7B,CADW,MAJO,OAAO7G,GAAO,MAAM,SAAY,WACpDA,GAAO,MAAM,QACbmG,EAAe,eAEkBU,EAAqB,KAAK,YAAa,KAAK,SAAS,IAMtF,KAAK,OAASF,EAChB,YAAK,MAAQC,EACN,KAAK,aAAa,QAAQ,CAErC,CAEA,MAAO,CACL,GAAM,CAAE,SAAAE,EAAU,QAAAC,CAAQ,EAAId,GAC9B,GAAI,KAAK,OAASa,GAAY,KAAK,OAASC,EAC1C,YAAK,MAAQD,EACb,KAAK,aAAa,OAAO,EAClB,EAEX,CAIA,eAAelB,EAAS,CACtB,GAAI,CAACA,EAAQ,OAAQ,CACnB,IAAMoB,EAAQC,GAAe3I,GAAe,YAAY,CAAC,GAAKA,GAAe,YAAY,EACrF0I,IACFpB,EAAQ,QAAQ,cAAc,EAAIoB,EAEtC,CAEI,KAAK,kCAAkCpB,CAAO,GAChDA,EAAQ,mBAAmBlB,GAAc,WAAW,CAExD,CAEA,eAAewC,EAAU,CACvB,KAAK,MAAQjB,GAAoB,QAC7B,KAAK,WAAWjG,GAAO,MAAM,UAAU,aAAa,KAAK,SAAS,EACtE,KAAK,eAAe,EACpBpC,GAAW,KAAK,WAAW,EAC3B7B,GAAS,qBAAsB,CAC7B,OAAQ,KAAK,YACb,OAAQ,CAAE,eAAgB,IAAK,CACjC,CAAC,EACD,KAAK,SAAS,sBAAsB,IAAI,CAC1C,CAEA,iCAAiC6J,EAAS9D,EAAU,CAClDkE,GAAc,MAAM,EAEpB,KAAK,OAAS,CAAE,QAASlE,EAAS,UAAW,cAAeA,CAAS,CACvE,CAEA,6BAA6B8D,EAAS9D,EAAU,CAC9C,GAAIA,EAAS,aAAeA,EAAS,YAAa,CAChD,KAAK,SAAS,iCAAiC,KAAMA,CAAQ,EAC7D,MACF,CAIA,GAFAkE,GAAc,MAAM,EAEhB,KAAK,oBAAoBJ,CAAO,GAAKuB,GAAiCrF,CAAQ,EAAG,CACnF,IAAMgC,EAAQ,IAAI,MAAM,kDAAkD,EAC1E,KAAK,SAAS,sBAAsB,KAAMA,CAAK,CACjD,MACE,KAAK,MAAQmC,GAAoB,UACjC,KAAK,OAAS,CAAE,QAAS,GAAM,cAAenE,CAAS,EACvD,KAAK,SAAS,oCAAoC,KAAMA,CAAQ,CAEpE,CAEA,0BAA0B8D,EAAS9D,EAAU,CAC3C,KAAK,OAAS,CAAE,QAAS,GAAO,cAAeA,CAAS,EACxD,KAAK,SAAS,iCAAiC,KAAMA,CAAQ,CAC/D,CAEA,eAAe8D,EAAS9B,EAAO,CAC7B,KAAK,OAAS,CAAE,QAAS,GAAO,MAAAA,CAAM,EACtC,KAAK,SAAS,sBAAsB,KAAMA,CAAK,CACjD,CAEA,gBAAgBoD,EAAU,CACxB,KAAK,MAAQjB,GAAoB,QAC7B,KAAK,WAAWjG,GAAO,MAAM,UAAU,YAAY,KAAK,SAAS,EACrE,KAAK,mBAAmB,EACxBnC,GAAe,KAAK,WAAW,EAC/B9B,GAAS,mBAAoB,CAC3B,OAAQ,KAAK,YACb,OAAQyG,GAAA,CAAE,eAAgB,MAAS,KAAK,OAC1C,CAAC,EACD,KAAK,SAAS,uBAAuB,IAAI,CAC3C,CAIA,gBAAiB,CACf,GAAI,GAAC,KAAK,WAAa,CAAC,KAAK,cAE7B,GAAI,KAAK,UAAU,QAAQ,QAAQ,EACjC,KAAK,mBAAqB,KAAK,UAAU,UACzC,KAAK,UAAU,UAAY,KAAK,oBACvB,KAAK,UAAU,QAAQ,OAAO,EAAG,CAC1C,IAAM4E,EAAQ,KAAK,UACnB,KAAK,mBAAqBA,EAAM,MAChCA,EAAM,MAAQ,KAAK,WACrB,EACF,CAEA,oBAAqB,CACnB,GAAI,GAAC,KAAK,WAAa,CAAC,KAAK,qBAE7B,GAAI,KAAK,UAAU,QAAQ,QAAQ,EACjC,KAAK,UAAU,UAAY,KAAK,2BACvB,KAAK,UAAU,QAAQ,OAAO,EAAG,CAC1C,IAAMA,EAAQ,KAAK,UACnBA,EAAM,MAAQ,KAAK,kBACrB,EACF,CAEA,oBAAoBxB,EAAS,CAC3B,MAAO,CAACA,EAAQ,QAAU,KAAK,YACjC,CAEA,kCAAkCA,EAAS,CACzC,MAAO,CAACA,EAAQ,QAAUjI,GAAa,oBAAqB,KAAK,UAAW,KAAK,WAAW,CAC9F,CAEA,IAAI,aAAc,CAxwCpB,IAAA5C,EAywCI,OAAOA,EAAA,KAAK,YAAL,YAAAA,EAAgB,aAAa,0BACtC,CACF,EAEA,SAAS0L,GAAcL,EAAavG,EAAW,CAC7C,IAAMwH,EAAW,IAAI,SAASjB,CAAW,EACnCxL,EAAOiF,GAAA,YAAAA,EAAW,aAAa,QAC/BhF,EAAQgF,GAAA,YAAAA,EAAW,aAAa,SAEtC,OAAIjF,GACFyM,EAAS,OAAOzM,EAAMC,GAAS,EAAE,EAG5BwM,CACT,CAEA,SAASJ,GAAeK,EAAY,CAClC,GAAIA,GAAc,KAAM,CAEtB,IAAMC,GADU,SAAS,OAAS,SAAS,OAAO,MAAM,IAAI,EAAI,CAAC,GAC1C,KAAMA,GAAWA,EAAO,WAAWD,CAAU,CAAC,EACrE,GAAIC,EAAQ,CACV,IAAM1M,EAAQ0M,EAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,EACjD,OAAO1M,EAAQ,mBAAmBA,CAAK,EAAI,MAC7C,CACF,CACF,CAEA,SAASsM,GAAiCrF,EAAU,CAClD,OAAOA,EAAS,YAAc,KAAO,CAACA,EAAS,UACjD,CAEA,SAAS0E,GAAcJ,EAAavG,EAAW,CAC7C,IAAM2H,EAAoB,OAAOpB,EAAY,QAAW,SAAWA,EAAY,OAAS,KAExF,OAAIvG,GAAA,MAAAA,EAAW,aAAa,cACnBA,EAAU,aAAa,YAAY,GAAK,GAExCuG,EAAY,aAAa,QAAQ,GAAKoB,GAAqB,EAEtE,CAEA,SAASjB,GAAUkB,EAAY9D,EAAa,CAC1C,IAAMzF,EAASmC,GAAUoH,CAAU,EAEnC,OAAIzD,GAAOL,CAAW,IACpBzF,EAAO,OAAS,IAGXA,CACT,CAEA,SAASoI,GAAUF,EAAavG,EAAW,CACzC,IAAM6C,GAAS7C,GAAA,YAAAA,EAAW,aAAa,gBAAiBuG,EAAY,aAAa,QAAQ,GAAK,GAC9F,OAAO3D,GAAsBC,EAAO,YAAY,CAAC,GAAKC,GAAY,GACpE,CAEA,SAAS+D,GAAWN,EAAavG,EAAW,CAC1C,OAAO+C,IAAuB/C,GAAA,YAAAA,EAAW,aAAa,iBAAkBuG,EAAY,OAAO,CAC7F,CAEA,IAAMsB,GAAN,KAAe,CACb,YAAYrM,EAAS,CACnB,KAAK,QAAUA,CACjB,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAQ,cAAc,aACpC,CAEA,IAAI,UAAW,CACb,MAAO,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAClC,CAEA,UAAUkG,EAAQ,CAChB,OAAO,KAAK,oBAAoBA,CAAM,GAAK,IAC7C,CAEA,oBAAoBA,EAAQ,CAC1B,OAAOA,EAAS,KAAK,QAAQ,cAAc,QAAQA,CAAM,eAAeA,CAAM,IAAI,EAAI,IACxF,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,QAAQ,WACtB,CAEA,IAAI,2BAA4B,CAC9B,OAAO1C,GAA0B,KAAK,OAAO,CAC/C,CAEA,IAAI,mBAAoB,CACtB,OAAO8I,GAA0B,KAAK,OAAO,CAC/C,CAEA,wBAAwBC,EAAI,CAC1B,OAAOC,GAAwB,KAAK,QAASD,CAAE,CACjD,CAEA,kCAAkCE,EAAU,CAC1C,IAAMC,EAAsB,CAAC,EAE7B,QAAWC,KAA2B,KAAK,kBAAmB,CAC5D,GAAM,CAAE,GAAAJ,CAAG,EAAII,EACTC,EAAsBH,EAAS,wBAAwBF,CAAE,EAC3DK,IACFF,EAAoBH,CAAE,EAAI,CAACI,EAAyBC,CAAmB,EAE3E,CAEA,OAAOF,CACT,CACF,EAEA,SAASF,GAAwBK,EAAMN,EAAI,CACzC,OAAOM,EAAK,cAAc,IAAIN,CAAE,wBAAwB,CAC1D,CAEA,SAASD,GAA0BO,EAAM,CACvC,OAAOA,EAAK,iBAAiB,4BAA4B,CAC3D,CAEA,IAAMC,GAAN,KAAyB,CAGvB,YAAY/E,EAAUgF,EAAa,CAFnCzN,GAAA,eAAU,IAqBVA,GAAA,sBAAiB,IAAM,CACrB,KAAK,YAAY,oBAAoB,SAAU,KAAK,cAAe,EAAK,EACxE,KAAK,YAAY,iBAAiB,SAAU,KAAK,cAAe,EAAK,CACvE,GAEAA,GAAA,qBAAiByB,GAAU,CACzB,GAAI,CAACA,EAAM,iBAAkB,CAC3B,IAAMuE,EAAOvE,EAAM,kBAAkB,gBAAkBA,EAAM,OAAS,OAChEyD,EAAYzD,EAAM,WAAa,OAGnCuE,GACA0H,GAA+B1H,EAAMd,CAAS,GAC9CyI,GAA8B3H,EAAMd,CAAS,GAC7C,KAAK,SAAS,eAAec,EAAMd,CAAS,IAE5CzD,EAAM,eAAe,EACrBA,EAAM,yBAAyB,EAC/B,KAAK,SAAS,cAAcuE,EAAMd,CAAS,EAE/C,CACF,GAvCE,KAAK,SAAWuD,EAChB,KAAK,YAAcgF,CACrB,CAEA,OAAQ,CACD,KAAK,UACR,KAAK,YAAY,iBAAiB,SAAU,KAAK,eAAgB,EAAI,EACrE,KAAK,QAAU,GAEnB,CAEA,MAAO,CACD,KAAK,UACP,KAAK,YAAY,oBAAoB,SAAU,KAAK,eAAgB,EAAI,EACxE,KAAK,QAAU,GAEnB,CAwBF,EAEA,SAASC,GAA+B1H,EAAMd,EAAW,CAGvD,QAFeA,GAAA,YAAAA,EAAW,aAAa,gBAAiBc,EAAK,aAAa,QAAQ,IAEjE,QACnB,CAEA,SAAS2H,GAA8B3H,EAAMd,EAAW,CACtD,IAAM5D,GAAS4D,GAAA,YAAAA,EAAW,aAAa,gBAAiBc,EAAK,aAAa,QAAQ,EAElF,OAAOvB,GAAoBnD,CAAM,CACnC,CAz7CA,IAAAsM,GAAAC,GA27CMC,GAAN,KAAW,CAIT,YAAYrF,EAAU/H,EAAS,CAH/B4E,GAAA,KAAAsI,GAAyBhF,GAAW,CAAC,GACrCtD,GAAA,KAAAuI,GAA+BjF,GAAW,CAAC,GAGzC,KAAK,SAAWH,EAChB,KAAK,QAAU/H,CACjB,CAIA,eAAekG,EAAQ,CACrB,IAAMlG,EAAU,KAAK,SAAS,oBAAoBkG,CAAM,EACpDlG,GACF,KAAK,aAAaA,CAAO,EACzB,KAAK,gBAAgBA,CAAO,GAE5B,KAAK,iBAAiB,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,CAExC,CAEA,2BAA2B8F,EAAU,CACnC,KAAK,eAAeZ,GAAUY,CAAQ,CAAC,CACzC,CAEA,gBAAgB9F,EAAS,CACvBA,EAAQ,eAAe,CACzB,CAEA,aAAaA,EAAS,CAChBA,aAAmB,cACjBA,EAAQ,aAAa,UAAU,EACjCA,EAAQ,MAAM,GAEdA,EAAQ,aAAa,WAAY,IAAI,EACrCA,EAAQ,MAAM,EACdA,EAAQ,gBAAgB,UAAU,GAGxC,CAEA,iBAAiB,CAAE,EAAAqN,EAAG,EAAAC,CAAE,EAAG,CACzB,KAAK,WAAW,SAASD,EAAGC,CAAC,CAC/B,CAEA,aAAc,CACZ,KAAK,iBAAiB,CAAE,EAAG,EAAG,EAAG,CAAE,CAAC,CACtC,CAEA,IAAI,YAAa,CACf,OAAO,MACT,CAIA,MAAM,OAAOC,EAAU,CACrB,GAAM,CAAE,UAAAC,EAAW,aAAAC,EAAc,WAAAC,EAAY,YAAajB,CAAS,EAAIc,EAIjEI,EAAmBD,EAEzB,GAAID,EACF,GAAI,CACF,KAAK,cAAgB,IAAI,QAASrM,GAAa0D,GAAA,KAAKoI,GAAwB9L,EAAQ,EACpF,KAAK,SAAWmM,EAChB,MAAM,KAAK,wBAAwBA,CAAQ,EAE3C,IAAMK,EAAqB,IAAI,QAASxM,GAAa0D,GAAA,KAAKqI,GAA8B/L,EAAQ,EAC1F2F,EAAU,CAAE,OAAQlC,GAAA,KAAKsI,IAA6B,OAAQ,KAAK,SAAS,cAAe,aAAc,KAAK,SAAS,YAAa,EAClH,KAAK,SAAS,sBAAsBV,EAAU1F,CAAO,GACvD,MAAM6G,EAE5B,MAAM,KAAK,eAAeL,CAAQ,EAClC,KAAK,SAAS,qBAAqBd,EAAUe,EAAW,KAAK,SAAS,YAAY,EAClF,KAAK,SAAS,0BAA0B,KAAK,OAAO,EACpD,KAAK,wBAAwBD,CAAQ,CACvC,QAAE,CACA,OAAO,KAAK,SACZ1I,GAAA,KAAKqI,IAAL,UAA2B,QAC3B,OAAO,KAAK,aACd,MACSS,GACT,KAAK,WAAWJ,EAAS,YAAY,CAEzC,CAEA,WAAWM,EAAQ,CACjB,KAAK,SAAS,gBAAgBA,CAAM,CACtC,CAEA,MAAM,wBAAwBN,EAAU,CACtC,KAAK,cAAcA,EAAS,SAAS,EACrC,MAAMA,EAAS,gBAAgB,CACjC,CAEA,cAAcC,EAAW,CACnBA,EACF,KAAK,QAAQ,aAAa,qBAAsB,EAAE,EAElD,KAAK,QAAQ,gBAAgB,oBAAoB,CAErD,CAEA,mBAAmBM,EAAW,CAC5B,KAAK,QAAQ,aAAa,6BAA8BA,CAAS,CACnE,CAEA,sBAAuB,CACrB,KAAK,QAAQ,gBAAgB,4BAA4B,CAC3D,CAEA,MAAM,eAAeP,EAAU,CAC7B,MAAMA,EAAS,OAAO,CACxB,CAEA,wBAAwBA,EAAU,CAChCA,EAAS,gBAAgB,CAC3B,CACF,EAtHEL,GAAA,YACAC,GAAA,YAuHF,IAAMY,GAAN,cAAwBX,EAAK,CAC3B,SAAU,CACR,KAAK,QAAQ,UAAY,4DAC3B,CAEA,IAAI,UAAW,CACb,OAAO,IAAIf,GAAS,KAAK,OAAO,CAClC,CACF,EAEM2B,GAAN,KAAsB,CACpB,YAAYjG,EAAU/H,EAAS,CAiB/BV,GAAA,oBAAgByB,GAAU,CACpB,KAAK,wBAAwBA,CAAK,EACpC,KAAK,WAAaA,EAElB,OAAO,KAAK,UAEhB,GAEAzB,GAAA,mBAAeyB,GAAU,CACnB,KAAK,YAAc,KAAK,wBAAwBA,CAAK,GACnD,KAAK,SAAS,yBAAyBA,EAAM,OAAQA,EAAM,OAAO,IAAKA,EAAM,OAAO,aAAa,IACnG,KAAK,WAAW,eAAe,EAC/BA,EAAM,eAAe,EACrB,KAAK,SAAS,qBAAqBA,EAAM,OAAQA,EAAM,OAAO,IAAKA,EAAM,OAAO,aAAa,GAGjG,OAAO,KAAK,UACd,GAEAzB,GAAA,iBAAa2O,GAAW,CACtB,OAAO,KAAK,UACd,GArCE,KAAK,SAAWlG,EAChB,KAAK,QAAU/H,CACjB,CAEA,OAAQ,CACN,KAAK,QAAQ,iBAAiB,QAAS,KAAK,YAAY,EACxD,SAAS,iBAAiB,cAAe,KAAK,WAAW,EACzD,SAAS,iBAAiB,qBAAsB,KAAK,SAAS,CAChE,CAEA,MAAO,CACL,KAAK,QAAQ,oBAAoB,QAAS,KAAK,YAAY,EAC3D,SAAS,oBAAoB,cAAe,KAAK,WAAW,EAC5D,SAAS,oBAAoB,qBAAsB,KAAK,SAAS,CACnE,CAyBA,wBAAwBe,EAAO,CAvmDjC,IAAArB,EAwmDI,IAAMkB,EAASG,EAAM,UAAWrB,EAAAqB,EAAM,SAAN,YAAArB,EAAc,cAAgBqB,EAAM,OAC9Df,EAAUgE,GAAwBpD,CAAM,GAAKA,EAEnD,OAAOZ,aAAmB,SAAWA,EAAQ,QAAQ,mBAAmB,GAAK,KAAK,OACpF,CACF,EAEMkO,GAAN,KAAwB,CAGtB,YAAYnG,EAAUgF,EAAa,CAFnCzN,GAAA,eAAU,IAqBVA,GAAA,qBAAgB,IAAM,CACpB,KAAK,YAAY,oBAAoB,QAAS,KAAK,aAAc,EAAK,EACtE,KAAK,YAAY,iBAAiB,QAAS,KAAK,aAAc,EAAK,CACrE,GAEAA,GAAA,oBAAgByB,GAAU,CACxB,GAAIA,aAAiB,YAAc,KAAK,wBAAwBA,CAAK,EAAG,CACtE,IAAMH,EAAUG,EAAM,cAAgBA,EAAM,aAAa,EAAE,CAAC,GAAMA,EAAM,OAClEkD,EAAOD,GAAwBpD,CAAM,EAC3C,GAAIqD,GAAQF,GAAoBE,EAAK,MAAM,EAAG,CAC5C,IAAM6B,EAAWE,GAAmB/B,CAAI,EACpC,KAAK,SAAS,yBAAyBA,EAAM6B,EAAU/E,CAAK,IAC9DA,EAAM,eAAe,EACrB,KAAK,SAAS,uBAAuBkD,EAAM6B,CAAQ,EAEvD,CACF,CACF,GAnCE,KAAK,SAAWiC,EAChB,KAAK,YAAcgF,CACrB,CAEA,OAAQ,CACD,KAAK,UACR,KAAK,YAAY,iBAAiB,QAAS,KAAK,cAAe,EAAI,EACnE,KAAK,QAAU,GAEnB,CAEA,MAAO,CACD,KAAK,UACP,KAAK,YAAY,oBAAoB,QAAS,KAAK,cAAe,EAAI,EACtE,KAAK,QAAU,GAEnB,CAqBA,wBAAwBhM,EAAO,CAC7B,MAAO,EACJA,EAAM,QAAUA,EAAM,OAAO,mBAC9BA,EAAM,kBACNA,EAAM,MAAQ,GACdA,EAAM,QACNA,EAAM,SACNA,EAAM,SACNA,EAAM,SAEV,CACF,EAEMoN,GAAN,KAA4B,CAC1B,YAAYpG,EAAU/H,EAAS,CAC7B,KAAK,SAAW+H,EAChB,KAAK,gBAAkB,IAAImG,GAAkB,KAAMlO,CAAO,CAC5D,CAEA,OAAQ,CACN,KAAK,gBAAgB,MAAM,CAC7B,CAEA,MAAO,CACL,KAAK,gBAAgB,KAAK,CAC5B,CAIA,6BAA6BiE,EAAM6B,EAAU,CAC3C,MAAO,EACT,CAEA,kCAAkC7B,EAAM6B,EAAU,CAElD,CAIA,yBAAyB7B,EAAM6B,EAAUsI,EAAe,CACtD,OACE,KAAK,SAAS,6BAA6BnK,EAAM6B,EAAUsI,CAAa,IACvEnK,EAAK,aAAa,mBAAmB,GAAKA,EAAK,aAAa,mBAAmB,EAEpF,CAEA,uBAAuBA,EAAM6B,EAAU,CACrC,IAAMR,EAAO,SAAS,cAAc,MAAM,EAEpC+I,EAAO,SACb,OAAW,CAAC9O,EAAMC,CAAK,IAAKsG,EAAS,aACnCR,EAAK,OAAO,OAAO,OAAO,SAAS,cAAc,OAAO,EAAG,CAAE,KAAA+I,EAAM,KAAA9O,EAAM,MAAAC,CAAM,CAAC,CAAC,EAGnF,IAAMqD,EAAS,OAAO,OAAOiD,EAAU,CAAE,OAAQ,EAAG,CAAC,EACrDR,EAAK,aAAa,aAAc,MAAM,EACtCA,EAAK,aAAa,SAAUzC,EAAO,IAAI,EACvCyC,EAAK,aAAa,SAAU,EAAE,EAE9B,IAAM+B,EAASpD,EAAK,aAAa,mBAAmB,EAChDoD,GAAQ/B,EAAK,aAAa,SAAU+B,CAAM,EAE9C,IAAMiH,EAAarK,EAAK,aAAa,kBAAkB,EACnDqK,GAAYhJ,EAAK,aAAa,mBAAoBgJ,CAAU,EAEhE,IAAMC,EAAcxL,GAAekB,CAAI,EACnCsK,GAAajJ,EAAK,aAAa,oBAAqBiJ,CAAW,EAEnE,IAAMC,EAAevK,EAAK,aAAa,oBAAoB,EACvDuK,GAAclJ,EAAK,aAAa,qBAAsBkJ,CAAY,EAElDvK,EAAK,aAAa,mBAAmB,GACxCqB,EAAK,aAAa,oBAAqB,EAAE,EAE1D,KAAK,SAAS,4BAA4BrB,EAAM6B,EAAUR,CAAI,EAE9D,SAAS,KAAK,YAAYA,CAAI,EAC9BA,EAAK,iBAAiB,mBAAoB,IAAMA,EAAK,OAAO,EAAG,CAAE,KAAM,EAAK,CAAC,EAC7E,sBAAsB,IAAMA,EAAK,cAAc,CAAC,CAClD,CACF,EAEMmJ,GAAN,KAAY,CACV,aAAa,4BAA4B1G,EAAU2E,EAAqB/I,EAAU,CAChF,IAAM+K,EAAQ,IAAI,KAAK3G,EAAU2E,CAAmB,EACpDgC,EAAM,MAAM,EACZ,MAAM/K,EAAS,EACf+K,EAAM,MAAM,CACd,CAEA,YAAY3G,EAAU2E,EAAqB,CACzC,KAAK,SAAW3E,EAChB,KAAK,oBAAsB2E,CAC7B,CAEA,OAAQ,CACN,QAAWH,KAAM,KAAK,oBAAqB,CACzC,GAAM,CAACI,EAAyBC,CAAmB,EAAI,KAAK,oBAAoBL,CAAE,EAClF,KAAK,SAAS,cAAcI,EAAyBC,CAAmB,EACxE,KAAK,0CAA0CA,CAAmB,CACpE,CACF,CAEA,OAAQ,CACN,QAAWL,KAAM,KAAK,oBAAqB,CACzC,GAAM,CAACI,CAAuB,EAAI,KAAK,oBAAoBJ,CAAE,EAC7D,KAAK,wCAAwCI,CAAuB,EACpE,KAAK,uCAAuCA,CAAuB,EACnE,KAAK,SAAS,aAAaA,CAAuB,CACpD,CACF,CAEA,0CAA0CgC,EAAkB,CAC1D,IAAMC,EAAcC,GAAqCF,CAAgB,EACzEA,EAAiB,YAAYC,CAAW,CAC1C,CAEA,wCAAwCD,EAAkB,CACxD,IAAMG,EAAQH,EAAiB,UAAU,EAAI,EAC7CA,EAAiB,YAAYG,CAAK,CACpC,CAEA,uCAAuCH,EAAkB,CACvD,IAAMC,EAAc,KAAK,mBAAmBD,EAAiB,EAAE,EAC/DC,GAAA,MAAAA,EAAa,YAAYD,EAC3B,CAEA,mBAAmBpC,EAAI,CACrB,OAAO,KAAK,aAAa,KAAMvM,GAAYA,EAAQ,SAAWuM,CAAE,CAClE,CAEA,IAAI,cAAe,CACjB,MAAO,CAAC,GAAG,SAAS,iBAAiB,iDAAiD,CAAC,CACzF,CACF,EAEA,SAASsC,GAAqCF,EAAkB,CAC9D,IAAM3O,EAAU,SAAS,cAAc,MAAM,EAC7C,OAAAA,EAAQ,aAAa,OAAQ,6BAA6B,EAC1DA,EAAQ,aAAa,UAAW2O,EAAiB,EAAE,EAC5C3O,CACT,CAryDA,IAAA+O,GAuyDMC,GAAN,KAAe,CAOb,YAAYC,EAAiBC,EAAa1B,EAAWE,EAAa,GAAM,CANxE9I,GAAA,KAAAmK,GAAiB,MAOf,KAAK,gBAAkBE,EACvB,KAAK,YAAcC,EACnB,KAAK,UAAY1B,EACjB,KAAK,WAAaE,EAClB,KAAK,cAAgB,KAAK,YAAY,cACtC,KAAK,QAAU,IAAI,QAAQ,CAACtM,EAAS+N,IAAY,KAAK,mBAAqB,CAAE,QAAA/N,EAAS,OAAA+N,CAAO,CAAE,CACjG,CAXA,OAAO,cAAcC,EAAgBC,EAAY,CAEjD,CAWA,IAAI,cAAe,CACjB,MAAO,EACT,CAEA,IAAI,iBAAkB,CACpB,MAAO,EACT,CAEA,IAAI,cAAe,CAEnB,CAEA,iBAAkB,CAElB,CAEA,QAAS,CAET,CAEA,iBAAkB,CACZ,KAAK,qBACP,KAAK,mBAAmB,QAAQ,EAChC,OAAO,KAAK,mBAEhB,CAEA,MAAM,4BAA4B1L,EAAU,CAC1C,MAAM8K,GAAM,4BAA4B,KAAM,KAAK,oBAAqB9K,CAAQ,CAClF,CAEA,gCAAiC,CAC/B,GAAI,KAAK,gBAAiB,CACxB,IAAM3D,EAAU,KAAK,kBAAkB,0BACnCA,GACFA,EAAQ,MAAM,CAElB,CACF,CAIA,cAAc2M,EAAyB,CACjC9H,GAAA,KAAKkK,KAELpC,EAAwB,SAAS,KAAK,gBAAgB,aAAa,GACrE7H,GAAA,KAAKiK,GAAiB,KAAK,gBAAgB,cAE/C,CAEA,aAAapC,EAAyB,CAChCA,EAAwB,SAAS9H,GAAA,KAAKkK,GAAc,GAAKlK,GAAA,KAAKkK,cAA0B,cAC1FlK,GAAA,KAAKkK,IAAe,MAAM,EAE1BjK,GAAA,KAAKiK,GAAiB,MAE1B,CAEA,IAAI,mBAAoB,CACtB,OAAO,KAAK,YAAY,YAAc,KAAK,YAAc,KAAK,eAChE,CAEA,IAAI,gBAAiB,CACnB,OAAO,KAAK,gBAAgB,OAC9B,CAEA,IAAI,YAAa,CACf,OAAO,KAAK,YAAY,OAC1B,CAEA,IAAI,qBAAsB,CACxB,OAAO,KAAK,gBAAgB,kCAAkC,KAAK,WAAW,CAChF,CAEA,IAAI,cAAe,CACjB,MAAO,SACT,CACF,EA5FEA,GAAA,YA8FF,IAAMO,GAAN,cAA4BN,EAAS,CACnC,OAAO,cAAcI,EAAgBC,EAAY,CAv4DnD,IAAA3P,EAw4DI,IAAM6P,EAAmB,SAAS,YAAY,EAC9CA,EAAiB,mBAAmBH,CAAc,EAClDG,EAAiB,eAAe,EAEhC,IAAMC,EAAeH,EACfI,GAAc/P,EAAA8P,EAAa,gBAAb,YAAA9P,EAA4B,cAC5C+P,IACFA,EAAY,mBAAmBD,CAAY,EAC3CJ,EAAe,YAAYK,EAAY,gBAAgB,CAAC,EAE5D,CAEA,YAAY1H,EAAUkH,EAAiBC,EAAaQ,EAAelC,EAAWE,EAAa,GAAM,CAC/F,MAAMuB,EAAiBC,EAAaQ,EAAelC,EAAWE,CAAU,EACxE,KAAK,SAAW3F,CAClB,CAEA,IAAI,cAAe,CACjB,MAAO,EACT,CAEA,MAAM,QAAS,CACb,MAAM9G,GAAY,EAClB,KAAK,4BAA4B,IAAM,CACrC,KAAK,iBAAiB,CACxB,CAAC,EACD,KAAK,oBAAoB,EACzB,MAAMA,GAAY,EAClB,KAAK,+BAA+B,EACpC,MAAMA,GAAY,EAClB,KAAK,uBAAuB,CAC9B,CAEA,kBAAmB,CACjB,KAAK,SAAS,gBAAgB,KAAK,eAAgB,KAAK,UAAU,EAClE,KAAK,cAAc,KAAK,eAAgB,KAAK,UAAU,CACzD,CAEA,qBAAsB,CACpB,GAAI,KAAK,eAAe,YAAc,KAAK,WAAW,WAAY,CAChE,IAAMjB,EAAU,KAAK,eAAe,kBAC9B2P,EAAQC,GAA0B,KAAK,eAAe,aAAa,uBAAuB,EAAG,KAAK,EAClGC,EAAWC,GAAmB,KAAK,eAAe,aAAa,0BAA0B,EAAG,MAAM,EAExG,GAAI9P,EACF,OAAAA,EAAQ,eAAe,CAAE,MAAA2P,EAAO,SAAAE,CAAS,CAAC,EACnC,EAEX,CACA,MAAO,EACT,CAEA,wBAAyB,CACvB,QAAWnG,KAAsB,KAAK,kBAAmB,CACvD,IAAMqG,EAAyBhQ,GAAsB2J,CAAkB,EACvEA,EAAmB,YAAYqG,CAAsB,CACvD,CACF,CAEA,IAAI,mBAAoB,CACtB,OAAO,KAAK,eAAe,iBAAiB,QAAQ,CACtD,CACF,EAEA,SAASH,GAA0BpQ,EAAOwQ,EAAc,CACtD,OAAIxQ,GAAS,OAASA,GAAS,SAAWA,GAAS,UAAYA,GAAS,UAC/DA,EAEAwQ,CAEX,CAEA,SAASF,GAAmBtQ,EAAOwQ,EAAc,CAC/C,OAAIxQ,GAAS,QAAUA,GAAS,SACvBA,EAEAwQ,CAEX,CAkGA,IAAIC,IAAa,UAAY,CAwB3B,IAAMC,EAAO,IAAM,CAAC,EAKdC,EAAW,CACf,WAAY,YACZ,UAAW,CACT,gBAAiBD,EACjB,eAAgBA,EAChB,kBAAmBA,EACnB,iBAAkBA,EAClB,kBAAmBA,EACnB,iBAAkBA,EAClB,uBAAwBA,CAC1B,EACA,KAAM,CACJ,MAAO,QACP,eAAiBE,GAAQA,EAAI,aAAa,aAAa,IAAM,OAC7D,eAAiBA,GAAQA,EAAI,aAAa,cAAc,IAAM,OAC9D,aAAcF,EACd,iBAAkBA,CACpB,EACA,aAAc,EAChB,EAUA,SAASG,EAAMC,EAASC,EAAY5L,EAAS,CAAC,EAAG,CAC/C2L,EAAUE,EAAiBF,CAAO,EAClC,IAAMG,EAAUC,EAAgBH,CAAU,EACpCI,EAAMC,EAAmBN,EAASG,EAAS9L,CAAM,EAEjDkM,GAAeC,EAAoBH,EAAK,IACrCI,EACLJ,EACAL,EACAG,EACkCE,GAC5BA,EAAI,aAAe,aACrBK,EAAcL,EAAKL,EAASG,CAAO,EAC5B,MAAM,KAAKH,EAAQ,UAAU,GAE7BW,EAAeN,EAAKL,EAASG,CAAO,CAGjD,CACD,EAED,OAAAE,EAAI,OAAO,OAAO,EACXE,EACT,CAUA,SAASI,EAAeN,EAAKL,EAASG,EAAS,CAC7C,IAAMS,EAAYR,EAAgBJ,CAAO,EACzC,OAAAU,EACEL,EACAO,EACAT,EAEAH,EACAA,EAAQ,WACV,EAEO,MAAM,KAAKY,EAAU,UAAU,CACxC,CAOA,SAASJ,EAAoBH,EAAKvM,EAAI,CAtqExC,IAAA1E,EAuqEI,GAAI,CAACiR,EAAI,OAAO,aAAc,OAAOvM,EAAG,EACxC,IAAI+M,EAEA,SAAS,cAIb,GACE,EACEA,aAAyB,kBACzBA,aAAyB,qBAG3B,OAAO/M,EAAG,EAGZ,GAAM,CAAE,GAAIgN,EAAiB,eAAAC,EAAgB,aAAAC,EAAa,EAAIH,EAExDI,EAAUnN,EAAG,EAEnB,OACEgN,GACAA,MAAoB1R,EAAA,SAAS,gBAAT,YAAAA,EAAwB,aAAa,SAEzDyR,EAAgBR,EAAI,OAAO,cAAc,QAAQS,CAAe,IAAI,EACpED,GAAA,MAAAA,EAAe,SAEbA,GAAiB,CAACA,EAAc,cAAgBG,IAClDH,EAAc,kBAAkBE,EAAgBC,EAAY,EAGvDC,CACT,CAEA,IAAMP,GAAiB,UAAY,CA2BjC,SAASA,EACPL,EACAO,EACAM,EACAC,GAAiB,KACjBC,GAAW,KACX,CAGER,aAAqB,qBACrBM,aAAqB,sBAGrBN,EAAYA,EAAU,QAEtBM,EAAYA,EAAU,SAExBC,QAAmBP,EAAU,YAG7B,QAAWS,MAAYH,EAAU,WAAY,CAE3C,GAAIC,IAAkBA,IAAkBC,GAAU,CAChD,IAAME,GAAYC,EAChBlB,EACAgB,GACAF,GACAC,EACF,EACA,GAAIE,GAAW,CAETA,KAAcH,IAChBK,EAAmBnB,EAAKc,GAAgBG,EAAS,EAEnDG,EAAUH,GAAWD,GAAUhB,CAAG,EAClCc,GAAiBG,GAAU,YAC3B,QACF,CACF,CAGA,GAAID,cAAoB,QAAS,CAE/B,IAAMK,GACJL,GAAS,aAAa,IAAI,EAE5B,GAAIhB,EAAI,cAAc,IAAIqB,EAAU,EAAG,CAErC,IAAMC,GAAaC,GACjBhB,EACAc,GACAP,GACAd,CACF,EACAoB,EAAUE,GAAYN,GAAUhB,CAAG,EACnCc,GAAiBQ,GAAW,YAC5B,QACF,CACF,CAGA,IAAME,GAAeC,EACnBlB,EACAS,GACAF,GACAd,CACF,EAEIwB,KACFV,GAAiBU,GAAa,YAElC,CAGA,KAAOV,IAAkBA,IAAkBC,IAAU,CACnD,IAAMW,GAAWZ,GACjBA,GAAiBA,GAAe,YAChCa,EAAW3B,EAAK0B,EAAQ,CAC1B,CACF,CAYA,SAASD,EAAWlB,EAAWS,EAAUF,EAAgBd,GAAK,CAC5D,GAAIA,GAAI,UAAU,gBAAgBgB,CAAQ,IAAM,GAAO,OAAO,KAC9D,GAAIhB,GAAI,MAAM,IAAIgB,CAAQ,EAAG,CAE3B,IAAMY,GAAgB,SAAS,cACLZ,EAAU,OACpC,EACA,OAAAT,EAAU,aAAaqB,GAAed,CAAc,EACpDM,EAAUQ,GAAeZ,EAAUhB,EAAG,EACtCA,GAAI,UAAU,eAAe4B,EAAa,EACnCA,EACT,KAAO,CAEL,IAAMC,GAAiB,SAAS,WAAWb,EAAU,EAAI,EACzD,OAAAT,EAAU,aAAasB,GAAgBf,CAAc,EACrDd,GAAI,UAAU,eAAe6B,EAAc,EACpCA,EACT,CACF,CAKA,IAAMX,GAAiB,UAAY,CAWjC,SAASA,EAAclB,GAAK9D,GAAM4F,GAAYf,GAAU,CACtD,IAAIgB,GAAY,KACZC,GAAc9F,GAAK,YACnB+F,GAAwB,EAExBC,GAASJ,GACb,KAAOI,IAAUA,IAAUnB,IAAU,CAEnC,GAAIoB,EAAYD,GAAQhG,EAAI,EAAG,CAC7B,GAAIkG,EAAapC,GAAKkC,GAAQhG,EAAI,EAChC,OAAOgG,GAILH,KAAc,OAEX/B,GAAI,MAAM,IAAIkC,EAAM,IAEvBH,GAAYG,IAGlB,CAsBA,GApBEH,KAAc,MACdC,IACAG,EAAYD,GAAQF,EAAW,IAI/BC,KACAD,GAAcA,GAAY,YAKtBC,IAAyB,IAC3BF,GAAY,SAOZ/B,GAAI,wBAAwB,SAASkC,EAAM,EAAG,MAElDA,GAASA,GAAO,WAClB,CAEA,OAAOH,IAAa,IACtB,CASA,SAASK,EAAapC,GAAKL,GAASG,GAAS,CAC3C,IAAIuC,GAASrC,GAAI,MAAM,IAAIL,EAAO,EAC9B2C,GAAStC,GAAI,MAAM,IAAIF,EAAO,EAElC,GAAI,CAACwC,IAAU,CAACD,GAAQ,MAAO,GAE/B,QAAWzG,MAAMyG,GAKf,GAAIC,GAAO,IAAI1G,EAAE,EACf,MAAO,GAGX,MAAO,EACT,CAQA,SAASuG,EAAYxC,GAASG,GAAS,CAn7E7C,IAAA/Q,GAAAC,GAAAuT,GAq7EQ,IAAMC,GAAiC7C,GACjC8C,GAAiC3C,GAEvC,OACE0C,GAAO,WAAaC,GAAO,UAC3BD,GAAO,UAAYC,GAAO,UAKzB,GAAC1T,GAAAyT,GAAO,eAAP,MAAAzT,GAAA,KAAAyT,GAAsB,UACtBxT,GAAAwT,GAAO,eAAP,YAAAxT,GAAA,KAAAwT,GAAsB,WAAUD,GAAAE,GAAO,eAAP,YAAAF,GAAA,KAAAE,GAAsB,OAE5D,CAEA,OAAOvB,CACT,GAAG,EAaH,SAASS,EAAW3B,EAAK9D,EAAM,CAl9EnC,IAAAnN,EAo9EM,GAAIiR,EAAI,MAAM,IAAI9D,CAAI,EAEpBwG,EAAW1C,EAAI,OAAQ9D,EAAM,IAAI,MAC5B,CAEL,GAAI8D,EAAI,UAAU,kBAAkB9D,CAAI,IAAM,GAAO,QACrDnN,EAAAmN,EAAK,aAAL,MAAAnN,EAAiB,YAAYmN,GAC7B8D,EAAI,UAAU,iBAAiB9D,CAAI,CACrC,CACF,CASA,SAASiF,EAAmBnB,EAAK2C,EAAgBC,EAAc,CAE7D,IAAIV,GAASS,EAEb,KAAOT,IAAUA,KAAWU,GAAc,CACxC,IAAIlB,GAAgCQ,GACpCA,GAASA,GAAO,YAChBP,EAAW3B,EAAK0B,EAAQ,CAC1B,CACA,OAAOQ,EACT,CAYA,SAASX,GAAesB,EAAYjH,EAAIzI,EAAO6M,GAAK,CA5/ExD,IAAAjR,GAAAC,GA6/EM,IAAMiB,KAKDjB,IAAAD,GAAAiR,GAAI,QAAO,eAAX,YAAAhR,GAAA,KAAAD,GAA0B,SAAU6M,GAAMoE,GAAI,QAC7CA,GAAI,OAAO,cAAc,QAAQpE,CAAE,IAAI,GACvCoE,GAAI,OAAO,cAAc,QAAQpE,CAAE,IAAI,EAE7C,OAAAkH,EAAiC7S,GAAQ+P,EAAG,EAC5C0C,EAAWG,EAAY5S,GAAQkD,CAAK,EAC7BlD,EACT,CAUA,SAAS6S,EAAiCzT,EAAS2Q,EAAK,CAEtD,IAAMpE,EAA4BvM,EAAQ,aAAa,IAAI,EAE3D,KAAQA,EAAUA,EAAQ,YAAa,CACrC,IAAI0T,GAAQ/C,EAAI,MAAM,IAAI3Q,CAAO,EAC7B0T,KACFA,GAAM,OAAOnH,CAAE,EACVmH,GAAM,MACT/C,EAAI,MAAM,OAAO3Q,CAAO,EAG9B,CACF,CAYA,SAASqT,EAAWG,EAAYxT,EAAS8D,EAAO,CAE9C,GAAI0P,EAAW,WACb,GAAI,CAEFA,EAAW,WAAWxT,EAAS8D,CAAK,CACtC,OAAS6P,GAAG,CAEVH,EAAW,aAAaxT,EAAS8D,CAAK,CACxC,MAEA0P,EAAW,aAAaxT,EAAS8D,CAAK,CAE1C,CAEA,OAAOkN,CACT,GAAG,EAKGe,GAAa,UAAY,CAO7B,SAASA,EAAUzB,EAASC,EAAYI,EAAK,CAC3C,OAAIA,EAAI,cAAgBL,IAAY,SAAS,cAEpC,MAGLK,EAAI,UAAU,kBAAkBL,EAASC,CAAU,IAAM,KAIzDD,aAAmB,iBAAmBK,EAAI,KAAK,SACjDL,aAAmB,iBACnBK,EAAI,KAAK,QAAU,QAGnBiD,EACEtD,EACgCC,EAChCI,CACF,GAEAkD,EAAgBvD,EAASC,EAAYI,CAAG,EACnCmD,GAA2BxD,EAASK,CAAG,GAE1CK,EAAcL,EAAKL,EAASC,CAAU,IAG1CI,EAAI,UAAU,iBAAiBL,EAASC,CAAU,GAC3CD,EACT,CAUA,SAASuD,EAAgBvD,EAASG,EAASE,EAAK,CAC9C,IAAItC,EAAOoC,EAAQ,SAInB,GAAIpC,IAAS,EAAsB,CACjC,IAAM8E,EAAiC7C,EACjC8C,GAAiC3C,EAEjCsD,GAAgBZ,EAAO,WACvBa,GAAgBZ,GAAO,WAC7B,QAAWa,MAAgBD,GACrBE,EAAgBD,GAAa,KAAMd,EAAQ,SAAUxC,CAAG,GAGxDwC,EAAO,aAAac,GAAa,IAAI,IAAMA,GAAa,OAC1Dd,EAAO,aAAac,GAAa,KAAMA,GAAa,KAAK,EAI7D,QAASjS,GAAI+R,GAAc,OAAS,EAAG,GAAK/R,GAAGA,KAAK,CAClD,IAAMmS,GAAeJ,GAAc/R,EAAC,EAIpC,GAAKmS,IAED,CAACf,GAAO,aAAae,GAAa,IAAI,EAAG,CAC3C,GAAID,EAAgBC,GAAa,KAAMhB,EAAQ,SAAUxC,CAAG,EAC1D,SAEFwC,EAAO,gBAAgBgB,GAAa,IAAI,CAC1C,CACF,CAEKL,GAA2BX,EAAQxC,CAAG,GACzCyD,EAAejB,EAAQC,GAAQzC,CAAG,CAEtC,EAGItC,IAAS,GAAmBA,IAAS,IACnCiC,EAAQ,YAAcG,EAAQ,YAChCH,EAAQ,UAAYG,EAAQ,UAGlC,CAYA,SAAS2D,EAAeC,EAAYhF,EAAYsB,EAAK,CACnD,GACE0D,aAAsB,kBACtBhF,aAAsB,kBACtBA,EAAW,OAAS,OACpB,CACA,IAAIiF,EAAWjF,EAAW,MACtBkF,EAAWF,EAAW,MAG1BG,EAAqBH,EAAYhF,EAAY,UAAWsB,CAAG,EAC3D6D,EAAqBH,EAAYhF,EAAY,WAAYsB,CAAG,EAEvDtB,EAAW,aAAa,OAAO,EAKzBkF,IAAaD,IACjBJ,EAAgB,QAASG,EAAY,SAAU1D,CAAG,IACrD0D,EAAW,aAAa,QAASC,CAAQ,EACzCD,EAAW,MAAQC,IAPhBJ,EAAgB,QAASG,EAAY,SAAU1D,CAAG,IACrD0D,EAAW,MAAQ,GACnBA,EAAW,gBAAgB,OAAO,EAUxC,SACEA,aAAsB,mBACtBhF,aAAsB,kBAEtBmF,EAAqBH,EAAYhF,EAAY,WAAYsB,CAAG,UAE5D0D,aAAsB,qBACtBhF,aAAsB,oBACtB,CACA,IAAIiF,EAAWjF,EAAW,MACtBkF,EAAWF,EAAW,MAC1B,GAAIH,EAAgB,QAASG,EAAY,SAAU1D,CAAG,EACpD,OAEE2D,IAAaC,IACfF,EAAW,MAAQC,GAGnBD,EAAW,YACXA,EAAW,WAAW,YAAcC,IAEpCD,EAAW,WAAW,UAAYC,EAEtC,CACF,CAQA,SAASE,EAAqBH,EAAYhF,EAAYjN,EAAeuO,EAAK,CAExE,IAAM8D,EAAepF,EAAWjN,CAAa,EAE3CsS,GAAeL,EAAWjS,CAAa,EACzC,GAAIqS,IAAiBC,GAAc,CACjC,IAAMC,GAAeT,EACnB9R,EACAiS,EACA,SACA1D,CACF,EACKgE,KAGHN,EAAWjS,CAAa,EAAIiN,EAAWjN,CAAa,GAElDqS,EACGE,IAGHN,EAAW,aAAajS,EAAe,EAAE,EAGtC8R,EAAgB9R,EAAeiS,EAAY,SAAU1D,CAAG,GAC3D0D,EAAW,gBAAgBjS,CAAa,CAG9C,CACF,CASA,SAAS8R,EAAgBU,EAAM5U,EAAS6U,EAAYlE,EAAK,CACvD,OACEiE,IAAS,SACTjE,EAAI,mBACJ3Q,IAAY,SAAS,cAEd,GAGP2Q,EAAI,UAAU,uBAAuBiE,EAAM5U,EAAS6U,CAAU,IAC9D,EAEJ,CAOA,SAASf,GAA2BgB,EAAuBnE,EAAK,CAC9D,MACE,CAAC,CAACA,EAAI,mBACNmE,IAA0B,SAAS,eACnCA,IAA0B,SAAS,IAEvC,CAEA,OAAO/C,CACT,GAAG,EAYH,SAAShB,EAAiBJ,EAAKL,EAASG,EAAS9M,EAAU,CACzD,GAAIgN,EAAI,KAAK,MAAO,CAClB,IAAMoE,EAAUzE,EAAQ,cAAc,MAAM,EACtC0E,GAAUvE,EAAQ,cAAc,MAAM,EAC5C,GAAIsE,GAAWC,GAAS,CACtB,IAAMC,EAAWrB,EAAkBmB,EAASC,GAASrE,CAAG,EAExD,OAAO,QAAQ,IAAIsE,CAAQ,EAAE,KAAK,IAAM,CACtC,IAAMC,EAAS,OAAO,OAAOvE,EAAK,CAChC,KAAM,CACJ,MAAO,GACP,OAAQ,EACV,CACF,CAAC,EACD,OAAOhN,EAASuR,CAAM,CACxB,CAAC,CACH,CACF,CAEA,OAAOvR,EAASgN,CAAG,CACrB,CAUA,SAASiD,EAAkBmB,EAASC,EAASrE,EAAK,CAChD,IAAIwE,EAAQ,CAAC,EACTC,EAAU,CAAC,EACXC,GAAY,CAAC,EACbC,EAAgB,CAAC,EAGjBC,EAAoB,IAAI,IAC5B,QAAWC,KAAgBR,EAAQ,SACjCO,EAAkB,IAAIC,EAAa,UAAWA,CAAY,EAI5D,QAAWC,KAAkBV,EAAQ,SAAU,CAE7C,IAAIW,EAAeH,EAAkB,IAAIE,EAAe,SAAS,EAC7DE,GAAehF,EAAI,KAAK,eAAe8E,CAAc,EACrDG,GAAcjF,EAAI,KAAK,eAAe8E,CAAc,EACpDC,GAAgBE,GACdD,GAEFP,EAAQ,KAAKK,CAAc,GAI3BF,EAAkB,OAAOE,EAAe,SAAS,EACjDJ,GAAU,KAAKI,CAAc,GAG3B9E,EAAI,KAAK,QAAU,SAGjBgF,KACFP,EAAQ,KAAKK,CAAc,EAC3BH,EAAc,KAAKG,CAAc,GAI/B9E,EAAI,KAAK,aAAa8E,CAAc,IAAM,IAC5CL,EAAQ,KAAKK,CAAc,CAInC,CAIAH,EAAc,KAAK,GAAGC,EAAkB,OAAO,CAAC,EAEhD,IAAIN,EAAW,CAAC,EAChB,QAAWxE,KAAW6E,EAAe,CAEnC,IAAIlC,EACF,SAAS,YAAY,EAAE,yBAAyB3C,EAAQ,SAAS,EAC9D,WAEL,GAAIE,EAAI,UAAU,gBAAgByC,CAAM,IAAM,GAAO,CACnD,GACG,SAAUA,GAAUA,EAAO,MAC3B,QAASA,GAAUA,EAAO,IAC3B,CACsC,IAAIhS,GACtCyU,GAAU,IAAI,QAAQ,SAAUC,GAAU,CAC5C1U,GAAU0U,EACZ,CAAC,EACD1C,EAAO,iBAAiB,OAAQ,UAAY,CAC1ChS,GAAQ,CACV,CAAC,EACD6T,EAAS,KAAKY,EAAO,CACvB,CACAd,EAAQ,YAAY3B,CAAM,EAC1BzC,EAAI,UAAU,eAAeyC,CAAM,EACnC+B,EAAM,KAAK/B,CAAM,CACnB,CACF,CAIA,QAAW2C,KAAkBX,EACvBzE,EAAI,UAAU,kBAAkBoF,CAAc,IAAM,KACtDhB,EAAQ,YAAYgB,CAAc,EAClCpF,EAAI,UAAU,iBAAiBoF,CAAc,GAIjD,OAAApF,EAAI,KAAK,iBAAiBoE,EAAS,CACjC,MAAOI,EACP,KAAME,GACN,QAASD,CACX,CAAC,EACMH,CACT,CAKA,IAAMrE,GAAsB,UAAY,CAQtC,SAASA,EAAmBN,EAASC,EAAY5L,EAAQ,CACvD,GAAM,CAAE,cAAAqR,GAAe,MAAAC,EAAM,EAAIC,EAAa5F,EAASC,CAAU,EAE3D4F,GAAeC,EAAczR,CAAM,EACnC0R,GAAaF,GAAa,YAAc,YAC9C,GAAI,CAAC,CAAC,YAAa,WAAW,EAAE,SAASE,EAAU,EACjD,KAAM,wCAAwCA,EAAU,GAG1D,MAAO,CACL,OAAQ/F,EACR,WAAYC,EACZ,OAAQ4F,GACR,WAAYE,GACZ,aAAcF,GAAa,aAC3B,kBAAmBA,GAAa,kBAChC,aAAcA,GAAa,aAC3B,MAAOF,GACP,cAAeD,GACf,OAAQM,EAAa,EACrB,wBAAyBC,EAA8BjG,CAAO,EAC9D,UAAW6F,GAAa,UACxB,KAAMA,GAAa,IACrB,CACF,CAQA,SAASC,EAAczR,EAAQ,CAC7B,IAAI6R,EAAc,OAAO,OAAO,CAAC,EAAGrG,CAAQ,EAG5C,cAAO,OAAOqG,EAAa7R,CAAM,EAGjC6R,EAAY,UAAY,OAAO,OAC7B,CAAC,EACDrG,EAAS,UACTxL,EAAO,SACT,EAGA6R,EAAY,KAAO,OAAO,OAAO,CAAC,EAAGrG,EAAS,KAAMxL,EAAO,IAAI,EAExD6R,CACT,CAKA,SAASF,GAAe,CACtB,IAAMG,EAAS,SAAS,cAAc,KAAK,EAC3C,OAAAA,EAAO,OAAS,GAChB,SAAS,KAAK,sBAAsB,WAAYA,CAAM,EAC/CA,CACT,CAMA,SAASF,EAA8BjG,EAAS,CAE9C,IAAIoG,EAA0B,CAAC,EAC3BtG,EAAM,SAAS,cACnB,IAAIA,GAAA,YAAAA,EAAK,WAAY,QAAUE,EAAQ,SAASF,CAAG,EACjD,KAAOA,IACLsG,EAAwB,KAAKtG,CAAG,EAC5BA,IAAQE,IACZF,EAAMA,EAAI,cAGd,OAAOsG,CACT,CAQA,SAASC,EAAeC,EAAM,CA5gGlC,IAAAlX,EA6gGM,IAAI2C,EAAW,MAAM,KAAKuU,EAAK,iBAAiB,MAAM,CAAC,EAEvD,OAAIlX,EAAAkX,EAAK,eAAL,MAAAlX,EAAA,KAAAkX,EAAoB,OACtBvU,EAAS,KAAKuU,CAAI,EAEbvU,CACT,CAaA,SAASwU,GAAsBZ,EAAOD,EAAeY,EAAMvU,GAAU,CACnE,QAAW+N,MAAO/N,GAAU,CAE1B,IAAMkK,GAA4B6D,GAAI,aAAa,IAAI,EACvD,GAAI4F,EAAc,IAAIzJ,EAAE,EAAG,CAEzB,IAAIuK,GAAU1G,GAGd,KAAO0G,IAAS,CACd,IAAIpD,GAAQuC,EAAM,IAAIa,EAAO,EAQ7B,GANIpD,IAAS,OACXA,GAAQ,IAAI,IACZuC,EAAM,IAAIa,GAASpD,EAAK,GAE1BA,GAAM,IAAInH,EAAE,EAERuK,KAAYF,EAAM,MACtBE,GAAUA,GAAQ,aACpB,CACF,CACF,CACF,CAYA,SAASZ,EAAaa,EAAYxG,EAAY,CAC5C,IAAMyG,EAAgBL,EAAeI,CAAU,EACzCE,GAAgBN,EAAepG,CAAU,EAEzCyF,GAAgBkB,EAAoBF,EAAeC,EAAa,EAGlEhB,GAAQ,IAAI,IAChBY,GAAsBZ,GAAOD,GAAee,EAAYC,CAAa,EAGrE,IAAMG,GAAU5G,EAAW,iBAAmBA,EAC9C,OAAAsG,GAAsBZ,GAAOD,GAAemB,GAASF,EAAa,EAE3D,CAAE,cAAAjB,GAAe,MAAAC,EAAM,CAChC,CASA,SAASiB,EAAoBF,EAAeC,EAAe,CACzD,IAAIG,EAAe,IAAI,IAGnBC,GAAkB,IAAI,IAC1B,OAAW,CAAE,GAAA9K,GAAI,QAAA+K,EAAQ,IAAKN,EACxBK,GAAgB,IAAI9K,EAAE,EACxB6K,EAAa,IAAI7K,EAAE,EAEnB8K,GAAgB,IAAI9K,GAAI+K,EAAO,EAInC,IAAItB,GAAgB,IAAI,IACxB,OAAW,CAAE,GAAAzJ,GAAI,QAAA+K,EAAQ,IAAKL,EACxBjB,GAAc,IAAIzJ,EAAE,EACtB6K,EAAa,IAAI7K,EAAE,EACV8K,GAAgB,IAAI9K,EAAE,IAAM+K,IACrCtB,GAAc,IAAIzJ,EAAE,EAKxB,QAAWA,MAAM6K,EACfpB,GAAc,OAAOzJ,EAAE,EAEzB,OAAOyJ,EACT,CAEA,OAAOpF,CACT,GAAG,EAKG,CAAE,iBAAAJ,EAAkB,gBAAAE,CAAgB,GAAK,UAAY,CAEzD,IAAM6G,EAAuB,IAAI,QAOjC,SAAS/G,EAAiBrN,GAAS,CACjC,OAAIA,cAAmB,SACdA,GAAQ,gBAERA,EAEX,CAOA,SAASuN,EAAgBH,GAAY,CACnC,GAAIA,IAAc,KAChB,OAAO,SAAS,cAAc,KAAK,EAC9B,GAAI,OAAOA,IAAe,SAC/B,OAAOG,EAAgB8G,EAAajH,EAAU,CAAC,EAC1C,GACLgH,EAAqB,IAA4BhH,EAAW,EAG5D,OAA+BA,GAC1B,GAAIA,cAAsB,KAAM,CACrC,GAAIA,GAAW,WAKb,OAA2B,IAAIkH,EAAiBlH,EAAU,EACrD,CAEL,IAAMmH,EAAc,SAAS,cAAc,KAAK,EAChD,OAAAA,EAAY,OAAOnH,EAAU,EACtBmH,CACT,CACF,KAAO,CAGL,IAAMA,EAAc,SAAS,cAAc,KAAK,EAChD,QAAWtH,IAAO,CAAC,GAAGG,EAAU,EAC9BmH,EAAY,OAAOtH,CAAG,EAExB,OAAOsH,CACT,CACF,CASA,MAAMD,CAAiB,CAErB,YAAY5K,EAAM,CAChB,KAAK,aAAeA,EACpB,KAAK,eAAyCA,EAAK,WACnD,KAAK,gBAAkBA,EAAK,gBAC5B,KAAK,YAAcA,EAAK,WAC1B,CAGA,IAAI,YAAa,CAEf,IAAM8K,EAAQ,CAAC,EACX9E,EAAS,KAAK,gBACd,KAAK,gBAAgB,YACrB,KAAK,eAAe,WACxB,KAAOA,GAAUA,GAAU,KAAK,aAC9B8E,EAAM,KAAK9E,CAAM,EACjBA,EAASA,EAAO,YAElB,OAAO8E,CACT,CAMA,iBAAiBrU,EAAU,CACzB,OAAO,KAAK,WAAW,OAAO,CAACiO,EAAS1E,IAAS,CAC/C,GAAIA,aAAgB,QAAS,CACvBA,EAAK,QAAQvJ,CAAQ,GAAGiO,EAAQ,KAAK1E,CAAI,EAC7C,IAAM+K,EAAW/K,EAAK,iBAAiBvJ,CAAQ,EAC/C,QAAStB,EAAI,EAAGA,EAAI4V,EAAS,OAAQ5V,IACnCuP,EAAQ,KAAKqG,EAAS5V,CAAC,CAAC,CAE5B,CACA,OAAOuP,CACT,EAA6B,CAAC,CAAE,CAClC,CAOA,aAAa1E,EAAMgL,EAAe,CAChC,OAAO,KAAK,eAAe,aAAahL,EAAMgL,CAAa,CAC7D,CAOA,WAAWhL,EAAMgL,EAAe,CAE9B,OAAO,KAAK,eAAe,WAAWhL,EAAMgL,CAAa,CAC3D,CAMA,IAAI,iBAAkB,CACpB,OAAO,KAAK,YACd,CACF,CAOA,SAASL,EAAajH,GAAY,CAChC,IAAIuH,EAAS,IAAI,UAGbC,EAAyBxH,GAAW,QACtC,uCACA,EACF,EAGA,GACEwH,EAAuB,MAAM,UAAU,GACvCA,EAAuB,MAAM,UAAU,GACvCA,EAAuB,MAAM,UAAU,EACvC,CACA,IAAI5U,EAAU2U,EAAO,gBAAgBvH,GAAY,WAAW,EAE5D,GAAIwH,EAAuB,MAAM,UAAU,EACzC,OAAAR,EAAqB,IAAIpU,CAAO,EACzBA,EACF,CAEL,IAAI6U,EAAc7U,EAAQ,WAC1B,OAAI6U,GACFT,EAAqB,IAAIS,CAAW,EAE/BA,CACT,CACF,KAAO,CAOL,IAAI7U,EAJc2U,EAAO,gBACvB,mBAAqBvH,GAAa,qBAClC,WACF,EAEc,KAAK,cAAc,UAAU,EACzC,QACF,OAAAgH,EAAqB,IAAIpU,CAAO,EACzBA,CACT,CACF,CAEA,MAAO,CAAE,iBAAAqN,EAAkB,gBAAAE,CAAgB,CAC7C,GAAG,EAKH,MAAO,CACL,MAAAL,EACA,SAAAF,CACF,CACF,GAAG,EAUH,SAAS8H,GAAc7I,EAAgBC,EAAY3P,EAA4B,CAAC,EAAG,CAAhC,IAAAC,EAAAD,EAAE,WAAAwY,CAr0GrD,EAq0GmDvY,EAAgBoH,EAAAoR,GAAhBxY,EAAgB,CAAd,cACnDsQ,GAAU,MAAMb,EAAgBC,EAAYnI,GAAAC,GAAA,GACvCJ,GADuC,CAE1C,UAAW,IAAIqR,GAA0BF,CAAS,CACpD,EAAC,CACH,CAUA,SAASlH,GAAc5B,EAAgBC,EAAYtI,EAAU,CAAC,EAAG,CAC/DkR,GAAc7I,EAAgBC,EAAW,WAAYnI,GAAAC,GAAA,GAChDJ,GADgD,CAEnD,WAAY,WACd,EAAC,CACH,CAEA,SAASsR,GAA+BC,EAAcC,EAAU,CAC9D,OAAOD,aAAwB1Y,IAC7B0Y,EAAa,wBAA0B,CAACC,GAAYC,GAAiCF,EAAcC,CAAQ,IAC3G,CAACD,EAAa,QAAQ,wBAAwB,CAClD,CAEA,SAASE,GAAiCF,EAAcC,EAAU,CAIhE,OAAOA,aAAoB,SAAWA,EAAS,WAAa,eAAiBD,EAAa,KAAOC,EAAS,KACzG,CAACA,EAAS,aAAa,KAAK,GAAKnS,GAAakS,EAAa,IAAKC,EAAS,aAAa,KAAK,CAAC,EAC/F,CAEA,SAASE,GAAmC5L,EAAM,CAChD,OAAOA,EAAK,cAAc,QAAQ,iCAAiC,CACrE,CA32GA,IAAA6L,GA62GMN,GAAN,KAAgC,CAG9B,YAAY,CAAE,kBAAAO,CAAkB,EAAI,CAAC,EAAG,CAFxC/T,GAAA,KAAA8T,IAMApZ,GAAA,uBAAmBuN,GACV,EAAEA,EAAK,IAAMA,EAAK,aAAa,sBAAsB,GAAK,SAAS,eAAeA,EAAK,EAAE,IAGlGvN,GAAA,yBAAoB,CAAC8P,EAAgBC,IAAe,CAClD,GAAID,aAA0B,QAC5B,MAAI,CAACA,EAAe,aAAa,sBAAsB,GAAKvK,GAAA,KAAK6T,IAAL,UAAwBtJ,EAAgBC,GAO3F,CANO3O,GAAS,6BAA8B,CACnD,WAAY,GACZ,OAAQ0O,EACR,OAAQ,CAAE,eAAAA,EAAgB,WAAAC,CAAW,CACvC,CAAC,EAEa,iBAEP,EAGb,GAEA/P,GAAA,8BAAyB,CAAC8C,EAAexB,EAAQgY,IAOxC,CANOlY,GAAS,+BAAgC,CACrD,WAAY,GACZ,OAAAE,EACA,OAAQ,CAAE,cAAAwB,EAAe,aAAAwW,CAAa,CACxC,CAAC,EAEa,kBAGhBtZ,GAAA,yBAAqBuN,GACZ,KAAK,kBAAkBA,CAAI,GAGpCvN,GAAA,wBAAmB,CAAC8P,EAAgBC,IAAe,CAC7CD,aAA0B,SAC5B1O,GAAS,sBAAuB,CAC9B,OAAQ0O,EACR,OAAQ,CAAE,eAAAA,EAAgB,WAAAC,CAAW,CACvC,CAAC,CAEL,GA5CEvK,GAAA,KAAK4T,GAAqBC,IAAsB,IAAM,IACxD,CA4CF,EAhDED,GAAA,YAkDF,IAAMG,GAAN,cAAoCvJ,EAAc,CAChD,OAAO,cAAcF,EAAgBC,EAAY,CAC/C3O,GAAS,2BAA4B,CACnC,OAAQ0O,EACR,OAAQ,CAAE,eAAAA,EAAgB,WAAAC,CAAW,CACvC,CAAC,EAED2B,GAAc5B,EAAgBC,EAAY,CACxC,UAAW,CACT,kBAAmB,CAACxC,EAAM4D,IAEtB4H,GAA+BxL,EAAM4D,CAAO,GAC1CgI,GAAmC5L,CAAI,IAAMuC,GAE/CvC,EAAK,OAAO,EACL,IAEF,EAEX,CACF,CAAC,CACH,CAEA,MAAM,4BAA4BlJ,EAAU,CAC1C,OAAO,MAAMA,EAAS,CACxB,CACF,EAEMmV,GAAN,MAAMA,EAAY,CAyBhB,aAAc,CAJdxZ,GAAA,cAAS,IACTA,GAAA,aAAQ,GACRA,GAAA,eAAU,IAqEVA,GAAA,eAAU,IAAM,CACd,KAAK,SAAS,KAAK,MAAQ,KAAK,OAAO,EAAI,GAAG,CAChD,GApEE,KAAK,kBAAoB,KAAK,wBAAwB,EACtD,KAAK,gBAAkB,KAAK,sBAAsB,EAClD,KAAK,yBAAyB,EAC9B,KAAK,SAAS,CAAC,CACjB,CA3BA,WAAW,YAAa,CACtB,OAAOgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAUOwX,GAAY,iBAAiB;AAAA,oBAC3BA,GAAY,kBAAoB,CAAC,MAAMA,GAAY,kBAAoB,CAAC;AAAA;AAAA;AAAA,KAI1F,CAaA,MAAO,CACA,KAAK,UACR,KAAK,QAAU,GACf,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EAExB,CAEA,MAAO,CACD,KAAK,SAAW,CAAC,KAAK,SACxB,KAAK,OAAS,GACd,KAAK,oBAAoB,IAAM,CAC7B,KAAK,yBAAyB,EAC9B,KAAK,cAAc,EACnB,KAAK,QAAU,GACf,KAAK,OAAS,EAChB,CAAC,EAEL,CAEA,SAAStZ,EAAO,CACd,KAAK,MAAQA,EACb,KAAK,QAAQ,CACf,CAIA,0BAA2B,CACzB,SAAS,KAAK,aAAa,KAAK,kBAAmB,SAAS,KAAK,UAAU,CAC7E,CAEA,wBAAyB,CACvB,KAAK,gBAAgB,MAAM,MAAQ,IACnC,KAAK,gBAAgB,MAAM,QAAU,IACrC,SAAS,gBAAgB,aAAa,KAAK,gBAAiB,SAAS,IAAI,EACzE,KAAK,QAAQ,CACf,CAEA,oBAAoBmE,EAAU,CAC5B,KAAK,gBAAgB,MAAM,QAAU,IACrC,WAAWA,EAAUmV,GAAY,kBAAoB,GAAG,CAC1D,CAEA,0BAA2B,CACrB,KAAK,gBAAgB,YACvB,SAAS,gBAAgB,YAAY,KAAK,eAAe,CAE7D,CAEA,gBAAiB,CACV,KAAK,kBACR,KAAK,gBAAkB,OAAO,YAAY,KAAK,QAASA,GAAY,iBAAiB,EAEzF,CAEA,eAAgB,CACd,OAAO,cAAc,KAAK,eAAe,EACzC,OAAO,KAAK,eACd,CAMA,SAAU,CACR,sBAAsB,IAAM,CAC1B,KAAK,gBAAgB,MAAM,MAAQ,GAAG,GAAK,KAAK,MAAQ,EAAE,GAC5D,CAAC,CACH,CAEA,yBAA0B,CACxB,IAAM9Y,EAAU,SAAS,cAAc,OAAO,EAC9CA,EAAQ,KAAO,WACfA,EAAQ,YAAc8Y,GAAY,WAClC,IAAM5Y,EAAWC,GAAY,EAC7B,OAAID,IACFF,EAAQ,MAAQE,GAEXF,CACT,CAEA,uBAAwB,CACtB,IAAMA,EAAU,SAAS,cAAc,KAAK,EAC5C,OAAAA,EAAQ,UAAY,qBACbA,CACT,CACF,EArHEV,GADIwZ,GACG,oBAAoB,KAD7B,IAAMC,GAAND,GAwHME,GAAN,cAA2B3M,EAAS,CAApC,kCACE/M,GAAA,0BAAqB,KAAK,SACvB,OAAQU,GAAY,CAACiZ,GAAkBjZ,CAAO,CAAC,EAC/C,IAAKA,GAAYkZ,GAAoBlZ,CAAO,CAAC,EAC7C,OAAO,CAAC8B,EAAQ9B,IAAY,CAC3B,GAAM,CAAE,UAAAmZ,CAAU,EAAInZ,EAChBoZ,EACJD,KAAarX,EACTA,EAAOqX,CAAS,EAChB,CACE,KAAME,GAAYrZ,CAAO,EACzB,QAASsZ,GAAiBtZ,CAAO,EACjC,SAAU,CAAC,CACb,EACN,OAAOkH,GAAAC,GAAA,GACFrF,GADE,CAEL,CAACqX,CAAS,EAAGjS,GAAAC,GAAA,GACRiS,GADQ,CAEX,SAAU,CAAC,GAAGA,EAAQ,SAAUpZ,CAAO,CACzC,EACF,EACF,EAAG,CAAC,CAAC,GAEP,IAAI,yBAA0B,CAC5B,OAAO,OAAO,KAAK,KAAK,kBAAkB,EACvC,OAAQmZ,GAAc,KAAK,mBAAmBA,CAAS,EAAE,OAAO,EAChE,KAAK,EAAE,CACZ,CAEA,+BAA+B1M,EAAU,CACvC,OAAO,KAAK,qCAAqC,SAAUA,CAAQ,CACrE,CAEA,mCAAmCA,EAAU,CAC3C,OAAO,KAAK,qCAAqC,aAAcA,CAAQ,CACzE,CAEA,qCAAqC8M,EAAa9M,EAAU,CAC1D,OAAO,OAAO,KAAK,KAAK,kBAAkB,EACvC,OAAQ0M,GAAc,EAAEA,KAAa1M,EAAS,mBAAmB,EACjE,IAAK0M,GAAc,KAAK,mBAAmBA,CAAS,CAAC,EACrD,OAAO,CAAC,CAAE,KAAA9K,CAAK,IAAMA,GAAQkL,CAAW,EACxC,IAAI,CAAC,CAAE,SAAU,CAACvZ,CAAO,CAAE,IAAMA,CAAO,CAC7C,CAEA,IAAI,qBAAsB,CACxB,OAAO,OAAO,KAAK,KAAK,kBAAkB,EAAE,OAAO,CAAC8B,EAAQqX,IAAc,CACxE,GAAM,CAAE,KAAA9K,EAAM,QAAAmL,EAAS,SAAAnX,CAAS,EAAI,KAAK,mBAAmB8W,CAAS,EACrE,OAAI9K,GAAQ,MAAQ,CAACmL,EACZ,CAAC,GAAG1X,EAAQ,GAAGO,CAAQ,EACrBA,EAAS,OAAS,EACpB,CAAC,GAAGP,EAAQ,GAAGO,EAAS,MAAM,CAAC,CAAC,EAEhCP,CAEX,EAAG,CAAC,CAAC,CACP,CAEA,aAAavC,EAAM,CACjB,IAAMS,EAAU,KAAK,sBAAsBT,CAAI,EAC/C,OAAOS,EAAUA,EAAQ,aAAa,SAAS,EAAI,IACrD,CAEA,sBAAsBT,EAAM,CAC1B,OAAO,OAAO,KAAK,KAAK,kBAAkB,EAAE,OAAO,CAACuC,EAAQqX,IAAc,CACxE,GAAM,CACJ,SAAU,CAACnZ,CAAO,CACpB,EAAI,KAAK,mBAAmBmZ,CAAS,EACrC,OAAOM,GAA6BzZ,EAAST,CAAI,EAAIS,EAAU8B,CACjE,EAAG,OAAY,MAAS,CAC1B,CACF,EAEA,SAASuX,GAAYrZ,EAAS,CAC5B,GAAI0Z,GAAgB1Z,CAAO,EACzB,MAAO,SACF,GAAI2Z,GAAoB3Z,CAAO,EACpC,MAAO,YAEX,CAEA,SAASsZ,GAAiBtZ,EAAS,CACjC,OAAOA,EAAQ,aAAa,kBAAkB,GAAK,QACrD,CAEA,SAAS0Z,GAAgB1Z,EAAS,CAEhC,OADgBA,EAAQ,WACN,QACpB,CAEA,SAASiZ,GAAkBjZ,EAAS,CAElC,OADgBA,EAAQ,WACN,UACpB,CAEA,SAAS2Z,GAAoB3Z,EAAS,CACpC,IAAMsX,EAAUtX,EAAQ,UACxB,OAAOsX,GAAW,SAAYA,GAAW,QAAUtX,EAAQ,aAAa,KAAK,GAAK,YACpF,CAEA,SAASyZ,GAA6BzZ,EAAST,EAAM,CAEnD,OADgBS,EAAQ,WACN,QAAUA,EAAQ,aAAa,MAAM,GAAKT,CAC9D,CAEA,SAAS2Z,GAAoBlZ,EAAS,CACpC,OAAIA,EAAQ,aAAa,OAAO,GAC9BA,EAAQ,aAAa,QAAS,EAAE,EAG3BA,CACT,CAEA,IAAM4Z,GAAN,MAAMC,UAAqBxN,EAAS,CAClC,OAAO,eAAe7L,EAAO,GAAI,CAC/B,OAAO,KAAK,aAAaa,GAAkBb,CAAI,CAAC,CAClD,CAEA,OAAO,YAAYR,EAAS,CAC1B,OAAO,KAAK,aAAaA,EAAQ,aAAa,CAChD,CAEA,OAAO,aAAa,CAAE,gBAAA8Z,EAAiB,KAAA3R,EAAM,KAAA4R,CAAK,EAAG,CACnD,OAAO,IAAI,KAAKD,EAAiB3R,EAAM,IAAI6Q,GAAae,CAAI,CAAC,CAC/D,CAEA,YAAYD,EAAiB3R,EAAM6R,EAAc,CAC/C,MAAM7R,CAAI,EACV,KAAK,gBAAkB2R,EACvB,KAAK,aAAeE,CACtB,CAEA,OAAQ,CACN,IAAMC,EAAgB,KAAK,QAAQ,UAAU,EAAI,EAE3CC,EAAiB,KAAK,QAAQ,iBAAiB,QAAQ,EACvDC,EAAuBF,EAAc,iBAAiB,QAAQ,EAEpE,OAAW,CAAChQ,EAAOmQ,CAAM,IAAKF,EAAe,QAAQ,EAAG,CACtD,IAAMpL,EAAQqL,EAAqBlQ,CAAK,EACxC,QAAWoQ,KAAUvL,EAAM,gBAAiBuL,EAAO,SAAW,GAC9D,QAAWA,KAAUD,EAAO,gBAAiBtL,EAAM,QAAQuL,EAAO,KAAK,EAAE,SAAW,EACtF,CAEA,QAAWC,KAAuBL,EAAc,iBAAiB,wBAAwB,EACvFK,EAAoB,MAAQ,GAG9B,QAAWC,KAAyBN,EAAc,iBAAiB,UAAU,EAC3EM,EAAsB,OAAO,EAG/B,OAAO,IAAIV,EAAa,KAAK,gBAAiBI,EAAe,KAAK,YAAY,CAChF,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,gBAAgB,aAAa,MAAM,CACjD,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,gBAAgB,aAAa,KAAK,CAChD,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,aAAa,OAC3B,CAEA,IAAI,cAAe,CA3tHrB,IAAAva,EA4tHI,IAAMkX,GAAOlX,EAAA,KAAK,WAAW,MAAM,IAAtB,KAAAA,EAA2B,IACxC,OAAOsF,GAAU4R,CAAI,CACvB,CAEA,IAAI,mBAAoB,CACtB,OAAO,KAAK,WAAW,eAAe,CACxC,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,mBAAqB,YACnC,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,mBAAqB,UACnC,CAEA,IAAI,aAAc,CAChB,OAAO,KAAK,WAAW,eAAe,GAAK,QAC7C,CAEA,IAAI,wBAAyB,CAE3B,OAD8B,KAAK,WAAW,iBAAiB,IAAM,QAAU,KAAK,aAAa,aAAa,iBAAiB,IAAM,gBACrG,CAAC,OAAO,WAAW,kCAAkC,EAAE,OACzF,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,WAAW,gBAAgB,CACzC,CAEA,IAAI,eAAgB,CAClB,OAAO,KAAK,WAAW,gBAAgB,CACzC,CAIA,WAAWrX,EAAM,CACf,OAAO,KAAK,aAAa,aAAa,SAASA,CAAI,EAAE,CACvD,CACF,EAlwHAib,GAAAC,GAowHMC,GAAN,KAAuB,CAAvB,cACE9V,GAAA,KAAA4V,GAAyB,IACzB5V,GAAA,KAAA6V,GAAiB,QAAQ,QAAQ,GAEjC,aAAaE,EAAmBC,EAAQ,CACtC,OAAID,GAAqB,KAAK,0BAA4B,CAAC9V,GAAA,KAAK2V,KAC9D1V,GAAA,KAAK0V,GAAyB,IAC9B1V,GAAA,KAAK2V,GAAiB5V,GAAA,KAAK4V,IAAe,KAAK,SAAY,CACzD,MAAM,SAAS,oBAAoBG,CAAM,EAAE,QAC7C,CAAC,IAED9V,GAAA,KAAK2V,GAAiB5V,GAAA,KAAK4V,IAAe,KAAKG,CAAM,GAGhD/V,GAAA,KAAK4V,GACd,CAEA,IAAI,0BAA2B,CAC7B,OAAO,SAAS,mBAClB,CACF,EAnBED,GAAA,YACAC,GAAA,YAoBF,IAAMI,GAAiB,CACrB,OAAQ,UACR,eAAgB,GAChB,oBAAqB,IAAM,CAAC,EAC5B,WAAY,GACZ,cAAe,GACf,oBAAqB,GACrB,sBAAuB,GACvB,QAAS,CAAC,CACZ,EAEMC,GAAe,CACnB,WAAY,aACZ,aAAc,eACd,WAAY,aACZ,SAAU,UACZ,EAEMC,GAAa,CACjB,YAAa,cACb,QAAS,UACT,SAAU,WACV,OAAQ,SACR,UAAW,WACb,EAEMC,GAAmB,CACvB,eAAgB,EAChB,eAAgB,GAChB,oBAAqB,EACvB,EAEMC,GAAY,CAChB,QAAS,UACT,QAAS,OACT,QAAS,MACX,EAEMC,GAAN,KAAY,CAaV,YAAYnT,EAAUjC,EAAUqV,EAAuBpU,EAAU,CAAC,EAAG,CAZrEzH,GAAA,kBAAa2C,GAAK,GAClB3C,GAAA,qBAAgB,CAAC,GAEjBA,GAAA,wBAAmB,IACnBA,GAAA,sBAAiB,IACjBA,GAAA,gBAAW,IACXA,GAAA,2BAAsB,IACtBA,GAAA,6BAAwB,IACxBA,GAAA,sBAAiB,IACjBA,GAAA,aAAQyb,GAAW,aACnBzb,GAAA,wBAAmB,IAAIob,IAGrB,KAAK,SAAW3S,EAChB,KAAK,SAAWjC,EAChB,KAAK,sBAAwBqV,GAAyBlZ,GAAK,EAE3D,GAAM,CACJ,OAAAY,EACA,eAAAuY,EACA,SAAAC,EACA,SAAA5O,EACA,aAAA6O,EACA,SAAA7U,EACA,oBAAA8U,EACA,WAAA7N,EACA,cAAA8N,EACA,oBAAAC,EACA,sBAAAC,EACA,UAAA5N,EACA,QAAA6N,EACF,EAAIxU,MAAA,GACC0T,IACA9T,GAEL,KAAK,OAASlE,EACd,KAAK,eAAiBuY,EACtB,KAAK,SAAWC,EAChB,KAAK,SAAW5O,EAChB,KAAK,aAAe6O,EACpB,KAAK,SAAW7U,EAChB,KAAK,cAAgB,KAAK,KAAK,cAAc,IAAI,EACjD,KAAK,oBAAsB8U,EAC3B,KAAK,WAAa7N,EAClB,KAAK,cAAgB8N,EACrB,KAAK,SAAW,CAAC9N,EACjB,KAAK,oBAAsB+N,EAC3B,KAAK,sBAAwBC,EAC7B,KAAK,UAAY5N,GAAamN,GAAUpY,CAAM,EAC9C,KAAK,QAAU8Y,EACjB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,SAAS,OACvB,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,SAAS,IACvB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,SAAS,OACvB,CAEA,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAQ,gCAAgC,KAAK,qBAAqB,CAChF,CAEA,OAAQ,CACF,KAAK,OAASZ,GAAW,cAC3B,KAAK,mBAAmBD,GAAa,UAAU,EAC/C,KAAK,MAAQC,GAAW,QACxB,KAAK,QAAQ,aAAa,IAAI,EAC9B,KAAK,SAAS,aAAa,IAAI,EAEnC,CAEA,QAAS,CACH,KAAK,OAASA,GAAW,UACvB,KAAK,SACP,KAAK,QAAQ,OAAO,EAEtB,KAAK,aAAa,EAClB,KAAK,MAAQA,GAAW,SAE5B,CAEA,UAAW,CACL,KAAK,OAASA,GAAW,UAC3B,KAAK,mBAAmBD,GAAa,QAAQ,EAC7C,KAAK,QAAQ,eAAe,IAAI,EAChC,KAAK,MAAQC,GAAW,UACxB,KAAK,eAAe,EAEf,KAAK,kBACR,KAAK,SAAS,eAAe,IAAI,EAGvC,CAEA,MAAO,CACD,KAAK,OAASA,GAAW,UAC3B,KAAK,MAAQA,GAAW,OACxB,KAAK,QAAQ,YAAY,IAAI,EAC7B,KAAK,SAAS,eAAe,IAAI,EAErC,CAEA,eAAgB,CA76HlB,IAAArb,EA86HI,GAAI,CAAC,KAAK,gBAAkB,KAAK,cAAe,CAC9C,IAAMkc,EAAmB,KAAK,SAAS,SAASlc,EAAA,KAAK,WAAL,YAAAA,EAAe,MAAO,UAAY,KAAK,OACjF2H,EAASzE,GAA0BgZ,CAAgB,EACzD,KAAK,QAAQ,OAAOvU,EAAQ,KAAK,SAAU,KAAK,qBAAqB,EACrE,KAAK,eAAiB,EACxB,CACF,CAEA,cAAe,CACT,KAAK,qBAAqB,EAC5B,KAAK,gBAAgB,EACZ,KAAK,mBAAmB,GAAK,CAAC,KAAK,UAC5C,KAAK,QAAU,IAAIS,GAAa,KAAMR,GAAY,IAAK,KAAK,QAAQ,EACpE,KAAK,QAAQ,QAAQ,EAEzB,CAEA,iBAAkB,CACZ,KAAK,WACP,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EAEvB,CAEA,cAAe,CACb,KAAK,mBAAmBwT,GAAa,YAAY,EACjD,KAAK,QAAQ,oBAAoB,IAAI,CACvC,CAEA,eAAerU,EAAW,KAAK,SAAU,CAEvC,GADA,KAAK,SAAWA,EACZA,EAAU,CACZ,GAAM,CAAE,WAAAoV,CAAW,EAAIpV,EACnBqV,GAAaD,CAAU,EACzB,KAAK,QAAQ,sBAAsB,IAAI,EAEvC,KAAK,QAAQ,iCAAiC,KAAMA,CAAU,CAElE,CACF,CAEA,eAAgB,CACd,KAAK,mBAAmBf,GAAa,UAAU,EAC/C,KAAK,QAAQ,qBAAqB,IAAI,CACxC,CAEA,cAAe,CACb,GAAI,KAAK,SAAU,CACjB,GAAM,CAAE,WAAAe,EAAY,aAAAE,CAAa,EAAI,KAAK,SAC1C,KAAK,OAAO,SAAY,CAItB,GAHI,KAAK,qBAAqB,KAAK,cAAc,EAC7C,KAAK,KAAK,eAAe,MAAM,KAAK,KAAK,cAEzCD,GAAaD,CAAU,GAAKE,GAAgB,KAAM,CACpD,IAAMtP,EAAWmN,GAAa,eAAemC,CAAY,EACzD,MAAM,KAAK,mBAAmBtP,EAAU,EAAK,EAE7C,KAAK,QAAQ,cAAc,IAAI,EAC/B,KAAK,SAAS,CAChB,MACE,MAAM,KAAK,KAAK,YAAYmN,GAAa,eAAemC,CAAY,EAAG,IAAI,EAC3E,KAAK,QAAQ,cAAc,IAAI,EAC/B,KAAK,KAAK,CAEd,CAAC,CACH,CACF,CAEA,mBAAoB,CAClB,IAAMtP,EAAW,KAAK,KAAK,6BAA6B,KAAK,QAAQ,GAAK,KAAK,qBAAqB,EAEpG,GAAIA,IAAa,CAACvH,GAAU,KAAK,QAAQ,GAAKuH,EAAS,UAAUvH,GAAU,KAAK,QAAQ,CAAC,KACnF,KAAK,QAAU,WAAauH,EAAS,eACvC,OAAOA,CAGb,CAEA,sBAAuB,CACrB,GAAI,KAAK,aACP,OAAOmN,GAAa,eAAe,KAAK,YAAY,CAExD,CAEA,mBAAoB,CAClB,OAAO,KAAK,kBAAkB,GAAK,IACrC,CAEA,oBAAqB,CACnB,IAAMnN,EAAW,KAAK,kBAAkB,EACxC,GAAIA,EAAU,CACZ,IAAMe,EAAY,KAAK,mBAAmB,EAC1C,KAAK,OAAO,SAAY,CACtB,KAAK,cAAc,EACf,KAAK,cACP,KAAK,QAAQ,cAAc,IAAI,GAE3B,KAAK,KAAK,eAAe,MAAM,KAAK,KAAK,cAE7C,MAAM,KAAK,mBAAmBf,EAAUe,CAAS,EAEjD,KAAK,QAAQ,cAAc,IAAI,EAC1BA,GACH,KAAK,SAAS,EAGpB,CAAC,CACH,CACF,CAEA,gBAAiB,CA7hInB,IAAA9N,EA8hIQ,KAAK,sBAAwB,CAAC,KAAK,oBAAoBA,EAAA,KAAK,WAAL,MAAAA,EAAe,cACxE,KAAK,QAAQ,wBAAwB,KAAK,qBAAsB,CAC9D,OAAQ,UACR,SAAU,KAAK,SACf,oBAAqB,GACrB,WAAY,EACd,CAAC,EACD,KAAK,iBAAmB,GAE5B,CAIA,eAAe6K,EAAS,CAClB,KAAK,uBACPA,EAAQ,mBAAmBlB,GAAc,WAAW,CAExD,CAEA,gBAAiB,CACf,KAAK,aAAa,CACpB,CAEA,iCAAiCwC,EAAUmQ,EAAW,CAAC,CAEvD,MAAM,6BAA6BzR,EAAS9D,EAAU,CACpD,IAAMsV,EAAe,MAAMtV,EAAS,aAC9B,CAAE,WAAAwV,EAAY,WAAAJ,CAAW,EAAIpV,EAC/BsV,GAAgB,KAClB,KAAK,eAAe,CAClB,WAAYf,GAAiB,oBAC7B,WAAAiB,CACF,CAAC,GAED,KAAK,qBAAuBxV,EAAS,WAAaA,EAAS,SAAW,OACtE,KAAK,eAAe,CAAE,WAAYoV,EAAY,aAAAE,EAAc,WAAAE,CAAW,CAAC,EAE5E,CAEA,MAAM,0BAA0B1R,EAAS9D,EAAU,CACjD,IAAMsV,EAAe,MAAMtV,EAAS,aAC9B,CAAE,WAAAwV,EAAY,WAAAJ,CAAW,EAAIpV,EAC/BsV,GAAgB,KAClB,KAAK,eAAe,CAClB,WAAYf,GAAiB,oBAC7B,WAAAiB,CACF,CAAC,EAED,KAAK,eAAe,CAAE,WAAYJ,EAAY,aAAAE,EAAc,WAAAE,CAAW,CAAC,CAE5E,CAEA,eAAepQ,EAAUqQ,EAAQ,CAC/B,KAAK,eAAe,CAClB,WAAYlB,GAAiB,eAC7B,WAAY,EACd,CAAC,CACH,CAEA,iBAAkB,CAChB,KAAK,cAAc,CACrB,CAIA,eAAgB,CACV,CAAC,KAAK,UAAY,CAAC,KAAK,KAAK,eAAiB,CAAC,KAAK,KAAK,6BAA6B,IAAI,IACxF,KAAK,QAAU,UACjB,KAAK,yBAAyB,GAAK,KAAK,eAAe,GAAK,KAAK,KAAK,YAAY,EAElF,KAAK,eAAe,GAAK,KAAK,KAAK,YAAY,EAGjD,KAAK,SAAW,GAEpB,CAEA,0BAA2B,CACzB,GAAM,CAAE,eAAAmB,CAAe,EAAI,KAAK,gBAChC,GAAIA,EACF,YAAK,KAAK,iBAAiBA,CAAc,EAClC,EAEX,CAEA,gBAAiB,CACf,IAAMjW,EAAShB,GAAU,KAAK,QAAQ,EACtC,GAAIgB,GAAU,KACZ,YAAK,KAAK,eAAeA,CAAM,EACxB,EAEX,CAIA,mBAAmBkW,EAAQ,CACzB,KAAK,cAAcA,CAAM,EAAI,IAAI,KAAK,EAAE,QAAQ,CAClD,CAEA,kBAAmB,CACjB,OAAOjV,GAAA,GAAK,KAAK,cACnB,CAIA,sBAAuB,CACrB,OAAO,OAAO,KAAK,UAAY,QACjC,CAEA,oBAAqB,CACnB,OAAI,KAAK,QAAU,UACV,CAAC,KAAK,kBAAkB,EAExB,KAAK,UAEhB,CAEA,eAAgB,CACT,KAAK,iBACR,KAAK,KAAK,cAAc,KAAK,QAAQ,EAAE,KAAMsF,GAAaA,GAAY,KAAK,oBAAoBA,CAAQ,CAAC,EACxG,KAAK,eAAiB,GAE1B,CAEA,MAAM,OAAO9I,EAAU,CACrB,KAAK,aAAa,EAClB,MAAM,IAAI,QAASvC,GAAY,CAC7B,KAAK,MACH,SAAS,kBAAoB,SAAW,WAAW,IAAMA,EAAQ,EAAG,CAAC,EAAI,sBAAsB,IAAMA,EAAQ,CAAC,CAClH,CAAC,EACD,MAAMuC,EAAS,EACf,OAAO,KAAK,KACd,CAEA,MAAM,mBAAmB8I,EAAUe,EAAW,CAC5C,MAAM,KAAK,iBAAiB,aAAa,KAAK,KAAK,mBAAmBf,CAAQ,EAAG,SAAY,CAC3F,MAAM,KAAK,KAAK,WAAWA,EAAUe,EAAW,KAAK,WAAY,IAAI,EACrE,KAAK,cAAc,CACrB,CAAC,CACH,CAEA,cAAe,CACT,KAAK,QACP,qBAAqB,KAAK,KAAK,EAC/B,OAAO,KAAK,MAEhB,CACF,EAEA,SAASsO,GAAaD,EAAY,CAChC,OAAOA,GAAc,KAAOA,EAAa,GAC3C,CAEA,IAAMQ,GAAN,KAAqB,CAGnB,YAAYC,EAAS,CAFrBhd,GAAA,mBAAc,IAAIyZ,IAuHlBzZ,GAAA,uBAAkB,IAAM,CACtB,KAAK,YAAY,KAAK,CACxB,GAtHE,KAAK,QAAUgd,CACjB,CAEA,wBAAwBxW,EAAUiB,EAAS,CACrClB,GAAoBC,EAAU,KAAK,UAAU,YAAY,EAC3D,KAAK,UAAU,WAAWA,GAAUiB,GAAA,YAAAA,EAAS,wBAAyB9E,GAAK,EAAG8E,CAAO,EAErF,OAAO,SAAS,KAAOjB,EAAS,SAAS,CAE7C,CAEA,aAAayW,EAAO,CAClB,KAAK,SAAWA,EAAM,SACtB,KAAK,qBAAuB,KAE5BA,EAAM,mBAAmB,EACzBA,EAAM,aAAa,CACrB,CAEA,oBAAoBA,EAAO,CACzB,KAAK,YAAY,SAAS,CAAC,EACvBA,EAAM,kBAAkB,GAAKA,EAAM,QAAU,UAC/C,KAAK,+BAA+B,EAEpC,KAAK,gBAAgB,CAEzB,CAEA,sBAAsBA,EAAO,CAC3BA,EAAM,aAAa,EAEfA,EAAM,SAAS,aACjB,KAAK,qBAAuBA,EAAM,qBAEtC,CAEA,iCAAiCA,EAAOV,EAAY,CAClD,OAAQA,EAAY,CAClB,KAAKb,GAAiB,eACtB,KAAKA,GAAiB,eACtB,KAAKA,GAAiB,oBACpB,OAAO,KAAK,OAAO,CACjB,OAAQ,iBACR,QAAS,CACP,WAAAa,CACF,CACF,CAAC,EACH,QACE,OAAOU,EAAM,aAAa,CAC9B,CACF,CAEA,qBAAqBC,EAAQ,CAAC,CAE9B,eAAeA,EAAQ,CACrB,KAAK,YAAY,SAAS,CAAC,EAC3B,KAAK,qBAAqB,CAC5B,CAEA,gBAAgB3O,EAAQ,CACtB,KAAK,OAAOA,CAAM,CACpB,CAEA,YAAY2O,EAAQ,CAClB,KAAK,YAAY,SAAS,CAAC,EAC3B,KAAK,qBAAqB,CAC5B,CAEA,cAAcA,EAAQ,CAAC,CAIvB,oCAAoC1W,EAAU,CAC5C,MAAO,EACT,CAIA,sBAAsB2W,EAAiB,CACrC,KAAK,YAAY,SAAS,CAAC,EAC3B,KAAK,8BAA8B,CACrC,CAEA,uBAAuBA,EAAiB,CACtC,KAAK,YAAY,SAAS,CAAC,EAC3B,KAAK,oBAAoB,CAC3B,CAIA,gCAAiC,CAC/B,KAAK,wBAA0B,OAAO,WAAW,KAAK,gBAAiB,KAAK,QAAQ,gBAAgB,CACtG,CAEA,sBAAuB,CACrB,KAAK,YAAY,KAAK,EAClB,KAAK,yBAA2B,OAClC,OAAO,aAAa,KAAK,uBAAuB,EAChD,OAAO,KAAK,wBAEhB,CAEA,+BAAgC,CAC1B,KAAK,wBAA0B,OACjC,KAAK,uBAAyB,OAAO,WAAW,KAAK,gBAAiB,KAAK,QAAQ,gBAAgB,EAEvG,CAEA,qBAAsB,CACpB,KAAK,YAAY,KAAK,EAClB,KAAK,wBAA0B,OACjC,OAAO,aAAa,KAAK,sBAAsB,EAC/C,OAAO,KAAK,uBAEhB,CAMA,OAAO5O,EAAQ,CAnzIjB,IAAAnO,EAozIIgB,GAAS,eAAgB,CAAE,OAAQmN,CAAO,CAAC,EAE3C,OAAO,SAAS,OAAQnO,EAAA,KAAK,sBAAwB,KAAK,WAAlC,YAAAA,EAA6C,aAAc,OAAO,SAAS,IACrG,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,QAAQ,SACtB,CACF,EAEMgd,GAAN,KAAoB,CAApB,cACEpd,GAAA,gBAAW,0BAEXA,GAAA,eAAU,IAgBVA,GAAA,+BAA2B2O,GAAW,CACpC,QAAWjO,KAAW,KAAK,kBACzBA,EAAQ,OAAO,CAEnB,GAlBA,OAAQ,CACD,KAAK,UACR,KAAK,QAAU,GACf,iBAAiB,qBAAsB,KAAK,wBAAyB,EAAK,EAE9E,CAEA,MAAO,CACD,KAAK,UACP,KAAK,QAAU,GACf,oBAAoB,qBAAsB,KAAK,wBAAyB,EAAK,EAEjF,CAQA,IAAI,mBAAoB,CACtB,MAAO,CAAC,GAAG,SAAS,iBAAiB,KAAK,QAAQ,CAAC,CACrD,CACF,EA11IA2c,GAAAC,GAAAC,GAAAC,GA41IMC,GAAN,KAAsB,CACpB,YAAYT,EAAStc,EAAS,CADhC4E,GAAA,KAAA+X,IAEI,KAAK,QAAUL,EACf,KAAK,QAAUtc,EACf,KAAK,gBAAkB,IAAIgO,GAAgB,KAAMhO,CAAO,EACxD,KAAK,mBAAqB,IAAI8M,GAAmB,KAAM9M,CAAO,CAChE,CAEA,OAAQ,CACN,KAAK,gBAAgB,MAAM,EAC3B,KAAK,mBAAmB,MAAM,CAChC,CAEA,MAAO,CACL,KAAK,gBAAgB,KAAK,EAC1B,KAAK,mBAAmB,KAAK,CAC/B,CAIA,yBAAyBA,EAASgd,EAAW/O,EAAQ,CACnD,OAAOzF,GAAA,KAAKmU,GAAAE,IAAL,UAAqB7c,EAC9B,CAEA,qBAAqBA,EAASmF,EAAKpE,EAAO,CACxC,IAAMkc,EAAQzU,GAAA,KAAKmU,GAAAG,IAAL,UAAuB9c,GACjCid,GACFA,EAAM,SAAS,qBAAqBjd,EAASmF,EAAKpE,CAAK,CAE3D,CAIA,eAAef,EAASwE,EAAW,CACjC,OACExE,EAAQ,QAAQ,aAAa,GAAK,MAClCwI,GAAA,KAAKmU,GAAAC,IAAL,UAAmB5c,EAASwE,IAC5BgE,GAAA,KAAKmU,GAAAE,IAAL,UAAqB7c,EAASwE,EAElC,CAEA,cAAcxE,EAASwE,EAAW,CAChC,IAAMyY,EAAQzU,GAAA,KAAKmU,GAAAG,IAAL,UAAuB9c,EAASwE,GAC1CyY,GACFA,EAAM,SAAS,cAAcjd,EAASwE,CAAS,CAEnD,CAiCF,EA/EAmY,GAAA,YAgDEC,GAAa,SAACtX,EAAMd,EAAW,CA54IjC,IAAA9E,EA64II,IAAMmD,EAASwC,GAAYC,EAAMd,CAAS,EACpC0Y,EAAO,KAAK,QAAQ,cAAc,cAAc,yBAAyB,EACzEnX,EAAef,IAAUtF,EAAAwd,GAAA,YAAAA,EAAM,UAAN,KAAAxd,EAAiB,GAAG,EAEnD,OAAO8I,GAAA,KAAKmU,GAAAE,IAAL,UAAqBvX,EAAMd,IAAcqB,GAAoBhD,EAAQkD,CAAY,CAC1F,EAEA8W,GAAe,SAAC7c,EAASwE,EAAW,CAMlC,GAJExE,aAAmB,gBACf,KAAK,QAAQ,wBAAwBA,EAASwE,CAAS,EACvD,KAAK,QAAQ,qBAAqBxE,CAAO,EAE5B,CACjB,IAAMid,EAAQzU,GAAA,KAAKmU,GAAAG,IAAL,UAAuB9c,EAASwE,GAC9C,OAAOyY,EAAQA,GAASjd,EAAQ,QAAQ,aAAa,EAAI,EAC3D,KACE,OAAO,EAEX,EAEA8c,GAAiB,SAAC9c,EAASwE,EAAW,CACpC,IAAM+H,GAAK/H,GAAA,YAAAA,EAAW,aAAa,sBAAuBxE,EAAQ,aAAa,kBAAkB,EACjG,GAAIuM,GAAMA,GAAM,OAAQ,CACtB,IAAM0Q,EAAQ,KAAK,QAAQ,cAAc,IAAI1Q,CAAE,kBAAkB,EACjE,GAAI0Q,aAAiBrd,GACnB,OAAOqd,CAEX,CACF,EAGF,IAAME,GAAN,KAAc,CAOZ,YAAYpV,EAAU,CANtBzI,GAAA,iBACAA,GAAA,6BAAwB2C,GAAK,GAC7B3C,GAAA,uBAAkB,CAAC,GACnBA,GAAA,eAAU,IACVA,GAAA,oBAAe,GAwEfA,GAAA,kBAAcyB,GAAU,CACtB,GAAM,CAAE,MAAAqc,CAAM,EAAIrc,EAAM,OAAS,CAAC,EAGlC,GAFA,KAAK,SAAW,IAAI,IAAI,OAAO,SAAS,IAAI,EAExCqc,EAAO,CACT,GAAM,CAAE,sBAAAjC,EAAuB,iBAAAkC,CAAiB,EAAID,EACpD,KAAK,sBAAwBjC,EAC7B,IAAMrN,EAAYuP,EAAmB,KAAK,aAAe,UAAY,OACrE,KAAK,SAAS,6DAA6D,KAAK,SAAUlC,EAAuBrN,CAAS,EAC1H,KAAK,aAAeuP,CACtB,MACE,KAAK,eACL,KAAK,SAAS,4BAA4B,KAAK,QAAQ,CAE3D,GAnFE,KAAK,SAAWtV,CAClB,CAEA,OAAQ,CAx7IV,IAAArI,EAAAC,EAy7IS,KAAK,UACR,iBAAiB,WAAY,KAAK,WAAY,EAAK,EACnD,KAAK,eAAeA,GAAAD,EAAA,QAAQ,QAAR,YAAAA,EAAe,QAAf,YAAAC,EAAsB,mBAAoB,EAC9D,KAAK,QAAU,GACf,KAAK,QAAQ,IAAI,IAAI,OAAO,SAAS,IAAI,CAAC,EAE9C,CAEA,MAAO,CACD,KAAK,UACP,oBAAoB,WAAY,KAAK,WAAY,EAAK,EACtD,KAAK,QAAU,GAEnB,CAEA,KAAKmG,EAAUqV,EAAuB,CACpC,KAAK,OAAO,QAAQ,UAAWrV,EAAUqV,CAAqB,CAChE,CAEA,QAAQrV,EAAUqV,EAAuB,CACvC,KAAK,OAAO,QAAQ,aAAcrV,EAAUqV,CAAqB,CACnE,CAEA,OAAO9T,EAAQvB,EAAUqV,EAAwBlZ,GAAK,EAAG,CACnDoF,IAAW,QAAQ,WAAW,EAAE,KAAK,aAEzC,IAAMiW,EAAQ,CAAE,MAAO,CAAE,sBAAAnC,EAAuB,iBAAkB,KAAK,YAAa,CAAE,EACtF9T,EAAO,KAAK,QAASiW,EAAO,GAAIxX,EAAS,IAAI,EAC7C,KAAK,SAAWA,EAChB,KAAK,sBAAwBqV,CAC/B,CAIA,gCAAgCA,EAAuB,CACrD,OAAO,KAAK,gBAAgBA,CAAqB,GAAK,CAAC,CACzD,CAEA,sBAAsBoC,EAAgB,CACpC,GAAM,CAAE,sBAAApC,CAAsB,EAAI,KAC5BqC,EAAkB,KAAK,gBAAgBrC,CAAqB,EAClE,KAAK,gBAAgBA,CAAqB,EAAIhU,MAAA,GACzCqW,GACAD,EAEP,CAIA,kCAAmC,CA1+IrC,IAAA7d,EA2+IS,KAAK,4BACR,KAAK,2BAA4BA,EAAA,QAAQ,oBAAR,KAAAA,EAA6B,OAC9D,QAAQ,kBAAoB,SAEhC,CAEA,sCAAuC,CACjC,KAAK,4BACP,QAAQ,kBAAoB,KAAK,0BACjC,OAAO,KAAK,0BAEhB,CAmBF,EAzgJA+d,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GA2gJMC,GAAN,KAA2B,CAIzB,YAAYnW,EAAUgF,EAAa,CAJrCnI,GAAA,KAAAmZ,IACEze,GAAA,eAAU,IACVsF,GAAA,KAAA6Y,GAAkB,MAiClB7Y,GAAA,KAAA8Y,GAAU,IAAM,CACd,KAAK,YAAY,iBAAiB,aAAc7Y,GAAA,KAAK8Y,IAAuB,CAC1E,QAAS,GACT,QAAS,EACX,CAAC,EACD,KAAK,YAAY,iBAAiB,aAAc9Y,GAAA,KAAK+Y,IAA0B,CAC7E,QAAS,GACT,QAAS,EACX,CAAC,EAED,KAAK,YAAY,iBAAiB,6BAA8B/Y,GAAA,KAAKiZ,IAA4B,EAAI,EACrG,KAAK,QAAU,EACjB,GAEAlZ,GAAA,KAAA+Y,GAAyB5c,GAAU,CACjC,GAAIkC,GAAe,gBAAgB,IAAM,QAAS,OAElD,IAAMrC,EAASG,EAAM,OAGrB,GAFeH,EAAO,SAAWA,EAAO,QAAQ,0CAA0C,GAE5E4H,GAAA,KAAKuV,GAAAE,IAAL,UAAqBrd,GAAS,CAC1C,IAAMqD,EAAOrD,EACPkF,EAAWE,GAAmB/B,CAAI,EAExC,GAAI,KAAK,SAAS,6BAA6BA,EAAM6B,CAAQ,EAAG,CAC9DhB,GAAA,KAAK2Y,GAAkBxZ,GAEvB,IAAMka,EAAe,IAAIrW,GACvB,KACAR,GAAY,IACZxB,EACA,IAAI,gBACJlF,CACF,EAEAud,EAAa,aAAa,SAAW,MAErCxT,GAAc,SAAS7E,EAAUqY,EAActZ,GAAA,KAAKkZ,GAAAC,GAAS,CAC/D,CACF,CACF,GAEApZ,GAAA,KAAAgZ,GAA4B7c,GAAU,CAChCA,EAAM,SAAW8D,GAAA,KAAK4Y,KAAiB5Y,GAAA,KAAKgZ,IAAL,UAC7C,GAEAjZ,GAAA,KAAAiZ,GAAyB,IAAM,CAC7BlT,GAAc,MAAM,EACpB7F,GAAA,KAAK2Y,GAAkB,KACzB,GAEA7Y,GAAA,KAAAkZ,GAA8B/c,GAAU,CACtC,GAAIA,EAAM,OAAO,UAAY,QAAUA,EAAM,OAAO,aAAa,SAAW,MAAO,CACjF,IAAMqd,EAASzT,GAAc,IAAI5J,EAAM,OAAO,GAAG,EAE7Cqd,IAEFrd,EAAM,OAAO,aAAeqd,GAG9BzT,GAAc,MAAM,CACtB,CACF,GA5FE,KAAK,SAAW5C,EAChB,KAAK,YAAcgF,CACrB,CAEA,OAAQ,CACF,KAAK,UAEL,KAAK,YAAY,aAAe,UAClC,KAAK,YAAY,iBAAiB,mBAAoBlI,GAAA,KAAK6Y,IAAS,CAAE,KAAM,EAAK,CAAC,EAElF7Y,GAAA,KAAK6Y,IAAL,WAEJ,CAEA,MAAO,CACA,KAAK,UAEV,KAAK,YAAY,oBAAoB,aAAc7Y,GAAA,KAAK8Y,IAAuB,CAC7E,QAAS,GACT,QAAS,EACX,CAAC,EACD,KAAK,YAAY,oBAAoB,aAAc9Y,GAAA,KAAK+Y,IAA0B,CAChF,QAAS,GACT,QAAS,EACX,CAAC,EAED,KAAK,YAAY,oBAAoB,6BAA8B/Y,GAAA,KAAKiZ,IAA4B,EAAI,EACxG,KAAK,QAAU,GACjB,CAkEA,eAAevT,EAAS,CACtB,IAAMtG,EAAOsG,EAAQ,OAErBA,EAAQ,QAAQ,eAAe,EAAI,WAEnC,IAAM+D,EAAarK,EAAK,QAAQ,aAAa,EACvCoa,EAAmBpa,EAAK,aAAa,kBAAkB,IAAKqK,GAAA,YAAAA,EAAY,aAAa,aAAaA,GAAA,YAAAA,EAAY,IAEhH+P,GAAoBA,IAAqB,SAC3C9T,EAAQ,QAAQ,aAAa,EAAI8T,EAErC,CAIA,8BAA+B,CAAC,CAEhC,eAAeF,EAAc,CAAC,CAE9B,eAAeA,EAAc,CAAC,CAE9B,gBAAgBA,EAAc,CAAC,CAE/B,iCAAiCA,EAAczV,EAAe,CAAC,CAE/D,0BAA0ByV,EAAczV,EAAe,CAAC,CAmB1D,EA7IE+U,GAAA,YAiCAC,GAAA,YAcAC,GAAA,YA4BAC,GAAA,YAIAC,GAAA,YAKAC,GAAA,YAtFFC,GAAA,YA8HMC,GAAS,UAAG,CACd,OAAO,OAAO/a,GAAe,2BAA2B,CAAC,GAAKwH,EAChE,EAEAwT,GAAe,SAACha,EAAM,CASpB,MANI,GAFSA,EAAK,aAAa,MAAM,GAIjCqa,GAAgBra,CAAI,GACpBsa,GAAkBta,CAAI,GACtBua,GAAYva,CAAI,GAChBwa,GAAYxa,CAAI,GAChBya,GAAeza,CAAI,EAGzB,EAGF,IAAMqa,GAAmBra,GAChBA,EAAK,SAAW,SAAS,SAAS,QAAU,CAAC,CAAC,QAAS,QAAQ,EAAE,SAASA,EAAK,QAAQ,GAAKA,EAAK,aAAa,QAAQ,EAGzHsa,GAAqBta,GACjBA,EAAK,SAAWA,EAAK,SAAW,SAAS,SAAS,SAAW,SAAS,SAAS,QAAWA,EAAK,KAAK,WAAW,GAAG,EAGtHua,GAAeva,GAAS,CAE5B,GADIA,EAAK,aAAa,qBAAqB,IAAM,SAC7CA,EAAK,aAAa,YAAY,IAAM,QAAS,MAAO,GAExD,IAAM0a,EAAsBtb,GAAuBY,EAAM,uBAAuB,EAChF,MAAI,GAAA0a,GAAuBA,EAAoB,aAAa,qBAAqB,IAAM,QAGzF,EAEMF,GAAexa,GAAS,CAC5B,IAAM2a,EAAc3a,EAAK,aAAa,mBAAmB,EAKzD,MAJI,GAAA2a,GAAeA,EAAY,YAAY,IAAM,OAE7CC,GAAM5a,CAAI,GACVA,EAAK,aAAa,oBAAoB,GACtCA,EAAK,aAAa,mBAAmB,EAG3C,EAEM4a,GAAS5a,GACNA,EAAK,aAAa,aAAa,GAAKA,EAAK,aAAa,eAAe,GAAKA,EAAK,aAAa,cAAc,GAAKA,EAAK,aAAa,aAAa,EAGjJya,GAAkBza,GACRvD,GAAS,wBAAyB,CAAE,OAAQuD,EAAM,WAAY,EAAK,CAAC,EACrE,iBA/rJf6a,GAAAC,GAAAC,GAksJMC,GAAN,KAAgB,CACd,YAAYlX,EAAU,CADxBnD,GAAA,KAAAka,IAEI,KAAK,SAAW/W,CAClB,CAEA,aAAajC,EAAUiB,EAAU,CAAC,EAAG,CAC/B,KAAK,SAAS,iCAAiCjB,EAAUiB,EAAQ,MAAM,GACzE,KAAK,SAAS,wBAAwBjB,EAAUiB,CAAO,CAE3D,CAEA,WAAW9B,EAAWkW,EAAuBpU,EAAU,CAAC,EAAG,CACzD,KAAK,KAAK,EACV,KAAK,aAAe,IAAImU,GAAM,KAAMlW,GAAUC,CAAS,EAAGkW,EAAuBhU,GAAA,CAC/E,SAAU,KAAK,UACZJ,EACJ,EACD,KAAK,aAAa,MAAM,CAC1B,CAEA,WAAWzB,EAAMd,EAAW,CAC1B,KAAK,KAAK,EACV,KAAK,eAAiB,IAAIqG,GAAe,KAAMvF,EAAMd,EAAW,EAAI,EAEpE,KAAK,eAAe,MAAM,CAC5B,CAEA,MAAO,CACD,KAAK,iBACP,KAAK,eAAe,KAAK,EACzB,OAAO,KAAK,gBAGV,KAAK,eACP,KAAK,aAAa,OAAO,EACzB,OAAO,KAAK,aAEhB,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,SAAS,OACvB,CAEA,IAAI,MAAO,CACT,OAAO,KAAK,SAAS,IACvB,CAEA,IAAI,cAAe,CACjB,OAAO,KAAK,KAAK,SAAS,YAC5B,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,SAAS,OACvB,CAIA,sBAAsB0a,EAAgB,CAEhC,OAAO,KAAK,QAAQ,uBAA0B,YAChD,KAAK,QAAQ,sBAAsBA,CAAc,CAErD,CAEA,MAAM,oCAAoCA,EAAgBxW,EAAe,CACvE,GAAIwW,GAAkB,KAAK,eAAgB,CACzC,IAAMnD,EAAe,MAAMrT,EAAc,aACzC,GAAIqT,EAAc,CAChB,IAAMN,EAAsByD,EAAe,OACtCzD,GACH,KAAK,KAAK,mBAAmB,EAG/B,GAAM,CAAE,WAAAI,EAAY,WAAAI,CAAW,EAAIvT,EAE7ByW,EAAe,CACnB,OAFa3W,GAAA,KAAKsW,GAAAC,IAAL,UAAiCG,EAAgBxW,GAG9D,oBAAA+S,EACA,SAAU,CAAE,WAAAI,EAAY,aAAAE,EAAc,WAAAE,CAAW,CACnD,EACA,KAAK,aAAavT,EAAc,SAAUyW,CAAY,CACxD,CACF,CACF,CAEA,MAAM,iCAAiCD,EAAgBxW,EAAe,CACpE,IAAMqT,EAAe,MAAMrT,EAAc,aAEzC,GAAIqT,EAAc,CAChB,IAAMtP,EAAWmN,GAAa,eAAemC,CAAY,EACrDrT,EAAc,YAChB,MAAM,KAAK,KAAK,YAAY+D,EAAU,KAAK,YAAY,EAEvD,MAAM,KAAK,KAAK,WAAWA,EAAU,GAAO,GAAM,KAAK,YAAY,EAEjEA,EAAS,gBAAkB,YAC7B,KAAK,KAAK,YAAY,EAExB,KAAK,KAAK,mBAAmB,CAC/B,CACF,CAEA,sBAAsByS,EAAgBzW,EAAO,CAC3C,QAAQ,MAAMA,CAAK,CACrB,CAEA,uBAAuByW,EAAgB,CAEjC,OAAO,KAAK,QAAQ,wBAA2B,YACjD,KAAK,QAAQ,uBAAuBA,CAAc,CAEtD,CAIA,oCAAoCpZ,EAAU,CAE5C,OAAI,OAAO,KAAK,QAAQ,qCAAwC,WACvD,KAAK,QAAQ,oCAAoCA,CAAQ,EAG3D,EACT,CAIA,aAAayW,EAAO,CAClB,KAAK,SAAS,aAAaA,CAAK,CAClC,CAEA,eAAeA,EAAO,CACpB,KAAK,SAAS,eAAeA,CAAK,EAClC,OAAO,KAAK,YACd,CAIA,6BAA6BzW,EAAUjD,EAAQ,CAC7C,MAAO,EACT,CAIA,IAAI,UAAW,CACb,OAAO,KAAK,QAAQ,QACtB,CAEA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,QAAQ,qBACtB,CAWF,EAhKAic,GAAA,YAuJEC,GAA2B,SAACG,EAAgBxW,EAAe,CACzD,GAAM,CAAE,UAAAlE,EAAW,YAAAuG,CAAY,EAAImU,EACnC,OAAOnc,GAAeyB,EAAWuG,CAAW,GAAKvC,GAAA,KAAKsW,GAAAE,IAAL,UAAuBtW,EAC1E,EAEAsW,GAAiB,SAACtW,EAAe,CA91JnC,IAAAhJ,EAg2JI,OAD6BgJ,EAAc,YAAcA,EAAc,SAAS,SAAShJ,EAAA,KAAK,WAAL,YAAAA,EAAe,MAC1E,UAAY,SAC5C,EAGF,IAAM0f,GAAY,CAChB,QAAS,EACT,QAAS,EACT,YAAa,EACb,SAAU,CACZ,EAEMC,GAAN,KAAmB,CAIjB,YAAYtX,EAAU,CAHtBzI,GAAA,aAAQ8f,GAAU,SAClB9f,GAAA,eAAU,IAyBVA,GAAA,2BAAsB,IAAM,CAC1B,GAAM,CAAE,WAAAggB,CAAW,EAAI,KACnBA,GAAc,cAChB,KAAK,kBAAkB,EACdA,GAAc,YACvB,KAAK,eAAe,CAExB,GAiBAhgB,GAAA,sBAAiB,IAAM,CACrB,KAAK,SAAS,eAAe,CAC/B,GAhDE,KAAK,SAAWyI,CAClB,CAEA,OAAQ,CACD,KAAK,UACJ,KAAK,OAASqX,GAAU,UAC1B,KAAK,MAAQA,GAAU,SAEzB,SAAS,iBAAiB,mBAAoB,KAAK,oBAAqB,EAAK,EAC7E,iBAAiB,WAAY,KAAK,eAAgB,EAAK,EACvD,KAAK,QAAU,GAEnB,CAEA,MAAO,CACD,KAAK,UACP,SAAS,oBAAoB,mBAAoB,KAAK,oBAAqB,EAAK,EAChF,oBAAoB,WAAY,KAAK,eAAgB,EAAK,EAC1D,KAAK,QAAU,GAEnB,CAWA,mBAAoB,CACd,KAAK,OAASA,GAAU,UAC1B,KAAK,MAAQA,GAAU,YACvB,KAAK,SAAS,sBAAsB,EAExC,CAEA,gBAAiB,CACf,KAAK,kBAAkB,EACnB,KAAK,OAASA,GAAU,cAC1B,KAAK,MAAQA,GAAU,SACvB,KAAK,SAAS,WAAW,EAE7B,CAMA,IAAI,YAAa,CACf,OAAO,SAAS,UAClB,CACF,EAEMG,GAAN,KAAqB,CAGnB,YAAYxX,EAAU,CAFtBzI,GAAA,eAAU,IAqBVA,GAAA,gBAAW,IAAM,CACf,KAAK,eAAe,CAAE,EAAG,OAAO,YAAa,EAAG,OAAO,WAAY,CAAC,CACtE,GApBE,KAAK,SAAWyI,CAClB,CAEA,OAAQ,CACD,KAAK,UACR,iBAAiB,SAAU,KAAK,SAAU,EAAK,EAC/C,KAAK,SAAS,EACd,KAAK,QAAU,GAEnB,CAEA,MAAO,CACD,KAAK,UACP,oBAAoB,SAAU,KAAK,SAAU,EAAK,EAClD,KAAK,QAAU,GAEnB,CAQA,eAAeyX,EAAU,CACvB,KAAK,SAAS,sBAAsBA,CAAQ,CAC9C,CACF,EAEMC,GAAN,KAA4B,CAC1B,OAAO,CAAE,SAAAlW,CAAS,EAAG,CACnBkF,GAAM,4BAA4B,KAAMiR,GAAkCnW,CAAQ,EAAG,IAAM,CACzFoW,GAA0BpW,EAAU,IAAM,CACxCqW,GAAmB,IAAM,CACvB,SAAS,gBAAgB,YAAYrW,CAAQ,CAC/C,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAIA,cAAcoD,EAAyBC,EAAqB,CAC1DA,EAAoB,YAAYD,EAAwB,UAAU,EAAI,CAAC,CACzE,CAEA,cAAe,CAAC,CAClB,EAEA,SAAS+S,GAAkCnW,EAAU,CACnD,IAAMsW,EAA8BvT,GAA0B,SAAS,eAAe,EAChFI,EAAsB,CAAC,EAC7B,QAAWoT,KAA8BD,EAA6B,CACpE,GAAM,CAAE,GAAAtT,CAAG,EAAIuT,EAEf,QAAWrW,KAAiBF,EAAS,iBAAiB,cAAc,EAAG,CACrE,IAAMwW,EAAkBvT,GAAwB/C,EAAc,gBAAgB,QAAS8C,CAAE,EAErFwT,IACFrT,EAAoBH,CAAE,EAAI,CAACuT,EAA4BC,CAAe,EAE1E,CACF,CAEA,OAAOrT,CACT,CAEA,eAAeiT,GAA0BpW,EAAU5F,EAAU,CAC3D,IAAMqc,EAAc,0BAA0B/d,GAAK,CAAC,GAC9Cge,EAAe1W,EAAS,iBAAiB,cAAc,EACvD2W,EAAuBC,GAAmCF,CAAY,EACxEG,EAAkB,KAiBtB,GAfIF,IACEA,EAAqB,GACvBE,EAAkBF,EAAqB,GAEvCE,EAAkBJ,EAGpBE,EAAqB,GAAKE,GAG5Bzc,EAAS,EACT,MAAM1C,GAAY,GAES,SAAS,eAAiB,MAAQ,SAAS,eAAiB,SAAS,OAEtEmf,EAAiB,CACzC,IAAMC,EAAqB,SAAS,eAAeD,CAAe,EAE9D7c,GAAmB8c,CAAkB,GACvCA,EAAmB,MAAM,EAEvBA,GAAsBA,EAAmB,IAAML,GACjDK,EAAmB,gBAAgB,IAAI,CAE3C,CACF,CAEA,eAAeT,GAAmBjc,EAAU,CAC1C,GAAM,CAAC2c,EAA2BC,CAAwB,EAAI,MAAM7c,GAAOC,EAAU,IAAM,SAAS,aAAa,EAE3G6c,EAAiBF,GAA6BA,EAA0B,GAE9E,GAAIE,EAAgB,CAClB,IAAMC,EAAiB,SAAS,eAAeD,CAAc,EAEzDjd,GAAmBkd,CAAc,GAAKA,GAAkBF,GAC1DE,EAAe,MAAM,CAEzB,CACF,CAEA,SAASN,GAAmCO,EAA0B,CACpE,QAAWjX,KAAiBiX,EAA0B,CACpD,IAAMR,EAAuB1c,GAA0BiG,EAAc,gBAAgB,OAAO,EAE5F,GAAIyW,EAAsB,OAAOA,CACnC,CAEA,OAAO,IACT,CAriKA,IAAAS,GAuiKMC,GAAN,KAAqB,CAInB,YAAY7Y,EAAU,CAHtBzI,GAAA,eAAU,IAAI,KACdsF,GAAA,KAAA+b,GAAW,IAsCXrhB,GAAA,4BAAwByB,GAAU,CAChC,IAAM0F,EAAWoa,GAAuB9f,CAAK,EACzC0F,GAAYqa,GAAsBra,CAAQ,IAC5C1F,EAAM,eAAe,EACrB,KAAK,uBAAuB0F,CAAQ,EAExC,GAEAnH,GAAA,2BAAuByB,GAAU,CAC3B8D,GAAA,KAAK8b,KAAY,OAAO5f,EAAM,MAAQ,UACxC,KAAK,mBAAmBA,EAAM,IAAI,CAEtC,GA/CE,KAAK,SAAWgH,CAClB,CAEA,OAAQ,CACDlD,GAAA,KAAK8b,MACR7b,GAAA,KAAK6b,GAAW,IAChB,iBAAiB,8BAA+B,KAAK,qBAAsB,EAAK,EAEpF,CAEA,MAAO,CACD9b,GAAA,KAAK8b,MACP7b,GAAA,KAAK6b,GAAW,IAChB,oBAAoB,8BAA+B,KAAK,qBAAsB,EAAK,EAEvF,CAEA,oBAAoBvG,EAAQ,CACrB,KAAK,wBAAwBA,CAAM,IACtC,KAAK,QAAQ,IAAIA,CAAM,EACvBA,EAAO,iBAAiB,UAAW,KAAK,oBAAqB,EAAK,EAEtE,CAEA,uBAAuBA,EAAQ,CACzB,KAAK,wBAAwBA,CAAM,IACrC,KAAK,QAAQ,OAAOA,CAAM,EAC1BA,EAAO,oBAAoB,UAAW,KAAK,oBAAqB,EAAK,EAEzE,CAEA,wBAAwBA,EAAQ,CAC9B,OAAO,KAAK,QAAQ,IAAIA,CAAM,CAChC,CAgBA,MAAM,uBAAuB3T,EAAU,CACrC,IAAMjG,EAAO,MAAMiG,EAAS,aACxBjG,GACF,KAAK,mBAAmBA,CAAI,CAEhC,CAEA,mBAAmBA,EAAM,CACvB,KAAK,SAAS,0BAA0B6I,GAAc,KAAK7I,CAAI,CAAC,CAClE,CACF,EA9DEmgB,GAAA,YAgEF,SAASE,GAAuB9f,EAAO,CAzmKvC,IAAArB,EA0mKE,IAAMgJ,GAAgBhJ,EAAAqB,EAAM,SAAN,YAAArB,EAAc,cACpC,GAAIgJ,aAAyBlC,GAC3B,OAAOkC,CAEX,CAEA,SAASoY,GAAsBra,EAAU,CAhnKzC,IAAA/G,EAknKE,QADoBA,EAAA+G,EAAS,cAAT,KAAA/G,EAAwB,IACzB,WAAW2J,GAAc,WAAW,CACzD,CAEA,IAAM0X,GAAN,cAA4B/R,EAAS,CACnC,OAAO,cAAcI,EAAgBC,EAAY,CAC/C,GAAM,CAAE,gBAAAyK,EAAiB,KAAA3R,CAAK,EAAI,SAElC2R,EAAgB,aAAazK,EAAYlH,CAAI,CAC/C,CAEA,MAAM,QAAS,CACb,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,CAC9B,CAEA,oBAAqB,CACnB,GAAM,CAAE,gBAAA2R,EAAiB,KAAAC,CAAK,EAAI,SAClCD,EAAgB,aAAa,KAAK,QAASC,CAAI,EAC/C,KAAK,cAAc,KAAK,eAAgB,KAAK,UAAU,CACzD,CAEA,wBAAyB,CACvB,QAAWiH,KAAsB,KAAK,eAAgB,CACpD,IAAMxN,EAAawN,EAAmB,WACtC,GAAIxN,EAAY,CACd,IAAMxT,EAAUD,GAAsBihB,CAAkB,EACxDxN,EAAW,aAAaxT,EAASghB,CAAkB,CACrD,CACF,CACF,CAEA,IAAI,SAAU,CACZ,OAAO,KAAK,YAAY,aAAa,OACvC,CAEA,IAAI,gBAAiB,CACnB,OAAO,SAAS,gBAAgB,iBAAiB,QAAQ,CAC3D,CACF,EAxpKAC,GAAAC,GA0pKMC,GAAN,cAA2BnS,EAAS,CAApC,kCAAApK,GAAA,KAAAqc,IACE,OAAO,cAAc7R,EAAgBC,EAAY,CAC3C,SAAS,MAAQA,aAAsB,gBACzC,SAAS,KAAK,YAAYA,CAAU,EAEpC,SAAS,gBAAgB,YAAYA,CAAU,CAEnD,CAEA,IAAI,cAAe,CACjB,OAAO,KAAK,YAAY,aAAe,KAAK,2BAC9C,CAEA,IAAI,cAAe,CACjB,GAAI,CAAC,KAAK,YAAY,YACpB,MAAO,CACL,OAAQ,+BACV,EAGF,GAAI,CAAC,KAAK,4BACR,MAAO,CACL,OAAQ,0BACV,CAEJ,CAEA,MAAM,iBAAkB,CACtB7G,GAAA,KAAKyY,GAAAC,IAAL,WACA,MAAM,KAAK,UAAU,CACvB,CAEA,MAAM,QAAS,CACT,KAAK,YACP,MAAM,KAAK,YAAY,CAE3B,CAEA,iBAAkB,CAChB,MAAM,gBAAgB,EACjB,KAAK,WACR,KAAK,+BAA+B,CAExC,CAEA,IAAI,qBAAsB,CACxB,OAAO,KAAK,gBAAgB,YAC9B,CAEA,IAAI,iBAAkB,CACpB,OAAO,KAAK,YAAY,YAC1B,CAEA,IAAI,YAAa,CACf,OAAO,KAAK,YAAY,OAC1B,CAkBA,MAAM,WAAY,CAChB,IAAME,EAAqB,KAAK,yBAAyB,EACnDC,EAAwB,KAAK,8BAA8B,EACjE,KAAK,0BAA0B,EAE/B,MAAMD,EACN,MAAMC,EAEF,KAAK,YACP,KAAK,sCAAsC,CAE/C,CAEA,MAAM,aAAc,CAClB,MAAM,KAAK,4BAA4B,SAAY,CACjD,KAAK,gBAAgB,EACrB,MAAM,KAAK,cAAc,CAC3B,CAAC,CACH,CAEA,IAAI,6BAA8B,CAChC,OAAO,KAAK,oBAAoB,yBAA2B,KAAK,gBAAgB,uBAClF,CAEA,MAAM,+BAAgC,CACpC,IAAMC,EAAkB,CAAC,EAEzB,QAAWthB,KAAW,KAAK,0BACzBshB,EAAgB,KAAK7e,GAAYzC,CAAO,CAAC,EAEzC,SAAS,KAAK,YAAYA,CAAO,EAGnC,MAAM,QAAQ,IAAIshB,CAAe,CACnC,CAEA,2BAA4B,CAC1B,QAAWthB,KAAW,KAAK,sBACzB,SAAS,KAAK,YAAYD,GAAsBC,CAAO,CAAC,CAE5D,CAEA,uCAAwC,CACtC,QAAWA,KAAW,KAAK,gCACzB,SAAS,KAAK,YAAYA,CAAO,CAErC,CAEA,MAAM,0BAA2B,CAC/B,IAAMuhB,EAAkB,CAAC,GAAG,KAAK,0BAA0B,EAE3D,QAAWvhB,KAAW,KAAK,+BACpB,KAAK,8BAA8BA,EAASuhB,CAAe,GAC9D,SAAS,KAAK,YAAYvhB,CAAO,EAIrC,QAAWA,KAAWuhB,EACpB,SAAS,KAAK,YAAYvhB,CAAO,CAErC,CAEA,8BAA8BA,EAASwhB,EAAa,CAClD,OAAW,CAACvX,EAAOoF,CAAU,IAAKmS,EAAY,QAAQ,EAAG,CAEvD,GAAIxhB,EAAQ,SAAW,QAAS,CAC9B,GAAIqP,EAAW,SAAW,QACxB,SAEF,GAAIrP,EAAQ,WAAaqP,EAAW,UAClC,OAAAmS,EAAY,OAAOvX,EAAO,CAAC,EACpB,EAEX,CAGA,GAAIoF,EAAW,YAAYrP,CAAO,EAChC,OAAAwhB,EAAY,OAAOvX,EAAO,CAAC,EACpB,EAEX,CAEA,MAAO,EACT,CAEA,sCAAuC,CACrC,QAAWjK,KAAW,KAAK,+BACzB,SAAS,KAAK,YAAYA,CAAO,CAErC,CAEA,gCAAiC,CAC/B,QAAWA,KAAW,KAAK,2BACzB,SAAS,KAAK,YAAYA,CAAO,CAErC,CAEA,iBAAkB,CAChB,SAAS,UAAU,KAAK,UAAU,EAClC,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,CACrC,CAEA,wBAAyB,CACvB,QAAWyhB,KAAmB,KAAK,WAAW,iBAAiB,UAAU,EACvEA,EAAgB,OAAO,CAE3B,CAEA,+BAAgC,CAC9B,QAAW/X,KAAsB,KAAK,sBAAuB,CAC3D,IAAMqG,EAAyBhQ,GAAsB2J,CAAkB,EACvEA,EAAmB,YAAYqG,CAAsB,CACvD,CACF,CAEA,MAAM,eAAgB,CACpB,MAAM,KAAK,cAAc,KAAK,eAAgB,KAAK,UAAU,CAC/D,CAEA,IAAI,iCAAkC,CACpC,OAAO,KAAK,0BAA0B,OAAQ/P,GACrCA,EAAQ,aAAa,kBAAkB,IAAM,SACrD,CACH,CAEA,IAAI,2BAA4B,CAC9B,OAAO,KAAK,oBAAoB,mCAAmC,KAAK,eAAe,CACzF,CAEA,IAAI,2BAA4B,CAC9B,OAAO,KAAK,gBAAgB,mCAAmC,KAAK,mBAAmB,CACzF,CAEA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,gBAAgB,+BAA+B,KAAK,mBAAmB,CACrF,CAEA,IAAI,gCAAiC,CACnC,OAAO,KAAK,oBAAoB,mBAClC,CAEA,IAAI,4BAA6B,CAC/B,OAAO,KAAK,gBAAgB,mBAC9B,CAEA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,WAAW,iBAAiB,QAAQ,CAClD,CACF,EA9NAihB,GAAA,YAyDEC,GAAY,UAAG,CACb,GAAM,CAAE,gBAAApH,CAAgB,EAAI,KAAK,gBAC3B,CAAE,IAAA4H,EAAK,KAAAC,CAAK,EAAI,KAAK,YAEvBA,EACF7H,EAAgB,aAAa,OAAQ6H,CAAI,EAEzC7H,EAAgB,gBAAgB,MAAM,EAEpC4H,EACF5H,EAAgB,aAAa,MAAO4H,CAAG,EAEvC5H,EAAgB,gBAAgB,KAAK,CAEzC,EAyJF,IAAM8H,GAAN,cAAmCT,EAAa,CAC9C,OAAO,cAAc/R,EAAgBC,EAAY,CAC/C4I,GAAc7I,EAAgBC,EAAY,CACxC,UAAW,CACT,kBAAmB,CAACxC,EAAM4D,IAEtB4H,GAA+BxL,EAAM4D,CAAO,GAC1C,CAACgI,GAAmC5L,CAAI,GAE1CA,EAAK,OAAO,EACL,IAEF,EAEX,CACF,CAAC,EAEDnM,GAAS,cAAe,CAAE,OAAQ,CAAE,eAAA0O,EAAgB,WAAAC,CAAW,CAAE,CAAC,CACpE,CAEA,MAAM,4BAA4B1L,EAAU,CAC1C,OAAO,MAAMA,EAAS,CACxB,CAEA,IAAI,cAAe,CACjB,MAAO,OACT,CAEA,IAAI,iBAAkB,CACpB,MAAO,EACT,CACF,EAEMke,GAAN,cAA4B/X,EAAS,CACnC,YAAYC,EAAM,CAChB,MAAMA,EAAM5D,EAAU,CACxB,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,OACd,CACF,EAEM2b,GAAN,cAAuB1U,EAAK,CAA5B,kCACE9N,GAAA,qBAAgB,IAAIuiB,GAAc,EAAE,GACpCviB,GAAA,4BAAuB,IAAI,IAAI,SAAS,IAAI,GAC5CA,GAAA,qBAAgB,IAEhB,mBAAmB4P,EAAa,CAC9B,OAAO,KAAK,SAAS,wBAA0BA,EAAY,sBAC7D,CAEA,WAAWzC,EAAUe,EAAY,GAAOE,EAAa,GAAM6O,EAAO,CA96KpE,IAAA7c,EAg7KI,IAAMqiB,EADkB,KAAK,cAAcxF,CAAK,MAAM7c,EAAA6c,GAAA,YAAAA,EAAO,UAAP,YAAA7c,EAAgB,SAAU,KAAK,SAAS,iBAAmB,QACzEkiB,GAAuBT,GAEzD5T,EAAW,IAAIwU,EAAc,KAAK,SAAUtV,EAAUe,EAAWE,CAAU,EAEjF,OAAKH,EAAS,aAGZgP,GAAA,MAAAA,EAAO,gBAFP,KAAK,cAAgB,GAKhB,KAAK,OAAOhP,CAAQ,CAC7B,CAEA,YAAYd,EAAU8P,EAAO,CAC3BA,GAAA,MAAAA,EAAO,gBACP,IAAMhP,EAAW,IAAIwT,GAAc,KAAK,SAAUtU,EAAU,EAAK,EACjE,OAAO,KAAK,OAAOc,CAAQ,CAC7B,CAEA,oBAAqB,CACnB,KAAK,cAAc,MAAM,CAC3B,CAEA,MAAM,cAAcd,EAAW,KAAK,SAAU,CAC5C,GAAIA,EAAS,YAAa,CACxB,KAAK,SAAS,sBAAsB,EACpC,GAAM,CAAE,qBAAsB3G,CAAS,EAAI,KAC3C,MAAM5E,GAAkB,EACxB,IAAM8gB,EAAiBvV,EAAS,MAAM,EACtC,YAAK,cAAc,IAAI3G,EAAUkc,CAAc,EACxCA,CACT,CACF,CAEA,6BAA6Blc,EAAU,CACrC,OAAO,KAAK,cAAc,IAAIA,CAAQ,CACxC,CAEA,cAAcyW,EAAO,CACnB,MAAO,CAACA,GAAU,KAAK,qBAAqB,WAAaA,EAAM,SAAS,UAAYA,EAAM,SAAW,SACvG,CAEA,6BAA6BA,EAAO,CA19KtC,IAAA7c,EA29KI,OAAO,KAAK,cAAc6c,CAAK,MAAM7c,EAAA6c,GAAA,YAAAA,EAAO,UAAP,YAAA7c,EAAgB,SAAU,KAAK,SAAS,iBAAmB,UAClG,CAEA,IAAI,UAAW,CACb,OAAOka,GAAa,YAAY,KAAK,OAAO,CAC9C,CACF,EAj+KAqI,GAm+KMC,GAAN,KAAgB,CAGd,YAAYna,EAAUoa,EAAe,CAFrC7iB,GAAA,gBAAW,yBAiEXsF,GAAA,KAAAqd,GAAc,IAAM,CAClB,KAAK,0BAA0B,SAAS,IAAI,CAC9C,GAhEE,KAAK,SAAWla,EAChB,KAAK,cAAgBoa,CACvB,CAEA,OAAQ,CACF,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoBtd,GAAA,KAAKod,GAAW,EAE9D,KAAK,0BAA0B,SAAS,IAAI,CAEhD,CAEA,MAAO,CACL,SAAS,oBAAoB,mBAAoBpd,GAAA,KAAKod,GAAW,CACnE,CAEA,0BAA0BjiB,EAAS,CACjC,QAAWiE,KAAQjE,EAAQ,iBAAiB,KAAK,QAAQ,EACnD,KAAK,SAAS,kBAAkBiE,CAAI,GACtC,KAAK,WAAWA,CAAI,CAG1B,CAEA,MAAM,WAAWA,EAAM,CACrB,IAAM6B,EAAW,IAAI,IAAI7B,EAAK,IAAI,EAElC,GAAI,KAAK,cAAc,IAAI6B,CAAQ,EACjC,OAIF,MADqB,IAAIgC,GAAa,KAAMR,GAAY,IAAKxB,EAAU,IAAI,gBAAmB7B,CAAI,EAC/E,QAAQ,CAC7B,CAIA,eAAeka,EAAc,CAC3BA,EAAa,QAAQ,eAAe,EAAI,UAC1C,CAEA,MAAM,6BAA6BA,EAAczV,EAAe,CAC9D,GAAI,CACF,IAAMqT,EAAe,MAAMrT,EAAc,aACnC+D,EAAWmN,GAAa,eAAemC,CAAY,EAEzD,KAAK,cAAc,IAAIoC,EAAa,IAAK1R,CAAQ,CACnD,OAASvK,EAAG,CAEZ,CACF,CAEA,eAAeic,EAAc,CAAC,CAE9B,eAAeA,EAAc,CAAC,CAE9B,gBAAgBA,EAAc,CAAC,CAE/B,iCAAiCA,EAAczV,EAAe,CAAC,CAE/D,0BAA0ByV,EAAczV,EAAe,CAAC,CAK1D,EAHEuZ,GAAA,YAriLF,IAAAG,GAAAC,GA0iLMC,GAAN,KAAY,CACV,YAAYhG,EAAS,CADvB1X,GAAA,KAAAwd,IAEI,KAAK,QAAU9F,CACjB,CAEA,OAAQ,CACN,KAAK,QAAQ,WAAW,CAC1B,CAEA,mBAAoB,CAClB9T,GAAA,KAAK4Z,GAAAC,IAAL,UAAsB,GACxB,CAEA,qBAAsB,CACpB7Z,GAAA,KAAK4Z,GAAAC,IAAL,UAAsB,WACxB,CAEA,uBAAwB,CACtB7Z,GAAA,KAAK4Z,GAAAC,IAAL,UAAsB,aACxB,CAKF,EAxBAD,GAAA,YAqBEC,GAAgB,SAAC7iB,EAAO,CACtB4D,GAAe,sBAAuB5D,CAAK,CAC7C,EAjkLF,IAAA+iB,GAokLMC,GAAN,KAAc,CAsBZ,YAAY3b,EAAgB,CArB5BvH,GAAA,iBAAY,IAAI2f,GAAU,IAAI,GAC9B3f,GAAA,eAAU,IAAI6d,GAAQ,IAAI,GAC1B7d,GAAA,YAAO,IAAIwiB,GAAS,KAAM,SAAS,eAAe,GAClDxiB,GAAA,eAAU,IAAI+c,GAAe,IAAI,GAEjC/c,GAAA,oBAAe,IAAI+f,GAAa,IAAI,GACpC/f,GAAA,qBAAgB,IAAIod,IACpBpd,GAAA,4BAAuB,IAAI4e,GAAqB,KAAM,QAAQ,GAC9D5e,GAAA,yBAAoB,IAAI4O,GAAkB,KAAM,MAAM,GACtD5O,GAAA,0BAAqB,IAAIwN,GAAmB,KAAM,QAAQ,GAC1DxN,GAAA,sBAAiB,IAAIigB,GAAe,IAAI,GACxCjgB,GAAA,sBAAiB,IAAIshB,GAAe,IAAI,GACxCthB,GAAA,6BAAwB,IAAI6O,GAAsB,KAAM,SAAS,eAAe,GAChF7O,GAAA,uBAAkB,IAAIyd,GAAgB,KAAM,SAAS,eAAe,GACpEzd,GAAA,6BAAwB,IAAImgB,IAC5BngB,GAAA,aAAQ,IAAIgjB,GAAM,IAAI,GAEtBhjB,GAAA,eAAU,IACVA,GAAA,eAAU,IACVsF,GAAA,KAAA2d,GAA6B,KAG3B,KAAK,eAAiB1b,EACtB,KAAK,UAAY,IAAIqb,GAAU,KAAM,KAAK,KAAK,aAAa,EAC5D,KAAK,iBAAmB,KAAK,QAC7B,KAAK,0BAA4B,KAAK,yBACxC,CAEA,OAAQ,CACD,KAAK,UACR,KAAK,aAAa,MAAM,EACxB,KAAK,cAAc,MAAM,EACzB,KAAK,qBAAqB,MAAM,EAChC,KAAK,sBAAsB,MAAM,EACjC,KAAK,kBAAkB,MAAM,EAC7B,KAAK,mBAAmB,MAAM,EAC9B,KAAK,eAAe,MAAM,EAC1B,KAAK,eAAe,MAAM,EAC1B,KAAK,gBAAgB,MAAM,EAC3B,KAAK,QAAQ,MAAM,EACnB,KAAK,UAAU,MAAM,EACrB,KAAK,QAAU,GACf,KAAK,QAAU,GAEnB,CAEA,SAAU,CACR,KAAK,QAAU,EACjB,CAEA,MAAO,CACD,KAAK,UACP,KAAK,aAAa,KAAK,EACvB,KAAK,cAAc,KAAK,EACxB,KAAK,qBAAqB,KAAK,EAC/B,KAAK,sBAAsB,KAAK,EAChC,KAAK,kBAAkB,KAAK,EAC5B,KAAK,mBAAmB,KAAK,EAC7B,KAAK,eAAe,KAAK,EACzB,KAAK,eAAe,KAAK,EACzB,KAAK,gBAAgB,KAAK,EAC1B,KAAK,QAAQ,KAAK,EAClB,KAAK,UAAU,KAAK,EACpB,KAAK,QAAU,GAEnB,CAEA,gBAAgBO,EAAS,CACvB,KAAK,QAAUA,CACjB,CAEA,MAAM3c,EAAUiB,EAAU,CAAC,EAAG,CAC5B,IAAMyI,EAAezI,EAAQ,MAAQ,SAAS,eAAeA,EAAQ,KAAK,EAAI,KAE9E,GAAIyI,aAAwB5P,GAAc,CACxC,IAAMiD,EAASkE,EAAQ,QAAUhE,GAAeyM,CAAY,EAE5DA,EAAa,SAAS,kCAAkCA,EAAc3M,CAAM,EAC5E2M,EAAa,IAAM1J,EAAS,SAAS,CACvC,MACE,KAAK,UAAU,aAAad,GAAUc,CAAQ,EAAGiB,CAAO,CAE5D,CAEA,QAAQ5B,EAAK4B,EAAU,CAAC,EAAG,CACzBA,EAAU,OAAOA,GAAY,SAAW,CAAE,UAAWA,CAAQ,EAAIA,EAEjE,GAAM,CAAE,OAAAM,EAAQ,UAAAqb,EAAW,OAAAC,CAAO,EAAI5b,EAChC6b,EAAkBF,GAAa,KAAK,eAAe,IAAIA,CAAS,EAChEG,EAAe1d,IAAQ,SAAS,QAClC,CAACyd,GAAmB,CAAC,KAAK,UAAU,cAAgBC,GACtD,KAAK,MAAM1d,EAAK,CAAE,OAAQ,UAAW,oBAAqB,GAAO,QAAS,CAAE,OAAAkC,EAAQ,OAAAsb,CAAO,CAAE,CAAC,CAElG,CAEA,oBAAoBvI,EAAQ,CAC1B,KAAK,eAAe,oBAAoBA,CAAM,CAChD,CAEA,uBAAuBA,EAAQ,CAC7B,KAAK,eAAe,uBAAuBA,CAAM,CACnD,CAEA,oBAAoB9Q,EAAS,CAC3B,KAAK,sBAAsB,OAAOD,GAAc,KAAKC,CAAO,CAAC,CAC/D,CAEA,YAAa,CACX,KAAK,KAAK,mBAAmB,CAC/B,CAEA,oBAAoBjF,EAAO,CACzB,QAAQ,KACN,4KACF,EAEA,KAAK,iBAAmBA,CAC1B,CAEA,IAAI,iBAAiBA,EAAO,CAC1BM,GAAO,MAAM,iBAAmBN,CAClC,CAEA,IAAI,kBAAmB,CACrB,OAAOM,GAAO,MAAM,gBACtB,CAEA,IAAI,MAAMnF,EAAO,CACfmF,GAAO,MAAM,QAAUnF,CACzB,CAEA,IAAI,OAAQ,CACV,OAAOmF,GAAO,MAAM,OACtB,CAEA,IAAI,SAASnF,EAAO,CAClBmF,GAAO,MAAM,KAAOnF,CACtB,CAEA,IAAI,UAAW,CACb,OAAOmF,GAAO,MAAM,IACtB,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,QAAQ,QACtB,CAEA,IAAI,uBAAwB,CAC1B,OAAO,KAAK,QAAQ,qBACtB,CAEA,IAAI,2BAA4B,CAC9B,OAAOE,GAAA,KAAK0d,GACd,CAEA,IAAI,0BAA0B/iB,EAAO,CACnC,KAAK,QAAU2E,GAAS,KAAK,iBAAiB,KAAK,IAAI,EAAG3E,CAAK,EAC/DsF,GAAA,KAAKyd,GAA6B/iB,EACpC,CAIA,kBAAkBQ,EAAS,CACzB,IAAM8iB,EAAW9iB,EAAQ,aAAa,mBAAmB,EACnD+iB,EAAW/iB,EAAQ,aAAa,mBAAmB,EACnDgjB,EAAchjB,EAAQ,aAAa,kBAAkB,EACrDid,EAAQ+F,GAAe,OAC3B,KACA,SAAS,eAAeA,CAAW,GAAK3f,GAAuBrD,EAAS,6BAA6B,EAEvG,GAAI8iB,GAAYC,GAAY9F,aAAiBrd,GAC3C,MAAO,GACF,CACL,IAAMkG,EAAW,IAAI,IAAI9F,EAAQ,IAAI,EAErC,OAAO,KAAK,qBAAqBA,CAAO,GAAK6F,GAAoBC,EAAU,KAAK,SAAS,YAAY,CACvG,CACF,CAIA,6DAA6DA,EAAUqV,EAAuBrN,EAAW,CACnG,KAAK,QACP,KAAK,UAAU,WAAWhI,EAAUqV,EAAuB,CACzD,OAAQ,UACR,eAAgB,GAChB,UAAArN,CACF,CAAC,EAED,KAAK,QAAQ,gBAAgB,CAC3B,OAAQ,gBACV,CAAC,CAEL,CAEA,4BAA4BhI,EAAU,CACpC,KAAK,QAAQ,QAAQA,CAAQ,EAC7B,KAAK,KAAK,qBAAuBA,EACjC,KAAK,KAAK,cAAc,CAC1B,CAIA,sBAAsB0Z,EAAU,CAC9B,KAAK,QAAQ,sBAAsB,CAAE,eAAgBA,CAAS,CAAC,CACjE,CAIA,6BAA6Bvb,EAAM6B,EAAU,CAC3C,OAAO,KAAK,qBAAqB7B,CAAI,GAAK4B,GAAoBC,EAAU,KAAK,SAAS,YAAY,CACpG,CAEA,6BAA8B,CAAC,CAI/B,6BAA6B7B,EAAM6B,EAAU,CAC3C,OACE,KAAK,qBAAqB7B,CAAI,GAC9B4B,GAAoBC,EAAU,KAAK,SAAS,YAAY,GACxD,KAAK,UAAU,oCAAoCA,CAAQ,CAE/D,CAIA,yBAAyB7B,EAAM6B,EAAU/E,EAAO,CAC9C,OACE,KAAK,qBAAqBkD,CAAI,GAC9B4B,GAAoBC,EAAU,KAAK,SAAS,YAAY,GACxD,KAAK,yCAAyC7B,EAAM6B,EAAU/E,CAAK,CAEvE,CAEA,uBAAuBkD,EAAM6B,EAAU,CACrC,IAAMjD,EAAS,KAAK,iBAAiBoB,CAAI,EACnCyX,EAAwBzX,EAAK,aAAa,mBAAmB,EAEnE,KAAK,MAAM6B,EAAS,KAAM,CAAE,OAAAjD,EAAQ,sBAAA6Y,CAAsB,CAAC,CAC7D,CAIA,iCAAiC5V,EAAUjD,EAAQ,CACjD,OAAO,KAAK,kCAAkCiD,CAAQ,CACxD,CAEA,wBAAwBA,EAAUiB,EAAS,CACzCkc,GAAkCnd,CAAQ,EAC1C,KAAK,QAAQ,wBAAwBA,EAAUiB,CAAO,CACxD,CAIA,aAAawV,EAAO,CACbA,EAAM,wBACTha,GAAW,SAAS,eAAe,EACnC,KAAK,KAAK,mBAAmBga,EAAM,SAAS,GAE9C0G,GAAkC1G,EAAM,QAAQ,EAChD,KAAK,uCAAuCA,EAAM,SAAUA,EAAM,MAAM,CAC1E,CAEA,eAAeA,EAAO,CACpB,KAAK,KAAK,qBAAqB,EAC/B/Z,GAAe,SAAS,eAAe,EACvC,KAAK,+BAA+B+Z,EAAM,iBAAiB,CAAC,CAC9D,CAIA,eAAejX,EAAMd,EAAW,CAC9B,IAAM3B,EAASwC,GAAYC,EAAMd,CAAS,EAE1C,OACE,KAAK,wBAAwBc,EAAMd,CAAS,GAC5CqB,GAAoBb,GAAUnC,CAAM,EAAG,KAAK,SAAS,YAAY,CAErE,CAEA,cAAcyC,EAAMd,EAAW,CAC7B,KAAK,UAAU,WAAWc,EAAMd,CAAS,CAC3C,CAIA,uBAAwB,CACtB,KAAK,KAAK,qBAAuB,KAAK,SACtC,KAAK,+BAA+B,CACtC,CAEA,YAAa,CACX,KAAK,QAAQ,iCAAiC,CAChD,CAEA,gBAAiB,CACf,KAAK,QAAQ,qCAAqC,CACpD,CAIA,0BAA0B8E,EAAS,CACjC,KAAK,oBAAoBA,CAAO,CAClC,CAIA,uBAAwB,CACtB,KAAK,uCAAuC,CAC9C,CAEA,sBAAsB,CAAE,QAAAtJ,CAAQ,EAAG+G,EAAS,CAC1C,IAAMhG,EAAQ,KAAK,8BAA8Bf,EAAS+G,CAAO,EAC3D,CACJ,iBAAAmc,EACA,OAAQ,CAAE,OAAAtI,CAAO,CACnB,EAAI7Z,EAEJ,OAAI,KAAK,KAAK,UAAY6Z,IACxB,KAAK,KAAK,SAAS,cAAgBA,GAG9B,CAACsI,CACV,CAEA,qBAAqBC,EAAWC,EAAYC,EAAc,CACxD,KAAK,KAAK,qBAAuB,KAAK,QAAQ,SAC9C,KAAK,6BAA6BA,CAAY,CAChD,CAEA,0BAA0BrjB,EAAS,CACjC,KAAK,UAAU,0BAA0BA,CAAO,CAClD,CAEA,gBAAgB6N,EAAQ,CACtB,KAAK,QAAQ,gBAAgBA,CAAM,CACrC,CAIA,YAAYoP,EAAO,CACjB,KAAK,gCAAgCA,CAAK,CAC5C,CAEA,cAAcvU,EAAeuU,EAAO,CAClC,KAAK,kCAAkCvU,EAAeuU,CAAK,CAC7D,CAIA,yCAAyChZ,EAAM6B,EAAUwd,EAAI,CAE3D,MAAO,CADO,KAAK,6CAA6Crf,EAAM6B,EAAUwd,CAAE,EACpE,gBAChB,CAEA,kCAAkCxd,EAAU,CAE1C,MAAO,CADO,KAAK,wCAAwCA,CAAQ,EACrD,gBAChB,CAEA,6CAA6C7B,EAAM6B,EAAU/E,EAAO,CAClE,OAAOL,GAAS,cAAe,CAC7B,OAAQuD,EACR,OAAQ,CAAE,IAAK6B,EAAS,KAAM,cAAe/E,CAAM,EACnD,WAAY,EACd,CAAC,CACH,CAEA,wCAAwC+E,EAAU,CAChD,OAAOpF,GAAS,qBAAsB,CACpC,OAAQ,CAAE,IAAKoF,EAAS,IAAK,EAC7B,WAAY,EACd,CAAC,CACH,CAEA,uCAAuCA,EAAUjD,EAAQ,CACvD,OAAOnC,GAAS,cAAe,CAAE,OAAQ,CAAE,IAAKoF,EAAS,KAAM,OAAAjD,CAAO,CAAE,CAAC,CAC3E,CAEA,wCAAyC,CACvC,OAAOnC,GAAS,oBAAoB,CACtC,CAEA,8BAA8B6iB,EAASxc,EAAS,CAC9C,OAAOrG,GAAS,sBAAuB,CACrC,OAAQyG,GAAA,CAAE,QAAAoc,GAAYxc,GACtB,WAAY,EACd,CAAC,CACH,CAEA,6BAA6Bsc,EAAc,CACzC,OAAO3iB,GAAS,eAAgB,CAAE,OAAQ,CAAE,aAAA2iB,CAAa,CAAE,CAAC,CAC9D,CAEA,+BAA+BG,EAAS,CAAC,EAAG,CAC1C,OAAO9iB,GAAS,aAAc,CAC5B,OAAQ,CAAE,IAAK,KAAK,SAAS,KAAM,OAAA8iB,CAAO,CAC5C,CAAC,CACH,CAEA,gCAAgCvG,EAAO,CACrC,OAAOvc,GAAS,mBAAoB,CAAE,OAAQuc,CAAM,CAAC,CACvD,CAEA,kCAAkCvU,EAAeuU,EAAO,CACtD,OAAOvc,GAAS,qBAAsB,CACpC,OAAQ,CAAE,cAAAgI,CAAc,EACxB,OAAQuU,EACR,WAAY,EACd,CAAC,CACH,CAIA,wBAAwB3X,EAAMd,EAAW,CACvC,GAAIG,GAAO,MAAM,MAAQ,MACvB,MAAO,GACF,CACL,IAAM8e,EAAyBjf,EAAY,KAAK,qBAAqBA,CAAS,EAAI,GAElF,OAAIG,GAAO,MAAM,MAAQ,QAChB8e,GAA0Bne,EAAK,QAAQ,qBAAqB,GAAK,KAEjEme,GAA0B,KAAK,qBAAqBne,CAAI,CAEnE,CACF,CAEA,qBAAqBtF,EAAS,CAC5B,IAAM0jB,EAAYrgB,GAAuBrD,EAAS,cAAc,EAC1D2jB,EAActgB,GAAuBrD,EAAS,aAAa,EAGjE,OAAI2E,GAAO,MAAM,SAAWgf,EAEtBD,EACKA,EAAU,aAAa,YAAY,GAAK,QAExC,GAILA,EACKA,EAAU,aAAa,YAAY,GAAK,OAExC,EAGb,CAIA,iBAAiBzf,EAAM,CACrB,OAAOlB,GAAekB,CAAI,GAAK,SACjC,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,KAAK,QACnB,CACF,EAzbEse,GAAA,YAscF,SAASU,GAAkC9d,EAAK,CAC9C,OAAO,iBAAiBA,EAAKye,EAAqC,CACpE,CAEA,IAAMA,GAAwC,CAC5C,YAAa,CACX,KAAM,CACJ,OAAO,KAAK,SAAS,CACvB,CACF,CACF,EAEMtH,GAAU,IAAIkG,GAAQ3b,EAAc,EAGpC,CAAE,MAAAgd,GAAO,UAAWC,EAAiB,EAAIxH,GAO/C,SAASyH,IAAQ,CACfzH,GAAQ,MAAM,CAChB,CAOA,SAAS0H,GAAgBvB,EAAS,CAChCnG,GAAQ,gBAAgBmG,CAAO,CACjC,CAgBA,SAASlG,GAAMzW,EAAUiB,EAAS,CAChCuV,GAAQ,MAAMxW,EAAUiB,CAAO,CACjC,CAOA,SAASkd,GAAoB7J,EAAQ,CACnCkC,GAAQ,oBAAoBlC,CAAM,CACpC,CAOA,SAAS8J,GAAuB9J,EAAQ,CACtCkC,GAAQ,uBAAuBlC,CAAM,CACvC,CAQA,SAAS+J,GAAoB7a,EAAS,CACpCgT,GAAQ,oBAAoBhT,CAAO,CACrC,CAYA,SAAS8a,GAAoB/f,EAAO,CAClC,QAAQ,KACN,+LACF,EACAM,GAAO,MAAM,iBAAmBN,CAClC,CAEA,SAASggB,GAAiBC,EAAe,CACvC,QAAQ,KACN,mMACF,EACA3f,GAAO,MAAM,QAAU2f,CACzB,CAEA,SAASC,GAAYC,EAAM,CACzB,QAAQ,KACN,yKACF,EACA7f,GAAO,MAAM,KAAO6f,CACtB,CAWA,SAASC,GAAkBC,EAAanB,EAAS,CAC/C3B,GAAqB,cAAc8C,EAAanB,CAAO,CACzD,CAWA,SAASoB,GAAwBrM,EAAcC,EAAU,CACvDM,GAAsB,cAAcP,EAAcC,CAAQ,CAC5D,CAEA,IAAIqM,GAAqB,OAAO,OAAO,CACrC,UAAW,KACX,aAAczD,GACd,aAAcvH,GACd,cAAetK,GACf,MAAOxI,GACP,OAAQnC,GACR,QAAS2X,GACT,MAAOuH,GACP,UAAWC,GACX,MAAOC,GACP,gBAAiBC,GACjB,MAAOzH,GACP,oBAAqB0H,GACrB,uBAAwBC,GACxB,oBAAqBC,GACrB,oBAAqBC,GACrB,iBAAkBC,GAClB,YAAaE,GACb,kBAAmBE,GACnB,wBAAyBE,GACzB,cAAe3T,GACf,cAAeiH,EACjB,CAAC,EAEK4M,GAAN,cAAqC,KAAM,CAAC,EAjsM5CC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAAA/I,GAAAgJ,GAAAC,GAAAC,GAAAC,GAAAC,GAAAC,GAmsMMC,GAAN,KAAsB,CAUpB,YAAYpmB,EAAS,CAVvB4E,GAAA,KAAAwgB,IACE9lB,GAAA,2BAAuB+mB,GAAmB,QAAQ,QAAQ,GAC1DzhB,GAAA,KAAAkgB,GAAuB,MACvBlgB,GAAA,KAAAmgB,GAAuB,IAAM,CAAC,GAC9BngB,GAAA,KAAAogB,GAAa,IACbpgB,GAAA,KAAAqgB,GAAiB,IACjBrgB,GAAA,KAAAsgB,GAAqB,IAAI,KACzBtgB,GAAA,KAAAugB,GAAoB,IACpB7lB,GAAA,cAAS,MA4QTA,GAAA,2BAAsB,CAAC,CAAE,QAAAU,CAAQ,IAAM,CACrC,IAAMid,EAAQjd,EAAQ,cAAc,IAAM,KAAK,QAAQ,EAAE,EAErDid,GAAS,KAAK,sBAChBA,EAAM,gBAAgB,GAAG,KAAK,qBAAqB,QAAQ,EAG7D,OAAO,KAAK,oBACd,GAjRE,KAAK,QAAUjd,EACf,KAAK,KAAO,IAAI+N,GAAU,KAAM,KAAK,OAAO,EAC5C,KAAK,mBAAqB,IAAI5E,GAAmB,KAAM,KAAK,OAAO,EACnE,KAAK,sBAAwB,IAAIgF,GAAsB,KAAM,KAAK,OAAO,EACzE,KAAK,gBAAkB,IAAIH,GAAgB,KAAM,KAAK,OAAO,EAC7D,KAAK,sBAAwB/L,GAAK,EAClC,KAAK,mBAAqB,IAAI6K,GAAmB,KAAM,KAAK,OAAO,CACrE,CAIA,SAAU,CACHjI,GAAA,KAAKmgB,MACRlgB,GAAA,KAAKkgB,GAAa,IACd,KAAK,cAAgB5lB,GAAkB,KACzC,KAAK,mBAAmB,MAAM,EAE9BoJ,GAAA,KAAK4c,GAAAC,IAAL,WAEF,KAAK,sBAAsB,MAAM,EACjC,KAAK,gBAAgB,MAAM,EAC3B,KAAK,mBAAmB,MAAM,EAElC,CAEA,YAAa,CAvuMf,IAAA3lB,EAwuMQmF,GAAA,KAAKmgB,MACPlgB,GAAA,KAAKkgB,GAAa,IAClB,KAAK,mBAAmB,KAAK,EAC7B,KAAK,sBAAsB,KAAK,EAChC,KAAK,gBAAgB,KAAK,EAC1B,KAAK,mBAAmB,KAAK,EAExB,KAAK,QAAQ,aAAa,SAAS,IACtCtlB,EAAAmF,GAAA,KAAKigB,MAAL,MAAAplB,EAA2B,SAGjC,CAEA,iBAAkB,CArvMpB,IAAAA,EAsvMQ,KAAK,UACPA,EAAAmF,GAAA,KAAKigB,MAAL,MAAAplB,EAA2B,SAClB,KAAK,cAAgBN,GAAkB,OAChDoJ,GAAA,KAAK4c,GAAAC,IAAL,UAEJ,CAEA,kBAAmB,CA7vMrB,IAAA3lB,EA8vMQ8I,GAAA,KAAK4c,GAAAY,IAAL,UAA0B,SAEzB,KAAK,YACRtmB,EAAAmF,GAAA,KAAKigB,MAAL,MAAAplB,EAA2B,SAGzB,KAAK,QAAQ,cACf,KAAK,SAAW,KAGd,KAAK,cAAgBN,GAAkB,OAASyF,GAAA,KAAKogB,MACvDzc,GAAA,KAAK4c,GAAAC,IAAL,WAEJ,CAEA,mBAAoB,CAClB,GAAM,CAAE,QAAA1J,EAAS,IAAA2K,CAAI,EAAI,KAAK,QAE9B,OAAAxhB,GAAA,KAAKqgB,GAAoBmB,GAAO3K,IAAY,SAE5C,KAAK,QAAQ,gBAAgB,UAAU,EACvC,KAAK,QAAQ,IAAM,KACnB,KAAK,QAAQ,IAAM2K,EACZ,KAAK,QAAQ,MACtB,CAEA,qBAAsB,CAChB,KAAK,cAAgBlnB,GAAkB,KACzC,KAAK,mBAAmB,MAAM,GAE9B,KAAK,mBAAmB,KAAK,EAC7BoJ,GAAA,KAAK4c,GAAAC,IAAL,WAEJ,CAWA,MAAM,aAAa3c,EAAe,EAC5BA,EAAc,YAAeA,EAAc,WAAaA,EAAc,UACxE,KAAK,UAAYA,EAAc,SAAS,KAG1C,GAAI,CACF,IAAMlI,EAAO,MAAMkI,EAAc,aACjC,GAAIlI,EAAM,CACR,IAAM+lB,EAAWllB,GAAkBb,CAAI,EAClBoZ,GAAa,aAAa2M,CAAQ,EAEtC,YACf,MAAM/d,GAAA,KAAK4c,GAAAE,IAAL,UAAwB5c,EAAe6d,GAE7C,MAAM/d,GAAA,KAAK4c,GAAAK,IAAL,UAAqC/c,EAE/C,CACF,QAAE,CACA5D,GAAA,KAAKqgB,GAAoB,IACzB,KAAK,oBAAsB,IAAM,QAAQ,QAAQ,CACnD,CACF,CAIA,0BAA0BnlB,EAAS,CACjC,KAAK,kCAAkCA,EAAS+C,GAAe/C,CAAO,CAAC,EACvEwI,GAAA,KAAK4c,GAAAC,IAAL,UACF,CAIA,6BAA6BphB,EAAM,CACjC,OAAOuE,GAAA,KAAK4c,GAAAW,IAAL,UAAgC9hB,EACzC,CAEA,4BAA4BA,EAAM+Y,EAAW1X,EAAM,CACjD,IAAM2X,EAAQzU,GAAA,KAAK4c,GAAAtI,IAAL,UAAuB7Y,GACjCgZ,GAAO3X,EAAK,aAAa,mBAAoB2X,EAAM,EAAE,CAC3D,CAIA,yBAAyBjd,EAASgd,EAAW/O,EAAQ,CACnD,OAAOzF,GAAA,KAAK4c,GAAAW,IAAL,UAAgC/lB,EACzC,CAEA,qBAAqBA,EAAS8F,EAAU,CACtC0C,GAAA,KAAK4c,GAAAI,IAAL,UAAoBxlB,EAAS8F,EAC/B,CAIA,eAAe9F,EAASwE,EAAW,CACjC,OAAOxE,EAAQ,QAAQ,aAAa,GAAK,KAAK,SAAWwI,GAAA,KAAK4c,GAAAW,IAAL,UAAgC/lB,EAASwE,EACpG,CAEA,cAAcxE,EAASwE,EAAW,CAC5B,KAAK,gBACP,KAAK,eAAe,KAAK,EAG3B,KAAK,eAAiB,IAAIqG,GAAe,KAAM7K,EAASwE,CAAS,EAEjE,GAAM,CAAE,aAAA2Z,CAAa,EAAI,KAAK,eACxBlB,EAAQzU,GAAA,KAAK4c,GAAAtI,IAAL,UAAuB9c,EAASwE,GAE9C,KAAK,eAAe2Z,EAAclB,CAAK,EACvC,KAAK,eAAe,MAAM,CAC5B,CAIA,eAAe1S,EAAS0S,EAAQ,KAAM,CAn3MxC,IAAAvd,EAo3MI6K,EAAQ,QAAQ,aAAa,EAAI0S,EAAM,IAEnCvd,EAAA,KAAK,2BAAL,MAAAA,EAA+B,aAAa,sBAC9C6K,EAAQ,mBAAmBlB,GAAc,WAAW,CAExD,CAEA,eAAewC,EAAU,CACvBtJ,GAAW,KAAK,OAAO,CACzB,CAEA,iCAAiCsJ,EAAUmQ,EAAW,CACpDnX,GAAA,KAAKkgB,IAAL,UACF,CAEA,MAAM,6BAA6Bxa,EAAS9D,EAAU,CACpD,MAAM,KAAK,aAAaA,CAAQ,EAChC5B,GAAA,KAAKkgB,IAAL,UACF,CAEA,MAAM,0BAA0Bxa,EAAS9D,EAAU,CACjD,MAAM,KAAK,aAAaA,CAAQ,EAChC5B,GAAA,KAAKkgB,IAAL,UACF,CAEA,eAAexa,EAAS9B,EAAO,CAC7B,QAAQ,MAAMA,CAAK,EACnB5D,GAAA,KAAKkgB,IAAL,UACF,CAEA,gBAAgBlZ,EAAU,CACxBrJ,GAAe,KAAK,OAAO,CAC7B,CAIA,sBAAsB,CAAE,YAAAuI,CAAY,EAAG,CACrCxI,GAAWwI,EAAavC,GAAA,KAAK4c,GAAAtI,IAAL,UAAuB/R,EAAY,CAC7D,CAEA,oCAAoCmU,EAAgBzY,EAAU,CAC5D,IAAMwW,EAAQzU,GAAA,KAAK4c,GAAAtI,IAAL,UAAuBoC,EAAe,YAAaA,EAAe,WAEhFjC,EAAM,SAAS,kCAAkCA,EAAOla,GAAemc,EAAe,UAAWA,EAAe,YAAajC,CAAK,CAAC,EACnIA,EAAM,SAAS,aAAaxW,CAAQ,EAE/ByY,EAAe,QAClB5C,GAAQ,WAAW,CAEvB,CAEA,iCAAiC4C,EAAgBxW,EAAe,CAC9D,KAAK,QAAQ,SAAS,aAAaA,CAAa,EAChD4T,GAAQ,WAAW,CACrB,CAEA,sBAAsB4C,EAAgBzW,EAAO,CAC3C,QAAQ,MAAMA,CAAK,CACrB,CAEA,uBAAuB,CAAE,YAAAsC,CAAY,EAAG,CACtCvI,GAAeuI,EAAavC,GAAA,KAAK4c,GAAAtI,IAAL,UAAuB/R,EAAY,CACjE,CAIA,sBAAsB,CAAE,QAASwN,CAAS,EAAGxR,EAAS,CACpD,IAAMhG,EAAQL,GAAS,4BAA6B,CAClD,OAAQ,KAAK,QACb,OAAQyG,GAAA,CAAE,SAAAoR,GAAaxR,GACvB,WAAY,EACd,CAAC,EAEK,CACJ,iBAAAmc,EACA,OAAQ,CAAE,OAAAtI,CAAO,CACnB,EAAI7Z,EAEJ,OAAI,KAAK,KAAK,UAAY6Z,IACxB,KAAK,KAAK,SAAS,cAAgBA,GAG9B,CAACsI,CACV,CAEA,qBAAqBC,EAAWC,EAAYoD,EAAe,CAAC,CAE5D,0BAA0BxmB,EAAS,CACjCsc,GAAQ,0BAA0Btc,CAAO,CAC3C,CAEA,iBAAkB,CAAC,CAInB,gBAAgBoP,EAAgBqX,EAAa,CAC3C,KAAK,qBAAuBrX,EAAe,UAAU,EAAI,CAC3D,CA4DA,kCAAkC6N,EAAOpa,EAAS,KAAM,CAGtD,GAFA,KAAK,OAASA,EAEV,KAAK,OAAQ,CACf,IAAM6jB,EAAe9M,GAAa,YAAYqD,CAAK,EAAE,MAAM,EACrD,CAAE,oBAAA1B,CAAoB,EAAI0B,EAAM,SAEtCA,EAAM,SAAS,oBAAsB,MAAOvU,GAAkB,CAC5D,GAAIuU,EAAM,IAAK,CACb,GAAM,CAAE,WAAApB,EAAY,WAAAI,CAAW,EAAIvT,EAC7BqT,EAAe,MAAMrT,EAAc,aAEnC3B,EAAU,CACd,SAFe,CAAE,WAAA8U,EAAY,WAAAI,EAAY,aAAAF,CAAa,EAGtD,oBAAAR,EACA,WAAY,GACZ,cAAe,GACf,sBAAuB,KAAK,sBAC5B,SAAUmL,CACZ,EAEI,KAAK,SAAQ3f,EAAQ,OAAS,KAAK,QAEvCuV,GAAQ,MAAMW,EAAM,IAAKlW,CAAO,CAClC,CACF,CACF,CACF,CAEA,eAAgB,CACd,GAAI,KAAK,OAAQ,CACf,IAAMM,EAASzE,GAA0B,KAAK,MAAM,EACpD0Z,GAAQ,QAAQ,OAAOjV,EAAQrC,GAAU,KAAK,QAAQ,KAAO,EAAE,EAAG,KAAK,qBAAqB,CAC9F,CACF,CAwDA,MAAM,2BAA2B0e,EAAW,CAC1C,IAAI1jB,EACEuM,EAAK,IAAI,OAAO,KAAK,EAAE,EAE7B,GAAI,CAEF,GADAvM,EAAU2mB,GAAgBjD,EAAU,cAAc,eAAenX,CAAE,EAAE,EAAG,KAAK,SAAS,EAClFvM,EACF,OAAOA,EAIT,GADAA,EAAU2mB,GAAgBjD,EAAU,cAAc,6BAA6BnX,CAAE,GAAG,EAAG,KAAK,SAAS,EACjGvM,EACF,aAAMA,EAAQ,OACP,MAAM,KAAK,2BAA2BA,CAAO,CAExD,OAASyI,EAAO,CACd,eAAQ,MAAMA,CAAK,EACZ,IAAI7I,EACb,CAEA,OAAO,IACT,CAyCA,IAAI,IAAK,CACP,OAAO,KAAK,QAAQ,EACtB,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,QAAQ,QACtB,CAEA,IAAI,SAAU,CACZ,MAAO,CAAC,KAAK,QACf,CAEA,IAAI,WAAY,CACd,GAAI,KAAK,QAAQ,IACf,OAAO,KAAK,QAAQ,GAExB,CAEA,IAAI,UAAUgnB,EAAW,CACvBpe,GAAA,KAAK4c,GAAAa,IAAL,UAAiC,MAAO,IAAM,CAC5C,KAAK,QAAQ,IAAMW,GAAA,KAAAA,EAAa,IAClC,EACF,CAEA,IAAI,cAAe,CACjB,OAAO,KAAK,QAAQ,OACtB,CAEA,IAAI,WAAY,CACd,OAAO,KAAK,iBAAmB,QAAa/hB,GAAA,KAAKkgB,IAAL,aAAgC,MAC9E,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,QAAQ,aAAa,UAAU,CAC7C,CAEA,IAAI,SAASvlB,EAAO,CACdA,EACF,KAAK,QAAQ,aAAa,WAAY,EAAE,EAExC,KAAK,QAAQ,gBAAgB,UAAU,CAE3C,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,QAAQ,UAAYqF,GAAA,KAAKmgB,GACvC,CAEA,IAAI,cAAe,CAztNrB,IAAAtlB,EA0tNI,IAAMwd,EAAO,KAAK,QAAQ,cAAc,cAAc,yBAAyB,EACzEtG,GAAOlX,EAAAwd,GAAA,YAAAA,EAAM,UAAN,KAAAxd,EAAiB,IAC9B,OAAOsF,GAAU4R,CAAI,CACvB,CA4BF,EApjBEkO,GAAA,YACAC,GAAA,YACAC,GAAA,YACAC,GAAA,YACAC,GAAA,YACAC,GAAA,YAPFC,GAAA,YA8FQC,GAAc,gBAAG,CACjB,KAAK,SAAW,KAAK,UAAY,CAAC,KAAK,UAAY,KAAK,YAC1D,KAAK,QAAQ,OAAS7c,GAAA,KAAK4c,GAAAG,IAAL,UAAYvgB,GAAU,KAAK,SAAS,GAC1D,KAAK,mBAAmB,KAAK,EAC7B,MAAM,KAAK,QAAQ,OACnBF,GAAA,KAAKmgB,GAAiB,IAE1B,EA2LMK,GAAkB,eAAC5c,EAAe6d,EAAU,CAChD,IAAMM,EAAkB,MAAM,KAAK,2BAA2BN,EAAS,IAAI,EACrExE,EAAgBld,GAAA,KAAKsgB,IAAoBtM,GAAwBvJ,GAEvE,GAAIuX,EAAiB,CACnB,IAAMpa,EAAW,IAAIJ,GAASwa,CAAe,EACvCtZ,EAAW,IAAIwU,EAAc,KAAM,KAAK,KAAK,SAAUtV,EAAU,GAAO,EAAK,EAC/E,KAAK,KAAK,eAAe,MAAM,KAAK,KAAK,cAC7C,KAAK,cAAc,EAEnB,MAAM,KAAK,KAAK,OAAOc,CAAQ,EAC/B,KAAK,SAAW,GAChB+O,GAAQ,cAAc5T,EAAe,KAAK,OAAO,EACjD4T,GAAQ,YAAY,KAAK,OAAO,EAChC,MAAM,KAAK,oBAAoB5T,CAAa,CAC9C,MAAWF,GAAA,KAAK4c,GAAAM,IAAL,UAAyChd,IAClDF,GAAA,KAAK4c,GAAAO,IAAL,UAAqCjd,EAEzC,EAEM6c,GAAM,eAACpgB,EAAK,CAv/MpB,IAAAzF,EAw/MI,IAAM6K,EAAU,IAAIzC,GAAa,KAAMR,GAAY,IAAKnC,EAAK,IAAI,gBAAmB,KAAK,OAAO,EAEhG,OAAAzF,EAAAmF,GAAA,KAAKigB,MAAL,MAAAplB,EAA2B,SAC3BoF,GAAA,KAAKggB,GAAuBva,GAErB,IAAI,QAASnJ,GAAY,CAC9B0D,GAAA,KAAKigB,GAAuB,IAAM,CAChCjgB,GAAA,KAAKigB,GAAuB,IAAM,CAAC,GACnCjgB,GAAA,KAAKggB,GAAuB,MAC5B1jB,EAAQ,CACV,GACAmJ,EAAQ,QAAQ,CAClB,CAAC,CACH,EAEAib,GAAc,SAACxlB,EAASmF,EAAKX,EAAW,CACtC,IAAMyY,EAAQzU,GAAA,KAAK4c,GAAAtI,IAAL,UAAuB9c,EAASwE,GAE9CyY,EAAM,SAAS,kCAAkCA,EAAOla,GAAeyB,EAAWxE,EAASid,CAAK,CAAC,EAEjGzU,GAAA,KAAK4c,GAAAc,IAAL,UAAmClmB,EAAS,IAAM,CAChDid,EAAM,IAAM9X,CACd,EACF,EAsCMsgB,GAA+B,eAAC/c,EAAe,CACnD,QAAQ,KACN,iBAAiBA,EAAc,UAAU,2BAA2B,KAAK,QAAQ,EAAE,gEACrF,EAEA,MAAMF,GAAA,KAAK4c,GAAAS,IAAL,UAAoBnd,EAAc,SAC1C,EAEAgd,GAAmC,SAAChd,EAAe,CACjD,KAAK,QAAQ,aAAa,WAAY,EAAE,EAExC,IAAMjC,EAAWiC,EAAc,SACzB6T,EAAQ,MAAOpX,EAAK4B,IAAY,CAChC5B,aAAe,SACjBqD,GAAA,KAAK4c,GAAAS,IAAL,UAAoB1gB,GAEpBmX,GAAQ,MAAMnX,EAAK4B,CAAO,CAE9B,EAQA,MAAO,CANOrG,GAAS,sBAAuB,CAC5C,OAAQ,KAAK,QACb,OAAQ,CAAE,SAAA+F,EAAU,MAAA8V,CAAM,EAC1B,WAAY,EACd,CAAC,EAEa,gBAChB,EAEAoJ,GAA+B,SAACjd,EAAe,CAC7C,KAAK,KAAK,QAAQ,EAClBF,GAAA,KAAK4c,GAAAQ,IAAL,UAA6Bld,EAC/B,EAEAkd,GAAuB,SAACld,EAAe,CACrC,IAAMY,EAAU,iBAAiBZ,EAAc,UAAU,mDAAmD,KAAK,QAAQ,EAAE,mGAC3H,MAAM,IAAImc,GAAuBvb,CAAO,CAC1C,EAEMuc,GAAc,eAACpf,EAAU,CAC7B,IAAMqgB,EAAU,IAAItgB,GAAcC,CAAQ,EACpCsV,EAAe,MAAM+K,EAAQ,aAC7B,CAAE,SAAAhhB,EAAU,WAAAmW,EAAY,WAAAJ,CAAW,EAAIiL,EAE7C,OAAOxK,GAAQ,MAAMxW,EAAU,CAAE,SAAU,CAAE,WAAAmW,EAAY,WAAAJ,EAAY,aAAAE,CAAa,CAAE,CAAC,CACvF,EAEAe,GAAiB,SAAC9c,EAASwE,EAAW,CACpC,IAAM+H,EAAKpK,GAAa,mBAAoBqC,EAAWxE,CAAO,GAAK,KAAK,QAAQ,aAAa,QAAQ,EAC/FY,EAAS4H,GAAA,KAAK4c,GAAAe,IAAL,UAA0B5Z,GAEzC,OAAO3L,aAAkBhB,GAAegB,EAAS,KAAK,OACxD,EAyBAklB,GAAsB,SAACxgB,EAAMd,EAAW,CACtC,IAAM3B,EAASwC,GAAYC,EAAMd,CAAS,EAE1C,OAAOqB,GAAoBb,GAAUnC,CAAM,EAAG,KAAK,YAAY,CACjE,EAEAkjB,GAA0B,SAAC/lB,EAASwE,EAAW,CAC7C,IAAM+H,EAAKpK,GAAa,mBAAoBqC,EAAWxE,CAAO,GAAK,KAAK,QAAQ,aAAa,QAAQ,EAMrG,GAJIA,aAAmB,iBAAmB,CAACwI,GAAA,KAAK4c,GAAAU,IAAL,UAA4B9lB,EAASwE,IAI5E,CAAC,KAAK,SAAW+H,GAAM,OACzB,MAAO,GAGT,GAAIA,EAAI,CACN,IAAMiD,EAAehH,GAAA,KAAK4c,GAAAe,IAAL,UAA0B5Z,GAC/C,GAAIiD,EACF,MAAO,CAACA,EAAa,SAChB,GAAIjD,GAAM,UACf,MAAO,EAEX,CAMA,MAJI,GAAC+P,GAAQ,qBAAqBtc,CAAO,GAIrCwE,GAAa,CAAC8X,GAAQ,qBAAqB9X,CAAS,EAK1D,EA0DAwhB,GAAoB,SAAC5jB,EAAe,CAClC,OAAOyC,GAAA,KAAKqgB,IAAmB,IAAI9iB,CAAa,CAClD,EAEA6jB,GAA2B,SAAC7jB,EAAeuB,EAAU,CACnDkB,GAAA,KAAKqgB,IAAmB,IAAI9iB,CAAa,EACzCuB,EAAS,EACTkB,GAAA,KAAKqgB,IAAmB,OAAO9iB,CAAa,CAC9C,EAEA8jB,GAA6B,SAAClmB,EAAS2D,EAAU,CAC/C,KAAK,yBAA2B3D,EAChC2D,EAAS,EACT,OAAO,KAAK,wBACd,EAEAwiB,GAAoB,SAAC5Z,EAAI,CACvB,GAAIA,GAAM,KAAM,CACd,IAAMvM,EAAUuM,IAAO,UACrB,KAAK,QAAQ,cAAc,QAAQ,aAAa,EAChD,SAAS,eAAeA,CAAE,EAC5B,GAAIvM,aAAmBJ,GACrB,OAAOI,CAEX,CACF,EAGF,SAAS2mB,GAAgB3mB,EAAS+mB,EAAY,CAC5C,GAAI/mB,EAAS,CACX,IAAMsmB,EAAMtmB,EAAQ,aAAa,KAAK,EACtC,GAAIsmB,GAAO,MAAQS,GAAc,MAAQ3gB,GAAakgB,EAAKS,CAAU,EACnE,MAAM,IAAI,MAAM,6BAA6B/mB,EAAQ,EAAE,qDAAqD,EAM9G,GAJIA,EAAQ,gBAAkB,WAC5BA,EAAU,SAAS,WAAWA,EAAS,EAAI,GAGzCA,aAAmBJ,GACrB,OAAAI,EAAQ,kBAAkB,EAC1BA,EAAQ,qBAAqB,EACtBA,CAEX,CACF,CAEA,IAAMgnB,GAAgB,CACpB,OAAQ,CACN,KAAK,8BAA8B,EACnC,KAAK,eAAe,QAASrT,GAAG,CAhxNpC,IAAAjU,EAgxNuC,OAAAA,EAAAiU,EAAE,gBAAF,YAAAjU,EAAiB,aAAa,KAAK,gBAAiBiU,EAAE,aAAY,CACvG,EAEA,QAAS,CACP,KAAK,8BAA8B,EACnC,KAAK,eAAe,QAASA,GAAMA,EAAE,OAAO,KAAK,eAAe,CAAC,CACnE,EAEA,QAAS,CACP,KAAK,8BAA8B,EACnC,KAAK,eAAe,QAASA,GAAG,CA1xNpC,IAAAjU,EA0xNuC,OAAAA,EAAAiU,EAAE,gBAAF,YAAAjU,EAAiB,aAAa,KAAK,gBAAiBiU,GAAE,CAC3F,EAEA,SAAU,CACR,KAAK,8BAA8B,EACnC,KAAK,eAAe,QAASA,GAAMA,EAAE,QAAQ,KAAK,eAAe,CAAC,CACpE,EAEA,QAAS,CACP,KAAK,eAAe,QAASA,GAAMA,EAAE,OAAO,CAAC,CAC/C,EAEA,SAAU,CACR,IAAMtM,EAAS,KAAK,aAAa,QAAQ,EAEzC,KAAK,eAAe,QAAS4f,GAAkB,CACzC5f,IAAW,QACb4Q,GAAcgP,EAAe,KAAK,eAAe,EAEjDA,EAAc,YAAY,KAAK,eAAe,CAElD,CAAC,CACH,EAEA,QAAS,CACP,IAAM5f,EAAS,KAAK,aAAa,QAAQ,EAEzC,KAAK,eAAe,QAAS4f,GAAkB,CACzC5f,IAAW,QACb2J,GAAciW,EAAe,KAAK,eAAe,GAEjDA,EAAc,UAAY,GAC1BA,EAAc,OAAO,KAAK,eAAe,EAE7C,CAAC,CACH,EAEA,SAAU,CACR,IAAM5f,EAAS,KAAK,aAAa,QAAQ,EACnCqb,EAAY,KAAK,UACjBC,EAAS,KAAK,aAAa,QAAQ,EAEzCrG,GAAQ,QAAQ,KAAK,QAAS,CAAE,OAAAjV,EAAQ,UAAAqb,EAAW,OAAAC,CAAO,CAAC,CAC7D,CACF,EAt0NAuE,GAAAC,GAg2NMC,GAAN,MAAMA,WAAsB,WAAY,CAAxC,kCAAAxiB,GAAA,KAAAsiB,IACE,aAAa,cAAc7X,EAAY,CACrC,MAAMA,EAAW,cAAc,CACjC,CAEA,MAAM,mBAAoB,CACxB,GAAI,CACF,MAAM,KAAK,OAAO,CACpB,OAAS5G,EAAO,CACd,QAAQ,MAAMA,CAAK,CACrB,QAAE,CACA,KAAK,WAAW,CAClB,CACF,CAEA,MAAM,QAAS,CA/2NjB,IAAA/I,EAg3NI,OAAQA,EAAA,KAAK,gBAAL,KAAAA,EAAA,KAAK,eAAmB,SAAY,CAC1C,IAAMqB,EAAQ,KAAK,kBAEf,KAAK,cAAcA,CAAK,IAC1B,MAAME,GAAY,EAClB,MAAMF,EAAM,OAAO,OAAO,IAAI,EAElC,GAAG,CACL,CAEA,YAAa,CACX,GAAI,CACF,KAAK,OAAO,CAEd,OAAQ4S,EAAA,CAAC,CACX,CAKA,+BAAgC,CAC9B,KAAK,kBAAkB,QAAS0T,GAAMA,EAAE,OAAO,CAAC,CAClD,CAKA,IAAI,mBAAoB,CA34N1B,IAAA3nB,EA44NI,IAAM4nB,EAAmB,KAAK,eAAe,QAAS3T,GAAM,CAAC,GAAGA,EAAE,QAAQ,CAAC,EAAE,OAAQ,GAAM,CAAC,CAAC,EAAE,aAAa,IAAI,CAAC,EAC3G4T,EAAiB,CAAC,KAAI7nB,EAAA,KAAK,kBAAL,YAAAA,EAAsB,WAAY,CAAC,CAAE,EAAE,OAAQ,GAAM,CAAC,CAAC,EAAE,aAAa,IAAI,CAAC,EAAE,IAAK,GAAM,EAAE,aAAa,IAAI,CAAC,EAExI,OAAO4nB,EAAiB,OAAQ,GAAMC,EAAe,SAAS,EAAE,aAAa,IAAI,CAAC,CAAC,CACrF,CAKA,+BAAgC,CAC9B,KAAK,kBAAkB,QAASF,GAAMA,EAAE,OAAO,CAAC,CAClD,CAKA,IAAI,mBAAoB,CA55N1B,IAAA3nB,EA65NI,IAAM4nB,EAAmB,KAAK,eAAe,QAAS3T,GAAM,CAAC,GAAGA,EAAE,cAAc,QAAQ,CAAC,EAAE,OAAQ,GAAM,CAAC,CAAC,EAAE,EAAE,EACzG4T,EAAiB,CAAC,KAAI7nB,EAAA,KAAK,kBAAL,YAAAA,EAAsB,WAAY,CAAC,CAAE,EAAE,OAAQ,GAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAK,GAAM,EAAE,EAAE,EAExG,OAAO4nB,EAAiB,OAAQ,GAAMC,EAAe,SAAS,EAAE,EAAE,CAAC,CACrE,CAKA,IAAI,eAAgB,CAClB,GAAI,KAAK,OAAQ,CACf,IAAMC,EAAiBR,GAAc,KAAK,MAAM,EAChD,GAAIQ,EACF,OAAOA,EAEThf,GAAA,KAAK0e,GAAAC,IAAL,UAAY,iBACd,CACA3e,GAAA,KAAK0e,GAAAC,IAAL,UAAY,8BACd,CAKA,IAAI,gBAAiB,CACnB,GAAI,KAAK,OACP,OAAO,KAAK,mBACP,GAAI,KAAK,QACd,OAAO,KAAK,sBAEZ3e,GAAA,KAAK0e,GAAAC,IAAL,UAAY,yCAEhB,CAKA,IAAI,iBAAkB,CACpB,OAAO,KAAK,gBAAgB,QAAQ,UAAU,EAAI,CACpD,CAKA,IAAI,iBAAkB,CACpB,GAAI,KAAK,oBAAsB,KAAM,CACnC,IAAM1mB,EAAW,KAAK,cAAc,cAAc,UAAU,EAC5D,YAAK,YAAYA,CAAQ,EAClBA,CACT,SAAW,KAAK,6BAA6B,oBAC3C,OAAO,KAAK,kBAEd+H,GAAA,KAAK0e,GAAAC,IAAL,UAAY,mDACd,CAKA,IAAI,QAAS,CACX,OAAO,KAAK,aAAa,QAAQ,CACnC,CAMA,IAAI,QAAS,CACX,OAAO,KAAK,aAAa,QAAQ,CACnC,CAKA,IAAI,SAAU,CACZ,OAAO,KAAK,aAAa,SAAS,CACpC,CAKA,IAAI,WAAY,CACd,OAAO,KAAK,aAAa,YAAY,CACvC,CAMA,IAAI,aAAc,CAp/NpB,IAAAznB,EAAAC,EAq/NI,OAAQA,IAAAD,EAAA,KAAK,UAAU,MAAM,SAAS,IAA9B,KAAAA,EAAmC,CAAC,GAAG,CAAC,IAAxC,KAAAC,EAA6C,gBACvD,CAEA,IAAI,mBAAoB,CACtB,OAAO,IAAI,YAAY,6BAA8B,CACnD,QAAS,GACT,WAAY,GACZ,OAAQ,CAAE,UAAW,KAAM,OAAQynB,GAAc,aAAc,CACjE,CAAC,CACH,CAEA,IAAI,oBAAqB,CAhgO3B,IAAA1nB,EAigOI,IAAMM,GAAUN,EAAA,KAAK,gBAAL,YAAAA,EAAoB,eAAe,KAAK,QAExD,OAAIM,IAAY,KACP,CAACA,CAAO,EAER,CAAC,CAEZ,CAEA,IAAI,uBAAwB,CA1gO9B,IAAAN,EA2gOI,IAAM2C,GAAW3C,EAAA,KAAK,gBAAL,YAAAA,EAAoB,iBAAiB,KAAK,SAE3D,OAAI2C,EAAS,SAAW,EACf,MAAM,UAAU,MAAM,KAAKA,CAAQ,EAEnC,CAAC,CAEZ,CACF,EAnLA6kB,GAAA,YAgJEC,GAAM,SAAC7d,EAAS,CACd,MAAM,IAAI,MAAM,GAAG,KAAK,WAAW,KAAKA,CAAO,EAAE,CACnD,EAlJF,IAAMme,GAANL,GAqLMM,GAAN,cAAkC,WAAY,CAA9C,kCACEpoB,GAAA,oBAAe,MAEf,mBAAoB,CAClB,KAAK,aAAe,KAAK,IAAI,MAAM,WAAW,EAAI,IAAI,UAAU,KAAK,GAAG,EAAI,IAAI,YAAY,KAAK,GAAG,EAEpG2kB,GAAoB,KAAK,YAAY,CACvC,CAEA,sBAAuB,CACjB,KAAK,eACP,KAAK,aAAa,MAAM,EAExBC,GAAuB,KAAK,YAAY,EAE5C,CAEA,IAAI,KAAM,CACR,OAAO,KAAK,aAAa,KAAK,GAAK,EACrC,CACF,EAEAtkB,GAAa,oBAAsBwmB,GAE/B,eAAe,IAAI,aAAa,IAAM,QACxC,eAAe,OAAO,cAAexmB,EAAY,EAG/C,eAAe,IAAI,cAAc,IAAM,QACzC,eAAe,OAAO,eAAgB6nB,EAAa,EAGjD,eAAe,IAAI,qBAAqB,IAAM,QAChD,eAAe,OAAO,sBAAuBC,EAAmB,GAGjE,IAAM,CACL,IAAMC,EAAgB,SAAS,cAE/B,GADI,CAACA,GACDA,EAAc,aAAa,6BAA6B,EAAG,OAE/D,IAAI3nB,EAAU2nB,EAAc,cAC5B,KAAO3nB,GAAS,CACd,GAAIA,GAAW,SAAS,KACtB,OAAO,QAAQ,KACbsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUAqmB,EAAc,SAChB,EAGF3nB,EAAUA,EAAQ,aACpB,CACF,GAAG,EAEH,OAAO,MAAQkH,GAAAC,GAAA,GAAKyd,IAAL,CAAY,cAAAoC,EAAc,GACzCjD,GAAM,ECrlON,IAAI6D,GAEJ,eAAsBC,IAAc,CAClC,OAAOD,IAAYE,GAAYC,GAAe,EAAE,KAAKD,EAAW,CAAC,CACnE,CAEO,SAASA,GAAYE,EAAa,CACvC,OAAOJ,GAAWI,CACpB,CAEA,eAAsBD,IAAiB,CACrC,GAAM,CAAE,eAAAA,CAAe,EAAI,KAAM,uCACjC,OAAOA,EAAe,CACxB,CAEA,eAAsBE,GAAYC,EAASC,EAAO,CAChD,GAAM,CAAE,cAAAC,CAAc,EAAI,MAAMP,GAAY,EAC5C,OAAOO,EAAc,OAAOF,EAASC,CAAK,CAC5C,CCCe,SAARE,GAAuBC,EAAK,CAE/B,MADI,CAACA,GAAO,OAAOA,GAAQ,UACvBA,aAAe,MAAQA,aAAe,OAAeA,EACrD,MAAM,QAAQA,CAAG,EAAUA,EAAI,IAAID,EAAI,EACpC,OAAO,KAAKC,CAAG,EAAE,OAAO,SAAUC,EAAKC,EAAK,CAC/C,IAAIC,EAAQD,EAAI,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,EAAE,QAAQ,YAAa,SAAUE,EAAGC,EAAG,CACjF,MAAO,IAAMA,EAAE,YAAY,CAC/B,CAAC,EACD,OAAAJ,EAAIE,CAAK,EAAIJ,GAAKC,EAAIE,CAAG,CAAC,EACnBD,CACX,EAAG,CAAC,CAAC,CACT,CC1BA,IAAMK,GAAN,cAA4C,WAAY,CAGtD,MAAM,mBAAoB,CACxBC,GAAoB,IAAI,EACxB,KAAK,aAAe,MAAMC,GAAY,KAAK,QAAS,CAClD,SAAU,KAAK,qBAAqB,KAAK,IAAI,EAC7C,UAAW,KAAK,sBAAsB,KAAK,IAAI,EAC/C,aAAc,KAAK,yBAAyB,KAAK,IAAI,CACvD,CAAC,CACH,CAEA,sBAAuB,CACrBC,GAAuB,IAAI,EACvB,KAAK,cAAc,KAAK,aAAa,YAAY,EACrD,KAAK,yBAAyB,CAChC,CAEA,0BAA2B,CACrB,KAAK,eACP,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EAE3B,CAEA,qBAAqBC,EAAM,CACzB,IAAMC,EAAQ,IAAI,aAAa,UAAW,CAAE,KAAAD,CAAK,CAAC,EAClD,OAAO,KAAK,cAAcC,CAAK,CACjC,CAEA,uBAAwB,CACtB,KAAK,aAAa,YAAa,EAAE,CACnC,CAEA,0BAA2B,CACzB,KAAK,gBAAgB,WAAW,CAClC,CAEA,IAAI,SAAU,CACZ,IAAMC,EAAU,KAAK,aAAa,SAAS,EACrCC,EAAqB,KAAK,aAAa,oBAAoB,EACjE,OAAOC,GAAA,CAAE,QAAAF,EAAS,mBAAAC,GAAuBE,GAASD,GAAA,GAAK,KAAK,QAAS,EACvE,CACF,EA1CEE,GADIV,GACG,qBAAqB,CAAC,UAAW,oBAAoB,GA6C1D,eAAe,IAAI,2BAA2B,IAAM,QACtD,eAAe,OAAO,4BAA6BA,EAA6B,ECnD3E,SAASW,GAA4BC,EAAO,CACjD,GAAIA,EAAM,kBAAkB,gBAAiB,CAC3C,GAAM,CAAE,OAAQC,EAAM,OAAQ,CAAE,aAAAC,CAAa,CAAE,EAAIF,EAEnDC,EAAK,iBAAiB,qBAAsB,CAAC,CAAE,OAAQ,CAAE,eAAgB,CAAE,UAAAE,CAAU,CAAE,CAAE,IAAM,CAC7F,IAAMC,EAAOC,GAAWH,EAAa,IAAI,EAAIA,EAAa,KAAO,IAAI,gBAC/DI,EAASC,GAAqBJ,EAAWC,EAAMH,CAAI,EAEpD,OAAO,KAAKK,CAAM,IACjB,QAAQ,KAAKA,CAAM,EACrBF,EAAK,OAAO,SAAS,EAErBA,EAAK,IAAI,UAAWE,CAAM,EAG5BJ,EAAa,OAAS,OAE1B,EAAG,CAAE,KAAM,EAAK,CAAC,CACnB,CACF,CAEA,SAASK,GAAqBJ,EAAWC,EAAMH,EAAM,CACnD,IAAMO,EAAaC,GAAoBN,CAAS,EAC1CO,EAAiBN,EAAK,IAAI,SAAS,EACnCE,EAASL,EAAK,aAAa,QAAQ,GAAK,MAE9C,OAAI,OAAOO,GAAc,SAChBA,EACE,OAAOE,GAAkB,SAC3BA,EAEAJ,CAEX,CAEA,SAASG,GAAoBN,EAAW,CACtC,OAAIA,aAAqB,mBAAqBA,aAAqB,iBAQ7DA,EAAU,OAAS,UACdA,EAAU,MACRA,EAAU,aAAa,YAAY,EACrCA,EAAU,WAEV,KAGF,IAEX,CAEA,SAASE,GAAWD,EAAM,CACxB,OAAOA,aAAgB,UAAYA,aAAgB,eACrD,CChDA,OAAO,MAAQO,GAEf,iBAAiB,6BAA8BC,EAA2B,ECT1E,IAAAC,GAA+B,SAC/BC,GAAO,SCAP,IAAAC,GAAc,WCAd,IAAAC,GAAmB,WAInB,IAAIC,EAAI,GAAAC,QAGJC,GAAY,SAAWC,EAAUC,EACrC,CAGC,GAAIF,GAAU,QAAQC,EAAUC,CAAO,EACtC,OAAOF,GAIR,GAAI,gBAAgBA,GACnB,OAAOF,EAAEG,CAAQ,EAAE,UAAUC,CAAO,EAIpCA,EAAUD,EAuCX,KAAK,EAAI,SAAWE,EAAWC,EAC/B,CACC,OAAO,KAAK,IAAI,EAAI,EAAE,EAAGD,EAAWC,CAAM,CAC3C,EAmDA,KAAK,EAAI,SAAWD,EAAWC,EAC/B,CACC,OAAO,KAAK,IAAI,EAAI,EAAE,KAAMD,EAAWC,CAAM,EAAE,KAAK,CACrD,EAYA,KAAK,IAAM,SAAWC,EACtB,CACC,OAAOA,EACN,IAAIC,GACHC,GAAqB,KAAMC,GAAK,SAAU,CAAE,CAC7C,EACA,IAAIF,GAAM,IAAK,CACjB,EAyCA,KAAK,UAAY,SAAUG,EAAMC,EACjC,CACC,IAAIC,EAAM,KAAK,IAAK,EAAK,EAGrBC,EAAO,MAAM,QAAQH,CAAI,IAAO,MAAM,QAAQA,EAAK,CAAC,CAAC,GAAKX,EAAE,cAAcW,EAAK,CAAC,CAAC,GACpFE,EAAI,KAAK,IAAKF,CAAK,EACnBE,EAAI,IAAI,IAAKF,CAAK,EAEnB,OAAKC,IAAW,QAAaA,IAC5BC,EAAI,KAAK,EAGHC,EAAK,QAAQ,EAAE,QAAQ,CAC/B,EAwBA,KAAK,qBAAuB,SAAWC,EACvC,CACC,IAAIF,EAAM,KAAK,IAAK,EAAK,EAAE,QAAQ,OAAO,EACtCG,EAAWH,EAAI,SAAS,EAAE,CAAC,EAC3BI,EAASD,EAAS,QAEjBD,IAAY,QAAaA,EAC7BF,EAAI,KAAM,EAAM,GAEPI,EAAO,KAAO,IAAMA,EAAO,KAAO,KAE3CC,GAAeF,CAAS,CAE1B,EAiBA,KAAK,aAAe,SAAUD,EAC9B,CACC,IAAIF,EAAM,KAAK,IAAK,EAAK,EAAE,MAAM,GAE5BE,IAAY,QAAaA,IAC7BF,EAAI,KAAK,CAEX,EA2BA,KAAK,QAAU,SAAUM,EACzB,CACC,KAAK,IAAK,EAAK,EAAE,IAAKA,CAAI,EAAE,MAAM,KAAK,CACxC,EAqBA,KAAK,YAAc,SAAUC,EAAQC,EAAUT,EAC/C,CACC,IAAIC,EAAM,KAAK,IAAK,EAAK,EACrBC,EAAOD,EAAI,KAAMO,CAAO,EACxBJ,EAAWF,EAAK,SAAS,EAAE,CAAC,EAC5BH,EAAOK,EAAS,OAAQF,EAAK,CAAC,EAAE,CAAC,CAAE,EAEvC,OAAAA,EAAK,OAAO,EAEPO,GACJA,EAAS,KAAM,KAAML,EAAUL,CAAK,GAGhCC,IAAW,QAAaA,IAC5BC,EAAI,KAAK,EAGHF,CACR,EAiBA,KAAK,UAAY,SAAWW,EAC5B,CACC,KAAK,IAAK,EAAK,EAAE,QAASA,CAAO,CAClC,EAiBA,KAAK,OAAS,SAAUC,EACxB,CAGC,KAAK,IAAK,EAAK,EAAE,KAAMA,CAAS,CACjC,EAsBA,KAAK,SAAW,SAAUC,EAAQC,EAASC,EAAQC,EAAQC,EAAaC,EACxE,CACC,IAAIhB,EAAM,KAAK,IAAK,EAAK,EAEpBY,GAAY,KAChBZ,EAAI,OAAQW,EAAQE,EAAQC,EAAQE,CAAiB,EAGrDhB,EAAI,OAAQY,CAAQ,EAAE,OAAQD,EAAQE,EAAQC,EAAQE,CAAiB,EAGxEhB,EAAI,KAAK,CACV,EAwCA,KAAK,UAAY,SAAUiB,EAAKC,EAChC,CACC,IAAIlB,EAAM,KAAK,IAAK,EAAK,EAEzB,GAAKiB,IAAQ,OAAY,CACxB,IAAIE,EAAOF,EAAI,SAAWA,EAAI,SAAS,YAAY,EAAI,GAEvD,OAAOC,IAAQ,QAAaC,GAAQ,MAAQA,GAAQ,KACnDnB,EAAI,KAAMiB,EAAKC,CAAI,EAAE,KAAK,EAC1BlB,EAAI,IAAKiB,CAAI,EAAE,KAAK,GAAK,IAC3B,CAEA,OAAOjB,EAAI,KAAK,EAAE,QAAQ,CAC3B,EAqBA,KAAK,WAAa,SAAUoB,EAC5B,CACC,IAAIpB,EAAM,KAAK,IAAK,EAAK,EAEzB,OAAOoB,IAAS,OACfpB,EAAI,IAAKoB,CAAK,EAAE,KAAK,EACrBpB,EAAI,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CACvC,EA+BA,KAAK,cAAgB,SAAUqB,EAC/B,CACC,IAAIrB,EAAM,KAAK,IAAK,EAAK,EACrBsB,EAAWD,EAAK,SAAS,YAAY,EAEzC,GAAKC,GAAY,KAChB,OAAOtB,EAAI,IAAKqB,CAAK,EAAE,MAAM,EAEzB,GAAKC,GAAY,MAAQA,GAAY,KAAO,CAChD,IAAIC,EAAOvB,EAAI,KAAMqB,CAAK,EAAE,MAAM,EAElC,MAAO,CACNE,EAAK,IACLA,EAAK,cACLA,EAAK,MACN,CACD,CACA,OAAO,IACR,EA0BA,KAAK,SAAW,SAAUjB,EAC1B,CACC,OAAO,KAAK,IAAK,EAAK,EAAE,IAAKA,CAAI,EAAE,MAAM,QAAQ,CAClD,EAiCA,KAAK,OAAS,SAAUA,EAAKkB,EAAOC,EACpC,CACC,OAAO,KAAK,IAAK,EAAK,EACpB,IAAKnB,CAAI,EACT,MAAOkB,EAAOC,CAAO,EACrB,KAAK,EACL,MAAM,EAAE,CAAC,CACZ,EAmBA,KAAK,aAAe,SAAWC,EAASxB,EACxC,CACC,IAAIF,EAAM,KAAK,IAAK,EAAK,EAAE,KAAM0B,CAAQ,GAEpCxB,IAAY,QAAaA,IAC7BF,EAAI,KAAK,EAAK,CAEhB,EAmBA,KAAK,eAAiB,SAAW2B,EAAMC,EAAO1B,EAC9C,CACC,IAAIF,EAAM,KAAK,IAAK,EAAK,EAAE,OAAQ2B,CAAK,EAAE,QAASC,CAAM,GAEpD1B,IAAY,QAAaA,IAC7BF,EAAI,QAAQ,OAAO,EAAE,KAAK,CAE5B,EAmBA,KAAK,WAAa,UAClB,CACC,OAAOJ,GAAqB,KAAKC,GAAK,SAAS,CAAE,CAClD,EAkBA,KAAK,OAAS,SAAUgC,EACxB,CACC,KAAK,IAAK,EAAK,EAAE,MAAOA,CAAO,EAAE,KAAK,CACvC,EAmBA,KAAK,eAAiB,SAAUC,EAAOlB,EAASmB,EAChD,CACC,KAAK,IAAK,EAAK,EAAE,MAAM,SAAUD,EAAOlB,EAASmB,CAAW,CAC7D,EAyBA,KAAK,SAAW,SAAUC,EAAOC,EAAMrB,EAASV,EAASgC,EACzD,CACC,IAAIlC,EAAM,KAAK,IAAK,EAAK,EAEzB,OAA8BY,GAAY,KACzCZ,EAAI,IAAKiC,CAAK,EAAE,KAAMD,CAAM,EAG5BhC,EAAI,KAAMiC,EAAMrB,CAAQ,EAAE,KAAMoB,CAAM,GAGlCE,IAAY,QAAaA,IAC7BlC,EAAI,QAAQ,OAAO,GAGfE,IAAY,QAAaA,IAC7BF,EAAI,KAAK,EAEH,CACR,EAoBA,KAAK,eAAiBH,GAAK,eAG3B,IAAIsC,EAAQ,KACRC,EAAY7C,IAAY,OACxB8C,EAAM,KAAK,OAEVD,IACJ7C,EAAU,CAAC,GAGZ,KAAK,KAAO,KAAK,SAAWM,GAAK,SAGjC,QAAUyC,KAAMjD,GAAU,IAAI,SACxBiD,IACJ,KAAKA,CAAE,EAAIC,GAAiBD,CAAE,GAIhC,YAAK,KAAK,UAAW,CAGpB,IAAIE,EAAI,CAAC,EACLC,EAAQJ,EAAM,EACjBK,GAAWF,EAAGjD,EAAS,EAAK,EAC5BA,EAGGoD,EAAE,EAAGC,EAAMC,EAAGC,EAAMC,EAAGC,EACvBC,EAAM,KAAK,aAAc,IAAK,EAC9BC,EAAiB,GACjBC,EAAW9D,GAAU,SACrB+D,GAAQjE,EAAE,IAAI,EAIlB,GAAK,KAAK,SAAS,YAAY,GAAK,QACpC,CACCkE,GAAQ,KAAM,EAAG,kCAAkC,KAAK,SAAS,IAAK,CAAE,EACxE,MACD,CAGAC,GAAeH,CAAS,EACxBI,GAAeJ,EAAS,MAAO,EAG/BK,GAAqBL,EAAUA,EAAU,EAAK,EAC9CK,GAAqBL,EAAS,OAAQA,EAAS,OAAQ,EAAK,EAG5DK,GAAqBL,EAAUhE,EAAE,OAAQsD,EAAOW,GAAM,KAAK,CAAE,EAAG,EAAK,EAKrE,IAAIK,EAAcpE,GAAU,SAC5B,IAAMsD,EAAE,EAAGC,EAAKa,EAAY,OAASd,EAAEC,EAAOD,IAC9C,CACC,IAAIe,EAAID,EAAYd,CAAC,EAGrB,GACCe,EAAE,QAAU,MACXA,EAAE,QAAUA,EAAE,OAAO,YAAc,MACnCA,EAAE,QAAUA,EAAE,OAAO,YAAc,KACnC,CACD,IAAIC,EAAYlB,EAAM,YAAc,OAAYA,EAAM,UAAYU,EAAS,UACvES,EAAWnB,EAAM,WAAa,OAAYA,EAAM,SAAWU,EAAS,SAExE,GAAKf,GAAauB,EAEjB,OAAOD,EAAE,UAEL,GAAKE,EACV,CACCF,EAAE,UAAU,UAAU,EACtB,KACD,KAEA,CACCL,GAAQK,EAAG,EAAG,gCAAiC,CAAE,EACjD,MACD,CACD,CAOA,GAAKA,EAAE,UAAY,KAAK,GACxB,CACCD,EAAY,OAAQd,EAAG,CAAE,EACzB,KACD,CACD,EAGKM,IAAQ,MAAQA,IAAQ,MAE5BA,EAAM,oBAAqB5D,GAAU,IAAI,UACzC,KAAK,GAAK4D,GAIX,IAAIY,EAAY1E,EAAE,OAAQ,GAAM,CAAC,EAAGE,GAAU,OAAO,UAAW,CAC/D,cAAiB+D,GAAM,CAAC,EAAE,MAAM,MAChC,UAAiBH,EACjB,SAAiBA,CAClB,CAAE,EACFY,EAAU,OAAS,KACnBA,EAAU,KAAS1B,EAAM,SACzB0B,EAAU,MAASpB,EAEnBgB,EAAY,KAAMI,CAAU,EAI5BA,EAAU,UAAa1B,EAAM,SAAS,EAAKA,EAAQiB,GAAM,UAAU,EAGnEE,GAAeb,CAAM,EACrBqB,GAAmBrB,EAAM,SAAU,EAG9BA,EAAM,aAAe,CAAEA,EAAM,iBAEjCA,EAAM,eAAiB,MAAM,QAASA,EAAM,YAAY,CAAC,CAAE,EAC1DA,EAAM,YAAY,CAAC,EAAE,CAAC,EAAIA,EAAM,YAAY,CAAC,GAK/CA,EAAQC,GAAWvD,EAAE,OAAQ,GAAM,CAAC,EAAGgE,CAAS,EAAGV,CAAM,EAIzDsB,GAAQF,EAAU,UAAWpB,EAAO,CACnC,YACA,gBACA,UACA,QACA,aACA,QACA,cACA,aACA,eACA,cACA,cACD,CAAE,EACFsB,GAAQF,EAAWpB,EAAO,CACzB,kBACA,OACA,eACA,iBACA,gBACA,YACA,iBACA,cACA,kBACA,cACA,gBACA,iBACA,OACA,gBACA,YACA,sBACA,sBACA,WACA,cACA,QACA,CAAE,kBAAmB,gBAAiB,EACtC,CAAE,UAAW,iBAAkB,EAC/B,CAAE,eAAgB,iBAAkB,EACpC,CAAE,iBAAkB,iBAAkB,CACvC,CAAE,EACFsB,GAAQF,EAAU,QAASpB,EAAO,CACjC,CAAE,WAAY,IAAK,EACnB,CAAE,gBAAiB,SAAU,EAC7B,CAAE,WAAY,IAAK,EACnB,CAAE,kBAAmB,WAAY,CAClC,CAAE,EACFsB,GAAQF,EAAU,UAAWpB,EAAO,gBAAiB,EAGrDuB,GAAgBH,EAAW,iBAAwBpB,EAAM,eAAqB,MAAO,EACrFuB,GAAgBH,EAAW,iBAAwBpB,EAAM,eAAqB,MAAO,EACrFuB,GAAgBH,EAAW,oBAAwBpB,EAAM,kBAAqB,MAAO,EACrFuB,GAAgBH,EAAW,oBAAwBpB,EAAM,kBAAqB,MAAO,EACrFuB,GAAgBH,EAAW,gBAAwBpB,EAAM,cAAqB,MAAO,EACrFuB,GAAgBH,EAAW,gBAAwBpB,EAAM,cAAqB,MAAO,EACrFuB,GAAgBH,EAAW,uBAAwBpB,EAAM,aAAqB,MAAO,EACrFuB,GAAgBH,EAAW,mBAAwBpB,EAAM,iBAAqB,MAAO,EACrFuB,GAAgBH,EAAW,mBAAwBpB,EAAM,iBAAqB,MAAO,EACrFuB,GAAgBH,EAAW,iBAAwBpB,EAAM,eAAqB,MAAO,EACrFuB,GAAgBH,EAAW,oBAAwBpB,EAAM,kBAAqB,MAAO,EAErFoB,EAAU,QAAUI,GAAoBxB,EAAM,KAAM,EAGpDyB,GAAkBL,CAAU,EAE5B,IAAIM,GAAWN,EAAU,SAazB,GAXA1E,EAAE,OAAQgF,GAAU9E,GAAU,IAAI,QAASoD,EAAM,QAAS,EAC1DW,GAAM,SAAUe,GAAS,MAAO,EAG3BN,EAAU,oBAAsB,SAGpCA,EAAU,kBAAoBpB,EAAM,cACpCoB,EAAU,eAAiBpB,EAAM,eAG7BA,EAAM,gBAAkB,KAC7B,CACCoB,EAAU,cAAgB,GAC1B,IAAIO,GAAM,MAAM,QAAS3B,EAAM,aAAc,EAC7CoB,EAAU,iBAAmBO,GAAM3B,EAAM,cAAc,CAAC,EAAIA,EAAM,cAClEoB,EAAU,eAAiBO,GAAM3B,EAAM,cAAc,CAAC,EAAIA,EAAM,aACjE,CAGA,IAAI4B,GAAYR,EAAU,UAC1B1E,EAAE,OAAQ,GAAMkF,GAAW5B,EAAM,SAAU,EAEtC4B,GAAU,MAMdlF,EAAE,KAAM,CACP,SAAU,OACV,IAAKkF,GAAU,KACf,QAAS,SAAWC,EAAO,CAC1Bd,GAAqBL,EAAS,UAAWmB,CAAK,EAC9CR,GAAmBQ,CAAK,EACxBnF,EAAE,OAAQ,GAAMkF,GAAWC,EAAMT,EAAU,MAAM,SAAU,EAE3DU,GAAiBV,EAAW,KAAM,OAAQ,CAACA,CAAS,CAAC,EACrDW,GAAeX,CAAU,CAC1B,EACA,MAAO,UAAY,CAElBW,GAAeX,CAAU,CAC1B,CACD,CAAE,EACFX,EAAiB,IAGjBqB,GAAiBV,EAAW,KAAM,OAAQ,CAACA,CAAS,CAAC,EAMjDpB,EAAM,kBAAoB,OAE9BoB,EAAU,gBAAiB,CAC1BM,GAAS,WACTA,GAAS,WACV,GAID,IAAIM,GAAgBZ,EAAU,gBAC1Ba,GAAStB,GAAM,SAAS,OAAO,EAAE,KAAK,IAAI,EAAE,GAAG,CAAC,EAC/CjE,EAAE,QAAS,GAAMA,EAAE,IAAKsF,GAAe,SAASE,EAAIhC,GAAG,CAC3D,OAAO+B,GAAO,SAASC,CAAE,CAC1B,CAAE,CAAE,IAAM,KACTxF,EAAE,WAAY,IAAI,EAAE,YAAasF,GAAc,KAAK,GAAG,CAAE,EACzDZ,EAAU,iBAAmBY,GAAc,MAAM,GAOlD,IAAIG,GAAQ,CAAC,EACTC,GACAC,GAAS,KAAK,qBAAqB,OAAO,EAQ9C,GAPKA,GAAO,SAAW,IAEtBC,GAAiBlB,EAAU,SAAUiB,GAAO,CAAC,CAAE,EAC/CF,GAAQI,GAAiBnB,CAAU,GAI/BpB,EAAM,YAAc,KAGxB,IADAoC,GAAgB,CAAC,EACXlC,EAAE,EAAGC,EAAKgC,GAAM,OAASjC,EAAEC,EAAOD,IAEvCkC,GAAc,KAAM,IAAK,OAK1BA,GAAgBpC,EAAM,UAIvB,IAAME,EAAE,EAAGC,EAAKiC,GAAc,OAASlC,EAAEC,EAAOD,IAE/CsC,GAAcpB,EAAWe,GAAQA,GAAMjC,CAAC,EAAI,IAAK,EAWlD,GAPAuC,GAAoBrB,EAAWpB,EAAM,aAAcoC,GAAe,SAAUlD,EAAMwD,GAAM,CACvFC,GAAkBvB,EAAWlC,EAAMwD,EAAK,CACzC,CAAE,EAKGT,GAAO,OAAS,CACpB,IAAIW,GAAI,SAAW9D,EAAM+D,GAAO,CAC/B,OAAO/D,EAAK,aAAc,QAAQ+D,EAAK,IAAM,KAAOA,GAAO,IAC5D,EAEAnG,EAAGuF,GAAO,CAAC,CAAE,EAAE,SAAS,QAAQ,EAAE,KAAM,SAAU/B,EAAGpB,GAAM,CAC1D,IAAIL,GAAM2C,EAAU,UAAUlB,CAAC,EAM/B,GAJMzB,IACLmC,GAAQQ,EAAW,EAAG,yBAA0B,EAAG,EAG/C3C,GAAI,QAAUyB,EAAI,CACtB,IAAI4C,GAAOF,GAAG9D,GAAM,MAAO,GAAK8D,GAAG9D,GAAM,OAAQ,EAC7CiE,GAASH,GAAG9D,GAAM,QAAS,GAAK8D,GAAG9D,GAAM,QAAS,GAEjDgE,KAAS,MAAQC,KAAW,QAChCtE,GAAI,MAAQ,CACX,EAAQyB,EAAE,WACV,KAAQ4C,KAAS,KAAS5C,EAAE,UAAU4C,GAAS,OAC/C,KAAQA,KAAS,KAAS5C,EAAE,UAAU4C,GAAS,OAC/C,OAAQC,KAAW,KAAO7C,EAAE,UAAU6C,GAAS,MAChD,EACAtE,GAAI,aAAe,GAEnBkE,GAAkBvB,EAAWlB,CAAE,EAEjC,CACD,CAAE,CACH,CAEA,IAAI8C,GAAW5B,EAAU,UACrB6B,GAAa,UAAY,CAQ5B,GAAKjD,EAAM,YAAc,OAAY,CACpC,IAAIkD,EAAU9B,EAAU,UACxB,IAAMlB,EAAE,EAAGC,EAAK+C,EAAQ,OAAShD,EAAEC,EAAOD,IACzCgD,EAAQhD,CAAC,EAAE,CAAC,EAAIkB,EAAU,UAAWlB,CAAE,EAAE,UAAU,CAAC,CAEtD,CAKAiD,GAAmB/B,CAAU,EAExB4B,GAAS,OACbzB,GAAgBH,EAAW,iBAAkB,UAAY,CACxD,GAAKA,EAAU,QAAU,CACxB,IAAIgC,GAAQC,GAAgBjC,CAAU,EAClCkC,GAAgB,CAAC,EAErB5G,EAAE,KAAM0G,GAAO,SAAUlD,GAAGqD,GAAK,CAChCD,GAAeC,GAAI,GAAI,EAAIA,GAAI,GAChC,CAAE,EAEFzB,GAAiBV,EAAW,KAAM,QAAS,CAACA,EAAWgC,GAAOE,EAAa,CAAE,EAC7EE,GAAapC,CAAU,CACxB,CACD,CAAE,EAGHG,GAAgBH,EAAW,iBAAkB,UAAY,EACnDA,EAAU,SAAWqC,GAAerC,CAAU,IAAM,OAAS4B,GAAS,eAC1EG,GAAmB/B,CAAU,CAE/B,EAAG,IAAK,EASR,IAAIsC,GAAW/C,GAAM,SAAS,SAAS,EAAE,KAAM,UAAY,CAC1D,KAAK,aAAejE,EAAE,IAAI,EAAE,IAAI,cAAc,CAC/C,CAAE,EAEEiH,GAAQhD,GAAM,SAAS,OAAO,EAC7BgD,GAAM,SAAW,IACrBA,GAAQjH,EAAE,UAAU,EAAE,SAASiE,EAAK,GAErCS,EAAU,OAASuC,GAAM,CAAC,EAE1B,IAAIC,GAAQjD,GAAM,SAAS,OAAO,EAC7BiD,GAAM,SAAW,IACrBA,GAAQlH,EAAE,UAAU,EAAE,YAAYiH,EAAK,GAExCvC,EAAU,OAASwC,GAAM,CAAC,EAE1B,IAAIC,GAAQlD,GAAM,SAAS,OAAO,EAgBlC,GAfKkD,GAAM,SAAW,GAAKH,GAAS,OAAS,IAAMtC,EAAU,QAAQ,KAAO,IAAMA,EAAU,QAAQ,KAAO,MAG1GyC,GAAQnH,EAAE,UAAU,EAAE,SAASiE,EAAK,GAGhCkD,GAAM,SAAW,GAAKA,GAAM,SAAS,EAAE,SAAW,EACtDlD,GAAM,SAAUe,GAAS,SAAU,EAE1BmC,GAAM,OAAS,IACxBzC,EAAU,OAASyC,GAAM,CAAC,EAC1BvB,GAAiBlB,EAAU,SAAUA,EAAU,MAAO,GAIlDpB,EAAM,OACV,IAAME,EAAE,EAAIA,EAAEF,EAAM,OAAO,OAASE,IACnC4D,GAAY1C,EAAWpB,EAAM,OAAQE,CAAE,CAAE,OAGjCkB,EAAU,eAAiBqC,GAAerC,CAAU,GAAK,QAKlE2C,GAAU3C,EAAW1E,EAAE0E,EAAU,MAAM,EAAE,SAAS,IAAI,CAAE,EAIzDA,EAAU,UAAYA,EAAU,gBAAgB,MAAM,EAGtDA,EAAU,aAAe,GAKpBX,IAAmB,IACvBsB,GAAeX,CAAU,CAE3B,EAGAG,GAAgBH,EAAW,iBAAkB4C,GAAc,YAAa,EAEnEhE,EAAM,YAEVgD,GAAS,WAAa,GACtBiB,GAAc7C,EAAWpB,EAAOiD,EAAW,GAG3CA,GAAW,CAGb,CAAE,EACFvD,EAAQ,KACD,IACR,EAmBItC,GACAF,GACAgH,GACAC,GAEAC,GAAU,CAAC,EACXC,GAAgB,gBAChBC,GAAW,SAIXC,GAAW,kFAGXC,GAAmB,IAAI,OAAQ,MAAQ,CAAE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAM,IAAK,IAAK,GAAI,EAAE,KAAK,KAAK,EAAI,IAAK,GAAI,EAclJC,GAAwB,uDAGxBC,GAAS,SAAWC,EAAI,CAC3B,MAAO,CAACA,GAAKA,IAAM,IAAQA,IAAM,GAClC,EAGIC,GAAU,SAAW3D,EAAI,CAC5B,IAAI4D,EAAU,SAAU5D,EAAG,EAAG,EAC9B,MAAO,CAAC,MAAM4D,CAAO,GAAK,SAAS5D,CAAC,EAAI4D,EAAU,IACnD,EAIIC,GAAgB,SAAWC,EAAKC,EAAe,CAElD,OAAOZ,GAASY,CAAa,IAC5BZ,GAASY,CAAa,EAAI,IAAI,OAAQC,GAAgBD,CAAa,EAAG,GAAI,GAEpE,OAAOD,GAAQ,UAAYC,IAAiB,IAClDD,EAAI,QAAS,MAAO,EAAG,EAAE,QAASX,GAASY,CAAa,EAAG,GAAI,EAC/DD,CACF,EAGIG,GAAY,SAAWP,EAAGK,EAAcG,EAAY,CACvD,IAAIzG,EAAO,OAAOiG,EAClB,IAAIS,EAAU1G,IAAS,SASvB,OAPKA,IAAS,UAAYA,IAAS,UAO9BgG,GAAQC,CAAE,EACP,IAGHK,GAAgBI,IACpBT,EAAIG,GAAeH,EAAGK,CAAa,GAG/BG,GAAaC,IACjBT,EAAIA,EAAE,QAASF,GAAuB,EAAG,GAGnC,CAAC,MAAO,WAAWE,CAAC,CAAE,GAAK,SAAUA,CAAE,EAC/C,EAIIU,GAAU,SAAWV,EAAI,CAC5B,OAAOD,GAAQC,CAAE,GAAK,OAAOA,GAAM,QACpC,EAGIW,GAAe,SAAWX,EAAGK,EAAcG,EAAY,CAC1D,GAAKT,GAAQC,CAAE,EACd,MAAO,GAGR,IAAIY,EAAOF,GAASV,CAAE,EACtB,OAASY,GAERL,GAAWM,GAAYb,CAAE,EAAGK,EAAcG,CAAU,EACnD,GAFD,IAIF,EAGIM,GAAS,SAAW7C,EAAG8C,EAAMC,EAAQ,CACxC,IAAIC,EAAM,CAAC,EACP1F,EAAE,EAAG2F,EAAIjD,EAAE,OAIf,GAAK+C,IAAU,OACd,KAAQzF,EAAE2F,EAAM3F,IACV0C,EAAE1C,CAAC,GAAK0C,EAAE1C,CAAC,EAAGwF,CAAK,GACvBE,EAAI,KAAMhD,EAAE1C,CAAC,EAAGwF,CAAK,EAAGC,CAAM,CAAE,MAKlC,MAAQzF,EAAE2F,EAAM3F,IACV0C,EAAE1C,CAAC,GACP0F,EAAI,KAAMhD,EAAE1C,CAAC,EAAGwF,CAAK,CAAE,EAK1B,OAAOE,CACR,EAKIE,GAAe,SAAWlD,EAAGmD,EAAOL,EAAMC,EAC9C,CACC,IAAIC,EAAM,CAAC,EACP1F,EAAE,EAAG2F,EAAIE,EAAM,OAInB,GAAKJ,IAAU,OACd,KAAQzF,EAAE2F,EAAM3F,IACV0C,EAAGmD,EAAM7F,CAAC,CAAE,EAAGwF,CAAK,GACxBE,EAAI,KAAMhD,EAAGmD,EAAM7F,CAAC,CAAE,EAAGwF,CAAK,EAAGC,CAAM,CAAE,MAK3C,MAAQzF,EAAE2F,EAAM3F,IACf0F,EAAI,KAAMhD,EAAGmD,EAAM7F,CAAC,CAAE,EAAGwF,CAAK,CAAE,EAIlC,OAAOE,CACR,EAGII,GAAS,SAAWpG,EAAKqG,EAC7B,CACC,IAAIL,EAAM,CAAC,EACPM,EAECD,IAAU,QACdA,EAAQ,EACRC,EAAMtG,IAGNsG,EAAMD,EACNA,EAAQrG,GAGT,QAAUM,EAAE+F,EAAQ/F,EAAEgG,EAAMhG,IAC3B0F,EAAI,KAAM1F,CAAE,EAGb,OAAO0F,CACR,EAGIO,GAAe,SAAWvD,EAC9B,CAGC,QAFIgD,EAAM,CAAC,EAED1F,EAAE,EAAG2F,EAAIjD,EAAE,OAAS1C,EAAE2F,EAAM3F,IAChC0C,EAAE1C,CAAC,GACP0F,EAAI,KAAMhD,EAAE1C,CAAC,CAAE,EAIjB,OAAO0F,CACR,EAGIJ,GAAa,SAAWb,EAAI,CAC/B,OAAOA,EAAE,QAASL,GAAU,EAAG,CAChC,EAYI8B,GAAgB,SAAW5H,EAAM,CACpC,GAAKA,EAAI,OAAS,EACjB,MAAO,GAMR,QAHI6H,EAAS7H,EAAI,MAAM,EAAE,KAAK,EAC1B8H,EAAOD,EAAO,CAAC,EAET,EAAE,EAAGR,EAAIQ,EAAO,OAAS,EAAER,EAAM,IAAM,CAChD,GAAKQ,EAAO,CAAC,IAAMC,EAClB,MAAO,GAGRA,EAAOD,EAAO,CAAC,CAChB,CAEA,MAAO,EACR,EAUIE,GAAU,SAAW/H,EACzB,CACC,GAAK4H,GAAe5H,CAAI,EACvB,OAAOA,EAAI,MAAM,EAOlB,IACCoH,EAAM,CAAC,EACPrC,EACA,EAAGsC,EAAIrH,EAAI,OACX4B,EAAGE,EAAE,EAENkG,EAAO,IAAM,EAAE,EAAI,EAAEX,EAAM,IAAM,CAGhC,IAFAtC,EAAM/E,EAAI,CAAC,EAEL4B,EAAE,EAAIA,EAAEE,EAAIF,IACjB,GAAKwF,EAAIxF,CAAC,IAAMmD,EACf,SAASiD,EAIXZ,EAAI,KAAMrC,CAAI,EACdjD,GACD,CAEA,OAAOsF,CACR,EAIIa,GAAW,SAAUb,EAAKrC,EAAK,CAClC,GAAI,MAAM,QAAQA,CAAG,EACpB,QAASrD,EAAE,EAAIA,EAAEqD,EAAI,OAASrD,IAC7BuG,GAASb,EAAKrC,EAAIrD,CAAC,CAAC,OAIrB0F,EAAI,KAAKrC,CAAG,EAGb,OAAOqC,CACR,EAEIc,GAAY,SAAUC,EAAQV,EAAO,CACxC,OAAIA,IAAU,SACbA,EAAQ,GAGF,KAAK,QAAQU,EAAQV,CAAK,IAAM,EACxC,EAIM,MAAM,UACR,MAAM,QAAU,SAASW,EAAK,CAC1B,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAG,IAAM,gBACnD,GAGE,MAAM,UAAU,WACrB,MAAM,UAAU,SAAWF,IAKvB,OAAO,UAAU,OACpB,OAAO,UAAU,KAAO,UAAY,CAClC,OAAO,KAAK,QAAQ,qCAAsC,EAAE,CAC9D,GAGI,OAAO,UAAU,WACtB,OAAO,UAAU,SAAWA,IAa7B9J,GAAU,KAAO,CAShB,SAAU,SAAWiD,EAAIgH,EAAO,CAC/B,IACCC,EAAYD,IAAS,OAAYA,EAAO,IACxCP,EACAS,EAED,OAAO,UAAY,CAClB,IACCC,EAAO,KACPC,EAAO,CAAC,IAAI,KACZC,EAAO,UAEHZ,GAAQW,EAAMX,EAAOQ,GACzB,aAAcC,CAAM,EAEpBA,EAAQ,WAAY,UAAY,CAC/BT,EAAO,OACPzG,EAAG,MAAOmH,EAAME,CAAK,CACtB,EAAGJ,CAAU,IAGbR,EAAOW,EACPpH,EAAG,MAAOmH,EAAME,CAAK,EAEvB,CACD,EASA,YAAa,SAAW3D,EAAM,CAC7B,OAAOA,EAAI,QAASiB,GAAkB,MAAO,CAC9C,EAOA,IAAK,SAAW2C,EAAS,CACxB,GAAKzK,EAAE,cAAeyK,CAAO,EAM5B,OAAOvK,GAAU,KAAK,IAAKuK,EAAO,CAAE,EAEhC,GAAKA,IAAW,KAEpB,OAAO,UAAY,CAAC,EAEhB,GAAK,OAAOA,GAAW,WAC3B,OAAO,SAAU9J,EAAMkG,EAAK6D,EAAM,CACjCD,EAAQ9J,EAAM,MAAOkG,EAAK6D,CAAK,CAChC,EAEI,GAAK,OAAOD,GAAW,WAAaA,EAAO,QAAQ,GAAG,IAAM,IAC7DA,EAAO,QAAQ,GAAG,IAAM,IAAMA,EAAO,QAAQ,GAAG,IAAM,IAC1D,CAEC,IAAIE,EAAU,SAAUhK,EAAMkG,EAAK/E,EAAK,CAKvC,QAJIoE,EAAI0E,GAAqB9I,CAAI,EAAG+I,EAChCC,EAAQ5E,EAAEA,EAAE,OAAO,CAAC,EACpB6E,EAAeC,EAAc3H,EAAG4H,EAE1BzH,EAAE,EAAGC,EAAKyC,EAAE,OAAO,EAAI1C,EAAEC,EAAOD,IAAM,CAE/C,GAAI0C,EAAE1C,CAAC,IAAM,aAAe0C,EAAE1C,CAAC,IAAM,cACpC,MAAM,IAAI,MAAM,6BAA6B,EAO9C,GAHAuH,EAAgB7E,EAAE1C,CAAC,EAAE,MAAM0H,EAAS,EACpCF,EAAe9E,EAAE1C,CAAC,EAAE,MAAM2H,EAAM,EAE3BJ,EAAgB,CAUpB,GATA7E,EAAE1C,CAAC,EAAI0C,EAAE1C,CAAC,EAAE,QAAQ0H,GAAW,EAAE,EACjCvK,EAAMuF,EAAE1C,CAAC,CAAE,EAAI,CAAC,EAGhBqH,EAAI3E,EAAE,MAAM,EACZ2E,EAAE,OAAQ,EAAGrH,EAAE,CAAE,EACjByH,EAAWJ,EAAE,KAAK,GAAG,EAGhB,MAAM,QAAShE,CAAI,EACvB,QAAUnD,EAAE,EAAGC,EAAKkD,EAAI,OAASnD,EAAEC,EAAOD,IACzCL,EAAI,CAAC,EACLsH,EAAStH,EAAGwD,EAAInD,CAAC,EAAGuH,CAAS,EAC7BtK,EAAMuF,EAAE1C,CAAC,CAAE,EAAE,KAAMH,CAAE,OAOtB1C,EAAMuF,EAAE1C,CAAC,CAAE,EAAIqD,EAKhB,MACD,MACUmE,IAET9E,EAAE1C,CAAC,EAAI0C,EAAE1C,CAAC,EAAE,QAAQ2H,GAAQ,EAAE,EAC9BxK,EAAOA,EAAMuF,EAAE1C,CAAC,CAAE,EAAGqD,CAAI,IAKrBlG,EAAMuF,EAAE1C,CAAC,CAAE,IAAM,MAAQ7C,EAAMuF,EAAE1C,CAAC,CAAE,IAAM,UAC9C7C,EAAMuF,EAAE1C,CAAC,CAAE,EAAI,CAAC,GAEjB7C,EAAOA,EAAMuF,EAAE1C,CAAC,CAAE,CACnB,CAGKsH,EAAM,MAAMK,EAAO,EAEvBxK,EAAOA,EAAMmK,EAAM,QAAQK,GAAQ,EAAE,CAAE,EAAGtE,CAAI,EAK9ClG,EAAMmK,EAAM,QAAQI,GAAW,EAAE,CAAE,EAAIrE,CAEzC,EAEA,OAAO,SAAUlG,EAAMkG,EAAK,CAC3B,OAAO8D,EAAShK,EAAMkG,EAAK4D,CAAO,CACnC,CACD,KAGC,QAAO,SAAU9J,EAAMkG,EAAK,CAC3BlG,EAAK8J,CAAM,EAAI5D,CAChB,CAEF,EAOA,IAAK,SAAW4D,EAAS,CACxB,GAAKzK,EAAE,cAAeyK,CAAO,EAAI,CAEhC,IAAIpH,EAAI,CAAC,EACT,OAAArD,EAAE,KAAMyK,EAAQ,SAAUW,EAAKvE,EAAK,CAC9BA,IACJxD,EAAE+H,CAAG,EAAIlL,GAAU,KAAK,IAAK2G,CAAI,EAEnC,CAAE,EAEK,SAAUlG,EAAMqB,EAAMqJ,EAAKX,EAAM,CACvC,IAAIY,EAAIjI,EAAErB,CAAI,GAAKqB,EAAE,EACrB,OAAOiI,IAAM,OACZA,EAAE3K,EAAMqB,EAAMqJ,EAAKX,CAAI,EACvB/J,CACF,CACD,KACK,IAAK8J,IAAW,KAEpB,OAAO,SAAU9J,EAAM,CACtB,OAAOA,CACR,EAEI,GAAK,OAAO8J,GAAW,WAC3B,OAAO,SAAU9J,EAAMqB,EAAMqJ,EAAKX,EAAM,CACvC,OAAOD,EAAQ9J,EAAMqB,EAAMqJ,EAAKX,CAAK,CACtC,EAEI,GAAK,OAAOD,GAAW,WAAaA,EAAO,QAAQ,GAAG,IAAM,IAC7DA,EAAO,QAAQ,GAAG,IAAM,IAAMA,EAAO,QAAQ,GAAG,IAAM,IAC1D,CAOC,IAAIc,EAAY,SAAU5K,EAAMqB,EAAMF,EAAK,CAC1C,IAAIiJ,EAAeC,EAAc9B,EAAK+B,EAEtC,GAAKnJ,IAAQ,GAGZ,QAFIoE,EAAI0E,GAAqB9I,CAAI,EAEvB0B,EAAE,EAAGC,EAAKyC,EAAE,OAAS1C,EAAEC,EAAOD,IAAM,CAK7C,GAHAuH,EAAgB7E,EAAE1C,CAAC,EAAE,MAAM0H,EAAS,EACpCF,EAAe9E,EAAE1C,CAAC,EAAE,MAAM2H,EAAM,EAE3BJ,EAAgB,CAepB,GAbA7E,EAAE1C,CAAC,EAAI0C,EAAE1C,CAAC,EAAE,QAAQ0H,GAAW,EAAE,EAG5BhF,EAAE1C,CAAC,IAAM,KACb7C,EAAOA,EAAMuF,EAAE1C,CAAC,CAAE,GAEnB0F,EAAM,CAAC,EAGPhD,EAAE,OAAQ,EAAG1C,EAAE,CAAE,EACjByH,EAAW/E,EAAE,KAAK,GAAG,EAGhB,MAAM,QAASvF,CAAK,EACxB,QAAU+C,EAAE,EAAGC,EAAKhD,EAAK,OAAS+C,EAAEC,EAAOD,IAC1CwF,EAAI,KAAMqC,EAAW5K,EAAK+C,CAAC,EAAG1B,EAAMiJ,CAAS,CAAE,EAMjD,IAAIO,EAAOT,EAAc,CAAC,EAAE,UAAU,EAAGA,EAAc,CAAC,EAAE,OAAO,CAAC,EAClEpK,EAAQ6K,IAAO,GAAMtC,EAAMA,EAAI,KAAKsC,CAAI,EAIxC,KACD,SACUR,EAAe,CAExB9E,EAAE1C,CAAC,EAAI0C,EAAE1C,CAAC,EAAE,QAAQ2H,GAAQ,EAAE,EAC9BxK,EAAOA,EAAMuF,EAAE1C,CAAC,CAAE,EAAE,EACpB,QACD,CAEA,GAAK7C,IAAS,MAAQA,EAAMuF,EAAE1C,CAAC,CAAE,IAAM,OACtC,OAGD7C,EAAOA,EAAMuF,EAAE1C,CAAC,CAAE,CACnB,CAGD,OAAO7C,CACR,EAEA,OAAO,SAAUA,EAAMqB,EAAM,CAC5B,OAAOuJ,EAAW5K,EAAMqB,EAAMyI,CAAO,CACtC,CACD,KAGC,QAAO,SAAU9J,EAAMqB,EAAM,CAC5B,OAAOrB,EAAK8J,CAAM,CACnB,EAEF,CACD,EAWA,SAASgB,GAAkBpI,EAC3B,CACC,IACCqI,EAAY,8BACZC,EACAC,EACAC,EAAM,CAAC,EAER7L,EAAE,KAAMqD,EAAG,SAAU+H,EAAKvE,EAAK,CAC9B8E,EAAQP,EAAI,MAAM,oBAAoB,EAEjCO,GAASD,EAAU,QAAQC,EAAM,CAAC,EAAE,GAAG,IAAM,KAEjDC,EAASR,EAAI,QAASO,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAE,YAAY,CAAE,EACvDE,EAAKD,CAAO,EAAIR,EAEXO,EAAM,CAAC,IAAM,KAEjBF,GAAiBpI,EAAE+H,CAAG,CAAE,EAG3B,CAAE,EAEF/H,EAAE,cAAgBwI,CACnB,CAcA,SAASxH,GAAsBvC,EAAKgK,EAAMC,EAC1C,CACQjK,EAAI,eACV2J,GAAiB3J,CAAI,EAGtB,IAAIkK,EAEJhM,EAAE,KAAM8L,EAAM,SAAUV,EAAKvE,EAAK,CACjCmF,EAAelK,EAAI,cAAesJ,CAAI,EAEjCY,IAAiB,SAAcD,GAASD,EAAKE,CAAY,IAAM,UAG9DA,EAAa,OAAO,CAAC,IAAM,KAGxBF,EAAME,CAAa,IACzBF,EAAME,CAAa,EAAI,CAAC,GAEzBhM,EAAE,OAAQ,GAAM8L,EAAKE,CAAY,EAAGF,EAAKV,CAAG,CAAE,EAE9C/G,GAAqBvC,EAAIkK,CAAY,EAAGF,EAAKE,CAAY,EAAGD,CAAM,GAGlED,EAAKE,CAAY,EAAIF,EAAMV,CAAI,EAGlC,CAAE,CACH,CAUA,SAASzG,GAAmBsH,EAC5B,CAGC,IAAIjI,EAAW9D,GAAU,SAAS,UAG9BgM,EAAiBlI,EAAS,SAK9B,GAJKkI,GACJC,GAAiBD,CAAe,EAG5BD,EAAO,CACX,IAAIG,EAAcH,EAAK,aAIlB,CAAEA,EAAK,aAAeG,GAC1BpI,EAAS,cAAgB,8BAEzBY,GAAQqH,EAAMA,EAAM,eAAgB,aAAc,EAI9C,CAAEA,EAAK,iBAAmBG,GAC9BpI,EAAS,kBAAoB,cAE7BY,GAAQqH,EAAMA,EAAM,eAAgB,iBAAkB,EAIlDA,EAAK,iBACTA,EAAK,WAAaA,EAAK,gBAGxB,IAAII,EAAUJ,EAAK,SACdI,GAAWH,IAAmBG,GAClCF,GAAiBE,CAAQ,CAE3B,CACD,CASA,IAAIC,GAAe,SAAWjJ,EAAGkJ,EAAMC,EAAM,CACvCnJ,EAAGkJ,CAAK,IAAM,SAClBlJ,EAAGmJ,CAAI,EAAInJ,EAAGkJ,CAAK,EAErB,EASA,SAASpI,GAAgBsI,EACzB,CACCH,GAAcG,EAAM,WAAiB,OAAQ,EAC7CH,GAAcG,EAAM,aAAiB,YAAa,EAClDH,GAAcG,EAAM,eAAiB,cAAe,EACpDH,GAAcG,EAAM,gBAAiB,eAAgB,EACrDH,GAAcG,EAAM,QAAiB,WAAY,EACjDH,GAAcG,EAAM,aAAiB,gBAAiB,EACtDH,GAAcG,EAAM,SAAiB,WAAY,EACjDH,GAAcG,EAAM,aAAiB,iBAAkB,EACvDH,GAAcG,EAAM,aAAiB,gBAAiB,EACtDH,GAAcG,EAAM,YAAiB,SAAU,EAG1C,OAAOA,EAAK,UAAa,YAC7BA,EAAK,SAAWA,EAAK,SAAW,OAAS,IAErC,OAAOA,EAAK,SAAY,YAC5BA,EAAK,QAAUA,EAAK,QAAU,OAAS,IAKxC,IAAIC,EAAaD,EAAK,aAEtB,GAAKC,EACJ,QAAUlJ,EAAE,EAAG2F,EAAIuD,EAAW,OAASlJ,EAAE2F,EAAM3F,IACzCkJ,EAAWlJ,CAAC,GAChBa,GAAqBnE,GAAU,OAAO,QAASwM,EAAWlJ,CAAC,CAAE,CAIjE,CASA,SAASY,GAAgBqI,EACzB,CACCH,GAAcG,EAAM,YAAiB,WAAY,EACjDH,GAAcG,EAAM,YAAiB,WAAY,EACjDH,GAAcG,EAAM,gBAAiB,WAAY,EACjDH,GAAcG,EAAM,gBAAiB,cAAe,EAGpD,IAAIE,EAAWF,EAAK,UACf,OAAOE,GAAa,UAAY,CAAE,MAAM,QAASA,CAAS,IAC9DF,EAAK,UAAY,CAAEE,CAAS,EAE9B,CAQA,SAAS5H,GAAkB/D,EAC3B,CAIC,GAAK,CAAEd,GAAU,UAAY,CAC5B,IAAI0M,EAAU,CAAC,EACf1M,GAAU,UAAY0M,EAGtB,IAAIC,EAAI7M,EAAE,QAAQ,EAChB,IAAK,CACL,SAAU,QACV,IAAK,EACL,KAAMA,EAAE,MAAM,EAAE,WAAW,EAAE,GAC7B,OAAQ,EACR,MAAO,EACP,SAAU,QACX,CAAE,EACD,OACAA,EAAE,QAAQ,EACR,IAAK,CACL,SAAU,WACV,IAAK,EACL,KAAM,EACN,MAAO,IACP,SAAU,QACX,CAAE,EACD,OACAA,EAAE,QAAQ,EACR,IAAK,CACL,MAAO,OACP,OAAQ,EACT,CAAE,CACJ,CACF,EACC,SAAU,MAAO,EAEf8M,EAAQD,EAAE,SAAS,EACnBE,EAAQD,EAAM,SAAS,EAa3BF,EAAQ,SAAWE,EAAM,CAAC,EAAE,YAAcA,EAAM,CAAC,EAAE,YAKnDF,EAAQ,gBAAkBG,EAAM,CAAC,EAAE,cAAgB,KAAOD,EAAM,CAAC,EAAE,cAAgB,IAInFF,EAAQ,eAAiB,KAAK,MAAOG,EAAM,OAAO,EAAE,IAAK,IAAM,EAG/DH,EAAQ,UAAY,EAAAC,EAAE,CAAC,EAAE,sBAAsB,EAAE,MAEjDA,EAAE,OAAO,CACV,CAEA7M,EAAE,OAAQgB,EAAS,SAAUd,GAAU,SAAU,EACjDc,EAAS,QAAQ,UAAYd,GAAU,UAAU,QAClD,CASA,SAAS8M,GAAY1C,EAAMnH,EAAIsJ,EAAMlD,EAAOC,EAAKyD,EACjD,CACC,IACCzJ,EAAI+F,EACJ2D,EACAC,EAAQ,GAOT,IALKV,IAAS,SACbS,EAAQT,EACRU,EAAQ,IAGD3J,IAAMgG,GACNc,EAAK,eAAe9G,CAAC,IAI5B0J,EAAQC,EACPhK,EAAI+J,EAAO5C,EAAK9G,CAAC,EAAGA,EAAG8G,CAAK,EAC5BA,EAAK9G,CAAC,EAEP2J,EAAQ,GACR3J,GAAKyJ,GAGN,OAAOC,CACR,CAQA,SAASpH,GAAcpB,EAAW0I,EAClC,CAEC,IAAIC,EAAYnN,GAAU,SAAS,OAC/BsC,EAAOkC,EAAU,UAAU,OAC3B4I,EAAOtN,EAAE,OAAQ,CAAC,EAAGE,GAAU,OAAO,QAASmN,EAAW,CAC7D,IAAOD,GAAY,SAAS,cAAc,IAAI,EAC9C,OAAaC,EAAU,OAAYA,EAAU,OAAYD,EAAMA,EAAI,UAAY,GAC/E,UAAaC,EAAU,UAAYA,EAAU,UAAY,CAAC7K,CAAI,EAC9D,MAAS6K,EAAU,MAAQA,EAAU,MAAQ7K,EAC7C,IAAKA,CACN,CAAE,EACFkC,EAAU,UAAU,KAAM4I,CAAK,EAK/B,IAAIZ,EAAahI,EAAU,gBAC3BgI,EAAYlK,CAAK,EAAIxC,EAAE,OAAQ,CAAC,EAAGE,GAAU,OAAO,QAASwM,EAAYlK,CAAK,CAAE,EAGhFyD,GAAkBvB,EAAWlC,EAAMxC,EAAEoN,CAAG,EAAE,KAAK,CAAE,CAClD,CAUA,SAASnH,GAAkBvB,EAAWlC,EAAM+K,EAC5C,CACC,IAAID,EAAO5I,EAAU,UAAWlC,CAAK,EACjCwC,EAAWN,EAAU,SACrB8I,EAAKxN,EAAEsN,EAAK,GAAG,EAInB,GAAK,CAAEA,EAAK,WAAa,CAExBA,EAAK,WAAaE,EAAG,KAAK,OAAO,GAAK,KAGtC,IAAIlC,GAAKkC,EAAG,KAAK,OAAO,GAAK,IAAI,MAAM,wBAAwB,EAC1DlC,IACJgC,EAAK,WAAahC,EAAE,CAAC,EAEvB,CAGA,GAA+BiC,GAAa,KAC5C,CAECnJ,GAAemJ,CAAS,EAGxBlJ,GAAqBnE,GAAU,SAAS,OAAQqN,EAAU,EAAK,EAG1DA,EAAS,YAAc,QAAa,CAACA,EAAS,QAElDA,EAAS,MAAQA,EAAS,WAGtBA,EAAS,QAEbD,EAAK,aAAeC,EAAS,OAKzBA,EAAS,WAAa,CAAEA,EAAS,SAErCA,EAAS,OAASA,EAAS,WAEvBA,EAAS,QACbC,EAAG,SAAUD,EAAS,MAAO,EAG9B,IAAIE,EAAYH,EAAK,OAErBtN,EAAE,OAAQsN,EAAMC,CAAS,EACzB3I,GAAQ0I,EAAMC,EAAU,SAAU,YAAa,EAI3CE,IAAcH,EAAK,SACtBA,EAAK,OAASG,EAAY,IAAMH,EAAK,QAMjCC,EAAS,YAAc,SAE3BD,EAAK,UAAY,CAAEC,EAAS,SAAU,GAEvC3I,GAAQ0I,EAAMC,EAAU,WAAY,CACrC,CAGA,IAAIG,EAAWJ,EAAK,MAChBzK,EAAQiC,GAAoB4I,CAAS,EACrCC,EAAUL,EAAK,QAAUxI,GAAoBwI,EAAK,OAAQ,EAAI,KAE9DM,EAAW,SAAU9L,EAAM,CAC9B,OAAO,OAAOA,GAAQ,UAAYA,EAAI,QAAQ,GAAG,IAAM,EACxD,EACAwL,EAAK,UAAYtN,EAAE,cAAe0N,CAAS,IAC1CE,EAASF,EAAS,IAAI,GAAKE,EAASF,EAAS,IAAI,GAAKE,EAASF,EAAS,MAAM,GAE/EJ,EAAK,QAAU,KAEfA,EAAK,UAAY,SAAUO,EAAS7L,EAAM0I,EAAM,CAC/C,IAAIoD,GAAYjL,EAAOgL,EAAS7L,EAAM,OAAW0I,CAAK,EAEtD,OAAOiD,GAAW3L,EACjB2L,EAASG,GAAW9L,EAAM6L,EAASnD,CAAK,EACxCoD,EACF,EACAR,EAAK,UAAY,SAAWO,EAAShH,EAAK6D,EAAO,CAChD,OAAOqD,GAAoBL,CAAS,EAAGG,EAAShH,EAAK6D,CAAK,CAC3D,EAIK,OAAOgD,GAAa,UAAY,CAAEJ,EAAK,eAC3C5I,EAAU,eAAiB,IAItBA,EAAU,UAAU,QAEzB4I,EAAK,UAAY,GACjBE,EAAG,SAAUxI,EAAS,aAAc,GAIrC,IAAIgJ,EAAOhO,EAAE,QAAQ,MAAOsN,EAAK,SAAS,IAAM,GAC5CW,EAAQjO,EAAE,QAAQ,OAAQsN,EAAK,SAAS,IAAM,GAC7C,CAACA,EAAK,WAAc,CAACU,GAAQ,CAACC,GAElCX,EAAK,cAAgBtI,EAAS,cAC9BsI,EAAK,iBAAmB,IAEfU,GAAQ,CAACC,GAElBX,EAAK,cAAgBtI,EAAS,aAC9BsI,EAAK,iBAAmBtI,EAAS,oBAExB,CAACgJ,GAAQC,GAElBX,EAAK,cAAgBtI,EAAS,cAC9BsI,EAAK,iBAAmBtI,EAAS,sBAIjCsI,EAAK,cAAgBtI,EAAS,UAC9BsI,EAAK,iBAAmBtI,EAAS,SAEnC,CASA,SAASkJ,GAAwBlN,EACjC,CAEC,GAAKA,EAAS,UAAU,aAAe,GACvC,CACC,IAAImN,EAAUnN,EAAS,UAEvBoN,GAA0BpN,CAAS,EACnC,QAAUwC,EAAE,EAAIC,EAAK0K,EAAQ,OAAS3K,EAAEC,EAAOD,IAE9C2K,EAAQ3K,CAAC,EAAE,IAAI,MAAM,MAAQ2K,EAAQ3K,CAAC,EAAE,MAE1C,CAEA,IAAIvC,EAASD,EAAS,SACjBC,EAAO,KAAO,IAAMA,EAAO,KAAO,KAEtCC,GAAeF,CAAS,EAGzBoE,GAAiBpE,EAAU,KAAM,gBAAiB,CAACA,CAAQ,CAAE,CAC9D,CAWA,SAASqN,GAAyB3J,EAAW4J,EAC7C,CACC,IAAIC,EAAQC,GAAe9J,EAAW,UAAW,EAEjD,OAAO,OAAO6J,EAAMD,CAAM,GAAM,SAC/BC,EAAMD,CAAM,EACZ,IACF,CAWA,SAASG,GAAyB/J,EAAW4J,EAC7C,CACC,IAAIC,EAAQC,GAAe9J,EAAW,UAAW,EAC7CgK,EAAO1O,EAAE,QAASsO,EAAQC,CAAM,EAEpC,OAAOG,IAAS,GAAKA,EAAO,IAC7B,CASA,SAASC,GAAkBjK,EAC3B,CACC,IAAIkK,EAAM,EAGV,OAAA5O,EAAE,KAAM0E,EAAU,UAAW,SAAWlB,EAAGzB,EAAM,CAC3CA,EAAI,UAAY/B,EAAE+B,EAAI,GAAG,EAAE,IAAI,SAAS,IAAM,QAClD6M,GAEF,CAAE,EAEKA,CACR,CAWA,SAASJ,GAAe9J,EAAWmK,EACnC,CACC,IAAI3I,EAAI,CAAC,EAET,OAAAlG,EAAE,IAAK0E,EAAU,UAAW,SAASmC,EAAKrD,EAAG,CACvCqD,EAAIgI,CAAM,GACd3I,EAAE,KAAM1C,CAAE,CAEZ,CAAE,EAEK0C,CACR,CAQA,SAAS4I,GAAiB9N,EAC1B,CACC,IAAImN,EAAUnN,EAAS,UACnBL,EAAOK,EAAS,OAChB+N,EAAQ7O,GAAU,IAAI,KAAK,OAC3BsD,EAAG2F,EAAKzF,EAAGsL,EAAKpL,EAAGqL,EACnBlN,EAAKK,EAAM8M,EAAcC,EAG7B,IAAM3L,EAAE,EAAG2F,EAAIgF,EAAQ,OAAS3K,EAAE2F,EAAM3F,IAIvC,GAHAzB,EAAMoM,EAAQ3K,CAAC,EACf2L,EAAQ,CAAC,EAEJ,CAAEpN,EAAI,OAASA,EAAI,aACvBA,EAAI,MAAQA,EAAI,qBAEP,CAAEA,EAAI,MAAQ,CACvB,IAAM2B,EAAE,EAAGsL,EAAID,EAAM,OAASrL,EAAEsL,EAAMtL,IAAM,CAC3C,IAAME,EAAE,EAAGqL,EAAItO,EAAK,OAASiD,EAAEqL,IAGzBE,EAAMvL,CAAC,IAAM,SACjBuL,EAAMvL,CAAC,EAAIwL,GAAgBpO,EAAU4C,EAAGJ,EAAG,MAAO,GAGnD0L,EAAeH,EAAMrL,CAAC,EAAGyL,EAAMvL,CAAC,EAAG5C,CAAS,EAOvC,GAAEkO,GAAgBxL,IAAMqL,EAAM,OAAO,GAOrCG,IAAiB,QAAU,CAAElH,GAAOmH,EAAMvL,CAAC,CAAC,IArBbA,IAqBpC,CAOD,GAAKsL,EAAe,CACnBnN,EAAI,MAAQmN,EACZ,KACD,CACD,CAGOnN,EAAI,QACVA,EAAI,MAAQ,SAEd,CAEF,CAcA,SAASgE,GAAoBrB,EAAW2K,EAAWC,EAAQnM,EAC3D,CACC,IAAIK,EAAGC,EAAMC,EAAGC,EAAMC,EAAGC,EAAM0L,EAC3BpB,EAAUzJ,EAAU,UAGxB,GAAK2K,EAGJ,IAAM7L,EAAE6L,EAAU,OAAO,EAAI7L,GAAG,EAAIA,IACpC,CACC+L,EAAMF,EAAU7L,CAAC,EAGjB,IAAIgM,EAAWD,EAAI,SAAW,OAC3BA,EAAI,OACJA,EAAI,UAAY,OACfA,EAAI,QACJA,EAAI,SAOR,IALO,MAAM,QAASC,CAAS,IAE9BA,EAAW,CAAEA,CAAS,GAGjB9L,EAAE,EAAGC,EAAK6L,EAAS,OAAS9L,EAAEC,EAAOD,IAE1C,GAAK,OAAO8L,EAAS9L,CAAC,GAAM,UAAY8L,EAAS9L,CAAC,GAAK,EACvD,CAEC,KAAOyK,EAAQ,QAAUqB,EAAS9L,CAAC,GAElCoC,GAAcpB,CAAU,EAIzBvB,EAAIqM,EAAS9L,CAAC,EAAG6L,CAAI,CACtB,SACU,OAAOC,EAAS9L,CAAC,GAAM,UAAY8L,EAAS9L,CAAC,EAAI,EAG1DP,EAAIgL,EAAQ,OAAOqB,EAAS9L,CAAC,EAAG6L,CAAI,UAE3B,OAAOC,EAAS9L,CAAC,GAAM,SAGhC,IAAME,EAAE,EAAGC,EAAKsK,EAAQ,OAASvK,EAAEC,EAAOD,KAEpC4L,EAAS9L,CAAC,GAAK,QACf1D,EAAEmO,EAAQvK,CAAC,EAAE,GAAG,EAAE,SAAU4L,EAAS9L,CAAC,CAAE,IAE5CP,EAAIS,EAAG2L,CAAI,CAKhB,CAID,GAAKD,EAEJ,IAAM9L,EAAE,EAAGC,EAAK6L,EAAO,OAAS9L,EAAEC,EAAOD,IAExCL,EAAIK,EAAG8L,EAAO9L,CAAC,CAAE,CAGpB,CAeA,SAAS4D,GAAa1C,EAAW+K,EAAStO,EAAKuO,EAC/C,CAEC,IAAIzN,EAAOyC,EAAU,OAAO,OACxBiL,EAAQ3P,EAAE,OAAQ,GAAM,CAAC,EAAGE,GAAU,OAAO,KAAM,CACtD,IAAKiB,EAAM,MAAQ,OACnB,IAAKc,CACN,CAAE,EAEF0N,EAAM,OAASF,EACf/K,EAAU,OAAO,KAAMiL,CAAM,EAO7B,QAJIC,EAAKC,EACL1B,EAAUzJ,EAAU,UAGdlB,EAAE,EAAGC,EAAK0K,EAAQ,OAAS3K,EAAEC,EAAOD,IAE7C2K,EAAQ3K,CAAC,EAAE,MAAQ,KAIpBkB,EAAU,gBAAgB,KAAMzC,CAAK,EAErC,IAAI6N,EAAKpL,EAAU,QAAS+K,CAAQ,EACpC,OAAKK,IAAO,SACXpL,EAAU,KAAMoL,CAAG,EAAIH,IAInBxO,GAAO,CAAEuD,EAAU,UAAU,eAEjCqL,GAAarL,EAAWzC,EAAMd,EAAKuO,CAAM,EAGnCzN,CACR,CAaA,SAASoF,GAAUrG,EAAUgP,EAC7B,CACC,IAAI3E,EAGJ,OAAQ2E,aAAehQ,IACtBgQ,EAAMhQ,EAAEgQ,CAAG,GAGLA,EAAI,IAAK,SAAU,EAAGxK,EAAI,CAChC,OAAA6F,EAAM4E,GAAmBjP,EAAUwE,CAAG,EAC/B4B,GAAYpG,EAAUqK,EAAI,KAAM7F,EAAI6F,EAAI,KAAM,CACtD,CAAE,CACH,CAUA,SAAS6E,GAAoBxL,EAAWmI,EACxC,CACC,OAAQA,EAAE,eAAe,OAAaA,EAAE,aAAe,IACxD,CAWA,SAASsD,GAAsBzL,EAAWzC,EAAM4K,EAChD,CACC,OAAO7M,EAAE,QAAS6M,EAAGnI,EAAU,OAAQzC,CAAK,EAAE,OAAQ,CACvD,CAYA,SAASmN,GAAgBpO,EAAUoP,EAAQC,EAAQrO,EACnD,CACKA,IAAS,SACZA,EAAO,SAECA,IAAS,UACjBA,EAAO,QAGR,IAAIsO,EAAiBtP,EAAS,MAC1Be,EAAiBf,EAAS,UAAUqP,CAAM,EAC1CxC,EAAiB7M,EAAS,OAAOoP,CAAM,EAAE,OACzCG,EAAiBxO,EAAI,gBACrByO,EAAiBzO,EAAI,UAAW8L,EAAS7L,EAAM,CAClD,SAAUhB,EACV,IAAUoP,EACV,IAAUC,CACX,CAAE,EAEF,GAAKG,IAAa,OACjB,OAAKxP,EAAS,YAAcsP,GAAQC,IAAmB,OACtDrM,GAAQlD,EAAU,EAAG,gCACnB,OAAOe,EAAI,OAAO,WAAa,aAAe,IAAIA,EAAI,MAAM,KAC7D,YAAYqO,EAAO,YAAYC,EAAQ,CAAE,EAC1CrP,EAAS,WAAasP,GAEhBC,EAKR,IAAMC,IAAa3C,GAAW2C,IAAa,OAASD,IAAmB,MAAQvO,IAAS,OACvFwO,EAAWD,UAEF,OAAOC,GAAa,WAG7B,OAAOA,EAAS,KAAM3C,CAAQ,EAG/B,GAAK2C,IAAa,MAAQxO,IAAS,UAClC,MAAO,GAGR,GAAKA,IAAS,SAAW,CACxB,IAAIyO,EAAYvQ,GAAU,IAAI,KAAK,OAE9BuQ,EAAW1O,EAAI,KAAM,IACzByO,EAAWC,EAAW1O,EAAI,KAAM,EAAGyO,CAAS,EAE9C,CAEA,OAAOA,CACR,CAWA,SAASE,GAAgB1P,EAAUoP,EAAQC,EAAQxJ,EACnD,CACC,IAAI9E,EAAUf,EAAS,UAAUqP,CAAM,EACnCxC,EAAU7M,EAAS,OAAOoP,CAAM,EAAE,OAEtCrO,EAAI,UAAW8L,EAAShH,EAAK,CAC5B,SAAU7F,EACV,IAAUoP,EACV,IAAUC,CACX,CAAG,CACJ,CAIA,IAAInF,GAAY,WACZC,GAAS,QAOb,SAASP,GAAqB+F,EAC9B,CACC,OAAO3Q,EAAE,IAAK2Q,EAAI,MAAM,eAAe,GAAK,CAAC,EAAE,EAAG,SAAWpM,EAAI,CAChE,OAAOA,EAAE,QAAQ,QAAS,GAAG,CAC9B,CAAE,CACH,CAUA,IAAIO,GAAqB5E,GAAU,KAAK,IAUpC6N,GAAqB7N,GAAU,KAAK,IASxC,SAAS0Q,GAAmB5P,EAC5B,CACC,OAAO+H,GAAQ/H,EAAS,OAAQ,QAAS,CAC1C,CAQA,SAAS6P,GAAe7P,EACxB,CACCA,EAAS,OAAO,OAAS,EACzBA,EAAS,gBAAgB,OAAS,EAClCA,EAAS,UAAU,OAAS,EAC5BA,EAAS,KAAO,CAAC,CAClB,CAUA,SAAS8P,GAAgB5K,EAAG6K,EAASC,EACrC,CAGC,QAFIC,EAAe,GAETzN,EAAE,EAAGC,EAAKyC,EAAE,OAAS1C,EAAEC,EAAOD,IAElC0C,EAAE1C,CAAC,GAAKuN,EAEZE,EAAezN,EAEN0C,EAAE1C,CAAC,EAAIuN,GAEhB7K,EAAE1C,CAAC,IAIAyN,GAAgB,IAAMD,IAAW,QAErC9K,EAAE,OAAQ+K,EAAc,CAAE,CAE5B,CAmBA,SAASC,GAAelQ,EAAUoP,EAAQtO,EAAKuO,EAC/C,CACC,IAAIhF,EAAMrK,EAAS,OAAQoP,CAAO,EAC9B5M,EAAG2F,EACHgI,EAAY,SAAW/O,EAAML,EAAM,CAItC,KAAQK,EAAK,WAAW,QACvBA,EAAK,YAAaA,EAAK,UAAW,EAGnCA,EAAK,UAAYgN,GAAgBpO,EAAUoP,EAAQrO,EAAK,SAAU,CACnE,EAGA,GAAKD,IAAQ,QAAW,CAAEA,GAAOA,IAAQ,SAAWuJ,EAAI,MAAQ,MAE/DA,EAAI,OAAS4E,GACXjP,EAAUqK,EAAKgF,EAAQA,IAAW,OAAY,OAAYhF,EAAI,MAC/D,EACC,SAEE,CAEJ,IAAI+F,EAAQ/F,EAAI,QAEhB,GAAK+F,EACJ,GAAKf,IAAW,OACfc,EAAWC,EAAMf,CAAM,EAAGA,CAAO,MAGjC,KAAM7M,EAAE,EAAG2F,EAAIiI,EAAM,OAAS5N,EAAE2F,EAAM3F,IACrC2N,EAAWC,EAAM5N,CAAC,EAAGA,CAAE,CAI3B,CAIA6H,EAAI,WAAa,KACjBA,EAAI,aAAe,KAInB,IAAIgG,EAAOrQ,EAAS,UACpB,GAAKqP,IAAW,OACfgB,EAAMhB,CAAO,EAAE,MAAQ,SAEnB,CACJ,IAAM7M,EAAE,EAAG2F,EAAIkI,EAAK,OAAS7N,EAAE2F,EAAM3F,IACpC6N,EAAK7N,CAAC,EAAE,MAAQ,KAIjB8N,GAAkBtQ,EAAUqK,CAAI,CACjC,CACD,CAoBA,SAAS4E,GAAmBjP,EAAUqK,EAAKgF,EAAQpI,EACnD,CACC,IACCsJ,EAAM,CAAC,EACPC,EAAKnG,EAAI,WACTlF,EAAMpE,EAAKsB,EAAGG,EAAE,EAAGiO,EACnBtD,EAAUnN,EAAS,UACnB0Q,EAAa1Q,EAAS,eAGvBiH,EAAIA,IAAM,OACTA,EACAyJ,EACC,CAAC,EACD,CAAC,EAEH,IAAIC,EAAO,SAAWhB,EAAKa,EAAM,CAChC,GAAK,OAAOb,GAAQ,SAAW,CAC9B,IAAIiB,EAAMjB,EAAI,QAAQ,GAAG,EAEzB,GAAKiB,IAAQ,GAAK,CACjB,IAAID,EAAOhB,EAAI,UAAWiB,EAAI,CAAE,EAC5BC,GAAS9D,GAAoB4C,CAAI,EACrCkB,GAAQ5J,EAAGuJ,EAAG,aAAcG,CAAK,CAAE,CACpC,CACD,CACD,EAGIG,EAAc,SAAW1P,EAAO,CACnC,GAAKiO,IAAW,QAAaA,IAAW7M,EAIvC,GAHAzB,EAAMoM,EAAQ3K,CAAC,EACfiO,EAAYrP,EAAK,UAAW,KAAK,EAE5BL,GAAOA,EAAI,UAAY,CAC3B,IAAI8P,EAAS9D,GAAoBhM,EAAI,MAAM,CAAE,EAC7C8P,EAAQ5J,EAAGwJ,CAAS,EAEpBE,EAAM5P,EAAI,MAAM,KAAMK,CAAK,EAC3BuP,EAAM5P,EAAI,MAAM,KAAMK,CAAK,EAC3BuP,EAAM5P,EAAI,MAAM,OAAQK,CAAK,CAC9B,MAIMsP,GACG3P,EAAI,UAEVA,EAAI,QAAUgM,GAAoBhM,EAAI,KAAM,GAE7CA,EAAI,QAASkG,EAAGwJ,CAAS,GAGzBxJ,EAAEzE,CAAC,EAAIiO,EAKVjO,GACD,EAEA,GAAKgO,EAEJ,KAAQA,GACPrL,EAAOqL,EAAG,SAAS,YAAY,GAE1BrL,GAAQ,MAAQA,GAAQ,QAC5B2L,EAAaN,CAAG,EAChBD,EAAI,KAAMC,CAAG,GAGdA,EAAKA,EAAG,gBAGL,CAEJD,EAAMlG,EAAI,QAEV,QAAU3H,EAAE,EAAGsL,EAAIuC,EAAI,OAAS7N,EAAEsL,EAAMtL,IACvCoO,EAAaP,EAAI7N,CAAC,CAAE,CAEtB,CAGA,IAAIqO,GAAU1G,EAAI,WAAaA,EAAMA,EAAI,IAEzC,GAAK0G,GAAU,CACd,IAAIjC,EAAKiC,GAAQ,aAAc,IAAK,EAE/BjC,GACJ/B,GAAoB/M,EAAS,KAAM,EAAGiH,EAAG6H,CAAG,CAE9C,CAEA,MAAO,CACN,KAAM7H,EACN,MAAOsJ,CACR,CACD,CAWA,SAASxB,GAAcrL,EAAWzC,EAAM+P,EAAOtC,EAC/C,CACC,IACCrE,EAAM3G,EAAU,OAAOzC,CAAI,EAC3B4L,EAAUxC,EAAI,OACd+F,EAAQ,CAAC,EACTjQ,EAAKyO,EAAKtC,EACV9J,EAAGC,EAAMwO,EAEV,GAAK5G,EAAI,MAAQ,KACjB,CAeC,IAdAlK,EAAM6Q,GAAS,SAAS,cAAc,IAAI,EAE1C3G,EAAI,IAAMlK,EACVkK,EAAI,QAAU+F,EAKdjQ,EAAI,aAAec,EAGnBqP,GAAkB5M,EAAW2G,CAAI,EAG3B7H,EAAE,EAAGC,EAAKiB,EAAU,UAAU,OAASlB,EAAEC,EAAOD,IAErD8J,EAAO5I,EAAU,UAAUlB,CAAC,EAC5ByO,EAAS,CAAAD,EAETpC,EAAMqC,EAAS,SAAS,cAAe3E,EAAK,SAAU,EAAIoC,EAAMlM,CAAC,EAE3DoM,GACL1L,GAAQQ,EAAW,EAAG,yBAA0B,EAAG,EAGpDkL,EAAI,cAAgB,CACnB,IAAK3N,EACL,OAAQuB,CACT,EAEA4N,EAAM,KAAMxB,CAAI,GAGXqC,IAAY3E,EAAK,SAAWA,EAAK,QAAU9J,KAC7C,CAACxD,EAAE,cAAcsN,EAAK,KAAK,GAAKA,EAAK,MAAM,IAAM9J,EAAE,eAErDoM,EAAI,UAAYR,GAAgB1K,EAAWzC,EAAMuB,EAAG,SAAU,GAI1D8J,EAAK,SAETsC,EAAI,WAAa,IAAItC,EAAK,QAItBA,EAAK,UAAY,CAAE0E,EAEvB7Q,EAAI,YAAayO,CAAI,EAEZ,CAAEtC,EAAK,UAAY0E,GAE5BpC,EAAI,WAAW,YAAaA,CAAI,EAG5BtC,EAAK,eAETA,EAAK,cAAc,KAAM5I,EAAU,UAClCkL,EAAKR,GAAgB1K,EAAWzC,EAAMuB,CAAE,EAAGqK,EAAS5L,EAAMuB,CAC3D,EAIF4B,GAAiBV,EAAW,uBAAwB,KAAM,CAACvD,EAAK0M,EAAS5L,EAAMmP,CAAK,CAAE,CACvF,CACD,CAUA,SAASE,GAAkBtQ,EAAUqK,EACrC,CACC,IAAI6G,EAAK7G,EAAI,IACT1K,EAAO0K,EAAI,OAEf,GAAK6G,EAAK,CACT,IAAIpC,EAAK9O,EAAS,QAASL,CAAK,EAMhC,GAJKmP,IACJoC,EAAG,GAAKpC,GAGJnP,EAAK,YAAc,CAEvB,IAAIuF,EAAIvF,EAAK,YAAY,MAAM,GAAG,EAClC0K,EAAI,OAASA,EAAI,OAChBxB,GAASwB,EAAI,OAAO,OAAQnF,CAAE,CAAE,EAChCA,EAEDlG,EAAEkS,CAAE,EACF,YAAa7G,EAAI,OAAO,KAAK,GAAG,CAAE,EAClC,SAAU1K,EAAK,WAAY,CAC9B,CAEKA,EAAK,YACTX,EAAEkS,CAAE,EAAE,KAAMvR,EAAK,UAAW,EAGxBA,EAAK,YACTX,EAAEkS,CAAE,EAAE,KAAMvR,EAAK,UAAW,CAE9B,CACD,CAQA,SAASwR,GAAczN,EACvB,CACC,IAAIlB,EAAG2F,EAAK/G,EAAMiJ,EAAK+G,EACnBnL,EAAQvC,EAAU,OAClByC,EAAQzC,EAAU,OAClB2N,EAAerS,EAAE,SAAUiH,CAAK,EAAE,SAAW,EAC7CqL,EAAU5N,EAAU,SACpByJ,EAAUzJ,EAAU,UAMxB,IAJK2N,IACJhH,EAAMrL,EAAE,OAAO,EAAE,SAAUiH,CAAM,GAG5BzD,EAAE,EAAG2F,EAAIgF,EAAQ,OAAS3K,EAAE2F,EAAM3F,IACvC4O,EAASjE,EAAQ3K,CAAC,EAClBpB,EAAOpC,EAAGoS,EAAO,GAAI,EAAE,SAAUA,EAAO,MAAO,EAE1CC,GACJjQ,EAAK,SAAUiJ,CAAI,EAIf3G,EAAU,UAAU,QACxBtC,EAAK,SAAUgQ,EAAO,aAAc,EAE/BA,EAAO,YAAc,KACzBhQ,EACE,KAAM,WAAYsC,EAAU,SAAU,EACtC,KAAM,gBAAiBA,EAAU,QAAS,EAE5C6N,GAAuB7N,EAAW0N,EAAO,IAAK5O,CAAE,IAI7C4O,EAAO,QAAUhQ,EAAK,CAAC,EAAE,WAC7BA,EAAK,KAAMgQ,EAAO,MAAO,EAG1BI,GAAa9N,EAAW,QAAS,EAChCA,EAAWtC,EAAMgQ,EAAQE,CAC1B,EAeD,GAZKD,GACJzM,GAAiBlB,EAAU,SAAUuC,CAAM,EAI5CjH,EAAEiH,CAAK,EAAE,SAAS,IAAI,EAAE,SAAS,QAAQ,EAAE,SAAUqL,EAAQ,SAAU,EACvEtS,EAAEmH,CAAK,EAAE,SAAS,IAAI,EAAE,SAAS,QAAQ,EAAE,SAAUmL,EAAQ,SAAU,EAMlEnL,IAAU,KAAO,CACrB,IAAIiK,EAAQ1M,EAAU,SAAS,CAAC,EAEhC,IAAMlB,EAAE,EAAG2F,EAAIiI,EAAM,OAAS5N,EAAE2F,EAAM3F,IACrC4O,EAASjE,EAAQ3K,CAAC,EAEd4O,GACHA,EAAO,IAAMhB,EAAM5N,CAAC,EAAE,KAEjB4O,EAAO,QACXpS,EAAEoS,EAAO,GAAG,EAAE,SAAUA,EAAO,MAAO,GAIvClO,GAAQQ,EAAW,EAAG,yBAA0B,EAAG,CAGtD,CACD,CAgBA,SAAS+N,GAAa/N,EAAWgO,EAAUC,EAC3C,CACC,IAAI,EAAGlP,EAAMC,EAAGC,EAAMC,EAAGC,EAAMgJ,EAAG+F,EAC9BC,EAAU,CAAC,EACXC,EAAW,CAAC,EACZC,EAAWrO,EAAU,UAAU,OAC/BsO,EAAUC,EAEd,GAAOP,EAWP,KANMC,IAAmB,SAExBA,EAAiB,IAIZ,EAAE,EAAGlP,EAAKiP,EAAS,OAAS,EAAEjP,EAAO,IAC3C,CAKC,IAJAoP,EAAQ,CAAC,EAAIH,EAAS,CAAC,EAAE,MAAM,EAC/BG,EAAQ,CAAC,EAAE,IAAMH,EAAS,CAAC,EAAE,IAGvBhP,EAAEqP,EAAS,EAAIrP,GAAG,EAAIA,IAEtB,CAACgB,EAAU,UAAUhB,CAAC,EAAE,UAAY,CAACiP,GAEzCE,EAAQ,CAAC,EAAE,OAAQnP,EAAG,CAAE,EAK1BoP,EAAS,KAAM,CAAC,CAAE,CACnB,CAEA,IAAM,EAAE,EAAGrP,EAAKoP,EAAQ,OAAS,EAAEpP,EAAO,IAC1C,CAIC,GAHAmP,EAAWC,EAAQ,CAAC,EAAE,IAGjBD,EAEJ,KAAQ/F,EAAI+F,EAAS,YAEpBA,EAAS,YAAa/F,CAAE,EAI1B,IAAMnJ,EAAE,EAAGC,EAAKkP,EAAQ,CAAC,EAAE,OAASnP,EAAEC,EAAOD,IAQ5C,GANAsP,EAAW,EACXC,EAAW,EAKNH,EAAS,CAAC,EAAEpP,CAAC,IAAM,OACxB,CAKC,IAJAkP,EAAS,YAAaC,EAAQ,CAAC,EAAEnP,CAAC,EAAE,IAAK,EACzCoP,EAAS,CAAC,EAAEpP,CAAC,EAAI,EAGTmP,EAAQ,EAAEG,CAAQ,IAAM,QACxBH,EAAQ,CAAC,EAAEnP,CAAC,EAAE,MAAQmP,EAAQ,EAAEG,CAAQ,EAAEtP,CAAC,EAAE,MAEpDoP,EAAS,EAAEE,CAAQ,EAAEtP,CAAC,EAAI,EAC1BsP,IAID,KAAQH,EAAQ,CAAC,EAAEnP,EAAEuP,CAAQ,IAAM,QAC3BJ,EAAQ,CAAC,EAAEnP,CAAC,EAAE,MAAQmP,EAAQ,CAAC,EAAEnP,EAAEuP,CAAQ,EAAE,MACrD,CAEC,IAAMrP,EAAE,EAAIA,EAAEoP,EAAWpP,IAExBkP,EAAS,EAAElP,CAAC,EAAEF,EAAEuP,CAAQ,EAAI,EAE7BA,GACD,CAGAjT,EAAE6S,EAAQ,CAAC,EAAEnP,CAAC,EAAE,IAAI,EAClB,KAAK,UAAWsP,CAAQ,EACxB,KAAK,UAAWC,CAAQ,CAC3B,CAEF,EACD,CASA,SAASC,GAASxO,EAAWyO,EAC7B,CAECC,GAAU1O,CAAU,EAGpB,IAAI2O,EAAWjO,GAAiBV,EAAW,oBAAqB,UAAW,CAACA,CAAS,CAAE,EACvF,GAAK1E,EAAE,QAAS,GAAOqT,CAAS,IAAM,GACtC,CACCC,GAAsB5O,EAAW,EAAM,EACvC,MACD,CAEA,IAAI6O,EAAS,CAAC,EACVC,EAAY,EACZC,EAAkB/O,EAAU,gBAC5BgP,EAAWD,EAAgB,OAC3BE,EAAQjP,EAAU,UAClBkP,EAAc7M,GAAerC,CAAU,GAAK,MAC5CmP,EAAYnP,EAAU,UACtBoP,EAAgBpP,EAAU,eAC1BqP,EAAcrP,EAAU,aAAa,EAKzC,GAHAA,EAAU,SAAW,GAGhBA,EAAU,cAEdA,EAAU,cAAgB,GAC1BA,EAAU,QACV4O,GAAsB5O,EAAW,EAAM,UAE9B,CAACkP,EAEVlP,EAAU,gBAED,CAACA,EAAU,aAAe,CAACyO,EACrC,CACCa,GAAetP,CAAU,EACzB,MACD,CAEA,GAAKmP,EAAU,SAAW,EAKzB,QAHII,EAASL,EAAc,EAAIE,EAC3BI,EAAON,EAAclP,EAAU,OAAO,OAASqP,EAEzCrQ,EAAEuQ,EAASvQ,EAAEwQ,EAAOxQ,IAC9B,CACC,IAAIyQ,EAAaN,EAAUnQ,CAAC,EACxB0Q,EAAS1P,EAAU,OAAQyP,CAAW,EACrCC,EAAO,MAAQ,MAEnBrE,GAAarL,EAAWyP,CAAW,EAGpC,IAAIE,GAAOD,EAAO,IAGlB,GAAKV,IAAa,EAClB,CACC,IAAIY,EAAUb,EAAiBD,EAAYE,CAAS,EAC/CU,EAAO,aAAeE,IAE1BtU,EAAEqU,EAAI,EAAE,YAAaD,EAAO,WAAY,EAAE,SAAUE,CAAQ,EAC5DF,EAAO,YAAcE,EAEvB,CAKAlP,GAAiBV,EAAW,gBAAiB,KAC5C,CAAC2P,GAAMD,EAAO,OAAQZ,EAAW9P,EAAGyQ,CAAU,CAAE,EAEjDZ,EAAO,KAAMc,EAAK,EAClBb,GACD,KAGD,CAEC,IAAIe,EAAQZ,EAAM,aACbjP,EAAU,OAAS,GAAMqC,GAAerC,CAAU,GAAK,OAE3D6P,EAAQZ,EAAM,gBAELA,EAAM,aAAejP,EAAU,eAAe,IAAM,IAE7D6P,EAAQZ,EAAM,aAGfJ,EAAQ,CAAE,EAAIvT,EAAG,QAAS,CAAE,MAAS0T,EAAWD,EAAgB,CAAC,EAAI,EAAG,CAAE,EACxE,OAAQzT,EAAE,SAAU,CACpB,OAAW,MACX,QAAW2O,GAAkBjK,CAAU,EACvC,MAAWA,EAAU,SAAS,SAC/B,CAAE,EAAE,KAAM6P,CAAM,CAAE,EAAE,CAAC,CACvB,CAGAnP,GAAiBV,EAAW,mBAAoB,SAAU,CAAE1E,EAAE0E,EAAU,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAC/FkM,GAAkBlM,CAAU,EAAGoP,EAAeC,EAAaF,CAAU,CAAE,EAExEzO,GAAiBV,EAAW,mBAAoB,SAAU,CAAE1E,EAAE0E,EAAU,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAC/FkM,GAAkBlM,CAAU,EAAGoP,EAAeC,EAAaF,CAAU,CAAE,EAExE,IAAIW,EAAOxU,EAAE0E,EAAU,MAAM,EAE7B8P,EAAK,SAAS,EAAE,OAAO,EACvBA,EAAK,OAAQxU,EAAEuT,CAAM,CAAE,EAGvBnO,GAAiBV,EAAW,iBAAkB,OAAQ,CAACA,CAAS,CAAE,EAGlEA,EAAU,QAAU,GACpBA,EAAU,UAAY,GACtBA,EAAU,SAAW,EACtB,CAUA,SAAS+P,GAAWzT,EAAU0T,EAC9B,CACC,IACCpO,EAAWtF,EAAS,UACpBoF,EAAWE,EAAS,MACpBD,EAAWC,EAAS,QAEhBF,GACJuO,GAAS3T,CAAS,EAGdqF,EACJuO,GAAmB5T,EAAUA,EAAS,eAAgB,EAItDA,EAAS,UAAYA,EAAS,gBAAgB,MAAM,EAGhD0T,IAAiB,KACrB1T,EAAS,eAAiB,GAK3BA,EAAS,UAAY0T,EAErBxB,GAASlS,CAAS,EAElBA,EAAS,UAAY,EACtB,CAQA,SAAS6T,GAAoBnQ,EAC7B,CACC,IAAI4N,EAAU5N,EAAU,SACpBoQ,EAAQ9U,EAAE0E,EAAU,MAAM,EAC1BqQ,EAAU/U,EAAE,QAAQ,EAAE,aAAc8U,CAAM,EAC1CxO,EAAW5B,EAAU,UAGrBsQ,EAAShV,EAAE,SAAU,CACxB,GAAS0E,EAAU,SAAS,WAC5B,MAAS4N,EAAQ,UAAY5N,EAAU,OAAS,GAAK,IAAI4N,EAAQ,UAClE,CAAE,EAEF5N,EAAU,SAAWqQ,EAAQ,CAAC,EAC9BrQ,EAAU,cAAgBsQ,EAAO,CAAC,EAClCtQ,EAAU,qBAAuBA,EAAU,OAAO,YAKlD,QAFIuQ,EAAOvQ,EAAU,KAAK,MAAM,EAAE,EAC9BwQ,EAAaC,EAASC,EAAUC,EAAOC,EAAO5R,EACxCF,EAAE,EAAIA,EAAEyR,EAAK,OAASzR,IAChC,CAIC,GAHA0R,EAAc,KACdC,EAAUF,EAAKzR,CAAC,EAEX2R,GAAW,IAChB,CAMC,GAJAC,EAAWpV,EAAE,QAAQ,EAAE,CAAC,EAGxBqV,EAAQJ,EAAKzR,EAAE,CAAC,EACX6R,GAAS,KAAOA,GAAS,IAC9B,CAGC,IAFAC,EAAQ,GACR5R,EAAI,EACIuR,EAAKzR,EAAEE,CAAC,GAAK2R,GAEpBC,GAASL,EAAKzR,EAAEE,CAAC,EACjBA,IAgBD,GAZK4R,GAAS,IAEbA,EAAQhD,EAAQ,WAEPgD,GAAS,MAElBA,EAAQhD,EAAQ,YAMZgD,EAAM,QAAQ,GAAG,GAAK,GAC3B,CACC,IAAIC,EAASD,EAAM,MAAM,GAAG,EAC5BF,EAAS,GAAKG,EAAO,CAAC,EAAE,OAAO,EAAGA,EAAO,CAAC,EAAE,OAAO,CAAC,EACpDH,EAAS,UAAYG,EAAO,CAAC,CAC9B,MACUD,EAAM,OAAO,CAAC,GAAK,IAE5BF,EAAS,GAAKE,EAAM,OAAO,EAAGA,EAAM,OAAO,CAAC,EAI5CF,EAAS,UAAYE,EAGtB9R,GAAKE,CACN,CAEAsR,EAAO,OAAQI,CAAS,EACxBJ,EAAShV,EAAEoV,CAAQ,CACpB,SACUD,GAAW,IAGpBH,EAASA,EAAO,OAAO,UAGdG,GAAW,KAAO7O,EAAS,WAAaA,EAAS,cAG1D4O,EAAcM,GAAsB9Q,CAAU,UAErCyQ,GAAW,KAAO7O,EAAS,QAGpC4O,EAAcO,GAAsB/Q,CAAU,UAErCyQ,GAAW,KAAO7O,EAAS,YAGpC4O,EAAcQ,GAA0BhR,CAAU,UAEzCyQ,GAAW,IAGpBD,EAAcS,GAAqBjR,CAAU,UAEpCyQ,GAAY,KAAO7O,EAAS,MAGrC4O,EAAcU,GAAoBlR,CAAU,UAEnCyQ,GAAW,KAAO7O,EAAS,UAGpC4O,EAAcW,GAAwBnR,CAAU,UAEvCxE,GAAU,IAAI,QAAQ,SAAW,GAI1C,QADI4V,EAAa5V,GAAU,IAAI,QACrB0D,EAAE,EAAGC,GAAKiS,EAAW,OAASlS,EAAEC,GAAOD,IAEhD,GAAKuR,GAAWW,EAAWlS,CAAC,EAAE,SAC9B,CACCsR,EAAcY,EAAWlS,CAAC,EAAE,OAAQc,CAAU,EAC9C,KACD,EAKF,GAAKwQ,EACL,CACC,IAAIa,EAAcrR,EAAU,YAErBqR,EAAYZ,CAAO,IAEzBY,EAAYZ,CAAO,EAAI,CAAC,GAGzBY,EAAYZ,CAAO,EAAE,KAAMD,CAAY,EACvCF,EAAO,OAAQE,CAAY,CAC5B,CACD,CAGAH,EAAQ,YAAaC,CAAO,EAC5BtQ,EAAU,SAAW,IACtB,CAYA,SAASkB,GAAkBoQ,EAASrQ,EACpC,CACC,IAAIsQ,EAAOjW,EAAE2F,CAAM,EAAE,SAAS,IAAI,EAC9BxE,EAAK+U,EACL1S,EAAGI,EAAGuS,EAAG1S,EAAME,EAAMyS,EAAa3U,EAASwR,EAAUD,EACrDqD,EACAC,EAAa,SAAWpQ,EAAG1C,GAAGE,EAAI,CAEvB,QADVE,EAAIsC,EAAE1C,EAAC,EACWI,EAAEF,CAAC,GACxBA,IAED,OAAOA,CACR,EAKA,IAHAsS,EAAQ,OAAQ,EAAGA,EAAQ,MAAO,EAG5BxS,EAAE,EAAGC,EAAKwS,EAAK,OAASzS,EAAEC,EAAOD,IAEtCwS,EAAQ,KAAM,CAAC,CAAE,EAIlB,IAAMxS,EAAE,EAAGC,EAAKwS,EAAK,OAASzS,EAAEC,EAAOD,IAOtC,IALArC,EAAM8U,EAAKzS,CAAC,EACZ/B,EAAU,EAGVyU,EAAQ/U,EAAI,WACJ+U,GAAQ,CACf,GAAKA,EAAM,SAAS,YAAY,GAAK,MAChCA,EAAM,SAAS,YAAY,GAAK,KAiBpC,IAdAjD,EAAWiD,EAAM,aAAa,SAAS,EAAI,EAC3ClD,EAAWkD,EAAM,aAAa,SAAS,EAAI,EAC3CjD,EAAY,CAACA,GAAYA,IAAW,GAAKA,IAAW,EAAK,EAAIA,EAC7DD,EAAY,CAACA,GAAYA,IAAW,GAAKA,IAAW,EAAK,EAAIA,EAK7DoD,EAAcE,EAAYN,EAASxS,EAAG/B,CAAQ,EAG9C4U,EAAUpD,IAAa,EAGjBkD,EAAE,EAAIA,EAAElD,EAAWkD,IAExB,IAAMvS,EAAE,EAAIA,EAAEoP,EAAWpP,IAExBoS,EAAQxS,EAAEI,CAAC,EAAEwS,EAAYD,CAAC,EAAI,CAC7B,KAAQD,EACR,OAAUG,CACX,EACAL,EAAQxS,EAAEI,CAAC,EAAE,IAAMzC,EAItB+U,EAAQA,EAAM,WACf,CAEF,CAWA,SAASrQ,GAAkBnB,EAAW6R,EAASP,EAC/C,CACC,IAAIQ,EAAU,CAAC,EACTR,IAELA,EAAUtR,EAAU,SACf6R,IAEJP,EAAU,CAAC,EACXpQ,GAAiBoQ,EAASO,CAAQ,IAIpC,QAAU/S,EAAE,EAAGC,EAAKuS,EAAQ,OAASxS,EAAEC,EAAOD,IAE7C,QAAUE,EAAE,EAAGC,EAAKqS,EAAQxS,CAAC,EAAE,OAASE,EAAEC,EAAOD,IAE3CsS,EAAQxS,CAAC,EAAEE,CAAC,EAAE,SAChB,CAAC8S,EAAQ9S,CAAC,GAAK,CAACgB,EAAU,iBAE5B8R,EAAQ9S,CAAC,EAAIsS,EAAQxS,CAAC,EAAEE,CAAC,EAAE,MAK9B,OAAO8S,CACR,CAMA,SAASpD,GAAU1O,EACnB,CACC,IAAIkP,EAAc7M,GAAerC,CAAU,GAAK,MAC5C+R,EAAoB/R,EAAU,kBAG7B+R,IAAsB,QAAaA,IAAsB,KAE7D/R,EAAU,eAAiBkP,EAC1B6C,EACAA,GAAqB/R,EAAU,iBAAiB,EAC/C,EACA+R,EAEF/R,EAAU,kBAAoB,GAEhC,CAWA,SAASgS,GAAchS,EAAW/D,EAAMwC,EACxC,CAMC,GAJAiC,GAAiBV,EAAW,iBAAkB,eAAgB,CAAC/D,CAAI,CAAE,EAIhEA,GAAQ,MAAM,QAAQA,CAAI,EAAI,CAClC,IAAIsE,EAAM,CAAC,EACP0R,EAAW,aAEf3W,EAAE,KAAMW,EAAM,SAAUyK,EAAKvE,EAAK,CACjC,IAAI8E,EAAQ9E,EAAI,KAAK,MAAM8P,CAAQ,EAEnC,GAAKhL,EAAQ,CAEZ,IAAIxF,EAAOwF,EAAM,CAAC,EAEX1G,EAAKkB,CAAK,IAChBlB,EAAKkB,CAAK,EAAI,CAAC,GAEhBlB,EAAKkB,CAAK,EAAE,KAAMU,EAAI,KAAM,CAC7B,MAEC5B,EAAI4B,EAAI,IAAI,EAAIA,EAAI,KAEtB,CAAE,EACFlG,EAAOsE,CACR,CAEA,IAAI2R,EACAC,EAAOnS,EAAU,KACjBoS,EAAWpS,EAAU,UACrBrD,EAAW,SAAW8D,EAAO,CAChC,IAAI4R,EAASrS,EAAU,MACpBA,EAAU,MAAM,OAChB,MAEES,IAAS,MAAS,OAAO4R,GAAW,UAAYA,GAAU,OAC9D5R,EAAO,CAAC,EACR6R,GAAgBtS,EAAWS,EAAM,CAAC,CAAE,GAGrC,IAAI8R,EAAQ9R,EAAK,OAASA,EAAK,OAC1B8R,GACJ/S,GAAQQ,EAAW,EAAGuS,CAAM,EAG7BvS,EAAU,KAAOS,EAEjBC,GAAiBV,EAAW,KAAM,MAAO,CAACA,EAAWS,EAAMT,EAAU,KAAK,CAAE,EAC5EvB,EAAIgC,CAAK,CACV,EAEA,GAAKnF,EAAE,cAAe6W,CAAK,GAAKA,EAAK,KACrC,CACCD,EAAWC,EAAK,KAEhB,IAAIK,EAAU,OAAON,GAAa,WACjCA,EAAUjW,EAAM+D,CAAU,EAC1BkS,EAGDjW,EAAO,OAAOiW,GAAa,YAAcM,EACxCA,EACAlX,EAAE,OAAQ,GAAMW,EAAMuW,CAAQ,EAI/B,OAAOL,EAAK,IACb,CAEA,IAAIM,EAAW,CACd,KAAQxW,EACR,QAAWU,EACX,SAAY,OACZ,MAAS,GACT,KAAQqD,EAAU,cAClB,MAAS,SAAU0S,EAAKH,EAAOI,EAAQ,CACtC,IAAIC,EAAMlS,GAAiBV,EAAW,KAAM,MAAO,CAACA,EAAW,KAAMA,EAAU,KAAK,CAAE,EAEjF1E,EAAE,QAAS,GAAMsX,CAAI,IAAM,KAC1BL,GAAS,cACb/S,GAAQQ,EAAW,EAAG,wBAAyB,CAAE,EAExC0S,EAAI,aAAe,GAC5BlT,GAAQQ,EAAW,EAAG,aAAc,CAAE,GAIxC4O,GAAsB5O,EAAW,EAAM,CACxC,CACD,EAGAA,EAAU,UAAY/D,EAGtByE,GAAiBV,EAAW,KAAM,SAAU,CAACA,EAAW/D,CAAI,CAAE,EAEzD+D,EAAU,aAGdA,EAAU,aAAa,KAAMoS,EAC5BpS,EAAU,YACV1E,EAAE,IAAKW,EAAM,SAAUkG,EAAKuE,EAAK,CAChC,MAAO,CAAE,KAAMA,EAAK,MAAOvE,CAAI,CAChC,CAAE,EACFxF,EACAqD,CACD,EAESA,EAAU,aAAe,OAAOmS,GAAS,SAGlDnS,EAAU,MAAQ1E,EAAE,KAAMA,EAAE,OAAQmX,EAAU,CAC7C,IAAKN,GAAQnS,EAAU,WACxB,CAAE,CAAE,EAEK,OAAOmS,GAAS,WAGzBnS,EAAU,MAAQmS,EAAK,KAAMC,EAAUnW,EAAMU,EAAUqD,CAAU,GAKjEA,EAAU,MAAQ1E,EAAE,KAAMA,EAAE,OAAQmX,EAAUN,CAAK,CAAE,EAGrDA,EAAK,KAAOD,EAEd,CASA,SAAS5C,GAAehT,EACxB,CACCA,EAAS,QACTsS,GAAsBtS,EAAU,EAAK,EAErC0V,GACC1V,EACAuW,GAAmBvW,CAAS,EAC5B,SAASmE,EAAM,CACdqS,GAAmBxW,EAAUmE,CAAK,CACnC,CACD,CACD,CAcA,SAASoS,GAAmBvW,EAC5B,CACC,IACCmN,EAAUnN,EAAS,UACnByW,EAActJ,EAAQ,OACtB7H,EAAWtF,EAAS,UACpB0W,EAAY1W,EAAS,gBACrB2W,EAAe3W,EAAS,gBACxBwC,EAAG7C,EAAO,CAAC,EAAGiX,EAAUxF,EAAQyF,EAChCzR,EAAOO,GAAgB3F,CAAS,EAChC8W,EAAe9W,EAAS,eACxB+W,EAAgBzR,EAAS,YAAc,GACtCtF,EAAS,gBACT,GAEEgX,EAAQ,SAAW7R,GAAM+G,EAAQ,CACpCvM,EAAK,KAAM,CAAE,KAAQwF,GAAM,MAAS+G,CAAM,CAAE,CAC7C,EAGA8K,EAAO,QAAkBhX,EAAS,KAAM,EACxCgX,EAAO,WAAkBP,CAAY,EACrCO,EAAO,WAAkBjP,GAAQoF,EAAS,OAAQ,EAAE,KAAK,GAAG,CAAE,EAC9D6J,EAAO,gBAAkBF,CAAa,EACtCE,EAAO,iBAAkBD,CAAc,EAGvC,IAAI9P,EAAI,CACP,KAASjH,EAAS,MAClB,QAAS,CAAC,EACV,MAAS,CAAC,EACV,MAAS8W,EACT,OAASC,EACT,OAAS,CACR,MAAOL,EAAU,QACjB,MAAOA,EAAU,MAClB,CACD,EAEA,IAAMlU,EAAE,EAAIA,EAAEiU,EAAcjU,IAC3B4O,EAASjE,EAAQ3K,CAAC,EAClBqU,EAAeF,EAAanU,CAAC,EAC7BoU,EAAW,OAAOxF,EAAO,OAAO,WAAa,WAAaA,EAAO,MAEjEnK,EAAE,QAAQ,KAAM,CACf,KAAY2P,EACZ,KAAYxF,EAAO,MACnB,WAAYA,EAAO,YACnB,UAAYA,EAAO,UACnB,OAAY,CACX,MAAOyF,EAAa,QACpB,MAAOA,EAAa,MACrB,CACD,CAAE,EAEFG,EAAO,aAAaxU,EAAGoU,CAAS,EAE3BtR,EAAS,UACb0R,EAAO,WAAWxU,EAAOqU,EAAa,OAAQ,EAC9CG,EAAO,UAAUxU,EAAQqU,EAAa,MAAO,EAC7CG,EAAO,eAAexU,EAAG4O,EAAO,WAAY,GAGxC9L,EAAS,OACb0R,EAAO,aAAaxU,EAAG4O,EAAO,SAAU,EAIrC9L,EAAS,UACb0R,EAAO,UAAWN,EAAU,OAAQ,EACpCM,EAAO,SAAUN,EAAU,MAAO,GAG9BpR,EAAS,QACbtG,EAAE,KAAMoG,EAAM,SAAW5C,GAAGqD,EAAM,CACjCoB,EAAE,MAAM,KAAM,CAAE,OAAQpB,EAAI,IAAK,IAAKA,EAAI,GAAI,CAAE,EAEhDmR,EAAO,YAAYxU,GAAGqD,EAAI,GAAI,EAC9BmR,EAAO,YAAYxU,GAAGqD,EAAI,GAAI,CAC/B,CAAE,EAEFmR,EAAO,eAAgB5R,EAAK,MAAO,GAKpC,IAAI6R,EAAS/X,GAAU,IAAI,OAAO,KAClC,OAAK+X,IAAW,KACRjX,EAAS,YAAcL,EAAOsH,EAK/BgQ,EAAStX,EAAOsH,CACxB,CAcA,SAASuP,GAAoBxW,EAAUmE,EACvC,CAGC,IAAI+S,EAAS,SAAW1L,EAAK2L,EAAS,CACrC,OAAOhT,EAAKqH,CAAG,IAAM,OAAYrH,EAAKqH,CAAG,EAAIrH,EAAKgT,CAAM,CACzD,EAEIxX,EAAOqW,GAAgBhW,EAAUmE,CAAK,EACtCmL,EAAkB4H,EAAQ,QAAwB,MAAO,EACzDE,EAAkBF,EAAQ,gBAAwB,cAAe,EACjEG,EAAkBH,EAAQ,uBAAwB,iBAAkB,EAExE,GAAK5H,IAAS,OAAY,CAEzB,GAAKA,EAAK,EAAItP,EAAS,MACtB,OAEDA,EAAS,MAAQsP,EAAO,CACzB,CAGO3P,IACNA,EAAO,CAAC,GAGTkQ,GAAe7P,CAAS,EACxBA,EAAS,eAAmB,SAASoX,EAAc,EAAE,EACrDpX,EAAS,iBAAmB,SAASqX,EAAiB,EAAE,EAExD,QAAU7U,EAAE,EAAG2F,EAAIxI,EAAK,OAAS6C,EAAE2F,EAAM3F,IACxC4D,GAAYpG,EAAUL,EAAK6C,CAAC,CAAE,EAE/BxC,EAAS,UAAYA,EAAS,gBAAgB,MAAM,EAEpDkS,GAASlS,EAAU,EAAK,EAEjBA,EAAS,gBACfsX,GAAiBtX,EAAUmE,CAAK,EAGjCmO,GAAsBtS,EAAU,EAAM,CACvC,CAWC,SAASgW,GAAiBtS,EAAWS,EAAMoT,EAC3C,CACA,IAAIC,EAAUxY,EAAE,cAAe0E,EAAU,IAAK,GAAKA,EAAU,KAAK,UAAY,OAC7EA,EAAU,KAAK,QACfA,EAAU,cAEX,GAAK,CAAE6T,EACN,OAAKC,IAAY,OAGTrT,EAAK,QAAUA,EAAKqT,CAAO,EAG5BA,IAAY,GAClB1T,GAAoB0T,CAAQ,EAAGrT,CAAK,EACpCA,EAIF4I,GAAoByK,CAAQ,EAAGrT,EAAMoT,CAAM,CAC5C,CAQA,SAAS9C,GAAuBzU,EAChC,CACC,IAAIsR,EAAUtR,EAAS,SACnByX,EAAUzX,EAAS,SACnB0X,EAAW1X,EAAS,UACpB2X,EAAiB3X,EAAS,gBAC1BsF,EAAWtF,EAAS,YACpB4X,EAAQ,+BAA+BtG,EAAQ,aAAa,MAE5D3B,EAAM+H,EAAS,QACnB/H,EAAMA,EAAI,MAAM,SAAS,EACxBA,EAAI,QAAQ,UAAWiI,CAAK,EAC5BjI,EAAIiI,EAEL,IAAIvS,EAASrG,EAAE,SAAU,CACvB,GAAQsG,EAAS,EAAwB,KAApBmS,EAAQ,UAC7B,MAASnG,EAAQ,OAClB,CAAE,EACD,OAAQtS,EAAE,UAAW,EAAE,OAAQ2Q,CAAI,CAAE,EAEnCkI,EAAW,SAASC,EAAO,CAE9B,IAAIjM,EAAIvG,EAAS,EACbO,EAAO,KAAK,MAAa,KAAK,MAAV,GACrB8R,EAAe,QAAUG,EAAM,MAAQ,SAIrCjS,GAAO8R,EAAe,UAC1B/D,GAAmB5T,EAAU,CAC5B,QAAW6F,EACX,OAAU8R,EAAe,OACzB,OAAUA,EAAe,OACzB,iBAAoBA,EAAe,iBACnC,OAAUA,EAAe,MAC1B,CAAE,EAGF3X,EAAS,eAAiB,EAC1BkS,GAASlS,CAAS,EAEpB,EAEI+X,EAAc/X,EAAS,cAAgB,KAC1CA,EAAS,YACT+F,GAAe/F,CAAS,IAAM,MAC7B,IACA,EAEEgY,EAAWhZ,EAAE,QAASqG,CAAM,EAC9B,IAAKsS,EAAe,OAAQ,EAC5B,KAAM,cAAeD,EAAS,kBAAmB,EACjD,GACA,8CACAK,EACCE,GAAaJ,EAAUE,CAAY,EACnCF,CACF,EACC,GAAI,UAAW,SAASK,EAAG,CAI3B,WAAY,UAAY,CACvBL,EAAS,KAAKG,EAAS,CAAC,EAAGE,CAAC,CAC7B,EAAG,EAAE,CACN,CAAE,EACD,GAAI,cAAe,SAASA,EAAG,CAE/B,GAAKA,EAAE,SAAW,GACjB,MAAO,EAET,CAAE,EACD,KAAK,gBAAiBT,CAAO,EAG/B,OAAAzY,EAAEgB,EAAS,MAAM,EAAE,GAAI,eAAgB,SAAWmY,EAAI5U,EAAI,CACzD,GAAKvD,IAAauD,EAGjB,GAAI,CACEyU,EAAS,CAAC,IAAM,SAAS,eAC7BA,EAAS,IAAKL,EAAe,OAAQ,CAEvC,OACQO,EAAI,CAAC,CAEf,CAAE,EAEK7S,EAAO,CAAC,CAChB,CAUA,SAASuO,GAAoBlQ,EAAW0U,EAAQC,EAChD,CACC,IAAIC,EAAc5U,EAAU,gBACxB6U,EAAe7U,EAAU,gBACzB8U,EAAe,SAAWC,EAAU,CAEvCH,EAAY,QAAUG,EAAQ,QAC9BH,EAAY,OAASG,EAAQ,OAC7BH,EAAY,OAASG,EAAQ,OAC7BH,EAAY,iBAAmBG,EAAQ,iBACvCH,EAAY,OAASG,EAAQ,MAC9B,EACIC,EAAU,SAAWrW,EAAI,CAE5B,OAAOA,EAAE,eAAiB,OAAY,CAACA,EAAE,aAAeA,EAAE,MAC3D,EAOA,GAHAyL,GAAgBpK,CAAU,EAGrBqC,GAAerC,CAAU,GAAK,MACnC,CAECiV,GAAWjV,EAAW0U,EAAO,QAASC,EAAQK,EAAQN,CAAM,EAAGA,EAAO,OAAQA,EAAO,iBAAkBA,EAAO,MAAO,EACrHI,EAAcJ,CAAO,EAGrB,QAAU5V,EAAE,EAAIA,EAAE+V,EAAa,OAAS/V,IAEvCoW,GAAiBlV,EAAW6U,EAAa/V,CAAC,EAAE,QAASA,EAAGkW,EAAQH,EAAa/V,CAAC,CAAC,EAC9E+V,EAAa/V,CAAC,EAAE,OAAQ+V,EAAa/V,CAAC,EAAE,gBAAiB,EAI3DqW,GAAiBnV,CAAU,CAC5B,MAGC8U,EAAcJ,CAAO,EAItB1U,EAAU,UAAY,GACtBU,GAAiBV,EAAW,KAAM,SAAU,CAACA,CAAS,CAAE,CACzD,CAQA,SAASmV,GAAiB7Y,EAC1B,CAKC,QAJI8Y,EAAU5Z,GAAU,IAAI,OACxB6Z,EAAc/Y,EAAS,UACvBqK,EAAK+E,EAEC5M,EAAE,EAAG2F,EAAI2Q,EAAQ,OAAStW,EAAE2F,EAAM3F,IAAM,CAIjD,QAHI1C,EAAO,CAAC,EAGF4C,EAAE,EAAGsL,EAAI+K,EAAY,OAASrW,EAAEsL,EAAMtL,IAC/C0M,EAAS2J,EAAarW,CAAE,EACxB2H,EAAMrK,EAAS,OAAQoP,CAAO,EAEzB0J,EAAQtW,CAAC,EAAGxC,EAAUqK,EAAI,aAAc+E,EAAQ/E,EAAI,OAAQ3H,CAAE,GAClE5C,EAAK,KAAMsP,CAAO,EAMpB2J,EAAY,OAAS,EACrB/Z,EAAE,MAAO+Z,EAAajZ,CAAK,CAC5B,CACD,CAaA,SAAS8Y,GAAkB5Y,EAAUgZ,EAAW3J,EAAQ4J,EAAOC,EAAOC,EACtE,CACC,GAAKH,IAAc,GASnB,SALIrZ,EACAuI,EAAM,CAAC,EACPkR,EAAUpZ,EAAS,UACnBqZ,EAAWC,GAAuBN,EAAWC,EAAOC,EAAOC,CAAgB,EAErE3W,EAAE,EAAIA,EAAE4W,EAAQ,OAAS5W,IAClC7C,EAAOK,EAAS,OAAQoZ,EAAQ5W,CAAC,CAAE,EAAE,aAAc6M,CAAO,EAErDgK,EAAS,KAAM1Z,CAAK,GACxBuI,EAAI,KAAMkR,EAAQ5W,CAAC,CAAE,EAIvBxC,EAAS,UAAYkI,EACtB,CAaA,SAASyQ,GAAW3Y,EAAU4X,EAAO7M,EAAOkO,EAAOC,EAAOC,EAC1D,CACC,IAAIE,EAAWC,GAAuB1B,EAAOqB,EAAOC,EAAOC,CAAgB,EACvEI,EAAavZ,EAAS,gBAAgB,QACtCwZ,EAAgBxZ,EAAS,gBACzBoZ,EAASK,EAAajX,EACtBkX,EAAW,CAAC,EAWhB,GARKxa,GAAU,IAAI,OAAO,SAAW,IACpC6L,EAAQ,IAIT0O,EAAcE,GAAe3Z,CAAS,EAGjC4X,EAAM,QAAU,EACpB5X,EAAS,UAAYwZ,EAAc,MAAM,MAErC,CAgBJ,KAdKC,GACH1O,GACAkO,GACAM,EAAW,OAAS3B,EAAM,QAC1BA,EAAM,QAAQ2B,CAAU,IAAM,GAC9BvZ,EAAS,WAGVA,EAAS,UAAYwZ,EAAc,MAAM,GAI1CJ,EAAUpZ,EAAS,UAEbwC,EAAE,EAAIA,EAAE4W,EAAQ,OAAS5W,IACzB6W,EAAS,KAAMrZ,EAAS,OAAQoZ,EAAQ5W,CAAC,CAAE,EAAE,WAAY,GAC7DkX,EAAS,KAAMN,EAAQ5W,CAAC,CAAE,EAI5BxC,EAAS,UAAY0Z,CACtB,CACD,CAYA,SAASJ,GAAuBrQ,EAAQgQ,EAAOC,EAAOC,EACtD,CAKC,GAJAlQ,EAASgQ,EACRhQ,EACA1B,GAAgB0B,CAAO,EAEnBiQ,EAAQ,CAQZ,IAAIhU,EAAIlG,EAAE,IAAKiK,EAAO,MAAO,gBAAiB,GAAK,CAAC,EAAE,EAAG,SAAW2Q,EAAO,CAC1E,GAAKA,EAAK,OAAO,CAAC,IAAM,IAAM,CAC7B,IAAI,EAAIA,EAAK,MAAO,UAAW,EAC/BA,EAAO,EAAI,EAAE,CAAC,EAAIA,CACnB,CAEA,OAAOA,EAAK,QAAQ,IAAK,EAAE,CAC5B,CAAE,EAEF3Q,EAAS,UAAU/D,EAAE,KAAM,SAAU,EAAE,MACxC,CAEA,OAAO,IAAI,OAAQ+D,EAAQkQ,EAAkB,IAAM,EAAG,CACvD,CASA,IAAI5R,GAAiBrI,GAAU,KAAK,YAEhC2a,GAAe7a,EAAE,OAAO,EAAE,CAAC,EAC3B8a,GAA2BD,GAAa,cAAgB,OAG5D,SAASF,GAAgB3Z,EACzB,CACC,IAAImN,EAAUnN,EAAS,UACnBoR,EACA,EAAG1O,EAAGyF,EAAK6F,EAAK+L,EAAYvK,EAAUnF,EACtC2P,EAAiB,GAErB,IAAM,EAAE,EAAG7R,EAAInI,EAAS,OAAO,OAAS,EAAEmI,EAAM,IAG/C,GAFAkC,EAAMrK,EAAS,OAAO,CAAC,EAElB,CAAEqK,EAAI,aAAe,CAGzB,IAFA0P,EAAa,CAAC,EAERrX,EAAE,EAAGsL,EAAIb,EAAQ,OAASzK,EAAEsL,EAAMtL,IACvC0O,EAASjE,EAAQzK,CAAC,EAEb0O,EAAO,aACX5B,EAAWpB,GAAgBpO,EAAU,EAAG0C,EAAG,QAAS,EAI/C8M,IAAa,OACjBA,EAAW,IAGP,OAAOA,GAAa,UAAYA,EAAS,WAC7CA,EAAWA,EAAS,SAAS,IAI9BA,EAAW,GAOPA,EAAS,SAAWA,EAAS,QAAQ,GAAG,IAAM,KAClDqK,GAAa,UAAYrK,EACzBA,EAAWsK,GACVD,GAAa,YACbA,GAAa,WAGVrK,EAAS,UACbA,EAAWA,EAAS,QAAQ,gBAAiB,EAAE,GAGhDuK,EAAW,KAAMvK,CAAS,EAG3BnF,EAAI,aAAe0P,EACnB1P,EAAI,YAAc0P,EAAW,KAAK,IAAI,EACtCC,EAAiB,EAClB,CAGD,OAAOA,CACR,CAUA,SAASC,GAAmBC,EAC5B,CACC,MAAO,CACN,OAAiBA,EAAI,QACrB,MAAiBA,EAAI,OACrB,MAAiBA,EAAI,OACrB,gBAAiBA,EAAI,gBACtB,CACD,CAWA,SAASC,GAAkBD,EAC3B,CACC,MAAO,CACN,QAAkBA,EAAI,OACtB,OAAkBA,EAAI,MACtB,OAAkBA,EAAI,MACtB,iBAAkBA,EAAI,eACvB,CACD,CAQA,SAAStF,GAAqB5U,EAC9B,CACC,IACCoa,EAAMpa,EAAS,SACfqa,EAAQra,EAAS,YAAY,EAC7B6L,EAAI7M,EAAE,SAAU,CACf,MAASgB,EAAS,SAAS,MAC3B,GAAQqa,EAAsB,KAAdD,EAAI,OACrB,CAAE,EAEH,OAAOC,IAENra,EAAS,eAAe,KAAM,CAC7B,GAAMsa,GACN,MAAS,aACV,CAAE,EAEFzO,EACE,KAAM,OAAQ,QAAS,EACvB,KAAM,YAAa,QAAS,EAG9B7M,EAAEgB,EAAS,MAAM,EAAE,KAAM,mBAAoBoa,EAAI,OAAQ,GAGnDvO,EAAE,CAAC,CACX,CAQA,SAASyO,GAAgBta,EACzB,CAEC,IAAIqa,EAAQra,EAAS,YAAY,EACjC,GAAKqa,EAAM,SAAW,EAItB,KACCpP,EAAQjL,EAAS,UACjBuI,EAAQvI,EAAS,eAAe,EAChCwI,EAAQxI,EAAS,aAAa,EAC9Bua,EAAQva,EAAS,eAAe,EAChCwa,EAAQxa,EAAS,iBAAiB,EAClCkI,EAAQsS,EACPvP,EAAK,MACLA,EAAK,WAEFuP,IAAUD,IAEdrS,GAAO,IAAM+C,EAAK,eAInB/C,GAAO+C,EAAK,aACZ/C,EAAMuS,GAAeza,EAAUkI,CAAI,EAEnC,IAAI7H,EAAW4K,EAAK,eACf5K,IAAa,OACjB6H,EAAM7H,EAAS,KAAML,EAAS,UAC7BA,EAAUuI,EAAOC,EAAK+R,EAAKC,EAAOtS,CACnC,GAGDlJ,EAAEqb,CAAK,EAAE,KAAMnS,CAAI,EACpB,CAGA,SAASuS,GAAgBza,EAAU2P,EACnC,CAGC,IACC+K,EAAa1a,EAAS,eACtBuI,EAAavI,EAAS,eAAe,EACrCkC,EAAalC,EAAS,gBACtB4N,EAAa5N,EAAS,iBAAiB,EACvC2a,EAAazY,IAAQ,GAEtB,OAAOyN,EACN,QAAQ,WAAY+K,EAAU,KAAM1a,EAAUuI,CAAM,CAAE,EACtD,QAAQ,SAAYmS,EAAU,KAAM1a,EAAUA,EAAS,aAAa,CAAE,CAAE,EACxE,QAAQ,SAAY0a,EAAU,KAAM1a,EAAUA,EAAS,eAAe,CAAE,CAAE,EAC1E,QAAQ,WAAY0a,EAAU,KAAM1a,EAAU4N,CAAI,CAAE,EACpD,QAAQ,UAAY8M,EAAU,KAAM1a,EAAU2a,EAAM,EAAI,KAAK,KAAMpS,EAAQrG,CAAI,CAAE,CAAE,EACnF,QAAQ,WAAYwY,EAAU,KAAM1a,EAAU2a,EAAM,EAAI,KAAK,KAAM/M,EAAM1L,CAAI,CAAE,CAAE,CACnF,CASA,SAASmC,GAAgBrE,EACzB,CACC,IAAIwC,EAAGC,EAAMmY,EAAW5a,EAAS,kBAC7BmN,EAAUnN,EAAS,UAAWoR,EAC9B9L,EAAWtF,EAAS,UACpB6a,EAAe7a,EAAS,cAG5B,GAAK,CAAEA,EAAS,aAAe,CAC9B,WAAY,UAAU,CAAEqE,GAAerE,CAAS,CAAG,EAAG,GAAI,EAC1D,MACD,CAkBA,IAfA6T,GAAmB7T,CAAS,EAG5BmR,GAAcnR,CAAS,EACvByR,GAAazR,EAAUA,EAAS,QAAS,EACzCyR,GAAazR,EAAUA,EAAS,QAAS,EAGzCsS,GAAsBtS,EAAU,EAAK,EAGhCsF,EAAS,YACb8H,GAA0BpN,CAAS,EAG9BwC,EAAE,EAAGC,EAAK0K,EAAQ,OAAS3K,EAAEC,EAAOD,IACzC4O,EAASjE,EAAQ3K,CAAC,EAEb4O,EAAO,SACXA,EAAO,IAAI,MAAM,MAAQ0J,GAAgB1J,EAAO,MAAO,GAIzDhN,GAAiBpE,EAAU,KAAM,UAAW,CAACA,CAAQ,CAAE,EAMvDyT,GAAWzT,CAAS,EAGpB,IAAIwX,EAAUzR,GAAe/F,CAAS,GACjCwX,GAAW,OAASqD,KAEnBrD,GAAW,OACf9B,GAAc1V,EAAU,CAAC,EAAG,SAASmE,EAAM,CAC1C,IAAI4W,EAAQ/E,GAAgBhW,EAAUmE,CAAK,EAG3C,IAAM3B,EAAE,EAAIA,EAAEuY,EAAM,OAASvY,IAC5B4D,GAAYpG,EAAU+a,EAAMvY,CAAC,CAAE,EAMhCxC,EAAS,kBAAoB4a,EAE7BnH,GAAWzT,CAAS,EAEpBsS,GAAsBtS,EAAU,EAAM,EACtCsX,GAAiBtX,EAAUmE,CAAK,CACjC,EAAGnE,CAAS,GAGZsS,GAAsBtS,EAAU,EAAM,EACtCsX,GAAiBtX,CAAS,GAG7B,CAUA,SAASsX,GAAkBtX,EAAUmE,EACrC,CACCnE,EAAS,eAAiB,IAIrBmE,GAAQnE,EAAS,MAAM,SAC3BkN,GAAuBlN,CAAS,EAGjCoE,GAAiBpE,EAAU,KAAM,cAAe,CAACA,EAAUmE,CAAI,CAAE,EACjEC,GAAiBpE,EAAU,iBAAkB,OAAQ,CAACA,EAAUmE,CAAI,CAAE,CACvE,CAGA,SAAS6W,GAAkBhb,EAAU6F,EACrC,CACC,IAAI3D,EAAM,SAAU2D,EAAK,EAAG,EAC5B7F,EAAS,gBAAkBkC,EAE3B+Y,GAAmBjb,CAAS,EAG5BoE,GAAiBpE,EAAU,KAAM,SAAU,CAACA,EAAUkC,CAAG,CAAE,CAC5D,CASA,SAASsS,GAAuBxU,EAChC,CAeC,QAbCsR,EAAWtR,EAAS,SACpByX,EAAWzX,EAAS,SACpBkb,EAAWlb,EAAS,YACpBmb,EAAW,MAAM,QAASD,EAAK,CAAC,CAAE,EAClCE,EAAWD,EAAKD,EAAK,CAAC,EAAIA,EAC1BxD,EAAWyD,EAAKD,EAAK,CAAC,EAAIA,EAEvBG,EAASrc,EAAE,YAAa,CAC3B,KAAiByY,EAAQ,UACzB,gBAAiBA,EACjB,MAAiBnG,EAAQ,aAC1B,CAAE,EAEQ9O,EAAE,EAAG2F,EAAIiT,EAAQ,OAAS5Y,EAAE2F,EAAM3F,IAC3C6Y,EAAO,CAAC,EAAG7Y,CAAE,EAAI,IAAI,OACpB,OAAOkV,EAASlV,CAAC,GAAM,SACtBxC,EAAS,eAAgB0X,EAASlV,CAAC,CAAE,EACrCkV,EAASlV,CAAC,EACX4Y,EAAQ5Y,CAAC,CACV,EAGD,IAAI8Y,EAAMtc,EAAE,qBAAqB,EAAE,SAAUsS,EAAQ,OAAQ,EAC7D,OAAOtR,EAAS,YAAY,IAC3Bsb,EAAI,CAAC,EAAE,GAAK7D,EAAQ,WAGrB6D,EAAI,SAAS,EAAE,OACdtb,EAAS,UAAU,YAAY,QAAS,SAAUqb,EAAO,CAAC,EAAE,SAAU,CACvE,EAIArc,EAAE,SAAUsc,CAAG,EACb,IAAKtb,EAAS,eAAgB,EAC9B,GAAI,YAAa,SAASkY,EAAG,CAC7B8C,GAAiBhb,EAAUhB,EAAE,IAAI,EAAE,IAAI,CAAE,EACzCkT,GAASlS,CAAS,CACnB,CAAE,EAGHhB,EAAEgB,EAAS,MAAM,EAAE,GAAI,eAAgB,SAAUkY,EAAG3U,EAAGrB,EAAK,CACtDlC,IAAauD,GACjBvE,EAAE,SAAUsc,CAAG,EAAE,IAAKpZ,CAAI,CAE5B,CAAE,EAEKoZ,EAAI,CAAC,CACb,CAeA,SAASzG,GAAyB7U,EAClC,CACC,IACCgB,EAAShB,EAAS,gBAClBub,EAASrc,GAAU,IAAI,MAAO8B,CAAK,EACnCmW,EAAS,OAAOoE,GAAW,WAC3B3b,EAAS,SAAUI,EAAW,CAC7BkS,GAASlS,CAAS,CACnB,EACAkB,EAAOlC,EAAE,QAAQ,EAAE,SAAUgB,EAAS,SAAS,QAAUgB,CAAK,EAAE,CAAC,EACjEsE,EAAWtF,EAAS,YAErB,OAAOmX,GACNoE,EAAO,OAAQvb,EAAUkB,EAAMtB,CAAO,EAIhC0F,EAAS,IAEfpE,EAAK,GAAKlB,EAAS,SAAS,YAE5BA,EAAS,eAAe,KAAM,CAC7B,GAAM,SAAUA,EAAW,CAC1B,GAAKmX,EAAS,CACb,IACC5O,EAAavI,EAAS,eACtBkC,EAAalC,EAAS,gBACtBwb,EAAaxb,EAAS,iBAAiB,EACvC2a,EAAazY,IAAQ,GACrBuZ,EAAOd,EAAM,EAAI,KAAK,KAAMpS,EAAQrG,CAAI,EACxCwZ,EAAQf,EAAM,EAAI,KAAK,KAAMa,EAAatZ,CAAI,EAC9CyZ,EAAUJ,EAAOE,EAAMC,CAAK,EAC5BlZ,EAAG2F,EAEJ,IAAM3F,EAAE,EAAG2F,EAAI7C,EAAS,EAAE,OAAS9C,EAAE2F,EAAM3F,IAC1CgP,GAAaxR,EAAU,YAAa,EACnCA,EAAUsF,EAAS,EAAE9C,CAAC,EAAGA,EAAGmZ,EAASF,EAAMC,CAC5C,CAEF,MAECH,EAAO,SAAUvb,EAAUJ,CAAO,CAEpC,EACA,MAAS,YACV,CAAE,GAGIsB,CACR,CAYA,SAAS0a,GAAgB5b,EAAU6b,EAAQjc,EAC3C,CACC,IACC2I,EAAYvI,EAAS,eACrBkC,EAAYlC,EAAS,gBACrB8b,EAAY9b,EAAS,iBAAiB,EAElC8b,IAAY,GAAK5Z,IAAQ,GAE7BqG,EAAQ,EAEC,OAAOsT,GAAW,UAE3BtT,EAAQsT,EAAS3Z,EAEZqG,EAAQuT,IAEZvT,EAAQ,IAGAsT,GAAU,QAEnBtT,EAAQ,EAECsT,GAAU,YAEnBtT,EAAQrG,GAAO,EACdqG,EAAQrG,EACR,EAEIqG,EAAQ,IAEXA,EAAQ,IAGDsT,GAAU,OAEdtT,EAAQrG,EAAM4Z,IAElBvT,GAASrG,GAGD2Z,GAAU,OAEnBtT,EAAQ,KAAK,OAAQuT,EAAQ,GAAK5Z,CAAG,EAAIA,EAIzCgB,GAAQlD,EAAU,EAAG,0BAA0B6b,EAAQ,CAAE,EAG1D,IAAIE,EAAU/b,EAAS,iBAAmBuI,EAC1C,OAAAvI,EAAS,eAAiBuI,EAErBwT,GACJ3X,GAAiBpE,EAAU,KAAM,OAAQ,CAACA,CAAQ,CAAE,EAE/CJ,GACJsS,GAASlS,CAAS,GAKnBoE,GAAiBpE,EAAU,KAAM,UAAW,CAACA,CAAQ,CAAE,EAGjD+b,CACR,CAUA,SAASrH,GAA2B1U,EACpC,CACC,OAAOhB,EAAE,SAAU,CACjB,GAAQgB,EAAS,YAAY,EAAsC,KAAlCA,EAAS,SAAS,cACnD,MAASA,EAAS,SAAS,YAC3B,KAAQ,QACT,CAAE,EACD,KAAMA,EAAS,UAAU,WAAY,EACrC,OAAO,yDAAyD,EAChE,aAAcA,EAAS,MAAO,EAAE,CAAC,CACpC,CASA,SAASsS,GAAuBtS,EAAUgc,EAC1C,CACMhc,EAAS,UAAU,aACvBhB,EAAEgB,EAAS,YAAY,CAAC,EAAE,IAAK,UAAWgc,EAAO,QAAU,MAAO,EAGnE5X,GAAiBpE,EAAU,KAAM,aAAc,CAACA,EAAUgc,CAAI,CAAE,CACjE,CAQA,SAASrH,GAAsB3U,EAC/B,CACC,IAAI8T,EAAQ9U,EAAEgB,EAAS,MAAM,EAGzBC,EAASD,EAAS,QAEtB,GAAKC,EAAO,KAAO,IAAMA,EAAO,KAAO,GACtC,OAAOD,EAAS,OAGjB,IAAIic,EAAUhc,EAAO,GACjBic,EAAUjc,EAAO,GACjBqR,EAAUtR,EAAS,SACnBmc,EAAUrI,EAAM,SAAS,SAAS,EAClCsI,EAAcD,EAAQ,OAASA,EAAQ,CAAC,EAAE,aAAe,KACzDE,EAAcrd,EAAG8U,EAAM,CAAC,EAAE,UAAU,EAAK,CAAE,EAC3CwI,EAActd,EAAG8U,EAAM,CAAC,EAAE,UAAU,EAAK,CAAE,EAC3CyI,EAASzI,EAAM,SAAS,OAAO,EAC/B0I,EAAO,SACPC,EAAO,SAAWlZ,EAAI,CACzB,OAAQA,EAAWuX,GAAgBvX,CAAE,EAAzB,IACb,EAEOgZ,EAAO,SACbA,EAAS,MAmBV,IAAIG,EAAW1d,EAAGwd,EAAM,CAAE,MAASlL,EAAQ,cAAe,CAAE,EAC1D,OACAtS,EAAEwd,EAAM,CAAE,MAASlL,EAAQ,WAAY,CAAE,EACvC,IAAK,CACL,SAAU,SACV,SAAU,WACV,OAAQ,EACR,MAAO2K,EAAUQ,EAAKR,CAAO,EAAI,MAClC,CAAE,EACD,OACAjd,EAAEwd,EAAM,CAAE,MAASlL,EAAQ,gBAAiB,CAAE,EAC5C,IAAK,CACL,aAAc,cACd,MAAOrR,EAAO,SAAW,MAC1B,CAAE,EACD,OACAoc,EACE,WAAW,IAAI,EACf,IAAK,cAAe,CAAE,EACtB,OAAQD,IAAgB,MAAQD,EAAU,IAAK,EAC/C,OACArI,EAAM,SAAS,OAAO,CACvB,CACF,CACF,CACF,EACC,OACA9U,EAAEwd,EAAM,CAAE,MAASlL,EAAQ,WAAY,CAAE,EACvC,IAAK,CACL,SAAU,WACV,SAAU,OACV,MAAOmL,EAAMR,CAAQ,CACtB,CAAE,EACD,OAAQnI,CAAM,CACjB,EAEIyI,GACJG,EAAS,OACR1d,EAAEwd,EAAM,CAAE,MAASlL,EAAQ,WAAY,CAAE,EACvC,IAAK,CACL,SAAU,SACV,OAAQ,EACR,MAAO2K,EAAUQ,EAAKR,CAAO,EAAI,MAClC,CAAE,EACD,OACAjd,EAAEwd,EAAM,CAAE,MAASlL,EAAQ,gBAAiB,CAAE,EAC5C,OACAgL,EACE,WAAW,IAAI,EACf,IAAK,cAAe,CAAE,EACtB,OAAQF,IAAgB,SAAWD,EAAU,IAAK,EAClD,OACArI,EAAM,SAAS,OAAO,CACvB,CACF,CACF,CACF,EAGD,IAAI6I,EAAWD,EAAS,SAAS,EAC7BE,EAAaD,EAAS,CAAC,EACvBE,EAAaF,EAAS,CAAC,EACvBG,GAAaP,EAASI,EAAS,CAAC,EAAI,KAGxC,OAAKV,GACJjd,EAAE6d,CAAU,EAAE,GAAI,YAAa,SAAU3E,EAAG,CAC3C,IAAI6E,EAAa,KAAK,WAEtBH,EAAW,WAAaG,EAEnBR,IACJO,GAAW,WAAaC,EAE1B,CAAE,EAGH/d,EAAE6d,CAAU,EAAE,IAAI,aAAcX,CAAO,EACjCjc,EAAO,WACZjB,EAAE6d,CAAU,EAAE,IAAI,SAAUX,CAAO,EAGpClc,EAAS,YAAc4c,EACvB5c,EAAS,YAAc6c,EACvB7c,EAAS,YAAc8c,GAGvB9c,EAAS,eAAe,KAAM,CAC7B,GAAME,GACN,MAAS,WACV,CAAE,EAEKwc,EAAS,CAAC,CAClB,CAkBA,SAASxc,GAAgBF,EACzB,CAGC,IACCC,EAAiBD,EAAS,QAC1Bic,EAAiBhc,EAAO,GACxB+c,EAAiB/c,EAAO,QACxBic,EAAiBjc,EAAO,GACxBgd,EAAiBhd,EAAO,UACxBid,EAAiBle,EAAEgB,EAAS,WAAW,EACvCmd,EAAiBD,EAAU,CAAC,EAAE,MAC9BE,EAAiBF,EAAU,SAAS,KAAK,EACzCG,EAAsBD,EAAe,CAAC,EAAE,MACxCE,EAAiBF,EAAe,SAAS,OAAO,EAChDG,EAAiBvd,EAAS,YAC1Bwd,EAAiBxe,EAAEue,CAAS,EAC5BE,EAAiBF,EAAU,MAC3BG,EAAiB1e,EAAEgB,EAAS,WAAW,EACvC2d,EAAiBD,EAAU,SAAS,KAAK,EACzCE,EAAiBD,EAAe,SAAS,OAAO,EAChDE,GAAiB7e,EAAEgB,EAAS,MAAM,EAClC8T,EAAiB9U,EAAEgB,EAAS,MAAM,EAClC8d,EAAiBhK,EAAM,CAAC,EACxBiK,EAAiBD,EAAQ,MACzBvB,EAAiBvc,EAAS,OAAShB,EAAEgB,EAAS,MAAM,EAAI,KACxD4L,EAAiB5L,EAAS,SAC1Bge,GAAiBpS,EAAQ,gBACzBqS,GAAiBlW,GAAQ/H,EAAS,UAAW,KAAM,EACnDke,GAAcC,GACdC,GAAcC,GACdC,GAAYC,GACZC,GAAa,CAAC,EAAGC,GAAa,CAAC,EAC/BC,GAAc,CAAC,EAAGC,EAAc,CAAC,EACjC/N,GAAKgO,GAAYC,GACjBC,GAAU,SAASC,GAAQ,CAC1B,IAAIC,GAAQD,GAAO,MACnBC,GAAM,WAAa,IACnBA,GAAM,cAAgB,IACtBA,GAAM,eAAiB,IACvBA,GAAM,kBAAoB,IAC1BA,GAAM,OAAS,CAChB,EAKGC,GAAe1B,EAAU,aAAeA,EAAU,aAEtD,GAAKvd,EAAS,eAAiBif,IAAgBjf,EAAS,eAAiB,OAAY,CACpFA,EAAS,aAAeif,GACxB/R,GAAuBlN,CAAS,EAChC,MACD,MAECA,EAAS,aAAeif,GAQzBnL,EAAM,SAAS,cAAc,EAAE,OAAO,EAEjCyI,IACJgC,GAAahC,EAAO,MAAM,EAAE,UAAWzI,CAAM,EAC7CqK,GAAe5B,EAAO,KAAK,IAAI,EAC/B8B,GAAeE,GAAW,KAAK,IAAI,EACnCA,GAAW,KAAK,MAAM,EAAE,WAAW,IAAI,GAIxCD,GAAaT,GAAO,MAAM,EAAE,UAAW/J,CAAM,EAC7CoK,GAAeL,GAAO,KAAK,IAAI,EAC/BO,GAAeE,GAAW,KAAK,IAAI,EACnCA,GAAW,KAAK,QAAQ,EAAE,WAAW,UAAU,EAC/CA,GAAW,KAAK,MAAM,EAAE,WAAW,IAAI,EAUhCrC,IAENwB,EAAa,MAAQ,OACrBP,EAAU,CAAC,EAAE,MAAM,MAAQ,QAG5Ble,EAAE,KAAM6F,GAAiB7E,EAAUse,EAAW,EAAG,SAAW9b,GAAGgC,GAAK,CACnEoM,GAAMvD,GAAyBrN,EAAUwC,EAAE,EAC3CgC,GAAG,MAAM,MAAQxE,EAAS,UAAU4Q,EAAG,EAAE,MAC1C,CAAE,EAEG2L,GACJ2C,GAAoB,SAASrT,GAAG,CAC/BA,GAAE,MAAM,MAAQ,EACjB,EAAGwS,EAAa,EAIjBQ,GAAc/K,EAAM,WAAW,EAC1BmI,IAAY,IAEhB8B,EAAW,MAAQ,OAKdC,KAASlK,EAAM,KAAK,OAAO,EAAE,OAAO,EAAIyJ,EAAU,cACtDC,EAAQ,IAAI,YAAY,GAAK,YAE7BO,EAAW,MAAQjD,GAAgBhH,EAAM,WAAW,EAAImJ,CAAQ,GAIjE4B,GAAc/K,EAAM,WAAW,GAEtBkJ,IAAiB,KAE1Be,EAAW,MAAQjD,GAAekC,CAAY,EAG9C6B,GAAc/K,EAAM,WAAW,GAOhCoL,GAAoBJ,GAASV,EAAa,EAG1Cc,GAAoB,SAASH,GAAQ,CACpC,IAAIC,GAAQ,OAAO,iBAClB,OAAO,iBAAiBD,EAAM,EAAE,MAChCjE,GAAgB9b,EAAE+f,EAAM,EAAE,MAAM,CAAE,EAEnCL,GAAc,KAAMK,GAAO,SAAU,EACrCP,GAAa,KAAMQ,EAAM,CAC1B,EAAGZ,EAAa,EAGhBc,GAAoB,SAASC,GAAS3c,GAAG,CACxC2c,GAAQ,MAAM,MAAQX,GAAahc,EAAC,CACrC,EAAG0b,EAAa,EAEhBlf,EAAEof,EAAY,EAAE,IAAI,SAAU,CAAC,EAG1B7B,IAEJ2C,GAAoBJ,GAAST,EAAa,EAE1Ca,GAAoB,SAASH,GAAQ,CACpCJ,EAAc,KAAMI,GAAO,SAAU,EACrCN,GAAa,KAAM3D,GAAgB9b,EAAE+f,EAAM,EAAE,IAAI,OAAO,CAAE,CAAE,CAC7D,EAAGV,EAAa,EAEhBa,GAAoB,SAASC,GAAS3c,GAAG,CACxC2c,GAAQ,MAAM,MAAQV,GAAajc,EAAC,CACrC,EAAG2b,EAAa,EAEhBnf,EAAEqf,EAAY,EAAE,OAAO,CAAC,GAYzBa,GAAoB,SAASH,GAAQvc,GAAG,CACvCuc,GAAO,UAAY,kCAAkCL,GAAclc,EAAC,EAAE,SACtEuc,GAAO,WAAW,CAAC,EAAE,MAAM,OAAS,IACpCA,GAAO,WAAW,CAAC,EAAE,MAAM,SAAW,SACtCA,GAAO,MAAM,MAAQP,GAAahc,EAAC,CACpC,EAAG4b,EAAa,EAEX7B,GAEJ2C,GAAoB,SAASH,GAAQvc,GAAG,CACvCuc,GAAO,UAAY,kCAAkCJ,EAAcnc,EAAC,EAAE,SACtEuc,GAAO,WAAW,CAAC,EAAE,MAAM,OAAS,IACpCA,GAAO,WAAW,CAAC,EAAE,MAAM,SAAW,SACtCA,GAAO,MAAM,MAAQN,GAAajc,EAAC,CACpC,EAAG6b,EAAa,EAKZ,KAAK,MAAMvK,EAAM,WAAW,CAAC,EAAI,KAAK,MAAM+K,EAAW,GAG3DD,GAAerB,EAAU,aAAeA,EAAU,cACjDC,EAAQ,IAAI,YAAY,GAAK,SAC5BqB,GAAY5B,EACZ4B,GAGGb,KAAST,EAAU,aACvBA,EAAU,cAAgBC,EAAQ,IAAI,YAAY,GAAK,YAEvDO,EAAW,MAAQjD,GAAgB8D,GAAW3B,CAAS,IAInDhB,IAAY,IAAMe,IAAiB,KACvC9Z,GAAQlD,EAAU,EAAG,+BAAgC,CAAE,GAKxD4e,GAAa,OAIdnB,EAAa,MAAQ3C,GAAgB8D,EAAW,EAChDzB,EAAe,MAAQrC,GAAgB8D,EAAW,EAE7CrC,IACJvc,EAAS,YAAY,MAAM,MAAQ8a,GAAgB8D,EAAW,GAOxD1C,GAKD8B,KACJP,EAAa,OAAS3C,GAAgBgD,EAAQ,aAAab,CAAS,GAKtE,IAAImC,GAActL,EAAM,WAAW,EACnCwJ,EAAe,CAAC,EAAE,MAAM,MAAQxC,GAAgBsE,EAAY,EAC5D/B,EAAoB,MAAQvC,GAAgBsE,EAAY,EAIxD,IAAIC,GAAavL,EAAM,OAAO,EAAIyJ,EAAU,cAAgBC,EAAQ,IAAI,YAAY,GAAK,SACrF8B,GAAU,WAAa1T,EAAQ,eAAiB,OAAS,SAC7DyR,EAAqBiC,EAAQ,EAAID,GAAapC,EAAS,KAAO,MAEzDV,IACJqB,EAAe,CAAC,EAAE,MAAM,MAAQ9C,GAAgBsE,EAAY,EAC5DzB,EAAe,CAAC,EAAE,MAAM,MAAQ7C,GAAgBsE,EAAY,EAC5DzB,EAAe,CAAC,EAAE,MAAM2B,EAAO,EAAID,GAAapC,EAAS,KAAO,OAIjEnJ,EAAM,SAAS,UAAU,EAAE,aAAcA,EAAM,SAAS,OAAO,CAAE,EAGjE0J,EAAQ,QAAQ,QAAQ,GAIlBxd,EAAS,SAAWA,EAAS,YAAc,CAAEA,EAAS,YAC3Dud,EAAU,UAAY,EAExB,CAYA,SAAS2B,GAAoB/c,EAAIod,EAAKC,EACtC,CAIC,QAHIC,EAAM,EAAGjd,EAAE,EAAGC,EAAK8c,EAAI,OACvBG,EAAQC,EAEJnd,EAAIC,GAAO,CAIlB,IAHAid,EAASH,EAAI/c,CAAC,EAAE,WAChBmd,EAASH,EAAMA,EAAIhd,CAAC,EAAE,WAAa,KAE3Bkd,GACFA,EAAO,WAAa,IACnBF,EACJrd,EAAIud,EAAQC,EAAQF,CAAM,EAG1Btd,EAAIud,EAAQD,CAAM,EAGnBA,KAGDC,EAASA,EAAO,YAChBC,EAASH,EAAMG,EAAO,YAAc,KAGrCnd,GACD,CACD,CAIA,IAAIod,GAAmB,SAQvB,SAASxS,GAA2B1J,EACpC,CACC,IACCoQ,EAAQpQ,EAAU,OAClByJ,EAAUzJ,EAAU,UACpBzD,EAASyD,EAAU,QACnBwY,EAAUjc,EAAO,GACjBgc,EAAUhc,EAAO,GACjB+c,EAAe/c,EAAO,QACtBwW,EAActJ,EAAQ,OACtB0S,EAAiBrS,GAAe9J,EAAW,UAAW,EACtDoc,EAAc9gB,EAAE,KAAM0E,EAAU,MAAM,EACtCqc,EAAiBjM,EAAM,aAAa,OAAO,EAC3CkM,EAAiBlM,EAAM,WACvBmM,EAAa,GACbzd,EAAG4O,EAAQ8O,EAAWC,EAAOC,GAC7BxU,EAAUlI,EAAU,SACpBsa,EAAOpS,EAAQ,gBAEZyU,EAAavM,EAAM,MAAM,MAM7B,IALKuM,GAAcA,EAAW,QAAQ,GAAG,IAAM,KAC9CN,EAAiBM,GAIZ7d,EAAE,EAAIA,EAAEqd,EAAe,OAASrd,IACrC4O,EAASjE,EAAS0S,EAAerd,CAAC,CAAE,EAE/B4O,EAAO,SAAW,OACtBA,EAAO,OAASkP,GAAmBlP,EAAO,WAAY4O,CAAe,EAErEC,EAAa,IASf,GAAKjC,GAAQ,CAAEiC,GAAc,CAAEhE,GAAW,CAAEC,GACvCzF,GAAe9I,GAAkBjK,CAAU,GAC3C+S,GAAeqJ,EAAY,OAE/B,IAAMtd,EAAE,EAAIA,EAAEiU,EAAcjU,IAAM,CACjC,IAAI6M,EAAShC,GAAyB3J,EAAWlB,CAAE,EAE9C6M,IAAW,OACflC,EAASkC,CAAO,EAAE,OAASyL,GAAgBgF,EAAY,GAAGtd,CAAC,EAAE,MAAM,CAAE,EAEvE,KAGD,CAKC,IAAI+d,EAAWvhB,EAAE8U,CAAK,EAAE,MAAM,EAC5B,IAAK,aAAc,QAAS,EAC5B,WAAY,IAAK,EAGnByM,EAAS,KAAK,UAAU,EAAE,OAAO,EACjC,IAAIrP,GAAKlS,EAAE,OAAO,EAAE,SAAUuhB,EAAS,KAAK,OAAO,CAAE,EAgBrD,IAXAA,EAAS,KAAK,cAAc,EAAE,OAAO,EACrCA,EACE,OAAQvhB,EAAE0E,EAAU,MAAM,EAAE,MAAM,CAAE,EACpC,OAAQ1E,EAAE0E,EAAU,MAAM,EAAE,MAAM,CAAE,EAGtC6c,EAAS,KAAK,oBAAoB,EAAE,IAAI,QAAS,EAAE,EAGnDT,EAAcjb,GAAiBnB,EAAW6c,EAAS,KAAK,OAAO,EAAE,CAAC,CAAE,EAE9D/d,EAAE,EAAIA,EAAEqd,EAAe,OAASrd,IACrC4O,EAASjE,EAAS0S,EAAerd,CAAC,CAAE,EAEpCsd,EAAYtd,CAAC,EAAE,MAAM,MAAQ4O,EAAO,aAAe,MAAQA,EAAO,aAAe,GAChF0J,GAAgB1J,EAAO,UAAW,EAClC,GAKIA,EAAO,YAAc6K,GACzBjd,EAAG8gB,EAAYtd,CAAC,CAAE,EAAE,OAAQxD,EAAE,QAAQ,EAAE,IAAK,CAC5C,MAAOoS,EAAO,WACd,OAAQ,EACR,QAAS,EACT,OAAQ,EACR,OAAQ,CACT,CAAE,CAAE,EAKN,GAAK1N,EAAU,OAAO,OACrB,IAAMlB,EAAE,EAAIA,EAAEqd,EAAe,OAASrd,IACrC0d,EAAYL,EAAerd,CAAC,EAC5B4O,EAASjE,EAAS+S,CAAU,EAE5BlhB,EAAGwhB,GAAkB9c,EAAWwc,CAAU,CAAE,EAC1C,MAAO,EAAM,EACb,OAAQ9O,EAAO,eAAgB,EAC/B,SAAUF,EAAG,EAMjBlS,EAAE,SAAUuhB,CAAQ,EAAE,WAAW,MAAM,EAOvC,IAAIE,GAASzhB,EAAE,QAAQ,EAAE,IAAKid,GAAWC,EACvC,CACC,SAAU,WACV,IAAK,EACL,KAAM,EACN,OAAQ,EACR,MAAO,EACP,SAAU,QACX,EACA,CAAC,CACF,EACC,OAAQqE,CAAS,EACjB,SAAUP,CAAe,EAKtB/D,GAAWe,EACfuD,EAAS,MAAOvD,CAAa,EAEpBf,GACTsE,EAAS,IAAK,QAAS,MAAO,EAC9BA,EAAS,WAAW,OAAO,EAItBA,EAAS,MAAM,EAAIP,EAAe,aAAeD,GACrDQ,EAAS,MAAOP,EAAe,WAAY,GAGnC9D,EACTqE,EAAS,MAAOP,EAAe,WAAY,EAElCD,GACTQ,EAAS,MAAOR,CAAe,EAShC,IAAIvF,GAAQ,EACZ,IAAMhY,EAAE,EAAIA,EAAEqd,EAAe,OAASrd,IAAM,CAC3C,IAAIpB,GAAOpC,EAAE8gB,EAAYtd,CAAC,CAAC,EACvBke,GAAStf,GAAK,WAAW,EAAIA,GAAK,MAAM,EAIxCuf,GAAW/U,EAAQ,UACtB,KAAK,KAAMkU,EAAYtd,CAAC,EAAE,sBAAsB,EAAE,KAAM,EACxDpB,GAAK,WAAW,EAIjBoZ,IAASmG,GAGTxT,EAAS0S,EAAerd,CAAC,CAAE,EAAE,OAASsY,GAAgB6F,GAAWD,EAAO,CACzE,CAEA5M,EAAM,MAAM,MAAQgH,GAAgBN,EAAM,EAG1CiG,GAAO,OAAO,CACf,CAUA,GAJKV,IACJjM,EAAM,MAAM,MAAQgH,GAAgBiF,CAAe,IAG9CA,GAAkB9D,IAAY,CAAEvY,EAAU,SAAW,CAC1D,IAAIkd,GAAa,UAAY,CAC5B5hB,EAAE,MAAM,EAAE,GAAG,aAAa0E,EAAU,UAAWuU,GAAa,UAAY,CACvE/K,GAAuBxJ,CAAU,CAClC,CAAE,CAAE,CACL,EAIKsa,EACJ,WAAY4C,GAAY,GAAK,EAG7BA,GAAW,EAGZld,EAAU,SAAW,EACtB,CACD,CAWA,IAAIuU,GAAc/Y,GAAU,KAAK,SAUjC,SAASohB,GAAoBH,EAAOU,EACpC,CACC,GAAK,CAAEV,EACN,MAAO,GAGR,IAAItU,EAAI7M,EAAE,QAAQ,EAChB,IAAK,QAAS8b,GAAgBqF,CAAM,CAAE,EACtC,SAAUU,GAAU,SAAS,IAAK,EAEhChb,EAAMgG,EAAE,CAAC,EAAE,YACf,OAAAA,EAAE,OAAO,EAEFhG,CACR,CAUA,SAAS2a,GAAkBxgB,EAAUqP,EACrC,CACC,IAAIuB,EAAMkQ,GAAoB9gB,EAAUqP,CAAO,EAC/C,GAAKuB,EAAM,EACV,OAAO,KAGR,IAAIjR,EAAOK,EAAS,OAAQ4Q,CAAI,EAChC,OAASjR,EAAK,IAEbA,EAAK,QAAS0P,CAAO,EADrBrQ,EAAE,OAAO,EAAE,KAAMoP,GAAgBpO,EAAU4Q,EAAKvB,EAAQ,SAAU,CAAE,EAAE,CAAC,CAEzE,CAUA,SAASyR,GAAoB9gB,EAAUqP,EACvC,CAGC,QAFI9L,EAAGgX,EAAI,GAAIwG,EAAS,GAEdve,EAAE,EAAG2F,EAAInI,EAAS,OAAO,OAASwC,EAAE2F,EAAM3F,IACnDe,EAAI6K,GAAgBpO,EAAUwC,EAAG6M,EAAQ,SAAU,EAAE,GACrD9L,EAAIA,EAAE,QAASqc,GAAkB,EAAG,EACpCrc,EAAIA,EAAE,QAAS,UAAW,GAAI,EAEzBA,EAAE,OAASgX,IACfA,EAAMhX,EAAE,OACRwd,EAASve,GAIX,OAAOue,CACR,CASA,SAASjG,GAAgBvX,EACzB,CACC,OAAKA,IAAM,KACH,MAGH,OAAOA,GAAK,SACTA,EAAI,EACV,MACAA,EAAE,KAIGA,EAAE,MAAM,KAAK,EACnBA,EAAE,KACFA,CACF,CAIA,SAASoC,GAAiB3F,EAC1B,CACC,IACCwC,EAAGC,EAAMG,EAAGC,EACZ6C,EAAQ,CAAC,EACTsb,EAAS,CAAC,EACVC,EAAYjhB,EAAS,UACrBkhB,EAAW1f,EAAM2f,EAAOC,EACxBC,EAAQrhB,EAAS,eACjBshB,EAAWtiB,EAAE,cAAeqiB,CAAM,EAClCE,EAAa,CAAC,EACdC,EAAM,SAAWtc,EAAI,CACfA,EAAE,QAAU,CAAE,MAAM,QAASA,EAAE,CAAC,CAAE,EAEtCqc,EAAW,KAAMrc,CAAE,EAInBlG,EAAE,MAAOuiB,EAAYrc,CAAE,CAEzB,EAkBD,IAdK,MAAM,QAASmc,CAAM,GACzBG,EAAKH,CAAM,EAGPC,GAAYD,EAAM,KACtBG,EAAKH,EAAM,GAAI,EAGhBG,EAAKxhB,EAAS,SAAU,EAEpBshB,GAAYD,EAAM,MACrBG,EAAKH,EAAM,IAAK,EAGX7e,EAAE,EAAIA,EAAE+e,EAAW,OAAS/e,IAKjC,IAHA4e,EAASG,EAAW/e,CAAC,EAAE,CAAC,EACxB0e,EAAYD,EAAWG,CAAO,EAAE,UAE1Bxe,EAAE,EAAGC,EAAKqe,EAAU,OAASte,EAAEC,EAAOD,IAE3CpB,EAAO0f,EAAUte,CAAC,EAClBue,EAAQF,EAAWzf,CAAK,EAAE,OAAS,SAE9B+f,EAAW/e,CAAC,EAAE,OAAS,SAC3B+e,EAAW/e,CAAC,EAAE,KAAOxD,EAAE,QAASuiB,EAAW/e,CAAC,EAAE,CAAC,EAAGye,EAAUzf,CAAI,EAAE,SAAU,GAG7EkE,EAAM,KAAM,CACX,IAAW0b,EACX,IAAW5f,EACX,IAAW+f,EAAW/e,CAAC,EAAE,CAAC,EAC1B,MAAW+e,EAAW/e,CAAC,EAAE,KACzB,KAAW2e,EACX,UAAWjiB,GAAU,IAAI,KAAK,MAAOiiB,EAAM,MAAO,CACnD,CAAE,EAIJ,OAAOzb,CACR,CAQA,SAASiO,GAAUjQ,EACnB,CACC,IACClB,EAAG2F,EAAK1F,EAAMC,EAAGC,EAAMC,EAAGC,EAC1B4e,EAAWrV,EACX4U,EAAS,CAAC,EACVU,EAAWxiB,GAAU,IAAI,KAAK,MAC9BkU,EAAS1P,EAAU,OACnBud,EAAYvd,EAAU,UACtBwd,EAAWvhB,EAAM6B,EAAM2f,GAAOQ,EAC9BC,EAAa,EACbC,EACArI,EAAgB9V,EAAU,gBAC1BgC,EASD,IAJAoI,GAAgBpK,CAAU,EAE1BgC,EAAQC,GAAgBjC,CAAU,EAE5BlB,EAAE,EAAG2F,EAAIzC,EAAM,OAASlD,EAAE2F,EAAM3F,IACrCqf,EAAUnc,EAAMlD,CAAC,EAGZqf,EAAQ,WACZD,IAIDE,GAAape,EAAWme,EAAQ,GAAI,EAIrC,GAAK9b,GAAerC,CAAU,GAAK,OAASgC,EAAM,SAAW,EAC7D,CAGC,IAAMlD,EAAE,EAAGC,EAAK+W,EAAc,OAAShX,EAAEC,EAAOD,IAC/Cwe,EAAQxH,EAAchX,CAAC,CAAE,EAAIA,EAwBzBof,IAAelc,EAAM,OAEzB8T,EAAc,KAAM,SAAWtU,GAAG2E,GAAI,CACrC,IACCkY,GAAGC,GAAGpf,GAAGqf,GAAM7c,GACflD,GAAIwD,EAAM,OACVwc,GAAQ9O,EAAOlO,EAAC,EAAE,WAClBid,GAAQ/O,EAAOvJ,EAAC,EAAE,WAEnB,IAAMjH,GAAE,EAAIA,GAAEV,GAAMU,KAOnB,GANAwC,GAAOM,EAAM9C,EAAC,EAEdmf,GAAIG,GAAO9c,GAAK,GAAI,EACpB4c,GAAIG,GAAO/c,GAAK,GAAI,EAEpB6c,GAAOF,GAAEC,GAAI,GAAKD,GAAEC,GAAI,EAAI,EACvBC,KAAS,EACb,OAAO7c,GAAK,MAAQ,MAAQ6c,GAAO,CAACA,GAItC,OAAAF,GAAIf,EAAO9b,EAAC,EACZ8c,GAAIhB,EAAOnX,EAAC,EACLkY,GAAEC,GAAI,GAAKD,GAAEC,GAAI,EAAI,CAC7B,CAAE,EAMFxI,EAAc,KAAM,SAAWtU,GAAG2E,GAAI,CACrC,IACCkY,GAAGC,GAAGpf,GAAGuS,GAAG8M,GAAM7c,GAAMjD,GACxBD,GAAIwD,EAAM,OACVwc,GAAQ9O,EAAOlO,EAAC,EAAE,WAClBid,EAAQ/O,EAAOvJ,EAAC,EAAE,WAEnB,IAAMjH,GAAE,EAAIA,GAAEV,GAAMU,KAQnB,GAPAwC,GAAOM,EAAM9C,EAAC,EAEdmf,GAAIG,GAAO9c,GAAK,GAAI,EACpB4c,GAAIG,EAAO/c,GAAK,GAAI,EAEpBjD,GAAKuf,EAAUtc,GAAK,KAAK,IAAIA,GAAK,GAAI,GAAKsc,EAAU,UAAUtc,GAAK,GAAI,EACxE6c,GAAO9f,GAAI4f,GAAGC,EAAE,EACXC,KAAS,EACb,OAAOA,GAIT,OAAAF,GAAIf,EAAO9b,EAAC,EACZ8c,GAAIhB,EAAOnX,EAAC,EACLkY,GAAEC,GAAI,GAAKD,GAAEC,GAAI,EAAI,CAC7B,CAAE,CAEJ,CAGAte,EAAU,QAAU,EACrB,CAGA,SAASoC,GAAc9F,EACvB,CASC,QARIoiB,EACAC,EACAlV,EAAUnN,EAAS,UACnB0F,EAAQC,GAAgB3F,CAAS,EACjCsiB,EAAQtiB,EAAS,UAAU,MAIrBwC,EAAE,EAAGC,EAAK0K,EAAQ,OAAS3K,EAAEC,EAAOD,IAC9C,CACC,IAAIzB,EAAMoM,EAAQ3K,CAAC,EACf+f,EAAYxhB,EAAI,UAChByhB,EAASzhB,EAAI,WAAaA,EAAI,OAAO,QAAS,SAAU,EAAG,EAC3DyL,EAAKzL,EAAI,IAIbyL,EAAG,gBAAgB,WAAW,EAGzBzL,EAAI,WACH2E,EAAM,OAAS,GAAKA,EAAM,CAAC,EAAE,KAAOlD,GACxCgK,EAAG,aAAa,YAAa9G,EAAM,CAAC,EAAE,KAAK,MAAQ,YAAc,YAAa,EAC9E2c,EAAWE,EAAW7c,EAAM,CAAC,EAAE,MAAM,CAAE,GAAK6c,EAAU,CAAC,GAGvDF,EAAWE,EAAU,CAAC,EAGvBH,EAAQI,GAAWH,IAAa,MAC/BC,EAAM,eACNA,EAAM,kBAIPF,EAAQI,EAGThW,EAAG,aAAa,aAAc4V,CAAK,CACpC,CACD,CAaA,SAASK,GAAkBziB,EAAUqP,EAAQqT,EAAQriB,EACrD,CACC,IAAIU,EAAMf,EAAS,UAAWqP,CAAO,EACjC7J,EAAUxF,EAAS,UACnBuiB,EAAYxhB,EAAI,UAChB4hB,EACAC,EAAO,SAAW1d,EAAG2d,EAAW,CACnC,IAAIjS,EAAM1L,EAAE,KACZ,OAAK0L,IAAQ,SACZA,EAAM5R,EAAE,QAASkG,EAAE,CAAC,EAAGqd,CAAU,GAG3B3R,EAAI,EAAI2R,EAAU,OACxB3R,EAAI,EACJiS,EACC,KACA,CACH,EAQA,GALK,OAAOrd,EAAQ,CAAC,GAAM,WAC1BA,EAAUxF,EAAS,UAAY,CAAEwF,CAAQ,GAIrCkd,GAAU1iB,EAAS,UAAU,WAAa,CAE9C,IAAI8iB,EAAU9jB,EAAE,QAASqQ,EAAQtH,GAAOvC,EAAS,GAAG,CAAE,EAEjDsd,IAAY,IAEhBH,EAAcC,EAAMpd,EAAQsd,CAAO,EAAG,EAAK,EAEtCH,IAAgB,MAAQnd,EAAQ,SAAW,IAC/Cmd,EAAc,GAGVA,IAAgB,KACpBnd,EAAQ,OAAQsd,EAAS,CAAE,GAG3Btd,EAAQsd,CAAO,EAAE,CAAC,EAAIP,EAAWI,CAAY,EAC7Cnd,EAAQsd,CAAO,EAAE,KAAOH,KAKzBnd,EAAQ,KAAM,CAAE6J,EAAQkT,EAAU,CAAC,EAAG,CAAE,CAAE,EAC1C/c,EAAQA,EAAQ,OAAO,CAAC,EAAE,KAAO,EAEnC,MACUA,EAAQ,QAAUA,EAAQ,CAAC,EAAE,CAAC,GAAK6J,GAE5CsT,EAAcC,EAAMpd,EAAQ,CAAC,CAAE,EAE/BA,EAAQ,OAAS,EACjBA,EAAQ,CAAC,EAAE,CAAC,EAAI+c,EAAWI,CAAY,EACvCnd,EAAQ,CAAC,EAAE,KAAOmd,IAIlBnd,EAAQ,OAAS,EACjBA,EAAQ,KAAM,CAAE6J,EAAQkT,EAAU,CAAC,CAAE,CAAE,EACvC/c,EAAQ,CAAC,EAAE,KAAO,GAInBiO,GAAWzT,CAAS,EAGf,OAAOK,GAAY,YACvBA,EAAUL,CAAS,CAErB,CAWA,SAASuR,GAAwBvR,EAAU+iB,EAAU1T,EAAQhP,EAC7D,CACC,IAAIU,EAAMf,EAAS,UAAWqP,CAAO,EAErC2T,GAAeD,EAAU,CAAC,EAAG,SAAU7K,EAAG,CAEpCnX,EAAI,YAAc,KAMlBf,EAAS,UAAU,aACvBsS,GAAsBtS,EAAU,EAAK,EAErC,WAAY,UAAW,CACtByiB,GAAiBziB,EAAUqP,EAAQ6I,EAAE,SAAU7X,CAAS,EAInD0F,GAAe/F,CAAS,IAAM,OAClCsS,GAAsBtS,EAAU,EAAM,CAExC,EAAG,CAAE,GAGLyiB,GAAiBziB,EAAUqP,EAAQ6I,EAAE,SAAU7X,CAAS,EAE1D,CAAE,CACH,CASA,SAASoF,GAAmBzF,EAC5B,CACC,IAAIijB,EAAUjjB,EAAS,UACnBkjB,EAAYljB,EAAS,SAAS,YAC9BoF,EAAOO,GAAgB3F,CAAS,EAChCsF,EAAWtF,EAAS,UACpBwC,EAAG2F,EAAKkH,EAEZ,GAAK/J,EAAS,OAASA,EAAS,aAAe,CAE9C,IAAM9C,EAAE,EAAG2F,EAAI8a,EAAQ,OAASzgB,EAAE2F,EAAM3F,IACvC6M,EAAS4T,EAAQzgB,CAAC,EAAE,IAGpBxD,EAAG+I,GAAQ/H,EAAS,OAAQ,UAAWqP,CAAO,CAAE,EAC9C,YAAa6T,GAAa1gB,EAAE,EAAIA,EAAE,EAAI,EAAG,EAI5C,IAAMA,EAAE,EAAG2F,EAAI/C,EAAK,OAAS5C,EAAE2F,EAAM3F,IACpC6M,EAASjK,EAAK5C,CAAC,EAAE,IAEjBxD,EAAG+I,GAAQ/H,EAAS,OAAQ,UAAWqP,CAAO,CAAE,EAC9C,SAAU6T,GAAa1gB,EAAE,EAAIA,EAAE,EAAI,EAAG,CAE1C,CAEAxC,EAAS,UAAYoF,CACtB,CAKA,SAAS0c,GAAa9hB,EAAU4Q,EAChC,CAEC,IAAIQ,EAASpR,EAAS,UAAW4Q,CAAI,EACjCuS,EAAajkB,GAAU,IAAI,MAAOkS,EAAO,aAAc,EACvDgS,EAECD,IACJC,EAAaD,EAAW,KAAMnjB,EAAS,UAAWA,EAAU4Q,EAC3DnD,GAAyBzN,EAAU4Q,CAAI,CACxC,GAOD,QAHIvG,EAAKmF,EACLkL,EAAYxb,GAAU,IAAI,KAAK,MAAOkS,EAAO,MAAM,MAAO,EAEpD5O,EAAE,EAAG2F,EAAInI,EAAS,OAAO,OAASwC,EAAE2F,EAAM3F,IACnD6H,EAAMrK,EAAS,OAAOwC,CAAC,EAEhB6H,EAAI,aACVA,EAAI,WAAa,CAAC,IAGd,CAAEA,EAAI,WAAWuG,CAAG,GAAKuS,KAC7B3T,EAAW2T,EACVC,EAAW5gB,CAAC,EACZ4L,GAAgBpO,EAAUwC,EAAGoO,EAAK,MAAO,EAE1CvG,EAAI,WAAYuG,CAAI,EAAI8J,EACvBA,EAAWlL,CAAS,EACpBA,EAGJ,CASA,SAASlJ,GAAetG,EACxB,CACC,GAAI,CAAAA,EAAS,eAKb,KAAIqjB,EAAQ,CACX,KAAS,CAAC,IAAI,KACd,MAASrjB,EAAS,eAClB,OAASA,EAAS,gBAClB,MAAShB,EAAE,OAAQ,GAAM,CAAC,EAAGgB,EAAS,SAAU,EAChD,OAASia,GAAkBja,EAAS,eAAgB,EACpD,QAAShB,EAAE,IAAKgB,EAAS,UAAW,SAAWe,EAAK,EAAI,CACvD,MAAO,CACN,QAASA,EAAI,SACb,OAAQkZ,GAAkBja,EAAS,gBAAgB,CAAC,CAAE,CACvD,CACD,CAAE,CACH,EAEAA,EAAS,YAAcqjB,EACvBjf,GAAiBpE,EAAU,oBAAqB,kBAAmB,CAACA,EAAUqjB,CAAK,CAAE,EAEhFrjB,EAAS,UAAU,YAAc,CAACA,EAAS,aAE/CA,EAAS,oBAAoB,KAAMA,EAAS,UAAWA,EAAUqjB,CAAM,EAEzE,CAUA,SAAS9c,GAAevG,EAAUsC,EAAOjC,EACzC,CACC,GAAK,CAAEL,EAAS,UAAU,WAAa,CACtCK,EAAS,EACT,MACD,CAEA,IAAIijB,EAAS,SAASD,EAAO,CAC5BE,GAAkBvjB,EAAUqjB,EAAOhjB,CAAQ,CAC5C,EAEIgjB,EAAQrjB,EAAS,oBAAoB,KAAMA,EAAS,UAAWA,EAAUsjB,CAAO,EAEpF,OAAKD,IAAU,QACdE,GAAmBvjB,EAAUqjB,EAAOhjB,CAAS,EAIvC,EACR,CAEA,SAASkjB,GAAoBvjB,EAAUuD,EAAGlD,EAAU,CACnD,IAAI,EAAG8H,EACHgF,EAAUnN,EAAS,UACvBA,EAAS,eAAiB,GAI1B,IAAIH,EAAMG,EAAS,eAAiB,IAAId,GAAU,IAAIc,CAAQ,EAAI,KAElE,GAAK,CAAEuD,GAAK,CAAEA,EAAE,KAAO,CACtBvD,EAAS,eAAiB,GAC1BK,EAAS,EACT,MACD,CAIA,IAAImjB,EAAcpf,GAAiBpE,EAAU,oBAAqB,kBAAmB,CAACA,EAAUuD,CAAC,CAAE,EACnG,GAAKvE,EAAE,QAAS,GAAOwkB,CAAY,IAAM,GAAK,CAC7CxjB,EAAS,eAAiB,GAC1BK,EAAS,EACT,MACD,CAGA,IAAIojB,EAAWzjB,EAAS,eACxB,GAAKyjB,EAAW,GAAKlgB,EAAE,KAAO,CAAC,IAAI,KAAUkgB,EAAS,IAAQ,CAC7DzjB,EAAS,eAAiB,GAC1BK,EAAS,EACT,MACD,CAGA,GAAKkD,EAAE,SAAW4J,EAAQ,SAAW5J,EAAE,QAAQ,OAAS,CACvDvD,EAAS,eAAiB,GAC1BK,EAAS,EACT,MACD,CA6CA,GA1CAL,EAAS,aAAehB,EAAE,OAAQ,GAAM,CAAC,EAAGuE,CAAE,EAGzCA,EAAE,SAAW,SAEb1D,EACHA,EAAI,KAAK,IAAI0D,EAAE,MAAM,EAGrBvD,EAAS,gBAAoBuD,EAAE,QAM5BA,EAAE,QAAU,SACb1D,IAAQ,MACVG,EAAS,eAAoBuD,EAAE,MAC/BvD,EAAS,kBAAoBuD,EAAE,OAG/BqY,GAAc5b,EAAUuD,EAAE,MAAMvD,EAAS,eAAe,GAKrDuD,EAAE,QAAU,SAChBvD,EAAS,UAAY,CAAC,EACtBhB,EAAE,KAAMuE,EAAE,MAAO,SAAWf,EAAGzB,EAAM,CACpCf,EAAS,UAAU,KAAMe,EAAI,CAAC,GAAKoM,EAAQ,OAC1C,CAAE,EAAGpM,EAAI,CAAC,CAAE,EACZA,CACD,CACD,CAAE,GAIEwC,EAAE,SAAW,QACjBvE,EAAE,OAAQgB,EAAS,gBAAiBma,GAAiB5W,EAAE,MAAO,CAAE,EAI5DA,EAAE,QAAU,CAChB,IAAM,EAAE,EAAG4E,EAAI5E,EAAE,QAAQ,OAAS,EAAE4E,EAAM,IAAM,CAC/C,IAAIpH,EAAMwC,EAAE,QAAQ,CAAC,EAGhBxC,EAAI,UAAY,SAEhBlB,EAEHA,EAAI,OAAO,CAAC,EAAE,QAAQkB,EAAI,QAAS,EAAK,EAGxCoM,EAAQ,CAAC,EAAE,SAAWpM,EAAI,SAKvBA,EAAI,SAAW,QACnB/B,EAAE,OAAQgB,EAAS,gBAAgB,CAAC,EAAGma,GAAiBpZ,EAAI,MAAO,CAAE,CAEvE,CAGIlB,GACHA,EAAI,QAAQ,OAAO,CAErB,CAEAG,EAAS,eAAiB,GAC1BoE,GAAiBpE,EAAU,gBAAiB,cAAe,CAACA,EAAUuD,CAAC,CAAE,EACzElD,EAAS,CACV,CASA,SAASZ,GAAsBqU,EAC/B,CACC,IAAI9T,EAAWd,GAAU,SACrB0R,EAAM5R,EAAE,QAAS8U,EAAO/L,GAAQ/H,EAAU,QAAS,CAAE,EAEzD,OAAO4Q,IAAQ,GACd5Q,EAAU4Q,CAAI,EACd,IACF,CAWA,SAAS1N,GAAQlD,EAAU0jB,EAAOC,EAAKC,EACvC,CASC,GARAD,EAAM,wBACJ3jB,EAAW,YAAYA,EAAS,SAAS,MAAQ,IAAI2jB,EAElDC,IACJD,GAAO,gFACqBC,GAGtBF,EAmBG,OAAO,SAAW,QAAQ,KACnC,QAAQ,IAAKC,CAAI,MApBF,CAEf,IAAIE,EAAM3kB,GAAU,IAChB8B,EAAO6iB,EAAI,UAAYA,EAAI,QAM/B,GAJK7jB,GACJoE,GAAiBpE,EAAU,KAAM,QAAS,CAAEA,EAAU4jB,EAAID,CAAI,CAAE,EAG5D3iB,GAAQ,QACZ,MAAO2iB,CAAI,MAEP,IAAK3iB,GAAQ,QACjB,MAAM,IAAI,MAAM2iB,CAAG,EAEV,OAAO3iB,GAAQ,YACxBA,EAAMhB,EAAU4jB,EAAID,CAAI,EAE1B,CAID,CAWA,SAAS/f,GAAQ0S,EAAKxV,EAAKqE,EAAM2e,EACjC,CACC,GAAK,MAAM,QAAS3e,CAAK,EAAI,CAC5BnG,EAAE,KAAMmG,EAAM,SAAU3C,EAAGqD,EAAK,CAC1B,MAAM,QAASA,CAAI,EACvBjC,GAAQ0S,EAAKxV,EAAK+E,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAE,EAGjCjC,GAAQ0S,EAAKxV,EAAK+E,CAAI,CAExB,CAAE,EAEF,MACD,CAEKie,IAAe,SACnBA,EAAa3e,GAGTrE,EAAIqE,CAAI,IAAM,SAClBmR,EAAIwN,CAAU,EAAIhjB,EAAIqE,CAAI,EAE5B,CAoBA,SAAS5C,GAAW2F,EAAK6b,EAAUC,EACnC,CACC,IAAIne,EAEJ,QAAUmC,KAAQ+b,EACZA,EAAS,eAAe/b,CAAI,IAChCnC,EAAMke,EAAS/b,CAAI,EAEdhJ,EAAE,cAAe6G,CAAI,GAClB7G,EAAE,cAAekJ,EAAIF,CAAI,CAAE,IACjCE,EAAIF,CAAI,EAAI,CAAC,GAEdhJ,EAAE,OAAQ,GAAMkJ,EAAIF,CAAI,EAAGnC,CAAI,GAEtBme,GAAahc,IAAS,QAAUA,IAAS,UAAY,MAAM,QAAQnC,CAAG,EAC/EqC,EAAIF,CAAI,EAAInC,EAAI,MAAM,EAGtBqC,EAAIF,CAAI,EAAInC,GAKf,OAAOqC,CACR,CAYA,SAAS8a,GAAenX,EAAG8C,EAAOxM,EAClC,CACCnD,EAAE6M,CAAC,EACD,GAAI,WAAY8C,EAAO,SAAUuJ,EAAG,CACnClZ,EAAE6M,CAAC,EAAE,QAAQ,MAAM,EACnB1J,EAAG+V,CAAC,CACL,CAAE,EACF,GAAI,cAAevJ,EAAO,SAAUuJ,EAAE,CAChCA,EAAE,QAAU,KAChBA,EAAE,eAAe,EACjB/V,EAAG+V,CAAC,EAEN,CAAE,EACF,GAAI,iBAAkB,UAAY,CAEjC,MAAO,EACR,CAAE,CACL,CAYA,SAASrU,GAAgBH,EAAWugB,EAAQ9hB,EAAI+hB,EAChD,CACM/hB,GAEJuB,EAAUugB,CAAM,EAAE,KAAM,CACvB,GAAM9hB,EACN,MAAS+hB,CACV,CAAE,CAEJ,CAiBA,SAAS9f,GAAiBpE,EAAUmkB,EAAaC,EAAW5a,EAC5D,CACC,IAAI8M,EAAM,CAAC,EAQX,GANK6N,IACJ7N,EAAMtX,EAAE,IAAKgB,EAASmkB,CAAW,EAAE,MAAM,EAAE,QAAQ,EAAG,SAAUte,EAAKrD,EAAG,CACvE,OAAOqD,EAAI,GAAG,MAAO7F,EAAS,UAAWwJ,CAAK,CAC/C,CAAE,GAGE4a,IAAc,KAAO,CACzB,IAAIlM,EAAIlZ,EAAE,MAAOolB,EAAU,KAAM,EAC7BtQ,EAAQ9U,EAAEgB,EAAS,MAAM,EAE7B8T,EAAM,QAASoE,EAAG1O,CAAK,EAInBsK,EAAM,QAAQ,MAAM,EAAE,SAAW,GACpC9U,EAAE,MAAM,EAAE,QAASkZ,EAAG1O,CAAK,EAG5B8M,EAAI,KAAM4B,EAAE,MAAO,CACpB,CAEA,OAAO5B,CACR,CAGA,SAAS2E,GAAoBjb,EAC7B,CACC,IACCuI,EAAQvI,EAAS,eACjBwI,EAAMxI,EAAS,aAAa,EAC5BkC,EAAMlC,EAAS,gBAGXuI,GAASC,IAEbD,EAAQC,EAAMtG,GAIfqG,GAAUA,EAAQrG,GAEbA,IAAQ,IAAMqG,EAAQ,KAE1BA,EAAQ,GAGTvI,EAAS,eAAiBuI,CAC3B,CAGA,SAASiJ,GAAaxR,EAAUgB,EAChC,CACC,IAAIqjB,EAAWrkB,EAAS,SACpBskB,EAAOplB,GAAU,IAAI,SAAS8B,CAAI,EAEtC,OAAKhC,EAAE,cAAeqlB,CAAS,GAAKA,EAASrjB,CAAI,EAGzCsjB,EAAKD,EAASrjB,CAAI,CAAC,GAAKsjB,EAAK,EAE3B,OAAOD,GAAa,UAGtBC,EAAKD,CAAQ,GAAKC,EAAK,CAKhC,CAWA,SAASve,GAAgB/F,EACzB,CACC,OAAKA,EAAS,UAAU,YAChB,MAEEA,EAAS,MAAQA,EAAS,YAC5B,OAED,KACR,CAyCA,IAAIukB,GAAc,CAAC,EASfC,GAAe,MAAM,UAuBrBC,GAAc,SAAWC,EAC7B,CACC,IAAI9T,EAAK+T,EACL3kB,EAAWd,GAAU,SACrB0lB,EAAS5lB,EAAE,IAAKgB,EAAU,SAAUwE,EAAIhC,EAAG,CAC9C,OAAOgC,EAAG,MACX,CAAE,EAEF,GAAOkgB,EAGF,IAAKA,EAAM,QAAUA,EAAM,KAE/B,MAAO,CAAEA,CAAM,EAEX,GAAKA,EAAM,UAAYA,EAAM,SAAS,YAAY,IAAM,QAE5D,OAAA9T,EAAM5R,EAAE,QAAS0lB,EAAOE,CAAO,EACxBhU,IAAQ,GAAK,CAAE5Q,EAAS4Q,CAAG,CAAE,EAAI,KAEpC,GAAK8T,GAAS,OAAOA,EAAM,UAAa,WAC5C,OAAOA,EAAM,SAAS,EAAE,QAAQ,EAEvB,OAAOA,GAAU,SAE1BC,EAAK3lB,EAAE0lB,CAAK,EAEHA,aAAiB1lB,IAE1B2lB,EAAKD,OApBL,OAAO,CAAC,EAuBT,GAAKC,EACJ,OAAOA,EAAG,IAAK,SAASniB,EAAG,CAC1B,OAAAoO,EAAM5R,EAAE,QAAS,KAAM4lB,CAAO,EACvBhU,IAAQ,GAAK5Q,EAAS4Q,CAAG,EAAI,IACrC,CAAE,EAAE,QAAQ,CAEd,EAyDApR,GAAO,SAAWqlB,EAASllB,EAC3B,CACC,GAAK,EAAG,gBAAgBH,IACvB,OAAO,IAAIA,GAAMqlB,EAASllB,CAAK,EAGhC,IAAIK,EAAW,CAAC,EACZ8kB,EAAc,SAAWziB,EAAI,CAChC,IAAI6C,EAAIuf,GAAapiB,CAAE,EAClB6C,GACJlF,EAAS,KAAK,MAAOA,EAAUkF,CAAE,CAEnC,EAEA,GAAK,MAAM,QAAS2f,CAAQ,EAC3B,QAAUriB,EAAE,EAAG2F,EAAI0c,EAAQ,OAASriB,EAAE2F,EAAM3F,IAC3CsiB,EAAaD,EAAQriB,CAAC,CAAE,OAIzBsiB,EAAaD,CAAQ,EAItB,KAAK,QAAUhc,GAAS7I,CAAS,EAG5BL,GACJX,EAAE,MAAO,KAAMW,CAAK,EAIrB,KAAK,SAAW,CACf,KAAM,KACN,KAAM,KACN,KAAM,IACP,EAEAH,GAAK,OAAQ,KAAM,KAAM+kB,EAAY,CACtC,EAEArlB,GAAU,IAAMM,GAIhBR,EAAE,OAAQQ,GAAK,UAAW,CACzB,IAAK,UACL,CACC,OAAO,KAAK,MAAM,IAAM,CACzB,EAGA,OAASglB,GAAa,OAGtB,QAAS,CAAC,EAGV,MAAO,UACP,CACC,OAAO,KAAK,QAAQ,EAAE,MACvB,EAGA,KAAM,SAAWriB,EACjB,CACC,QAAUK,EAAE,EAAG2F,EAAI,KAAK,OAAS3F,EAAE2F,EAAK3F,IACvCL,EAAG,KAAM,KAAM,KAAKK,CAAC,EAAGA,EAAG,IAAK,EAGjC,OAAO,IACR,EAGA,GAAI,SAAWoO,EACf,CACC,IAAImU,EAAM,KAAK,QAEf,OAAOA,EAAI,OAASnU,EACnB,IAAIpR,GAAMulB,EAAInU,CAAG,EAAG,KAAKA,CAAG,CAAE,EAC9B,IACF,EAGA,OAAQ,SAAWzO,EACnB,CACC,IAAI+C,EAAI,CAAC,EAET,GAAKsf,GAAa,OACjBtf,EAAIsf,GAAa,OAAO,KAAM,KAAMriB,EAAI,IAAK,MAI7C,SAAUK,EAAE,EAAG2F,EAAI,KAAK,OAAS3F,EAAE2F,EAAM3F,IACnCL,EAAG,KAAM,KAAM,KAAKK,CAAC,EAAGA,EAAG,IAAK,GACpC0C,EAAE,KAAM,KAAK1C,CAAC,CAAE,EAKnB,OAAO,IAAIhD,GAAM,KAAK,QAAS0F,CAAE,CAClC,EAGA,QAAS,UACT,CACC,IAAIA,EAAI,CAAC,EACT,OAAO,IAAI1F,GAAM,KAAK,QAAS0F,EAAE,OAAO,MAAOA,EAAG,KAAK,QAAQ,CAAE,CAAE,CACpE,EAGA,KAASsf,GAAa,KAGtB,QAASA,GAAa,SAAW,SAAUtK,EAAK3R,EAChD,CACC,QAAU/F,EAAG+F,GAAS,EAAIJ,EAAI,KAAK,OAAS3F,EAAE2F,EAAM3F,IACnD,GAAK,KAAKA,CAAC,IAAM0X,EAChB,OAAO1X,EAGT,MAAO,EACR,EAEA,SAAU,SAAWwiB,EAAShkB,EAAMmB,EAAI8iB,EAAY,CACnD,IACC/f,EAAI,CAAC,EAAGoR,EACR9T,EAAG2F,EAAKzF,EAAGsL,EACX6W,EAAU,KAAK,QACf/kB,EAAMolB,EAAOC,EACbhmB,EAAW,KAAK,SAUjB,IAPK,OAAO6lB,GAAY,WACvBC,EAAY9iB,EACZA,EAAKnB,EACLA,EAAOgkB,EACPA,EAAU,IAGLxiB,EAAE,EAAG2F,EAAI0c,EAAQ,OAASriB,EAAE2F,EAAM3F,IAAM,CAC7C,IAAI4iB,EAAU,IAAI5lB,GAAMqlB,EAAQriB,CAAC,CAAE,EAEnC,GAAKxB,IAAS,QACbsV,EAAMnU,EAAG,KAAMijB,EAASP,EAAQriB,CAAC,EAAGA,CAAE,EAEjC8T,IAAQ,QACZpR,EAAE,KAAMoR,CAAI,UAGJtV,IAAS,WAAaA,IAAS,OAExCsV,EAAMnU,EAAG,KAAMijB,EAASP,EAAQriB,CAAC,EAAG,KAAKA,CAAC,EAAGA,CAAE,EAE1C8T,IAAQ,QACZpR,EAAE,KAAMoR,CAAI,UAGJtV,IAAS,UAAYA,IAAS,eAAiBA,IAAS,OAASA,IAAS,OASnF,IANAkkB,EAAQ,KAAK1iB,CAAC,EAETxB,IAAS,gBACblB,EAAOulB,GAAuBR,EAAQriB,CAAC,EAAGrD,EAAS,IAAK,GAGnDuD,EAAE,EAAGsL,EAAIkX,EAAM,OAASxiB,EAAEsL,EAAMtL,IACrCyiB,EAAOD,EAAMxiB,CAAC,EAET1B,IAAS,OACbsV,EAAMnU,EAAG,KAAMijB,EAASP,EAAQriB,CAAC,EAAG2iB,EAAK,IAAKA,EAAK,OAAQ3iB,EAAGE,CAAE,EAGhE4T,EAAMnU,EAAG,KAAMijB,EAASP,EAAQriB,CAAC,EAAG2iB,EAAM3iB,EAAGE,EAAG5C,CAAK,EAGjDwW,IAAQ,QACZpR,EAAE,KAAMoR,CAAI,CAIhB,CAEA,GAAKpR,EAAE,QAAU+f,EAAY,CAC5B,IAAIplB,EAAM,IAAIL,GAAMqlB,EAASG,EAAU9f,EAAE,OAAO,MAAO,CAAC,EAAGA,CAAE,EAAIA,CAAE,EAC/DogB,GAAczlB,EAAI,SACtB,OAAAylB,GAAY,KAAOnmB,EAAS,KAC5BmmB,GAAY,KAAOnmB,EAAS,KAC5BmmB,GAAY,KAAOnmB,EAAS,KACrBU,CACR,CACA,OAAO,IACR,EAGA,YAAa2kB,GAAa,aAAe,SAAUtK,EAAK3R,EACxD,CAEC,OAAO,KAAK,QAAQ,MAAO,KAAK,QAAQ,QAAQ,EAAG,SAAU,CAC9D,EAGA,OAAS,EAGT,IAAK,SAAWpG,EAChB,CACC,IAAI+C,EAAI,CAAC,EAET,GAAKsf,GAAa,IACjBtf,EAAIsf,GAAa,IAAI,KAAM,KAAMriB,EAAI,IAAK,MAI1C,SAAUK,EAAE,EAAG2F,EAAI,KAAK,OAAS3F,EAAE2F,EAAM3F,IACxC0C,EAAE,KAAM/C,EAAG,KAAM,KAAM,KAAKK,CAAC,EAAGA,CAAE,CAAE,EAItC,OAAO,IAAIhD,GAAM,KAAK,QAAS0F,CAAE,CAClC,EAGA,MAAO,SAAW8C,EAClB,CACC,IAAI7F,EAAKjD,GAAU,KAAK,IAAI8I,CAAI,EAEhC,OAAO,KAAK,IAAK,SAAWxD,EAAK,CAChC,OAAOrC,EAAGqC,CAAE,CACb,CAAE,CACH,EAEA,IAASggB,GAAa,IAGtB,KAASA,GAAa,KAItB,OAAQA,GAAa,QAAU,SAAWriB,EAAIsJ,EAC9C,CACC,OAAOO,GAAW,KAAM7J,EAAIsJ,EAAM,EAAG,KAAK,OAAQ,CAAE,CACrD,EAGA,YAAa+Y,GAAa,aAAe,SAAWriB,EAAIsJ,EACxD,CACC,OAAOO,GAAW,KAAM7J,EAAIsJ,EAAM,KAAK,OAAO,EAAG,GAAI,EAAG,CACzD,EAGA,QAAS+Y,GAAa,QAItB,SAAU,KAGV,MAASA,GAAa,MAGtB,MAAO,UAAY,CAClB,OAAO,IAAIhlB,GAAM,KAAK,QAAS,IAAK,CACrC,EAGA,KAASglB,GAAa,KAGtB,OAASA,GAAa,OAGtB,QAAS,UACT,CACC,OAAOA,GAAa,MAAM,KAAM,IAAK,CACtC,EAGA,IAAK,UACL,CACC,OAAOxlB,EAAG,IAAK,CAChB,EAGA,SAAU,UACV,CACC,OAAOA,EAAG,IAAK,CAChB,EAGA,OAAQ,UACR,CACC,OAAO,IAAIQ,GAAM,KAAK,QAASqJ,GAAQ,IAAI,CAAE,CAC9C,EAGA,QAAS2b,GAAa,OACvB,CAAE,EAGFhlB,GAAK,OAAS,SAAW+lB,EAAOrL,EAAK2J,EACrC,CAEC,GAAK,GAAEA,EAAI,QAAU,CAAE3J,GAAS,EAAGA,aAAe1a,KAAS,CAAE0a,EAAI,cAIjE,KACC,EAAG/R,EACHqd,EACAC,EAAgB,SAAWF,EAAOpjB,EAAIujB,EAAQ,CAC7C,OAAO,UAAY,CAClB,IAAIpP,EAAMnU,EAAG,MAAOojB,EAAO,SAAU,EAGrC,OAAA/lB,GAAK,OAAQ8W,EAAKA,EAAKoP,EAAM,SAAU,EAChCpP,CACR,CACD,EAED,IAAM,EAAE,EAAGnO,EAAI0b,EAAI,OAAS,EAAE1b,EAAM,IACnCqd,EAAS3B,EAAI,CAAC,EAGd3J,EAAKsL,EAAO,IAAK,EAAIA,EAAO,OAAS,WACpCC,EAAeF,EAAOC,EAAO,IAAKA,CAAO,EACzCA,EAAO,OAAS,SACf,CAAC,EACDA,EAAO,IAETtL,EAAKsL,EAAO,IAAK,EAAE,aAAe,GAGlChmB,GAAK,OAAQ+lB,EAAOrL,EAAKsL,EAAO,IAAK,EAAGA,EAAO,OAAQ,EAEzD,EAoCAhmB,GAAK,SAAWgH,GAAgB,SAAWrB,EAAMU,EACjD,CACC,GAAK,MAAM,QAASV,CAAK,EAAI,CAC5B,QAAUzC,EAAE,EAAGsL,EAAI7I,EAAK,OAASzC,EAAEsL,EAAMtL,IACxClD,GAAK,SAAU2F,EAAKzC,CAAC,EAAGmD,CAAI,EAE7B,MACD,CAEA,IACCrD,EAAG2F,EACHwd,EAAOxgB,EAAK,MAAM,GAAG,EACrBqgB,EAASjB,GACTna,EAAKwb,EAEFC,EAAO,SAAW/kB,EAAKqE,EAAO,CACjC,QAAU3C,EAAE,EAAG2F,EAAIrH,EAAI,OAAS0B,EAAE2F,EAAM3F,IACvC,GAAK1B,EAAI0B,CAAC,EAAE,OAAS2C,EACpB,OAAOrE,EAAI0B,CAAC,EAGd,OAAO,IACR,EAEA,IAAMA,EAAE,EAAG2F,EAAIwd,EAAK,OAASnjB,EAAE2F,EAAM3F,IAAM,CAC1CojB,EAASD,EAAKnjB,CAAC,EAAE,QAAQ,IAAI,IAAM,GACnC4H,EAAMwb,EACLD,EAAKnjB,CAAC,EAAE,QAAQ,KAAM,EAAE,EACxBmjB,EAAKnjB,CAAC,EAEP,IAAI1B,EAAM+kB,EAAML,EAAQpb,CAAI,EACrBtJ,IACNA,EAAM,CACL,KAAWsJ,EACX,IAAW,CAAC,EACZ,UAAW,CAAC,EACZ,QAAW,CAAC,EACZ,KAAW,QACZ,EACAob,EAAO,KAAM1kB,CAAI,GAGb0B,IAAM2F,EAAI,GACdrH,EAAI,IAAM+E,EACV/E,EAAI,KAAO,OAAO+E,GAAQ,WACzB,WACA7G,EAAE,cAAe6G,CAAI,EACpB,SACA,SAGF2f,EAASI,EACR9kB,EAAI,UACJA,EAAI,OAEP,CACD,EAEAtB,GAAK,eAAiBiH,GAAsB,SAAWqf,EAAYC,EAAclgB,EAAM,CACtFrG,GAAK,SAAUsmB,EAAYjgB,CAAI,EAE/BrG,GAAK,SAAUumB,EAAc,UAAY,CACxC,IAAIzP,EAAMzQ,EAAI,MAAO,KAAM,SAAU,EAErC,OAAKyQ,IAAQ,KAEL,KAEEA,aAAe9W,GAGjB8W,EAAI,OACV,MAAM,QAASA,EAAI,CAAC,CAAE,EACrB,IAAI9W,GAAM8W,EAAI,QAASA,EAAI,CAAC,CAAE,EAC9BA,EAAI,CAAC,EACN,OAIKA,CACR,CAAE,CACH,EAYA,IAAI0P,GAAmB,SAAW7mB,EAAU+F,EAC5C,CACC,GAAK,MAAM,QAAQ/F,CAAQ,EAC1B,OAAOH,EAAE,IAAKG,EAAU,SAAUgmB,EAAM,CACvC,OAAOa,GAAiBb,EAAMjgB,CAAC,CAChC,CAAE,EAIH,GAAK,OAAO/F,GAAa,SACxB,MAAO,CAAE+F,EAAG/F,CAAS,CAAE,EAIxB,IAAIkb,EAAQrb,EAAE,IAAKkG,EAAG,SAAUV,EAAIhC,EAAG,CACtC,OAAOgC,EAAG,MACX,CAAE,EAEF,OAAOxF,EAAEqb,CAAK,EACZ,OAAQlb,CAAS,EACjB,IAAK,SAAU,EAAG,CAElB,IAAIyR,EAAM5R,EAAE,QAAS,KAAMqb,CAAM,EACjC,OAAOnV,EAAG0L,CAAI,CACf,CAAE,EACD,QAAQ,CACX,EAeApK,GAAe,WAAY,SAAWrH,EAAW,CAEhD,OAAiCA,GAAa,KAC7C,IAAIK,GAAMwmB,GAAkB7mB,EAAU,KAAK,OAAQ,CAAE,EACrD,IACF,CAAE,EAGFqH,GAAe,UAAW,SAAWrH,EAAW,CAC/C,IAAIylB,EAAS,KAAK,OAAQzlB,CAAS,EAC/B4lB,EAAMH,EAAO,QAGjB,OAAOG,EAAI,OACV,IAAIvlB,GAAMulB,EAAI,CAAC,CAAE,EACjBH,CACF,CAAE,EAGFne,GAAqB,mBAAoB,iBAAmB,UAAY,CACvE,OAAO,KAAK,SAAU,QAAS,SAAWse,EAAM,CAC/C,OAAOA,EAAI,MACZ,EAAG,CAAE,CACN,CAAE,EAGFte,GAAqB,kBAAmB,iBAAmB,UAAY,CACtE,OAAO,KAAK,SAAU,QAAS,SAAWse,EAAM,CAC/C,OAAOA,EAAI,MACZ,EAAG,CAAE,CACN,CAAE,EAGFte,GAAqB,oBAAqB,mBAAqB,UAAY,CAC1E,OAAO,KAAK,SAAU,QAAS,SAAWse,EAAM,CAC/C,OAAOA,EAAI,MACZ,EAAG,CAAE,CACN,CAAE,EAGFte,GAAqB,oBAAqB,mBAAqB,UAAY,CAC1E,OAAO,KAAK,SAAU,QAAS,SAAWse,EAAM,CAC/C,OAAOA,EAAI,MACZ,EAAG,CAAE,CACN,CAAE,EAGFte,GAAqB,wBAAyB,sBAAwB,UAAY,CACjF,OAAO,KAAK,SAAU,QAAS,SAAWse,EAAM,CAC/C,OAAOA,EAAI,aACZ,EAAG,CAAE,CACN,CAAE,EAOFve,GAAe,SAAU,SAAWyf,EAAS,CAC5C,OAAO,KAAK,SAAU,QAAS,SAAWjmB,EAAW,CAC/CimB,IAAW,OACf/T,GAASlS,CAAS,GAGb,OAAOimB,GAAW,WACtBA,EAASA,IAAW,aAKrBxS,GAAWzT,EAAUimB,IAAS,EAAM,EAEtC,CAAE,CACH,CAAE,EAuBFzf,GAAe,SAAU,SAAWqV,EAAS,CAC5C,OAAKA,IAAW,OACR,KAAK,KAAK,KAAK,EAAE,KAIlB,KAAK,SAAU,QAAS,SAAW7b,EAAW,CACpD4b,GAAe5b,EAAU6b,CAAO,CACjC,CAAE,CACH,CAAE,EAqBFrV,GAAe,cAAe,SAAWqV,EAAS,CACjD,GAAK,KAAK,QAAQ,SAAW,EAI7B,KACC7b,EAAa,KAAK,QAAQ,CAAC,EAC3BuI,EAAavI,EAAS,eACtBkC,EAAalC,EAAS,UAAU,UAAYA,EAAS,gBAAkB,GACvEwb,EAAaxb,EAAS,iBAAiB,EACvC2a,EAAazY,IAAQ,GAEtB,MAAO,CACN,KAAkByY,EAAM,EAAI,KAAK,MAAOpS,EAAQrG,CAAI,EACpD,MAAkByY,EAAM,EAAI,KAAK,KAAMa,EAAatZ,CAAI,EACxD,MAAkBqG,EAClB,IAAkBvI,EAAS,aAAa,EACxC,OAAkBkC,EAClB,aAAkBlC,EAAS,eAAe,EAC1C,eAAkBwb,EAClB,WAAkBzV,GAAe/F,CAAS,IAAM,KACjD,EACD,CAAE,EAcFwG,GAAe,aAAc,SAAWtE,EAAM,CAI7C,OAAKA,IAAQ,OACL,KAAK,QAAQ,SAAW,EAC9B,KAAK,QAAQ,CAAC,EAAE,gBAChB,OAIK,KAAK,SAAU,QAAS,SAAWlC,EAAW,CACpDgb,GAAiBhb,EAAUkC,CAAI,CAChC,CAAE,CACH,CAAE,EAIF,IAAIgkB,GAAW,SAAWlmB,EAAU0T,EAAcrT,EAAW,CAE5D,GAAKA,EAAW,CACf,IAAIR,EAAM,IAAIL,GAAMQ,CAAS,EAE7BH,EAAI,IAAK,OAAQ,UAAY,CAC5BQ,EAAUR,EAAI,KAAK,KAAK,CAAE,CAC3B,CAAE,CACH,CAEA,GAAKkG,GAAe/F,CAAS,GAAK,MACjCyT,GAAWzT,EAAU0T,CAAa,MAE9B,CACJpB,GAAsBtS,EAAU,EAAK,EAGrC,IAAIoW,EAAMpW,EAAS,MACdoW,GAAOA,EAAI,aAAe,GAC9BA,EAAI,MAAM,EAIXV,GAAc1V,EAAU,CAAC,EAAG,SAAUmE,EAAO,CAC5C0L,GAAe7P,CAAS,EAGxB,QADIL,EAAOqW,GAAgBhW,EAAUmE,CAAK,EAChC3B,EAAE,EAAG2F,EAAIxI,EAAK,OAAS6C,EAAE2F,EAAM3F,IACxC4D,GAAYpG,EAAUL,EAAK6C,CAAC,CAAE,EAG/BiR,GAAWzT,EAAU0T,CAAa,EAClCpB,GAAsBtS,EAAU,EAAM,CACvC,CAAE,CACH,CACD,EAUAwG,GAAe,cAAe,UAAY,CACzC,IAAIue,EAAM,KAAK,QAEf,GAAKA,EAAI,OAAS,EACjB,OAAOA,EAAI,CAAC,EAAE,IAIhB,CAAE,EAMFve,GAAe,gBAAiB,UAAY,CAC3C,IAAIue,EAAM,KAAK,QAEf,GAAKA,EAAI,OAAS,EACjB,OAAOA,EAAI,CAAC,EAAE,SAIhB,CAAE,EAYFve,GAAe,gBAAiB,SAAWnG,EAAU8lB,EAAc,CAClE,OAAO,KAAK,SAAU,QAAS,SAAUnmB,EAAU,CAClDkmB,GAAUlmB,EAAUmmB,IAAc,GAAO9lB,CAAS,CACnD,CAAE,CACH,CAAE,EAeFmG,GAAe,aAAc,SAAW4f,EAAM,CAC7C,IAAIrB,EAAM,KAAK,QAEf,OAAKqB,IAAQ,OAEPrB,EAAI,SAAW,EACnB,QAEDA,EAAMA,EAAI,CAAC,EAEJA,EAAI,KACV/lB,EAAE,cAAe+lB,EAAI,IAAK,EACzBA,EAAI,KAAK,IACTA,EAAI,KACLA,EAAI,aAIC,KAAK,SAAU,QAAS,SAAW/kB,EAAW,CAC/ChB,EAAE,cAAegB,EAAS,IAAK,EACnCA,EAAS,KAAK,IAAMomB,EAGpBpmB,EAAS,KAAOomB,CAKlB,CAAE,CACH,CAAE,EAYF5f,GAAe,oBAAqB,SAAWnG,EAAU8lB,EAAc,CAGtE,OAAO,KAAK,SAAU,QAAS,SAAWpB,EAAM,CAC/CmB,GAAUnB,EAAKoB,IAAc,GAAO9lB,CAAS,CAC9C,CAAE,CACH,CAAE,EAKF,IAAIgmB,GAAgB,SAAWrlB,EAAM7B,EAAUmnB,EAAUtmB,EAAUumB,EACnE,CACC,IACCre,EAAM,CAAC,EAAGse,EACVthB,EAAG1C,EAAG2F,EAAKzF,EAAGsL,EACdyY,EAAe,OAAOtnB,EAQvB,KAJK,CAAEA,GAAYsnB,IAAiB,UAAYA,IAAiB,YAActnB,EAAS,SAAW,UAClGA,EAAW,CAAEA,CAAS,GAGjBqD,EAAE,EAAG2F,EAAIhJ,EAAS,OAASqD,EAAE2F,EAAM3F,IAMxC,IAJA0C,EAAI/F,EAASqD,CAAC,GAAKrD,EAASqD,CAAC,EAAE,OAAS,CAAErD,EAASqD,CAAC,EAAE,MAAM,SAAS,EACpErD,EAASqD,CAAC,EAAE,MAAM,GAAG,EACrB,CAAErD,EAASqD,CAAC,CAAE,EAETE,EAAE,EAAGsL,EAAI9I,EAAE,OAASxC,EAAEsL,EAAMtL,IACjC8jB,EAAMF,EAAU,OAAOphB,EAAExC,CAAC,GAAM,SAAYwC,EAAExC,CAAC,EAAG,KAAK,EAAIwC,EAAExC,CAAC,CAAE,EAE3D8jB,GAAOA,EAAI,SACfte,EAAMA,EAAI,OAAQse,CAAI,GAMzB,IAAI3C,EAAMnkB,GAAK,SAAUsB,CAAK,EAC9B,GAAK6iB,EAAI,OACR,IAAMrhB,EAAE,EAAG2F,EAAI0b,EAAI,OAASrhB,EAAE2F,EAAM3F,IACnC0F,EAAM2b,EAAIrhB,CAAC,EAAGxC,EAAUumB,EAAMre,CAAI,EAIpC,OAAOW,GAASX,CAAI,CACrB,EAGIwe,GAAiB,SAAWH,EAChC,CACC,OAAOA,IACNA,EAAO,CAAC,GAKJA,EAAK,QAAUA,EAAK,SAAW,SACnCA,EAAK,OAASA,EAAK,QAGbvnB,EAAE,OAAQ,CAChB,OAAQ,OACR,MAAO,UACP,KAAM,KACP,EAAGunB,CAAK,CACT,EAGII,GAAkB,SAAWC,EACjC,CAEC,QAAUpkB,EAAE,EAAG2F,EAAIye,EAAK,OAASpkB,EAAE2F,EAAM3F,IACxC,GAAKokB,EAAKpkB,CAAC,EAAE,OAAS,EAGrB,OAAAokB,EAAK,CAAC,EAAIA,EAAKpkB,CAAC,EAChBokB,EAAK,CAAC,EAAE,OAAS,EACjBA,EAAK,OAAS,EACdA,EAAK,QAAU,CAAEA,EAAK,QAAQpkB,CAAC,CAAE,EAE1BokB,EAKT,OAAAA,EAAK,OAAS,EACPA,CACR,EAGIvB,GAAwB,SAAWrlB,EAAUumB,EACjD,CACC,IACC/jB,EAAG2F,EAAKlE,EAAKiB,EAAE,CAAC,EAChB2hB,EAAkB7mB,EAAS,UAC3BwZ,EAAgBxZ,EAAS,gBAGzBiJ,EAASsd,EAAK,OACdle,EAASke,EAAK,MACd9K,EAAS8K,EAAK,KAEf,GAAKxgB,GAAe/F,CAAS,GAAK,MAKjC,OAAOiJ,IAAW,UACjB,CAAC,EACDX,GAAQ,EAAGkR,EAAc,MAAO,EAE7B,GAAKiC,GAAQ,UAIjB,IAAMjZ,EAAExC,EAAS,eAAgBmI,EAAInI,EAAS,aAAa,EAAIwC,EAAE2F,EAAM3F,IACtE0C,EAAE,KAAM2hB,EAAgBrkB,CAAC,CAAE,UAGnB6F,GAAS,WAAaA,GAAS,WACxC,GAAKY,GAAU,OACd/D,EAAIsU,EAAc,MAAM,UAEfvQ,GAAU,UACnB/D,EAAI2hB,EAAgB,MAAM,UAEjB5d,GAAU,UAAY,CAI/B,QAFI6d,EAAqB,CAAC,EAEhBtkB,EAAE,EAAG2F,EAAI0e,EAAgB,OAASrkB,EAAE2F,EAAM3F,IACnDskB,EAAmBD,EAAgBrkB,CAAC,CAAC,EAAI,KAG1C0C,EAAIlG,EAAE,IAAKwa,EAAe,SAAUhV,EAAI,CACvC,OAASsiB,EAAmB,eAAetiB,CAAE,EAE5C,KADAA,CAEF,CAAE,CACH,UAES6D,GAAS,SAAWA,GAAS,WACtC,IAAM7F,EAAE,EAAG2F,EAAInI,EAAS,OAAO,OAASwC,EAAE2F,EAAM3F,IAC1CyG,GAAU,OACd/D,EAAE,KAAM1C,CAAE,GAGVyB,EAAMjF,EAAE,QAASwD,EAAGqkB,CAAgB,GAE/B5iB,IAAQ,IAAMgF,GAAU,WAC3BhF,GAAO,GAAOgF,GAAU,YAEzB/D,EAAE,KAAM1C,CAAE,GAMd,OAAO0C,CACR,EAaI6hB,GAAiB,SAAW/mB,EAAUb,EAAUonB,EACpD,CACC,IAAIzmB,EACAknB,EAAM,SAAWC,EAAM,CAC1B,IAAIC,EAAShgB,GAAS+f,CAAI,EACtBzkB,EAAG2F,EACHiL,EAASpT,EAAS,OAKtB,GAAKknB,IAAW,MAAQ,CAAEX,EACzB,MAAO,CAAEW,CAAO,EAOjB,GAJOpnB,IACNA,EAAOulB,GAAuBrlB,EAAUumB,CAAK,GAGzCW,IAAW,MAAQloB,EAAE,QAASkoB,EAAQpnB,CAAK,IAAM,GAErD,MAAO,CAAEonB,CAAO,EAEZ,GAAKD,GAAQ,MAA6BA,IAAQ,GAEtD,OAAOnnB,EAIR,GAAK,OAAOmnB,GAAQ,WACnB,OAAOjoB,EAAE,IAAKc,EAAM,SAAU8Q,EAAK,CAClC,IAAIvG,EAAM+I,EAAQxC,CAAI,EACtB,OAAOqW,EAAKrW,EAAKvG,EAAI,OAAQA,EAAI,GAAI,EAAIuG,EAAM,IAChD,CAAE,EAIH,GAAKqW,EAAI,SAAW,CACnB,IAAI7X,EAAS6X,EAAI,aACbE,EAAUF,EAAI,cAElB,GAAK7X,IAAW,OAEf,OAAOgE,EAAQhE,CAAO,GAAKgE,EAAQhE,CAAO,EAAE,MAAQ6X,EACnD,CAAE7X,CAAO,EACT,CAAC,EAEE,GAAK+X,EACT,OAAO/T,EAAQ+T,EAAQ,GAAI,GAAK/T,EAAQ+T,EAAQ,GAAI,EAAE,MAAQF,EAAI,WACjE,CAAEE,EAAQ,GAAI,EACd,CAAC,EAGF,IAAI7C,EAAOtlB,EAAEioB,CAAG,EAAE,QAAQ,gBAAgB,EAC1C,OAAO3C,EAAK,OACX,CAAEA,EAAK,KAAK,QAAQ,CAAE,EACtB,CAAC,CAEJ,CAWA,GAAK,OAAO2C,GAAQ,UAAYA,EAAI,OAAO,CAAC,IAAM,IAAM,CAEvD,IAAIG,EAASpnB,EAAS,KAAMinB,EAAI,QAAS,KAAM,EAAG,CAAE,EACpD,GAAKG,IAAW,OACf,MAAO,CAAEA,EAAO,GAAI,CAKtB,CAGA,IAAI/M,EAAQ5R,GACXL,GAAcpI,EAAS,OAAQF,EAAM,KAAM,CAC5C,EAKA,OAAOd,EAAEqb,CAAK,EACZ,OAAQ4M,CAAI,EACZ,IAAK,UAAY,CACjB,OAAO,KAAK,YACb,CAAE,EACD,QAAQ,CACX,EAEA,OAAOZ,GAAe,MAAOlnB,EAAU6nB,EAAKhnB,EAAUumB,CAAK,CAC5D,EAGA/f,GAAe,SAAU,SAAWrH,EAAUonB,EAAO,CAE/CpnB,IAAa,OACjBA,EAAW,GAEFH,EAAE,cAAeG,CAAS,IACnConB,EAAOpnB,EACPA,EAAW,IAGZonB,EAAOG,GAAgBH,CAAK,EAE5B,IAAIK,EAAO,KAAK,SAAU,QAAS,SAAW5mB,EAAW,CACxD,OAAO+mB,GAAgB/mB,EAAUb,EAAUonB,CAAK,CACjD,EAAG,CAAE,EAGL,OAAAK,EAAK,SAAS,KAAOznB,EACrBynB,EAAK,SAAS,KAAOL,EAEdK,CACR,CAAE,EAEFpgB,GAAe,iBAAkB,UAAY,CAC5C,OAAO,KAAK,SAAU,MAAO,SAAWxG,EAAUqK,EAAM,CACvD,OAAOrK,EAAS,OAAQqK,CAAI,EAAE,KAAO,MACtC,EAAG,CAAE,CACN,CAAE,EAEF7D,GAAe,gBAAiB,UAAY,CAC3C,OAAO,KAAK,SAAU,GAAM,OAAQ,SAAWxG,EAAUF,EAAO,CAC/D,OAAOsI,GAAcpI,EAAS,OAAQF,EAAM,QAAS,CACtD,EAAG,CAAE,CACN,CAAE,EAEF2G,GAAqB,iBAAkB,gBAAiB,SAAWzF,EAAO,CACzE,OAAO,KAAK,SAAU,MAAO,SAAWhB,EAAUqK,EAAM,CACvD,IAAIgd,EAAIrnB,EAAS,OAAQqK,CAAI,EAC7B,OAAOrJ,IAAS,SAAWqmB,EAAE,aAAeA,EAAE,UAC/C,EAAG,CAAE,CACN,CAAE,EAEF5gB,GAAqB,sBAAuB,qBAAsB,SAAW3F,EAAM,CAClF,OAAO,KAAK,SAAU,MAAO,SAAWd,EAAUqK,EAAM,CACvD6F,GAAelQ,EAAUqK,EAAKvJ,CAAI,CACnC,CAAE,CACH,CAAE,EAEF2F,GAAqB,mBAAoB,gBAAiB,UAAY,CACrE,OAAO,KAAK,SAAU,MAAO,SAAWzG,EAAUqK,EAAM,CACvD,OAAOA,CACR,EAAG,CAAE,CACN,CAAE,EAEF5D,GAAqB,eAAgB,aAAc,SAAW6gB,EAAO,CAKpE,QAJIpiB,EAAI,CAAC,EACL2f,EAAU,KAAK,QAGT,EAAE,EAAG1c,EAAI0c,EAAQ,OAAS,EAAE1c,EAAM,IAC3C,QAAUzF,EAAE,EAAGsL,EAAI,KAAK,CAAC,EAAE,OAAStL,EAAEsL,EAAMtL,IAAM,CACjD,IAAIoM,EAAK+V,EAAQ,CAAC,EAAE,QAASA,EAAQ,CAAC,EAAE,OAAQ,KAAK,CAAC,EAAEniB,CAAC,CAAE,EAAE,MAAO,EACpEwC,EAAE,MAAOoiB,IAAS,GAAO,IAAM,IAAMxY,CAAG,CACzC,CAGD,OAAO,IAAItP,GAAMqlB,EAAS3f,CAAE,CAC7B,CAAE,EAEFuB,GAAqB,kBAAmB,iBAAkB,UAAY,CACrE,IAAI6C,EAAO,KAEX,YAAK,SAAU,MAAO,SAAWtJ,EAAUqK,EAAKkd,EAAU,CACzD,IAAI5nB,EAAOK,EAAS,OAChB6M,EAAUlN,EAAM0K,CAAI,EACpB7H,EAAG2F,EAAKzF,EAAGsL,EACXwZ,EAASC,EAKb,IAHA9nB,EAAK,OAAQ0K,EAAK,CAAE,EAGd7H,EAAE,EAAG2F,EAAIxI,EAAK,OAAS6C,EAAE2F,EAAM3F,IAUpC,GATAglB,EAAU7nB,EAAK6C,CAAC,EAChBilB,EAAYD,EAAQ,QAGfA,EAAQ,MAAQ,OACpBA,EAAQ,IAAI,aAAehlB,GAIvBilB,IAAc,KAClB,IAAM/kB,EAAE,EAAGsL,EAAIyZ,EAAU,OAAS/kB,EAAEsL,EAAMtL,IACzC+kB,EAAU/kB,CAAC,EAAE,cAAc,IAAMF,EAMpCsN,GAAgB9P,EAAS,gBAAiBqK,CAAI,EAC9CyF,GAAgB9P,EAAS,UAAWqK,CAAI,EACxCyF,GAAgBxG,EAAMie,CAAQ,EAAGld,EAAK,EAAM,EAGvCrK,EAAS,iBAAmB,GAChCA,EAAS,mBAIVib,GAAmBjb,CAAS,EAG5B,IAAI8O,EAAK9O,EAAS,QAAS6M,EAAQ,MAAO,EACrCiC,IAAO,QACX,OAAO9O,EAAS,KAAM8O,CAAG,CAE3B,CAAE,EAEF,KAAK,SAAU,QAAS,SAAW9O,EAAW,CAC7C,QAAUwC,EAAE,EAAG2F,EAAInI,EAAS,OAAO,OAASwC,EAAE2F,EAAM3F,IACnDxC,EAAS,OAAOwC,CAAC,EAAE,IAAMA,CAE3B,CAAE,EAEK,IACR,CAAE,EAGFgE,GAAe,aAAc,SAAW1G,EAAO,CAC9C,IAAI4nB,EAAU,KAAK,SAAU,QAAS,SAAW1nB,EAAW,CAC1D,IAAIqK,EAAK7H,EAAG2F,EACRD,EAAM,CAAC,EAEX,IAAM1F,EAAE,EAAG2F,EAAIrI,EAAK,OAAS0C,EAAE2F,EAAM3F,IACpC6H,EAAMvK,EAAK0C,CAAC,EAEP6H,EAAI,UAAYA,EAAI,SAAS,YAAY,IAAM,KACnDnC,EAAI,KAAM7B,GAAUrG,EAAUqK,CAAI,EAAE,CAAC,CAAE,EAGvCnC,EAAI,KAAM9B,GAAYpG,EAAUqK,CAAI,CAAE,EAIxC,OAAOnC,CACR,EAAG,CAAE,EAGFyf,EAAU,KAAK,KAAM,EAAG,EAC5B,OAAAA,EAAQ,IAAI,EACZ3oB,EAAE,MAAO2oB,EAASD,CAAQ,EAEnBC,CACR,CAAE,EASFnhB,GAAe,QAAS,SAAWrH,EAAUonB,EAAO,CACnD,OAAOI,GAAiB,KAAK,KAAMxnB,EAAUonB,CAAK,CAAE,CACrD,CAAE,EAGF/f,GAAe,eAAgB,SAAW7G,EAAO,CAChD,IAAIolB,EAAM,KAAK,QAEf,GAAKplB,IAAS,OAEb,OAAOolB,EAAI,QAAU,KAAK,OACzBA,EAAI,CAAC,EAAE,OAAQ,KAAK,CAAC,CAAE,EAAE,OACzB,OAIF,IAAI1a,EAAM0a,EAAI,CAAC,EAAE,OAAQ,KAAK,CAAC,CAAE,EACjC,OAAA1a,EAAI,OAAS1K,EAGR,MAAM,QAASA,CAAK,GAAK0K,EAAI,KAAOA,EAAI,IAAI,IAChD0C,GAAoBgY,EAAI,CAAC,EAAE,KAAM,EAAGplB,EAAM0K,EAAI,IAAI,EAAG,EAItD6F,GAAe6U,EAAI,CAAC,EAAG,KAAK,CAAC,EAAG,MAAO,EAEhC,IACR,CAAE,EAGFve,GAAe,eAAgB,UAAY,CAC1C,IAAIue,EAAM,KAAK,QAEf,OAAOA,EAAI,QAAU,KAAK,QACzBA,EAAI,CAAC,EAAE,OAAQ,KAAK,CAAC,CAAE,EAAE,KAAO,IAElC,CAAE,EAGFve,GAAe,YAAa,SAAW6D,EAAM,CAGvCA,aAAerL,GAAKqL,EAAI,SAC5BA,EAAMA,EAAI,CAAC,GAGZ,IAAIvK,EAAO,KAAK,SAAU,QAAS,SAAWE,EAAW,CACxD,OAAKqK,EAAI,UAAYA,EAAI,SAAS,YAAY,IAAM,KAC5ChE,GAAUrG,EAAUqK,CAAI,EAAE,CAAC,EAE5BjE,GAAYpG,EAAUqK,CAAI,CAClC,CAAE,EAGF,OAAO,KAAK,IAAKvK,EAAK,CAAC,CAAE,CAC1B,CAAE,EAGFd,EAAE,QAAQ,EAAE,GAAG,iBAAkB,SAAUkZ,EAAG2M,EAAS,CACtD,IAAIhlB,EAAM,IAAIL,GAAMqlB,CAAQ,EACxB+C,EAAY,iBACZC,EAAuB,mBAAqBD,EAC5CE,EAAe,YAAcF,EAEjC/nB,EAAI,GAAIgoB,EAAsB,SAAW3P,EAAGlY,EAAUiH,EAAI,CAOzD,QAJI8gB,EAAO/nB,EAAS,QAChBL,EAAOK,EAAS,OAChBgoB,EAAM,CAAC,EAEFxlB,EAAE,EAAIA,EAAE7C,EAAK,OAAS6C,IAC1B7C,EAAK6C,CAAC,EAAE,cACXwlB,EAAI,KAAM,IAAMD,EAAKpoB,EAAK6C,CAAC,EAAE,MAAM,CAAE,EAIvCyE,EAAE,UAAY+gB,CACf,CAAC,EAEDnoB,EAAI,GAAIioB,EAAc,UAAY,CACjCjoB,EAAI,IAAIgoB,EAAuB,IAAMC,CAAY,CAClD,CAAC,EAED,IAAIxE,EAASzjB,EAAI,MAAM,OAAO,EAEzByjB,GAAUA,EAAO,WACrBzjB,EACE,KAAMb,EAAE,IAAIskB,EAAO,UAAW,SAAUxU,EAAG,CAC3C,OAAOA,EAAG,QAAQ,KAAM,KAAK,CAC9B,CAAC,CAAE,EACF,MAAO,UAAY,CACnB1K,GAAiBygB,EAAS,KAAM,eAAgB,CAAE,IAAK,CAAE,CAC1D,CAAC,CAEJ,CAAC,EAED,IAAIoD,GAAgB,SAAWlD,EAAK1a,EAAK1K,EAAMuoB,EAC/C,CAEC,IAAIpoB,EAAO,CAAC,EACRqoB,EAAS,SAAWd,EAAGzkB,EAAI,CAE9B,GAAK,MAAM,QAASykB,CAAE,GAAKA,aAAaroB,EAAI,CAC3C,QAAUwD,EAAE,EAAG2F,EAAIkf,EAAE,OAAS7kB,EAAE2F,EAAM3F,IACrC2lB,EAAQd,EAAE7kB,CAAC,EAAGI,CAAE,EAEjB,MACD,CAIA,GAAKykB,EAAE,UAAYA,EAAE,SAAS,YAAY,IAAM,KAC/CvnB,EAAK,KAAMunB,CAAE,MAET,CAEJ,IAAIe,EAAUppB,EAAE,oBAAoB,EAAE,SAAU4D,CAAE,EAClD5D,EAAE,KAAMopB,CAAO,EACb,SAAUxlB,CAAE,EACZ,KAAMykB,CAAE,EACR,CAAC,EAAE,QAAU1Z,GAAkBoX,CAAI,EAErCjlB,EAAK,KAAMsoB,EAAQ,CAAC,CAAE,CACvB,CACD,EAEAD,EAAQxoB,EAAMuoB,CAAM,EAEf7d,EAAI,UACRA,EAAI,SAAS,OAAO,EAGrBA,EAAI,SAAWrL,EAAEc,CAAI,EAGhBuK,EAAI,cACRA,EAAI,SAAS,YAAaA,EAAI,GAAI,CAEpC,EAIIge,GAAkBnpB,GAAU,KAAK,SACpC,SAAU6lB,EAAK,CACdze,GAAcye,EAAI,CAAC,CAAE,CACtB,EACA,GACD,EAGIuD,GAAmB,SAAWzoB,EAAK+Q,EACvC,CACC,IAAImU,EAAMllB,EAAI,QAEd,GAAKklB,EAAI,OAAS,CACjB,IAAI1a,EAAM0a,EAAI,CAAC,EAAE,OAAQnU,IAAQ,OAAYA,EAAM/Q,EAAI,CAAC,CAAE,EAErDwK,GAAOA,EAAI,WACfA,EAAI,SAAS,OAAO,EAEpBA,EAAI,aAAe,OACnBA,EAAI,SAAW,OACfrL,EAAGqL,EAAI,GAAI,EAAE,YAAa,aAAc,EACxCge,GAAiBtD,CAAI,EAEvB,CACD,EAGIwD,GAAoB,SAAW1oB,EAAKmc,EAAO,CAC9C,IAAI+I,EAAMllB,EAAI,QAEd,GAAKklB,EAAI,QAAUllB,EAAI,OAAS,CAC/B,IAAIwK,EAAM0a,EAAI,CAAC,EAAE,OAAQllB,EAAI,CAAC,CAAE,EAE3BwK,EAAI,WACRA,EAAI,aAAe2R,EAEdA,GACJ3R,EAAI,SAAS,YAAaA,EAAI,GAAI,EAClCrL,EAAGqL,EAAI,GAAI,EAAE,SAAU,aAAc,IAGrCA,EAAI,SAAS,OAAO,EACpBrL,EAAGqL,EAAI,GAAI,EAAE,YAAa,aAAc,GAGzCjG,GAAiB2gB,EAAI,CAAC,EAAG,KAAM,WAAY,CAAE/I,EAAMnc,EAAI,IAAKA,EAAI,CAAC,CAAE,CAAE,CAAE,EAEvE2oB,GAAkBzD,EAAI,CAAC,CAAE,EACzBsD,GAAiBtD,CAAI,EAEvB,CACD,EAGIyD,GAAmB,SAAWxoB,EAClC,CACC,IAAIH,EAAM,IAAIL,GAAMQ,CAAS,EACzB4nB,EAAY,iBACZa,EAAY,OAAOb,EACnBc,EAAc,gBAAgBd,EAC9BE,EAAe,UAAUF,EACzBjoB,EAAOK,EAAS,OAEpBH,EAAI,IAAK4oB,EAAW,IAAKC,EAAa,IAAKZ,CAAa,EAEnD/f,GAAQpI,EAAM,UAAW,EAAE,OAAS,IAExCE,EAAI,GAAI4oB,EAAW,SAAWvQ,EAAG6M,EAAM,CACjC/kB,IAAa+kB,GAIlBllB,EAAI,KAAM,CAAC,KAAK,SAAS,CAAE,EAAE,GAAG,CAAC,EAAE,KAAM,SAAU+Q,EAAK,CAEvD,IAAIvG,EAAM1K,EAAMiR,CAAI,EAEfvG,EAAI,cACRA,EAAI,SAAS,YAAaA,EAAI,GAAI,CAEpC,CAAE,CACH,CAAE,EAGFxK,EAAI,GAAI6oB,EAAa,SAAWxQ,EAAG6M,EAAKnU,EAAKhD,EAAM,CAClD,GAAK5N,IAAa+kB,EAQlB,QAFI1a,EAAKse,EAAUhb,GAAkBoX,CAAI,EAE/BviB,EAAE,EAAG2F,EAAIxI,EAAK,OAAS6C,EAAE2F,EAAM3F,IACxC6H,EAAM1K,EAAK6C,CAAC,EAEP6H,EAAI,UACRA,EAAI,SAAS,SAAS,aAAa,EAAE,KAAK,UAAWse,CAAQ,CAGhE,CAAE,EAGF9oB,EAAI,GAAIioB,EAAc,SAAW5P,EAAG6M,EAAM,CACzC,GAAK/kB,IAAa+kB,EAIlB,QAAUviB,EAAE,EAAG2F,EAAIxI,EAAK,OAAS6C,EAAE2F,EAAM3F,IACnC7C,EAAK6C,CAAC,EAAE,UACZ8lB,GAAkBzoB,EAAK2C,CAAE,CAG5B,CAAE,EAEJ,EAGIomB,GAAO,GACPC,GAAaD,GAAK,cAClBE,GAAaD,GAAW,KAM5BriB,GAAesiB,GAAY,SAAWnpB,EAAMuoB,EAAQ,CACnD,IAAInD,EAAM,KAAK,QAEf,OAAKplB,IAAS,OAENolB,EAAI,QAAU,KAAK,OACzBA,EAAI,CAAC,EAAE,OAAQ,KAAK,CAAC,CAAE,EAAE,SACzB,QAEQplB,IAAS,GAElB,KAAK,MAAM,KAAK,EAEPA,IAAS,GAElB2oB,GAAkB,IAAK,EAEdvD,EAAI,QAAU,KAAK,QAE5BkD,GAAelD,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAE,OAAQ,KAAK,CAAC,CAAE,EAAGplB,EAAMuoB,CAAM,EAGvD,KACR,CAAE,EAGF1hB,GAAe,CACdqiB,GAAW,UACXC,GAAW,SACZ,EAAG,SAAW9M,EAAO,CACpB,OAAAuM,GAAmB,KAAM,EAAK,EACvB,IACR,CAAE,EAGF/hB,GAAe,CACdqiB,GAAW,UACXC,GAAW,SACZ,EAAG,UAAY,CACd,OAAAP,GAAmB,KAAM,EAAM,EACxB,IACR,CAAE,EAGF/hB,GAAe,CACdqiB,GAAW,YACXC,GAAW,WACZ,EAAG,UAAY,CACd,OAAAR,GAAkB,IAAK,EAChB,IACR,CAAE,EAGF9hB,GAAeqiB,GAAW,aAAc,UAAY,CACnD,IAAI9D,EAAM,KAAK,QAEf,OAAKA,EAAI,QAAU,KAAK,QAEhBA,EAAI,CAAC,EAAE,OAAQ,KAAK,CAAC,CAAE,EAAE,cAAgB,EAGlD,CAAE,EAkBF,IAAIgE,GAAuB,kCAKvBC,GAAe,SAAWhpB,EAAUoR,EAAQ6X,EAAIC,EAAIppB,EAAO,CAE9D,QADIoF,EAAI,CAAC,EACCmF,EAAI,EAAGlC,EAAIrI,EAAK,OAASuK,EAAIlC,EAAMkC,IAC5CnF,EAAE,KAAMkJ,GAAgBpO,EAAUF,EAAKuK,CAAG,EAAG+G,CAAO,CAAE,EAEvD,OAAOlM,CACR,EAGIikB,GAAoB,SAAWnpB,EAAUb,EAAUonB,EACvD,CACC,IACCpZ,EAAUnN,EAAS,UACnBopB,EAAQrhB,GAAQoF,EAAS,OAAQ,EACjCkN,EAAQtS,GAAQoF,EAAS,KAAM,EAE5B6Z,EAAM,SAAWzjB,EAAI,CACxB,IAAI2jB,EAAShgB,GAAS3D,CAAE,EAGxB,GAAKA,IAAM,GACV,OAAO+E,GAAQ6E,EAAQ,MAAO,EAI/B,GAAK+Z,IAAW,KACf,MAAO,CAAEA,GAAU,EAClBA,EACA/Z,EAAQ,OAAS+Z,CAClB,EAID,GAAK,OAAO3jB,GAAM,WAAa,CAC9B,IAAIzD,EAAOulB,GAAuBrlB,EAAUumB,CAAK,EAEjD,OAAOvnB,EAAE,IAAKmO,EAAS,SAAUpM,EAAK6P,EAAK,CAC1C,OAAOrN,EACLqN,EACAoY,GAAchpB,EAAU4Q,EAAK,EAAG,EAAG9Q,CAAK,EACxCua,EAAOzJ,CAAI,CACZ,EAAIA,EAAM,IACZ,CAAE,CACH,CAGA,IAAIjG,EAAQ,OAAOpH,GAAM,SACxBA,EAAE,MAAOwlB,EAAqB,EAC9B,GAED,GAAKpe,EACJ,OAAQA,EAAM,CAAC,EAAI,CAClB,IAAK,SACL,IAAK,UACJ,IAAIiG,EAAM,SAAUjG,EAAM,CAAC,EAAG,EAAG,EAEjC,GAAKiG,EAAM,EAAI,CAEd,IAAIyY,EAAarqB,EAAE,IAAKmO,EAAS,SAAUpM,EAAIyB,EAAG,CACjD,OAAOzB,EAAI,SAAWyB,EAAI,IAC3B,CAAE,EACF,MAAO,CAAE6mB,EAAYA,EAAW,OAASzY,CAAI,CAAE,CAChD,CAEA,MAAO,CAAEvD,GAAyBrN,EAAU4Q,CAAI,CAAE,EAEnD,IAAK,OAEJ,OAAO5R,EAAE,IAAKoqB,EAAO,SAAUjkB,EAAM3C,EAAG,CACvC,OAAO2C,IAASwF,EAAM,CAAC,EAAInI,EAAI,IAChC,CAAE,EAEH,QACC,MAAO,CAAC,CACV,CAID,GAAKe,EAAE,UAAYA,EAAE,cACpB,MAAO,CAAEA,EAAE,cAAc,MAAO,EAIjC,IAAI+lB,EAAWtqB,EAAGqb,CAAM,EACtB,OAAQ9W,CAAE,EACV,IAAK,UAAY,CACjB,OAAOvE,EAAE,QAAS,KAAMqb,CAAM,CAC/B,CAAE,EACD,QAAQ,EAEV,GAAKiP,EAAS,QAAU,CAAE/lB,EAAE,SAC3B,OAAO+lB,EAKR,IAAIhF,EAAOtlB,EAAEuE,CAAC,EAAE,QAAQ,mBAAmB,EAC3C,OAAO+gB,EAAK,OACX,CAAEA,EAAK,KAAK,WAAW,CAAE,EACzB,CAAC,CACH,EAEA,OAAO+B,GAAe,SAAUlnB,EAAU6nB,EAAKhnB,EAAUumB,CAAK,CAC/D,EAGIgD,GAAiB,SAAWvpB,EAAUoR,EAAQxD,EAAM,CACvD,IACCyC,EAAOrQ,EAAS,UAChBe,EAAOsP,EAAMe,CAAO,EACpBzR,EAAOK,EAAS,OAChBqK,EAAK+F,EAAO5N,EAAG2F,EAAK+I,EAGrB,GAAKtD,IAAQ,OACZ,OAAO7M,EAAI,SAKZ,GAAKA,EAAI,WAAa6M,EAItB,IAAKA,EAAM,CAGV,IAAI4b,EAAexqB,EAAE,QAAS,GAAM+I,GAAOsI,EAAM,UAAU,EAAGe,EAAO,CAAE,EAEvE,IAAM5O,EAAE,EAAG2F,EAAIxI,EAAK,OAAS6C,EAAE2F,EAAM3F,IACpC0O,EAAKvR,EAAK6C,CAAC,EAAE,IACb4N,EAAQzQ,EAAK6C,CAAC,EAAE,QAEX0O,GAEJA,EAAG,aAAcd,EAAOgB,CAAO,EAAGhB,EAAOoZ,CAAa,GAAK,IAAK,CAGnE,MAGCxqB,EAAG+I,GAAQ/H,EAAS,OAAQ,UAAWoR,CAAO,CAAE,EAAE,OAAO,EAI1DrQ,EAAI,SAAW6M,EAChB,EAGApH,GAAe,YAAa,SAAWrH,EAAUonB,EAAO,CAElDpnB,IAAa,OACjBA,EAAW,GAEFH,EAAE,cAAeG,CAAS,IACnConB,EAAOpnB,EACPA,EAAW,IAGZonB,EAAOG,GAAgBH,CAAK,EAE5B,IAAIK,EAAO,KAAK,SAAU,QAAS,SAAW5mB,EAAW,CACxD,OAAOmpB,GAAmBnpB,EAAUb,EAAUonB,CAAK,CACpD,EAAG,CAAE,EAGL,OAAAK,EAAK,SAAS,KAAOznB,EACrBynB,EAAK,SAAS,KAAOL,EAEdK,CACR,CAAE,EAEFngB,GAAqB,qBAAsB,oBAAqB,SAAWtH,EAAUonB,EAAO,CAC3F,OAAO,KAAK,SAAU,SAAU,SAAWvmB,EAAUoR,EAAS,CAC7D,OAAOpR,EAAS,UAAUoR,CAAM,EAAE,GACnC,EAAG,CAAE,CACN,CAAE,EAEF3K,GAAqB,qBAAsB,oBAAqB,SAAWtH,EAAUonB,EAAO,CAC3F,OAAO,KAAK,SAAU,SAAU,SAAWvmB,EAAUoR,EAAS,CAC7D,OAAOpR,EAAS,UAAUoR,CAAM,EAAE,GACnC,EAAG,CAAE,CACN,CAAE,EAEF3K,GAAqB,mBAAoB,kBAAmB,UAAY,CACvE,OAAO,KAAK,SAAU,cAAeuiB,GAAc,CAAE,CACtD,CAAE,EAEFviB,GAAqB,sBAAuB,qBAAsB,UAAY,CAC7E,OAAO,KAAK,SAAU,SAAU,SAAWzG,EAAUoR,EAAS,CAC7D,OAAOpR,EAAS,UAAUoR,CAAM,EAAE,KACnC,EAAG,CAAE,CACN,CAAE,EAEF3K,GAAqB,oBAAqB,mBAAoB,SAAWzF,EAAO,CAC/E,OAAO,KAAK,SAAU,cAAe,SAAWhB,EAAUoR,EAAQ,EAAG1O,EAAG5C,EAAO,CAC9E,OAAOsI,GAAcpI,EAAS,OAAQF,EACrCkB,IAAS,SAAW,eAAiB,aAAcoQ,CACpD,CACD,EAAG,CAAE,CACN,CAAE,EAEF3K,GAAqB,oBAAqB,mBAAoB,UAAY,CACzE,OAAO,KAAK,SAAU,cAAe,SAAWzG,EAAUoR,EAAQ5O,EAAGE,EAAG5C,EAAO,CAC9E,OAAOsI,GAAcpI,EAAS,OAAQF,EAAM,UAAWsR,CAAO,CAC/D,EAAG,CAAE,CACN,CAAE,EAEF3K,GAAqB,sBAAuB,qBAAsB,SAAWmH,EAAK6b,EAAO,CACxF,IAAIngB,EAAO,KACPgN,EAAM,KAAK,SAAU,SAAU,SAAWtW,EAAUoR,EAAS,CAChE,GAAKxD,IAAQ,OACZ,OAAO5N,EAAS,UAAWoR,CAAO,EAAE,SAErCmY,GAAgBvpB,EAAUoR,EAAQxD,CAAI,CACvC,CAAE,EAGF,OAAKA,IAAQ,QACZ,KAAK,SAAU,QAAS,SAAW5N,EAAW,CAE7CyR,GAAazR,EAAUA,EAAS,QAAS,EACzCyR,GAAazR,EAAUA,EAAS,QAAS,EAIlCA,EAAS,UAAU,QACzBhB,EAAEgB,EAAS,MAAM,EAAE,KAAK,aAAa,EAAE,KAAK,UAAW2N,GAAiB3N,CAAQ,CAAC,EAGlFsG,GAActG,CAAS,EAGvBsJ,EAAK,SAAU,SAAU,SAAWtJ,EAAUoR,EAAS,CACtDhN,GAAiBpE,EAAU,KAAM,oBAAqB,CAACA,EAAUoR,EAAQxD,EAAK6b,CAAI,CAAE,CACrF,CAAE,GAEGA,IAAS,QAAaA,IAC1BngB,EAAK,QAAQ,OAAO,CAEtB,CAAC,EAGKgN,CACR,CAAE,EAEF7P,GAAqB,sBAAuB,mBAAoB,SAAWzF,EAAO,CACjF,OAAO,KAAK,SAAU,SAAU,SAAWhB,EAAUoR,EAAS,CAC7D,OAAOpQ,IAAS,UACfyM,GAAyBzN,EAAUoR,CAAO,EAC1CA,CACF,EAAG,CAAE,CACN,CAAE,EAEF5K,GAAe,mBAAoB,UAAY,CAC9C,OAAO,KAAK,SAAU,QAAS,SAAWxG,EAAW,CACpDkN,GAAuBlN,CAAS,CACjC,EAAG,CAAE,CACN,CAAE,EAEFwG,GAAe,iBAAkB,SAAWxF,EAAM4P,EAAM,CACvD,GAAK,KAAK,QAAQ,SAAW,EAAI,CAChC,IAAImU,EAAM,KAAK,QAAQ,CAAC,EAExB,GAAK/jB,IAAS,eAAiBA,IAAS,SACvC,OAAOqM,GAAyB0X,EAAKnU,CAAI,EAErC,GAAK5P,IAAS,YAAcA,IAAS,YACzC,OAAOyM,GAAyBsX,EAAKnU,CAAI,CAE3C,CACD,CAAE,EAEFpK,GAAe,WAAY,SAAWrH,EAAUonB,EAAO,CACtD,OAAOI,GAAiB,KAAK,QAASxnB,EAAUonB,CAAK,CAAE,CACxD,CAAE,EAEF,IAAImD,GAAkB,SAAW1pB,EAAUb,EAAUonB,EACrD,CACC,IAAI5mB,EAAOK,EAAS,OAChBF,EAAOulB,GAAuBrlB,EAAUumB,CAAK,EAC7CnW,EAAQ3H,GAAcL,GAAczI,EAAMG,EAAM,SAAU,CAAE,EAC5D6pB,EAAW3qB,EAAE+J,GAAU,CAAC,EAAGqH,CAAM,CAAC,EAClC/F,EACA8C,EAAUnN,EAAS,UAAU,OAC7BkF,EAAG1C,EAAG2F,EAAKzF,EAAGL,EAAGiiB,EAEjB0C,EAAM,SAAWzjB,EAAI,CACxB,IAAIqmB,GAAa,OAAOrmB,GAAM,WAE9B,GAAKA,GAAM,MAA2BqmB,GAAa,CAIlD,IAFA1kB,EAAI,CAAC,EAEC1C,EAAE,EAAG2F,EAAIrI,EAAK,OAAS0C,EAAE2F,EAAM3F,IAGpC,IAFA6H,EAAMvK,EAAK0C,CAAC,EAENE,EAAE,EAAIA,EAAEyK,EAAUzK,IACvBL,EAAI,CACH,IAAKgI,EACL,OAAQ3H,CACT,EAEKknB,IAEJtF,EAAO3kB,EAAM0K,CAAI,EAEZ9G,EAAGlB,EAAG+L,GAAepO,EAAUqK,EAAK3H,CAAC,EAAG4hB,EAAK,QAAUA,EAAK,QAAQ5hB,CAAC,EAAI,IAAK,GAClFwC,EAAE,KAAM7C,CAAE,GAKX6C,EAAE,KAAM7C,CAAE,EAKb,OAAO6C,CACR,CAGA,GAAKlG,EAAE,cAAeuE,CAAE,EAEvB,OAAOA,EAAE,SAAW,QAAaA,EAAE,MAAQ,QAAavE,EAAE,QAASuE,EAAE,IAAKzD,CAAK,IAAM,GACpF,CAACyD,CAAC,EACF,CAAC,EAIH,IAAI+lB,EAAWK,EACb,OAAQpmB,CAAE,EACV,IAAK,SAAUf,EAAGgC,EAAI,CACtB,MAAO,CACN,IAAQA,EAAG,cAAc,IACzB,OAAQA,EAAG,cAAc,MACzB,CACF,CAAE,EACD,QAAQ,EAEV,OAAK8kB,EAAS,QAAU,CAAE/lB,EAAE,SACpB+lB,GAMRhF,EAAOtlB,EAAEuE,CAAC,EAAE,QAAQ,gBAAgB,EAC7B+gB,EAAK,OACX,CAAE,CACD,IAAKA,EAAK,KAAK,QAAQ,EACvB,OAAQA,EAAK,KAAK,WAAW,CAC9B,CAAE,EACF,CAAC,EACH,EAEA,OAAO+B,GAAe,OAAQlnB,EAAU6nB,EAAKhnB,EAAUumB,CAAK,CAC7D,EAKA/f,GAAe,UAAW,SAAWqjB,EAAaC,EAAgBvD,EAAO,CAqBxE,GAnBKvnB,EAAE,cAAe6qB,CAAY,IAE5BA,EAAY,MAAQ,QAExBtD,EAAOsD,EACPA,EAAc,OAIdtD,EAAOuD,EACPA,EAAiB,OAGd9qB,EAAE,cAAe8qB,CAAe,IACpCvD,EAAOuD,EACPA,EAAiB,MAIbA,GAAmB,KACvB,OAAO,KAAK,SAAU,QAAS,SAAW9pB,EAAW,CACpD,OAAO0pB,GAAiB1pB,EAAU6pB,EAAanD,GAAgBH,CAAK,CAAE,CACvE,CAAE,EAIH,IAAIwD,EAAexD,EAAO,CACzB,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,OAAQA,EAAK,MACd,EAAI,CAAC,EAGDpZ,EAAU,KAAK,QAAS2c,EAAgBC,CAAa,EACrDjqB,EAAO,KAAK,KAAM+pB,EAAaE,CAAa,EAC5CvnB,EAAG2F,EAAKzF,EAAGsL,EAEXgc,EAAc,KAAK,SAAU,QAAS,SAAWhqB,EAAU4Q,EAAM,CACpE,IAAI1L,EAAI,CAAC,EAET,IAAM1C,EAAE,EAAG2F,EAAIrI,EAAK8Q,CAAG,EAAE,OAASpO,EAAE2F,EAAM3F,IACzC,IAAME,EAAE,EAAGsL,EAAIb,EAAQyD,CAAG,EAAE,OAASlO,EAAEsL,EAAMtL,IAC5CwC,EAAE,KAAM,CACP,IAAQpF,EAAK8Q,CAAG,EAAEpO,CAAC,EACnB,OAAQ2K,EAAQyD,CAAG,EAAElO,CAAC,CACvB,CAAE,EAIJ,OAAOwC,CACR,EAAG,CAAE,EAKDkL,EAAQmW,GAAQA,EAAK,SACxB,KAAK,MAAOyD,EAAazD,CAAK,EAC9ByD,EAED,OAAAhrB,EAAE,OAAQoR,EAAM,SAAU,CACzB,KAAM0Z,EACN,KAAMD,EACN,KAAMtD,CACP,CAAE,EAEKnW,CACR,CAAE,EAGF3J,GAAqB,kBAAmB,gBAAiB,UAAY,CACpE,OAAO,KAAK,SAAU,OAAQ,SAAWzG,EAAUqK,EAAK+G,EAAS,CAChE,IAAIzR,EAAOK,EAAS,OAAQqK,CAAI,EAEhC,OAAO1K,GAAQA,EAAK,QACnBA,EAAK,QAASyR,CAAO,EACrB,MACF,EAAG,CAAE,CACN,CAAE,EAGF5K,GAAe,iBAAkB,UAAY,CAC5C,OAAO,KAAK,SAAU,OAAQ,SAAWxG,EAAUqK,EAAK+G,EAAS,CAChE,OAAOhD,GAAgBpO,EAAUqK,EAAK+G,CAAO,CAC9C,EAAG,CAAE,CACN,CAAE,EAGF3K,GAAqB,kBAAmB,iBAAkB,SAAWzF,EAAO,CAC3E,OAAAA,EAAOA,IAAS,SAAW,eAAiB,aAErC,KAAK,SAAU,OAAQ,SAAWhB,EAAUqK,EAAK+G,EAAS,CAChE,OAAOpR,EAAS,OAAQqK,CAAI,EAAGrJ,CAAK,EAAGoQ,CAAO,CAC/C,EAAG,CAAE,CACN,CAAE,EAGF3K,GAAqB,mBAAoB,kBAAmB,SAAWzF,EAAO,CAC7E,OAAO,KAAK,SAAU,OAAQ,SAAWhB,EAAUqK,EAAK+G,EAAS,CAChE,OAAOhD,GAAgBpO,EAAUqK,EAAK+G,EAAQpQ,CAAK,CACpD,EAAG,CAAE,CACN,CAAE,EAGFyF,GAAqB,oBAAqB,iBAAkB,UAAY,CACvE,OAAO,KAAK,SAAU,OAAQ,SAAWzG,EAAUqK,EAAK+G,EAAS,CAChE,MAAO,CACN,IAAK/G,EACL,OAAQ+G,EACR,cAAe3D,GAAyBzN,EAAUoR,CAAO,CAC1D,CACD,EAAG,CAAE,CACN,CAAE,EAGF3K,GAAqB,uBAAwB,sBAAuB,SAAW3F,EAAM,CACpF,OAAO,KAAK,SAAU,OAAQ,SAAWd,EAAUqK,EAAK+G,EAAS,CAChElB,GAAelQ,EAAUqK,EAAKvJ,EAAKsQ,CAAO,CAC3C,CAAE,CACH,CAAE,EAIF5K,GAAe,SAAU,SAAWqjB,EAAaC,EAAgBvD,EAAO,CACvE,OAAOI,GAAiB,KAAK,MAAOkD,EAAaC,EAAgBvD,CAAK,CAAE,CACzE,CAAE,EAGF/f,GAAe,gBAAiB,SAAW7G,EAAO,CACjD,IAAIolB,EAAM,KAAK,QACX3jB,EAAO,KAAK,CAAC,EAEjB,OAAKzB,IAAS,OAENolB,EAAI,QAAU3jB,EAAK,OACzBgN,GAAgB2W,EAAI,CAAC,EAAG3jB,EAAK,CAAC,EAAE,IAAKA,EAAK,CAAC,EAAE,MAAO,EACpD,QAIFsO,GAAgBqV,EAAI,CAAC,EAAG3jB,EAAK,CAAC,EAAE,IAAKA,EAAK,CAAC,EAAE,OAAQzB,CAAK,EAC1DuQ,GAAe6U,EAAI,CAAC,EAAG3jB,EAAK,CAAC,EAAE,IAAK,OAAQA,EAAK,CAAC,EAAE,MAAO,EAEpD,KACR,CAAE,EAgCFoF,GAAe,UAAW,SAAW6B,EAAO4hB,EAAM,CACjD,IAAIlF,EAAM,KAAK,QAEf,OAAK1c,IAAU,OAEP0c,EAAI,SAAW,EACrBA,EAAI,CAAC,EAAE,UACP,QAIG,OAAO1c,GAAU,SAErBA,EAAQ,CAAE,CAAEA,EAAO4hB,CAAI,CAAE,EAEhB5hB,EAAM,QAAU,CAAE,MAAM,QAASA,EAAM,CAAC,CAAE,IAEnDA,EAAQ,MAAM,UAAU,MAAM,KAAM,SAAU,GAIxC,KAAK,SAAU,QAAS,SAAWrI,EAAW,CACpDA,EAAS,UAAYqI,EAAM,MAAM,CAClC,CAAE,EACH,CAAE,EAaF7B,GAAe,mBAAoB,SAAWtF,EAAMkQ,EAAQ/Q,EAAW,CACtE,OAAO,KAAK,SAAU,QAAS,SAAWL,EAAW,CACpDuR,GAAuBvR,EAAUkB,EAAMkQ,EAAQ/Q,CAAS,CACzD,CAAE,CACH,CAAE,EAGFmG,GAAe,gBAAiB,SAAW0jB,EAAM,CAChD,GAAK,CAAEA,EAAM,CACZ,IAAInF,EAAM,KAAK,QACX1D,EAAQ0D,EAAI,OACfA,EAAI,CAAC,EAAE,eACP,OAED,OAAO,MAAM,QAAS1D,CAAM,EAC3B,CAAE,IAAKA,CAAM,EACbA,CACF,CAEA,OAAO,KAAK,SAAU,QAAS,SAAWrhB,EAAW,CACpDA,EAAS,eAAiBhB,EAAE,OAAQ,GAAM,CAAC,EAAGkrB,CAAI,CACnD,CAAE,CACH,CAAE,EAIF1jB,GAAe,CACd,oBACA,kBACD,EAAG,SAAWyjB,EAAM,CACnB,IAAI3gB,EAAO,KAEX,OAAO,KAAK,SAAU,QAAS,SAAWtJ,EAAU,EAAI,CACvD,IAAIoF,EAAO,CAAC,EAEZpG,EAAE,KAAMsK,EAAK,CAAC,EAAG,SAAU5G,EAAG3B,EAAK,CAClCqE,EAAK,KAAM,CAAErE,EAAKkpB,CAAI,CAAE,CACzB,CAAE,EAEFjqB,EAAS,UAAYoF,CACtB,CAAE,CACH,CAAE,EAIFoB,GAAe,WAAY,SAAWoR,EAAOqB,EAAOC,EAAOiR,EAAY,CACtE,IAAIpF,EAAM,KAAK,QAEf,OAAKnN,IAAU,OAEPmN,EAAI,SAAW,EACrBA,EAAI,CAAC,EAAE,gBAAgB,QACvB,OAIK,KAAK,SAAU,QAAS,SAAW/kB,EAAW,CAC7CA,EAAS,UAAU,SAI1B4T,GAAmB5T,EAAUhB,EAAE,OAAQ,CAAC,EAAGgB,EAAS,gBAAiB,CACpE,QAAW4X,EAAM,GACjB,OAAWqB,IAAU,KAAO,GAAQA,EACpC,OAAWC,IAAU,KAAO,GAAQA,EACpC,iBAAoBiR,IAAc,KAAO,GAAOA,CACjD,CAAE,EAAG,CAAE,CACR,CAAE,CACH,CAAE,EAGF1jB,GACC,qBACA,oBACA,SAAWmR,EAAOqB,EAAOC,EAAOiR,EAAY,CAC3C,OAAO,KAAK,SAAU,SAAU,SAAWnqB,EAAUoR,EAAS,CAC7D,IAAIsF,EAAY1W,EAAS,gBAEzB,GAAK4X,IAAU,OAEd,OAAOlB,EAAWtF,CAAO,EAAE,QAIrBpR,EAAS,UAAU,UAI1BhB,EAAE,OAAQ0X,EAAWtF,CAAO,EAAG,CAC9B,QAAWwG,EAAM,GACjB,OAAWqB,IAAU,KAAO,GAAQA,EACpC,OAAWC,IAAU,KAAO,GAAQA,EACpC,iBAAoBiR,IAAc,KAAO,GAAOA,CACjD,CAAE,EAEFvW,GAAmB5T,EAAUA,EAAS,gBAAiB,CAAE,EAC1D,CAAE,CACH,CACD,EAMAwG,GAAe,UAAW,UAAY,CACrC,OAAO,KAAK,QAAQ,OACnB,KAAK,QAAQ,CAAC,EAAE,YAChB,IACF,CAAE,EAGFA,GAAe,gBAAiB,UAAY,CAC3C,OAAO,KAAK,SAAU,QAAS,SAAWxG,EAAW,CAEpDA,EAAS,oBAAoB,KAAMA,EAAS,UAAWA,EAAU,CAAC,CAAE,CACrE,CAAE,CACH,CAAE,EAGFwG,GAAe,iBAAkB,UAAY,CAC5C,OAAO,KAAK,QAAQ,OACnB,KAAK,QAAQ,CAAC,EAAE,aAChB,IACF,CAAE,EAGFA,GAAe,eAAgB,UAAY,CAC1C,OAAO,KAAK,SAAU,QAAS,SAAWxG,EAAW,CACpDsG,GAActG,CAAS,CACxB,CAAE,CACH,CAAE,EAUFd,GAAU,IAAM,SAAUkrB,EAAQppB,EAAM,CACnCA,IAAS,OAASopB,EAAO,GAC5BprB,EAAIorB,GAEIppB,GAAQ,OAASopB,EAAO,YAChC,OAASA,EACT,SAAWA,EAAO,SAEpB,EAUAlrB,GAAU,QAAU,SAAUmrB,EAAM1F,EAAI,CACvC,IAAI2F,EAAK,GAGT,OAAID,GAAQA,EAAK,WAChB,OAASA,EACT,SAAWA,EAAK,UAIb1F,GAAMA,EAAG,IAAMA,EAAG,GAAG,SACxB3lB,EAAI2lB,EACJ2F,EAAK,IAGCA,CACR,EAiBAprB,GAAU,aAAeA,GAAU,eAAiB,SAAUqrB,EAC9D,CAKC,QAJIC,EAAQtrB,GAAU,QAAQ,MAAM,GAAG,EACnCurB,EAAQF,EAAQ,MAAM,GAAG,EACzBG,EAAOC,EAEDnoB,EAAE,EAAGC,EAAKgoB,EAAM,OAASjoB,EAAEC,EAAOD,IAK3C,GAJAkoB,EAAQ,SAAUF,EAAMhoB,CAAC,EAAG,EAAG,GAAK,EACpCmoB,EAAQ,SAAUF,EAAMjoB,CAAC,EAAG,EAAG,GAAK,EAGhCkoB,IAAUC,EAKd,OAAOD,EAAQC,EAGhB,MAAO,EACR,EAkBAzrB,GAAU,YAAcA,GAAU,cAAgB,SAAW4U,EAC7D,CACC,IAAIxJ,EAAItL,EAAE8U,CAAK,EAAE,IAAI,CAAC,EAClBwW,EAAK,GAET,OAAKxW,aAAiB5U,GAAU,IACxB,IAGRF,EAAE,KAAME,GAAU,SAAU,SAAU,EAAG,EAAG,CAC3C,IAAI0rB,EAAO,EAAE,YAAc5rB,EAAE,QAAS,EAAE,WAAW,EAAE,CAAC,EAAI,KACtD6rB,EAAO,EAAE,YAAc7rB,EAAE,QAAS,EAAE,WAAW,EAAE,CAAC,EAAI,MAErD,EAAE,SAAWsL,GAAKsgB,IAAStgB,GAAKugB,IAASvgB,KAC7CggB,EAAK,GAEP,CAAE,EAEKA,EACR,EAmBAprB,GAAU,OAASA,GAAU,SAAW,SAAWypB,EACnD,CACC,IAAI9oB,EAAM,GAELb,EAAE,cAAe2pB,CAAQ,IAC7B9oB,EAAM8oB,EAAQ,IACdA,EAAUA,EAAQ,SAGnB,IAAIzjB,EAAIlG,EAAE,IAAKE,GAAU,SAAU,SAAUmD,EAAG,CAC/C,GAAK,CAACsmB,GAAYA,GAAW3pB,EAAEqD,EAAE,MAAM,EAAE,GAAG,UAAU,EACrD,OAAOA,EAAE,MAEX,CAAE,EAEF,OAAOxC,EACN,IAAIL,GAAM0F,CAAE,EACZA,CACF,EAgBAhG,GAAU,iBAAmBmE,GAO7BmD,GAAe,MAAO,SAAWrH,EAAUonB,EAAO,CACjD,IACCzmB,EAAS,KAAK,KAAMymB,CAAK,EAAE,MAAM,EACjCuE,EAAS9rB,EAAEc,CAAI,EAEhB,OAAOd,EAAG,CAAC,EAAE,OACZ8rB,EAAO,OAAQ3rB,CAAS,EAAE,QAAQ,EAClC2rB,EAAO,KAAM3rB,CAAS,EAAE,QAAQ,CACjC,CAAE,CACH,CAAE,EAIFH,EAAE,KAAM,CAAE,KAAM,MAAO,KAAM,EAAG,SAAUwD,EAAG4H,EAAK,CACjD5D,GAAe4D,EAAI,KAAM,UAAkC,CAC1D,IAAIZ,EAAO,MAAM,UAAU,MAAM,KAAK,SAAS,EAG/CA,EAAK,CAAC,EAAIxK,EAAE,IAAKwK,EAAK,CAAC,EAAE,MAAO,IAAK,EAAG,SAAW0O,EAAI,CACtD,OAASA,EAAE,MAAM,QAAQ,EAExBA,EADAA,EAAE,KAEH,CAAE,EAAE,KAAM,GAAI,EAEf,IAAI0O,EAAO5nB,EAAG,KAAK,OAAO,EAAE,MAAM,CAAE,EACpC,OAAA4nB,EAAKxc,CAAG,EAAE,MAAOwc,EAAMpd,CAAK,EACrB,IACR,CAAE,CACH,CAAE,EAGFhD,GAAe,UAAW,UAAY,CACrC,OAAO,KAAK,SAAU,QAAS,SAAWxG,EAAW,CACpD6P,GAAe7P,CAAS,CACzB,CAAE,CACH,CAAE,EAGFwG,GAAe,aAAc,UAAY,CACxC,OAAO,IAAIhH,GAAM,KAAK,QAAS,KAAK,OAAQ,CAC7C,CAAE,EAGFgH,GAAe,SAAU,UAAY,CACpC,IAAIue,EAAM,KAAK,QACf,OAAOA,EAAI,OAASA,EAAI,CAAC,EAAE,MAAQ,IACpC,CAAE,EAGFve,GAAe,SAAU,UAAY,CACpC,OAAO,KAAK,SAAU,QAAS,SAAWxG,EAAW,CACpD,OAAO+H,GAAQ/H,EAAS,OAAQ,QAAS,CAC1C,CAAE,EAAE,QAAQ,CACb,CAAE,EAGFwG,GAAe,YAAa,SAAWlG,EAAS,CAC/C,OAAAA,EAASA,GAAU,GAEZ,KAAK,SAAU,QAAS,SAAWN,EAAW,CACpD,IAAIsR,EAAYtR,EAAS,SACrB8T,EAAY9T,EAAS,OACrBkG,EAAYlG,EAAS,OACrBiG,EAAYjG,EAAS,OACrBmG,EAAYnG,EAAS,OACrB+qB,EAAY/rB,EAAE8U,CAAK,EACnBkX,EAAYhsB,EAAEkH,CAAK,EACnB+kB,EAAYjsB,EAAEgB,EAAS,aAAa,EACpCF,EAAYd,EAAE,IAAKgB,EAAS,OAAQ,SAAUqnB,EAAG,CAAE,OAAOA,EAAE,GAAK,CAAE,EACnE7kB,EAAG2F,EAIPnI,EAAS,YAAc,GAGvBoE,GAAiBpE,EAAU,oBAAqB,UAAW,CAACA,CAAQ,CAAE,EAG/DM,GACN,IAAId,GAAMQ,CAAS,EAAE,QAAQ,EAAE,QAAS,EAAK,EAM9CirB,EAAU,IAAI,KAAK,EAAE,KAAK,eAAe,EAAE,IAAI,KAAK,EACpDjsB,EAAE,MAAM,EAAE,IAAI,OAAOgB,EAAS,SAAS,EAGlC8T,GAAS7N,EAAM,aACnB8kB,EAAQ,SAAS,OAAO,EAAE,OAAO,EACjCA,EAAQ,OAAQ9kB,CAAM,GAGlBE,GAAS2N,GAAS3N,EAAM,aAC5B4kB,EAAQ,SAAS,OAAO,EAAE,OAAO,EACjCA,EAAQ,OAAQ5kB,CAAM,GAGvBnG,EAAS,UAAY,CAAC,EACtBA,EAAS,eAAiB,CAAC,EAC3ByF,GAAmBzF,CAAS,EAE5BhB,EAAGc,CAAK,EAAE,YAAaE,EAAS,gBAAgB,KAAK,GAAG,CAAE,EAE1DhB,EAAE,SAAUiH,CAAK,EAAE,YAAaqL,EAAQ,UAAU,IACjDA,EAAQ,aAAa,IAAIA,EAAQ,cAAc,IAAIA,EAAQ,aAC5D,EAGA0Z,EAAQ,SAAS,EAAE,OAAO,EAC1BA,EAAQ,OAAQlrB,CAAK,EAErB,IAAIorB,EAAOlrB,EAAS,cAAc,WAG9BmrB,EAAgB7qB,EAAS,SAAW,SACxCyqB,EAASI,CAAc,EAAE,EACzBF,EAAWE,CAAc,EAAE,EAGtB,CAAE7qB,GAAU4qB,IAEhBA,EAAK,aAAcpX,EAAO9T,EAAS,oBAAqB,EAIxD+qB,EACE,IAAK,QAAS/qB,EAAS,aAAc,EACrC,YAAasR,EAAQ,MAAO,EAK9BnJ,EAAMnI,EAAS,iBAAiB,OAE3BmI,GACJ6iB,EAAQ,SAAS,EAAE,KAAM,SAAUxoB,EAAG,CACrCxD,EAAE,IAAI,EAAE,SAAUgB,EAAS,iBAAiBwC,EAAI2F,CAAG,CAAE,CACtD,CAAE,GAKJ,IAAIyI,EAAM5R,EAAE,QAASgB,EAAUd,GAAU,QAAS,EAC7C0R,IAAQ,IACZ1R,GAAU,SAAS,OAAQ0R,EAAK,CAAE,CAEpC,CAAE,CACH,CAAE,EAIF5R,EAAE,KAAM,CAAE,SAAU,MAAO,MAAO,EAAG,SAAWwD,EAAGxB,EAAO,CACzDwF,GAAexF,EAAK,cAAe,SAAWmB,EAAK,CAClD,IAAIokB,EAAO,KAAK,SAAS,KACrB1mB,EAAM,KAEV,OAAO,KAAK,SAAUmB,EAAM,SAAWhB,EAAUorB,EAAMC,EAAMC,EAAMC,EAAO,CAWzEppB,EAAG,KACFtC,EAAKmB,CAAK,EACToqB,EACApqB,IAAO,OAASqqB,EAAO9E,EACvBvlB,IAAO,OAASulB,EAAO,MACxB,EACA6E,EAAMC,EAAMC,EAAMC,CACnB,CACD,CAAE,CACH,CAAE,CACH,CAAE,EAKF/kB,GAAe,SAAU,SAAWglB,EAAOjd,EAAKkd,EAAS,CACxD,IAAI1G,EAAM,KAAK,QAAQ,CAAC,EACpB2G,EAAW5nB,GAAoB0nB,CAAM,EAAGzG,EAAI,SAAU,EAE1D,OAAK2G,IAAa,SACjBA,EAAWnd,GAGPkd,IAAW,QAAazsB,EAAE,cAAe0sB,CAAS,IACtDA,EAAWA,EAAUD,CAAO,IAAM,OACjCC,EAAUD,CAAO,EACjBC,EAAS,GAGJA,EAAS,QAAS,KAAMD,CAAO,CACvC,CAAE,EASFvsB,GAAU,QAAU,SAcpBA,GAAU,SAAW,CAAC,EAQtBA,GAAU,OAAS,CAAC,EASpBA,GAAU,OAAO,QAAU,CAM1B,iBAAoB,GAOpB,QAAW,GASX,OAAU,GAOV,OAAU,GAQV,OAAU,EACX,EAWAA,GAAU,OAAO,KAAO,CAMvB,IAAO,KAQP,QAAW,KAWX,OAAU,CAAC,EAcX,WAAc,KASd,aAAgB,KAWhB,YAAe,KAUf,YAAe,GAWf,IAAO,KASP,IAAO,EACR,EAcAA,GAAU,OAAO,QAAU,CAO1B,IAAO,KAWP,UAAa,KAUb,UAAa,KAOb,YAAe,KAMf,UAAa,KAMb,SAAY,KASZ,aAAgB,KAShB,UAAa,GAcb,cAAiB,KAgBjB,UAAa,KAab,UAAa,KASb,MAAS,KAUT,QAAW,KAQX,IAAO,KASP,IAAO,KAOP,OAAU,KAaV,gBAAmB,KASnB,gBAAmB,KAOnB,MAAS,KAQT,cAAiB,MAOjB,cAAiB,KAQjB,iBAAoB,KAMpB,OAAU,KAOV,MAAS,KAOT,OAAU,KAOV,WAAc,IACf,EAwBAA,GAAU,SAAW,CA4DpB,OAAU,KA8BV,UAAa,CAAC,CAAC,EAAE,KAAK,CAAC,EAuBvB,eAAkB,CAAC,EA6JnB,KAAQ,KA0BR,YAAe,CAAE,GAAI,GAAI,GAAI,GAAI,EAejC,UAAa,KAqBb,aAAgB,KA2BhB,aAAgB,CAAC,EAqBjB,gBAAmB,KAoBnB,WAAc,GAuBd,aAAgB,GA4BhB,SAAY,GAwBZ,QAAW,GAoBX,MAAS,GAmBT,cAAiB,GAkBjB,UAAa,GAqBb,YAAe,GAsCf,UAAa,GAwBb,gBAAmB,GAsBnB,YAAe,GAmBf,MAAS,GAoBT,WAAc,GAoBd,cAAiB,GAsBjB,aAAgB,GAyBhB,WAAc,GA4Bd,aAAgB,KAqBhB,eAAkB,KA4BlB,iBAAoB,KA8BpB,eAAkB,SAAWysB,EAAW,CACvC,OAAOA,EAAS,SAAS,EAAE,QAC1B,wBACA,KAAK,UAAU,UAChB,CACD,EA6BA,iBAAoB,KA8BpB,eAAkB,KAyBlB,eAAkB,KA0BlB,kBAAqB,KA6BrB,cAAiB,KA0BjB,aAAgB,KA2BhB,eAAkB,KAiClB,oBAAuB,SAAW3rB,EAAW,CAC5C,GAAI,CACH,OAAO,KAAK,OACVA,EAAS,iBAAmB,GAAK,eAAiB,cAAc,QAChE,cAAcA,EAAS,UAAU,IAAI,SAAS,QAC/C,CACD,CACD,OAAS,EAAG,CACX,MAAO,CAAC,CACT,CACD,EAsCA,kBAAqB,KAwBrB,cAAiB,KAgCjB,oBAAuB,SAAWA,EAAUL,EAAO,CAClD,GAAI,EACFK,EAAS,iBAAmB,GAAK,eAAiB,cAAc,QAChE,cAAcA,EAAS,UAAU,IAAI,SAAS,SAC9C,KAAK,UAAWL,CAAK,CACtB,CACD,OAASuY,EAAG,CAAC,CACd,EA2BA,kBAAqB,KAoBrB,eAAkB,KA4ClB,cAAiB,KAoBjB,eAAkB,GAqBlB,cAAiB,EAuBjB,UAAa,EAWb,SAAY,CAAC,EAUb,UAAa,CAQZ,MAAS,CAsBR,eAAkB,sCAuBlB,gBAAmB,sCACpB,EAQA,UAAa,CAqBZ,OAAU,QAuBV,MAAS,OAuBT,MAAS,OAuBT,UAAa,UACd,EAsBA,YAAe,6BAgCf,MAAS,8CAqBT,WAAc,8BAsBd,cAAiB,sCAuBjB,aAAgB,GA+BhB,SAAY,GAuBZ,WAAc,IAyCd,YAAe,sBAwBf,gBAAmB,aAoBnB,YAAe,GAmCf,QAAW,UAWX,mBAAsB,GAyBtB,KAAQ,GAsBR,aAAgB,2BACjB,EAwBA,QAAWlZ,EAAE,OAAQ,CAAC,EAAGE,GAAU,OAAO,OAAQ,EAqBlD,cAAiB,OAmBjB,YAAe,KAsDf,KAAQ,SAoBR,YAAe,KA4Bf,gBAAmB,iBAyBnB,SAAY,GAwBZ,cAAiB,GAwBjB,SAAY,GAkBZ,cAAiB,MAkBjB,SAAY,KAWZ,MAAS,UACV,EAEAuL,GAAiBvL,GAAU,QAAS,EAapCA,GAAU,SAAS,OAAS,CAuC3B,UAAa,KACb,UAAa,GAuCb,UAAa,CAAE,MAAO,MAAO,EAiC7B,YAAe,GAiCf,UAAa,GAiCb,SAAY,GAgCZ,cAAiB,KAqLjB,MAAS,KA0HT,QAAW,KAwBX,UAAa,KAmCb,OAAU,GAiCV,gBAAmB,GA2CnB,gBAAmB,KA4CnB,MAAS,GA0CT,cAAiB,MAoCjB,OAAU,KAyCV,MAAS,KAsCT,OAAU,IACX,EAEAuL,GAAiBvL,GAAU,SAAS,MAAO,EA0B3CA,GAAU,OAAO,UAAY,CAK5B,UAAa,CASZ,WAAc,KAWd,aAAgB,KAUhB,QAAW,KASX,MAAS,KAST,cAAiB,KASjB,UAAa,KASb,YAAe,KAUf,YAAe,KAQf,MAAS,KAQT,WAAc,KAUd,aAAgB,KAQhB,WAAc,IACf,EAOA,QAAW,CAQV,UAAa,KAQb,UAAa,EASb,GAAM,KAUN,QAAW,KASX,GAAM,IACP,EAOA,UAAa,CAOZ,eAAkB,IACnB,EAMA,SAAY,CAOX,gBAAmB,GASnB,eAAkB,GAOlB,UAAa,GAOb,SAAY,CACb,EAGA,KAAQ,KAiBR,YAAe,CAAC,EAQhB,OAAU,CAAC,EAOX,UAAa,CAAC,EAOd,gBAAmB,CAAC,EAOpB,KAAQ,CAAC,EAOT,UAAa,CAAC,EAOd,SAAY,CAAC,EAOb,SAAY,CAAC,EAUb,gBAAmB,CAAC,EASpB,gBAAmB,CAAC,EAcpB,UAAa,KAUb,eAAkB,CAAC,EASnB,gBAAmB,KAOnB,iBAAoB,CAAC,EAOrB,cAAiB,EAOjB,cAAiB,CAAC,EAOlB,iBAAoB,CAAC,EAOrB,iBAAoB,CAAC,EAOrB,eAAkB,CAAC,EAOnB,qBAAwB,CAAC,EAQzB,kBAAqB,CAAC,EAOtB,eAAkB,CAAC,EASnB,kBAAqB,CAAC,EAQtB,kBAAqB,CAAC,EAQtB,cAAiB,CAAC,EAOlB,SAAY,GAOZ,OAAU,KAOV,OAAU,KAOV,OAAU,KAOV,OAAU,KAOV,cAAiB,KAUjB,cAAiB,GAOjB,aAAgB,GAQhB,WAAc,CAAC,EAUf,KAAQ,KAOR,YAAe,KASf,gBAAmB,aASnB,eAAkB,EAelB,YAAe,CAAC,EAahB,YAAe,CAAC,EAOhB,YAAe,KAOf,aAAgB,KAShB,YAAe,KAUf,cAAiB,KASjB,MAAS,KAOT,KAAQ,OAOR,UAAa,OAQb,aAAgB,KAQhB,eAAkB,CAAC,EASnB,cAAiB,KAQjB,eAAkB,KASlB,YAAe,KAQf,MAAS,EAOT,SAAY,GAOZ,WAAc,GAOd,gBAAmB,GAOnB,eAAkB,EAWlB,eAAkB,EAWlB,iBAAoB,EAOpB,SAAY,CAAC,EAUb,UAAa,GAUb,QAAW,GAUX,cAAiB,KAOjB,MAAS,KAQT,kBAAqB,CAAC,EAOtB,eAAkB,UAClB,CACC,OAAO6G,GAAe,IAAK,GAAK,MAC/B,KAAK,eAAiB,EACtB,KAAK,gBAAgB,MACvB,EAMA,iBAAoB,UACpB,CACC,OAAOA,GAAe,IAAK,GAAK,MAC/B,KAAK,iBAAmB,EACxB,KAAK,UAAU,MACjB,EAMA,aAAgB,UAChB,CACC,IACC7D,EAAW,KAAK,gBAChBqG,EAAW,KAAK,eAChBkhB,EAAWlhB,EAAQrG,EACnB4Z,EAAW,KAAK,UAAU,OAC1BxW,EAAW,KAAK,UAChBsmB,EAAWtmB,EAAS,UAErB,OAAKA,EAAS,YACNsmB,IAAa,IAAS1pB,IAAQ,GACpCqG,EAAQuT,EACR,KAAK,IAAKvT,EAAMrG,EAAK,KAAK,gBAAiB,EAGrC,CAAE0pB,GAAYnC,EAAK3N,GAAW5Z,IAAM,GAC1C4Z,EACA2N,CAEH,EAOA,UAAa,KASb,UAAa,KAMb,UAAa,EAKb,YAAe,KAKf,YAAe,KAOf,UAAa,CAAC,EAOd,SAAY,CAAC,EAOb,QAAW,KAOX,MAAS,IACV,EA2BAvqB,GAAU,IAAMQ,GAAO,CAStB,QAAS,CAAC,EASV,QAAS,CAAC,EAQV,QAAS,WAYT,QAAS,QAwCT,QAAS,CAAC,EA6DV,OAAQ,CAAC,EA2BT,SAAU,CACT,KAAM,CAAC,EACP,OAAQ,CAAC,EACT,IAAK,CAAC,CACP,EAaA,SAAU,CAAC,EASX,OAAQ,CAQP,KAAM,IACP,EAgDA,MAAO,CAAC,EAGR,SAAU,CACT,WAAY,CAAC,EACb,OAAQ,CAAC,CACV,EA2CA,MAAO,CAAC,EAaR,KAAM,CAyCL,OAAQ,CAAC,EAuCT,OAAQ,CAAC,EAmET,MAAO,CAAC,CACT,EAQA,QAAS,EAeT,eAAgBR,GAAU,eAQ1B,UAAW,EAQX,YAAa,CAAC,EAQd,SAAUA,GAAU,OACrB,EAMAF,EAAE,OAAQU,GAAM,CACf,aAAcA,GAAK,OACnB,OAAcA,GAAK,KAAK,OACxB,UAAcA,GAAK,KAAK,OACxB,MAAcA,GAAK,KAAK,MACxB,YAAcA,GAAK,MACnB,WAAcA,GAAK,QACnB,KAAcA,GAAK,SACnB,YAAcA,GAAK,QACnB,YAAcA,GAAK,KACpB,CAAE,EAGFV,EAAE,OAAQE,GAAU,IAAI,QAAS,CAChC,OAAU,YACV,UAAa,YAGb,YAAe,kBACf,kBAAqB,UACrB,oBAAuB,WAGvB,WAAc,MACd,YAAe,OAGf,UAAa,mBAGb,SAAY,qBACZ,QAAW,oBACX,MAAS,kBACT,QAAW,8BACX,QAAW,oBACX,YAAe,wBAGf,SAAY,cACZ,UAAa,eACb,UAAa,UACb,aAAgB,wBAChB,cAAiB,uBACjB,cAAiB,mBACjB,YAAe,WAGf,aAAgB,GAGhB,cAAiB,GAGjB,eAAkB,oBAClB,YAAe,wBACf,iBAAoB,6BACpB,YAAe,wBACf,YAAe,wBACf,iBAAoB,6BAGpB,UAAa,GACb,UAAa,GAGb,YAAe,GACf,aAAgB,GAChB,SAAY,GACZ,mBAAsB,GACtB,oBAAuB,GACvB,gBAAmB,GACnB,UAAa,GACb,WAAc,GACd,WAAc,EACf,CAAE,EAGF,IAAI2sB,GAAgB3sB,GAAU,IAAI,MAElC,SAAS4sB,GAAWrQ,EAAMC,EAAQ,CACjC,IACCqQ,EAAU,CAAC,EACXpQ,EAAUkQ,GAAc,eACxBG,EAAO,KAAK,MAAOrQ,EAAU,CAAE,EAC/BnZ,EAAI,EAEL,OAAKkZ,GAASC,EACboQ,EAAUzjB,GAAQ,EAAGoT,CAAM,EAElBD,GAAQuQ,GACjBD,EAAUzjB,GAAQ,EAAGqT,EAAQ,CAAE,EAC/BoQ,EAAQ,KAAM,UAAW,EACzBA,EAAQ,KAAMrQ,EAAM,CAAE,GAEbD,GAAQC,EAAQ,EAAIsQ,GAC7BD,EAAUzjB,GAAQoT,GAAOC,EAAQ,GAAID,CAAM,EAC3CqQ,EAAQ,OAAQ,EAAG,EAAG,UAAW,EACjCA,EAAQ,OAAQ,EAAG,EAAG,CAAE,IAGxBA,EAAUzjB,GAAQmT,EAAKuQ,EAAK,EAAGvQ,EAAKuQ,EAAK,CAAE,EAC3CD,EAAQ,KAAM,UAAW,EACzBA,EAAQ,KAAMrQ,EAAM,CAAE,EACtBqQ,EAAQ,OAAQ,EAAG,EAAG,UAAW,EACjCA,EAAQ,OAAQ,EAAG,EAAG,CAAE,GAGzBA,EAAQ,MAAQ,OACTA,CACR,CAGA/sB,EAAE,OAAQ6sB,GAAe,CACxB,OAAQ,SAAWpQ,EAAMC,EAAQ,CAChC,MAAO,CAAE,WAAY,MAAO,CAC7B,EAEA,KAAM,SAAWD,EAAMC,EAAQ,CAC9B,MAAO,CAAG,QAAS,WAAY,OAAQ,MAAO,CAC/C,EAEA,QAAS,SAAWD,EAAMC,EAAQ,CACjC,MAAO,CAAEoQ,GAASrQ,EAAMC,CAAK,CAAE,CAChC,EAEA,eAAgB,SAAWD,EAAMC,EAAQ,CACxC,MAAO,CAAE,WAAYoQ,GAASrQ,EAAMC,CAAK,EAAG,MAAO,CACpD,EAEA,aAAc,SAAWD,EAAMC,EAAQ,CACtC,MAAO,CAAE,QAAS,WAAYoQ,GAASrQ,EAAMC,CAAK,EAAG,OAAQ,MAAO,CACrE,EAEA,mBAAoB,SAAUD,EAAMC,EAAO,CACzC,MAAO,CAAC,QAASoQ,GAASrQ,EAAMC,CAAK,EAAG,MAAM,CAC/C,EAGD,SAAUoQ,GAGV,eAAgB,CACjB,CAAE,EAGF9sB,EAAE,OAAQ,GAAME,GAAU,IAAI,SAAU,CACvC,WAAY,CACX,EAAG,SAAWc,EAAUskB,EAAM1T,EAAK+K,EAASF,EAAMC,EAAQ,CACzD,IAAIpK,EAAUtR,EAAS,SACnBiL,EAAOjL,EAAS,UAAU,UAC1BisB,EAAOjsB,EAAS,UAAU,MAAM,UAAY,CAAC,EAC7CksB,EAAYC,EAEZC,EAAS,SAAUC,EAAW1Q,EAAU,CAC3C,IAAInZ,EAAG2F,EAAKjH,GAAMorB,EAAQC,EACtBC,EAAgBlb,EAAQ,oBACxBmb,EAAe,SAAWvU,GAAI,CACjC0D,GAAe5b,EAAUkY,GAAE,KAAK,OAAQ,EAAK,CAC9C,EAEA,IAAM1V,EAAE,EAAG2F,EAAIwT,EAAQ,OAASnZ,EAAE2F,EAAM3F,IAGvC,GAFA8pB,EAAS3Q,EAAQnZ,CAAC,EAEb,MAAM,QAAS8pB,CAAO,EAAI,CAC9B,IAAIvgB,EAAQ/M,EAAG,KAAKstB,EAAO,OAAS,OAAO,IAAK,EAC9C,SAAUD,CAAU,EACtBD,EAAQrgB,EAAOugB,CAAO,CACvB,KACK,CAKJ,OAJAJ,EAAa,KACbC,EAAWG,EACXC,EAAWvsB,EAAS,UAEXssB,EAAS,CACjB,IAAK,WACJD,EAAU,OAAO,wCAAwC,EACzD,MAED,IAAK,QACJH,EAAajhB,EAAK,OAEbwQ,IAAS,IACb8Q,EAAW,GACXJ,GAAY,IAAMK,GAEnB,MAED,IAAK,WACJN,EAAajhB,EAAK,UAEbwQ,IAAS,IACb8Q,EAAW,GACXJ,GAAY,IAAMK,GAEnB,MAED,IAAK,OACJN,EAAajhB,EAAK,OAEbyQ,IAAU,GAAKD,IAASC,EAAM,KAClC6Q,EAAW,GACXJ,GAAY,IAAMK,GAEnB,MAED,IAAK,OACJN,EAAajhB,EAAK,OAEbyQ,IAAU,GAAKD,IAASC,EAAM,KAClC6Q,EAAW,GACXJ,GAAY,IAAMK,GAEnB,MAED,QACCN,EAAalsB,EAAS,eAAgBssB,EAAS,CAAE,EACjDH,EAAW1Q,IAAS6Q,EACnBhb,EAAQ,kBAAoB,GAC7B,KACF,CAEA,GAAK4a,IAAe,KAAO,CAC1B,IAAIQ,GAAM1sB,EAAS,MAAM,WAAa,IAClC2sB,GAAWR,EAAS,QAAQK,CAAa,IAAM,GAGnDtrB,GAAOlC,EAAE,IAAI0tB,GAAI,IAAK,CACpB,MAASpb,EAAQ,YAAY,IAAI6a,EACjC,gBAAiBnsB,EAAS,SAC1B,gBAAiB2sB,GAAW,OAAS,KACrC,aAAcV,EAAMK,CAAO,EAC3B,YAAa,OACb,eAAgBH,IAAa7a,EAAQ,kBAAoB,OAAS,KAClE,cAAegb,EACf,SAAYC,EACZ,GAAM3b,IAAQ,GAAK,OAAO0b,GAAW,SACpCtsB,EAAS,SAAU,IAAKssB,EACxB,IACF,CAAE,EACD,KAAMJ,CAAW,EACjB,SAAUG,CAAU,EAEtBrJ,GACC9hB,GAAM,CAAC,OAAQorB,CAAM,EAAGG,CACzB,CACD,CACD,CAEF,EAKIG,EAEJ,GAAI,CAKHA,EAAW5tB,EAAEslB,CAAI,EAAE,KAAK,SAAS,aAAa,EAAE,KAAK,QAAQ,CAC9D,OACOpM,EAAG,CAAC,CAEXkU,EAAQptB,EAAEslB,CAAI,EAAE,MAAM,EAAG3I,CAAQ,EAE5BiR,IAAa,QACjB5tB,EAAEslB,CAAI,EAAE,KAAM,gBAAgBsI,EAAS,GAAI,EAAE,QAAQ,OAAO,CAE9D,CACD,CACD,CAAE,EAMF5tB,EAAE,OAAQE,GAAU,IAAI,KAAK,OAAQ,CAGpC,SAAW+H,EAAGjH,EACd,CACC,IAAIqL,EAAUrL,EAAS,UAAU,SACjC,OAAOwH,GAAWP,EAAGoE,CAAQ,EAAI,MAAMA,EAAU,IAClD,EAGA,SAAWpE,EAAGjH,EACd,CAIC,GAAKiH,GAAK,EAAEA,aAAa,OAAS,CAAEJ,GAAS,KAAKI,CAAC,EAClD,OAAO,KAER,IAAI4lB,EAAS,KAAK,MAAM5lB,CAAC,EACzB,OAAQ4lB,IAAW,MAAQ,CAAC,MAAMA,CAAM,GAAM7lB,GAAOC,CAAC,EAAI,OAAS,IACpE,EAGA,SAAWA,EAAGjH,EACd,CACC,IAAIqL,EAAUrL,EAAS,UAAU,SACjC,OAAOwH,GAAWP,EAAGoE,EAAS,EAAK,EAAI,UAAUA,EAAU,IAC5D,EAGA,SAAWpE,EAAGjH,EACd,CACC,IAAIqL,EAAUrL,EAAS,UAAU,SACjC,OAAO4H,GAAcX,EAAGoE,CAAQ,EAAI,WAAWA,EAAU,IAC1D,EAGA,SAAWpE,EAAGjH,EACd,CACC,IAAIqL,EAAUrL,EAAS,UAAU,SACjC,OAAO4H,GAAcX,EAAGoE,EAAS,EAAK,EAAI,eAAeA,EAAU,IACpE,EAGA,SAAWpE,EAAGjH,EACd,CACC,OAAOgH,GAAQC,CAAE,GAAM,OAAOA,GAAM,UAAYA,EAAE,QAAQ,GAAG,IAAM,GAClE,OAAS,IACX,CACD,CAAE,EAYFjI,EAAE,OAAQE,GAAU,IAAI,KAAK,OAAQ,CACpC,KAAM,SAAWS,EAAO,CACvB,OAAOqH,GAAOrH,CAAI,EACjBA,EACA,OAAOA,GAAS,SACfA,EACE,QAASgH,GAAe,GAAI,EAC5B,QAASC,GAAU,EAAG,EACxB,EACH,EAEA,OAAQ,SAAWjH,EAAO,CACzB,OAAOqH,GAAOrH,CAAI,EACjBA,EACA,OAAOA,GAAS,SACfA,EAAK,QAASgH,GAAe,GAAI,EACjChH,CACH,CACD,CAAE,EAIF,IAAImtB,GAAmB,SAAW7lB,EAAG8lB,EAAcC,EAAKC,EAAM,CAC7D,GAAKhmB,IAAM,IAAM,CAACA,GAAKA,IAAM,KAC5B,MAAO,KAGR,IAAIjG,EAAO,OAAOiG,EAElB,OAAIjG,IAAS,UAAYA,IAAS,SAC1BiG,GAMH8lB,IACJ9lB,EAAIG,GAAeH,EAAG8lB,CAAa,GAG/B9lB,EAAE,UACD+lB,IACJ/lB,EAAIA,EAAE,QAAS+lB,EAAK,EAAG,GAGnBC,IACJhmB,EAAIA,EAAE,QAASgmB,EAAK,EAAG,IAIlBhmB,EAAI,EACZ,EAMA,SAASkE,GAAkB4hB,EAAe,CACzC/tB,EAAE,KACD,CAEC,IAAO,SAAWiI,EAAI,CACrB,OAAO6lB,GAAkB7lB,EAAG8lB,CAAa,CAC1C,EAGA,UAAW,SAAW9lB,EAAI,CACzB,OAAO6lB,GAAkB7lB,EAAG8lB,EAAchmB,EAAsB,CACjE,EAGA,WAAY,SAAWE,EAAI,CAC1B,OAAO6lB,GAAkB7lB,EAAG8lB,EAAcnmB,EAAS,CACpD,EAGA,eAAgB,SAAWK,EAAI,CAC9B,OAAO6lB,GAAkB7lB,EAAG8lB,EAAcnmB,GAAUG,EAAsB,CAC3E,CACD,EACA,SAAWqD,EAAKjI,EAAK,CAEpBzC,GAAK,KAAK,MAAO0K,EAAI2iB,EAAa,MAAO,EAAI5qB,EAGxCiI,EAAI,MAAM,SAAS,IACvB1K,GAAK,KAAK,OAAQ0K,EAAI2iB,CAAa,EAAIrtB,GAAK,KAAK,OAAO,KAE1D,CACD,CACD,CAIAV,EAAE,OAAQU,GAAK,KAAK,MAAO,CAE1B,WAAY,SAAWuH,EAAI,CAC1B,IAAIimB,EAAK,KAAK,MAAOjmB,CAAE,EACvB,OAAO,MAAMimB,CAAE,EAAI,KAAYA,CAChC,EAGA,WAAY,SAAWhoB,EAAI,CAC1B,OAAO8B,GAAO9B,CAAC,EACd,GACAA,EAAE,QACDA,EAAE,QAAS,SAAU,EAAG,EAAE,YAAY,EACtCA,EAAE,EACL,EAGA,aAAc,SAAWA,EAAI,CAG5B,OAAO8B,GAAO9B,CAAC,EACd,GACA,OAAOA,GAAM,SACZA,EAAE,YAAY,EACZA,EAAE,SAEHA,EAAE,SAAS,EADX,EAEJ,EAIA,aAAc,SAAW6c,EAAGC,EAAI,CAC/B,OAASD,EAAIC,EAAK,GAAOD,EAAIC,EAAK,EAAI,CACvC,EAEA,cAAe,SAAWD,EAAGC,EAAI,CAChC,OAASD,EAAIC,EAAK,EAAMD,EAAIC,EAAK,GAAK,CACvC,CACD,CAAE,EAIF7W,GAAiB,EAAG,EAGpBnM,EAAE,OAAQ,GAAME,GAAU,IAAI,SAAU,CACvC,OAAQ,CACP,EAAG,SAAWc,EAAUoB,EAAMgQ,EAAQE,EAAU,CAM/CtS,EAAEgB,EAAS,MAAM,EAAE,GAAI,cAAe,SAAWkY,EAAG6M,EAAKvf,EAAS2H,EAAU,CAC3E,GAAKnN,IAAa+kB,EAIlB,KAAI1V,EAAS+B,EAAO,IAEpBhQ,EACE,YACAkQ,EAAQ,SAAU,IAClBA,EAAQ,SACT,EACC,SAAUnE,EAASkC,CAAO,GAAK,MAC/BiC,EAAQ,SAAWnE,EAASkC,CAAO,GAAK,OACvCiC,EAAQ,UACRF,EAAO,aACT,EACF,CAAE,CACH,EAEA,SAAU,SAAWpR,EAAUoB,EAAMgQ,EAAQE,EAAU,CACtDtS,EAAE,QAAQ,EACR,SAAUsS,EAAQ,eAAgB,EAClC,OAAQlQ,EAAK,SAAS,CAAE,EACxB,OAAQpC,EAAE,SAAS,EAClB,SAAUsS,EAAQ,UAAU,IAAIF,EAAO,gBAAiB,CAC1D,EACC,SAAUhQ,CAAK,EAGjBpC,EAAEgB,EAAS,MAAM,EAAE,GAAI,cAAe,SAAWkY,EAAG6M,EAAKvf,EAAS2H,EAAU,CAC3E,GAAKnN,IAAa+kB,EAIlB,KAAI1V,EAAS+B,EAAO,IAEpBhQ,EACE,YAAakQ,EAAQ,SAAU,IAAIA,EAAQ,SAAU,EACrD,SAAUnE,EAASkC,CAAO,GAAK,MAC/BiC,EAAQ,SAAWnE,EAASkC,CAAO,GAAK,OACvCiC,EAAQ,UACRF,EAAO,aACT,EAEDhQ,EACE,KAAM,QAAQkQ,EAAQ,SAAU,EAChC,YACAA,EAAQ,YAAa,IACrBA,EAAQ,aAAc,IACtBA,EAAQ,SAAU,IAClBA,EAAQ,mBAAoB,IAC5BA,EAAQ,mBACT,EACC,SAAUnE,EAASkC,CAAO,GAAK,MAC/BiC,EAAQ,YAAcnE,EAASkC,CAAO,GAAK,OAC1CiC,EAAQ,aACRF,EAAO,gBACT,EACF,CAAE,CACH,CACD,CACD,CAAE,EASF,IAAI+b,GAAuB,SAAWlmB,EAAI,CACzC,OAAI,MAAM,QAAQA,CAAC,IAClBA,EAAIA,EAAE,KAAK,GAAG,GAGR,OAAOA,GAAM,SACnBA,EACE,QAAQ,KAAM,OAAO,EACrB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACxBA,CACF,EAGA,SAASmmB,GAAOC,EAAIC,EAAUC,EAASC,EAAQpC,EAAO,CACrD,OAAI,OAAO,OACHiC,EAAGC,CAAQ,EAAGlC,CAAK,EAElB,OAAO,MACRiC,EAAGE,CAAO,EAAGnC,CAAK,EAGnBoC,EAASH,EAAGG,CAAM,EAAGpC,CAAK,EAAIiC,CACtC,CAGA,IAAII,GAAc,GAClB,SAASC,GAAUzmB,EAAG0mB,EAAQC,EAAQ,CACrC,IAAIP,EAEJ,GAAI,OAAO,QAGV,GAFAA,EAAK,OAAO,OAAO,IAAKpmB,EAAG0mB,EAAQC,EAAQ,EAAK,EAE5C,CAAEP,EAAG,QAAQ,EAChB,OAAO,aAGA,OAAO,MAAO,CAKtB,GAJAA,EAAKM,GAAU,OAAO1mB,GAAM,SACzB,OAAO,MAAM,SAAS,WAAYA,EAAG0mB,CAAO,EAC5C,OAAO,MAAM,SAAS,QAAS1mB,CAAE,EAEhC,CAAEomB,EAAG,QACR,OAAO,KAGRA,EAAG,UAAUO,CAAM,CACpB,MACWD,GAKJF,IACL,MAAM,8FAA8F,EAGrGA,GAAc,IAPdJ,EAAK,IAAI,KAAKpmB,CAAC,EAUhB,OAAOomB,CACR,CAIA,SAASQ,GAAYC,EAAc,CAClC,OAAO,SAAWC,EAAMC,EAAIJ,EAAQrf,EAAM,CAGpC,UAAU,SAAW,GACzBqf,EAAS,KACTI,EAAK,KACLD,EAAO,MAEE,UAAU,SAAW,GAC9BH,EAAS,KACTI,EAAKD,EACLA,EAAO,MAEE,UAAU,SAAW,IAC9BH,EAASI,EACTA,EAAKD,EACLA,EAAO,MAGR,IAAIE,EAAW,YAAcD,EAI7B,OAAM9uB,GAAU,IAAI,KAAK,MAAM+uB,CAAQ,IAEtC/uB,GAAU,IAAI,KAAK,OAAO,QAAQ,SAAU+H,EAAG,CAC9C,OAAOA,IAAMgnB,EAAWA,EAAW,EACpC,CAAC,EAID/uB,GAAU,IAAI,KAAK,MAAM+uB,EAAW,MAAM,EAAI,SAAU/oB,EAAG2E,EAAG,CAC7D,IAAIkY,EAAI7c,EAAE,QAAQ,EACd8c,EAAInY,EAAE,QAAQ,EAElB,OAAOkY,IAAMC,EACV,EACAD,EAAIC,EACH,GACA,CACL,EAEA9iB,GAAU,IAAI,KAAK,MAAM+uB,EAAW,OAAO,EAAI,SAAU/oB,EAAG2E,EAAG,CAC9D,IAAIkY,EAAI7c,EAAE,QAAQ,EACd8c,EAAInY,EAAE,QAAQ,EAElB,OAAOkY,IAAMC,EACV,EACAD,EAAIC,EACH,GACA,CACL,GAGM,SAAW/a,EAAGjG,EAAO,CAE3B,GAAIiG,GAAM,KACT,GAAIsH,IAAQ,QAAS,CAIpB,IAAI2f,EAAQ,IAAI,KAChBjnB,EAAI,IAAI,KAAM,KAAK,IAClBinB,EAAM,YAAY,EAAGA,EAAM,SAAS,EAAGA,EAAM,QAAQ,EACrDA,EAAM,SAAS,EAAGA,EAAM,WAAW,EAAGA,EAAM,WAAW,CACxD,CAAE,CACH,MAECjnB,EAAI,GAIN,GAAIjG,IAAS,OAEZ,OAAOitB,EAGR,GAAIhnB,IAAM,GACT,OAAOjG,IAAS,OACb,GACA0sB,GAAS,sBAAuB,KAAME,CAAM,EAKhD,GAAKI,IAAO,MAAQD,IAASC,GAAMhtB,IAAS,QAAUA,IAAS,QAAU,EAAGiG,aAAa,MACxF,OAAOA,EAGR,IAAIomB,EAAKK,GAASzmB,EAAG8mB,EAAMH,CAAM,EAEjC,GAAIP,IAAO,KACV,OAAOpmB,EAGR,GAAIjG,IAAS,OACZ,OAAOqsB,EAGR,IAAI5lB,EAAYumB,IAAO,KACpBZ,GAAMC,EAAI,SAAU,WAAY,EAAE,EAAES,CAAY,EAAE,EAClDV,GAAMC,EAAI,SAAU,WAAY,cAAeW,CAAE,EAGpD,OAAOhtB,IAAS,UACfmsB,GAAsB1lB,CAAU,EAChCA,CACF,CACD,CACD,CAIA,IAAI0mB,GAAc,IACdC,GAAY,IAEhB,GAAI,KACH,GAAI,CAGH,IAFI/mB,GAAM,IAAI,KAAK,aAAa,EAAE,cAAc,QAAQ,EAE/C7E,GAAE,EAAIA,GAAE6E,GAAI,OAAS7E,KACzB6E,GAAI7E,EAAC,EAAE,OAAS,QACnB2rB,GAAc9mB,GAAI7E,EAAC,EAAE,MAEb6E,GAAI7E,EAAC,EAAE,OAAS,YACxB4rB,GAAY/mB,GAAI7E,EAAC,EAAE,MAGtB,OACO0V,EAAG,CAEV,CAbK,IAAA7Q,GAEK7E,GAeXtD,GAAU,SAAW,SAAWyuB,EAAQC,EAAS,CAChD,IAAIK,EAAW,mBAAqBN,EAE9BC,IACLA,EAAS,MAGJ1uB,GAAU,IAAI,KAAK,MAAM+uB,CAAQ,IACtC/uB,GAAU,IAAI,KAAK,OAAO,QAAQ,SAAU+H,EAAG,CAC9C,IAAIomB,EAAKK,GAASzmB,EAAG0mB,EAAQC,CAAM,EACnC,OAAO3mB,IAAM,IAAMomB,EAAKY,EAAW,EACpC,CAAC,EAED/uB,GAAU,IAAI,KAAK,MAAM+uB,EAAW,MAAM,EAAI,SAAUhnB,EAAG,CAC1D,OAAOymB,GAASzmB,EAAG0mB,EAAQC,CAAM,GAAK,CACvC,EAEF,EA4BA1uB,GAAU,OAAS,CAClB,KAAM2uB,GAAW,oBAAoB,EACrC,SAAUA,GAAW,gBAAgB,EACrC,KAAMA,GAAW,oBAAoB,EACrC,OAAQ,SAAWQ,EAAWhjB,EAASijB,EAAWC,EAAQC,EAAU,CAEnE,OAAIH,GAAc,OACjBA,EAAYF,IAGT9iB,GAAY,OACfA,EAAU+iB,IAGJ,CACN,QAAS,SAAWnnB,EAAI,CAKvB,GAJK,OAAOA,GAAM,UAAY,OAAOA,GAAM,UAIvCA,IAAM,IAAMA,IAAM,KACrB,OAAOA,EAGR,IAAIwnB,EAAWxnB,EAAI,EAAI,IAAM,GACzBynB,EAAM,WAAYznB,CAAE,EAKxB,GAAK,MAAOynB,CAAI,EACf,OAAOvB,GAAsBlmB,CAAE,EAGhCynB,EAAMA,EAAI,QAASJ,CAAU,EAC7BrnB,EAAI,KAAK,IAAKynB,CAAI,EAElB,IAAIC,EAAU,SAAU1nB,EAAG,EAAG,EAC1B2nB,EAAYN,EACfjjB,GAASpE,EAAI0nB,GAAS,QAASL,CAAU,EAAE,UAAW,CAAE,EACxD,GAGD,OAAIK,IAAY,GAAK,WAAWC,CAAS,IAAM,IAC9CH,EAAW,IAGLA,GAAYF,GAAQ,IAC1BI,EAAQ,SAAS,EAAE,QAClB,wBAAyBN,CAC1B,EACAO,GACCJ,GAAS,GACZ,CACD,CACD,EAEA,KAAM,UAAY,CACjB,MAAO,CACN,QAASrB,GACT,OAAQA,EACT,CACD,CACD,EAeA,SAAS/qB,GAAkBD,EAC3B,CACC,OAAO,UAAW,CACjB,IAAIqH,EAAO,CAAC/J,GAAqB,KAAKP,GAAU,IAAI,SAAS,CAAE,CAAC,EAAE,OACjE,MAAM,UAAU,MAAM,KAAK,SAAS,CACrC,EACA,OAAOA,GAAU,IAAI,SAASiD,CAAE,EAAE,MAAO,KAAMqH,CAAK,CACrD,CACD,CAUAxK,EAAE,OAAQE,GAAU,IAAI,SAAU,CACjC,iBAAkBkD,GAClB,aAAcsT,GACd,cAAe1C,GACf,kBAAmBuD,GACnB,kBAAmBC,GACnB,eAAgBR,GAChB,aAAclR,GACd,iBAAkBG,GAClB,sBAAuBiI,GACvB,wBAAyBG,GACzB,wBAAyBI,GACzB,iBAAkBE,GAClB,cAAeH,GACf,eAAgBM,GAChB,mBAAoB/I,GACpB,gBAAiB0F,GACjB,oBAAqBpH,GACrB,kBAAmBM,GACnB,iBAAkBI,GAClB,WAAYqC,GACZ,SAAUC,GACV,mBAAoB6I,GACpB,qBAAsBC,GACtB,eAAgBf,GAChB,eAAgBsB,GAChB,oBAAqB9F,GACrB,mBAAoB9F,GACpB,mBAAoBiJ,GACpB,iBAAkB6C,GAClB,cAAeC,GACf,eAAgBC,GAChB,cAAeI,GACf,kBAAmBjB,GACnB,YAAaF,GACb,aAAcoC,GACd,YAAaM,GACb,QAASS,GACT,UAAWuB,GACX,kBAAmBI,GACnB,gBAAiBjP,GACjB,gBAAiBC,GACjB,qBAAsB4P,GACtB,kBAAmBb,GACnB,gBAAiBiF,GACjB,gBAAiBD,GACjB,UAAWD,GACX,sBAAuBW,GACvB,eAAgB/R,GAChB,cAAeoS,GACf,mBAAoB/E,GACpB,cAAe0F,GACf,cAAeG,GACf,cAAepW,GACf,gBAAiBiT,GACjB,gBAAiB0D,GACjB,qBAAsBxG,GACtB,uBAAwBK,GACxB,cAAe+G,GACf,yBAA0BlH,GAC1B,qBAAsBpC,GACtB,oBAAqBqC,GACrB,cAAezU,GACf,mBAAoBgf,GACpB,yBAA0B9R,GAC1B,YAAa6K,GACb,kBAAmBqI,GACnB,iBAAkBE,GAClB,mBAAoBM,GACpB,eAAgBhG,GAChB,eAAgBnV,GAChB,QAASgO,GACT,YAAa7N,GACb,gBAAiB2c,GACjB,sBAAuBlR,GACvB,kBAAmB9L,GACnB,YAAaqc,GACb,aAAcxb,GACd,aAAcC,GACd,kBAAmBgd,GACnB,oBAAqB9jB,GACrB,OAAQyD,GACR,OAAQU,GACR,cAAeof,GACf,eAAgBnf,GAChB,gBAAiBO,GACjB,kBAAmB6W,GACnB,YAAazJ,GACb,cAAezL,GACf,iBAAkBuK,GAClB,UAAW/N,GACX,gBAAiB,UAAY,CAAC,CAG/B,CAAE,EAIFvD,EAAE,GAAG,UAAYE,GAGjBA,GAAU,EAAIF,EAGdA,EAAE,GAAG,kBAAoBE,GAAU,SACnCF,EAAE,GAAG,aAAeE,GAAU,IAI9BF,EAAE,GAAG,UAAY,SAAWunB,EAAO,CAClC,OAAOvnB,EAAE,IAAI,EAAE,UAAWunB,CAAK,EAAE,IAAI,CACtC,EAIAvnB,EAAE,KAAME,GAAW,SAAW8I,EAAMnC,EAAM,CACzC7G,EAAE,GAAG,UAAWgJ,CAAK,EAAInC,CAC1B,CAAE,EAEF,IAAOgpB,GAAQ3vB,GDzvef,GAAA4vB,QAAE,OAAQ,GAAMC,GAAU,SAAU,CACnC,IACC,mIAGD,SAAU,WACX,CAAE,EAIF,GAAAD,QAAE,OAAQC,GAAU,IAAI,QAAS,CAChC,SAAe,mCACf,aAAe,+BACf,cAAe,8DACf,YAAe,6BACf,YAAe,2BAChB,CAAE,EAIFA,GAAU,IAAI,SAAS,WAAW,UAAY,SAAWC,EAAUC,EAAMC,EAAKC,EAASC,EAAMC,EAAQ,CACpG,IAAIC,EAAU,IAAIP,GAAU,IAAKC,CAAS,EACtCO,EAAUP,EAAS,SACnBQ,EAAUR,EAAS,UAAU,UAC7BS,EAAOT,EAAS,UAAU,MAAM,UAAY,CAAC,EAC7CU,EAAYC,EAEZC,EAAS,SAAUC,EAAWV,EAAU,CAC3C,IAAIW,EAAGC,GAAKC,EAAMC,EACdC,EAAe,SAAWC,EAAI,CACjCA,EAAE,eAAe,EACZ,IAAC,GAAArB,SAAEqB,EAAE,aAAa,EAAE,SAAS,UAAU,GAAKb,EAAI,KAAK,GAAKa,EAAE,KAAK,QACrEb,EAAI,KAAMa,EAAE,KAAK,MAAO,EAAE,KAAM,MAAO,CAEzC,EAEA,IAAML,EAAE,EAAGC,GAAIZ,EAAQ,OAASW,EAAEC,GAAMD,IAGvC,GAFAG,EAASd,EAAQW,CAAC,EAEb,MAAM,QAASG,CAAO,EAC1BL,EAAQC,EAAWI,CAAO,MAEtB,CAIJ,OAHAP,EAAa,GACbC,EAAW,GAEFM,EAAS,CACjB,IAAK,WACJP,EAAa,WACbC,EAAW,WACX,MAED,IAAK,QACJD,EAAaF,EAAK,OAClBG,EAAWM,GAAUb,EAAO,EAC3B,GAAK,aACN,MAED,IAAK,WACJM,EAAaF,EAAK,UAClBG,EAAWM,GAAUb,EAAO,EAC3B,GAAK,aACN,MAED,IAAK,OACJM,EAAaF,EAAK,MAClBG,EAAWM,GAAUb,EAAOC,EAAM,EACjC,GAAK,aACN,MAED,IAAK,OACJK,EAAaF,EAAK,MAClBG,EAAWM,GAAUb,EAAOC,EAAM,EACjC,GAAK,aACN,MAED,QACCK,EAAaO,EAAS,EACtBN,EAAWP,IAASa,EACnB,SAAW,GACZ,KACF,CAEA,GAAKP,EAAa,CACjB,IAAIU,EAAWT,EAAS,QAAQ,UAAU,IAAM,GAEhDK,KAAO,GAAAlB,SAAE,OAAQ,CACf,MAASS,EAAQ,YAAY,IAAII,EACjC,GAAMT,IAAQ,GAAK,OAAOe,GAAW,SACpCjB,EAAS,SAAU,IAAKiB,EACxB,IACF,CAAE,EACD,UAAQ,GAAAnB,SAAE,MAAO,CAChB,KAAQsB,EAAW,KAAO,IAC1B,gBAAiBpB,EAAS,SAC1B,gBAAiBoB,EAAW,OAAS,KACrC,aAAcX,EAAMQ,CAAO,EAC3B,YAAa,OACb,eAAgBN,IAAa,SAAW,OAAS,KACjD,cAAeM,EACf,SAAYjB,EAAS,UACrB,MAAS,WACV,CAAE,EACD,KAAMU,CAAW,CACnB,EACC,SAAUG,CAAU,EAEtBb,EAAS,KAAK,cACbgB,EAAM,CAAC,OAAQC,CAAM,EAAGC,CACzB,CACD,CACD,CAEF,EAIIG,EAEJ,GAAI,CAKHA,KAAW,GAAAvB,SAAEG,CAAI,EAAE,KAAK,SAAS,aAAa,EAAE,KAAK,QAAQ,CAC9D,OACOkB,EAAG,CAAC,CAEXP,KACC,GAAAd,SAAEG,CAAI,EAAE,MAAM,EAAE,KAAK,0BAA0B,EAAE,SAAS,IAAI,EAC9DE,CACD,EAEKkB,IAAa,WACjB,GAAAvB,SAAEG,CAAI,EAAE,KAAM,gBAAgBoB,EAAS,GAAI,EAAE,QAAQ,OAAO,CAE9D,EE1JA,SAASC,IAAiB,CAExB,IAAIC,EAAM,SAAS,eAAe,WAAW,EACzCA,GAAO,MACTA,EAAI,iBAAiB,QAAS,IAAM,CAClC,SAAS,eAAe,eAAe,EAAE,UAAU,OAAO,QAAQ,EAClEA,EAAI,UAAU,OAAO,MAAM,CAC7B,CAAC,CAEL,CAEA,SAAS,iBAAiB,aAAcD,EAAc,ECVtD,SAASE,IAAiB,CACxB,IAAIC,EAAW,MAAM,KAAK,SAAS,uBAAuB,eAAe,CAAC,EAE1EA,EAAS,QAAQC,GAAkB,CACjCA,EAAe,iBAAiB,QAAS,IAAM,CAC7C,WAAW,IAAM,CACfD,EAAS,QAAQE,GAAW,CAC1BA,EAAQ,MAAM,gBAAkB,UAChC,IAAIC,EAAUD,EAAQ,mBAClBA,GAAYD,GACdE,EAAQ,UAAU,OAAO,MAAM,EAEjCA,EAAQ,UAAU,OAAO,MAAM,CACjC,CAAC,EACDF,EAAe,MAAM,WAAa,SACpC,CAAC,CACH,EAAG,GAAG,CACN,CAAC,CACL,CAEA,SAASG,IAAa,CACT,MAAM,KAAK,SAAS,uBAAuB,mBAAmB,CAAC,EACrE,QAAQC,GAAO,CAClBA,EAAI,iBAAiB,QAAS,IAAM,CACtBA,EAAI,iBACV,UAAU,OAAO,QAAQ,CACjC,CAAC,CACH,CAAC,CACH,CAEA,SAAS,iBAAiB,aAAcN,EAAc,EACtD,SAAS,iBAAiB,aAAcK,EAAU,EChClD,SAASE,IAAa,CACpB,EAAE,4BAA4B,EAAE,OAAO,UAAW,CAChD,EAAE,gBAAgB,EAAE,MAAM,CAC5B,CAAC,CACH,CAEA,SAAS,iBAAiB,aAAcA,EAAU,ECHlD,SAASC,IAAc,CACrBC,GAAW,EACX,EAAE,aAAa,EAAE,MAAM,UAAY,CACjC,EAAE,sBAAsB,EAAE,KAAK,EAC/B,EAAE,MAAM,EAAE,UAAU,KAAK,EACzB,EAAE,SAAS,IAAI,EAAE,IAAI,WAAY,QAAQ,EACzC,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,CACrC,CAAC,EACD,EAAE,cAAc,EAAE,MAAM,UAAY,CAClC,EAAE,sBAAsB,EAAE,KAAK,EAC/B,EAAE,SAAS,IAAI,EAAE,IAAI,WAAY,SAAS,CAC5C,CAAC,EAED,OAAO,QAAU,SAAUC,EAAO,CAC5BA,EAAM,QAAU,SAAS,eAAe,qBAAqB,IAC/D,EAAE,SAAS,IAAI,EAAE,IAAI,WAAY,SAAS,EAC1C,EAAE,sBAAsB,EAAE,KAAK,EAEnC,CACF,CAEA,SAASD,IAAa,CACpB,IAAIE,EAAQ,EAAE,cAAc,EAC5B,IAAIC,EAAQD,EAAM,UAAU,CAC1B,SAAU,GACV,QAAS,QACT,QAAS,GACT,eAAgB,GAChB,UAAW,CACT,OAAQ,UACR,YAAa,0BACf,CACF,CAAC,CACH,CAEA,SAAS,iBAAiB,aAAcH,EAAW,EAGnD,SAASK,IAAa,CACpB,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,CACxC,CAEA,SAAS,iBAAiB,qBAAsBA,EAAU,ENjC5C,SAAM",
  "names": ["require_jquery", "__commonJSMin", "exports", "module", "global", "factory", "w", "window", "noGlobal", "arr", "getProto", "slice", "flat", "array", "push", "indexOf", "class2type", "toString", "hasOwn", "fnToString", "ObjectFunctionString", "support", "isFunction", "obj", "isWindow", "document", "preservedScriptAttributes", "DOMEval", "code", "node", "doc", "i", "val", "script", "toType", "version", "jQuery", "selector", "context", "num", "elems", "ret", "callback", "elem", "_elem", "len", "j", "options", "name", "src", "copy", "copyIsArray", "clone", "target", "length", "deep", "msg", "proto", "Ctor", "isArrayLike", "results", "first", "second", "invert", "callbackInverse", "matches", "callbackExpect", "arg", "value", "_i", "type", "Sizzle", "Expr", "getText", "isXML", "tokenize", "compile", "select", "outermostContext", "sortInput", "hasDuplicate", "setDocument", "docElem", "documentIsHTML", "rbuggyQSA", "rbuggyMatches", "contains", "expando", "preferredDoc", "dirruns", "done", "classCache", "createCache", "tokenCache", "compilerCache", "nonnativeSelectorCache", "sortOrder", "a", "b", "pop", "pushNative", "list", "booleans", "whitespace", "identifier", "attributes", "pseudos", "rwhitespace", "rtrim", "rcomma", "rleadingCombinator", "rdescend", "rpseudo", "ridentifier", "matchExpr", "rhtml", "rinputs", "rheader", "rnative", "rquickExpr", "rsibling", "runescape", "funescape", "escape", "nonHex", "high", "rcssescape", "fcssescape", "ch", "asCodePoint", "unloadHandler", "inDisabledFieldset", "addCombinator", "e", "els", "seed", "m", "nid", "match", "groups", "newSelector", "newContext", "nodeType", "testContext", "toSelector", "qsaError", "keys", "cache", "key", "markFunction", "fn", "assert", "el", "addHandle", "attrs", "handler", "siblingCheck", "cur", "diff", "createInputPseudo", "createButtonPseudo", "createDisabledPseudo", "disabled", "createPositionalPseudo", "argument", "matchIndexes", "namespace", "hasCompare", "subWindow", "id", "attrId", "tag", "tmp", "className", "input", "adown", "bup", "compare", "aup", "ap", "bp", "expr", "elements", "sel", "duplicates", "excess", "unquoted", "nodeNameSelector", "nodeName", "pattern", "operator", "check", "result", "what", "_argument", "last", "simple", "forward", "ofType", "_context", "xml", "uniqueCache", "outerCache", "nodeIndex", "start", "dir", "parent", "useCache", "pseudo", "args", "idx", "matched", "matcher", "unmatched", "text", "lang", "elemLang", "hash", "attr", "_matchIndexes", "setFilters", "parseOnly", "tokens", "soFar", "preFilters", "cached", "combinator", "base", "skip", "checkNonElements", "doneName", "oldCache", "newCache", "elementMatcher", "matchers", "multipleContexts", "contexts", "condense", "map", "filter", "newUnmatched", "mapped", "setMatcher", "preFilter", "postFilter", "postFinder", "postSelector", "temp", "preMap", "postMap", "preexisting", "matcherIn", "matcherOut", "matcherFromTokens", "checkContext", "leadingRelative", "implicitRelative", "matchContext", "matchAnyContext", "matcherFromGroupMatchers", "elementMatchers", "setMatchers", "bySet", "byElement", "superMatcher", "outermost", "matchedCount", "setMatched", "contextBackup", "dirrunsUnique", "token", "find", "compiled", "_name", "until", "truncate", "siblings", "rneedsContext", "rsingleTag", "winnow", "qualifier", "not", "self", "rootjQuery", "init", "root", "rparentsprev", "guaranteedUnique", "targets", "selectors", "l", "sibling", "rnothtmlwhite", "createOptions", "object", "_", "flag", "firing", "memory", "fired", "locked", "queue", "firingIndex", "fire", "add", "index", "Identity", "v", "Thrower", "ex", "adoptValue", "resolve", "reject", "noValue", "method", "func", "tuples", "state", "promise", "deferred", "fns", "newDefer", "tuple", "returned", "onFulfilled", "onRejected", "onProgress", "maxDepth", "depth", "special", "that", "mightThrow", "then", "process", "stateString", "singleValue", "remaining", "resolveContexts", "resolveValues", "primary", "updateFunc", "rerrorNames", "error", "stack", "readyList", "wait", "completed", "access", "chainable", "emptyGet", "raw", "bulk", "_key", "rmsPrefix", "rdashAlpha", "fcamelCase", "_all", "letter", "camelCase", "string", "acceptData", "owner", "Data", "data", "prop", "dataPriv", "dataUser", "rbrace", "rmultiDash", "getData", "dataAttr", "startLength", "hooks", "next", "setter", "count", "defer", "pnum", "rcssNum", "cssExpand", "documentElement", "isAttached", "composed", "isHiddenWithinTree", "adjustCSS", "valueParts", "tween", "adjusted", "scale", "maxIterations", "currentValue", "initial", "unit", "initialInUnit", "defaultDisplayMap", "getDefaultDisplay", "display", "showHide", "show", "values", "rcheckableType", "rtagName", "rscriptType", "fragment", "div", "wrapMap", "getAll", "setGlobalEval", "refElements", "buildFragment", "scripts", "selection", "ignored", "wrap", "attached", "nodes", "rtypenamespace", "returnTrue", "returnFalse", "expectSync", "safeActiveElement", "err", "on", "types", "one", "origFn", "event", "handleObjIn", "eventHandle", "events", "t", "handleObj", "handlers", "namespaces", "origType", "elemData", "mappedTypes", "origCount", "nativeEvent", "handlerQueue", "matchedHandlers", "matchedSelectors", "delegateCount", "hook", "originalEvent", "leverageNative", "notAsync", "saved", "handle", "props", "delegateType", "orig", "fix", "related", "rnoInnerhtml", "rchecked", "rcleanScript", "manipulationTarget", "content", "disableScript", "restoreScript", "cloneCopyEvent", "dest", "pdataOld", "udataOld", "udataCur", "fixInput", "domManip", "collection", "hasScripts", "iNoClone", "valueIsFunction", "remove", "keepData", "html", "dataAndEvents", "deepDataAndEvents", "srcElements", "destElements", "inPage", "original", "insert", "rnumnonpx", "rcustomProp", "getStyles", "view", "swap", "old", "rboxStyle", "rtrimCSS", "computeStyleTests", "container", "divStyle", "pixelPositionVal", "reliableMarginLeftVal", "roundPixelMeasures", "pixelBoxStylesVal", "boxSizingReliableVal", "scrollboxSizeVal", "measure", "reliableTrDimensionsVal", "table", "tr", "trChild", "trStyle", "curCSS", "computed", "width", "minWidth", "maxWidth", "isCustomProp", "style", "addGetHookIf", "conditionFn", "hookFn", "cssPrefixes", "emptyStyle", "vendorProps", "vendorPropName", "capName", "finalPropName", "final", "rdisplayswap", "cssShow", "cssNormalTransform", "setPositiveNumber", "subtract", "boxModelAdjustment", "dimension", "box", "isBorderBox", "styles", "computedVal", "extra", "delta", "getWidthOrHeight", "boxSizingNeeded", "valueIsBorderBox", "offsetProp", "origName", "scrollboxSizeBuggy", "prefix", "suffix", "expanded", "parts", "Tween", "end", "easing", "percent", "eased", "p", "fxNow", "inProgress", "rfxtypes", "rrun", "schedule", "createFxNow", "genFx", "includeWidth", "which", "createTween", "animation", "Animation", "defaultPrefilter", "opts", "toggle", "oldfire", "propTween", "restoreDisplay", "isBox", "anim", "hidden", "dataShow", "propFilter", "specialEasing", "properties", "stopped", "tick", "currentTime", "gotoEnd", "prepend", "speed", "opt", "to", "empty", "optall", "doAnimation", "clearQueue", "stopQueue", "stop", "dequeue", "timers", "cssFn", "timer", "time", "timeout", "boolHook", "attrHandle", "nType", "attrNames", "getter", "lowercaseName", "rfocusable", "rclickable", "tabindex", "stripAndCollapse", "getClass", "classesToArray", "classNames", "curValue", "finalValue", "stateVal", "isValidValue", "rreturn", "option", "max", "optionSet", "rfocusMorph", "stopPropagationCallback", "onlyHandlers", "bubbleType", "ontype", "lastElement", "eventPath", "attaches", "location", "nonce", "rquery", "parserErrorElem", "rbracket", "rCRLF", "rsubmitterTypes", "rsubmittable", "buildParams", "traditional", "s", "valueOrFunction", "r20", "rhash", "rantiCache", "rheaders", "rlocalProtocol", "rnoContent", "rprotocol", "prefilters", "transports", "allTypes", "originAnchor", "addToPrefiltersOrTransports", "structure", "dataTypeExpression", "dataType", "dataTypes", "inspectPrefiltersOrTransports", "originalOptions", "jqXHR", "inspected", "seekingTransport", "inspect", "selected", "prefilterOrFactory", "dataTypeOrTransport", "ajaxExtend", "flatOptions", "ajaxHandleResponses", "responses", "ct", "finalDataType", "firstDataType", "contents", "ajaxConvert", "response", "isSuccess", "conv2", "current", "conv", "prev", "converters", "settings", "url", "transport", "cacheURL", "responseHeadersString", "responseHeaders", "timeoutTimer", "urlAnchor", "fireGlobals", "uncached", "callbackContext", "globalEventContext", "completeDeferred", "statusCode", "requestHeaders", "requestHeadersNames", "strAbort", "statusText", "finalText", "status", "nativeStatusText", "headers", "success", "modified", "htmlIsFunction", "xhrSuccessStatus", "xhrSupported", "errorCallback", "complete", "xhr", "evt", "oldCallbacks", "rjsonp", "originalSettings", "callbackName", "overwritten", "responseContainer", "jsonProp", "body", "keepScripts", "parsed", "params", "off", "responseText", "curPosition", "curLeft", "curCSSTop", "curTop", "curOffset", "curCSSLeft", "calculatePosition", "position", "curElem", "rect", "win", "offsetParent", "offset", "parentOffset", "top", "defaultExtra", "funcName", "margin", "fnOver", "fnOut", "proxy", "hold", "_jQuery", "_$", "adapters_default", "init_adapters", "__esmMin", "logger_default", "init_logger", "__esmMin", "init_adapters", "messages", "adapters_default", "now", "secondsSince", "ConnectionMonitor", "connection_monitor_default", "init_connection_monitor", "__esmMin", "init_logger", "time", "connection", "logger_default", "staleThreshold", "reconnectionBackoffRate", "backoff", "jitter", "internal_default", "init_internal", "__esmMin", "message_types", "protocols", "supportedProtocols", "indexOf", "Connection", "connection_default", "init_connection", "__esmMin", "init_adapters", "init_connection_monitor", "init_internal", "init_logger", "internal_default", "consumer", "connection_monitor_default", "data", "logger_default", "socketProtocols", "adapters_default", "allowReconnect", "error", "states", "state", "eventName", "handler", "event", "identifier", "message", "reason", "reconnect", "type", "extend", "Subscription", "init_subscription", "__esmMin", "object", "properties", "key", "value", "consumer", "params", "mixin", "action", "data", "SubscriptionGuarantor", "subscription_guarantor_default", "init_subscription_guarantor", "__esmMin", "init_logger", "subscriptions", "subscription", "logger_default", "s", "Subscriptions", "init_subscriptions", "__esmMin", "init_logger", "init_subscription", "init_subscription_guarantor", "consumer", "subscription_guarantor_default", "channelName", "mixin", "channel", "params", "subscription", "Subscription", "identifier", "s", "callbackName", "args", "subscriptions", "logger_default", "command", "createWebSocketURL", "url", "a", "Consumer", "init_consumer", "__esmMin", "init_connection", "init_subscriptions", "Subscriptions", "connection_default", "data", "subprotocol", "src_exports", "__export", "connection_default", "connection_monitor_default", "Consumer", "internal_default", "Subscription", "subscription_guarantor_default", "Subscriptions", "adapters_default", "createConsumer", "createWebSocketURL", "getConfig", "logger_default", "url", "name", "element", "init_src", "__esmMin", "init_adapters", "init_connection", "init_connection_monitor", "init_consumer", "init_internal", "init_logger", "init_subscription", "init_subscription_guarantor", "init_subscriptions", "require_activestorage", "__commonJSMin", "exports", "module", "global", "factory", "createCommonjsModule", "fn", "sparkMd5", "undefined", "hex_chr", "md5cycle", "x", "k", "a", "b", "c", "d", "md5blk", "s", "md5blks", "i", "md5blk_array", "md51", "n", "state", "length", "tail", "tmp", "lo", "hi", "md51_array", "rhex", "j", "hex", "clamp", "val", "from", "to", "begin", "end", "num", "target", "targetArray", "sourceArray", "toUtf8", "str", "utf8Str2ArrayBuffer", "returnUInt8Array", "buff", "arr", "arrayBuffer2Utf8Str", "concatenateArrayBuffers", "first", "second", "result", "hexToBinaryString", "bytes", "SparkMD5", "contents", "raw", "ret", "content", "hash", "classCallCheck", "instance", "Constructor", "createClass", "defineProperties", "props", "descriptor", "protoProps", "staticProps", "fileSlice", "FileChecksum", "file", "callback", "_this", "event", "binaryDigest", "base64digest", "start", "getMetaValue", "name", "element", "findElement", "findElements", "root", "selector", "elements", "toArray$1", "dispatchEvent", "type", "eventInit", "disabled", "bubbles", "cancelable", "detail", "value", "BlobRecord", "checksum", "url", "csrfToken", "response", "direct_upload", "key", "_xhr", "responseType", "BlobUpload", "blob", "_blob$directUploadDat", "headers", "status", "id", "DirectUpload", "delegate", "error", "notify", "upload", "object", "methodName", "_len", "messages", "_key", "DirectUploadController", "input", "hiddenInput", "attributes", "progress", "xhr", "_this2", "inputSelector", "DirectUploadsController", "form", "controllers", "startNextController", "controller", "processingAttribute", "submitButtonsByForm", "started", "didClick", "didSubmitForm", "didSubmitRemoteElement", "handleFormSubmissionEvent", "inputs", "disable", "enable", "submitForm", "button", "_button", "autostart", "isBrowser", "window", "document", "navigator", "timeoutDuration", "longerTimeoutBrowsers", "i", "length", "userAgent", "indexOf", "microtaskDebounce", "fn", "called", "Promise", "resolve", "then", "taskDebounce", "scheduled", "supportsMicroTasks", "debounce", "isFunction", "functionToCheck", "getType", "toString", "call", "getStyleComputedProperty", "element", "property", "nodeType", "ownerDocument", "defaultView", "css", "getComputedStyle", "getParentNode", "nodeName", "parentNode", "host", "getScrollParent", "body", "overflow", "_getStyleComputedProp", "overflowX", "overflowY", "test", "getReferenceNode", "reference", "referenceNode", "isIE11", "MSInputMethodContext", "documentMode", "isIE10", "isIE", "version", "getOffsetParent", "documentElement", "noOffsetParent", "offsetParent", "nextElementSibling", "isOffsetContainer", "firstElementChild", "getRoot", "node", "findCommonOffsetParent", "element1", "element2", "order", "compareDocumentPosition", "Node", "DOCUMENT_POSITION_FOLLOWING", "start", "end", "range", "createRange", "setStart", "setEnd", "commonAncestorContainer", "contains", "element1root", "getScroll", "side", "upperSide", "html", "scrollingElement", "includeScroll", "rect", "subtract", "scrollTop", "scrollLeft", "modifier", "top", "bottom", "left", "right", "getBordersSize", "styles", "axis", "sideA", "sideB", "parseFloat", "getSize", "computedStyle", "Math", "max", "parseInt", "getWindowSizes", "getClientRect", "offsets", "width", "height", "getBoundingClientRect", "e", "result", "sizes", "clientWidth", "clientHeight", "horizScrollbar", "offsetWidth", "vertScrollbar", "offsetHeight", "getOffsetRectRelativeToArbitraryNode", "children", "parent", "fixedPosition", "runIsIE", "isHTML", "childrenRect", "parentRect", "scrollParent", "borderTopWidth", "borderLeftWidth", "marginTop", "marginLeft", "getViewportOffsetRectRelativeToArtbitraryNode", "excludeScroll", "relativeOffset", "innerWidth", "innerHeight", "offset", "isFixed", "getFixedPositionOffsetParent", "parentElement", "el", "getBoundaries", "popper", "padding", "boundariesElement", "boundaries", "boundariesNode", "_getWindowSizes", "isPaddingNumber", "getArea", "_ref", "computeAutoPlacement", "placement", "refRect", "rects", "sortedAreas", "Object", "keys", "map", "key", "sort", "a", "b", "area", "filteredAreas", "filter", "_ref2", "computedPlacement", "variation", "split", "getReferenceOffsets", "state", "commonOffsetParent", "getOuterSizes", "x", "marginBottom", "y", "marginRight", "getOppositePlacement", "hash", "replace", "matched", "getPopperOffsets", "referenceOffsets", "popperRect", "popperOffsets", "isHoriz", "mainSide", "secondarySide", "measurement", "secondaryMeasurement", "find", "arr", "check", "Array", "prototype", "findIndex", "prop", "value", "cur", "match", "obj", "runModifiers", "modifiers", "data", "ends", "modifiersToRun", "undefined", "slice", "forEach", "warn", "enabled", "update", "isDestroyed", "options", "positionFixed", "flip", "originalPlacement", "position", "isCreated", "onUpdate", "onCreate", "isModifierEnabled", "modifierName", "some", "name", "getSupportedPropertyName", "prefixes", "upperProp", "charAt", "toUpperCase", "prefix", "toCheck", "style", "destroy", "removeAttribute", "willChange", "disableEventListeners", "removeOnDestroy", "removeChild", "getWindow", "attachToScrollParents", "event", "callback", "scrollParents", "isBody", "target", "addEventListener", "passive", "push", "setupEventListeners", "updateBound", "scrollElement", "eventsEnabled", "enableEventListeners", "scheduleUpdate", "removeEventListeners", "removeEventListener", "isNumeric", "n", "isNaN", "isFinite", "setStyles", "unit", "setAttributes", "attributes", "setAttribute", "applyStyle", "instance", "arrowElement", "arrowStyles", "applyStyleOnLoad", "modifierOptions", "getRoundedOffsets", "shouldRound", "_data$offsets", "round", "floor", "noRound", "v", "referenceWidth", "popperWidth", "isVertical", "isVariation", "sameWidthParity", "bothOddWidth", "horizontalToInteger", "verticalToInteger", "isFirefox", "computeStyle", "legacyGpuAccelerationOption", "gpuAcceleration", "offsetParentRect", "devicePixelRatio", "prefixedProperty", "invertTop", "invertLeft", "_extends", "arrow", "isModifierRequired", "requestingName", "requestedName", "requesting", "isRequired", "requested", "querySelector", "len", "sideCapitalized", "toLowerCase", "altSide", "opSide", "arrowElementSize", "center", "popperMarginSide", "popperBorderSide", "sideValue", "min", "_data$offsets$arrow", "defineProperty", "getOppositeVariation", "placements", "validPlacements", "clockwise", "counter", "index", "concat", "reverse", "BEHAVIORS", "flipped", "placementOpposite", "flipOrder", "behavior", "FLIP", "CLOCKWISE", "COUNTERCLOCKWISE", "step", "refOffsets", "overlapsRef", "overflowsLeft", "overflowsRight", "overflowsTop", "overflowsBottom", "overflowsBoundaries", "flippedVariationByRef", "flipVariations", "flippedVariationByContent", "flipVariationsByContent", "flippedVariation", "keepTogether", "toValue", "str", "size", "parseOffset", "basePlacement", "useHeight", "fragments", "frag", "trim", "divider", "search", "splitRegex", "ops", "op", "mergeWithPrevious", "reduce", "index2", "preventOverflow", "transformProp", "popperStyles", "transform", "priority", "escapeWithReference", "shift", "shiftvariation", "shiftOffsets", "hide", "bound", "inner", "subtractLength", "Defaults", "Popper", "requestAnimationFrame", "_this", "bind", "jquery", "onLoad", "Utils", "global", "PopperUtils", "TRANSITION_END", "MAX_UID", "MILLISECONDS_MULTIPLIER", "toType", "obj", "toString", "call", "match", "toLowerCase", "getSpecialTransitionEndEvent", "bindType", "delegateType", "handle", "event", "$", "target", "is", "handleObj", "handler", "apply", "arguments", "transitionEndEmulator", "duration", "_this", "called", "one", "Util", "setTimeout", "triggerTransitionEnd", "setTransitionEndSupport", "fn", "emulateTransitionEnd", "special", "getUID", "prefix", "Math", "random", "document", "getElementById", "getSelectorFromElement", "element", "selector", "getAttribute", "hrefAttr", "trim", "querySelector", "err", "getTransitionDurationFromElement", "transitionDuration", "css", "transitionDelay", "floatTransitionDuration", "parseFloat", "floatTransitionDelay", "split", "reflow", "offsetHeight", "trigger", "supportsTransitionEnd", "Boolean", "isElement", "nodeType", "typeCheckConfig", "componentName", "config", "configTypes", "property", "Object", "prototype", "hasOwnProperty", "expectedTypes", "value", "valueType", "RegExp", "test", "Error", "toUpperCase", "findShadowRoot", "documentElement", "attachShadow", "getRootNode", "root", "ShadowRoot", "parentNode", "NAME", "VERSION", "DATA_KEY", "EVENT_KEY", "DATA_API_KEY", "JQUERY_NO_CONFLICT", "Selector", "DISMISS", "Event", "CLOSE", "CLOSED", "CLICK_DATA_API", "ClassName", "ALERT", "FADE", "SHOW", "Alert", "_element", "close", "rootElement", "_getRootElement", "customEvent", "_triggerCloseEvent", "isDefaultPrevented", "_removeElement", "dispose", "removeData", "parent", "closest", "closeEvent", "removeClass", "hasClass", "_destroyElement", "detach", "remove", "_jQueryInterface", "each", "$element", "data", "_handleDismiss", "alertInstance", "preventDefault", "on", "Constructor", "noConflict", "ACTIVE", "BUTTON", "FOCUS", "DATA_TOGGLE_CARROT", "DATA_TOGGLE", "INPUT", "FOCUS_BLUR_DATA_API", "Button", "toggle", "triggerChangeEvent", "addAriaPressed", "input", "type", "checked", "classList", "contains", "activeElement", "hasAttribute", "focus", "setAttribute", "toggleClass", "button", "ARROW_LEFT_KEYCODE", "ARROW_RIGHT_KEYCODE", "TOUCHEVENT_COMPAT_WAIT", "SWIPE_THRESHOLD", "Default", "interval", "keyboard", "slide", "pause", "wrap", "touch", "DefaultType", "Direction", "NEXT", "PREV", "LEFT", "RIGHT", "SLIDE", "SLID", "KEYDOWN", "MOUSEENTER", "MOUSELEAVE", "TOUCHSTART", "TOUCHMOVE", "TOUCHEND", "POINTERDOWN", "POINTERUP", "DRAG_START", "LOAD_DATA_API", "CAROUSEL", "ITEM", "POINTER_EVENT", "ACTIVE_ITEM", "ITEM_IMG", "NEXT_PREV", "INDICATORS", "DATA_SLIDE", "DATA_RIDE", "PointerType", "TOUCH", "PEN", "Carousel", "_items", "_interval", "_activeElement", "_isPaused", "_isSliding", "touchTimeout", "touchStartX", "touchDeltaX", "_config", "_getConfig", "_indicatorsElement", "_touchSupported", "navigator", "maxTouchPoints", "_pointerEvent", "window", "PointerEvent", "MSPointerEvent", "_addEventListeners", "next", "_slide", "nextWhenVisible", "hidden", "prev", "cycle", "clearInterval", "setInterval", "visibilityState", "bind", "to", "index", "activeIndex", "_getItemIndex", "length", "direction", "off", "_objectSpread", "_handleSwipe", "absDeltax", "abs", "_this2", "_keydown", "_addTouchEventListeners", "_this3", "start", "originalEvent", "pointerType", "clientX", "touches", "move", "end", "clearTimeout", "querySelectorAll", "e", "add", "tagName", "which", "slice", "indexOf", "_getItemByDirection", "isNextDirection", "isPrevDirection", "lastItemIndex", "isGoingToWrap", "delta", "itemIndex", "_triggerSlideEvent", "relatedTarget", "eventDirectionName", "targetIndex", "fromIndex", "slideEvent", "from", "_setActiveIndicatorElement", "indicators", "nextIndicator", "children", "addClass", "_this4", "activeElementIndex", "nextElement", "nextElementIndex", "isCycling", "directionalClassName", "orderClassName", "slidEvent", "nextElementInterval", "parseInt", "defaultInterval", "action", "TypeError", "ride", "_dataApiClickHandler", "slideIndex", "carousels", "i", "len", "$carousel", "SHOWN", "HIDE", "HIDDEN", "COLLAPSE", "COLLAPSING", "COLLAPSED", "Dimension", "WIDTH", "HEIGHT", "ACTIVES", "Collapse", "_isTransitioning", "_triggerArray", "id", "toggleList", "elem", "filterElement", "filter", "foundElem", "_selector", "push", "_parent", "_getParent", "_addAriaAndCollapsedClass", "hide", "show", "actives", "activesData", "not", "startEvent", "dimension", "_getDimension", "style", "attr", "setTransitioning", "complete", "capitalizedDimension", "scrollSize", "getBoundingClientRect", "triggerArrayLength", "$elem", "isTransitioning", "hasWidth", "jquery", "_getTargetFromElement", "triggerArray", "isOpen", "$this", "currentTarget", "$trigger", "selectors", "$target", "ESCAPE_KEYCODE", "SPACE_KEYCODE", "TAB_KEYCODE", "ARROW_UP_KEYCODE", "ARROW_DOWN_KEYCODE", "RIGHT_MOUSE_BUTTON_WHICH", "REGEXP_KEYDOWN", "CLICK", "KEYDOWN_DATA_API", "KEYUP_DATA_API", "DISABLED", "DROPUP", "DROPRIGHT", "DROPLEFT", "MENURIGHT", "MENULEFT", "POSITION_STATIC", "FORM_CHILD", "MENU", "NAVBAR_NAV", "VISIBLE_ITEMS", "AttachmentMap", "TOP", "TOPEND", "BOTTOM", "BOTTOMEND", "RIGHTEND", "LEFTEND", "offset", "flip", "boundary", "reference", "display", "Dropdown", "_popper", "_menu", "_getMenuElement", "_inNavbar", "_detectNavbar", "disabled", "_getParentFromElement", "isActive", "_clearMenus", "showEvent", "Popper", "referenceElement", "_getPopperConfig", "body", "noop", "hideEvent", "destroy", "update", "scheduleUpdate", "stopPropagation", "constructor", "_getPlacement", "$parentDropdown", "placement", "_getOffset", "offsets", "popperConfig", "modifiers", "enabled", "preventOverflow", "boundariesElement", "applyStyle", "toggles", "context", "clickEvent", "dropdownMenu", "_dataApiKeydownHandler", "items", "backdrop", "FOCUSIN", "RESIZE", "CLICK_DISMISS", "KEYDOWN_DISMISS", "MOUSEUP_DISMISS", "MOUSEDOWN_DISMISS", "SCROLLABLE", "SCROLLBAR_MEASURER", "BACKDROP", "OPEN", "DIALOG", "MODAL_BODY", "DATA_DISMISS", "FIXED_CONTENT", "STICKY_CONTENT", "Modal", "_dialog", "_backdrop", "_isShown", "_isBodyOverflowing", "_ignoreBackdropClick", "_scrollbarWidth", "_checkScrollbar", "_setScrollbar", "_adjustDialog", "_setEscapeEvent", "_setResizeEvent", "_showBackdrop", "_showElement", "transition", "_hideModal", "forEach", "htmlElement", "handleUpdate", "Node", "ELEMENT_NODE", "appendChild", "removeAttribute", "scrollTop", "_enforceFocus", "shownEvent", "transitionComplete", "has", "_this5", "_this6", "_this7", "_resetAdjustments", "_resetScrollbar", "_removeBackdrop", "callback", "_this8", "animate", "createElement", "className", "appendTo", "backdropTransitionDuration", "callbackRemove", "isModalOverflowing", "scrollHeight", "clientHeight", "paddingLeft", "paddingRight", "rect", "left", "right", "innerWidth", "_getScrollbarWidth", "_this9", "fixedContent", "stickyContent", "actualPadding", "calculatedPadding", "actualMargin", "marginRight", "calculatedMargin", "padding", "elements", "margin", "scrollDiv", "scrollbarWidth", "width", "clientWidth", "removeChild", "_this10", "uriAttrs", "ARIA_ATTRIBUTE_PATTERN", "DefaultWhitelist", "a", "area", "b", "br", "col", "code", "div", "em", "hr", "h1", "h2", "h3", "h4", "h5", "h6", "img", "li", "ol", "p", "pre", "s", "small", "span", "sub", "sup", "strong", "u", "ul", "SAFE_URL_PATTERN", "DATA_URL_PATTERN", "allowedAttribute", "allowedAttributeList", "attrName", "nodeName", "nodeValue", "regExp", "attrRegex", "l", "sanitizeHtml", "unsafeHtml", "whiteList", "sanitizeFn", "domParser", "DOMParser", "createdDocument", "parseFromString", "whitelistKeys", "keys", "_loop", "el", "elName", "attributeList", "attributes", "whitelistedAttributes", "concat", "_ret", "innerHTML", "CLASS_PREFIX", "BSCLS_PREFIX_REGEX", "DISALLOWED_ATTRIBUTES", "animation", "template", "title", "delay", "html", "container", "fallbackPlacement", "sanitize", "AUTO", "HoverState", "OUT", "INSERTED", "FOCUSOUT", "TOOLTIP", "TOOLTIP_INNER", "ARROW", "Trigger", "HOVER", "MANUAL", "Tooltip", "_isEnabled", "_timeout", "_hoverState", "_activeTrigger", "tip", "_setListeners", "enable", "disable", "toggleEnabled", "dataKey", "_getDelegateConfig", "click", "_isWithActiveTrigger", "_enter", "_leave", "getTipElement", "isWithContent", "shadowRoot", "isInTheDom", "ownerDocument", "tipId", "setContent", "attachment", "_getAttachment", "addAttachmentClass", "_getContainer", "behavior", "arrow", "onCreate", "originalPlacement", "_handlePopperPlacementChange", "onUpdate", "_fixTransition", "prevHoverState", "_cleanTipClass", "getTitle", "setElementContent", "content", "empty", "append", "text", "find", "triggers", "eventIn", "eventOut", "_fixTitle", "titleType", "dataAttributes", "dataAttr", "key", "$tip", "tabClass", "join", "popperData", "popperInstance", "instance", "popper", "initConfigAnimation", "TITLE", "CONTENT", "Popover", "_getContent", "method", "ACTIVATE", "SCROLL", "DROPDOWN_ITEM", "DROPDOWN_MENU", "DATA_SPY", "NAV_LIST_GROUP", "NAV_LINKS", "NAV_ITEMS", "LIST_ITEMS", "DROPDOWN", "DROPDOWN_ITEMS", "DROPDOWN_TOGGLE", "OffsetMethod", "OFFSET", "POSITION", "ScrollSpy", "_scrollElement", "_offsets", "_targets", "_activeTarget", "_scrollHeight", "_process", "refresh", "autoMethod", "offsetMethod", "offsetBase", "_getScrollTop", "_getScrollHeight", "targets", "map", "targetSelector", "targetBCR", "height", "top", "item", "sort", "pageYOffset", "max", "_getOffsetHeight", "innerHeight", "maxScroll", "_activate", "_clear", "offsetLength", "isActiveTarget", "queries", "$link", "parents", "node", "scrollSpys", "scrollSpysLength", "$spy", "ACTIVE_UL", "DROPDOWN_ACTIVE_CHILD", "Tab", "previous", "listElement", "itemSelector", "makeArray", "hiddenEvent", "activeElements", "active", "_transitionComplete", "dropdownChild", "dropdownElement", "dropdownToggleList", "SHOWING", "autohide", "Toast", "withoutTimeout", "_close", "version", "minMajor", "ltMajor", "minMinor", "minPatch", "maxMajor", "import_jquery", "jquery", "turbo_es2017_esm_exports", "__export", "FetchEnctype", "FetchMethod", "FetchRequest", "FetchResponse", "FrameElement", "FrameLoadingStyle", "FrameRenderer", "PageRenderer", "PageSnapshot", "StreamActions", "StreamElement", "StreamSourceElement", "cache", "config", "connectStreamSource", "disconnectStreamSource", "fetchWithTurboHeaders", "fetchEnctypeFromString", "fetchMethodFromString", "isSafe", "morphBodyElements", "morphChildren", "morphElements", "morphTurboFrameElements", "sessionNavigator", "registerAdapter", "renderStreamMessage", "session", "setConfirmMethod", "setFormMode", "setProgressBarDelay", "start", "visit", "FrameLoadingStyle", "_FrameElement", "__publicField", "name", "value", "frameLoadingStyleFromString", "_a", "_b", "FrameElement", "style", "drive", "activateScriptElement", "element", "createdScriptElement", "cspNonce", "getCspNonce", "copyElementAttributes", "destinationElement", "sourceElement", "createDocumentFragment", "html", "template", "dispatch", "eventName", "target", "cancelable", "detail", "event", "cancelEvent", "nextRepaint", "nextEventLoopTick", "nextAnimationFrame", "resolve", "parseHTMLDocument", "unindent", "strings", "values", "lines", "interpolate", "match", "indent", "line", "result", "string", "i", "uuid", "_", "getAttribute", "attributeName", "elements", "hasAttribute", "markAsBusy", "clearBusyState", "waitForLoad", "timeoutInMilliseconds", "onComplete", "getHistoryMethodForAction", "action", "isAction", "getVisitAction", "getMetaElement", "getMetaContent", "nonce", "content", "setMetaContent", "findClosestRecursively", "selector", "elementIsFocusable", "queryAutofocusableElement", "elementOrDocumentFragment", "around", "callback", "reader", "before", "after", "doesNotTargetIFrame", "findLinkFromClickTarget", "link", "linkTarget", "debounce", "fn", "delay", "timeoutId", "args", "submitter", "_submitter", "Config", "config", "__privateAdd", "__privateGet", "__privateSet", "forms", "expandURL", "locatable", "getAnchor", "url", "anchorMatch", "getAction$1", "form", "getExtension", "getLastPathComponent", "isPrefixedBy", "baseURL", "prefix", "addTrailingSlash", "locationIsVisitable", "location", "rootLocation", "getLocationForLink", "getRequestURL", "anchor", "toCacheKey", "urlsAreEqual", "left", "right", "getPathComponents", "FetchResponse", "response", "LimitedSet", "maxSize", "oldestValue", "recentRequests", "fetchWithTurboHeaders", "options", "modifiedHeaders", "requestUID", "__spreadProps", "__spreadValues", "fetchMethodFromString", "method", "FetchMethod", "fetchEnctypeFromString", "encoding", "FetchEnctype", "_resolveRequestPromise", "_FetchRequest_instances", "allowRequestToBeIntercepted_fn", "willDelegateErrorHandling_fn", "FetchRequest", "delegate", "requestBody", "enctype", "_value", "body", "buildResourceAndBody", "fetchBody", "fetchMethod", "fetchOptions", "__privateMethod", "error", "fetchResponse", "isSafe", "mimeType", "requestInterception", "resource", "searchParams", "entriesExcludingFiles", "mergeIntoURLSearchParams", "entries", "AppearanceObserver", "lastEntry", "StreamMessage", "message", "fragment", "importStreamElements", "streamElement", "inertScriptElement", "identity", "key", "_toCacheKey", "LRUCache", "size", "entry", "index", "PREFETCH_DELAY", "_prefetchTimeout", "_maxAges", "PrefetchCache", "prefetchDelay", "request", "ttl", "cacheTtl", "maxAge", "prefetchCache", "FormSubmissionState", "FormSubmission", "_FormSubmission", "formElement", "mustRedirect", "getMethod", "getAction", "getFormAction", "buildFormData", "getEnctype", "initialized", "requesting", "confirmationMessage", "stopping", "stopped", "token", "getCookieValue", "_request", "responseSucceededWithoutRedirect", "input", "formData", "cookieName", "cookie", "formElementAction", "formAction", "Snapshot", "queryPermanentElementsAll", "id", "getPermanentElementById", "snapshot", "permanentElementMap", "currentPermanentElement", "newPermanentElement", "node", "FormSubmitObserver", "eventTarget", "submissionDoesNotDismissDialog", "submissionDoesNotTargetIFrame", "_resolveRenderPromise", "_resolveInterceptionPromise", "View", "x", "y", "renderer", "isPreview", "shouldRender", "willRender", "shouldInvalidate", "renderInterception", "reason", "direction", "FrameView", "LinkInterceptor", "_event", "LinkClickObserver", "FormLinkClickObserver", "originalEvent", "type", "turboFrame", "turboAction", "turboConfirm", "Bardo", "bardo", "permanentElement", "placeholder", "createPlaceholderForPermanentElement", "clone", "_activeElement", "Renderer", "currentSnapshot", "newSnapshot", "reject", "currentElement", "newElement", "FrameRenderer", "destinationRange", "frameElement", "sourceRange", "renderElement", "block", "readScrollLogicalPosition", "behavior", "readScrollBehavior", "activatedScriptElement", "defaultValue", "Idiomorph", "noOp", "defaults", "elt", "morph", "oldNode", "newContent", "normalizeElement", "newNode", "normalizeParent", "ctx", "createMorphContext", "morphedNodes", "saveAndRestoreFocus", "withHeadBlocking", "morphChildren", "morphOuterHTML", "oldParent", "activeElement", "activeElementId", "selectionStart", "selectionEnd", "results", "newParent", "insertionPoint", "endPoint", "newChild", "bestMatch", "findBestMatch", "removeNodesBetween", "morphNode", "newChildId", "movedChild", "moveBeforeById", "insertedNode", "createNode", "tempNode", "removeNode", "newEmptyChild", "newClonedChild", "startPoint", "softMatch", "nextSibling", "siblingSoftMatchCount", "cursor", "isSoftMatch", "isIdSetMatch", "oldSet", "newSet", "_c", "oldElt", "newElt", "moveBefore", "startInclusive", "endExclusive", "parentNode", "removeElementFromAncestorsIdMaps", "idSet", "e", "handleHeadElement", "morphAttributes", "ignoreValueOfActiveElement", "oldAttributes", "newAttributes", "newAttribute", "ignoreAttribute", "oldAttribute", "syncInputValue", "oldElement", "newValue", "oldValue", "syncBooleanAttribute", "newLiveValue", "oldLiveValue", "ignoreUpdate", "attr", "updateType", "possibleActiveElement", "oldHead", "newHead", "promises", "newCtx", "added", "removed", "preserved", "nodesToAppend", "srcToNewHeadNodes", "newHeadChild", "currentHeadElt", "inNewContent", "isReAppended", "isPreserved", "promise", "_resolve", "removedElement", "persistentIds", "idMap", "createIdMaps", "mergedConfig", "mergeDefaults", "morphStyle", "createPantry", "createActiveElementAndParents", "finalConfig", "pantry", "activeElementAndParents", "findIdElements", "root", "populateIdMapWithTree", "current", "oldContent", "oldIdElements", "newIdElements", "createPersistentIds", "newRoot", "duplicateIds", "oldIdTagNameMap", "tagName", "generatedByIdiomorph", "parseContent", "SlicedParentNode", "dummyParent", "nodes", "nodeList", "referenceNode", "parser", "contentWithSvgsRemoved", "htmlElement", "morphElements", "callbacks", "__objRest", "DefaultIdiomorphCallbacks", "shouldRefreshFrameWithMorphing", "currentFrame", "newFrame", "areFramesCompatibleForRefreshing", "closestFrameReloadableWithMorphing", "_beforeNodeMorphed", "beforeNodeMorphed", "mutationType", "MorphingFrameRenderer", "_ProgressBar", "ProgressBar", "HeadSnapshot", "elementIsNoscript", "elementWithoutNonce", "outerHTML", "details", "elementType", "elementIsTracked", "matchedType", "tracked", "elementIsMetaElementWithName", "elementIsScript", "elementIsStylesheet", "PageSnapshot", "_PageSnapshot", "documentElement", "head", "headSnapshot", "clonedElement", "selectElements", "clonedSelectElements", "source", "option", "clonedPasswordInput", "clonedNoscriptElement", "_viewTransitionStarted", "_lastOperation", "ViewTransitioner", "useViewTransition", "render", "defaultOptions", "TimingMetric", "VisitState", "SystemStatusCode", "Direction", "Visit", "restorationIdentifier", "historyChanged", "referrer", "snapshotHTML", "visitCachedSnapshot", "updateHistory", "shouldCacheSnapshot", "acceptsStreamResponse", "refresh", "actionForHistory", "statusCode", "isSuccessful", "responseHTML", "_response", "redirected", "_error", "scrollPosition", "metric", "BrowserAdapter", "session", "visit", "_visit", "_formSubmission", "CacheObserver", "_FrameRedirector_instances", "shouldSubmit_fn", "shouldRedirect_fn", "findFrameElement_fn", "FrameRedirector", "_location", "frame", "meta", "History", "turbo", "restorationIndex", "state", "additionalData", "restorationData", "_prefetchedLink", "_enable", "_tryToPrefetchRequest", "_cancelRequestIfObsolete", "_cancelPrefetchRequest", "_tryToUsePrefetchedRequest", "_LinkPrefetchObserver_instances", "cacheTtl_get", "isPrefetchable_fn", "LinkPrefetchObserver", "fetchRequest", "cached", "turboFrameTarget", "unfetchableLink", "linkToTheSamePage", "linkOptsOut", "nonSafeLink", "eventPrevented", "turboPrefetchParent", "turboMethod", "isUJS", "_Navigator_instances", "getActionForFormSubmission_fn", "getDefaultAction_fn", "Navigator", "formSubmission", "visitOptions", "PageStage", "PageObserver", "readyState", "ScrollObserver", "position", "StreamMessageRenderer", "getPermanentElementMapForFragment", "withAutofocusFromFragment", "withPreservedFocus", "permanentElementsInDocument", "permanentElementInDocument", "elementInStream", "generatedID", "turboStreams", "elementWithAutofocus", "firstAutofocusableElementInStreams", "willAutofocusId", "elementToAutofocus", "activeElementBeforeRender", "activeElementAfterRender", "restoreFocusTo", "elementToFocus", "nodeListOfStreamElements", "_started", "StreamObserver", "fetchResponseFromEvent", "fetchResponseIsStream", "ErrorRenderer", "replaceableElement", "_PageRenderer_instances", "setLanguage_fn", "PageRenderer", "mergedHeadElements", "newStylesheetElements", "loadingElements", "newHeadElements", "elementList", "noscriptElement", "dir", "lang", "MorphingPageRenderer", "SnapshotCache", "PageView", "rendererClass", "cachedSnapshot", "_preloadAll", "Preloader", "snapshotCache", "_Cache_instances", "setCacheControl_fn", "Cache", "_pageRefreshDebouncePeriod", "Session", "adapter", "requestId", "scroll", "isRecentRequest", "isCurrentUrl", "isUnsafe", "isStream", "frameTarget", "extendURLWithDeprecatedProperties", "defaultPrevented", "_snapshot", "_isPreview", "renderMethod", "ev", "newBody", "timing", "submitterIsNavigatable", "container", "withinFrame", "deprecatedLocationPropertyDescriptors", "cache", "sessionNavigator", "start", "registerAdapter", "connectStreamSource", "disconnectStreamSource", "renderStreamMessage", "setProgressBarDelay", "setConfirmMethod", "confirmMethod", "setFormMode", "mode", "morphBodyElements", "currentBody", "morphTurboFrameElements", "Turbo", "TurboFrameMissingError", "_currentFetchRequest", "_resolveVisitPromise", "_connected", "_hasBeenLoaded", "_ignoredAttributes", "_shouldMorphFrame", "_FrameController_instances", "loadSourceURL_fn", "loadFrameResponse_fn", "visit_fn", "navigateFrame_fn", "handleUnvisitableFrameResponse_fn", "willHandleFrameMissingFromResponse_fn", "handleFrameMissingFromResponse_fn", "throwFrameMissingError_fn", "visitResponse_fn", "formActionIsVisitable_fn", "shouldInterceptNavigation_fn", "isIgnoringChangesTo_fn", "ignoringChangesToAttribute_fn", "withCurrentNavigationElement_fn", "getFrameElementById_fn", "FrameController", "_fetchResponse", "src", "document", "_renderMethod", "_newElement", "pageSnapshot", "activateElement", "sourceURL", "newFrameElement", "wrapped", "currentURL", "StreamActions", "targetElement", "_StreamElement_instances", "raise_fn", "_StreamElement", "c", "existingChildren", "newChildrenIds", "actionFunction", "StreamElement", "StreamSourceElement", "scriptElement", "consumer", "getConsumer", "setConsumer", "createConsumer", "newConsumer", "subscribeTo", "channel", "mixin", "subscriptions", "walk", "obj", "acc", "key", "camel", "m", "x", "TurboCableStreamSourceElement", "connectStreamSource", "subscribeTo", "disconnectStreamSource", "data", "event", "channel", "signed_stream_name", "__spreadValues", "walk", "__publicField", "encodeMethodIntoRequestBody", "event", "form", "fetchOptions", "submitter", "body", "isBodyInit", "method", "determineFetchMethod", "formMethod", "determineFormMethod", "overrideMethod", "turbo_es2017_esm_exports", "encodeMethodIntoRequestBody", "ActiveStorage", "import_bootstrap", "import_jquery", "import_jquery", "$", "jQuery", "DataTable", "selector", "options", "sSelector", "oOpts", "traditional", "_Api", "_fnSettingsFromNode", "_ext", "data", "redraw", "api", "rows", "bRedraw", "settings", "scroll", "_fnScrollDraw", "nTr", "target", "callback", "remove", "complete", "sInput", "iColumn", "bRegex", "bSmart", "bShowGlobal", "bCaseInsensitive", "src", "col", "type", "iRow", "node", "nodeName", "cell", "mHtml", "sClass", "mAction", "iCol", "bShow", "aaSort", "nNode", "fnCallback", "mData", "mRow", "bAction", "_that", "emptyInit", "len", "fn", "_fnExternApiFunc", "o", "oInit", "_fnExtend", "i", "iLen", "j", "jLen", "k", "kLen", "sId", "bInitHandedOff", "defaults", "$this", "_fnLog", "_fnCompatOpts", "_fnCompatCols", "_fnCamelToHungarian", "allSettings", "s", "bRetrieve", "bDestroy", "oSettings", "_fnLanguageCompat", "_fnMap", "_fnCallbackReg", "_fnGetObjectDataFn", "_fnBrowserDetect", "oClasses", "tmp", "oLanguage", "json", "_fnCallbackFire", "_fnInitialise", "stripeClasses", "rowOne", "el", "anThs", "aoColumnsInit", "nThead", "_fnDetectHeader", "_fnGetUniqueThs", "_fnAddColumn", "_fnApplyColumnDefs", "oDef", "_fnColumnOptions", "a", "name", "sort", "filter", "features", "loadedInit", "sorting", "_fnSortingClasses", "aSort", "_fnSortFlatten", "sortedColumns", "val", "_fnSortAria", "_fnDataSource", "captions", "thead", "tbody", "tfoot", "_fnAddData", "_fnAddTr", "_fnSaveState", "_fnLoadState", "_api_register", "_api_registerPlural", "_re_dic", "_re_new_lines", "_re_html", "_re_date", "_re_escape_regex", "_re_formatted_numeric", "_empty", "d", "_intVal", "integer", "_numToDecimal", "num", "decimalPoint", "_fnEscapeRegex", "_isNumber", "formatted", "strType", "_isHtml", "_htmlNumeric", "html", "_stripHtml", "_pluck", "prop", "prop2", "out", "ien", "_pluck_order", "order", "_range", "start", "end", "_removeEmpty", "_areAllUnique", "sorted", "last", "_unique", "again", "_flatten", "_includes", "search", "arg", "freq", "frequency", "timer", "that", "now", "args", "source", "meta", "setData", "_fnSplitObjNotation", "b", "aLast", "arrayNotation", "funcNotation", "innerSrc", "__reArray", "__reFn", "key", "row", "t", "fetchData", "join", "_fnHungarianMap", "hungarian", "match", "newKey", "map", "user", "force", "hungarianKey", "lang", "defaultDecimal", "_addNumericSort", "zeroRecords", "decimal", "_fnCompatMap", "knew", "old", "init", "searchCols", "dataSort", "browser", "n", "outer", "inner", "_fnReduce", "inc", "value", "isSet", "nTh", "oDefaults", "oCol", "oOptions", "th", "origClass", "mDataSrc", "mRender", "attrTest", "rowData", "innerData", "_fnSetObjectDataFn", "bAsc", "bDesc", "_fnAdjustColumnSizing", "columns", "_fnCalculateColumnWidths", "_fnVisibleToColumnIndex", "iMatch", "aiVis", "_fnGetColumns", "_fnColumnIndexToVisible", "iPos", "_fnVisbleColumns", "vis", "sParam", "_fnColumnTypes", "types", "jen", "ken", "detectedType", "cache", "_fnGetCellData", "aoColDefs", "aoCols", "def", "aTargets", "aDataIn", "anTds", "oData", "nTd", "sThisType", "id", "_fnCreateTr", "trs", "_fnGetRowElements", "_fnNodeToDataIndex", "_fnNodeToColumnIndex", "rowIdx", "colIdx", "draw", "defaultContent", "cellData", "fomatters", "_fnSetCellData", "str", "_fnGetDataMaster", "_fnClearTable", "_fnDeleteIndex", "iTarget", "splice", "iTargetIndex", "_fnInvalidate", "cellWrite", "cells", "cols", "_fnRowAttributes", "tds", "td", "contents", "objectRead", "attr", "idx", "setter", "cellProcess", "rowNode", "nTrIn", "create", "tr", "_fnBuildHead", "column", "createHeader", "classes", "_fnSortAttachListener", "_fnRenderer", "_fnDrawHead", "aoSource", "bIncludeHidden", "nLocalTr", "aoLocal", "aApplied", "iColumns", "iRowspan", "iColspan", "_fnDraw", "ajaxComplete", "_fnStart", "aPreDraw", "_fnProcessingDisplay", "anRows", "iRowCount", "asStripeClasses", "iStripes", "oLang", "bServerSide", "aiDisplay", "iDisplayStart", "iDisplayEnd", "_fnAjaxUpdate", "iStart", "iEnd", "iDataIndex", "aoData", "nRow", "sStripe", "sZero", "body", "_fnReDraw", "holdPosition", "_fnSort", "_fnFilterComplete", "_fnAddOptionsHtml", "table", "holding", "insert", "aDom", "featureNode", "cOption", "nNewNode", "cNext", "sAttr", "aSplit", "_fnFeatureHtmlLength", "_fnFeatureHtmlFilter", "_fnFeatureHtmlProcessing", "_fnFeatureHtmlTable", "_fnFeatureHtmlInfo", "_fnFeatureHtmlPaginate", "aoFeatures", "aanFeatures", "aLayout", "nTrs", "nCell", "l", "iColShifted", "bUnique", "fnShiftCol", "nHeader", "aReturn", "iInitDisplayStart", "_fnBuildAjax", "rbracket", "ajaxData", "ajax", "instance", "status", "_fnAjaxDataSrc", "error", "newData", "baseAjax", "xhr", "thrown", "ret", "_fnAjaxParameters", "_fnAjaxUpdateDraw", "columnCount", "preSearch", "preColSearch", "dataProp", "columnSearch", "displayStart", "displayLength", "param", "legacy", "compat", "modern", "recordsTotal", "recordsFiltered", "_fnInitComplete", "write", "dataSrc", "tableId", "language", "previousSearch", "input", "searchFn", "event", "searchDelay", "jqFilter", "_fnThrottle", "e", "ev", "oInput", "iForce", "oPrevSearch", "aoPrevSearch", "fnSaveFilter", "oFilter", "fnRegex", "_fnFilter", "_fnFilterColumn", "_fnFilterCustom", "filters", "displayRows", "searchStr", "regex", "smart", "caseInsensitive", "display", "rpSearch", "_fnFilterCreateSearch", "prevSearch", "displayMaster", "invalidated", "filtered", "_fnFilterData", "word", "__filter_div", "__filter_div_textContent", "filterData", "wasInvalidated", "_fnSearchToCamel", "obj", "_fnSearchToHung", "tid", "nodes", "_fnUpdateInfo", "max", "total", "_fnInfoMacros", "formatter", "all", "iAjaxStart", "deferLoading", "_fnStringToCss", "aData", "_fnLengthChange", "_fnLengthOverflow", "menu", "d2", "lengths", "select", "div", "plugin", "visRecords", "page", "pages", "buttons", "_fnPageChange", "action", "records", "changed", "show", "scrollX", "scrollY", "caption", "captionSide", "headerClone", "footerClone", "footer", "_div", "size", "scroller", "children", "scrollHead", "scrollBody", "scrollFoot", "scrollLeft", "scrollXInner", "barWidth", "divHeader", "divHeaderStyle", "divHeaderInner", "divHeaderInnerStyle", "divHeaderTable", "divBodyEl", "divBody", "divBodyStyle", "divFooter", "divFooterInner", "divFooterTable", "header", "tableEl", "tableStyle", "ie67", "dtHeaderCells", "headerTrgEls", "footerTrgEls", "headerSrcEls", "footerSrcEls", "headerCopy", "footerCopy", "headerWidths", "footerWidths", "headerContent", "footerContent", "correction", "sanityWidth", "zeroOut", "nSizer", "style", "scrollBarVis", "_fnApplyToChildren", "nToSize", "iOuterWidth", "bScrolling", "padding", "an1", "an2", "index", "nNode1", "nNode2", "__re_html_remove", "visibleColumns", "headerCells", "tableWidthAttr", "tableContainer", "userInputs", "columnIdx", "width", "outerWidth", "styleWidth", "_fnConvertToWidth", "tmpTable", "_fnGetWidestNode", "holder", "border", "bounding", "bindResize", "parent", "_fnGetMaxLenString", "maxIdx", "aiOrig", "aoColumns", "aDataSort", "sType", "srcCol", "fixed", "fixedObj", "nestedSort", "add", "sDataType", "oExtSort", "oSort", "formatters", "sortCol", "_fnSortData", "x", "y", "test", "dataA", "dataB", "label", "nextSort", "oAria", "asSorting", "sTitle", "_fnSortListener", "append", "nextSortIdx", "next", "overflow", "sortIdx", "attachTo", "_fnBindAction", "oldSort", "sortClass", "customSort", "customData", "state", "loaded", "_fnImplementState", "abStateLoad", "duration", "level", "msg", "tn", "ext", "mappedName", "extender", "breakRefs", "sStore", "sName", "callbackArr", "eventName", "renderer", "host", "__apiStruct", "__arrayProto", "_toSettings", "mixed", "jq", "tables", "context", "ctxSettings", "ctx", "flatten", "alwaysNew", "items", "item", "apiInst", "_selector_row_indexes", "apiSelector", "scope", "struct", "methodScoping", "struc", "heir", "method", "find", "pluralName", "singularName", "__table_selector", "paging", "__reload", "resetPaging", "url", "_selector_run", "selectFn", "opts", "res", "selectorType", "_selector_opts", "_selector_first", "inst", "displayFiltered", "displayFilteredMap", "__row_selector", "run", "sel", "selInt", "cellIdx", "rowObj", "r", "hash", "thatIdx", "loopRow", "loopCells", "newRows", "modRows", "namespace", "stateSaveParamsEvent", "destroyEvent", "idFn", "ids", "__details_add", "klass", "addRow", "created", "__details_state", "__details_remove", "__details_display", "__details_events", "drawEvent", "colvisEvent", "visible", "_emp", "_child_obj", "_child_mth", "__re_column_selector", "__columnData", "r1", "r2", "__column_selector", "names", "visColumns", "jqResult", "__setColumnVis", "insertBefore", "calc", "__cell_selector", "allCells", "fnSelector", "rowSelector", "columnSelector", "internalOpts", "cellsNoOpts", "dir", "set", "caseInsen", "module", "root", "is", "version", "aThis", "aThat", "iThis", "iThat", "head", "foot", "jqRows", "jqTable", "jqTbody", "jqWrapper", "orig", "removedMethod", "arg1", "arg2", "arg3", "arg4", "token", "plural", "resolved", "toFormat", "paginate", "extPagination", "_numbers", "numbers", "half", "aria", "btnDisplay", "btnClass", "attach", "container", "button", "tabIndex", "disabledClass", "clickHandler", "tag", "disabled", "activeEl", "parsed", "__numericReplace", "decimalPlace", "re1", "re2", "ts", "__htmlEscapeEntities", "__mld", "dt", "momentFn", "luxonFn", "dateFn", "__mlWarning", "__mldObj", "format", "locale", "__mlHelper", "localeString", "from", "to", "typeName", "local", "__thousands", "__decimal", "thousands", "precision", "prefix", "postfix", "negative", "flo", "intPart", "floatPart", "jquery_dataTables_default", "$", "jquery_dataTables_default", "settings", "host", "idx", "buttons", "page", "pages", "api", "classes", "lang", "aria", "btnDisplay", "btnClass", "attach", "container", "i", "ien", "node", "button", "clickHandler", "e", "disabled", "activeEl", "toggleDropdown", "btn", "styleAccordion", "headings", "clickedHeading", "element", "content", "flipArrows", "btn", "autoSubmit", "toggleTable", "setupTable", "event", "table", "dataT", "clearTable"]
}
