` by default. You can change this\n * behavior by providing a `component` prop.\n * If you use React v16+ and would like to avoid a wrapping `
` element\n * you can pass in `component={null}`. This is useful if the wrapping div\n * borks your css styles.\n */\n component: _propTypes.default.any,\n\n /**\n * A set of `` components, that are toggled `in` and out as they\n * leave. the `` will inject specific transition props, so\n * remember to spread them through if you are wrapping the `` as\n * with our `` example.\n *\n * While this component is meant for multiple `Transition` or `CSSTransition`\n * children, sometimes you may want to have a single transition child with\n * content that you want to be transitioned out and in when you change it\n * (e.g. routes, images etc.) In that case you can change the `key` prop of\n * the transition child as you change its content, this will cause\n * `TransitionGroup` to transition the child out and back in.\n */\n children: _propTypes.default.node,\n\n /**\n * A convenience prop that enables or disables appear animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n appear: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables enter animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n enter: _propTypes.default.bool,\n\n /**\n * A convenience prop that enables or disables exit animations\n * for all children. Note that specifying this will override any defaults set\n * on individual children Transitions.\n */\n exit: _propTypes.default.bool,\n\n /**\n * You may need to apply reactive updates to a child as it is exiting.\n * This is generally done by using `cloneElement` however in the case of an exiting\n * child the element has already been removed and not accessible to the consumer.\n *\n * If you do need to update a child as it leaves you can provide a `childFactory`\n * to wrap every child, even the ones that are leaving.\n *\n * @type Function(child: ReactElement) -> ReactElement\n */\n childFactory: _propTypes.default.func\n} : {};\nTransitionGroup.defaultProps = defaultProps;\n\nvar _default = (0, _reactLifecyclesCompat.polyfill)(TransitionGroup);\n\nexports.default = _default;\nmodule.exports = exports[\"default\"];","/**\n * Helper function for iterating over a collection\n *\n * @param collection\n * @param fn\n */\nfunction each(collection, fn) {\n var i = 0,\n length = collection.length,\n cont;\n\n for (i; i < length; i++) {\n cont = fn(collection[i], i);\n\n if (cont === false) {\n break; //allow early exit\n }\n }\n}\n/**\n * Helper function for determining whether target object is an array\n *\n * @param target the object under test\n * @return {Boolean} true if array, false otherwise\n */\n\n\nfunction isArray(target) {\n return Object.prototype.toString.apply(target) === '[object Array]';\n}\n/**\n * Helper function for determining whether target object is a function\n *\n * @param target the object under test\n * @return {Boolean} true if function, false otherwise\n */\n\n\nfunction isFunction(target) {\n return typeof target === 'function';\n}\n\nmodule.exports = {\n isFunction: isFunction,\n isArray: isArray,\n each: each\n};","'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.Collapse = undefined;\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar _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\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\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _reactMotion = require('react-motion');\n\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\n\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\n\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\n\nvar SPRING_PRECISION = 1;\nvar WAITING = 'WAITING';\nvar RESIZING = 'RESIZING';\nvar RESTING = 'RESTING';\nvar IDLING = 'IDLING';\n\nvar noop = function noop() {\n return null;\n};\n\nvar css = {\n collapse: 'ReactCollapse--collapse',\n content: 'ReactCollapse--content'\n};\n\nvar Collapse = exports.Collapse = function (_React$PureComponent) {\n _inherits(Collapse, _React$PureComponent);\n\n function Collapse(props) {\n _classCallCheck(this, Collapse);\n\n var _this = _possibleConstructorReturn(this, (Collapse.__proto__ || Object.getPrototypeOf(Collapse)).call(this, props));\n\n _initialiseProps.call(_this);\n\n _this.state = {\n currentState: IDLING,\n from: 0,\n to: 0\n };\n return _this;\n }\n\n _createClass(Collapse, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n var _props = this.props,\n isOpened = _props.isOpened,\n forceInitialAnimation = _props.forceInitialAnimation,\n onRest = _props.onRest;\n\n if (isOpened) {\n var to = this.getTo();\n\n if (forceInitialAnimation) {\n var from = this.wrapper.clientHeight;\n this.setState({\n currentState: RESIZING,\n from: from,\n to: to\n });\n } else {\n this.setState({\n currentState: IDLING,\n from: to,\n to: to\n });\n }\n }\n\n onRest();\n }\n }, {\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n if (nextProps.hasNestedCollapse) {\n // For nested collapses we do not need to change to waiting state\n // and should keep `height:auto`\n // Because children will be animated and height will not jump anyway\n // See https://github.com/nkbt/react-collapse/issues/76 for more details\n if (nextProps.isOpened !== this.props.isOpened) {\n // Still go to WAITING state if own isOpened was changed\n this.setState({\n currentState: WAITING\n });\n }\n } else if (this.state.currentState === IDLING && (nextProps.isOpened || this.props.isOpened)) {\n this.setState({\n currentState: WAITING\n });\n }\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate(_, prevState) {\n var _props2 = this.props,\n isOpened = _props2.isOpened,\n onRest = _props2.onRest,\n onMeasure = _props2.onMeasure;\n\n if (this.state.currentState === IDLING) {\n onRest();\n return;\n }\n\n if (prevState.to !== this.state.to) {\n onMeasure({\n height: this.state.to,\n width: this.content.clientWidth\n });\n }\n\n var from = this.wrapper.clientHeight;\n var to = isOpened ? this.getTo() : 0;\n\n if (from !== to) {\n this.setState({\n currentState: RESIZING,\n from: from,\n to: to\n });\n return;\n }\n\n if (this.state.currentState === RESTING || this.state.currentState === WAITING) {\n this.setState({\n currentState: IDLING,\n from: from,\n to: to\n });\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n cancelAnimationFrame(this.raf);\n }\n }, {\n key: 'render',\n value: function render() {\n return _react2.default.createElement(_reactMotion.Motion, _extends({}, this.getMotionProps(), {\n onRest: this.onRest,\n children: this.renderContent\n }));\n }\n }]);\n\n return Collapse;\n}(_react2.default.PureComponent);\n\nCollapse.propTypes = {\n isOpened: _propTypes2.default.bool.isRequired,\n springConfig: _propTypes2.default.objectOf(_propTypes2.default.number),\n forceInitialAnimation: _propTypes2.default.bool,\n hasNestedCollapse: _propTypes2.default.bool,\n fixedHeight: _propTypes2.default.number,\n theme: _propTypes2.default.objectOf(_propTypes2.default.string),\n style: _propTypes2.default.object,\n onRender: _propTypes2.default.func,\n onRest: _propTypes2.default.func,\n onMeasure: _propTypes2.default.func,\n children: _propTypes2.default.node.isRequired\n};\nCollapse.defaultProps = {\n forceInitialAnimation: false,\n hasNestedCollapse: false,\n fixedHeight: -1,\n style: {},\n theme: css,\n onRender: noop,\n onRest: noop,\n onMeasure: noop\n};\n\nvar _initialiseProps = function _initialiseProps() {\n var _this2 = this;\n\n this.onContentRef = function (content) {\n _this2.content = content;\n };\n\n this.onWrapperRef = function (wrapper) {\n _this2.wrapper = wrapper;\n };\n\n this.onRest = function () {\n _this2.raf = requestAnimationFrame(_this2.setResting);\n };\n\n this.setResting = function () {\n _this2.setState({\n currentState: RESTING\n });\n };\n\n this.getTo = function () {\n var fixedHeight = _this2.props.fixedHeight;\n return fixedHeight > -1 ? fixedHeight : _this2.content.clientHeight;\n };\n\n this.getWrapperStyle = function (height) {\n if (_this2.state.currentState === IDLING && _this2.state.to) {\n var fixedHeight = _this2.props.fixedHeight;\n\n if (fixedHeight > -1) {\n return {\n overflow: 'hidden',\n height: fixedHeight\n };\n }\n\n return {\n height: 'auto'\n };\n }\n\n if (_this2.state.currentState === WAITING && !_this2.state.to) {\n return {\n overflow: 'hidden',\n height: 0\n };\n }\n\n return {\n overflow: 'hidden',\n height: Math.max(0, height)\n };\n };\n\n this.getMotionProps = function () {\n var springConfig = _this2.props.springConfig;\n return _this2.state.currentState === IDLING ? {\n // When completely stable, instantly jump to the position\n defaultStyle: {\n height: _this2.state.to\n },\n style: {\n height: _this2.state.to\n }\n } : {\n // Otherwise, animate\n defaultStyle: {\n height: _this2.state.from\n },\n style: {\n height: (0, _reactMotion.spring)(_this2.state.to, _extends({\n precision: SPRING_PRECISION\n }, springConfig))\n }\n };\n };\n\n this.renderContent = function (_ref) {\n var height = _ref.height; // eslint-disable-line\n\n var _props3 = _this2.props,\n _isOpened = _props3.isOpened,\n _springConfig = _props3.springConfig,\n _forceInitialAnimation = _props3.forceInitialAnimation,\n _hasNestedCollapse = _props3.hasNestedCollapse,\n _fixedHeight = _props3.fixedHeight,\n theme = _props3.theme,\n style = _props3.style,\n onRender = _props3.onRender,\n _onRest = _props3.onRest,\n _onMeasure = _props3.onMeasure,\n children = _props3.children,\n props = _objectWithoutProperties(_props3, ['isOpened', 'springConfig', 'forceInitialAnimation', 'hasNestedCollapse', 'fixedHeight', 'theme', 'style', 'onRender', 'onRest', 'onMeasure', 'children']);\n\n var _state = _this2.state,\n from = _state.from,\n to = _state.to; // DANGEROUS, use with caution, never do setState with it\n\n onRender({\n current: height,\n from: from,\n to: to\n });\n return _react2.default.createElement('div', _extends({\n ref: _this2.onWrapperRef,\n className: theme.collapse,\n style: _extends({}, _this2.getWrapperStyle(Math.max(0, height)), style)\n }, props), _react2.default.createElement('div', {\n ref: _this2.onContentRef,\n className: theme.content\n }, children));\n };\n};","\"use strict\";\n\nexports.__esModule = true;\nexports[\"default\"] = {\n noWobble: {\n stiffness: 170,\n damping: 26\n },\n // the default, if nothing provided\n gentle: {\n stiffness: 120,\n damping: 14\n },\n wobbly: {\n stiffness: 180,\n damping: 12\n },\n stiff: {\n stiffness: 210,\n damping: 20\n }\n};\nmodule.exports = exports[\"default\"];","'use strict';\n\nvar Tokenizer = require('../tokenizer'),\n OpenElementStack = require('./open_element_stack'),\n FormattingElementList = require('./formatting_element_list'),\n LocationInfoParserMixin = require('../extensions/location_info/parser_mixin'),\n defaultTreeAdapter = require('../tree_adapters/default'),\n mergeOptions = require('../utils/merge_options'),\n doctype = require('../common/doctype'),\n foreignContent = require('../common/foreign_content'),\n UNICODE = require('../common/unicode'),\n HTML = require('../common/html'); //Aliases\n\n\nvar $ = HTML.TAG_NAMES,\n NS = HTML.NAMESPACES,\n ATTRS = HTML.ATTRS;\nvar DEFAULT_OPTIONS = {\n locationInfo: false,\n treeAdapter: defaultTreeAdapter\n}; //Misc constants\n\nvar HIDDEN_INPUT_TYPE = 'hidden'; //Adoption agency loops iteration count\n\nvar AA_OUTER_LOOP_ITER = 8,\n AA_INNER_LOOP_ITER = 3; //Insertion modes\n\nvar INITIAL_MODE = 'INITIAL_MODE',\n BEFORE_HTML_MODE = 'BEFORE_HTML_MODE',\n BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE',\n IN_HEAD_MODE = 'IN_HEAD_MODE',\n AFTER_HEAD_MODE = 'AFTER_HEAD_MODE',\n IN_BODY_MODE = 'IN_BODY_MODE',\n TEXT_MODE = 'TEXT_MODE',\n IN_TABLE_MODE = 'IN_TABLE_MODE',\n IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE',\n IN_CAPTION_MODE = 'IN_CAPTION_MODE',\n IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE',\n IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE',\n IN_ROW_MODE = 'IN_ROW_MODE',\n IN_CELL_MODE = 'IN_CELL_MODE',\n IN_SELECT_MODE = 'IN_SELECT_MODE',\n IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE',\n IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE',\n AFTER_BODY_MODE = 'AFTER_BODY_MODE',\n IN_FRAMESET_MODE = 'IN_FRAMESET_MODE',\n AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE',\n AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE',\n AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE'; //Insertion mode reset map\n\nvar INSERTION_MODE_RESET_MAP = Object.create(null);\nINSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE;\nINSERTION_MODE_RESET_MAP[$.TBODY] = INSERTION_MODE_RESET_MAP[$.THEAD] = INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE;\nINSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE;\nINSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE;\nINSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE;\nINSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE;\nINSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE; //Template insertion mode switch map\n\nvar TEMPLATE_INSERTION_MODE_SWITCH_MAP = Object.create(null);\nTEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE;\nTEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE;\nTEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE;\nTEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] = TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE; //Token handlers map for insertion modes\n\nvar _ = Object.create(null);\n\n_[INITIAL_MODE] = Object.create(null);\n_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] = _[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode;\n_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;\n_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode;\n_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] = _[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] = _[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode;\n_[BEFORE_HTML_MODE] = Object.create(null);\n_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] = _[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml;\n_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;\n_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml;\n_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml;\n_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml;\n_[BEFORE_HEAD_MODE] = Object.create(null);\n_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = _[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead;\n_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;\n_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead;\n_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead;\n_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead;\n_[IN_HEAD_MODE] = Object.create(null);\n_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead;\n_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead;\n_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead;\n_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead;\n_[AFTER_HEAD_MODE] = Object.create(null);\n_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead;\n_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead;\n_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead;\n_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead;\n_[IN_BODY_MODE] = Object.create(null);\n_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;\n_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody;\n_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody;\n_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[TEXT_MODE] = Object.create(null);\n_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = _[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] = _[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = _[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken;\n_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText;\n_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText;\n_[IN_TABLE_MODE] = Object.create(null);\n_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;\n_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable;\n_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable;\n_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_TABLE_TEXT_MODE] = Object.create(null);\n_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText;\n_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText;\n_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] = _[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText;\n_[IN_CAPTION_MODE] = Object.create(null);\n_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;\n_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption;\n_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption;\n_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_COLUMN_GROUP_MODE] = Object.create(null);\n_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup;\n_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup;\n_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup;\n_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_TABLE_BODY_MODE] = Object.create(null);\n_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;\n_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody;\n_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody;\n_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_ROW_MODE] = Object.create(null);\n_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = _[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;\n_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow;\n_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow;\n_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_CELL_MODE] = Object.create(null);\n_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;\n_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell;\n_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell;\n_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_SELECT_MODE] = Object.create(null);\n_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;\n_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect;\n_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect;\n_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_SELECT_IN_TABLE_MODE] = Object.create(null);\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable;\n_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;\n_[IN_TEMPLATE_MODE] = Object.create(null);\n_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;\n_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate;\n_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate;\n_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate;\n_[AFTER_BODY_MODE] = Object.create(null);\n_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody;\n_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement;\n_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody;\n_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody;\n_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;\n_[IN_FRAMESET_MODE] = Object.create(null);\n_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = _[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset;\n_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset;\n_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;\n_[AFTER_FRAMESET_MODE] = Object.create(null);\n_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;\n_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;\n_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset;\n_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset;\n_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;\n_[AFTER_AFTER_BODY_MODE] = Object.create(null);\n_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody;\n_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;\n_[AFTER_AFTER_FRAMESET_MODE] = Object.create(null);\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] = _[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset;\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken;\n_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing; //Parser\n\nvar Parser = module.exports = function (options) {\n this.options = mergeOptions(DEFAULT_OPTIONS, options);\n this.treeAdapter = this.options.treeAdapter;\n this.pendingScript = null;\n if (this.options.locationInfo) new LocationInfoParserMixin(this);\n}; // API\n\n\nParser.prototype.parse = function (html) {\n var document = this.treeAdapter.createDocument();\n\n this._bootstrap(document, null);\n\n this.tokenizer.write(html, true);\n\n this._runParsingLoop(null);\n\n return document;\n};\n\nParser.prototype.parseFragment = function (html, fragmentContext) {\n //NOTE: use element as a fragment context if context element was not provided,\n //so we will parse in \"forgiving\" manner\n if (!fragmentContext) fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []); //NOTE: create fake element which will be used as 'document' for fragment parsing.\n //This is important for jsdom there 'document' can't be recreated, therefore\n //fragment parsing causes messing of the main `document`.\n\n var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);\n\n this._bootstrap(documentMock, fragmentContext);\n\n if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE) this._pushTmplInsertionMode(IN_TEMPLATE_MODE);\n\n this._initTokenizerForFragmentParsing();\n\n this._insertFakeRootElement();\n\n this._resetInsertionMode();\n\n this._findFormInFragmentContext();\n\n this.tokenizer.write(html, true);\n\n this._runParsingLoop(null);\n\n var rootElement = this.treeAdapter.getFirstChild(documentMock),\n fragment = this.treeAdapter.createDocumentFragment();\n\n this._adoptNodes(rootElement, fragment);\n\n return fragment;\n}; //Bootstrap parser\n\n\nParser.prototype._bootstrap = function (document, fragmentContext) {\n this.tokenizer = new Tokenizer(this.options);\n this.stopped = false;\n this.insertionMode = INITIAL_MODE;\n this.originalInsertionMode = '';\n this.document = document;\n this.fragmentContext = fragmentContext;\n this.headElement = null;\n this.formElement = null;\n this.openElements = new OpenElementStack(this.document, this.treeAdapter);\n this.activeFormattingElements = new FormattingElementList(this.treeAdapter);\n this.tmplInsertionModeStack = [];\n this.tmplInsertionModeStackTop = -1;\n this.currentTmplInsertionMode = null;\n this.pendingCharacterTokens = [];\n this.hasNonWhitespacePendingCharacterToken = false;\n this.framesetOk = true;\n this.skipNextNewLine = false;\n this.fosterParentingEnabled = false;\n}; //Parsing loop\n\n\nParser.prototype._runParsingLoop = function (scriptHandler) {\n while (!this.stopped) {\n this._setupTokenizerCDATAMode();\n\n var token = this.tokenizer.getNextToken();\n if (token.type === Tokenizer.HIBERNATION_TOKEN) break;\n\n if (this.skipNextNewLine) {\n this.skipNextNewLine = false;\n\n if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\\n') {\n if (token.chars.length === 1) continue;\n token.chars = token.chars.substr(1);\n }\n }\n\n this._processInputToken(token);\n\n if (scriptHandler && this.pendingScript) break;\n }\n};\n\nParser.prototype.runParsingLoopForCurrentChunk = function (writeCallback, scriptHandler) {\n this._runParsingLoop(scriptHandler);\n\n if (scriptHandler && this.pendingScript) {\n var script = this.pendingScript;\n this.pendingScript = null;\n scriptHandler(script);\n return;\n }\n\n if (writeCallback) writeCallback();\n}; //Text parsing\n\n\nParser.prototype._setupTokenizerCDATAMode = function () {\n var current = this._getAdjustedCurrentElement();\n\n this.tokenizer.allowCDATA = current && current !== this.document && this.treeAdapter.getNamespaceURI(current) !== NS.HTML && !this._isIntegrationPoint(current);\n};\n\nParser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) {\n this._insertElement(currentToken, NS.HTML);\n\n this.tokenizer.state = nextTokenizerState;\n this.originalInsertionMode = this.insertionMode;\n this.insertionMode = TEXT_MODE;\n};\n\nParser.prototype.switchToPlaintextParsing = function () {\n this.insertionMode = TEXT_MODE;\n this.originalInsertionMode = IN_BODY_MODE;\n this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;\n}; //Fragment parsing\n\n\nParser.prototype._getAdjustedCurrentElement = function () {\n return this.openElements.stackTop === 0 && this.fragmentContext ? this.fragmentContext : this.openElements.current;\n};\n\nParser.prototype._findFormInFragmentContext = function () {\n var node = this.fragmentContext;\n\n do {\n if (this.treeAdapter.getTagName(node) === $.FORM) {\n this.formElement = node;\n break;\n }\n\n node = this.treeAdapter.getParentNode(node);\n } while (node);\n};\n\nParser.prototype._initTokenizerForFragmentParsing = function () {\n if (this.treeAdapter.getNamespaceURI(this.fragmentContext) === NS.HTML) {\n var tn = this.treeAdapter.getTagName(this.fragmentContext);\n if (tn === $.TITLE || tn === $.TEXTAREA) this.tokenizer.state = Tokenizer.MODE.RCDATA;else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME || tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) this.tokenizer.state = Tokenizer.MODE.RAWTEXT;else if (tn === $.SCRIPT) this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;else if (tn === $.PLAINTEXT) this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;\n }\n}; //Tree mutation\n\n\nParser.prototype._setDocumentType = function (token) {\n this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId);\n};\n\nParser.prototype._attachElementToTree = function (element) {\n if (this._shouldFosterParentOnInsertion()) this._fosterParentElement(element);else {\n var parent = this.openElements.currentTmplContent || this.openElements.current;\n this.treeAdapter.appendChild(parent, element);\n }\n};\n\nParser.prototype._appendElement = function (token, namespaceURI) {\n var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);\n\n this._attachElementToTree(element);\n};\n\nParser.prototype._insertElement = function (token, namespaceURI) {\n var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);\n\n this._attachElementToTree(element);\n\n this.openElements.push(element);\n};\n\nParser.prototype._insertFakeElement = function (tagName) {\n var element = this.treeAdapter.createElement(tagName, NS.HTML, []);\n\n this._attachElementToTree(element);\n\n this.openElements.push(element);\n};\n\nParser.prototype._insertTemplate = function (token) {\n var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs),\n content = this.treeAdapter.createDocumentFragment();\n this.treeAdapter.setTemplateContent(tmpl, content);\n\n this._attachElementToTree(tmpl);\n\n this.openElements.push(tmpl);\n};\n\nParser.prototype._insertFakeRootElement = function () {\n var element = this.treeAdapter.createElement($.HTML, NS.HTML, []);\n this.treeAdapter.appendChild(this.openElements.current, element);\n this.openElements.push(element);\n};\n\nParser.prototype._appendCommentNode = function (token, parent) {\n var commentNode = this.treeAdapter.createCommentNode(token.data);\n this.treeAdapter.appendChild(parent, commentNode);\n};\n\nParser.prototype._insertCharacters = function (token) {\n if (this._shouldFosterParentOnInsertion()) this._fosterParentText(token.chars);else {\n var parent = this.openElements.currentTmplContent || this.openElements.current;\n this.treeAdapter.insertText(parent, token.chars);\n }\n};\n\nParser.prototype._adoptNodes = function (donor, recipient) {\n while (true) {\n var child = this.treeAdapter.getFirstChild(donor);\n if (!child) break;\n this.treeAdapter.detachNode(child);\n this.treeAdapter.appendChild(recipient, child);\n }\n}; //Token processing\n\n\nParser.prototype._shouldProcessTokenInForeignContent = function (token) {\n var current = this._getAdjustedCurrentElement();\n\n if (!current || current === this.document) return false;\n var ns = this.treeAdapter.getNamespaceURI(current);\n if (ns === NS.HTML) return false;\n if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML && token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG) return false;\n var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN || token.type === Tokenizer.NULL_CHARACTER_TOKEN || token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN,\n isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN && token.tagName !== $.MGLYPH && token.tagName !== $.MALIGNMARK;\n if ((isMathMLTextStartTag || isCharacterToken) && this._isIntegrationPoint(current, NS.MATHML)) return false;\n if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isIntegrationPoint(current, NS.HTML)) return false;\n return token.type !== Tokenizer.EOF_TOKEN;\n};\n\nParser.prototype._processToken = function (token) {\n _[this.insertionMode][token.type](this, token);\n};\n\nParser.prototype._processTokenInBodyMode = function (token) {\n _[IN_BODY_MODE][token.type](this, token);\n};\n\nParser.prototype._processTokenInForeignContent = function (token) {\n if (token.type === Tokenizer.CHARACTER_TOKEN) characterInForeignContent(this, token);else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN) nullCharacterInForeignContent(this, token);else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN) insertCharacters(this, token);else if (token.type === Tokenizer.COMMENT_TOKEN) appendComment(this, token);else if (token.type === Tokenizer.START_TAG_TOKEN) startTagInForeignContent(this, token);else if (token.type === Tokenizer.END_TAG_TOKEN) endTagInForeignContent(this, token);\n};\n\nParser.prototype._processInputToken = function (token) {\n if (this._shouldProcessTokenInForeignContent(token)) this._processTokenInForeignContent(token);else this._processToken(token);\n}; //Integration points\n\n\nParser.prototype._isIntegrationPoint = function (element, foreignNS) {\n var tn = this.treeAdapter.getTagName(element),\n ns = this.treeAdapter.getNamespaceURI(element),\n attrs = this.treeAdapter.getAttrList(element);\n return foreignContent.isIntegrationPoint(tn, ns, attrs, foreignNS);\n}; //Active formatting elements reconstruction\n\n\nParser.prototype._reconstructActiveFormattingElements = function () {\n var listLength = this.activeFormattingElements.length;\n\n if (listLength) {\n var unopenIdx = listLength,\n entry = null;\n\n do {\n unopenIdx--;\n entry = this.activeFormattingElements.entries[unopenIdx];\n\n if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) {\n unopenIdx++;\n break;\n }\n } while (unopenIdx > 0);\n\n for (var i = unopenIdx; i < listLength; i++) {\n entry = this.activeFormattingElements.entries[i];\n\n this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));\n\n entry.element = this.openElements.current;\n }\n }\n}; //Close elements\n\n\nParser.prototype._closeTableCell = function () {\n this.openElements.generateImpliedEndTags();\n this.openElements.popUntilTableCellPopped();\n this.activeFormattingElements.clearToLastMarker();\n this.insertionMode = IN_ROW_MODE;\n};\n\nParser.prototype._closePElement = function () {\n this.openElements.generateImpliedEndTagsWithExclusion($.P);\n this.openElements.popUntilTagNamePopped($.P);\n}; //Insertion modes\n\n\nParser.prototype._resetInsertionMode = function () {\n for (var i = this.openElements.stackTop, last = false; i >= 0; i--) {\n var element = this.openElements.items[i];\n\n if (i === 0) {\n last = true;\n if (this.fragmentContext) element = this.fragmentContext;\n }\n\n var tn = this.treeAdapter.getTagName(element),\n newInsertionMode = INSERTION_MODE_RESET_MAP[tn];\n\n if (newInsertionMode) {\n this.insertionMode = newInsertionMode;\n break;\n } else if (!last && (tn === $.TD || tn === $.TH)) {\n this.insertionMode = IN_CELL_MODE;\n break;\n } else if (!last && tn === $.HEAD) {\n this.insertionMode = IN_HEAD_MODE;\n break;\n } else if (tn === $.SELECT) {\n this._resetInsertionModeForSelect(i);\n\n break;\n } else if (tn === $.TEMPLATE) {\n this.insertionMode = this.currentTmplInsertionMode;\n break;\n } else if (tn === $.HTML) {\n this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE;\n break;\n } else if (last) {\n this.insertionMode = IN_BODY_MODE;\n break;\n }\n }\n};\n\nParser.prototype._resetInsertionModeForSelect = function (selectIdx) {\n if (selectIdx > 0) {\n for (var i = selectIdx - 1; i > 0; i--) {\n var ancestor = this.openElements.items[i],\n tn = this.treeAdapter.getTagName(ancestor);\n if (tn === $.TEMPLATE) break;else if (tn === $.TABLE) {\n this.insertionMode = IN_SELECT_IN_TABLE_MODE;\n return;\n }\n }\n }\n\n this.insertionMode = IN_SELECT_MODE;\n};\n\nParser.prototype._pushTmplInsertionMode = function (mode) {\n this.tmplInsertionModeStack.push(mode);\n this.tmplInsertionModeStackTop++;\n this.currentTmplInsertionMode = mode;\n};\n\nParser.prototype._popTmplInsertionMode = function () {\n this.tmplInsertionModeStack.pop();\n this.tmplInsertionModeStackTop--;\n this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];\n}; //Foster parenting\n\n\nParser.prototype._isElementCausesFosterParenting = function (element) {\n var tn = this.treeAdapter.getTagName(element);\n return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR;\n};\n\nParser.prototype._shouldFosterParentOnInsertion = function () {\n return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);\n};\n\nParser.prototype._findFosterParentingLocation = function () {\n var location = {\n parent: null,\n beforeElement: null\n };\n\n for (var i = this.openElements.stackTop; i >= 0; i--) {\n var openElement = this.openElements.items[i],\n tn = this.treeAdapter.getTagName(openElement),\n ns = this.treeAdapter.getNamespaceURI(openElement);\n\n if (tn === $.TEMPLATE && ns === NS.HTML) {\n location.parent = this.treeAdapter.getTemplateContent(openElement);\n break;\n } else if (tn === $.TABLE) {\n location.parent = this.treeAdapter.getParentNode(openElement);\n if (location.parent) location.beforeElement = openElement;else location.parent = this.openElements.items[i - 1];\n break;\n }\n }\n\n if (!location.parent) location.parent = this.openElements.items[0];\n return location;\n};\n\nParser.prototype._fosterParentElement = function (element) {\n var location = this._findFosterParentingLocation();\n\n if (location.beforeElement) this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);else this.treeAdapter.appendChild(location.parent, element);\n};\n\nParser.prototype._fosterParentText = function (chars) {\n var location = this._findFosterParentingLocation();\n\n if (location.beforeElement) this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);else this.treeAdapter.insertText(location.parent, chars);\n}; //Special elements\n\n\nParser.prototype._isSpecialElement = function (element) {\n var tn = this.treeAdapter.getTagName(element),\n ns = this.treeAdapter.getNamespaceURI(element);\n return HTML.SPECIAL_ELEMENTS[ns][tn];\n}; //Adoption agency algorithm\n//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency)\n//------------------------------------------------------------------\n//Steps 5-8 of the algorithm\n\n\nfunction aaObtainFormattingElementEntry(p, token) {\n var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);\n\n if (formattingElementEntry) {\n if (!p.openElements.contains(formattingElementEntry.element)) {\n p.activeFormattingElements.removeEntry(formattingElementEntry);\n formattingElementEntry = null;\n } else if (!p.openElements.hasInScope(token.tagName)) formattingElementEntry = null;\n } else genericEndTagInBody(p, token);\n\n return formattingElementEntry;\n} //Steps 9 and 10 of the algorithm\n\n\nfunction aaObtainFurthestBlock(p, formattingElementEntry) {\n var furthestBlock = null;\n\n for (var i = p.openElements.stackTop; i >= 0; i--) {\n var element = p.openElements.items[i];\n if (element === formattingElementEntry.element) break;\n if (p._isSpecialElement(element)) furthestBlock = element;\n }\n\n if (!furthestBlock) {\n p.openElements.popUntilElementPopped(formattingElementEntry.element);\n p.activeFormattingElements.removeEntry(formattingElementEntry);\n }\n\n return furthestBlock;\n} //Step 13 of the algorithm\n\n\nfunction aaInnerLoop(p, furthestBlock, formattingElement) {\n var lastElement = furthestBlock,\n nextElement = p.openElements.getCommonAncestor(furthestBlock);\n\n for (var i = 0, element = nextElement; element !== formattingElement; i++, element = nextElement) {\n //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)\n nextElement = p.openElements.getCommonAncestor(element);\n var elementEntry = p.activeFormattingElements.getElementEntry(element),\n counterOverflow = elementEntry && i >= AA_INNER_LOOP_ITER,\n shouldRemoveFromOpenElements = !elementEntry || counterOverflow;\n\n if (shouldRemoveFromOpenElements) {\n if (counterOverflow) p.activeFormattingElements.removeEntry(elementEntry);\n p.openElements.remove(element);\n } else {\n element = aaRecreateElementFromEntry(p, elementEntry);\n if (lastElement === furthestBlock) p.activeFormattingElements.bookmark = elementEntry;\n p.treeAdapter.detachNode(lastElement);\n p.treeAdapter.appendChild(element, lastElement);\n lastElement = element;\n }\n }\n\n return lastElement;\n} //Step 13.7 of the algorithm\n\n\nfunction aaRecreateElementFromEntry(p, elementEntry) {\n var ns = p.treeAdapter.getNamespaceURI(elementEntry.element),\n newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs);\n p.openElements.replace(elementEntry.element, newElement);\n elementEntry.element = newElement;\n return newElement;\n} //Step 14 of the algorithm\n\n\nfunction aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) {\n if (p._isElementCausesFosterParenting(commonAncestor)) p._fosterParentElement(lastElement);else {\n var tn = p.treeAdapter.getTagName(commonAncestor),\n ns = p.treeAdapter.getNamespaceURI(commonAncestor);\n if (tn === $.TEMPLATE && ns === NS.HTML) commonAncestor = p.treeAdapter.getTemplateContent(commonAncestor);\n p.treeAdapter.appendChild(commonAncestor, lastElement);\n }\n} //Steps 15-19 of the algorithm\n\n\nfunction aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {\n var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element),\n token = formattingElementEntry.token,\n newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs);\n\n p._adoptNodes(furthestBlock, newElement);\n\n p.treeAdapter.appendChild(furthestBlock, newElement);\n p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token);\n p.activeFormattingElements.removeEntry(formattingElementEntry);\n p.openElements.remove(formattingElementEntry.element);\n p.openElements.insertAfter(furthestBlock, newElement);\n} //Algorithm entry point\n\n\nfunction callAdoptionAgency(p, token) {\n var formattingElementEntry;\n\n for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) {\n formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);\n if (!formattingElementEntry) break;\n var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);\n if (!furthestBlock) break;\n p.activeFormattingElements.bookmark = formattingElementEntry;\n var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element),\n commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);\n p.treeAdapter.detachNode(lastElement);\n aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);\n aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);\n }\n} //Generic token handlers\n//------------------------------------------------------------------\n\n\nfunction ignoreToken() {//NOTE: do nothing =)\n}\n\nfunction appendComment(p, token) {\n p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current);\n}\n\nfunction appendCommentToRootHtmlElement(p, token) {\n p._appendCommentNode(token, p.openElements.items[0]);\n}\n\nfunction appendCommentToDocument(p, token) {\n p._appendCommentNode(token, p.document);\n}\n\nfunction insertCharacters(p, token) {\n p._insertCharacters(token);\n}\n\nfunction stopParsing(p) {\n p.stopped = true;\n} //12.2.5.4.1 The \"initial\" insertion mode\n//------------------------------------------------------------------\n\n\nfunction doctypeInInitialMode(p, token) {\n p._setDocumentType(token);\n\n var mode = token.forceQuirks ? HTML.DOCUMENT_MODE.QUIRKS : doctype.getDocumentMode(token.name, token.publicId, token.systemId);\n p.treeAdapter.setDocumentMode(p.document, mode);\n p.insertionMode = BEFORE_HTML_MODE;\n}\n\nfunction tokenInInitialMode(p, token) {\n p.treeAdapter.setDocumentMode(p.document, HTML.DOCUMENT_MODE.QUIRKS);\n p.insertionMode = BEFORE_HTML_MODE;\n\n p._processToken(token);\n} //12.2.5.4.2 The \"before html\" insertion mode\n//------------------------------------------------------------------\n\n\nfunction startTagBeforeHtml(p, token) {\n if (token.tagName === $.HTML) {\n p._insertElement(token, NS.HTML);\n\n p.insertionMode = BEFORE_HEAD_MODE;\n } else tokenBeforeHtml(p, token);\n}\n\nfunction endTagBeforeHtml(p, token) {\n var tn = token.tagName;\n if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR) tokenBeforeHtml(p, token);\n}\n\nfunction tokenBeforeHtml(p, token) {\n p._insertFakeRootElement();\n\n p.insertionMode = BEFORE_HEAD_MODE;\n\n p._processToken(token);\n} //12.2.5.4.3 The \"before head\" insertion mode\n//------------------------------------------------------------------\n\n\nfunction startTagBeforeHead(p, token) {\n var tn = token.tagName;\n if (tn === $.HTML) startTagInBody(p, token);else if (tn === $.HEAD) {\n p._insertElement(token, NS.HTML);\n\n p.headElement = p.openElements.current;\n p.insertionMode = IN_HEAD_MODE;\n } else tokenBeforeHead(p, token);\n}\n\nfunction endTagBeforeHead(p, token) {\n var tn = token.tagName;\n if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR) tokenBeforeHead(p, token);\n}\n\nfunction tokenBeforeHead(p, token) {\n p._insertFakeElement($.HEAD);\n\n p.headElement = p.openElements.current;\n p.insertionMode = IN_HEAD_MODE;\n\n p._processToken(token);\n} //12.2.5.4.4 The \"in head\" insertion mode\n//------------------------------------------------------------------\n\n\nfunction startTagInHead(p, token) {\n var tn = token.tagName;\n if (tn === $.HTML) startTagInBody(p, token);else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META) p._appendElement(token, NS.HTML);else if (tn === $.TITLE) p._switchToTextParsing(token, Tokenizer.MODE.RCDATA); //NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse\n //