/* Version: 0.1.26 - May 29, 2022 01:18:38 */ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } var REACT_ELEMENT_TYPE; function _jsx(type, props, key, children) { if (!REACT_ELEMENT_TYPE) { REACT_ELEMENT_TYPE = typeof Symbol === "function" && Symbol["for"] && Symbol["for"]("react.element") || 0xeac7; } var defaultProps = type && type.defaultProps; var childrenLength = arguments.length - 3; if (!props && childrenLength !== 0) { props = { children: void 0 }; } if (childrenLength === 1) { props.children = children; } else if (childrenLength > 1) { var childArray = new Array(childrenLength); for (var i = 0; i < childrenLength; i++) { childArray[i] = arguments[i + 3]; } props.children = childArray; } if (props && defaultProps) { for (var propName in defaultProps) { if (props[propName] === void 0) { props[propName] = defaultProps[propName]; } } } else if (!props) { props = defaultProps || {}; } return { $$typeof: REACT_ELEMENT_TYPE, type: type, key: key === undefined ? null : '' + key, ref: null, props: props, _owner: null }; } function _asyncIterator(iterable) { var method; if (typeof Symbol !== "undefined") { if (Symbol.asyncIterator) { method = iterable[Symbol.asyncIterator]; if (method != null) return method.call(iterable); } if (Symbol.iterator) { method = iterable[Symbol.iterator]; if (method != null) return method.call(iterable); } } throw new TypeError("Object is not async iterable"); } function _AwaitValue(value) { this.wrapped = value; } function _AsyncGenerator(gen) { var front, back; function send(key, arg) { return new Promise(function (resolve, reject) { var request = { key: key, arg: arg, resolve: resolve, reject: reject, next: null }; if (back) { back = back.next = request; } else { front = back = request; resume(key, arg); } }); } function resume(key, arg) { try { var result = gen[key](arg); var value = result.value; var wrappedAwait = value instanceof _AwaitValue; Promise.resolve(wrappedAwait ? value.wrapped : value).then(function (arg) { if (wrappedAwait) { resume(key === "return" ? "return" : "next", arg); return; } settle(result.done ? "return" : "normal", arg); }, function (err) { resume("throw", err); }); } catch (err) { settle("throw", err); } } function settle(type, value) { switch (type) { case "return": front.resolve({ value: value, done: true }); break; case "throw": front.reject(value); break; default: front.resolve({ value: value, done: false }); break; } front = front.next; if (front) { resume(front.key, front.arg); } else { back = null; } } this._invoke = send; if (typeof gen.return !== "function") { this.return = undefined; } } if (typeof Symbol === "function" && Symbol.asyncIterator) { _AsyncGenerator.prototype[Symbol.asyncIterator] = function () { return this; }; } _AsyncGenerator.prototype.next = function (arg) { return this._invoke("next", arg); }; _AsyncGenerator.prototype.throw = function (arg) { return this._invoke("throw", arg); }; _AsyncGenerator.prototype.return = function (arg) { return this._invoke("return", arg); }; function _wrapAsyncGenerator(fn) { return function () { return new _AsyncGenerator(fn.apply(this, arguments)); }; } function _awaitAsyncGenerator(value) { return new _AwaitValue(value); } function _asyncGeneratorDelegate(inner, awaitWrap) { var iter = {}, waiting = false; function pump(key, value) { waiting = true; value = new Promise(function (resolve) { resolve(inner[key](value)); }); return { done: false, value: awaitWrap(value) }; } ; if (typeof Symbol === "function" && Symbol.iterator) { iter[Symbol.iterator] = function () { return this; }; } iter.next = function (value) { if (waiting) { waiting = false; return value; } return pump("next", value); }; if (typeof inner.throw === "function") { iter.throw = function (value) { if (waiting) { waiting = false; throw value; } return pump("throw", value); }; } if (typeof inner.return === "function") { iter.return = function (value) { if (waiting) { waiting = false; return value; } return pump("return", value); }; } return iter; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineEnumerableProperties(obj, descs) { for (var key in descs) { var desc = descs[key]; desc.configurable = desc.enumerable = true; if ("value" in desc) desc.writable = true; Object.defineProperty(obj, key, desc); } if (Object.getOwnPropertySymbols) { var objectSymbols = Object.getOwnPropertySymbols(descs); for (var i = 0; i < objectSymbols.length; i++) { var sym = objectSymbols[i]; var desc = descs[sym]; desc.configurable = desc.enumerable = true; if ("value" in desc) desc.writable = true; Object.defineProperty(obj, sym, desc); } } return obj; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? Object(arguments[i]) : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _construct(Parent, args, Class) { if (_isNativeReflectConstruct()) { _construct = Reflect.construct; } else { _construct = function _construct(Parent, args, Class) { var a = [null]; a.push.apply(a, args); var Constructor = Function.bind.apply(Parent, a); var instance = new Constructor(); if (Class) _setPrototypeOf(instance, Class.prototype); return instance; }; } return _construct.apply(null, arguments); } function _isNativeFunction(fn) { return Function.toString.call(fn).indexOf("[native code]") !== -1; } function _wrapNativeSuper(Class) { var _cache = typeof Map === "function" ? new Map() : undefined; _wrapNativeSuper = function _wrapNativeSuper(Class) { if (Class === null || !_isNativeFunction(Class)) return Class; if (typeof Class !== "function") { throw new TypeError("Super expression must either be null or a function"); } if (typeof _cache !== "undefined") { if (_cache.has(Class)) return _cache.get(Class); _cache.set(Class, Wrapper); } function Wrapper() { return _construct(Class, arguments, _getPrototypeOf(this).constructor); } Wrapper.prototype = Object.create(Class.prototype, { constructor: { value: Wrapper, enumerable: false, writable: true, configurable: true } }); return _setPrototypeOf(Wrapper, Class); }; return _wrapNativeSuper(Class); } function _instanceof(left, right) { if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) { return !!right[Symbol.hasInstance](left); } else { return left instanceof right; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _newArrowCheck(innerThis, boundThis) { if (innerThis !== boundThis) { throw new TypeError("Cannot instantiate an arrow function"); } } function _objectDestructuringEmpty(obj) { if (obj == null) throw new TypeError("Cannot destructure undefined"); } function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _superPropBase(object, property) { while (!Object.prototype.hasOwnProperty.call(object, property)) { object = _getPrototypeOf(object); if (object === null) break; } return object; } function _get(target, property, receiver) { if (typeof Reflect !== "undefined" && Reflect.get) { _get = Reflect.get; } else { _get = function _get(target, property, receiver) { var base = _superPropBase(target, property); if (!base) return; var desc = Object.getOwnPropertyDescriptor(base, property); if (desc.get) { return desc.get.call(receiver); } return desc.value; }; } return _get(target, property, receiver || target); } function set(target, property, value, receiver) { if (typeof Reflect !== "undefined" && Reflect.set) { set = Reflect.set; } else { set = function set(target, property, value, receiver) { var base = _superPropBase(target, property); var desc; if (base) { desc = Object.getOwnPropertyDescriptor(base, property); if (desc.set) { desc.set.call(receiver, value); return true; } else if (!desc.writable) { return false; } } desc = Object.getOwnPropertyDescriptor(receiver, property); if (desc) { if (!desc.writable) { return false; } desc.value = value; Object.defineProperty(receiver, property, desc); } else { _defineProperty(receiver, property, value); } return true; }; } return set(target, property, value, receiver); } function _set(target, property, value, receiver, isStrict) { var s = set(target, property, value, receiver || target); if (!s && isStrict) { throw new Error('failed to set property'); } return value; } function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } function _taggedTemplateLiteralLoose(strings, raw) { if (!raw) { raw = strings.slice(0); } strings.raw = raw; return strings; } function _readOnlyError(name) { throw new TypeError("\"" + name + "\" is read-only"); } function _writeOnlyError(name) { throw new TypeError("\"" + name + "\" is write-only"); } function _classNameTDZError(name) { throw new Error("Class \"" + name + "\" cannot be referenced in computed property keys."); } function _temporalUndefined() {} function _tdz(name) { throw new ReferenceError(name + " is not defined - temporal dead zone"); } function _temporalRef(val, name) { return val === _temporalUndefined ? _tdz(name) : val; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _slicedToArrayLoose(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimitLoose(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _maybeArrayLike(next, arr, i) { if (arr && !Array.isArray(arr) && typeof arr.length === "number") { var len = arr.length; return _arrayLikeToArray(arr, i !== void 0 && i < len ? i : len); } return next(arr, i); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } function _iterableToArrayLimitLoose(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; for (var _iterator = arr[Symbol.iterator](), _step; !(_step = _iterator.next()).done;) { _arr.push(_step.value); if (i && _arr.length === i) break; } return _arr; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = o[Symbol.iterator](); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } it = o[Symbol.iterator](); return it.next.bind(it); } function _skipFirstGeneratorNext(fn) { return function () { var it = fn.apply(this, arguments); it.next(); return it; }; } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); } function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); } function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); } function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; } var id = 0; function _classPrivateFieldLooseKey(name) { return "__private_" + id++ + "_" + name; } function _classPrivateFieldLooseBase(receiver, privateKey) { if (!Object.prototype.hasOwnProperty.call(receiver, privateKey)) { throw new TypeError("attempted to use private field on non-instance"); } return receiver; } function _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "get"); return _classApplyDescriptorGet(receiver, descriptor); } function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } function _classPrivateFieldDestructureSet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); return _classApplyDescriptorDestructureSet(receiver, descriptor); } function _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError("attempted to " + action + " private field on non-instance"); } return privateMap.get(receiver); } function _classStaticPrivateFieldSpecGet(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "get"); return _classApplyDescriptorGet(receiver, descriptor); } function _classStaticPrivateFieldSpecSet(receiver, classConstructor, descriptor, value) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; } function _classStaticPrivateMethodGet(receiver, classConstructor, method) { _classCheckPrivateStaticAccess(receiver, classConstructor); return method; } function _classStaticPrivateMethodSet() { throw new TypeError("attempted to set read only static private field"); } function _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } function _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } descriptor.value = value; } } function _classApplyDescriptorDestructureSet(receiver, descriptor) { if (descriptor.set) { if (!("__destrObj" in descriptor)) { descriptor.__destrObj = { set value(v) { descriptor.set.call(receiver, v); } }; } return descriptor.__destrObj; } else { if (!descriptor.writable) { throw new TypeError("attempted to set read only private field"); } return descriptor; } } function _classStaticPrivateFieldDestructureSet(receiver, classConstructor, descriptor) { _classCheckPrivateStaticAccess(receiver, classConstructor); _classCheckPrivateStaticFieldDescriptor(descriptor, "set"); return _classApplyDescriptorDestructureSet(receiver, descriptor); } function _classCheckPrivateStaticAccess(receiver, classConstructor) { if (receiver !== classConstructor) { throw new TypeError("Private static access of wrong provenance"); } } function _classCheckPrivateStaticFieldDescriptor(descriptor, action) { if (descriptor === undefined) { throw new TypeError("attempted to " + action + " private static field before its declaration"); } } function _decorate(decorators, factory, superClass, mixins) { var api = _getDecoratorsApi(); if (mixins) { for (var i = 0; i < mixins.length; i++) { api = mixins[i](api); } } var r = factory(function initialize(O) { api.initializeInstanceElements(O, decorated.elements); }, superClass); var decorated = api.decorateClass(_coalesceClassElements(r.d.map(_createElementDescriptor)), decorators); api.initializeClassElements(r.F, decorated.elements); return api.runClassFinishers(r.F, decorated.finishers); } function _getDecoratorsApi() { _getDecoratorsApi = function () { return api; }; var api = { elementsDefinitionOrder: [["method"], ["field"]], initializeInstanceElements: function (O, elements) { ["method", "field"].forEach(function (kind) { elements.forEach(function (element) { if (element.kind === kind && element.placement === "own") { this.defineClassElement(O, element); } }, this); }, this); }, initializeClassElements: function (F, elements) { var proto = F.prototype; ["method", "field"].forEach(function (kind) { elements.forEach(function (element) { var placement = element.placement; if (element.kind === kind && (placement === "static" || placement === "prototype")) { var receiver = placement === "static" ? F : proto; this.defineClassElement(receiver, element); } }, this); }, this); }, defineClassElement: function (receiver, element) { var descriptor = element.descriptor; if (element.kind === "field") { var initializer = element.initializer; descriptor = { enumerable: descriptor.enumerable, writable: descriptor.writable, configurable: descriptor.configurable, value: initializer === void 0 ? void 0 : initializer.call(receiver) }; } Object.defineProperty(receiver, element.key, descriptor); }, decorateClass: function (elements, decorators) { var newElements = []; var finishers = []; var placements = { static: [], prototype: [], own: [] }; elements.forEach(function (element) { this.addElementPlacement(element, placements); }, this); elements.forEach(function (element) { if (!_hasDecorators(element)) return newElements.push(element); var elementFinishersExtras = this.decorateElement(element, placements); newElements.push(elementFinishersExtras.element); newElements.push.apply(newElements, elementFinishersExtras.extras); finishers.push.apply(finishers, elementFinishersExtras.finishers); }, this); if (!decorators) { return { elements: newElements, finishers: finishers }; } var result = this.decorateConstructor(newElements, decorators); finishers.push.apply(finishers, result.finishers); result.finishers = finishers; return result; }, addElementPlacement: function (element, placements, silent) { var keys = placements[element.placement]; if (!silent && keys.indexOf(element.key) !== -1) { throw new TypeError("Duplicated element (" + element.key + ")"); } keys.push(element.key); }, decorateElement: function (element, placements) { var extras = []; var finishers = []; for (var decorators = element.decorators, i = decorators.length - 1; i >= 0; i--) { var keys = placements[element.placement]; keys.splice(keys.indexOf(element.key), 1); var elementObject = this.fromElementDescriptor(element); var elementFinisherExtras = this.toElementFinisherExtras((0, decorators[i])(elementObject) || elementObject); element = elementFinisherExtras.element; this.addElementPlacement(element, placements); if (elementFinisherExtras.finisher) { finishers.push(elementFinisherExtras.finisher); } var newExtras = elementFinisherExtras.extras; if (newExtras) { for (var j = 0; j < newExtras.length; j++) { this.addElementPlacement(newExtras[j], placements); } extras.push.apply(extras, newExtras); } } return { element: element, finishers: finishers, extras: extras }; }, decorateConstructor: function (elements, decorators) { var finishers = []; for (var i = decorators.length - 1; i >= 0; i--) { var obj = this.fromClassDescriptor(elements); var elementsAndFinisher = this.toClassDescriptor((0, decorators[i])(obj) || obj); if (elementsAndFinisher.finisher !== undefined) { finishers.push(elementsAndFinisher.finisher); } if (elementsAndFinisher.elements !== undefined) { elements = elementsAndFinisher.elements; for (var j = 0; j < elements.length - 1; j++) { for (var k = j + 1; k < elements.length; k++) { if (elements[j].key === elements[k].key && elements[j].placement === elements[k].placement) { throw new TypeError("Duplicated element (" + elements[j].key + ")"); } } } } } return { elements: elements, finishers: finishers }; }, fromElementDescriptor: function (element) { var obj = { kind: element.kind, key: element.key, placement: element.placement, descriptor: element.descriptor }; var desc = { value: "Descriptor", configurable: true }; Object.defineProperty(obj, Symbol.toStringTag, desc); if (element.kind === "field") obj.initializer = element.initializer; return obj; }, toElementDescriptors: function (elementObjects) { if (elementObjects === undefined) return; return _toArray(elementObjects).map(function (elementObject) { var element = this.toElementDescriptor(elementObject); this.disallowProperty(elementObject, "finisher", "An element descriptor"); this.disallowProperty(elementObject, "extras", "An element descriptor"); return element; }, this); }, toElementDescriptor: function (elementObject) { var kind = String(elementObject.kind); if (kind !== "method" && kind !== "field") { throw new TypeError('An element descriptor\'s .kind property must be either "method" or' + ' "field", but a decorator created an element descriptor with' + ' .kind "' + kind + '"'); } var key = _toPropertyKey(elementObject.key); var placement = String(elementObject.placement); if (placement !== "static" && placement !== "prototype" && placement !== "own") { throw new TypeError('An element descriptor\'s .placement property must be one of "static",' + ' "prototype" or "own", but a decorator created an element descriptor' + ' with .placement "' + placement + '"'); } var descriptor = elementObject.descriptor; this.disallowProperty(elementObject, "elements", "An element descriptor"); var element = { kind: kind, key: key, placement: placement, descriptor: Object.assign({}, descriptor) }; if (kind !== "field") { this.disallowProperty(elementObject, "initializer", "A method descriptor"); } else { this.disallowProperty(descriptor, "get", "The property descriptor of a field descriptor"); this.disallowProperty(descriptor, "set", "The property descriptor of a field descriptor"); this.disallowProperty(descriptor, "value", "The property descriptor of a field descriptor"); element.initializer = elementObject.initializer; } return element; }, toElementFinisherExtras: function (elementObject) { var element = this.toElementDescriptor(elementObject); var finisher = _optionalCallableProperty(elementObject, "finisher"); var extras = this.toElementDescriptors(elementObject.extras); return { element: element, finisher: finisher, extras: extras }; }, fromClassDescriptor: function (elements) { var obj = { kind: "class", elements: elements.map(this.fromElementDescriptor, this) }; var desc = { value: "Descriptor", configurable: true }; Object.defineProperty(obj, Symbol.toStringTag, desc); return obj; }, toClassDescriptor: function (obj) { var kind = String(obj.kind); if (kind !== "class") { throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator' + ' created a class descriptor with .kind "' + kind + '"'); } this.disallowProperty(obj, "key", "A class descriptor"); this.disallowProperty(obj, "placement", "A class descriptor"); this.disallowProperty(obj, "descriptor", "A class descriptor"); this.disallowProperty(obj, "initializer", "A class descriptor"); this.disallowProperty(obj, "extras", "A class descriptor"); var finisher = _optionalCallableProperty(obj, "finisher"); var elements = this.toElementDescriptors(obj.elements); return { elements: elements, finisher: finisher }; }, runClassFinishers: function (constructor, finishers) { for (var i = 0; i < finishers.length; i++) { var newConstructor = (0, finishers[i])(constructor); if (newConstructor !== undefined) { if (typeof newConstructor !== "function") { throw new TypeError("Finishers must return a constructor."); } constructor = newConstructor; } } return constructor; }, disallowProperty: function (obj, name, objectType) { if (obj[name] !== undefined) { throw new TypeError(objectType + " can't have a ." + name + " property."); } } }; return api; } function _createElementDescriptor(def) { var key = _toPropertyKey(def.key); var descriptor; if (def.kind === "method") { descriptor = { value: def.value, writable: true, configurable: true, enumerable: false }; } else if (def.kind === "get") { descriptor = { get: def.value, configurable: true, enumerable: false }; } else if (def.kind === "set") { descriptor = { set: def.value, configurable: true, enumerable: false }; } else if (def.kind === "field") { descriptor = { configurable: true, writable: true, enumerable: true }; } var element = { kind: def.kind === "field" ? "field" : "method", key: key, placement: def.static ? "static" : def.kind === "field" ? "own" : "prototype", descriptor: descriptor }; if (def.decorators) element.decorators = def.decorators; if (def.kind === "field") element.initializer = def.value; return element; } function _coalesceGetterSetter(element, other) { if (element.descriptor.get !== undefined) { other.descriptor.get = element.descriptor.get; } else { other.descriptor.set = element.descriptor.set; } } function _coalesceClassElements(elements) { var newElements = []; var isSameElement = function (other) { return other.kind === "method" && other.key === element.key && other.placement === element.placement; }; for (var i = 0; i < elements.length; i++) { var element = elements[i]; var other; if (element.kind === "method" && (other = newElements.find(isSameElement))) { if (_isDataDescriptor(element.descriptor) || _isDataDescriptor(other.descriptor)) { if (_hasDecorators(element) || _hasDecorators(other)) { throw new ReferenceError("Duplicated methods (" + element.key + ") can't be decorated."); } other.descriptor = element.descriptor; } else { if (_hasDecorators(element)) { if (_hasDecorators(other)) { throw new ReferenceError("Decorators can't be placed on different accessors with for " + "the same property (" + element.key + ")."); } other.decorators = element.decorators; } _coalesceGetterSetter(element, other); } } else { newElements.push(element); } } return newElements; } function _hasDecorators(element) { return element.decorators && element.decorators.length; } function _isDataDescriptor(desc) { return desc !== undefined && !(desc.value === undefined && desc.writable === undefined); } function _optionalCallableProperty(obj, name) { var value = obj[name]; if (value !== undefined && typeof value !== "function") { throw new TypeError("Expected '" + name + "' to be a function"); } return value; } function _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError("attempted to get private field on non-instance"); } return fn; } function _classPrivateMethodSet() { throw new TypeError("attempted to reassign private method"); } function _wrapRegExp(re, groups) { _wrapRegExp = function (re, groups) { return new BabelRegExp(re, undefined, groups); }; var _RegExp = _wrapNativeSuper(RegExp); var _super = RegExp.prototype; var _groups = new WeakMap(); function BabelRegExp(re, flags, groups) { var _this = _RegExp.call(this, re, flags); _groups.set(_this, groups || _groups.get(re)); return _this; } _inherits(BabelRegExp, _RegExp); BabelRegExp.prototype.exec = function (str) { var result = _super.exec.call(this, str); if (result) result.groups = buildGroups(result, this); return result; }; BabelRegExp.prototype[Symbol.replace] = function (str, substitution) { if (typeof substitution === "string") { var groups = _groups.get(this); return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) { return "$" + groups[name]; })); } else if (typeof substitution === "function") { var _this = this; return _super[Symbol.replace].call(this, str, function () { var args = []; args.push.apply(args, arguments); if (typeof args[args.length - 1] !== "object") { args.push(buildGroups(args, _this)); } return substitution.apply(this, args); }); } else { return _super[Symbol.replace].call(this, str, substitution); } }; function buildGroups(result, re) { var g = _groups.get(re); return Object.keys(g).reduce(function (groups, name) { groups[name] = result[g[name]]; return groups; }, Object.create(null)); } return _wrapRegExp.apply(this, arguments); } // Numbers represent type - // 1:float 2:vec2 3:vec3 4:vec4 var geometryFunctions = { sphere: { args: [1] }, line: { args: [3, 3, 1] }, cone: { args: [1, 1] }, roundCone: { args: [3, 3, 1, 1] }, plane: { args: [1, 1, 1, 1] } }; var mathFunctions = { nsin: { args: [1], ret: 1 }, ncos: { args: [1], ret: 1 }, round: { args: [1], ret: 1 }, hsv2rgb: { args: [3], ret: 3 }, rgb2hsv: { args: [3], ret: 3 }, rotateVec: { args: [3, 3, 1], ret: 3 }, toSpherical: { args: [3], ret: 3 }, fromSpherical: { args: [3], ret: 3 }, getRayDirection: { args: [], ret: 3 }, osc: { args: [1], ret: 1 }, _hash33: { args: [3], ret: 3 }, _hash13: { args: [3], ret: 1 }, noise: { args: [3], ret: 1 }, fractalNoise: { args: [3], ret: 1 }, sphericalDistribution: { args: [3, 1], ret: 4 } }; // these all have a single input/output and are overloaded for // all types so a list of names is all we need to generate them var glslBuiltInOneToOne = ["sin", "cos", "tan", "asin", "acos", "exp", "log", "exp2", "log2", "sqrt", "inversesqrt", "abs", "sign", "floor", "ceil", "fract"]; // need better overloading system var glslBuiltInOther = { // overload pow somehow? // pow: { args:[1,1], ret:1 }, mod: { args: [1, 1], ret: 1 }, min: { args: [1, 1], ret: 1 }, max: { args: [1, 1], ret: 1 }, atan: { args: [1, 1], ret: 1 }, clamp: { args: [1, 1, 1], ret: 1 }, step: { args: [1, 1], ret: 1 }, smoothstep: { args: [1, 1, 1], ret: 1 }, // also overload length for vec3 and vec2? length: { args: [3], ret: 1 }, distance: { args: [3, 3], ret: 1 }, dot: { args: [3, 3], ret: 1 }, cross: { args: [3, 3], ret: 3 }, normalize: { args: [3], ret: 3 }, reflect: { args: [3, 3], ret: 3 }, refract: { args: [3, 3], ret: 3 } }; // let arg = { // 'mix' : (a, b, c) => (a.dim === b.dim && (c.dim === 1 || c.dim === a.dim))? a.dim: -1, // }; function convertFunctionToString(source) { if (typeof source === "function") { source = source.toString(); return source.slice(source.indexOf("{") + 1, source.lastIndexOf("}")); } else if (!(typeof source === "string")) { throw "your Shader Park code requires the source code to be a function, or a string"; } return source; } var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function getDefaultExportFromNamespaceIfPresent (n) { return n && Object.prototype.hasOwnProperty.call(n, 'default') ? n['default'] : n; } function getDefaultExportFromNamespaceIfNotNamed (n) { return n && Object.prototype.hasOwnProperty.call(n, 'default') && Object.keys(n).length === 1 ? n['default'] : n; } function getAugmentedNamespace(n) { if (n.__esModule) return n; var a = Object.defineProperty({}, '__esModule', {value: true}); Object.keys(n).forEach(function (k) { var d = Object.getOwnPropertyDescriptor(n, k); Object.defineProperty(a, k, d.get ? d : { enumerable: true, get: function () { return n[k]; } }); }); return a; } function createCommonjsModule(fn) { var module = { exports: {} }; return fn(module, module.exports), module.exports; } function commonjsRequire (path) { throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'); } var glslParser = createCommonjsModule(function (module, exports) { // Adapted from https://github.com/cimaron/cwebgl/blob/master/external/glsl2js/glsl.js /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ (function () { /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var glsl = { runParse: function runParse(src, options) { var state, result, irs; state = new GlslState(options); state.setSource(src); //Preprocess result = this.preprocessor.process(state); //Parse into AST if (result) { result = this.parser.parse(state); } /* //Generate IR if (result) { result = this.generate(state); } */ if (result) { state.status = true; } return state; }, /** * Compilation targets */ target: { fragment: 0, 'x-fragment': 0, 'x-shader/x-fragment': 0, vertex: 1, 'x-vertex': 1, 'x-shader/x-vertex': 1 } }; // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. /** * Select node.js util functions */ var util = {}; (function (exports) { var formatRegExp = /%[sdj%]/g; exports.format = function (f) { if (!isString(f)) { var objects = []; for (var i = 0; i < arguments.length; i++) { objects.push(inspect(arguments[i])); } return objects.join(' '); } var i = 1; var args = arguments; var len = args.length; var str = String(f).replace(formatRegExp, function (x) { if (x === '%%') return '%'; if (i >= len) return x; switch (x) { case '%s': return String(args[i++]); case '%d': return Number(args[i++]); case '%j': try { return JSON.stringify(args[i++]); } catch (_) { return '[Circular]'; } default: return x; } }); for (var x = args[i]; i < len; x = args[++i]) { //if (isNull(x) || !isObject(x)) { str += ' ' + x; //} else { // str += ' ' + inspect(x); //} } return str; }; function isString(arg) { return typeof arg === 'string'; } exports.isString = isString; /** * Inherit the prototype methods from one constructor into another. * * The Function.prototype.inherits from lang.js rewritten as a standalone * function (not on Function.prototype). NOTE: If this file is to be loaded * during bootstrapping this function needs to be rewritten using some native * functions as prototype setup using normal JavaScript does not work as * expected during bootstrapping (see mirror.js in r114903). * * @param {function} ctor Constructor function which needs to inherit the * prototype. * @param {function} superCtor Constructor function to inherit prototype from. */ exports.inherits = function (ctor, superCtor) { ctor.super_ = superCtor; ctor.prototype = Object.create(superCtor.prototype, { constructor: { value: ctor, enumerable: false, writable: true, configurable: true } }); }; })(util); /* Copyright (c) 2014 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function GlslState(options) { var i; this.options = { target: 0, language_version: 100, opt: { fold_constants: true } }; for (i in options) { this.options[i] = options[i]; } this.symbols = new SymbolTable(); symbol_table_init(this.symbols, options.target); this.status = false; this.translation_unit = ""; this.ast = []; this.ir = null; this.errors = []; this.warnings = []; } proto = GlslState.prototype = {}; /** * Get identifier type * * @param object state GLSL state * @param string name Identifier name * Add error to state * * @return string * @param string msg Message * @param int line Message * @param int column Message */ proto.classify_identifier = function (state, name) { if (this.symbols.get_variable(name) || this.symbols.get_function(name)) { return 'IDENTIFIER'; } else if (this.symbols.get_type(name)) { return 'TYPE_IDENTIFIER'; } else { return 'NEW_IDENTIFIER'; } }; proto.setSource = function (src) { this.src = src; }; proto.getSource = function () { return this.src; }; proto.setTranslationUnit = function (tu) { this.translation_unit = tu; }; proto.getTranslationUnit = function () { return this.translation_unit; }; proto.addAstNode = function (node) { this.ast.push(node); }; proto.getAst = function () { return this.ast; }; proto.setIR = function (ir) { this.ir = ir; }; proto.getIR = function () { return this.ir; }; proto.getStatus = function () { return this.status; }; /** * Add error to state * * @param string msg Message * @param int line Message * @param int column Message */ proto.addError = function (msg, line, column) { var err; if (!line && !column) { this.errors.push(msg); return; } err = util.format("%s at line %s, column %s", msg, line, column); this.errors.push(err); }; /** * Add warning to state * * @param string msg Message * @param int line Message * @param int column Message */ proto.addWarning = function (msg, line, column) { var warn; if (!line && !column) { this.warnings.push(msg); return; } warn = util.format("%s at line %s, column %s", msg, line, column); this.warnings.push(warn); }; /** * Get compile errors * * @return mixed */ proto.getErrors = function () { return this.errors; }; /** * Get compile errors * * @return mixed */ proto.getWarnings = function () { return this.warnings; }; /* Copyright (c) 2014 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Preprocessor Class */ function Preprocessor() {} Preprocessor.modules = {}; var proto = Preprocessor.prototype; proto.process = function (state) { var m, out = state.getSource(); for (m in Preprocessor.modules) { try { out = Preprocessor.modules[m].process(out); } catch (e) { state.addError(e.message, e.lineNumber, e.columnNumber); return false; } } state.setTranslationUnit(out); return true; }; glsl.preprocessor = new Preprocessor(); /* Copyright (c) 2014 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ Preprocessor.modules.comments = { process: function process(src) { var i, chr, la, out = "", line = 1, in_single = 0, in_multi = 0; for (i = 0; i < src.length; i++) { chr = src.substr(i, 1); la = src.substr(i + 1, 1); //Enter single line comment if (chr == '/' && la == '/' && !in_single && !in_multi) { in_single = line; i++; continue; } //Exit single line comment if (chr == "\n" && in_single) { in_single = 0; } //Enter multi line comment if (chr == '/' && la == '*' && !in_multi && !in_single) { in_multi = line; i++; continue; } //Exit multi line comment if (chr == '*' && la == '/' && in_multi) { //Treat single line multi-comment as space if (in_multi == line) { out += " "; } in_multi = 0; i++; continue; } //Newlines are preserved if (!in_multi && !in_single || chr == "\n") { out += chr; line++; } } return out; } }; /* Copyright (c) 2014 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ Preprocessor.modules.directives = { state: { lines: [], defines: {} }, process: function process(src) { var i, l; this.state.lines = src.split("\n"); this.state.defines = { GL_ES: '1', __FILE__: '0', __LINE__: '0', __VERSION__: '300' }; this.state.cond_stack = []; i = 0; l = this.state.lines.length; while (i < l) { this.state.lines[i] = this.processLine(this.state.lines[i], i); i++; } return this.state.lines.join("\n"); }, processLine: function processLine(line, i) { var d, matches, raw, e, sub, cond; matches = line.match(/^([ \t]*)#(.*)$/); if (!matches) { if (this.state.cond_stack.length != 0 && !this.state.cond_stack.slice(-1)[0]) { return ""; } line = this.processDefines(line, i); return line; } raw = matches[2]; if (raw.match(/^\s*$/)) { return ""; } var lmatches = raw.split(/\s+/); try { switch (lmatches[0]) { case 'define': case 'undef': case 'ifdef': case 'endif': this[lmatches[0]](line, lmatches); return ""; } throw new Error("Invalid directive"); } catch (e) { e.lineNumber = i + 1; e.columnNumber = matches[1].length + 1; throw e; } }, processDefines: function processDefines(line, i) { this.state.defines.__LINE__ = i + 1; for (var d in this.state.defines) { //easy global replace line = line.split(d).join(this.state.defines[d]); } return line; }, define: function define(line, matches) { if (matches.length <= 1 || matches.length > 3) { throw new Error("Syntax error in #define"); } this.state.defines[matches[1]] = matches[2] || ""; }, undef: function undef(line, matches) { if (matches.length != 2) { throw new Error("Syntax error in #undef"); } delete this.state.defines[matches[1]]; }, ifdef: function ifdef(line, matches) { var def; def = !!this.state.defines[matches[1]]; this.state.cond_stack.push(def); }, endif: function endif(line, matches) { if (this.state.cond_stack.length) { this.state.cond_stack.pop(); } else { throw new Error("unmatched #endif"); } } }; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ function Type(name, size, slots, base) { this.name = name; this.size = size; this.slots = slots; this.swizzle = size / slots != 4 ? "xyzw".slice(0, size / slots) : ""; this.base = base || name; } /** * Do a cast on a constant * * @param string val Value to cast * @param string from From type * @param string to To type * * @return string */ Type.castTo = function (val, from, to) { var f32; switch (to) { case 'int': return "" + parseInt(val); case 'float': //Should we keep maximum precision, or use the following to force to 32bit precision?? /* f32 = new Float32Array(1); f32[0] = parseFloat(val); return "" + f32[0]; */ return "" + parseFloat(val); case 'bool': return parseFloat(val) ? "1" : "0"; } return val; }; /** * Determine if can cast from one type to another * * @param string from From type * @param string to To type * * @return bool */ Type.canCast = function (from, to) { var t1, t2; t1 = types[from]; t2 = types[to]; return t1.size === 1 && t2.size === 1; }; var types = { _void: new Type("void", 1, 1), bool: new Type("bool", 1, 1), int: new Type("int", 1, 1), float: new Type("float", 1, 1), vec2: new Type("vec2", 2, 1, 'float'), vec3: new Type("vec3", 3, 1, 'float'), vec4: new Type("vec4", 4, 1, 'float'), bvec2: new Type("bvec2", 2, 1, 'bool'), bvec3: new Type("bvec3", 3, 1, 'bool'), bvec4: new Type("bvec4", 4, 1, 'bool'), ivec2: new Type("ivec2", 2, 1, 'int'), ivec3: new Type("ivec3", 3, 1, 'int'), ivec4: new Type("ivec4", 4, 1, 'int'), mat2: new Type("mat2", 4, 2, 'float'), mat3: new Type("mat3", 9, 3, 'float'), mat4: new Type("mat4", 16, 4, 'float'), sampler2D: new Type("sampler2D", 1, 1), samplerCube: new Type("samplerCube", 1, 1) }; //Compatibility types['void'] = types._void; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * SymbolTableEntry constructor */ function SymbolTableEntry(name, typedef) { this.depth = null; this.typedef = typedef; //Variable name this.name = name; //Type this.type = null; //Base type (if array) this.base_type = null; //Function definition this.definition = []; //Qualifier this.qualifier = null; //IR name this.out = name; //Constant value this.constant = null; //Array size this.size = null; //Temp vars for IR generation this.code = null; this.Ast = null; } SymbolTableEntry.typedef = { variable: 0, func: 1, type: 2 }; SymbolTableEntry.prototype.getType = function () { return types[this.type]; }; /** * symbol_table constructor */ function SymbolTable() { this.table = {}; this.depth = 0; } SymbolTable.prototype = {}; var proto = SymbolTable.prototype; /** * */ proto.push_scope = function () { this.depth++; }; /** * */ proto.pop_scope = function () { var n, t; for (n in this.table) { if (this.table.hasOwnProperty(n)) { t = this.table[n]; while (t[0] && t[0].depth === this.depth) { t.splice(0, 1); } if (t.length === 0) { delete this.table[n]; } } } this.depth--; }; /** * */ proto.name_declared_this_scope = function (name) { var e = this.get_entry(name); return e && e.depth === this.depth; }; /** * */ proto.add_variable = function (name, type) { var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.variable); entry.type = type; return this._add_entry(entry); }; /** * */ proto.add_type = function (name, t) { var entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.type); entry.definition = t; return this._add_entry(entry); }; /** * */ proto.add_function = function (name, type, def) { var entry; entry = new SymbolTableEntry(name, SymbolTableEntry.typedef.func); entry.type = type; if (def) { entry.definition = def; } return this._add_entry(entry); }; /** * */ proto.get_variable = function (name) { var entry = this.get_entry(name, SymbolTableEntry.typedef.variable); return entry; }; /** * */ proto.get_type = function (name) { var entry = this.get_entry(name, SymbolTableEntry.typedef.type); return entry; }; /** * */ proto.get_function = function (name, def) { var entry = this.get_entry(name, SymbolTableEntry.typedef.func, def); return entry; }; /** * @protected */ proto._match_definition = function (def, entry) { var i; if (!def) { return true; } if (def.length !== entry.length) { return false; } for (i = 0; i < def.length; i++) { if (def[i] !== entry[i]) { return false; } } return true; }; /** * @protected */ proto._add_entry = function (entry) { if (!this.table[entry.name]) { this.table[entry.name] = []; } this.table[entry.name].splice(0, 0, entry); entry.depth = this.depth; return entry; }; /** * @protected */ proto.get_entry = function (name, typedef, def) { var t, i, entry; t = this.table[name] || []; //Look for 'void' instead of empty definition list if (def && def.length == 0) { def = ["void"]; } for (i = 0; i < t.length; i++) { entry = t[i]; //Not type of variable we're looking for if (entry.typedef !== typedef) { continue; } //Normal variable if (typedef !== SymbolTableEntry.typedef.func) { return entry; } //Match any function definition if (!def) { return entry; } //Match specific function definition if (def.join(',') === entry.definition.join(',')) { return entry; } } return null; }; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Base class of all abstract syntax tree nodes */ function AstNode() { //public: this.location = { first_line: 0, first_column: 0, last_line: 0, last_column: 0 }; //The following are used during IR generation this.Dest = null; this.Type = null; this.Const = false; } var proto = AstNode.prototype; //public: proto.getLocation = function () { return this.location; }; proto.setLocation = function (loc) { this.location.first_line = loc.first_line; this.location.first_column = loc.first_column; this.location.last_line = loc.last_line; this.location.last_column = loc.last_column; }; /** * Return string representation of node * * @return string */ proto.toString = function () { return this.constructor.name; }; proto.ir = function (state, irs) {//throw new Error("Missing ir generator for node of type " + this.constructor.name); }; //inverse of operators var ast_operators = ["=", "POS", "NEG", "+", "-", "*", "/", "%", "<<", ">>", "<", ">", "<=", ">=", "==", "!=", "&", "^", "|", "~", "&&", "^^", "||", "!", "*=", "/=", "%=", "+=", "-=", "<<=", ">>=", "&=", "^=", "|=", "?:", "++x", "--x", "x++", "x--", ".", "[]", "()", "ident", "float", "int", "bool"]; var ast_precision = { none: 0, highp: 1, mediump: 2, lowp: 3 }; /** * AST Type Specifier Class */ function AstTypeSpecifier(specifier) { AstNode.apply(this); this.type_specifier = null; this.type_name = null; this.structure = null; this.is_array = 0; this.array_size = null; this.precision = 2; this.is_precision_statement = null; if (AstTypeSpecifier[_typeof(specifier)]) { AstTypeSpecifier[_typeof(specifier)].call(this, specifier); } } util.inherits(AstTypeSpecifier, AstNode); proto = AstTypeSpecifier.prototype; //overloaded constructors AstTypeSpecifier.number = function (specifier) { this.type_specifier = specifier; this.precision = ast_precision.none; this.is_precision_statement = false; this.type_name = types[specifier].name; }; AstTypeSpecifier.string = function (name) { this.type_specifier = types[name]; this.type_name = name; this.is_array = false; this.precision = ast_precision.none; this.is_precision_statement = false; }; AstTypeSpecifier.object = function (s) { this.type_specifier = types.struct; this.type_name = s.name; this.structure = s; this.is_array = false; this.precision = ast_precision.none; this.is_precision_statement = false; }; /** * Return string representation of node * * @return string */ proto.toString = function () { var i, prec; if (this.is_precision_statement) { for (i in ast_precision) { if (ast_precision.hasOwnProperty(i) && ast_precision[i] === this.precision) { prec = i; break; } } return util.format("precision %s %s;\n", prec, this.type_name); } return (this.type_specifier === types.struct ? this.structure : this.type_name) + (this.is_array ? util.format("[%s]", this.array_size || "") : ""); }; /** * AST Function Class */ function AstFunction() { AstNode.apply(this); this.return_type = null; this.identifier = null; this.parameters = []; this.entry = null; } util.inherits(AstFunction, AstNode); proto = AstFunction.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return util.format("%s %s(%s)", this.return_type, this.identifier, this.parameters.join(", ")); }; /** * AST Expression Class */ function AstExpression(oper, ex0, ex1, ex2) { AstNode.apply(this); this.oper = oper; this.grouped = false; this.subexpressions = [null, null, null]; this.primary_expression = {}; this.expressions = []; if (ast_operators.indexOf(this.oper) === -1) { this.oper = 'ident'; this.primary_expression.identifier = oper; } else { this.subexpressions[0] = ex0; this.subexpressions[1] = ex1; this.subexpressions[2] = ex2; } } util.inherits(AstExpression, AstNode); proto = AstExpression.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { var output; switch (this.oper) { case '=': case '+': case '-': case '*': case '/': case '%': case "<<": case ">>": case "<": case ">": case "<=": case ">=": case "==": case "!=": case "&": case "^": case "|": case "~": case "&&": case "^^": case "||": case '*=': case '/=': case '%=': case '+=': case '-=': case '<<=': case '>>=': case '&=': case '^=': case '|=': output = util.format("%s %s %s", this.subexpressions[0], this.oper, this.subexpressions[1]); break; case '.': output = util.format("%s.%s", this.subexpressions[0], this.primary_expression.identifier); break; case 'POS': output = util.format("+%s", this.subexpressions[0]); break; case 'NEG': output = util.format("-%s", this.subexpressions[0]); break; case '~': case '!': output = util.format("%s%s", this.oper, this.subexpressions[0]); break; case '++x': case '--x': output = util.format("%s%s", this.oper.replace('x', ''), this.subexpressions[0]); break; case 'x++': case 'x--': output = util.format("%s%s", this.subexpressions[0], this.oper.replace('x', '')); break; case '?:': output = util.format("%s ? %s : %s", this.subexpressions[0], this.subexpressions[1], this.subexpressions[2]); break; case '[]': output = util.format("%s[%s]", this.subexpressions[0], this.subexpressions[1]); break; case '()': output = util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", ")); break; case 'ident': output = util.format("%s", this.primary_expression.identifier); break; case 'float': output = util.format("%s", this.primary_expression.float_constant); break; case 'int': output = util.format("%s", this.primary_expression.int_constant); break; case 'bool': output = util.format("%s", this.primary_expression.bool_constant ? 'true' : 'false'); break; } return this.grouped ? util.format("(%s)", output) : output; }; /** * AST Fully Specified Type Class */ function AstFullySpecifiedType() { AstNode.apply(this); this.qualifier = []; this.specifier = null; } util.inherits(AstFullySpecifiedType, AstNode); proto = AstFullySpecifiedType.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { var output; output = this.qualifier.slice(0); output.push(this.specifier); return output.join(' '); }; /** * AST Declaration Class */ function AstDeclaration(identifier, is_array, array_size, initializer) { AstNode.apply(this); this.identifier = identifier; this.is_array = is_array; this.array_size = array_size; this.initializer = initializer; } util.inherits(AstDeclaration, AstNode); proto = AstDeclaration.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return this.identifier + (this.is_array ? util.format("[%s]", this.array_size === undefined ? '' : this.array_size) : '') + (this.initializer ? util.format(" = %s", this.initializer) : ""); }; /** * AST Declarator List Class */ function AstDeclaratorList(type) { AstNode.apply(this); this.type = type; this.declarations = []; this.invariant = 0; } util.inherits(AstDeclaratorList, AstNode); proto = AstDeclaratorList.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return util.format("%s %s;\n", this.type || "invariant ", this.declarations.join(", ")); }; /** * AST Parameter Declarator Class */ function AstParameterDeclarator() { AstNode.apply(this); this.type = null; this.identifier = null; this.is_array = false; this.array_size = 0; this.formal_parameter = null; this.is_void = null; } util.inherits(AstParameterDeclarator, AstNode); proto = AstParameterDeclarator.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return this.type + (this.identifier ? " " + this.identifier : "") + (this.is_array ? util.format("[%s]", this.array_size) : ""); }; /** * AST Expression Statement Class */ function AstExpressionStatement(ex) { AstNode.apply(this); this.expression = ex; } util.inherits(AstExpressionStatement, AstNode); proto = AstExpressionStatement.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return util.format("%s;\n", this.expression || ""); }; /** * AST Compound Statement Class */ function AstCompoundStatement(new_scope, statements) { AstNode.apply(this); this.new_scope = new_scope; if (statements) { this.statements = statements; } else { this.statements = []; } } util.inherits(AstCompoundStatement, AstNode); proto = AstCompoundStatement.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { var str, stmts, indent; AstCompoundStatement._depth++; indent = new Array(AstCompoundStatement._depth).join(" "); stmts = indent + " " + this.statements.join(indent + " "); str = "\n" + indent + "{\n" + stmts + indent + "}\n"; AstCompoundStatement._depth--; return str; }; //Used for toString indentation AstCompoundStatement._depth = 0; /** * AST Function Definition Class */ function AstFunctionDefinition() { AstNode.apply(this); this.proto_type = null; this.body = null; } util.inherits(AstFunctionDefinition, AstNode); proto = AstFunctionDefinition.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return util.format("%s %s", this.proto_type, this.body); }; /** * AST Function Definition Class */ function AstExpressionBin(oper, ex0, ex1) { AstExpression.apply(this, [oper, ex0, ex1]); } util.inherits(AstExpressionBin, AstExpression); proto = AstExpressionBin.prototype; /** * AST Function Expression Class */ function AstFunctionExpression(arg) { AstExpression.apply(this); this.cons = false; if (arg.constructor.name === 'AstExpression') { this.cons = false; AstExpression.call(this, '()', arg); } else if (arg.constructor.name === 'AstTypeSpecifier') { this.cons = true; AstExpression.call(this, '()', arg); } } util.inherits(AstFunctionExpression, AstExpression); proto = AstFunctionExpression.prototype; proto.is_constructor = function () { return this.cons; }; proto.toString = function () { return util.format("%s(%s)", this.subexpressions[0], this.expressions.join(", ")); }; /** * AST Selection Statement Class */ function AstSelectionStatement(condition, then_statement, else_statement) { AstNode.apply(this); this.condition = condition; this.then_statement = then_statement; this.else_statement = else_statement; } util.inherits(AstSelectionStatement, AstNode); proto = AstSelectionStatement.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { return util.format("if (%s) %s %s", this.condition, this.then_statement, this.else_statement ? util.format("else %s", this.else_statement) : ""); }; /** * AST Struct Specifier Class */ function AstStructSpecifier(identifier, declarator_list) { AstNode.apply(this); this.name = null; this.declarations = []; if (identifier === null) { identifier = util.format("#anon_struct%d", AstStructSpecifier.anon_count); AstStructSpecifier.anon_count++; } this.name = identifier; this.declarations = declarator_list.declarations; } AstStructSpecifier.anon_count = 1; util.inherits(AstStructSpecifier, AstNode); proto = AstStructSpecifier.prototype; /** * AST Jump */ function AstJumpStatement(mode, return_value) { AstNode.apply(this); this.opt_return_value = null; this.mode = mode; if (mode === 'return') { this.opt_return_value = return_value; } } util.inherits(AstJumpStatement, AstNode); proto = AstJumpStatement.prototype; /** * Return string representation of node * * @return string */ proto.toString = function () { switch (this.mode) { case 'continue': case 'break': case 'discard': case 'debugger': return this.mode + ";\n"; case 'return': return util.format("return%s;\n", this.opt_return_value ? " " + this.opt_return_value : ""); } }; glsl.ast = { Node: AstNode, TypeSpecifier: AstTypeSpecifier, Function: AstFunction, Expression: AstExpression, FullySpecifiedType: AstFullySpecifiedType, Declaration: AstDeclaration, DeclaratorList: AstDeclaratorList, ParameterDeclarator: AstParameterDeclarator, ExpressionStatement: AstExpressionStatement, CompoundStatement: AstCompoundStatement, FunctionDefinition: AstFunctionDefinition, ExpressionBin: AstExpressionBin, FunctionExpression: AstFunctionExpression, SelectionStatement: AstSelectionStatement, StructSpecifier: AstStructSpecifier, JumpStatement: AstJumpStatement }; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var builtin = { vars: { vertex: [{ position: 0, type: 'vec4', name: 'gl_Position', out: 'result@0' }, { position: 1, type: 'float', name: 'gl_PointSize', out: 'result@1' }], fragment: [{ position: 0, type: 'vec4', name: 'gl_FragColor', out: 'result@0' }] }, /** * List of instructions for operators * * Denoted by operator, then by definition of param types to output type */ oper: { "!": { "bool:bool": ["SEQ %1.x %2.x 0.0"] }, "+": { "int,int:int": ["ADD %1.x %2.x %3.x"], "float,float:float": ["ADD %1.x %2.x %3.x"], "float,vec2:vec2": ["ADD %1.xy %2.x %3.xy"], "float,vec3:vec3": ["ADD %1.xyz %2.x %3.xyz"], "float,vec4:vec4": ["ADD %1 %2.x %3"], "vec2,float:vec2": ["ADD %1.xy %2.xy %3.x"], "vec3,float:vec3": ["ADD %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["ADD %1 %2 %3.x"], "vec2,vec2:vec2": ["ADD %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["ADD %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["ADD %1 %2 %3"] }, "-": { "int,int:int": ["SUB %1.x %2.x %3.x"], "float,float:float": ["SUB %1.x %2.x %3.x"], "float,vec2:vec2": ["SUB %1.xy %2.x %3.xy"], "float,vec3:vec3": ["SUB %1.xyz %2.x %3.xyz"], "float,vec4:vec4": ["SUB %1 %2.x %3"], "vec2,float:vec2": ["SUB %1.xy %2.xy %3.x"], "vec3,float:vec3": ["SUB %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["SUB %1 %2 %3.x"], "vec2,vec2:vec2": ["SUB %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["SUB %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["SUB %1 %2 %3"] }, "*": { "int,int:int": ["MUL %1.x %2.x %3.x"], "float,float:float": ["MUL %1.x %2.x %3.x"], "float,vec2:vec2": ["MUL %1.xy %2.x %3.xy"], "float,vec3:vec3": ["MUL %1.xyz %2.x %3.xyz"], "float,vec4:vec4": ["MUL %1 %2.x %3"], "vec2,float:vec2": ["MUL %1.xy %2.xy %3.x"], "vec3,float:vec3": ["MUL %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["MUL %1 %2 %3.x"], "vec2,vec2:vec2": ["MUL %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["MUL %1 %2 %3"], "mat3,vec3:vec3": ["MUL %1.xyz %2.xyz %3.x", "MAD %1.xyz %2@1.xyz %3.y %1", "MAD %1.xyz %2@2.xyz %3.z %1"], "mat4,vec4:vec4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1"], "mat4,mat4:mat4": ["MUL %1 %2 %3.x", "MAD %1 %2@1 %3.y %1", "MAD %1 %2@2 %3.z %1", "MAD %1 %2@3 %3.w %1", "MUL %1@1 %2 %3@1.x", "MAD %1@1 %2@1 %3@1.y %1@1", "MAD %1@1 %2@2 %3@1.z %1@1", "MAD %1@1 %2@3 %3@1.w %1@1", "MUL %1@2 %2 %3@2.x", "MAD %1@2 %2@1 %3@2.y %1@2", "MAD %1@2 %2@2 %3@2.z %1@2", "MAD %1@2 %2@3 %3@2.w %1@2", "MUL %1@3 %2 %3@3.x", "MAD %1@3 %2@1 %3@3.y %1@3", "MAD %1@3 %2@2 %3@3.z %1@3", "MAD %1@3 %2@3 %3@3.w %1@3"] }, "/": { "int,int:int": ["DIV %1.x %2.x %3.x"], "float,float:float": ["DIV %1.x %2.x %3.x"], "float,vec2:vec2": ["DIV %1.xy %2.x %3.xy"], "float,vec3:vec3": ["DIV %1.xyz %2.x %3.xyz"], "float,vec4:vec4": ["DIV %1 %2.x %3"], "vec2,float:vec2": ["DIV %1.xy %2.xy %3.x"], "vec3,float:vec3": ["DIV %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["DIV %1 %2 %3.x"], "vec2,vec2:vec2": ["DIV %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["DIV %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["DIV %1 %2 %3"] }, "<": { "int,int:bool": ["SLT %1.x %2.x %3.x"], "float,float:bool": ["SLT %1.x %2.x %3.x"] }, ">": { "int,int:bool": ["SGT %1.x %2.x %3.x"], "float,float:bool": ["SGT %1.x %2.x %3.x"] }, "<=": { "int,int:bool": ["SLE %1.x %2.x %3.x"], "float,float:bool": ["SLE %1.x %2.x %3.x"] }, ">=": { "int,int:bool": ["SGE %1.x %2.x %3.x"], "float,float:bool": ["SGE %1.x %2.x %3.x"] }, "==": { "int,int:bool": ["SEQ %1.x %2.x %3.x"], "float,float:bool": ["SEQ %1.x %2.x %3.x"] }, "!=": { "int,int:bool": ["SNE %1.x %2.x %3.x"], "float,float:bool": ["SNE %1.x %2.x %3.x"] }, "&&": { "bool,bool:bool": ["AND %1.x %2.x %3.x", "AND %1.x %1.x 1"] }, "^^": { "bool,bool:bool": ["XOR %1.x %2.x %3.x", "AND %1.x %1.x 1"] }, "||": { "bool,bool:bool": ["OR %1.x %2.x %3.x", "AND %1.x %1.x 1"] } }, /** * List of instructions for built in functions * * Denoted by function name, then by definition of param types to output type */ func: { "abs": { "float:float": ["ABS %1.x %2.x"], "vec2:vec2": ["ABS %1.xy %2.xy"], "vec3:vec3": ["ABS %1.xyz %2.xyz"], "vec4:vec4": ["ABS %1 %2"] }, "ceil": { "float:float": ["CEIL %1.x %2.x"], "vec2:vec2": ["CEIL %1.xy %2.xy"], "vec3:vec3": ["CEIL %1.xyz %2.xyz"], "vec4:vec4": ["CEIL %1 %2"] }, "clamp": { "float,float,float:float": ["MAX %1.x %2.x %3.x", "MIN %1.x %1.x %4.x"], "vec2,float,float:vec2": ["MAX %1.xy %2.xy %3.x", "MIN %1.xy %1.xy %4.x"], "vec3,float,float:vec3": ["MAX %1.xyz %2.xyz %3.x", "MIN %1.xyz %1.xyz %4.x"], "vec4,float,float:vec4": ["MAX %1 %2 %3.x", "MIN %1 %1 %4.x"], "vec2,vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy", "MIN %1.xy %1.xy %4.xy"], "vec3,vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz", "MIN %1.xyz %1.xyz %4.xyz"], "vec4,vec4,vec4:vec4": ["MAX %1 %2 %3", "MIN %1 %1 %4"] }, "cos": { "float:float": ["COS %1.x %2.x"], "vec2:vec2": ["COS %1.xy %2.xy"], "vec3:vec3": ["COS %1.xyz %2.xyz"], "vec4:vec4": ["COS %1 %2"] }, "degrees": { "float:float": ["MUL %1.x %2.x " + 180 / Math.PI], "vec2:vec2": ["MUL %1.xy %2.xy " + 180 / Math.PI], "vec3:vec3": ["MUL %1.xyz %2.xyz " + 180 / Math.PI], "vec4:vec4": ["MUL %1 %2 " + 180 / Math.PI] }, "dot": { "vec2,vec2:float": ["DP2 %1.x %2.xy %3.xy"], "vec3,vec3:float": ["DP3 %1.x %2.xyz %3.xyz"], "vec4,vec4:float": ["DP4 %1.x %2 %3"] }, "floor": { "float:float": ["FLR %1.x %2.x"], "vec2:vec2": ["FLR %1.xy %2.xy"], "vec3:vec3": ["FLR %1.xyz %2.xyz"], "vec4:vec4": ["FLR %1 %2"] }, "fract": { "float:float": ["FRC %1.x %2.x"], "vec2:vec2": ["FRC %1.xy %2.xy"], "vec3:vec3": ["FRC %1.xyz %2.xyz"], "vec4:vec4": ["FRC %1 %2"] }, "max": { "float,float:float": ["MAX %1.x %2.x %3.x"], "vec2,float:vec2": ["MAX %1.xy %2.xy %3.x"], "vec3,float:vec3": ["MAX %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["MAX %1 %2 %3.x"], "vec2,vec2:vec2": ["MAX %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["MAX %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["MAX %1 %2 %3"] }, "min": { "float,float:float": ["MIN %1.x %2.x %3.x"], "vec2,float:vec2": ["MIN %1.xy %2.xy %3.x"], "vec3,float:vec3": ["MIN %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["MIN %1 %2 %3.x"], "vec2,vec2:vec2": ["MIN %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["MIN %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["MIN %1 %2 %3"] }, "mix": { "float,float,float:float": ["MAD %1.x -%2.x %4.x %2.x", "MAD %1.x %3.x %4.x %1.x"], "vec2,vec2,float:vec2": ["MAD %1.xy -%2.xy %4.x %2.xy", "MAD %1.xy %3.xy %4.x %1.xy"], "vec3,vec3,float:vec3": ["MAD %1.xyz -%2.xyz %4.x %2.xyz", "MAD %1.xyz %3.xyz %4.x %1.xyz"], "vec4,vec4,float:vec4": ["MAD %1 -%2 %4.x %2", "MAD %1 %3 %4.x %1"], "vec2,vec2,vec2:vec2": ["MAD %1.xy -%2.xy %4.xy %2.xy", "MAD %1.xy %3.xy %4.xy %1.xy"], "vec3,vec3,vec3:vec3": ["MAD %1.xyz -%2.xyz %4.xyz %2.xyz", "MAD %1.xyz %3.xyz %4.xyz %1.xyz"], "vec4,vec4,vec4:vec4": ["MAD %1 -%2 %4 %2", "MAD %1 %3 %4 %1"] }, "mod": { "float,float:float": ["MOD %1.x %2.x %3.x"], "vec2,float:vec2": ["MOD %1.xy %2.xy %3.x"], "vec3,float:vec3": ["MOD %1.xyz %2.xyz %3.x"], "vec4,float:vec4": ["MOD %1 %2 %3.x"], "vec2,vec2:vec2": ["MOD %1.xy %2.xy %3.xy"], "vec3,vec3:vec3": ["MOD %1.xyz %2.xyz %3.xyz"], "vec4,vec4:vec4": ["MOD %1 %2 %3"] }, "normalize": { "vec3:vec3": ["DP3 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1.xyz %2.xyz %1.x"], "vec4:vec4": ["DP4 %1.x %2 %2", "RSQ %1.x %1.x", "MUL %1 %2 %1.x"] }, "pow": { "float,float:float": ["POW %1.x %2.x %3.x"] }, "reflect": { "vec3,vec3:vec3": ["DP3 %1.x %3 %2", "MUL %1.xyz %3 %1.x", "MAD %1.xyz -%1 2.0 %2"] }, "radians": { "float:float": ["MUL %1.x %2.x " + Math.PI / 180], "vec2:vec2": ["MUL %1.xy %2.xy " + Math.PI / 180], "vec3:vec3": ["MUL %1.xyz %2.xyz " + Math.PI / 180], "vec4:vec4": ["MUL %1 %2 " + Math.PI / 180] }, "sign": { "float:float": ["SGT %t1.x %2.x 0", "SLT %t1.y %2.x 0", "ADD %1.x %t1.x -%t1.y"], "vec2:vec2": ["SGT %t1.xy %2.xy 0", "SLT %t1.zw %2.zw 0", "ADD %1.xy %t1.xy -%t1.zw"], "vec3:vec3": ["SGT %t1.xyz %2.xyz 0", "SLT %t2.xyz %2.xyz 0", "ADD %1.xyz %t1.xyz -%t2.xyz"], "vec4:vec4": ["SGT %t1 %2 0", "SLT %t2 %2 0", "ADD %1 %t1 -%t2"] }, "sin": { "float:float": ["SIN %1.x %2.x"], "vec2:vec2": ["SIN %1.xy %2.xy"], "vec3:vec3": ["SIN %1.xyz %2.xyz"], "vec4:vec4": ["SIN %1 %2"] }, "step": { "float,float:float": ["SGE %1.x %3.x %2.x"], "float,vec2:vec2": ["SGE %1.xy %3.x %2.xy"], "float,vec3:vec3": ["SGE %1.xyz %3.x %2.xyz"], "float,vec4:vec4": ["SGE %1 %3.x %2"], "vec2,vec2:vec2": ["SGE %1.xy %3.xy %2.xy"], "vec3,vec3:vec3": ["SGE %1.xyz %3.xyz %2.xyz"], "vec4,vec4:vec4": ["SGE %1 %3 %3"] }, "tan": { "float:float": ["TAN %1.x %2.x"], "vec2:vec2": ["TAN %1.xy %2.xy"], "vec3:vec3": ["TAN %1.xyz %2.xyz"], "vec4:vec4": ["TAN %1 %2"] }, "texture2D": { "sampler2D,vec2:vec4": ["TEX %1 %3 %2 \"2D\""] } } }; function _builtinParseType(str) { var parts, ret; parts = str.split(":"); parts[0] = parts[0].split(","); ret = { src: parts[0], dest: parts[1] }; return ret; } function symbol_table_init(table, target) { var i, j, vars, v, entry, types, name; vars = target === glsl.target.vertex ? builtin.vars.vertex : builtin.vars.fragment; for (i = 0; i < vars.length; i++) { v = vars[i]; entry = table.add_variable(v.name, v.type); entry.position = v.position; entry.out = v.out; } vars = builtin.func; for (name in vars) { v = vars[name]; for (j in v) { types = _builtinParseType(j); entry = table.add_function(name, types.dest, types.src); entry.code = v[j]; } } } /* parser generated by jison 0.4.15 */ /* Returns a Parser object of the following structure: Parser: { yy: {} } Parser.prototype: { yy: {}, trace: function(), symbols_: {associative list: name ==> number}, terminals_: {associative list: number ==> name}, productions_: [...], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), table: [...], defaultActions: {...}, parseError: function(str, hash), parse: function(input), lexer: { EOF: 1, parseError: function(str, hash), setInput: function(input), input: function(), unput: function(str), more: function(), less: function(n), pastInput: function(), upcomingInput: function(), showPosition: function(), test_match: function(regex_match_array, rule_index), next: function(), lex: function(), begin: function(condition), popState: function(), _currentRules: function(), topState: function(), pushState: function(condition), options: { ranges: boolean (optional: true ==> token location info will include a .range[] member) flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) }, performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), rules: [...], conditions: {associative list: name ==> set}, } } token location info (@$, _$, etc.): { first_line: n, last_line: n, first_column: n, last_column: n, range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) } the parseError function receives a 'hash' object with these members for lexer and parser errors: { text: (matched text) token: (the produced terminal token, if any) line: (yylineno) } while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { loc: (yylloc) expected: (string describing the set of expected tokens) recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) } */ var parser = function () { var o = function o(k, v, _o, l) { for (_o = _o || {}, l = k.length; l--; _o[k[l]] = v) { ; } return _o; }, $V0 = [13, 14, 15, 16, 17, 21, 22, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], $V1 = [1, 18], $V2 = [1, 19], $V3 = [1, 20], $V4 = [1, 21], $V5 = [1, 22], $V6 = [1, 53], $V7 = [1, 54], $V8 = [1, 17], $V9 = [1, 44], $Va = [1, 45], $Vb = [1, 28], $Vc = [1, 47], $Vd = [1, 48], $Ve = [1, 49], $Vf = [1, 50], $Vg = [1, 40], $Vh = [1, 41], $Vi = [1, 42], $Vj = [1, 43], $Vk = [1, 46], $Vl = [1, 55], $Vm = [1, 56], $Vn = [1, 57], $Vo = [1, 58], $Vp = [1, 59], $Vq = [1, 60], $Vr = [1, 61], $Vs = [1, 62], $Vt = [1, 63], $Vu = [1, 64], $Vv = [1, 65], $Vw = [1, 66], $Vx = [1, 67], $Vy = [1, 68], $Vz = [1, 69], $VA = [1, 70], $VB = [1, 71], $VC = [1, 72], $VD = [1, 73], $VE = [1, 74], $VF = [1, 75], $VG = [1, 76], $VH = [1, 37], $VI = [1, 38], $VJ = [1, 39], $VK = [1, 77], $VL = [5, 13, 14, 15, 16, 17, 21, 47, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], $VM = [1, 82], $VN = [1, 83], $VO = [1, 84], $VP = [1, 86], $VQ = [1, 87], $VR = [49, 106], $VS = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], $VT = [2, 121], $VU = [1, 101], $VV = [1, 102], $VW = [1, 103], $VX = [1, 100], $VY = [2, 159], $VZ = [21, 25, 26, 49, 106], $V_ = [2, 141], $V$ = [21, 25, 26, 30, 32, 49, 106], $V01 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 169], $V11 = [21, 47, 120, 121, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], $V21 = [21, 25, 26, 30, 32, 34, 49, 106], $V31 = [2, 177], $V41 = [2, 12], $V51 = [11, 23, 30, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170], $V61 = [5, 10, 13, 14, 15, 16, 17, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206], $V71 = [1, 169], $V81 = [1, 170], $V91 = [1, 171], $Va1 = [1, 172], $Vb1 = [1, 156], $Vc1 = [1, 157], $Vd1 = [1, 182], $Ve1 = [1, 163], $Vf1 = [1, 164], $Vg1 = [1, 165], $Vh1 = [1, 166], $Vi1 = [1, 136], $Vj1 = [1, 127], $Vk1 = [1, 138], $Vl1 = [1, 139], $Vm1 = [1, 140], $Vn1 = [1, 141], $Vo1 = [1, 142], $Vp1 = [1, 143], $Vq1 = [1, 144], $Vr1 = [1, 145], $Vs1 = [1, 146], $Vt1 = [1, 147], $Vu1 = [1, 148], $Vv1 = [1, 149], $Vw1 = [32, 49], $Vx1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206], $Vy1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 108, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 172, 189, 191, 193, 194, 195, 196, 197, 198, 202, 203, 204, 205, 206], $Vz1 = [1, 216], $VA1 = [23, 32, 36, 49, 106], $VB1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106], $VC1 = [2, 58], $VD1 = [23, 32, 36, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106], $VE1 = [1, 251], $VF1 = [23, 32, 36, 49, 88, 90, 106], $VG1 = [1, 252], $VH1 = [23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106], $VI1 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], $VJ1 = [23, 32, 36, 49, 86, 88, 90, 106], $VK1 = [1, 253], $VL1 = [23, 32, 36, 49, 84, 86, 88, 90, 106], $VM1 = [1, 256], $VN1 = [23, 32, 36, 49, 82, 84, 86, 88, 90, 106], $VO1 = [1, 257], $VP1 = [23, 32, 36, 49, 80, 82, 84, 86, 88, 90, 106], $VQ1 = [1, 261], $VR1 = [23, 32, 36, 49, 78, 80, 82, 84, 86, 88, 90, 106], $VS1 = [1, 264], $VT1 = [1, 265], $VU1 = [10, 21, 25, 26, 28, 29, 30, 32, 39, 40, 47, 51, 57, 58, 59, 60, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], $VV1 = [23, 32, 36, 49, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106], $VW1 = [1, 266], $VX1 = [1, 267], $VY1 = [1, 268], $VZ1 = [1, 269], $V_1 = [23, 32, 36, 49, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106], $V$1 = [1, 270], $V02 = [1, 271], $V12 = [23, 32, 36, 49, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106], $V22 = [1, 272], $V32 = [1, 273], $V42 = [23, 32, 36, 49, 57, 58, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 106], $V52 = [1, 274], $V62 = [1, 275], $V72 = [1, 276], $V82 = [21, 47, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 172], $V92 = [1, 306], $Va2 = [30, 34], $Vb2 = [32, 106], $Vc2 = [10, 21, 25, 26, 28, 29, 30, 39, 40, 47, 51, 57, 58, 59, 60, 106, 120, 121, 125, 128, 132, 133, 134, 135, 137, 138, 139, 140, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169]; var parser = { trace: function trace() {}, yy: {}, symbols_: { "error": 2, "glsl-start": 3, "translation_unit": 4, "EOF": 5, "version_statement": 6, "extension_statement_list": 7, "external_declaration_list": 8, "VERSION": 9, "INTCONSTANT": 10, "EOL": 11, "pragma_statement": 12, "PRAGMA_DEBUG_ON": 13, "PRAGMA_DEBUG_OFF": 14, "PRAGMA_OPTIMIZE_ON": 15, "PRAGMA_OPTIMIZE_OFF": 16, "PRAGMA_INVARIANT_ALL": 17, "extension_statement": 18, "any_identifier": 19, "variable_identifier": 20, "TYPE_IDENTIFIER": 21, "EXTENSION": 22, ":": 23, "external_declaration": 24, "IDENTIFIER": 25, "NEW_IDENTIFIER": 26, "primary_expression": 27, "FLOATCONSTANT": 28, "BOOLCONSTANT": 29, "(": 30, "expression": 31, ")": 32, "postfix_expression": 33, "[": 34, "integer_expression": 35, "]": 36, "function_call": 37, ".": 38, "++": 39, "--": 40, "function_call_or_method": 41, "function_call_generic": 42, "method_call_generic": 43, "function_call_header_with_parameters": 44, "function_call_header_no_parameters": 45, "function_call_header": 46, "VOID": 47, "assignment_expression": 48, ",": 49, "type_specifier": 50, "FIELD_SELECTION": 51, "method_call_header_with_parameters": 52, "method_call_header_no_parameters": 53, "method_call_header": 54, "unary_expression": 55, "unary_operator": 56, "+": 57, "-": 58, "!": 59, "~": 60, "multiplicative_expression": 61, "*": 62, "/": 63, "%": 64, "additive_expression": 65, "shift_expression": 66, "<<": 67, ">>": 68, "relational_expression": 69, "<": 70, ">": 71, "<=": 72, ">=": 73, "equality_expression": 74, "==": 75, "!=": 76, "and_expression": 77, "&": 78, "exclusive_or_expression": 79, "^": 80, "inclusive_or_expression": 81, "|": 82, "logical_and_expression": 83, "&&": 84, "logical_xor_expression": 85, "^^": 86, "logical_or_expression": 87, "||": 88, "conditional_expression": 89, "?": 90, "assignment_operator": 91, "=": 92, "*=": 93, "/=": 94, "%=": 95, "+=": 96, "-=": 97, "<<=": 98, ">>=": 99, "&=": 100, "^=": 101, "|=": 102, "constant_expression": 103, "declaration": 104, "function_prototype": 105, ";": 106, "init_declarator_list": 107, "PRECISION": 108, "precision_qualifier": 109, "type_specifier_no_prec": 110, "function_declarator": 111, "function_header": 112, "function_header_with_parameters": 113, "parameter_declaration": 114, "fully_specified_type": 115, "parameter_declarator": 116, "parameter_type_qualifier": 117, "parameter_qualifier": 118, "parameter_type_specifier": 119, "IN": 120, "OUT": 121, "INOUT": 122, "single_declaration": 123, "initializer": 124, "INVARIANT": 125, "type_qualifier": 126, "layout_qualifier": 127, "LAYOUT": 128, "layout_qualifier_id_list": 129, "layout_qualifier_id": 130, "interpolation_qualifier": 131, "SMOOTH": 132, "FLAT": 133, "NOPERSPECTIVE": 134, "CONST": 135, "storage_qualifier": 136, "ATTRIBUTE": 137, "VARYING": 138, "CENTROID": 139, "UNIFORM": 140, "type_specifier_nonarray": 141, "basic_type_specifier_nonarray": 142, "struct_specifier": 143, "FLOAT": 144, "DOUBLE": 145, "INT": 146, "BOOL": 147, "VEC2": 148, "VEC3": 149, "VEC4": 150, "BVEC2": 151, "BVEC3": 152, "BVEC4": 153, "IVEC2": 154, "IVEC3": 155, "IVEC4": 156, "MAT2X2": 157, "MAT3X3": 158, "MAT4X4": 159, "SAMPLER1D": 160, "SAMPLER2D": 161, "SAMPLER3D": 162, "SAMPLERCUBE": 163, "SAMPLER1DSHADOW": 164, "SAMPLER2DSHADOW": 165, "HIGHP": 166, "MEDIUMP": 167, "LOWP": 168, "STRUCT": 169, "{": 170, "struct_declaration_list": 171, "}": 172, "struct_declaration": 173, "struct_declarator_list": 174, "struct_declarator": 175, "declaration_statement": 176, "statement": 177, "compound_statement": 178, "simple_statement": 179, "expression_statement": 180, "selection_statement": 181, "switch_statement": 182, "case_label": 183, "iteration_statement": 184, "jump_statement": 185, "statement_list": 186, "statement_no_new_scope": 187, "compound_statement_no_new_scope": 188, "IF": 189, "selection_rest_statement": 190, "ELSE": 191, "condition": 192, "SWITCH": 193, "CASE": 194, "DEFAULT": 195, "WHILE": 196, "DO": 197, "FOR": 198, "for_init_statement": 199, "for_rest_statement": 200, "conditionopt": 201, "CONTINUE": 202, "BREAK": 203, "RETURN": 204, "DISCARD": 205, "DEBUGGER": 206, "function_definition": 207, "$accept": 0, "$end": 1 }, terminals_: { 2: "error", 5: "EOF", 9: "VERSION", 10: "INTCONSTANT", 11: "EOL", 13: "PRAGMA_DEBUG_ON", 14: "PRAGMA_DEBUG_OFF", 15: "PRAGMA_OPTIMIZE_ON", 16: "PRAGMA_OPTIMIZE_OFF", 17: "PRAGMA_INVARIANT_ALL", 21: "TYPE_IDENTIFIER", 22: "EXTENSION", 23: ":", 25: "IDENTIFIER", 26: "NEW_IDENTIFIER", 28: "FLOATCONSTANT", 29: "BOOLCONSTANT", 30: "(", 32: ")", 34: "[", 36: "]", 38: ".", 39: "++", 40: "--", 47: "VOID", 49: ",", 51: "FIELD_SELECTION", 57: "+", 58: "-", 59: "!", 60: "~", 62: "*", 63: "/", 64: "%", 67: "<<", 68: ">>", 70: "<", 71: ">", 72: "<=", 73: ">=", 75: "==", 76: "!=", 78: "&", 80: "^", 82: "|", 84: "&&", 86: "^^", 88: "||", 90: "?", 92: "=", 93: "*=", 94: "/=", 95: "%=", 96: "+=", 97: "-=", 98: "<<=", 99: ">>=", 100: "&=", 101: "^=", 102: "|=", 106: ";", 108: "PRECISION", 120: "IN", 121: "OUT", 122: "INOUT", 125: "INVARIANT", 128: "LAYOUT", 132: "SMOOTH", 133: "FLAT", 134: "NOPERSPECTIVE", 135: "CONST", 137: "ATTRIBUTE", 138: "VARYING", 139: "CENTROID", 140: "UNIFORM", 144: "FLOAT", 145: "DOUBLE", 146: "INT", 147: "BOOL", 148: "VEC2", 149: "VEC3", 150: "VEC4", 151: "BVEC2", 152: "BVEC3", 153: "BVEC4", 154: "IVEC2", 155: "IVEC3", 156: "IVEC4", 157: "MAT2X2", 158: "MAT3X3", 159: "MAT4X4", 160: "SAMPLER1D", 161: "SAMPLER2D", 162: "SAMPLER3D", 163: "SAMPLERCUBE", 164: "SAMPLER1DSHADOW", 165: "SAMPLER2DSHADOW", 166: "HIGHP", 167: "MEDIUMP", 168: "LOWP", 169: "STRUCT", 170: "{", 172: "}", 189: "IF", 191: "ELSE", 193: "SWITCH", 194: "CASE", 195: "DEFAULT", 196: "WHILE", 197: "DO", 198: "FOR", 202: "CONTINUE", 203: "BREAK", 204: "RETURN", 205: "DISCARD", 206: "DEBUGGER" }, productions_: [0, [3, 2], [4, 3], [6, 0], [6, 3], [12, 2], [12, 2], [12, 2], [12, 2], [12, 2], [7, 0], [7, 2], [19, 1], [19, 1], [18, 5], [8, 1], [8, 2], [20, 1], [20, 1], [27, 1], [27, 1], [27, 1], [27, 1], [27, 3], [33, 1], [33, 4], [33, 1], [33, 3], [33, 2], [33, 2], [35, 1], [37, 1], [41, 1], [41, 3], [42, 2], [42, 2], [45, 2], [45, 1], [44, 2], [44, 3], [46, 2], [46, 2], [46, 1], [43, 2], [43, 2], [53, 2], [53, 1], [52, 2], [52, 3], [54, 2], [55, 1], [55, 2], [55, 2], [55, 2], [56, 1], [56, 1], [56, 1], [56, 1], [61, 1], [61, 3], [61, 3], [61, 3], [65, 1], [65, 3], [65, 3], [66, 1], [66, 3], [66, 3], [69, 1], [69, 3], [69, 3], [69, 3], [69, 3], [74, 1], [74, 3], [74, 3], [77, 1], [77, 3], [79, 1], [79, 3], [81, 1], [81, 3], [83, 1], [83, 3], [85, 1], [85, 3], [87, 1], [87, 3], [89, 1], [89, 5], [48, 1], [48, 3], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [31, 1], [31, 3], [103, 1], [104, 2], [104, 2], [104, 4], [105, 2], [111, 1], [111, 1], [113, 2], [113, 3], [112, 3], [116, 2], [116, 5], [114, 3], [114, 2], [114, 3], [114, 2], [118, 0], [118, 1], [118, 1], [118, 1], [119, 1], [107, 1], [107, 3], [107, 5], [107, 6], [107, 7], [107, 8], [107, 5], [123, 1], [123, 2], [123, 4], [123, 5], [123, 6], [123, 7], [123, 4], [123, 2], [115, 1], [115, 2], [127, 4], [129, 1], [129, 3], [130, 1], [130, 3], [131, 1], [131, 1], [131, 1], [117, 1], [126, 1], [126, 1], [126, 2], [126, 1], [126, 2], [126, 2], [126, 3], [126, 1], [136, 1], [136, 1], [136, 1], [136, 2], [136, 1], [136, 1], [136, 2], [136, 2], [136, 1], [50, 1], [50, 2], [110, 1], [110, 3], [110, 4], [141, 1], [141, 1], [141, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [142, 1], [109, 1], [109, 1], [109, 1], [143, 5], [143, 4], [171, 1], [171, 2], [173, 3], [174, 1], [174, 3], [175, 1], [175, 4], [124, 1], [176, 1], [177, 1], [177, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [179, 1], [178, 2], [178, 3], [187, 1], [187, 1], [188, 2], [188, 3], [186, 1], [186, 2], [180, 1], [180, 2], [181, 5], [190, 3], [190, 1], [192, 1], [192, 4], [182, 5], [183, 3], [183, 2], [184, 5], [184, 7], [184, 6], [199, 1], [199, 1], [201, 1], [201, 0], [200, 2], [200, 3], [185, 2], [185, 2], [185, 2], [185, 3], [185, 2], [185, 2], [24, 1], [24, 1], [24, 1], [207, 2]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */ , $$ /* vstack */ , _$ /* lstack */ ) { /* this == yyval */ var $0 = $$.length - 1; switch (yystate) { case 1: return $$[$0 - 1]; break; case 15: case 16: if ($$[$0] !== null) { yy.state.addAstNode($$[$0]); } break; case 19: this.$ = new AstExpression('ident'); this.$.setLocation(_$[$0]); this.$.primary_expression.identifier = $$[$0]; break; case 20: this.$ = new AstExpression('int'); this.$.setLocation(_$[$0]); this.$.primary_expression.int_constant = $$[$0]; this.$.primary_expression.type = 'int'; break; case 21: this.$ = new AstExpression('float'); this.$.setLocation(_$[$0]); this.$.primary_expression.float_constant = $$[$0]; this.$.primary_expression.type = 'float'; break; case 22: this.$ = new AstExpression('bool'); this.$.setLocation(_$[$0]); this.$.primary_expression.bool_constant = $$[$0]; this.$.primary_expression.type = 'bool'; break; case 23: this.$ = $$[$0 - 1]; this.$.grouped = true; break; case 25: this.$ = new AstExpression('[]', $$[$0 - 3], $$[$0 - 1]); this.$.setLocation(_$[$0 - 3]); break; case 27: this.$ = new AstExpression('.', $$[$0 - 2]); this.$.setLocation(_$[$0 - 2]); this.$.primary_expression.identifier = $$[$0]; break; case 28: this.$ = new AstExpression('x++', $$[$0 - 1]); this.$.setLocation(_$[$0 - 1]); break; case 29: this.$ = new AstExpression('x--', $$[$0 - 1]); this.$.setLocation(_$[$0 - 1]); break; case 38: this.$ = $$[$0 - 1]; this.$.setLocation(_$[$0 - 1]); this.$.expressions.push($$[$0]); break; case 39: this.$ = $$[$0 - 2]; this.$.setLocation(_$[$0 - 2]); this.$.expressions.push($$[$0]); break; case 40: this.$ = new AstFunctionExpression($$[$0 - 1]); this.$.setLocation(_$[$0 - 1]); break; case 41: var callee = new AstExpression($$[$0 - 1]); this.$ = new AstFunctionExpression(callee); this.$.setLocation(_$[$0 - 1]); break; case 51: this.$ = new AstExpression('++x', $$[$0]); this.$.setLocation(_$[$0 - 1]); break; case 52: this.$ = new AstExpression('--x', $$[$0]); this.$.setLocation(_$[$0 - 1]); break; case 53: this.$ = new AstExpression($$[$0 - 1], $$[$0]); this.$.setLocation(_$[$0 - 1]); break; case 54: this.$ = 'POS'; break; case 55: this.$ = 'NEG'; break; case 59: case 60: case 61: case 63: case 64: case 66: case 67: case 69: case 70: case 71: case 72: case 74: case 75: case 77: case 79: case 81: case 83: case 85: case 87: this.$ = new AstExpressionBin($$[$0 - 1], $$[$0 - 2], $$[$0]); this.$.setLocation(_$[$0 - 2]); break; case 89: this.$ = new AstExpression($$[$0 - 3], $$[$0 - 4], $$[$0 - 2], $$[$0]); this.$.setLocation(_$[$0 - 4]); break; case 91: this.$ = new AstExpression($$[$0 - 1], $$[$0 - 2], $$[$0]); this.$.setLocation(_$[$0 - 2]); break; case 103: this.$ = $$[$0]; break; case 104: if ($$[$0 - 2].oper !== $$[$0 - 1]) { this.$ = new AstExpression($$[$0 - 1]); this.$.setLocation(_$[$0 - 2]); this.$.expressions.push($$[$0 - 2]); } else { this.$ = $$[$0 - 2]; } this.$.expressions.push($$[$0]); break; case 106: yy.state.symbols.pop_scope(); this.$ = $$[$0 - 1]; break; case 107: this.$ = $$[$0 - 1]; break; case 108: $$[$0 - 1].precision = $$[$0 - 2]; $$[$0 - 1].is_precision_statement = true; this.$ = $$[$0 - 1]; break; case 112: this.$ = $$[$0 - 1]; this.$.parameters.push($$[$0]); break; case 113: this.$ = $$[$0 - 2]; this.$.parameters.push($$[$0]); break; case 114: this.$ = new AstFunction(); this.$.setLocation(_$[$0 - 2]); this.$.return_type = $$[$0 - 2]; this.$.identifier = $$[$0 - 1]; //Check for duplicates if ($$[$0 - 1] == 'main') { if (yy.state.symbols.get_function($$[$0 - 1])) { var e = new Error("Cannot define main() more than once"); e.lineNumber = _$[$0 - 2].first_line; e.columnNumber = _$[$0 - 2].first_column; throw e; } } this.$.entry = yy.state.symbols.add_function($$[$0 - 1], $$[$0 - 2].specifier.type_name); this.$.entry.Ast = this.$; yy.state.symbols.push_scope(); break; case 115: this.$ = new AstParameterDeclarator(); this.$.setLocation(_$[$0 - 1]); this.$.type = new AstFullySpecifiedType(); this.$.type.setLocation(_$[$0 - 1]); this.$.type.specifier = $$[$0 - 1]; this.$.identifier = $$[$0]; break; case 117: $$[$0 - 2].concat($$[$0 - 1]); this.$ = $$[$0]; this.$.type.qualifier = $$[$0 - 2]; break; case 118: this.$ = $$[$0]; this.$.type.qualifier = $$[$0 - 1]; break; case 119: $$[$0 - 2].concat($$[$0 - 1]); this.$ = new AstParameterDeclarator(); this.$.setLocation(_$[$0 - 2]); this.$.type = new AstFullySpecifiedType(); this.$.type.qualifier = $$[$0 - 2]; this.$.type.specifier = $$[$0]; break; case 120: this.$ = new AstParameterDeclarator(); this.$.setLocation(_$[$0 - 1]); this.$.type = new AstFullySpecifiedType(); this.$.type.qualifier = $$[$0 - 1]; this.$.type.specifier = $$[$0]; break; case 121: this.$ = []; break; case 122: this.$ = ['in']; break; case 123: this.$ = ['out']; break; case 124: this.$ = ['inout']; break; case 127: var decl = new AstDeclaration($$[$0], false); decl.setLocation(_$[$0 - 2]); this.$ = $$[$0 - 2]; this.$.declarations.push(decl); /*yy.state.symbols.add_variable($$[$0]);*/ break; case 129: var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]); decl.setLocation(_$[$0 - 5]); this.$ = $$[$0 - 5]; this.$.declarations.push(decl); /*yy.state.symbols.add_variable($$[$0-3]);*/ break; case 132: var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]); decl.setLocation(_$[$0 - 4]); this.$ = $$[$0 - 4]; this.$.declarations.push(decl); /*yy.state.symbols.add_variable($$[$0-2]);*/ break; case 133: if ($$[$0].specifier.type_specifier !== types.struct) { yy.state.addError("empty declaration list", _$[$0].first_line, _$[$0].first_column); return 0; } this.$ = new AstDeclaratorList($$[$0]); this.$.setLocation(_$[$0]); break; case 134: var decl = new AstDeclaration($$[$0], false); decl.setLocation(_$[$0]); this.$ = new AstDeclaratorList($$[$0 - 1]); this.$.setLocation(_$[$0 - 1]); this.$.declarations.push(decl); break; case 135: var decl = new AstDeclaration($$[$0 - 2], true); decl.setLocation(_$[$0 - 2]); this.$ = new AstDeclaratorList($$[$0 - 3]); this.$.setLocation(_$[$0 - 3]); this.$.declarations.push(decl); break; case 136: var decl = new AstDeclaration($$[$0 - 3], true, $$[$0 - 1]); decl.setLocation(_$[$0 - 3]); this.$ = new AstDeclaratorList($$[$0 - 4]); this.$.setLocation(_$[$0 - 4]); this.$.declarations.push(decl); break; case 137: var decl = new AstDeclaration($$[$0 - 4], true, null, $$[$0]); decl.setLocation(_$[$0 - 4]); this.$ = new AstDeclaratorList($$[$0 - 5]); this.$.setLocation(_$[$0 - 5]); this.$.declarations.push(decl); break; case 138: var decl = new AstDeclaration($$[$0 - 5], true, $$[$0 - 3], $$[$0]); decl.setLocation(_$[$0 - 5]); this.$ = new AstDeclaratorList($$[$0 - 6]); this.$.setLocation(_$[$0 - 6]); this.$.declarations.push(decl); break; case 139: var decl = new AstDeclaration($$[$0 - 2], false, null, $$[$0]); decl.setLocation(_$[$0 - 2]); this.$ = new AstDeclaratorList($$[$0 - 3]); this.$.setLocation(_$[$0 - 3]); this.$.declarations.push(decl); break; case 141: this.$ = new AstFullySpecifiedType(); this.$.setLocation(_$[$0]); this.$.specifier = $$[$0]; break; case 142: this.$ = new AstFullySpecifiedType(); this.$.setLocation(_$[$0 - 1]); this.$.qualifier = $$[$0 - 1]; this.$.specifier = $$[$0]; break; case 143: this.$ = $$[$0 - 1]; break; case 151: case 160: this.$ = ['const']; break; case 161: this.$ = ['attribute']; break; case 162: this.$ = ['varying']; break; case 163: this.$ = ['centroid', 'varying']; break; case 164: this.$ = ['in']; break; case 165: this.$ = ['out']; break; case 166: this.$ = ['centroid', 'in']; break; case 167: this.$ = ['centroid', 'out']; break; case 168: this.$ = ['uniform']; break; case 169: this.$ = $$[$0]; break; case 170: this.$ = $$[$0]; this.$.precision = $$[$0 - 1]; break; case 174: case 175: case 176: this.$ = new AstTypeSpecifier($$[$0]); this.$.setLocation(_$[$0]); break; case 200: this.$ = ast_precision.highp; break; case 201: this.$ = ast_precision.mediump; break; case 202: this.$ = ast_precision.lowp; break; case 203: this.$ = new AstStructSpecifier($$[$0 - 3], $$[$0 - 1]); this.$.setLocation(_$[$0 - 4]); yy.state.symbols.add_type($$[$0 - 3], types._void); break; case 205: this.$ = [$$[$0]]; break; case 206: this.$ = $$[$0 - 1]; this.$.push($$[$0]); break; case 207: var type = new AstFullySpecifiedType(); type.setLocation(_$[$0 - 2]); type.specifier = $$[$0 - 2]; this.$ = new AstDeclaratorList(type); this.$.setLocation(_$[$0 - 2]); this.$.declarations = $$[$0 - 1]; break; case 210: this.$ = new AstDeclaration($$[$0], false); this.$.setLocation(_$[$0]); yy.state.symbols.add_variable($$[$0]); break; case 219: case 220: case 258: this.$ = null; break; case 223: this.$ = new AstCompoundStatement(true); this.$.setLocation(_$[$0 - 1]); break; case 224: yy.state.symbols.push_scope(); this.$ = new AstCompoundStatement(true, $$[$0 - 1]); this.$.setLocation(_$[$0 - 2]); yy.state.symbols.pop_scope(); break; case 228: this.$ = new AstCompoundStatement(false, $$[$0 - 1]); this.$.setLocation(_$[$0 - 2]); break; case 229: if ($$[$0] === null) { yy.state.addError(" statement", _$[$0].first_line, _$[$0].first_column); } else { this.$ = [$$[$0]]; } break; case 230: if ($$[$0] === null) { yy.state.addError(" statement", _$[$0 - 1].first_line, _$[$0 - 1].first_column); } this.$ = $$[$0 - 1]; this.$.push($$[$0]); break; case 232: this.$ = new AstExpressionStatement($$[$0 - 1]); this.$.setLocation(_$[$0 - 1]); break; case 233: this.$ = new AstSelectionStatement($$[$0 - 2], $$[$0].then_statement, $$[$0].else_statement); this.$.setLocation(_$[$0 - 4]); break; case 234: this.$ = {}; this.$.then_statement = $$[$0 - 2]; this.$.else_statement = $$[$0]; break; case 235: this.$.then_statement = $$[$0]; break; case 250: this.$ = new AstJumpStatement('continue'); this.$.setLocation(_$[$0 - 1]); break; case 251: this.$ = new AstJumpStatement('break'); this.$.setLocation(_$[$0 - 1]); break; case 252: this.$ = new AstJumpStatement('return'); this.$.setLocation(_$[$0 - 1]); break; case 253: this.$ = new AstJumpStatement('return', $$[$0 - 1]); this.$.setLocation(_$[$0 - 2]); break; case 254: /* Fragment shader only.*/ this.$ = new AstJumpStatement('discard'); this.$.setLocation(_$[$0 - 1]); break; case 255: this.$ = new AstJumpStatement('debugger'); this.$.setLocation(_$[$0 - 1]); break; case 256: case 257: this.$ = $$[$0]; break; case 259: this.$ = new AstFunctionDefinition(); this.$.setLocation(_$[$0 - 1]); this.$.proto_type = $$[$0 - 1]; this.$.body = $$[$0]; yy.state.symbols.pop_scope(); break; } }, table: [o($V0, [2, 3], { 3: 1, 4: 2, 6: 3, 9: [1, 4] }), { 1: [3] }, { 5: [1, 5] }, o($V0, [2, 10], { 7: 6 }), { 10: [1, 7] }, { 1: [2, 1] }, { 8: 8, 12: 14, 13: $V1, 14: $V2, 15: $V3, 16: $V4, 17: $V5, 18: 9, 21: $V6, 22: [1, 11], 24: 10, 47: $V7, 50: 29, 104: 13, 105: 15, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 207: 12 }, { 11: [1, 78] }, { 5: [2, 2], 12: 14, 13: $V1, 14: $V2, 15: $V3, 16: $V4, 17: $V5, 21: $V6, 24: 79, 47: $V7, 50: 29, 104: 13, 105: 15, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 207: 12 }, o($V0, [2, 11]), o($VL, [2, 15]), { 19: 80, 20: 81, 21: $VM, 25: $VN, 26: $VO }, o($VL, [2, 256]), o($VL, [2, 257]), o($VL, [2, 258]), { 106: $VP, 170: $VQ, 188: 85 }, { 49: [1, 89], 106: [1, 88] }, { 109: 90, 166: $VH, 167: $VI, 168: $VJ }, { 11: [1, 91] }, { 11: [1, 92] }, { 11: [1, 93] }, { 11: [1, 94] }, { 11: [1, 95] }, { 32: [1, 96] }, o($VR, [2, 126]), o($VS, $VT, { 114: 97, 117: 98, 118: 99, 32: [2, 110], 120: $VU, 121: $VV, 122: $VW, 135: $VX }), { 32: [2, 111], 49: [1, 104] }, o($VR, [2, 133], { 19: 105, 20: 106, 21: $VM, 25: $VN, 26: $VO }), o($VS, $VY, { 20: 107, 136: 108, 131: 109, 25: $VN, 26: $VO, 120: $V9, 121: $Va, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk }), o($VZ, $V_), { 21: $V6, 47: $V7, 50: 110, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($V$, [2, 169]), { 21: $V6, 47: $V7, 110: 111, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 169: $VK }, o($VS, [2, 152]), o($VS, [2, 153], { 136: 112, 120: $V9, 121: $Va, 135: $Vg, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk }), o($VS, [2, 155], { 136: 113, 120: $V9, 121: $Va, 135: $Vg, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk }), o($V$, [2, 171], { 34: [1, 114] }), o($V01, [2, 200]), o($V01, [2, 201]), o($V01, [2, 202]), o($VS, [2, 160]), o($VS, [2, 161]), o($VS, [2, 162]), { 120: [1, 116], 121: [1, 117], 138: [1, 115] }, o($VS, [2, 164]), o($VS, [2, 165]), o($VS, [2, 168]), { 30: [1, 118] }, o($V11, [2, 148]), o($V11, [2, 149]), o($V11, [2, 150]), o($V21, [2, 174]), o($V21, [2, 175]), o($V21, [2, 176]), o($V21, $V31), o($V21, [2, 178]), o($V21, [2, 179]), o($V21, [2, 180]), o($V21, [2, 181]), o($V21, [2, 182]), o($V21, [2, 183]), o($V21, [2, 184]), o($V21, [2, 185]), o($V21, [2, 186]), o($V21, [2, 187]), o($V21, [2, 188]), o($V21, [2, 189]), o($V21, [2, 190]), o($V21, [2, 191]), o($V21, [2, 192]), o($V21, [2, 193]), o($V21, [2, 194]), o($V21, [2, 195]), o($V21, [2, 196]), o($V21, [2, 197]), o($V21, [2, 198]), o($V21, [2, 199]), { 19: 119, 20: 81, 21: $VM, 25: $VN, 26: $VO, 170: [1, 120] }, o($V0, [2, 4]), o($VL, [2, 16]), { 23: [1, 121] }, o([11, 23, 32, 34, 49, 92, 106, 170], $V41), o([11, 23, 32, 34, 36, 38, 39, 40, 49, 57, 58, 62, 63, 64, 67, 68, 70, 71, 72, 73, 75, 76, 78, 80, 82, 84, 86, 88, 90, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 106, 170], [2, 13]), o($V51, [2, 17]), o($V51, [2, 18]), o($VL, [2, 259]), o($V61, [2, 106]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 172: [1, 122], 176: 128, 177: 124, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 186: 123, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, o($V61, [2, 107]), { 19: 187, 20: 81, 21: $VM, 25: $VN, 26: $VO }, { 21: $V6, 47: $V7, 110: 188, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 169: $VK }, o($VL, [2, 5]), o($VL, [2, 6]), o($VL, [2, 7]), o($VL, [2, 8]), o($VL, [2, 9]), o([106, 170], [2, 109]), o($Vw1, [2, 112]), o($VS, $VT, { 118: 189, 120: $VU, 121: $VV, 122: $VW }), { 21: $V6, 47: $V7, 50: 192, 109: 32, 110: 31, 116: 190, 119: 191, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o([21, 47, 120, 121, 122, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 151]), o($VS, [2, 122]), o($VS, [2, 123]), o($VS, [2, 124]), o($VS, $VT, { 117: 98, 118: 99, 114: 193, 120: $VU, 121: $VV, 122: $VW, 135: $VX }), o($VR, [2, 134], { 34: [1, 194], 92: [1, 195] }), o([34, 49, 92, 106], $V41, { 30: [1, 196] }), o($VR, [2, 140]), o($VS, [2, 157]), { 120: $V9, 121: $Va, 135: $Vg, 136: 197, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk }, o($VZ, [2, 142]), o($V$, [2, 170]), o($VS, [2, 154]), o($VS, [2, 156]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 36: [1, 198], 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 200, 103: 199, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VS, [2, 163]), o($VS, [2, 166]), o($VS, [2, 167]), { 19: 205, 20: 81, 21: $VM, 25: $VN, 26: $VO, 129: 203, 130: 204 }, { 170: [1, 206] }, { 21: $V6, 47: $V7, 50: 209, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 171: 207, 173: 208 }, { 19: 210, 20: 81, 21: $VM, 25: $VN, 26: $VO }, o($V61, [2, 227]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 172: [1, 211], 176: 128, 177: 212, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, o($Vx1, [2, 229]), o($Vy1, [2, 214]), o($Vy1, [2, 215]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 172: [1, 213], 176: 128, 177: 124, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 186: 214, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, o($Vy1, [2, 216]), o($Vy1, [2, 217]), o($Vy1, [2, 218]), o($Vy1, [2, 219]), o($Vy1, [2, 220]), o($Vy1, [2, 221]), o($Vy1, [2, 222]), o($Vy1, [2, 213]), o($Vy1, [2, 231]), { 49: $Vz1, 106: [1, 215] }, { 30: [1, 217] }, { 30: [1, 218] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 219, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 23: [1, 220] }, { 30: [1, 221] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 176: 128, 177: 222, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, { 30: [1, 223] }, { 106: [1, 224] }, { 106: [1, 225] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 227, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 106: [1, 226], 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 106: [1, 228] }, { 106: [1, 229] }, { 106: $VP }, o($VA1, [2, 103]), o($VA1, [2, 90]), o($VB1, $VC1, { 91: 230, 92: [1, 231], 93: [1, 232], 94: [1, 233], 95: [1, 234], 96: [1, 235], 97: [1, 236], 98: [1, 237], 99: [1, 238], 100: [1, 239], 101: [1, 240], 102: [1, 241] }), o($VA1, [2, 88], { 88: [1, 243], 90: [1, 242] }), o($VD1, [2, 50], { 34: [1, 244], 38: [1, 245], 39: [1, 246], 40: [1, 247] }), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 248, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 249, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 250, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VZ, $V_, { 30: $VE1 }), o($VF1, [2, 86], { 86: $VG1 }), o($VH1, [2, 24]), o($VH1, [2, 26]), o($VI1, [2, 54]), o($VI1, [2, 55]), o($VI1, [2, 56]), o($VI1, [2, 57]), o($VJ1, [2, 84], { 84: $VK1 }), o($VH1, [2, 19], { 30: [1, 254] }), o($VH1, [2, 20]), o($VH1, [2, 21]), o($VH1, [2, 22]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 255, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VH1, [2, 31]), o($VL1, [2, 82], { 82: $VM1 }), o($VH1, [2, 32]), o($VN1, [2, 80], { 80: $VO1 }), { 32: [1, 258], 49: [1, 259] }, { 32: [1, 260] }, o($VP1, [2, 78], { 78: $VQ1 }), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 32: [2, 37], 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: [1, 263], 48: 262, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VR1, [2, 76], { 75: $VS1, 76: $VT1 }), o($VU1, [2, 42]), o($VV1, [2, 73], { 70: $VW1, 71: $VX1, 72: $VY1, 73: $VZ1 }), o($V_1, [2, 68], { 67: $V$1, 68: $V02 }), o($V12, [2, 65], { 57: $V22, 58: $V32 }), o($V42, [2, 62], { 62: $V52, 63: $V62, 64: $V72 }), o($VR, [2, 127], { 34: [1, 277], 92: [1, 278] }), { 106: [1, 279] }, { 21: $V6, 47: $V7, 50: 192, 109: 32, 110: 31, 116: 280, 119: 281, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($Vw1, [2, 118]), o($Vw1, [2, 120]), o($Vw1, [2, 125], { 20: 81, 19: 282, 21: $VM, 25: $VN, 26: $VO }), o($Vw1, [2, 113]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 36: [1, 283], 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 200, 103: 284, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 285, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o([21, 32, 47, 120, 121, 122, 135, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169], [2, 114]), o($VS, [2, 158]), o($V$, [2, 172]), { 36: [1, 287] }, { 36: [2, 105] }, o($VB1, $VC1), { 30: $VE1 }, { 32: [1, 288], 49: [1, 289] }, o($Vw1, [2, 144]), o($Vw1, [2, 146], { 92: [1, 290] }), { 21: $V6, 47: $V7, 50: 209, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 171: 291, 173: 208 }, { 21: $V6, 47: $V7, 50: 209, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 172: [1, 292], 173: 293 }, o($V82, [2, 205]), { 19: 296, 20: 81, 21: $VM, 25: $VN, 26: $VO, 174: 294, 175: 295 }, { 11: [1, 297] }, o($V61, [2, 228]), o($Vx1, [2, 230]), o($Vy1, [2, 223]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 172: [1, 298], 176: 128, 177: 212, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, o($Vy1, [2, 232]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 299, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 300, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 301, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 23: [1, 302], 49: $Vz1 }, o($Vy1, [2, 240]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 304, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 115: 305, 120: $V9, 121: $Va, 125: $V92, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 192: 303 }, { 196: [1, 307] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 176: 310, 180: 309, 199: 308 }, o($Vy1, [2, 250]), o($Vy1, [2, 251]), o($Vy1, [2, 252]), { 49: $Vz1, 106: [1, 311] }, o($Vy1, [2, 254]), o($Vy1, [2, 255]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 312, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VI1, [2, 92]), o($VI1, [2, 93]), o($VI1, [2, 94]), o($VI1, [2, 95]), o($VI1, [2, 96]), o($VI1, [2, 97]), o($VI1, [2, 98]), o($VI1, [2, 99]), o($VI1, [2, 100]), o($VI1, [2, 101]), o($VI1, [2, 102]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 313, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 314, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 316, 33: 155, 35: 315, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 19: 317, 20: 319, 21: $VM, 25: $VN, 26: $VO, 43: 318, 52: 320, 53: 321, 54: 322 }, o($VH1, [2, 28]), o($VH1, [2, 29]), o($VD1, [2, 51]), o($VD1, [2, 52]), o($VD1, [2, 53]), o($VU1, [2, 40]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 323, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 324, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VU1, [2, 41]), { 32: [1, 325], 49: $Vz1 }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 326, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 327, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VH1, [2, 34]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 328, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VH1, [2, 35]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 329, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($Vw1, [2, 38]), o($Va2, $V31, { 32: [2, 36] }), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 330, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 331, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 332, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 333, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 334, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 335, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 336, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 337, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 338, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 339, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 340, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 341, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 342, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 36: [1, 343], 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 200, 103: 344, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 345, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($V61, [2, 108]), o($Vw1, [2, 117]), o($Vw1, [2, 119]), o($Vw1, [2, 115], { 34: [1, 346] }), o($VR, [2, 135], { 92: [1, 347] }), { 36: [1, 348] }, o($VR, [2, 139]), o([32, 49, 106], [2, 212]), o($V$, [2, 173]), o($V11, [2, 143]), { 19: 205, 20: 81, 21: $VM, 25: $VN, 26: $VO, 130: 349 }, { 10: [1, 350] }, { 21: $V6, 47: $V7, 50: 209, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 172: [1, 351], 173: 293 }, o($V21, [2, 204]), o($V82, [2, 206]), { 49: [1, 353], 106: [1, 352] }, o($VR, [2, 208]), o($VR, [2, 210], { 34: [1, 354] }), o($V0, [2, 14]), o($Vy1, [2, 224]), o($VA1, [2, 104]), { 32: [1, 355], 49: $Vz1 }, { 32: [1, 356], 49: $Vz1 }, o($Vy1, [2, 239]), { 32: [1, 357] }, o($Vb2, [2, 236], { 49: $Vz1 }), { 19: 358, 20: 81, 21: $VM, 25: $VN, 26: $VO }, o($VS, $VY, { 136: 108, 131: 109, 120: $V9, 121: $Va, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk }), { 30: [1, 359] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 304, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 106: [2, 247], 109: 32, 110: 31, 115: 305, 120: $V9, 121: $Va, 125: $V92, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 192: 362, 200: 360, 201: 361 }, o($Vc2, [2, 244]), o($Vc2, [2, 245]), o($Vy1, [2, 253]), o($VA1, [2, 91]), { 23: [1, 363], 49: $Vz1 }, o($VF1, [2, 87], { 86: $VG1 }), { 36: [1, 364] }, { 36: [2, 30], 49: $Vz1 }, o($VH1, [2, 27]), o($VH1, [2, 33]), o($VH1, $V41, { 30: [1, 365] }), { 32: [1, 366], 49: [1, 367] }, { 32: [1, 368] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 32: [2, 46], 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: [1, 370], 48: 369, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VJ1, [2, 85], { 84: $VK1 }), o($VL1, [2, 83], { 82: $VM1 }), o($VH1, [2, 23]), o($VN1, [2, 81], { 80: $VO1 }), o($VP1, [2, 79], { 78: $VQ1 }), o($Vw1, [2, 39]), o($VR1, [2, 77], { 75: $VS1, 76: $VT1 }), o($VV1, [2, 74], { 70: $VW1, 71: $VX1, 72: $VY1, 73: $VZ1 }), o($VV1, [2, 75], { 70: $VW1, 71: $VX1, 72: $VY1, 73: $VZ1 }), o($V_1, [2, 69], { 67: $V$1, 68: $V02 }), o($V_1, [2, 70], { 67: $V$1, 68: $V02 }), o($V_1, [2, 71], { 67: $V$1, 68: $V02 }), o($V_1, [2, 72], { 67: $V$1, 68: $V02 }), o($V12, [2, 66], { 57: $V22, 58: $V32 }), o($V12, [2, 67], { 57: $V22, 58: $V32 }), o($V42, [2, 63], { 62: $V52, 63: $V62, 64: $V72 }), o($V42, [2, 64], { 62: $V52, 63: $V62, 64: $V72 }), o($VB1, [2, 59]), o($VB1, [2, 60]), o($VB1, [2, 61]), o($VR, [2, 128], { 92: [1, 371] }), { 36: [1, 372] }, o($VR, [2, 132]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 200, 103: 373, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 374, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VR, [2, 136], { 92: [1, 375] }), o($Vw1, [2, 145]), o($Vw1, [2, 147]), o($V21, [2, 203]), o($V82, [2, 207]), { 19: 296, 20: 81, 21: $VM, 25: $VN, 26: $VO, 175: 376 }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 50: 202, 51: $Vd1, 55: 201, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 200, 103: 377, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 176: 128, 177: 379, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 189: $Vk1, 190: 378, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, { 170: $Vj1, 178: 380 }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $VQ, 176: 128, 179: 383, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 187: 381, 188: 382, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, { 92: [1, 384] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 385, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 32: [1, 386] }, { 106: [1, 387] }, { 106: [2, 246] }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 388, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VH1, [2, 25]), o($VU1, [2, 49]), o($VH1, [2, 43]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 389, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VH1, [2, 44]), o($Vw1, [2, 47]), o($Va2, $V31, { 32: [2, 45] }), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 390, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VR, [2, 129], { 92: [1, 391] }), { 36: [1, 392] }, o($VR, [2, 137]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 393, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VR, [2, 209]), { 36: [1, 394] }, o($Vy1, [2, 233]), o($Vx1, [2, 235], { 191: [1, 395] }), o($Vy1, [2, 238]), o($Vy1, [2, 241]), o($Vy1, [2, 225]), o($Vy1, [2, 226]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 396, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, { 32: [1, 397], 49: $Vz1 }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $VQ, 176: 128, 179: 383, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 187: 398, 188: 382, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 399, 32: [2, 248], 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($VA1, [2, 89]), o($Vw1, [2, 48]), o($VR, [2, 130]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 286, 50: 202, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 109: 32, 110: 31, 124: 400, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK }, o($Vw1, [2, 116]), o($VR, [2, 138]), o($VR, [2, 211]), { 10: $V71, 20: 168, 21: $V6, 25: $VN, 26: $VO, 27: 161, 28: $V81, 29: $V91, 30: $Va1, 31: 137, 33: 155, 37: 162, 39: $Vb1, 40: $Vc1, 41: 173, 42: 175, 44: 177, 45: 178, 46: 180, 47: $V7, 48: 151, 50: 159, 51: $Vd1, 55: 153, 56: 158, 57: $Ve1, 58: $Vf1, 59: $Vg1, 60: $Vh1, 61: 186, 65: 185, 66: 184, 69: 183, 74: 181, 77: 179, 79: 176, 81: 174, 83: 167, 85: 160, 87: 154, 89: 152, 104: 135, 105: 150, 106: $Vi1, 107: 16, 108: $V8, 109: 32, 110: 31, 111: 23, 112: 25, 113: 26, 115: 27, 120: $V9, 121: $Va, 123: 24, 125: $Vb, 126: 30, 127: 34, 128: $Vc, 131: 35, 132: $Vd, 133: $Ve, 134: $Vf, 135: $Vg, 136: 33, 137: $Vh, 138: $Vi, 139: $Vj, 140: $Vk, 141: 36, 142: 51, 143: 52, 144: $Vl, 145: $Vm, 146: $Vn, 147: $Vo, 148: $Vp, 149: $Vq, 150: $Vr, 151: $Vs, 152: $Vt, 153: $Vu, 154: $Vv, 155: $Vw, 156: $Vx, 157: $Vy, 158: $Vz, 159: $VA, 160: $VB, 161: $VC, 162: $VD, 163: $VE, 164: $VF, 165: $VG, 166: $VH, 167: $VI, 168: $VJ, 169: $VK, 170: $Vj1, 176: 128, 177: 401, 178: 125, 179: 126, 180: 129, 181: 130, 182: 131, 183: 132, 184: 133, 185: 134, 189: $Vk1, 193: $Vl1, 194: $Vm1, 195: $Vn1, 196: $Vo1, 197: $Vp1, 198: $Vq1, 202: $Vr1, 203: $Vs1, 204: $Vt1, 205: $Vu1, 206: $Vv1 }, o($Vb2, [2, 237]), { 106: [1, 402] }, o($Vy1, [2, 243]), { 32: [2, 249], 49: $Vz1 }, o($VR, [2, 131]), o($Vy1, [2, 234]), o($Vy1, [2, 242])], defaultActions: { 5: [2, 1], 200: [2, 105], 362: [2, 246] }, parseError: function parseError(str, hash) { if (hash.recoverable) { this.trace(str); } else { throw new Error(str); } }, parse: function parse(input) { var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; var args = lstack.slice.call(arguments, 1); var lexer = Object.create(this.lexer); var sharedState = { yy: {} }; for (var k in this.yy) { if (Object.prototype.hasOwnProperty.call(this.yy, k)) { sharedState.yy[k] = this.yy[k]; } } lexer.setInput(input, sharedState.yy); sharedState.yy.lexer = lexer; sharedState.yy.parser = this; if (typeof lexer.yylloc == 'undefined') { lexer.yylloc = {}; } var yyloc = lexer.yylloc; lstack.push(yyloc); var ranges = lexer.options && lexer.options.ranges; if (typeof sharedState.yy.parseError === 'function') { this.parseError = sharedState.yy.parseError; } else { this.parseError = Object.getPrototypeOf(this).parseError; } function popStack(n) { stack.length = stack.length - 2 * n; vstack.length = vstack.length - n; lstack.length = lstack.length - n; } function lex() { var token; token = lexer.lex() || EOF; if (typeof token !== 'number') { token = self.symbols_[token] || token; } return token; } var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; while (true) { state = stack[stack.length - 1]; if (this.defaultActions[state]) { action = this.defaultActions[state]; } else { if (symbol === null || typeof symbol == 'undefined') { symbol = lex(); } action = table[state] && table[state][symbol]; } if (typeof action === 'undefined' || !action.length || !action[0]) { var errStr = ''; expected = []; for (p in table[state]) { if (this.terminals_[p] && p > TERROR) { expected.push('\'' + this.terminals_[p] + '\''); } } if (lexer.showPosition) { errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; } else { errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); } this.parseError(errStr, { text: lexer.match, token: this.terminals_[symbol] || symbol, line: lexer.yylineno, loc: yyloc, expected: expected }); } if (action[0] instanceof Array && action.length > 1) { throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); } switch (action[0]) { case 1: stack.push(symbol); vstack.push(lexer.yytext); lstack.push(lexer.yylloc); stack.push(action[1]); symbol = null; if (!preErrorSymbol) { yyleng = lexer.yyleng; yytext = lexer.yytext; yylineno = lexer.yylineno; yyloc = lexer.yylloc; if (recovering > 0) { recovering--; } } else { symbol = preErrorSymbol; preErrorSymbol = null; } break; case 2: len = this.productions_[action[1]][1]; yyval.$ = vstack[vstack.length - len]; yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column }; if (ranges) { yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]]; } r = this.performAction.apply(yyval, [yytext, yyleng, yylineno, sharedState.yy, action[1], vstack, lstack].concat(args)); if (typeof r !== 'undefined') { return r; } if (len) { stack = stack.slice(0, -1 * len * 2); vstack = vstack.slice(0, -1 * len); lstack = lstack.slice(0, -1 * len); } stack.push(this.productions_[action[1]][0]); vstack.push(yyval.$); lstack.push(yyval._$); newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; stack.push(newState); break; case 3: return true; } } return true; } }; function Parser() { this.yy = {}; } Parser.prototype = parser; parser.Parser = Parser; return new Parser(); }(); if (typeof commonjsRequire !== 'undefined' && 'object' !== 'undefined') { exports.parser = parser; exports.Parser = parser.Parser; exports.parse = function () { return parser.parse.apply(parser, arguments); }; } /* generated by jison-lex 0.3.4 */ var lexer = function () { var lexer = { EOF: 1, parseError: function parseError(str, hash) { if (this.yy.parser) { this.yy.parser.parseError(str, hash); } else { throw new Error(str); } }, // resets the lexer, sets new input setInput: function setInput(input, yy) { this.yy = yy || this.yy || {}; this._input = input; this._more = this._backtrack = this.done = false; this.yylineno = this.yyleng = 0; this.yytext = this.matched = this.match = ''; this.conditionStack = ['INITIAL']; this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 }; if (this.options.ranges) { this.yylloc.range = [0, 0]; } this.offset = 0; return this; }, // consumes and returns one char from the input input: function input() { var ch = this._input[0]; this.yytext += ch; this.yyleng++; this.offset++; this.match += ch; this.matched += ch; var lines = ch.match(/(?:\r\n?|\n).*/g); if (lines) { this.yylineno++; this.yylloc.last_line++; } else { this.yylloc.last_column++; } if (this.options.ranges) { this.yylloc.range[1]++; } this._input = this._input.slice(1); return ch; }, // unshifts one char (or a string) into the input unput: function unput(ch) { var len = ch.length; var lines = ch.split(/(?:\r\n?|\n)/g); this._input = ch + this._input; this.yytext = this.yytext.substr(0, this.yytext.length - len); //this.yyleng -= len; this.offset -= len; var oldLines = this.match.split(/(?:\r\n?|\n)/g); this.match = this.match.substr(0, this.match.length - 1); this.matched = this.matched.substr(0, this.matched.length - 1); if (lines.length - 1) { this.yylineno -= lines.length - 1; } var r = this.yylloc.range; this.yylloc = { first_line: this.yylloc.first_line, last_line: this.yylineno + 1, first_column: this.yylloc.first_column, last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len }; if (this.options.ranges) { this.yylloc.range = [r[0], r[0] + this.yyleng - len]; } this.yyleng = this.yytext.length; return this; }, // When called from action, caches matched text and appends it on next action more: function more() { this._more = true; return this; }, // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. reject: function reject() { if (this.options.backtrack_lexer) { this._backtrack = true; } else { return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { text: "", token: null, line: this.yylineno }); } return this; }, // retain first n characters of the match less: function less(n) { this.unput(this.match.slice(n)); }, // displays already matched input, i.e. for error messages pastInput: function pastInput() { var past = this.matched.substr(0, this.matched.length - this.match.length); return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, ""); }, // displays upcoming input, i.e. for error messages upcomingInput: function upcomingInput() { var next = this.match; if (next.length < 20) { next += this._input.substr(0, 20 - next.length); } return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); }, // displays the character position where the lexing error occurred, i.e. for error messages showPosition: function showPosition() { var pre = this.pastInput(); var c = new Array(pre.length + 1).join("-"); return pre + this.upcomingInput() + "\n" + c + "^"; }, // test the lexed token: return FALSE when not a match, otherwise return token test_match: function test_match(match, indexed_rule) { var token, lines, backup; if (this.options.backtrack_lexer) { // save context backup = { yylineno: this.yylineno, yylloc: { first_line: this.yylloc.first_line, last_line: this.last_line, first_column: this.yylloc.first_column, last_column: this.yylloc.last_column }, yytext: this.yytext, match: this.match, matches: this.matches, matched: this.matched, yyleng: this.yyleng, offset: this.offset, _more: this._more, _input: this._input, yy: this.yy, conditionStack: this.conditionStack.slice(0), done: this.done }; if (this.options.ranges) { backup.yylloc.range = this.yylloc.range.slice(0); } } lines = match[0].match(/(?:\r\n?|\n).*/g); if (lines) { this.yylineno += lines.length; } this.yylloc = { first_line: this.yylloc.last_line, last_line: this.yylineno + 1, first_column: this.yylloc.last_column, last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length }; this.yytext += match[0]; this.match += match[0]; this.matches = match; this.yyleng = this.yytext.length; if (this.options.ranges) { this.yylloc.range = [this.offset, this.offset += this.yyleng]; } this._more = false; this._backtrack = false; this._input = this._input.slice(match[0].length); this.matched += match[0]; token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); if (this.done && this._input) { this.done = false; } if (token) { return token; } else if (this._backtrack) { // recover context for (var k in backup) { this[k] = backup[k]; } return false; // rule action called reject() implying the next rule should be tested instead. } return false; }, // return next match in input next: function next() { if (this.done) { return this.EOF; } if (!this._input) { this.done = true; } var token, match, tempMatch, index; if (!this._more) { this.yytext = ''; this.match = ''; } var rules = this._currentRules(); for (var i = 0; i < rules.length; i++) { tempMatch = this._input.match(this.rules[rules[i]]); if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { match = tempMatch; index = i; if (this.options.backtrack_lexer) { token = this.test_match(tempMatch, rules[i]); if (token !== false) { return token; } else if (this._backtrack) { match = false; continue; // rule action called reject() implying a rule MISmatch. } else { // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) return false; } } else if (!this.options.flex) { break; } } } if (match) { token = this.test_match(match, rules[index]); if (token !== false) { return token; } // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) return false; } if (this._input === "") { return this.EOF; } else { return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno }); } }, // return next match that has a token lex: function lex() { var r = this.next(); if (r) { return r; } else { return this.lex(); } }, // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) begin: function begin(condition) { this.conditionStack.push(condition); }, // pop the previously active lexer condition state off the condition stack popState: function popState() { var n = this.conditionStack.length - 1; if (n > 0) { return this.conditionStack.pop(); } else { return this.conditionStack[0]; } }, // produce the lexer rule set which is active for the currently active lexer condition state _currentRules: function _currentRules() { if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; } else { return this.conditions["INITIAL"].rules; } }, // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available topState: function topState(n) { n = this.conditionStack.length - 1 - Math.abs(n || 0); if (n >= 0) { return this.conditionStack[n]; } else { return "INITIAL"; } }, // alias for begin(condition) pushState: function pushState(condition) { this.begin(condition); }, // return the number of states currently on the stack stateStackSize: function stateStackSize() { return this.conditionStack.length; }, options: { "moduleName": "" }, performAction: function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) { var YYSTATE = YY_START; switch ($avoiding_name_collisions) { case 0: ; break; case 1: break; case 2: this.begin('PP'); return 'VERSION'; break; case 3: this.begin('PP'); return 'EXTENSION'; break; case 4: /* Eat characters until the first digit is * encountered */ var ptr = 0; while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') { ptr++; } /* Subtract one from the line number because * yy_.yylineno is zero-based instead of * one-based. */ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1; yy_.yylloc.source = parseInt(yy_.yytext.slice(0), 10); break; case 5: /* Eat characters until the first digit is * encountered */ var ptr = 0; while (yy_.yytext.slice(0, 1) < '0' || yy_.yytext.slice(0, 1) > '9') { ptr++; } /* Subtract one from the line number because * yy_.yylineno is zero-based instead of * one-based. */ yy_.yylineno = parseInt(yy_.yytext.slice(0, 1), 10) - 1; break; case 6: this.begin('PP'); return 'PRAGMA_DEBUG_ON'; break; case 7: this.begin('PP'); return 'PRAGMA_DEBUG_OFF'; break; case 8: this.begin('PP'); return 'PRAGMA_OPTIMIZE_ON'; break; case 9: this.begin('PP'); return 'PRAGMA_OPTIMIZE_OFF'; break; case 10: this.begin('PP'); return 'PRAGMA_INVARIANT_ALL'; break; case 11: this.begin('PRAGMA'); break; case 12: this.begin('INITIAL'); yy_.yylineno++; yycolumn = 0; break; case 13: break; case 14: break; case 15: break; case 16: return ":"; break; case 17: yylval.identifier = strdup(yy_.yytext); return 'IDENTIFIER'; break; case 18: yylval.n = parseInt(yy_.yytext); return 'INTCONSTANT'; break; case 19: this.begin('INITIAL'); yy_.yylineno++; yycolumn = 0; return 'EOL'; break; case 20: /*yy_.yylineno++; yycolumn = 0;*/ break; case 21: return 'ATTRIBUTE'; break; case 22: return 'CONST'; break; case 23: return 'BOOL'; break; case 24: return 'FLOAT'; break; case 25: return 'INT'; break; case 26: return 'BREAK'; break; case 27: return 'CONTINUE'; break; case 28: return 'DO'; break; case 29: return 'WHILE'; break; case 30: return 'ELSE'; break; case 31: return 'FOR'; break; case 32: return 'IF'; break; case 33: return 'DISCARD'; break; case 34: return 'RETURN'; break; case 35: return 'DEBUGGER'; break; case 36: return 'BVEC2'; break; case 37: return 'BVEC3'; break; case 38: return 'BVEC4'; break; case 39: return 'IVEC2'; break; case 40: return 'IVEC3'; break; case 41: return 'IVEC4'; break; case 42: return 'VEC2'; break; case 43: return 'VEC3'; break; case 44: return 'VEC4'; break; case 45: return 'MAT2X2'; break; case 46: return 'MAT3X3'; break; case 47: return 'MAT4X4'; break; case 48: return 'IN'; break; case 49: return 'OUT'; break; case 50: return 'INOUT'; break; case 51: return 'UNIFORM'; break; case 52: return 'VARYING'; break; case 53: return 'INVARIANT'; break; case 54: return 'FLAT'; break; case 55: return 'SMOOTH'; break; case 56: return 'SAMPLER1D'; break; case 57: return 'SAMPLER2D'; break; case 58: return 'SAMPLER3D'; break; case 59: return 'SAMPLERCUBE'; break; case 60: return 'SAMPLER1DSHADOW'; break; case 61: return 'SAMPLER2DSHADOW'; break; case 62: return 'STRUCT'; break; case 63: return 'VOID'; break; case 64: /*copy manually*/ break; case 65: return '++'; break; case 66: return '--'; break; case 67: return '<='; break; case 68: return '>='; break; case 69: return '=='; break; case 70: return '!='; break; case 71: return '&&'; break; case 72: return '||'; break; case 73: return '^^'; break; case 74: return '<<'; break; case 75: return '>>'; break; case 76: return '*='; break; case 77: return '/='; break; case 78: return '+='; break; case 79: return '%='; break; case 80: return '<<='; break; case 81: return '>>='; break; case 82: return '&='; break; case 83: return '^='; break; case 84: return '|='; break; case 85: return '-='; break; case 86: this.yylval = parseFloat(yy_.yytext); return 'FLOATCONSTANT'; break; case 87: this.yylval = parseFloat(yy_.yytext); return 'FLOATCONSTANT'; break; case 88: this.yylval = parseFloat(yy_.yytext); return 'FLOATCONSTANT'; break; case 89: this.yylval = parseFloat(yy_.yytext); return 'FLOATCONSTANT'; break; case 90: this.yylval = parseFloat(yy_.yytext); return 'FLOATCONSTANT'; break; case 91: this.yylval = parseInt(yy_.yytext + 2, 16); return 'INTCONSTANT'; break; case 92: this.yylval = parseInt(yy_.yytext, 8); return 'INTCONSTANT'; break; case 93: this.yylval = parseInt(yy_.yytext); return 'INTCONSTANT'; break; case 94: this.yylval = 1; return 'BOOLCONSTANT'; break; case 95: this.yylval = 0; return 'BOOLCONSTANT'; break; case 96: return 'ASM'; break; case 97: return 'CLASS'; break; case 98: return 'UNION'; break; case 99: return 'ENUM'; break; case 100: return 'TYPEDEF'; break; case 101: return 'TEMPLATE'; break; case 102: return 'THIS'; break; case 103: return 'PACKED'; break; case 104: return 'GOTO'; break; case 105: return 'SWITCH'; break; case 106: return 'DEFAULT'; break; case 107: return 'INLINE'; break; case 108: return 'NOINLINE'; break; case 109: return 'VOLATILE'; break; case 110: return 'PUBLIC'; break; case 111: return 'STATIC'; break; case 112: return 'EXTERN'; break; case 113: return 'EXTERNAL'; break; case 114: return 'INTERFACE'; break; case 115: return 'LONG'; break; case 116: return 'SHORT'; break; case 117: return 'DOUBLE'; break; case 118: return 'HALF'; break; case 119: return 'FIXED'; break; case 120: return 'UNSIGNED'; break; case 121: return 'INPUT'; break; case 122: return 'OUTPUT'; break; case 123: return 'HVEC2'; break; case 124: return 'HVEC3'; break; case 125: return 'HVEC4'; break; case 126: return 'DVEC2'; break; case 127: return 'DVEC3'; break; case 128: return 'DVEC4'; break; case 129: return 'FVEC2'; break; case 130: return 'FVEC3'; break; case 131: return 'FVEC4'; break; case 132: return 'SAMPLER2DRECT'; break; case 133: return 'SAMPLER3DRECT'; break; case 134: return 'SAMPLER2DRECTSHADOW'; break; case 135: return 'SIZEOF'; break; case 136: return 'CAST'; break; case 137: return 'NAMESPACE'; break; case 138: return 'USING'; break; case 139: return 'LOWP'; break; case 140: return 'MEDIUMP'; break; case 141: return 'HIGHP'; break; case 142: return 'PRECISION'; break; case 143: yy.yylval = yy_.yytext; return yy.state.classify_identifier(yy.state, yy_.yytext); break; case 144: return yy_.yytext; break; case 145: return 'EOF'; break; } }, rules: [/^(?:[ \r\t]+)/, /^(?:[ \t]*#[ \t]*$)/, /^(?:[ \t]*#[ \t]*version\b)/, /^(?:[ \t]*#[ \t]*extension\b)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:(^([ \t]*)([ \t]*))line([ \t]+)((([1-9][0-9]*)|([xX][0-9a-fA-F]+)|([0-7]*)))([ \t]*)$)/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)debug([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)on([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)optimize([ \t]*)\(([ \t]*)off([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+)STDGL([ \t]+)invariant([ \t]*)\(([ \t]*)all([ \t]*)\))/, /^(?:([ \t]*)#([ \t]*)pragma([ \t]+))/, /^(?:[\n])/, /^(?:.)/, /^(?:\/\/[^\n]*)/, /^(?:[ \t\r]*)/, /^(?::)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:[1-9][0-9]*)/, /^(?:[\n])/, /^(?:[\n])/, /^(?:attribute\b)/, /^(?:const\b)/, /^(?:bool\b)/, /^(?:float\b)/, /^(?:int\b)/, /^(?:break\b)/, /^(?:continue\b)/, /^(?:do\b)/, /^(?:while\b)/, /^(?:else\b)/, /^(?:for\b)/, /^(?:if\b)/, /^(?:discard\b)/, /^(?:return\b)/, /^(?:debugger\b)/, /^(?:bvec2\b)/, /^(?:bvec3\b)/, /^(?:bvec4\b)/, /^(?:ivec2\b)/, /^(?:ivec3\b)/, /^(?:ivec4\b)/, /^(?:vec2\b)/, /^(?:vec3\b)/, /^(?:vec4\b)/, /^(?:mat2\b)/, /^(?:mat3\b)/, /^(?:mat4\b)/, /^(?:in\b)/, /^(?:out\b)/, /^(?:inout\b)/, /^(?:uniform\b)/, /^(?:varying\b)/, /^(?:invariant\b)/, /^(?:flat\b)/, /^(?:smooth\b)/, /^(?:sampler1D\b)/, /^(?:sampler2D\b)/, /^(?:sampler3D\b)/, /^(?:samplerCube\b)/, /^(?:sampler1DShadow\b)/, /^(?:sampler2DShadow\b)/, /^(?:struct\b)/, /^(?:void\b)/, /^(?:layout\b)/, /^(?:\+\+)/, /^(?:--)/, /^(?:<=)/, /^(?:>=)/, /^(?:==)/, /^(?:!=)/, /^(?:&&)/, /^(?:\|\|)/, /^(?:\^\^)/, /^(?:<<)/, /^(?:>>)/, /^(?:\*=)/, /^(?:\/=)/, /^(?:\+=)/, /^(?:%=)/, /^(?:<<=)/, /^(?:>>=)/, /^(?:&=)/, /^(?:\^=)/, /^(?:\|=)/, /^(?:-=)/, /^(?:[0-9]+\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:\.[0-9]+([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+\.([eE][+-]?[0-9]+)?[fF]?)/, /^(?:[0-9]+[eE][+-]?[0-9]+[fF]?)/, /^(?:[0-9]+[fF])/, /^(?:0[xX][0-9a-fA-F]+)/, /^(?:0[0-7]*)/, /^(?:[1-9][0-9]*)/, /^(?:true\b)/, /^(?:false\b)/, /^(?:asm\b)/, /^(?:class\b)/, /^(?:union\b)/, /^(?:enum\b)/, /^(?:typedef\b)/, /^(?:template\b)/, /^(?:this\b)/, /^(?:packed\b)/, /^(?:goto\b)/, /^(?:switch\b)/, /^(?:default\b)/, /^(?:inline\b)/, /^(?:noinline\b)/, /^(?:volatile\b)/, /^(?:public\b)/, /^(?:static\b)/, /^(?:extern\b)/, /^(?:external\b)/, /^(?:interface\b)/, /^(?:long\b)/, /^(?:short\b)/, /^(?:double\b)/, /^(?:half\b)/, /^(?:fixed\b)/, /^(?:unsigned\b)/, /^(?:input\b)/, /^(?:output\b)/, /^(?:hvec2\b)/, /^(?:hvec3\b)/, /^(?:hvec4\b)/, /^(?:dvec2\b)/, /^(?:dvec3\b)/, /^(?:dvec4\b)/, /^(?:fvec2\b)/, /^(?:fvec3\b)/, /^(?:fvec4\b)/, /^(?:sampler2DRect\b)/, /^(?:sampler3DRect\b)/, /^(?:sampler2DRectShadow\b)/, /^(?:sizeof\b)/, /^(?:cast\b)/, /^(?:namespace\b)/, /^(?:using\b)/, /^(?:lowp\b)/, /^(?:mediump\b)/, /^(?:highp\b)/, /^(?:precision\b)/, /^(?:[_a-zA-Z][_a-zA-Z0-9]*)/, /^(?:.)/, /^(?:$)/], conditions: { "PRAGMA": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145], "inclusive": true }, "PP": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145], "inclusive": true }, "INITIAL": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145], "inclusive": true } } }; return lexer; }(); /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * GLSL Parser Class */ function GlslParser() { //Jison Global this.jison = parser; this.jison.lexer = lexer; } var proto = GlslParser.prototype; /** * Parse Program */ proto.parse = function (state) { var result; this.jison.yy = { test: 1, state: state }; try { this.jison.parse(state.getTranslationUnit()); } catch (e) { state.addError(e.message, e.lineNumber, e.columnNumber); return false; } return true; }; glsl.parser = new GlslParser(); /** * External Parse * * @param string src Source code * @param object options Compilation options * * @return object */ glsl.parse = function (src, options) { var state, result, irs; state = new GlslState(options); state.setSource(src); //Preprocess result = this.preprocessor.process(state); //Parse into AST if (result) { result = this.parser.parse(state); } if (result) { state.status = true; } return state; }; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Constructs a program's object code from an ast and symbol table * * @param string The error message * @param AstNode The error AstNode * * @return string */ glsl.generate = function (state) { var irs, ast, i, main; irs = new Ir(state.options.target); ast = state.getAst(); try { for (i = 0; i < ast.length; i++) { ast[i].ir(state, irs); } main = state.symbols.get_function('main'); //Accept main, but warn if params not void if (main.definition.join(",") !== "void") { state.addWarning("main() should take no parameters"); } state.symbols.add_variable("", irs.getTemp(main.getType().slots)); if (main.type != 'void') { state.addWarning("main() should be type void"); } if (!main) { state.addError("main() is not defined"); return false; } main.Ast.body.ir(state, irs); } catch (e) { if (!e.ir) { e.message = "compiler error: " + e.message; } state.addError(e.message, e.lineNumber, e.columnNumber); return false; } state.setIR(irs); return true; }; /** * Constructs an error message * * @param string The error message * @param AstNode The error AstNode * * @return string */ AstNode.prototype.ir_error = function (message) { var e = new IrError(); if (this.location) { e.lineNumber = this.location.first_line; e.columnNumber = this.location.first_column; e.message = message; } throw e; }; /** * Default IR */ AstNode.prototype.irx = function (state, irs) { this.ir_error(util.format("Can't generate ir for %s", this.typeOf())); }; /** * Constructs a type specifier code block * * @param object state parser state */ AstTypeSpecifier.prototype.ir = function (state, irs) { if (this.is_precision_statement) { return; } // this.ir_error("Cannot generate type specifier"); }; /** * Constructs a declaration list * * @param object state GLSL state * @param object irs IR representation */ AstDeclaratorList.prototype.ir = function (state, irs) { var i; for (i = 0; i < this.declarations.length; i++) { this.declarations[i].ir(state, irs, this.type); } }; /** * Constructs a declaration * * @param object state GLSL state * @param object irs IR representation */ AstDeclaration.prototype.ir = function (state, irs, type) { var qualifier, name, entry, constant, assign, lhs, size; if (type.qualifier) { qualifier = type.qualifier; } name = this.identifier; //add symbol table entry entry = state.symbols.add_variable(name); entry.type = type.specifier.type_name; entry.qualifier = qualifier; if (qualifier.indexOf('uniform') !== -1) { entry.out = irs.getUniform(entry); } else if (qualifier.indexOf('attribute') !== -1) { entry.out = irs.getAttribute(entry); } else if (qualifier.indexOf('varying') !== -1) { entry.out = irs.getVarying(entry); } else { entry.out = irs.getTemp(entry.getType().slots); } constant = qualifier === 'const'; if (this.is_array) { this.array_size.ir(state, irs); if (this.array_size.Type != 'int') { this.ir_error("array size must be an integer"); } if (!this.array_size.Const) { this.ir_error("array size must be constant"); } size = parseInt(this.array_size.Dest); if (size < 1) { this.ir_error("array size cannot be less than 1"); } entry.size = size; //Change the type of the entry so that expressions without indexing will fail entry.base_type = entry.type; entry.type += '[]'; } if (this.initializer) { //@todo: generate constants at compile time (this may be able to be taken care of in the generator) if (constant) {//entry.constant = this.initializer.Dest; } else { lhs = new AstExpression('ident'); lhs.primary_expression.identifier = name; assign = new AstExpression('=', lhs, this.initializer); assign.setLocation(this.location); assign.ir(state, irs); } } else { if (constant) { this.ir_error("Declaring const without initialier"); } } }; /** * Constructs a function definition block * * @param object state GLSL state * @param object irs IR representation */ AstFunctionDefinition.prototype.ir = function (state, irs) { //handle function proto this.proto_type.ir(state, irs); this.proto_type.entry.Ast = this; }; /** * Constructs a function header code block * * @param object state GLSL state * @param object irs IR representation */ AstFunction.prototype.ir = function (state, irs) { var i; if (this.parameters.length == 0) { this.entry.definition.push('void'); } //generate param list for (i = 0; i < this.parameters.length; i++) { this.entry.definition.push(this.parameters[i].type.specifier.type_name); } }; /** * Constructs a compound statement code block * * @param object state GLSL state * @param object irs IR representation */ AstCompoundStatement.prototype.ir = function (state, irs) { var i, stmt, retd_entry, maybe_returned; retd_entry = state.symbols.get_variable(""); maybe_returned = false; for (i = 0; i < this.statements.length; i++) { stmt = this.statements[i]; stmt.ir(state, irs); if (stmt instanceof AstJumpStatement && stmt.mode == 'return') { //Returning from block, set return status, and skip following instructions in block (unreachable) retd_entry.Passed = true; irs.push(new IrInstruction("MOV", retd_entry.out + ".x", "1.0")); break; } if (!maybe_returned && retd_entry.Passed) { maybe_returned = true; irs.push(new IrInstruction("IF", retd_entry.out + ".x")); } } if (maybe_returned) { irs.push(new IrInstruction("ENDIF")); } }; /** * Constructs an expression statement code block * * @param object state GLSL state * @param object irs IR representation */ AstExpressionStatement.prototype.ir = function (state, irs) { this.expression.ir(state, irs); }; /** * Constructs an expression code block * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir = function (state, irs) { var i; //simple (variable, or value) for (i in this.primary_expression) { return this.ir_simple(state, irs); } //operator if (this.oper) { return this.ir_op(state, irs); } //cast if (this.constructor.name == 'AstTypeSpecifier') { this.Type = this.type_specifier; return; } this.ir_error("Could not translate unknown expression type"); }; /** * Constructs an operator expression code block * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_op = function (state, irs) { var se, temp, ops; if (se = this.subexpressions) { se[0] ? se[0].ir(state, irs) : null; se[1] ? se[1].ir(state, irs) : null; se[2] ? se[2].ir(state, irs) : null; } switch (this.oper) { //case '+=': case '=': this.ir_assign(state, irs); break; case 'POS': //useless this.Dest = se[0].Dest; this.Type = se[0].Type; break; case 'NEG': if (se[0].Dest.substring(0, 1) != '-') { this.Dest = "-" + se[0].Dest; } else { this.Dest = se[0].Dest.substring(1); } this.Type = se[0].Type; if (se[0].Const) { this.Const = se[0].Const; } break; //Arithmetic case '+': case '-': case '*': case '/': case '%': case '&': case '^': case '|': case '~': case '<<': case '>>': this.ir_generate(state, irs, 2, true); break; //Boolean case '<': case '>': case '<=': case '>=': case '==': case '!=': case '&&': case '^^': case '||': this.ir_generate(state, irs, 2); break; case '!': this.ir_generate(state, irs, 1); break; /* case '*=': case '/=': case '%=': case '+=': case '-=': case '<<=': case '>>=': case '&=': case '^=': case '|=': break; case '?:': break; */ //Increment / Decrement case '++x': case '--x': case 'x++': case 'x--': this.ir_incdec(state, irs); break; //case '.': break; case '[]': this.ir_arr_index(state, irs); break; /* case 'VAR': case 'int': case 'float': case 'bool': ir_expression_simple(e, se); break; */ default: this.ir_error(util.format("Could not translate unknown expression %s (%s)", this, this.oper)); } }; /** * Constructs an assignment expression * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_assign = function (state, irs, skip_comment /*, local*/ ) { var cond, ir, temp, size, slots, swz, i, entry, lhs, rhs, com; lhs = this.subexpressions[0]; rhs = this.subexpressions[1]; if (lhs.Type != rhs.Type || rhs.Const) { this.ir_cast.apply(rhs, [state, irs, lhs.Type]); } this.Type = lhs.Type; if (lhs.Entry && lhs.Entry.constant) { this.ir_error(util.format("Cannot assign value to constant %s", lhs.Dest)); } if (!skip_comment) { com = util.format("%s => %s %s <%s>", rhs.Dest, lhs.Type, lhs.Dest, lhs.toString()); irs.push(new IrComment(com, this.location)); } size = types[this.Type].size; slots = types[this.Type].slots; //get the swizzle for each slot swz = Ir.swizzles[0].substring(0, 4 - (slots * 4 - size) / slots); //all components are used up in all slots if (swz == Ir.swizzles[0]) { swz = ""; } for (i = 0; i < slots; i++) { /* if (cond && !local) { ir = new IR('CMP', se[0].Dest, "-" + cond, se[1].Dest, se[0].Dest); ir.addOffset(i); ir.setSwizzle(swz); irs.push(ir); } else { */ ir = new IrInstruction('MOV', lhs.Dest, rhs.Dest); ir.addOffset(i); ir.setSwizzle(swz); irs.push(ir); /* } */ } }; /** * Constructs a cast operation */ AstExpression.prototype.ir_cast = function (state, irs, type) { //Can cast to type? if (Type.canCast(this.Type, type)) { //Simple case, constant if (this.Const) { this.Dest = Type.castTo(this.Dest, this.Type, type); this.Type = type; } else { //@todo: generate cast instructions this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type)); } } else { this.ir_error(util.format("Could not assign value of type %s to %s", this.Type, type)); } }; /** * Constructs a simple expression code block * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_simple = function (state, irs) { var name, entry, t; if (this.oper == '.') { this.ir_field(state, irs); return; } //identifier if (name = this.primary_expression.identifier) { //lookup identifier in symbol table entry = state.symbols.get_variable(name) || state.symbols.get_function(name); if (!entry /*|| !entry.type*/ ) { this.ir_error(util.format("%s is undefined", name)); } this.Type = entry.type; this.Entry = entry; if (entry.constant) { this.Dest = entry.constant; } else { this.Dest = entry.out; } return; } //float constant if (this.primary_expression.type == 'float') { this.Type = 'float'; this.Dest = this.primary_expression.float_constant; this.Const = true; return; } //int constant if (this.primary_expression.type == 'int') { this.Type = 'int'; this.Dest = this.primary_expression.int_constant; this.Const = true; return; } this.ir_error("Cannot translate unknown simple expression type"); }; /** * Constructs the code for an expression * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_generate = function (state, irs, len, arith) { var table, se, oprd_types, dest, i, j, def, match, comment, cnst; if (!(table = builtin.oper[this.oper])) { this.ir_error(util.format("Could not generate operation %s", this.oper)); } se = this.subexpressions; //Fold constants if (state.options.opt.fold_constants && arith) { if (se[0].Const && se[1].Const) { cnst = eval(se[0].Dest + this.oper + se[1].Dest); //If the calculation results in an error, resume normal IR generation and let it be handled at runtime if (Number.isFinite(cnst)) { this.Dest = "" + cnst; this.Type = 'float'; this.Const = true; return; } } } oprd_types = []; dest = []; for (i = 0; i < len; i++) { oprd_types.push(se[i].Type); dest.push(se[i].Dest); } def = new RegExp(oprd_types.join(",") + "\:(.*)"); for (j in table) { if (match = j.match(def)) { break; } } if (!match) { this.ir_error(util.format("Could not apply operation %s to %s", this.oper, oprd_types.join(", "))); } this.Type = match[1]; this.Dest = irs.getTemp(types[this.Type].slots); dest.splice(0, 0, this.Dest); if (len <= 4) {//this.Dest += util.format(".%s", swizzles[0].substring(0, glsl.type.size[this.Type])); } if (len == 1) { comment = util.format("(%s %s %s) => %s %s", this.oper, se[0].Type, se[0].Dest, this.Type, this.Dest); } else if (len == 2) { comment = util.format("(%s %s %s %s %s) => %s %s", se[0].Type, se[0].Dest, this.oper, se[1].Type, se[1].Dest, this.Type, this.Dest); } else if (len == 3) { comment = util.format("(%s %s ? %s %s : %s %s) => %s %s", se[0].Type, se[0].Dest, se[1].Type, se[1].Dest, se[2].Type, se[2].Dest, this.Type, this.Dest); } irs.push(new IrComment(comment, this.location)); irs.build(table[j], dest); }; /** * Constructs an pre/post increment/decrement expression * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_incdec = function (state, irs) { var se, op, ins, post, type, i, ir; se = this.subexpressions[0]; op = this.oper.replace('x', ''); ins = op === '++' ? 'ADD' : 'SUB'; post = this.oper.indexOf('x') === 0; type = types[se.Type]; //Type check: base type must be int or float if (type.base != 'int' && type.base != 'float') { this.ir_error(util.format("Could not apply operation %s to %s", op, se.Type)); } this.Type = se.Type; if (post) { //For post increment, the returned happens before the increment, so we need a temp to store it this.Dest = irs.getTemp(type.slots); } else { this.Dest = se.Dest; } irs.push(new IrComment(util.format("(%s%s) => %s %s", post ? se.Dest : op, post ? op : se.Dest, this.Type, this.Dest), this.location)); for (i = 0; i < type.slots; i++) { if (post) { this.Dest = irs.getTemp(type.slots); ir = new IrInstruction('MOV', this.Dest, se.Dest); ir.addOffset(i); ir.setSwizzle(type.swizzle); irs.push(ir); } ir = new IrInstruction(ins, se.Dest, se.Dest, "1.0"); ir.addOffset(i); ir.setSwizzle(type.swizzle); irs.push(ir); } }; /** * Constructs an array index expression * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_arr_index = function (state, irs) { var arr, idx, entry, size, cnst, oprd; arr = this.subexpressions[0]; idx = this.subexpressions[1]; entry = arr.Entry; //Ensure array index is integer if (idx.Type != 'int') { this.ir_error("array index out of bounds"); } //@todo: Need to implement array indexing syntax for vector components if (!entry.size) { this.ir_error("cannot index a non-array value"); } //@todo: Need to implement array indexing for matrices if (types[entry.base_type].slots > 1) { this.ir_error("array indexing for matrices not implemented yet"); } this.Type = entry.base_type; //If constant index, we can do some additional error checking if (idx.Const) { cnst = parseInt(idx.Dest); if (cnst < 0 || cnst >= entry.size) { this.ir_error("array index out of bounds"); } oprd = new IrOperand(arr.Dest); oprd.index = cnst; this.Dest = oprd.toString(); } else { //@todo: variable indexing is permitted by spec, but behavior is undefined for out of bounds this.ir_error("variable indexing not implemented yet"); } }; /** * Constructs a function expression * * @param object state GLSL state * @param object irs IR representation */ AstFunctionExpression.prototype.ir = function (state, irs) { var i, e, name, entry, ret_entry, retd_entry, call_types, operands, param, proto, loc; if (this.cons) { return this.ir_constructor(state, irs); } name = this.subexpressions[0].primary_expression.identifier; operands = []; call_types = []; for (i = 0; i < this.expressions.length; i++) { e = this.expressions[i]; e.ir(state, irs); call_types.push(e.Type); operands.push(e.Dest); } entry = state.symbols.get_function(name, call_types); if (!entry) { this.ir_error(util.format("Function %s(%s) is not defined", name, call_types.join(", "))); } this.Type = entry.type; this.Dest = irs.getTemp(entry.getType().slots); irs.push(new IrComment(util.format("%s(%s) => %s %s", name, operands.join(", "), this.Type, this.Dest), this.location)); if (entry.code) { //Use function template operands.unshift(this.Dest); irs.build(entry.code, operands); } else if (entry.Ast) { //Rebuild inline function from AST state.symbols.push_scope(); //Enter vars into local symbol table proto = entry.Ast.proto_type; for (i = 0; i < proto.parameters.length; i++) { param = proto.parameters[i]; loc = state.symbols.add_variable(param.identifier, param.type.specifier.type_name); loc.out = irs.getTemp(loc.getType().slots); //Add MOV operation from called param to local param irs.push(new IrComment(util.format("PARAM %s => %s %s", operands[i], loc.out, param.type.specifier.type_name), param.location)); //Piggy-back off assignment generation lhs = new AstExpression(''); lhs.setLocation(this.getLocation()); lhs.Type = loc.type; lhs.Dest = loc.out; assign = new AstExpression('=', lhs, this.expressions[i]); assign.setLocation(this.getLocation()); assign.ir_assign(state, irs, true); } //Create a return entry for the new call scope ret_entry = state.symbols.add_variable("", this.Type); ret_entry.out = this.Dest; retd_entry = state.symbols.add_variable("", "bool"); retd_entry.out = irs.getTemp(retd_entry.getType().slots); entry.Ast.body.ir(state, irs); state.symbols.pop_scope(); } }; /** * Constructs a type constructor * * @param object state GLSL state * @param object irs IR representation */ AstFunctionExpression.prototype.ir_constructor = function (state, irs) { var type, comment_text, comment, i, expr, src_expr, src_i, src_c, oprd, dest; type = this.subexpressions[0].type_specifier; this.Type = type.name; this.Dest = irs.getTemp(type.slots); comment_text = []; comment = new IrComment("", this.location); irs.push(comment); //Prepare components for (i = 0; i < this.expressions.length; i++) { expr = this.expressions[i]; if (expr) { expr.ir(state, irs); comment_text.push(expr.Dest); } } src_expr = this.expressions[0]; src_i = 0; //Source expression index src_c = 0; //Component of source expression for (dest_i = 0; dest_i < type.size; dest_i++) { if (!src_expr) { this.ir_error("Not enough parameters to constructor"); } //@todo: need to add support for > vec4 if (types[src_expr.Type].size > 4) { this.ir_error("Matrix components not implemented yet"); } //compute destination dest = util.format("%s.%s", this.Dest, Ir.swizzles[0][dest_i]); //compute source oprd = new IrOperand(src_expr.Dest); if (!oprd.swizzle) { oprd.swizzle = Ir.swizzles[0][src_c]; } irs.push(new IrInstruction('MOV', dest, oprd.toString())); src_c++; //Get next source component expression if (src_c >= types[src_expr.Type].size) { if (this.expressions[src_i + 1]) { src_i++; src_expr = this.expressions[src_i]; src_c = 0; } } } comment.comment = util.format("%s(%s) => %s %s", this.Type, comment_text.join(", "), this.Type, this.Dest); }; /** * Constructs a field selection code block * * @param object state GLSL state * @param object irs IR representation */ AstExpression.prototype.ir_field = function (state, irs) { var field, swz, base, se; //pick swizzle set field = this.primary_expression.identifier; se = this.subexpressions[0]; se.ir(state, irs); if (Ir.isSwizzle(field)) { base = types[se.Type].base; if (field.length > 1) { if (base == 'int') { base = 'ivec' + field.length; } if (base == 'bool') { base = 'bvec' + field.length; } if (base == 'float') { base = 'vec' + field.length; } } this.Type = base; if (field.length > 4 || !this.Type) { this.ir_error(util.format("Invalid field selection %s.%s", se, field)); } this.Dest = util.format("%s.%s", se.Dest, Ir.normalizeSwizzle(field)); } }; /** * Constructs a selection statement * * @param ast_node Statement */ AstSelectionStatement.prototype.ir = function (state, irs) { var ir, cond; this.condition.ir(state, irs); //@todo: add a check that condition is bool type? irs.push(new IrComment(util.format("if %s then", this.condition.Dest), this.location)); //set a flag based on the result ir = new IrInstruction('IF', this.condition.Dest); if (['bool', 'int', 'float'].indexOf(this.condition.Type) === -1) { this.ir_error("boolean expression expected"); } if (!ir.d.swizzle) { ir.d.swizzle = 'x'; } irs.push(ir); this.then_statement.ir(state, irs); if (this.else_statement) { irs.push(new IrInstruction('ELSE')); this.else_statement.ir(state, irs); } irs.push(new IrInstruction('ENDIF')); }; /** * Constructs a jump statement * * Note: jump semantics are a bit different in glsl as there is no true "jumping": * functions are inlined, loops are unrolled, etc. * * @param ast_node Statement */ AstJumpStatement.prototype.ir = function (state, irs) { var ret, ret_entry, assign, lhs; switch (this.mode) { case 'return': ret = this.opt_return_value; if (ret) { ret.ir(state, irs); ret_entry = state.symbols.get_variable(''); //@todo: need to compare return value type with current function type irs.push(new IrComment(util.format("return => %s %s", ret.Dest, ret.Type), this.location)); //Piggy-back off assignment generation lhs = new AstExpression(''); lhs.setLocation(this.getLocation()); lhs.Type = ret.Type; lhs.Dest = ret_entry.out; assign = new AstExpression('=', lhs, ret); assign.setLocation(this.getLocation()); assign.ir_assign(state, irs, true); } else { irs.push(new IrComment("return", this.location)); } break; case 'debugger': irs.push(new IrComment("debugger", this.location)); irs.push(new IrInstruction("DBGR")); break; default: //@todo: } }; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * IR Class * * Stores IR code tree */ function Ir(target) { this.target = target; this.symbols = { uniform: { next: 0, entries: {} }, attribute: { next: 0, entries: {} }, varying: { next: 0, entries: {} }, temp: { next: 0 } }; this.code = []; this.last = null; } Ir.prototype.getTemp = function (n) { var t; n = n || 1; t = 'temp@' + this.symbols.temp.next; this.symbols.temp.next += n; return t; }; /** * Add a symbol table entry into the local symbol table and return a new IR identifier * * @param object entry Symbol table entry * * @return string */ Ir.prototype.getUniform = function (entry) { var table = this.symbols.uniform, out; if (!table.entries[entry.name]) { table.entries[entry.name] = entry; entry.out = 'uniform@' + table.next; table.next += entry.getType().slots; } return entry.out; }; /** * Add a symbol table entry into the local symbol table and return a new IR identifier * * @param object entry Symbol table entry * * @return string */ Ir.prototype.getAttribute = function (entry) { var table = this.symbols.attribute, out; if (!table.entries[entry.name]) { table.entries[entry.name] = entry; entry.out = 'attribute@' + table.next; table.next += entry.getType().slots; } return entry.out; }; /** * Add a symbol table entry into the local symbol table and return a new IR identifier * * @param object entry Symbol table entry * * @return string */ Ir.prototype.getVarying = function (entry) { var table = this.symbols.varying, out; if (!table.entries[entry.name]) { table.entries[entry.name] = entry; entry.out = 'varying@' + table.next; table.next += entry.getType().slots; } return entry.out; }; Ir.prototype.get = function (i) { return this.code[i]; }; Ir.prototype.push = function (ir) { this.code.push(ir); this.last = ir; }; Ir.isSwizzle = function (swz) { if (swz.match(/[xyzw]+/)) { return true; } if (swz.match(/[rgba]+/)) { return true; } if (swz.match(/[stpq]+/)) { return true; } }; Ir.normalizeSwizzle = function (swz) { var n; if (!this.isSwizzle(swz)) { return null; } n = swz.replace(/[rs]/g, 'x').replace(/[gt]/g, 'y').replace(/[bp]/g, 'z').replace(/[aq]/g, 'w'); return n; }; Ir.swizzles = ["xyzw", "rgba", "stpq"]; /** * Replaces all instances of an operand name and base index in all instructions after start * * @param integer Starting instruction number * @param string Old name to search for * @param string New name to replace with * @param integer Add offset * @param boolean True if replacing with a completely new operand */ Ir.prototype.replaceName = function (start, old, nw, index, repl) { var i, j, ir, f, name, neg_const; neg_const = old.match(/^\-([0-9]+\.[0-9]+)/); if (neg_const) { old = neg_const[1]; neg_const = true; } for (i = start; i < this.code.length; i++) { ir = this.code[i]; //foreach each operand field for (j = 0; j < IR.operands.length; j++) { f = IR.operands[j]; if (ir[f] && ir[f].name == old) { if (repl) { ir[f] = new Ir.Operand(ir[f].neg + nw); } else { ir[f].name = nw; ir[f].addOffset(index); } if (neg_const && ir[f].neg) { ir[f].neg = ""; } } } } }; Ir.prototype.toString = function () { return this.code.join("\n"); }; /** * Builds instructions from code table record * * @param array List of instruction strings * @param array List of operands */ Ir.prototype.build = function (code, oprds) { var dest, i, j, k, o, n, t, oprd, ir, new_swz, temps; //Parse operands for (i = 0; i < oprds.length; i++) { oprd = new IrOperand(oprds[i]); if (oprd.swizzle) { //need a new temp to move the swizzle so our code pattern works new_swz = Ir.swizzles[0].substring(0, oprd.swizzle.length); if (oprd.swizzle != new_swz) { dest = this.getTemp(); ir = new IrInstruction('MOV', util.format("%s.%s", dest, new_swz), oprd.full); this.push(ir); oprd = new IrOperand(dest); } } oprds[i] = oprd; } temps = []; //Merge template with passed operands for (i = 0; i < code.length; i++) { ir = new IrInstruction(code[i]); //For each operand for (j = 0; j < IrInstruction.operands.length; j++) { o = IrInstruction.operands[j]; oprd = ir[o]; if (!oprd) { break; } //Normal src/dest n = oprd.name.match(/%(\d+)/); if (n) { n = parseInt(n[1]); ir[o] = new IrOperand(oprds[n - 1].toString()); ir[o].addOffset(oprd.address); ir[o].swizzle = oprd.swizzle; ir[o].neg = oprd.neg; } //Need temp t = oprd.name.match(/%t(\d+)/); if (t) { //Build up enough temps t = parseInt(t[1]); while (temps.length < t) { temps.push(this.getTemp()); } t = temps[t - 1].split('@'); oprd.name = t[0]; oprd.address = t[1]; oprd.full = oprd.toString(); } } this.push(ir); } }; /** * Ir Error Class * * Used to differentiate between a compilation error and a compiler error */ function IrError(msg) { this.msg = msg; this.ir = true; } IrError.prototype = Error.prototype; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * IR Instruction Class * * Represents a single assembly-like instruction */ function IrInstruction(op, d, s1, s2, s3) { var args; this.str = null; this.line = null; if (arguments.length == 1) { args = op.split(/[\s,]/); op = args[0]; d = args[1]; s1 = args[2]; s2 = args[3]; s3 = args[4]; } this.op = op; this.d = this.operand(d); this.s1 = this.operand(s1); this.s2 = this.operand(s2); this.s3 = this.operand(s3); } IrInstruction.operands = ['d', 's1', 's2', 's3']; IrInstruction.prototype.operand = function (opr) { return opr ? new IrOperand(opr) : ""; }; /** * Adds the offset to all operands * * @param integer The offset to set */ IrInstruction.prototype.addOffset = function (offset) { var i, o; for (i = 0; i < IrInstruction.operands.length; i++) { o = IrInstruction.operands[i]; if (this[o]) { this[o].addOffset(offset); } } }; /** * Set the swizzle components on all operands * * @param string The swizzle to set */ IrInstruction.prototype.setSwizzle = function (swz) { var i, o; for (i = 0; i < IrInstruction.operands.length; i++) { o = IrInstruction.operands[i]; if (this[o] && !this[o].swizzle) { this[o].swizzle = swz; } } }; /** * toString method * * @return string */ IrInstruction.prototype.toString = function () { var out; out = util.format("%s%s%s%s%s;", this.op, this.d ? ' ' + this.d : '', this.s1 ? ', ' + this.s1 : '', this.s2 ? ', ' + this.s2 : '', this.s3 ? ', ' + this.s3 : ''); return out; }; /** * IR Comment Class * * Represents a single comment */ function IrComment(comment, loc) { this.comment = comment; this.loc = loc; } IrComment.prototype.toString = function () { var c = this.comment; if (this.loc) { c = util.format("%s [%s:%s-%s:%s]", c, this.loc.first_line, this.loc.first_column, this.loc.last_line, this.loc.last_column); } c = "\n# " + c; return c; }; /** * IR Operand Class * * Represents a single operand */ function IrOperand(str, raw) { this.full = ""; this.neg = ""; this.name = ""; this.address = ""; this.swizzle = ""; this.number = ""; this.raw = ""; this.index = ""; if (raw) { this.full = str; this.raw = str; } else { this.parse(str); } } /** * Parses operand string * * @param string string that represents a single variable */ IrOperand.prototype.parse = function (str) { var parts, regex; if (!str) { return; } if (!isNaN(parseFloat(str))) { this.raw = str; return; } //neg regex = "(\-)?"; //name (include '%' for our code substitution rules) regex += "([\\w%]+)"; //number regex += "(?:@(\\d+))?"; //index regex += "(?:\\[(\\d+)\\])?"; //swizzle regex += "(?:\\.([xyzw]+))?"; regex = new RegExp("^" + regex + "$"); if (parts = str.match(regex)) { this.neg = parts[1] || ""; this.name = parts[2]; this.address = parseInt(parts[3]) || 0; this.index = parseInt(parts[4]) || 0; this.swizzle = parts[5] || ""; } else { if (parts = str.match(/^"(.*)"$/)) { this.raw = parts[1]; } else { this.raw = str; } } this.full = this.toString(); }; /** * Adds an offset * * @param integer Offset to add */ IrOperand.prototype.addOffset = function (offset) { this.address = this.address || 0; this.address += offset; }; /** * toString method * * @return string */ IrOperand.prototype.toString = function () { var str; if (this.raw) { str = this.raw; } else { str = this.neg + this.name + ("@" + this.address) + (this.index !== "" ? "[" + this.index + "]" : "") + (this.swizzle ? "." + this.swizzle : ""); } return str; }; /* Copyright (c) 2014 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * GlslProgramJavascript class */ function GlslProgramJavascript() { this.vertex_code = []; this.fragment_code = []; this.symbols = new GlslProgramJavascriptVars(); this.context = new GlslProgramJavascriptContext(); this.library = { tex: function tex(dest, i, sampler, src, j, dim) { dest[i] = 0; dest[i + 1] = 0; dest[i + 2] = 0; dest[i + 3] = 1; } }; this.vertex = null; this.shader = null; } var proto = GlslProgramJavascript.prototype; GlslProgramJavascript.translation_table = { 'ABS': '%1.* = Math.abs(%2.*);', 'ADD': '%1.* = %2.* + %3.*;', 'AND': '%1.* = %2.* & %3.*;', //'ARL' : false, 'CEIL': '%1.* = Math.ceil(%2.*);', 'CMP': '%1.* = (%2.* < 0.0) ? %3.* : %4.*;', 'COS': '%1.* = Math.cos(%2.*);', 'DIV': '%1.* = %2.* / %3.*;', 'DBGR': 'debugger;', 'DP2': '%1.x = (%2.x * %3.x) + (%2.y * %3.y);', 'DP3': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z);', 'DP4': '%1.x = (%2.x * %3.x) + (%2.y * %3.y) + (%2.z * %3.z) + (%2.w * %3.w);', //'DPH' : '%1.* = (%2.x * %3.x + %2.y * %3.y + %2.z + %3.z + %3.w);', //'DST' : '%1.* = [1, %2.y * %3.y, %2.z, %3.w];', 'ELSE': '} else {', 'ENDIF': '}', 'FLR': '%1.* = Math.floor(%2.*);', 'FRC': '%1.* = %2.* - Math.floor(%2.*);', 'IF': 'if (%1.x) {', 'MAD': '%1.* = (%2.* * %3.*) + %4.*;', 'MAX': '%1.* = Math.max(%2.*, %3.*);', 'MIN': '%1.* = Math.min(%2.*, %3.*);', 'MOD': '%1.* = %2.* % %3.*;', 'MOV': '%1.* = %2.*;', 'MUL': '%1.* = %2.* * %3.*;', 'OR': '%1.* = %2.* | %3.*;', 'POW': '%1.x = Math.pow(%2.x, %3.x);', 'RET': 'return;', 'RSQ': '%1.* = (1.0 / Math.sqrt(%2.*));', 'SEQ': '%1.* = (%2.* === %3.*) ? 1.0 : 0.0;', 'SGE': '%1.* = (%2.* >= %3.*) ? 1.0 : 0.0;', 'SGT': '%1.* = (%2.* > %3.*) ? 1.0 : 0.0;', 'SIN': '%1.* = Math.sin(%2.*);', 'SLE': '%1.* = (%2.* <= %3.*) ? 1.0 : 0.0;', 'SLT': '%1.* = (%2.* < %3.*) ? 1.0 : 0.0;', 'SNE': '%1.* = (%2.* !== %3.*) ? 1.0 : 0.0;', 'SUB': '%1.* = %2.* - %3.*;', 'TAN': '%1.* = Math.tan(%2.*);', //Non-standard opcode for NV_gpu 'TEX': 'tex(%1, %4, %2, %5, %3.x, 0);', //%4 = address of %1, %5 = address of %2 'XOR': '%1.* = %2.* ^ %3.*;' }; /** * Return string representation of program * * @param int target target * * @return string */ proto.toString = function (target) { if (target === glsl.target.fragment) { return this.fragment_code.join("\n"); } else if (target === glsl.target.vertex) { return this.vertex_code.join("\n"); } else { return this.current.join("\n"); } }; /** * Translates IR code into a javascript representation * * @return bool true if there were no errors */ proto.addObjectCode = function (object, target) { var i, errors; //optimize(irs, symbols); this.mergeSymbols(object); this.current = []; for (i = 0; i < object.code.length; i++) { try { this.instruction(object.code[i]); } catch (e) { this.error = util.format("%s at %s:%s", e.message, e.lineNumber, e.columnNumber); return false; } } if (target == glsl.target.vertex) { this.vertex_code = this.current; } else if (target == glsl.target.fragment) { this.fragment_code = this.current; } return true; }; /** * Merge symbol code into program table */ proto.mergeSymbols = function (object) { var s, t, n, entry, sym, start, slots, comp; for (s in object.symbols) { t = object.symbols[s].entries; for (n in t) { entry = t[n]; start = parseInt(entry.out.split('@')[1]); slots = entry.getType().slots; comp = entry.getType().size / slots; if (s == 'uniform') { sym = this.symbols.addUniform(entry.name, start, slots, comp); if (this.findSymbolCollision(this.symbols.uniform, sym)) { this.rewriteSymbol(this.symbols.uniform, sym, object); } } else if (s == 'attribute') { this.symbols.addAttribute(entry.name, start, slots, comp); } else if (s == 'varying') { this.symbols.addVarying(entry.name, start, slots, comp); } } } }; /** * Scan symbol table to find collisions */ proto.findSymbolCollision = function (table, symbol) { var i, my_start, my_end, start, end; my_start = symbol.pos; my_end = my_start + symbol.slots - 1; for (i in table) { if (i == symbol.name) { continue; } start = table[i].pos; end = start + table[i].slots - 1; if (my_start >= start && my_start <= end || my_end >= start && my_end <= end) { return true; } } return false; }; /** * Rewrite symbol table entry position in code */ proto.findNewSymbolPosition = function (table, symbol) { var i, size, addresses, last, next; addresses = []; //find new address for (i in table) { if (symbol.name == i) { continue; } //start address addresses.push(table[i].pos); //end address addresses.push(table[i].pos + table[i].slots - 1); } addresses.sort(); //Can insert at beginning if (addresses[0] >= symbol.slots) { return 0; } //Can insert in between for (i = 1; i < addresses.length; i += 2) { last = addresses[i]; next = addresses[i]; if (next - last - 1 > symbol.slots) { return last + 1; } } //Can insert at end return addresses.slice(-1)[0] + 1; }; /** * Rewrite symbol table entry position in code */ proto.rewriteSymbol = function (table, symbol, object) { var pos, old_start, old_end, diff, i, ins; old_start = symbol.pos; old_end = old_start + symbol.slots - 1; symbol.pos = this.findNewSymbolPosition(table, symbol); diff = symbol.pos - old_start; for (i = 0; i < object.code.length; i++) { ins = object.code[i]; if (!(ins instanceof IrInstruction)) { continue; } this.rewriteOperandAddress(ins.d, old_start, old_end, diff, symbol); this.rewriteOperandAddress(ins.s1, old_start, old_end, diff, symbol); this.rewriteOperandAddress(ins.s2, old_start, old_end, diff, symbol); this.rewriteOperandAddress(ins.s3, old_start, old_end, diff, symbol); } }; /** * Rewrite symbol table entry position in code */ proto.rewriteOperandAddress = function (oprd, old_start, old_end, diff, symbol) { var diff; if (!oprd) { return; } if (oprd.name != symbol.type) { return; } if (oprd.address >= old_start && oprd.address <= old_end) { oprd.address += diff; } }; /** * Build a program * * @return function */ proto.build = function () { var module, shaders; module = new Function("stdlib", "foreign", "heap", "//\"use asm\";\n" + "var\n" + "uniform_f32 = new stdlib.Float32Array(heap, 0, 128),\n" + "attribute_f32 = new stdlib.Float32Array(heap, 512, 128),\n" + "varying_f32 = new stdlib.Float32Array(heap, 1024, 128),\n" + "result_f32 = new stdlib.Float32Array(heap, 1536, 128),\n" + "temp_f32 = new stdlib.Float32Array(heap, 2048, 128),\n" + "jstemp = new stdlib.Float32Array(heap, 2544, 4),\n" + "tex = foreign.tex;\n" + ";\n" + "function vs() {\n" + this.vertex_code.join("\n") + "\n" + "}\n" + "function fs() {\n" + this.fragment_code.join("\n") + "\n" + "}\n" + "return { fragment : fs, vertex : vs };"); shaders = module(window, this.library, this.context.heap); this.vertex = shaders.vertex; this.fragment = shaders.fragment; }; /** * Translates ASM instruction into output format * * @param string string that represents a single instruction */ proto.instruction = function (ins) { var tpl, dest, src, i, j, k, code, js; if (ins instanceof IrComment) { this.current.push('// ' + ins.toString().replace("\n", "")); return; } this.current.push('// ' + ins.toString()); if (!(tpl = GlslProgramJavascript.translation_table[ins.op])) { throw new Error(util.format("Could not translate opcode '%s'", ins.op)); } //variables dest = this.buildComponents(ins.d, true); if (!dest) { this.current.push(tpl); return; } src = []; src.push(this.buildComponents(ins.s1)); src.push(this.buildComponents(ins.s2)); src.push(this.buildComponents(ins.s3)); if (ins.op == 'TEX') { js = tpl.replace(/%1/g, dest.name); js = js.replace(/%2/g, src[0].name); js = this.replaceOperand(js, '%3', src[1], 0); js = js.replace(/%4/g, dest.start); js = js.replace(/%5/g, src[0].start); this.current.push(js); this.current.push(""); return; } this.generateTemp(dest, src, tpl); for (i = 0; i < dest.components.length; i++) { js = this.replaceOperand(tpl, '%1', dest, i); for (j = 0; j < 3; j++) { if (src[j]) { js = this.replaceOperand(js, '%' + (j + 2), src[j], i); } } this.current.push(js); } this.current.push(""); }; /** * Replace an operand into code template * * @param string tpl Template * @param string from Template operand * @param object op Operand info * @param int n Current component iteration */ proto.replaceOperand = function (tpl, from, op, n) { var i, out, name, addr, swz = ['x', 'y', 'z', 'w']; if (op.raw) { name = op.name; } else { if (op.jstemp && op.jstemp[n]) { name = 'jstemp'; addr = n; } else { name = op.name; if (op.components) { addr = op.start + op.components[n]; } } } if (op.components) { out = tpl.replace(from + '.*', util.format("%s[%s]", name, addr)); } else { out = tpl.replace(from + '.*', name); } for (i = 0; i < swz.length; i++) { out = out.replace(new RegExp(from + '\.' + swz[i], 'g'), util.format("%s[%s]", name, op.start + i)); } return out; }; /** * Prepares info on IR operand * * @param IrOperand opr Operand * @param bool dest Is destination? * * @return object */ proto.buildComponents = function (opr, dest) { var i, swz, out; if (!opr) { return null; } out = {}; if (opr.raw) { out.name = opr.raw; out.raw = true; return out; } out.name = opr.neg + opr.name + '_f32'; out.start = 4 * opr.address + 4 * opr.index; out.components = []; out.jstemp = []; //generate array representation of swizzle components, expanding if necessary swz = opr.swizzle || "xyzw"; swz = swz.split(""); for (i = 0; i < 4; i++) { //exact swizzle specified and less than 4 components, grab last one if (swz.length <= i) { if (!dest) { //repeat last one out.components.push(out.components[i - 1]); out.jstemp.push(null); } } else { out.components.push("xyzw".indexOf(swz[i])); out.jstemp.push(null); } } return out; }; proto.generateTemp = function (dest, src, tpl) { var i, c, op, written; for (i = 0; i < dest.components.length; i++) { written = dest.components.slice(0, i); for (c = 0; c < src.length; c++) { op = src[c]; if (op && op.name == dest.name && op.start == dest.start && written.indexOf(op.components[i]) != -1) { op.jstemp[i] = true; this.current.push(util.format("jstemp[%s] = %s[%s]", i, op.name, op.start + op.components[i])); } } } //console.log(tpl, dest, src); //debugger; }; /** * Get Uniform Location * * @param string name Name * * @return int */ proto.getUniformLocation = function (name) { if (this.symbols.uniform[name]) { return this.symbols.uniform[name].start; } return false; }; /** * Get Uniform Size * * @param string name Name * * @return int */ proto.getUniformSize = function (name) { if (this.symbols.uniform[name]) { return this.symbols.uniform[name].size; } return false; }; /** * Set Uniform data * * @param string name Name * @param array data Data */ proto.setUniformData = function (name, data) { var i, l, s, d; d = data.length; l = this.getUniformSize(name); s = this.getUniformLocation(name); if (l === false) { return; } this.context.uniform_f32.set(data, i + s); }; /** * Get Attribute Location * * @param string name Name * * @return int */ proto.getAttributeLocation = function (name) { if (this.symbols.attribute[name]) { return this.symbols.attribute[name].start; } return false; }; /** * Get Attribute Size * * @param string name Name * * @return int */ proto.getAttributeSize = function (name) { if (this.symbols.attribute[name]) { return this.symbols.attribute[name].size; } return false; }; /** * Set Attribute data * * @param string name Name * @param array data Data */ proto.setAttributeData = function (name, data) { var i, l, s, d; d = data.length; l = this.getAttributeSize(name); s = this.getAttributeLocation(name); if (l === false) { return; } this.context.attribute_f32.set(data, i + s); }; /** * Get result data * * @param int start Start pos * @param int size Size * * @return array */ proto.getResultData = function (start, size) { var res; res = Array.prototype.slice.apply(this.context.result_f32, [start, size]); return res; }; /** * Set TEX lookup function * * */ proto.setTexFunction = function (func) { this.library.tex = func; }; glsl.program = GlslProgramJavascript; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * GlslProgramJavascriptContext class */ function GlslProgramJavascriptContext() { this.heap = new ArrayBuffer(640 * 4); this.uniform_f32 = new Float32Array(this.heap, 0, 128); this.attribute_f32 = new Float32Array(this.heap, 128 * 4, 128); this.varying_f32 = new Float32Array(this.heap, 256 * 4, 128); this.result_f32 = new Float32Array(this.heap, 384 * 4, 128); } var proto = GlslProgramJavascriptContext.prototype; /* Copyright (c) 2011 Cimaron Shanahan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * GlslProgramJavascriptVars Class */ function GlslProgramJavascriptVars() { this.uniform = {}; this.attribute = {}; this.varying = {}; } var proto = GlslProgramJavascriptVars.prototype; /** * Add uniform variable */ proto.addUniform = function (name, pos, slots, comp) { this.uniform[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'uniform'); return this.uniform[name]; }; /** * Add attribute variable */ proto.addAttribute = function (name, pos, slots, comp) { this.attribute[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'attribute'); return this.attribute[name]; }; /** * Add varying variable */ proto.addVarying = function (name, pos, slots, comp) { this.varying[name] = new GlslProgramJavascriptVar(name, pos, slots, comp, 'varying'); return this.varying[name]; }; /** * GlslProgramJavascriptVar Class */ function GlslProgramJavascriptVar(name, pos, slots, comp, type) { this.name = name; this.pos = pos; this.slots = slots; this.components = comp; this.type = type; } //this.glsl = glsl; if ('object' !== 'undefined') { module.exports = glsl; } })(); }); var ast$1 = createCommonjsModule(function (module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.makeEveryOtherGenerator = exports.makeGenerator = exports.visit = exports.evaluate = void 0; var isNode = function (node) { return !!(node === null || node === void 0 ? void 0 : node.type); }; var isTraversable = function (node) { return isNode(node) || Array.isArray(node); }; var evaluate = function (ast, visitors) { var visit = function (node) { var visitor = visitors[node.type]; if (!visitor) { throw new Error("No evaluate() visitor for " + node.type); } return visitors[node.type](node, visit); }; return visit(ast); }; exports.evaluate = evaluate; var makePath = function (node, parent, parentPath, key, index) { return ({ node: node, parent: parent, parentPath: parentPath, key: key, index: index, skip: function () { this.skipped = true; }, remove: function () { this.removed = true; }, replaceWith: function (replacer) { this.replaced = replacer; }, findParent: function (test) { return !parentPath ? parentPath : test(parentPath) ? parentPath : parentPath.findParent(test); }, }); }; /** * Apply the visitor pattern to an AST that conforms to this compiler's spec */ var visit = function (ast, visitors) { var visitNode = function (node, parent, parentPath, key, index) { var _a; var visitor = visitors[node.type]; var path = makePath(node, parent, parentPath, key, index); if (visitor === null || visitor === void 0 ? void 0 : visitor.enter) { visitor.enter(path); if (path.removed) { if (!key || !parent) { throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id)); } if (typeof index === 'number') { parent[key].splice(index, 1); } else { parent[key] = null; } return path; } if (path.replaced) { if (!key || !parent) { throw new Error("Asked to remove " + node.id + " but no parent key was present in " + (parent === null || parent === void 0 ? void 0 : parent.id)); } if (typeof index === 'number') { parent[key].splice(index, 1, path.replaced); } else { parent[key] = path.replaced; } } if (path.skipped) { return path; } } Object.entries(node) .filter(function (_a) { var nodeKey = _a[0], nodeValue = _a[1]; return isTraversable(nodeValue); }) .forEach(function (_a) { var nodeKey = _a[0], nodeValue = _a[1]; if (Array.isArray(nodeValue)) { for (var i = 0, offset = 0; i - offset < nodeValue.length; i++) { var child = nodeValue[i - offset]; var res = visitNode(child, node, path, nodeKey, i - offset); if (res === null || res === void 0 ? void 0 : res.removed) { offset += 1; } } } else { visitNode(nodeValue, node, path, nodeKey); } }); (_a = visitor === null || visitor === void 0 ? void 0 : visitor.exit) === null || _a === void 0 ? void 0 : _a.call(visitor, path); // visitor?.exit?.(node, parent, key, index); }; return visitNode(ast); }; exports.visit = visit; /** * Stringify an AST */ var makeGenerator = function (generators) { var gen = function (ast) { return typeof ast === 'string' ? ast : ast === null || ast === undefined ? '' : Array.isArray(ast) ? ast.map(gen).join('') : ast.type in generators ? generators[ast.type](ast) : "NO GENERATOR FOR " + ast.type + ast; }; return gen; }; exports.makeGenerator = makeGenerator; var makeEveryOtherGenerator = function (generate) { var everyOther = function (nodes, eo) { return nodes.reduce(function (output, node, index) { return output + generate(node) + (index === nodes.length - 1 ? '' : generate(eo[index])); }, ''); }; return everyOther; }; exports.makeEveryOtherGenerator = makeEveryOtherGenerator; }); var ast$2 = /*@__PURE__*/getDefaultExportFromCjs(ast$1); "use strict"; var generators = { program: function (node) { return generate(node.ws) + generate(node.program); }, preprocessor: function (node) { return generate(node.line) + generate(node._); }, keyword: function (node) { return generate(node.token) + generate(node.whitespace); }, precision: function (node) { return generate(node.prefix) + generate(node.qualifier) + generate(node.specifier); }, // Statements expression_statement: function (node) { return generate(node.expression) + generate(node.semi); }, if_statement: function (node) { return generate(node.if) + generate(node.lp) + generate(node.condition) + generate(node.rp) + generate(node.body) + generate(node.else); }, switch_statement: function (node) { return generate(node.switch) + generate(node.lp) + generate(node.expression) + generate(node.rp) + generate(node.lb) + generate(node.cases) + generate(node.rb); }, break_statement: function (node) { return generate(node.break) + generate(node.semi); }, do_statement: function (node) { return generate(node.do) + generate(node.body) + generate(node.while) + generate(node.lp) + generate(node.expression) + generate(node.rp) + generate(node.semi); }, continue_statement: function (node) { return generate(node.continue) + generate(node.semi); }, return_statement: function (node) { return generate(node.return) + generate(node.expression) + generate(node.semi); }, discard_statement: function (node) { return generate(node.discard) + generate(node.semi); }, while_statement: function (node) { return generate(node.while) + generate(node.lp) + generate(node.condition) + generate(node.rp) + generate(node.body); }, for_statement: function (node) { return generate(node.for) + generate(node.lp) + generate(node.init) + generate(node.initSemi) + generate(node.condition) + generate(node.conditionSemi) + generate(node.operation) + generate(node.rp) + generate(node.body); }, condition_expression: function (node) { return generate(node.specified_type) + generate(node.identifier) + generate(node.declarator) + generate(node.op) + generate(node.initializer); }, declaration_statement: function (node) { return generate(node.declaration) + generate(node.semi); }, fully_specified_type: function (node) { return generate(node.qualifiers) + generate(node.specifier); }, layout_qualifier: function (node) { return generate(node.layout) + generate(node.lp) + generateWithEveryOther(node.qualifiers, node.commas) + generate(node.rp); }, layout_qualifier_id: function (node) { return generate(node.identifier) + generate(node.operator) + generate(node.expression); }, switch_case: function (node) { return generate(node.case) + generate(node.test) + generate(node.colon) + generate(node.statements); }, default_case: function (node) { return generate(node.default) + generate(node.colon) + generate(node.statements); }, declaration: function (node) { return generate(node.specified_type) + generate(node.identifier) + generate(node.quantifier) + generate(node.operator) + generate(node.initializer); }, declarator_list: function (node) { return generate(node.specified_type) + generateWithEveryOther(node.declarations, node.commas); }, declarator: function (node) { return generate(node.specified_type) + generate(node.identifier) + generate(node.qualifiers) + generate(node.quantifier); }, type_specifier: function (node) { return generate(node.specifier) + generate(node.quantifier) + generate(node.declarations); }, array_specifiers: function (node) { return generate(node.specifiers); }, array_specifier: function (node) { return generate(node.lb) + generate(node.expression) + generate(node.rb); }, identifier: function (node) { return node.identifier + generate(node.whitespace); }, function: function (node) { return generate(node['prototype']) + generate(node.body) + generate(node.rp); }, function_header: function (node) { return generate(node.returnType) + generate(node.name) + generate(node.lp); }, function_prototype: function (node) { return generate(node.header.returnType) + generate(node.header.name) + generate(node.header.lp) + (node.parameters ? generateWithEveryOther(node.parameters, node.commas) : '') + generate(node.rp); }, parameter_declaration: function (node) { return generate(node.qualifier) + generate(node.declaration); }, compound_statement: function (node) { return generate(node.lb) + generate(node.statements) + generate(node.rb); }, function_call: function (node) { return generate(node.identifier) + generate(node.lp) + generate(node.args) + generate(node.rp); }, parameter_declarator: function (node) { return generate(node.qualifier) + generate(node.specifier) + generate(node.identifier) + generate(node.quantifier); }, postfix: function (node) { return generate(node.expr) + generate(node.postfix); }, quantifier: function (node) { return generate(node.lb) + generate(node.expr) + generate(node.rb); }, quantified_identifier: function (node) { return generate(node.identifier) + generate(node.quantifier); }, field_selection: function (node) { return generate(node.dot) + generate(node.selection); }, subroutine_qualifier: function (node) { return generate(node.subroutine) + generate(node.lp) + generate(node.type_names) + generate(node.commas) + generate(node.rp); }, assignment: function (node) { return generate(node.left) + generate(node.operator) + generate(node.right); }, ternary: function (node) { return generate(node.expr) + generate(node.question) + generate(node.left) + generate(node.colon) + generate(node.right); }, binary: function (node) { return generate(node.left) + generate(node.operator) + generate(node.right); }, group: function (node) { return generate(node.lp) + generate(node.expression) + generate(node.rp); }, unary: function (node) { return generate(node.operator) + generate(node.expression); }, float_constant: function (node) { return generate(node.token) + generate(node.whitespace); }, double_constant: function (node) { return generate(node.token) + generate(node.whitespace); }, int_constant: function (node) { return generate(node.token) + generate(node.whitespace); }, uint_constant: function (node) { return generate(node.token) + generate(node.whitespace); }, bool_constant: function (node) { return generate(node.token) + generate(node.whitespace); }, literal: function (node) { return generate(node.literal) + generate(node.whitespace); }, struct: function (node) { return generate(node.struct) + generate(node.typeName) + generate(node.lb) + generate(node.declarations) + generate(node.rb); }, struct_declaration: function (node) { return generate(node.declaration) + generate(node.semi); }, interface_declarator: function (node) { return generate(node.qualifiers) + generate(node.interface_type) + generate(node.lp) + generate(node.declarations) + generate(node.rp) + generate(node.identifier); }, struct_declarator: function (node) { return generate(node.specified_type) + generateWithEveryOther(node.declarations, node.commas); }, initializer_list: function (node) { return generate(node.lb) + generateWithEveryOther(node.initializers, node.commas) + generate(node.rb); }, qualifier_declarator: function (node) { return generate(node.qualifiers) + generateWithEveryOther(node.declarations, node.commas); }, }; var generate = (0, ast$1.makeGenerator)(generators); var generateWithEveryOther = (0, ast$1.makeEveryOtherGenerator)(generate); var _default = generate; var generator = /*#__PURE__*/Object.defineProperty({ default: _default }, '__esModule', {value: true}); // Generated by Peggy 1.2.0. // // https://peggyjs.org/ "use strict"; function peg$subclass(child, parent) { function C() { this.constructor = child; } C.prototype = parent.prototype; child.prototype = new C(); } function peg$SyntaxError(message, expected, found, location) { var self = Error.call(this, message); if (Object.setPrototypeOf) { Object.setPrototypeOf(self, peg$SyntaxError.prototype); } self.expected = expected; self.found = found; self.location = location; self.name = "SyntaxError"; return self; } peg$subclass(peg$SyntaxError, Error); function peg$padEnd(str, targetLength, padString) { padString = padString || " "; if (str.length > targetLength) { return str; } targetLength -= str.length; padString += padString.repeat(targetLength); return str + padString.slice(0, targetLength); } peg$SyntaxError.prototype.format = function(sources) { var str = "Error: " + this.message; if (this.location) { var src = null; var k; for (k = 0; k < sources.length; k++) { if (sources[k].source === this.location.source) { src = sources[k].text.split(/\r\n|\n|\r/g); break; } } var s = this.location.start; var loc = this.location.source + ":" + s.line + ":" + s.column; if (src) { var e = this.location.end; var filler = peg$padEnd("", s.line.toString().length); var line = src[s.line - 1]; var last = s.line === e.line ? e.column : line.length + 1; str += "\n --> " + loc + "\n" + filler + " |\n" + s.line + " | " + line + "\n" + filler + " | " + peg$padEnd("", s.column - 1) + peg$padEnd("", last - s.column, "^"); } else { str += "\n at " + loc; } } return str; }; peg$SyntaxError.buildMessage = function(expected, found) { var DESCRIBE_EXPECTATION_FNS = { literal: function(expectation) { return "\"" + literalEscape(expectation.text) + "\""; }, class: function(expectation) { var escapedParts = expectation.parts.map(function(part) { return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); }); return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; }, any: function() { return "any character"; }, end: function() { return "end of input"; }, other: function(expectation) { return expectation.description; } }; function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); } function literalEscape(s) { return s .replace(/\\/g, "\\\\") .replace(/"/g, "\\\"") .replace(/\0/g, "\\0") .replace(/\t/g, "\\t") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); }) .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); } function classEscape(s) { return s .replace(/\\/g, "\\\\") .replace(/\]/g, "\\]") .replace(/\^/g, "\\^") .replace(/-/g, "\\-") .replace(/\0/g, "\\0") .replace(/\t/g, "\\t") .replace(/\n/g, "\\n") .replace(/\r/g, "\\r") .replace(/[\x00-\x0F]/g, function(ch) { return "\\x0" + hex(ch); }) .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); } function describeExpectation(expectation) { return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); } function describeExpected(expected) { var descriptions = expected.map(describeExpectation); var i, j; descriptions.sort(); if (descriptions.length > 0) { for (i = 1, j = 1; i < descriptions.length; i++) { if (descriptions[i - 1] !== descriptions[i]) { descriptions[j] = descriptions[i]; j++; } } descriptions.length = j; } switch (descriptions.length) { case 1: return descriptions[0]; case 2: return descriptions[0] + " or " + descriptions[1]; default: return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; } } function describeFound(found) { return found ? "\"" + literalEscape(found) + "\"" : "end of input"; } return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; }; function peg$parse(input, options) { options = options !== undefined ? options : {}; var peg$FAILED = {}; var peg$source = options.grammarSource; var peg$startRuleFunctions = { start: peg$parsestart }; var peg$startRuleFunction = peg$parsestart; var peg$c0 = "attribute"; var peg$c1 = "varying"; var peg$c2 = "const"; var peg$c3 = "bool"; var peg$c4 = "float"; var peg$c5 = "double"; var peg$c6 = "int"; var peg$c7 = "uint"; var peg$c8 = "break"; var peg$c9 = "continue"; var peg$c10 = "do"; var peg$c11 = "else"; var peg$c12 = "for"; var peg$c13 = "if"; var peg$c14 = "discard"; var peg$c15 = "return"; var peg$c16 = "switch"; var peg$c17 = "case"; var peg$c18 = "default"; var peg$c19 = "subroutine"; var peg$c20 = "bvec2"; var peg$c21 = "bvec3"; var peg$c22 = "bvec4"; var peg$c23 = "ivec2"; var peg$c24 = "ivec3"; var peg$c25 = "ivec4"; var peg$c26 = "uvec2"; var peg$c27 = "uvec3"; var peg$c28 = "uvec4"; var peg$c29 = "vec2"; var peg$c30 = "vec3"; var peg$c31 = "vec4"; var peg$c32 = "mat2"; var peg$c33 = "mat3"; var peg$c34 = "mat4"; var peg$c35 = "centroid"; var peg$c36 = "in"; var peg$c37 = "out"; var peg$c38 = "inout"; var peg$c39 = "uniform"; var peg$c40 = "patch"; var peg$c41 = "sample"; var peg$c42 = "buffer"; var peg$c43 = "shared"; var peg$c44 = "coherent"; var peg$c45 = "volatile"; var peg$c46 = "restrict"; var peg$c47 = "readonly"; var peg$c48 = "writeonly"; var peg$c49 = "dvec2"; var peg$c50 = "dvec3"; var peg$c51 = "dvec4"; var peg$c52 = "dmat2"; var peg$c53 = "dmat3"; var peg$c54 = "dmat4"; var peg$c55 = "noperspective"; var peg$c56 = "flat"; var peg$c57 = "smooth"; var peg$c58 = "layout"; var peg$c59 = "mat2x2"; var peg$c60 = "mat2x3"; var peg$c61 = "mat2x4"; var peg$c62 = "mat3x2"; var peg$c63 = "mat3x3"; var peg$c64 = "mat3x4"; var peg$c65 = "mat4x2"; var peg$c66 = "mat4x3"; var peg$c67 = "mat4x4"; var peg$c68 = "dmat2x2"; var peg$c69 = "dmat2x3"; var peg$c70 = "dmat2x4"; var peg$c71 = "dmat3x2"; var peg$c72 = "dmat3x3"; var peg$c73 = "dmat3x4"; var peg$c74 = "dmat4x2"; var peg$c75 = "dmat4x3"; var peg$c76 = "dmat4x4"; var peg$c77 = "atomic_uint"; var peg$c78 = "sampler1D"; var peg$c79 = "sampler2D"; var peg$c80 = "sampler3D"; var peg$c81 = "samplerCube"; var peg$c82 = "sampler1DShadow"; var peg$c83 = "sampler2DShadow"; var peg$c84 = "samplerCubeShadow"; var peg$c85 = "sampler1DArray"; var peg$c86 = "sampler2DArray"; var peg$c87 = "sampler1DArrayShadow"; var peg$c88 = "sampler2DArrayshadow"; var peg$c89 = "isampler1D"; var peg$c90 = "isampler2D"; var peg$c91 = "isampler3D"; var peg$c92 = "isamplerCube"; var peg$c93 = "isampler1Darray"; var peg$c94 = "isampler2DArray"; var peg$c95 = "usampler1D"; var peg$c96 = "usampler2D"; var peg$c97 = "usampler3D"; var peg$c98 = "usamplerCube"; var peg$c99 = "usampler1DArray"; var peg$c100 = "usampler2DArray"; var peg$c101 = "sampler2DRect"; var peg$c102 = "sampler2DRectshadow"; var peg$c103 = "isampler2DRect"; var peg$c104 = "usampler2DRect"; var peg$c105 = "samplerBuffer"; var peg$c106 = "isamplerBuffer"; var peg$c107 = "usamplerBuffer"; var peg$c108 = "samplerCubeArray"; var peg$c109 = "samplerCubeArrayShadow"; var peg$c110 = "isamplerCubeArray"; var peg$c111 = "usamplerCubeArray"; var peg$c112 = "sampler2DMS"; var peg$c113 = "isampler2DMS"; var peg$c114 = "usampler2DMS"; var peg$c115 = "sampler2DMSArray"; var peg$c116 = "isampler2DMSArray"; var peg$c117 = "usampler2DMSArray"; var peg$c118 = "image1D"; var peg$c119 = "iimage1D"; var peg$c120 = "uimage1D"; var peg$c121 = "image2D"; var peg$c122 = "iimage2D"; var peg$c123 = "uimage2D"; var peg$c124 = "image3D"; var peg$c125 = "iimage3D"; var peg$c126 = "uimage3D"; var peg$c127 = "image2DRect"; var peg$c128 = "iimage2DRect"; var peg$c129 = "uimage2DRect"; var peg$c130 = "imageCube"; var peg$c131 = "iimageCube"; var peg$c132 = "uimageCube"; var peg$c133 = "imageBuffer"; var peg$c134 = "iimageBuffer"; var peg$c135 = "uimageBuffer"; var peg$c136 = "image1DArray"; var peg$c137 = "iimage1DArray"; var peg$c138 = "uimage1DArray"; var peg$c139 = "image2DArray"; var peg$c140 = "iimage2DArray"; var peg$c141 = "uimage2DArray"; var peg$c142 = "imageCubeArray"; var peg$c143 = "iimageCubeArray"; var peg$c144 = "uimageCubeArray"; var peg$c145 = "image2DMS"; var peg$c146 = "iimage2DMS"; var peg$c147 = "uimage2DMS"; var peg$c148 = "image2DMArray"; var peg$c149 = "iimage2DMSArray"; var peg$c150 = "uimage2DMSArray"; var peg$c151 = "struct"; var peg$c152 = "void"; var peg$c153 = "while"; var peg$c154 = "invariant"; var peg$c155 = "precise"; var peg$c156 = "highp"; var peg$c157 = "mediump"; var peg$c158 = "lowp"; var peg$c159 = "precision"; var peg$c160 = "true"; var peg$c161 = "false"; var peg$c162 = "<<"; var peg$c163 = ">>"; var peg$c164 = "++"; var peg$c165 = "--"; var peg$c166 = "<="; var peg$c167 = ">="; var peg$c168 = "=="; var peg$c169 = "!="; var peg$c170 = "&&"; var peg$c171 = "||"; var peg$c172 = "^^"; var peg$c173 = "*="; var peg$c174 = "/="; var peg$c175 = "+="; var peg$c176 = "%="; var peg$c177 = "<<="; var peg$c178 = ">>="; var peg$c179 = "&="; var peg$c180 = "^="; var peg$c181 = "|="; var peg$c182 = "-="; var peg$c183 = "("; var peg$c184 = ")"; var peg$c185 = "["; var peg$c186 = "]"; var peg$c187 = "{"; var peg$c188 = "}"; var peg$c189 = "."; var peg$c190 = ","; var peg$c191 = ":"; var peg$c192 = "="; var peg$c193 = ";"; var peg$c194 = "!"; var peg$c195 = "-"; var peg$c196 = "~"; var peg$c197 = "+"; var peg$c198 = "*"; var peg$c199 = "/"; var peg$c200 = "%"; var peg$c201 = "<"; var peg$c202 = ">"; var peg$c203 = "|"; var peg$c204 = "^"; var peg$c205 = "&"; var peg$c206 = "?"; var peg$c207 = "0"; var peg$c208 = "lf"; var peg$c209 = "LF"; var peg$c210 = "#"; var peg$c211 = "//"; var peg$c212 = "/*"; var peg$c213 = "*/"; var peg$r0 = /^[A-Za-z_]/; var peg$r1 = /^[A-Za-z_0-9]/; var peg$r2 = /^[uU]/; var peg$r3 = /^[1-9]/; var peg$r4 = /^[0-7]/; var peg$r5 = /^[xX]/; var peg$r6 = /^[0-9a-fA-F]/; var peg$r7 = /^[0-9]/; var peg$r8 = /^[eE]/; var peg$r9 = /^[+\-]/; var peg$r10 = /^[fF]/; var peg$r11 = /^[^\n]/; var peg$r12 = /^[ \t\n\r]/; var peg$e0 = peg$literalExpectation("attribute", false); var peg$e1 = peg$literalExpectation("varying", false); var peg$e2 = peg$literalExpectation("const", false); var peg$e3 = peg$literalExpectation("bool", false); var peg$e4 = peg$literalExpectation("float", false); var peg$e5 = peg$literalExpectation("double", false); var peg$e6 = peg$literalExpectation("int", false); var peg$e7 = peg$literalExpectation("uint", false); var peg$e8 = peg$literalExpectation("break", false); var peg$e9 = peg$literalExpectation("continue", false); var peg$e10 = peg$literalExpectation("do", false); var peg$e11 = peg$literalExpectation("else", false); var peg$e12 = peg$literalExpectation("for", false); var peg$e13 = peg$literalExpectation("if", false); var peg$e14 = peg$literalExpectation("discard", false); var peg$e15 = peg$literalExpectation("return", false); var peg$e16 = peg$literalExpectation("switch", false); var peg$e17 = peg$literalExpectation("case", false); var peg$e18 = peg$literalExpectation("default", false); var peg$e19 = peg$literalExpectation("subroutine", false); var peg$e20 = peg$literalExpectation("bvec2", false); var peg$e21 = peg$literalExpectation("bvec3", false); var peg$e22 = peg$literalExpectation("bvec4", false); var peg$e23 = peg$literalExpectation("ivec2", false); var peg$e24 = peg$literalExpectation("ivec3", false); var peg$e25 = peg$literalExpectation("ivec4", false); var peg$e26 = peg$literalExpectation("uvec2", false); var peg$e27 = peg$literalExpectation("uvec3", false); var peg$e28 = peg$literalExpectation("uvec4", false); var peg$e29 = peg$literalExpectation("vec2", false); var peg$e30 = peg$literalExpectation("vec3", false); var peg$e31 = peg$literalExpectation("vec4", false); var peg$e32 = peg$literalExpectation("mat2", false); var peg$e33 = peg$literalExpectation("mat3", false); var peg$e34 = peg$literalExpectation("mat4", false); var peg$e35 = peg$literalExpectation("centroid", false); var peg$e36 = peg$literalExpectation("in", false); var peg$e37 = peg$literalExpectation("out", false); var peg$e38 = peg$literalExpectation("inout", false); var peg$e39 = peg$literalExpectation("uniform", false); var peg$e40 = peg$literalExpectation("patch", false); var peg$e41 = peg$literalExpectation("sample", false); var peg$e42 = peg$literalExpectation("buffer", false); var peg$e43 = peg$literalExpectation("shared", false); var peg$e44 = peg$literalExpectation("coherent", false); var peg$e45 = peg$literalExpectation("volatile", false); var peg$e46 = peg$literalExpectation("restrict", false); var peg$e47 = peg$literalExpectation("readonly", false); var peg$e48 = peg$literalExpectation("writeonly", false); var peg$e49 = peg$literalExpectation("dvec2", false); var peg$e50 = peg$literalExpectation("dvec3", false); var peg$e51 = peg$literalExpectation("dvec4", false); var peg$e52 = peg$literalExpectation("dmat2", false); var peg$e53 = peg$literalExpectation("dmat3", false); var peg$e54 = peg$literalExpectation("dmat4", false); var peg$e55 = peg$literalExpectation("noperspective", false); var peg$e56 = peg$literalExpectation("flat", false); var peg$e57 = peg$literalExpectation("smooth", false); var peg$e58 = peg$literalExpectation("layout", false); var peg$e59 = peg$literalExpectation("mat2x2", false); var peg$e60 = peg$literalExpectation("mat2x3", false); var peg$e61 = peg$literalExpectation("mat2x4", false); var peg$e62 = peg$literalExpectation("mat3x2", false); var peg$e63 = peg$literalExpectation("mat3x3", false); var peg$e64 = peg$literalExpectation("mat3x4", false); var peg$e65 = peg$literalExpectation("mat4x2", false); var peg$e66 = peg$literalExpectation("mat4x3", false); var peg$e67 = peg$literalExpectation("mat4x4", false); var peg$e68 = peg$literalExpectation("dmat2x2", false); var peg$e69 = peg$literalExpectation("dmat2x3", false); var peg$e70 = peg$literalExpectation("dmat2x4", false); var peg$e71 = peg$literalExpectation("dmat3x2", false); var peg$e72 = peg$literalExpectation("dmat3x3", false); var peg$e73 = peg$literalExpectation("dmat3x4", false); var peg$e74 = peg$literalExpectation("dmat4x2", false); var peg$e75 = peg$literalExpectation("dmat4x3", false); var peg$e76 = peg$literalExpectation("dmat4x4", false); var peg$e77 = peg$literalExpectation("atomic_uint", false); var peg$e78 = peg$literalExpectation("sampler1D", false); var peg$e79 = peg$literalExpectation("sampler2D", false); var peg$e80 = peg$literalExpectation("sampler3D", false); var peg$e81 = peg$literalExpectation("samplerCube", false); var peg$e82 = peg$literalExpectation("sampler1DShadow", false); var peg$e83 = peg$literalExpectation("sampler2DShadow", false); var peg$e84 = peg$literalExpectation("samplerCubeShadow", false); var peg$e85 = peg$literalExpectation("sampler1DArray", false); var peg$e86 = peg$literalExpectation("sampler2DArray", false); var peg$e87 = peg$literalExpectation("sampler1DArrayShadow", false); var peg$e88 = peg$literalExpectation("sampler2DArrayshadow", false); var peg$e89 = peg$literalExpectation("isampler1D", false); var peg$e90 = peg$literalExpectation("isampler2D", false); var peg$e91 = peg$literalExpectation("isampler3D", false); var peg$e92 = peg$literalExpectation("isamplerCube", false); var peg$e93 = peg$literalExpectation("isampler1Darray", false); var peg$e94 = peg$literalExpectation("isampler2DArray", false); var peg$e95 = peg$literalExpectation("usampler1D", false); var peg$e96 = peg$literalExpectation("usampler2D", false); var peg$e97 = peg$literalExpectation("usampler3D", false); var peg$e98 = peg$literalExpectation("usamplerCube", false); var peg$e99 = peg$literalExpectation("usampler1DArray", false); var peg$e100 = peg$literalExpectation("usampler2DArray", false); var peg$e101 = peg$literalExpectation("sampler2DRect", false); var peg$e102 = peg$literalExpectation("sampler2DRectshadow", false); var peg$e103 = peg$literalExpectation("isampler2DRect", false); var peg$e104 = peg$literalExpectation("usampler2DRect", false); var peg$e105 = peg$literalExpectation("samplerBuffer", false); var peg$e106 = peg$literalExpectation("isamplerBuffer", false); var peg$e107 = peg$literalExpectation("usamplerBuffer", false); var peg$e108 = peg$literalExpectation("samplerCubeArray", false); var peg$e109 = peg$literalExpectation("samplerCubeArrayShadow", false); var peg$e110 = peg$literalExpectation("isamplerCubeArray", false); var peg$e111 = peg$literalExpectation("usamplerCubeArray", false); var peg$e112 = peg$literalExpectation("sampler2DMS", false); var peg$e113 = peg$literalExpectation("isampler2DMS", false); var peg$e114 = peg$literalExpectation("usampler2DMS", false); var peg$e115 = peg$literalExpectation("sampler2DMSArray", false); var peg$e116 = peg$literalExpectation("isampler2DMSArray", false); var peg$e117 = peg$literalExpectation("usampler2DMSArray", false); var peg$e118 = peg$literalExpectation("image1D", false); var peg$e119 = peg$literalExpectation("iimage1D", false); var peg$e120 = peg$literalExpectation("uimage1D", false); var peg$e121 = peg$literalExpectation("image2D", false); var peg$e122 = peg$literalExpectation("iimage2D", false); var peg$e123 = peg$literalExpectation("uimage2D", false); var peg$e124 = peg$literalExpectation("image3D", false); var peg$e125 = peg$literalExpectation("iimage3D", false); var peg$e126 = peg$literalExpectation("uimage3D", false); var peg$e127 = peg$literalExpectation("image2DRect", false); var peg$e128 = peg$literalExpectation("iimage2DRect", false); var peg$e129 = peg$literalExpectation("uimage2DRect", false); var peg$e130 = peg$literalExpectation("imageCube", false); var peg$e131 = peg$literalExpectation("iimageCube", false); var peg$e132 = peg$literalExpectation("uimageCube", false); var peg$e133 = peg$literalExpectation("imageBuffer", false); var peg$e134 = peg$literalExpectation("iimageBuffer", false); var peg$e135 = peg$literalExpectation("uimageBuffer", false); var peg$e136 = peg$literalExpectation("image1DArray", false); var peg$e137 = peg$literalExpectation("iimage1DArray", false); var peg$e138 = peg$literalExpectation("uimage1DArray", false); var peg$e139 = peg$literalExpectation("image2DArray", false); var peg$e140 = peg$literalExpectation("iimage2DArray", false); var peg$e141 = peg$literalExpectation("uimage2DArray", false); var peg$e142 = peg$literalExpectation("imageCubeArray", false); var peg$e143 = peg$literalExpectation("iimageCubeArray", false); var peg$e144 = peg$literalExpectation("uimageCubeArray", false); var peg$e145 = peg$literalExpectation("image2DMS", false); var peg$e146 = peg$literalExpectation("iimage2DMS", false); var peg$e147 = peg$literalExpectation("uimage2DMS", false); var peg$e148 = peg$literalExpectation("image2DMArray", false); var peg$e149 = peg$literalExpectation("iimage2DMSArray", false); var peg$e150 = peg$literalExpectation("uimage2DMSArray", false); var peg$e151 = peg$literalExpectation("struct", false); var peg$e152 = peg$literalExpectation("void", false); var peg$e153 = peg$literalExpectation("while", false); var peg$e154 = peg$literalExpectation("invariant", false); var peg$e155 = peg$literalExpectation("precise", false); var peg$e156 = peg$literalExpectation("highp", false); var peg$e157 = peg$literalExpectation("mediump", false); var peg$e158 = peg$literalExpectation("lowp", false); var peg$e159 = peg$literalExpectation("precision", false); var peg$e160 = peg$literalExpectation("true", false); var peg$e161 = peg$literalExpectation("false", false); var peg$e162 = peg$otherExpectation("keyword"); var peg$e163 = peg$literalExpectation("<<", false); var peg$e164 = peg$literalExpectation(">>", false); var peg$e165 = peg$literalExpectation("++", false); var peg$e166 = peg$literalExpectation("--", false); var peg$e167 = peg$literalExpectation("<=", false); var peg$e168 = peg$literalExpectation(">=", false); var peg$e169 = peg$literalExpectation("==", false); var peg$e170 = peg$literalExpectation("!=", false); var peg$e171 = peg$literalExpectation("&&", false); var peg$e172 = peg$literalExpectation("||", false); var peg$e173 = peg$literalExpectation("^^", false); var peg$e174 = peg$literalExpectation("*=", false); var peg$e175 = peg$literalExpectation("/=", false); var peg$e176 = peg$literalExpectation("+=", false); var peg$e177 = peg$literalExpectation("%=", false); var peg$e178 = peg$literalExpectation("<<=", false); var peg$e179 = peg$literalExpectation(">>=", false); var peg$e180 = peg$literalExpectation("&=", false); var peg$e181 = peg$literalExpectation("^=", false); var peg$e182 = peg$literalExpectation("|=", false); var peg$e183 = peg$literalExpectation("-=", false); var peg$e184 = peg$literalExpectation("(", false); var peg$e185 = peg$literalExpectation(")", false); var peg$e186 = peg$literalExpectation("[", false); var peg$e187 = peg$literalExpectation("]", false); var peg$e188 = peg$literalExpectation("{", false); var peg$e189 = peg$literalExpectation("}", false); var peg$e190 = peg$literalExpectation(".", false); var peg$e191 = peg$literalExpectation(",", false); var peg$e192 = peg$literalExpectation(":", false); var peg$e193 = peg$literalExpectation("=", false); var peg$e194 = peg$literalExpectation(";", false); var peg$e195 = peg$literalExpectation("!", false); var peg$e196 = peg$literalExpectation("-", false); var peg$e197 = peg$literalExpectation("~", false); var peg$e198 = peg$literalExpectation("+", false); var peg$e199 = peg$literalExpectation("*", false); var peg$e200 = peg$literalExpectation("/", false); var peg$e201 = peg$literalExpectation("%", false); var peg$e202 = peg$literalExpectation("<", false); var peg$e203 = peg$literalExpectation(">", false); var peg$e204 = peg$literalExpectation("|", false); var peg$e205 = peg$literalExpectation("^", false); var peg$e206 = peg$literalExpectation("&", false); var peg$e207 = peg$literalExpectation("?", false); var peg$e208 = peg$classExpectation([["A", "Z"], ["a", "z"], "_"], false, false); var peg$e209 = peg$classExpectation([["A", "Z"], ["a", "z"], "_", ["0", "9"]], false, false); var peg$e210 = peg$classExpectation(["u", "U"], false, false); var peg$e211 = peg$classExpectation([["1", "9"]], false, false); var peg$e212 = peg$literalExpectation("0", false); var peg$e213 = peg$classExpectation([["0", "7"]], false, false); var peg$e214 = peg$classExpectation(["x", "X"], false, false); var peg$e215 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"]], false, false); var peg$e216 = peg$classExpectation([["0", "9"]], false, false); var peg$e217 = peg$otherExpectation("exponent"); var peg$e218 = peg$classExpectation(["e", "E"], false, false); var peg$e219 = peg$classExpectation(["+", "-"], false, false); var peg$e220 = peg$classExpectation(["f", "F"], false, false); var peg$e221 = peg$literalExpectation("lf", false); var peg$e222 = peg$literalExpectation("LF", false); var peg$e223 = peg$otherExpectation("primary expression"); var peg$e224 = peg$otherExpectation("unary expression"); var peg$e225 = peg$otherExpectation("equality expression"); var peg$e226 = peg$otherExpectation("and expression"); var peg$e227 = peg$otherExpectation("asignment"); var peg$e228 = peg$otherExpectation("expression"); var peg$e229 = peg$otherExpectation("precision statement"); var peg$e230 = peg$otherExpectation("function prototype"); var peg$e231 = peg$otherExpectation("function header"); var peg$e232 = peg$otherExpectation("function parameters"); var peg$e233 = peg$otherExpectation("parameter declaration"); var peg$e234 = peg$otherExpectation("parameter declarator"); var peg$e235 = peg$otherExpectation("single type qualifier"); var peg$e236 = peg$otherExpectation("interpolation qualifier"); var peg$e237 = peg$otherExpectation("storage qualifier"); var peg$e238 = peg$otherExpectation("type specifier"); var peg$e239 = peg$otherExpectation("array specifier"); var peg$e240 = peg$otherExpectation("precision qualifier"); var peg$e241 = peg$otherExpectation("struct specifier"); var peg$e242 = peg$otherExpectation("iteration statement"); var peg$e243 = peg$otherExpectation("jump statement"); var peg$e244 = peg$otherExpectation("prepocessor"); var peg$e245 = peg$literalExpectation("#", false); var peg$e246 = peg$classExpectation(["\n"], true, false); var peg$e247 = peg$otherExpectation("whitespace"); var peg$e248 = peg$literalExpectation("//", false); var peg$e249 = peg$literalExpectation("/*", false); var peg$e250 = peg$literalExpectation("*/", false); var peg$e251 = peg$anyExpectation(); var peg$e252 = peg$classExpectation([" ", "\t", "\n", "\r"], false, false); var peg$f0 = function(ws, program) { return { type: 'program', ws, program, scopes }; }; var peg$f1 = function(token, t) { return node('keyword', { token, whitespace: t }); }; var peg$f2 = function(token, _) { return node('float_constant', { token, whitespace: _ }); }; var peg$f3 = function(token, _) { return node('double_constant', { token, whitespace: _ }); }; var peg$f4 = function(token, _) { return node('int_constant', { token, whitespace: _ }); }; var peg$f5 = function(token, _) { return node('uint_constant', { token, whitespace: _ }); }; var peg$f6 = function(token, _) { return node('bool_constant', { token, whitespace:_ }); }; var peg$f7 = function(token, _) { return node('literal', { literal: token, whitespace: _ }); }; var peg$f8 = function(identifier, _) { return node('identifier', { identifier, whitespace: _ }); }; var peg$f9 = function(ident) { const { identifier } = ident; // We do scope checking and parsing all in one pass. In the case of calling an // undefined function, here, we don't know that we're in a function, so we // can't warn appropriately. If we return false for the missing typename, the // program won't parse, since the function call node won't match since it uses // type_name for the function_identifier. So all we can do here is go on our // merry way if the type isn't known. // This only applies to structs. I'm not sure if it's right. Because TYPE_NAME // is used in lots of places, it's easier to put this check here. let found; if(found = findTypeScope(scope, identifier)) { addTypeReference(found, identifier, ident); // I removed this because a type name reference here can't be renamed because // it's just a string and we don't know the parent node. This might apply // to the type reference above as well // } else if(found = findFunctionScope(scope, identifier)) { // addFunctionReference(found, identifier, identifier); } return ident; }; var peg$f10 = function(lp, expression, rp) { return node('group', { lp, expression, rp }); }; var peg$f11 = function(ident) { const { identifier } = ident; addBindingReference(scope, identifier, ident); return ident; }; var peg$f12 = function(body) { // Postfix becomes a left associative tree return body.flat().reduceRight((postfix, expr) => postfix ? node('postfix', { expr, postfix }) : expr ); }; var peg$f13 = function(lb, expr, rb) { return node('quantifier', { lb, expr, rb }); }; var peg$f14 = function(dot, selection) { return node('field_selection', { dot, selection }); }; var peg$f15 = function(identifier, args, rp) { // Warning: This may be brittle. The langauge spec says that a // function_call name is a "type_specifier" which can be "float[3](...)" // or a TYPE_NAME. If it's a TYPE_NAME, it will have an identifier, so // add it to the referenced scope. If it's a constructor (the "float" // case) it won't, so don't add a reference ot it const fnName = (identifier.identifier.type === 'postfix') ? identifier.identifier.expr.identifier.specifier.identifier : identifier.identifier.specifier.identifier; const n = node('function_call', { ...identifier, args, rp }); // struct constructors are stored in scope types, not scope functions, // skip them (the isDeclaredType check) if(fnName && !isDeclaredType(scope, fnName) && !builtIns.has(fnName)) { if(!isDeclaredFunction(scope, fnName)) { warn(`Warning: Function "${fnName}" has not been declared`); } addFunctionReference(scope, fnName, n); } return n; }; var peg$f16 = function(v) { return [v]; }; var peg$f17 = function(head, tail) { // For convenience, we don't store commas as trees, but rather flatten // into an array return [head, ...tail.flat()]; }; var peg$f18 = function(head, suffix, lp) { return { head: [head, suffix], lp }; }; var peg$f19 = function(identifier) { return { lp: identifier.lp, identifier: [identifier.head].flat().reduceRight((postfix, expr) => postfix ? node('postfix', { expr, postfix }) : expr ) }; }; var peg$f20 = function(identifier, lp, args, rp) { return node('function_call', { identifier, lp, args, rp }); }; var peg$f21 = function(operator, expression) { return node('unary', { operator, expression }); }; var peg$f22 = function(head, tail) { return leftAssociate(head, tail); }; var peg$f23 = function(expr, question, left, colon, right) { return { question, left, right, colon }; }; var peg$f24 = function(expr, suffix) { // ? and : operators are right associative, which happens automatically // in pegjs grammar return suffix ? node('ternary', { expr, ...suffix }) : expr }; var peg$f25 = function(left, operator, right) { return node('assignment', { left, operator, right }); }; var peg$f26 = function(declaration) { return node( 'declaration_statement', { declaration: declaration[0], semi: declaration[1], } ); }; var peg$f27 = function(qualifiers, head, tail) { return node( 'qualifier_declarator', { qualifiers, // Head is optional, so remove falsey declarations: xnil([head, ...tail.map(t => t[1])]), commas: tail.map(t => t[0]) } ); }; var peg$f28 = function(qualifiers, interface_type, lp, declarations, rp, identifier) { const n = node( 'interface_declarator', { qualifiers, interface_type, lp, declarations, rp, identifier } ); createBindings(scope, [interface_type.identifier, n]); return n; }; var peg$f29 = function(prefix, qualifier, specifier) { return node('precision', { prefix, qualifier, specifier }); }; var peg$f30 = function(header, params, rp) { const bindings = (params?.parameters || []) // Ignore any param without an identifier, aka main(void) .filter(p => !!p.declaration.identifier) .map(p => [p.declaration.identifier.identifier, p]); createBindings(scope, ...bindings); return node('function_prototype', { header, ...params, rp }); }; var peg$f31 = function(returnType, name, lp) { const n = node( 'function_header', { returnType, name, lp } ); addFunctionReference(scope, name.identifier, n); scope = pushScope(makeScope(name.identifier, scope)); return n; }; var peg$f32 = function(head, tail) { return { parameters: [head, ...tail.map(t => t[1])], commas: tail.map(t => t[0]) } }; var peg$f33 = function(qualifier, declaration) { return node( 'parameter_declaration', { qualifier, declaration } ); }; var peg$f34 = function(specifier, identifier, quantifier) { return node( 'parameter_declarator', { specifier, identifier, quantifier } ); }; var peg$f35 = function(head, tail) { const declarations = [ head.declaration, ...tail.map(t => t[1]) ].filter(decl => !!decl.identifier); createBindings(scope, ...declarations.map(decl => [decl.identifier.identifier, decl])); // TODO: I might need to start storing node parents for easy traversal return node( 'declarator_list', { specified_type: head.specified_type, declarations, commas: tail.map(t => t[0]) } ); }; var peg$f36 = function(identifier, quantifier, suffix) { const [operator, initializer] = suffix || []; return node( 'declaration', { identifier, quantifier, operator, initializer } ); }; var peg$f37 = function(specified_type, suffix) { // No gaurantee of a suffix because fully_specified_type contains a // type_specifier which includes structs and type_names (IDENTIFIERs) const [identifier, quantifier, suffix_tail] = suffix || []; const [operator, initializer] = suffix_tail || []; // Break out the specified type so it can be grouped into the // declarator_list return { declaration: node( 'declaration', { identifier, quantifier, operator, initializer } ), specified_type }; }; var peg$f38 = function(qualifiers, specifier) { return node( 'fully_specified_type', { qualifiers, specifier } ); }; var peg$f39 = function(layout, lp, head, tail) { return { qualifiers: [head, ...tail.map(t => t[1])], commas: tail.map(t => t[0]) }; }; var peg$f40 = function(layout, lp, qualifiers, rp) { return node( 'layout_qualifier', { layout, lp, ...qualifiers, rp } ); }; var peg$f41 = function(identifier, tail) { const [operator, expression] = tail || []; return node('layout_qualifier_id', { identifier, operator, expression }); }; var peg$f42 = function(subroutine, lp, head, tail, rp) { return { lp, type_names: [head, ...tail.map(t => t[1])], commas: tail.map(t => t[0]), rp, }; }; var peg$f43 = function(subroutine, type_names) { return node( 'subroutine_qualifier', { subroutine, ...type_names, } ); }; var peg$f44 = function(specifier, quantifier) { return node('type_specifier', { specifier, quantifier }); }; var peg$f45 = function(lb, expression, rb) { return node('array_specifier', { lb, expression, rb }); }; var peg$f46 = function(specifiers) { return node('array_specifiers', { specifiers }); }; var peg$f47 = function(struct, typeName, lb, declarations, rb) { const n = node('struct', { lb, declarations, rb, struct, typeName }); // Anonymous structs don't get a type name if(typeName) { addTypes(scope, [typeName.identifier, n]); // Struct names also become constructors for functions. Needing to track // this as both a type and a function makes me think my scope data model // is probably wrong // addFunctionReference(scope, typeName.identifier, n); } return n; }; var peg$f48 = function(declaration, semi) { return node('struct_declaration', { declaration, semi }); }; var peg$f49 = function(specified_type, head, tail) { return node( 'struct_declarator', { specified_type, declarations: [head, ...tail.map(t => t[1])], commas: tail.map(t => t[0]) } ); }; var peg$f50 = function(identifier, quantifier) { return node('quantified_identifier', { identifier, quantifier }); }; var peg$f51 = function(lb, head, tail, trailing, rb) { // TODO: Scope return node( 'initializer_list', { lb, initializers: [head, ...tail.map(t => t[1])], commas: xnil(tail.map(t => t[0]), trailing), rb } ); }; var peg$f52 = function(sym) { // Apparently peggy can't handle an open curly brace in a string scope = pushScope(makeScope(OPEN_CURLY, scope)); return sym; }; var peg$f53 = function(lb, statements, rb) { scope = popScope(scope); return node( 'compound_statement', { lb, statements: (statements || []).flat(), rb } ); }; var peg$f54 = function(lb, statements, rb) { return node( 'compound_statement', { lb, statements: (statements || []).flat(), rb } ); }; var peg$f55 = function(expression, semi) { return node('expression_statement', { expression, semi }); }; var peg$f56 = function(ifSymbol, lp, condition, rp, tail) { const [body, elseBranch] = tail; return node( 'if_statement', { 'if': ifSymbol, body, lp, condition, rp, ...elseBranch && { 'else': elseBranch.flat() }, }); }; var peg$f57 = function(switchSymbol, lp, expression, rp, lb, statements, rb) { // TODO: Scope? return node( 'switch_statement', { switch: switchSymbol, lp, expression, rp, lb, cases: groupCases(statements), rb } ); }; var peg$f58 = function(caseSymbol, test, colon) { return node('case_label', { 'case': caseSymbol, test, colon }); }; var peg$f59 = function(defaultSymbol, colon) { return node('default_label', { default: defaultSymbol, colon }); }; var peg$f60 = function(sym) { scope = pushScope(makeScope('while', scope)); return sym; }; var peg$f61 = function(whileSymbol, lp, condition, rp, body) { scope = popScope(scope); return node( 'while_statement', { while: whileSymbol, lp, condition, rp, body } ); }; var peg$f62 = function(doSymbol, body, whileSymbol, lp, expression, rp, semi) { return node( 'do_statement', { do: doSymbol, body, while: whileSymbol, lp, expression, rp, semi } ); }; var peg$f63 = function(sym) { scope = pushScope(makeScope('for', scope)); return sym; }; var peg$f64 = function(forSymbol, lp, init, condition, conditionSemi, operation, rp, body) { scope = popScope(scope); return node( 'for_statement', { 'for': forSymbol, body, lp, init: init.expression || init.declaration, initSemi: init.semi, condition, conditionSemi, operation, rp, body } ); }; var peg$f65 = function(specified_type, identifier, op, initializer) { const n = node( 'condition_expression', { specified_type, identifier, op, initializer } ); createBindings(scope, [identifier.identifier, n]); return n; }; var peg$f66 = function(jump, semi) { return node('continue_statement', { continue: jump, semi }); }; var peg$f67 = function(jump, semi) { return node('break_statement', { break: jump, semi }); }; var peg$f68 = function(jump, expression, semi) { return node('return_statement', { return: jump, expression, semi }); }; var peg$f69 = function(jump, semi) { // Fragment shader only. return node('discard_statement', { discard: jump, semi }); }; var peg$f70 = function(line, _) { return node('preprocessor', { line, _ }); }; var peg$f71 = function(prototype, body) { const n = node('function', { prototype, body }); scope = popScope(scope); // addFunctionReference(scope, prototype.header.name.identifier, n); return n; }; var peg$f72 = function(w, rest) { return collapse(w, rest); }; var peg$f73 = function(a, x, cc) { return xnil(x, cc); }; var peg$f74 = function(a, d) { return xnil(a, d.flat()); }; var peg$f75 = function(i) { return i; }; var peg$f76 = function(_) { return _; }; var peg$currPos = 0; var peg$savedPos = 0; var peg$posDetailsCache = [{ line: 1, column: 1 }]; var peg$maxFailPos = 0; var peg$maxFailExpected = []; var peg$silentFails = 0; var peg$resultsCache = {}; var peg$result; if ("startRule" in options) { if (!(options.startRule in peg$startRuleFunctions)) { throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); } peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; } function text() { return input.substring(peg$savedPos, peg$currPos); } function offset() { return peg$savedPos; } function range() { return { source: peg$source, start: peg$savedPos, end: peg$currPos }; } function location() { return peg$computeLocation(peg$savedPos, peg$currPos); } function expected(description, location) { location = location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos); throw peg$buildStructuredError( [peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location ); } function error(message, location) { location = location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos); throw peg$buildSimpleError(message, location); } function peg$literalExpectation(text, ignoreCase) { return { type: "literal", text: text, ignoreCase: ignoreCase }; } function peg$classExpectation(parts, inverted, ignoreCase) { return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; } function peg$anyExpectation() { return { type: "any" }; } function peg$endExpectation() { return { type: "end" }; } function peg$otherExpectation(description) { return { type: "other", description: description }; } function peg$computePosDetails(pos) { var details = peg$posDetailsCache[pos]; var p; if (details) { return details; } else { p = pos - 1; while (!peg$posDetailsCache[p]) { p--; } details = peg$posDetailsCache[p]; details = { line: details.line, column: details.column }; while (p < pos) { if (input.charCodeAt(p) === 10) { details.line++; details.column = 1; } else { details.column++; } p++; } peg$posDetailsCache[pos] = details; return details; } } function peg$computeLocation(startPos, endPos) { var startPosDetails = peg$computePosDetails(startPos); var endPosDetails = peg$computePosDetails(endPos); return { source: peg$source, start: { offset: startPos, line: startPosDetails.line, column: startPosDetails.column }, end: { offset: endPos, line: endPosDetails.line, column: endPosDetails.column } }; } function peg$fail(expected) { if (peg$currPos < peg$maxFailPos) { return; } if (peg$currPos > peg$maxFailPos) { peg$maxFailPos = peg$currPos; peg$maxFailExpected = []; } peg$maxFailExpected.push(expected); } function peg$buildSimpleError(message, location) { return new peg$SyntaxError(message, null, null, location); } function peg$buildStructuredError(expected, found, location) { return new peg$SyntaxError( peg$SyntaxError.buildMessage(expected, found), expected, found, location ); } function peg$parsestart() { var s0, s1, s2; var key = peg$currPos * 305 + 0; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parse_(); s2 = peg$parsetranslation_unit(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f0(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseATTRIBUTE() { var s0, s1, s2; var key = peg$currPos * 305 + 1; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c0) { s1 = peg$c0; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e0); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVARYING() { var s0, s1, s2; var key = peg$currPos * 305 + 2; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c1) { s1 = peg$c1; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e1); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCONST() { var s0, s1, s2; var key = peg$currPos * 305 + 3; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c2) { s1 = peg$c2; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e2); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBOOL() { var s0, s1, s2; var key = peg$currPos * 305 + 4; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c3) { s1 = peg$c3; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e3); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseFLOAT() { var s0, s1, s2; var key = peg$currPos * 305 + 5; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c4) { s1 = peg$c4; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e4); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDOUBLE() { var s0, s1, s2; var key = peg$currPos * 305 + 6; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c5) { s1 = peg$c5; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e5); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseINT() { var s0, s1, s2; var key = peg$currPos * 305 + 7; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 3) === peg$c6) { s1 = peg$c6; peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e6); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUINT() { var s0, s1, s2; var key = peg$currPos * 305 + 8; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c7) { s1 = peg$c7; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e7); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBREAK() { var s0, s1, s2; var key = peg$currPos * 305 + 9; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c8) { s1 = peg$c8; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e8); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCONTINUE() { var s0, s1, s2; var key = peg$currPos * 305 + 10; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c9) { s1 = peg$c9; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e9); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDO() { var s0, s1, s2; var key = peg$currPos * 305 + 11; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c10) { s1 = peg$c10; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e10); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseELSE() { var s0, s1, s2; var key = peg$currPos * 305 + 12; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c11) { s1 = peg$c11; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e11); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseFOR() { var s0, s1, s2; var key = peg$currPos * 305 + 13; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 3) === peg$c12) { s1 = peg$c12; peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e12); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIF() { var s0, s1, s2; var key = peg$currPos * 305 + 14; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c13) { s1 = peg$c13; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e13); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDISCARD() { var s0, s1, s2; var key = peg$currPos * 305 + 15; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c14) { s1 = peg$c14; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e14); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRETURN() { var s0, s1, s2; var key = peg$currPos * 305 + 16; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c15) { s1 = peg$c15; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e15); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSWITCH() { var s0, s1, s2; var key = peg$currPos * 305 + 17; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c16) { s1 = peg$c16; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e16); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCASE() { var s0, s1, s2; var key = peg$currPos * 305 + 18; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c17) { s1 = peg$c17; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e17); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDEFAULT() { var s0, s1, s2; var key = peg$currPos * 305 + 19; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c18) { s1 = peg$c18; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e18); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSUBROUTINE() { var s0, s1, s2; var key = peg$currPos * 305 + 20; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c19) { s1 = peg$c19; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e19); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBVEC2() { var s0, s1, s2; var key = peg$currPos * 305 + 21; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c20) { s1 = peg$c20; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e20); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBVEC3() { var s0, s1, s2; var key = peg$currPos * 305 + 22; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c21) { s1 = peg$c21; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e21); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBVEC4() { var s0, s1, s2; var key = peg$currPos * 305 + 23; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c22) { s1 = peg$c22; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e22); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIVEC2() { var s0, s1, s2; var key = peg$currPos * 305 + 24; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c23) { s1 = peg$c23; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e23); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIVEC3() { var s0, s1, s2; var key = peg$currPos * 305 + 25; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c24) { s1 = peg$c24; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e24); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIVEC4() { var s0, s1, s2; var key = peg$currPos * 305 + 26; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c25) { s1 = peg$c25; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e25); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUVEC2() { var s0, s1, s2; var key = peg$currPos * 305 + 27; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c26) { s1 = peg$c26; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e26); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUVEC3() { var s0, s1, s2; var key = peg$currPos * 305 + 28; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c27) { s1 = peg$c27; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e27); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUVEC4() { var s0, s1, s2; var key = peg$currPos * 305 + 29; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c28) { s1 = peg$c28; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e28); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVEC2() { var s0, s1, s2; var key = peg$currPos * 305 + 30; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c29) { s1 = peg$c29; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e29); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVEC3() { var s0, s1, s2; var key = peg$currPos * 305 + 31; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c30) { s1 = peg$c30; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e30); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVEC4() { var s0, s1, s2; var key = peg$currPos * 305 + 32; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c31) { s1 = peg$c31; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e31); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT2() { var s0, s1, s2; var key = peg$currPos * 305 + 33; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c32) { s1 = peg$c32; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e32); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT3() { var s0, s1, s2; var key = peg$currPos * 305 + 34; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c33) { s1 = peg$c33; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e33); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT4() { var s0, s1, s2; var key = peg$currPos * 305 + 35; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c34) { s1 = peg$c34; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e34); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCENTROID() { var s0, s1, s2; var key = peg$currPos * 305 + 36; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c35) { s1 = peg$c35; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e35); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIN() { var s0, s1, s2; var key = peg$currPos * 305 + 37; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c36) { s1 = peg$c36; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e36); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseOUT() { var s0, s1, s2; var key = peg$currPos * 305 + 38; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 3) === peg$c37) { s1 = peg$c37; peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e37); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseINOUT() { var s0, s1, s2; var key = peg$currPos * 305 + 39; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c38) { s1 = peg$c38; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUNIFORM() { var s0, s1, s2; var key = peg$currPos * 305 + 40; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c39) { s1 = peg$c39; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e39); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePATCH() { var s0, s1, s2; var key = peg$currPos * 305 + 41; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c40) { s1 = peg$c40; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e40); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLE() { var s0, s1, s2; var key = peg$currPos * 305 + 42; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c41) { s1 = peg$c41; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e41); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 43; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c42) { s1 = peg$c42; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e42); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSHARED() { var s0, s1, s2; var key = peg$currPos * 305 + 44; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c43) { s1 = peg$c43; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e43); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCOHERENT() { var s0, s1, s2; var key = peg$currPos * 305 + 45; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c44) { s1 = peg$c44; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVOLATILE() { var s0, s1, s2; var key = peg$currPos * 305 + 46; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c45) { s1 = peg$c45; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRESTRICT() { var s0, s1, s2; var key = peg$currPos * 305 + 47; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c46) { s1 = peg$c46; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e46); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseREADONLY() { var s0, s1, s2; var key = peg$currPos * 305 + 48; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c47) { s1 = peg$c47; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e47); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseWRITEONLY() { var s0, s1, s2; var key = peg$currPos * 305 + 49; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c48) { s1 = peg$c48; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e48); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDVEC2() { var s0, s1, s2; var key = peg$currPos * 305 + 50; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c49) { s1 = peg$c49; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e49); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDVEC3() { var s0, s1, s2; var key = peg$currPos * 305 + 51; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c50) { s1 = peg$c50; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e50); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDVEC4() { var s0, s1, s2; var key = peg$currPos * 305 + 52; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c51) { s1 = peg$c51; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e51); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT2() { var s0, s1, s2; var key = peg$currPos * 305 + 53; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c52) { s1 = peg$c52; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e52); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT3() { var s0, s1, s2; var key = peg$currPos * 305 + 54; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c53) { s1 = peg$c53; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e53); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT4() { var s0, s1, s2; var key = peg$currPos * 305 + 55; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c54) { s1 = peg$c54; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e54); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseNOPERSPECTIVE() { var s0, s1, s2; var key = peg$currPos * 305 + 56; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c55) { s1 = peg$c55; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e55); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseFLAT() { var s0, s1, s2; var key = peg$currPos * 305 + 57; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c56) { s1 = peg$c56; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e56); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSMOOTH() { var s0, s1, s2; var key = peg$currPos * 305 + 58; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c57) { s1 = peg$c57; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e57); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLAYOUT() { var s0, s1, s2; var key = peg$currPos * 305 + 59; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c58) { s1 = peg$c58; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT2X2() { var s0, s1, s2; var key = peg$currPos * 305 + 60; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c59) { s1 = peg$c59; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e59); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT2X3() { var s0, s1, s2; var key = peg$currPos * 305 + 61; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c60) { s1 = peg$c60; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT2X4() { var s0, s1, s2; var key = peg$currPos * 305 + 62; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c61) { s1 = peg$c61; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT3X2() { var s0, s1, s2; var key = peg$currPos * 305 + 63; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c62) { s1 = peg$c62; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT3X3() { var s0, s1, s2; var key = peg$currPos * 305 + 64; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c63) { s1 = peg$c63; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT3X4() { var s0, s1, s2; var key = peg$currPos * 305 + 65; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c64) { s1 = peg$c64; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT4X2() { var s0, s1, s2; var key = peg$currPos * 305 + 66; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c65) { s1 = peg$c65; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT4X3() { var s0, s1, s2; var key = peg$currPos * 305 + 67; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c66) { s1 = peg$c66; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e66); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMAT4X4() { var s0, s1, s2; var key = peg$currPos * 305 + 68; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c67) { s1 = peg$c67; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e67); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT2X2() { var s0, s1, s2; var key = peg$currPos * 305 + 69; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c68) { s1 = peg$c68; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e68); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT2X3() { var s0, s1, s2; var key = peg$currPos * 305 + 70; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c69) { s1 = peg$c69; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e69); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT2X4() { var s0, s1, s2; var key = peg$currPos * 305 + 71; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c70) { s1 = peg$c70; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e70); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT3X2() { var s0, s1, s2; var key = peg$currPos * 305 + 72; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c71) { s1 = peg$c71; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e71); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT3X3() { var s0, s1, s2; var key = peg$currPos * 305 + 73; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c72) { s1 = peg$c72; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e72); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT3X4() { var s0, s1, s2; var key = peg$currPos * 305 + 74; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c73) { s1 = peg$c73; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e73); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT4X2() { var s0, s1, s2; var key = peg$currPos * 305 + 75; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c74) { s1 = peg$c74; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e74); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT4X3() { var s0, s1, s2; var key = peg$currPos * 305 + 76; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c75) { s1 = peg$c75; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e75); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDMAT4X4() { var s0, s1, s2; var key = peg$currPos * 305 + 77; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c76) { s1 = peg$c76; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e76); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseATOMIC_UINT() { var s0, s1, s2; var key = peg$currPos * 305 + 78; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 11) === peg$c77) { s1 = peg$c77; peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER1D() { var s0, s1, s2; var key = peg$currPos * 305 + 79; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c78) { s1 = peg$c78; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2D() { var s0, s1, s2; var key = peg$currPos * 305 + 80; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c79) { s1 = peg$c79; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER3D() { var s0, s1, s2; var key = peg$currPos * 305 + 81; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c80) { s1 = peg$c80; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLERCUBE() { var s0, s1, s2; var key = peg$currPos * 305 + 82; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 11) === peg$c81) { s1 = peg$c81; peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER1DSHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 83; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c82) { s1 = peg$c82; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e82); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DSHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 84; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c83) { s1 = peg$c83; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e83); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLERCUBESHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 85; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 17) === peg$c84) { s1 = peg$c84; peg$currPos += 17; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e84); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER1DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 86; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c85) { s1 = peg$c85; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e85); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 87; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c86) { s1 = peg$c86; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e86); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER1DARRAYSHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 88; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 20) === peg$c87) { s1 = peg$c87; peg$currPos += 20; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e87); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DARRAYSHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 89; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 20) === peg$c88) { s1 = peg$c88; peg$currPos += 20; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e88); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER1D() { var s0, s1, s2; var key = peg$currPos * 305 + 90; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c89) { s1 = peg$c89; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e89); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER2D() { var s0, s1, s2; var key = peg$currPos * 305 + 91; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c90) { s1 = peg$c90; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e90); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER3D() { var s0, s1, s2; var key = peg$currPos * 305 + 92; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c91) { s1 = peg$c91; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e91); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLERCUBE() { var s0, s1, s2; var key = peg$currPos * 305 + 93; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c92) { s1 = peg$c92; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e92); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER1DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 94; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c93) { s1 = peg$c93; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e93); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER2DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 95; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c94) { s1 = peg$c94; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e94); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER1D() { var s0, s1, s2; var key = peg$currPos * 305 + 96; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c95) { s1 = peg$c95; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e95); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER2D() { var s0, s1, s2; var key = peg$currPos * 305 + 97; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c96) { s1 = peg$c96; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e96); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER3D() { var s0, s1, s2; var key = peg$currPos * 305 + 98; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c97) { s1 = peg$c97; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e97); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLERCUBE() { var s0, s1, s2; var key = peg$currPos * 305 + 99; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c98) { s1 = peg$c98; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e98); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER1DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 100; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c99) { s1 = peg$c99; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e99); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER2DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 101; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c100) { s1 = peg$c100; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e100); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DRECT() { var s0, s1, s2; var key = peg$currPos * 305 + 102; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c101) { s1 = peg$c101; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e101); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DRECTSHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 103; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 19) === peg$c102) { s1 = peg$c102; peg$currPos += 19; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e102); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER2DRECT() { var s0, s1, s2; var key = peg$currPos * 305 + 104; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c103) { s1 = peg$c103; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e103); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER2DRECT() { var s0, s1, s2; var key = peg$currPos * 305 + 105; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c104) { s1 = peg$c104; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e104); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLERBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 106; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c105) { s1 = peg$c105; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e105); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLERBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 107; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c106) { s1 = peg$c106; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e106); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLERBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 108; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c107) { s1 = peg$c107; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e107); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLERCUBEARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 109; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 16) === peg$c108) { s1 = peg$c108; peg$currPos += 16; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e108); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLERCUBEARRAYSHADOW() { var s0, s1, s2; var key = peg$currPos * 305 + 110; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 22) === peg$c109) { s1 = peg$c109; peg$currPos += 22; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e109); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLERCUBEARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 111; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 17) === peg$c110) { s1 = peg$c110; peg$currPos += 17; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e110); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLERCUBEARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 112; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 17) === peg$c111) { s1 = peg$c111; peg$currPos += 17; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e111); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DMS() { var s0, s1, s2; var key = peg$currPos * 305 + 113; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 11) === peg$c112) { s1 = peg$c112; peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e112); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER2DMS() { var s0, s1, s2; var key = peg$currPos * 305 + 114; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c113) { s1 = peg$c113; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e113); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER2DMS() { var s0, s1, s2; var key = peg$currPos * 305 + 115; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c114) { s1 = peg$c114; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e114); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSAMPLER2DMSARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 116; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 16) === peg$c115) { s1 = peg$c115; peg$currPos += 16; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e115); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseISAMPLER2DMSARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 117; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 17) === peg$c116) { s1 = peg$c116; peg$currPos += 17; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e116); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUSAMPLER2DMSARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 118; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 17) === peg$c117) { s1 = peg$c117; peg$currPos += 17; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e117); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE1D() { var s0, s1, s2; var key = peg$currPos * 305 + 119; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c118) { s1 = peg$c118; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e118); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE1D() { var s0, s1, s2; var key = peg$currPos * 305 + 120; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c119) { s1 = peg$c119; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e119); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE1D() { var s0, s1, s2; var key = peg$currPos * 305 + 121; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c120) { s1 = peg$c120; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e120); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE2D() { var s0, s1, s2; var key = peg$currPos * 305 + 122; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c121) { s1 = peg$c121; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e121); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE2D() { var s0, s1, s2; var key = peg$currPos * 305 + 123; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c122) { s1 = peg$c122; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e122); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE2D() { var s0, s1, s2; var key = peg$currPos * 305 + 124; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c123) { s1 = peg$c123; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e123); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE3D() { var s0, s1, s2; var key = peg$currPos * 305 + 125; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c124) { s1 = peg$c124; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e124); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE3D() { var s0, s1, s2; var key = peg$currPos * 305 + 126; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c125) { s1 = peg$c125; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e125); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE3D() { var s0, s1, s2; var key = peg$currPos * 305 + 127; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 8) === peg$c126) { s1 = peg$c126; peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e126); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE2DRECT() { var s0, s1, s2; var key = peg$currPos * 305 + 128; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 11) === peg$c127) { s1 = peg$c127; peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e127); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE2DRECT() { var s0, s1, s2; var key = peg$currPos * 305 + 129; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c128) { s1 = peg$c128; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e128); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE2DRECT() { var s0, s1, s2; var key = peg$currPos * 305 + 130; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c129) { s1 = peg$c129; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e129); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGECUBE() { var s0, s1, s2; var key = peg$currPos * 305 + 131; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c130) { s1 = peg$c130; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e130); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGECUBE() { var s0, s1, s2; var key = peg$currPos * 305 + 132; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c131) { s1 = peg$c131; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e131); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGECUBE() { var s0, s1, s2; var key = peg$currPos * 305 + 133; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c132) { s1 = peg$c132; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e132); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGEBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 134; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 11) === peg$c133) { s1 = peg$c133; peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e133); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGEBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 135; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c134) { s1 = peg$c134; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e134); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGEBUFFER() { var s0, s1, s2; var key = peg$currPos * 305 + 136; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c135) { s1 = peg$c135; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e135); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE1DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 137; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c136) { s1 = peg$c136; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e136); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE1DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 138; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c137) { s1 = peg$c137; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e137); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE1DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 139; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c138) { s1 = peg$c138; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e138); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE2DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 140; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 12) === peg$c139) { s1 = peg$c139; peg$currPos += 12; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e139); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE2DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 141; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c140) { s1 = peg$c140; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e140); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE2DARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 142; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c141) { s1 = peg$c141; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e141); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGECUBEARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 143; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 14) === peg$c142) { s1 = peg$c142; peg$currPos += 14; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e142); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGECUBEARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 144; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c143) { s1 = peg$c143; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e143); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGECUBEARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 145; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c144) { s1 = peg$c144; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e144); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE2DMS() { var s0, s1, s2; var key = peg$currPos * 305 + 146; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c145) { s1 = peg$c145; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e145); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE2DMS() { var s0, s1, s2; var key = peg$currPos * 305 + 147; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c146) { s1 = peg$c146; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE2DMS() { var s0, s1, s2; var key = peg$currPos * 305 + 148; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 10) === peg$c147) { s1 = peg$c147; peg$currPos += 10; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e147); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIMAGE2DMSARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 149; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 13) === peg$c148) { s1 = peg$c148; peg$currPos += 13; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e148); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIIMAGE2DMSARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 150; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c149) { s1 = peg$c149; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e149); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUIMAGE2DMSARRAY() { var s0, s1, s2; var key = peg$currPos * 305 + 151; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 15) === peg$c150) { s1 = peg$c150; peg$currPos += 15; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e150); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSTRUCT() { var s0, s1, s2; var key = peg$currPos * 305 + 152; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 6) === peg$c151) { s1 = peg$c151; peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e151); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVOID() { var s0, s1, s2; var key = peg$currPos * 305 + 153; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c152) { s1 = peg$c152; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e152); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseWHILE() { var s0, s1, s2; var key = peg$currPos * 305 + 154; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c153) { s1 = peg$c153; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e153); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseINVARIANT() { var s0, s1, s2; var key = peg$currPos * 305 + 155; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c154) { s1 = peg$c154; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e154); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePRECISE() { var s0, s1, s2; var key = peg$currPos * 305 + 156; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c155) { s1 = peg$c155; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e155); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseHIGH_PRECISION() { var s0, s1, s2; var key = peg$currPos * 305 + 157; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 5) === peg$c156) { s1 = peg$c156; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e156); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMEDIUM_PRECISION() { var s0, s1, s2; var key = peg$currPos * 305 + 158; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 7) === peg$c157) { s1 = peg$c157; peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e157); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLOW_PRECISION() { var s0, s1, s2; var key = peg$currPos * 305 + 159; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c158) { s1 = peg$c158; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e158); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePRECISION() { var s0, s1, s2; var key = peg$currPos * 305 + 160; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 9) === peg$c159) { s1 = peg$c159; peg$currPos += 9; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e159); } } if (s1 !== peg$FAILED) { s2 = peg$parseterminal(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f1(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseFLOATCONSTANT() { var s0, s1, s2; var key = peg$currPos * 305 + 161; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefloating_constant(); if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f2(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDOUBLECONSTANT() { var s0, s1, s2; var key = peg$currPos * 305 + 162; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefloating_constant(); if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f3(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseINTCONSTANT() { var s0, s1, s2; var key = peg$currPos * 305 + 163; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseinteger_constant(); if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f4(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseUINTCONSTANT() { var s0, s1, s2; var key = peg$currPos * 305 + 164; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseinteger_constant(); if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f5(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBOOLCONSTANT() { var s0, s1, s2; var key = peg$currPos * 305 + 165; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 4) === peg$c160) { s1 = peg$c160; peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e160); } } if (s1 === peg$FAILED) { if (input.substr(peg$currPos, 5) === peg$c161) { s1 = peg$c161; peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e161); } } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f6(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsekeyword() { var s0, s1; var key = peg$currPos * 305 + 166; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseATTRIBUTE(); if (s0 === peg$FAILED) { s0 = peg$parseVARYING(); if (s0 === peg$FAILED) { s0 = peg$parseCONST(); if (s0 === peg$FAILED) { s0 = peg$parseBOOL(); if (s0 === peg$FAILED) { s0 = peg$parseFLOAT(); if (s0 === peg$FAILED) { s0 = peg$parseDOUBLE(); if (s0 === peg$FAILED) { s0 = peg$parseINT(); if (s0 === peg$FAILED) { s0 = peg$parseUINT(); if (s0 === peg$FAILED) { s0 = peg$parseBREAK(); if (s0 === peg$FAILED) { s0 = peg$parseCONTINUE(); if (s0 === peg$FAILED) { s0 = peg$parseDO(); if (s0 === peg$FAILED) { s0 = peg$parseELSE(); if (s0 === peg$FAILED) { s0 = peg$parseFOR(); if (s0 === peg$FAILED) { s0 = peg$parseIF(); if (s0 === peg$FAILED) { s0 = peg$parseDISCARD(); if (s0 === peg$FAILED) { s0 = peg$parseRETURN(); if (s0 === peg$FAILED) { s0 = peg$parseSWITCH(); if (s0 === peg$FAILED) { s0 = peg$parseCASE(); if (s0 === peg$FAILED) { s0 = peg$parseDEFAULT(); if (s0 === peg$FAILED) { s0 = peg$parseSUBROUTINE(); if (s0 === peg$FAILED) { s0 = peg$parseBVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseBVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseBVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseIVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseIVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseIVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseUVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseUVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseUVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4(); if (s0 === peg$FAILED) { s0 = peg$parseCENTROID(); if (s0 === peg$FAILED) { s0 = peg$parseIN(); if (s0 === peg$FAILED) { s0 = peg$parseOUT(); if (s0 === peg$FAILED) { s0 = peg$parseINOUT(); if (s0 === peg$FAILED) { s0 = peg$parseUNIFORM(); if (s0 === peg$FAILED) { s0 = peg$parsePATCH(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLE(); if (s0 === peg$FAILED) { s0 = peg$parseBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseSHARED(); if (s0 === peg$FAILED) { s0 = peg$parseCOHERENT(); if (s0 === peg$FAILED) { s0 = peg$parseVOLATILE(); if (s0 === peg$FAILED) { s0 = peg$parseRESTRICT(); if (s0 === peg$FAILED) { s0 = peg$parseREADONLY(); if (s0 === peg$FAILED) { s0 = peg$parseWRITEONLY(); if (s0 === peg$FAILED) { s0 = peg$parseDVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseDVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseDVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4(); if (s0 === peg$FAILED) { s0 = peg$parseNOPERSPECTIVE(); if (s0 === peg$FAILED) { s0 = peg$parseFLAT(); if (s0 === peg$FAILED) { s0 = peg$parseSMOOTH(); if (s0 === peg$FAILED) { s0 = peg$parseLAYOUT(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2X2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2X3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2X4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3X2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3X3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3X4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4X2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4X3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4X4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2X2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2X3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2X4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3X2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3X3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3X4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4X2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4X3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4X4(); if (s0 === peg$FAILED) { s0 = peg$parseATOMIC_UINT(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1D(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2D(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER3D(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBE(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1DSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBESHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1DARRAYSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DARRAYSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER1D(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2D(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER3D(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLERCUBE(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER1D(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2D(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER3D(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLERCUBE(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DRECTSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLERBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLERBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBEARRAYSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLERCUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLERCUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE1D(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE1D(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE1D(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2D(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2D(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2D(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE3D(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE3D(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE3D(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGECUBE(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGECUBE(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGECUBE(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGEBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGEBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGEBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGECUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGECUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGECUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSTRUCT(); if (s0 === peg$FAILED) { s0 = peg$parseVOID(); if (s0 === peg$FAILED) { s0 = peg$parseWHILE(); if (s0 === peg$FAILED) { s0 = peg$parseINVARIANT(); if (s0 === peg$FAILED) { s0 = peg$parsePRECISE(); if (s0 === peg$FAILED) { s0 = peg$parseHIGH_PRECISION(); if (s0 === peg$FAILED) { s0 = peg$parseMEDIUM_PRECISION(); if (s0 === peg$FAILED) { s0 = peg$parseLOW_PRECISION(); if (s0 === peg$FAILED) { s0 = peg$parsePRECISION(); } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e162); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLEFT_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 167; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c162) { s1 = peg$c162; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e163); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRIGHT_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 168; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c163) { s1 = peg$c163; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e164); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseINC_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 169; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c164) { s1 = peg$c164; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e165); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDEC_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 170; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c165) { s1 = peg$c165; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e166); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLE_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 171; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c166) { s1 = peg$c166; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e167); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseGE_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 172; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c167) { s1 = peg$c167; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e168); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseEQ_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 173; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c168) { s1 = peg$c168; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e169); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseNE_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 174; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c169) { s1 = peg$c169; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e170); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAND_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 175; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c170) { s1 = peg$c170; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e171); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseOR_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 176; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c171) { s1 = peg$c171; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e172); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseXOR_OP() { var s0, s1, s2; var key = peg$currPos * 305 + 177; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c172) { s1 = peg$c172; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e173); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMUL_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 178; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c173) { s1 = peg$c173; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e174); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDIV_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 179; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c174) { s1 = peg$c174; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e175); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseADD_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 180; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c175) { s1 = peg$c175; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e176); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseMOD_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 181; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c176) { s1 = peg$c176; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e177); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLEFT_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 182; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 3) === peg$c177) { s1 = peg$c177; peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e178); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRIGHT_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 183; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 3) === peg$c178) { s1 = peg$c178; peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e179); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAND_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 184; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c179) { s1 = peg$c179; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e180); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseXOR_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 185; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c180) { s1 = peg$c180; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e181); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseOR_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 186; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c181) { s1 = peg$c181; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e182); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSUB_ASSIGN() { var s0, s1, s2; var key = peg$currPos * 305 + 187; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c182) { s1 = peg$c182; peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e183); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLEFT_PAREN() { var s0, s1, s2; var key = peg$currPos * 305 + 188; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 40) { s1 = peg$c183; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e184); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRIGHT_PAREN() { var s0, s1, s2; var key = peg$currPos * 305 + 189; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 41) { s1 = peg$c184; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e185); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLEFT_BRACKET() { var s0, s1, s2; var key = peg$currPos * 305 + 190; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 91) { s1 = peg$c185; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e186); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRIGHT_BRACKET() { var s0, s1, s2; var key = peg$currPos * 305 + 191; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 93) { s1 = peg$c186; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e187); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLEFT_BRACE() { var s0, s1, s2; var key = peg$currPos * 305 + 192; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 123) { s1 = peg$c187; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e188); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRIGHT_BRACE() { var s0, s1, s2; var key = peg$currPos * 305 + 193; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 125) { s1 = peg$c188; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e189); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDOT() { var s0, s1, s2; var key = peg$currPos * 305 + 194; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 46) { s1 = peg$c189; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e190); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCOMMA() { var s0, s1, s2; var key = peg$currPos * 305 + 195; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 44) { s1 = peg$c190; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e191); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCOLON() { var s0, s1, s2; var key = peg$currPos * 305 + 196; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 58) { s1 = peg$c191; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e192); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseEQUAL() { var s0, s1, s2; var key = peg$currPos * 305 + 197; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 61) { s1 = peg$c192; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e193); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSEMICOLON() { var s0, s1, s2; var key = peg$currPos * 305 + 198; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 59) { s1 = peg$c193; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e194); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseBANG() { var s0, s1, s2; var key = peg$currPos * 305 + 199; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 33) { s1 = peg$c194; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e195); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseDASH() { var s0, s1, s2; var key = peg$currPos * 305 + 200; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 45) { s1 = peg$c195; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e196); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseTILDE() { var s0, s1, s2; var key = peg$currPos * 305 + 201; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 126) { s1 = peg$c196; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e197); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePLUS() { var s0, s1, s2; var key = peg$currPos * 305 + 202; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 43) { s1 = peg$c197; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e198); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSTAR() { var s0, s1, s2; var key = peg$currPos * 305 + 203; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 42) { s1 = peg$c198; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e199); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseSLASH() { var s0, s1, s2; var key = peg$currPos * 305 + 204; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 47) { s1 = peg$c199; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e200); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsePERCENT() { var s0, s1, s2; var key = peg$currPos * 305 + 205; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 37) { s1 = peg$c200; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e201); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseLEFT_ANGLE() { var s0, s1, s2; var key = peg$currPos * 305 + 206; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { s1 = peg$c201; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e202); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseRIGHT_ANGLE() { var s0, s1, s2; var key = peg$currPos * 305 + 207; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { s1 = peg$c202; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e203); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseVERTICAL_BAR() { var s0, s1, s2; var key = peg$currPos * 305 + 208; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 124) { s1 = peg$c203; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e204); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseCARET() { var s0, s1, s2; var key = peg$currPos * 305 + 209; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 94) { s1 = peg$c204; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e205); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseAMPERSAND() { var s0, s1, s2; var key = peg$currPos * 305 + 210; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 38) { s1 = peg$c205; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e206); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseQUESTION() { var s0, s1, s2; var key = peg$currPos * 305 + 211; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 63) { s1 = peg$c206; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e207); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f7(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseIDENTIFIER() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 212; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; peg$silentFails++; s2 = peg$parsekeyword(); peg$silentFails--; if (s2 === peg$FAILED) { s1 = undefined; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s2 = peg$currPos; s3 = peg$currPos; if (peg$r0.test(input.charAt(peg$currPos))) { s4 = input.charAt(peg$currPos); peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e208); } } if (s4 !== peg$FAILED) { s5 = []; if (peg$r1.test(input.charAt(peg$currPos))) { s6 = input.charAt(peg$currPos); peg$currPos++; } else { s6 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e209); } } while (s6 !== peg$FAILED) { s5.push(s6); if (peg$r1.test(input.charAt(peg$currPos))) { s6 = input.charAt(peg$currPos); peg$currPos++; } else { s6 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e209); } } } s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } if (s3 !== peg$FAILED) { s2 = input.substring(s2, peg$currPos); } else { s2 = s3; } if (s2 !== peg$FAILED) { s3 = peg$parse_(); peg$savedPos = s0; s0 = peg$f8(s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseTYPE_NAME() { var s0, s1, s2; var key = peg$currPos * 305 + 213; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; peg$silentFails++; s2 = peg$parsekeyword(); peg$silentFails--; if (s2 === peg$FAILED) { s1 = undefined; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f9(s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinteger_constant() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 214; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsedecimal_constant(); if (s2 !== peg$FAILED) { s3 = peg$parseinteger_suffix(); if (s3 === peg$FAILED) { s3 = null; } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parseoctal_constant(); if (s2 !== peg$FAILED) { s3 = peg$parseinteger_suffix(); if (s3 === peg$FAILED) { s3 = null; } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsehexadecimal_constant(); if (s2 !== peg$FAILED) { s3 = peg$parseinteger_suffix(); if (s3 === peg$FAILED) { s3 = null; } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinteger_suffix() { var s0; var key = peg$currPos * 305 + 215; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } if (peg$r2.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e210); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsedecimal_constant() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 216; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; if (peg$r3.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e211); } } if (s2 !== peg$FAILED) { s3 = []; s4 = peg$parsedigit(); while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$parsedigit(); } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseoctal_constant() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 217; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 48) { s1 = peg$c207; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e212); } } if (s1 !== peg$FAILED) { s2 = []; if (peg$r4.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e213); } } while (s3 !== peg$FAILED) { s2.push(s3); if (peg$r4.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e213); } } } s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsehexadecimal_constant() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 218; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 48) { s1 = peg$c207; peg$currPos++; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e212); } } if (s1 !== peg$FAILED) { if (peg$r5.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e214); } } if (s2 !== peg$FAILED) { s3 = []; if (peg$r6.test(input.charAt(peg$currPos))) { s4 = input.charAt(peg$currPos); peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e215); } } while (s4 !== peg$FAILED) { s3.push(s4); if (peg$r6.test(input.charAt(peg$currPos))) { s4 = input.charAt(peg$currPos); peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e215); } } } s1 = [s1, s2, s3]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsedigit() { var s0; var key = peg$currPos * 305 + 219; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } if (peg$r7.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e216); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefloating_constant() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 220; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsefractional_constant(); if (s2 !== peg$FAILED) { s3 = peg$parseexponent_part(); if (s3 === peg$FAILED) { s3 = null; } s4 = peg$parsefloating_suffix(); if (s4 === peg$FAILED) { s4 = null; } s2 = [s2, s3, s4]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsedigit_sequence(); if (s2 !== peg$FAILED) { s3 = peg$parseexponent_part(); if (s3 !== peg$FAILED) { s4 = peg$parsefloating_suffix(); if (s4 === peg$FAILED) { s4 = null; } s2 = [s2, s3, s4]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefractional_constant() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 221; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsedigit_sequence(); if (s2 === peg$FAILED) { s2 = null; } if (input.charCodeAt(peg$currPos) === 46) { s3 = peg$c189; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e190); } } if (s3 !== peg$FAILED) { s4 = peg$parsedigit_sequence(); if (s4 === peg$FAILED) { s4 = null; } s2 = [s2, s3, s4]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseexponent_part() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 222; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$currPos; if (peg$r8.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e218); } } if (s2 !== peg$FAILED) { if (peg$r9.test(input.charAt(peg$currPos))) { s3 = input.charAt(peg$currPos); peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e219); } } if (s3 === peg$FAILED) { s3 = null; } s4 = peg$parsedigit_sequence(); if (s4 !== peg$FAILED) { s2 = [s2, s3, s4]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e217); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsedigit_sequence() { var s0, s1, s2; var key = peg$currPos * 305 + 223; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = []; s2 = peg$parsedigit(); if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { s1.push(s2); s2 = peg$parsedigit(); } } else { s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefloating_suffix() { var s0; var key = peg$currPos * 305 + 224; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } if (peg$r10.test(input.charAt(peg$currPos))) { s0 = input.charAt(peg$currPos); peg$currPos++; } else { s0 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e220); } } if (s0 === peg$FAILED) { if (input.substr(peg$currPos, 2) === peg$c208) { s0 = peg$c208; peg$currPos += 2; } else { s0 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e221); } } if (s0 === peg$FAILED) { if (input.substr(peg$currPos, 2) === peg$c209) { s0 = peg$c209; peg$currPos += 2; } else { s0 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e222); } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseprimary_expression() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 225; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseFLOATCONSTANT(); if (s0 === peg$FAILED) { s0 = peg$parseINTCONSTANT(); if (s0 === peg$FAILED) { s0 = peg$parseUINTCONSTANT(); if (s0 === peg$FAILED) { s0 = peg$parseBOOLCONSTANT(); if (s0 === peg$FAILED) { s0 = peg$parseDOUBLECONSTANT(); if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseLEFT_PAREN(); if (s1 !== peg$FAILED) { s2 = peg$parseexpression(); if (s2 !== peg$FAILED) { s3 = peg$parseRIGHT_PAREN(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f10(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseIDENTIFIER(); if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$f11(s1); } s0 = s1; } } } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e223); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsepostfix_expression() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 226; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsefunction_call(); if (s2 !== peg$FAILED) { s3 = []; s4 = peg$parsepostfix_expression_suffix(); while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$parsepostfix_expression_suffix(); } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 === peg$FAILED) { s1 = peg$currPos; s2 = peg$parseprimary_expression(); if (s2 !== peg$FAILED) { s3 = []; s4 = peg$parsepostfix_expression_suffix(); while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$parsepostfix_expression_suffix(); } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$f12(s1); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsepostfix_expression_suffix() { var s0; var key = peg$currPos * 305 + 227; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parseinteger_index(); if (s0 === peg$FAILED) { s0 = peg$parsefield_selection(); if (s0 === peg$FAILED) { s0 = peg$parseINC_OP(); if (s0 === peg$FAILED) { s0 = peg$parseDEC_OP(); } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinteger_index() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 228; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseLEFT_BRACKET(); if (s1 !== peg$FAILED) { s2 = peg$parseexpression(); if (s2 !== peg$FAILED) { s3 = peg$parseRIGHT_BRACKET(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f13(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefield_selection() { var s0, s1, s2; var key = peg$currPos * 305 + 229; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseDOT(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f14(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_call() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 230; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefunction_identifier(); if (s1 !== peg$FAILED) { s2 = peg$parsefunction_arguments(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$parseRIGHT_PAREN(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f15(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_arguments() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 231; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseVOID(); if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$f16(s1); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseassignment_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parseassignment_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parseassignment_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f17(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_identifier() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 232; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parsechained_function_call(); if (s2 !== peg$FAILED) { s3 = peg$parsefunction_suffix(); if (s3 !== peg$FAILED) { s4 = peg$parseLEFT_PAREN(); if (s4 !== peg$FAILED) { peg$savedPos = s1; s1 = peg$f18(s2, s3, s4); } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 === peg$FAILED) { s1 = peg$currPos; s2 = peg$parsetype_specifier(); if (s2 !== peg$FAILED) { s3 = peg$parsefunction_suffix(); if (s3 === peg$FAILED) { s3 = null; } s4 = peg$parseLEFT_PAREN(); if (s4 !== peg$FAILED) { peg$savedPos = s1; s1 = peg$f18(s2, s3, s4); } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$f19(s1); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_suffix() { var s0; var key = peg$currPos * 305 + 233; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parseinteger_index(); if (s0 === peg$FAILED) { s0 = peg$parsefield_selection(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsechained_function_call() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 234; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsetype_specifier(); if (s1 !== peg$FAILED) { s2 = peg$parseLEFT_PAREN(); if (s2 !== peg$FAILED) { s3 = peg$parsefunction_arguments(); if (s3 === peg$FAILED) { s3 = null; } s4 = peg$parseRIGHT_PAREN(); if (s4 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f20(s1, s2, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseunary_expression() { var s0, s1, s2; var key = peg$currPos * 305 + 235; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parsepostfix_expression(); if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseINC_OP(); if (s1 === peg$FAILED) { s1 = peg$parseDEC_OP(); if (s1 === peg$FAILED) { s1 = peg$parsePLUS(); if (s1 === peg$FAILED) { s1 = peg$parseDASH(); if (s1 === peg$FAILED) { s1 = peg$parseBANG(); if (s1 === peg$FAILED) { s1 = peg$parseTILDE(); } } } } } if (s1 !== peg$FAILED) { s2 = peg$parseunary_expression(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f21(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e224); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsemultiplicative_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 236; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseunary_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseSTAR(); if (s4 === peg$FAILED) { s4 = peg$parseSLASH(); if (s4 === peg$FAILED) { s4 = peg$parsePERCENT(); } } if (s4 !== peg$FAILED) { s5 = peg$parseunary_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseSTAR(); if (s4 === peg$FAILED) { s4 = peg$parseSLASH(); if (s4 === peg$FAILED) { s4 = peg$parsePERCENT(); } } if (s4 !== peg$FAILED) { s5 = peg$parseunary_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseadditive_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 237; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsemultiplicative_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parsePLUS(); if (s4 === peg$FAILED) { s4 = peg$parseDASH(); } if (s4 !== peg$FAILED) { s5 = peg$parsemultiplicative_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parsePLUS(); if (s4 === peg$FAILED) { s4 = peg$parseDASH(); } if (s4 !== peg$FAILED) { s5 = peg$parsemultiplicative_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseshift_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 238; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseadditive_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseRIGHT_OP(); if (s4 === peg$FAILED) { s4 = peg$parseLEFT_OP(); } if (s4 !== peg$FAILED) { s5 = peg$parseadditive_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseRIGHT_OP(); if (s4 === peg$FAILED) { s4 = peg$parseLEFT_OP(); } if (s4 !== peg$FAILED) { s5 = peg$parseadditive_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parserelational_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 239; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseshift_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseLE_OP(); if (s4 === peg$FAILED) { s4 = peg$parseGE_OP(); if (s4 === peg$FAILED) { s4 = peg$parseLEFT_ANGLE(); if (s4 === peg$FAILED) { s4 = peg$parseRIGHT_ANGLE(); } } } if (s4 !== peg$FAILED) { s5 = peg$parseshift_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseLE_OP(); if (s4 === peg$FAILED) { s4 = peg$parseGE_OP(); if (s4 === peg$FAILED) { s4 = peg$parseLEFT_ANGLE(); if (s4 === peg$FAILED) { s4 = peg$parseRIGHT_ANGLE(); } } } if (s4 !== peg$FAILED) { s5 = peg$parseshift_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseequality_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 240; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parserelational_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseEQ_OP(); if (s4 === peg$FAILED) { s4 = peg$parseNE_OP(); } if (s4 !== peg$FAILED) { s5 = peg$parserelational_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseEQ_OP(); if (s4 === peg$FAILED) { s4 = peg$parseNE_OP(); } if (s4 !== peg$FAILED) { s5 = peg$parserelational_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e225); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseand_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 241; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parseequality_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseAMPERSAND(); if (s4 !== peg$FAILED) { s5 = peg$parseequality_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseAMPERSAND(); if (s4 !== peg$FAILED) { s5 = peg$parseequality_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e226); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseexclusive_or_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 242; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseand_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseCARET(); if (s4 !== peg$FAILED) { s5 = peg$parseand_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseCARET(); if (s4 !== peg$FAILED) { s5 = peg$parseand_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinclusive_or_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 243; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseexclusive_or_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseVERTICAL_BAR(); if (s4 !== peg$FAILED) { s5 = peg$parseexclusive_or_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseVERTICAL_BAR(); if (s4 !== peg$FAILED) { s5 = peg$parseexclusive_or_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parselogical_and_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 244; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseinclusive_or_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseAND_OP(); if (s4 !== peg$FAILED) { s5 = peg$parseinclusive_or_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseAND_OP(); if (s4 !== peg$FAILED) { s5 = peg$parseinclusive_or_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parselogical_xor_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 245; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parselogical_and_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseXOR_OP(); if (s4 !== peg$FAILED) { s5 = peg$parselogical_and_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseXOR_OP(); if (s4 !== peg$FAILED) { s5 = peg$parselogical_and_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parselogical_or_expression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 246; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parselogical_xor_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseOR_OP(); if (s4 !== peg$FAILED) { s5 = peg$parselogical_xor_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseOR_OP(); if (s4 !== peg$FAILED) { s5 = peg$parselogical_xor_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseternary_expression() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 247; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parselogical_or_expression(); if (s1 !== peg$FAILED) { s2 = peg$currPos; s3 = peg$parseQUESTION(); if (s3 !== peg$FAILED) { s4 = peg$parseexpression(); if (s4 !== peg$FAILED) { s5 = peg$parseCOLON(); if (s5 !== peg$FAILED) { s6 = peg$parseassignment_expression(); if (s6 !== peg$FAILED) { peg$savedPos = s2; s2 = peg$f23(s1, s3, s4, s5, s6); } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } if (s2 === peg$FAILED) { s2 = null; } peg$savedPos = s0; s0 = peg$f24(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseassignment_expression() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 248; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseunary_expression(); if (s1 !== peg$FAILED) { s2 = peg$parseassignment_operator(); if (s2 !== peg$FAILED) { s3 = peg$parseassignment_expression(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f25(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$parseternary_expression(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseassignment_operator() { var s0, s1; var key = peg$currPos * 305 + 249; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseEQUAL(); if (s0 === peg$FAILED) { s0 = peg$parseMUL_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseDIV_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseMOD_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseADD_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseSUB_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseLEFT_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseRIGHT_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseAND_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseXOR_ASSIGN(); if (s0 === peg$FAILED) { s0 = peg$parseOR_ASSIGN(); } } } } } } } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e227); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseexpression() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 250; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parseassignment_expression(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parseassignment_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parseassignment_expression(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f22(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e228); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsedeclaration_statement() { var s0, s1; var key = peg$currPos * 305 + 251; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsedeclaration(); if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$f26(s1); } s0 = s1; peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsedeclaration() { var s0, s1, s2; var key = peg$currPos * 305 + 252; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefunction_prototype(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseprecision_declarator(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseinterface_declarator(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parsequalifier_declarator(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseinit_declarator_list(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsequalifier_declarator() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 253; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsetype_qualifiers(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 === peg$FAILED) { s2 = null; } s3 = []; s4 = peg$currPos; s5 = peg$parseCOMMA(); if (s5 !== peg$FAILED) { s6 = peg$parseIDENTIFIER(); if (s6 !== peg$FAILED) { s5 = [s5, s6]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$currPos; s5 = peg$parseCOMMA(); if (s5 !== peg$FAILED) { s6 = peg$parseIDENTIFIER(); if (s6 !== peg$FAILED) { s5 = [s5, s6]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f27(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinterface_declarator() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 254; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsetype_qualifiers(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 !== peg$FAILED) { s3 = peg$parseLEFT_BRACE(); if (s3 !== peg$FAILED) { s4 = peg$parsestruct_declaration_list(); if (s4 !== peg$FAILED) { s5 = peg$parseRIGHT_BRACE(); if (s5 !== peg$FAILED) { s6 = peg$parsequantified_identifier(); if (s6 === peg$FAILED) { s6 = null; } peg$savedPos = s0; s0 = peg$f28(s1, s2, s3, s4, s5, s6); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseprecision_declarator() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 255; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parsePRECISION(); if (s1 !== peg$FAILED) { s2 = peg$parseprecision_qualifier(); if (s2 !== peg$FAILED) { s3 = peg$parsetype_specifier(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f29(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e229); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_prototype() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 256; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parsefunction_header(); if (s1 !== peg$FAILED) { s2 = peg$parsefunction_parameters(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$parseRIGHT_PAREN(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f30(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e230); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_header() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 257; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parsefully_specified_type(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 !== peg$FAILED) { s3 = peg$parseLEFT_PAREN(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f31(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e231); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_parameters() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 258; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parseparameter_declaration(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parseparameter_declaration(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parseparameter_declaration(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f32(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e232); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseparameter_declaration() { var s0, s1, s2; var key = peg$currPos * 305 + 259; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = []; s2 = peg$parseparameter_qualifier(); while (s2 !== peg$FAILED) { s1.push(s2); s2 = peg$parseparameter_qualifier(); } s2 = peg$parseparameter_declarator(); if (s2 === peg$FAILED) { s2 = peg$parsetype_specifier(); } if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f33(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e233); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseparameter_declarator() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 260; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parsetype_specifier(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 !== peg$FAILED) { s3 = peg$parsearray_specifier(); if (s3 === peg$FAILED) { s3 = null; } peg$savedPos = s0; s0 = peg$f34(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e234); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseparameter_qualifier() { var s0; var key = peg$currPos * 305 + 261; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parseCONST(); if (s0 === peg$FAILED) { s0 = peg$parseIN(); if (s0 === peg$FAILED) { s0 = peg$parseOUT(); if (s0 === peg$FAILED) { s0 = peg$parseINOUT(); if (s0 === peg$FAILED) { s0 = peg$parsememory_qualifier(); if (s0 === peg$FAILED) { s0 = peg$parseprecision_qualifier(); } } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsememory_qualifier() { var s0; var key = peg$currPos * 305 + 262; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parseCOHERENT(); if (s0 === peg$FAILED) { s0 = peg$parseVOLATILE(); if (s0 === peg$FAILED) { s0 = peg$parseRESTRICT(); if (s0 === peg$FAILED) { s0 = peg$parseREADONLY(); if (s0 === peg$FAILED) { s0 = peg$parseWRITEONLY(); } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinit_declarator_list() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 263; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseinitial_declaration(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parsesubsequent_declaration(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parseCOMMA(); if (s4 !== peg$FAILED) { s5 = peg$parsesubsequent_declaration(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f35(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsesubsequent_declaration() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 264; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseIDENTIFIER(); if (s1 !== peg$FAILED) { s2 = peg$parsearray_specifier(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$currPos; s4 = peg$parseEQUAL(); if (s4 !== peg$FAILED) { s5 = peg$parseinitializer(); if (s5 !== peg$FAILED) { s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } if (s3 === peg$FAILED) { s3 = null; } peg$savedPos = s0; s0 = peg$f36(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinitial_declaration() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 305 + 265; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefully_specified_type(); if (s1 !== peg$FAILED) { s2 = peg$currPos; s3 = peg$parseIDENTIFIER(); if (s3 !== peg$FAILED) { s4 = peg$parsearray_specifier(); if (s4 === peg$FAILED) { s4 = null; } s5 = peg$currPos; s6 = peg$parseEQUAL(); if (s6 !== peg$FAILED) { s7 = peg$parseinitializer(); if (s7 !== peg$FAILED) { s6 = [s6, s7]; s5 = s6; } else { peg$currPos = s5; s5 = peg$FAILED; } } else { peg$currPos = s5; s5 = peg$FAILED; } if (s5 === peg$FAILED) { s5 = null; } s3 = [s3, s4, s5]; s2 = s3; } else { peg$currPos = s2; s2 = peg$FAILED; } if (s2 === peg$FAILED) { s2 = null; } peg$savedPos = s0; s0 = peg$f37(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefully_specified_type() { var s0, s1, s2; var key = peg$currPos * 305 + 266; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsetype_qualifiers(); if (s1 === peg$FAILED) { s1 = null; } s2 = peg$parsetype_specifier(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f38(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parselayout_qualifier() { var s0, s1, s2, s3, s4, s5, s6, s7, s8; var key = peg$currPos * 305 + 267; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseLAYOUT(); if (s1 !== peg$FAILED) { s2 = peg$parseLEFT_PAREN(); if (s2 !== peg$FAILED) { s3 = peg$currPos; s4 = peg$parselayout_qualifier_id(); if (s4 !== peg$FAILED) { s5 = []; s6 = peg$currPos; s7 = peg$parseCOMMA(); if (s7 !== peg$FAILED) { s8 = peg$parselayout_qualifier_id(); if (s8 !== peg$FAILED) { s7 = [s7, s8]; s6 = s7; } else { peg$currPos = s6; s6 = peg$FAILED; } } else { peg$currPos = s6; s6 = peg$FAILED; } while (s6 !== peg$FAILED) { s5.push(s6); s6 = peg$currPos; s7 = peg$parseCOMMA(); if (s7 !== peg$FAILED) { s8 = peg$parselayout_qualifier_id(); if (s8 !== peg$FAILED) { s7 = [s7, s8]; s6 = s7; } else { peg$currPos = s6; s6 = peg$FAILED; } } else { peg$currPos = s6; s6 = peg$FAILED; } } peg$savedPos = s3; s3 = peg$f39(s1, s2, s4, s5); } else { peg$currPos = s3; s3 = peg$FAILED; } if (s3 !== peg$FAILED) { s4 = peg$parseRIGHT_PAREN(); if (s4 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f40(s1, s2, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parselayout_qualifier_id() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 268; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseIDENTIFIER(); if (s1 !== peg$FAILED) { s2 = peg$currPos; s3 = peg$parseEQUAL(); if (s3 !== peg$FAILED) { s4 = peg$parseternary_expression(); if (s4 !== peg$FAILED) { s3 = [s3, s4]; s2 = s3; } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } if (s2 === peg$FAILED) { s2 = null; } peg$savedPos = s0; s0 = peg$f41(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$parseSHARED(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsetype_qualifiers() { var s0, s1; var key = peg$currPos * 305 + 269; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; s1 = peg$parsesingle_type_qualifier(); if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); s1 = peg$parsesingle_type_qualifier(); } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsesingle_type_qualifier() { var s0, s1; var key = peg$currPos * 305 + 270; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parsestorage_qualifier(); if (s0 === peg$FAILED) { s0 = peg$parselayout_qualifier(); if (s0 === peg$FAILED) { s0 = peg$parseprecision_qualifier(); if (s0 === peg$FAILED) { s0 = peg$parseinterpolation_qualifier(); if (s0 === peg$FAILED) { s0 = peg$parseINVARIANT(); if (s0 === peg$FAILED) { s0 = peg$parsePRECISE(); } } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e235); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinterpolation_qualifier() { var s0, s1; var key = peg$currPos * 305 + 271; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseSMOOTH(); if (s0 === peg$FAILED) { s0 = peg$parseFLAT(); if (s0 === peg$FAILED) { s0 = peg$parseNOPERSPECTIVE(); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e236); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestorage_qualifier() { var s0, s1, s2, s3, s4, s5, s6, s7, s8; var key = peg$currPos * 305 + 272; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseCONST(); if (s0 === peg$FAILED) { s0 = peg$parseINOUT(); if (s0 === peg$FAILED) { s0 = peg$parseIN(); if (s0 === peg$FAILED) { s0 = peg$parseOUT(); if (s0 === peg$FAILED) { s0 = peg$parseCENTROID(); if (s0 === peg$FAILED) { s0 = peg$parsePATCH(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLE(); if (s0 === peg$FAILED) { s0 = peg$parseUNIFORM(); if (s0 === peg$FAILED) { s0 = peg$parseBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseSHARED(); if (s0 === peg$FAILED) { s0 = peg$parseCOHERENT(); if (s0 === peg$FAILED) { s0 = peg$parseVOLATILE(); if (s0 === peg$FAILED) { s0 = peg$parseRESTRICT(); if (s0 === peg$FAILED) { s0 = peg$parseREADONLY(); if (s0 === peg$FAILED) { s0 = peg$parseWRITEONLY(); if (s0 === peg$FAILED) { s0 = peg$parseVARYING(); if (s0 === peg$FAILED) { s0 = peg$parseATTRIBUTE(); if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseSUBROUTINE(); if (s1 !== peg$FAILED) { s2 = peg$currPos; s3 = peg$parseLEFT_PAREN(); if (s3 !== peg$FAILED) { s4 = peg$parseTYPE_NAME(); if (s4 !== peg$FAILED) { s5 = []; s6 = peg$currPos; s7 = peg$parseCOMMA(); if (s7 !== peg$FAILED) { s8 = peg$parseTYPE_NAME(); if (s8 !== peg$FAILED) { s7 = [s7, s8]; s6 = s7; } else { peg$currPos = s6; s6 = peg$FAILED; } } else { peg$currPos = s6; s6 = peg$FAILED; } while (s6 !== peg$FAILED) { s5.push(s6); s6 = peg$currPos; s7 = peg$parseCOMMA(); if (s7 !== peg$FAILED) { s8 = peg$parseTYPE_NAME(); if (s8 !== peg$FAILED) { s7 = [s7, s8]; s6 = s7; } else { peg$currPos = s6; s6 = peg$FAILED; } } else { peg$currPos = s6; s6 = peg$FAILED; } } s6 = peg$parseRIGHT_PAREN(); if (s6 !== peg$FAILED) { peg$savedPos = s2; s2 = peg$f42(s1, s3, s4, s5, s6); } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } if (s2 === peg$FAILED) { s2 = null; } peg$savedPos = s0; s0 = peg$f43(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } } } } } } } } } } } } } } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e237); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsetype_specifier() { var s0, s1, s2; var key = peg$currPos * 305 + 273; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parsetype_specifier_nonarray(); if (s1 !== peg$FAILED) { s2 = peg$parsearray_specifier(); if (s2 === peg$FAILED) { s2 = null; } peg$savedPos = s0; s0 = peg$f44(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e238); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsetype_specifier_nonarray() { var s0, s1; var key = peg$currPos * 305 + 274; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseVOID(); if (s0 === peg$FAILED) { s0 = peg$parseFLOAT(); if (s0 === peg$FAILED) { s0 = peg$parseDOUBLE(); if (s0 === peg$FAILED) { s0 = peg$parseINT(); if (s0 === peg$FAILED) { s0 = peg$parseUINT(); if (s0 === peg$FAILED) { s0 = peg$parseBOOL(); if (s0 === peg$FAILED) { s0 = peg$parseVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseDVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseDVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseDVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseBVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseBVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseBVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseIVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseIVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseIVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseUVEC2(); if (s0 === peg$FAILED) { s0 = peg$parseUVEC3(); if (s0 === peg$FAILED) { s0 = peg$parseUVEC4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2X2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2X3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT2X4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3X2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3X3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT3X4(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4X2(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4X3(); if (s0 === peg$FAILED) { s0 = peg$parseMAT4X4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2X2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2X3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT2X4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3X2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3X3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT3X4(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4X2(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4X3(); if (s0 === peg$FAILED) { s0 = peg$parseDMAT4X4(); if (s0 === peg$FAILED) { s0 = peg$parseATOMIC_UINT(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1D(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2D(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER3D(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBE(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1DSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBESHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER1DARRAYSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DARRAYSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERCUBEARRAYSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER1D(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2D(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER3D(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLERCUBE(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLERCUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER1D(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2D(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER3D(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLERCUBE(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLERCUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DRECTSHADOW(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLERBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLERBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLERBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseSAMPLER2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseISAMPLER2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUSAMPLER2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE1D(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE1D(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE1D(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2D(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2D(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2D(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE3D(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE3D(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE3D(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DRECT(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGECUBE(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGECUBE(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGECUBE(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGEBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGEBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGEBUFFER(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE1DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGECUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGECUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGECUBEARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DMS(); if (s0 === peg$FAILED) { s0 = peg$parseIMAGE2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseIIMAGE2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parseUIMAGE2DMSARRAY(); if (s0 === peg$FAILED) { s0 = peg$parsestruct_specifier(); if (s0 === peg$FAILED) { s0 = peg$parseTYPE_NAME(); } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e238); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsearray_specifier() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 275; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = []; s2 = peg$currPos; s3 = peg$parseLEFT_BRACKET(); if (s3 !== peg$FAILED) { s4 = peg$parseternary_expression(); if (s4 === peg$FAILED) { s4 = null; } s5 = peg$parseRIGHT_BRACKET(); if (s5 !== peg$FAILED) { peg$savedPos = s2; s2 = peg$f45(s3, s4, s5); } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { s1.push(s2); s2 = peg$currPos; s3 = peg$parseLEFT_BRACKET(); if (s3 !== peg$FAILED) { s4 = peg$parseternary_expression(); if (s4 === peg$FAILED) { s4 = null; } s5 = peg$parseRIGHT_BRACKET(); if (s5 !== peg$FAILED) { peg$savedPos = s2; s2 = peg$f45(s3, s4, s5); } else { peg$currPos = s2; s2 = peg$FAILED; } } else { peg$currPos = s2; s2 = peg$FAILED; } } } else { s1 = peg$FAILED; } if (s1 !== peg$FAILED) { peg$savedPos = s0; s1 = peg$f46(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e239); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseprecision_qualifier() { var s0, s1; var key = peg$currPos * 305 + 276; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$parseHIGH_PRECISION(); if (s0 === peg$FAILED) { s0 = peg$parseMEDIUM_PRECISION(); if (s0 === peg$FAILED) { s0 = peg$parseLOW_PRECISION(); } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e240); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestruct_specifier() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 277; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parseSTRUCT(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$parseLEFT_BRACE(); if (s3 !== peg$FAILED) { s4 = peg$parsestruct_declaration_list(); if (s4 !== peg$FAILED) { s5 = peg$parseRIGHT_BRACE(); if (s5 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f47(s1, s2, s3, s4, s5); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e241); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestruct_declaration_list() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 278; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; s1 = peg$currPos; s2 = peg$parsestruct_declaration(); if (s2 !== peg$FAILED) { s3 = peg$parseSEMICOLON(); if (s3 !== peg$FAILED) { peg$savedPos = s1; s1 = peg$f48(s2, s3); } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); s1 = peg$currPos; s2 = peg$parsestruct_declaration(); if (s2 !== peg$FAILED) { s3 = peg$parseSEMICOLON(); if (s3 !== peg$FAILED) { peg$savedPos = s1; s1 = peg$f48(s2, s3); } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestruct_declaration() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 279; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefully_specified_type(); if (s1 !== peg$FAILED) { s2 = peg$parsequantified_identifier(); if (s2 !== peg$FAILED) { s3 = []; s4 = peg$currPos; s5 = peg$parseCOMMA(); if (s5 !== peg$FAILED) { s6 = peg$parsequantified_identifier(); if (s6 !== peg$FAILED) { s5 = [s5, s6]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$currPos; s5 = peg$parseCOMMA(); if (s5 !== peg$FAILED) { s6 = peg$parsequantified_identifier(); if (s6 !== peg$FAILED) { s5 = [s5, s6]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f49(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsequantified_identifier() { var s0, s1, s2; var key = peg$currPos * 305 + 280; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseIDENTIFIER(); if (s1 !== peg$FAILED) { s2 = peg$parsearray_specifier(); if (s2 === peg$FAILED) { s2 = null; } peg$savedPos = s0; s0 = peg$f50(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseinitializer() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 281; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parseassignment_expression(); if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseLEFT_BRACE(); if (s1 !== peg$FAILED) { s2 = peg$parseinitializer(); if (s2 !== peg$FAILED) { s3 = []; s4 = peg$currPos; s5 = peg$parseCOMMA(); if (s5 !== peg$FAILED) { s6 = peg$parseinitializer(); if (s6 !== peg$FAILED) { s5 = [s5, s6]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$currPos; s5 = peg$parseCOMMA(); if (s5 !== peg$FAILED) { s6 = peg$parseinitializer(); if (s6 !== peg$FAILED) { s5 = [s5, s6]; s4 = s5; } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } s4 = peg$parseCOMMA(); if (s4 === peg$FAILED) { s4 = null; } s5 = peg$parseRIGHT_BRACE(); if (s5 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f51(s1, s2, s3, s4, s5); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestatement() { var s0; var key = peg$currPos * 305 + 282; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parsecompound_statement(); if (s0 === peg$FAILED) { s0 = peg$parsesimple_statement(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsesimple_statement() { var s0; var key = peg$currPos * 305 + 283; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parsejump_statement(); if (s0 === peg$FAILED) { s0 = peg$parsedeclaration_statement(); if (s0 === peg$FAILED) { s0 = peg$parseexpression_statement(); if (s0 === peg$FAILED) { s0 = peg$parseif_statement(); if (s0 === peg$FAILED) { s0 = peg$parseswitch_statement(); if (s0 === peg$FAILED) { s0 = peg$parsecase_label(); if (s0 === peg$FAILED) { s0 = peg$parseiteration_statement(); } } } } } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsecompound_statement() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 284; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parseLEFT_BRACE(); if (s2 !== peg$FAILED) { peg$savedPos = s1; s2 = peg$f52(s2); } s1 = s2; if (s1 !== peg$FAILED) { s2 = peg$parsestatement_list(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$parseRIGHT_BRACE(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f53(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsecompound_statement_no_new_scope() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 285; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseLEFT_BRACE(); if (s1 !== peg$FAILED) { s2 = peg$parsestatement_list(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$parseRIGHT_BRACE(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f54(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestatement_no_new_scope() { var s0; var key = peg$currPos * 305 + 286; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parsecompound_statement_no_new_scope(); if (s0 === peg$FAILED) { s0 = peg$parsesimple_statement(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsestatement_list() { var s0, s1; var key = peg$currPos * 305 + 287; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; s1 = peg$parsestatement(); if (s1 === peg$FAILED) { s1 = peg$parsepreprocessor(); } if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); s1 = peg$parsestatement(); if (s1 === peg$FAILED) { s1 = peg$parsepreprocessor(); } } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseexpression_statement() { var s0, s1, s2; var key = peg$currPos * 305 + 288; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseexpression(); if (s1 === peg$FAILED) { s1 = null; } s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f55(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseif_statement() { var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; var key = peg$currPos * 305 + 289; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseIF(); if (s1 !== peg$FAILED) { s2 = peg$parseLEFT_PAREN(); if (s2 !== peg$FAILED) { s3 = peg$parseexpression(); if (s3 !== peg$FAILED) { s4 = peg$parseRIGHT_PAREN(); if (s4 !== peg$FAILED) { s5 = peg$currPos; s6 = peg$parsestatement(); if (s6 !== peg$FAILED) { s7 = peg$currPos; s8 = peg$parseELSE(); if (s8 !== peg$FAILED) { s9 = peg$parsestatement(); if (s9 !== peg$FAILED) { s8 = [s8, s9]; s7 = s8; } else { peg$currPos = s7; s7 = peg$FAILED; } } else { peg$currPos = s7; s7 = peg$FAILED; } if (s7 === peg$FAILED) { s7 = null; } s6 = [s6, s7]; s5 = s6; } else { peg$currPos = s5; s5 = peg$FAILED; } if (s5 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f56(s1, s2, s3, s4, s5); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseswitch_statement() { var s0, s1, s2, s3, s4, s5, s6, s7; var key = peg$currPos * 305 + 290; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseSWITCH(); if (s1 !== peg$FAILED) { s2 = peg$parseLEFT_PAREN(); if (s2 !== peg$FAILED) { s3 = peg$parseexpression(); if (s3 !== peg$FAILED) { s4 = peg$parseRIGHT_PAREN(); if (s4 !== peg$FAILED) { s5 = peg$parseLEFT_BRACE(); if (s5 !== peg$FAILED) { s6 = peg$parsestatement_list(); if (s6 !== peg$FAILED) { s7 = peg$parseRIGHT_BRACE(); if (s7 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f57(s1, s2, s3, s4, s5, s6, s7); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsecase_label() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 291; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parseCASE(); if (s1 !== peg$FAILED) { s2 = peg$parseexpression(); if (s2 !== peg$FAILED) { s3 = peg$parseCOLON(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f58(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseDEFAULT(); if (s1 !== peg$FAILED) { s2 = peg$parseCOLON(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f59(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseiteration_statement() { var s0, s1, s2, s3, s4, s5, s6, s7, s8; var key = peg$currPos * 305 + 292; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parseWHILE(); if (s2 !== peg$FAILED) { peg$savedPos = s1; s2 = peg$f60(s2); } s1 = s2; if (s1 !== peg$FAILED) { s2 = peg$parseLEFT_PAREN(); if (s2 !== peg$FAILED) { s3 = peg$parsecondition(); if (s3 !== peg$FAILED) { s4 = peg$parseRIGHT_PAREN(); if (s4 !== peg$FAILED) { s5 = peg$parsestatement_no_new_scope(); if (s5 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f61(s1, s2, s3, s4, s5); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseDO(); if (s1 !== peg$FAILED) { s2 = peg$parsestatement(); if (s2 !== peg$FAILED) { s3 = peg$parseWHILE(); if (s3 !== peg$FAILED) { s4 = peg$parseLEFT_PAREN(); if (s4 !== peg$FAILED) { s5 = peg$parseexpression(); if (s5 !== peg$FAILED) { s6 = peg$parseRIGHT_PAREN(); if (s6 !== peg$FAILED) { s7 = peg$parseSEMICOLON(); if (s7 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f62(s1, s2, s3, s4, s5, s6, s7); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$currPos; s2 = peg$parseFOR(); if (s2 !== peg$FAILED) { peg$savedPos = s1; s2 = peg$f63(s2); } s1 = s2; if (s1 !== peg$FAILED) { s2 = peg$parseLEFT_PAREN(); if (s2 !== peg$FAILED) { s3 = peg$parseexpression_statement(); if (s3 === peg$FAILED) { s3 = peg$parsedeclaration_statement(); } if (s3 === peg$FAILED) { s3 = null; } s4 = peg$parsecondition(); if (s4 === peg$FAILED) { s4 = null; } s5 = peg$parseSEMICOLON(); if (s5 !== peg$FAILED) { s6 = peg$parseexpression(); if (s6 === peg$FAILED) { s6 = null; } s7 = peg$parseRIGHT_PAREN(); if (s7 !== peg$FAILED) { s8 = peg$parsestatement_no_new_scope(); if (s8 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f64(s1, s2, s3, s4, s5, s6, s7, s8); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e242); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsecondition() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 293; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefully_specified_type(); if (s1 !== peg$FAILED) { s2 = peg$parseIDENTIFIER(); if (s2 !== peg$FAILED) { s3 = peg$parseEQUAL(); if (s3 !== peg$FAILED) { s4 = peg$parseinitializer(); if (s4 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f65(s1, s2, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$parseexpression(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsejump_statement() { var s0, s1, s2, s3; var key = peg$currPos * 305 + 294; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parseCONTINUE(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f66(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseBREAK(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f67(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseRETURN(); if (s1 !== peg$FAILED) { s2 = peg$parseexpression(); if (s2 === peg$FAILED) { s2 = null; } s3 = peg$parseSEMICOLON(); if (s3 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f68(s1, s2, s3); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parseDISCARD(); if (s1 !== peg$FAILED) { s2 = peg$parseSEMICOLON(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f69(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } } } } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e243); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsepreprocessor() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 295; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$currPos; s2 = peg$currPos; if (input.charCodeAt(peg$currPos) === 35) { s3 = peg$c210; peg$currPos++; } else { s3 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e245); } } if (s3 !== peg$FAILED) { s4 = []; if (peg$r11.test(input.charAt(peg$currPos))) { s5 = input.charAt(peg$currPos); peg$currPos++; } else { s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e246); } } while (s5 !== peg$FAILED) { s4.push(s5); if (peg$r11.test(input.charAt(peg$currPos))) { s5 = input.charAt(peg$currPos); peg$currPos++; } else { s5 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e246); } } } s3 = [s3, s4]; s2 = s3; } else { peg$currPos = s2; s2 = peg$FAILED; } if (s2 !== peg$FAILED) { s1 = input.substring(s1, peg$currPos); } else { s1 = s2; } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f70(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e244); } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsetranslation_unit() { var s0, s1; var key = peg$currPos * 305 + 296; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = []; s1 = peg$parseexternal_declaration(); if (s1 === peg$FAILED) { s1 = peg$parsepreprocessor(); } if (s1 !== peg$FAILED) { while (s1 !== peg$FAILED) { s0.push(s1); s1 = peg$parseexternal_declaration(); if (s1 === peg$FAILED) { s1 = peg$parsepreprocessor(); } } } else { s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseexternal_declaration() { var s0; var key = peg$currPos * 305 + 297; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parsefunction_definition(); if (s0 === peg$FAILED) { s0 = peg$parsedeclaration_statement(); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsefunction_definition() { var s0, s1, s2; var key = peg$currPos * 305 + 298; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$parsefunction_prototype(); if (s1 !== peg$FAILED) { s2 = peg$parsecompound_statement_no_new_scope(); if (s2 !== peg$FAILED) { peg$savedPos = s0; s0 = peg$f71(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parse_() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 299; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } peg$silentFails++; s0 = peg$currPos; s1 = peg$parsewhitespace(); if (s1 === peg$FAILED) { s1 = null; } s2 = []; s3 = peg$currPos; s4 = peg$parsecomment(); if (s4 !== peg$FAILED) { s5 = peg$parsewhitespace(); if (s5 === peg$FAILED) { s5 = null; } s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parsecomment(); if (s4 !== peg$FAILED) { s5 = peg$parsewhitespace(); if (s5 === peg$FAILED) { s5 = null; } s4 = [s4, s5]; s3 = s4; } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f72(s1, s2); peg$silentFails--; s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e247); } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsecomment() { var s0, s1, s2, s3, s4, s5; var key = peg$currPos * 305 + 300; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$parsesingle_comment(); if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = peg$parsemultiline_comment(); if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$parsewhitespace(); if (s4 !== peg$FAILED) { s5 = peg$parsecomment(); if (s5 !== peg$FAILED) { peg$savedPos = s3; s3 = peg$f73(s1, s4, s5); } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } while (s3 !== peg$FAILED) { s2.push(s3); s3 = peg$currPos; s4 = peg$parsewhitespace(); if (s4 !== peg$FAILED) { s5 = peg$parsecomment(); if (s5 !== peg$FAILED) { peg$savedPos = s3; s3 = peg$f73(s1, s4, s5); } else { peg$currPos = s3; s3 = peg$FAILED; } } else { peg$currPos = s3; s3 = peg$FAILED; } } peg$savedPos = s0; s0 = peg$f74(s1, s2); } else { peg$currPos = s0; s0 = peg$FAILED; } } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsesingle_comment() { var s0, s1, s2, s3, s4; var key = peg$currPos * 305 + 301; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c211) { s2 = peg$c211; peg$currPos += 2; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e248); } } if (s2 !== peg$FAILED) { s3 = []; if (peg$r11.test(input.charAt(peg$currPos))) { s4 = input.charAt(peg$currPos); peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e246); } } while (s4 !== peg$FAILED) { s3.push(s4); if (peg$r11.test(input.charAt(peg$currPos))) { s4 = input.charAt(peg$currPos); peg$currPos++; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e246); } } } s2 = [s2, s3]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsemultiline_comment() { var s0, s1, s2, s3, s4, s5, s6; var key = peg$currPos * 305 + 302; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; if (input.substr(peg$currPos, 2) === peg$c212) { s2 = peg$c212; peg$currPos += 2; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e249); } } if (s2 !== peg$FAILED) { s3 = []; s4 = peg$currPos; s5 = peg$currPos; peg$silentFails++; if (input.substr(peg$currPos, 2) === peg$c213) { s6 = peg$c213; peg$currPos += 2; } else { s6 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e250); } } peg$silentFails--; if (s6 === peg$FAILED) { s5 = undefined; } else { peg$currPos = s5; s5 = peg$FAILED; } if (s5 !== peg$FAILED) { if (input.length > peg$currPos) { s6 = input.charAt(peg$currPos); peg$currPos++; } else { s6 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e251); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; s4 = peg$f75(s6); } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } while (s4 !== peg$FAILED) { s3.push(s4); s4 = peg$currPos; s5 = peg$currPos; peg$silentFails++; if (input.substr(peg$currPos, 2) === peg$c213) { s6 = peg$c213; peg$currPos += 2; } else { s6 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e250); } } peg$silentFails--; if (s6 === peg$FAILED) { s5 = undefined; } else { peg$currPos = s5; s5 = peg$FAILED; } if (s5 !== peg$FAILED) { if (input.length > peg$currPos) { s6 = input.charAt(peg$currPos); peg$currPos++; } else { s6 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e251); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; s4 = peg$f75(s6); } else { peg$currPos = s4; s4 = peg$FAILED; } } else { peg$currPos = s4; s4 = peg$FAILED; } } if (input.substr(peg$currPos, 2) === peg$c213) { s4 = peg$c213; peg$currPos += 2; } else { s4 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e250); } } if (s4 !== peg$FAILED) { s2 = [s2, s3, s4]; s1 = s2; } else { peg$currPos = s1; s1 = peg$FAILED; } } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parsewhitespace() { var s0, s1, s2; var key = peg$currPos * 305 + 303; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = []; if (peg$r12.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e252); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { s1.push(s2); if (peg$r12.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e252); } } } } else { s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s0 = input.substring(s0, peg$currPos); } else { s0 = s1; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } function peg$parseterminal() { var s0, s1, s2; var key = peg$currPos * 305 + 304; var cached = peg$resultsCache[key]; if (cached) { peg$currPos = cached.nextPos; return cached.result; } s0 = peg$currPos; s1 = peg$currPos; peg$silentFails++; if (peg$r1.test(input.charAt(peg$currPos))) { s2 = input.charAt(peg$currPos); peg$currPos++; } else { s2 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e209); } } peg$silentFails--; if (s2 === peg$FAILED) { s1 = undefined; } else { peg$currPos = s1; s1 = peg$FAILED; } if (s1 !== peg$FAILED) { s2 = peg$parse_(); peg$savedPos = s0; s0 = peg$f76(s2); } else { peg$currPos = s0; s0 = peg$FAILED; } peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; return s0; } const OPEN_CURLY = String.fromCharCode(123); const makeScope = (name, parent) => ({ name, parent, bindings: {}, types: {}, functions: {}, }); const pushScope = scope => { // console.log('pushing scope at ',text()); scopes.push(scope); return scope; }; const popScope = scope => { // console.log('popping scope at ',text()); if(!scope.parent) { throw new Error('popped bad scope', scope, 'at', text()); } return scope.parent; }; const warn = (...args) => !options.quiet && console.warn(...args); // Types (aka struct) scope const addTypes = (scope, ...types) => { types.forEach(([identifier, type]) => { scope.types[identifier] = { references: [type] }; }); }; const addTypeReference = (scope, name, reference) => { scope.types[name].references.push(reference); }; const findTypeScope = (scope, typeName) => { if(!scope) { return null; } if(typeName in scope.types) { return scope; } return findTypeScope(scope.parent, typeName); }; const isDeclaredType = (scope, typeName) => findTypeScope(scope, typeName) !== null; // Bindings (aka variables, parameters) scope const createBindings = (scope, ...bindings) => { bindings.forEach(([identifier, binding]) => { const newBinding = scope.bindings[identifier] || { references: [] }; newBinding.initializer = binding; newBinding.references.unshift(binding); scope.bindings[identifier] = newBinding; }); }; const addBindingReference = (scope, name, reference) => { // In the case of "float a = 1, b = a;" we parse the final "a" before the // parent declarator list is parsed. So we might need to add the final "a" // to the scope first. const foundScope = findBindingScope(scope, name); if(foundScope) { foundScope.bindings[name].references.push(reference); } else { createBindings(scope, [name, reference]); } }; const findBindingScope = (scope, name) => { if(!scope) { return null; } if(name in scope.bindings) { return scope; } return findBindingScope(scope.parent, name); }; // Function scope const createFunction = (scope, name, declaration) => { scope.functions[name] = { references: [declaration] }; }; const addFunctionReference = (scope, name, reference) => { const global = findGlobalScope(scope); if(name in global.functions) { global.functions[name].references.push(reference); } else { createFunction(scope, name, reference); } }; const findGlobalScope = scope => scope.parent ? findGlobalScope(scope.parent) : scope; const isDeclaredFunction = (scope, fnName) => fnName in findGlobalScope(scope).functions; let scopes = [makeScope('global')]; let scope = scopes[0]; const node = (type, attrs) => ({ type, ...attrs }); // Filter out "empty" elements from an array const xnil = (...args) => args.flat().filter(e => e !== undefined && e !== null && e !== '' && e.length !== 0 ); // Given an array of nodes with potential null empty values, convert to text. // Kind of like $(rule) but filters out empty rules const toText = (...args) => xnil(args).join(''); const ifOnly = arr => arr.length > 1 ? arr : arr[0]; // Remove empty elements and return value if only 1 element remains const collapse = (...args) => ifOnly(xnil(args)); // Create a left associative tree of nodes const leftAssociate = (...nodes) => nodes.flat().reduce((current, [operator, expr]) => ({ type: "binary", operator: operator, left: current, right: expr })); // No longer needed? // const without = (obj, ...keys) => Object.entries(obj).reduce((acc, [key, value]) => ({ // ...acc, // ...(!keys.includes(key) && { [key]: value }) // }), {}); // Group the statements in a switch statement into cases / default arrays const groupCases = (statements) => statements.reduce((cases, stmt) => { if(stmt.type === 'case_label') { return [ ...cases, node( 'switch_case', { statements: [], case: stmt.case, test: stmt.test, colon: stmt.colon, } ) ]; } else if(stmt.type === 'default_label') { return [ ...cases, node( 'default_case', { statements: [], default: stmt.default, colon: stmt.colon, } ) ]; // It would be nice to encode this in the grammar instead of a manual check } else if(!cases.length) { throw new Error('A switch statement body must start with a case or default label'); } else { const tail = cases.slice(-1)[0]; return [...cases.slice(0, -1), { ...tail, statements: [ ...tail.statements, stmt ] }]; } }, []); // From https://www.khronos.org/registry/OpenGL-Refpages/gl4/index.php // excluding gl_ prefixed builtins, which don't appear to be functions const builtIns = new Set([ 'abs', 'acos', 'acosh', 'all', 'any', 'asin', 'asinh', 'atan', 'atanh', 'atomicAdd', 'atomicAnd', 'atomicCompSwap', 'atomicCounter', 'atomicCounterDecrement', 'atomicCounterIncrement', 'atomicExchange', 'atomicMax', 'atomicMin', 'atomicOr', 'atomicXor', 'barrier', 'bitCount', 'bitfieldExtract', 'bitfieldInsert', 'bitfieldReverse', 'ceil', 'clamp', 'cos', 'cosh', 'cross', 'degrees', 'determinant', 'dFdx', 'dFdxCoarse', 'dFdxFine', 'dFdy', 'dFdyCoarse', 'dFdyFine', 'distance', 'dot', 'EmitStreamVertex', 'EmitVertex', 'EndPrimitive', 'EndStreamPrimitive', 'equal', 'exp', 'exp2', 'faceforward', 'findLSB', 'findMSB', 'floatBitsToInt', 'floatBitsToUint', 'floor', 'fma', 'fract', 'frexp', 'fwidth', 'fwidthCoarse', 'fwidthFine', 'greaterThan', 'greaterThanEqual', 'groupMemoryBarrier', 'imageAtomicAdd', 'imageAtomicAnd', 'imageAtomicCompSwap', 'imageAtomicExchange', 'imageAtomicMax', 'imageAtomicMin', 'imageAtomicOr', 'imageAtomicXor', 'imageLoad', 'imageSamples', 'imageSize', 'imageStore', 'imulExtended', 'intBitsToFloat', 'interpolateAtCentroid', 'interpolateAtOffset', 'interpolateAtSample', 'inverse', 'inversesqrt', 'isinf', 'isnan', 'ldexp', 'length', 'lessThan', 'lessThanEqual', 'log', 'log2', 'matrixCompMult', 'max', 'memoryBarrier', 'memoryBarrierAtomicCounter', 'memoryBarrierBuffer', 'memoryBarrierImage', 'memoryBarrierShared', 'min', 'mix', 'mod', 'modf', 'noise', 'noise1', 'noise2', 'noise3', 'noise4', 'normalize', 'not', 'notEqual', 'outerProduct', 'packDouble2x32', 'packHalf2x16', 'packSnorm2x16', 'packSnorm4x8', 'packUnorm', 'packUnorm2x16', 'packUnorm4x8', 'pow', 'radians', 'reflect', 'refract', 'round', 'roundEven', 'sign', 'sin', 'sinh', 'smoothstep', 'sqrt', 'step', 'tan', 'tanh', 'texelFetch', 'texelFetchOffset', 'texture', 'textureGather', 'textureGatherOffset', 'textureGatherOffsets', 'textureGrad', 'textureGradOffset', 'textureLod', 'textureLodOffset', 'textureOffset', 'textureProj', 'textureProjGrad', 'textureProjGradOffset', 'textureProjLod', 'textureProjLodOffset', 'textureProjOffset', 'textureQueryLevels', 'textureQueryLod', 'textureSamples', 'textureSize', 'transpose', 'trunc', 'uaddCarry', 'uintBitsToFloat', 'umulExtended', 'unpackDouble2x32', 'unpackHalf2x16', 'unpackSnorm2x16', 'unpackSnorm4x8', 'unpackUnorm', 'unpackUnorm2x16', 'unpackUnorm4x8', 'usubBorrow', // GLSL ES 1.00 'texture2D', 'textureCube' ]); peg$result = peg$startRuleFunction(); if (peg$result !== peg$FAILED && peg$currPos === input.length) { return peg$result; } else { if (peg$result !== peg$FAILED && peg$currPos < input.length) { peg$fail(peg$endExpectation()); } throw peg$buildStructuredError( peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) ); } } var parser = { SyntaxError: peg$SyntaxError, parse: peg$parse }; "use strict"; var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var generator_1 = __importDefault(generator); var parser_1 = __importDefault(parser); var dist = { generate: generator_1.default, parser: parser_1.default }; // Format is Key (Javascript function name), Value: GLSL Source // SDFs from // https://iquilezles.org/www/articles/distfunctions/distfunctions.htm // Make sure to destruct the name in sculpt.js (search for DESTRUCT SDFs) var sdfs = { boxFrame: "float sdBoxFrame( vec3 p, vec3 b, float e )\n{\n p = abs(p )-b;\nvec3 q = abs(p+e)-e;\nreturn min(min(\n length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0),\n length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)),\n length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0));\n}", link: "float sdLink( vec3 p, float le, float r1, float r2 )\n{\n vec3 q = vec3( p.x, max(abs(p.y)-le,0.0), p.z );\n return length(vec2(length(q.xy)-r1,q.z)) - r2;\n}", cappedTorus: "\nfloat sdCappedTorus(in vec3 p, in vec2 sc, in float ra, in float rb)\n{\n p.x = abs(p.x);\n float k = (sc.y*p.x>sc.x*p.y) ? dot(p.xy,sc) : length(p.xy);\n return sqrt( dot(p,p) + ra*ra - 2.0*ra*k ) - rb;\n}\n" }; const name$1="estraverse";const description$1="ECMAScript JS AST traversal functions";const homepage$1="https://github.com/estools/estraverse";const main$1="estraverse.js";const version$1="4.3.0";const engines$1={node:">=4.0"};const maintainers$1=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository$1={type:"git",url:"http://github.com/estools/estraverse.git"};const devDependencies$1={"babel-preset-env":"^1.6.1","babel-register":"^6.3.13",chai:"^2.1.1",espree:"^1.11.0",gulp:"^3.8.10","gulp-bump":"^0.2.2","gulp-filter":"^2.0.0","gulp-git":"^1.0.1","gulp-tag-version":"^1.3.0",jshint:"^2.5.6",mocha:"^2.1.0"};const license$1="BSD-2-Clause";const scripts$1={test:"npm run-script lint && npm run-script unit-test",lint:"jshint estraverse.js","unit-test":"mocha --compilers js:babel-register"};var require$$0 = {name:name$1,description:description$1,homepage:homepage$1,main:main$1,version:version$1,engines:engines$1,maintainers:maintainers$1,repository:repository$1,devDependencies:devDependencies$1,license:license$1,scripts:scripts$1}; /* Copyright (C) 2012-2013 Yusuke Suzuki Copyright (C) 2012 Ariya Hidayat Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var estraverse = createCommonjsModule(function (module, exports) { /*jslint vars:false, bitwise:true*/ /*jshint indent:4*/ /*global exports:true*/ (function clone(exports) { 'use strict'; var Syntax, VisitorOption, VisitorKeys, BREAK, SKIP, REMOVE; function deepCopy(obj) { var ret = {}, key, val; for (key in obj) { if (obj.hasOwnProperty(key)) { val = obj[key]; if (typeof val === 'object' && val !== null) { ret[key] = deepCopy(val); } else { ret[key] = val; } } } return ret; } // based on LLVM libc++ upper_bound / lower_bound // MIT License function upperBound(array, func) { var diff, len, i, current; len = array.length; i = 0; while (len) { diff = len >>> 1; current = i + diff; if (func(array[current])) { len = diff; } else { i = current + 1; len -= diff + 1; } } return i; } Syntax = { AssignmentExpression: 'AssignmentExpression', AssignmentPattern: 'AssignmentPattern', ArrayExpression: 'ArrayExpression', ArrayPattern: 'ArrayPattern', ArrowFunctionExpression: 'ArrowFunctionExpression', AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7. BlockStatement: 'BlockStatement', BinaryExpression: 'BinaryExpression', BreakStatement: 'BreakStatement', CallExpression: 'CallExpression', CatchClause: 'CatchClause', ClassBody: 'ClassBody', ClassDeclaration: 'ClassDeclaration', ClassExpression: 'ClassExpression', ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7. ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7. ConditionalExpression: 'ConditionalExpression', ContinueStatement: 'ContinueStatement', DebuggerStatement: 'DebuggerStatement', DirectiveStatement: 'DirectiveStatement', DoWhileStatement: 'DoWhileStatement', EmptyStatement: 'EmptyStatement', ExportAllDeclaration: 'ExportAllDeclaration', ExportDefaultDeclaration: 'ExportDefaultDeclaration', ExportNamedDeclaration: 'ExportNamedDeclaration', ExportSpecifier: 'ExportSpecifier', ExpressionStatement: 'ExpressionStatement', ForStatement: 'ForStatement', ForInStatement: 'ForInStatement', ForOfStatement: 'ForOfStatement', FunctionDeclaration: 'FunctionDeclaration', FunctionExpression: 'FunctionExpression', GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7. Identifier: 'Identifier', IfStatement: 'IfStatement', ImportExpression: 'ImportExpression', ImportDeclaration: 'ImportDeclaration', ImportDefaultSpecifier: 'ImportDefaultSpecifier', ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', ImportSpecifier: 'ImportSpecifier', Literal: 'Literal', LabeledStatement: 'LabeledStatement', LogicalExpression: 'LogicalExpression', MemberExpression: 'MemberExpression', MetaProperty: 'MetaProperty', MethodDefinition: 'MethodDefinition', ModuleSpecifier: 'ModuleSpecifier', NewExpression: 'NewExpression', ObjectExpression: 'ObjectExpression', ObjectPattern: 'ObjectPattern', Program: 'Program', Property: 'Property', RestElement: 'RestElement', ReturnStatement: 'ReturnStatement', SequenceExpression: 'SequenceExpression', SpreadElement: 'SpreadElement', Super: 'Super', SwitchStatement: 'SwitchStatement', SwitchCase: 'SwitchCase', TaggedTemplateExpression: 'TaggedTemplateExpression', TemplateElement: 'TemplateElement', TemplateLiteral: 'TemplateLiteral', ThisExpression: 'ThisExpression', ThrowStatement: 'ThrowStatement', TryStatement: 'TryStatement', UnaryExpression: 'UnaryExpression', UpdateExpression: 'UpdateExpression', VariableDeclaration: 'VariableDeclaration', VariableDeclarator: 'VariableDeclarator', WhileStatement: 'WhileStatement', WithStatement: 'WithStatement', YieldExpression: 'YieldExpression' }; VisitorKeys = { AssignmentExpression: ['left', 'right'], AssignmentPattern: ['left', 'right'], ArrayExpression: ['elements'], ArrayPattern: ['elements'], ArrowFunctionExpression: ['params', 'body'], AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7. BlockStatement: ['body'], BinaryExpression: ['left', 'right'], BreakStatement: ['label'], CallExpression: ['callee', 'arguments'], CatchClause: ['param', 'body'], ClassBody: ['body'], ClassDeclaration: ['id', 'superClass', 'body'], ClassExpression: ['id', 'superClass', 'body'], ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7. ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7. ConditionalExpression: ['test', 'consequent', 'alternate'], ContinueStatement: ['label'], DebuggerStatement: [], DirectiveStatement: [], DoWhileStatement: ['body', 'test'], EmptyStatement: [], ExportAllDeclaration: ['source'], ExportDefaultDeclaration: ['declaration'], ExportNamedDeclaration: ['declaration', 'specifiers', 'source'], ExportSpecifier: ['exported', 'local'], ExpressionStatement: ['expression'], ForStatement: ['init', 'test', 'update', 'body'], ForInStatement: ['left', 'right', 'body'], ForOfStatement: ['left', 'right', 'body'], FunctionDeclaration: ['id', 'params', 'body'], FunctionExpression: ['id', 'params', 'body'], GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7. Identifier: [], IfStatement: ['test', 'consequent', 'alternate'], ImportExpression: ['source'], ImportDeclaration: ['specifiers', 'source'], ImportDefaultSpecifier: ['local'], ImportNamespaceSpecifier: ['local'], ImportSpecifier: ['imported', 'local'], Literal: [], LabeledStatement: ['label', 'body'], LogicalExpression: ['left', 'right'], MemberExpression: ['object', 'property'], MetaProperty: ['meta', 'property'], MethodDefinition: ['key', 'value'], ModuleSpecifier: [], NewExpression: ['callee', 'arguments'], ObjectExpression: ['properties'], ObjectPattern: ['properties'], Program: ['body'], Property: ['key', 'value'], RestElement: [ 'argument' ], ReturnStatement: ['argument'], SequenceExpression: ['expressions'], SpreadElement: ['argument'], Super: [], SwitchStatement: ['discriminant', 'cases'], SwitchCase: ['test', 'consequent'], TaggedTemplateExpression: ['tag', 'quasi'], TemplateElement: [], TemplateLiteral: ['quasis', 'expressions'], ThisExpression: [], ThrowStatement: ['argument'], TryStatement: ['block', 'handler', 'finalizer'], UnaryExpression: ['argument'], UpdateExpression: ['argument'], VariableDeclaration: ['declarations'], VariableDeclarator: ['id', 'init'], WhileStatement: ['test', 'body'], WithStatement: ['object', 'body'], YieldExpression: ['argument'] }; // unique id BREAK = {}; SKIP = {}; REMOVE = {}; VisitorOption = { Break: BREAK, Skip: SKIP, Remove: REMOVE }; function Reference(parent, key) { this.parent = parent; this.key = key; } Reference.prototype.replace = function replace(node) { this.parent[this.key] = node; }; Reference.prototype.remove = function remove() { if (Array.isArray(this.parent)) { this.parent.splice(this.key, 1); return true; } else { this.replace(null); return false; } }; function Element(node, path, wrap, ref) { this.node = node; this.path = path; this.wrap = wrap; this.ref = ref; } function Controller() { } // API: // return property path array from root to current node Controller.prototype.path = function path() { var i, iz, j, jz, result, element; function addToPath(result, path) { if (Array.isArray(path)) { for (j = 0, jz = path.length; j < jz; ++j) { result.push(path[j]); } } else { result.push(path); } } // root node if (!this.__current.path) { return null; } // first node is sentinel, second node is root element result = []; for (i = 2, iz = this.__leavelist.length; i < iz; ++i) { element = this.__leavelist[i]; addToPath(result, element.path); } addToPath(result, this.__current.path); return result; }; // API: // return type of current node Controller.prototype.type = function () { var node = this.current(); return node.type || this.__current.wrap; }; // API: // return array of parent elements Controller.prototype.parents = function parents() { var i, iz, result; // first node is sentinel result = []; for (i = 1, iz = this.__leavelist.length; i < iz; ++i) { result.push(this.__leavelist[i].node); } return result; }; // API: // return current node Controller.prototype.current = function current() { return this.__current.node; }; Controller.prototype.__execute = function __execute(callback, element) { var previous, result; result = undefined; previous = this.__current; this.__current = element; this.__state = null; if (callback) { result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node); } this.__current = previous; return result; }; // API: // notify control skip / break Controller.prototype.notify = function notify(flag) { this.__state = flag; }; // API: // skip child nodes of current node Controller.prototype.skip = function () { this.notify(SKIP); }; // API: // break traversals Controller.prototype['break'] = function () { this.notify(BREAK); }; // API: // remove node Controller.prototype.remove = function () { this.notify(REMOVE); }; Controller.prototype.__initialize = function(root, visitor) { this.visitor = visitor; this.root = root; this.__worklist = []; this.__leavelist = []; this.__current = null; this.__state = null; this.__fallback = null; if (visitor.fallback === 'iteration') { this.__fallback = Object.keys; } else if (typeof visitor.fallback === 'function') { this.__fallback = visitor.fallback; } this.__keys = VisitorKeys; if (visitor.keys) { this.__keys = Object.assign(Object.create(this.__keys), visitor.keys); } }; function isNode(node) { if (node == null) { return false; } return typeof node === 'object' && typeof node.type === 'string'; } function isProperty(nodeType, key) { return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key; } Controller.prototype.traverse = function traverse(root, visitor) { var worklist, leavelist, element, node, nodeType, ret, key, current, current2, candidates, candidate, sentinel; this.__initialize(root, visitor); sentinel = {}; // reference worklist = this.__worklist; leavelist = this.__leavelist; // initialize worklist.push(new Element(root, null, null, null)); leavelist.push(new Element(null, null, null, null)); while (worklist.length) { element = worklist.pop(); if (element === sentinel) { element = leavelist.pop(); ret = this.__execute(visitor.leave, element); if (this.__state === BREAK || ret === BREAK) { return; } continue; } if (element.node) { ret = this.__execute(visitor.enter, element); if (this.__state === BREAK || ret === BREAK) { return; } worklist.push(sentinel); leavelist.push(element); if (this.__state === SKIP || ret === SKIP) { continue; } node = element.node; nodeType = node.type || element.wrap; candidates = this.__keys[nodeType]; if (!candidates) { if (this.__fallback) { candidates = this.__fallback(node); } else { throw new Error('Unknown node type ' + nodeType + '.'); } } current = candidates.length; while ((current -= 1) >= 0) { key = candidates[current]; candidate = node[key]; if (!candidate) { continue; } if (Array.isArray(candidate)) { current2 = candidate.length; while ((current2 -= 1) >= 0) { if (!candidate[current2]) { continue; } if (isProperty(nodeType, candidates[current])) { element = new Element(candidate[current2], [key, current2], 'Property', null); } else if (isNode(candidate[current2])) { element = new Element(candidate[current2], [key, current2], null, null); } else { continue; } worklist.push(element); } } else if (isNode(candidate)) { worklist.push(new Element(candidate, key, null, null)); } } } } }; Controller.prototype.replace = function replace(root, visitor) { var worklist, leavelist, node, nodeType, target, element, current, current2, candidates, candidate, sentinel, outer, key; function removeElem(element) { var i, key, nextElem, parent; if (element.ref.remove()) { // When the reference is an element of an array. key = element.ref.key; parent = element.ref.parent; // If removed from array, then decrease following items' keys. i = worklist.length; while (i--) { nextElem = worklist[i]; if (nextElem.ref && nextElem.ref.parent === parent) { if (nextElem.ref.key < key) { break; } --nextElem.ref.key; } } } } this.__initialize(root, visitor); sentinel = {}; // reference worklist = this.__worklist; leavelist = this.__leavelist; // initialize outer = { root: root }; element = new Element(root, null, null, new Reference(outer, 'root')); worklist.push(element); leavelist.push(element); while (worklist.length) { element = worklist.pop(); if (element === sentinel) { element = leavelist.pop(); target = this.__execute(visitor.leave, element); // node may be replaced with null, // so distinguish between undefined and null in this place if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) { // replace element.ref.replace(target); } if (this.__state === REMOVE || target === REMOVE) { removeElem(element); } if (this.__state === BREAK || target === BREAK) { return outer.root; } continue; } target = this.__execute(visitor.enter, element); // node may be replaced with null, // so distinguish between undefined and null in this place if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) { // replace element.ref.replace(target); element.node = target; } if (this.__state === REMOVE || target === REMOVE) { removeElem(element); element.node = null; } if (this.__state === BREAK || target === BREAK) { return outer.root; } // node may be null node = element.node; if (!node) { continue; } worklist.push(sentinel); leavelist.push(element); if (this.__state === SKIP || target === SKIP) { continue; } nodeType = node.type || element.wrap; candidates = this.__keys[nodeType]; if (!candidates) { if (this.__fallback) { candidates = this.__fallback(node); } else { throw new Error('Unknown node type ' + nodeType + '.'); } } current = candidates.length; while ((current -= 1) >= 0) { key = candidates[current]; candidate = node[key]; if (!candidate) { continue; } if (Array.isArray(candidate)) { current2 = candidate.length; while ((current2 -= 1) >= 0) { if (!candidate[current2]) { continue; } if (isProperty(nodeType, candidates[current])) { element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2)); } else if (isNode(candidate[current2])) { element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2)); } else { continue; } worklist.push(element); } } else if (isNode(candidate)) { worklist.push(new Element(candidate, key, null, new Reference(node, key))); } } } return outer.root; }; function traverse(root, visitor) { var controller = new Controller(); return controller.traverse(root, visitor); } function replace(root, visitor) { var controller = new Controller(); return controller.replace(root, visitor); } function extendCommentRange(comment, tokens) { var target; target = upperBound(tokens, function search(token) { return token.range[0] > comment.range[0]; }); comment.extendedRange = [comment.range[0], comment.range[1]]; if (target !== tokens.length) { comment.extendedRange[1] = tokens[target].range[0]; } target -= 1; if (target >= 0) { comment.extendedRange[0] = tokens[target].range[1]; } return comment; } function attachComments(tree, providedComments, tokens) { // At first, we should calculate extended comment ranges. var comments = [], comment, len, i, cursor; if (!tree.range) { throw new Error('attachComments needs range information'); } // tokens array is empty, we attach comments to tree as 'leadingComments' if (!tokens.length) { if (providedComments.length) { for (i = 0, len = providedComments.length; i < len; i += 1) { comment = deepCopy(providedComments[i]); comment.extendedRange = [0, tree.range[0]]; comments.push(comment); } tree.leadingComments = comments; } return tree; } for (i = 0, len = providedComments.length; i < len; i += 1) { comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens)); } // This is based on John Freeman's implementation. cursor = 0; traverse(tree, { enter: function (node) { var comment; while (cursor < comments.length) { comment = comments[cursor]; if (comment.extendedRange[1] > node.range[0]) { break; } if (comment.extendedRange[1] === node.range[0]) { if (!node.leadingComments) { node.leadingComments = []; } node.leadingComments.push(comment); comments.splice(cursor, 1); } else { cursor += 1; } } // already out of owned node if (cursor === comments.length) { return VisitorOption.Break; } if (comments[cursor].extendedRange[0] > node.range[1]) { return VisitorOption.Skip; } } }); cursor = 0; traverse(tree, { leave: function (node) { var comment; while (cursor < comments.length) { comment = comments[cursor]; if (node.range[1] < comment.extendedRange[0]) { break; } if (node.range[1] === comment.extendedRange[0]) { if (!node.trailingComments) { node.trailingComments = []; } node.trailingComments.push(comment); comments.splice(cursor, 1); } else { cursor += 1; } } // already out of owned node if (cursor === comments.length) { return VisitorOption.Break; } if (comments[cursor].extendedRange[0] > node.range[1]) { return VisitorOption.Skip; } } }); return tree; } exports.version = require$$0.version; exports.Syntax = Syntax; exports.traverse = traverse; exports.replace = replace; exports.attachComments = attachComments; exports.VisitorKeys = VisitorKeys; exports.VisitorOption = VisitorOption; exports.Controller = Controller; exports.cloneEnvironment = function () { return clone({}); }; return exports; }(exports)); /* vim: set sw=4 ts=4 et tw=80 : */ }); /* Copyright (C) 2013 Yusuke Suzuki Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var ast = createCommonjsModule(function (module) { (function () { 'use strict'; function isExpression(node) { if (node == null) { return false; } switch (node.type) { case 'ArrayExpression': case 'AssignmentExpression': case 'BinaryExpression': case 'CallExpression': case 'ConditionalExpression': case 'FunctionExpression': case 'Identifier': case 'Literal': case 'LogicalExpression': case 'MemberExpression': case 'NewExpression': case 'ObjectExpression': case 'SequenceExpression': case 'ThisExpression': case 'UnaryExpression': case 'UpdateExpression': return true; } return false; } function isIterationStatement(node) { if (node == null) { return false; } switch (node.type) { case 'DoWhileStatement': case 'ForInStatement': case 'ForStatement': case 'WhileStatement': return true; } return false; } function isStatement(node) { if (node == null) { return false; } switch (node.type) { case 'BlockStatement': case 'BreakStatement': case 'ContinueStatement': case 'DebuggerStatement': case 'DoWhileStatement': case 'EmptyStatement': case 'ExpressionStatement': case 'ForInStatement': case 'ForStatement': case 'IfStatement': case 'LabeledStatement': case 'ReturnStatement': case 'SwitchStatement': case 'ThrowStatement': case 'TryStatement': case 'VariableDeclaration': case 'WhileStatement': case 'WithStatement': return true; } return false; } function isSourceElement(node) { return isStatement(node) || node != null && node.type === 'FunctionDeclaration'; } function trailingStatement(node) { switch (node.type) { case 'IfStatement': if (node.alternate != null) { return node.alternate; } return node.consequent; case 'LabeledStatement': case 'ForStatement': case 'ForInStatement': case 'WhileStatement': case 'WithStatement': return node.body; } return null; } function isProblematicIfStatement(node) { var current; if (node.type !== 'IfStatement') { return false; } if (node.alternate == null) { return false; } current = node.consequent; do { if (current.type === 'IfStatement') { if (current.alternate == null) { return true; } } current = trailingStatement(current); } while (current); return false; } module.exports = { isExpression: isExpression, isStatement: isStatement, isIterationStatement: isIterationStatement, isSourceElement: isSourceElement, isProblematicIfStatement: isProblematicIfStatement, trailingStatement: trailingStatement }; }()); /* vim: set sw=4 ts=4 et tw=80 : */ }); /* Copyright (C) 2013-2014 Yusuke Suzuki Copyright (C) 2014 Ivan Nikulin Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var code = createCommonjsModule(function (module) { (function () { 'use strict'; var ES6Regex, ES5Regex, NON_ASCII_WHITESPACES, IDENTIFIER_START, IDENTIFIER_PART, ch; // See `tools/generate-identifier-regex.js`. ES5Regex = { // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierStart: NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, // ECMAScript 5.1/Unicode v9.0.0 NonAsciiIdentifierPart: NonAsciiIdentifierPart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ }; ES6Regex = { // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierStart: NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, // ECMAScript 6/Unicode v9.0.0 NonAsciiIdentifierPart: NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08B6-\u08BD\u08D4-\u08E1\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C80-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D54-\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1C80-\u1C88\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFB-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AE\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C5\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE3E\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC00-\uDC4A\uDC50-\uDC59\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC36\uDC38-\uDC40\uDC50-\uDC59\uDC72-\uDC8F\uDC92-\uDCA7\uDCA9-\uDCB6]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F\uDFE0]|\uD821[\uDC00-\uDFEC]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD838[\uDC00-\uDC06\uDC08-\uDC18\uDC1B-\uDC21\uDC23\uDC24\uDC26-\uDC2A]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6\uDD00-\uDD4A\uDD50-\uDD59]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ }; function isDecimalDigit(ch) { return 0x30 <= ch && ch <= 0x39; // 0..9 } function isHexDigit(ch) { return 0x30 <= ch && ch <= 0x39 || // 0..9 0x61 <= ch && ch <= 0x66 || // a..f 0x41 <= ch && ch <= 0x46; // A..F } function isOctalDigit(ch) { return ch >= 0x30 && ch <= 0x37; // 0..7 } // 7.2 White Space NON_ASCII_WHITESPACES = [ 0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF ]; function isWhiteSpace(ch) { return ch === 0x20 || ch === 0x09 || ch === 0x0B || ch === 0x0C || ch === 0xA0 || ch >= 0x1680 && NON_ASCII_WHITESPACES.indexOf(ch) >= 0; } // 7.3 Line Terminators function isLineTerminator(ch) { return ch === 0x0A || ch === 0x0D || ch === 0x2028 || ch === 0x2029; } // 7.6 Identifier Names and Identifiers function fromCodePoint(cp) { if (cp <= 0xFFFF) { return String.fromCharCode(cp); } var cu1 = String.fromCharCode(Math.floor((cp - 0x10000) / 0x400) + 0xD800); var cu2 = String.fromCharCode(((cp - 0x10000) % 0x400) + 0xDC00); return cu1 + cu2; } IDENTIFIER_START = new Array(0x80); for(ch = 0; ch < 0x80; ++ch) { IDENTIFIER_START[ch] = ch >= 0x61 && ch <= 0x7A || // a..z ch >= 0x41 && ch <= 0x5A || // A..Z ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) } IDENTIFIER_PART = new Array(0x80); for(ch = 0; ch < 0x80; ++ch) { IDENTIFIER_PART[ch] = ch >= 0x61 && ch <= 0x7A || // a..z ch >= 0x41 && ch <= 0x5A || // A..Z ch >= 0x30 && ch <= 0x39 || // 0..9 ch === 0x24 || ch === 0x5F; // $ (dollar) and _ (underscore) } function isIdentifierStartES5(ch) { return ch < 0x80 ? IDENTIFIER_START[ch] : ES5Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); } function isIdentifierPartES5(ch) { return ch < 0x80 ? IDENTIFIER_PART[ch] : ES5Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); } function isIdentifierStartES6(ch) { return ch < 0x80 ? IDENTIFIER_START[ch] : ES6Regex.NonAsciiIdentifierStart.test(fromCodePoint(ch)); } function isIdentifierPartES6(ch) { return ch < 0x80 ? IDENTIFIER_PART[ch] : ES6Regex.NonAsciiIdentifierPart.test(fromCodePoint(ch)); } module.exports = { isDecimalDigit: isDecimalDigit, isHexDigit: isHexDigit, isOctalDigit: isOctalDigit, isWhiteSpace: isWhiteSpace, isLineTerminator: isLineTerminator, isIdentifierStartES5: isIdentifierStartES5, isIdentifierPartES5: isIdentifierPartES5, isIdentifierStartES6: isIdentifierStartES6, isIdentifierPartES6: isIdentifierPartES6 }; }()); /* vim: set sw=4 ts=4 et tw=80 : */ }); /* Copyright (C) 2013 Yusuke Suzuki Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var keyword = createCommonjsModule(function (module) { (function () { 'use strict'; var code$1 = code; function isStrictModeReservedWordES6(id) { switch (id) { case 'implements': case 'interface': case 'package': case 'private': case 'protected': case 'public': case 'static': case 'let': return true; default: return false; } } function isKeywordES5(id, strict) { // yield should not be treated as keyword under non-strict mode. if (!strict && id === 'yield') { return false; } return isKeywordES6(id, strict); } function isKeywordES6(id, strict) { if (strict && isStrictModeReservedWordES6(id)) { return true; } switch (id.length) { case 2: return (id === 'if') || (id === 'in') || (id === 'do'); case 3: return (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try'); case 4: return (id === 'this') || (id === 'else') || (id === 'case') || (id === 'void') || (id === 'with') || (id === 'enum'); case 5: return (id === 'while') || (id === 'break') || (id === 'catch') || (id === 'throw') || (id === 'const') || (id === 'yield') || (id === 'class') || (id === 'super'); case 6: return (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch') || (id === 'export') || (id === 'import'); case 7: return (id === 'default') || (id === 'finally') || (id === 'extends'); case 8: return (id === 'function') || (id === 'continue') || (id === 'debugger'); case 10: return (id === 'instanceof'); default: return false; } } function isReservedWordES5(id, strict) { return id === 'null' || id === 'true' || id === 'false' || isKeywordES5(id, strict); } function isReservedWordES6(id, strict) { return id === 'null' || id === 'true' || id === 'false' || isKeywordES6(id, strict); } function isRestrictedWord(id) { return id === 'eval' || id === 'arguments'; } function isIdentifierNameES5(id) { var i, iz, ch; if (id.length === 0) { return false; } ch = id.charCodeAt(0); if (!code$1.isIdentifierStartES5(ch)) { return false; } for (i = 1, iz = id.length; i < iz; ++i) { ch = id.charCodeAt(i); if (!code$1.isIdentifierPartES5(ch)) { return false; } } return true; } function decodeUtf16(lead, trail) { return (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000; } function isIdentifierNameES6(id) { var i, iz, ch, lowCh, check; if (id.length === 0) { return false; } check = code$1.isIdentifierStartES6; for (i = 0, iz = id.length; i < iz; ++i) { ch = id.charCodeAt(i); if (0xD800 <= ch && ch <= 0xDBFF) { ++i; if (i >= iz) { return false; } lowCh = id.charCodeAt(i); if (!(0xDC00 <= lowCh && lowCh <= 0xDFFF)) { return false; } ch = decodeUtf16(ch, lowCh); } if (!check(ch)) { return false; } check = code$1.isIdentifierPartES6; } return true; } function isIdentifierES5(id, strict) { return isIdentifierNameES5(id) && !isReservedWordES5(id, strict); } function isIdentifierES6(id, strict) { return isIdentifierNameES6(id) && !isReservedWordES6(id, strict); } module.exports = { isKeywordES5: isKeywordES5, isKeywordES6: isKeywordES6, isReservedWordES5: isReservedWordES5, isReservedWordES6: isReservedWordES6, isRestrictedWord: isRestrictedWord, isIdentifierNameES5: isIdentifierNameES5, isIdentifierNameES6: isIdentifierNameES6, isIdentifierES5: isIdentifierES5, isIdentifierES6: isIdentifierES6 }; }()); /* vim: set sw=4 ts=4 et tw=80 : */ }); /* Copyright (C) 2013 Yusuke Suzuki Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var utils = createCommonjsModule(function (module, exports) { (function () { 'use strict'; exports.ast = ast; exports.code = code; exports.keyword = keyword; }()); /* vim: set sw=4 ts=4 et tw=80 : */ }); /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); /** * Encode an integer in the range of 0 to 63 to a single base 64 digit. */ var encode$1 = function (number) { if (0 <= number && number < intToCharMap.length) { return intToCharMap[number]; } throw new TypeError("Must be between 0 and 63: " + number); }; /** * Decode a single base 64 character code digit to an integer. Returns -1 on * failure. */ var decode$1 = function (charCode) { var bigA = 65; // 'A' var bigZ = 90; // 'Z' var littleA = 97; // 'a' var littleZ = 122; // 'z' var zero = 48; // '0' var nine = 57; // '9' var plus = 43; // '+' var slash = 47; // '/' var littleOffset = 26; var numberOffset = 52; // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ if (bigA <= charCode && charCode <= bigZ) { return (charCode - bigA); } // 26 - 51: abcdefghijklmnopqrstuvwxyz if (littleA <= charCode && charCode <= littleZ) { return (charCode - littleA + littleOffset); } // 52 - 61: 0123456789 if (zero <= charCode && charCode <= nine) { return (charCode - zero + numberOffset); } // 62: + if (charCode == plus) { return 62; } // 63: / if (charCode == slash) { return 63; } // Invalid base64 digit. return -1; }; var base64 = { encode: encode$1, decode: decode$1 }; /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause * * Based on the Base 64 VLQ implementation in Closure Compiler: * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java * * Copyright 2011 The Closure Compiler Authors. All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, // the next four bits are the actual value, and the 6th bit is the // continuation bit. The continuation bit tells us whether there are more // digits in this value following this digit. // // Continuation // | Sign // | | // V V // 101011 var VLQ_BASE_SHIFT = 5; // binary: 100000 var VLQ_BASE = 1 << VLQ_BASE_SHIFT; // binary: 011111 var VLQ_BASE_MASK = VLQ_BASE - 1; // binary: 100000 var VLQ_CONTINUATION_BIT = VLQ_BASE; /** * Converts from a two-complement value to a value where the sign bit is * placed in the least significant bit. For example, as decimals: * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary) * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary) */ function toVLQSigned(aValue) { return aValue < 0 ? ((-aValue) << 1) + 1 : (aValue << 1) + 0; } /** * Converts to a two-complement value from a value where the sign bit is * placed in the least significant bit. For example, as decimals: * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1 * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2 */ function fromVLQSigned(aValue) { var isNegative = (aValue & 1) === 1; var shifted = aValue >> 1; return isNegative ? -shifted : shifted; } /** * Returns the base 64 VLQ encoded value. */ var encode = function base64VLQ_encode(aValue) { var encoded = ""; var digit; var vlq = toVLQSigned(aValue); do { digit = vlq & VLQ_BASE_MASK; vlq >>>= VLQ_BASE_SHIFT; if (vlq > 0) { // There are still more digits in this value, so we must make sure the // continuation bit is marked. digit |= VLQ_CONTINUATION_BIT; } encoded += base64.encode(digit); } while (vlq > 0); return encoded; }; /** * Decodes the next base 64 VLQ value from the given string and returns the * value and the rest of the string via the out parameter. */ var decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { var strLen = aStr.length; var result = 0; var shift = 0; var continuation, digit; do { if (aIndex >= strLen) { throw new Error("Expected more digits in base 64 VLQ value."); } digit = base64.decode(aStr.charCodeAt(aIndex++)); if (digit === -1) { throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)); } continuation = !!(digit & VLQ_CONTINUATION_BIT); digit &= VLQ_BASE_MASK; result = result + (digit << shift); shift += VLQ_BASE_SHIFT; } while (continuation); aOutParam.value = fromVLQSigned(result); aOutParam.rest = aIndex; }; var base64Vlq = { encode: encode, decode: decode }; /* -*- Mode: js; js-indent-level: 2; -*- */ var util = createCommonjsModule(function (module, exports) { /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ /** * This is a helper function for getting values from parameter/options * objects. * * @param args The object we are extracting values from * @param name The name of the property we are getting. * @param defaultValue An optional value to return if the property is missing * from the object. If this is not specified and the property is missing, an * error will be thrown. */ function getArg(aArgs, aName, aDefaultValue) { if (aName in aArgs) { return aArgs[aName]; } else if (arguments.length === 3) { return aDefaultValue; } else { throw new Error('"' + aName + '" is a required argument.'); } } exports.getArg = getArg; var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; var dataUrlRegexp = /^data:.+\,.+$/; function urlParse(aUrl) { var match = aUrl.match(urlRegexp); if (!match) { return null; } return { scheme: match[1], auth: match[2], host: match[3], port: match[4], path: match[5] }; } exports.urlParse = urlParse; function urlGenerate(aParsedUrl) { var url = ''; if (aParsedUrl.scheme) { url += aParsedUrl.scheme + ':'; } url += '//'; if (aParsedUrl.auth) { url += aParsedUrl.auth + '@'; } if (aParsedUrl.host) { url += aParsedUrl.host; } if (aParsedUrl.port) { url += ":" + aParsedUrl.port; } if (aParsedUrl.path) { url += aParsedUrl.path; } return url; } exports.urlGenerate = urlGenerate; /** * Normalizes a path, or the path portion of a URL: * * - Replaces consecutive slashes with one slash. * - Removes unnecessary '.' parts. * - Removes unnecessary '/..' parts. * * Based on code in the Node.js 'path' core module. * * @param aPath The path or url to normalize. */ function normalize(aPath) { var path = aPath; var url = urlParse(aPath); if (url) { if (!url.path) { return aPath; } path = url.path; } var isAbsolute = exports.isAbsolute(path); var parts = path.split(/\/+/); for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { part = parts[i]; if (part === '.') { parts.splice(i, 1); } else if (part === '..') { up++; } else if (up > 0) { if (part === '') { // The first part is blank if the path is absolute. Trying to go // above the root is a no-op. Therefore we can remove all '..' parts // directly after the root. parts.splice(i + 1, up); up = 0; } else { parts.splice(i, 2); up--; } } } path = parts.join('/'); if (path === '') { path = isAbsolute ? '/' : '.'; } if (url) { url.path = path; return urlGenerate(url); } return path; } exports.normalize = normalize; /** * Joins two paths/URLs. * * @param aRoot The root path or URL. * @param aPath The path or URL to be joined with the root. * * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a * scheme-relative URL: Then the scheme of aRoot, if any, is prepended * first. * - Otherwise aPath is a path. If aRoot is a URL, then its path portion * is updated with the result and aRoot is returned. Otherwise the result * is returned. * - If aPath is absolute, the result is aPath. * - Otherwise the two paths are joined with a slash. * - Joining for example 'http://' and 'www.example.com' is also supported. */ function join(aRoot, aPath) { if (aRoot === "") { aRoot = "."; } if (aPath === "") { aPath = "."; } var aPathUrl = urlParse(aPath); var aRootUrl = urlParse(aRoot); if (aRootUrl) { aRoot = aRootUrl.path || '/'; } // `join(foo, '//www.example.org')` if (aPathUrl && !aPathUrl.scheme) { if (aRootUrl) { aPathUrl.scheme = aRootUrl.scheme; } return urlGenerate(aPathUrl); } if (aPathUrl || aPath.match(dataUrlRegexp)) { return aPath; } // `join('http://', 'www.example.com')` if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { aRootUrl.host = aPath; return urlGenerate(aRootUrl); } var joined = aPath.charAt(0) === '/' ? aPath : normalize(aRoot.replace(/\/+$/, '') + '/' + aPath); if (aRootUrl) { aRootUrl.path = joined; return urlGenerate(aRootUrl); } return joined; } exports.join = join; exports.isAbsolute = function (aPath) { return aPath.charAt(0) === '/' || urlRegexp.test(aPath); }; /** * Make a path relative to a URL or another path. * * @param aRoot The root path or URL. * @param aPath The path or URL to be made relative to aRoot. */ function relative(aRoot, aPath) { if (aRoot === "") { aRoot = "."; } aRoot = aRoot.replace(/\/$/, ''); // It is possible for the path to be above the root. In this case, simply // checking whether the root is a prefix of the path won't work. Instead, we // need to remove components from the root one by one, until either we find // a prefix that fits, or we run out of components to remove. var level = 0; while (aPath.indexOf(aRoot + '/') !== 0) { var index = aRoot.lastIndexOf("/"); if (index < 0) { return aPath; } // If the only part of the root that is left is the scheme (i.e. http://, // file:///, etc.), one or more slashes (/), or simply nothing at all, we // have exhausted all components, so the path is not relative to the root. aRoot = aRoot.slice(0, index); if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { return aPath; } ++level; } // Make sure we add a "../" for each component we removed from the root. return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1); } exports.relative = relative; var supportsNullProto = (function () { var obj = Object.create(null); return !('__proto__' in obj); }()); function identity (s) { return s; } /** * Because behavior goes wacky when you set `__proto__` on objects, we * have to prefix all the strings in our set with an arbitrary character. * * See https://github.com/mozilla/source-map/pull/31 and * https://github.com/mozilla/source-map/issues/30 * * @param String aStr */ function toSetString(aStr) { if (isProtoString(aStr)) { return '$' + aStr; } return aStr; } exports.toSetString = supportsNullProto ? identity : toSetString; function fromSetString(aStr) { if (isProtoString(aStr)) { return aStr.slice(1); } return aStr; } exports.fromSetString = supportsNullProto ? identity : fromSetString; function isProtoString(s) { if (!s) { return false; } var length = s.length; if (length < 9 /* "__proto__".length */) { return false; } if (s.charCodeAt(length - 1) !== 95 /* '_' */ || s.charCodeAt(length - 2) !== 95 /* '_' */ || s.charCodeAt(length - 3) !== 111 /* 'o' */ || s.charCodeAt(length - 4) !== 116 /* 't' */ || s.charCodeAt(length - 5) !== 111 /* 'o' */ || s.charCodeAt(length - 6) !== 114 /* 'r' */ || s.charCodeAt(length - 7) !== 112 /* 'p' */ || s.charCodeAt(length - 8) !== 95 /* '_' */ || s.charCodeAt(length - 9) !== 95 /* '_' */) { return false; } for (var i = length - 10; i >= 0; i--) { if (s.charCodeAt(i) !== 36 /* '$' */) { return false; } } return true; } /** * Comparator between two mappings where the original positions are compared. * * Optionally pass in `true` as `onlyCompareGenerated` to consider two * mappings with the same original source/line/column, but different generated * line and column the same. Useful when searching for a mapping with a * stubbed out mapping. */ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { var cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0 || onlyCompareOriginal) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByOriginalPositions = compareByOriginalPositions; /** * Comparator between two mappings with deflated source and name indices where * the generated positions are compared. * * Optionally pass in `true` as `onlyCompareGenerated` to consider two * mappings with the same generated line and column, but different * source/name/original line and column the same. Useful when searching for a * mapping with a stubbed out mapping. */ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0 || onlyCompareGenerated) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; function strcmp(aStr1, aStr2) { if (aStr1 === aStr2) { return 0; } if (aStr1 === null) { return 1; // aStr2 !== null } if (aStr2 === null) { return -1; // aStr1 !== null } if (aStr1 > aStr2) { return 1; } return -1; } /** * Comparator between two mappings with inflated source and name strings where * the generated positions are compared. */ function compareByGeneratedPositionsInflated(mappingA, mappingB) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp; } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp; } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp; } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp; } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp; } return strcmp(mappingA.name, mappingB.name); } exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; /** * Strip any JSON XSSI avoidance prefix from the string (as documented * in the source maps specification), and then parse the string as * JSON. */ function parseSourceMapInput(str) { return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, '')); } exports.parseSourceMapInput = parseSourceMapInput; /** * Compute the URL of a source given the the source root, the source's * URL, and the source map's URL. */ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { sourceURL = sourceURL || ''; if (sourceRoot) { // This follows what Chrome does. if (sourceRoot[sourceRoot.length - 1] !== '/' && sourceURL[0] !== '/') { sourceRoot += '/'; } // The spec says: // Line 4: An optional source root, useful for relocating source // files on a server or removing repeated values in the // “sources” entry. This value is prepended to the individual // entries in the “source” field. sourceURL = sourceRoot + sourceURL; } // Historically, SourceMapConsumer did not take the sourceMapURL as // a parameter. This mode is still somewhat supported, which is why // this code block is conditional. However, it's preferable to pass // the source map URL to SourceMapConsumer, so that this function // can implement the source URL resolution algorithm as outlined in // the spec. This block is basically the equivalent of: // new URL(sourceURL, sourceMapURL).toString() // ... except it avoids using URL, which wasn't available in the // older releases of node still supported by this library. // // The spec says: // If the sources are not absolute URLs after prepending of the // “sourceRoot”, the sources are resolved relative to the // SourceMap (like resolving script src in a html document). if (sourceMapURL) { var parsed = urlParse(sourceMapURL); if (!parsed) { throw new Error("sourceMapURL could not be parsed"); } if (parsed.path) { // Strip the last path component, but keep the "/". var index = parsed.path.lastIndexOf('/'); if (index >= 0) { parsed.path = parsed.path.substring(0, index + 1); } } sourceURL = join(urlGenerate(parsed), sourceURL); } return normalize(sourceURL); } exports.computeSourceURL = computeSourceURL; }); /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; /** * A data structure which is a combination of an array and a set. Adding a new * member is O(1), testing for membership is O(1), and finding the index of an * element is O(1). Removing elements from the set is not supported. Only * strings are supported for membership. */ function ArraySet$2() { this._array = []; this._set = hasNativeMap ? new Map() : Object.create(null); } /** * Static method for creating ArraySet instances from an existing array. */ ArraySet$2.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { var set = new ArraySet$2(); for (var i = 0, len = aArray.length; i < len; i++) { set.add(aArray[i], aAllowDuplicates); } return set; }; /** * Return how many unique items are in this ArraySet. If duplicates have been * added, than those do not count towards the size. * * @returns Number */ ArraySet$2.prototype.size = function ArraySet_size() { return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length; }; /** * Add the given string to this set. * * @param String aStr */ ArraySet$2.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { var sStr = hasNativeMap ? aStr : util.toSetString(aStr); var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); var idx = this._array.length; if (!isDuplicate || aAllowDuplicates) { this._array.push(aStr); } if (!isDuplicate) { if (hasNativeMap) { this._set.set(aStr, idx); } else { this._set[sStr] = idx; } } }; /** * Is the given string a member of this set? * * @param String aStr */ ArraySet$2.prototype.has = function ArraySet_has(aStr) { if (hasNativeMap) { return this._set.has(aStr); } else { var sStr = util.toSetString(aStr); return has.call(this._set, sStr); } }; /** * What is the index of the given string in the array? * * @param String aStr */ ArraySet$2.prototype.indexOf = function ArraySet_indexOf(aStr) { if (hasNativeMap) { var idx = this._set.get(aStr); if (idx >= 0) { return idx; } } else { var sStr = util.toSetString(aStr); if (has.call(this._set, sStr)) { return this._set[sStr]; } } throw new Error('"' + aStr + '" is not in the set.'); }; /** * What is the element at the given index? * * @param Number aIdx */ ArraySet$2.prototype.at = function ArraySet_at(aIdx) { if (aIdx >= 0 && aIdx < this._array.length) { return this._array[aIdx]; } throw new Error('No element indexed by ' + aIdx); }; /** * Returns the array representation of this set (which has the proper indices * indicated by indexOf). Note that this is a copy of the internal array used * for storing the members so that no one can mess with internal state. */ ArraySet$2.prototype.toArray = function ArraySet_toArray() { return this._array.slice(); }; var ArraySet_1 = ArraySet$2; var arraySet = { ArraySet: ArraySet_1 }; /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2014 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ /** * Determine whether mappingB is after mappingA with respect to generated * position. */ function generatedPositionAfter(mappingA, mappingB) { // Optimized for most common case var lineA = mappingA.generatedLine; var lineB = mappingB.generatedLine; var columnA = mappingA.generatedColumn; var columnB = mappingB.generatedColumn; return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0; } /** * A data structure to provide a sorted view of accumulated mappings in a * performance conscious manner. It trades a neglibable overhead in general * case for a large speedup in case of mappings being added in order. */ function MappingList$1() { this._array = []; this._sorted = true; // Serves as infimum this._last = {generatedLine: -1, generatedColumn: 0}; } /** * Iterate through internal items. This method takes the same arguments that * `Array.prototype.forEach` takes. * * NOTE: The order of the mappings is NOT guaranteed. */ MappingList$1.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { this._array.forEach(aCallback, aThisArg); }; /** * Add the given source mapping. * * @param Object aMapping */ MappingList$1.prototype.add = function MappingList_add(aMapping) { if (generatedPositionAfter(this._last, aMapping)) { this._last = aMapping; this._array.push(aMapping); } else { this._sorted = false; this._array.push(aMapping); } }; /** * Returns the flat, sorted array of mappings. The mappings are sorted by * generated position. * * WARNING: This method returns internal data without copying, for * performance. The return value must NOT be mutated, and should be treated as * an immutable borrow. If you want to take ownership, you must make your own * copy. */ MappingList$1.prototype.toArray = function MappingList_toArray() { if (!this._sorted) { this._array.sort(util.compareByGeneratedPositionsInflated); this._sorted = true; } return this._array; }; var MappingList_1 = MappingList$1; var mappingList = { MappingList: MappingList_1 }; /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var ArraySet$1 = arraySet.ArraySet; var MappingList = mappingList.MappingList; /** * An instance of the SourceMapGenerator represents a source map which is * being built incrementally. You may pass an object with the following * properties: * * - file: The filename of the generated source. * - sourceRoot: A root for all relative URLs in this source map. */ function SourceMapGenerator$2(aArgs) { if (!aArgs) { aArgs = {}; } this._file = util.getArg(aArgs, 'file', null); this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null); this._skipValidation = util.getArg(aArgs, 'skipValidation', false); this._sources = new ArraySet$1(); this._names = new ArraySet$1(); this._mappings = new MappingList(); this._sourcesContents = null; } SourceMapGenerator$2.prototype._version = 3; /** * Creates a new SourceMapGenerator based on a SourceMapConsumer * * @param aSourceMapConsumer The SourceMap. */ SourceMapGenerator$2.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { var sourceRoot = aSourceMapConsumer.sourceRoot; var generator = new SourceMapGenerator$2({ file: aSourceMapConsumer.file, sourceRoot: sourceRoot }); aSourceMapConsumer.eachMapping(function (mapping) { var newMapping = { generated: { line: mapping.generatedLine, column: mapping.generatedColumn } }; if (mapping.source != null) { newMapping.source = mapping.source; if (sourceRoot != null) { newMapping.source = util.relative(sourceRoot, newMapping.source); } newMapping.original = { line: mapping.originalLine, column: mapping.originalColumn }; if (mapping.name != null) { newMapping.name = mapping.name; } } generator.addMapping(newMapping); }); aSourceMapConsumer.sources.forEach(function (sourceFile) { var sourceRelative = sourceFile; if (sourceRoot !== null) { sourceRelative = util.relative(sourceRoot, sourceFile); } if (!generator._sources.has(sourceRelative)) { generator._sources.add(sourceRelative); } var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { generator.setSourceContent(sourceFile, content); } }); return generator; }; /** * Add a single mapping from original source line and column to the generated * source's line and column for this source map being created. The mapping * object should have the following properties: * * - generated: An object with the generated line and column positions. * - original: An object with the original line and column positions. * - source: The original source file (relative to the sourceRoot). * - name: An optional original token name for this mapping. */ SourceMapGenerator$2.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { var generated = util.getArg(aArgs, 'generated'); var original = util.getArg(aArgs, 'original', null); var source = util.getArg(aArgs, 'source', null); var name = util.getArg(aArgs, 'name', null); if (!this._skipValidation) { this._validateMapping(generated, original, source, name); } if (source != null) { source = String(source); if (!this._sources.has(source)) { this._sources.add(source); } } if (name != null) { name = String(name); if (!this._names.has(name)) { this._names.add(name); } } this._mappings.add({ generatedLine: generated.line, generatedColumn: generated.column, originalLine: original != null && original.line, originalColumn: original != null && original.column, source: source, name: name }); }; /** * Set the source content for a source file. */ SourceMapGenerator$2.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { var source = aSourceFile; if (this._sourceRoot != null) { source = util.relative(this._sourceRoot, source); } if (aSourceContent != null) { // Add the source content to the _sourcesContents map. // Create a new _sourcesContents map if the property is null. if (!this._sourcesContents) { this._sourcesContents = Object.create(null); } this._sourcesContents[util.toSetString(source)] = aSourceContent; } else if (this._sourcesContents) { // Remove the source file from the _sourcesContents map. // If the _sourcesContents map is empty, set the property to null. delete this._sourcesContents[util.toSetString(source)]; if (Object.keys(this._sourcesContents).length === 0) { this._sourcesContents = null; } } }; /** * Applies the mappings of a sub-source-map for a specific source file to the * source map being generated. Each mapping to the supplied source file is * rewritten using the supplied source map. Note: The resolution for the * resulting mappings is the minimium of this map and the supplied map. * * @param aSourceMapConsumer The source map to be applied. * @param aSourceFile Optional. The filename of the source file. * If omitted, SourceMapConsumer's file property will be used. * @param aSourceMapPath Optional. The dirname of the path to the source map * to be applied. If relative, it is relative to the SourceMapConsumer. * This parameter is needed when the two source maps aren't in the same * directory, and the source map to be applied contains relative source * paths. If so, those relative source paths need to be rewritten * relative to the SourceMapGenerator. */ SourceMapGenerator$2.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { var sourceFile = aSourceFile; // If aSourceFile is omitted, we will use the file property of the SourceMap if (aSourceFile == null) { if (aSourceMapConsumer.file == null) { throw new Error( 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' + 'or the source map\'s "file" property. Both were omitted.' ); } sourceFile = aSourceMapConsumer.file; } var sourceRoot = this._sourceRoot; // Make "sourceFile" relative if an absolute Url is passed. if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile); } // Applying the SourceMap can add and remove items from the sources and // the names array. var newSources = new ArraySet$1(); var newNames = new ArraySet$1(); // Find mappings for the "sourceFile" this._mappings.unsortedForEach(function (mapping) { if (mapping.source === sourceFile && mapping.originalLine != null) { // Check if it can be mapped by the source map, then update the mapping. var original = aSourceMapConsumer.originalPositionFor({ line: mapping.originalLine, column: mapping.originalColumn }); if (original.source != null) { // Copy mapping mapping.source = original.source; if (aSourceMapPath != null) { mapping.source = util.join(aSourceMapPath, mapping.source); } if (sourceRoot != null) { mapping.source = util.relative(sourceRoot, mapping.source); } mapping.originalLine = original.line; mapping.originalColumn = original.column; if (original.name != null) { mapping.name = original.name; } } } var source = mapping.source; if (source != null && !newSources.has(source)) { newSources.add(source); } var name = mapping.name; if (name != null && !newNames.has(name)) { newNames.add(name); } }, this); this._sources = newSources; this._names = newNames; // Copy sourcesContents of applied map. aSourceMapConsumer.sources.forEach(function (sourceFile) { var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { if (aSourceMapPath != null) { sourceFile = util.join(aSourceMapPath, sourceFile); } if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile); } this.setSourceContent(sourceFile, content); } }, this); }; /** * A mapping can have one of the three levels of data: * * 1. Just the generated position. * 2. The Generated position, original position, and original source. * 3. Generated and original position, original source, as well as a name * token. * * To maintain consistency, we validate that any new mapping being added falls * in to one of these categories. */ SourceMapGenerator$2.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { // When aOriginal is truthy but has empty values for .line and .column, // it is most likely a programmer error. In this case we throw a very // specific error message to try to guide them the right way. // For example: https://github.com/Polymer/polymer-bundler/pull/519 if (aOriginal && typeof aOriginal.line !== 'number' && typeof aOriginal.column !== 'number') { throw new Error( 'original.line and original.column are not numbers -- you probably meant to omit ' + 'the original mapping entirely and only map the generated position. If so, pass ' + 'null for the original mapping instead of an object with empty or null values.' ); } if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { // Case 1. return; } else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated && aOriginal && 'line' in aOriginal && 'column' in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { // Cases 2 and 3. return; } else { throw new Error('Invalid mapping: ' + JSON.stringify({ generated: aGenerated, source: aSource, original: aOriginal, name: aName })); } }; /** * Serialize the accumulated mappings in to the stream of base 64 VLQs * specified by the source map format. */ SourceMapGenerator$2.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { var previousGeneratedColumn = 0; var previousGeneratedLine = 1; var previousOriginalColumn = 0; var previousOriginalLine = 0; var previousName = 0; var previousSource = 0; var result = ''; var next; var mapping; var nameIdx; var sourceIdx; var mappings = this._mappings.toArray(); for (var i = 0, len = mappings.length; i < len; i++) { mapping = mappings[i]; next = ''; if (mapping.generatedLine !== previousGeneratedLine) { previousGeneratedColumn = 0; while (mapping.generatedLine !== previousGeneratedLine) { next += ';'; previousGeneratedLine++; } } else { if (i > 0) { if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { continue; } next += ','; } } next += base64Vlq.encode(mapping.generatedColumn - previousGeneratedColumn); previousGeneratedColumn = mapping.generatedColumn; if (mapping.source != null) { sourceIdx = this._sources.indexOf(mapping.source); next += base64Vlq.encode(sourceIdx - previousSource); previousSource = sourceIdx; // lines are stored 0-based in SourceMap spec version 3 next += base64Vlq.encode(mapping.originalLine - 1 - previousOriginalLine); previousOriginalLine = mapping.originalLine - 1; next += base64Vlq.encode(mapping.originalColumn - previousOriginalColumn); previousOriginalColumn = mapping.originalColumn; if (mapping.name != null) { nameIdx = this._names.indexOf(mapping.name); next += base64Vlq.encode(nameIdx - previousName); previousName = nameIdx; } } result += next; } return result; }; SourceMapGenerator$2.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { return aSources.map(function (source) { if (!this._sourcesContents) { return null; } if (aSourceRoot != null) { source = util.relative(aSourceRoot, source); } var key = util.toSetString(source); return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null; }, this); }; /** * Externalize the source map. */ SourceMapGenerator$2.prototype.toJSON = function SourceMapGenerator_toJSON() { var map = { version: this._version, sources: this._sources.toArray(), names: this._names.toArray(), mappings: this._serializeMappings() }; if (this._file != null) { map.file = this._file; } if (this._sourceRoot != null) { map.sourceRoot = this._sourceRoot; } if (this._sourcesContents) { map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot); } return map; }; /** * Render the source map being generated to a string. */ SourceMapGenerator$2.prototype.toString = function SourceMapGenerator_toString() { return JSON.stringify(this.toJSON()); }; var SourceMapGenerator_1 = SourceMapGenerator$2; var sourceMapGenerator = { SourceMapGenerator: SourceMapGenerator_1 }; /* -*- Mode: js; js-indent-level: 2; -*- */ var binarySearch = createCommonjsModule(function (module, exports) { /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ exports.GREATEST_LOWER_BOUND = 1; exports.LEAST_UPPER_BOUND = 2; /** * Recursive implementation of binary search. * * @param aLow Indices here and lower do not contain the needle. * @param aHigh Indices here and higher do not contain the needle. * @param aNeedle The element being searched for. * @param aHaystack The non-empty array being searched. * @param aCompare Function which takes two elements and returns -1, 0, or 1. * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. */ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) { // This function terminates when one of the following is true: // // 1. We find the exact element we are looking for. // // 2. We did not find the exact element, but we can return the index of // the next-closest element. // // 3. We did not find the exact element, and there is no next-closest // element than the one we are searching for, so we return -1. var mid = Math.floor((aHigh - aLow) / 2) + aLow; var cmp = aCompare(aNeedle, aHaystack[mid], true); if (cmp === 0) { // Found the element we are looking for. return mid; } else if (cmp > 0) { // Our needle is greater than aHaystack[mid]. if (aHigh - mid > 1) { // The element is in the upper half. return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias); } // The exact needle element was not found in this haystack. Determine if // we are in termination case (3) or (2) and return the appropriate thing. if (aBias == exports.LEAST_UPPER_BOUND) { return aHigh < aHaystack.length ? aHigh : -1; } else { return mid; } } else { // Our needle is less than aHaystack[mid]. if (mid - aLow > 1) { // The element is in the lower half. return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias); } // we are in termination case (3) or (2) and return the appropriate thing. if (aBias == exports.LEAST_UPPER_BOUND) { return mid; } else { return aLow < 0 ? -1 : aLow; } } } /** * This is an implementation of binary search which will always try and return * the index of the closest element if there is no exact hit. This is because * mappings between original and generated line/col pairs are single points, * and there is an implicit region between each of them, so a miss just means * that you aren't on the very start of a region. * * @param aNeedle The element you are looking for. * @param aHaystack The array that is being searched. * @param aCompare A function which takes the needle and an element in the * array and returns -1, 0, or 1 depending on whether the needle is less * than, equal to, or greater than the element, respectively. * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'. */ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { if (aHaystack.length === 0) { return -1; } var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack, aCompare, aBias || exports.GREATEST_LOWER_BOUND); if (index < 0) { return -1; } // We have found either the exact element, or the next-closest element than // the one we are searching for. However, there may be more than one such // element. Make sure we always return the smallest of these. while (index - 1 >= 0) { if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) { break; } --index; } return index; }; }); /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ // It turns out that some (most?) JavaScript engines don't self-host // `Array.prototype.sort`. This makes sense because C++ will likely remain // faster than JS when doing raw CPU-intensive sorting. However, when using a // custom comparator function, calling back and forth between the VM's C++ and // JIT'd JS is rather slow *and* loses JIT type information, resulting in // worse generated code for the comparator function than would be optimal. In // fact, when sorting with a comparator, these costs outweigh the benefits of // sorting in C++. By using our own JS-implemented Quick Sort (below), we get // a ~3500ms mean speed-up in `bench/bench.html`. /** * Swap the elements indexed by `x` and `y` in the array `ary`. * * @param {Array} ary * The array. * @param {Number} x * The index of the first item. * @param {Number} y * The index of the second item. */ function swap(ary, x, y) { var temp = ary[x]; ary[x] = ary[y]; ary[y] = temp; } /** * Returns a random integer within the range `low .. high` inclusive. * * @param {Number} low * The lower bound on the range. * @param {Number} high * The upper bound on the range. */ function randomIntInRange(low, high) { return Math.round(low + (Math.random() * (high - low))); } /** * The Quick Sort algorithm. * * @param {Array} ary * An array to sort. * @param {function} comparator * Function to use to compare two items. * @param {Number} p * Start index of the array * @param {Number} r * End index of the array */ function doQuickSort(ary, comparator, p, r) { // If our lower bound is less than our upper bound, we (1) partition the // array into two pieces and (2) recurse on each half. If it is not, this is // the empty array and our base case. if (p < r) { // (1) Partitioning. // // The partitioning chooses a pivot between `p` and `r` and moves all // elements that are less than or equal to the pivot to the before it, and // all the elements that are greater than it after it. The effect is that // once partition is done, the pivot is in the exact place it will be when // the array is put in sorted order, and it will not need to be moved // again. This runs in O(n) time. // Always choose a random pivot so that an input array which is reverse // sorted does not cause O(n^2) running time. var pivotIndex = randomIntInRange(p, r); var i = p - 1; swap(ary, pivotIndex, r); var pivot = ary[r]; // Immediately after `j` is incremented in this loop, the following hold // true: // // * Every element in `ary[p .. i]` is less than or equal to the pivot. // // * Every element in `ary[i+1 .. j-1]` is greater than the pivot. for (var j = p; j < r; j++) { if (comparator(ary[j], pivot) <= 0) { i += 1; swap(ary, i, j); } } swap(ary, i + 1, j); var q = i + 1; // (2) Recurse on each half. doQuickSort(ary, comparator, p, q - 1); doQuickSort(ary, comparator, q + 1, r); } } /** * Sort the given array in-place with the given comparator function. * * @param {Array} ary * An array to sort. * @param {function} comparator * Function to use to compare two items. */ var quickSort_1 = function (ary, comparator) { doQuickSort(ary, comparator, 0, ary.length - 1); }; var quickSort$1 = { quickSort: quickSort_1 }; /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var ArraySet = arraySet.ArraySet; var quickSort = quickSort$1.quickSort; function SourceMapConsumer$1(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === 'string') { sourceMap = util.parseSourceMapInput(aSourceMap); } return sourceMap.sections != null ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL) : new BasicSourceMapConsumer(sourceMap, aSourceMapURL); } SourceMapConsumer$1.fromSourceMap = function(aSourceMap, aSourceMapURL) { return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL); }; /** * The version of the source mapping spec that we are consuming. */ SourceMapConsumer$1.prototype._version = 3; // `__generatedMappings` and `__originalMappings` are arrays that hold the // parsed mapping coordinates from the source map's "mappings" attribute. They // are lazily instantiated, accessed via the `_generatedMappings` and // `_originalMappings` getters respectively, and we only parse the mappings // and create these arrays once queried for a source location. We jump through // these hoops because there can be many thousands of mappings, and parsing // them is expensive, so we only want to do it if we must. // // Each object in the arrays is of the form: // // { // generatedLine: The line number in the generated code, // generatedColumn: The column number in the generated code, // source: The path to the original source file that generated this // chunk of code, // originalLine: The line number in the original source that // corresponds to this chunk of generated code, // originalColumn: The column number in the original source that // corresponds to this chunk of generated code, // name: The name of the original symbol which generated this chunk of // code. // } // // All properties except for `generatedLine` and `generatedColumn` can be // `null`. // // `_generatedMappings` is ordered by the generated positions. // // `_originalMappings` is ordered by the original positions. SourceMapConsumer$1.prototype.__generatedMappings = null; Object.defineProperty(SourceMapConsumer$1.prototype, '_generatedMappings', { configurable: true, enumerable: true, get: function () { if (!this.__generatedMappings) { this._parseMappings(this._mappings, this.sourceRoot); } return this.__generatedMappings; } }); SourceMapConsumer$1.prototype.__originalMappings = null; Object.defineProperty(SourceMapConsumer$1.prototype, '_originalMappings', { configurable: true, enumerable: true, get: function () { if (!this.__originalMappings) { this._parseMappings(this._mappings, this.sourceRoot); } return this.__originalMappings; } }); SourceMapConsumer$1.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(aStr, index) { var c = aStr.charAt(index); return c === ";" || c === ","; }; /** * Parse the mappings in a string in to a data structure which we can easily * query (the ordered arrays in the `this.__generatedMappings` and * `this.__originalMappings` properties). */ SourceMapConsumer$1.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { throw new Error("Subclasses must implement _parseMappings"); }; SourceMapConsumer$1.GENERATED_ORDER = 1; SourceMapConsumer$1.ORIGINAL_ORDER = 2; SourceMapConsumer$1.GREATEST_LOWER_BOUND = 1; SourceMapConsumer$1.LEAST_UPPER_BOUND = 2; /** * Iterate over each mapping between an original source/line/column and a * generated line/column in this source map. * * @param Function aCallback * The function that is called with each mapping. * @param Object aContext * Optional. If specified, this object will be the value of `this` every * time that `aCallback` is called. * @param aOrder * Either `SourceMapConsumer.GENERATED_ORDER` or * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to * iterate over the mappings sorted by the generated file's line/column * order or the original's source/line/column order, respectively. Defaults to * `SourceMapConsumer.GENERATED_ORDER`. */ SourceMapConsumer$1.prototype.eachMapping = function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) { var context = aContext || null; var order = aOrder || SourceMapConsumer$1.GENERATED_ORDER; var mappings; switch (order) { case SourceMapConsumer$1.GENERATED_ORDER: mappings = this._generatedMappings; break; case SourceMapConsumer$1.ORIGINAL_ORDER: mappings = this._originalMappings; break; default: throw new Error("Unknown order of iteration."); } var sourceRoot = this.sourceRoot; mappings.map(function (mapping) { var source = mapping.source === null ? null : this._sources.at(mapping.source); source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL); return { source: source, generatedLine: mapping.generatedLine, generatedColumn: mapping.generatedColumn, originalLine: mapping.originalLine, originalColumn: mapping.originalColumn, name: mapping.name === null ? null : this._names.at(mapping.name) }; }, this).forEach(aCallback, context); }; /** * Returns all generated line and column information for the original source, * line, and column provided. If no column is provided, returns all mappings * corresponding to a either the line we are searching for or the next * closest line that has any mappings. Otherwise, returns all mappings * corresponding to the given line and either the column we are searching for * or the next closest column that has any offsets. * * The only argument is an object with the following properties: * * - source: The filename of the original source. * - line: The line number in the original source. The line number is 1-based. * - column: Optional. the column number in the original source. * The column number is 0-based. * * and an array of objects is returned, each with the following properties: * * - line: The line number in the generated source, or null. The * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ SourceMapConsumer$1.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(aArgs) { var line = util.getArg(aArgs, 'line'); // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping // returns the index of the closest mapping less than the needle. By // setting needle.originalColumn to 0, we thus find the last mapping for // the given line, provided such a mapping exists. var needle = { source: util.getArg(aArgs, 'source'), originalLine: line, originalColumn: util.getArg(aArgs, 'column', 0) }; needle.source = this._findSourceIndex(needle.source); if (needle.source < 0) { return []; } var mappings = []; var index = this._findMapping(needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, binarySearch.LEAST_UPPER_BOUND); if (index >= 0) { var mapping = this._originalMappings[index]; if (aArgs.column === undefined) { var originalLine = mapping.originalLine; // Iterate until either we run out of mappings, or we run into // a mapping for a different line than the one we found. Since // mappings are sorted, this is guaranteed to find all mappings for // the line we found. while (mapping && mapping.originalLine === originalLine) { mappings.push({ line: util.getArg(mapping, 'generatedLine', null), column: util.getArg(mapping, 'generatedColumn', null), lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) }); mapping = this._originalMappings[++index]; } } else { var originalColumn = mapping.originalColumn; // Iterate until either we run out of mappings, or we run into // a mapping for a different line than the one we were searching for. // Since mappings are sorted, this is guaranteed to find all mappings for // the line we are searching for. while (mapping && mapping.originalLine === line && mapping.originalColumn == originalColumn) { mappings.push({ line: util.getArg(mapping, 'generatedLine', null), column: util.getArg(mapping, 'generatedColumn', null), lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) }); mapping = this._originalMappings[++index]; } } } return mappings; }; var SourceMapConsumer_1 = SourceMapConsumer$1; /** * A BasicSourceMapConsumer instance represents a parsed source map which we can * query for information about the original file positions by giving it a file * position in the generated source. * * The first parameter is the raw source map (either as a JSON string, or * already parsed to an object). According to the spec, source maps have the * following attributes: * * - version: Which version of the source map spec this map is following. * - sources: An array of URLs to the original source files. * - names: An array of identifiers which can be referrenced by individual mappings. * - sourceRoot: Optional. The URL root from which all sources are relative. * - sourcesContent: Optional. An array of contents of the original source files. * - mappings: A string of base64 VLQs which contain the actual mappings. * - file: Optional. The generated file this source map is associated with. * * Here is an example source map, taken from the source map spec[0]: * * { * version : 3, * file: "out.js", * sourceRoot : "", * sources: ["foo.js", "bar.js"], * names: ["src", "maps", "are", "fun"], * mappings: "AA,AB;;ABCDE;" * } * * The second parameter, if given, is a string whose value is the URL * at which the source map was found. This URL is used to compute the * sources array. * * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1# */ function BasicSourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === 'string') { sourceMap = util.parseSourceMapInput(aSourceMap); } var version = util.getArg(sourceMap, 'version'); var sources = util.getArg(sourceMap, 'sources'); // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which // requires the array) to play nice here. var names = util.getArg(sourceMap, 'names', []); var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null); var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null); var mappings = util.getArg(sourceMap, 'mappings'); var file = util.getArg(sourceMap, 'file', null); // Once again, Sass deviates from the spec and supplies the version as a // string rather than a number, so we use loose equality checking here. if (version != this._version) { throw new Error('Unsupported version: ' + version); } if (sourceRoot) { sourceRoot = util.normalize(sourceRoot); } sources = sources .map(String) // Some source maps produce relative source paths like "./foo.js" instead of // "foo.js". Normalize these first so that future comparisons will succeed. // See bugzil.la/1090768. .map(util.normalize) // Always ensure that absolute sources are internally stored relative to // the source root, if the source root is absolute. Not doing this would // be particularly problematic when the source root is a prefix of the // source (valid, but why??). See github issue #199 and bugzil.la/1188982. .map(function (source) { return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source) ? util.relative(sourceRoot, source) : source; }); // Pass `true` below to allow duplicate names and sources. While source maps // are intended to be compressed and deduplicated, the TypeScript compiler // sometimes generates source maps with duplicates in them. See Github issue // #72 and bugzil.la/889492. this._names = ArraySet.fromArray(names.map(String), true); this._sources = ArraySet.fromArray(sources, true); this._absoluteSources = this._sources.toArray().map(function (s) { return util.computeSourceURL(sourceRoot, s, aSourceMapURL); }); this.sourceRoot = sourceRoot; this.sourcesContent = sourcesContent; this._mappings = mappings; this._sourceMapURL = aSourceMapURL; this.file = file; } BasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype); BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer$1; /** * Utility function to find the index of a source. Returns -1 if not * found. */ BasicSourceMapConsumer.prototype._findSourceIndex = function(aSource) { var relativeSource = aSource; if (this.sourceRoot != null) { relativeSource = util.relative(this.sourceRoot, relativeSource); } if (this._sources.has(relativeSource)) { return this._sources.indexOf(relativeSource); } // Maybe aSource is an absolute URL as returned by |sources|. In // this case we can't simply undo the transform. var i; for (i = 0; i < this._absoluteSources.length; ++i) { if (this._absoluteSources[i] == aSource) { return i; } } return -1; }; /** * Create a BasicSourceMapConsumer from a SourceMapGenerator. * * @param SourceMapGenerator aSourceMap * The source map that will be consumed. * @param String aSourceMapURL * The URL at which the source map can be found (optional) * @returns BasicSourceMapConsumer */ BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(aSourceMap, aSourceMapURL) { var smc = Object.create(BasicSourceMapConsumer.prototype); var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true); var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true); smc.sourceRoot = aSourceMap._sourceRoot; smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(), smc.sourceRoot); smc.file = aSourceMap._file; smc._sourceMapURL = aSourceMapURL; smc._absoluteSources = smc._sources.toArray().map(function (s) { return util.computeSourceURL(smc.sourceRoot, s, aSourceMapURL); }); // Because we are modifying the entries (by converting string sources and // names to indices into the sources and names ArraySets), we have to make // a copy of the entry or else bad things happen. Shared mutable state // strikes again! See github issue #191. var generatedMappings = aSourceMap._mappings.toArray().slice(); var destGeneratedMappings = smc.__generatedMappings = []; var destOriginalMappings = smc.__originalMappings = []; for (var i = 0, length = generatedMappings.length; i < length; i++) { var srcMapping = generatedMappings[i]; var destMapping = new Mapping; destMapping.generatedLine = srcMapping.generatedLine; destMapping.generatedColumn = srcMapping.generatedColumn; if (srcMapping.source) { destMapping.source = sources.indexOf(srcMapping.source); destMapping.originalLine = srcMapping.originalLine; destMapping.originalColumn = srcMapping.originalColumn; if (srcMapping.name) { destMapping.name = names.indexOf(srcMapping.name); } destOriginalMappings.push(destMapping); } destGeneratedMappings.push(destMapping); } quickSort(smc.__originalMappings, util.compareByOriginalPositions); return smc; }; /** * The version of the source mapping spec that we are consuming. */ BasicSourceMapConsumer.prototype._version = 3; /** * The list of original sources. */ Object.defineProperty(BasicSourceMapConsumer.prototype, 'sources', { get: function () { return this._absoluteSources.slice(); } }); /** * Provide the JIT with a nice shape / hidden class. */ function Mapping() { this.generatedLine = 0; this.generatedColumn = 0; this.source = null; this.originalLine = null; this.originalColumn = null; this.name = null; } /** * Parse the mappings in a string in to a data structure which we can easily * query (the ordered arrays in the `this.__generatedMappings` and * `this.__originalMappings` properties). */ BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(aStr, aSourceRoot) { var generatedLine = 1; var previousGeneratedColumn = 0; var previousOriginalLine = 0; var previousOriginalColumn = 0; var previousSource = 0; var previousName = 0; var length = aStr.length; var index = 0; var cachedSegments = {}; var temp = {}; var originalMappings = []; var generatedMappings = []; var mapping, str, segment, end, value; while (index < length) { if (aStr.charAt(index) === ';') { generatedLine++; index++; previousGeneratedColumn = 0; } else if (aStr.charAt(index) === ',') { index++; } else { mapping = new Mapping(); mapping.generatedLine = generatedLine; // Because each offset is encoded relative to the previous one, // many segments often have the same encoding. We can exploit this // fact by caching the parsed variable length fields of each segment, // allowing us to avoid a second parse if we encounter the same // segment again. for (end = index; end < length; end++) { if (this._charIsMappingSeparator(aStr, end)) { break; } } str = aStr.slice(index, end); segment = cachedSegments[str]; if (segment) { index += str.length; } else { segment = []; while (index < end) { base64Vlq.decode(aStr, index, temp); value = temp.value; index = temp.rest; segment.push(value); } if (segment.length === 2) { throw new Error('Found a source, but no line and column'); } if (segment.length === 3) { throw new Error('Found a source and line, but no column'); } cachedSegments[str] = segment; } // Generated column. mapping.generatedColumn = previousGeneratedColumn + segment[0]; previousGeneratedColumn = mapping.generatedColumn; if (segment.length > 1) { // Original source. mapping.source = previousSource + segment[1]; previousSource += segment[1]; // Original line. mapping.originalLine = previousOriginalLine + segment[2]; previousOriginalLine = mapping.originalLine; // Lines are stored 0-based mapping.originalLine += 1; // Original column. mapping.originalColumn = previousOriginalColumn + segment[3]; previousOriginalColumn = mapping.originalColumn; if (segment.length > 4) { // Original name. mapping.name = previousName + segment[4]; previousName += segment[4]; } } generatedMappings.push(mapping); if (typeof mapping.originalLine === 'number') { originalMappings.push(mapping); } } } quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated); this.__generatedMappings = generatedMappings; quickSort(originalMappings, util.compareByOriginalPositions); this.__originalMappings = originalMappings; }; /** * Find the mapping that best matches the hypothetical "needle" mapping that * we are searching for in the given "haystack" of mappings. */ BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName, aColumnName, aComparator, aBias) { // To return the position we are searching for, we must first find the // mapping for the given position and then return the opposite position it // points to. Because the mappings are sorted, we can use binary search to // find the best mapping. if (aNeedle[aLineName] <= 0) { throw new TypeError('Line must be greater than or equal to 1, got ' + aNeedle[aLineName]); } if (aNeedle[aColumnName] < 0) { throw new TypeError('Column must be greater than or equal to 0, got ' + aNeedle[aColumnName]); } return binarySearch.search(aNeedle, aMappings, aComparator, aBias); }; /** * Compute the last column for each generated mapping. The last column is * inclusive. */ BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() { for (var index = 0; index < this._generatedMappings.length; ++index) { var mapping = this._generatedMappings[index]; // Mappings do not contain a field for the last generated columnt. We // can come up with an optimistic estimate, however, by assuming that // mappings are contiguous (i.e. given two consecutive mappings, the // first mapping ends where the second one starts). if (index + 1 < this._generatedMappings.length) { var nextMapping = this._generatedMappings[index + 1]; if (mapping.generatedLine === nextMapping.generatedLine) { mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1; continue; } } // The last mapping for each line spans the entire line. mapping.lastGeneratedColumn = Infinity; } }; /** * Returns the original source, line, and column information for the generated * source's line and column positions provided. The only argument is an object * with the following properties: * * - line: The line number in the generated source. The line number * is 1-based. * - column: The column number in the generated source. The column * number is 0-based. * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. * * and an object is returned with the following properties: * * - source: The original source file, or null. * - line: The line number in the original source, or null. The * line number is 1-based. * - column: The column number in the original source, or null. The * column number is 0-based. * - name: The original identifier, or null. */ BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(aArgs) { var needle = { generatedLine: util.getArg(aArgs, 'line'), generatedColumn: util.getArg(aArgs, 'column') }; var index = this._findMapping( needle, this._generatedMappings, "generatedLine", "generatedColumn", util.compareByGeneratedPositionsDeflated, util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND) ); if (index >= 0) { var mapping = this._generatedMappings[index]; if (mapping.generatedLine === needle.generatedLine) { var source = util.getArg(mapping, 'source', null); if (source !== null) { source = this._sources.at(source); source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL); } var name = util.getArg(mapping, 'name', null); if (name !== null) { name = this._names.at(name); } return { source: source, line: util.getArg(mapping, 'originalLine', null), column: util.getArg(mapping, 'originalColumn', null), name: name }; } } return { source: null, line: null, column: null, name: null }; }; /** * Return true if we have the source content for every source in the source * map, false otherwise. */ BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() { if (!this.sourcesContent) { return false; } return this.sourcesContent.length >= this._sources.size() && !this.sourcesContent.some(function (sc) { return sc == null; }); }; /** * Returns the original source content. The only argument is the url of the * original source file. Returns null if no original source content is * available. */ BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { if (!this.sourcesContent) { return null; } var index = this._findSourceIndex(aSource); if (index >= 0) { return this.sourcesContent[index]; } var relativeSource = aSource; if (this.sourceRoot != null) { relativeSource = util.relative(this.sourceRoot, relativeSource); } var url; if (this.sourceRoot != null && (url = util.urlParse(this.sourceRoot))) { // XXX: file:// URIs and absolute paths lead to unexpected behavior for // many users. We can help them out when they expect file:// URIs to // behave like it would if they were running a local HTTP server. See // https://bugzilla.mozilla.org/show_bug.cgi?id=885597. var fileUriAbsPath = relativeSource.replace(/^file:\/\//, ""); if (url.scheme == "file" && this._sources.has(fileUriAbsPath)) { return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)] } if ((!url.path || url.path == "/") && this._sources.has("/" + relativeSource)) { return this.sourcesContent[this._sources.indexOf("/" + relativeSource)]; } } // This function is used recursively from // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we // don't want to throw if we can't find the source - we just want to // return null, so we provide a flag to exit gracefully. if (nullOnMissing) { return null; } else { throw new Error('"' + relativeSource + '" is not in the SourceMap.'); } }; /** * Returns the generated line and column information for the original source, * line, and column positions provided. The only argument is an object with * the following properties: * * - source: The filename of the original source. * - line: The line number in the original source. The line number * is 1-based. * - column: The column number in the original source. The column * number is 0-based. * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the * closest element that is smaller than or greater than the one we are * searching for, respectively, if the exact element cannot be found. * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'. * * and an object is returned with the following properties: * * - line: The line number in the generated source, or null. The * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(aArgs) { var source = util.getArg(aArgs, 'source'); source = this._findSourceIndex(source); if (source < 0) { return { line: null, column: null, lastColumn: null }; } var needle = { source: source, originalLine: util.getArg(aArgs, 'line'), originalColumn: util.getArg(aArgs, 'column') }; var index = this._findMapping( needle, this._originalMappings, "originalLine", "originalColumn", util.compareByOriginalPositions, util.getArg(aArgs, 'bias', SourceMapConsumer$1.GREATEST_LOWER_BOUND) ); if (index >= 0) { var mapping = this._originalMappings[index]; if (mapping.source === needle.source) { return { line: util.getArg(mapping, 'generatedLine', null), column: util.getArg(mapping, 'generatedColumn', null), lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null) }; } } return { line: null, column: null, lastColumn: null }; }; var BasicSourceMapConsumer_1 = BasicSourceMapConsumer; /** * An IndexedSourceMapConsumer instance represents a parsed source map which * we can query for information. It differs from BasicSourceMapConsumer in * that it takes "indexed" source maps (i.e. ones with a "sections" field) as * input. * * The first parameter is a raw source map (either as a JSON string, or already * parsed to an object). According to the spec for indexed source maps, they * have the following attributes: * * - version: Which version of the source map spec this map is following. * - file: Optional. The generated file this source map is associated with. * - sections: A list of section definitions. * * Each value under the "sections" field has two fields: * - offset: The offset into the original specified at which this section * begins to apply, defined as an object with a "line" and "column" * field. * - map: A source map definition. This source map could also be indexed, * but doesn't have to be. * * Instead of the "map" field, it's also possible to have a "url" field * specifying a URL to retrieve a source map from, but that's currently * unsupported. * * Here's an example source map, taken from the source map spec[0], but * modified to omit a section which uses the "url" field. * * { * version : 3, * file: "app.js", * sections: [{ * offset: {line:100, column:10}, * map: { * version : 3, * file: "section.js", * sources: ["foo.js", "bar.js"], * names: ["src", "maps", "are", "fun"], * mappings: "AAAA,E;;ABCDE;" * } * }], * } * * The second parameter, if given, is a string whose value is the URL * at which the source map was found. This URL is used to compute the * sources array. * * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt */ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) { var sourceMap = aSourceMap; if (typeof aSourceMap === 'string') { sourceMap = util.parseSourceMapInput(aSourceMap); } var version = util.getArg(sourceMap, 'version'); var sections = util.getArg(sourceMap, 'sections'); if (version != this._version) { throw new Error('Unsupported version: ' + version); } this._sources = new ArraySet(); this._names = new ArraySet(); var lastOffset = { line: -1, column: 0 }; this._sections = sections.map(function (s) { if (s.url) { // The url field will require support for asynchronicity. // See https://github.com/mozilla/source-map/issues/16 throw new Error('Support for url field in sections not implemented.'); } var offset = util.getArg(s, 'offset'); var offsetLine = util.getArg(offset, 'line'); var offsetColumn = util.getArg(offset, 'column'); if (offsetLine < lastOffset.line || (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) { throw new Error('Section offsets must be ordered and non-overlapping.'); } lastOffset = offset; return { generatedOffset: { // The offset fields are 0-based, but we use 1-based indices when // encoding/decoding from VLQ. generatedLine: offsetLine + 1, generatedColumn: offsetColumn + 1 }, consumer: new SourceMapConsumer$1(util.getArg(s, 'map'), aSourceMapURL) } }); } IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer$1.prototype); IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer$1; /** * The version of the source mapping spec that we are consuming. */ IndexedSourceMapConsumer.prototype._version = 3; /** * The list of original sources. */ Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', { get: function () { var sources = []; for (var i = 0; i < this._sections.length; i++) { for (var j = 0; j < this._sections[i].consumer.sources.length; j++) { sources.push(this._sections[i].consumer.sources[j]); } } return sources; } }); /** * Returns the original source, line, and column information for the generated * source's line and column positions provided. The only argument is an object * with the following properties: * * - line: The line number in the generated source. The line number * is 1-based. * - column: The column number in the generated source. The column * number is 0-based. * * and an object is returned with the following properties: * * - source: The original source file, or null. * - line: The line number in the original source, or null. The * line number is 1-based. * - column: The column number in the original source, or null. The * column number is 0-based. * - name: The original identifier, or null. */ IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(aArgs) { var needle = { generatedLine: util.getArg(aArgs, 'line'), generatedColumn: util.getArg(aArgs, 'column') }; // Find the section containing the generated position we're trying to map // to an original position. var sectionIndex = binarySearch.search(needle, this._sections, function(needle, section) { var cmp = needle.generatedLine - section.generatedOffset.generatedLine; if (cmp) { return cmp; } return (needle.generatedColumn - section.generatedOffset.generatedColumn); }); var section = this._sections[sectionIndex]; if (!section) { return { source: null, line: null, column: null, name: null }; } return section.consumer.originalPositionFor({ line: needle.generatedLine - (section.generatedOffset.generatedLine - 1), column: needle.generatedColumn - (section.generatedOffset.generatedLine === needle.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), bias: aArgs.bias }); }; /** * Return true if we have the source content for every source in the source * map, false otherwise. */ IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() { return this._sections.every(function (s) { return s.consumer.hasContentsOfAllSources(); }); }; /** * Returns the original source content. The only argument is the url of the * original source file. Returns null if no original source content is * available. */ IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) { for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; var content = section.consumer.sourceContentFor(aSource, true); if (content) { return content; } } if (nullOnMissing) { return null; } else { throw new Error('"' + aSource + '" is not in the SourceMap.'); } }; /** * Returns the generated line and column information for the original source, * line, and column positions provided. The only argument is an object with * the following properties: * * - source: The filename of the original source. * - line: The line number in the original source. The line number * is 1-based. * - column: The column number in the original source. The column * number is 0-based. * * and an object is returned with the following properties: * * - line: The line number in the generated source, or null. The * line number is 1-based. * - column: The column number in the generated source, or null. * The column number is 0-based. */ IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(aArgs) { for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; // Only consider this section if the requested source is in the list of // sources of the consumer. if (section.consumer._findSourceIndex(util.getArg(aArgs, 'source')) === -1) { continue; } var generatedPosition = section.consumer.generatedPositionFor(aArgs); if (generatedPosition) { var ret = { line: generatedPosition.line + (section.generatedOffset.generatedLine - 1), column: generatedPosition.column + (section.generatedOffset.generatedLine === generatedPosition.line ? section.generatedOffset.generatedColumn - 1 : 0) }; return ret; } } return { line: null, column: null }; }; /** * Parse the mappings in a string in to a data structure which we can easily * query (the ordered arrays in the `this.__generatedMappings` and * `this.__originalMappings` properties). */ IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) { this.__generatedMappings = []; this.__originalMappings = []; for (var i = 0; i < this._sections.length; i++) { var section = this._sections[i]; var sectionMappings = section.consumer._generatedMappings; for (var j = 0; j < sectionMappings.length; j++) { var mapping = sectionMappings[j]; var source = section.consumer._sources.at(mapping.source); source = util.computeSourceURL(section.consumer.sourceRoot, source, this._sourceMapURL); this._sources.add(source); source = this._sources.indexOf(source); var name = null; if (mapping.name) { name = section.consumer._names.at(mapping.name); this._names.add(name); name = this._names.indexOf(name); } // The mappings coming from the consumer for the section have // generated positions relative to the start of the section, so we // need to offset them to be relative to the start of the concatenated // generated file. var adjustedMapping = { source: source, generatedLine: mapping.generatedLine + (section.generatedOffset.generatedLine - 1), generatedColumn: mapping.generatedColumn + (section.generatedOffset.generatedLine === mapping.generatedLine ? section.generatedOffset.generatedColumn - 1 : 0), originalLine: mapping.originalLine, originalColumn: mapping.originalColumn, name: name }; this.__generatedMappings.push(adjustedMapping); if (typeof adjustedMapping.originalLine === 'number') { this.__originalMappings.push(adjustedMapping); } } } quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated); quickSort(this.__originalMappings, util.compareByOriginalPositions); }; var IndexedSourceMapConsumer_1 = IndexedSourceMapConsumer; var sourceMapConsumer = { SourceMapConsumer: SourceMapConsumer_1, BasicSourceMapConsumer: BasicSourceMapConsumer_1, IndexedSourceMapConsumer: IndexedSourceMapConsumer_1 }; /* -*- Mode: js; js-indent-level: 2; -*- */ /* * Copyright 2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE or: * http://opensource.org/licenses/BSD-3-Clause */ var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator; // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). var REGEX_NEWLINE = /(\r?\n)/; // Newline character code for charCodeAt() comparisons var NEWLINE_CODE = 10; // Private symbol for identifying `SourceNode`s when multiple versions of // the source-map library are loaded. This MUST NOT CHANGE across // versions! var isSourceNode = "$$$isSourceNode$$$"; /** * SourceNodes provide a way to abstract over interpolating/concatenating * snippets of generated JavaScript source code while maintaining the line and * column information associated with the original source code. * * @param aLine The original line number. * @param aColumn The original column number. * @param aSource The original source's filename. * @param aChunks Optional. An array of strings which are snippets of * generated JS, or other SourceNodes. * @param aName The original identifier. */ function SourceNode$1(aLine, aColumn, aSource, aChunks, aName) { this.children = []; this.sourceContents = {}; this.line = aLine == null ? null : aLine; this.column = aColumn == null ? null : aColumn; this.source = aSource == null ? null : aSource; this.name = aName == null ? null : aName; this[isSourceNode] = true; if (aChunks != null) this.add(aChunks); } /** * Creates a SourceNode from generated code and a SourceMapConsumer. * * @param aGeneratedCode The generated code * @param aSourceMapConsumer The SourceMap for the generated code * @param aRelativePath Optional. The path that relative sources in the * SourceMapConsumer should be relative to. */ SourceNode$1.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) { // The SourceNode we want to fill with the generated code // and the SourceMap var node = new SourceNode$1(); // All even indices of this array are one line of the generated code, // while all odd indices are the newlines between two adjacent lines // (since `REGEX_NEWLINE` captures its match). // Processed fragments are accessed by calling `shiftNextLine`. var remainingLines = aGeneratedCode.split(REGEX_NEWLINE); var remainingLinesIndex = 0; var shiftNextLine = function() { var lineContents = getNextLine(); // The last line of a file might not have a newline. var newLine = getNextLine() || ""; return lineContents + newLine; function getNextLine() { return remainingLinesIndex < remainingLines.length ? remainingLines[remainingLinesIndex++] : undefined; } }; // We need to remember the position of "remainingLines" var lastGeneratedLine = 1, lastGeneratedColumn = 0; // The generate SourceNodes we need a code range. // To extract it current and last mapping is used. // Here we store the last mapping. var lastMapping = null; aSourceMapConsumer.eachMapping(function (mapping) { if (lastMapping !== null) { // We add the code from "lastMapping" to "mapping": // First check if there is a new line in between. if (lastGeneratedLine < mapping.generatedLine) { // Associate first line with "lastMapping" addMappingWithCode(lastMapping, shiftNextLine()); lastGeneratedLine++; lastGeneratedColumn = 0; // The remaining code is added without mapping } else { // There is no new line in between. // Associate the code between "lastGeneratedColumn" and // "mapping.generatedColumn" with "lastMapping" var nextLine = remainingLines[remainingLinesIndex] || ''; var code = nextLine.substr(0, mapping.generatedColumn - lastGeneratedColumn); remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn - lastGeneratedColumn); lastGeneratedColumn = mapping.generatedColumn; addMappingWithCode(lastMapping, code); // No more remaining code, continue lastMapping = mapping; return; } } // We add the generated code until the first mapping // to the SourceNode without any mapping. // Each line is added as separate string. while (lastGeneratedLine < mapping.generatedLine) { node.add(shiftNextLine()); lastGeneratedLine++; } if (lastGeneratedColumn < mapping.generatedColumn) { var nextLine = remainingLines[remainingLinesIndex] || ''; node.add(nextLine.substr(0, mapping.generatedColumn)); remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn); lastGeneratedColumn = mapping.generatedColumn; } lastMapping = mapping; }, this); // We have processed all mappings. if (remainingLinesIndex < remainingLines.length) { if (lastMapping) { // Associate the remaining code in the current line with "lastMapping" addMappingWithCode(lastMapping, shiftNextLine()); } // and add the remaining lines without any mapping node.add(remainingLines.splice(remainingLinesIndex).join("")); } // Copy sourcesContent into SourceNode aSourceMapConsumer.sources.forEach(function (sourceFile) { var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { if (aRelativePath != null) { sourceFile = util.join(aRelativePath, sourceFile); } node.setSourceContent(sourceFile, content); } }); return node; function addMappingWithCode(mapping, code) { if (mapping === null || mapping.source === undefined) { node.add(code); } else { var source = aRelativePath ? util.join(aRelativePath, mapping.source) : mapping.source; node.add(new SourceNode$1(mapping.originalLine, mapping.originalColumn, source, code, mapping.name)); } } }; /** * Add a chunk of generated JS to this source node. * * @param aChunk A string snippet of generated JS code, another instance of * SourceNode, or an array where each member is one of those things. */ SourceNode$1.prototype.add = function SourceNode_add(aChunk) { if (Array.isArray(aChunk)) { aChunk.forEach(function (chunk) { this.add(chunk); }, this); } else if (aChunk[isSourceNode] || typeof aChunk === "string") { if (aChunk) { this.children.push(aChunk); } } else { throw new TypeError( "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk ); } return this; }; /** * Add a chunk of generated JS to the beginning of this source node. * * @param aChunk A string snippet of generated JS code, another instance of * SourceNode, or an array where each member is one of those things. */ SourceNode$1.prototype.prepend = function SourceNode_prepend(aChunk) { if (Array.isArray(aChunk)) { for (var i = aChunk.length-1; i >= 0; i--) { this.prepend(aChunk[i]); } } else if (aChunk[isSourceNode] || typeof aChunk === "string") { this.children.unshift(aChunk); } else { throw new TypeError( "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk ); } return this; }; /** * Walk over the tree of JS snippets in this node and its children. The * walking function is called once for each snippet of JS and is passed that * snippet and the its original associated source's line/column location. * * @param aFn The traversal function. */ SourceNode$1.prototype.walk = function SourceNode_walk(aFn) { var chunk; for (var i = 0, len = this.children.length; i < len; i++) { chunk = this.children[i]; if (chunk[isSourceNode]) { chunk.walk(aFn); } else { if (chunk !== '') { aFn(chunk, { source: this.source, line: this.line, column: this.column, name: this.name }); } } } }; /** * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between * each of `this.children`. * * @param aSep The separator. */ SourceNode$1.prototype.join = function SourceNode_join(aSep) { var newChildren; var i; var len = this.children.length; if (len > 0) { newChildren = []; for (i = 0; i < len-1; i++) { newChildren.push(this.children[i]); newChildren.push(aSep); } newChildren.push(this.children[i]); this.children = newChildren; } return this; }; /** * Call String.prototype.replace on the very right-most source snippet. Useful * for trimming whitespace from the end of a source node, etc. * * @param aPattern The pattern to replace. * @param aReplacement The thing to replace the pattern with. */ SourceNode$1.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) { var lastChild = this.children[this.children.length - 1]; if (lastChild[isSourceNode]) { lastChild.replaceRight(aPattern, aReplacement); } else if (typeof lastChild === 'string') { this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement); } else { this.children.push(''.replace(aPattern, aReplacement)); } return this; }; /** * Set the source content for a source file. This will be added to the SourceMapGenerator * in the sourcesContent field. * * @param aSourceFile The filename of the source file * @param aSourceContent The content of the source file */ SourceNode$1.prototype.setSourceContent = function SourceNode_setSourceContent(aSourceFile, aSourceContent) { this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent; }; /** * Walk over the tree of SourceNodes. The walking function is called for each * source file content and is passed the filename and source content. * * @param aFn The traversal function. */ SourceNode$1.prototype.walkSourceContents = function SourceNode_walkSourceContents(aFn) { for (var i = 0, len = this.children.length; i < len; i++) { if (this.children[i][isSourceNode]) { this.children[i].walkSourceContents(aFn); } } var sources = Object.keys(this.sourceContents); for (var i = 0, len = sources.length; i < len; i++) { aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]); } }; /** * Return the string representation of this source node. Walks over the tree * and concatenates all the various snippets together to one string. */ SourceNode$1.prototype.toString = function SourceNode_toString() { var str = ""; this.walk(function (chunk) { str += chunk; }); return str; }; /** * Returns the string representation of this source node along with a source * map. */ SourceNode$1.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) { var generated = { code: "", line: 1, column: 0 }; var map = new SourceMapGenerator$1(aArgs); var sourceMappingActive = false; var lastOriginalSource = null; var lastOriginalLine = null; var lastOriginalColumn = null; var lastOriginalName = null; this.walk(function (chunk, original) { generated.code += chunk; if (original.source !== null && original.line !== null && original.column !== null) { if(lastOriginalSource !== original.source || lastOriginalLine !== original.line || lastOriginalColumn !== original.column || lastOriginalName !== original.name) { map.addMapping({ source: original.source, original: { line: original.line, column: original.column }, generated: { line: generated.line, column: generated.column }, name: original.name }); } lastOriginalSource = original.source; lastOriginalLine = original.line; lastOriginalColumn = original.column; lastOriginalName = original.name; sourceMappingActive = true; } else if (sourceMappingActive) { map.addMapping({ generated: { line: generated.line, column: generated.column } }); lastOriginalSource = null; sourceMappingActive = false; } for (var idx = 0, length = chunk.length; idx < length; idx++) { if (chunk.charCodeAt(idx) === NEWLINE_CODE) { generated.line++; generated.column = 0; // Mappings end at eol if (idx + 1 === length) { lastOriginalSource = null; sourceMappingActive = false; } else if (sourceMappingActive) { map.addMapping({ source: original.source, original: { line: original.line, column: original.column }, generated: { line: generated.line, column: generated.column }, name: original.name }); } } else { generated.column++; } } }); this.walkSourceContents(function (sourceFile, sourceContent) { map.setSourceContent(sourceFile, sourceContent); }); return { code: generated.code, map: map }; }; var SourceNode_1 = SourceNode$1; var sourceNode = { SourceNode: SourceNode_1 }; /* * Copyright 2009-2011 Mozilla Foundation and contributors * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ var SourceMapGenerator = sourceMapGenerator.SourceMapGenerator; var SourceMapConsumer = sourceMapConsumer.SourceMapConsumer; var SourceNode = sourceNode.SourceNode; var sourceMap = { SourceMapGenerator: SourceMapGenerator, SourceMapConsumer: SourceMapConsumer, SourceNode: SourceNode }; const name="escodegen";const description="ECMAScript code generator";const homepage="http://github.com/estools/escodegen";const main="escodegen.js";const bin={esgenerate:"./bin/esgenerate.js",escodegen:"./bin/escodegen.js"};const files=["LICENSE.BSD","README.md","bin","escodegen.js","package.json"];const version="1.14.1";const engines={node:">=4.0"};const maintainers=[{name:"Yusuke Suzuki",email:"utatane.tea@gmail.com",web:"http://github.com/Constellation"}];const repository={type:"git",url:"http://github.com/estools/escodegen.git"};const dependencies={estraverse:"^4.2.0",esutils:"^2.0.2",esprima:"^4.0.1",optionator:"^0.8.1"};const optionalDependencies={"source-map":"~0.6.1"};const devDependencies={acorn:"^7.1.0",bluebird:"^3.4.7","bower-registry-client":"^1.0.0",chai:"^3.5.0","commonjs-everywhere":"^0.9.7",gulp:"^3.8.10","gulp-eslint":"^3.0.1","gulp-mocha":"^3.0.1",semver:"^5.1.0"};const license="BSD-2-Clause";const scripts={test:"gulp travis","unit-test":"gulp test",lint:"gulp lint",release:"node tools/release.js","build-min":"./node_modules/.bin/cjsify -ma path: tools/entry-point.js > escodegen.browser.min.js",build:"./node_modules/.bin/cjsify -a path: tools/entry-point.js > escodegen.browser.js"};var require$$3 = {name:name,description:description,homepage:homepage,main:main,bin:bin,files:files,version:version,engines:engines,maintainers:maintainers,repository:repository,dependencies:dependencies,optionalDependencies:optionalDependencies,devDependencies:devDependencies,license:license,scripts:scripts}; /* Copyright (C) 2012-2014 Yusuke Suzuki Copyright (C) 2015 Ingvar Stepanyan Copyright (C) 2014 Ivan Nikulin Copyright (C) 2012-2013 Michael Ficarra Copyright (C) 2012-2013 Mathias Bynens Copyright (C) 2013 Irakli Gozalishvili Copyright (C) 2012 Robert Gust-Bardon Copyright (C) 2012 John Freeman Copyright (C) 2011-2012 Ariya Hidayat Copyright (C) 2012 Joost-Wim Boekesteijn Copyright (C) 2012 Kris Kowal Copyright (C) 2012 Arpad Borsos Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ var escodegen = createCommonjsModule(function (module, exports) { /*global exports:true, require:true, global:true*/ (function () { 'use strict'; var Syntax, Precedence, BinaryPrecedence, SourceNode, estraverse$1, esutils, base, indent, json, renumber, hexadecimal, quotes, escapeless, newline, space, parentheses, semicolons, safeConcatenation, directive, extra, parse, sourceMap$1, sourceCode, preserveBlankLines, FORMAT_MINIFY, FORMAT_DEFAULTS; estraverse$1 = estraverse; esutils = utils; Syntax = estraverse$1.Syntax; // Generation is done by generateExpression. function isExpression(node) { return CodeGenerator.Expression.hasOwnProperty(node.type); } // Generation is done by generateStatement. function isStatement(node) { return CodeGenerator.Statement.hasOwnProperty(node.type); } Precedence = { Sequence: 0, Yield: 1, Assignment: 1, Conditional: 2, ArrowFunction: 2, LogicalOR: 3, LogicalAND: 4, BitwiseOR: 5, BitwiseXOR: 6, BitwiseAND: 7, Equality: 8, Relational: 9, BitwiseSHIFT: 10, Additive: 11, Multiplicative: 12, Exponentiation: 13, Await: 14, Unary: 14, Postfix: 15, Call: 16, New: 17, TaggedTemplate: 18, Member: 19, Primary: 20 }; BinaryPrecedence = { '||': Precedence.LogicalOR, '&&': Precedence.LogicalAND, '|': Precedence.BitwiseOR, '^': Precedence.BitwiseXOR, '&': Precedence.BitwiseAND, '==': Precedence.Equality, '!=': Precedence.Equality, '===': Precedence.Equality, '!==': Precedence.Equality, 'is': Precedence.Equality, 'isnt': Precedence.Equality, '<': Precedence.Relational, '>': Precedence.Relational, '<=': Precedence.Relational, '>=': Precedence.Relational, 'in': Precedence.Relational, 'instanceof': Precedence.Relational, '<<': Precedence.BitwiseSHIFT, '>>': Precedence.BitwiseSHIFT, '>>>': Precedence.BitwiseSHIFT, '+': Precedence.Additive, '-': Precedence.Additive, '*': Precedence.Multiplicative, '%': Precedence.Multiplicative, '/': Precedence.Multiplicative, '**': Precedence.Exponentiation }; //Flags var F_ALLOW_IN = 1, F_ALLOW_CALL = 1 << 1, F_ALLOW_UNPARATH_NEW = 1 << 2, F_FUNC_BODY = 1 << 3, F_DIRECTIVE_CTX = 1 << 4, F_SEMICOLON_OPT = 1 << 5; //Expression flag sets //NOTE: Flag order: // F_ALLOW_IN // F_ALLOW_CALL // F_ALLOW_UNPARATH_NEW var E_FTT = F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW, E_TTF = F_ALLOW_IN | F_ALLOW_CALL, E_TTT = F_ALLOW_IN | F_ALLOW_CALL | F_ALLOW_UNPARATH_NEW, E_TFF = F_ALLOW_IN, E_FFT = F_ALLOW_UNPARATH_NEW, E_TFT = F_ALLOW_IN | F_ALLOW_UNPARATH_NEW; //Statement flag sets //NOTE: Flag order: // F_ALLOW_IN // F_FUNC_BODY // F_DIRECTIVE_CTX // F_SEMICOLON_OPT var S_TFFF = F_ALLOW_IN, S_TFFT = F_ALLOW_IN | F_SEMICOLON_OPT, S_FFFF = 0x00, S_TFTF = F_ALLOW_IN | F_DIRECTIVE_CTX, S_TTFF = F_ALLOW_IN | F_FUNC_BODY; function getDefaultOptions() { // default options return { indent: null, base: null, parse: null, comment: false, format: { indent: { style: ' ', base: 0, adjustMultilineComment: false }, newline: '\n', space: ' ', json: false, renumber: false, hexadecimal: false, quotes: 'single', escapeless: false, compact: false, parentheses: true, semicolons: true, safeConcatenation: false, preserveBlankLines: false }, moz: { comprehensionExpressionStartsWithAssignment: false, starlessGenerator: false }, sourceMap: null, sourceMapRoot: null, sourceMapWithCode: false, directive: false, raw: true, verbatim: null, sourceCode: null }; } function stringRepeat(str, num) { var result = ''; for (num |= 0; num > 0; num >>>= 1, str += str) { if (num & 1) { result += str; } } return result; } function hasLineTerminator(str) { return (/[\r\n]/g).test(str); } function endsWithLineTerminator(str) { var len = str.length; return len && esutils.code.isLineTerminator(str.charCodeAt(len - 1)); } function merge(target, override) { var key; for (key in override) { if (override.hasOwnProperty(key)) { target[key] = override[key]; } } return target; } function updateDeeply(target, override) { var key, val; function isHashObject(target) { return typeof target === 'object' && target instanceof Object && !(target instanceof RegExp); } for (key in override) { if (override.hasOwnProperty(key)) { val = override[key]; if (isHashObject(val)) { if (isHashObject(target[key])) { updateDeeply(target[key], val); } else { target[key] = updateDeeply({}, val); } } else { target[key] = val; } } } return target; } function generateNumber(value) { var result, point, temp, exponent, pos; if (value !== value) { throw new Error('Numeric literal whose value is NaN'); } if (value < 0 || (value === 0 && 1 / value < 0)) { throw new Error('Numeric literal whose value is negative'); } if (value === 1 / 0) { return json ? 'null' : renumber ? '1e400' : '1e+400'; } result = '' + value; if (!renumber || result.length < 3) { return result; } point = result.indexOf('.'); if (!json && result.charCodeAt(0) === 0x30 /* 0 */ && point === 1) { point = 0; result = result.slice(1); } temp = result; result = result.replace('e+', 'e'); exponent = 0; if ((pos = temp.indexOf('e')) > 0) { exponent = +temp.slice(pos + 1); temp = temp.slice(0, pos); } if (point >= 0) { exponent -= temp.length - point - 1; temp = +(temp.slice(0, point) + temp.slice(point + 1)) + ''; } pos = 0; while (temp.charCodeAt(temp.length + pos - 1) === 0x30 /* 0 */) { --pos; } if (pos !== 0) { exponent -= pos; temp = temp.slice(0, pos); } if (exponent !== 0) { temp += 'e' + exponent; } if ((temp.length < result.length || (hexadecimal && value > 1e12 && Math.floor(value) === value && (temp = '0x' + value.toString(16)).length < result.length)) && +temp === value) { result = temp; } return result; } // Generate valid RegExp expression. // This function is based on https://github.com/Constellation/iv Engine function escapeRegExpCharacter(ch, previousIsBackslash) { // not handling '\' and handling \u2028 or \u2029 to unicode escape sequence if ((ch & ~1) === 0x2028) { return (previousIsBackslash ? 'u' : '\\u') + ((ch === 0x2028) ? '2028' : '2029'); } else if (ch === 10 || ch === 13) { // \n, \r return (previousIsBackslash ? '' : '\\') + ((ch === 10) ? 'n' : 'r'); } return String.fromCharCode(ch); } function generateRegExp(reg) { var match, result, flags, i, iz, ch, characterInBrack, previousIsBackslash; result = reg.toString(); if (reg.source) { // extract flag from toString result match = result.match(/\/([^/]*)$/); if (!match) { return result; } flags = match[1]; result = ''; characterInBrack = false; previousIsBackslash = false; for (i = 0, iz = reg.source.length; i < iz; ++i) { ch = reg.source.charCodeAt(i); if (!previousIsBackslash) { if (characterInBrack) { if (ch === 93) { // ] characterInBrack = false; } } else { if (ch === 47) { // / result += '\\'; } else if (ch === 91) { // [ characterInBrack = true; } } result += escapeRegExpCharacter(ch, previousIsBackslash); previousIsBackslash = ch === 92; // \ } else { // if new RegExp("\\\n') is provided, create /\n/ result += escapeRegExpCharacter(ch, previousIsBackslash); // prevent like /\\[/]/ previousIsBackslash = false; } } return '/' + result + '/' + flags; } return result; } function escapeAllowedCharacter(code, next) { var hex; if (code === 0x08 /* \b */) { return '\\b'; } if (code === 0x0C /* \f */) { return '\\f'; } if (code === 0x09 /* \t */) { return '\\t'; } hex = code.toString(16).toUpperCase(); if (json || code > 0xFF) { return '\\u' + '0000'.slice(hex.length) + hex; } else if (code === 0x0000 && !esutils.code.isDecimalDigit(next)) { return '\\0'; } else if (code === 0x000B /* \v */) { // '\v' return '\\x0B'; } else { return '\\x' + '00'.slice(hex.length) + hex; } } function escapeDisallowedCharacter(code) { if (code === 0x5C /* \ */) { return '\\\\'; } if (code === 0x0A /* \n */) { return '\\n'; } if (code === 0x0D /* \r */) { return '\\r'; } if (code === 0x2028) { return '\\u2028'; } if (code === 0x2029) { return '\\u2029'; } throw new Error('Incorrectly classified character'); } function escapeDirective(str) { var i, iz, code, quote; quote = quotes === 'double' ? '"' : '\''; for (i = 0, iz = str.length; i < iz; ++i) { code = str.charCodeAt(i); if (code === 0x27 /* ' */) { quote = '"'; break; } else if (code === 0x22 /* " */) { quote = '\''; break; } else if (code === 0x5C /* \ */) { ++i; } } return quote + str + quote; } function escapeString(str) { var result = '', i, len, code, singleQuotes = 0, doubleQuotes = 0, single, quote; for (i = 0, len = str.length; i < len; ++i) { code = str.charCodeAt(i); if (code === 0x27 /* ' */) { ++singleQuotes; } else if (code === 0x22 /* " */) { ++doubleQuotes; } else if (code === 0x2F /* / */ && json) { result += '\\'; } else if (esutils.code.isLineTerminator(code) || code === 0x5C /* \ */) { result += escapeDisallowedCharacter(code); continue; } else if (!esutils.code.isIdentifierPartES5(code) && (json && code < 0x20 /* SP */ || !json && !escapeless && (code < 0x20 /* SP */ || code > 0x7E /* ~ */))) { result += escapeAllowedCharacter(code, str.charCodeAt(i + 1)); continue; } result += String.fromCharCode(code); } single = !(quotes === 'double' || (quotes === 'auto' && doubleQuotes < singleQuotes)); quote = single ? '\'' : '"'; if (!(single ? singleQuotes : doubleQuotes)) { return quote + result + quote; } str = result; result = quote; for (i = 0, len = str.length; i < len; ++i) { code = str.charCodeAt(i); if ((code === 0x27 /* ' */ && single) || (code === 0x22 /* " */ && !single)) { result += '\\'; } result += String.fromCharCode(code); } return result + quote; } /** * flatten an array to a string, where the array can contain * either strings or nested arrays */ function flattenToString(arr) { var i, iz, elem, result = ''; for (i = 0, iz = arr.length; i < iz; ++i) { elem = arr[i]; result += Array.isArray(elem) ? flattenToString(elem) : elem; } return result; } /** * convert generated to a SourceNode when source maps are enabled. */ function toSourceNodeWhenNeeded(generated, node) { if (!sourceMap$1) { // with no source maps, generated is either an // array or a string. if an array, flatten it. // if a string, just return it if (Array.isArray(generated)) { return flattenToString(generated); } else { return generated; } } if (node == null) { if (generated instanceof SourceNode) { return generated; } else { node = {}; } } if (node.loc == null) { return new SourceNode(null, null, sourceMap$1, generated, node.name || null); } return new SourceNode(node.loc.start.line, node.loc.start.column, (sourceMap$1 === true ? node.loc.source || null : sourceMap$1), generated, node.name || null); } function noEmptySpace() { return (space) ? space : ' '; } function join(left, right) { var leftSource, rightSource, leftCharCode, rightCharCode; leftSource = toSourceNodeWhenNeeded(left).toString(); if (leftSource.length === 0) { return [right]; } rightSource = toSourceNodeWhenNeeded(right).toString(); if (rightSource.length === 0) { return [left]; } leftCharCode = leftSource.charCodeAt(leftSource.length - 1); rightCharCode = rightSource.charCodeAt(0); if ((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode || esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode) || leftCharCode === 0x2F /* / */ && rightCharCode === 0x69 /* i */) { // infix word operators all start with `i` return [left, noEmptySpace(), right]; } else if (esutils.code.isWhiteSpace(leftCharCode) || esutils.code.isLineTerminator(leftCharCode) || esutils.code.isWhiteSpace(rightCharCode) || esutils.code.isLineTerminator(rightCharCode)) { return [left, right]; } return [left, space, right]; } function addIndent(stmt) { return [base, stmt]; } function withIndent(fn) { var previousBase; previousBase = base; base += indent; fn(base); base = previousBase; } function calculateSpaces(str) { var i; for (i = str.length - 1; i >= 0; --i) { if (esutils.code.isLineTerminator(str.charCodeAt(i))) { break; } } return (str.length - 1) - i; } function adjustMultilineComment(value, specialBase) { var array, i, len, line, j, spaces, previousBase, sn; array = value.split(/\r\n|[\r\n]/); spaces = Number.MAX_VALUE; // first line doesn't have indentation for (i = 1, len = array.length; i < len; ++i) { line = array[i]; j = 0; while (j < line.length && esutils.code.isWhiteSpace(line.charCodeAt(j))) { ++j; } if (spaces > j) { spaces = j; } } if (typeof specialBase !== 'undefined') { // pattern like // { // var t = 20; /* // * this is comment // */ // } previousBase = base; if (array[1][spaces] === '*') { specialBase += ' '; } base = specialBase; } else { if (spaces & 1) { // /* // * // */ // If spaces are odd number, above pattern is considered. // We waste 1 space. --spaces; } previousBase = base; } for (i = 1, len = array.length; i < len; ++i) { sn = toSourceNodeWhenNeeded(addIndent(array[i].slice(spaces))); array[i] = sourceMap$1 ? sn.join('') : sn; } base = previousBase; return array.join('\n'); } function generateComment(comment, specialBase) { if (comment.type === 'Line') { if (endsWithLineTerminator(comment.value)) { return '//' + comment.value; } else { // Always use LineTerminator var result = '//' + comment.value; if (!preserveBlankLines) { result += '\n'; } return result; } } if (extra.format.indent.adjustMultilineComment && /[\n\r]/.test(comment.value)) { return adjustMultilineComment('/*' + comment.value + '*/', specialBase); } return '/*' + comment.value + '*/'; } function addComments(stmt, result) { var i, len, comment, save, tailingToStatement, specialBase, fragment, extRange, range, prevRange, prefix, infix, suffix, count; if (stmt.leadingComments && stmt.leadingComments.length > 0) { save = result; if (preserveBlankLines) { comment = stmt.leadingComments[0]; result = []; extRange = comment.extendedRange; range = comment.range; prefix = sourceCode.substring(extRange[0], range[0]); count = (prefix.match(/\n/g) || []).length; if (count > 0) { result.push(stringRepeat('\n', count)); result.push(addIndent(generateComment(comment))); } else { result.push(prefix); result.push(generateComment(comment)); } prevRange = range; for (i = 1, len = stmt.leadingComments.length; i < len; i++) { comment = stmt.leadingComments[i]; range = comment.range; infix = sourceCode.substring(prevRange[1], range[0]); count = (infix.match(/\n/g) || []).length; result.push(stringRepeat('\n', count)); result.push(addIndent(generateComment(comment))); prevRange = range; } suffix = sourceCode.substring(range[1], extRange[1]); count = (suffix.match(/\n/g) || []).length; result.push(stringRepeat('\n', count)); } else { comment = stmt.leadingComments[0]; result = []; if (safeConcatenation && stmt.type === Syntax.Program && stmt.body.length === 0) { result.push('\n'); } result.push(generateComment(comment)); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push('\n'); } for (i = 1, len = stmt.leadingComments.length; i < len; ++i) { comment = stmt.leadingComments[i]; fragment = [generateComment(comment)]; if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { fragment.push('\n'); } result.push(addIndent(fragment)); } } result.push(addIndent(save)); } if (stmt.trailingComments) { if (preserveBlankLines) { comment = stmt.trailingComments[0]; extRange = comment.extendedRange; range = comment.range; prefix = sourceCode.substring(extRange[0], range[0]); count = (prefix.match(/\n/g) || []).length; if (count > 0) { result.push(stringRepeat('\n', count)); result.push(addIndent(generateComment(comment))); } else { result.push(prefix); result.push(generateComment(comment)); } } else { tailingToStatement = !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); specialBase = stringRepeat(' ', calculateSpaces(toSourceNodeWhenNeeded([base, result, indent]).toString())); for (i = 0, len = stmt.trailingComments.length; i < len; ++i) { comment = stmt.trailingComments[i]; if (tailingToStatement) { // We assume target like following script // // var t = 20; /** // * This is comment of t // */ if (i === 0) { // first case result = [result, indent]; } else { result = [result, specialBase]; } result.push(generateComment(comment, specialBase)); } else { result = [result, addIndent(generateComment(comment))]; } if (i !== len - 1 && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result = [result, '\n']; } } } } return result; } function generateBlankLines(start, end, result) { var j, newlineCount = 0; for (j = start; j < end; j++) { if (sourceCode[j] === '\n') { newlineCount++; } } for (j = 1; j < newlineCount; j++) { result.push(newline); } } function parenthesize(text, current, should) { if (current < should) { return ['(', text, ')']; } return text; } function generateVerbatimString(string) { var i, iz, result; result = string.split(/\r\n|\n/); for (i = 1, iz = result.length; i < iz; i++) { result[i] = newline + base + result[i]; } return result; } function generateVerbatim(expr, precedence) { var verbatim, result, prec; verbatim = expr[extra.verbatim]; if (typeof verbatim === 'string') { result = parenthesize(generateVerbatimString(verbatim), Precedence.Sequence, precedence); } else { // verbatim is object result = generateVerbatimString(verbatim.content); prec = (verbatim.precedence != null) ? verbatim.precedence : Precedence.Sequence; result = parenthesize(result, prec, precedence); } return toSourceNodeWhenNeeded(result, expr); } function CodeGenerator() { } // Helpers. CodeGenerator.prototype.maybeBlock = function(stmt, flags) { var result, noLeadingComment, that = this; noLeadingComment = !extra.comment || !stmt.leadingComments; if (stmt.type === Syntax.BlockStatement && noLeadingComment) { return [space, this.generateStatement(stmt, flags)]; } if (stmt.type === Syntax.EmptyStatement && noLeadingComment) { return ';'; } withIndent(function () { result = [ newline, addIndent(that.generateStatement(stmt, flags)) ]; }); return result; }; CodeGenerator.prototype.maybeBlockSuffix = function (stmt, result) { var ends = endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString()); if (stmt.type === Syntax.BlockStatement && (!extra.comment || !stmt.leadingComments) && !ends) { return [result, space]; } if (ends) { return [result, base]; } return [result, newline, base]; }; function generateIdentifier(node) { return toSourceNodeWhenNeeded(node.name, node); } function generateAsyncPrefix(node, spaceRequired) { return node.async ? 'async' + (spaceRequired ? noEmptySpace() : space) : ''; } function generateStarSuffix(node) { var isGenerator = node.generator && !extra.moz.starlessGenerator; return isGenerator ? '*' + space : ''; } function generateMethodPrefix(prop) { var func = prop.value, prefix = ''; if (func.async) { prefix += generateAsyncPrefix(func, !prop.computed); } if (func.generator) { // avoid space before method name prefix += generateStarSuffix(func) ? '*' : ''; } return prefix; } CodeGenerator.prototype.generatePattern = function (node, precedence, flags) { if (node.type === Syntax.Identifier) { return generateIdentifier(node); } return this.generateExpression(node, precedence, flags); }; CodeGenerator.prototype.generateFunctionParams = function (node) { var i, iz, result, hasDefault; hasDefault = false; if (node.type === Syntax.ArrowFunctionExpression && !node.rest && (!node.defaults || node.defaults.length === 0) && node.params.length === 1 && node.params[0].type === Syntax.Identifier) { // arg => { } case result = [generateAsyncPrefix(node, true), generateIdentifier(node.params[0])]; } else { result = node.type === Syntax.ArrowFunctionExpression ? [generateAsyncPrefix(node, false)] : []; result.push('('); if (node.defaults) { hasDefault = true; } for (i = 0, iz = node.params.length; i < iz; ++i) { if (hasDefault && node.defaults[i]) { // Handle default values. result.push(this.generateAssignment(node.params[i], node.defaults[i], '=', Precedence.Assignment, E_TTT)); } else { result.push(this.generatePattern(node.params[i], Precedence.Assignment, E_TTT)); } if (i + 1 < iz) { result.push(',' + space); } } if (node.rest) { if (node.params.length) { result.push(',' + space); } result.push('...'); result.push(generateIdentifier(node.rest)); } result.push(')'); } return result; }; CodeGenerator.prototype.generateFunctionBody = function (node) { var result, expr; result = this.generateFunctionParams(node); if (node.type === Syntax.ArrowFunctionExpression) { result.push(space); result.push('=>'); } if (node.expression) { result.push(space); expr = this.generateExpression(node.body, Precedence.Assignment, E_TTT); if (expr.toString().charAt(0) === '{') { expr = ['(', expr, ')']; } result.push(expr); } else { result.push(this.maybeBlock(node.body, S_TTFF)); } return result; }; CodeGenerator.prototype.generateIterationForStatement = function (operator, stmt, flags) { var result = ['for' + (stmt.await ? noEmptySpace() + 'await' : '') + space + '('], that = this; withIndent(function () { if (stmt.left.type === Syntax.VariableDeclaration) { withIndent(function () { result.push(stmt.left.kind + noEmptySpace()); result.push(that.generateStatement(stmt.left.declarations[0], S_FFFF)); }); } else { result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT)); } result = join(result, operator); result = [join( result, that.generateExpression(stmt.right, Precedence.Assignment, E_TTT) ), ')']; }); result.push(this.maybeBlock(stmt.body, flags)); return result; }; CodeGenerator.prototype.generatePropertyKey = function (expr, computed) { var result = []; if (computed) { result.push('['); } result.push(this.generateExpression(expr, Precedence.Sequence, E_TTT)); if (computed) { result.push(']'); } return result; }; CodeGenerator.prototype.generateAssignment = function (left, right, operator, precedence, flags) { if (Precedence.Assignment < precedence) { flags |= F_ALLOW_IN; } return parenthesize( [ this.generateExpression(left, Precedence.Call, flags), space + operator + space, this.generateExpression(right, Precedence.Assignment, flags) ], Precedence.Assignment, precedence ); }; CodeGenerator.prototype.semicolon = function (flags) { if (!semicolons && flags & F_SEMICOLON_OPT) { return ''; } return ';'; }; // Statements. CodeGenerator.Statement = { BlockStatement: function (stmt, flags) { var range, content, result = ['{', newline], that = this; withIndent(function () { // handle functions without any code if (stmt.body.length === 0 && preserveBlankLines) { range = stmt.range; if (range[1] - range[0] > 2) { content = sourceCode.substring(range[0] + 1, range[1] - 1); if (content[0] === '\n') { result = ['{']; } result.push(content); } } var i, iz, fragment, bodyFlags; bodyFlags = S_TFFF; if (flags & F_FUNC_BODY) { bodyFlags |= F_DIRECTIVE_CTX; } for (i = 0, iz = stmt.body.length; i < iz; ++i) { if (preserveBlankLines) { // handle spaces before the first line if (i === 0) { if (stmt.body[0].leadingComments) { range = stmt.body[0].leadingComments[0].extendedRange; content = sourceCode.substring(range[0], range[1]); if (content[0] === '\n') { result = ['{']; } } if (!stmt.body[0].leadingComments) { generateBlankLines(stmt.range[0], stmt.body[0].range[0], result); } } // handle spaces between lines if (i > 0) { if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) { generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result); } } } if (i === iz - 1) { bodyFlags |= F_SEMICOLON_OPT; } if (stmt.body[i].leadingComments && preserveBlankLines) { fragment = that.generateStatement(stmt.body[i], bodyFlags); } else { fragment = addIndent(that.generateStatement(stmt.body[i], bodyFlags)); } result.push(fragment); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { if (preserveBlankLines && i < iz - 1) { // don't add a new line if there are leading coments // in the next statement if (!stmt.body[i + 1].leadingComments) { result.push(newline); } } else { result.push(newline); } } if (preserveBlankLines) { // handle spaces after the last line if (i === iz - 1) { if (!stmt.body[i].trailingComments) { generateBlankLines(stmt.body[i].range[1], stmt.range[1], result); } } } } }); result.push(addIndent('}')); return result; }, BreakStatement: function (stmt, flags) { if (stmt.label) { return 'break ' + stmt.label.name + this.semicolon(flags); } return 'break' + this.semicolon(flags); }, ContinueStatement: function (stmt, flags) { if (stmt.label) { return 'continue ' + stmt.label.name + this.semicolon(flags); } return 'continue' + this.semicolon(flags); }, ClassBody: function (stmt, flags) { var result = [ '{', newline], that = this; withIndent(function (indent) { var i, iz; for (i = 0, iz = stmt.body.length; i < iz; ++i) { result.push(indent); result.push(that.generateExpression(stmt.body[i], Precedence.Sequence, E_TTT)); if (i + 1 < iz) { result.push(newline); } } }); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(base); result.push('}'); return result; }, ClassDeclaration: function (stmt, flags) { var result, fragment; result = ['class']; if (stmt.id) { result = join(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT)); } if (stmt.superClass) { fragment = join('extends', this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT)); result = join(result, fragment); } result.push(space); result.push(this.generateStatement(stmt.body, S_TFFT)); return result; }, DirectiveStatement: function (stmt, flags) { if (extra.raw && stmt.raw) { return stmt.raw + this.semicolon(flags); } return escapeDirective(stmt.directive) + this.semicolon(flags); }, DoWhileStatement: function (stmt, flags) { // Because `do 42 while (cond)` is Syntax Error. We need semicolon. var result = join('do', this.maybeBlock(stmt.body, S_TFFF)); result = this.maybeBlockSuffix(stmt.body, result); return join(result, [ 'while' + space + '(', this.generateExpression(stmt.test, Precedence.Sequence, E_TTT), ')' + this.semicolon(flags) ]); }, CatchClause: function (stmt, flags) { var result, that = this; withIndent(function () { var guard; if (stmt.param) { result = [ 'catch' + space + '(', that.generateExpression(stmt.param, Precedence.Sequence, E_TTT), ')' ]; if (stmt.guard) { guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT); result.splice(2, 0, ' if ', guard); } } else { result = ['catch']; } }); result.push(this.maybeBlock(stmt.body, S_TFFF)); return result; }, DebuggerStatement: function (stmt, flags) { return 'debugger' + this.semicolon(flags); }, EmptyStatement: function (stmt, flags) { return ';'; }, ExportDefaultDeclaration: function (stmt, flags) { var result = [ 'export' ], bodyFlags; bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF; // export default HoistableDeclaration[Default] // export default AssignmentExpression[In] ; result = join(result, 'default'); if (isStatement(stmt.declaration)) { result = join(result, this.generateStatement(stmt.declaration, bodyFlags)); } else { result = join(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags)); } return result; }, ExportNamedDeclaration: function (stmt, flags) { var result = [ 'export' ], bodyFlags, that = this; bodyFlags = (flags & F_SEMICOLON_OPT) ? S_TFFT : S_TFFF; // export VariableStatement // export Declaration[Default] if (stmt.declaration) { return join(result, this.generateStatement(stmt.declaration, bodyFlags)); } // export ExportClause[NoReference] FromClause ; // export ExportClause ; if (stmt.specifiers) { if (stmt.specifiers.length === 0) { result = join(result, '{' + space + '}'); } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) { result = join(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT)); } else { result = join(result, '{'); withIndent(function (indent) { var i, iz; result.push(newline); for (i = 0, iz = stmt.specifiers.length; i < iz; ++i) { result.push(indent); result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT)); if (i + 1 < iz) { result.push(',' + newline); } } }); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(base + '}'); } if (stmt.source) { result = join(result, [ 'from' + space, // ModuleSpecifier this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), this.semicolon(flags) ]); } else { result.push(this.semicolon(flags)); } } return result; }, ExportAllDeclaration: function (stmt, flags) { // export * FromClause ; return [ 'export' + space, '*' + space, 'from' + space, // ModuleSpecifier this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), this.semicolon(flags) ]; }, ExpressionStatement: function (stmt, flags) { var result, fragment; function isClassPrefixed(fragment) { var code; if (fragment.slice(0, 5) !== 'class') { return false; } code = fragment.charCodeAt(5); return code === 0x7B /* '{' */ || esutils.code.isWhiteSpace(code) || esutils.code.isLineTerminator(code); } function isFunctionPrefixed(fragment) { var code; if (fragment.slice(0, 8) !== 'function') { return false; } code = fragment.charCodeAt(8); return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code); } function isAsyncPrefixed(fragment) { var code, i, iz; if (fragment.slice(0, 5) !== 'async') { return false; } if (!esutils.code.isWhiteSpace(fragment.charCodeAt(5))) { return false; } for (i = 6, iz = fragment.length; i < iz; ++i) { if (!esutils.code.isWhiteSpace(fragment.charCodeAt(i))) { break; } } if (i === iz) { return false; } if (fragment.slice(i, i + 8) !== 'function') { return false; } code = fragment.charCodeAt(i + 8); return code === 0x28 /* '(' */ || esutils.code.isWhiteSpace(code) || code === 0x2A /* '*' */ || esutils.code.isLineTerminator(code); } result = [this.generateExpression(stmt.expression, Precedence.Sequence, E_TTT)]; // 12.4 '{', 'function', 'class' is not allowed in this position. // wrap expression with parentheses fragment = toSourceNodeWhenNeeded(result).toString(); if (fragment.charCodeAt(0) === 0x7B /* '{' */ || // ObjectExpression isClassPrefixed(fragment) || isFunctionPrefixed(fragment) || isAsyncPrefixed(fragment) || (directive && (flags & F_DIRECTIVE_CTX) && stmt.expression.type === Syntax.Literal && typeof stmt.expression.value === 'string')) { result = ['(', result, ')' + this.semicolon(flags)]; } else { result.push(this.semicolon(flags)); } return result; }, ImportDeclaration: function (stmt, flags) { // ES6: 15.2.1 valid import declarations: // - import ImportClause FromClause ; // - import ModuleSpecifier ; var result, cursor, that = this; // If no ImportClause is present, // this should be `import ModuleSpecifier` so skip `from` // ModuleSpecifier is StringLiteral. if (stmt.specifiers.length === 0) { // import ModuleSpecifier ; return [ 'import', space, // ModuleSpecifier this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), this.semicolon(flags) ]; } // import ImportClause FromClause ; result = [ 'import' ]; cursor = 0; // ImportedBinding if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) { result = join(result, [ this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT) ]); ++cursor; } if (stmt.specifiers[cursor]) { if (cursor !== 0) { result.push(','); } if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) { // NameSpaceImport result = join(result, [ space, this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT) ]); } else { // NamedImports result.push(space + '{'); if ((stmt.specifiers.length - cursor) === 1) { // import { ... } from "..."; result.push(space); result.push(this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)); result.push(space + '}' + space); } else { // import { // ..., // ..., // } from "..."; withIndent(function (indent) { var i, iz; result.push(newline); for (i = cursor, iz = stmt.specifiers.length; i < iz; ++i) { result.push(indent); result.push(that.generateExpression(stmt.specifiers[i], Precedence.Sequence, E_TTT)); if (i + 1 < iz) { result.push(',' + newline); } } }); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(base + '}' + space); } } } result = join(result, [ 'from' + space, // ModuleSpecifier this.generateExpression(stmt.source, Precedence.Sequence, E_TTT), this.semicolon(flags) ]); return result; }, VariableDeclarator: function (stmt, flags) { var itemFlags = (flags & F_ALLOW_IN) ? E_TTT : E_FTT; if (stmt.init) { return [ this.generateExpression(stmt.id, Precedence.Assignment, itemFlags), space, '=', space, this.generateExpression(stmt.init, Precedence.Assignment, itemFlags) ]; } return this.generatePattern(stmt.id, Precedence.Assignment, itemFlags); }, VariableDeclaration: function (stmt, flags) { // VariableDeclarator is typed as Statement, // but joined with comma (not LineTerminator). // So if comment is attached to target node, we should specialize. var result, i, iz, node, bodyFlags, that = this; result = [ stmt.kind ]; bodyFlags = (flags & F_ALLOW_IN) ? S_TFFF : S_FFFF; function block() { node = stmt.declarations[0]; if (extra.comment && node.leadingComments) { result.push('\n'); result.push(addIndent(that.generateStatement(node, bodyFlags))); } else { result.push(noEmptySpace()); result.push(that.generateStatement(node, bodyFlags)); } for (i = 1, iz = stmt.declarations.length; i < iz; ++i) { node = stmt.declarations[i]; if (extra.comment && node.leadingComments) { result.push(',' + newline); result.push(addIndent(that.generateStatement(node, bodyFlags))); } else { result.push(',' + space); result.push(that.generateStatement(node, bodyFlags)); } } } if (stmt.declarations.length > 1) { withIndent(block); } else { block(); } result.push(this.semicolon(flags)); return result; }, ThrowStatement: function (stmt, flags) { return [join( 'throw', this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT) ), this.semicolon(flags)]; }, TryStatement: function (stmt, flags) { var result, i, iz, guardedHandlers; result = ['try', this.maybeBlock(stmt.block, S_TFFF)]; result = this.maybeBlockSuffix(stmt.block, result); if (stmt.handlers) { // old interface for (i = 0, iz = stmt.handlers.length; i < iz; ++i) { result = join(result, this.generateStatement(stmt.handlers[i], S_TFFF)); if (stmt.finalizer || i + 1 !== iz) { result = this.maybeBlockSuffix(stmt.handlers[i].body, result); } } } else { guardedHandlers = stmt.guardedHandlers || []; for (i = 0, iz = guardedHandlers.length; i < iz; ++i) { result = join(result, this.generateStatement(guardedHandlers[i], S_TFFF)); if (stmt.finalizer || i + 1 !== iz) { result = this.maybeBlockSuffix(guardedHandlers[i].body, result); } } // new interface if (stmt.handler) { if (Array.isArray(stmt.handler)) { for (i = 0, iz = stmt.handler.length; i < iz; ++i) { result = join(result, this.generateStatement(stmt.handler[i], S_TFFF)); if (stmt.finalizer || i + 1 !== iz) { result = this.maybeBlockSuffix(stmt.handler[i].body, result); } } } else { result = join(result, this.generateStatement(stmt.handler, S_TFFF)); if (stmt.finalizer) { result = this.maybeBlockSuffix(stmt.handler.body, result); } } } } if (stmt.finalizer) { result = join(result, ['finally', this.maybeBlock(stmt.finalizer, S_TFFF)]); } return result; }, SwitchStatement: function (stmt, flags) { var result, fragment, i, iz, bodyFlags, that = this; withIndent(function () { result = [ 'switch' + space + '(', that.generateExpression(stmt.discriminant, Precedence.Sequence, E_TTT), ')' + space + '{' + newline ]; }); if (stmt.cases) { bodyFlags = S_TFFF; for (i = 0, iz = stmt.cases.length; i < iz; ++i) { if (i === iz - 1) { bodyFlags |= F_SEMICOLON_OPT; } fragment = addIndent(this.generateStatement(stmt.cases[i], bodyFlags)); result.push(fragment); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { result.push(newline); } } } result.push(addIndent('}')); return result; }, SwitchCase: function (stmt, flags) { var result, fragment, i, iz, bodyFlags, that = this; withIndent(function () { if (stmt.test) { result = [ join('case', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)), ':' ]; } else { result = ['default:']; } i = 0; iz = stmt.consequent.length; if (iz && stmt.consequent[0].type === Syntax.BlockStatement) { fragment = that.maybeBlock(stmt.consequent[0], S_TFFF); result.push(fragment); i = 1; } if (i !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } bodyFlags = S_TFFF; for (; i < iz; ++i) { if (i === iz - 1 && flags & F_SEMICOLON_OPT) { bodyFlags |= F_SEMICOLON_OPT; } fragment = addIndent(that.generateStatement(stmt.consequent[i], bodyFlags)); result.push(fragment); if (i + 1 !== iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { result.push(newline); } } }); return result; }, IfStatement: function (stmt, flags) { var result, bodyFlags, semicolonOptional, that = this; withIndent(function () { result = [ 'if' + space + '(', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT), ')' ]; }); semicolonOptional = flags & F_SEMICOLON_OPT; bodyFlags = S_TFFF; if (semicolonOptional) { bodyFlags |= F_SEMICOLON_OPT; } if (stmt.alternate) { result.push(this.maybeBlock(stmt.consequent, S_TFFF)); result = this.maybeBlockSuffix(stmt.consequent, result); if (stmt.alternate.type === Syntax.IfStatement) { result = join(result, ['else ', this.generateStatement(stmt.alternate, bodyFlags)]); } else { result = join(result, join('else', this.maybeBlock(stmt.alternate, bodyFlags))); } } else { result.push(this.maybeBlock(stmt.consequent, bodyFlags)); } return result; }, ForStatement: function (stmt, flags) { var result, that = this; withIndent(function () { result = ['for' + space + '(']; if (stmt.init) { if (stmt.init.type === Syntax.VariableDeclaration) { result.push(that.generateStatement(stmt.init, S_FFFF)); } else { // F_ALLOW_IN becomes false. result.push(that.generateExpression(stmt.init, Precedence.Sequence, E_FTT)); result.push(';'); } } else { result.push(';'); } if (stmt.test) { result.push(space); result.push(that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)); result.push(';'); } else { result.push(';'); } if (stmt.update) { result.push(space); result.push(that.generateExpression(stmt.update, Precedence.Sequence, E_TTT)); result.push(')'); } else { result.push(')'); } }); result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); return result; }, ForInStatement: function (stmt, flags) { return this.generateIterationForStatement('in', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF); }, ForOfStatement: function (stmt, flags) { return this.generateIterationForStatement('of', stmt, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF); }, LabeledStatement: function (stmt, flags) { return [stmt.label.name + ':', this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)]; }, Program: function (stmt, flags) { var result, fragment, i, iz, bodyFlags; iz = stmt.body.length; result = [safeConcatenation && iz > 0 ? '\n' : '']; bodyFlags = S_TFTF; for (i = 0; i < iz; ++i) { if (!safeConcatenation && i === iz - 1) { bodyFlags |= F_SEMICOLON_OPT; } if (preserveBlankLines) { // handle spaces before the first line if (i === 0) { if (!stmt.body[0].leadingComments) { generateBlankLines(stmt.range[0], stmt.body[i].range[0], result); } } // handle spaces between lines if (i > 0) { if (!stmt.body[i - 1].trailingComments && !stmt.body[i].leadingComments) { generateBlankLines(stmt.body[i - 1].range[1], stmt.body[i].range[0], result); } } } fragment = addIndent(this.generateStatement(stmt.body[i], bodyFlags)); result.push(fragment); if (i + 1 < iz && !endsWithLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { if (preserveBlankLines) { if (!stmt.body[i + 1].leadingComments) { result.push(newline); } } else { result.push(newline); } } if (preserveBlankLines) { // handle spaces after the last line if (i === iz - 1) { if (!stmt.body[i].trailingComments) { generateBlankLines(stmt.body[i].range[1], stmt.range[1], result); } } } } return result; }, FunctionDeclaration: function (stmt, flags) { return [ generateAsyncPrefix(stmt, true), 'function', generateStarSuffix(stmt) || noEmptySpace(), stmt.id ? generateIdentifier(stmt.id) : '', this.generateFunctionBody(stmt) ]; }, ReturnStatement: function (stmt, flags) { if (stmt.argument) { return [join( 'return', this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT) ), this.semicolon(flags)]; } return ['return' + this.semicolon(flags)]; }, WhileStatement: function (stmt, flags) { var result, that = this; withIndent(function () { result = [ 'while' + space + '(', that.generateExpression(stmt.test, Precedence.Sequence, E_TTT), ')' ]; }); result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); return result; }, WithStatement: function (stmt, flags) { var result, that = this; withIndent(function () { result = [ 'with' + space + '(', that.generateExpression(stmt.object, Precedence.Sequence, E_TTT), ')' ]; }); result.push(this.maybeBlock(stmt.body, flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF)); return result; } }; merge(CodeGenerator.prototype, CodeGenerator.Statement); // Expressions. CodeGenerator.Expression = { SequenceExpression: function (expr, precedence, flags) { var result, i, iz; if (Precedence.Sequence < precedence) { flags |= F_ALLOW_IN; } result = []; for (i = 0, iz = expr.expressions.length; i < iz; ++i) { result.push(this.generateExpression(expr.expressions[i], Precedence.Assignment, flags)); if (i + 1 < iz) { result.push(',' + space); } } return parenthesize(result, Precedence.Sequence, precedence); }, AssignmentExpression: function (expr, precedence, flags) { return this.generateAssignment(expr.left, expr.right, expr.operator, precedence, flags); }, ArrowFunctionExpression: function (expr, precedence, flags) { return parenthesize(this.generateFunctionBody(expr), Precedence.ArrowFunction, precedence); }, ConditionalExpression: function (expr, precedence, flags) { if (Precedence.Conditional < precedence) { flags |= F_ALLOW_IN; } return parenthesize( [ this.generateExpression(expr.test, Precedence.LogicalOR, flags), space + '?' + space, this.generateExpression(expr.consequent, Precedence.Assignment, flags), space + ':' + space, this.generateExpression(expr.alternate, Precedence.Assignment, flags) ], Precedence.Conditional, precedence ); }, LogicalExpression: function (expr, precedence, flags) { return this.BinaryExpression(expr, precedence, flags); }, BinaryExpression: function (expr, precedence, flags) { var result, leftPrecedence, rightPrecedence, currentPrecedence, fragment, leftSource; currentPrecedence = BinaryPrecedence[expr.operator]; leftPrecedence = expr.operator === '**' ? Precedence.Postfix : currentPrecedence; rightPrecedence = expr.operator === '**' ? currentPrecedence : currentPrecedence + 1; if (currentPrecedence < precedence) { flags |= F_ALLOW_IN; } fragment = this.generateExpression(expr.left, leftPrecedence, flags); leftSource = fragment.toString(); if (leftSource.charCodeAt(leftSource.length - 1) === 0x2F /* / */ && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) { result = [fragment, noEmptySpace(), expr.operator]; } else { result = join(fragment, expr.operator); } fragment = this.generateExpression(expr.right, rightPrecedence, flags); if (expr.operator === '/' && fragment.toString().charAt(0) === '/' || expr.operator.slice(-1) === '<' && fragment.toString().slice(0, 3) === '!--') { // If '/' concats with '/' or `<` concats with `!--`, it is interpreted as comment start result.push(noEmptySpace()); result.push(fragment); } else { result = join(result, fragment); } if (expr.operator === 'in' && !(flags & F_ALLOW_IN)) { return ['(', result, ')']; } return parenthesize(result, currentPrecedence, precedence); }, CallExpression: function (expr, precedence, flags) { var result, i, iz; // F_ALLOW_UNPARATH_NEW becomes false. result = [this.generateExpression(expr.callee, Precedence.Call, E_TTF)]; result.push('('); for (i = 0, iz = expr['arguments'].length; i < iz; ++i) { result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT)); if (i + 1 < iz) { result.push(',' + space); } } result.push(')'); if (!(flags & F_ALLOW_CALL)) { return ['(', result, ')']; } return parenthesize(result, Precedence.Call, precedence); }, NewExpression: function (expr, precedence, flags) { var result, length, i, iz, itemFlags; length = expr['arguments'].length; // F_ALLOW_CALL becomes false. // F_ALLOW_UNPARATH_NEW may become false. itemFlags = (flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0) ? E_TFT : E_TFF; result = join( 'new', this.generateExpression(expr.callee, Precedence.New, itemFlags) ); if (!(flags & F_ALLOW_UNPARATH_NEW) || parentheses || length > 0) { result.push('('); for (i = 0, iz = length; i < iz; ++i) { result.push(this.generateExpression(expr['arguments'][i], Precedence.Assignment, E_TTT)); if (i + 1 < iz) { result.push(',' + space); } } result.push(')'); } return parenthesize(result, Precedence.New, precedence); }, MemberExpression: function (expr, precedence, flags) { var result, fragment; // F_ALLOW_UNPARATH_NEW becomes false. result = [this.generateExpression(expr.object, Precedence.Call, (flags & F_ALLOW_CALL) ? E_TTF : E_TFF)]; if (expr.computed) { result.push('['); result.push(this.generateExpression(expr.property, Precedence.Sequence, flags & F_ALLOW_CALL ? E_TTT : E_TFT)); result.push(']'); } else { if (expr.object.type === Syntax.Literal && typeof expr.object.value === 'number') { fragment = toSourceNodeWhenNeeded(result).toString(); // When the following conditions are all true, // 1. No floating point // 2. Don't have exponents // 3. The last character is a decimal digit // 4. Not hexadecimal OR octal number literal // we should add a floating point. if ( fragment.indexOf('.') < 0 && !/[eExX]/.test(fragment) && esutils.code.isDecimalDigit(fragment.charCodeAt(fragment.length - 1)) && !(fragment.length >= 2 && fragment.charCodeAt(0) === 48) // '0' ) { result.push(' '); } } result.push('.'); result.push(generateIdentifier(expr.property)); } return parenthesize(result, Precedence.Member, precedence); }, MetaProperty: function (expr, precedence, flags) { var result; result = []; result.push(typeof expr.meta === "string" ? expr.meta : generateIdentifier(expr.meta)); result.push('.'); result.push(typeof expr.property === "string" ? expr.property : generateIdentifier(expr.property)); return parenthesize(result, Precedence.Member, precedence); }, UnaryExpression: function (expr, precedence, flags) { var result, fragment, rightCharCode, leftSource, leftCharCode; fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT); if (space === '') { result = join(expr.operator, fragment); } else { result = [expr.operator]; if (expr.operator.length > 2) { // delete, void, typeof // get `typeof []`, not `typeof[]` result = join(result, fragment); } else { // Prevent inserting spaces between operator and argument if it is unnecessary // like, `!cond` leftSource = toSourceNodeWhenNeeded(result).toString(); leftCharCode = leftSource.charCodeAt(leftSource.length - 1); rightCharCode = fragment.toString().charCodeAt(0); if (((leftCharCode === 0x2B /* + */ || leftCharCode === 0x2D /* - */) && leftCharCode === rightCharCode) || (esutils.code.isIdentifierPartES5(leftCharCode) && esutils.code.isIdentifierPartES5(rightCharCode))) { result.push(noEmptySpace()); result.push(fragment); } else { result.push(fragment); } } } return parenthesize(result, Precedence.Unary, precedence); }, YieldExpression: function (expr, precedence, flags) { var result; if (expr.delegate) { result = 'yield*'; } else { result = 'yield'; } if (expr.argument) { result = join( result, this.generateExpression(expr.argument, Precedence.Yield, E_TTT) ); } return parenthesize(result, Precedence.Yield, precedence); }, AwaitExpression: function (expr, precedence, flags) { var result = join( expr.all ? 'await*' : 'await', this.generateExpression(expr.argument, Precedence.Await, E_TTT) ); return parenthesize(result, Precedence.Await, precedence); }, UpdateExpression: function (expr, precedence, flags) { if (expr.prefix) { return parenthesize( [ expr.operator, this.generateExpression(expr.argument, Precedence.Unary, E_TTT) ], Precedence.Unary, precedence ); } return parenthesize( [ this.generateExpression(expr.argument, Precedence.Postfix, E_TTT), expr.operator ], Precedence.Postfix, precedence ); }, FunctionExpression: function (expr, precedence, flags) { var result = [ generateAsyncPrefix(expr, true), 'function' ]; if (expr.id) { result.push(generateStarSuffix(expr) || noEmptySpace()); result.push(generateIdentifier(expr.id)); } else { result.push(generateStarSuffix(expr) || space); } result.push(this.generateFunctionBody(expr)); return result; }, ArrayPattern: function (expr, precedence, flags) { return this.ArrayExpression(expr, precedence, flags, true); }, ArrayExpression: function (expr, precedence, flags, isPattern) { var result, multiline, that = this; if (!expr.elements.length) { return '[]'; } multiline = isPattern ? false : expr.elements.length > 1; result = ['[', multiline ? newline : '']; withIndent(function (indent) { var i, iz; for (i = 0, iz = expr.elements.length; i < iz; ++i) { if (!expr.elements[i]) { if (multiline) { result.push(indent); } if (i + 1 === iz) { result.push(','); } } else { result.push(multiline ? indent : ''); result.push(that.generateExpression(expr.elements[i], Precedence.Assignment, E_TTT)); } if (i + 1 < iz) { result.push(',' + (multiline ? newline : space)); } } }); if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(multiline ? base : ''); result.push(']'); return result; }, RestElement: function(expr, precedence, flags) { return '...' + this.generatePattern(expr.argument); }, ClassExpression: function (expr, precedence, flags) { var result, fragment; result = ['class']; if (expr.id) { result = join(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT)); } if (expr.superClass) { fragment = join('extends', this.generateExpression(expr.superClass, Precedence.Unary, E_TTT)); result = join(result, fragment); } result.push(space); result.push(this.generateStatement(expr.body, S_TFFT)); return result; }, MethodDefinition: function (expr, precedence, flags) { var result, fragment; if (expr['static']) { result = ['static' + space]; } else { result = []; } if (expr.kind === 'get' || expr.kind === 'set') { fragment = [ join(expr.kind, this.generatePropertyKey(expr.key, expr.computed)), this.generateFunctionBody(expr.value) ]; } else { fragment = [ generateMethodPrefix(expr), this.generatePropertyKey(expr.key, expr.computed), this.generateFunctionBody(expr.value) ]; } return join(result, fragment); }, Property: function (expr, precedence, flags) { if (expr.kind === 'get' || expr.kind === 'set') { return [ expr.kind, noEmptySpace(), this.generatePropertyKey(expr.key, expr.computed), this.generateFunctionBody(expr.value) ]; } if (expr.shorthand) { if (expr.value.type === "AssignmentPattern") { return this.AssignmentPattern(expr.value, Precedence.Sequence, E_TTT); } return this.generatePropertyKey(expr.key, expr.computed); } if (expr.method) { return [ generateMethodPrefix(expr), this.generatePropertyKey(expr.key, expr.computed), this.generateFunctionBody(expr.value) ]; } return [ this.generatePropertyKey(expr.key, expr.computed), ':' + space, this.generateExpression(expr.value, Precedence.Assignment, E_TTT) ]; }, ObjectExpression: function (expr, precedence, flags) { var multiline, result, fragment, that = this; if (!expr.properties.length) { return '{}'; } multiline = expr.properties.length > 1; withIndent(function () { fragment = that.generateExpression(expr.properties[0], Precedence.Sequence, E_TTT); }); if (!multiline) { // issues 4 // Do not transform from // dejavu.Class.declare({ // method2: function () {} // }); // to // dejavu.Class.declare({method2: function () { // }}); if (!hasLineTerminator(toSourceNodeWhenNeeded(fragment).toString())) { return [ '{', space, fragment, space, '}' ]; } } withIndent(function (indent) { var i, iz; result = [ '{', newline, indent, fragment ]; if (multiline) { result.push(',' + newline); for (i = 1, iz = expr.properties.length; i < iz; ++i) { result.push(indent); result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT)); if (i + 1 < iz) { result.push(',' + newline); } } } }); if (!endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(base); result.push('}'); return result; }, AssignmentPattern: function(expr, precedence, flags) { return this.generateAssignment(expr.left, expr.right, '=', precedence, flags); }, ObjectPattern: function (expr, precedence, flags) { var result, i, iz, multiline, property, that = this; if (!expr.properties.length) { return '{}'; } multiline = false; if (expr.properties.length === 1) { property = expr.properties[0]; if (property.value.type !== Syntax.Identifier) { multiline = true; } } else { for (i = 0, iz = expr.properties.length; i < iz; ++i) { property = expr.properties[i]; if (!property.shorthand) { multiline = true; break; } } } result = ['{', multiline ? newline : '' ]; withIndent(function (indent) { var i, iz; for (i = 0, iz = expr.properties.length; i < iz; ++i) { result.push(multiline ? indent : ''); result.push(that.generateExpression(expr.properties[i], Precedence.Sequence, E_TTT)); if (i + 1 < iz) { result.push(',' + (multiline ? newline : space)); } } }); if (multiline && !endsWithLineTerminator(toSourceNodeWhenNeeded(result).toString())) { result.push(newline); } result.push(multiline ? base : ''); result.push('}'); return result; }, ThisExpression: function (expr, precedence, flags) { return 'this'; }, Super: function (expr, precedence, flags) { return 'super'; }, Identifier: function (expr, precedence, flags) { return generateIdentifier(expr); }, ImportDefaultSpecifier: function (expr, precedence, flags) { return generateIdentifier(expr.id || expr.local); }, ImportNamespaceSpecifier: function (expr, precedence, flags) { var result = ['*']; var id = expr.id || expr.local; if (id) { result.push(space + 'as' + noEmptySpace() + generateIdentifier(id)); } return result; }, ImportSpecifier: function (expr, precedence, flags) { var imported = expr.imported; var result = [ imported.name ]; var local = expr.local; if (local && local.name !== imported.name) { result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(local)); } return result; }, ExportSpecifier: function (expr, precedence, flags) { var local = expr.local; var result = [ local.name ]; var exported = expr.exported; if (exported && exported.name !== local.name) { result.push(noEmptySpace() + 'as' + noEmptySpace() + generateIdentifier(exported)); } return result; }, Literal: function (expr, precedence, flags) { var raw; if (expr.hasOwnProperty('raw') && parse && extra.raw) { try { raw = parse(expr.raw).body[0].expression; if (raw.type === Syntax.Literal) { if (raw.value === expr.value) { return expr.raw; } } } catch (e) { // not use raw property } } if (expr.regex) { return '/' + expr.regex.pattern + '/' + expr.regex.flags; } if (expr.value === null) { return 'null'; } if (typeof expr.value === 'string') { return escapeString(expr.value); } if (typeof expr.value === 'number') { return generateNumber(expr.value); } if (typeof expr.value === 'boolean') { return expr.value ? 'true' : 'false'; } return generateRegExp(expr.value); }, GeneratorExpression: function (expr, precedence, flags) { return this.ComprehensionExpression(expr, precedence, flags); }, ComprehensionExpression: function (expr, precedence, flags) { // GeneratorExpression should be parenthesized with (...), ComprehensionExpression with [...] // Due to https://bugzilla.mozilla.org/show_bug.cgi?id=883468 position of expr.body can differ in Spidermonkey and ES6 var result, i, iz, fragment, that = this; result = (expr.type === Syntax.GeneratorExpression) ? ['('] : ['[']; if (extra.moz.comprehensionExpressionStartsWithAssignment) { fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT); result.push(fragment); } if (expr.blocks) { withIndent(function () { for (i = 0, iz = expr.blocks.length; i < iz; ++i) { fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT); if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) { result = join(result, fragment); } else { result.push(fragment); } } }); } if (expr.filter) { result = join(result, 'if' + space); fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT); result = join(result, [ '(', fragment, ')' ]); } if (!extra.moz.comprehensionExpressionStartsWithAssignment) { fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT); result = join(result, fragment); } result.push((expr.type === Syntax.GeneratorExpression) ? ')' : ']'); return result; }, ComprehensionBlock: function (expr, precedence, flags) { var fragment; if (expr.left.type === Syntax.VariableDeclaration) { fragment = [ expr.left.kind, noEmptySpace(), this.generateStatement(expr.left.declarations[0], S_FFFF) ]; } else { fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT); } fragment = join(fragment, expr.of ? 'of' : 'in'); fragment = join(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT)); return [ 'for' + space + '(', fragment, ')' ]; }, SpreadElement: function (expr, precedence, flags) { return [ '...', this.generateExpression(expr.argument, Precedence.Assignment, E_TTT) ]; }, TaggedTemplateExpression: function (expr, precedence, flags) { var itemFlags = E_TTF; if (!(flags & F_ALLOW_CALL)) { itemFlags = E_TFF; } var result = [ this.generateExpression(expr.tag, Precedence.Call, itemFlags), this.generateExpression(expr.quasi, Precedence.Primary, E_FFT) ]; return parenthesize(result, Precedence.TaggedTemplate, precedence); }, TemplateElement: function (expr, precedence, flags) { // Don't use "cooked". Since tagged template can use raw template // representation. So if we do so, it breaks the script semantics. return expr.value.raw; }, TemplateLiteral: function (expr, precedence, flags) { var result, i, iz; result = [ '`' ]; for (i = 0, iz = expr.quasis.length; i < iz; ++i) { result.push(this.generateExpression(expr.quasis[i], Precedence.Primary, E_TTT)); if (i + 1 < iz) { result.push('${' + space); result.push(this.generateExpression(expr.expressions[i], Precedence.Sequence, E_TTT)); result.push(space + '}'); } } result.push('`'); return result; }, ModuleSpecifier: function (expr, precedence, flags) { return this.Literal(expr, precedence, flags); }, ImportExpression: function(expr, precedence, flag) { return parenthesize([ 'import(', this.generateExpression(expr.source, Precedence.Assignment, E_TTT), ')' ], Precedence.Call, precedence); }, }; merge(CodeGenerator.prototype, CodeGenerator.Expression); CodeGenerator.prototype.generateExpression = function (expr, precedence, flags) { var result, type; type = expr.type || Syntax.Property; if (extra.verbatim && expr.hasOwnProperty(extra.verbatim)) { return generateVerbatim(expr, precedence); } result = this[type](expr, precedence, flags); if (extra.comment) { result = addComments(expr, result); } return toSourceNodeWhenNeeded(result, expr); }; CodeGenerator.prototype.generateStatement = function (stmt, flags) { var result, fragment; result = this[stmt.type](stmt, flags); // Attach comments if (extra.comment) { result = addComments(stmt, result); } fragment = toSourceNodeWhenNeeded(result).toString(); if (stmt.type === Syntax.Program && !safeConcatenation && newline === '' && fragment.charAt(fragment.length - 1) === '\n') { result = sourceMap$1 ? toSourceNodeWhenNeeded(result).replaceRight(/\s+$/, '') : fragment.replace(/\s+$/, ''); } return toSourceNodeWhenNeeded(result, stmt); }; function generateInternal(node) { var codegen; codegen = new CodeGenerator(); if (isStatement(node)) { return codegen.generateStatement(node, S_TFFF); } if (isExpression(node)) { return codegen.generateExpression(node, Precedence.Sequence, E_TTT); } throw new Error('Unknown node type: ' + node.type); } function generate(node, options) { var defaultOptions = getDefaultOptions(), result, pair; if (options != null) { // Obsolete options // // `options.indent` // `options.base` // // Instead of them, we can use `option.format.indent`. if (typeof options.indent === 'string') { defaultOptions.format.indent.style = options.indent; } if (typeof options.base === 'number') { defaultOptions.format.indent.base = options.base; } options = updateDeeply(defaultOptions, options); indent = options.format.indent.style; if (typeof options.base === 'string') { base = options.base; } else { base = stringRepeat(indent, options.format.indent.base); } } else { options = defaultOptions; indent = options.format.indent.style; base = stringRepeat(indent, options.format.indent.base); } json = options.format.json; renumber = options.format.renumber; hexadecimal = json ? false : options.format.hexadecimal; quotes = json ? 'double' : options.format.quotes; escapeless = options.format.escapeless; newline = options.format.newline; space = options.format.space; if (options.format.compact) { newline = space = indent = base = ''; } parentheses = options.format.parentheses; semicolons = options.format.semicolons; safeConcatenation = options.format.safeConcatenation; directive = options.directive; parse = json ? null : options.parse; sourceMap$1 = options.sourceMap; sourceCode = options.sourceCode; preserveBlankLines = options.format.preserveBlankLines && sourceCode !== null; extra = options; if (sourceMap$1) { if (!exports.browser) { // We assume environment is node.js // And prevent from including source-map by browserify SourceNode = sourceMap.SourceNode; } else { SourceNode = commonjsGlobal.sourceMap.SourceNode; } } result = generateInternal(node); if (!sourceMap$1) { pair = {code: result.toString(), map: null}; return options.sourceMapWithCode ? pair : pair.code; } pair = result.toStringWithSourceMap({ file: options.file, sourceRoot: options.sourceMapRoot }); if (options.sourceContent) { pair.map.setSourceContent(options.sourceMap, options.sourceContent); } if (options.sourceMapWithCode) { return pair; } return pair.map.toString(); } FORMAT_MINIFY = { indent: { style: '', base: 0 }, renumber: true, hexadecimal: true, quotes: 'auto', escapeless: true, compact: true, parentheses: false, semicolons: false }; FORMAT_DEFAULTS = getDefaultOptions().format; exports.version = require$$3.version; exports.generate = generate; exports.attachComments = estraverse$1.attachComments; exports.Precedence = updateDeeply({}, Precedence); exports.browser = false; exports.FORMAT_MINIFY = FORMAT_MINIFY; exports.FORMAT_DEFAULTS = FORMAT_DEFAULTS; }()); /* vim: set sw=4 ts=4 et tw=80 : */ }); var esprima = createCommonjsModule(function (module, exports) { (function webpackUniversalModuleDefinition(root, factory) { /* istanbul ignore next */ if('object' === 'object' && 'object' === 'object') module.exports = factory(); else if(typeof undefined === 'function' && undefined.amd) undefined([], factory); /* istanbul ignore next */ else if('object' === 'object') exports["esprima"] = factory(); else root["esprima"] = factory(); })(commonjsGlobal, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /* istanbul ignore if */ /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ function(module, exports, __webpack_require__) { "use strict"; /* Copyright JS Foundation and other contributors, https://js.foundation/ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ Object.defineProperty(exports, "__esModule", { value: true }); var comment_handler_1 = __webpack_require__(1); var jsx_parser_1 = __webpack_require__(3); var parser_1 = __webpack_require__(8); var tokenizer_1 = __webpack_require__(15); function parse(code, options, delegate) { var commentHandler = null; var proxyDelegate = function (node, metadata) { if (delegate) { delegate(node, metadata); } if (commentHandler) { commentHandler.visit(node, metadata); } }; var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null; var collectComment = false; if (options) { collectComment = (typeof options.comment === 'boolean' && options.comment); var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment); if (collectComment || attachComment) { commentHandler = new comment_handler_1.CommentHandler(); commentHandler.attach = attachComment; options.comment = true; parserDelegate = proxyDelegate; } } var isModule = false; if (options && typeof options.sourceType === 'string') { isModule = (options.sourceType === 'module'); } var parser; if (options && typeof options.jsx === 'boolean' && options.jsx) { parser = new jsx_parser_1.JSXParser(code, options, parserDelegate); } else { parser = new parser_1.Parser(code, options, parserDelegate); } var program = isModule ? parser.parseModule() : parser.parseScript(); var ast = program; if (collectComment && commentHandler) { ast.comments = commentHandler.comments; } if (parser.config.tokens) { ast.tokens = parser.tokens; } if (parser.config.tolerant) { ast.errors = parser.errorHandler.errors; } return ast; } exports.parse = parse; function parseModule(code, options, delegate) { var parsingOptions = options || {}; parsingOptions.sourceType = 'module'; return parse(code, parsingOptions, delegate); } exports.parseModule = parseModule; function parseScript(code, options, delegate) { var parsingOptions = options || {}; parsingOptions.sourceType = 'script'; return parse(code, parsingOptions, delegate); } exports.parseScript = parseScript; function tokenize(code, options, delegate) { var tokenizer = new tokenizer_1.Tokenizer(code, options); var tokens; tokens = []; try { while (true) { var token = tokenizer.getNextToken(); if (!token) { break; } if (delegate) { token = delegate(token); } tokens.push(token); } } catch (e) { tokenizer.errorHandler.tolerate(e); } if (tokenizer.errorHandler.tolerant) { tokens.errors = tokenizer.errors(); } return tokens; } exports.tokenize = tokenize; var syntax_1 = __webpack_require__(2); exports.Syntax = syntax_1.Syntax; // Sync with *.json manifests. exports.version = '4.0.1'; /***/ }, /* 1 */ /***/ function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var syntax_1 = __webpack_require__(2); var CommentHandler = (function () { function CommentHandler() { this.attach = false; this.comments = []; this.stack = []; this.leading = []; this.trailing = []; } CommentHandler.prototype.insertInnerComments = function (node, metadata) { // innnerComments for properties empty block // `function a() {/** comments **\/}` if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) { var innerComments = []; for (var i = this.leading.length - 1; i >= 0; --i) { var entry = this.leading[i]; if (metadata.end.offset >= entry.start) { innerComments.unshift(entry.comment); this.leading.splice(i, 1); this.trailing.splice(i, 1); } } if (innerComments.length) { node.innerComments = innerComments; } } }; CommentHandler.prototype.findTrailingComments = function (metadata) { var trailingComments = []; if (this.trailing.length > 0) { for (var i = this.trailing.length - 1; i >= 0; --i) { var entry_1 = this.trailing[i]; if (entry_1.start >= metadata.end.offset) { trailingComments.unshift(entry_1.comment); } } this.trailing.length = 0; return trailingComments; } var entry = this.stack[this.stack.length - 1]; if (entry && entry.node.trailingComments) { var firstComment = entry.node.trailingComments[0]; if (firstComment && firstComment.range[0] >= metadata.end.offset) { trailingComments = entry.node.trailingComments; delete entry.node.trailingComments; } } return trailingComments; }; CommentHandler.prototype.findLeadingComments = function (metadata) { var leadingComments = []; var target; while (this.stack.length > 0) { var entry = this.stack[this.stack.length - 1]; if (entry && entry.start >= metadata.start.offset) { target = entry.node; this.stack.pop(); } else { break; } } if (target) { var count = target.leadingComments ? target.leadingComments.length : 0; for (var i = count - 1; i >= 0; --i) { var comment = target.leadingComments[i]; if (comment.range[1] <= metadata.start.offset) { leadingComments.unshift(comment); target.leadingComments.splice(i, 1); } } if (target.leadingComments && target.leadingComments.length === 0) { delete target.leadingComments; } return leadingComments; } for (var i = this.leading.length - 1; i >= 0; --i) { var entry = this.leading[i]; if (entry.start <= metadata.start.offset) { leadingComments.unshift(entry.comment); this.leading.splice(i, 1); } } return leadingComments; }; CommentHandler.prototype.visitNode = function (node, metadata) { if (node.type === syntax_1.Syntax.Program && node.body.length > 0) { return; } this.insertInnerComments(node, metadata); var trailingComments = this.findTrailingComments(metadata); var leadingComments = this.findLeadingComments(metadata); if (leadingComments.length > 0) { node.leadingComments = leadingComments; } if (trailingComments.length > 0) { node.trailingComments = trailingComments; } this.stack.push({ node: node, start: metadata.start.offset }); }; CommentHandler.prototype.visitComment = function (node, metadata) { var type = (node.type[0] === 'L') ? 'Line' : 'Block'; var comment = { type: type, value: node.value }; if (node.range) { comment.range = node.range; } if (node.loc) { comment.loc = node.loc; } this.comments.push(comment); if (this.attach) { var entry = { comment: { type: type, value: node.value, range: [metadata.start.offset, metadata.end.offset] }, start: metadata.start.offset }; if (node.loc) { entry.comment.loc = node.loc; } node.type = type; this.leading.push(entry); this.trailing.push(entry); } }; CommentHandler.prototype.visit = function (node, metadata) { if (node.type === 'LineComment') { this.visitComment(node, metadata); } else if (node.type === 'BlockComment') { this.visitComment(node, metadata); } else if (this.attach) { this.visitNode(node, metadata); } }; return CommentHandler; }()); exports.CommentHandler = CommentHandler; /***/ }, /* 2 */ /***/ function(module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Syntax = { AssignmentExpression: 'AssignmentExpression', AssignmentPattern: 'AssignmentPattern', ArrayExpression: 'ArrayExpression', ArrayPattern: 'ArrayPattern', ArrowFunctionExpression: 'ArrowFunctionExpression', AwaitExpression: 'AwaitExpression', BlockStatement: 'BlockStatement', BinaryExpression: 'BinaryExpression', BreakStatement: 'BreakStatement', CallExpression: 'CallExpression', CatchClause: 'CatchClause', ClassBody: 'ClassBody', ClassDeclaration: 'ClassDeclaration', ClassExpression: 'ClassExpression', ConditionalExpression: 'ConditionalExpression', ContinueStatement: 'ContinueStatement', DoWhileStatement: 'DoWhileStatement', DebuggerStatement: 'DebuggerStatement', EmptyStatement: 'EmptyStatement', ExportAllDeclaration: 'ExportAllDeclaration', ExportDefaultDeclaration: 'ExportDefaultDeclaration', ExportNamedDeclaration: 'ExportNamedDeclaration', ExportSpecifier: 'ExportSpecifier', ExpressionStatement: 'ExpressionStatement', ForStatement: 'ForStatement', ForOfStatement: 'ForOfStatement', ForInStatement: 'ForInStatement', FunctionDeclaration: 'FunctionDeclaration', FunctionExpression: 'FunctionExpression', Identifier: 'Identifier', IfStatement: 'IfStatement', ImportDeclaration: 'ImportDeclaration', ImportDefaultSpecifier: 'ImportDefaultSpecifier', ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', ImportSpecifier: 'ImportSpecifier', Literal: 'Literal', LabeledStatement: 'LabeledStatement', LogicalExpression: 'LogicalExpression', MemberExpression: 'MemberExpression', MetaProperty: 'MetaProperty', MethodDefinition: 'MethodDefinition', NewExpression: 'NewExpression', ObjectExpression: 'ObjectExpression', ObjectPattern: 'ObjectPattern', Program: 'Program', Property: 'Property', RestElement: 'RestElement', ReturnStatement: 'ReturnStatement', SequenceExpression: 'SequenceExpression', SpreadElement: 'SpreadElement', Super: 'Super', SwitchCase: 'SwitchCase', SwitchStatement: 'SwitchStatement', TaggedTemplateExpression: 'TaggedTemplateExpression', TemplateElement: 'TemplateElement', TemplateLiteral: 'TemplateLiteral', ThisExpression: 'ThisExpression', ThrowStatement: 'ThrowStatement', TryStatement: 'TryStatement', UnaryExpression: 'UnaryExpression', UpdateExpression: 'UpdateExpression', VariableDeclaration: 'VariableDeclaration', VariableDeclarator: 'VariableDeclarator', WhileStatement: 'WhileStatement', WithStatement: 'WithStatement', YieldExpression: 'YieldExpression' }; /***/ }, /* 3 */ /***/ function(module, exports, __webpack_require__) { "use strict"; /* istanbul ignore next */ var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); Object.defineProperty(exports, "__esModule", { value: true }); var character_1 = __webpack_require__(4); var JSXNode = __webpack_require__(5); var jsx_syntax_1 = __webpack_require__(6); var Node = __webpack_require__(7); var parser_1 = __webpack_require__(8); var token_1 = __webpack_require__(13); var xhtml_entities_1 = __webpack_require__(14); token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier'; token_1.TokenName[101 /* Text */] = 'JSXText'; // Fully qualified element name, e.g. returns "svg:path" function getQualifiedElementName(elementName) { var qualifiedName; switch (elementName.type) { case jsx_syntax_1.JSXSyntax.JSXIdentifier: var id = elementName; qualifiedName = id.name; break; case jsx_syntax_1.JSXSyntax.JSXNamespacedName: var ns = elementName; qualifiedName = getQualifiedElementName(ns.namespace) + ':' + getQualifiedElementName(ns.name); break; case jsx_syntax_1.JSXSyntax.JSXMemberExpression: var expr = elementName; qualifiedName = getQualifiedElementName(expr.object) + '.' + getQualifiedElementName(expr.property); break; /* istanbul ignore next */ default: break; } return qualifiedName; } var JSXParser = (function (_super) { __extends(JSXParser, _super); function JSXParser(code, options, delegate) { return _super.call(this, code, options, delegate) || this; } JSXParser.prototype.parsePrimaryExpression = function () { return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this); }; JSXParser.prototype.startJSX = function () { // Unwind the scanner before the lookahead token. this.scanner.index = this.startMarker.index; this.scanner.lineNumber = this.startMarker.line; this.scanner.lineStart = this.startMarker.index - this.startMarker.column; }; JSXParser.prototype.finishJSX = function () { // Prime the next lookahead. this.nextToken(); }; JSXParser.prototype.reenterJSX = function () { this.startJSX(); this.expectJSX('}'); // Pop the closing '}' added from the lookahead. if (this.config.tokens) { this.tokens.pop(); } }; JSXParser.prototype.createJSXNode = function () { this.collectComments(); return { index: this.scanner.index, line: this.scanner.lineNumber, column: this.scanner.index - this.scanner.lineStart }; }; JSXParser.prototype.createJSXChildNode = function () { return { index: this.scanner.index, line: this.scanner.lineNumber, column: this.scanner.index - this.scanner.lineStart }; }; JSXParser.prototype.scanXHTMLEntity = function (quote) { var result = '&'; var valid = true; var terminated = false; var numeric = false; var hex = false; while (!this.scanner.eof() && valid && !terminated) { var ch = this.scanner.source[this.scanner.index]; if (ch === quote) { break; } terminated = (ch === ';'); result += ch; ++this.scanner.index; if (!terminated) { switch (result.length) { case 2: // e.g. '{' numeric = (ch === '#'); break; case 3: if (numeric) { // e.g. 'A' hex = (ch === 'x'); valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0)); numeric = numeric && !hex; } break; default: valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0))); valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0))); break; } } } if (valid && terminated && result.length > 2) { // e.g. 'A' becomes just '#x41' var str = result.substr(1, result.length - 2); if (numeric && str.length > 1) { result = String.fromCharCode(parseInt(str.substr(1), 10)); } else if (hex && str.length > 2) { result = String.fromCharCode(parseInt('0' + str.substr(1), 16)); } else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) { result = xhtml_entities_1.XHTMLEntities[str]; } } return result; }; // Scan the next JSX token. This replaces Scanner#lex when in JSX mode. JSXParser.prototype.lexJSX = function () { var cp = this.scanner.source.charCodeAt(this.scanner.index); // < > / : = { } if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) { var value = this.scanner.source[this.scanner.index++]; return { type: 7 /* Punctuator */, value: value, lineNumber: this.scanner.lineNumber, lineStart: this.scanner.lineStart, start: this.scanner.index - 1, end: this.scanner.index }; } // " ' if (cp === 34 || cp === 39) { var start = this.scanner.index; var quote = this.scanner.source[this.scanner.index++]; var str = ''; while (!this.scanner.eof()) { var ch = this.scanner.source[this.scanner.index++]; if (ch === quote) { break; } else if (ch === '&') { str += this.scanXHTMLEntity(quote); } else { str += ch; } } return { type: 8 /* StringLiteral */, value: str, lineNumber: this.scanner.lineNumber, lineStart: this.scanner.lineStart, start: start, end: this.scanner.index }; } // ... or . if (cp === 46) { var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1); var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2); var value = (n1 === 46 && n2 === 46) ? '...' : '.'; var start = this.scanner.index; this.scanner.index += value.length; return { type: 7 /* Punctuator */, value: value, lineNumber: this.scanner.lineNumber, lineStart: this.scanner.lineStart, start: start, end: this.scanner.index }; } // ` if (cp === 96) { // Only placeholder, since it will be rescanned as a real assignment expression. return { type: 10 /* Template */, value: '', lineNumber: this.scanner.lineNumber, lineStart: this.scanner.lineStart, start: this.scanner.index, end: this.scanner.index }; } // Identifer can not contain backslash (char code 92). if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) { var start = this.scanner.index; ++this.scanner.index; while (!this.scanner.eof()) { var ch = this.scanner.source.charCodeAt(this.scanner.index); if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) { ++this.scanner.index; } else if (ch === 45) { // Hyphen (char code 45) can be part of an identifier. ++this.scanner.index; } else { break; } } var id = this.scanner.source.slice(start, this.scanner.index); return { type: 100 /* Identifier */, value: id, lineNumber: this.scanner.lineNumber, lineStart: this.scanner.lineStart, start: start, end: this.scanner.index }; } return this.scanner.lex(); }; JSXParser.prototype.nextJSXToken = function () { this.collectComments(); this.startMarker.index = this.scanner.index; this.startMarker.line = this.scanner.lineNumber; this.startMarker.column = this.scanner.index - this.scanner.lineStart; var token = this.lexJSX(); this.lastMarker.index = this.scanner.index; this.lastMarker.line = this.scanner.lineNumber; this.lastMarker.column = this.scanner.index - this.scanner.lineStart; if (this.config.tokens) { this.tokens.push(this.convertToken(token)); } return token; }; JSXParser.prototype.nextJSXText = function () { this.startMarker.index = this.scanner.index; this.startMarker.line = this.scanner.lineNumber; this.startMarker.column = this.scanner.index - this.scanner.lineStart; var start = this.scanner.index; var text = ''; while (!this.scanner.eof()) { var ch = this.scanner.source[this.scanner.index]; if (ch === '{' || ch === '<') { break; } ++this.scanner.index; text += ch; if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { ++this.scanner.lineNumber; if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') { ++this.scanner.index; } this.scanner.lineStart = this.scanner.index; } } this.lastMarker.index = this.scanner.index; this.lastMarker.line = this.scanner.lineNumber; this.lastMarker.column = this.scanner.index - this.scanner.lineStart; var token = { type: 101 /* Text */, value: text, lineNumber: this.scanner.lineNumber, lineStart: this.scanner.lineStart, start: start, end: this.scanner.index }; if ((text.length > 0) && this.config.tokens) { this.tokens.push(this.convertToken(token)); } return token; }; JSXParser.prototype.peekJSXToken = function () { var state = this.scanner.saveState(); this.scanner.scanComments(); var next = this.lexJSX(); this.scanner.restoreState(state); return next; }; // Expect the next JSX token to match the specified punctuator. // If not, an exception will be thrown. JSXParser.prototype.expectJSX = function (value) { var token = this.nextJSXToken(); if (token.type !== 7 /* Punctuator */ || token.value !== value) { this.throwUnexpectedToken(token); } }; // Return true if the next JSX token matches the specified punctuator. JSXParser.prototype.matchJSX = function (value) { var next = this.peekJSXToken(); return next.type === 7 /* Punctuator */ && next.value === value; }; JSXParser.prototype.parseJSXIdentifier = function () { var node = this.createJSXNode(); var token = this.nextJSXToken(); if (token.type !== 100 /* Identifier */) { this.throwUnexpectedToken(token); } return this.finalize(node, new JSXNode.JSXIdentifier(token.value)); }; JSXParser.prototype.parseJSXElementName = function () { var node = this.createJSXNode(); var elementName = this.parseJSXIdentifier(); if (this.matchJSX(':')) { var namespace = elementName; this.expectJSX(':'); var name_1 = this.parseJSXIdentifier(); elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1)); } else if (this.matchJSX('.')) { while (this.matchJSX('.')) { var object = elementName; this.expectJSX('.'); var property = this.parseJSXIdentifier(); elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property)); } } return elementName; }; JSXParser.prototype.parseJSXAttributeName = function () { var node = this.createJSXNode(); var attributeName; var identifier = this.parseJSXIdentifier(); if (this.matchJSX(':')) { var namespace = identifier; this.expectJSX(':'); var name_2 = this.parseJSXIdentifier(); attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2)); } else { attributeName = identifier; } return attributeName; }; JSXParser.prototype.parseJSXStringLiteralAttribute = function () { var node = this.createJSXNode(); var token = this.nextJSXToken(); if (token.type !== 8 /* StringLiteral */) { this.throwUnexpectedToken(token); } var raw = this.getTokenRaw(token); return this.finalize(node, new Node.Literal(token.value, raw)); }; JSXParser.prototype.parseJSXExpressionAttribute = function () { var node = this.createJSXNode(); this.expectJSX('{'); this.finishJSX(); if (this.match('}')) { this.tolerateError('JSX attributes must only be assigned a non-empty expression'); } var expression = this.parseAssignmentExpression(); this.reenterJSX(); return this.finalize(node, new JSXNode.JSXExpressionContainer(expression)); }; JSXParser.prototype.parseJSXAttributeValue = function () { return this.matchJSX('{') ? this.parseJSXExpressionAttribute() : this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute(); }; JSXParser.prototype.parseJSXNameValueAttribute = function () { var node = this.createJSXNode(); var name = this.parseJSXAttributeName(); var value = null; if (this.matchJSX('=')) { this.expectJSX('='); value = this.parseJSXAttributeValue(); } return this.finalize(node, new JSXNode.JSXAttribute(name, value)); }; JSXParser.prototype.parseJSXSpreadAttribute = function () { var node = this.createJSXNode(); this.expectJSX('{'); this.expectJSX('...'); this.finishJSX(); var argument = this.parseAssignmentExpression(); this.reenterJSX(); return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument)); }; JSXParser.prototype.parseJSXAttributes = function () { var attributes = []; while (!this.matchJSX('/') && !this.matchJSX('>')) { var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() : this.parseJSXNameValueAttribute(); attributes.push(attribute); } return attributes; }; JSXParser.prototype.parseJSXOpeningElement = function () { var node = this.createJSXNode(); this.expectJSX('<'); var name = this.parseJSXElementName(); var attributes = this.parseJSXAttributes(); var selfClosing = this.matchJSX('/'); if (selfClosing) { this.expectJSX('/'); } this.expectJSX('>'); return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes)); }; JSXParser.prototype.parseJSXBoundaryElement = function () { var node = this.createJSXNode(); this.expectJSX('<'); if (this.matchJSX('/')) { this.expectJSX('/'); var name_3 = this.parseJSXElementName(); this.expectJSX('>'); return this.finalize(node, new JSXNode.JSXClosingElement(name_3)); } var name = this.parseJSXElementName(); var attributes = this.parseJSXAttributes(); var selfClosing = this.matchJSX('/'); if (selfClosing) { this.expectJSX('/'); } this.expectJSX('>'); return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes)); }; JSXParser.prototype.parseJSXEmptyExpression = function () { var node = this.createJSXChildNode(); this.collectComments(); this.lastMarker.index = this.scanner.index; this.lastMarker.line = this.scanner.lineNumber; this.lastMarker.column = this.scanner.index - this.scanner.lineStart; return this.finalize(node, new JSXNode.JSXEmptyExpression()); }; JSXParser.prototype.parseJSXExpressionContainer = function () { var node = this.createJSXNode(); this.expectJSX('{'); var expression; if (this.matchJSX('}')) { expression = this.parseJSXEmptyExpression(); this.expectJSX('}'); } else { this.finishJSX(); expression = this.parseAssignmentExpression(); this.reenterJSX(); } return this.finalize(node, new JSXNode.JSXExpressionContainer(expression)); }; JSXParser.prototype.parseJSXChildren = function () { var children = []; while (!this.scanner.eof()) { var node = this.createJSXChildNode(); var token = this.nextJSXText(); if (token.start < token.end) { var raw = this.getTokenRaw(token); var child = this.finalize(node, new JSXNode.JSXText(token.value, raw)); children.push(child); } if (this.scanner.source[this.scanner.index] === '{') { var container = this.parseJSXExpressionContainer(); children.push(container); } else { break; } } return children; }; JSXParser.prototype.parseComplexJSXElement = function (el) { var stack = []; while (!this.scanner.eof()) { el.children = el.children.concat(this.parseJSXChildren()); var node = this.createJSXChildNode(); var element = this.parseJSXBoundaryElement(); if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) { var opening = element; if (opening.selfClosing) { var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null)); el.children.push(child); } else { stack.push(el); el = { node: node, opening: opening, closing: null, children: [] }; } } if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) { el.closing = element; var open_1 = getQualifiedElementName(el.opening.name); var close_1 = getQualifiedElementName(el.closing.name); if (open_1 !== close_1) { this.tolerateError('Expected corresponding JSX closing tag for %0', open_1); } if (stack.length > 0) { var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing)); el = stack[stack.length - 1]; el.children.push(child); stack.pop(); } else { break; } } } return el; }; JSXParser.prototype.parseJSXElement = function () { var node = this.createJSXNode(); var opening = this.parseJSXOpeningElement(); var children = []; var closing = null; if (!opening.selfClosing) { var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children }); children = el.children; closing = el.closing; } return this.finalize(node, new JSXNode.JSXElement(opening, children, closing)); }; JSXParser.prototype.parseJSXRoot = function () { // Pop the opening '<' added from the lookahead. if (this.config.tokens) { this.tokens.pop(); } this.startJSX(); var element = this.parseJSXElement(); this.finishJSX(); return element; }; JSXParser.prototype.isStartOfExpression = function () { return _super.prototype.isStartOfExpression.call(this) || this.match('<'); }; return JSXParser; }(parser_1.Parser)); exports.JSXParser = JSXParser; /***/ }, /* 4 */ /***/ function(module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // See also tools/generate-unicode-regex.js. var Regex = { // Unicode v8.0.0 NonAsciiIdentifierStart: NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, // Unicode v8.0.0 NonAsciiIdentifierPart: NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ }; exports.Character = { /* tslint:disable:no-bitwise */ fromCodePoint: function (cp) { return (cp < 0x10000) ? String.fromCharCode(cp) : String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) + String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023)); }, // https://tc39.github.io/ecma262/#sec-white-space isWhiteSpace: function (cp) { return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) || (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0); }, // https://tc39.github.io/ecma262/#sec-line-terminators isLineTerminator: function (cp) { return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029); }, // https://tc39.github.io/ecma262/#sec-names-and-keywords isIdentifierStart: function (cp) { return (cp === 0x24) || (cp === 0x5F) || (cp >= 0x41 && cp <= 0x5A) || (cp >= 0x61 && cp <= 0x7A) || (cp === 0x5C) || ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp))); }, isIdentifierPart: function (cp) { return (cp === 0x24) || (cp === 0x5F) || (cp >= 0x41 && cp <= 0x5A) || (cp >= 0x61 && cp <= 0x7A) || (cp >= 0x30 && cp <= 0x39) || (cp === 0x5C) || ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp))); }, // https://tc39.github.io/ecma262/#sec-literals-numeric-literals isDecimalDigit: function (cp) { return (cp >= 0x30 && cp <= 0x39); // 0..9 }, isHexDigit: function (cp) { return (cp >= 0x30 && cp <= 0x39) || (cp >= 0x41 && cp <= 0x46) || (cp >= 0x61 && cp <= 0x66); // a..f }, isOctalDigit: function (cp) { return (cp >= 0x30 && cp <= 0x37); // 0..7 } }; /***/ }, /* 5 */ /***/ function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var jsx_syntax_1 = __webpack_require__(6); /* tslint:disable:max-classes-per-file */ var JSXClosingElement = (function () { function JSXClosingElement(name) { this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement; this.name = name; } return JSXClosingElement; }()); exports.JSXClosingElement = JSXClosingElement; var JSXElement = (function () { function JSXElement(openingElement, children, closingElement) { this.type = jsx_syntax_1.JSXSyntax.JSXElement; this.openingElement = openingElement; this.children = children; this.closingElement = closingElement; } return JSXElement; }()); exports.JSXElement = JSXElement; var JSXEmptyExpression = (function () { function JSXEmptyExpression() { this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression; } return JSXEmptyExpression; }()); exports.JSXEmptyExpression = JSXEmptyExpression; var JSXExpressionContainer = (function () { function JSXExpressionContainer(expression) { this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer; this.expression = expression; } return JSXExpressionContainer; }()); exports.JSXExpressionContainer = JSXExpressionContainer; var JSXIdentifier = (function () { function JSXIdentifier(name) { this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier; this.name = name; } return JSXIdentifier; }()); exports.JSXIdentifier = JSXIdentifier; var JSXMemberExpression = (function () { function JSXMemberExpression(object, property) { this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression; this.object = object; this.property = property; } return JSXMemberExpression; }()); exports.JSXMemberExpression = JSXMemberExpression; var JSXAttribute = (function () { function JSXAttribute(name, value) { this.type = jsx_syntax_1.JSXSyntax.JSXAttribute; this.name = name; this.value = value; } return JSXAttribute; }()); exports.JSXAttribute = JSXAttribute; var JSXNamespacedName = (function () { function JSXNamespacedName(namespace, name) { this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName; this.namespace = namespace; this.name = name; } return JSXNamespacedName; }()); exports.JSXNamespacedName = JSXNamespacedName; var JSXOpeningElement = (function () { function JSXOpeningElement(name, selfClosing, attributes) { this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement; this.name = name; this.selfClosing = selfClosing; this.attributes = attributes; } return JSXOpeningElement; }()); exports.JSXOpeningElement = JSXOpeningElement; var JSXSpreadAttribute = (function () { function JSXSpreadAttribute(argument) { this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute; this.argument = argument; } return JSXSpreadAttribute; }()); exports.JSXSpreadAttribute = JSXSpreadAttribute; var JSXText = (function () { function JSXText(value, raw) { this.type = jsx_syntax_1.JSXSyntax.JSXText; this.value = value; this.raw = raw; } return JSXText; }()); exports.JSXText = JSXText; /***/ }, /* 6 */ /***/ function(module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.JSXSyntax = { JSXAttribute: 'JSXAttribute', JSXClosingElement: 'JSXClosingElement', JSXElement: 'JSXElement', JSXEmptyExpression: 'JSXEmptyExpression', JSXExpressionContainer: 'JSXExpressionContainer', JSXIdentifier: 'JSXIdentifier', JSXMemberExpression: 'JSXMemberExpression', JSXNamespacedName: 'JSXNamespacedName', JSXOpeningElement: 'JSXOpeningElement', JSXSpreadAttribute: 'JSXSpreadAttribute', JSXText: 'JSXText' }; /***/ }, /* 7 */ /***/ function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var syntax_1 = __webpack_require__(2); /* tslint:disable:max-classes-per-file */ var ArrayExpression = (function () { function ArrayExpression(elements) { this.type = syntax_1.Syntax.ArrayExpression; this.elements = elements; } return ArrayExpression; }()); exports.ArrayExpression = ArrayExpression; var ArrayPattern = (function () { function ArrayPattern(elements) { this.type = syntax_1.Syntax.ArrayPattern; this.elements = elements; } return ArrayPattern; }()); exports.ArrayPattern = ArrayPattern; var ArrowFunctionExpression = (function () { function ArrowFunctionExpression(params, body, expression) { this.type = syntax_1.Syntax.ArrowFunctionExpression; this.id = null; this.params = params; this.body = body; this.generator = false; this.expression = expression; this.async = false; } return ArrowFunctionExpression; }()); exports.ArrowFunctionExpression = ArrowFunctionExpression; var AssignmentExpression = (function () { function AssignmentExpression(operator, left, right) { this.type = syntax_1.Syntax.AssignmentExpression; this.operator = operator; this.left = left; this.right = right; } return AssignmentExpression; }()); exports.AssignmentExpression = AssignmentExpression; var AssignmentPattern = (function () { function AssignmentPattern(left, right) { this.type = syntax_1.Syntax.AssignmentPattern; this.left = left; this.right = right; } return AssignmentPattern; }()); exports.AssignmentPattern = AssignmentPattern; var AsyncArrowFunctionExpression = (function () { function AsyncArrowFunctionExpression(params, body, expression) { this.type = syntax_1.Syntax.ArrowFunctionExpression; this.id = null; this.params = params; this.body = body; this.generator = false; this.expression = expression; this.async = true; } return AsyncArrowFunctionExpression; }()); exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression; var AsyncFunctionDeclaration = (function () { function AsyncFunctionDeclaration(id, params, body) { this.type = syntax_1.Syntax.FunctionDeclaration; this.id = id; this.params = params; this.body = body; this.generator = false; this.expression = false; this.async = true; } return AsyncFunctionDeclaration; }()); exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration; var AsyncFunctionExpression = (function () { function AsyncFunctionExpression(id, params, body) { this.type = syntax_1.Syntax.FunctionExpression; this.id = id; this.params = params; this.body = body; this.generator = false; this.expression = false; this.async = true; } return AsyncFunctionExpression; }()); exports.AsyncFunctionExpression = AsyncFunctionExpression; var AwaitExpression = (function () { function AwaitExpression(argument) { this.type = syntax_1.Syntax.AwaitExpression; this.argument = argument; } return AwaitExpression; }()); exports.AwaitExpression = AwaitExpression; var BinaryExpression = (function () { function BinaryExpression(operator, left, right) { var logical = (operator === '||' || operator === '&&'); this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression; this.operator = operator; this.left = left; this.right = right; } return BinaryExpression; }()); exports.BinaryExpression = BinaryExpression; var BlockStatement = (function () { function BlockStatement(body) { this.type = syntax_1.Syntax.BlockStatement; this.body = body; } return BlockStatement; }()); exports.BlockStatement = BlockStatement; var BreakStatement = (function () { function BreakStatement(label) { this.type = syntax_1.Syntax.BreakStatement; this.label = label; } return BreakStatement; }()); exports.BreakStatement = BreakStatement; var CallExpression = (function () { function CallExpression(callee, args) { this.type = syntax_1.Syntax.CallExpression; this.callee = callee; this.arguments = args; } return CallExpression; }()); exports.CallExpression = CallExpression; var CatchClause = (function () { function CatchClause(param, body) { this.type = syntax_1.Syntax.CatchClause; this.param = param; this.body = body; } return CatchClause; }()); exports.CatchClause = CatchClause; var ClassBody = (function () { function ClassBody(body) { this.type = syntax_1.Syntax.ClassBody; this.body = body; } return ClassBody; }()); exports.ClassBody = ClassBody; var ClassDeclaration = (function () { function ClassDeclaration(id, superClass, body) { this.type = syntax_1.Syntax.ClassDeclaration; this.id = id; this.superClass = superClass; this.body = body; } return ClassDeclaration; }()); exports.ClassDeclaration = ClassDeclaration; var ClassExpression = (function () { function ClassExpression(id, superClass, body) { this.type = syntax_1.Syntax.ClassExpression; this.id = id; this.superClass = superClass; this.body = body; } return ClassExpression; }()); exports.ClassExpression = ClassExpression; var ComputedMemberExpression = (function () { function ComputedMemberExpression(object, property) { this.type = syntax_1.Syntax.MemberExpression; this.computed = true; this.object = object; this.property = property; } return ComputedMemberExpression; }()); exports.ComputedMemberExpression = ComputedMemberExpression; var ConditionalExpression = (function () { function ConditionalExpression(test, consequent, alternate) { this.type = syntax_1.Syntax.ConditionalExpression; this.test = test; this.consequent = consequent; this.alternate = alternate; } return ConditionalExpression; }()); exports.ConditionalExpression = ConditionalExpression; var ContinueStatement = (function () { function ContinueStatement(label) { this.type = syntax_1.Syntax.ContinueStatement; this.label = label; } return ContinueStatement; }()); exports.ContinueStatement = ContinueStatement; var DebuggerStatement = (function () { function DebuggerStatement() { this.type = syntax_1.Syntax.DebuggerStatement; } return DebuggerStatement; }()); exports.DebuggerStatement = DebuggerStatement; var Directive = (function () { function Directive(expression, directive) { this.type = syntax_1.Syntax.ExpressionStatement; this.expression = expression; this.directive = directive; } return Directive; }()); exports.Directive = Directive; var DoWhileStatement = (function () { function DoWhileStatement(body, test) { this.type = syntax_1.Syntax.DoWhileStatement; this.body = body; this.test = test; } return DoWhileStatement; }()); exports.DoWhileStatement = DoWhileStatement; var EmptyStatement = (function () { function EmptyStatement() { this.type = syntax_1.Syntax.EmptyStatement; } return EmptyStatement; }()); exports.EmptyStatement = EmptyStatement; var ExportAllDeclaration = (function () { function ExportAllDeclaration(source) { this.type = syntax_1.Syntax.ExportAllDeclaration; this.source = source; } return ExportAllDeclaration; }()); exports.ExportAllDeclaration = ExportAllDeclaration; var ExportDefaultDeclaration = (function () { function ExportDefaultDeclaration(declaration) { this.type = syntax_1.Syntax.ExportDefaultDeclaration; this.declaration = declaration; } return ExportDefaultDeclaration; }()); exports.ExportDefaultDeclaration = ExportDefaultDeclaration; var ExportNamedDeclaration = (function () { function ExportNamedDeclaration(declaration, specifiers, source) { this.type = syntax_1.Syntax.ExportNamedDeclaration; this.declaration = declaration; this.specifiers = specifiers; this.source = source; } return ExportNamedDeclaration; }()); exports.ExportNamedDeclaration = ExportNamedDeclaration; var ExportSpecifier = (function () { function ExportSpecifier(local, exported) { this.type = syntax_1.Syntax.ExportSpecifier; this.exported = exported; this.local = local; } return ExportSpecifier; }()); exports.ExportSpecifier = ExportSpecifier; var ExpressionStatement = (function () { function ExpressionStatement(expression) { this.type = syntax_1.Syntax.ExpressionStatement; this.expression = expression; } return ExpressionStatement; }()); exports.ExpressionStatement = ExpressionStatement; var ForInStatement = (function () { function ForInStatement(left, right, body) { this.type = syntax_1.Syntax.ForInStatement; this.left = left; this.right = right; this.body = body; this.each = false; } return ForInStatement; }()); exports.ForInStatement = ForInStatement; var ForOfStatement = (function () { function ForOfStatement(left, right, body) { this.type = syntax_1.Syntax.ForOfStatement; this.left = left; this.right = right; this.body = body; } return ForOfStatement; }()); exports.ForOfStatement = ForOfStatement; var ForStatement = (function () { function ForStatement(init, test, update, body) { this.type = syntax_1.Syntax.ForStatement; this.init = init; this.test = test; this.update = update; this.body = body; } return ForStatement; }()); exports.ForStatement = ForStatement; var FunctionDeclaration = (function () { function FunctionDeclaration(id, params, body, generator) { this.type = syntax_1.Syntax.FunctionDeclaration; this.id = id; this.params = params; this.body = body; this.generator = generator; this.expression = false; this.async = false; } return FunctionDeclaration; }()); exports.FunctionDeclaration = FunctionDeclaration; var FunctionExpression = (function () { function FunctionExpression(id, params, body, generator) { this.type = syntax_1.Syntax.FunctionExpression; this.id = id; this.params = params; this.body = body; this.generator = generator; this.expression = false; this.async = false; } return FunctionExpression; }()); exports.FunctionExpression = FunctionExpression; var Identifier = (function () { function Identifier(name) { this.type = syntax_1.Syntax.Identifier; this.name = name; } return Identifier; }()); exports.Identifier = Identifier; var IfStatement = (function () { function IfStatement(test, consequent, alternate) { this.type = syntax_1.Syntax.IfStatement; this.test = test; this.consequent = consequent; this.alternate = alternate; } return IfStatement; }()); exports.IfStatement = IfStatement; var ImportDeclaration = (function () { function ImportDeclaration(specifiers, source) { this.type = syntax_1.Syntax.ImportDeclaration; this.specifiers = specifiers; this.source = source; } return ImportDeclaration; }()); exports.ImportDeclaration = ImportDeclaration; var ImportDefaultSpecifier = (function () { function ImportDefaultSpecifier(local) { this.type = syntax_1.Syntax.ImportDefaultSpecifier; this.local = local; } return ImportDefaultSpecifier; }()); exports.ImportDefaultSpecifier = ImportDefaultSpecifier; var ImportNamespaceSpecifier = (function () { function ImportNamespaceSpecifier(local) { this.type = syntax_1.Syntax.ImportNamespaceSpecifier; this.local = local; } return ImportNamespaceSpecifier; }()); exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier; var ImportSpecifier = (function () { function ImportSpecifier(local, imported) { this.type = syntax_1.Syntax.ImportSpecifier; this.local = local; this.imported = imported; } return ImportSpecifier; }()); exports.ImportSpecifier = ImportSpecifier; var LabeledStatement = (function () { function LabeledStatement(label, body) { this.type = syntax_1.Syntax.LabeledStatement; this.label = label; this.body = body; } return LabeledStatement; }()); exports.LabeledStatement = LabeledStatement; var Literal = (function () { function Literal(value, raw) { this.type = syntax_1.Syntax.Literal; this.value = value; this.raw = raw; } return Literal; }()); exports.Literal = Literal; var MetaProperty = (function () { function MetaProperty(meta, property) { this.type = syntax_1.Syntax.MetaProperty; this.meta = meta; this.property = property; } return MetaProperty; }()); exports.MetaProperty = MetaProperty; var MethodDefinition = (function () { function MethodDefinition(key, computed, value, kind, isStatic) { this.type = syntax_1.Syntax.MethodDefinition; this.key = key; this.computed = computed; this.value = value; this.kind = kind; this.static = isStatic; } return MethodDefinition; }()); exports.MethodDefinition = MethodDefinition; var Module = (function () { function Module(body) { this.type = syntax_1.Syntax.Program; this.body = body; this.sourceType = 'module'; } return Module; }()); exports.Module = Module; var NewExpression = (function () { function NewExpression(callee, args) { this.type = syntax_1.Syntax.NewExpression; this.callee = callee; this.arguments = args; } return NewExpression; }()); exports.NewExpression = NewExpression; var ObjectExpression = (function () { function ObjectExpression(properties) { this.type = syntax_1.Syntax.ObjectExpression; this.properties = properties; } return ObjectExpression; }()); exports.ObjectExpression = ObjectExpression; var ObjectPattern = (function () { function ObjectPattern(properties) { this.type = syntax_1.Syntax.ObjectPattern; this.properties = properties; } return ObjectPattern; }()); exports.ObjectPattern = ObjectPattern; var Property = (function () { function Property(kind, key, computed, value, method, shorthand) { this.type = syntax_1.Syntax.Property; this.key = key; this.computed = computed; this.value = value; this.kind = kind; this.method = method; this.shorthand = shorthand; } return Property; }()); exports.Property = Property; var RegexLiteral = (function () { function RegexLiteral(value, raw, pattern, flags) { this.type = syntax_1.Syntax.Literal; this.value = value; this.raw = raw; this.regex = { pattern: pattern, flags: flags }; } return RegexLiteral; }()); exports.RegexLiteral = RegexLiteral; var RestElement = (function () { function RestElement(argument) { this.type = syntax_1.Syntax.RestElement; this.argument = argument; } return RestElement; }()); exports.RestElement = RestElement; var ReturnStatement = (function () { function ReturnStatement(argument) { this.type = syntax_1.Syntax.ReturnStatement; this.argument = argument; } return ReturnStatement; }()); exports.ReturnStatement = ReturnStatement; var Script = (function () { function Script(body) { this.type = syntax_1.Syntax.Program; this.body = body; this.sourceType = 'script'; } return Script; }()); exports.Script = Script; var SequenceExpression = (function () { function SequenceExpression(expressions) { this.type = syntax_1.Syntax.SequenceExpression; this.expressions = expressions; } return SequenceExpression; }()); exports.SequenceExpression = SequenceExpression; var SpreadElement = (function () { function SpreadElement(argument) { this.type = syntax_1.Syntax.SpreadElement; this.argument = argument; } return SpreadElement; }()); exports.SpreadElement = SpreadElement; var StaticMemberExpression = (function () { function StaticMemberExpression(object, property) { this.type = syntax_1.Syntax.MemberExpression; this.computed = false; this.object = object; this.property = property; } return StaticMemberExpression; }()); exports.StaticMemberExpression = StaticMemberExpression; var Super = (function () { function Super() { this.type = syntax_1.Syntax.Super; } return Super; }()); exports.Super = Super; var SwitchCase = (function () { function SwitchCase(test, consequent) { this.type = syntax_1.Syntax.SwitchCase; this.test = test; this.consequent = consequent; } return SwitchCase; }()); exports.SwitchCase = SwitchCase; var SwitchStatement = (function () { function SwitchStatement(discriminant, cases) { this.type = syntax_1.Syntax.SwitchStatement; this.discriminant = discriminant; this.cases = cases; } return SwitchStatement; }()); exports.SwitchStatement = SwitchStatement; var TaggedTemplateExpression = (function () { function TaggedTemplateExpression(tag, quasi) { this.type = syntax_1.Syntax.TaggedTemplateExpression; this.tag = tag; this.quasi = quasi; } return TaggedTemplateExpression; }()); exports.TaggedTemplateExpression = TaggedTemplateExpression; var TemplateElement = (function () { function TemplateElement(value, tail) { this.type = syntax_1.Syntax.TemplateElement; this.value = value; this.tail = tail; } return TemplateElement; }()); exports.TemplateElement = TemplateElement; var TemplateLiteral = (function () { function TemplateLiteral(quasis, expressions) { this.type = syntax_1.Syntax.TemplateLiteral; this.quasis = quasis; this.expressions = expressions; } return TemplateLiteral; }()); exports.TemplateLiteral = TemplateLiteral; var ThisExpression = (function () { function ThisExpression() { this.type = syntax_1.Syntax.ThisExpression; } return ThisExpression; }()); exports.ThisExpression = ThisExpression; var ThrowStatement = (function () { function ThrowStatement(argument) { this.type = syntax_1.Syntax.ThrowStatement; this.argument = argument; } return ThrowStatement; }()); exports.ThrowStatement = ThrowStatement; var TryStatement = (function () { function TryStatement(block, handler, finalizer) { this.type = syntax_1.Syntax.TryStatement; this.block = block; this.handler = handler; this.finalizer = finalizer; } return TryStatement; }()); exports.TryStatement = TryStatement; var UnaryExpression = (function () { function UnaryExpression(operator, argument) { this.type = syntax_1.Syntax.UnaryExpression; this.operator = operator; this.argument = argument; this.prefix = true; } return UnaryExpression; }()); exports.UnaryExpression = UnaryExpression; var UpdateExpression = (function () { function UpdateExpression(operator, argument, prefix) { this.type = syntax_1.Syntax.UpdateExpression; this.operator = operator; this.argument = argument; this.prefix = prefix; } return UpdateExpression; }()); exports.UpdateExpression = UpdateExpression; var VariableDeclaration = (function () { function VariableDeclaration(declarations, kind) { this.type = syntax_1.Syntax.VariableDeclaration; this.declarations = declarations; this.kind = kind; } return VariableDeclaration; }()); exports.VariableDeclaration = VariableDeclaration; var VariableDeclarator = (function () { function VariableDeclarator(id, init) { this.type = syntax_1.Syntax.VariableDeclarator; this.id = id; this.init = init; } return VariableDeclarator; }()); exports.VariableDeclarator = VariableDeclarator; var WhileStatement = (function () { function WhileStatement(test, body) { this.type = syntax_1.Syntax.WhileStatement; this.test = test; this.body = body; } return WhileStatement; }()); exports.WhileStatement = WhileStatement; var WithStatement = (function () { function WithStatement(object, body) { this.type = syntax_1.Syntax.WithStatement; this.object = object; this.body = body; } return WithStatement; }()); exports.WithStatement = WithStatement; var YieldExpression = (function () { function YieldExpression(argument, delegate) { this.type = syntax_1.Syntax.YieldExpression; this.argument = argument; this.delegate = delegate; } return YieldExpression; }()); exports.YieldExpression = YieldExpression; /***/ }, /* 8 */ /***/ function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var assert_1 = __webpack_require__(9); var error_handler_1 = __webpack_require__(10); var messages_1 = __webpack_require__(11); var Node = __webpack_require__(7); var scanner_1 = __webpack_require__(12); var syntax_1 = __webpack_require__(2); var token_1 = __webpack_require__(13); var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder'; var Parser = (function () { function Parser(code, options, delegate) { if (options === void 0) { options = {}; } this.config = { range: (typeof options.range === 'boolean') && options.range, loc: (typeof options.loc === 'boolean') && options.loc, source: null, tokens: (typeof options.tokens === 'boolean') && options.tokens, comment: (typeof options.comment === 'boolean') && options.comment, tolerant: (typeof options.tolerant === 'boolean') && options.tolerant }; if (this.config.loc && options.source && options.source !== null) { this.config.source = String(options.source); } this.delegate = delegate; this.errorHandler = new error_handler_1.ErrorHandler(); this.errorHandler.tolerant = this.config.tolerant; this.scanner = new scanner_1.Scanner(code, this.errorHandler); this.scanner.trackComment = this.config.comment; this.operatorPrecedence = { ')': 0, ';': 0, ',': 0, '=': 0, ']': 0, '||': 1, '&&': 2, '|': 3, '^': 4, '&': 5, '==': 6, '!=': 6, '===': 6, '!==': 6, '<': 7, '>': 7, '<=': 7, '>=': 7, '<<': 8, '>>': 8, '>>>': 8, '+': 9, '-': 9, '*': 11, '/': 11, '%': 11 }; this.lookahead = { type: 2 /* EOF */, value: '', lineNumber: this.scanner.lineNumber, lineStart: 0, start: 0, end: 0 }; this.hasLineTerminator = false; this.context = { isModule: false, await: false, allowIn: true, allowStrictDirective: true, allowYield: true, firstCoverInitializedNameError: null, isAssignmentTarget: false, isBindingElement: false, inFunctionBody: false, inIteration: false, inSwitch: false, labelSet: {}, strict: false }; this.tokens = []; this.startMarker = { index: 0, line: this.scanner.lineNumber, column: 0 }; this.lastMarker = { index: 0, line: this.scanner.lineNumber, column: 0 }; this.nextToken(); this.lastMarker = { index: this.scanner.index, line: this.scanner.lineNumber, column: this.scanner.index - this.scanner.lineStart }; } Parser.prototype.throwError = function (messageFormat) { var values = []; for (var _i = 1; _i < arguments.length; _i++) { values[_i - 1] = arguments[_i]; } var args = Array.prototype.slice.call(arguments, 1); var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) { assert_1.assert(idx < args.length, 'Message reference must be in range'); return args[idx]; }); var index = this.lastMarker.index; var line = this.lastMarker.line; var column = this.lastMarker.column + 1; throw this.errorHandler.createError(index, line, column, msg); }; Parser.prototype.tolerateError = function (messageFormat) { var values = []; for (var _i = 1; _i < arguments.length; _i++) { values[_i - 1] = arguments[_i]; } var args = Array.prototype.slice.call(arguments, 1); var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) { assert_1.assert(idx < args.length, 'Message reference must be in range'); return args[idx]; }); var index = this.lastMarker.index; var line = this.scanner.lineNumber; var column = this.lastMarker.column + 1; this.errorHandler.tolerateError(index, line, column, msg); }; // Throw an exception because of the token. Parser.prototype.unexpectedTokenError = function (token, message) { var msg = message || messages_1.Messages.UnexpectedToken; var value; if (token) { if (!message) { msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS : (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier : (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber : (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString : (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate : messages_1.Messages.UnexpectedToken; if (token.type === 4 /* Keyword */) { if (this.scanner.isFutureReservedWord(token.value)) { msg = messages_1.Messages.UnexpectedReserved; } else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) { msg = messages_1.Messages.StrictReservedWord; } } } value = token.value; } else { value = 'ILLEGAL'; } msg = msg.replace('%0', value); if (token && typeof token.lineNumber === 'number') { var index = token.start; var line = token.lineNumber; var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column; var column = token.start - lastMarkerLineStart + 1; return this.errorHandler.createError(index, line, column, msg); } else { var index = this.lastMarker.index; var line = this.lastMarker.line; var column = this.lastMarker.column + 1; return this.errorHandler.createError(index, line, column, msg); } }; Parser.prototype.throwUnexpectedToken = function (token, message) { throw this.unexpectedTokenError(token, message); }; Parser.prototype.tolerateUnexpectedToken = function (token, message) { this.errorHandler.tolerate(this.unexpectedTokenError(token, message)); }; Parser.prototype.collectComments = function () { if (!this.config.comment) { this.scanner.scanComments(); } else { var comments = this.scanner.scanComments(); if (comments.length > 0 && this.delegate) { for (var i = 0; i < comments.length; ++i) { var e = comments[i]; var node = void 0; node = { type: e.multiLine ? 'BlockComment' : 'LineComment', value: this.scanner.source.slice(e.slice[0], e.slice[1]) }; if (this.config.range) { node.range = e.range; } if (this.config.loc) { node.loc = e.loc; } var metadata = { start: { line: e.loc.start.line, column: e.loc.start.column, offset: e.range[0] }, end: { line: e.loc.end.line, column: e.loc.end.column, offset: e.range[1] } }; this.delegate(node, metadata); } } } }; // From internal representation to an external structure Parser.prototype.getTokenRaw = function (token) { return this.scanner.source.slice(token.start, token.end); }; Parser.prototype.convertToken = function (token) { var t = { type: token_1.TokenName[token.type], value: this.getTokenRaw(token) }; if (this.config.range) { t.range = [token.start, token.end]; } if (this.config.loc) { t.loc = { start: { line: this.startMarker.line, column: this.startMarker.column }, end: { line: this.scanner.lineNumber, column: this.scanner.index - this.scanner.lineStart } }; } if (token.type === 9 /* RegularExpression */) { var pattern = token.pattern; var flags = token.flags; t.regex = { pattern: pattern, flags: flags }; } return t; }; Parser.prototype.nextToken = function () { var token = this.lookahead; this.lastMarker.index = this.scanner.index; this.lastMarker.line = this.scanner.lineNumber; this.lastMarker.column = this.scanner.index - this.scanner.lineStart; this.collectComments(); if (this.scanner.index !== this.startMarker.index) { this.startMarker.index = this.scanner.index; this.startMarker.line = this.scanner.lineNumber; this.startMarker.column = this.scanner.index - this.scanner.lineStart; } var next = this.scanner.lex(); this.hasLineTerminator = (token.lineNumber !== next.lineNumber); if (next && this.context.strict && next.type === 3 /* Identifier */) { if (this.scanner.isStrictModeReservedWord(next.value)) { next.type = 4 /* Keyword */; } } this.lookahead = next; if (this.config.tokens && next.type !== 2 /* EOF */) { this.tokens.push(this.convertToken(next)); } return token; }; Parser.prototype.nextRegexToken = function () { this.collectComments(); var token = this.scanner.scanRegExp(); if (this.config.tokens) { // Pop the previous token, '/' or '/=' // This is added from the lookahead token. this.tokens.pop(); this.tokens.push(this.convertToken(token)); } // Prime the next lookahead. this.lookahead = token; this.nextToken(); return token; }; Parser.prototype.createNode = function () { return { index: this.startMarker.index, line: this.startMarker.line, column: this.startMarker.column }; }; Parser.prototype.startNode = function (token, lastLineStart) { if (lastLineStart === void 0) { lastLineStart = 0; } var column = token.start - token.lineStart; var line = token.lineNumber; if (column < 0) { column += lastLineStart; line--; } return { index: token.start, line: line, column: column }; }; Parser.prototype.finalize = function (marker, node) { if (this.config.range) { node.range = [marker.index, this.lastMarker.index]; } if (this.config.loc) { node.loc = { start: { line: marker.line, column: marker.column, }, end: { line: this.lastMarker.line, column: this.lastMarker.column } }; if (this.config.source) { node.loc.source = this.config.source; } } if (this.delegate) { var metadata = { start: { line: marker.line, column: marker.column, offset: marker.index }, end: { line: this.lastMarker.line, column: this.lastMarker.column, offset: this.lastMarker.index } }; this.delegate(node, metadata); } return node; }; // Expect the next token to match the specified punctuator. // If not, an exception will be thrown. Parser.prototype.expect = function (value) { var token = this.nextToken(); if (token.type !== 7 /* Punctuator */ || token.value !== value) { this.throwUnexpectedToken(token); } }; // Quietly expect a comma when in tolerant mode, otherwise delegates to expect(). Parser.prototype.expectCommaSeparator = function () { if (this.config.tolerant) { var token = this.lookahead; if (token.type === 7 /* Punctuator */ && token.value === ',') { this.nextToken(); } else if (token.type === 7 /* Punctuator */ && token.value === ';') { this.nextToken(); this.tolerateUnexpectedToken(token); } else { this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken); } } else { this.expect(','); } }; // Expect the next token to match the specified keyword. // If not, an exception will be thrown. Parser.prototype.expectKeyword = function (keyword) { var token = this.nextToken(); if (token.type !== 4 /* Keyword */ || token.value !== keyword) { this.throwUnexpectedToken(token); } }; // Return true if the next token matches the specified punctuator. Parser.prototype.match = function (value) { return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value; }; // Return true if the next token matches the specified keyword Parser.prototype.matchKeyword = function (keyword) { return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword; }; // Return true if the next token matches the specified contextual keyword // (where an identifier is sometimes a keyword depending on the context) Parser.prototype.matchContextualKeyword = function (keyword) { return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword; }; // Return true if the next token is an assignment operator Parser.prototype.matchAssign = function () { if (this.lookahead.type !== 7 /* Punctuator */) { return false; } var op = this.lookahead.value; return op === '=' || op === '*=' || op === '**=' || op === '/=' || op === '%=' || op === '+=' || op === '-=' || op === '<<=' || op === '>>=' || op === '>>>=' || op === '&=' || op === '^=' || op === '|='; }; // Cover grammar support. // // When an assignment expression position starts with an left parenthesis, the determination of the type // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead) // or the first comma. This situation also defers the determination of all the expressions nested in the pair. // // There are three productions that can be parsed in a parentheses pair that needs to be determined // after the outermost pair is closed. They are: // // 1. AssignmentExpression // 2. BindingElements // 3. AssignmentTargets // // In order to avoid exponential backtracking, we use two flags to denote if the production can be // binding element or assignment target. // // The three productions have the relationship: // // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression // // with a single exception that CoverInitializedName when used directly in an Expression, generates // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair. // // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not // effect the current flags. This means the production the parser parses is only used as an expression. Therefore // the CoverInitializedName check is conducted. // // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates // the flags outside of the parser. This means the production the parser parses is used as a part of a potential // pattern. The CoverInitializedName check is deferred. Parser.prototype.isolateCoverGrammar = function (parseFunction) { var previousIsBindingElement = this.context.isBindingElement; var previousIsAssignmentTarget = this.context.isAssignmentTarget; var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; this.context.isBindingElement = true; this.context.isAssignmentTarget = true; this.context.firstCoverInitializedNameError = null; var result = parseFunction.call(this); if (this.context.firstCoverInitializedNameError !== null) { this.throwUnexpectedToken(this.context.firstCoverInitializedNameError); } this.context.isBindingElement = previousIsBindingElement; this.context.isAssignmentTarget = previousIsAssignmentTarget; this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError; return result; }; Parser.prototype.inheritCoverGrammar = function (parseFunction) { var previousIsBindingElement = this.context.isBindingElement; var previousIsAssignmentTarget = this.context.isAssignmentTarget; var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; this.context.isBindingElement = true; this.context.isAssignmentTarget = true; this.context.firstCoverInitializedNameError = null; var result = parseFunction.call(this); this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement; this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget; this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError; return result; }; Parser.prototype.consumeSemicolon = function () { if (this.match(';')) { this.nextToken(); } else if (!this.hasLineTerminator) { if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) { this.throwUnexpectedToken(this.lookahead); } this.lastMarker.index = this.startMarker.index; this.lastMarker.line = this.startMarker.line; this.lastMarker.column = this.startMarker.column; } }; // https://tc39.github.io/ecma262/#sec-primary-expression Parser.prototype.parsePrimaryExpression = function () { var node = this.createNode(); var expr; var token, raw; switch (this.lookahead.type) { case 3 /* Identifier */: if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') { this.tolerateUnexpectedToken(this.lookahead); } expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value)); break; case 6 /* NumericLiteral */: case 8 /* StringLiteral */: if (this.context.strict && this.lookahead.octal) { this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral); } this.context.isAssignmentTarget = false; this.context.isBindingElement = false; token = this.nextToken(); raw = this.getTokenRaw(token); expr = this.finalize(node, new Node.Literal(token.value, raw)); break; case 1 /* BooleanLiteral */: this.context.isAssignmentTarget = false; this.context.isBindingElement = false; token = this.nextToken(); raw = this.getTokenRaw(token); expr = this.finalize(node, new Node.Literal(token.value === 'true', raw)); break; case 5 /* NullLiteral */: this.context.isAssignmentTarget = false; this.context.isBindingElement = false; token = this.nextToken(); raw = this.getTokenRaw(token); expr = this.finalize(node, new Node.Literal(null, raw)); break; case 10 /* Template */: expr = this.parseTemplateLiteral(); break; case 7 /* Punctuator */: switch (this.lookahead.value) { case '(': this.context.isBindingElement = false; expr = this.inheritCoverGrammar(this.parseGroupExpression); break; case '[': expr = this.inheritCoverGrammar(this.parseArrayInitializer); break; case '{': expr = this.inheritCoverGrammar(this.parseObjectInitializer); break; case '/': case '/=': this.context.isAssignmentTarget = false; this.context.isBindingElement = false; this.scanner.index = this.startMarker.index; token = this.nextRegexToken(); raw = this.getTokenRaw(token); expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags)); break; default: expr = this.throwUnexpectedToken(this.nextToken()); } break; case 4 /* Keyword */: if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) { expr = this.parseIdentifierName(); } else if (!this.context.strict && this.matchKeyword('let')) { expr = this.finalize(node, new Node.Identifier(this.nextToken().value)); } else { this.context.isAssignmentTarget = false; this.context.isBindingElement = false; if (this.matchKeyword('function')) { expr = this.parseFunctionExpression(); } else if (this.matchKeyword('this')) { this.nextToken(); expr = this.finalize(node, new Node.ThisExpression()); } else if (this.matchKeyword('class')) { expr = this.parseClassExpression(); } else { expr = this.throwUnexpectedToken(this.nextToken()); } } break; default: expr = this.throwUnexpectedToken(this.nextToken()); } return expr; }; // https://tc39.github.io/ecma262/#sec-array-initializer Parser.prototype.parseSpreadElement = function () { var node = this.createNode(); this.expect('...'); var arg = this.inheritCoverGrammar(this.parseAssignmentExpression); return this.finalize(node, new Node.SpreadElement(arg)); }; Parser.prototype.parseArrayInitializer = function () { var node = this.createNode(); var elements = []; this.expect('['); while (!this.match(']')) { if (this.match(',')) { this.nextToken(); elements.push(null); } else if (this.match('...')) { var element = this.parseSpreadElement(); if (!this.match(']')) { this.context.isAssignmentTarget = false; this.context.isBindingElement = false; this.expect(','); } elements.push(element); } else { elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); if (!this.match(']')) { this.expect(','); } } } this.expect(']'); return this.finalize(node, new Node.ArrayExpression(elements)); }; // https://tc39.github.io/ecma262/#sec-object-initializer Parser.prototype.parsePropertyMethod = function (params) { this.context.isAssignmentTarget = false; this.context.isBindingElement = false; var previousStrict = this.context.strict; var previousAllowStrictDirective = this.context.allowStrictDirective; this.context.allowStrictDirective = params.simple; var body = this.isolateCoverGrammar(this.parseFunctionSourceElements); if (this.context.strict && params.firstRestricted) { this.tolerateUnexpectedToken(params.firstRestricted, params.message); } if (this.context.strict && params.stricted) { this.tolerateUnexpectedToken(params.stricted, params.message); } this.context.strict = previousStrict; this.context.allowStrictDirective = previousAllowStrictDirective; return body; }; Parser.prototype.parsePropertyMethodFunction = function () { var isGenerator = false; var node = this.createNode(); var previousAllowYield = this.context.allowYield; this.context.allowYield = true; var params = this.parseFormalParameters(); var method = this.parsePropertyMethod(params); this.context.allowYield = previousAllowYield; return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); }; Parser.prototype.parsePropertyMethodAsyncFunction = function () { var node = this.createNode(); var previousAllowYield = this.context.allowYield; var previousAwait = this.context.await; this.context.allowYield = false; this.context.await = true; var params = this.parseFormalParameters(); var method = this.parsePropertyMethod(params); this.context.allowYield = previousAllowYield; this.context.await = previousAwait; return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method)); }; Parser.prototype.parseObjectPropertyKey = function () { var node = this.createNode(); var token = this.nextToken(); var key; switch (token.type) { case 8 /* StringLiteral */: case 6 /* NumericLiteral */: if (this.context.strict && token.octal) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral); } var raw = this.getTokenRaw(token); key = this.finalize(node, new Node.Literal(token.value, raw)); break; case 3 /* Identifier */: case 1 /* BooleanLiteral */: case 5 /* NullLiteral */: case 4 /* Keyword */: key = this.finalize(node, new Node.Identifier(token.value)); break; case 7 /* Punctuator */: if (token.value === '[') { key = this.isolateCoverGrammar(this.parseAssignmentExpression); this.expect(']'); } else { key = this.throwUnexpectedToken(token); } break; default: key = this.throwUnexpectedToken(token); } return key; }; Parser.prototype.isPropertyKey = function (key, value) { return (key.type === syntax_1.Syntax.Identifier && key.name === value) || (key.type === syntax_1.Syntax.Literal && key.value === value); }; Parser.prototype.parseObjectProperty = function (hasProto) { var node = this.createNode(); var token = this.lookahead; var kind; var key = null; var value = null; var computed = false; var method = false; var shorthand = false; var isAsync = false; if (token.type === 3 /* Identifier */) { var id = token.value; this.nextToken(); computed = this.match('['); isAsync = !this.hasLineTerminator && (id === 'async') && !this.match(':') && !this.match('(') && !this.match('*') && !this.match(','); key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id)); } else if (this.match('*')) { this.nextToken(); } else { computed = this.match('['); key = this.parseObjectPropertyKey(); } var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) { kind = 'get'; computed = this.match('['); key = this.parseObjectPropertyKey(); this.context.allowYield = false; value = this.parseGetterMethod(); } else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) { kind = 'set'; computed = this.match('['); key = this.parseObjectPropertyKey(); value = this.parseSetterMethod(); } else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { kind = 'init'; computed = this.match('['); key = this.parseObjectPropertyKey(); value = this.parseGeneratorMethod(); method = true; } else { if (!key) { this.throwUnexpectedToken(this.lookahead); } kind = 'init'; if (this.match(':') && !isAsync) { if (!computed && this.isPropertyKey(key, '__proto__')) { if (hasProto.value) { this.tolerateError(messages_1.Messages.DuplicateProtoProperty); } hasProto.value = true; } this.nextToken(); value = this.inheritCoverGrammar(this.parseAssignmentExpression); } else if (this.match('(')) { value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); method = true; } else if (token.type === 3 /* Identifier */) { var id = this.finalize(node, new Node.Identifier(token.value)); if (this.match('=')) { this.context.firstCoverInitializedNameError = this.lookahead; this.nextToken(); shorthand = true; var init = this.isolateCoverGrammar(this.parseAssignmentExpression); value = this.finalize(node, new Node.AssignmentPattern(id, init)); } else { shorthand = true; value = id; } } else { this.throwUnexpectedToken(this.nextToken()); } } return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand)); }; Parser.prototype.parseObjectInitializer = function () { var node = this.createNode(); this.expect('{'); var properties = []; var hasProto = { value: false }; while (!this.match('}')) { properties.push(this.parseObjectProperty(hasProto)); if (!this.match('}')) { this.expectCommaSeparator(); } } this.expect('}'); return this.finalize(node, new Node.ObjectExpression(properties)); }; // https://tc39.github.io/ecma262/#sec-template-literals Parser.prototype.parseTemplateHead = function () { assert_1.assert(this.lookahead.head, 'Template literal must start with a template head'); var node = this.createNode(); var token = this.nextToken(); var raw = token.value; var cooked = token.cooked; return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); }; Parser.prototype.parseTemplateElement = function () { if (this.lookahead.type !== 10 /* Template */) { this.throwUnexpectedToken(); } var node = this.createNode(); var token = this.nextToken(); var raw = token.value; var cooked = token.cooked; return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); }; Parser.prototype.parseTemplateLiteral = function () { var node = this.createNode(); var expressions = []; var quasis = []; var quasi = this.parseTemplateHead(); quasis.push(quasi); while (!quasi.tail) { expressions.push(this.parseExpression()); quasi = this.parseTemplateElement(); quasis.push(quasi); } return this.finalize(node, new Node.TemplateLiteral(quasis, expressions)); }; // https://tc39.github.io/ecma262/#sec-grouping-operator Parser.prototype.reinterpretExpressionAsPattern = function (expr) { switch (expr.type) { case syntax_1.Syntax.Identifier: case syntax_1.Syntax.MemberExpression: case syntax_1.Syntax.RestElement: case syntax_1.Syntax.AssignmentPattern: break; case syntax_1.Syntax.SpreadElement: expr.type = syntax_1.Syntax.RestElement; this.reinterpretExpressionAsPattern(expr.argument); break; case syntax_1.Syntax.ArrayExpression: expr.type = syntax_1.Syntax.ArrayPattern; for (var i = 0; i < expr.elements.length; i++) { if (expr.elements[i] !== null) { this.reinterpretExpressionAsPattern(expr.elements[i]); } } break; case syntax_1.Syntax.ObjectExpression: expr.type = syntax_1.Syntax.ObjectPattern; for (var i = 0; i < expr.properties.length; i++) { this.reinterpretExpressionAsPattern(expr.properties[i].value); } break; case syntax_1.Syntax.AssignmentExpression: expr.type = syntax_1.Syntax.AssignmentPattern; delete expr.operator; this.reinterpretExpressionAsPattern(expr.left); break; default: // Allow other node type for tolerant parsing. break; } }; Parser.prototype.parseGroupExpression = function () { var expr; this.expect('('); if (this.match(')')) { this.nextToken(); if (!this.match('=>')) { this.expect('=>'); } expr = { type: ArrowParameterPlaceHolder, params: [], async: false }; } else { var startToken = this.lookahead; var params = []; if (this.match('...')) { expr = this.parseRestElement(params); this.expect(')'); if (!this.match('=>')) { this.expect('=>'); } expr = { type: ArrowParameterPlaceHolder, params: [expr], async: false }; } else { var arrow = false; this.context.isBindingElement = true; expr = this.inheritCoverGrammar(this.parseAssignmentExpression); if (this.match(',')) { var expressions = []; this.context.isAssignmentTarget = false; expressions.push(expr); while (this.lookahead.type !== 2 /* EOF */) { if (!this.match(',')) { break; } this.nextToken(); if (this.match(')')) { this.nextToken(); for (var i = 0; i < expressions.length; i++) { this.reinterpretExpressionAsPattern(expressions[i]); } arrow = true; expr = { type: ArrowParameterPlaceHolder, params: expressions, async: false }; } else if (this.match('...')) { if (!this.context.isBindingElement) { this.throwUnexpectedToken(this.lookahead); } expressions.push(this.parseRestElement(params)); this.expect(')'); if (!this.match('=>')) { this.expect('=>'); } this.context.isBindingElement = false; for (var i = 0; i < expressions.length; i++) { this.reinterpretExpressionAsPattern(expressions[i]); } arrow = true; expr = { type: ArrowParameterPlaceHolder, params: expressions, async: false }; } else { expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); } if (arrow) { break; } } if (!arrow) { expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); } } if (!arrow) { this.expect(')'); if (this.match('=>')) { if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') { arrow = true; expr = { type: ArrowParameterPlaceHolder, params: [expr], async: false }; } if (!arrow) { if (!this.context.isBindingElement) { this.throwUnexpectedToken(this.lookahead); } if (expr.type === syntax_1.Syntax.SequenceExpression) { for (var i = 0; i < expr.expressions.length; i++) { this.reinterpretExpressionAsPattern(expr.expressions[i]); } } else { this.reinterpretExpressionAsPattern(expr); } var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]); expr = { type: ArrowParameterPlaceHolder, params: parameters, async: false }; } } this.context.isBindingElement = false; } } } return expr; }; // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions Parser.prototype.parseArguments = function () { this.expect('('); var args = []; if (!this.match(')')) { while (true) { var expr = this.match('...') ? this.parseSpreadElement() : this.isolateCoverGrammar(this.parseAssignmentExpression); args.push(expr); if (this.match(')')) { break; } this.expectCommaSeparator(); if (this.match(')')) { break; } } } this.expect(')'); return args; }; Parser.prototype.isIdentifierName = function (token) { return token.type === 3 /* Identifier */ || token.type === 4 /* Keyword */ || token.type === 1 /* BooleanLiteral */ || token.type === 5 /* NullLiteral */; }; Parser.prototype.parseIdentifierName = function () { var node = this.createNode(); var token = this.nextToken(); if (!this.isIdentifierName(token)) { this.throwUnexpectedToken(token); } return this.finalize(node, new Node.Identifier(token.value)); }; Parser.prototype.parseNewExpression = function () { var node = this.createNode(); var id = this.parseIdentifierName(); assert_1.assert(id.name === 'new', 'New expression must start with `new`'); var expr; if (this.match('.')) { this.nextToken(); if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') { var property = this.parseIdentifierName(); expr = new Node.MetaProperty(id, property); } else { this.throwUnexpectedToken(this.lookahead); } } else { var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression); var args = this.match('(') ? this.parseArguments() : []; expr = new Node.NewExpression(callee, args); this.context.isAssignmentTarget = false; this.context.isBindingElement = false; } return this.finalize(node, expr); }; Parser.prototype.parseAsyncArgument = function () { var arg = this.parseAssignmentExpression(); this.context.firstCoverInitializedNameError = null; return arg; }; Parser.prototype.parseAsyncArguments = function () { this.expect('('); var args = []; if (!this.match(')')) { while (true) { var expr = this.match('...') ? this.parseSpreadElement() : this.isolateCoverGrammar(this.parseAsyncArgument); args.push(expr); if (this.match(')')) { break; } this.expectCommaSeparator(); if (this.match(')')) { break; } } } this.expect(')'); return args; }; Parser.prototype.parseLeftHandSideExpressionAllowCall = function () { var startToken = this.lookahead; var maybeAsync = this.matchContextualKeyword('async'); var previousAllowIn = this.context.allowIn; this.context.allowIn = true; var expr; if (this.matchKeyword('super') && this.context.inFunctionBody) { expr = this.createNode(); this.nextToken(); expr = this.finalize(expr, new Node.Super()); if (!this.match('(') && !this.match('.') && !this.match('[')) { this.throwUnexpectedToken(this.lookahead); } } else { expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); } while (true) { if (this.match('.')) { this.context.isBindingElement = false; this.context.isAssignmentTarget = true; this.expect('.'); var property = this.parseIdentifierName(); expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property)); } else if (this.match('(')) { var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber); this.context.isBindingElement = false; this.context.isAssignmentTarget = false; var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments(); expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args)); if (asyncArrow && this.match('=>')) { for (var i = 0; i < args.length; ++i) { this.reinterpretExpressionAsPattern(args[i]); } expr = { type: ArrowParameterPlaceHolder, params: args, async: true }; } } else if (this.match('[')) { this.context.isBindingElement = false; this.context.isAssignmentTarget = true; this.expect('['); var property = this.isolateCoverGrammar(this.parseExpression); this.expect(']'); expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property)); } else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { var quasi = this.parseTemplateLiteral(); expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi)); } else { break; } } this.context.allowIn = previousAllowIn; return expr; }; Parser.prototype.parseSuper = function () { var node = this.createNode(); this.expectKeyword('super'); if (!this.match('[') && !this.match('.')) { this.throwUnexpectedToken(this.lookahead); } return this.finalize(node, new Node.Super()); }; Parser.prototype.parseLeftHandSideExpression = function () { assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.'); var node = this.startNode(this.lookahead); var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() : this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); while (true) { if (this.match('[')) { this.context.isBindingElement = false; this.context.isAssignmentTarget = true; this.expect('['); var property = this.isolateCoverGrammar(this.parseExpression); this.expect(']'); expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property)); } else if (this.match('.')) { this.context.isBindingElement = false; this.context.isAssignmentTarget = true; this.expect('.'); var property = this.parseIdentifierName(); expr = this.finalize(node, new Node.StaticMemberExpression(expr, property)); } else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { var quasi = this.parseTemplateLiteral(); expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi)); } else { break; } } return expr; }; // https://tc39.github.io/ecma262/#sec-update-expressions Parser.prototype.parseUpdateExpression = function () { var expr; var startToken = this.lookahead; if (this.match('++') || this.match('--')) { var node = this.startNode(startToken); var token = this.nextToken(); expr = this.inheritCoverGrammar(this.parseUnaryExpression); if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { this.tolerateError(messages_1.Messages.StrictLHSPrefix); } if (!this.context.isAssignmentTarget) { this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); } var prefix = true; expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix)); this.context.isAssignmentTarget = false; this.context.isBindingElement = false; } else { expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall); if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) { if (this.match('++') || this.match('--')) { if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { this.tolerateError(messages_1.Messages.StrictLHSPostfix); } if (!this.context.isAssignmentTarget) { this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); } this.context.isAssignmentTarget = false; this.context.isBindingElement = false; var operator = this.nextToken().value; var prefix = false; expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix)); } } } return expr; }; // https://tc39.github.io/ecma262/#sec-unary-operators Parser.prototype.parseAwaitExpression = function () { var node = this.createNode(); this.nextToken(); var argument = this.parseUnaryExpression(); return this.finalize(node, new Node.AwaitExpression(argument)); }; Parser.prototype.parseUnaryExpression = function () { var expr; if (this.match('+') || this.match('-') || this.match('~') || this.match('!') || this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) { var node = this.startNode(this.lookahead); var token = this.nextToken(); expr = this.inheritCoverGrammar(this.parseUnaryExpression); expr = this.finalize(node, new Node.UnaryExpression(token.value, expr)); if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) { this.tolerateError(messages_1.Messages.StrictDelete); } this.context.isAssignmentTarget = false; this.context.isBindingElement = false; } else if (this.context.await && this.matchContextualKeyword('await')) { expr = this.parseAwaitExpression(); } else { expr = this.parseUpdateExpression(); } return expr; }; Parser.prototype.parseExponentiationExpression = function () { var startToken = this.lookahead; var expr = this.inheritCoverGrammar(this.parseUnaryExpression); if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) { this.nextToken(); this.context.isAssignmentTarget = false; this.context.isBindingElement = false; var left = expr; var right = this.isolateCoverGrammar(this.parseExponentiationExpression); expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right)); } return expr; }; // https://tc39.github.io/ecma262/#sec-exp-operator // https://tc39.github.io/ecma262/#sec-multiplicative-operators // https://tc39.github.io/ecma262/#sec-additive-operators // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators // https://tc39.github.io/ecma262/#sec-relational-operators // https://tc39.github.io/ecma262/#sec-equality-operators // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators // https://tc39.github.io/ecma262/#sec-binary-logical-operators Parser.prototype.binaryPrecedence = function (token) { var op = token.value; var precedence; if (token.type === 7 /* Punctuator */) { precedence = this.operatorPrecedence[op] || 0; } else if (token.type === 4 /* Keyword */) { precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0; } else { precedence = 0; } return precedence; }; Parser.prototype.parseBinaryExpression = function () { var startToken = this.lookahead; var expr = this.inheritCoverGrammar(this.parseExponentiationExpression); var token = this.lookahead; var prec = this.binaryPrecedence(token); if (prec > 0) { this.nextToken(); this.context.isAssignmentTarget = false; this.context.isBindingElement = false; var markers = [startToken, this.lookahead]; var left = expr; var right = this.isolateCoverGrammar(this.parseExponentiationExpression); var stack = [left, token.value, right]; var precedences = [prec]; while (true) { prec = this.binaryPrecedence(this.lookahead); if (prec <= 0) { break; } // Reduce: make a binary expression from the three topmost entries. while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) { right = stack.pop(); var operator = stack.pop(); precedences.pop(); left = stack.pop(); markers.pop(); var node = this.startNode(markers[markers.length - 1]); stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right))); } // Shift. stack.push(this.nextToken().value); precedences.push(prec); markers.push(this.lookahead); stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression)); } // Final reduce to clean-up the stack. var i = stack.length - 1; expr = stack[i]; var lastMarker = markers.pop(); while (i > 1) { var marker = markers.pop(); var lastLineStart = lastMarker && lastMarker.lineStart; var node = this.startNode(marker, lastLineStart); var operator = stack[i - 1]; expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr)); i -= 2; lastMarker = marker; } } return expr; }; // https://tc39.github.io/ecma262/#sec-conditional-operator Parser.prototype.parseConditionalExpression = function () { var startToken = this.lookahead; var expr = this.inheritCoverGrammar(this.parseBinaryExpression); if (this.match('?')) { this.nextToken(); var previousAllowIn = this.context.allowIn; this.context.allowIn = true; var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression); this.context.allowIn = previousAllowIn; this.expect(':'); var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression); expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate)); this.context.isAssignmentTarget = false; this.context.isBindingElement = false; } return expr; }; // https://tc39.github.io/ecma262/#sec-assignment-operators Parser.prototype.checkPatternParam = function (options, param) { switch (param.type) { case syntax_1.Syntax.Identifier: this.validateParam(options, param, param.name); break; case syntax_1.Syntax.RestElement: this.checkPatternParam(options, param.argument); break; case syntax_1.Syntax.AssignmentPattern: this.checkPatternParam(options, param.left); break; case syntax_1.Syntax.ArrayPattern: for (var i = 0; i < param.elements.length; i++) { if (param.elements[i] !== null) { this.checkPatternParam(options, param.elements[i]); } } break; case syntax_1.Syntax.ObjectPattern: for (var i = 0; i < param.properties.length; i++) { this.checkPatternParam(options, param.properties[i].value); } break; default: break; } options.simple = options.simple && (param instanceof Node.Identifier); }; Parser.prototype.reinterpretAsCoverFormalsList = function (expr) { var params = [expr]; var options; var asyncArrow = false; switch (expr.type) { case syntax_1.Syntax.Identifier: break; case ArrowParameterPlaceHolder: params = expr.params; asyncArrow = expr.async; break; default: return null; } options = { simple: true, paramSet: {} }; for (var i = 0; i < params.length; ++i) { var param = params[i]; if (param.type === syntax_1.Syntax.AssignmentPattern) { if (param.right.type === syntax_1.Syntax.YieldExpression) { if (param.right.argument) { this.throwUnexpectedToken(this.lookahead); } param.right.type = syntax_1.Syntax.Identifier; param.right.name = 'yield'; delete param.right.argument; delete param.right.delegate; } } else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') { this.throwUnexpectedToken(this.lookahead); } this.checkPatternParam(options, param); params[i] = param; } if (this.context.strict || !this.context.allowYield) { for (var i = 0; i < params.length; ++i) { var param = params[i]; if (param.type === syntax_1.Syntax.YieldExpression) { this.throwUnexpectedToken(this.lookahead); } } } if (options.message === messages_1.Messages.StrictParamDupe) { var token = this.context.strict ? options.stricted : options.firstRestricted; this.throwUnexpectedToken(token, options.message); } return { simple: options.simple, params: params, stricted: options.stricted, firstRestricted: options.firstRestricted, message: options.message }; }; Parser.prototype.parseAssignmentExpression = function () { var expr; if (!this.context.allowYield && this.matchKeyword('yield')) { expr = this.parseYieldExpression(); } else { var startToken = this.lookahead; var token = startToken; expr = this.parseConditionalExpression(); if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') { if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) { var arg = this.parsePrimaryExpression(); this.reinterpretExpressionAsPattern(arg); expr = { type: ArrowParameterPlaceHolder, params: [arg], async: true }; } } if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) { // https://tc39.github.io/ecma262/#sec-arrow-function-definitions this.context.isAssignmentTarget = false; this.context.isBindingElement = false; var isAsync = expr.async; var list = this.reinterpretAsCoverFormalsList(expr); if (list) { if (this.hasLineTerminator) { this.tolerateUnexpectedToken(this.lookahead); } this.context.firstCoverInitializedNameError = null; var previousStrict = this.context.strict; var previousAllowStrictDirective = this.context.allowStrictDirective; this.context.allowStrictDirective = list.simple; var previousAllowYield = this.context.allowYield; var previousAwait = this.context.await; this.context.allowYield = true; this.context.await = isAsync; var node = this.startNode(startToken); this.expect('=>'); var body = void 0; if (this.match('{')) { var previousAllowIn = this.context.allowIn; this.context.allowIn = true; body = this.parseFunctionSourceElements(); this.context.allowIn = previousAllowIn; } else { body = this.isolateCoverGrammar(this.parseAssignmentExpression); } var expression = body.type !== syntax_1.Syntax.BlockStatement; if (this.context.strict && list.firstRestricted) { this.throwUnexpectedToken(list.firstRestricted, list.message); } if (this.context.strict && list.stricted) { this.tolerateUnexpectedToken(list.stricted, list.message); } expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) : this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression)); this.context.strict = previousStrict; this.context.allowStrictDirective = previousAllowStrictDirective; this.context.allowYield = previousAllowYield; this.context.await = previousAwait; } } else { if (this.matchAssign()) { if (!this.context.isAssignmentTarget) { this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); } if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) { var id = expr; if (this.scanner.isRestrictedWord(id.name)) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment); } if (this.scanner.isStrictModeReservedWord(id.name)) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); } } if (!this.match('=')) { this.context.isAssignmentTarget = false; this.context.isBindingElement = false; } else { this.reinterpretExpressionAsPattern(expr); } token = this.nextToken(); var operator = token.value; var right = this.isolateCoverGrammar(this.parseAssignmentExpression); expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right)); this.context.firstCoverInitializedNameError = null; } } } return expr; }; // https://tc39.github.io/ecma262/#sec-comma-operator Parser.prototype.parseExpression = function () { var startToken = this.lookahead; var expr = this.isolateCoverGrammar(this.parseAssignmentExpression); if (this.match(',')) { var expressions = []; expressions.push(expr); while (this.lookahead.type !== 2 /* EOF */) { if (!this.match(',')) { break; } this.nextToken(); expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); } expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); } return expr; }; // https://tc39.github.io/ecma262/#sec-block Parser.prototype.parseStatementListItem = function () { var statement; this.context.isAssignmentTarget = true; this.context.isBindingElement = true; if (this.lookahead.type === 4 /* Keyword */) { switch (this.lookahead.value) { case 'export': if (!this.context.isModule) { this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration); } statement = this.parseExportDeclaration(); break; case 'import': if (!this.context.isModule) { this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration); } statement = this.parseImportDeclaration(); break; case 'const': statement = this.parseLexicalDeclaration({ inFor: false }); break; case 'function': statement = this.parseFunctionDeclaration(); break; case 'class': statement = this.parseClassDeclaration(); break; case 'let': statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement(); break; default: statement = this.parseStatement(); break; } } else { statement = this.parseStatement(); } return statement; }; Parser.prototype.parseBlock = function () { var node = this.createNode(); this.expect('{'); var block = []; while (true) { if (this.match('}')) { break; } block.push(this.parseStatementListItem()); } this.expect('}'); return this.finalize(node, new Node.BlockStatement(block)); }; // https://tc39.github.io/ecma262/#sec-let-and-const-declarations Parser.prototype.parseLexicalBinding = function (kind, options) { var node = this.createNode(); var params = []; var id = this.parsePattern(params, kind); if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { if (this.scanner.isRestrictedWord(id.name)) { this.tolerateError(messages_1.Messages.StrictVarName); } } var init = null; if (kind === 'const') { if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) { if (this.match('=')) { this.nextToken(); init = this.isolateCoverGrammar(this.parseAssignmentExpression); } else { this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const'); } } } else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) { this.expect('='); init = this.isolateCoverGrammar(this.parseAssignmentExpression); } return this.finalize(node, new Node.VariableDeclarator(id, init)); }; Parser.prototype.parseBindingList = function (kind, options) { var list = [this.parseLexicalBinding(kind, options)]; while (this.match(',')) { this.nextToken(); list.push(this.parseLexicalBinding(kind, options)); } return list; }; Parser.prototype.isLexicalDeclaration = function () { var state = this.scanner.saveState(); this.scanner.scanComments(); var next = this.scanner.lex(); this.scanner.restoreState(state); return (next.type === 3 /* Identifier */) || (next.type === 7 /* Punctuator */ && next.value === '[') || (next.type === 7 /* Punctuator */ && next.value === '{') || (next.type === 4 /* Keyword */ && next.value === 'let') || (next.type === 4 /* Keyword */ && next.value === 'yield'); }; Parser.prototype.parseLexicalDeclaration = function (options) { var node = this.createNode(); var kind = this.nextToken().value; assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const'); var declarations = this.parseBindingList(kind, options); this.consumeSemicolon(); return this.finalize(node, new Node.VariableDeclaration(declarations, kind)); }; // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns Parser.prototype.parseBindingRestElement = function (params, kind) { var node = this.createNode(); this.expect('...'); var arg = this.parsePattern(params, kind); return this.finalize(node, new Node.RestElement(arg)); }; Parser.prototype.parseArrayPattern = function (params, kind) { var node = this.createNode(); this.expect('['); var elements = []; while (!this.match(']')) { if (this.match(',')) { this.nextToken(); elements.push(null); } else { if (this.match('...')) { elements.push(this.parseBindingRestElement(params, kind)); break; } else { elements.push(this.parsePatternWithDefault(params, kind)); } if (!this.match(']')) { this.expect(','); } } } this.expect(']'); return this.finalize(node, new Node.ArrayPattern(elements)); }; Parser.prototype.parsePropertyPattern = function (params, kind) { var node = this.createNode(); var computed = false; var shorthand = false; var method = false; var key; var value; if (this.lookahead.type === 3 /* Identifier */) { var keyToken = this.lookahead; key = this.parseVariableIdentifier(); var init = this.finalize(node, new Node.Identifier(keyToken.value)); if (this.match('=')) { params.push(keyToken); shorthand = true; this.nextToken(); var expr = this.parseAssignmentExpression(); value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr)); } else if (!this.match(':')) { params.push(keyToken); shorthand = true; value = init; } else { this.expect(':'); value = this.parsePatternWithDefault(params, kind); } } else { computed = this.match('['); key = this.parseObjectPropertyKey(); this.expect(':'); value = this.parsePatternWithDefault(params, kind); } return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand)); }; Parser.prototype.parseObjectPattern = function (params, kind) { var node = this.createNode(); var properties = []; this.expect('{'); while (!this.match('}')) { properties.push(this.parsePropertyPattern(params, kind)); if (!this.match('}')) { this.expect(','); } } this.expect('}'); return this.finalize(node, new Node.ObjectPattern(properties)); }; Parser.prototype.parsePattern = function (params, kind) { var pattern; if (this.match('[')) { pattern = this.parseArrayPattern(params, kind); } else if (this.match('{')) { pattern = this.parseObjectPattern(params, kind); } else { if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) { this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding); } params.push(this.lookahead); pattern = this.parseVariableIdentifier(kind); } return pattern; }; Parser.prototype.parsePatternWithDefault = function (params, kind) { var startToken = this.lookahead; var pattern = this.parsePattern(params, kind); if (this.match('=')) { this.nextToken(); var previousAllowYield = this.context.allowYield; this.context.allowYield = true; var right = this.isolateCoverGrammar(this.parseAssignmentExpression); this.context.allowYield = previousAllowYield; pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right)); } return pattern; }; // https://tc39.github.io/ecma262/#sec-variable-statement Parser.prototype.parseVariableIdentifier = function (kind) { var node = this.createNode(); var token = this.nextToken(); if (token.type === 4 /* Keyword */ && token.value === 'yield') { if (this.context.strict) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); } else if (!this.context.allowYield) { this.throwUnexpectedToken(token); } } else if (token.type !== 3 /* Identifier */) { if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); } else { if (this.context.strict || token.value !== 'let' || kind !== 'var') { this.throwUnexpectedToken(token); } } } else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') { this.tolerateUnexpectedToken(token); } return this.finalize(node, new Node.Identifier(token.value)); }; Parser.prototype.parseVariableDeclaration = function (options) { var node = this.createNode(); var params = []; var id = this.parsePattern(params, 'var'); if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { if (this.scanner.isRestrictedWord(id.name)) { this.tolerateError(messages_1.Messages.StrictVarName); } } var init = null; if (this.match('=')) { this.nextToken(); init = this.isolateCoverGrammar(this.parseAssignmentExpression); } else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) { this.expect('='); } return this.finalize(node, new Node.VariableDeclarator(id, init)); }; Parser.prototype.parseVariableDeclarationList = function (options) { var opt = { inFor: options.inFor }; var list = []; list.push(this.parseVariableDeclaration(opt)); while (this.match(',')) { this.nextToken(); list.push(this.parseVariableDeclaration(opt)); } return list; }; Parser.prototype.parseVariableStatement = function () { var node = this.createNode(); this.expectKeyword('var'); var declarations = this.parseVariableDeclarationList({ inFor: false }); this.consumeSemicolon(); return this.finalize(node, new Node.VariableDeclaration(declarations, 'var')); }; // https://tc39.github.io/ecma262/#sec-empty-statement Parser.prototype.parseEmptyStatement = function () { var node = this.createNode(); this.expect(';'); return this.finalize(node, new Node.EmptyStatement()); }; // https://tc39.github.io/ecma262/#sec-expression-statement Parser.prototype.parseExpressionStatement = function () { var node = this.createNode(); var expr = this.parseExpression(); this.consumeSemicolon(); return this.finalize(node, new Node.ExpressionStatement(expr)); }; // https://tc39.github.io/ecma262/#sec-if-statement Parser.prototype.parseIfClause = function () { if (this.context.strict && this.matchKeyword('function')) { this.tolerateError(messages_1.Messages.StrictFunction); } return this.parseStatement(); }; Parser.prototype.parseIfStatement = function () { var node = this.createNode(); var consequent; var alternate = null; this.expectKeyword('if'); this.expect('('); var test = this.parseExpression(); if (!this.match(')') && this.config.tolerant) { this.tolerateUnexpectedToken(this.nextToken()); consequent = this.finalize(this.createNode(), new Node.EmptyStatement()); } else { this.expect(')'); consequent = this.parseIfClause(); if (this.matchKeyword('else')) { this.nextToken(); alternate = this.parseIfClause(); } } return this.finalize(node, new Node.IfStatement(test, consequent, alternate)); }; // https://tc39.github.io/ecma262/#sec-do-while-statement Parser.prototype.parseDoWhileStatement = function () { var node = this.createNode(); this.expectKeyword('do'); var previousInIteration = this.context.inIteration; this.context.inIteration = true; var body = this.parseStatement(); this.context.inIteration = previousInIteration; this.expectKeyword('while'); this.expect('('); var test = this.parseExpression(); if (!this.match(')') && this.config.tolerant) { this.tolerateUnexpectedToken(this.nextToken()); } else { this.expect(')'); if (this.match(';')) { this.nextToken(); } } return this.finalize(node, new Node.DoWhileStatement(body, test)); }; // https://tc39.github.io/ecma262/#sec-while-statement Parser.prototype.parseWhileStatement = function () { var node = this.createNode(); var body; this.expectKeyword('while'); this.expect('('); var test = this.parseExpression(); if (!this.match(')') && this.config.tolerant) { this.tolerateUnexpectedToken(this.nextToken()); body = this.finalize(this.createNode(), new Node.EmptyStatement()); } else { this.expect(')'); var previousInIteration = this.context.inIteration; this.context.inIteration = true; body = this.parseStatement(); this.context.inIteration = previousInIteration; } return this.finalize(node, new Node.WhileStatement(test, body)); }; // https://tc39.github.io/ecma262/#sec-for-statement // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements Parser.prototype.parseForStatement = function () { var init = null; var test = null; var update = null; var forIn = true; var left, right; var node = this.createNode(); this.expectKeyword('for'); this.expect('('); if (this.match(';')) { this.nextToken(); } else { if (this.matchKeyword('var')) { init = this.createNode(); this.nextToken(); var previousAllowIn = this.context.allowIn; this.context.allowIn = false; var declarations = this.parseVariableDeclarationList({ inFor: true }); this.context.allowIn = previousAllowIn; if (declarations.length === 1 && this.matchKeyword('in')) { var decl = declarations[0]; if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) { this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in'); } init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); this.nextToken(); left = init; right = this.parseExpression(); init = null; } else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); this.nextToken(); left = init; right = this.parseAssignmentExpression(); init = null; forIn = false; } else { init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); this.expect(';'); } } else if (this.matchKeyword('const') || this.matchKeyword('let')) { init = this.createNode(); var kind = this.nextToken().value; if (!this.context.strict && this.lookahead.value === 'in') { init = this.finalize(init, new Node.Identifier(kind)); this.nextToken(); left = init; right = this.parseExpression(); init = null; } else { var previousAllowIn = this.context.allowIn; this.context.allowIn = false; var declarations = this.parseBindingList(kind, { inFor: true }); this.context.allowIn = previousAllowIn; if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) { init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); this.nextToken(); left = init; right = this.parseExpression(); init = null; } else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); this.nextToken(); left = init; right = this.parseAssignmentExpression(); init = null; forIn = false; } else { this.consumeSemicolon(); init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); } } } else { var initStartToken = this.lookahead; var previousAllowIn = this.context.allowIn; this.context.allowIn = false; init = this.inheritCoverGrammar(this.parseAssignmentExpression); this.context.allowIn = previousAllowIn; if (this.matchKeyword('in')) { if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { this.tolerateError(messages_1.Messages.InvalidLHSInForIn); } this.nextToken(); this.reinterpretExpressionAsPattern(init); left = init; right = this.parseExpression(); init = null; } else if (this.matchContextualKeyword('of')) { if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { this.tolerateError(messages_1.Messages.InvalidLHSInForLoop); } this.nextToken(); this.reinterpretExpressionAsPattern(init); left = init; right = this.parseAssignmentExpression(); init = null; forIn = false; } else { if (this.match(',')) { var initSeq = [init]; while (this.match(',')) { this.nextToken(); initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); } init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq)); } this.expect(';'); } } } if (typeof left === 'undefined') { if (!this.match(';')) { test = this.parseExpression(); } this.expect(';'); if (!this.match(')')) { update = this.parseExpression(); } } var body; if (!this.match(')') && this.config.tolerant) { this.tolerateUnexpectedToken(this.nextToken()); body = this.finalize(this.createNode(), new Node.EmptyStatement()); } else { this.expect(')'); var previousInIteration = this.context.inIteration; this.context.inIteration = true; body = this.isolateCoverGrammar(this.parseStatement); this.context.inIteration = previousInIteration; } return (typeof left === 'undefined') ? this.finalize(node, new Node.ForStatement(init, test, update, body)) : forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) : this.finalize(node, new Node.ForOfStatement(left, right, body)); }; // https://tc39.github.io/ecma262/#sec-continue-statement Parser.prototype.parseContinueStatement = function () { var node = this.createNode(); this.expectKeyword('continue'); var label = null; if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { var id = this.parseVariableIdentifier(); label = id; var key = '$' + id.name; if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { this.throwError(messages_1.Messages.UnknownLabel, id.name); } } this.consumeSemicolon(); if (label === null && !this.context.inIteration) { this.throwError(messages_1.Messages.IllegalContinue); } return this.finalize(node, new Node.ContinueStatement(label)); }; // https://tc39.github.io/ecma262/#sec-break-statement Parser.prototype.parseBreakStatement = function () { var node = this.createNode(); this.expectKeyword('break'); var label = null; if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { var id = this.parseVariableIdentifier(); var key = '$' + id.name; if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { this.throwError(messages_1.Messages.UnknownLabel, id.name); } label = id; } this.consumeSemicolon(); if (label === null && !this.context.inIteration && !this.context.inSwitch) { this.throwError(messages_1.Messages.IllegalBreak); } return this.finalize(node, new Node.BreakStatement(label)); }; // https://tc39.github.io/ecma262/#sec-return-statement Parser.prototype.parseReturnStatement = function () { if (!this.context.inFunctionBody) { this.tolerateError(messages_1.Messages.IllegalReturn); } var node = this.createNode(); this.expectKeyword('return'); var hasArgument = (!this.match(';') && !this.match('}') && !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) || this.lookahead.type === 8 /* StringLiteral */ || this.lookahead.type === 10 /* Template */; var argument = hasArgument ? this.parseExpression() : null; this.consumeSemicolon(); return this.finalize(node, new Node.ReturnStatement(argument)); }; // https://tc39.github.io/ecma262/#sec-with-statement Parser.prototype.parseWithStatement = function () { if (this.context.strict) { this.tolerateError(messages_1.Messages.StrictModeWith); } var node = this.createNode(); var body; this.expectKeyword('with'); this.expect('('); var object = this.parseExpression(); if (!this.match(')') && this.config.tolerant) { this.tolerateUnexpectedToken(this.nextToken()); body = this.finalize(this.createNode(), new Node.EmptyStatement()); } else { this.expect(')'); body = this.parseStatement(); } return this.finalize(node, new Node.WithStatement(object, body)); }; // https://tc39.github.io/ecma262/#sec-switch-statement Parser.prototype.parseSwitchCase = function () { var node = this.createNode(); var test; if (this.matchKeyword('default')) { this.nextToken(); test = null; } else { this.expectKeyword('case'); test = this.parseExpression(); } this.expect(':'); var consequent = []; while (true) { if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) { break; } consequent.push(this.parseStatementListItem()); } return this.finalize(node, new Node.SwitchCase(test, consequent)); }; Parser.prototype.parseSwitchStatement = function () { var node = this.createNode(); this.expectKeyword('switch'); this.expect('('); var discriminant = this.parseExpression(); this.expect(')'); var previousInSwitch = this.context.inSwitch; this.context.inSwitch = true; var cases = []; var defaultFound = false; this.expect('{'); while (true) { if (this.match('}')) { break; } var clause = this.parseSwitchCase(); if (clause.test === null) { if (defaultFound) { this.throwError(messages_1.Messages.MultipleDefaultsInSwitch); } defaultFound = true; } cases.push(clause); } this.expect('}'); this.context.inSwitch = previousInSwitch; return this.finalize(node, new Node.SwitchStatement(discriminant, cases)); }; // https://tc39.github.io/ecma262/#sec-labelled-statements Parser.prototype.parseLabelledStatement = function () { var node = this.createNode(); var expr = this.parseExpression(); var statement; if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) { this.nextToken(); var id = expr; var key = '$' + id.name; if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name); } this.context.labelSet[key] = true; var body = void 0; if (this.matchKeyword('class')) { this.tolerateUnexpectedToken(this.lookahead); body = this.parseClassDeclaration(); } else if (this.matchKeyword('function')) { var token = this.lookahead; var declaration = this.parseFunctionDeclaration(); if (this.context.strict) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction); } else if (declaration.generator) { this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext); } body = declaration; } else { body = this.parseStatement(); } delete this.context.labelSet[key]; statement = new Node.LabeledStatement(id, body); } else { this.consumeSemicolon(); statement = new Node.ExpressionStatement(expr); } return this.finalize(node, statement); }; // https://tc39.github.io/ecma262/#sec-throw-statement Parser.prototype.parseThrowStatement = function () { var node = this.createNode(); this.expectKeyword('throw'); if (this.hasLineTerminator) { this.throwError(messages_1.Messages.NewlineAfterThrow); } var argument = this.parseExpression(); this.consumeSemicolon(); return this.finalize(node, new Node.ThrowStatement(argument)); }; // https://tc39.github.io/ecma262/#sec-try-statement Parser.prototype.parseCatchClause = function () { var node = this.createNode(); this.expectKeyword('catch'); this.expect('('); if (this.match(')')) { this.throwUnexpectedToken(this.lookahead); } var params = []; var param = this.parsePattern(params); var paramMap = {}; for (var i = 0; i < params.length; i++) { var key = '$' + params[i].value; if (Object.prototype.hasOwnProperty.call(paramMap, key)) { this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value); } paramMap[key] = true; } if (this.context.strict && param.type === syntax_1.Syntax.Identifier) { if (this.scanner.isRestrictedWord(param.name)) { this.tolerateError(messages_1.Messages.StrictCatchVariable); } } this.expect(')'); var body = this.parseBlock(); return this.finalize(node, new Node.CatchClause(param, body)); }; Parser.prototype.parseFinallyClause = function () { this.expectKeyword('finally'); return this.parseBlock(); }; Parser.prototype.parseTryStatement = function () { var node = this.createNode(); this.expectKeyword('try'); var block = this.parseBlock(); var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null; var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null; if (!handler && !finalizer) { this.throwError(messages_1.Messages.NoCatchOrFinally); } return this.finalize(node, new Node.TryStatement(block, handler, finalizer)); }; // https://tc39.github.io/ecma262/#sec-debugger-statement Parser.prototype.parseDebuggerStatement = function () { var node = this.createNode(); this.expectKeyword('debugger'); this.consumeSemicolon(); return this.finalize(node, new Node.DebuggerStatement()); }; // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations Parser.prototype.parseStatement = function () { var statement; switch (this.lookahead.type) { case 1 /* BooleanLiteral */: case 5 /* NullLiteral */: case 6 /* NumericLiteral */: case 8 /* StringLiteral */: case 10 /* Template */: case 9 /* RegularExpression */: statement = this.parseExpressionStatement(); break; case 7 /* Punctuator */: var value = this.lookahead.value; if (value === '{') { statement = this.parseBlock(); } else if (value === '(') { statement = this.parseExpressionStatement(); } else if (value === ';') { statement = this.parseEmptyStatement(); } else { statement = this.parseExpressionStatement(); } break; case 3 /* Identifier */: statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement(); break; case 4 /* Keyword */: switch (this.lookahead.value) { case 'break': statement = this.parseBreakStatement(); break; case 'continue': statement = this.parseContinueStatement(); break; case 'debugger': statement = this.parseDebuggerStatement(); break; case 'do': statement = this.parseDoWhileStatement(); break; case 'for': statement = this.parseForStatement(); break; case 'function': statement = this.parseFunctionDeclaration(); break; case 'if': statement = this.parseIfStatement(); break; case 'return': statement = this.parseReturnStatement(); break; case 'switch': statement = this.parseSwitchStatement(); break; case 'throw': statement = this.parseThrowStatement(); break; case 'try': statement = this.parseTryStatement(); break; case 'var': statement = this.parseVariableStatement(); break; case 'while': statement = this.parseWhileStatement(); break; case 'with': statement = this.parseWithStatement(); break; default: statement = this.parseExpressionStatement(); break; } break; default: statement = this.throwUnexpectedToken(this.lookahead); } return statement; }; // https://tc39.github.io/ecma262/#sec-function-definitions Parser.prototype.parseFunctionSourceElements = function () { var node = this.createNode(); this.expect('{'); var body = this.parseDirectivePrologues(); var previousLabelSet = this.context.labelSet; var previousInIteration = this.context.inIteration; var previousInSwitch = this.context.inSwitch; var previousInFunctionBody = this.context.inFunctionBody; this.context.labelSet = {}; this.context.inIteration = false; this.context.inSwitch = false; this.context.inFunctionBody = true; while (this.lookahead.type !== 2 /* EOF */) { if (this.match('}')) { break; } body.push(this.parseStatementListItem()); } this.expect('}'); this.context.labelSet = previousLabelSet; this.context.inIteration = previousInIteration; this.context.inSwitch = previousInSwitch; this.context.inFunctionBody = previousInFunctionBody; return this.finalize(node, new Node.BlockStatement(body)); }; Parser.prototype.validateParam = function (options, param, name) { var key = '$' + name; if (this.context.strict) { if (this.scanner.isRestrictedWord(name)) { options.stricted = param; options.message = messages_1.Messages.StrictParamName; } if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { options.stricted = param; options.message = messages_1.Messages.StrictParamDupe; } } else if (!options.firstRestricted) { if (this.scanner.isRestrictedWord(name)) { options.firstRestricted = param; options.message = messages_1.Messages.StrictParamName; } else if (this.scanner.isStrictModeReservedWord(name)) { options.firstRestricted = param; options.message = messages_1.Messages.StrictReservedWord; } else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { options.stricted = param; options.message = messages_1.Messages.StrictParamDupe; } } /* istanbul ignore next */ if (typeof Object.defineProperty === 'function') { Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true }); } else { options.paramSet[key] = true; } }; Parser.prototype.parseRestElement = function (params) { var node = this.createNode(); this.expect('...'); var arg = this.parsePattern(params); if (this.match('=')) { this.throwError(messages_1.Messages.DefaultRestParameter); } if (!this.match(')')) { this.throwError(messages_1.Messages.ParameterAfterRestParameter); } return this.finalize(node, new Node.RestElement(arg)); }; Parser.prototype.parseFormalParameter = function (options) { var params = []; var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params); for (var i = 0; i < params.length; i++) { this.validateParam(options, params[i], params[i].value); } options.simple = options.simple && (param instanceof Node.Identifier); options.params.push(param); }; Parser.prototype.parseFormalParameters = function (firstRestricted) { var options; options = { simple: true, params: [], firstRestricted: firstRestricted }; this.expect('('); if (!this.match(')')) { options.paramSet = {}; while (this.lookahead.type !== 2 /* EOF */) { this.parseFormalParameter(options); if (this.match(')')) { break; } this.expect(','); if (this.match(')')) { break; } } } this.expect(')'); return { simple: options.simple, params: options.params, stricted: options.stricted, firstRestricted: options.firstRestricted, message: options.message }; }; Parser.prototype.matchAsyncFunction = function () { var match = this.matchContextualKeyword('async'); if (match) { var state = this.scanner.saveState(); this.scanner.scanComments(); var next = this.scanner.lex(); this.scanner.restoreState(state); match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function'); } return match; }; Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) { var node = this.createNode(); var isAsync = this.matchContextualKeyword('async'); if (isAsync) { this.nextToken(); } this.expectKeyword('function'); var isGenerator = isAsync ? false : this.match('*'); if (isGenerator) { this.nextToken(); } var message; var id = null; var firstRestricted = null; if (!identifierIsOptional || !this.match('(')) { var token = this.lookahead; id = this.parseVariableIdentifier(); if (this.context.strict) { if (this.scanner.isRestrictedWord(token.value)) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); } } else { if (this.scanner.isRestrictedWord(token.value)) { firstRestricted = token; message = messages_1.Messages.StrictFunctionName; } else if (this.scanner.isStrictModeReservedWord(token.value)) { firstRestricted = token; message = messages_1.Messages.StrictReservedWord; } } } var previousAllowAwait = this.context.await; var previousAllowYield = this.context.allowYield; this.context.await = isAsync; this.context.allowYield = !isGenerator; var formalParameters = this.parseFormalParameters(firstRestricted); var params = formalParameters.params; var stricted = formalParameters.stricted; firstRestricted = formalParameters.firstRestricted; if (formalParameters.message) { message = formalParameters.message; } var previousStrict = this.context.strict; var previousAllowStrictDirective = this.context.allowStrictDirective; this.context.allowStrictDirective = formalParameters.simple; var body = this.parseFunctionSourceElements(); if (this.context.strict && firstRestricted) { this.throwUnexpectedToken(firstRestricted, message); } if (this.context.strict && stricted) { this.tolerateUnexpectedToken(stricted, message); } this.context.strict = previousStrict; this.context.allowStrictDirective = previousAllowStrictDirective; this.context.await = previousAllowAwait; this.context.allowYield = previousAllowYield; return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) : this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator)); }; Parser.prototype.parseFunctionExpression = function () { var node = this.createNode(); var isAsync = this.matchContextualKeyword('async'); if (isAsync) { this.nextToken(); } this.expectKeyword('function'); var isGenerator = isAsync ? false : this.match('*'); if (isGenerator) { this.nextToken(); } var message; var id = null; var firstRestricted; var previousAllowAwait = this.context.await; var previousAllowYield = this.context.allowYield; this.context.await = isAsync; this.context.allowYield = !isGenerator; if (!this.match('(')) { var token = this.lookahead; id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier(); if (this.context.strict) { if (this.scanner.isRestrictedWord(token.value)) { this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); } } else { if (this.scanner.isRestrictedWord(token.value)) { firstRestricted = token; message = messages_1.Messages.StrictFunctionName; } else if (this.scanner.isStrictModeReservedWord(token.value)) { firstRestricted = token; message = messages_1.Messages.StrictReservedWord; } } } var formalParameters = this.parseFormalParameters(firstRestricted); var params = formalParameters.params; var stricted = formalParameters.stricted; firstRestricted = formalParameters.firstRestricted; if (formalParameters.message) { message = formalParameters.message; } var previousStrict = this.context.strict; var previousAllowStrictDirective = this.context.allowStrictDirective; this.context.allowStrictDirective = formalParameters.simple; var body = this.parseFunctionSourceElements(); if (this.context.strict && firstRestricted) { this.throwUnexpectedToken(firstRestricted, message); } if (this.context.strict && stricted) { this.tolerateUnexpectedToken(stricted, message); } this.context.strict = previousStrict; this.context.allowStrictDirective = previousAllowStrictDirective; this.context.await = previousAllowAwait; this.context.allowYield = previousAllowYield; return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) : this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator)); }; // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive Parser.prototype.parseDirective = function () { var token = this.lookahead; var node = this.createNode(); var expr = this.parseExpression(); var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null; this.consumeSemicolon(); return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr)); }; Parser.prototype.parseDirectivePrologues = function () { var firstRestricted = null; var body = []; while (true) { var token = this.lookahead; if (token.type !== 8 /* StringLiteral */) { break; } var statement = this.parseDirective(); body.push(statement); var directive = statement.directive; if (typeof directive !== 'string') { break; } if (directive === 'use strict') { this.context.strict = true; if (firstRestricted) { this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral); } if (!this.context.allowStrictDirective) { this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective); } } else { if (!firstRestricted && token.octal) { firstRestricted = token; } } } return body; }; // https://tc39.github.io/ecma262/#sec-method-definitions Parser.prototype.qualifiedPropertyName = function (token) { switch (token.type) { case 3 /* Identifier */: case 8 /* StringLiteral */: case 1 /* BooleanLiteral */: case 5 /* NullLiteral */: case 6 /* NumericLiteral */: case 4 /* Keyword */: return true; case 7 /* Punctuator */: return token.value === '['; default: break; } return false; }; Parser.prototype.parseGetterMethod = function () { var node = this.createNode(); var isGenerator = false; var previousAllowYield = this.context.allowYield; this.context.allowYield = !isGenerator; var formalParameters = this.parseFormalParameters(); if (formalParameters.params.length > 0) { this.tolerateError(messages_1.Messages.BadGetterArity); } var method = this.parsePropertyMethod(formalParameters); this.context.allowYield = previousAllowYield; return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); }; Parser.prototype.parseSetterMethod = function () { var node = this.createNode(); var isGenerator = false; var previousAllowYield = this.context.allowYield; this.context.allowYield = !isGenerator; var formalParameters = this.parseFormalParameters(); if (formalParameters.params.length !== 1) { this.tolerateError(messages_1.Messages.BadSetterArity); } else if (formalParameters.params[0] instanceof Node.RestElement) { this.tolerateError(messages_1.Messages.BadSetterRestParameter); } var method = this.parsePropertyMethod(formalParameters); this.context.allowYield = previousAllowYield; return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); }; Parser.prototype.parseGeneratorMethod = function () { var node = this.createNode(); var isGenerator = true; var previousAllowYield = this.context.allowYield; this.context.allowYield = true; var params = this.parseFormalParameters(); this.context.allowYield = false; var method = this.parsePropertyMethod(params); this.context.allowYield = previousAllowYield; return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); }; // https://tc39.github.io/ecma262/#sec-generator-function-definitions Parser.prototype.isStartOfExpression = function () { var start = true; var value = this.lookahead.value; switch (this.lookahead.type) { case 7 /* Punctuator */: start = (value === '[') || (value === '(') || (value === '{') || (value === '+') || (value === '-') || (value === '!') || (value === '~') || (value === '++') || (value === '--') || (value === '/') || (value === '/='); // regular expression literal break; case 4 /* Keyword */: start = (value === 'class') || (value === 'delete') || (value === 'function') || (value === 'let') || (value === 'new') || (value === 'super') || (value === 'this') || (value === 'typeof') || (value === 'void') || (value === 'yield'); break; default: break; } return start; }; Parser.prototype.parseYieldExpression = function () { var node = this.createNode(); this.expectKeyword('yield'); var argument = null; var delegate = false; if (!this.hasLineTerminator) { var previousAllowYield = this.context.allowYield; this.context.allowYield = false; delegate = this.match('*'); if (delegate) { this.nextToken(); argument = this.parseAssignmentExpression(); } else if (this.isStartOfExpression()) { argument = this.parseAssignmentExpression(); } this.context.allowYield = previousAllowYield; } return this.finalize(node, new Node.YieldExpression(argument, delegate)); }; // https://tc39.github.io/ecma262/#sec-class-definitions Parser.prototype.parseClassElement = function (hasConstructor) { var token = this.lookahead; var node = this.createNode(); var kind = ''; var key = null; var value = null; var computed = false; var method = false; var isStatic = false; var isAsync = false; if (this.match('*')) { this.nextToken(); } else { computed = this.match('['); key = this.parseObjectPropertyKey(); var id = key; if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) { token = this.lookahead; isStatic = true; computed = this.match('['); if (this.match('*')) { this.nextToken(); } else { key = this.parseObjectPropertyKey(); } } if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) { var punctuator = this.lookahead.value; if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') { isAsync = true; token = this.lookahead; key = this.parseObjectPropertyKey(); if (token.type === 3 /* Identifier */ && token.value === 'constructor') { this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync); } } } } var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); if (token.type === 3 /* Identifier */) { if (token.value === 'get' && lookaheadPropertyKey) { kind = 'get'; computed = this.match('['); key = this.parseObjectPropertyKey(); this.context.allowYield = false; value = this.parseGetterMethod(); } else if (token.value === 'set' && lookaheadPropertyKey) { kind = 'set'; computed = this.match('['); key = this.parseObjectPropertyKey(); value = this.parseSetterMethod(); } } else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { kind = 'init'; computed = this.match('['); key = this.parseObjectPropertyKey(); value = this.parseGeneratorMethod(); method = true; } if (!kind && key && this.match('(')) { kind = 'init'; value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); method = true; } if (!kind) { this.throwUnexpectedToken(this.lookahead); } if (kind === 'init') { kind = 'method'; } if (!computed) { if (isStatic && this.isPropertyKey(key, 'prototype')) { this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype); } if (!isStatic && this.isPropertyKey(key, 'constructor')) { if (kind !== 'method' || !method || (value && value.generator)) { this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod); } if (hasConstructor.value) { this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor); } else { hasConstructor.value = true; } kind = 'constructor'; } } return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic)); }; Parser.prototype.parseClassElementList = function () { var body = []; var hasConstructor = { value: false }; this.expect('{'); while (!this.match('}')) { if (this.match(';')) { this.nextToken(); } else { body.push(this.parseClassElement(hasConstructor)); } } this.expect('}'); return body; }; Parser.prototype.parseClassBody = function () { var node = this.createNode(); var elementList = this.parseClassElementList(); return this.finalize(node, new Node.ClassBody(elementList)); }; Parser.prototype.parseClassDeclaration = function (identifierIsOptional) { var node = this.createNode(); var previousStrict = this.context.strict; this.context.strict = true; this.expectKeyword('class'); var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier(); var superClass = null; if (this.matchKeyword('extends')) { this.nextToken(); superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); } var classBody = this.parseClassBody(); this.context.strict = previousStrict; return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody)); }; Parser.prototype.parseClassExpression = function () { var node = this.createNode(); var previousStrict = this.context.strict; this.context.strict = true; this.expectKeyword('class'); var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null; var superClass = null; if (this.matchKeyword('extends')) { this.nextToken(); superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); } var classBody = this.parseClassBody(); this.context.strict = previousStrict; return this.finalize(node, new Node.ClassExpression(id, superClass, classBody)); }; // https://tc39.github.io/ecma262/#sec-scripts // https://tc39.github.io/ecma262/#sec-modules Parser.prototype.parseModule = function () { this.context.strict = true; this.context.isModule = true; this.scanner.isModule = true; var node = this.createNode(); var body = this.parseDirectivePrologues(); while (this.lookahead.type !== 2 /* EOF */) { body.push(this.parseStatementListItem()); } return this.finalize(node, new Node.Module(body)); }; Parser.prototype.parseScript = function () { var node = this.createNode(); var body = this.parseDirectivePrologues(); while (this.lookahead.type !== 2 /* EOF */) { body.push(this.parseStatementListItem()); } return this.finalize(node, new Node.Script(body)); }; // https://tc39.github.io/ecma262/#sec-imports Parser.prototype.parseModuleSpecifier = function () { var node = this.createNode(); if (this.lookahead.type !== 8 /* StringLiteral */) { this.throwError(messages_1.Messages.InvalidModuleSpecifier); } var token = this.nextToken(); var raw = this.getTokenRaw(token); return this.finalize(node, new Node.Literal(token.value, raw)); }; // import {} ...; Parser.prototype.parseImportSpecifier = function () { var node = this.createNode(); var imported; var local; if (this.lookahead.type === 3 /* Identifier */) { imported = this.parseVariableIdentifier(); local = imported; if (this.matchContextualKeyword('as')) { this.nextToken(); local = this.parseVariableIdentifier(); } } else { imported = this.parseIdentifierName(); local = imported; if (this.matchContextualKeyword('as')) { this.nextToken(); local = this.parseVariableIdentifier(); } else { this.throwUnexpectedToken(this.nextToken()); } } return this.finalize(node, new Node.ImportSpecifier(local, imported)); }; // {foo, bar as bas} Parser.prototype.parseNamedImports = function () { this.expect('{'); var specifiers = []; while (!this.match('}')) { specifiers.push(this.parseImportSpecifier()); if (!this.match('}')) { this.expect(','); } } this.expect('}'); return specifiers; }; // import ...; Parser.prototype.parseImportDefaultSpecifier = function () { var node = this.createNode(); var local = this.parseIdentifierName(); return this.finalize(node, new Node.ImportDefaultSpecifier(local)); }; // import <* as foo> ...; Parser.prototype.parseImportNamespaceSpecifier = function () { var node = this.createNode(); this.expect('*'); if (!this.matchContextualKeyword('as')) { this.throwError(messages_1.Messages.NoAsAfterImportNamespace); } this.nextToken(); var local = this.parseIdentifierName(); return this.finalize(node, new Node.ImportNamespaceSpecifier(local)); }; Parser.prototype.parseImportDeclaration = function () { if (this.context.inFunctionBody) { this.throwError(messages_1.Messages.IllegalImportDeclaration); } var node = this.createNode(); this.expectKeyword('import'); var src; var specifiers = []; if (this.lookahead.type === 8 /* StringLiteral */) { // import 'foo'; src = this.parseModuleSpecifier(); } else { if (this.match('{')) { // import {bar} specifiers = specifiers.concat(this.parseNamedImports()); } else if (this.match('*')) { // import * as foo specifiers.push(this.parseImportNamespaceSpecifier()); } else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) { // import foo specifiers.push(this.parseImportDefaultSpecifier()); if (this.match(',')) { this.nextToken(); if (this.match('*')) { // import foo, * as foo specifiers.push(this.parseImportNamespaceSpecifier()); } else if (this.match('{')) { // import foo, {bar} specifiers = specifiers.concat(this.parseNamedImports()); } else { this.throwUnexpectedToken(this.lookahead); } } } else { this.throwUnexpectedToken(this.nextToken()); } if (!this.matchContextualKeyword('from')) { var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; this.throwError(message, this.lookahead.value); } this.nextToken(); src = this.parseModuleSpecifier(); } this.consumeSemicolon(); return this.finalize(node, new Node.ImportDeclaration(specifiers, src)); }; // https://tc39.github.io/ecma262/#sec-exports Parser.prototype.parseExportSpecifier = function () { var node = this.createNode(); var local = this.parseIdentifierName(); var exported = local; if (this.matchContextualKeyword('as')) { this.nextToken(); exported = this.parseIdentifierName(); } return this.finalize(node, new Node.ExportSpecifier(local, exported)); }; Parser.prototype.parseExportDeclaration = function () { if (this.context.inFunctionBody) { this.throwError(messages_1.Messages.IllegalExportDeclaration); } var node = this.createNode(); this.expectKeyword('export'); var exportDeclaration; if (this.matchKeyword('default')) { // export default ... this.nextToken(); if (this.matchKeyword('function')) { // export default function foo () {} // export default function () {} var declaration = this.parseFunctionDeclaration(true); exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); } else if (this.matchKeyword('class')) { // export default class foo {} var declaration = this.parseClassDeclaration(true); exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); } else if (this.matchContextualKeyword('async')) { // export default async function f () {} // export default async function () {} // export default async x => x var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression(); exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); } else { if (this.matchContextualKeyword('from')) { this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value); } // export default {}; // export default []; // export default (1 + 2); var declaration = this.match('{') ? this.parseObjectInitializer() : this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression(); this.consumeSemicolon(); exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); } } else if (this.match('*')) { // export * from 'foo'; this.nextToken(); if (!this.matchContextualKeyword('from')) { var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; this.throwError(message, this.lookahead.value); } this.nextToken(); var src = this.parseModuleSpecifier(); this.consumeSemicolon(); exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src)); } else if (this.lookahead.type === 4 /* Keyword */) { // export var f = 1; var declaration = void 0; switch (this.lookahead.value) { case 'let': case 'const': declaration = this.parseLexicalDeclaration({ inFor: false }); break; case 'var': case 'class': case 'function': declaration = this.parseStatementListItem(); break; default: this.throwUnexpectedToken(this.lookahead); } exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); } else if (this.matchAsyncFunction()) { var declaration = this.parseFunctionDeclaration(); exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); } else { var specifiers = []; var source = null; var isExportFromIdentifier = false; this.expect('{'); while (!this.match('}')) { isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default'); specifiers.push(this.parseExportSpecifier()); if (!this.match('}')) { this.expect(','); } } this.expect('}'); if (this.matchContextualKeyword('from')) { // export {default} from 'foo'; // export {foo} from 'foo'; this.nextToken(); source = this.parseModuleSpecifier(); this.consumeSemicolon(); } else if (isExportFromIdentifier) { // export {default}; // missing fromClause var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; this.throwError(message, this.lookahead.value); } else { // export {foo}; this.consumeSemicolon(); } exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source)); } return exportDeclaration; }; return Parser; }()); exports.Parser = Parser; /***/ }, /* 9 */ /***/ function(module, exports) { "use strict"; // Ensure the condition is true, otherwise throw an error. // This is only to have a better contract semantic, i.e. another safety net // to catch a logic error. The condition shall be fulfilled in normal case. // Do NOT use this to enforce a certain condition on any user input. Object.defineProperty(exports, "__esModule", { value: true }); function assert(condition, message) { /* istanbul ignore if */ if (!condition) { throw new Error('ASSERT: ' + message); } } exports.assert = assert; /***/ }, /* 10 */ /***/ function(module, exports) { "use strict"; /* tslint:disable:max-classes-per-file */ Object.defineProperty(exports, "__esModule", { value: true }); var ErrorHandler = (function () { function ErrorHandler() { this.errors = []; this.tolerant = false; } ErrorHandler.prototype.recordError = function (error) { this.errors.push(error); }; ErrorHandler.prototype.tolerate = function (error) { if (this.tolerant) { this.recordError(error); } else { throw error; } }; ErrorHandler.prototype.constructError = function (msg, column) { var error = new Error(msg); try { throw error; } catch (base) { /* istanbul ignore else */ if (Object.create && Object.defineProperty) { error = Object.create(base); Object.defineProperty(error, 'column', { value: column }); } } /* istanbul ignore next */ return error; }; ErrorHandler.prototype.createError = function (index, line, col, description) { var msg = 'Line ' + line + ': ' + description; var error = this.constructError(msg, col); error.index = index; error.lineNumber = line; error.description = description; return error; }; ErrorHandler.prototype.throwError = function (index, line, col, description) { throw this.createError(index, line, col, description); }; ErrorHandler.prototype.tolerateError = function (index, line, col, description) { var error = this.createError(index, line, col, description); if (this.tolerant) { this.recordError(error); } else { throw error; } }; return ErrorHandler; }()); exports.ErrorHandler = ErrorHandler; /***/ }, /* 11 */ /***/ function(module, exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // Error messages should be identical to V8. exports.Messages = { BadGetterArity: 'Getter must not have any formal parameters', BadSetterArity: 'Setter must have exactly one formal parameter', BadSetterRestParameter: 'Setter function argument must not be a rest parameter', ConstructorIsAsync: 'Class constructor may not be an async method', ConstructorSpecialMethod: 'Class constructor may not be an accessor', DeclarationMissingInitializer: 'Missing initializer in %0 declaration', DefaultRestParameter: 'Unexpected token =', DuplicateBinding: 'Duplicate binding %0', DuplicateConstructor: 'A class may only have one constructor', DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals', ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer', GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts', IllegalBreak: 'Illegal break statement', IllegalContinue: 'Illegal continue statement', IllegalExportDeclaration: 'Unexpected token', IllegalImportDeclaration: 'Unexpected token', IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list', IllegalReturn: 'Illegal return statement', InvalidEscapedReservedWord: 'Keyword must not contain escaped characters', InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence', InvalidLHSInAssignment: 'Invalid left-hand side in assignment', InvalidLHSInForIn: 'Invalid left-hand side in for-in', InvalidLHSInForLoop: 'Invalid left-hand side in for-loop', InvalidModuleSpecifier: 'Unexpected token', InvalidRegExp: 'Invalid regular expression', LetInLexicalBinding: 'let is disallowed as a lexically bound name', MissingFromClause: 'Unexpected token', MultipleDefaultsInSwitch: 'More than one default clause in switch statement', NewlineAfterThrow: 'Illegal newline after throw', NoAsAfterImportNamespace: 'Unexpected token', NoCatchOrFinally: 'Missing catch or finally after try', ParameterAfterRestParameter: 'Rest parameter must be last formal parameter', Redeclaration: '%0 \'%1\' has already been declared', StaticPrototype: 'Classes may not have static property named prototype', StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', StrictDelete: 'Delete of an unqualified identifier in strict mode.', StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block', StrictFunctionName: 'Function name may not be eval or arguments in strict mode', StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', StrictModeWith: 'Strict mode code may not include a with statement', StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', StrictParamDupe: 'Strict mode function may not have duplicate parameter names', StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', StrictReservedWord: 'Use of future reserved word in strict mode', StrictVarName: 'Variable name may not be eval or arguments in strict mode', TemplateOctalLiteral: 'Octal literals are not allowed in template strings.', UnexpectedEOS: 'Unexpected end of input', UnexpectedIdentifier: 'Unexpected identifier', UnexpectedNumber: 'Unexpected number', UnexpectedReserved: 'Unexpected reserved word', UnexpectedString: 'Unexpected string', UnexpectedTemplate: 'Unexpected quasi %0', UnexpectedToken: 'Unexpected token %0', UnexpectedTokenIllegal: 'Unexpected token ILLEGAL', UnknownLabel: 'Undefined label \'%0\'', UnterminatedRegExp: 'Invalid regular expression: missing /' }; /***/ }, /* 12 */ /***/ function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var assert_1 = __webpack_require__(9); var character_1 = __webpack_require__(4); var messages_1 = __webpack_require__(11); function hexValue(ch) { return '0123456789abcdef'.indexOf(ch.toLowerCase()); } function octalValue(ch) { return '01234567'.indexOf(ch); } var Scanner = (function () { function Scanner(code, handler) { this.source = code; this.errorHandler = handler; this.trackComment = false; this.isModule = false; this.length = code.length; this.index = 0; this.lineNumber = (code.length > 0) ? 1 : 0; this.lineStart = 0; this.curlyStack = []; } Scanner.prototype.saveState = function () { return { index: this.index, lineNumber: this.lineNumber, lineStart: this.lineStart }; }; Scanner.prototype.restoreState = function (state) { this.index = state.index; this.lineNumber = state.lineNumber; this.lineStart = state.lineStart; }; Scanner.prototype.eof = function () { return this.index >= this.length; }; Scanner.prototype.throwUnexpectedToken = function (message) { if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); }; Scanner.prototype.tolerateUnexpectedToken = function (message) { if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); }; // https://tc39.github.io/ecma262/#sec-comments Scanner.prototype.skipSingleLineComment = function (offset) { var comments = []; var start, loc; if (this.trackComment) { comments = []; start = this.index - offset; loc = { start: { line: this.lineNumber, column: this.index - this.lineStart - offset }, end: {} }; } while (!this.eof()) { var ch = this.source.charCodeAt(this.index); ++this.index; if (character_1.Character.isLineTerminator(ch)) { if (this.trackComment) { loc.end = { line: this.lineNumber, column: this.index - this.lineStart - 1 }; var entry = { multiLine: false, slice: [start + offset, this.index - 1], range: [start, this.index - 1], loc: loc }; comments.push(entry); } if (ch === 13 && this.source.charCodeAt(this.index) === 10) { ++this.index; } ++this.lineNumber; this.lineStart = this.index; return comments; } } if (this.trackComment) { loc.end = { line: this.lineNumber, column: this.index - this.lineStart }; var entry = { multiLine: false, slice: [start + offset, this.index], range: [start, this.index], loc: loc }; comments.push(entry); } return comments; }; Scanner.prototype.skipMultiLineComment = function () { var comments = []; var start, loc; if (this.trackComment) { comments = []; start = this.index - 2; loc = { start: { line: this.lineNumber, column: this.index - this.lineStart - 2 }, end: {} }; } while (!this.eof()) { var ch = this.source.charCodeAt(this.index); if (character_1.Character.isLineTerminator(ch)) { if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) { ++this.index; } ++this.lineNumber; ++this.index; this.lineStart = this.index; } else if (ch === 0x2A) { // Block comment ends with '*/'. if (this.source.charCodeAt(this.index + 1) === 0x2F) { this.index += 2; if (this.trackComment) { loc.end = { line: this.lineNumber, column: this.index - this.lineStart }; var entry = { multiLine: true, slice: [start + 2, this.index - 2], range: [start, this.index], loc: loc }; comments.push(entry); } return comments; } ++this.index; } else { ++this.index; } } // Ran off the end of the file - the whole thing is a comment if (this.trackComment) { loc.end = { line: this.lineNumber, column: this.index - this.lineStart }; var entry = { multiLine: true, slice: [start + 2, this.index], range: [start, this.index], loc: loc }; comments.push(entry); } this.tolerateUnexpectedToken(); return comments; }; Scanner.prototype.scanComments = function () { var comments; if (this.trackComment) { comments = []; } var start = (this.index === 0); while (!this.eof()) { var ch = this.source.charCodeAt(this.index); if (character_1.Character.isWhiteSpace(ch)) { ++this.index; } else if (character_1.Character.isLineTerminator(ch)) { ++this.index; if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) { ++this.index; } ++this.lineNumber; this.lineStart = this.index; start = true; } else if (ch === 0x2F) { ch = this.source.charCodeAt(this.index + 1); if (ch === 0x2F) { this.index += 2; var comment = this.skipSingleLineComment(2); if (this.trackComment) { comments = comments.concat(comment); } start = true; } else if (ch === 0x2A) { this.index += 2; var comment = this.skipMultiLineComment(); if (this.trackComment) { comments = comments.concat(comment); } } else { break; } } else if (start && ch === 0x2D) { // U+003E is '>' if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) { // '-->' is a single-line comment this.index += 3; var comment = this.skipSingleLineComment(3); if (this.trackComment) { comments = comments.concat(comment); } } else { break; } } else if (ch === 0x3C && !this.isModule) { if (this.source.slice(this.index + 1, this.index + 4) === '!--') { this.index += 4; // ` (0,0,1,1,0,0) optimize() { // times or values may be shared with other tracks, so overwriting is unsafe const times = AnimationUtils.arraySlice( this.times ), values = AnimationUtils.arraySlice( this.values ), stride = this.getValueSize(), smoothInterpolation = this.getInterpolation() === InterpolateSmooth, lastIndex = times.length - 1; let writeIndex = 1; for ( let i = 1; i < lastIndex; ++ i ) { let keep = false; const time = times[ i ]; const timeNext = times[ i + 1 ]; // remove adjacent keyframes scheduled at the same time if ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) { if ( ! smoothInterpolation ) { // remove unnecessary keyframes same as their neighbors const offset = i * stride, offsetP = offset - stride, offsetN = offset + stride; for ( let j = 0; j !== stride; ++ j ) { const value = values[ offset + j ]; if ( value !== values[ offsetP + j ] || value !== values[ offsetN + j ] ) { keep = true; break; } } } else { keep = true; } } // in-place compaction if ( keep ) { if ( i !== writeIndex ) { times[ writeIndex ] = times[ i ]; const readOffset = i * stride, writeOffset = writeIndex * stride; for ( let j = 0; j !== stride; ++ j ) { values[ writeOffset + j ] = values[ readOffset + j ]; } } ++ writeIndex; } } // flush last keyframe (compaction looks ahead) if ( lastIndex > 0 ) { times[ writeIndex ] = times[ lastIndex ]; for ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) { values[ writeOffset + j ] = values[ readOffset + j ]; } ++ writeIndex; } if ( writeIndex !== times.length ) { this.times = AnimationUtils.arraySlice( times, 0, writeIndex ); this.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride ); } else { this.times = times; this.values = values; } return this; } clone() { const times = AnimationUtils.arraySlice( this.times, 0 ); const values = AnimationUtils.arraySlice( this.values, 0 ); const TypedKeyframeTrack = this.constructor; const track = new TypedKeyframeTrack( this.name, times, values ); // Interpolant argument to constructor is not saved, so copy the factory method directly. track.createInterpolant = this.createInterpolant; return track; } } KeyframeTrack.prototype.TimeBufferType = Float32Array; KeyframeTrack.prototype.ValueBufferType = Float32Array; KeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; /** * A Track of Boolean keyframe values. */ class BooleanKeyframeTrack extends KeyframeTrack {} BooleanKeyframeTrack.prototype.ValueTypeName = 'bool'; BooleanKeyframeTrack.prototype.ValueBufferType = Array; BooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; BooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; BooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; /** * A Track of keyframe values that represent color. */ class ColorKeyframeTrack extends KeyframeTrack {} ColorKeyframeTrack.prototype.ValueTypeName = 'color'; /** * A Track of numeric keyframe values. */ class NumberKeyframeTrack extends KeyframeTrack {} NumberKeyframeTrack.prototype.ValueTypeName = 'number'; /** * Spherical linear unit quaternion interpolant. */ class QuaternionLinearInterpolant extends Interpolant { constructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) { super( parameterPositions, sampleValues, sampleSize, resultBuffer ); } interpolate_( i1, t0, t, t1 ) { const result = this.resultBuffer, values = this.sampleValues, stride = this.valueSize, alpha = ( t - t0 ) / ( t1 - t0 ); let offset = i1 * stride; for ( let end = offset + stride; offset !== end; offset += 4 ) { Quaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha ); } return result; } } /** * A Track of quaternion keyframe values. */ class QuaternionKeyframeTrack extends KeyframeTrack { InterpolantFactoryMethodLinear( result ) { return new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result ); } } QuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion'; // ValueBufferType is inherited QuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear; QuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; /** * A Track that interpolates Strings */ class StringKeyframeTrack extends KeyframeTrack {} StringKeyframeTrack.prototype.ValueTypeName = 'string'; StringKeyframeTrack.prototype.ValueBufferType = Array; StringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete; StringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined; StringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined; /** * A Track of vectored keyframe values. */ class VectorKeyframeTrack extends KeyframeTrack {} VectorKeyframeTrack.prototype.ValueTypeName = 'vector'; class AnimationClip { constructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) { this.name = name; this.tracks = tracks; this.duration = duration; this.blendMode = blendMode; this.uuid = generateUUID(); // this means it should figure out its duration by scanning the tracks if ( this.duration < 0 ) { this.resetDuration(); } } static parse( json ) { const tracks = [], jsonTracks = json.tracks, frameTime = 1.0 / ( json.fps || 1.0 ); for ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) { tracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) ); } const clip = new this( json.name, json.duration, tracks, json.blendMode ); clip.uuid = json.uuid; return clip; } static toJSON( clip ) { const tracks = [], clipTracks = clip.tracks; const json = { 'name': clip.name, 'duration': clip.duration, 'tracks': tracks, 'uuid': clip.uuid, 'blendMode': clip.blendMode }; for ( let i = 0, n = clipTracks.length; i !== n; ++ i ) { tracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) ); } return json; } static CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) { const numMorphTargets = morphTargetSequence.length; const tracks = []; for ( let i = 0; i < numMorphTargets; i ++ ) { let times = []; let values = []; times.push( ( i + numMorphTargets - 1 ) % numMorphTargets, i, ( i + 1 ) % numMorphTargets ); values.push( 0, 1, 0 ); const order = AnimationUtils.getKeyframeOrder( times ); times = AnimationUtils.sortedArray( times, 1, order ); values = AnimationUtils.sortedArray( values, 1, order ); // if there is a key at the first frame, duplicate it as the // last frame as well for perfect loop. if ( ! noLoop && times[ 0 ] === 0 ) { times.push( numMorphTargets ); values.push( values[ 0 ] ); } tracks.push( new NumberKeyframeTrack( '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', times, values ).scale( 1.0 / fps ) ); } return new this( name, - 1, tracks ); } static findByName( objectOrClipArray, name ) { let clipArray = objectOrClipArray; if ( ! Array.isArray( objectOrClipArray ) ) { const o = objectOrClipArray; clipArray = o.geometry && o.geometry.animations || o.animations; } for ( let i = 0; i < clipArray.length; i ++ ) { if ( clipArray[ i ].name === name ) { return clipArray[ i ]; } } return null; } static CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) { const animationToMorphTargets = {}; // tested with https://regex101.com/ on trick sequences // such flamingo_flyA_003, flamingo_run1_003, crdeath0059 const pattern = /^([\w-]*?)([\d]+)$/; // sort morph target names into animation groups based // patterns like Walk_001, Walk_002, Run_001, Run_002 for ( let i = 0, il = morphTargets.length; i < il; i ++ ) { const morphTarget = morphTargets[ i ]; const parts = morphTarget.name.match( pattern ); if ( parts && parts.length > 1 ) { const name = parts[ 1 ]; let animationMorphTargets = animationToMorphTargets[ name ]; if ( ! animationMorphTargets ) { animationToMorphTargets[ name ] = animationMorphTargets = []; } animationMorphTargets.push( morphTarget ); } } const clips = []; for ( const name in animationToMorphTargets ) { clips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); } return clips; } // parse the animation.hierarchy format static parseAnimation( animation, bones ) { if ( ! animation ) { console.error( 'THREE.AnimationClip: No animation in JSONLoader data.' ); return null; } const addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) { // only return track if there are actually keys. if ( animationKeys.length !== 0 ) { const times = []; const values = []; AnimationUtils.flattenJSON( animationKeys, times, values, propertyName ); // empty keys are filtered out, so check again if ( times.length !== 0 ) { destTracks.push( new trackType( trackName, times, values ) ); } } }; const tracks = []; const clipName = animation.name || 'default'; const fps = animation.fps || 30; const blendMode = animation.blendMode; // automatic length determination in AnimationClip. let duration = animation.length || - 1; const hierarchyTracks = animation.hierarchy || []; for ( let h = 0; h < hierarchyTracks.length; h ++ ) { const animationKeys = hierarchyTracks[ h ].keys; // skip empty tracks if ( ! animationKeys || animationKeys.length === 0 ) continue; // process morph targets if ( animationKeys[ 0 ].morphTargets ) { // figure out all morph targets used in this track const morphTargetNames = {}; let k; for ( k = 0; k < animationKeys.length; k ++ ) { if ( animationKeys[ k ].morphTargets ) { for ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) { morphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1; } } } // create a track for each morph target with all zero // morphTargetInfluences except for the keys in which // the morphTarget is named. for ( const morphTargetName in morphTargetNames ) { const times = []; const values = []; for ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) { const animationKey = animationKeys[ k ]; times.push( animationKey.time ); values.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 ); } tracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); } duration = morphTargetNames.length * fps; } else { // ...assume skeletal animation const boneName = '.bones[' + bones[ h ].name + ']'; addNonemptyTrack( VectorKeyframeTrack, boneName + '.position', animationKeys, 'pos', tracks ); addNonemptyTrack( QuaternionKeyframeTrack, boneName + '.quaternion', animationKeys, 'rot', tracks ); addNonemptyTrack( VectorKeyframeTrack, boneName + '.scale', animationKeys, 'scl', tracks ); } } if ( tracks.length === 0 ) { return null; } const clip = new this( clipName, duration, tracks, blendMode ); return clip; } resetDuration() { const tracks = this.tracks; let duration = 0; for ( let i = 0, n = tracks.length; i !== n; ++ i ) { const track = this.tracks[ i ]; duration = Math.max( duration, track.times[ track.times.length - 1 ] ); } this.duration = duration; return this; } trim() { for ( let i = 0; i < this.tracks.length; i ++ ) { this.tracks[ i ].trim( 0, this.duration ); } return this; } validate() { let valid = true; for ( let i = 0; i < this.tracks.length; i ++ ) { valid = valid && this.tracks[ i ].validate(); } return valid; } optimize() { for ( let i = 0; i < this.tracks.length; i ++ ) { this.tracks[ i ].optimize(); } return this; } clone() { const tracks = []; for ( let i = 0; i < this.tracks.length; i ++ ) { tracks.push( this.tracks[ i ].clone() ); } return new this.constructor( this.name, this.duration, tracks, this.blendMode ); } toJSON() { return this.constructor.toJSON( this ); } } function getTrackTypeForValueTypeName( typeName ) { switch ( typeName.toLowerCase() ) { case 'scalar': case 'double': case 'float': case 'number': case 'integer': return NumberKeyframeTrack; case 'vector': case 'vector2': case 'vector3': case 'vector4': return VectorKeyframeTrack; case 'color': return ColorKeyframeTrack; case 'quaternion': return QuaternionKeyframeTrack; case 'bool': case 'boolean': return BooleanKeyframeTrack; case 'string': return StringKeyframeTrack; } throw new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName ); } function parseKeyframeTrack( json ) { if ( json.type === undefined ) { throw new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' ); } const trackType = getTrackTypeForValueTypeName( json.type ); if ( json.times === undefined ) { const times = [], values = []; AnimationUtils.flattenJSON( json.keys, times, values, 'value' ); json.times = times; json.values = values; } // derived classes can define a static parse method if ( trackType.parse !== undefined ) { return trackType.parse( json ); } else { // by default, we assume a constructor compatible with the base return new trackType( json.name, json.times, json.values, json.interpolation ); } } const Cache = { enabled: false, files: {}, add: function ( key, file ) { if ( this.enabled === false ) return; // console.log( 'THREE.Cache', 'Adding key:', key ); this.files[ key ] = file; }, get: function ( key ) { if ( this.enabled === false ) return; // console.log( 'THREE.Cache', 'Checking key:', key ); return this.files[ key ]; }, remove: function ( key ) { delete this.files[ key ]; }, clear: function () { this.files = {}; } }; class LoadingManager { constructor( onLoad, onProgress, onError ) { const scope = this; let isLoading = false; let itemsLoaded = 0; let itemsTotal = 0; let urlModifier = undefined; const handlers = []; // Refer to #5689 for the reason why we don't set .onStart // in the constructor this.onStart = undefined; this.onLoad = onLoad; this.onProgress = onProgress; this.onError = onError; this.itemStart = function ( url ) { itemsTotal ++; if ( isLoading === false ) { if ( scope.onStart !== undefined ) { scope.onStart( url, itemsLoaded, itemsTotal ); } } isLoading = true; }; this.itemEnd = function ( url ) { itemsLoaded ++; if ( scope.onProgress !== undefined ) { scope.onProgress( url, itemsLoaded, itemsTotal ); } if ( itemsLoaded === itemsTotal ) { isLoading = false; if ( scope.onLoad !== undefined ) { scope.onLoad(); } } }; this.itemError = function ( url ) { if ( scope.onError !== undefined ) { scope.onError( url ); } }; this.resolveURL = function ( url ) { if ( urlModifier ) { return urlModifier( url ); } return url; }; this.setURLModifier = function ( transform ) { urlModifier = transform; return this; }; this.addHandler = function ( regex, loader ) { handlers.push( regex, loader ); return this; }; this.removeHandler = function ( regex ) { const index = handlers.indexOf( regex ); if ( index !== - 1 ) { handlers.splice( index, 2 ); } return this; }; this.getHandler = function ( file ) { for ( let i = 0, l = handlers.length; i < l; i += 2 ) { const regex = handlers[ i ]; const loader = handlers[ i + 1 ]; if ( regex.global ) regex.lastIndex = 0; // see #17920 if ( regex.test( file ) ) { return loader; } } return null; }; } } const DefaultLoadingManager = new LoadingManager(); class Loader { constructor( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager; this.crossOrigin = 'anonymous'; this.withCredentials = false; this.path = ''; this.resourcePath = ''; this.requestHeader = {}; } load( /* url, onLoad, onProgress, onError */ ) {} loadAsync( url, onProgress ) { const scope = this; return new Promise( function ( resolve, reject ) { scope.load( url, resolve, onProgress, reject ); } ); } parse( /* data */ ) {} setCrossOrigin( crossOrigin ) { this.crossOrigin = crossOrigin; return this; } setWithCredentials( value ) { this.withCredentials = value; return this; } setPath( path ) { this.path = path; return this; } setResourcePath( resourcePath ) { this.resourcePath = resourcePath; return this; } setRequestHeader( requestHeader ) { this.requestHeader = requestHeader; return this; } } const loading = {}; class FileLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { if ( url === undefined ) url = ''; if ( this.path !== undefined ) url = this.path + url; url = this.manager.resolveURL( url ); const cached = Cache.get( url ); if ( cached !== undefined ) { this.manager.itemStart( url ); setTimeout( () => { if ( onLoad ) onLoad( cached ); this.manager.itemEnd( url ); }, 0 ); return cached; } // Check if request is duplicate if ( loading[ url ] !== undefined ) { loading[ url ].push( { onLoad: onLoad, onProgress: onProgress, onError: onError } ); return; } // Initialise array for duplicate requests loading[ url ] = []; loading[ url ].push( { onLoad: onLoad, onProgress: onProgress, onError: onError, } ); // create request const req = new Request( url, { headers: new Headers( this.requestHeader ), credentials: this.withCredentials ? 'include' : 'same-origin', // An abort controller could be added within a future PR } ); // record states ( avoid data race ) const mimeType = this.mimeType; const responseType = this.responseType; // start the fetch fetch( req ) .then( response => { if ( response.status === 200 || response.status === 0 ) { // Some browsers return HTTP Status 0 when using non-http protocol // e.g. 'file://' or 'data://'. Handle as success. if ( response.status === 0 ) { console.warn( 'THREE.FileLoader: HTTP Status 0 received.' ); } // Workaround: Checking if response.body === undefined for Alipay browser #23548 if ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) { return response; } const callbacks = loading[ url ]; const reader = response.body.getReader(); const contentLength = response.headers.get( 'Content-Length' ); const total = contentLength ? parseInt( contentLength ) : 0; const lengthComputable = total !== 0; let loaded = 0; // periodically read data into the new stream tracking while download progress const stream = new ReadableStream( { start( controller ) { readData(); function readData() { reader.read().then( ( { done, value } ) => { if ( done ) { controller.close(); } else { loaded += value.byteLength; const event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } ); for ( let i = 0, il = callbacks.length; i < il; i ++ ) { const callback = callbacks[ i ]; if ( callback.onProgress ) callback.onProgress( event ); } controller.enqueue( value ); readData(); } } ); } } } ); return new Response( stream ); } else { throw Error( `fetch for "${response.url}" responded with ${response.status}: ${response.statusText}` ); } } ) .then( response => { switch ( responseType ) { case 'arraybuffer': return response.arrayBuffer(); case 'blob': return response.blob(); case 'document': return response.text() .then( text => { const parser = new DOMParser(); return parser.parseFromString( text, mimeType ); } ); case 'json': return response.json(); default: if ( mimeType === undefined ) { return response.text(); } else { // sniff encoding const re = /charset="?([^;"\s]*)"?/i; const exec = re.exec( mimeType ); const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined; const decoder = new TextDecoder( label ); return response.arrayBuffer().then( ab => decoder.decode( ab ) ); } } } ) .then( data => { // Add to cache only on HTTP success, so that we do not cache // error response bodies as proper responses to requests. Cache.add( url, data ); const callbacks = loading[ url ]; delete loading[ url ]; for ( let i = 0, il = callbacks.length; i < il; i ++ ) { const callback = callbacks[ i ]; if ( callback.onLoad ) callback.onLoad( data ); } } ) .catch( err => { // Abort errors and other errors are handled the same const callbacks = loading[ url ]; if ( callbacks === undefined ) { // When onLoad was called and url was deleted in `loading` this.manager.itemError( url ); throw err; } delete loading[ url ]; for ( let i = 0, il = callbacks.length; i < il; i ++ ) { const callback = callbacks[ i ]; if ( callback.onError ) callback.onError( err ); } this.manager.itemError( url ); } ) .finally( () => { this.manager.itemEnd( url ); } ); this.manager.itemStart( url ); } setResponseType( value ) { this.responseType = value; return this; } setMimeType( value ) { this.mimeType = value; return this; } } class AnimationLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const scope = this; const loader = new FileLoader( this.manager ); loader.setPath( this.path ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( text ) { try { onLoad( scope.parse( JSON.parse( text ) ) ); } catch ( e ) { if ( onError ) { onError( e ); } else { console.error( e ); } scope.manager.itemError( url ); } }, onProgress, onError ); } parse( json ) { const animations = []; for ( let i = 0; i < json.length; i ++ ) { const clip = AnimationClip.parse( json[ i ] ); animations.push( clip ); } return animations; } } /** * Abstract Base class to block based textures loader (dds, pvr, ...) * * Sub classes have to implement the parse() method which will be used in load(). */ class CompressedTextureLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const scope = this; const images = []; const texture = new CompressedTexture(); const loader = new FileLoader( this.manager ); loader.setPath( this.path ); loader.setResponseType( 'arraybuffer' ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( scope.withCredentials ); let loaded = 0; function loadTexture( i ) { loader.load( url[ i ], function ( buffer ) { const texDatas = scope.parse( buffer, true ); images[ i ] = { width: texDatas.width, height: texDatas.height, format: texDatas.format, mipmaps: texDatas.mipmaps }; loaded += 1; if ( loaded === 6 ) { if ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter; texture.image = images; texture.format = texDatas.format; texture.needsUpdate = true; if ( onLoad ) onLoad( texture ); } }, onProgress, onError ); } if ( Array.isArray( url ) ) { for ( let i = 0, il = url.length; i < il; ++ i ) { loadTexture( i ); } } else { // compressed cubemap texture stored in a single DDS file loader.load( url, function ( buffer ) { const texDatas = scope.parse( buffer, true ); if ( texDatas.isCubemap ) { const faces = texDatas.mipmaps.length / texDatas.mipmapCount; for ( let f = 0; f < faces; f ++ ) { images[ f ] = { mipmaps: [] }; for ( let i = 0; i < texDatas.mipmapCount; i ++ ) { images[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] ); images[ f ].format = texDatas.format; images[ f ].width = texDatas.width; images[ f ].height = texDatas.height; } } texture.image = images; } else { texture.image.width = texDatas.width; texture.image.height = texDatas.height; texture.mipmaps = texDatas.mipmaps; } if ( texDatas.mipmapCount === 1 ) { texture.minFilter = LinearFilter; } texture.format = texDatas.format; texture.needsUpdate = true; if ( onLoad ) onLoad( texture ); }, onProgress, onError ); } return texture; } } class ImageLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { if ( this.path !== undefined ) url = this.path + url; url = this.manager.resolveURL( url ); const scope = this; const cached = Cache.get( url ); if ( cached !== undefined ) { scope.manager.itemStart( url ); setTimeout( function () { if ( onLoad ) onLoad( cached ); scope.manager.itemEnd( url ); }, 0 ); return cached; } const image = createElementNS( 'img' ); function onImageLoad() { removeEventListeners(); Cache.add( url, this ); if ( onLoad ) onLoad( this ); scope.manager.itemEnd( url ); } function onImageError( event ) { removeEventListeners(); if ( onError ) onError( event ); scope.manager.itemError( url ); scope.manager.itemEnd( url ); } function removeEventListeners() { image.removeEventListener( 'load', onImageLoad, false ); image.removeEventListener( 'error', onImageError, false ); } image.addEventListener( 'load', onImageLoad, false ); image.addEventListener( 'error', onImageError, false ); if ( url.slice( 0, 5 ) !== 'data:' ) { if ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin; } scope.manager.itemStart( url ); image.src = url; return image; } } class CubeTextureLoader extends Loader { constructor( manager ) { super( manager ); } load( urls, onLoad, onProgress, onError ) { const texture = new CubeTexture(); const loader = new ImageLoader( this.manager ); loader.setCrossOrigin( this.crossOrigin ); loader.setPath( this.path ); let loaded = 0; function loadTexture( i ) { loader.load( urls[ i ], function ( image ) { texture.images[ i ] = image; loaded ++; if ( loaded === 6 ) { texture.needsUpdate = true; if ( onLoad ) onLoad( texture ); } }, undefined, onError ); } for ( let i = 0; i < urls.length; ++ i ) { loadTexture( i ); } return texture; } } /** * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...) * * Sub classes have to implement the parse() method which will be used in load(). */ class DataTextureLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const scope = this; const texture = new DataTexture(); const loader = new FileLoader( this.manager ); loader.setResponseType( 'arraybuffer' ); loader.setRequestHeader( this.requestHeader ); loader.setPath( this.path ); loader.setWithCredentials( scope.withCredentials ); loader.load( url, function ( buffer ) { const texData = scope.parse( buffer ); if ( ! texData ) return; if ( texData.image !== undefined ) { texture.image = texData.image; } else if ( texData.data !== undefined ) { texture.image.width = texData.width; texture.image.height = texData.height; texture.image.data = texData.data; } texture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping; texture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping; texture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter; texture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter; texture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1; if ( texData.encoding !== undefined ) { texture.encoding = texData.encoding; } if ( texData.flipY !== undefined ) { texture.flipY = texData.flipY; } if ( texData.format !== undefined ) { texture.format = texData.format; } if ( texData.type !== undefined ) { texture.type = texData.type; } if ( texData.mipmaps !== undefined ) { texture.mipmaps = texData.mipmaps; texture.minFilter = LinearMipmapLinearFilter; // presumably... } if ( texData.mipmapCount === 1 ) { texture.minFilter = LinearFilter; } if ( texData.generateMipmaps !== undefined ) { texture.generateMipmaps = texData.generateMipmaps; } texture.needsUpdate = true; if ( onLoad ) onLoad( texture, texData ); }, onProgress, onError ); return texture; } } class TextureLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const texture = new Texture(); const loader = new ImageLoader( this.manager ); loader.setCrossOrigin( this.crossOrigin ); loader.setPath( this.path ); loader.load( url, function ( image ) { texture.image = image; texture.needsUpdate = true; if ( onLoad !== undefined ) { onLoad( texture ); } }, onProgress, onError ); return texture; } } class Light extends Object3D { constructor( color, intensity = 1 ) { super(); this.type = 'Light'; this.color = new Color( color ); this.intensity = intensity; } dispose() { // Empty here in base class; some subclasses override. } copy( source ) { super.copy( source ); this.color.copy( source.color ); this.intensity = source.intensity; return this; } toJSON( meta ) { const data = super.toJSON( meta ); data.object.color = this.color.getHex(); data.object.intensity = this.intensity; if ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex(); if ( this.distance !== undefined ) data.object.distance = this.distance; if ( this.angle !== undefined ) data.object.angle = this.angle; if ( this.decay !== undefined ) data.object.decay = this.decay; if ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra; if ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON(); return data; } } Light.prototype.isLight = true; class HemisphereLight extends Light { constructor( skyColor, groundColor, intensity ) { super( skyColor, intensity ); this.type = 'HemisphereLight'; this.position.copy( Object3D.DefaultUp ); this.updateMatrix(); this.groundColor = new Color( groundColor ); } copy( source ) { Light.prototype.copy.call( this, source ); this.groundColor.copy( source.groundColor ); return this; } } HemisphereLight.prototype.isHemisphereLight = true; const _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4(); const _lightPositionWorld$1 = /*@__PURE__*/ new Vector3(); const _lookTarget$1 = /*@__PURE__*/ new Vector3(); class LightShadow { constructor( camera ) { this.camera = camera; this.bias = 0; this.normalBias = 0; this.radius = 1; this.blurSamples = 8; this.mapSize = new Vector2( 512, 512 ); this.map = null; this.mapPass = null; this.matrix = new Matrix4(); this.autoUpdate = true; this.needsUpdate = false; this._frustum = new Frustum(); this._frameExtents = new Vector2( 1, 1 ); this._viewportCount = 1; this._viewports = [ new Vector4$1( 0, 0, 1, 1 ) ]; } getViewportCount() { return this._viewportCount; } getFrustum() { return this._frustum; } updateMatrices( light ) { const shadowCamera = this.camera; const shadowMatrix = this.matrix; _lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld ); shadowCamera.position.copy( _lightPositionWorld$1 ); _lookTarget$1.setFromMatrixPosition( light.target.matrixWorld ); shadowCamera.lookAt( _lookTarget$1 ); shadowCamera.updateMatrixWorld(); _projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse ); this._frustum.setFromProjectionMatrix( _projScreenMatrix$1 ); shadowMatrix.set( 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 1.0 ); shadowMatrix.multiply( shadowCamera.projectionMatrix ); shadowMatrix.multiply( shadowCamera.matrixWorldInverse ); } getViewport( viewportIndex ) { return this._viewports[ viewportIndex ]; } getFrameExtents() { return this._frameExtents; } dispose() { if ( this.map ) { this.map.dispose(); } if ( this.mapPass ) { this.mapPass.dispose(); } } copy( source ) { this.camera = source.camera.clone(); this.bias = source.bias; this.radius = source.radius; this.mapSize.copy( source.mapSize ); return this; } clone() { return new this.constructor().copy( this ); } toJSON() { const object = {}; if ( this.bias !== 0 ) object.bias = this.bias; if ( this.normalBias !== 0 ) object.normalBias = this.normalBias; if ( this.radius !== 1 ) object.radius = this.radius; if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray(); object.camera = this.camera.toJSON( false ).object; delete object.camera.matrix; return object; } } class SpotLightShadow extends LightShadow { constructor() { super( new PerspectiveCamera( 50, 1, 0.5, 500 ) ); this.focus = 1; } updateMatrices( light ) { const camera = this.camera; const fov = RAD2DEG * 2 * light.angle * this.focus; const aspect = this.mapSize.width / this.mapSize.height; const far = light.distance || camera.far; if ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) { camera.fov = fov; camera.aspect = aspect; camera.far = far; camera.updateProjectionMatrix(); } super.updateMatrices( light ); } copy( source ) { super.copy( source ); this.focus = source.focus; return this; } } SpotLightShadow.prototype.isSpotLightShadow = true; class SpotLight extends Light { constructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 1 ) { super( color, intensity ); this.type = 'SpotLight'; this.position.copy( Object3D.DefaultUp ); this.updateMatrix(); this.target = new Object3D(); this.distance = distance; this.angle = angle; this.penumbra = penumbra; this.decay = decay; // for physically correct lights, should be 2. this.shadow = new SpotLightShadow(); } get power() { // compute the light's luminous power (in lumens) from its intensity (in candela) // by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd) return this.intensity * Math.PI; } set power( power ) { // set the light's intensity (in candela) from the desired luminous power (in lumens) this.intensity = power / Math.PI; } dispose() { this.shadow.dispose(); } copy( source ) { super.copy( source ); this.distance = source.distance; this.angle = source.angle; this.penumbra = source.penumbra; this.decay = source.decay; this.target = source.target.clone(); this.shadow = source.shadow.clone(); return this; } } SpotLight.prototype.isSpotLight = true; const _projScreenMatrix = /*@__PURE__*/ new Matrix4(); const _lightPositionWorld = /*@__PURE__*/ new Vector3(); const _lookTarget = /*@__PURE__*/ new Vector3(); class PointLightShadow extends LightShadow { constructor() { super( new PerspectiveCamera( 90, 1, 0.5, 500 ) ); this._frameExtents = new Vector2( 4, 2 ); this._viewportCount = 6; this._viewports = [ // These viewports map a cube-map onto a 2D texture with the // following orientation: // // xzXZ // y Y // // X - Positive x direction // x - Negative x direction // Y - Positive y direction // y - Negative y direction // Z - Positive z direction // z - Negative z direction // positive X new Vector4$1( 2, 1, 1, 1 ), // negative X new Vector4$1( 0, 1, 1, 1 ), // positive Z new Vector4$1( 3, 1, 1, 1 ), // negative Z new Vector4$1( 1, 1, 1, 1 ), // positive Y new Vector4$1( 3, 0, 1, 1 ), // negative Y new Vector4$1( 1, 0, 1, 1 ) ]; this._cubeDirections = [ new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 ) ]; this._cubeUps = [ new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 ) ]; } updateMatrices( light, viewportIndex = 0 ) { const camera = this.camera; const shadowMatrix = this.matrix; const far = light.distance || camera.far; if ( far !== camera.far ) { camera.far = far; camera.updateProjectionMatrix(); } _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); camera.position.copy( _lightPositionWorld ); _lookTarget.copy( camera.position ); _lookTarget.add( this._cubeDirections[ viewportIndex ] ); camera.up.copy( this._cubeUps[ viewportIndex ] ); camera.lookAt( _lookTarget ); camera.updateMatrixWorld(); shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z ); _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); this._frustum.setFromProjectionMatrix( _projScreenMatrix ); } } PointLightShadow.prototype.isPointLightShadow = true; class PointLight extends Light { constructor( color, intensity, distance = 0, decay = 1 ) { super( color, intensity ); this.type = 'PointLight'; this.distance = distance; this.decay = decay; // for physically correct lights, should be 2. this.shadow = new PointLightShadow(); } get power() { // compute the light's luminous power (in lumens) from its intensity (in candela) // for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd) return this.intensity * 4 * Math.PI; } set power( power ) { // set the light's intensity (in candela) from the desired luminous power (in lumens) this.intensity = power / ( 4 * Math.PI ); } dispose() { this.shadow.dispose(); } copy( source ) { super.copy( source ); this.distance = source.distance; this.decay = source.decay; this.shadow = source.shadow.clone(); return this; } } PointLight.prototype.isPointLight = true; class DirectionalLightShadow extends LightShadow { constructor() { super( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) ); } } DirectionalLightShadow.prototype.isDirectionalLightShadow = true; class DirectionalLight extends Light { constructor( color, intensity ) { super( color, intensity ); this.type = 'DirectionalLight'; this.position.copy( Object3D.DefaultUp ); this.updateMatrix(); this.target = new Object3D(); this.shadow = new DirectionalLightShadow(); } dispose() { this.shadow.dispose(); } copy( source ) { super.copy( source ); this.target = source.target.clone(); this.shadow = source.shadow.clone(); return this; } } DirectionalLight.prototype.isDirectionalLight = true; class AmbientLight extends Light { constructor( color, intensity ) { super( color, intensity ); this.type = 'AmbientLight'; } } AmbientLight.prototype.isAmbientLight = true; class RectAreaLight extends Light { constructor( color, intensity, width = 10, height = 10 ) { super( color, intensity ); this.type = 'RectAreaLight'; this.width = width; this.height = height; } get power() { // compute the light's luminous power (in lumens) from its intensity (in nits) return this.intensity * this.width * this.height * Math.PI; } set power( power ) { // set the light's intensity (in nits) from the desired luminous power (in lumens) this.intensity = power / ( this.width * this.height * Math.PI ); } copy( source ) { super.copy( source ); this.width = source.width; this.height = source.height; return this; } toJSON( meta ) { const data = super.toJSON( meta ); data.object.width = this.width; data.object.height = this.height; return data; } } RectAreaLight.prototype.isRectAreaLight = true; /** * Primary reference: * https://graphics.stanford.edu/papers/envmap/envmap.pdf * * Secondary reference: * https://www.ppsloan.org/publications/StupidSH36.pdf */ // 3-band SH defined by 9 coefficients class SphericalHarmonics3 { constructor() { this.coefficients = []; for ( let i = 0; i < 9; i ++ ) { this.coefficients.push( new Vector3() ); } } set( coefficients ) { for ( let i = 0; i < 9; i ++ ) { this.coefficients[ i ].copy( coefficients[ i ] ); } return this; } zero() { for ( let i = 0; i < 9; i ++ ) { this.coefficients[ i ].set( 0, 0, 0 ); } return this; } // get the radiance in the direction of the normal // target is a Vector3 getAt( normal, target ) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 ); // band 1 target.addScaledVector( coeff[ 1 ], 0.488603 * y ); target.addScaledVector( coeff[ 2 ], 0.488603 * z ); target.addScaledVector( coeff[ 3 ], 0.488603 * x ); // band 2 target.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) ); target.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) ); target.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) ); target.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) ); target.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) ); return target; } // get the irradiance (radiance convolved with cosine lobe) in the direction of the normal // target is a Vector3 // https://graphics.stanford.edu/papers/envmap/envmap.pdf getIrradianceAt( normal, target ) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; const coeff = this.coefficients; // band 0 target.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095 // band 1 target.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603 target.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z ); target.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x ); // band 2 target.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548 target.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z ); target.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3 target.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z ); target.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274 return target; } add( sh ) { for ( let i = 0; i < 9; i ++ ) { this.coefficients[ i ].add( sh.coefficients[ i ] ); } return this; } addScaledSH( sh, s ) { for ( let i = 0; i < 9; i ++ ) { this.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s ); } return this; } scale( s ) { for ( let i = 0; i < 9; i ++ ) { this.coefficients[ i ].multiplyScalar( s ); } return this; } lerp( sh, alpha ) { for ( let i = 0; i < 9; i ++ ) { this.coefficients[ i ].lerp( sh.coefficients[ i ], alpha ); } return this; } equals( sh ) { for ( let i = 0; i < 9; i ++ ) { if ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) { return false; } } return true; } copy( sh ) { return this.set( sh.coefficients ); } clone() { return new this.constructor().copy( this ); } fromArray( array, offset = 0 ) { const coefficients = this.coefficients; for ( let i = 0; i < 9; i ++ ) { coefficients[ i ].fromArray( array, offset + ( i * 3 ) ); } return this; } toArray( array = [], offset = 0 ) { const coefficients = this.coefficients; for ( let i = 0; i < 9; i ++ ) { coefficients[ i ].toArray( array, offset + ( i * 3 ) ); } return array; } // evaluate the basis functions // shBasis is an Array[ 9 ] static getBasisAt( normal, shBasis ) { // normal is assumed to be unit length const x = normal.x, y = normal.y, z = normal.z; // band 0 shBasis[ 0 ] = 0.282095; // band 1 shBasis[ 1 ] = 0.488603 * y; shBasis[ 2 ] = 0.488603 * z; shBasis[ 3 ] = 0.488603 * x; // band 2 shBasis[ 4 ] = 1.092548 * x * y; shBasis[ 5 ] = 1.092548 * y * z; shBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 ); shBasis[ 7 ] = 1.092548 * x * z; shBasis[ 8 ] = 0.546274 * ( x * x - y * y ); } } SphericalHarmonics3.prototype.isSphericalHarmonics3 = true; class LightProbe extends Light { constructor( sh = new SphericalHarmonics3(), intensity = 1 ) { super( undefined, intensity ); this.sh = sh; } copy( source ) { super.copy( source ); this.sh.copy( source.sh ); return this; } fromJSON( json ) { this.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON(); this.sh.fromArray( json.sh ); return this; } toJSON( meta ) { const data = super.toJSON( meta ); data.object.sh = this.sh.toArray(); return data; } } LightProbe.prototype.isLightProbe = true; class MaterialLoader extends Loader { constructor( manager ) { super( manager ); this.textures = {}; } load( url, onLoad, onProgress, onError ) { const scope = this; const loader = new FileLoader( scope.manager ); loader.setPath( scope.path ); loader.setRequestHeader( scope.requestHeader ); loader.setWithCredentials( scope.withCredentials ); loader.load( url, function ( text ) { try { onLoad( scope.parse( JSON.parse( text ) ) ); } catch ( e ) { if ( onError ) { onError( e ); } else { console.error( e ); } scope.manager.itemError( url ); } }, onProgress, onError ); } parse( json ) { const textures = this.textures; function getTexture( name ) { if ( textures[ name ] === undefined ) { console.warn( 'THREE.MaterialLoader: Undefined texture', name ); } return textures[ name ]; } const material = Material.fromType( json.type ); if ( json.uuid !== undefined ) material.uuid = json.uuid; if ( json.name !== undefined ) material.name = json.name; if ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color ); if ( json.roughness !== undefined ) material.roughness = json.roughness; if ( json.metalness !== undefined ) material.metalness = json.metalness; if ( json.sheen !== undefined ) material.sheen = json.sheen; if ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor ); if ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness; if ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive ); if ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular ); if ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity; if ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor ); if ( json.shininess !== undefined ) material.shininess = json.shininess; if ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat; if ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness; if ( json.transmission !== undefined ) material.transmission = json.transmission; if ( json.thickness !== undefined ) material.thickness = json.thickness; if ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance; if ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor ); if ( json.fog !== undefined ) material.fog = json.fog; if ( json.flatShading !== undefined ) material.flatShading = json.flatShading; if ( json.blending !== undefined ) material.blending = json.blending; if ( json.combine !== undefined ) material.combine = json.combine; if ( json.side !== undefined ) material.side = json.side; if ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide; if ( json.opacity !== undefined ) material.opacity = json.opacity; if ( json.transparent !== undefined ) material.transparent = json.transparent; if ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest; if ( json.depthTest !== undefined ) material.depthTest = json.depthTest; if ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite; if ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite; if ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite; if ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask; if ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc; if ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef; if ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask; if ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail; if ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail; if ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass; if ( json.wireframe !== undefined ) material.wireframe = json.wireframe; if ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth; if ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap; if ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin; if ( json.rotation !== undefined ) material.rotation = json.rotation; if ( json.linewidth !== 1 ) material.linewidth = json.linewidth; if ( json.dashSize !== undefined ) material.dashSize = json.dashSize; if ( json.gapSize !== undefined ) material.gapSize = json.gapSize; if ( json.scale !== undefined ) material.scale = json.scale; if ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset; if ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor; if ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits; if ( json.dithering !== undefined ) material.dithering = json.dithering; if ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage; if ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha; if ( json.visible !== undefined ) material.visible = json.visible; if ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped; if ( json.userData !== undefined ) material.userData = json.userData; if ( json.vertexColors !== undefined ) { if ( typeof json.vertexColors === 'number' ) { material.vertexColors = ( json.vertexColors > 0 ) ? true : false; } else { material.vertexColors = json.vertexColors; } } // Shader Material if ( json.uniforms !== undefined ) { for ( const name in json.uniforms ) { const uniform = json.uniforms[ name ]; material.uniforms[ name ] = {}; switch ( uniform.type ) { case 't': material.uniforms[ name ].value = getTexture( uniform.value ); break; case 'c': material.uniforms[ name ].value = new Color().setHex( uniform.value ); break; case 'v2': material.uniforms[ name ].value = new Vector2().fromArray( uniform.value ); break; case 'v3': material.uniforms[ name ].value = new Vector3().fromArray( uniform.value ); break; case 'v4': material.uniforms[ name ].value = new Vector4$1().fromArray( uniform.value ); break; case 'm3': material.uniforms[ name ].value = new Matrix3().fromArray( uniform.value ); break; case 'm4': material.uniforms[ name ].value = new Matrix4().fromArray( uniform.value ); break; default: material.uniforms[ name ].value = uniform.value; } } } if ( json.defines !== undefined ) material.defines = json.defines; if ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader; if ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader; if ( json.extensions !== undefined ) { for ( const key in json.extensions ) { material.extensions[ key ] = json.extensions[ key ]; } } // Deprecated if ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading // for PointsMaterial if ( json.size !== undefined ) material.size = json.size; if ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation; // maps if ( json.map !== undefined ) material.map = getTexture( json.map ); if ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap ); if ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap ); if ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap ); if ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale; if ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap ); if ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType; if ( json.normalScale !== undefined ) { let normalScale = json.normalScale; if ( Array.isArray( normalScale ) === false ) { // Blender exporter used to export a scalar. See #7459 normalScale = [ normalScale, normalScale ]; } material.normalScale = new Vector2().fromArray( normalScale ); } if ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap ); if ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale; if ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias; if ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap ); if ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap ); if ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap ); if ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity; if ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap ); if ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap ); if ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap ); if ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap ); if ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity; if ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity; if ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio; if ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap ); if ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity; if ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap ); if ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity; if ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap ); if ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap ); if ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap ); if ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap ); if ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale ); if ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap ); if ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap ); if ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap ); if ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap ); return material; } setTextures( value ) { this.textures = value; return this; } } class LoaderUtils { static decodeText( array ) { if ( typeof TextDecoder !== 'undefined' ) { return new TextDecoder().decode( array ); } // Avoid the String.fromCharCode.apply(null, array) shortcut, which // throws a "maximum call stack size exceeded" error for large arrays. let s = ''; for ( let i = 0, il = array.length; i < il; i ++ ) { // Implicitly assumes little-endian. s += String.fromCharCode( array[ i ] ); } try { // merges multi-byte utf-8 characters. return decodeURIComponent( escape( s ) ); } catch ( e ) { // see #16358 return s; } } static extractUrlBase( url ) { const index = url.lastIndexOf( '/' ); if ( index === - 1 ) return './'; return url.slice( 0, index + 1 ); } static resolveURL( url, path ) { // Invalid URL if ( typeof url !== 'string' || url === '' ) return ''; // Host Relative URL if ( /^https?:\/\//i.test( path ) && /^\//.test( url ) ) { path = path.replace( /(^https?:\/\/[^\/]+).*/i, '$1' ); } // Absolute URL http://,https://,// if ( /^(https?:)?\/\//i.test( url ) ) return url; // Data URI if ( /^data:.*,.*$/i.test( url ) ) return url; // Blob URL if ( /^blob:.*$/i.test( url ) ) return url; // Relative URL return path + url; } } class InstancedBufferGeometry extends BufferGeometry { constructor() { super(); this.type = 'InstancedBufferGeometry'; this.instanceCount = Infinity; } copy( source ) { super.copy( source ); this.instanceCount = source.instanceCount; return this; } clone() { return new this.constructor().copy( this ); } toJSON() { const data = super.toJSON( this ); data.instanceCount = this.instanceCount; data.isInstancedBufferGeometry = true; return data; } } InstancedBufferGeometry.prototype.isInstancedBufferGeometry = true; class BufferGeometryLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const scope = this; const loader = new FileLoader( scope.manager ); loader.setPath( scope.path ); loader.setRequestHeader( scope.requestHeader ); loader.setWithCredentials( scope.withCredentials ); loader.load( url, function ( text ) { try { onLoad( scope.parse( JSON.parse( text ) ) ); } catch ( e ) { if ( onError ) { onError( e ); } else { console.error( e ); } scope.manager.itemError( url ); } }, onProgress, onError ); } parse( json ) { const interleavedBufferMap = {}; const arrayBufferMap = {}; function getInterleavedBuffer( json, uuid ) { if ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ]; const interleavedBuffers = json.interleavedBuffers; const interleavedBuffer = interleavedBuffers[ uuid ]; const buffer = getArrayBuffer( json, interleavedBuffer.buffer ); const array = getTypedArray( interleavedBuffer.type, buffer ); const ib = new InterleavedBuffer( array, interleavedBuffer.stride ); ib.uuid = interleavedBuffer.uuid; interleavedBufferMap[ uuid ] = ib; return ib; } function getArrayBuffer( json, uuid ) { if ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ]; const arrayBuffers = json.arrayBuffers; const arrayBuffer = arrayBuffers[ uuid ]; const ab = new Uint32Array( arrayBuffer ).buffer; arrayBufferMap[ uuid ] = ab; return ab; } const geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry(); const index = json.data.index; if ( index !== undefined ) { const typedArray = getTypedArray( index.type, index.array ); geometry.setIndex( new BufferAttribute( typedArray, 1 ) ); } const attributes = json.data.attributes; for ( const key in attributes ) { const attribute = attributes[ key ]; let bufferAttribute; if ( attribute.isInterleavedBufferAttribute ) { const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); } else { const typedArray = getTypedArray( attribute.type, attribute.array ); const bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute; bufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized ); } if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; if ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage ); if ( attribute.updateRange !== undefined ) { bufferAttribute.updateRange.offset = attribute.updateRange.offset; bufferAttribute.updateRange.count = attribute.updateRange.count; } geometry.setAttribute( key, bufferAttribute ); } const morphAttributes = json.data.morphAttributes; if ( morphAttributes ) { for ( const key in morphAttributes ) { const attributeArray = morphAttributes[ key ]; const array = []; for ( let i = 0, il = attributeArray.length; i < il; i ++ ) { const attribute = attributeArray[ i ]; let bufferAttribute; if ( attribute.isInterleavedBufferAttribute ) { const interleavedBuffer = getInterleavedBuffer( json.data, attribute.data ); bufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized ); } else { const typedArray = getTypedArray( attribute.type, attribute.array ); bufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ); } if ( attribute.name !== undefined ) bufferAttribute.name = attribute.name; array.push( bufferAttribute ); } geometry.morphAttributes[ key ] = array; } } const morphTargetsRelative = json.data.morphTargetsRelative; if ( morphTargetsRelative ) { geometry.morphTargetsRelative = true; } const groups = json.data.groups || json.data.drawcalls || json.data.offsets; if ( groups !== undefined ) { for ( let i = 0, n = groups.length; i !== n; ++ i ) { const group = groups[ i ]; geometry.addGroup( group.start, group.count, group.materialIndex ); } } const boundingSphere = json.data.boundingSphere; if ( boundingSphere !== undefined ) { const center = new Vector3(); if ( boundingSphere.center !== undefined ) { center.fromArray( boundingSphere.center ); } geometry.boundingSphere = new Sphere( center, boundingSphere.radius ); } if ( json.name ) geometry.name = json.name; if ( json.userData ) geometry.userData = json.userData; return geometry; } } class ObjectLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const scope = this; const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; this.resourcePath = this.resourcePath || path; const loader = new FileLoader( this.manager ); loader.setPath( this.path ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( text ) { let json = null; try { json = JSON.parse( text ); } catch ( error ) { if ( onError !== undefined ) onError( error ); console.error( 'THREE:ObjectLoader: Can\'t parse ' + url + '.', error.message ); return; } const metadata = json.metadata; if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { console.error( 'THREE.ObjectLoader: Can\'t load ' + url ); return; } scope.parse( json, onLoad ); }, onProgress, onError ); } async loadAsync( url, onProgress ) { const scope = this; const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path; this.resourcePath = this.resourcePath || path; const loader = new FileLoader( this.manager ); loader.setPath( this.path ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( this.withCredentials ); const text = await loader.loadAsync( url, onProgress ); const json = JSON.parse( text ); const metadata = json.metadata; if ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) { throw new Error( 'THREE.ObjectLoader: Can\'t load ' + url ); } return await scope.parseAsync( json ); } parse( json, onLoad ) { const animations = this.parseAnimations( json.animations ); const shapes = this.parseShapes( json.shapes ); const geometries = this.parseGeometries( json.geometries, shapes ); const images = this.parseImages( json.images, function () { if ( onLoad !== undefined ) onLoad( object ); } ); const textures = this.parseTextures( json.textures, images ); const materials = this.parseMaterials( json.materials, textures ); const object = this.parseObject( json.object, geometries, materials, textures, animations ); const skeletons = this.parseSkeletons( json.skeletons, object ); this.bindSkeletons( object, skeletons ); // if ( onLoad !== undefined ) { let hasImages = false; for ( const uuid in images ) { if ( images[ uuid ] instanceof HTMLImageElement ) { hasImages = true; break; } } if ( hasImages === false ) onLoad( object ); } return object; } async parseAsync( json ) { const animations = this.parseAnimations( json.animations ); const shapes = this.parseShapes( json.shapes ); const geometries = this.parseGeometries( json.geometries, shapes ); const images = await this.parseImagesAsync( json.images ); const textures = this.parseTextures( json.textures, images ); const materials = this.parseMaterials( json.materials, textures ); const object = this.parseObject( json.object, geometries, materials, textures, animations ); const skeletons = this.parseSkeletons( json.skeletons, object ); this.bindSkeletons( object, skeletons ); return object; } parseShapes( json ) { const shapes = {}; if ( json !== undefined ) { for ( let i = 0, l = json.length; i < l; i ++ ) { const shape = new Shape().fromJSON( json[ i ] ); shapes[ shape.uuid ] = shape; } } return shapes; } parseSkeletons( json, object ) { const skeletons = {}; const bones = {}; // generate bone lookup table object.traverse( function ( child ) { if ( child.isBone ) bones[ child.uuid ] = child; } ); // create skeletons if ( json !== undefined ) { for ( let i = 0, l = json.length; i < l; i ++ ) { const skeleton = new Skeleton().fromJSON( json[ i ], bones ); skeletons[ skeleton.uuid ] = skeleton; } } return skeletons; } parseGeometries( json, shapes ) { const geometries = {}; if ( json !== undefined ) { const bufferGeometryLoader = new BufferGeometryLoader(); for ( let i = 0, l = json.length; i < l; i ++ ) { let geometry; const data = json[ i ]; switch ( data.type ) { case 'BufferGeometry': case 'InstancedBufferGeometry': geometry = bufferGeometryLoader.parse( data ); break; case 'Geometry': console.error( 'THREE.ObjectLoader: The legacy Geometry type is no longer supported.' ); break; default: if ( data.type in Geometries ) { geometry = Geometries[ data.type ].fromJSON( data, shapes ); } else { console.warn( `THREE.ObjectLoader: Unsupported geometry type "${ data.type }"` ); } } geometry.uuid = data.uuid; if ( data.name !== undefined ) geometry.name = data.name; if ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData; geometries[ data.uuid ] = geometry; } } return geometries; } parseMaterials( json, textures ) { const cache = {}; // MultiMaterial const materials = {}; if ( json !== undefined ) { const loader = new MaterialLoader(); loader.setTextures( textures ); for ( let i = 0, l = json.length; i < l; i ++ ) { const data = json[ i ]; if ( data.type === 'MultiMaterial' ) { // Deprecated const array = []; for ( let j = 0; j < data.materials.length; j ++ ) { const material = data.materials[ j ]; if ( cache[ material.uuid ] === undefined ) { cache[ material.uuid ] = loader.parse( material ); } array.push( cache[ material.uuid ] ); } materials[ data.uuid ] = array; } else { if ( cache[ data.uuid ] === undefined ) { cache[ data.uuid ] = loader.parse( data ); } materials[ data.uuid ] = cache[ data.uuid ]; } } } return materials; } parseAnimations( json ) { const animations = {}; if ( json !== undefined ) { for ( let i = 0; i < json.length; i ++ ) { const data = json[ i ]; const clip = AnimationClip.parse( data ); animations[ clip.uuid ] = clip; } } return animations; } parseImages( json, onLoad ) { const scope = this; const images = {}; let loader; function loadImage( url ) { scope.manager.itemStart( url ); return loader.load( url, function () { scope.manager.itemEnd( url ); }, undefined, function () { scope.manager.itemError( url ); scope.manager.itemEnd( url ); } ); } function deserializeImage( image ) { if ( typeof image === 'string' ) { const url = image; const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; return loadImage( path ); } else { if ( image.data ) { return { data: getTypedArray( image.type, image.data ), width: image.width, height: image.height }; } else { return null; } } } if ( json !== undefined && json.length > 0 ) { const manager = new LoadingManager( onLoad ); loader = new ImageLoader( manager ); loader.setCrossOrigin( this.crossOrigin ); for ( let i = 0, il = json.length; i < il; i ++ ) { const image = json[ i ]; const url = image.url; if ( Array.isArray( url ) ) { // load array of images e.g CubeTexture const imageArray = []; for ( let j = 0, jl = url.length; j < jl; j ++ ) { const currentUrl = url[ j ]; const deserializedImage = deserializeImage( currentUrl ); if ( deserializedImage !== null ) { if ( deserializedImage instanceof HTMLImageElement ) { imageArray.push( deserializedImage ); } else { // special case: handle array of data textures for cube textures imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); } } } images[ image.uuid ] = new Source( imageArray ); } else { // load single image const deserializedImage = deserializeImage( image.url ); images[ image.uuid ] = new Source( deserializedImage ); } } } return images; } async parseImagesAsync( json ) { const scope = this; const images = {}; let loader; async function deserializeImage( image ) { if ( typeof image === 'string' ) { const url = image; const path = /^(\/\/)|([a-z]+:(\/\/)?)/i.test( url ) ? url : scope.resourcePath + url; return await loader.loadAsync( path ); } else { if ( image.data ) { return { data: getTypedArray( image.type, image.data ), width: image.width, height: image.height }; } else { return null; } } } if ( json !== undefined && json.length > 0 ) { loader = new ImageLoader( this.manager ); loader.setCrossOrigin( this.crossOrigin ); for ( let i = 0, il = json.length; i < il; i ++ ) { const image = json[ i ]; const url = image.url; if ( Array.isArray( url ) ) { // load array of images e.g CubeTexture const imageArray = []; for ( let j = 0, jl = url.length; j < jl; j ++ ) { const currentUrl = url[ j ]; const deserializedImage = await deserializeImage( currentUrl ); if ( deserializedImage !== null ) { if ( deserializedImage instanceof HTMLImageElement ) { imageArray.push( deserializedImage ); } else { // special case: handle array of data textures for cube textures imageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) ); } } } images[ image.uuid ] = new Source( imageArray ); } else { // load single image const deserializedImage = await deserializeImage( image.url ); images[ image.uuid ] = new Source( deserializedImage ); } } } return images; } parseTextures( json, images ) { function parseConstant( value, type ) { if ( typeof value === 'number' ) return value; console.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value ); return type[ value ]; } const textures = {}; if ( json !== undefined ) { for ( let i = 0, l = json.length; i < l; i ++ ) { const data = json[ i ]; if ( data.image === undefined ) { console.warn( 'THREE.ObjectLoader: No "image" specified for', data.uuid ); } if ( images[ data.image ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined image', data.image ); } const source = images[ data.image ]; const image = source.data; let texture; if ( Array.isArray( image ) ) { texture = new CubeTexture(); if ( image.length === 6 ) texture.needsUpdate = true; } else { if ( image && image.data ) { texture = new DataTexture(); } else { texture = new Texture(); } if ( image ) texture.needsUpdate = true; // textures can have undefined image data } texture.source = source; texture.uuid = data.uuid; if ( data.name !== undefined ) texture.name = data.name; if ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING ); if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); if ( data.center !== undefined ) texture.center.fromArray( data.center ); if ( data.rotation !== undefined ) texture.rotation = data.rotation; if ( data.wrap !== undefined ) { texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING ); texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING ); } if ( data.format !== undefined ) texture.format = data.format; if ( data.type !== undefined ) texture.type = data.type; if ( data.encoding !== undefined ) texture.encoding = data.encoding; if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER ); if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER ); if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; if ( data.flipY !== undefined ) texture.flipY = data.flipY; if ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha; if ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment; if ( data.userData !== undefined ) texture.userData = data.userData; textures[ data.uuid ] = texture; } } return textures; } parseObject( data, geometries, materials, textures, animations ) { let object; function getGeometry( name ) { if ( geometries[ name ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined geometry', name ); } return geometries[ name ]; } function getMaterial( name ) { if ( name === undefined ) return undefined; if ( Array.isArray( name ) ) { const array = []; for ( let i = 0, l = name.length; i < l; i ++ ) { const uuid = name[ i ]; if ( materials[ uuid ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined material', uuid ); } array.push( materials[ uuid ] ); } return array; } if ( materials[ name ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined material', name ); } return materials[ name ]; } function getTexture( uuid ) { if ( textures[ uuid ] === undefined ) { console.warn( 'THREE.ObjectLoader: Undefined texture', uuid ); } return textures[ uuid ]; } let geometry, material; switch ( data.type ) { case 'Scene': object = new Scene(); if ( data.background !== undefined ) { if ( Number.isInteger( data.background ) ) { object.background = new Color( data.background ); } else { object.background = getTexture( data.background ); } } if ( data.environment !== undefined ) { object.environment = getTexture( data.environment ); } if ( data.fog !== undefined ) { if ( data.fog.type === 'Fog' ) { object.fog = new Fog( data.fog.color, data.fog.near, data.fog.far ); } else if ( data.fog.type === 'FogExp2' ) { object.fog = new FogExp2( data.fog.color, data.fog.density ); } } break; case 'PerspectiveCamera': object = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far ); if ( data.focus !== undefined ) object.focus = data.focus; if ( data.zoom !== undefined ) object.zoom = data.zoom; if ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge; if ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset; if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); break; case 'OrthographicCamera': object = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far ); if ( data.zoom !== undefined ) object.zoom = data.zoom; if ( data.view !== undefined ) object.view = Object.assign( {}, data.view ); break; case 'AmbientLight': object = new AmbientLight( data.color, data.intensity ); break; case 'DirectionalLight': object = new DirectionalLight( data.color, data.intensity ); break; case 'PointLight': object = new PointLight( data.color, data.intensity, data.distance, data.decay ); break; case 'RectAreaLight': object = new RectAreaLight( data.color, data.intensity, data.width, data.height ); break; case 'SpotLight': object = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); break; case 'HemisphereLight': object = new HemisphereLight( data.color, data.groundColor, data.intensity ); break; case 'LightProbe': object = new LightProbe().fromJSON( data ); break; case 'SkinnedMesh': geometry = getGeometry( data.geometry ); material = getMaterial( data.material ); object = new SkinnedMesh( geometry, material ); if ( data.bindMode !== undefined ) object.bindMode = data.bindMode; if ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix ); if ( data.skeleton !== undefined ) object.skeleton = data.skeleton; break; case 'Mesh': geometry = getGeometry( data.geometry ); material = getMaterial( data.material ); object = new Mesh( geometry, material ); break; case 'InstancedMesh': geometry = getGeometry( data.geometry ); material = getMaterial( data.material ); const count = data.count; const instanceMatrix = data.instanceMatrix; const instanceColor = data.instanceColor; object = new InstancedMesh( geometry, material, count ); object.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 ); if ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize ); break; case 'LOD': object = new LOD(); break; case 'Line': object = new Line( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'LineLoop': object = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'LineSegments': object = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'PointCloud': case 'Points': object = new Points( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'Sprite': object = new Sprite( getMaterial( data.material ) ); break; case 'Group': object = new Group(); break; case 'Bone': object = new Bone(); break; default: object = new Object3D(); } object.uuid = data.uuid; if ( data.name !== undefined ) object.name = data.name; if ( data.matrix !== undefined ) { object.matrix.fromArray( data.matrix ); if ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate; if ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale ); } else { if ( data.position !== undefined ) object.position.fromArray( data.position ); if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation ); if ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion ); if ( data.scale !== undefined ) object.scale.fromArray( data.scale ); } if ( data.castShadow !== undefined ) object.castShadow = data.castShadow; if ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow; if ( data.shadow ) { if ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias; if ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias; if ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius; if ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize ); if ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera ); } if ( data.visible !== undefined ) object.visible = data.visible; if ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled; if ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder; if ( data.userData !== undefined ) object.userData = data.userData; if ( data.layers !== undefined ) object.layers.mask = data.layers; if ( data.children !== undefined ) { const children = data.children; for ( let i = 0; i < children.length; i ++ ) { object.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) ); } } if ( data.animations !== undefined ) { const objectAnimations = data.animations; for ( let i = 0; i < objectAnimations.length; i ++ ) { const uuid = objectAnimations[ i ]; object.animations.push( animations[ uuid ] ); } } if ( data.type === 'LOD' ) { if ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate; const levels = data.levels; for ( let l = 0; l < levels.length; l ++ ) { const level = levels[ l ]; const child = object.getObjectByProperty( 'uuid', level.object ); if ( child !== undefined ) { object.addLevel( child, level.distance ); } } } return object; } bindSkeletons( object, skeletons ) { if ( Object.keys( skeletons ).length === 0 ) return; object.traverse( function ( child ) { if ( child.isSkinnedMesh === true && child.skeleton !== undefined ) { const skeleton = skeletons[ child.skeleton ]; if ( skeleton === undefined ) { console.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton ); } else { child.bind( skeleton, child.bindMatrix ); } } } ); } /* DEPRECATED */ setTexturePath( value ) { console.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' ); return this.setResourcePath( value ); } } const TEXTURE_MAPPING = { UVMapping: UVMapping, CubeReflectionMapping: CubeReflectionMapping, CubeRefractionMapping: CubeRefractionMapping, EquirectangularReflectionMapping: EquirectangularReflectionMapping, EquirectangularRefractionMapping: EquirectangularRefractionMapping, CubeUVReflectionMapping: CubeUVReflectionMapping, CubeUVRefractionMapping: CubeUVRefractionMapping }; const TEXTURE_WRAPPING = { RepeatWrapping: RepeatWrapping, ClampToEdgeWrapping: ClampToEdgeWrapping, MirroredRepeatWrapping: MirroredRepeatWrapping }; const TEXTURE_FILTER = { NearestFilter: NearestFilter, NearestMipmapNearestFilter: NearestMipmapNearestFilter, NearestMipmapLinearFilter: NearestMipmapLinearFilter, LinearFilter: LinearFilter, LinearMipmapNearestFilter: LinearMipmapNearestFilter, LinearMipmapLinearFilter: LinearMipmapLinearFilter }; class ImageBitmapLoader extends Loader { constructor( manager ) { super( manager ); if ( typeof createImageBitmap === 'undefined' ) { console.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' ); } if ( typeof fetch === 'undefined' ) { console.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' ); } this.options = { premultiplyAlpha: 'none' }; } setOptions( options ) { this.options = options; return this; } load( url, onLoad, onProgress, onError ) { if ( url === undefined ) url = ''; if ( this.path !== undefined ) url = this.path + url; url = this.manager.resolveURL( url ); const scope = this; const cached = Cache.get( url ); if ( cached !== undefined ) { scope.manager.itemStart( url ); setTimeout( function () { if ( onLoad ) onLoad( cached ); scope.manager.itemEnd( url ); }, 0 ); return cached; } const fetchOptions = {}; fetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include'; fetchOptions.headers = this.requestHeader; fetch( url, fetchOptions ).then( function ( res ) { return res.blob(); } ).then( function ( blob ) { return createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) ); } ).then( function ( imageBitmap ) { Cache.add( url, imageBitmap ); if ( onLoad ) onLoad( imageBitmap ); scope.manager.itemEnd( url ); } ).catch( function ( e ) { if ( onError ) onError( e ); scope.manager.itemError( url ); scope.manager.itemEnd( url ); } ); scope.manager.itemStart( url ); } } ImageBitmapLoader.prototype.isImageBitmapLoader = true; let _context; const AudioContext = { getContext: function () { if ( _context === undefined ) { _context = new ( window.AudioContext || window.webkitAudioContext )(); } return _context; }, setContext: function ( value ) { _context = value; } }; class AudioLoader extends Loader { constructor( manager ) { super( manager ); } load( url, onLoad, onProgress, onError ) { const scope = this; const loader = new FileLoader( this.manager ); loader.setResponseType( 'arraybuffer' ); loader.setPath( this.path ); loader.setRequestHeader( this.requestHeader ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( buffer ) { try { // Create a copy of the buffer. The `decodeAudioData` method // detaches the buffer when complete, preventing reuse. const bufferCopy = buffer.slice( 0 ); const context = AudioContext.getContext(); context.decodeAudioData( bufferCopy, function ( audioBuffer ) { onLoad( audioBuffer ); } ); } catch ( e ) { if ( onError ) { onError( e ); } else { console.error( e ); } scope.manager.itemError( url ); } }, onProgress, onError ); } } class HemisphereLightProbe extends LightProbe { constructor( skyColor, groundColor, intensity = 1 ) { super( undefined, intensity ); const color1 = new Color().set( skyColor ); const color2 = new Color().set( groundColor ); const sky = new Vector3( color1.r, color1.g, color1.b ); const ground = new Vector3( color2.r, color2.g, color2.b ); // without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI ); const c0 = Math.sqrt( Math.PI ); const c1 = c0 * Math.sqrt( 0.75 ); this.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 ); this.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 ); } } HemisphereLightProbe.prototype.isHemisphereLightProbe = true; class AmbientLightProbe extends LightProbe { constructor( color, intensity = 1 ) { super( undefined, intensity ); const color1 = new Color().set( color ); // without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI ); this.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) ); } } AmbientLightProbe.prototype.isAmbientLightProbe = true; const _eyeRight = /*@__PURE__*/ new Matrix4(); const _eyeLeft = /*@__PURE__*/ new Matrix4(); const _projectionMatrix = /*@__PURE__*/ new Matrix4(); class StereoCamera { constructor() { this.type = 'StereoCamera'; this.aspect = 1; this.eyeSep = 0.064; this.cameraL = new PerspectiveCamera(); this.cameraL.layers.enable( 1 ); this.cameraL.matrixAutoUpdate = false; this.cameraR = new PerspectiveCamera(); this.cameraR.layers.enable( 2 ); this.cameraR.matrixAutoUpdate = false; this._cache = { focus: null, fov: null, aspect: null, near: null, far: null, zoom: null, eyeSep: null }; } update( camera ) { const cache = this._cache; const needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov || cache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near || cache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep; if ( needsUpdate ) { cache.focus = camera.focus; cache.fov = camera.fov; cache.aspect = camera.aspect * this.aspect; cache.near = camera.near; cache.far = camera.far; cache.zoom = camera.zoom; cache.eyeSep = this.eyeSep; // Off-axis stereoscopic effect based on // http://paulbourke.net/stereographics/stereorender/ _projectionMatrix.copy( camera.projectionMatrix ); const eyeSepHalf = cache.eyeSep / 2; const eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus; const ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom; let xmin, xmax; // translate xOffset _eyeLeft.elements[ 12 ] = - eyeSepHalf; _eyeRight.elements[ 12 ] = eyeSepHalf; // for left eye xmin = - ymax * cache.aspect + eyeSepOnProjection; xmax = ymax * cache.aspect + eyeSepOnProjection; _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); this.cameraL.projectionMatrix.copy( _projectionMatrix ); // for right eye xmin = - ymax * cache.aspect - eyeSepOnProjection; xmax = ymax * cache.aspect - eyeSepOnProjection; _projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin ); _projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin ); this.cameraR.projectionMatrix.copy( _projectionMatrix ); } this.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft ); this.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight ); } } class Clock { constructor( autoStart = true ) { this.autoStart = autoStart; this.startTime = 0; this.oldTime = 0; this.elapsedTime = 0; this.running = false; } start() { this.startTime = now(); this.oldTime = this.startTime; this.elapsedTime = 0; this.running = true; } stop() { this.getElapsedTime(); this.running = false; this.autoStart = false; } getElapsedTime() { this.getDelta(); return this.elapsedTime; } getDelta() { let diff = 0; if ( this.autoStart && ! this.running ) { this.start(); return 0; } if ( this.running ) { const newTime = now(); diff = ( newTime - this.oldTime ) / 1000; this.oldTime = newTime; this.elapsedTime += diff; } return diff; } } function now() { return ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732 } const _position$1 = /*@__PURE__*/ new Vector3(); const _quaternion$1 = /*@__PURE__*/ new Quaternion(); const _scale$1 = /*@__PURE__*/ new Vector3(); const _orientation$1 = /*@__PURE__*/ new Vector3(); class AudioListener extends Object3D { constructor() { super(); this.type = 'AudioListener'; this.context = AudioContext.getContext(); this.gain = this.context.createGain(); this.gain.connect( this.context.destination ); this.filter = null; this.timeDelta = 0; // private this._clock = new Clock(); } getInput() { return this.gain; } removeFilter() { if ( this.filter !== null ) { this.gain.disconnect( this.filter ); this.filter.disconnect( this.context.destination ); this.gain.connect( this.context.destination ); this.filter = null; } return this; } getFilter() { return this.filter; } setFilter( value ) { if ( this.filter !== null ) { this.gain.disconnect( this.filter ); this.filter.disconnect( this.context.destination ); } else { this.gain.disconnect( this.context.destination ); } this.filter = value; this.gain.connect( this.filter ); this.filter.connect( this.context.destination ); return this; } getMasterVolume() { return this.gain.gain.value; } setMasterVolume( value ) { this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); return this; } updateMatrixWorld( force ) { super.updateMatrixWorld( force ); const listener = this.context.listener; const up = this.up; this.timeDelta = this._clock.getDelta(); this.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 ); _orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 ); if ( listener.positionX ) { // code path for Chrome (see #14393) const endTime = this.context.currentTime + this.timeDelta; listener.positionX.linearRampToValueAtTime( _position$1.x, endTime ); listener.positionY.linearRampToValueAtTime( _position$1.y, endTime ); listener.positionZ.linearRampToValueAtTime( _position$1.z, endTime ); listener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime ); listener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime ); listener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime ); listener.upX.linearRampToValueAtTime( up.x, endTime ); listener.upY.linearRampToValueAtTime( up.y, endTime ); listener.upZ.linearRampToValueAtTime( up.z, endTime ); } else { listener.setPosition( _position$1.x, _position$1.y, _position$1.z ); listener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z ); } } } class Audio extends Object3D { constructor( listener ) { super(); this.type = 'Audio'; this.listener = listener; this.context = listener.context; this.gain = this.context.createGain(); this.gain.connect( listener.getInput() ); this.autoplay = false; this.buffer = null; this.detune = 0; this.loop = false; this.loopStart = 0; this.loopEnd = 0; this.offset = 0; this.duration = undefined; this.playbackRate = 1; this.isPlaying = false; this.hasPlaybackControl = true; this.source = null; this.sourceType = 'empty'; this._startedAt = 0; this._progress = 0; this._connected = false; this.filters = []; } getOutput() { return this.gain; } setNodeSource( audioNode ) { this.hasPlaybackControl = false; this.sourceType = 'audioNode'; this.source = audioNode; this.connect(); return this; } setMediaElementSource( mediaElement ) { this.hasPlaybackControl = false; this.sourceType = 'mediaNode'; this.source = this.context.createMediaElementSource( mediaElement ); this.connect(); return this; } setMediaStreamSource( mediaStream ) { this.hasPlaybackControl = false; this.sourceType = 'mediaStreamNode'; this.source = this.context.createMediaStreamSource( mediaStream ); this.connect(); return this; } setBuffer( audioBuffer ) { this.buffer = audioBuffer; this.sourceType = 'buffer'; if ( this.autoplay ) this.play(); return this; } play( delay = 0 ) { if ( this.isPlaying === true ) { console.warn( 'THREE.Audio: Audio is already playing.' ); return; } if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this._startedAt = this.context.currentTime + delay; const source = this.context.createBufferSource(); source.buffer = this.buffer; source.loop = this.loop; source.loopStart = this.loopStart; source.loopEnd = this.loopEnd; source.onended = this.onEnded.bind( this ); source.start( this._startedAt, this._progress + this.offset, this.duration ); this.isPlaying = true; this.source = source; this.setDetune( this.detune ); this.setPlaybackRate( this.playbackRate ); return this.connect(); } pause() { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } if ( this.isPlaying === true ) { // update current progress this._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate; if ( this.loop === true ) { // ensure _progress does not exceed duration with looped audios this._progress = this._progress % ( this.duration || this.buffer.duration ); } this.source.stop(); this.source.onended = null; this.isPlaying = false; } return this; } stop() { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this._progress = 0; this.source.stop(); this.source.onended = null; this.isPlaying = false; return this; } connect() { if ( this.filters.length > 0 ) { this.source.connect( this.filters[ 0 ] ); for ( let i = 1, l = this.filters.length; i < l; i ++ ) { this.filters[ i - 1 ].connect( this.filters[ i ] ); } this.filters[ this.filters.length - 1 ].connect( this.getOutput() ); } else { this.source.connect( this.getOutput() ); } this._connected = true; return this; } disconnect() { if ( this.filters.length > 0 ) { this.source.disconnect( this.filters[ 0 ] ); for ( let i = 1, l = this.filters.length; i < l; i ++ ) { this.filters[ i - 1 ].disconnect( this.filters[ i ] ); } this.filters[ this.filters.length - 1 ].disconnect( this.getOutput() ); } else { this.source.disconnect( this.getOutput() ); } this._connected = false; return this; } getFilters() { return this.filters; } setFilters( value ) { if ( ! value ) value = []; if ( this._connected === true ) { this.disconnect(); this.filters = value.slice(); this.connect(); } else { this.filters = value.slice(); } return this; } setDetune( value ) { this.detune = value; if ( this.source.detune === undefined ) return; // only set detune when available if ( this.isPlaying === true ) { this.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 ); } return this; } getDetune() { return this.detune; } getFilter() { return this.getFilters()[ 0 ]; } setFilter( filter ) { return this.setFilters( filter ? [ filter ] : [] ); } setPlaybackRate( value ) { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this.playbackRate = value; if ( this.isPlaying === true ) { this.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 ); } return this; } getPlaybackRate() { return this.playbackRate; } onEnded() { this.isPlaying = false; } getLoop() { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return false; } return this.loop; } setLoop( value ) { if ( this.hasPlaybackControl === false ) { console.warn( 'THREE.Audio: this Audio has no playback control.' ); return; } this.loop = value; if ( this.isPlaying === true ) { this.source.loop = this.loop; } return this; } setLoopStart( value ) { this.loopStart = value; return this; } setLoopEnd( value ) { this.loopEnd = value; return this; } getVolume() { return this.gain.gain.value; } setVolume( value ) { this.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 ); return this; } } const _position = /*@__PURE__*/ new Vector3(); const _quaternion = /*@__PURE__*/ new Quaternion(); const _scale = /*@__PURE__*/ new Vector3(); const _orientation = /*@__PURE__*/ new Vector3(); class PositionalAudio extends Audio { constructor( listener ) { super( listener ); this.panner = this.context.createPanner(); this.panner.panningModel = 'HRTF'; this.panner.connect( this.gain ); } getOutput() { return this.panner; } getRefDistance() { return this.panner.refDistance; } setRefDistance( value ) { this.panner.refDistance = value; return this; } getRolloffFactor() { return this.panner.rolloffFactor; } setRolloffFactor( value ) { this.panner.rolloffFactor = value; return this; } getDistanceModel() { return this.panner.distanceModel; } setDistanceModel( value ) { this.panner.distanceModel = value; return this; } getMaxDistance() { return this.panner.maxDistance; } setMaxDistance( value ) { this.panner.maxDistance = value; return this; } setDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) { this.panner.coneInnerAngle = coneInnerAngle; this.panner.coneOuterAngle = coneOuterAngle; this.panner.coneOuterGain = coneOuterGain; return this; } updateMatrixWorld( force ) { super.updateMatrixWorld( force ); if ( this.hasPlaybackControl === true && this.isPlaying === false ) return; this.matrixWorld.decompose( _position, _quaternion, _scale ); _orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion ); const panner = this.panner; if ( panner.positionX ) { // code path for Chrome and Firefox (see #14393) const endTime = this.context.currentTime + this.listener.timeDelta; panner.positionX.linearRampToValueAtTime( _position.x, endTime ); panner.positionY.linearRampToValueAtTime( _position.y, endTime ); panner.positionZ.linearRampToValueAtTime( _position.z, endTime ); panner.orientationX.linearRampToValueAtTime( _orientation.x, endTime ); panner.orientationY.linearRampToValueAtTime( _orientation.y, endTime ); panner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime ); } else { panner.setPosition( _position.x, _position.y, _position.z ); panner.setOrientation( _orientation.x, _orientation.y, _orientation.z ); } } } class AudioAnalyser { constructor( audio, fftSize = 2048 ) { this.analyser = audio.context.createAnalyser(); this.analyser.fftSize = fftSize; this.data = new Uint8Array( this.analyser.frequencyBinCount ); audio.getOutput().connect( this.analyser ); } getFrequencyData() { this.analyser.getByteFrequencyData( this.data ); return this.data; } getAverageFrequency() { let value = 0; const data = this.getFrequencyData(); for ( let i = 0; i < data.length; i ++ ) { value += data[ i ]; } return value / data.length; } } class PropertyMixer { constructor( binding, typeName, valueSize ) { this.binding = binding; this.valueSize = valueSize; let mixFunction, mixFunctionAdditive, setIdentity; // buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ] // // interpolators can use .buffer as their .result // the data then goes to 'incoming' // // 'accu0' and 'accu1' are used frame-interleaved for // the cumulative result and are compared to detect // changes // // 'orig' stores the original state of the property // // 'add' is used for additive cumulative results // // 'work' is optional and is only present for quaternion types. It is used // to store intermediate quaternion multiplication results switch ( typeName ) { case 'quaternion': mixFunction = this._slerp; mixFunctionAdditive = this._slerpAdditive; setIdentity = this._setAdditiveIdentityQuaternion; this.buffer = new Float64Array( valueSize * 6 ); this._workIndex = 5; break; case 'string': case 'bool': mixFunction = this._select; // Use the regular mix function and for additive on these types, // additive is not relevant for non-numeric types mixFunctionAdditive = this._select; setIdentity = this._setAdditiveIdentityOther; this.buffer = new Array( valueSize * 5 ); break; default: mixFunction = this._lerp; mixFunctionAdditive = this._lerpAdditive; setIdentity = this._setAdditiveIdentityNumeric; this.buffer = new Float64Array( valueSize * 5 ); } this._mixBufferRegion = mixFunction; this._mixBufferRegionAdditive = mixFunctionAdditive; this._setIdentity = setIdentity; this._origIndex = 3; this._addIndex = 4; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; this.useCount = 0; this.referenceCount = 0; } // accumulate data in the 'incoming' region into 'accu' accumulate( accuIndex, weight ) { // note: happily accumulating nothing when weight = 0, the caller knows // the weight and shouldn't have made the call in the first place const buffer = this.buffer, stride = this.valueSize, offset = accuIndex * stride + stride; let currentWeight = this.cumulativeWeight; if ( currentWeight === 0 ) { // accuN := incoming * weight for ( let i = 0; i !== stride; ++ i ) { buffer[ offset + i ] = buffer[ i ]; } currentWeight = weight; } else { // accuN := accuN + incoming * weight currentWeight += weight; const mix = weight / currentWeight; this._mixBufferRegion( buffer, offset, 0, mix, stride ); } this.cumulativeWeight = currentWeight; } // accumulate data in the 'incoming' region into 'add' accumulateAdditive( weight ) { const buffer = this.buffer, stride = this.valueSize, offset = stride * this._addIndex; if ( this.cumulativeWeightAdditive === 0 ) { // add = identity this._setIdentity(); } // add := add + incoming * weight this._mixBufferRegionAdditive( buffer, offset, 0, weight, stride ); this.cumulativeWeightAdditive += weight; } // apply the state of 'accu' to the binding when accus differ apply( accuIndex ) { const stride = this.valueSize, buffer = this.buffer, offset = accuIndex * stride + stride, weight = this.cumulativeWeight, weightAdditive = this.cumulativeWeightAdditive, binding = this.binding; this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; if ( weight < 1 ) { // accuN := accuN + original * ( 1 - cumulativeWeight ) const originalValueOffset = stride * this._origIndex; this._mixBufferRegion( buffer, offset, originalValueOffset, 1 - weight, stride ); } if ( weightAdditive > 0 ) { // accuN := accuN + additive accuN this._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride ); } for ( let i = stride, e = stride + stride; i !== e; ++ i ) { if ( buffer[ i ] !== buffer[ i + stride ] ) { // value has changed -> update scene graph binding.setValue( buffer, offset ); break; } } } // remember the state of the bound property and copy it to both accus saveOriginalState() { const binding = this.binding; const buffer = this.buffer, stride = this.valueSize, originalValueOffset = stride * this._origIndex; binding.getValue( buffer, originalValueOffset ); // accu[0..1] := orig -- initially detect changes against the original for ( let i = stride, e = originalValueOffset; i !== e; ++ i ) { buffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ]; } // Add to identity for additive this._setIdentity(); this.cumulativeWeight = 0; this.cumulativeWeightAdditive = 0; } // apply the state previously taken via 'saveOriginalState' to the binding restoreOriginalState() { const originalValueOffset = this.valueSize * 3; this.binding.setValue( this.buffer, originalValueOffset ); } _setAdditiveIdentityNumeric() { const startIndex = this._addIndex * this.valueSize; const endIndex = startIndex + this.valueSize; for ( let i = startIndex; i < endIndex; i ++ ) { this.buffer[ i ] = 0; } } _setAdditiveIdentityQuaternion() { this._setAdditiveIdentityNumeric(); this.buffer[ this._addIndex * this.valueSize + 3 ] = 1; } _setAdditiveIdentityOther() { const startIndex = this._origIndex * this.valueSize; const targetIndex = this._addIndex * this.valueSize; for ( let i = 0; i < this.valueSize; i ++ ) { this.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ]; } } // mix functions _select( buffer, dstOffset, srcOffset, t, stride ) { if ( t >= 0.5 ) { for ( let i = 0; i !== stride; ++ i ) { buffer[ dstOffset + i ] = buffer[ srcOffset + i ]; } } } _slerp( buffer, dstOffset, srcOffset, t ) { Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t ); } _slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { const workOffset = this._workIndex * stride; // Store result in intermediate buffer offset Quaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset ); // Slerp to the intermediate result Quaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t ); } _lerp( buffer, dstOffset, srcOffset, t, stride ) { const s = 1 - t; for ( let i = 0; i !== stride; ++ i ) { const j = dstOffset + i; buffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t; } } _lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) { for ( let i = 0; i !== stride; ++ i ) { const j = dstOffset + i; buffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t; } } } // Characters [].:/ are reserved for track binding syntax. const _RESERVED_CHARS_RE = '\\[\\]\\.:\\/'; const _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' ); // Attempts to allow node names from any language. ES5's `\w` regexp matches // only latin characters, and the unicode \p{L} is not yet supported. So // instead, we exclude reserved characters and match everything else. const _wordChar = '[^' + _RESERVED_CHARS_RE + ']'; const _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\.', '' ) + ']'; // Parent directories, delimited by '/' or ':'. Currently unused, but must // be matched to parse the rest of the track name. const _directoryRe = /((?:WC+[\/:])*)/.source.replace( 'WC', _wordChar ); // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. const _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot ); // Object on target node, and accessor. May not contain reserved // characters. Accessor may contain any character except closing bracket. const _objectRe = /(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace( 'WC', _wordChar ); // Property and accessor. May not contain reserved characters. Accessor may // contain any non-bracket characters. const _propertyRe = /\.(WC+)(?:\[(.+)\])?/.source.replace( 'WC', _wordChar ); const _trackRe = new RegExp( '' + '^' + _directoryRe + _nodeRe + _objectRe + _propertyRe + '$' ); const _supportedObjectNames = [ 'material', 'materials', 'bones' ]; class Composite { constructor( targetGroup, path, optionalParsedPath ) { const parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path ); this._targetGroup = targetGroup; this._bindings = targetGroup.subscribe_( path, parsedPath ); } getValue( array, offset ) { this.bind(); // bind all binding const firstValidIndex = this._targetGroup.nCachedObjects_, binding = this._bindings[ firstValidIndex ]; // and only call .getValue on the first if ( binding !== undefined ) binding.getValue( array, offset ); } setValue( array, offset ) { const bindings = this._bindings; for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { bindings[ i ].setValue( array, offset ); } } bind() { const bindings = this._bindings; for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { bindings[ i ].bind(); } } unbind() { const bindings = this._bindings; for ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) { bindings[ i ].unbind(); } } } // Note: This class uses a State pattern on a per-method basis: // 'bind' sets 'this.getValue' / 'setValue' and shadows the // prototype version of these methods with one that represents // the bound state. When the property is not found, the methods // become no-ops. class PropertyBinding { constructor( rootNode, path, parsedPath ) { this.path = path; this.parsedPath = parsedPath || PropertyBinding.parseTrackName( path ); this.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; this.rootNode = rootNode; // initial state of these methods that calls 'bind' this.getValue = this._getValue_unbound; this.setValue = this._setValue_unbound; } static create( root, path, parsedPath ) { if ( ! ( root && root.isAnimationObjectGroup ) ) { return new PropertyBinding( root, path, parsedPath ); } else { return new PropertyBinding.Composite( root, path, parsedPath ); } } /** * Replaces spaces with underscores and removes unsupported characters from * node names, to ensure compatibility with parseTrackName(). * * @param {string} name Node name to be sanitized. * @return {string} */ static sanitizeNodeName( name ) { return name.replace( /\s/g, '_' ).replace( _reservedRe, '' ); } static parseTrackName( trackName ) { const matches = _trackRe.exec( trackName ); if ( matches === null ) { throw new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName ); } const results = { // directoryName: matches[ 1 ], // (tschw) currently unused nodeName: matches[ 2 ], objectName: matches[ 3 ], objectIndex: matches[ 4 ], propertyName: matches[ 5 ], // required propertyIndex: matches[ 6 ] }; const lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' ); if ( lastDot !== undefined && lastDot !== - 1 ) { const objectName = results.nodeName.substring( lastDot + 1 ); // Object names must be checked against an allowlist. Otherwise, there // is no way to parse 'foo.bar.baz': 'baz' must be a property, but // 'bar' could be the objectName, or part of a nodeName (which can // include '.' characters). if ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) { results.nodeName = results.nodeName.substring( 0, lastDot ); results.objectName = objectName; } } if ( results.propertyName === null || results.propertyName.length === 0 ) { throw new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName ); } return results; } static findNode( root, nodeName ) { if ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) { return root; } // search into skeleton bones. if ( root.skeleton ) { const bone = root.skeleton.getBoneByName( nodeName ); if ( bone !== undefined ) { return bone; } } // search into node subtree. if ( root.children ) { const searchNodeSubtree = function ( children ) { for ( let i = 0; i < children.length; i ++ ) { const childNode = children[ i ]; if ( childNode.name === nodeName || childNode.uuid === nodeName ) { return childNode; } const result = searchNodeSubtree( childNode.children ); if ( result ) return result; } return null; }; const subTreeNode = searchNodeSubtree( root.children ); if ( subTreeNode ) { return subTreeNode; } } return null; } // these are used to "bind" a nonexistent property _getValue_unavailable() {} _setValue_unavailable() {} // Getters _getValue_direct( buffer, offset ) { buffer[ offset ] = this.targetObject[ this.propertyName ]; } _getValue_array( buffer, offset ) { const source = this.resolvedProperty; for ( let i = 0, n = source.length; i !== n; ++ i ) { buffer[ offset ++ ] = source[ i ]; } } _getValue_arrayElement( buffer, offset ) { buffer[ offset ] = this.resolvedProperty[ this.propertyIndex ]; } _getValue_toArray( buffer, offset ) { this.resolvedProperty.toArray( buffer, offset ); } // Direct _setValue_direct( buffer, offset ) { this.targetObject[ this.propertyName ] = buffer[ offset ]; } _setValue_direct_setNeedsUpdate( buffer, offset ) { this.targetObject[ this.propertyName ] = buffer[ offset ]; this.targetObject.needsUpdate = true; } _setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { this.targetObject[ this.propertyName ] = buffer[ offset ]; this.targetObject.matrixWorldNeedsUpdate = true; } // EntireArray _setValue_array( buffer, offset ) { const dest = this.resolvedProperty; for ( let i = 0, n = dest.length; i !== n; ++ i ) { dest[ i ] = buffer[ offset ++ ]; } } _setValue_array_setNeedsUpdate( buffer, offset ) { const dest = this.resolvedProperty; for ( let i = 0, n = dest.length; i !== n; ++ i ) { dest[ i ] = buffer[ offset ++ ]; } this.targetObject.needsUpdate = true; } _setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) { const dest = this.resolvedProperty; for ( let i = 0, n = dest.length; i !== n; ++ i ) { dest[ i ] = buffer[ offset ++ ]; } this.targetObject.matrixWorldNeedsUpdate = true; } // ArrayElement _setValue_arrayElement( buffer, offset ) { this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; } _setValue_arrayElement_setNeedsUpdate( buffer, offset ) { this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; this.targetObject.needsUpdate = true; } _setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) { this.resolvedProperty[ this.propertyIndex ] = buffer[ offset ]; this.targetObject.matrixWorldNeedsUpdate = true; } // HasToFromArray _setValue_fromArray( buffer, offset ) { this.resolvedProperty.fromArray( buffer, offset ); } _setValue_fromArray_setNeedsUpdate( buffer, offset ) { this.resolvedProperty.fromArray( buffer, offset ); this.targetObject.needsUpdate = true; } _setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) { this.resolvedProperty.fromArray( buffer, offset ); this.targetObject.matrixWorldNeedsUpdate = true; } _getValue_unbound( targetArray, offset ) { this.bind(); this.getValue( targetArray, offset ); } _setValue_unbound( sourceArray, offset ) { this.bind(); this.setValue( sourceArray, offset ); } // create getter / setter pair for a property in the scene graph bind() { let targetObject = this.node; const parsedPath = this.parsedPath; const objectName = parsedPath.objectName; const propertyName = parsedPath.propertyName; let propertyIndex = parsedPath.propertyIndex; if ( ! targetObject ) { targetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode; this.node = targetObject; } // set fail state so we can just 'return' on error this.getValue = this._getValue_unavailable; this.setValue = this._setValue_unavailable; // ensure there is a value node if ( ! targetObject ) { console.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\'t found.' ); return; } if ( objectName ) { let objectIndex = parsedPath.objectIndex; // special cases were we need to reach deeper into the hierarchy to get the face materials.... switch ( objectName ) { case 'materials': if ( ! targetObject.material ) { console.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this ); return; } if ( ! targetObject.material.materials ) { console.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this ); return; } targetObject = targetObject.material.materials; break; case 'bones': if ( ! targetObject.skeleton ) { console.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this ); return; } // potential future optimization: skip this if propertyIndex is already an integer // and convert the integer string to a true integer. targetObject = targetObject.skeleton.bones; // support resolving morphTarget names into indices. for ( let i = 0; i < targetObject.length; i ++ ) { if ( targetObject[ i ].name === objectIndex ) { objectIndex = i; break; } } break; default: if ( targetObject[ objectName ] === undefined ) { console.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this ); return; } targetObject = targetObject[ objectName ]; } if ( objectIndex !== undefined ) { if ( targetObject[ objectIndex ] === undefined ) { console.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject ); return; } targetObject = targetObject[ objectIndex ]; } } // resolve property const nodeProperty = targetObject[ propertyName ]; if ( nodeProperty === undefined ) { const nodeName = parsedPath.nodeName; console.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName + '.' + propertyName + ' but it wasn\'t found.', targetObject ); return; } // determine versioning scheme let versioning = this.Versioning.None; this.targetObject = targetObject; if ( targetObject.needsUpdate !== undefined ) { // material versioning = this.Versioning.NeedsUpdate; } else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform versioning = this.Versioning.MatrixWorldNeedsUpdate; } // determine how the property gets bound let bindingType = this.BindingType.Direct; if ( propertyIndex !== undefined ) { // access a sub element of the property array (only primitives are supported right now) if ( propertyName === 'morphTargetInfluences' ) { // potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer. // support resolving morphTarget names into indices. if ( ! targetObject.geometry ) { console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this ); return; } if ( targetObject.geometry.isBufferGeometry ) { if ( ! targetObject.geometry.morphAttributes ) { console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this ); return; } if ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) { propertyIndex = targetObject.morphTargetDictionary[ propertyIndex ]; } } else { console.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this ); return; } } bindingType = this.BindingType.ArrayElement; this.resolvedProperty = nodeProperty; this.propertyIndex = propertyIndex; } else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) { // must use copy for Object3D.Euler/Quaternion bindingType = this.BindingType.HasFromToArray; this.resolvedProperty = nodeProperty; } else if ( Array.isArray( nodeProperty ) ) { bindingType = this.BindingType.EntireArray; this.resolvedProperty = nodeProperty; } else { this.propertyName = propertyName; } // select getter / setter this.getValue = this.GetterByBindingType[ bindingType ]; this.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ]; } unbind() { this.node = null; // back to the prototype version of getValue / setValue // note: avoiding to mutate the shape of 'this' via 'delete' this.getValue = this._getValue_unbound; this.setValue = this._setValue_unbound; } } PropertyBinding.Composite = Composite; PropertyBinding.prototype.BindingType = { Direct: 0, EntireArray: 1, ArrayElement: 2, HasFromToArray: 3 }; PropertyBinding.prototype.Versioning = { None: 0, NeedsUpdate: 1, MatrixWorldNeedsUpdate: 2 }; PropertyBinding.prototype.GetterByBindingType = [ PropertyBinding.prototype._getValue_direct, PropertyBinding.prototype._getValue_array, PropertyBinding.prototype._getValue_arrayElement, PropertyBinding.prototype._getValue_toArray, ]; PropertyBinding.prototype.SetterByBindingTypeAndVersioning = [ [ // Direct PropertyBinding.prototype._setValue_direct, PropertyBinding.prototype._setValue_direct_setNeedsUpdate, PropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate, ], [ // EntireArray PropertyBinding.prototype._setValue_array, PropertyBinding.prototype._setValue_array_setNeedsUpdate, PropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate, ], [ // ArrayElement PropertyBinding.prototype._setValue_arrayElement, PropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate, PropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate, ], [ // HasToFromArray PropertyBinding.prototype._setValue_fromArray, PropertyBinding.prototype._setValue_fromArray_setNeedsUpdate, PropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate, ] ]; /** * * A group of objects that receives a shared animation state. * * Usage: * * - Add objects you would otherwise pass as 'root' to the * constructor or the .clipAction method of AnimationMixer. * * - Instead pass this object as 'root'. * * - You can also add and remove objects later when the mixer * is running. * * Note: * * Objects of this class appear as one object to the mixer, * so cache control of the individual objects must be done * on the group. * * Limitation: * * - The animated properties must be compatible among the * all objects in the group. * * - A single property can either be controlled through a * target group or directly, but not both. */ class AnimationObjectGroup { constructor() { this.uuid = generateUUID(); // cached objects followed by the active ones this._objects = Array.prototype.slice.call( arguments ); this.nCachedObjects_ = 0; // threshold // note: read by PropertyBinding.Composite const indices = {}; this._indicesByUUID = indices; // for bookkeeping for ( let i = 0, n = arguments.length; i !== n; ++ i ) { indices[ arguments[ i ].uuid ] = i; } this._paths = []; // inside: string this._parsedPaths = []; // inside: { we don't care, here } this._bindings = []; // inside: Array< PropertyBinding > this._bindingsIndicesByPath = {}; // inside: indices in these arrays const scope = this; this.stats = { objects: { get total() { return scope._objects.length; }, get inUse() { return this.total - scope.nCachedObjects_; } }, get bindingsPerObject() { return scope._bindings.length; } }; } add() { const objects = this._objects, indicesByUUID = this._indicesByUUID, paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, nBindings = bindings.length; let knownObject = undefined, nObjects = objects.length, nCachedObjects = this.nCachedObjects_; for ( let i = 0, n = arguments.length; i !== n; ++ i ) { const object = arguments[ i ], uuid = object.uuid; let index = indicesByUUID[ uuid ]; if ( index === undefined ) { // unknown object -> add it to the ACTIVE region index = nObjects ++; indicesByUUID[ uuid ] = index; objects.push( object ); // accounting is done, now do the same for all bindings for ( let j = 0, m = nBindings; j !== m; ++ j ) { bindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) ); } } else if ( index < nCachedObjects ) { knownObject = objects[ index ]; // move existing object to the ACTIVE region const firstActiveIndex = -- nCachedObjects, lastCachedObject = objects[ firstActiveIndex ]; indicesByUUID[ lastCachedObject.uuid ] = index; objects[ index ] = lastCachedObject; indicesByUUID[ uuid ] = firstActiveIndex; objects[ firstActiveIndex ] = object; // accounting is done, now do the same for all bindings for ( let j = 0, m = nBindings; j !== m; ++ j ) { const bindingsForPath = bindings[ j ], lastCached = bindingsForPath[ firstActiveIndex ]; let binding = bindingsForPath[ index ]; bindingsForPath[ index ] = lastCached; if ( binding === undefined ) { // since we do not bother to create new bindings // for objects that are cached, the binding may // or may not exist binding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ); } bindingsForPath[ firstActiveIndex ] = binding; } } else if ( objects[ index ] !== knownObject ) { console.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' + 'detected. Clean the caches or recreate your infrastructure when reloading scenes.' ); } // else the object is already where we want it to be } // for arguments this.nCachedObjects_ = nCachedObjects; } remove() { const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; let nCachedObjects = this.nCachedObjects_; for ( let i = 0, n = arguments.length; i !== n; ++ i ) { const object = arguments[ i ], uuid = object.uuid, index = indicesByUUID[ uuid ]; if ( index !== undefined && index >= nCachedObjects ) { // move existing object into the CACHED region const lastCachedIndex = nCachedObjects ++, firstActiveObject = objects[ lastCachedIndex ]; indicesByUUID[ firstActiveObject.uuid ] = index; objects[ index ] = firstActiveObject; indicesByUUID[ uuid ] = lastCachedIndex; objects[ lastCachedIndex ] = object; // accounting is done, now do the same for all bindings for ( let j = 0, m = nBindings; j !== m; ++ j ) { const bindingsForPath = bindings[ j ], firstActive = bindingsForPath[ lastCachedIndex ], binding = bindingsForPath[ index ]; bindingsForPath[ index ] = firstActive; bindingsForPath[ lastCachedIndex ] = binding; } } } // for arguments this.nCachedObjects_ = nCachedObjects; } // remove & forget uncache() { const objects = this._objects, indicesByUUID = this._indicesByUUID, bindings = this._bindings, nBindings = bindings.length; let nCachedObjects = this.nCachedObjects_, nObjects = objects.length; for ( let i = 0, n = arguments.length; i !== n; ++ i ) { const object = arguments[ i ], uuid = object.uuid, index = indicesByUUID[ uuid ]; if ( index !== undefined ) { delete indicesByUUID[ uuid ]; if ( index < nCachedObjects ) { // object is cached, shrink the CACHED region const firstActiveIndex = -- nCachedObjects, lastCachedObject = objects[ firstActiveIndex ], lastIndex = -- nObjects, lastObject = objects[ lastIndex ]; // last cached object takes this object's place indicesByUUID[ lastCachedObject.uuid ] = index; objects[ index ] = lastCachedObject; // last object goes to the activated slot and pop indicesByUUID[ lastObject.uuid ] = firstActiveIndex; objects[ firstActiveIndex ] = lastObject; objects.pop(); // accounting is done, now do the same for all bindings for ( let j = 0, m = nBindings; j !== m; ++ j ) { const bindingsForPath = bindings[ j ], lastCached = bindingsForPath[ firstActiveIndex ], last = bindingsForPath[ lastIndex ]; bindingsForPath[ index ] = lastCached; bindingsForPath[ firstActiveIndex ] = last; bindingsForPath.pop(); } } else { // object is active, just swap with the last and pop const lastIndex = -- nObjects, lastObject = objects[ lastIndex ]; if ( lastIndex > 0 ) { indicesByUUID[ lastObject.uuid ] = index; } objects[ index ] = lastObject; objects.pop(); // accounting is done, now do the same for all bindings for ( let j = 0, m = nBindings; j !== m; ++ j ) { const bindingsForPath = bindings[ j ]; bindingsForPath[ index ] = bindingsForPath[ lastIndex ]; bindingsForPath.pop(); } } // cached or active } // if object is known } // for arguments this.nCachedObjects_ = nCachedObjects; } // Internal interface used by befriended PropertyBinding.Composite: subscribe_( path, parsedPath ) { // returns an array of bindings for the given path that is changed // according to the contained objects in the group const indicesByPath = this._bindingsIndicesByPath; let index = indicesByPath[ path ]; const bindings = this._bindings; if ( index !== undefined ) return bindings[ index ]; const paths = this._paths, parsedPaths = this._parsedPaths, objects = this._objects, nObjects = objects.length, nCachedObjects = this.nCachedObjects_, bindingsForPath = new Array( nObjects ); index = bindings.length; indicesByPath[ path ] = index; paths.push( path ); parsedPaths.push( parsedPath ); bindings.push( bindingsForPath ); for ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) { const object = objects[ i ]; bindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath ); } return bindingsForPath; } unsubscribe_( path ) { // tells the group to forget about a property path and no longer // update the array previously obtained with 'subscribe_' const indicesByPath = this._bindingsIndicesByPath, index = indicesByPath[ path ]; if ( index !== undefined ) { const paths = this._paths, parsedPaths = this._parsedPaths, bindings = this._bindings, lastBindingsIndex = bindings.length - 1, lastBindings = bindings[ lastBindingsIndex ], lastBindingsPath = path[ lastBindingsIndex ]; indicesByPath[ lastBindingsPath ] = index; bindings[ index ] = lastBindings; bindings.pop(); parsedPaths[ index ] = parsedPaths[ lastBindingsIndex ]; parsedPaths.pop(); paths[ index ] = paths[ lastBindingsIndex ]; paths.pop(); } } } AnimationObjectGroup.prototype.isAnimationObjectGroup = true; class AnimationAction { constructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) { this._mixer = mixer; this._clip = clip; this._localRoot = localRoot; this.blendMode = blendMode; const tracks = clip.tracks, nTracks = tracks.length, interpolants = new Array( nTracks ); const interpolantSettings = { endingStart: ZeroCurvatureEnding, endingEnd: ZeroCurvatureEnding }; for ( let i = 0; i !== nTracks; ++ i ) { const interpolant = tracks[ i ].createInterpolant( null ); interpolants[ i ] = interpolant; interpolant.settings = interpolantSettings; } this._interpolantSettings = interpolantSettings; this._interpolants = interpolants; // bound by the mixer // inside: PropertyMixer (managed by the mixer) this._propertyBindings = new Array( nTracks ); this._cacheIndex = null; // for the memory manager this._byClipCacheIndex = null; // for the memory manager this._timeScaleInterpolant = null; this._weightInterpolant = null; this.loop = LoopRepeat; this._loopCount = - 1; // global mixer time when the action is to be started // it's set back to 'null' upon start of the action this._startTime = null; // scaled local time of the action // gets clamped or wrapped to 0..clip.duration according to loop this.time = 0; this.timeScale = 1; this._effectiveTimeScale = 1; this.weight = 1; this._effectiveWeight = 1; this.repetitions = Infinity; // no. of repetitions when looping this.paused = false; // true -> zero effective time scale this.enabled = true; // false -> zero effective weight this.clampWhenFinished = false;// keep feeding the last frame? this.zeroSlopeAtStart = true;// for smooth interpolation w/o separate this.zeroSlopeAtEnd = true;// clips for start, loop and end } // State & Scheduling play() { this._mixer._activateAction( this ); return this; } stop() { this._mixer._deactivateAction( this ); return this.reset(); } reset() { this.paused = false; this.enabled = true; this.time = 0; // restart clip this._loopCount = - 1;// forget previous loops this._startTime = null;// forget scheduling return this.stopFading().stopWarping(); } isRunning() { return this.enabled && ! this.paused && this.timeScale !== 0 && this._startTime === null && this._mixer._isActiveAction( this ); } // return true when play has been called isScheduled() { return this._mixer._isActiveAction( this ); } startAt( time ) { this._startTime = time; return this; } setLoop( mode, repetitions ) { this.loop = mode; this.repetitions = repetitions; return this; } // Weight // set the weight stopping any scheduled fading // although .enabled = false yields an effective weight of zero, this // method does *not* change .enabled, because it would be confusing setEffectiveWeight( weight ) { this.weight = weight; // note: same logic as when updated at runtime this._effectiveWeight = this.enabled ? weight : 0; return this.stopFading(); } // return the weight considering fading and .enabled getEffectiveWeight() { return this._effectiveWeight; } fadeIn( duration ) { return this._scheduleFading( duration, 0, 1 ); } fadeOut( duration ) { return this._scheduleFading( duration, 1, 0 ); } crossFadeFrom( fadeOutAction, duration, warp ) { fadeOutAction.fadeOut( duration ); this.fadeIn( duration ); if ( warp ) { const fadeInDuration = this._clip.duration, fadeOutDuration = fadeOutAction._clip.duration, startEndRatio = fadeOutDuration / fadeInDuration, endStartRatio = fadeInDuration / fadeOutDuration; fadeOutAction.warp( 1.0, startEndRatio, duration ); this.warp( endStartRatio, 1.0, duration ); } return this; } crossFadeTo( fadeInAction, duration, warp ) { return fadeInAction.crossFadeFrom( this, duration, warp ); } stopFading() { const weightInterpolant = this._weightInterpolant; if ( weightInterpolant !== null ) { this._weightInterpolant = null; this._mixer._takeBackControlInterpolant( weightInterpolant ); } return this; } // Time Scale Control // set the time scale stopping any scheduled warping // although .paused = true yields an effective time scale of zero, this // method does *not* change .paused, because it would be confusing setEffectiveTimeScale( timeScale ) { this.timeScale = timeScale; this._effectiveTimeScale = this.paused ? 0 : timeScale; return this.stopWarping(); } // return the time scale considering warping and .paused getEffectiveTimeScale() { return this._effectiveTimeScale; } setDuration( duration ) { this.timeScale = this._clip.duration / duration; return this.stopWarping(); } syncWith( action ) { this.time = action.time; this.timeScale = action.timeScale; return this.stopWarping(); } halt( duration ) { return this.warp( this._effectiveTimeScale, 0, duration ); } warp( startTimeScale, endTimeScale, duration ) { const mixer = this._mixer, now = mixer.time, timeScale = this.timeScale; let interpolant = this._timeScaleInterpolant; if ( interpolant === null ) { interpolant = mixer._lendControlInterpolant(); this._timeScaleInterpolant = interpolant; } const times = interpolant.parameterPositions, values = interpolant.sampleValues; times[ 0 ] = now; times[ 1 ] = now + duration; values[ 0 ] = startTimeScale / timeScale; values[ 1 ] = endTimeScale / timeScale; return this; } stopWarping() { const timeScaleInterpolant = this._timeScaleInterpolant; if ( timeScaleInterpolant !== null ) { this._timeScaleInterpolant = null; this._mixer._takeBackControlInterpolant( timeScaleInterpolant ); } return this; } // Object Accessors getMixer() { return this._mixer; } getClip() { return this._clip; } getRoot() { return this._localRoot || this._mixer._root; } // Interna _update( time, deltaTime, timeDirection, accuIndex ) { // called by the mixer if ( ! this.enabled ) { // call ._updateWeight() to update ._effectiveWeight this._updateWeight( time ); return; } const startTime = this._startTime; if ( startTime !== null ) { // check for scheduled start of action const timeRunning = ( time - startTime ) * timeDirection; if ( timeRunning < 0 || timeDirection === 0 ) { return; // yet to come / don't decide when delta = 0 } // start this._startTime = null; // unschedule deltaTime = timeDirection * timeRunning; } // apply time scale and advance time deltaTime *= this._updateTimeScale( time ); const clipTime = this._updateTime( deltaTime ); // note: _updateTime may disable the action resulting in // an effective weight of 0 const weight = this._updateWeight( time ); if ( weight > 0 ) { const interpolants = this._interpolants; const propertyMixers = this._propertyBindings; switch ( this.blendMode ) { case AdditiveAnimationBlendMode: for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { interpolants[ j ].evaluate( clipTime ); propertyMixers[ j ].accumulateAdditive( weight ); } break; case NormalAnimationBlendMode: default: for ( let j = 0, m = interpolants.length; j !== m; ++ j ) { interpolants[ j ].evaluate( clipTime ); propertyMixers[ j ].accumulate( accuIndex, weight ); } } } } _updateWeight( time ) { let weight = 0; if ( this.enabled ) { weight = this.weight; const interpolant = this._weightInterpolant; if ( interpolant !== null ) { const interpolantValue = interpolant.evaluate( time )[ 0 ]; weight *= interpolantValue; if ( time > interpolant.parameterPositions[ 1 ] ) { this.stopFading(); if ( interpolantValue === 0 ) { // faded out, disable this.enabled = false; } } } } this._effectiveWeight = weight; return weight; } _updateTimeScale( time ) { let timeScale = 0; if ( ! this.paused ) { timeScale = this.timeScale; const interpolant = this._timeScaleInterpolant; if ( interpolant !== null ) { const interpolantValue = interpolant.evaluate( time )[ 0 ]; timeScale *= interpolantValue; if ( time > interpolant.parameterPositions[ 1 ] ) { this.stopWarping(); if ( timeScale === 0 ) { // motion has halted, pause this.paused = true; } else { // warp done - apply final time scale this.timeScale = timeScale; } } } } this._effectiveTimeScale = timeScale; return timeScale; } _updateTime( deltaTime ) { const duration = this._clip.duration; const loop = this.loop; let time = this.time + deltaTime; let loopCount = this._loopCount; const pingPong = ( loop === LoopPingPong ); if ( deltaTime === 0 ) { if ( loopCount === - 1 ) return time; return ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time; } if ( loop === LoopOnce ) { if ( loopCount === - 1 ) { // just started this._loopCount = 0; this._setEndings( true, true, false ); } handle_stop: { if ( time >= duration ) { time = duration; } else if ( time < 0 ) { time = 0; } else { this.time = time; break handle_stop; } if ( this.clampWhenFinished ) this.paused = true; else this.enabled = false; this.time = time; this._mixer.dispatchEvent( { type: 'finished', action: this, direction: deltaTime < 0 ? - 1 : 1 } ); } } else { // repetitive Repeat or PingPong if ( loopCount === - 1 ) { // just started if ( deltaTime >= 0 ) { loopCount = 0; this._setEndings( true, this.repetitions === 0, pingPong ); } else { // when looping in reverse direction, the initial // transition through zero counts as a repetition, // so leave loopCount at -1 this._setEndings( this.repetitions === 0, true, pingPong ); } } if ( time >= duration || time < 0 ) { // wrap around const loopDelta = Math.floor( time / duration ); // signed time -= duration * loopDelta; loopCount += Math.abs( loopDelta ); const pending = this.repetitions - loopCount; if ( pending <= 0 ) { // have to stop (switch state, clamp time, fire event) if ( this.clampWhenFinished ) this.paused = true; else this.enabled = false; time = deltaTime > 0 ? duration : 0; this.time = time; this._mixer.dispatchEvent( { type: 'finished', action: this, direction: deltaTime > 0 ? 1 : - 1 } ); } else { // keep running if ( pending === 1 ) { // entering the last round const atStart = deltaTime < 0; this._setEndings( atStart, ! atStart, pingPong ); } else { this._setEndings( false, false, pingPong ); } this._loopCount = loopCount; this.time = time; this._mixer.dispatchEvent( { type: 'loop', action: this, loopDelta: loopDelta } ); } } else { this.time = time; } if ( pingPong && ( loopCount & 1 ) === 1 ) { // invert time for the "pong round" return duration - time; } } return time; } _setEndings( atStart, atEnd, pingPong ) { const settings = this._interpolantSettings; if ( pingPong ) { settings.endingStart = ZeroSlopeEnding; settings.endingEnd = ZeroSlopeEnding; } else { // assuming for LoopOnce atStart == atEnd == true if ( atStart ) { settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding; } else { settings.endingStart = WrapAroundEnding; } if ( atEnd ) { settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding; } else { settings.endingEnd = WrapAroundEnding; } } } _scheduleFading( duration, weightNow, weightThen ) { const mixer = this._mixer, now = mixer.time; let interpolant = this._weightInterpolant; if ( interpolant === null ) { interpolant = mixer._lendControlInterpolant(); this._weightInterpolant = interpolant; } const times = interpolant.parameterPositions, values = interpolant.sampleValues; times[ 0 ] = now; values[ 0 ] = weightNow; times[ 1 ] = now + duration; values[ 1 ] = weightThen; return this; } } class AnimationMixer extends EventDispatcher { constructor( root ) { super(); this._root = root; this._initMemoryManager(); this._accuIndex = 0; this.time = 0; this.timeScale = 1.0; } _bindAction( action, prototypeAction ) { const root = action._localRoot || this._root, tracks = action._clip.tracks, nTracks = tracks.length, bindings = action._propertyBindings, interpolants = action._interpolants, rootUuid = root.uuid, bindingsByRoot = this._bindingsByRootAndName; let bindingsByName = bindingsByRoot[ rootUuid ]; if ( bindingsByName === undefined ) { bindingsByName = {}; bindingsByRoot[ rootUuid ] = bindingsByName; } for ( let i = 0; i !== nTracks; ++ i ) { const track = tracks[ i ], trackName = track.name; let binding = bindingsByName[ trackName ]; if ( binding !== undefined ) { ++ binding.referenceCount; bindings[ i ] = binding; } else { binding = bindings[ i ]; if ( binding !== undefined ) { // existing binding, make sure the cache knows if ( binding._cacheIndex === null ) { ++ binding.referenceCount; this._addInactiveBinding( binding, rootUuid, trackName ); } continue; } const path = prototypeAction && prototypeAction. _propertyBindings[ i ].binding.parsedPath; binding = new PropertyMixer( PropertyBinding.create( root, trackName, path ), track.ValueTypeName, track.getValueSize() ); ++ binding.referenceCount; this._addInactiveBinding( binding, rootUuid, trackName ); bindings[ i ] = binding; } interpolants[ i ].resultBuffer = binding.buffer; } } _activateAction( action ) { if ( ! this._isActiveAction( action ) ) { if ( action._cacheIndex === null ) { // this action has been forgotten by the cache, but the user // appears to be still using it -> rebind const rootUuid = ( action._localRoot || this._root ).uuid, clipUuid = action._clip.uuid, actionsForClip = this._actionsByClip[ clipUuid ]; this._bindAction( action, actionsForClip && actionsForClip.knownActions[ 0 ] ); this._addInactiveAction( action, clipUuid, rootUuid ); } const bindings = action._propertyBindings; // increment reference counts / sort out state for ( let i = 0, n = bindings.length; i !== n; ++ i ) { const binding = bindings[ i ]; if ( binding.useCount ++ === 0 ) { this._lendBinding( binding ); binding.saveOriginalState(); } } this._lendAction( action ); } } _deactivateAction( action ) { if ( this._isActiveAction( action ) ) { const bindings = action._propertyBindings; // decrement reference counts / sort out state for ( let i = 0, n = bindings.length; i !== n; ++ i ) { const binding = bindings[ i ]; if ( -- binding.useCount === 0 ) { binding.restoreOriginalState(); this._takeBackBinding( binding ); } } this._takeBackAction( action ); } } // Memory manager _initMemoryManager() { this._actions = []; // 'nActiveActions' followed by inactive ones this._nActiveActions = 0; this._actionsByClip = {}; // inside: // { // knownActions: Array< AnimationAction > - used as prototypes // actionByRoot: AnimationAction - lookup // } this._bindings = []; // 'nActiveBindings' followed by inactive ones this._nActiveBindings = 0; this._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer > this._controlInterpolants = []; // same game as above this._nActiveControlInterpolants = 0; const scope = this; this.stats = { actions: { get total() { return scope._actions.length; }, get inUse() { return scope._nActiveActions; } }, bindings: { get total() { return scope._bindings.length; }, get inUse() { return scope._nActiveBindings; } }, controlInterpolants: { get total() { return scope._controlInterpolants.length; }, get inUse() { return scope._nActiveControlInterpolants; } } }; } // Memory management for AnimationAction objects _isActiveAction( action ) { const index = action._cacheIndex; return index !== null && index < this._nActiveActions; } _addInactiveAction( action, clipUuid, rootUuid ) { const actions = this._actions, actionsByClip = this._actionsByClip; let actionsForClip = actionsByClip[ clipUuid ]; if ( actionsForClip === undefined ) { actionsForClip = { knownActions: [ action ], actionByRoot: {} }; action._byClipCacheIndex = 0; actionsByClip[ clipUuid ] = actionsForClip; } else { const knownActions = actionsForClip.knownActions; action._byClipCacheIndex = knownActions.length; knownActions.push( action ); } action._cacheIndex = actions.length; actions.push( action ); actionsForClip.actionByRoot[ rootUuid ] = action; } _removeInactiveAction( action ) { const actions = this._actions, lastInactiveAction = actions[ actions.length - 1 ], cacheIndex = action._cacheIndex; lastInactiveAction._cacheIndex = cacheIndex; actions[ cacheIndex ] = lastInactiveAction; actions.pop(); action._cacheIndex = null; const clipUuid = action._clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[ clipUuid ], knownActionsForClip = actionsForClip.knownActions, lastKnownAction = knownActionsForClip[ knownActionsForClip.length - 1 ], byClipCacheIndex = action._byClipCacheIndex; lastKnownAction._byClipCacheIndex = byClipCacheIndex; knownActionsForClip[ byClipCacheIndex ] = lastKnownAction; knownActionsForClip.pop(); action._byClipCacheIndex = null; const actionByRoot = actionsForClip.actionByRoot, rootUuid = ( action._localRoot || this._root ).uuid; delete actionByRoot[ rootUuid ]; if ( knownActionsForClip.length === 0 ) { delete actionsByClip[ clipUuid ]; } this._removeInactiveBindingsForAction( action ); } _removeInactiveBindingsForAction( action ) { const bindings = action._propertyBindings; for ( let i = 0, n = bindings.length; i !== n; ++ i ) { const binding = bindings[ i ]; if ( -- binding.referenceCount === 0 ) { this._removeInactiveBinding( binding ); } } } _lendAction( action ) { // [ active actions | inactive actions ] // [ active actions >| inactive actions ] // s a // <-swap-> // a s const actions = this._actions, prevIndex = action._cacheIndex, lastActiveIndex = this._nActiveActions ++, firstInactiveAction = actions[ lastActiveIndex ]; action._cacheIndex = lastActiveIndex; actions[ lastActiveIndex ] = action; firstInactiveAction._cacheIndex = prevIndex; actions[ prevIndex ] = firstInactiveAction; } _takeBackAction( action ) { // [ active actions | inactive actions ] // [ active actions |< inactive actions ] // a s // <-swap-> // s a const actions = this._actions, prevIndex = action._cacheIndex, firstInactiveIndex = -- this._nActiveActions, lastActiveAction = actions[ firstInactiveIndex ]; action._cacheIndex = firstInactiveIndex; actions[ firstInactiveIndex ] = action; lastActiveAction._cacheIndex = prevIndex; actions[ prevIndex ] = lastActiveAction; } // Memory management for PropertyMixer objects _addInactiveBinding( binding, rootUuid, trackName ) { const bindingsByRoot = this._bindingsByRootAndName, bindings = this._bindings; let bindingByName = bindingsByRoot[ rootUuid ]; if ( bindingByName === undefined ) { bindingByName = {}; bindingsByRoot[ rootUuid ] = bindingByName; } bindingByName[ trackName ] = binding; binding._cacheIndex = bindings.length; bindings.push( binding ); } _removeInactiveBinding( binding ) { const bindings = this._bindings, propBinding = binding.binding, rootUuid = propBinding.rootNode.uuid, trackName = propBinding.path, bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[ rootUuid ], lastInactiveBinding = bindings[ bindings.length - 1 ], cacheIndex = binding._cacheIndex; lastInactiveBinding._cacheIndex = cacheIndex; bindings[ cacheIndex ] = lastInactiveBinding; bindings.pop(); delete bindingByName[ trackName ]; if ( Object.keys( bindingByName ).length === 0 ) { delete bindingsByRoot[ rootUuid ]; } } _lendBinding( binding ) { const bindings = this._bindings, prevIndex = binding._cacheIndex, lastActiveIndex = this._nActiveBindings ++, firstInactiveBinding = bindings[ lastActiveIndex ]; binding._cacheIndex = lastActiveIndex; bindings[ lastActiveIndex ] = binding; firstInactiveBinding._cacheIndex = prevIndex; bindings[ prevIndex ] = firstInactiveBinding; } _takeBackBinding( binding ) { const bindings = this._bindings, prevIndex = binding._cacheIndex, firstInactiveIndex = -- this._nActiveBindings, lastActiveBinding = bindings[ firstInactiveIndex ]; binding._cacheIndex = firstInactiveIndex; bindings[ firstInactiveIndex ] = binding; lastActiveBinding._cacheIndex = prevIndex; bindings[ prevIndex ] = lastActiveBinding; } // Memory management of Interpolants for weight and time scale _lendControlInterpolant() { const interpolants = this._controlInterpolants, lastActiveIndex = this._nActiveControlInterpolants ++; let interpolant = interpolants[ lastActiveIndex ]; if ( interpolant === undefined ) { interpolant = new LinearInterpolant( new Float32Array( 2 ), new Float32Array( 2 ), 1, this._controlInterpolantsResultBuffer ); interpolant.__cacheIndex = lastActiveIndex; interpolants[ lastActiveIndex ] = interpolant; } return interpolant; } _takeBackControlInterpolant( interpolant ) { const interpolants = this._controlInterpolants, prevIndex = interpolant.__cacheIndex, firstInactiveIndex = -- this._nActiveControlInterpolants, lastActiveInterpolant = interpolants[ firstInactiveIndex ]; interpolant.__cacheIndex = firstInactiveIndex; interpolants[ firstInactiveIndex ] = interpolant; lastActiveInterpolant.__cacheIndex = prevIndex; interpolants[ prevIndex ] = lastActiveInterpolant; } // return an action for a clip optionally using a custom root target // object (this method allocates a lot of dynamic memory in case a // previously unknown clip/root combination is specified) clipAction( clip, optionalRoot, blendMode ) { const root = optionalRoot || this._root, rootUuid = root.uuid; let clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip; const clipUuid = clipObject !== null ? clipObject.uuid : clip; const actionsForClip = this._actionsByClip[ clipUuid ]; let prototypeAction = null; if ( blendMode === undefined ) { if ( clipObject !== null ) { blendMode = clipObject.blendMode; } else { blendMode = NormalAnimationBlendMode; } } if ( actionsForClip !== undefined ) { const existingAction = actionsForClip.actionByRoot[ rootUuid ]; if ( existingAction !== undefined && existingAction.blendMode === blendMode ) { return existingAction; } // we know the clip, so we don't have to parse all // the bindings again but can just copy prototypeAction = actionsForClip.knownActions[ 0 ]; // also, take the clip from the prototype action if ( clipObject === null ) clipObject = prototypeAction._clip; } // clip must be known when specified via string if ( clipObject === null ) return null; // allocate all resources required to run it const newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode ); this._bindAction( newAction, prototypeAction ); // and make the action known to the memory manager this._addInactiveAction( newAction, clipUuid, rootUuid ); return newAction; } // get an existing action existingAction( clip, optionalRoot ) { const root = optionalRoot || this._root, rootUuid = root.uuid, clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip, clipUuid = clipObject ? clipObject.uuid : clip, actionsForClip = this._actionsByClip[ clipUuid ]; if ( actionsForClip !== undefined ) { return actionsForClip.actionByRoot[ rootUuid ] || null; } return null; } // deactivates all previously scheduled actions stopAllAction() { const actions = this._actions, nActions = this._nActiveActions; for ( let i = nActions - 1; i >= 0; -- i ) { actions[ i ].stop(); } return this; } // advance the time and update apply the animation update( deltaTime ) { deltaTime *= this.timeScale; const actions = this._actions, nActions = this._nActiveActions, time = this.time += deltaTime, timeDirection = Math.sign( deltaTime ), accuIndex = this._accuIndex ^= 1; // run active actions for ( let i = 0; i !== nActions; ++ i ) { const action = actions[ i ]; action._update( time, deltaTime, timeDirection, accuIndex ); } // update scene graph const bindings = this._bindings, nBindings = this._nActiveBindings; for ( let i = 0; i !== nBindings; ++ i ) { bindings[ i ].apply( accuIndex ); } return this; } // Allows you to seek to a specific time in an animation. setTime( timeInSeconds ) { this.time = 0; // Zero out time attribute for AnimationMixer object; for ( let i = 0; i < this._actions.length; i ++ ) { this._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects. } return this.update( timeInSeconds ); // Update used to set exact time. Returns "this" AnimationMixer object. } // return this mixer's root target object getRoot() { return this._root; } // free all resources specific to a particular clip uncacheClip( clip ) { const actions = this._actions, clipUuid = clip.uuid, actionsByClip = this._actionsByClip, actionsForClip = actionsByClip[ clipUuid ]; if ( actionsForClip !== undefined ) { // note: just calling _removeInactiveAction would mess up the // iteration state and also require updating the state we can // just throw away const actionsToRemove = actionsForClip.knownActions; for ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) { const action = actionsToRemove[ i ]; this._deactivateAction( action ); const cacheIndex = action._cacheIndex, lastInactiveAction = actions[ actions.length - 1 ]; action._cacheIndex = null; action._byClipCacheIndex = null; lastInactiveAction._cacheIndex = cacheIndex; actions[ cacheIndex ] = lastInactiveAction; actions.pop(); this._removeInactiveBindingsForAction( action ); } delete actionsByClip[ clipUuid ]; } } // free all resources specific to a particular root target object uncacheRoot( root ) { const rootUuid = root.uuid, actionsByClip = this._actionsByClip; for ( const clipUuid in actionsByClip ) { const actionByRoot = actionsByClip[ clipUuid ].actionByRoot, action = actionByRoot[ rootUuid ]; if ( action !== undefined ) { this._deactivateAction( action ); this._removeInactiveAction( action ); } } const bindingsByRoot = this._bindingsByRootAndName, bindingByName = bindingsByRoot[ rootUuid ]; if ( bindingByName !== undefined ) { for ( const trackName in bindingByName ) { const binding = bindingByName[ trackName ]; binding.restoreOriginalState(); this._removeInactiveBinding( binding ); } } } // remove a targeted clip from the cache uncacheAction( clip, optionalRoot ) { const action = this.existingAction( clip, optionalRoot ); if ( action !== null ) { this._deactivateAction( action ); this._removeInactiveAction( action ); } } } AnimationMixer.prototype._controlInterpolantsResultBuffer = new Float32Array( 1 ); class Uniform { constructor( value ) { if ( typeof value === 'string' ) { console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); value = arguments[ 1 ]; } this.value = value; } clone() { return new Uniform( this.value.clone === undefined ? this.value : this.value.clone() ); } } class InstancedInterleavedBuffer extends InterleavedBuffer { constructor( array, stride, meshPerAttribute = 1 ) { super( array, stride ); this.meshPerAttribute = meshPerAttribute; } copy( source ) { super.copy( source ); this.meshPerAttribute = source.meshPerAttribute; return this; } clone( data ) { const ib = super.clone( data ); ib.meshPerAttribute = this.meshPerAttribute; return ib; } toJSON( data ) { const json = super.toJSON( data ); json.isInstancedInterleavedBuffer = true; json.meshPerAttribute = this.meshPerAttribute; return json; } } InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer = true; class GLBufferAttribute { constructor( buffer, type, itemSize, elementSize, count ) { this.buffer = buffer; this.type = type; this.itemSize = itemSize; this.elementSize = elementSize; this.count = count; this.version = 0; } set needsUpdate( value ) { if ( value === true ) this.version ++; } setBuffer( buffer ) { this.buffer = buffer; return this; } setType( type, elementSize ) { this.type = type; this.elementSize = elementSize; return this; } setItemSize( itemSize ) { this.itemSize = itemSize; return this; } setCount( count ) { this.count = count; return this; } } GLBufferAttribute.prototype.isGLBufferAttribute = true; class Raycaster { constructor( origin, direction, near = 0, far = Infinity ) { this.ray = new Ray( origin, direction ); // direction is assumed to be normalized (for accurate distance calculations) this.near = near; this.far = far; this.camera = null; this.layers = new Layers(); this.params = { Mesh: {}, Line: { threshold: 1 }, LOD: {}, Points: { threshold: 1 }, Sprite: {} }; } set( origin, direction ) { // direction is assumed to be normalized (for accurate distance calculations) this.ray.set( origin, direction ); } setFromCamera( coords, camera ) { if ( camera.isPerspectiveCamera ) { this.ray.origin.setFromMatrixPosition( camera.matrixWorld ); this.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize(); this.camera = camera; } else if ( camera.isOrthographicCamera ) { this.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera this.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld ); this.camera = camera; } else { console.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type ); } } intersectObject( object, recursive = true, intersects = [] ) { intersectObject( object, this, intersects, recursive ); intersects.sort( ascSort ); return intersects; } intersectObjects( objects, recursive = true, intersects = [] ) { for ( let i = 0, l = objects.length; i < l; i ++ ) { intersectObject( objects[ i ], this, intersects, recursive ); } intersects.sort( ascSort ); return intersects; } } function ascSort( a, b ) { return a.distance - b.distance; } function intersectObject( object, raycaster, intersects, recursive ) { if ( object.layers.test( raycaster.layers ) ) { object.raycast( raycaster, intersects ); } if ( recursive === true ) { const children = object.children; for ( let i = 0, l = children.length; i < l; i ++ ) { intersectObject( children[ i ], raycaster, intersects, true ); } } } /** * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system * * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up. * The azimuthal angle (theta) is measured from the positive z-axis. */ class Spherical { constructor( radius = 1, phi = 0, theta = 0 ) { this.radius = radius; this.phi = phi; // polar angle this.theta = theta; // azimuthal angle return this; } set( radius, phi, theta ) { this.radius = radius; this.phi = phi; this.theta = theta; return this; } copy( other ) { this.radius = other.radius; this.phi = other.phi; this.theta = other.theta; return this; } // restrict phi to be betwee EPS and PI-EPS makeSafe() { const EPS = 0.000001; this.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) ); return this; } setFromVector3( v ) { return this.setFromCartesianCoords( v.x, v.y, v.z ); } setFromCartesianCoords( x, y, z ) { this.radius = Math.sqrt( x * x + y * y + z * z ); if ( this.radius === 0 ) { this.theta = 0; this.phi = 0; } else { this.theta = Math.atan2( x, z ); this.phi = Math.acos( clamp$1( y / this.radius, - 1, 1 ) ); } return this; } clone() { return new this.constructor().copy( this ); } } /** * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system */ class Cylindrical { constructor( radius = 1, theta = 0, y = 0 ) { this.radius = radius; // distance from the origin to a point in the x-z plane this.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis this.y = y; // height above the x-z plane return this; } set( radius, theta, y ) { this.radius = radius; this.theta = theta; this.y = y; return this; } copy( other ) { this.radius = other.radius; this.theta = other.theta; this.y = other.y; return this; } setFromVector3( v ) { return this.setFromCartesianCoords( v.x, v.y, v.z ); } setFromCartesianCoords( x, y, z ) { this.radius = Math.sqrt( x * x + z * z ); this.theta = Math.atan2( x, z ); this.y = y; return this; } clone() { return new this.constructor().copy( this ); } } const _vector$4 = /*@__PURE__*/ new Vector2(); class Box2 { constructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) { this.min = min; this.max = max; } set( min, max ) { this.min.copy( min ); this.max.copy( max ); return this; } setFromPoints( points ) { this.makeEmpty(); for ( let i = 0, il = points.length; i < il; i ++ ) { this.expandByPoint( points[ i ] ); } return this; } setFromCenterAndSize( center, size ) { const halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 ); this.min.copy( center ).sub( halfSize ); this.max.copy( center ).add( halfSize ); return this; } clone() { return new this.constructor().copy( this ); } copy( box ) { this.min.copy( box.min ); this.max.copy( box.max ); return this; } makeEmpty() { this.min.x = this.min.y = + Infinity; this.max.x = this.max.y = - Infinity; return this; } isEmpty() { // this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes return ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ); } getCenter( target ) { return this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); } getSize( target ) { return this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min ); } expandByPoint( point ) { this.min.min( point ); this.max.max( point ); return this; } expandByVector( vector ) { this.min.sub( vector ); this.max.add( vector ); return this; } expandByScalar( scalar ) { this.min.addScalar( - scalar ); this.max.addScalar( scalar ); return this; } containsPoint( point ) { return point.x < this.min.x || point.x > this.max.x || point.y < this.min.y || point.y > this.max.y ? false : true; } containsBox( box ) { return this.min.x <= box.min.x && box.max.x <= this.max.x && this.min.y <= box.min.y && box.max.y <= this.max.y; } getParameter( point, target ) { // This can potentially have a divide by zero if the box // has a size dimension of 0. return target.set( ( point.x - this.min.x ) / ( this.max.x - this.min.x ), ( point.y - this.min.y ) / ( this.max.y - this.min.y ) ); } intersectsBox( box ) { // using 4 splitting planes to rule out intersections return box.max.x < this.min.x || box.min.x > this.max.x || box.max.y < this.min.y || box.min.y > this.max.y ? false : true; } clampPoint( point, target ) { return target.copy( point ).clamp( this.min, this.max ); } distanceToPoint( point ) { const clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max ); return clampedPoint.sub( point ).length(); } intersect( box ) { this.min.max( box.min ); this.max.min( box.max ); return this; } union( box ) { this.min.min( box.min ); this.max.max( box.max ); return this; } translate( offset ) { this.min.add( offset ); this.max.add( offset ); return this; } equals( box ) { return box.min.equals( this.min ) && box.max.equals( this.max ); } } Box2.prototype.isBox2 = true; const _startP = /*@__PURE__*/ new Vector3(); const _startEnd = /*@__PURE__*/ new Vector3(); class Line3 { constructor( start = new Vector3(), end = new Vector3() ) { this.start = start; this.end = end; } set( start, end ) { this.start.copy( start ); this.end.copy( end ); return this; } copy( line ) { this.start.copy( line.start ); this.end.copy( line.end ); return this; } getCenter( target ) { return target.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); } delta( target ) { return target.subVectors( this.end, this.start ); } distanceSq() { return this.start.distanceToSquared( this.end ); } distance() { return this.start.distanceTo( this.end ); } at( t, target ) { return this.delta( target ).multiplyScalar( t ).add( this.start ); } closestPointToPointParameter( point, clampToLine ) { _startP.subVectors( point, this.start ); _startEnd.subVectors( this.end, this.start ); const startEnd2 = _startEnd.dot( _startEnd ); const startEnd_startP = _startEnd.dot( _startP ); let t = startEnd_startP / startEnd2; if ( clampToLine ) { t = clamp$1( t, 0, 1 ); } return t; } closestPointToPoint( point, clampToLine, target ) { const t = this.closestPointToPointParameter( point, clampToLine ); return this.delta( target ).multiplyScalar( t ).add( this.start ); } applyMatrix4( matrix ) { this.start.applyMatrix4( matrix ); this.end.applyMatrix4( matrix ); return this; } equals( line ) { return line.start.equals( this.start ) && line.end.equals( this.end ); } clone() { return new this.constructor().copy( this ); } } const _vector$3 = /*@__PURE__*/ new Vector3(); class SpotLightHelper extends Object3D { constructor( light, color ) { super(); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; this.color = color; const geometry = new BufferGeometry(); const positions = [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 1, 1 ]; for ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) { const p1 = ( i / l ) * Math.PI * 2; const p2 = ( j / l ) * Math.PI * 2; positions.push( Math.cos( p1 ), Math.sin( p1 ), 1, Math.cos( p2 ), Math.sin( p2 ), 1 ); } geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); this.cone = new LineSegments( geometry, material ); this.add( this.cone ); this.update(); } dispose() { this.cone.geometry.dispose(); this.cone.material.dispose(); } update() { this.light.updateMatrixWorld(); const coneLength = this.light.distance ? this.light.distance : 1000; const coneWidth = coneLength * Math.tan( this.light.angle ); this.cone.scale.set( coneWidth, coneWidth, coneLength ); _vector$3.setFromMatrixPosition( this.light.target.matrixWorld ); this.cone.lookAt( _vector$3 ); if ( this.color !== undefined ) { this.cone.material.color.set( this.color ); } else { this.cone.material.color.copy( this.light.color ); } } } const _vector$2 = /*@__PURE__*/ new Vector3(); const _boneMatrix = /*@__PURE__*/ new Matrix4(); const _matrixWorldInv = /*@__PURE__*/ new Matrix4(); class SkeletonHelper extends LineSegments { constructor( object ) { const bones = getBoneList( object ); const geometry = new BufferGeometry(); const vertices = []; const colors = []; const color1 = new Color( 0, 0, 1 ); const color2 = new Color( 0, 1, 0 ); for ( let i = 0; i < bones.length; i ++ ) { const bone = bones[ i ]; if ( bone.parent && bone.parent.isBone ) { vertices.push( 0, 0, 0 ); vertices.push( 0, 0, 0 ); colors.push( color1.r, color1.g, color1.b ); colors.push( color2.r, color2.g, color2.b ); } } geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); const material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } ); super( geometry, material ); this.type = 'SkeletonHelper'; this.isSkeletonHelper = true; this.root = object; this.bones = bones; this.matrix = object.matrixWorld; this.matrixAutoUpdate = false; } updateMatrixWorld( force ) { const bones = this.bones; const geometry = this.geometry; const position = geometry.getAttribute( 'position' ); _matrixWorldInv.copy( this.root.matrixWorld ).invert(); for ( let i = 0, j = 0; i < bones.length; i ++ ) { const bone = bones[ i ]; if ( bone.parent && bone.parent.isBone ) { _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld ); _vector$2.setFromMatrixPosition( _boneMatrix ); position.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z ); _boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld ); _vector$2.setFromMatrixPosition( _boneMatrix ); position.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z ); j += 2; } } geometry.getAttribute( 'position' ).needsUpdate = true; super.updateMatrixWorld( force ); } } function getBoneList( object ) { const boneList = []; if ( object.isBone === true ) { boneList.push( object ); } for ( let i = 0; i < object.children.length; i ++ ) { boneList.push.apply( boneList, getBoneList( object.children[ i ] ) ); } return boneList; } class PointLightHelper extends Mesh { constructor( light, sphereSize, color ) { const geometry = new SphereGeometry( sphereSize, 4, 2 ); const material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); super( geometry, material ); this.light = light; this.light.updateMatrixWorld(); this.color = color; this.type = 'PointLightHelper'; this.matrix = this.light.matrixWorld; this.matrixAutoUpdate = false; this.update(); /* // TODO: delete this comment? const distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 ); const distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } ); this.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial ); this.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial ); const d = light.distance; if ( d === 0.0 ) { this.lightDistance.visible = false; } else { this.lightDistance.scale.set( d, d, d ); } this.add( this.lightDistance ); */ } dispose() { this.geometry.dispose(); this.material.dispose(); } update() { if ( this.color !== undefined ) { this.material.color.set( this.color ); } else { this.material.color.copy( this.light.color ); } /* const d = this.light.distance; if ( d === 0.0 ) { this.lightDistance.visible = false; } else { this.lightDistance.visible = true; this.lightDistance.scale.set( d, d, d ); } */ } } const _vector$1 = /*@__PURE__*/ new Vector3(); const _color1 = /*@__PURE__*/ new Color(); const _color2 = /*@__PURE__*/ new Color(); class HemisphereLightHelper extends Object3D { constructor( light, size, color ) { super(); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; this.color = color; const geometry = new OctahedronGeometry( size ); geometry.rotateY( Math.PI * 0.5 ); this.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } ); if ( this.color === undefined ) this.material.vertexColors = true; const position = geometry.getAttribute( 'position' ); const colors = new Float32Array( position.count * 3 ); geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) ); this.add( new Mesh( geometry, this.material ) ); this.update(); } dispose() { this.children[ 0 ].geometry.dispose(); this.children[ 0 ].material.dispose(); } update() { const mesh = this.children[ 0 ]; if ( this.color !== undefined ) { this.material.color.set( this.color ); } else { const colors = mesh.geometry.getAttribute( 'color' ); _color1.copy( this.light.color ); _color2.copy( this.light.groundColor ); for ( let i = 0, l = colors.count; i < l; i ++ ) { const color = ( i < ( l / 2 ) ) ? _color1 : _color2; colors.setXYZ( i, color.r, color.g, color.b ); } colors.needsUpdate = true; } mesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() ); } } class GridHelper extends LineSegments { constructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) { color1 = new Color( color1 ); color2 = new Color( color2 ); const center = divisions / 2; const step = size / divisions; const halfSize = size / 2; const vertices = [], colors = []; for ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) { vertices.push( - halfSize, 0, k, halfSize, 0, k ); vertices.push( k, 0, - halfSize, k, 0, halfSize ); const color = i === center ? color1 : color2; color.toArray( colors, j ); j += 3; color.toArray( colors, j ); j += 3; color.toArray( colors, j ); j += 3; color.toArray( colors, j ); j += 3; } const geometry = new BufferGeometry(); geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); super( geometry, material ); this.type = 'GridHelper'; } } class PolarGridHelper extends LineSegments { constructor( radius = 10, radials = 16, circles = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) { color1 = new Color( color1 ); color2 = new Color( color2 ); const vertices = []; const colors = []; // create the radials for ( let i = 0; i <= radials; i ++ ) { const v = ( i / radials ) * ( Math.PI * 2 ); const x = Math.sin( v ) * radius; const z = Math.cos( v ) * radius; vertices.push( 0, 0, 0 ); vertices.push( x, 0, z ); const color = ( i & 1 ) ? color1 : color2; colors.push( color.r, color.g, color.b ); colors.push( color.r, color.g, color.b ); } // create the circles for ( let i = 0; i <= circles; i ++ ) { const color = ( i & 1 ) ? color1 : color2; const r = radius - ( radius / circles * i ); for ( let j = 0; j < divisions; j ++ ) { // first vertex let v = ( j / divisions ) * ( Math.PI * 2 ); let x = Math.sin( v ) * r; let z = Math.cos( v ) * r; vertices.push( x, 0, z ); colors.push( color.r, color.g, color.b ); // second vertex v = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 ); x = Math.sin( v ) * r; z = Math.cos( v ) * r; vertices.push( x, 0, z ); colors.push( color.r, color.g, color.b ); } } const geometry = new BufferGeometry(); geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); super( geometry, material ); this.type = 'PolarGridHelper'; } } const _v1 = /*@__PURE__*/ new Vector3(); const _v2 = /*@__PURE__*/ new Vector3(); const _v3 = /*@__PURE__*/ new Vector3(); class DirectionalLightHelper extends Object3D { constructor( light, size, color ) { super(); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; this.color = color; if ( size === undefined ) size = 1; let geometry = new BufferGeometry(); geometry.setAttribute( 'position', new Float32BufferAttribute( [ - size, size, 0, size, size, 0, size, - size, 0, - size, - size, 0, - size, size, 0 ], 3 ) ); const material = new LineBasicMaterial( { fog: false, toneMapped: false } ); this.lightPlane = new Line( geometry, material ); this.add( this.lightPlane ); geometry = new BufferGeometry(); geometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); this.targetLine = new Line( geometry, material ); this.add( this.targetLine ); this.update(); } dispose() { this.lightPlane.geometry.dispose(); this.lightPlane.material.dispose(); this.targetLine.geometry.dispose(); this.targetLine.material.dispose(); } update() { _v1.setFromMatrixPosition( this.light.matrixWorld ); _v2.setFromMatrixPosition( this.light.target.matrixWorld ); _v3.subVectors( _v2, _v1 ); this.lightPlane.lookAt( _v2 ); if ( this.color !== undefined ) { this.lightPlane.material.color.set( this.color ); this.targetLine.material.color.set( this.color ); } else { this.lightPlane.material.color.copy( this.light.color ); this.targetLine.material.color.copy( this.light.color ); } this.targetLine.lookAt( _v2 ); this.targetLine.scale.z = _v3.length(); } } const _vector = /*@__PURE__*/ new Vector3(); const _camera = /*@__PURE__*/ new Camera(); /** * - shows frustum, line of sight and up of the camera * - suitable for fast updates * - based on frustum visualization in lightgl.js shadowmap example * https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html */ class CameraHelper extends LineSegments { constructor( camera ) { const geometry = new BufferGeometry(); const material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } ); const vertices = []; const colors = []; const pointMap = {}; // colors const colorFrustum = new Color( 0xffaa00 ); const colorCone = new Color( 0xff0000 ); const colorUp = new Color( 0x00aaff ); const colorTarget = new Color( 0xffffff ); const colorCross = new Color( 0x333333 ); // near addLine( 'n1', 'n2', colorFrustum ); addLine( 'n2', 'n4', colorFrustum ); addLine( 'n4', 'n3', colorFrustum ); addLine( 'n3', 'n1', colorFrustum ); // far addLine( 'f1', 'f2', colorFrustum ); addLine( 'f2', 'f4', colorFrustum ); addLine( 'f4', 'f3', colorFrustum ); addLine( 'f3', 'f1', colorFrustum ); // sides addLine( 'n1', 'f1', colorFrustum ); addLine( 'n2', 'f2', colorFrustum ); addLine( 'n3', 'f3', colorFrustum ); addLine( 'n4', 'f4', colorFrustum ); // cone addLine( 'p', 'n1', colorCone ); addLine( 'p', 'n2', colorCone ); addLine( 'p', 'n3', colorCone ); addLine( 'p', 'n4', colorCone ); // up addLine( 'u1', 'u2', colorUp ); addLine( 'u2', 'u3', colorUp ); addLine( 'u3', 'u1', colorUp ); // target addLine( 'c', 't', colorTarget ); addLine( 'p', 'c', colorCross ); // cross addLine( 'cn1', 'cn2', colorCross ); addLine( 'cn3', 'cn4', colorCross ); addLine( 'cf1', 'cf2', colorCross ); addLine( 'cf3', 'cf4', colorCross ); function addLine( a, b, color ) { addPoint( a, color ); addPoint( b, color ); } function addPoint( id, color ) { vertices.push( 0, 0, 0 ); colors.push( color.r, color.g, color.b ); if ( pointMap[ id ] === undefined ) { pointMap[ id ] = []; } pointMap[ id ].push( ( vertices.length / 3 ) - 1 ); } geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); super( geometry, material ); this.type = 'CameraHelper'; this.camera = camera; if ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix(); this.matrix = camera.matrixWorld; this.matrixAutoUpdate = false; this.pointMap = pointMap; this.update(); } update() { const geometry = this.geometry; const pointMap = this.pointMap; const w = 1, h = 1; // we need just camera projection matrix inverse // world matrix must be identity _camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse ); // center / target setPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 ); setPoint( 't', pointMap, geometry, _camera, 0, 0, 1 ); // near setPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 ); setPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 ); setPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 ); setPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 ); // far setPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 ); setPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 ); setPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 ); setPoint( 'f4', pointMap, geometry, _camera, w, h, 1 ); // up setPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 ); setPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 ); setPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 ); // cross setPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 ); setPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 ); setPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 ); setPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 ); setPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 ); setPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 ); setPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 ); setPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 ); geometry.getAttribute( 'position' ).needsUpdate = true; } dispose() { this.geometry.dispose(); this.material.dispose(); } } function setPoint( point, pointMap, geometry, camera, x, y, z ) { _vector.set( x, y, z ).unproject( camera ); const points = pointMap[ point ]; if ( points !== undefined ) { const position = geometry.getAttribute( 'position' ); for ( let i = 0, l = points.length; i < l; i ++ ) { position.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z ); } } } const _box = /*@__PURE__*/ new Box3(); class BoxHelper extends LineSegments { constructor( object, color = 0xffff00 ) { const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); const positions = new Float32Array( 8 * 3 ); const geometry = new BufferGeometry(); geometry.setIndex( new BufferAttribute( indices, 1 ) ); geometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) ); super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); this.object = object; this.type = 'BoxHelper'; this.matrixAutoUpdate = false; this.update(); } update( object ) { if ( object !== undefined ) { console.warn( 'THREE.BoxHelper: .update() has no longer arguments.' ); } if ( this.object !== undefined ) { _box.setFromObject( this.object ); } if ( _box.isEmpty() ) return; const min = _box.min; const max = _box.max; /* 5____4 1/___0/| | 6__|_7 2/___3/ 0: max.x, max.y, max.z 1: min.x, max.y, max.z 2: min.x, min.y, max.z 3: max.x, min.y, max.z 4: max.x, max.y, min.z 5: min.x, max.y, min.z 6: min.x, min.y, min.z 7: max.x, min.y, min.z */ const position = this.geometry.attributes.position; const array = position.array; array[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z; array[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z; array[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z; array[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z; array[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z; array[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z; array[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z; array[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z; position.needsUpdate = true; this.geometry.computeBoundingSphere(); } setFromObject( object ) { this.object = object; this.update(); return this; } copy( source ) { LineSegments.prototype.copy.call( this, source ); this.object = source.object; return this; } } class Box3Helper extends LineSegments { constructor( box, color = 0xffff00 ) { const indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] ); const positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ]; const geometry = new BufferGeometry(); geometry.setIndex( new BufferAttribute( indices, 1 ) ); geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); this.box = box; this.type = 'Box3Helper'; this.geometry.computeBoundingSphere(); } updateMatrixWorld( force ) { const box = this.box; if ( box.isEmpty() ) return; box.getCenter( this.position ); box.getSize( this.scale ); this.scale.multiplyScalar( 0.5 ); super.updateMatrixWorld( force ); } } class PlaneHelper extends Line { constructor( plane, size = 1, hex = 0xffff00 ) { const color = hex; const positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ]; const geometry = new BufferGeometry(); geometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) ); geometry.computeBoundingSphere(); super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); this.type = 'PlaneHelper'; this.plane = plane; this.size = size; const positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ]; const geometry2 = new BufferGeometry(); geometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) ); geometry2.computeBoundingSphere(); this.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) ); } updateMatrixWorld( force ) { let scale = - this.plane.constant; if ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter this.scale.set( 0.5 * this.size, 0.5 * this.size, scale ); this.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here this.lookAt( this.plane.normal ); super.updateMatrixWorld( force ); } } const _axis = /*@__PURE__*/ new Vector3(); let _lineGeometry, _coneGeometry; class ArrowHelper extends Object3D { // dir is assumed to be normalized constructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) { super(); this.type = 'ArrowHelper'; if ( _lineGeometry === undefined ) { _lineGeometry = new BufferGeometry(); _lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); _coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 ); _coneGeometry.translate( 0, - 0.5, 0 ); } this.position.copy( origin ); this.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) ); this.line.matrixAutoUpdate = false; this.add( this.line ); this.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) ); this.cone.matrixAutoUpdate = false; this.add( this.cone ); this.setDirection( dir ); this.setLength( length, headLength, headWidth ); } setDirection( dir ) { // dir is assumed to be normalized if ( dir.y > 0.99999 ) { this.quaternion.set( 0, 0, 0, 1 ); } else if ( dir.y < - 0.99999 ) { this.quaternion.set( 1, 0, 0, 0 ); } else { _axis.set( dir.z, 0, - dir.x ).normalize(); const radians = Math.acos( dir.y ); this.quaternion.setFromAxisAngle( _axis, radians ); } } setLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) { this.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458 this.line.updateMatrix(); this.cone.scale.set( headWidth, headLength, headWidth ); this.cone.position.y = length; this.cone.updateMatrix(); } setColor( color ) { this.line.material.color.set( color ); this.cone.material.color.set( color ); } copy( source ) { super.copy( source, false ); this.line.copy( source.line ); this.cone.copy( source.cone ); return this; } } class AxesHelper extends LineSegments { constructor( size = 1 ) { const vertices = [ 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size ]; const colors = [ 1, 0, 0, 1, 0.6, 0, 0, 1, 0, 0.6, 1, 0, 0, 0, 1, 0, 0.6, 1 ]; const geometry = new BufferGeometry(); geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) ); geometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) ); const material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } ); super( geometry, material ); this.type = 'AxesHelper'; } setColors( xAxisColor, yAxisColor, zAxisColor ) { const color = new Color(); const array = this.geometry.attributes.color.array; color.set( xAxisColor ); color.toArray( array, 0 ); color.toArray( array, 3 ); color.set( yAxisColor ); color.toArray( array, 6 ); color.toArray( array, 9 ); color.set( zAxisColor ); color.toArray( array, 12 ); color.toArray( array, 15 ); this.geometry.attributes.color.needsUpdate = true; return this; } dispose() { this.geometry.dispose(); this.material.dispose(); } } class ShapePath { constructor() { this.type = 'ShapePath'; this.color = new Color(); this.subPaths = []; this.currentPath = null; } moveTo( x, y ) { this.currentPath = new Path(); this.subPaths.push( this.currentPath ); this.currentPath.moveTo( x, y ); return this; } lineTo( x, y ) { this.currentPath.lineTo( x, y ); return this; } quadraticCurveTo( aCPx, aCPy, aX, aY ) { this.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY ); return this; } bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { this.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ); return this; } splineThru( pts ) { this.currentPath.splineThru( pts ); return this; } toShapes( isCCW, noHoles ) { function toShapesNoHoles( inSubpaths ) { const shapes = []; for ( let i = 0, l = inSubpaths.length; i < l; i ++ ) { const tmpPath = inSubpaths[ i ]; const tmpShape = new Shape(); tmpShape.curves = tmpPath.curves; shapes.push( tmpShape ); } return shapes; } function isPointInsidePolygon( inPt, inPolygon ) { const polyLen = inPolygon.length; // inPt on polygon contour => immediate success or // toggling of inside/outside at every single! intersection point of an edge // with the horizontal line through inPt, left of inPt // not counting lowerY endpoints of edges and whole edges on that line let inside = false; for ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) { let edgeLowPt = inPolygon[ p ]; let edgeHighPt = inPolygon[ q ]; let edgeDx = edgeHighPt.x - edgeLowPt.x; let edgeDy = edgeHighPt.y - edgeLowPt.y; if ( Math.abs( edgeDy ) > Number.EPSILON ) { // not parallel if ( edgeDy < 0 ) { edgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx; edgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy; } if ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) continue; if ( inPt.y === edgeLowPt.y ) { if ( inPt.x === edgeLowPt.x ) return true; // inPt is on contour ? // continue; // no intersection or edgeLowPt => doesn't count !!! } else { const perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y ); if ( perpEdge === 0 ) return true; // inPt is on contour ? if ( perpEdge < 0 ) continue; inside = ! inside; // true intersection left of inPt } } else { // parallel or collinear if ( inPt.y !== edgeLowPt.y ) continue; // parallel // edge lies on the same horizontal line as inPt if ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) || ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) ) return true; // inPt: Point on contour ! // continue; } } return inside; } const isClockWise = ShapeUtils.isClockWise; const subPaths = this.subPaths; if ( subPaths.length === 0 ) return []; if ( noHoles === true ) return toShapesNoHoles( subPaths ); let solid, tmpPath, tmpShape; const shapes = []; if ( subPaths.length === 1 ) { tmpPath = subPaths[ 0 ]; tmpShape = new Shape(); tmpShape.curves = tmpPath.curves; shapes.push( tmpShape ); return shapes; } let holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() ); holesFirst = isCCW ? ! holesFirst : holesFirst; // console.log("Holes first", holesFirst); const betterShapeHoles = []; const newShapes = []; let newShapeHoles = []; let mainIdx = 0; let tmpPoints; newShapes[ mainIdx ] = undefined; newShapeHoles[ mainIdx ] = []; for ( let i = 0, l = subPaths.length; i < l; i ++ ) { tmpPath = subPaths[ i ]; tmpPoints = tmpPath.getPoints(); solid = isClockWise( tmpPoints ); solid = isCCW ? ! solid : solid; if ( solid ) { if ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) ) mainIdx ++; newShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints }; newShapes[ mainIdx ].s.curves = tmpPath.curves; if ( holesFirst ) mainIdx ++; newShapeHoles[ mainIdx ] = []; //console.log('cw', i); } else { newShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } ); //console.log('ccw', i); } } // only Holes? -> probably all Shapes with wrong orientation if ( ! newShapes[ 0 ] ) return toShapesNoHoles( subPaths ); if ( newShapes.length > 1 ) { let ambiguous = false; let toChange = 0; for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { betterShapeHoles[ sIdx ] = []; } for ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) { const sho = newShapeHoles[ sIdx ]; for ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) { const ho = sho[ hIdx ]; let hole_unassigned = true; for ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) { if ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) { if ( sIdx !== s2Idx ) toChange ++; if ( hole_unassigned ) { hole_unassigned = false; betterShapeHoles[ s2Idx ].push( ho ); } else { ambiguous = true; } } } if ( hole_unassigned ) { betterShapeHoles[ sIdx ].push( ho ); } } } if ( toChange > 0 && ambiguous === false ) { newShapeHoles = betterShapeHoles; } } let tmpHoles; for ( let i = 0, il = newShapes.length; i < il; i ++ ) { tmpShape = newShapes[ i ].s; shapes.push( tmpShape ); tmpHoles = newShapeHoles[ i ]; for ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) { tmpShape.holes.push( tmpHoles[ j ].h ); } } //console.log("shape", shapes); return shapes; } } const _floatView = new Float32Array( 1 ); const _int32View = new Int32Array( _floatView.buffer ); class DataUtils { // Converts float32 to float16 (stored as uint16 value). static toHalfFloat( val ) { if ( val > 65504 ) { console.warn( 'THREE.DataUtils.toHalfFloat(): value exceeds 65504.' ); val = 65504; // maximum representable value in float16 } // Source: http://gamedev.stackexchange.com/questions/17326/conversion-of-a-number-from-single-precision-floating-point-representation-to-a/17410#17410 /* This method is faster than the OpenEXR implementation (very often * used, eg. in Ogre), with the additional benefit of rounding, inspired * by James Tursa?s half-precision code. */ _floatView[ 0 ] = val; const x = _int32View[ 0 ]; let bits = ( x >> 16 ) & 0x8000; /* Get the sign */ let m = ( x >> 12 ) & 0x07ff; /* Keep one extra bit for rounding */ const e = ( x >> 23 ) & 0xff; /* Using int is faster here */ /* If zero, or denormal, or exponent underflows too much for a denormal * half, return signed zero. */ if ( e < 103 ) return bits; /* If NaN, return NaN. If Inf or exponent overflow, return Inf. */ if ( e > 142 ) { bits |= 0x7c00; /* If exponent was 0xff and one mantissa bit was set, it means NaN, * not Inf, so make sure we set one mantissa bit too. */ bits |= ( ( e == 255 ) ? 0 : 1 ) && ( x & 0x007fffff ); return bits; } /* If exponent underflows but not too much, return a denormal */ if ( e < 113 ) { m |= 0x0800; /* Extra rounding may overflow and set mantissa to 0 and exponent * to 1, which is OK. */ bits |= ( m >> ( 114 - e ) ) + ( ( m >> ( 113 - e ) ) & 1 ); return bits; } bits |= ( ( e - 112 ) << 10 ) | ( m >> 1 ); /* Extra rounding. An overflow will set mantissa to 0 and increment * the exponent, which is OK. */ bits += m & 1; return bits; } } const LineStrip = 0; const LinePieces = 1; const NoColors = 0; const FaceColors = 1; const VertexColors = 2; function MeshFaceMaterial( materials ) { console.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' ); return materials; } function MultiMaterial( materials = [] ) { console.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' ); materials.isMultiMaterial = true; materials.materials = materials; materials.clone = function () { return materials.slice(); }; return materials; } function PointCloud( geometry, material ) { console.warn( 'THREE.PointCloud has been renamed to THREE.Points.' ); return new Points( geometry, material ); } function Particle( material ) { console.warn( 'THREE.Particle has been renamed to THREE.Sprite.' ); return new Sprite( material ); } function ParticleSystem( geometry, material ) { console.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' ); return new Points( geometry, material ); } function PointCloudMaterial( parameters ) { console.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' ); return new PointsMaterial( parameters ); } function ParticleBasicMaterial( parameters ) { console.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' ); return new PointsMaterial( parameters ); } function ParticleSystemMaterial( parameters ) { console.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' ); return new PointsMaterial( parameters ); } function Vertex( x, y, z ) { console.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' ); return new Vector3( x, y, z ); } // function DynamicBufferAttribute( array, itemSize ) { console.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' ); return new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage ); } function Int8Attribute( array, itemSize ) { console.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' ); return new Int8BufferAttribute( array, itemSize ); } function Uint8Attribute( array, itemSize ) { console.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' ); return new Uint8BufferAttribute( array, itemSize ); } function Uint8ClampedAttribute( array, itemSize ) { console.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' ); return new Uint8ClampedBufferAttribute( array, itemSize ); } function Int16Attribute( array, itemSize ) { console.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' ); return new Int16BufferAttribute( array, itemSize ); } function Uint16Attribute( array, itemSize ) { console.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' ); return new Uint16BufferAttribute( array, itemSize ); } function Int32Attribute( array, itemSize ) { console.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' ); return new Int32BufferAttribute( array, itemSize ); } function Uint32Attribute( array, itemSize ) { console.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' ); return new Uint32BufferAttribute( array, itemSize ); } function Float32Attribute( array, itemSize ) { console.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' ); return new Float32BufferAttribute( array, itemSize ); } function Float64Attribute( array, itemSize ) { console.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' ); return new Float64BufferAttribute( array, itemSize ); } // Curve.create = function ( construct, getPoint ) { console.log( 'THREE.Curve.create() has been deprecated' ); construct.prototype = Object.create( Curve.prototype ); construct.prototype.constructor = construct; construct.prototype.getPoint = getPoint; return construct; }; // Path.prototype.fromPoints = function ( points ) { console.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' ); return this.setFromPoints( points ); }; // function AxisHelper( size ) { console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' ); return new AxesHelper( size ); } function BoundingBoxHelper( object, color ) { console.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' ); return new BoxHelper( object, color ); } function EdgesHelper( object, hex ) { console.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' ); return new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); } GridHelper.prototype.setColors = function () { console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); }; SkeletonHelper.prototype.update = function () { console.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' ); }; function WireframeHelper( object, hex ) { console.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' ); return new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) ); } // Loader.prototype.extractUrlBase = function ( url ) { console.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' ); return LoaderUtils.extractUrlBase( url ); }; Loader.Handlers = { add: function ( /* regex, loader */ ) { console.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' ); }, get: function ( /* file */ ) { console.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' ); } }; function XHRLoader( manager ) { console.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' ); return new FileLoader( manager ); } function BinaryTextureLoader( manager ) { console.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' ); return new DataTextureLoader( manager ); } // Box2.prototype.center = function ( optionalTarget ) { console.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }; Box2.prototype.empty = function () { console.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' ); return this.isEmpty(); }; Box2.prototype.isIntersectionBox = function ( box ) { console.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' ); return this.intersectsBox( box ); }; Box2.prototype.size = function ( optionalTarget ) { console.warn( 'THREE.Box2: .size() has been renamed to .getSize().' ); return this.getSize( optionalTarget ); }; // Box3.prototype.center = function ( optionalTarget ) { console.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }; Box3.prototype.empty = function () { console.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' ); return this.isEmpty(); }; Box3.prototype.isIntersectionBox = function ( box ) { console.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' ); return this.intersectsBox( box ); }; Box3.prototype.isIntersectionSphere = function ( sphere ) { console.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); return this.intersectsSphere( sphere ); }; Box3.prototype.size = function ( optionalTarget ) { console.warn( 'THREE.Box3: .size() has been renamed to .getSize().' ); return this.getSize( optionalTarget ); }; // Euler.prototype.toVector3 = function () { console.error( 'THREE.Euler: .toVector3() has been removed. Use Vector3.setFromEuler() instead' ); }; // Sphere.prototype.empty = function () { console.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' ); return this.isEmpty(); }; // Frustum.prototype.setFromMatrix = function ( m ) { console.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' ); return this.setFromProjectionMatrix( m ); }; // Line3.prototype.center = function ( optionalTarget ) { console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }; // Matrix3.prototype.flattenToArrayOffset = function ( array, offset ) { console.warn( 'THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ); return this.toArray( array, offset ); }; Matrix3.prototype.multiplyVector3 = function ( vector ) { console.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' ); return vector.applyMatrix3( this ); }; Matrix3.prototype.multiplyVector3Array = function ( /* a */ ) { console.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' ); }; Matrix3.prototype.applyToBufferAttribute = function ( attribute ) { console.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' ); return attribute.applyMatrix3( this ); }; Matrix3.prototype.applyToVector3Array = function ( /* array, offset, length */ ) { console.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' ); }; Matrix3.prototype.getInverse = function ( matrix ) { console.warn( 'THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ); return this.copy( matrix ).invert(); }; // Matrix4.prototype.extractPosition = function ( m ) { console.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' ); return this.copyPosition( m ); }; Matrix4.prototype.flattenToArrayOffset = function ( array, offset ) { console.warn( 'THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.' ); return this.toArray( array, offset ); }; Matrix4.prototype.getPosition = function () { console.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' ); return new Vector3().setFromMatrixColumn( this, 3 ); }; Matrix4.prototype.setRotationFromQuaternion = function ( q ) { console.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' ); return this.makeRotationFromQuaternion( q ); }; Matrix4.prototype.multiplyToArray = function () { console.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' ); }; Matrix4.prototype.multiplyVector3 = function ( vector ) { console.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); return vector.applyMatrix4( this ); }; Matrix4.prototype.multiplyVector4 = function ( vector ) { console.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); return vector.applyMatrix4( this ); }; Matrix4.prototype.multiplyVector3Array = function ( /* a */ ) { console.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' ); }; Matrix4.prototype.rotateAxis = function ( v ) { console.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' ); v.transformDirection( this ); }; Matrix4.prototype.crossVector = function ( vector ) { console.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' ); return vector.applyMatrix4( this ); }; Matrix4.prototype.translate = function () { console.error( 'THREE.Matrix4: .translate() has been removed.' ); }; Matrix4.prototype.rotateX = function () { console.error( 'THREE.Matrix4: .rotateX() has been removed.' ); }; Matrix4.prototype.rotateY = function () { console.error( 'THREE.Matrix4: .rotateY() has been removed.' ); }; Matrix4.prototype.rotateZ = function () { console.error( 'THREE.Matrix4: .rotateZ() has been removed.' ); }; Matrix4.prototype.rotateByAxis = function () { console.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' ); }; Matrix4.prototype.applyToBufferAttribute = function ( attribute ) { console.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' ); return attribute.applyMatrix4( this ); }; Matrix4.prototype.applyToVector3Array = function ( /* array, offset, length */ ) { console.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' ); }; Matrix4.prototype.makeFrustum = function ( left, right, bottom, top, near, far ) { console.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' ); return this.makePerspective( left, right, top, bottom, near, far ); }; Matrix4.prototype.getInverse = function ( matrix ) { console.warn( 'THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.' ); return this.copy( matrix ).invert(); }; // Plane.prototype.isIntersectionLine = function ( line ) { console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); return this.intersectsLine( line ); }; // Quaternion.prototype.multiplyVector3 = function ( vector ) { console.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' ); return vector.applyQuaternion( this ); }; Quaternion.prototype.inverse = function ( ) { console.warn( 'THREE.Quaternion: .inverse() has been renamed to invert().' ); return this.invert(); }; // Ray.prototype.isIntersectionBox = function ( box ) { console.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' ); return this.intersectsBox( box ); }; Ray.prototype.isIntersectionPlane = function ( plane ) { console.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' ); return this.intersectsPlane( plane ); }; Ray.prototype.isIntersectionSphere = function ( sphere ) { console.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' ); return this.intersectsSphere( sphere ); }; // Triangle.prototype.area = function () { console.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' ); return this.getArea(); }; Triangle.prototype.barycoordFromPoint = function ( point, target ) { console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); return this.getBarycoord( point, target ); }; Triangle.prototype.midpoint = function ( target ) { console.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' ); return this.getMidpoint( target ); }; Triangle.prototypenormal = function ( target ) { console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); return this.getNormal( target ); }; Triangle.prototype.plane = function ( target ) { console.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' ); return this.getPlane( target ); }; Triangle.barycoordFromPoint = function ( point, a, b, c, target ) { console.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' ); return Triangle.getBarycoord( point, a, b, c, target ); }; Triangle.normal = function ( a, b, c, target ) { console.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' ); return Triangle.getNormal( a, b, c, target ); }; // Shape.prototype.extractAllPoints = function ( divisions ) { console.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' ); return this.extractPoints( divisions ); }; Shape.prototype.extrude = function ( options ) { console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); return new ExtrudeGeometry( this, options ); }; Shape.prototype.makeGeometry = function ( options ) { console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); return new ShapeGeometry( this, options ); }; // Vector2.prototype.fromAttribute = function ( attribute, index, offset ) { console.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); }; Vector2.prototype.distanceToManhattan = function ( v ) { console.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); return this.manhattanDistanceTo( v ); }; Vector2.prototype.lengthManhattan = function () { console.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' ); return this.manhattanLength(); }; // Vector3.prototype.setEulerFromRotationMatrix = function () { console.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' ); }; Vector3.prototype.setEulerFromQuaternion = function () { console.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' ); }; Vector3.prototype.getPositionFromMatrix = function ( m ) { console.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' ); return this.setFromMatrixPosition( m ); }; Vector3.prototype.getScaleFromMatrix = function ( m ) { console.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' ); return this.setFromMatrixScale( m ); }; Vector3.prototype.getColumnFromMatrix = function ( index, matrix ) { console.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' ); return this.setFromMatrixColumn( matrix, index ); }; Vector3.prototype.applyProjection = function ( m ) { console.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' ); return this.applyMatrix4( m ); }; Vector3.prototype.fromAttribute = function ( attribute, index, offset ) { console.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); }; Vector3.prototype.distanceToManhattan = function ( v ) { console.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' ); return this.manhattanDistanceTo( v ); }; Vector3.prototype.lengthManhattan = function () { console.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' ); return this.manhattanLength(); }; // Vector4$1.prototype.fromAttribute = function ( attribute, index, offset ) { console.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); }; Vector4$1.prototype.lengthManhattan = function () { console.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' ); return this.manhattanLength(); }; // Object3D.prototype.getChildByName = function ( name ) { console.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' ); return this.getObjectByName( name ); }; Object3D.prototype.renderDepth = function () { console.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' ); }; Object3D.prototype.translate = function ( distance, axis ) { console.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' ); return this.translateOnAxis( axis, distance ); }; Object3D.prototype.getWorldRotation = function () { console.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' ); }; Object3D.prototype.applyMatrix = function ( matrix ) { console.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' ); return this.applyMatrix4( matrix ); }; Object.defineProperties( Object3D.prototype, { eulerOrder: { get: function () { console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); return this.rotation.order; }, set: function ( value ) { console.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' ); this.rotation.order = value; } }, useQuaternion: { get: function () { console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); }, set: function () { console.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' ); } } } ); Mesh.prototype.setDrawMode = function () { console.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); }; Object.defineProperties( Mesh.prototype, { drawMode: { get: function () { console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' ); return TrianglesDrawMode; }, set: function () { console.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' ); } } } ); SkinnedMesh.prototype.initBones = function () { console.error( 'THREE.SkinnedMesh: initBones() has been removed.' ); }; // PerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) { console.warn( 'THREE.PerspectiveCamera.setLens is deprecated. ' + 'Use .setFocalLength and .filmGauge for a photographic setup.' ); if ( filmGauge !== undefined ) this.filmGauge = filmGauge; this.setFocalLength( focalLength ); }; // Object.defineProperties( Light.prototype, { onlyShadow: { set: function () { console.warn( 'THREE.Light: .onlyShadow has been removed.' ); } }, shadowCameraFov: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' ); this.shadow.camera.fov = value; } }, shadowCameraLeft: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' ); this.shadow.camera.left = value; } }, shadowCameraRight: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' ); this.shadow.camera.right = value; } }, shadowCameraTop: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' ); this.shadow.camera.top = value; } }, shadowCameraBottom: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' ); this.shadow.camera.bottom = value; } }, shadowCameraNear: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' ); this.shadow.camera.near = value; } }, shadowCameraFar: { set: function ( value ) { console.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' ); this.shadow.camera.far = value; } }, shadowCameraVisible: { set: function () { console.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' ); } }, shadowBias: { set: function ( value ) { console.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' ); this.shadow.bias = value; } }, shadowDarkness: { set: function () { console.warn( 'THREE.Light: .shadowDarkness has been removed.' ); } }, shadowMapWidth: { set: function ( value ) { console.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' ); this.shadow.mapSize.width = value; } }, shadowMapHeight: { set: function ( value ) { console.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' ); this.shadow.mapSize.height = value; } } } ); // Object.defineProperties( BufferAttribute.prototype, { length: { get: function () { console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); return this.array.length; } }, dynamic: { get: function () { console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ); return this.usage === DynamicDrawUsage; }, set: function ( /* value */ ) { console.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' ); this.setUsage( DynamicDrawUsage ); } } } ); BufferAttribute.prototype.setDynamic = function ( value ) { console.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' ); this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage ); return this; }; BufferAttribute.prototype.copyIndicesArray = function ( /* indices */ ) { console.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' ); }, BufferAttribute.prototype.setArray = function ( /* array */ ) { console.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); }; // BufferGeometry.prototype.addIndex = function ( index ) { console.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' ); this.setIndex( index ); }; BufferGeometry.prototype.addAttribute = function ( name, attribute ) { console.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' ); if ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) { console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); return this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) ); } if ( name === 'index' ) { console.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' ); this.setIndex( attribute ); return this; } return this.setAttribute( name, attribute ); }; BufferGeometry.prototype.addDrawCall = function ( start, count, indexOffset ) { if ( indexOffset !== undefined ) { console.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' ); } console.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' ); this.addGroup( start, count ); }; BufferGeometry.prototype.clearDrawCalls = function () { console.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' ); this.clearGroups(); }; BufferGeometry.prototype.computeOffsets = function () { console.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' ); }; BufferGeometry.prototype.removeAttribute = function ( name ) { console.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' ); return this.deleteAttribute( name ); }; BufferGeometry.prototype.applyMatrix = function ( matrix ) { console.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' ); return this.applyMatrix4( matrix ); }; Object.defineProperties( BufferGeometry.prototype, { drawcalls: { get: function () { console.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' ); return this.groups; } }, offsets: { get: function () { console.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' ); return this.groups; } } } ); InterleavedBuffer.prototype.setDynamic = function ( value ) { console.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' ); this.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage ); return this; }; InterleavedBuffer.prototype.setArray = function ( /* array */ ) { console.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' ); }; // ExtrudeGeometry.prototype.getArrays = function () { console.error( 'THREE.ExtrudeGeometry: .getArrays() has been removed.' ); }; ExtrudeGeometry.prototype.addShapeList = function () { console.error( 'THREE.ExtrudeGeometry: .addShapeList() has been removed.' ); }; ExtrudeGeometry.prototype.addShape = function () { console.error( 'THREE.ExtrudeGeometry: .addShape() has been removed.' ); }; // Scene.prototype.dispose = function () { console.error( 'THREE.Scene: .dispose() has been removed.' ); }; // Uniform.prototype.onUpdate = function () { console.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' ); return this; }; // Object.defineProperties( Material.prototype, { wrapAround: { get: function () { console.warn( 'THREE.Material: .wrapAround has been removed.' ); }, set: function () { console.warn( 'THREE.Material: .wrapAround has been removed.' ); } }, overdraw: { get: function () { console.warn( 'THREE.Material: .overdraw has been removed.' ); }, set: function () { console.warn( 'THREE.Material: .overdraw has been removed.' ); } }, wrapRGB: { get: function () { console.warn( 'THREE.Material: .wrapRGB has been removed.' ); return new Color(); } }, shading: { get: function () { console.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); }, set: function ( value ) { console.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' ); this.flatShading = ( value === FlatShading ); } }, stencilMask: { get: function () { console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ); return this.stencilFuncMask; }, set: function ( value ) { console.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' ); this.stencilFuncMask = value; } }, vertexTangents: { get: function () { console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' ); }, set: function () { console.warn( 'THREE.' + this.type + ': .vertexTangents has been removed.' ); } }, } ); Object.defineProperties( ShaderMaterial.prototype, { derivatives: { get: function () { console.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); return this.extensions.derivatives; }, set: function ( value ) { console.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' ); this.extensions.derivatives = value; } } } ); // WebGLRenderer.prototype.clearTarget = function ( renderTarget, color, depth, stencil ) { console.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' ); this.setRenderTarget( renderTarget ); this.clear( color, depth, stencil ); }; WebGLRenderer.prototype.animate = function ( callback ) { console.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' ); this.setAnimationLoop( callback ); }; WebGLRenderer.prototype.getCurrentRenderTarget = function () { console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); return this.getRenderTarget(); }; WebGLRenderer.prototype.getMaxAnisotropy = function () { console.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' ); return this.capabilities.getMaxAnisotropy(); }; WebGLRenderer.prototype.getPrecision = function () { console.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' ); return this.capabilities.precision; }; WebGLRenderer.prototype.resetGLState = function () { console.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' ); return this.state.reset(); }; WebGLRenderer.prototype.supportsFloatTextures = function () { console.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).' ); return this.extensions.get( 'OES_texture_float' ); }; WebGLRenderer.prototype.supportsHalfFloatTextures = function () { console.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).' ); return this.extensions.get( 'OES_texture_half_float' ); }; WebGLRenderer.prototype.supportsStandardDerivatives = function () { console.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).' ); return this.extensions.get( 'OES_standard_derivatives' ); }; WebGLRenderer.prototype.supportsCompressedTextureS3TC = function () { console.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).' ); return this.extensions.get( 'WEBGL_compressed_texture_s3tc' ); }; WebGLRenderer.prototype.supportsCompressedTexturePVRTC = function () { console.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).' ); return this.extensions.get( 'WEBGL_compressed_texture_pvrtc' ); }; WebGLRenderer.prototype.supportsBlendMinMax = function () { console.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).' ); return this.extensions.get( 'EXT_blend_minmax' ); }; WebGLRenderer.prototype.supportsVertexTextures = function () { console.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' ); return this.capabilities.vertexTextures; }; WebGLRenderer.prototype.supportsInstancedArrays = function () { console.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).' ); return this.extensions.get( 'ANGLE_instanced_arrays' ); }; WebGLRenderer.prototype.enableScissorTest = function ( boolean ) { console.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' ); this.setScissorTest( boolean ); }; WebGLRenderer.prototype.initMaterial = function () { console.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' ); }; WebGLRenderer.prototype.addPrePlugin = function () { console.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' ); }; WebGLRenderer.prototype.addPostPlugin = function () { console.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' ); }; WebGLRenderer.prototype.updateShadowMap = function () { console.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' ); }; WebGLRenderer.prototype.setFaceCulling = function () { console.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' ); }; WebGLRenderer.prototype.allocTextureUnit = function () { console.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' ); }; WebGLRenderer.prototype.setTexture = function () { console.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' ); }; WebGLRenderer.prototype.setTexture2D = function () { console.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' ); }; WebGLRenderer.prototype.setTextureCube = function () { console.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' ); }; WebGLRenderer.prototype.getActiveMipMapLevel = function () { console.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' ); return this.getActiveMipmapLevel(); }; Object.defineProperties( WebGLRenderer.prototype, { shadowMapEnabled: { get: function () { return this.shadowMap.enabled; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' ); this.shadowMap.enabled = value; } }, shadowMapType: { get: function () { return this.shadowMap.type; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' ); this.shadowMap.type = value; } }, shadowMapCullFace: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); return undefined; }, set: function ( /* value */ ) { console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' ); } }, context: { get: function () { console.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' ); return this.getContext(); } }, vr: { get: function () { console.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' ); return this.xr; } }, gammaInput: { get: function () { console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); return false; }, set: function () { console.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' ); } }, gammaOutput: { get: function () { console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ); return false; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' ); this.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding; } }, toneMappingWhitePoint: { get: function () { console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); return 1.0; }, set: function () { console.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' ); } }, gammaFactor: { get: function () { console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' ); return 2; }, set: function () { console.warn( 'THREE.WebGLRenderer: .gammaFactor has been removed.' ); } } } ); Object.defineProperties( WebGLShadowMap.prototype, { cullFace: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); return undefined; }, set: function ( /* cullFace */ ) { console.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' ); } }, renderReverseSided: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); return undefined; }, set: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' ); } }, renderSingleSided: { get: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); return undefined; }, set: function () { console.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' ); } } } ); function WebGLRenderTargetCube( width, height, options ) { console.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' ); return new WebGLCubeRenderTarget( width, options ); } // Object.defineProperties( WebGLRenderTarget.prototype, { wrapS: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); return this.texture.wrapS; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' ); this.texture.wrapS = value; } }, wrapT: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); return this.texture.wrapT; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' ); this.texture.wrapT = value; } }, magFilter: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); return this.texture.magFilter; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' ); this.texture.magFilter = value; } }, minFilter: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); return this.texture.minFilter; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' ); this.texture.minFilter = value; } }, anisotropy: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); return this.texture.anisotropy; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' ); this.texture.anisotropy = value; } }, offset: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); return this.texture.offset; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' ); this.texture.offset = value; } }, repeat: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); return this.texture.repeat; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' ); this.texture.repeat = value; } }, format: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); return this.texture.format; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' ); this.texture.format = value; } }, type: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); return this.texture.type; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' ); this.texture.type = value; } }, generateMipmaps: { get: function () { console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); return this.texture.generateMipmaps; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' ); this.texture.generateMipmaps = value; } } } ); // Audio.prototype.load = function ( file ) { console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); const scope = this; const audioLoader = new AudioLoader(); audioLoader.load( file, function ( buffer ) { scope.setBuffer( buffer ); } ); return this; }; AudioAnalyser.prototype.getData = function () { console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); return this.getFrequencyData(); }; // CubeCamera.prototype.updateCubeMap = function ( renderer, scene ) { console.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' ); return this.update( renderer, scene ); }; CubeCamera.prototype.clear = function ( renderer, color, depth, stencil ) { console.warn( 'THREE.CubeCamera: .clear() is now .renderTarget.clear().' ); return this.renderTarget.clear( renderer, color, depth, stencil ); }; ImageUtils.crossOrigin = undefined; ImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) { console.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' ); const loader = new TextureLoader(); loader.setCrossOrigin( this.crossOrigin ); const texture = loader.load( url, onLoad, undefined, onError ); if ( mapping ) texture.mapping = mapping; return texture; }; ImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) { console.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' ); const loader = new CubeTextureLoader(); loader.setCrossOrigin( this.crossOrigin ); const texture = loader.load( urls, onLoad, undefined, onError ); if ( mapping ) texture.mapping = mapping; return texture; }; ImageUtils.loadCompressedTexture = function () { console.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' ); }; ImageUtils.loadCompressedTextureCube = function () { console.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' ); }; // function CanvasRenderer() { console.error( 'THREE.CanvasRenderer has been removed' ); } // function JSONLoader() { console.error( 'THREE.JSONLoader has been removed.' ); } // const SceneUtils = { createMultiMaterialObject: function ( /* geometry, materials */ ) { console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); }, detach: function ( /* child, parent, scene */ ) { console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); }, attach: function ( /* child, scene, parent */ ) { console.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' ); } }; // function LensFlare() { console.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' ); } // function ParametricGeometry() { console.error( 'THREE.ParametricGeometry has been moved to /examples/jsm/geometries/ParametricGeometry.js' ); return new BufferGeometry(); } function TextGeometry() { console.error( 'THREE.TextGeometry has been moved to /examples/jsm/geometries/TextGeometry.js' ); return new BufferGeometry(); } function FontLoader() { console.error( 'THREE.FontLoader has been moved to /examples/jsm/loaders/FontLoader.js' ); } function Font() { console.error( 'THREE.Font has been moved to /examples/jsm/loaders/FontLoader.js' ); } function ImmediateRenderObject() { console.error( 'THREE.ImmediateRenderObject has been removed.' ); } function WebGLMultisampleRenderTarget( width, height, options ) { console.error( 'THREE.WebGLMultisampleRenderTarget has been removed. Use a normal render target and set the "samples" property to greater 0 to enable multisampling.' ); const renderTarget = new WebGLRenderTarget( width, height, options ); renderTarget.samples = 4; return renderTarget; } function DataTexture2DArray( data, width, height, depth ) { console.warn( 'THREE.DataTexture2DArray has been renamed to DataArrayTexture.' ); return new DataArrayTexture( data, width, height, depth ); } function DataTexture3D( data, width, height, depth ) { console.warn( 'THREE.DataTexture3D has been renamed to Data3DTexture.' ); return new Data3DTexture( data, width, height, depth ); } if ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) { __THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: { revision: REVISION, } } ) ); } if ( typeof window !== 'undefined' ) { if ( window.__THREE__ ) { console.warn( 'WARNING: Multiple instances of Three.js being imported.' ); } else { window.__THREE__ = REVISION; } } /** * Three targets are provided for both GLSL and Sculpt/JS api. * * 1: source -> Threejs shader source components (easy customization) * 2: source -> Threejs material * 3: source -> Threejs mesh (easy to use) * * TODO: make these materials 'plug in' to threejs' lighting model, like unity's surface shaders */ function glslToThreeJSShaderSource(source) { return { uniforms: baseUniforms(), frag: threeHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + fragFooter, vert: threeJSVertexSource }; } function glslToThreeJSMaterial(source, payload) { var src = glslToThreeJSShaderSource(source); return makeMaterial(src.uniforms, src.vert, src.frag, payload); } function glslToThreeJSMesh(source, payload) { return makeBasicMesh(glslToThreeJSMaterial(source, payload)); } function sculptToThreeJSShaderSource(source) { var src = sculptToGLSL(source); if (src.error) { console.log(src.error); } var frg = threeHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + fragFooter; return { uniforms: src.uniforms, frag: frg, vert: threeJSVertexSource, error: src.error, geoGLSL: src.geoGLSL, colorGLSL: src.colorGLSL }; } function sculptToThreeJSMaterial(source, payload) { var src = sculptToThreeJSShaderSource(source); var material = makeMaterial(src.uniforms, src.vert, src.frag, payload); material.uniformDescriptions = src.uniforms; return material; } function sculptToThreeJSMesh(source, payload) { source = convertFunctionToString(source); return makeBasicMesh(sculptToThreeJSMaterial(source, payload)); } function createSculptureWithGeometry(geometry, source) { var uniformCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () { return {}; }; var params = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; geometry.computeBoundingSphere(); var radius = 'radius' in params ? params.radius : geometry.boundingSphere.radius; params.radius = radius; params.geometry = geometry; return createSculpture(source, uniformCallback, params); } // uniformCallback function createSculpture(source) { var uniformCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { return {}; }; var params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; source = convertFunctionToString(source); var radius = 'radius' in params ? params.radius : 2; var geometry; if ('geometry' in params) { geometry = params.geometry; } else { var segments = 'segments' in params ? params.segments : 8; geometry = new SphereGeometry(radius, segments, segments); } var material = sculptToThreeJSMaterial(source); material.uniforms['opacity'].value = 1.0; material.uniforms['mouse'].value = new Vector3(); material.uniforms['_scale'].value = radius; var mesh = new Mesh(geometry, material); mesh.onBeforeRender = function (renderer, scene, camera, geometry, material, group) { var uniformsToUpdate = uniformCallback(); if (!(_typeof(uniformsToUpdate) === "object")) { throw "createSculpture takes, (source, uniformCallback, params) the uniformCallback must be a function that returns a dictionary of uniforms to update"; } for (var _i = 0, _Object$entries = Object.entries(uniformsToUpdate); _i < _Object$entries.length; _i++) { var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), uniform = _Object$entries$_i[0], value = _Object$entries$_i[1]; material.uniforms[uniform].value = value; } // material.uniforms['sculptureCenter'].value = geometry.position; }; return mesh; } function uniformDescriptionToThreeJSFormat(unifs, payload) { var finalUniforms = {}; if (payload && payload !== undefined && payload.msdfTexture !== undefined) { finalUniforms["msdf"] = { value: payload.msdfTexture || new Texture() }; } unifs.forEach(function (uniform) { if (uniform.type === 'float') { finalUniforms[uniform.name] = { value: uniform.value }; } else if (uniform.type === 'vec2') { finalUniforms[uniform.name] = { value: new Vector2(uniform.value.x, uniform.value.y) }; } else if (uniform.type === 'vec3') { finalUniforms[uniform.name] = { value: new Vector3(uniform.value.x, uniform.value.y, uniform.value.z) }; } else if (uniform.type === 'vec4') { finalUniforms[uniform.name] = { value: new Vector4(uniform.value.x, uniform.value.y, uniform.value.z, uniform.value.w) }; } }); return finalUniforms; } // could use a scale parameter function makeMaterial(unifs, vert, frag, payload) { var material = new ShaderMaterial({ uniforms: uniformDescriptionToThreeJSFormat(unifs, payload), vertexShader: vert, fragmentShader: frag, transparent: true, side: BackSide }); material.extensions.fragDepth = false; return material; } // There should be more options supported like size and shape function makeBasicMesh(material) { return new Mesh(new BoxGeometry(2, 2, 2), material); } function uniformToCpp(uniforms) { var res = ''; for (var i = 0; i < uniforms.length; i++) { var unif = uniforms[i]; res += unif.type + ' ' + unif.name + ' = '; if (typeof unif.value === 'number') { // float res += unif.value + 0.0000001 + 'f'; } else { // vec res += 'vec' + unif.value.length + '('; for (var j = 0; j < unif.value.length; j++) { res += unif.value[j] + 0.0000001 + 'f'; if (j + 1 < unif.value.length) { res += ', '; } } res += ')'; } res += ';\n'; } return res; } var cppFooter = "\n\n"; var cppHeader = uniformToCpp(baseUniforms()); function glslToGLM(source) { // converts all numbers to floats var result = source.replace(/([^a-zA-Z][0-9]+([.][^a-zA-Z][0-9]*)|[.][0-9]+)()/g, '$1f'); // adds parentheses after swizzling for glm to pick up result = result.replace(/([a-zA-Z0-9][.][w-z]{2,})()/g, '$1()'); return result; } function glslToOfflineRenderer(source) {} function sculptToOfflineRenderer(source) { var src = sculptToGLSL(source); //console.log(filteredStarter); return cppHeader + glslToGLM('const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + 'f;\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + src.colorGLSL) + cppFooter; } function glslToMinimalRenderer(canvas, source, updateUniforms) { var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(baseUniforms()) + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + sculptureStarterCode + source + fragFooter; return fragToMinimalRenderer(canvas, fullFrag, updateUniforms); } /** * for fast and efficient use on the web * input - sculpt code * output - a fully self-contained lightweight html file which renders the sculpture **/ function sculptToMinimalRenderer(canvas, source, updateUniforms) { if (typeof source === "function") { source = source.toString(); source = source.slice(source.indexOf("{") + 1, source.lastIndexOf("}")); } else if (!(typeof source === "string")) { throw "sculptToMinimalRenderer requires the source code to be a function, or a string"; } var generatedGLSL = sculptToGLSL(source); var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(generatedGLSL.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + generatedGLSL.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + generatedGLSL.maxIterations + ';\n' + sculptureStarterCode + generatedGLSL.geoGLSL + '\n' + generatedGLSL.colorGLSL + '\n' + fragFooter; return fragToMinimalRenderer(canvas, fullFrag, updateUniforms); } function fragToMinimalRenderer(canvas, fullFrag, updateUniforms) { // if no update function is provided assume no-op if (updateUniforms === undefined) { updateUniforms = function updateUniforms() { return {}; }; } function resizeCanvas() { var devicePixelRatio = window.devicePixelRatio || 1; // change this so canvas doesn't have to fill entire window var width = window.innerWidth * devicePixelRatio; var height = window.innerHeight * devicePixelRatio; if (canvas.width != width || canvas.height != height) { canvas.width = width; canvas.height = height; } } resizeCanvas(); window.addEventListener('resize', resizeCanvas); var gl = canvas.getContext('webgl2'); var vertices = [-1.0, 1.0, 0.0, -1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1.0, 0.0]; var indices = [3, 2, 1, 3, 1, 0]; var vertex_buffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); gl.bindBuffer(gl.ARRAY_BUFFER, null); var Index_Buffer = gl.createBuffer(); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer); gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null); var vertShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertShader, minimalVertexSource); gl.compileShader(vertShader); var fragShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragShader, fullFrag); gl.compileShader(fragShader); var logShaderComp = function logShaderComp(shader) { var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); console.log('Shader compiled successfully: ' + compiled); var compilationLog = gl.getShaderInfoLog(shader); if (!compiled) console.error('Shader compiler log: ' + compilationLog); }; logShaderComp(vertShader); logShaderComp(fragShader); var shaderProgram = gl.createProgram(); gl.attachShader(shaderProgram, vertShader); gl.attachShader(shaderProgram, fragShader); gl.linkProgram(shaderProgram); // Check if it linked. var success = gl.getProgramParameter(shaderProgram, gl.LINK_STATUS); if (!success) { // something went wrong with the link; get the error console.error("program failed to link:" + gl.getProgramInfoLog(shaderProgram)); } gl.useProgram(shaderProgram); gl.bindBuffer(gl.ARRAY_BUFFER, vertex_buffer); gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, Index_Buffer); var coord = gl.getAttribLocation(shaderProgram, "coordinates"); gl.vertexAttribPointer(coord, 3, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(coord); gl.clearColor(1.0, 1.0, 1.0, 0.9); gl.enable(gl.DEPTH_TEST); var oTime = Date.now(); var loc = gl.getUniformLocation(shaderProgram, "time"); var _scale = gl.getUniformLocation(shaderProgram, "_scale"); var resolution = gl.getUniformLocation(shaderProgram, "resolution"); var opac = gl.getUniformLocation(shaderProgram, "opacity"); var mouseloc = gl.getUniformLocation(shaderProgram, "mouse"); gl.uniform1f(opac, 1.0); gl.uniform1f(_scale, 1.0); var userUniformUpdateFuncs = assignUniforms(updateUniforms); canvas.addEventListener("pointermove", function (e) { var devicePixelRatio = window.devicePixelRatio || 1; var canvasX = (e.pageX - canvas.offsetLeft) * devicePixelRatio; var canvasY = (e.pageY - canvas.offsetTop) * devicePixelRatio; gl.uniform3f(mouseloc, 2.0 * canvasX / canvas.width - 1.0, 2.0 * (1.0 - canvasY / canvas.height) - 1.0, -0.5); }, false); function updateDraw() { if (typeof updateUniforms === 'function') { callUniformFuncs(userUniformUpdateFuncs, updateUniforms()); } gl.uniform1f(loc, (Date.now() - oTime) * 0.001); var devicePixelRatio = window.devicePixelRatio || 1; var wwidth = window.innerWidth * devicePixelRatio; var wheight = window.innerHeight * devicePixelRatio; gl.uniform2fv(resolution, [wwidth, wheight]); gl.clear(gl.COLOR_BUFFER_BIT); gl.viewport(0, 0, canvas.width, canvas.height); gl.drawElements(gl.TRIANGLES, indices.length, gl.UNSIGNED_SHORT, 0); window.requestAnimationFrame(updateDraw); } updateDraw(); // loops through a dictionary and calls the function sotred in the value function callUniformFuncs(uniformFuncs, updatedUniforms) { if (_typeof(updatedUniforms) !== 'object') { console.error('updateUniforms must return a dictionary of uniform names and values. Instead got: ', updateUniforms); return; } Object.entries(uniformFuncs).forEach(function (keys) { var _keys = _slicedToArray(keys, 2), key = _keys[0], uniformUpdateFunc = _keys[1]; if (key in updatedUniforms) { uniformUpdateFunc(updatedUniforms[key]); } }); } function assignUniforms(updateUniforms) { if (typeof updateUniforms !== 'function') { console.error('updateUniforms must be a function that returns a dictionary of uniform names and values'); return {}; } var userUniformUpdateFuncs = {}; var uniformsDict = updateUniforms(); if (uniformsDict !== undefined && _typeof(uniformsDict) === 'object') { Object.entries(uniformsDict).forEach(function (keys) { var _keys2 = _slicedToArray(keys, 2), key = _keys2[0], val = _keys2[1]; var unifLocation = gl.getUniformLocation(shaderProgram, key); if (typeof val === 'number') { userUniformUpdateFuncs[key] = function (unif) { return gl.uniform1f(unifLocation, unif); }; } else if (Array.isArray(val)) { if (val.length === 1) { userUniformUpdateFuncs[key] = function (unif) { return gl.uniform1f(unifLocation, unif[0]); }; } else if (val.length === 2) { userUniformUpdateFuncs[key] = function (unif) { return gl.uniform2iv(unifLocation, unif); }; } else if (val.length === 3) { userUniformUpdateFuncs[key] = function (unif) { return gl.uniform3iv(unifLocation, unif); }; } else if (val.length === 4) { userUniformUpdateFuncs[key] = function (unif) { return gl.uniform4iv(unifLocation, unif); }; } else { console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4'); } } else { console.error('Uniforms must be either a float or an array with length 1, 2, 3 or 4'); } }); } return userUniformUpdateFuncs; } } /** * for fast tesing * input - sculpt code * output - self-contained lightweight html which renders the sculpture **/ function sculptToMinimalHTMLRenderer(spCode, libPath) { return makeHTML(spCode, 'sculptToMinimalRenderer', libPath); } function glslToMinimalHTMLRenderer(spCode, libPath) { return makeHTML(spCode, 'glslToMinimalRenderer', libPath); } function makeHTML(spCode, minRenderFunc, libPath) { return "\n\n\n Shader Park\n \n \n \n \n \n \n \n\n"); } /** * export for meshing with https://github.com/tdhooper/glsl-marching-cubes * input - sculpt code * output - glsl containing "mapDistance" **/ function sculptToRawSDF4Meshing(source) { var minimalHeader = "\nprecision highp float;\nuniform float w_width;\nuniform float w_height;\nuniform mat4 projectionMatrix;\n#define cameraPosition vec3(0.0,0.0,-1.0)\n#define vUv vec2(0.0)\n#define worldPos vec4(vec2((gl_FragCoord.x/w_width-0.5)*(w_width/w_height),gl_FragCoord.y/w_height-0.5)*1.75,0.0,0.0)\n#define STEP_SIZE_CONSTANT 0.9\n#define MAX_ITERATIONS 300\n#define stepSize 0.9\n#define mouse vec3(0.0)\n#define time 0.0\n"; var generatedGLSL = sculptToGLSL(source); var fullFrag = minimalHeader + usePBRHeader + useHemisphereLight //+ uniformsToGLSL(generatedGLSL.uniforms) + sculptureStarterCode + generatedGLSL.geoGLSL; return fullFrag.replace(/surfaceDistance/g, 'mapDistance'); } /** * TD target for GLSL and Sculpt/JS api. * * TODO: make these materials 'plug in' to Touch Designer's ' PBR lighting model. */ var TDHeader = "\nuniform float uShadowStrength;\nuniform vec3 uShadowColor;\nuniform vec4 uBaseColor;\nuniform float uMetallic;\nuniform float uRoughness;\nuniform float uSpecularLevel;\nuniform float uAmbientOcclusion;\nuniform vec3 cameraPosition;\nuniform sampler2D sBaseColorMap;\nuniform float useTDLighting;\n\n\nin Vertex\n{\n\tvec4 color;\n\tvec3 worldSpacePos;\n\tvec3 worldSpaceNorm;\n\tflat int cameraIndex;\n\tvec2 texCoord0;\n\tvec3 sculptureCenter;\n} iVert;\n\n#define sculptureCenter iVert.sculptureCenter;\n#define worldPos iVert.worldSpacePos\nlayout(location = 0) out vec4 oFragColor[TD_NUM_COLOR_BUFFERS];\nout float depthTexture;\n"; var TDFooter = "\nvoid main()\n{\n\t// This allows things such as order independent transparency\n\t// and Dual-Paraboloid rendering to work properly\n\tTDCheckDiscard();\n\n\t// Raymarching\n\tvec3 rayOrigin = worldPos.xyz-sculptureCenter;\n\tvec3 rayDirection = getRayDirection();\n\trayOrigin -= rayDirection*2.0;\n\tfloat t = intersect(rayOrigin, rayDirection, stepSize);\n depthTexture = t;\n\n\tvec4 outcol = vec4(0.0, 0.0, 0.0, 0.0);\n\tvec3 diffuseSum = vec3(0.0, 0.0, 0.0);\n\tvec3 specularSum = vec3(0.0, 0.0, 0.0);\n\n\tvec3 worldSpaceNorm = normalize(iVert.worldSpaceNorm.xyz);\n\t// vec3 normal = normalize(worldSpaceNorm.xyz);\n\tif(t < 2.5) {\n\t\tvec3 p = (rayOrigin + rayDirection*t);\n\t\tvec3 normal = calcNormal(p);\n\t\tvec3 raymarchedColor = shade(p, normal);\n\t\n\t\tvec3 baseColor = uBaseColor.rgb;\n\n\t\t// 0.08 is the value for dielectric specular that\n\t\t// Substance Designer uses for it's top-end.\n\t\tfloat specularLevel = 0.08 * uSpecularLevel;\n\t\tfloat metallic = uMetallic;\n\n\t\tfloat roughness = uRoughness;\n\n\t\tfloat ambientOcclusion = uAmbientOcclusion;\n\n\t\tvec3 finalBaseColor = baseColor.rgb * iVert.color.rgb;\n\n\t\tvec2 texCoord0 = iVert.texCoord0.st;\n\t\tvec4 baseColorMap = texture(sBaseColorMap, texCoord0.st);\n\t\tfinalBaseColor *= baseColorMap.rgb;\n\n\n\t\t// A roughness of exactly 0 is not allowed\n\t\troughness = max(roughness, 0.0001);\n\n\t\tvec3 pbrDiffuseColor = finalBaseColor * (1.0 - metallic);\n\t\tvec3 pbrSpecularColor = mix(vec3(specularLevel), finalBaseColor, metallic);\n\n\t\tvec3 viewVec = normalize(uTDMats[iVert.cameraIndex].camInverse[3].xyz - iVert.worldSpacePos.xyz );\n\n\n\t\t// Your shader will be recompiled based on the number\n\t\t// of lights in your scene, so this continues to work\n\t\t// even if you change your lighting setup after the shader\n\t\t// has been exported from the Phong MAT\n\t\tfor (int i = 0; i < TD_NUM_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDLightingPBR(i,\n\t\t\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\t\t\tiVert.worldSpacePos.xyz,\n\t\t\t\t\t\t\t\tnormal,\n\t\t\t\t\t\t\t\tuShadowStrength, uShadowColor,\n\t\t\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\t\t\troughness);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\n\t\t// Environment lights\n\t\tfor (int i = 0; i < TD_NUM_ENV_LIGHTS; i++)\n\t\t{\n\t\t\tTDPBRResult res;\n\t\t\tres = TDEnvLightingPBR(i,\n\t\t\t\t\t\tpbrDiffuseColor,\n\t\t\t\t\t\tpbrSpecularColor,\n\t\t\t\t\t\tnormal,\n\t\t\t\t\t\tviewVec,\n\t\t\t\t\t\troughness,\n\t\t\t\t\t\tambientOcclusion);\n\t\t\tdiffuseSum += res.diffuse;\n\t\t\tspecularSum += res.specular;\n\t\t}\n\t\t// Final Diffuse Contribution\n\t\tvec3 finalDiffuse = diffuseSum;\n\t\toutcol.rgb += finalDiffuse;\n\n\t\t// Final Specular Contribution\n\t\tvec3 finalSpecular = vec3(0.0);\n\t\tfinalSpecular += specularSum;\n\n\t\toutcol.rgb += finalSpecular;\n\n\n\t\t// Apply fog, this does nothing if fog is disabled\n\t\toutcol = TDFog(outcol, iVert.worldSpacePos.xyz, iVert.cameraIndex);\n\n\t\t// Alpha Calculation\n\t\tfloat alpha = uBaseColor.a * iVert.color.a ;\n\n\t\t// Dithering, does nothing if dithering is disabled\n\t\toutcol = TDDither(outcol);\n\n\t\toutcol.rgb *= alpha;\n\n\t\t// Modern GL removed the implicit alpha test, so we need to apply\n\t\t// it manually here. This function does nothing if alpha test is disabled.\n\t\tTDAlphaTest(alpha);\n\n\t\toutcol.a = alpha;\n\t\toutcol = mix(vec4(raymarchedColor, 1.0), outcol, useTDLighting);\n\t\toFragColor[0] = TDOutputSwizzle(outcol);\n\n\n\t\t// TD_NUM_COLOR_BUFFERS will be set to the number of color buffers\n\t\t// active in the render. By default we want to output zero to every\n\t\t// buffer except the first one.\n\t\tfor (int i = 1; i < TD_NUM_COLOR_BUFFERS; i++)\n\t\t{\n\t\t\toFragColor[i] = vec4(0.0);\n\t\t}\n\t} else {\n\t\tdiscard;\n\t}\n}\n"; function glslToTouchDesignerShaderSource(source) { return { uniforms: baseUniforms(), frag: TDHeader + 'const float STEP_SIZE_CONSTANT = 0.9;\n' + 'const int MAX_ITERATIONS = 300;\n' + uniformsToGLSL(baseUniforms()) + sculptureStarterCode + source + TDFooter, vert: minimalVertexSource }; } function sculptToTouchDesignerShaderSource(source) { var src = sculptToGLSL(source); if (src.error) { console.log(src.error); } var frg = TDHeader + usePBRHeader + useHemisphereLight + uniformsToGLSL(src.uniforms) + 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL + '\n' + src.colorGLSL + '\n' + TDFooter; var sdf = 'const float STEP_SIZE_CONSTANT = ' + src.stepSizeConstant + ';\n' + 'const int MAX_ITERATIONS = ' + src.maxIterations + ';\n' + sculptureStarterCode + src.geoGLSL; return { uniforms: src.uniforms, frag: frg, vert: minimalVertexSource, error: src.error, geoGLSL: src.geoGLSL, colorGLSL: src.colorGLSL, sdf: sdf, glslUniforms: uniformsToGLSL(src.uniforms) }; } console.log('using shader-park-core version: 0.1.26'); /// Generate code for various targets export { baseUniforms, bindStaticData, createSculpture, createSculptureWithGeometry, defaultFragSourceGLSL, fragFooter, glslToMinimalHTMLRenderer, glslToMinimalRenderer, glslToOfflineRenderer, glslToThreeJSMaterial, glslToThreeJSMesh, glslToThreeJSShaderSource, glslToTouchDesignerShaderSource, minimalHeader, minimalVertexSource, sculptToGLSL, sculptToMinimalHTMLRenderer, sculptToMinimalRenderer, sculptToOfflineRenderer, sculptToRawSDF4Meshing, sculptToThreeJSMaterial, sculptToThreeJSMesh, sculptToThreeJSShaderSource, sculptToTouchDesignerShaderSource, sculptureStarterCode, uniformsToGLSL, useHemisphereLight, usePBRHeader };