{"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../node_modules/svelte/transition/index.mjs","../../src/Header.svelte","../../src/ViewPanel.svelte","../../node_modules/three/build/three.module.js","../../src/parser/constants.js","../../src/parser/asf.js","../../src/PosePanel.svelte","../../src/PoseInspector.svelte","../../src/TweakTree.svelte","../../src/TweakThreeTree.svelte","../../src/TweakPanel.svelte","../../src/TweakInspector.svelte","../../src/parser/amc.js","../../src/AnimatePanel.svelte","../../src/AnimateInspector.svelte","../../src/AnimateTimeline.svelte","../../node_modules/three/examples/jsm/loaders/TGALoader.js","../../node_modules/three/examples/jsm/loaders/ColladaLoader.js","../../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../../node_modules/three/examples/jsm/libs/inflate.module.min.js","../../node_modules/three/examples/jsm/curves/NURBSUtils.js","../../node_modules/three/examples/jsm/curves/NURBSCurve.js","../../node_modules/three/examples/jsm/loaders/FBXLoader.js","../../node_modules/three/examples/jsm/libs/mmdparser.module.js","../../node_modules/three/examples/jsm/loaders/MMDLoader.js","../../src/StagePanel.svelte","../../src/Footer.svelte","../../node_modules/three/examples/jsm/controls/OrbitControls.js","../../node_modules/three/examples/jsm/libs/stats.module.js","../../src/Scene.svelte","../../src/App.svelte","../../src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value = ret) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? undefined : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction claim_element(nodes, name, attributes, svg) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeName === name) {\n let j = 0;\n const remove = [];\n while (j < node.attributes.length) {\n const attribute = node.attributes[j++];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n for (let k = 0; k < remove.length; k++) {\n node.removeAttribute(remove[k]);\n }\n return nodes.splice(i, 1)[0];\n }\n }\n return svg ? svg_element(name) : element(name);\n}\nfunction claim_text(nodes, data) {\n for (let i = 0; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 3) {\n node.data = '' + data;\n return nodes.splice(i, 1)[0];\n }\n }\n return text(data);\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n const z_index = (parseInt(computed_style.zIndex) || 0) - 1;\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', `display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ` +\n `overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: ${z_index};`);\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = `data:text/html,`;\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, false, false, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(anchor = null) {\n this.a = anchor;\n this.e = this.n = null;\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n this.e = element(target.nodeName);\n this.t = target;\n this.h(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = node.ownerDocument;\n active_docs.add(doc);\n const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = doc.head.appendChild(element('style')).sheet);\n const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n if (!current_rules[name]) {\n current_rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ``}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n active_docs.forEach(doc => {\n const stylesheet = doc.__svelte_stylesheet;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n doc.__svelte_rules = {};\n });\n active_docs.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error(`Function called outside component initialization`);\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail);\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n }\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n callbacks.slice().forEach(fn => fn(event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n if (flushing)\n return;\n flushing = true;\n do {\n // first, call beforeUpdate functions\n // and update components\n for (let i = 0; i < dirty_components.length; i += 1) {\n const component = dirty_components[i];\n set_current_component(component);\n update(component.$$);\n }\n dirty_components.length = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n flushing = false;\n seen_callbacks.clear();\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = program.b - t;\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n info.blocks[i] = null;\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error(`Cannot have duplicate keys in a keyed each`);\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n const attributes = Object.assign({}, ...args);\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += \" \" + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += \" \" + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${String(value).replace(/\"/g, '"').replace(/'/g, ''')}\"`;\n }\n });\n return str;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(parent_component ? parent_component.$$.context : []),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, options = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, options);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : ``;\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const prop_values = options.props || {};\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n before_update: [],\n after_update: [],\n context: new Map(parent_component ? parent_component.$$.context : []),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false\n };\n let ready = false;\n $$.ctx = instance\n ? instance(component, prop_values, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor);\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.24.1' }, detail)));\n}\nfunction append_dev(target, node) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node });\n append(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev(\"SvelteDOMInsert\", { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev(\"SvelteDOMRemove\", { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? [\"capture\"] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev(\"SvelteDOMAddEventListener\", { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev(\"SvelteDOMRemoveEventListener\", { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev(\"SvelteDOMRemoveAttribute\", { node, attribute });\n else\n dispatch_dev(\"SvelteDOMSetAttribute\", { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev(\"SvelteDOMSetProperty\", { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev(\"SvelteDOMSetDataset\", { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev(\"SvelteDOMSetData\", { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(`'target' is a required option`);\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn(`Component was already destroyed`); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error(`Infinite loop detected`);\n }\n };\n}\n\nexport { HtmlTag, SvelteComponent, SvelteComponentDev, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, assign, attr, attr_dev, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_space, claim_text, clear_loops, component_subscribe, compute_rest_props, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, escape, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getContext, get_binding_group_value, get_current_component, get_slot_changes, get_slot_context, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, has_prop, identity, init, insert, insert_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, update_keyed_each, update_slot, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","import { cubicInOut, linear, cubicOut } from '../easing';\nimport { is_function, assign } from '../internal';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\n\nfunction blur(node, { delay = 0, duration = 400, easing = cubicInOut, amount = 5, opacity = 0 }) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const f = style.filter === 'none' ? '' : style.filter;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `opacity: ${target_opacity - (od * u)}; filter: ${f} blur(${u * amount}px);`\n };\n}\nfunction fade(node, { delay = 0, duration = 400, easing = linear }) {\n const o = +getComputedStyle(node).opacity;\n return {\n delay,\n duration,\n easing,\n css: t => `opacity: ${t * o}`\n };\n}\nfunction fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 }) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (t, u) => `\n\t\t\ttransform: ${transform} translate(${(1 - t) * x}px, ${(1 - t) * y}px);\n\t\t\topacity: ${target_opacity - (od * u)}`\n };\n}\nfunction slide(node, { delay = 0, duration = 400, easing = cubicOut }) {\n const style = getComputedStyle(node);\n const opacity = +style.opacity;\n const height = parseFloat(style.height);\n const padding_top = parseFloat(style.paddingTop);\n const padding_bottom = parseFloat(style.paddingBottom);\n const margin_top = parseFloat(style.marginTop);\n const margin_bottom = parseFloat(style.marginBottom);\n const border_top_width = parseFloat(style.borderTopWidth);\n const border_bottom_width = parseFloat(style.borderBottomWidth);\n return {\n delay,\n duration,\n easing,\n css: t => `overflow: hidden;` +\n `opacity: ${Math.min(t * 20, 1) * opacity};` +\n `height: ${t * height}px;` +\n `padding-top: ${t * padding_top}px;` +\n `padding-bottom: ${t * padding_bottom}px;` +\n `margin-top: ${t * margin_top}px;` +\n `margin-bottom: ${t * margin_bottom}px;` +\n `border-top-width: ${t * border_top_width}px;` +\n `border-bottom-width: ${t * border_bottom_width}px;`\n };\n}\nfunction scale(node, { delay = 0, duration = 400, easing = cubicOut, start = 0, opacity = 0 }) {\n const style = getComputedStyle(node);\n const target_opacity = +style.opacity;\n const transform = style.transform === 'none' ? '' : style.transform;\n const sd = 1 - start;\n const od = target_opacity * (1 - opacity);\n return {\n delay,\n duration,\n easing,\n css: (_t, u) => `\n\t\t\ttransform: ${transform} scale(${1 - (sd * u)});\n\t\t\topacity: ${target_opacity - (od * u)}\n\t\t`\n };\n}\nfunction draw(node, { delay = 0, speed, duration, easing = cubicInOut }) {\n const len = node.getTotalLength();\n if (duration === undefined) {\n if (speed === undefined) {\n duration = 800;\n }\n else {\n duration = len / speed;\n }\n }\n else if (typeof duration === 'function') {\n duration = duration(len);\n }\n return {\n delay,\n duration,\n easing,\n css: (t, u) => `stroke-dasharray: ${t * len} ${u * len}`\n };\n}\nfunction crossfade(_a) {\n var { fallback } = _a, defaults = __rest(_a, [\"fallback\"]);\n const to_receive = new Map();\n const to_send = new Map();\n function crossfade(from, node, params) {\n const { delay = 0, duration = d => Math.sqrt(d) * 30, easing = cubicOut } = assign(assign({}, defaults), params);\n const to = node.getBoundingClientRect();\n const dx = from.left - to.left;\n const dy = from.top - to.top;\n const dw = from.width / to.width;\n const dh = from.height / to.height;\n const d = Math.sqrt(dx * dx + dy * dy);\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n const opacity = +style.opacity;\n return {\n delay,\n duration: is_function(duration) ? duration(d) : duration,\n easing,\n css: (t, u) => `\n\t\t\t\topacity: ${t * opacity};\n\t\t\t\ttransform-origin: top left;\n\t\t\t\ttransform: ${transform} translate(${u * dx}px,${u * dy}px) scale(${t + (1 - t) * dw}, ${t + (1 - t) * dh});\n\t\t\t`\n };\n }\n function transition(items, counterparts, intro) {\n return (node, params) => {\n items.set(params.key, {\n rect: node.getBoundingClientRect()\n });\n return () => {\n if (counterparts.has(params.key)) {\n const { rect } = counterparts.get(params.key);\n counterparts.delete(params.key);\n return crossfade(rect, node, params);\n }\n // if the node is disappearing altogether\n // (i.e. wasn't claimed by the other list)\n // then we need to supply an outro\n items.delete(params.key);\n return fallback && fallback(node, params, intro);\n };\n };\n }\n return [\n transition(to_send, to_receive, false),\n transition(to_receive, to_send, true)\n ];\n}\n\nexport { blur, crossfade, draw, fade, fly, scale, slide };\n","\n\n
\n

Motion Out!

\n {#if !asf.editor.hidden}\n \n {/if}\n
\n\n","
\n
👁️ VIEW PANEL
\n
\n

About

\n

This project will focus on bringing motion data alive from CMU’s motion capture database onto a web platform (WebGL/HTML5 Canvas). Much of the challenge will come from translating the motion capture data (distributed in ASF/AMC/C3D) into useful movements for our skeleton and designing a system capable of rendering out these motions accurately and efficiently. With the goal of portability in mind, this project will also allow users to tweak the motion data and animate it on a given 3D character model.

\n

Scene Information

\n\n

Controls

\n\n

Credits

\n

Project by Kevin Mo (@encadyma).

\n

The data used in this project was obtained from mocap.cs.cmu.edu.\nThe database was created with funding from NSF EIA-0196217.

\n
\n
\n\n\n\n","// Polyfills\n\nif ( Number.EPSILON === undefined ) {\n\n\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n}\n\nif ( Number.isInteger === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n\n\tNumber.isInteger = function ( value ) {\n\n\t\treturn typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;\n\n\t};\n\n}\n\n//\n\nif ( Math.sign === undefined ) {\n\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\tMath.sign = function ( x ) {\n\n\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t};\n\n}\n\nif ( 'name' in Function.prototype === false ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\tget: function () {\n\n\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t}\n\n\t} );\n\n}\n\nif ( Object.assign === undefined ) {\n\n\t// Missing in IE\n\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\tObject.assign = function ( target ) {\n\n\t\tif ( target === undefined || target === null ) {\n\n\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t}\n\n\t\tconst output = Object( target );\n\n\t\tfor ( let index = 1; index < arguments.length; index ++ ) {\n\n\t\t\tconst source = arguments[ index ];\n\n\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\tfor ( const nextKey in source ) {\n\n\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn output;\n\n\t};\n\n}\n\nconst REVISION = '119';\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst FlatShading = 1;\nconst SmoothShading = 2;\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst CubeUVRefractionMapping = 307;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedShort565Type = 1019;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBFormat = 1022;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst RGBEFormat = RGBAFormat;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBIntegerFormat = 1032;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst SRGB8_ALPHA8_ASTC_4x4_Format = 37840;\nconst SRGB8_ALPHA8_ASTC_5x4_Format = 37841;\nconst SRGB8_ALPHA8_ASTC_5x5_Format = 37842;\nconst SRGB8_ALPHA8_ASTC_6x5_Format = 37843;\nconst SRGB8_ALPHA8_ASTC_6x6_Format = 37844;\nconst SRGB8_ALPHA8_ASTC_8x5_Format = 37845;\nconst SRGB8_ALPHA8_ASTC_8x6_Format = 37846;\nconst SRGB8_ALPHA8_ASTC_8x8_Format = 37847;\nconst SRGB8_ALPHA8_ASTC_10x5_Format = 37848;\nconst SRGB8_ALPHA8_ASTC_10x6_Format = 37849;\nconst SRGB8_ALPHA8_ASTC_10x8_Format = 37850;\nconst SRGB8_ALPHA8_ASTC_10x10_Format = 37851;\nconst SRGB8_ALPHA8_ASTC_12x10_Format = 37852;\nconst SRGB8_ALPHA8_ASTC_12x12_Format = 37853;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst LinearEncoding = 3000;\nconst sRGBEncoding = 3001;\nconst GammaEncoding = 3007;\nconst RGBEEncoding = 3002;\nconst LogLuvEncoding = 3003;\nconst RGBM7Encoding = 3004;\nconst RGBM16Encoding = 3005;\nconst RGBDEncoding = 3006;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nfunction EventDispatcher() {}\n\nObject.assign( EventDispatcher.prototype, {\n\n\taddEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t},\n\n\thasEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t},\n\n\tremoveEventListener: function ( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nconst _lut = [];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_lut[ i ] = ( i < 16 ? '0' : '' ) + ( i ).toString( 16 );\n\n}\n\nlet _seed = 1234567;\n\nconst MathUtils = {\n\n\tDEG2RAD: Math.PI / 180,\n\tRAD2DEG: 180 / Math.PI,\n\n\tgenerateUUID: function () {\n\n\t\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\t\tconst d0 = Math.random() * 0xffffffff | 0;\n\t\tconst d1 = Math.random() * 0xffffffff | 0;\n\t\tconst d2 = Math.random() * 0xffffffff | 0;\n\t\tconst d3 = Math.random() * 0xffffffff | 0;\n\t\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t\t// .toUpperCase() here flattens concatenated strings to save heap memory space.\n\t\treturn uuid.toUpperCase();\n\n\t},\n\n\tclamp: function ( value, min, max ) {\n\n\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t},\n\n\t// compute euclidian modulo of m % n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\teuclideanModulo: function ( n, m ) {\n\n\t\treturn ( ( n % m ) + m ) % m;\n\n\t},\n\n\t// Linear mapping from range to range \n\n\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t},\n\n\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\tlerp: function ( x, y, t ) {\n\n\t\treturn ( 1 - t ) * x + t * y;\n\n\t},\n\n\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\tsmoothstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * ( 3 - 2 * x );\n\n\t},\n\n\tsmootherstep: function ( x, min, max ) {\n\n\t\tif ( x <= min ) return 0;\n\t\tif ( x >= max ) return 1;\n\n\t\tx = ( x - min ) / ( max - min );\n\n\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t},\n\n\t// Random integer from interval\n\n\trandInt: function ( low, high ) {\n\n\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t},\n\n\t// Random float from interval\n\n\trandFloat: function ( low, high ) {\n\n\t\treturn low + Math.random() * ( high - low );\n\n\t},\n\n\t// Random float from <-range/2, range/2> interval\n\n\trandFloatSpread: function ( range ) {\n\n\t\treturn range * ( 0.5 - Math.random() );\n\n\t},\n\n\t// Deterministic pseudo-random float in the interval [ 0, 1 ]\n\n\tseededRandom: function ( s ) {\n\n\t\tif ( s !== undefined ) _seed = s % 2147483647;\n\n\t\t// Park-Miller algorithm\n\n\t\t_seed = _seed * 16807 % 2147483647;\n\n\t\treturn ( _seed - 1 ) / 2147483646;\n\n\t},\n\n\tdegToRad: function ( degrees ) {\n\n\t\treturn degrees * MathUtils.DEG2RAD;\n\n\t},\n\n\tradToDeg: function ( radians ) {\n\n\t\treturn radians * MathUtils.RAD2DEG;\n\n\t},\n\n\tisPowerOfTwo: function ( value ) {\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t},\n\n\tceilPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tfloorPowerOfTwo: function ( value ) {\n\n\t\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n\t},\n\n\tsetQuaternionFromProperEuler: function ( q, a, b, c, order ) {\n\n\t\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t\t// rotations are applied to the axes in the order specified by 'order'\n\t\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t\t// angles are in radians\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c2 = cos( b / 2 );\n\t\tconst s2 = sin( b / 2 );\n\n\t\tconst c13 = cos( ( a + c ) / 2 );\n\t\tconst s13 = sin( ( a + c ) / 2 );\n\n\t\tconst c1_3 = cos( ( a - c ) / 2 );\n\t\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\t\tconst c3_1 = cos( ( c - a ) / 2 );\n\t\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYX':\n\t\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZY':\n\t\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXZ':\n\t\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZX':\n\t\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXY':\n\t\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYZ':\n\t\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t}\n\n};\n\nfunction Vector2( x = 0, y = 0 ) {\n\n\tthis.x = x;\n\tthis.y = y;\n\n}\n\nObject.defineProperties( Vector2.prototype, {\n\n\t\"width\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.x = value;\n\n\t\t}\n\n\t},\n\n\t\"height\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.y = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tisVector2: true,\n\n\tset: function ( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function ( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampLength: function ( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t},\n\n\tcross: function ( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tangle: function () {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t},\n\n\trotateAround: function ( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t},\n\n\trandom: function () {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Matrix3() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0,\n\t\t0, 1, 0,\n\t\t0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix3.prototype, {\n\n\tisMatrix3: true,\n\n\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrix4: function ( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tdeterminant: function () {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t},\n\n\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\tif ( throwOnDegenerate !== undefined ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .getInverse() can no longer be configured to throw on degenerate.\" );\n\n\t\t}\n\n\t\tconst me = matrix.elements,\n\t\t\tte = this.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\ttranspose: function () {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t},\n\n\ttransposeIntoArray: function ( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetUvTransform: function ( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t},\n\n\tscale: function ( sx, sy ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= sx; te[ 3 ] *= sx; te[ 6 ] *= sx;\n\t\tte[ 1 ] *= sy; te[ 4 ] *= sy; te[ 7 ] *= sy;\n\n\t\treturn this;\n\n\t},\n\n\trotate: function ( theta ) {\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tconst te = this.elements;\n\n\t\tconst a11 = te[ 0 ], a12 = te[ 3 ], a13 = te[ 6 ];\n\t\tconst a21 = te[ 1 ], a22 = te[ 4 ], a23 = te[ 7 ];\n\n\t\tte[ 0 ] = c * a11 + s * a21;\n\t\tte[ 3 ] = c * a12 + s * a22;\n\t\tte[ 6 ] = c * a13 + s * a23;\n\n\t\tte[ 1 ] = - s * a11 + c * a21;\n\t\tte[ 4 ] = - s * a12 + c * a22;\n\t\tte[ 7 ] = - s * a13 + c * a23;\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( tx, ty ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] += tx * te[ 2 ]; te[ 3 ] += tx * te[ 5 ]; te[ 6 ] += tx * te[ 8 ];\n\t\tte[ 1 ] += ty * te[ 2 ]; te[ 4 ] += ty * te[ 5 ]; te[ 7 ] += ty * te[ 8 ];\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\nlet _canvas;\n\nconst ImageUtils = {\n\n\tgetDataURL: function ( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n};\n\nlet textureId = 0;\n\nfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\n\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\tthis.mipmaps = [];\n\n\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipmapLinearFilter;\n\n\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\tthis.format = format !== undefined ? format : RGBAFormat;\n\tthis.internalFormat = null;\n\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\tthis.offset = new Vector2( 0, 0 );\n\tthis.repeat = new Vector2( 1, 1 );\n\tthis.center = new Vector2( 0, 0 );\n\tthis.rotation = 0;\n\n\tthis.matrixAutoUpdate = true;\n\tthis.matrix = new Matrix3();\n\n\tthis.generateMipmaps = true;\n\tthis.premultiplyAlpha = false;\n\tthis.flipY = true;\n\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t//\n\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\tthis.version = 0;\n\tthis.onUpdate = null;\n\n}\n\nTexture.DEFAULT_IMAGE = undefined;\nTexture.DEFAULT_MAPPING = UVMapping;\n\nTexture.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Texture,\n\n\tisTexture: true,\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.image = source.image;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( this.image !== undefined ) {\n\n\t\t\t// TODO: Move to THREE.Image\n\n\t\t\tconst image = this.image;\n\n\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\timage.uuid = MathUtils.generateUUID(); // UGH\n\n\t\t\t}\n\n\t\t\tif ( ! isRootObject && meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\tlet url;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\t// process array of images e.g. CubeTexture\n\n\t\t\t\t\turl = [];\n\n\t\t\t\t\tfor ( let i = 0, l = image.length; i < l; i ++ ) {\n\n\t\t\t\t\t\turl.push( ImageUtils.getDataURL( image[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// process single image\n\n\t\t\t\t\turl = ImageUtils.getDataURL( image );\n\n\t\t\t\t}\n\n\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\turl: url\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\toutput.image = image.uuid;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t},\n\n\ttransformUv: function ( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n} );\n\nObject.defineProperty( Texture.prototype, \"needsUpdate\", {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nfunction Vector4( x = 0, y = 0, z = 0, w = 1 ) {\n\n\tthis.x = x;\n\tthis.y = y;\n\tthis.z = z;\n\tthis.w = w;\n\n}\n\nObject.defineProperties( Vector4.prototype, {\n\n\t\"width\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.z = value;\n\n\t\t}\n\n\t},\n\n\t\"height\": {\n\n\t\tget: function () {\n\n\t\t\treturn this.w;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.w = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tisVector4: true,\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function ( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampLength: function ( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t},\n\n\trandom: function () {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n} );\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nfunction WebGLRenderTarget( width, height, options ) {\n\n\tthis.width = width;\n\tthis.height = height;\n\n\tthis.scissor = new Vector4( 0, 0, width, height );\n\tthis.scissorTest = false;\n\n\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\toptions = options || {};\n\n\tthis.texture = new Texture( undefined, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\tthis.texture.image = {};\n\tthis.texture.image.width = width;\n\tthis.texture.image.height = height;\n\n\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n}\n\nWebGLRenderTarget.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: WebGLRenderTarget,\n\n\tisWebGLRenderTarget: true,\n\n\tsetSize: function ( width, height ) {\n\n\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\tthis.depthTexture = source.depthTexture;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nfunction WebGLMultisampleRenderTarget( width, height, options ) {\n\n\tWebGLRenderTarget.call( this, width, height, options );\n\n\tthis.samples = 4;\n\n}\n\nWebGLMultisampleRenderTarget.prototype = Object.assign( Object.create( WebGLRenderTarget.prototype ), {\n\n\tconstructor: WebGLMultisampleRenderTarget,\n\n\tisWebGLMultisampleRenderTarget: true,\n\n\tcopy: function ( source ) {\n\n\t\tWebGLRenderTarget.prototype.copy.call( this, source );\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Quaternion( x = 0, y = 0, z = 0, w = 1 ) {\n\n\tthis._x = x;\n\tthis._y = y;\n\tthis._z = z;\n\tthis._w = w;\n\n}\n\nObject.assign( Quaternion, {\n\n\tslerp: function ( qa, qb, qm, t ) {\n\n\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t},\n\n\tslerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t,\n\n\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t},\n\n\tmultiplyQuaternionsFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n} );\n\nObject.defineProperties( Quaternion.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tw: {\n\n\t\tget: function () {\n\n\t\t\treturn this._w;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._w = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Quaternion.prototype, {\n\n\tisQuaternion: true,\n\n\tset: function ( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t},\n\n\tcopy: function ( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromEuler: function ( euler, update ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler.order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromUnitVectors: function ( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tconst EPS = 0.000001;\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < EPS ) {\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t},\n\n\tangleTo: function ( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t},\n\n\trotateTowards: function ( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t},\n\n\tinverse: function () {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t},\n\n\tconjugate: function () {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t},\n\n\tlengthSq: function () {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t},\n\n\tnormalize: function () {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( q, p ) {\n\n\t\tif ( p !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t}\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t},\n\n\tpremultiply: function ( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t},\n\n\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tslerp: function ( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t},\n\n\t_onChange: function ( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\t_onChangeCallback: function () {}\n\n} );\n\nconst _vector = new Vector3();\nconst _quaternion = new Quaternion();\n\nfunction Vector3( x = 0, y = 0, z = 0 ) {\n\n\tthis.x = x;\n\tthis.y = y;\n\tthis.z = z;\n\n}\n\nObject.assign( Vector3.prototype, {\n\n\tisVector3: true,\n\n\tset: function ( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponent: function ( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetComponent: function ( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t},\n\n\tcopy: function ( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\treturn this.addVectors( v, w );\n\n\t\t}\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t},\n\n\taddVectors: function ( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t},\n\n\taddScaledVector: function ( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\treturn this.subVectors( v, w );\n\n\t\t}\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tsubScalar: function ( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t},\n\n\tsubVectors: function ( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t}\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyVectors: function ( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyEuler: function ( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\treturn this.applyQuaternion( _quaternion.setFromEuler( euler ) );\n\n\t},\n\n\tapplyAxisAngle: function ( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion.setFromAxisAngle( axis, angle ) );\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t},\n\n\tapplyNormalMatrix: function ( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t},\n\n\tproject: function ( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t},\n\n\tunproject: function ( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t},\n\n\ttransformDirection: function ( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t},\n\n\tdivide: function ( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t},\n\n\tdivideScalar: function ( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t},\n\n\tmin: function ( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tmax: function ( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t},\n\n\tclamp: function ( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampScalar: function ( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t},\n\n\tclampLength: function ( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t},\n\n\tfloor: function () {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tceil: function () {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tround: function () {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t},\n\n\troundToZero: function () {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t},\n\n\tdot: function ( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t},\n\n\t// TODO lengthSquared?\n\n\tlengthSq: function () {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t},\n\n\tlength: function () {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t},\n\n\tmanhattanLength: function () {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t},\n\n\tnormalize: function () {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t},\n\n\tsetLength: function ( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t},\n\n\tlerp: function ( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tcross: function ( v, w ) {\n\n\t\tif ( w !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\treturn this.crossVectors( v, w );\n\n\t\t}\n\n\t\treturn this.crossVectors( this, v );\n\n\t},\n\n\tcrossVectors: function ( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t},\n\n\tprojectOnVector: function ( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t},\n\n\tprojectOnPlane: function ( planeNormal ) {\n\n\t\t_vector.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector );\n\n\t},\n\n\treflect: function ( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t},\n\n\tangleTo: function ( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( MathUtils.clamp( theta, - 1, 1 ) );\n\n\t},\n\n\tdistanceTo: function ( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t},\n\n\tdistanceToSquared: function ( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t},\n\n\tmanhattanDistanceTo: function ( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t},\n\n\tsetFromSpherical: function ( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t},\n\n\tsetFromSphericalCoords: function ( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCylindrical: function ( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t},\n\n\tsetFromCylindricalCoords: function ( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixPosition: function ( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixScale: function ( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t},\n\n\tsetFromMatrix3Column: function ( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t},\n\n\tequals: function ( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\tif ( offset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t}\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t},\n\n\trandom: function () {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nconst _v1 = new Vector3();\nconst _m1 = new Matrix4();\nconst _zero = new Vector3( 0, 0, 0 );\nconst _one = new Vector3( 1, 1, 1 );\nconst _x = new Vector3();\nconst _y = new Vector3();\nconst _z = new Vector3();\n\nfunction Matrix4() {\n\n\tthis.elements = [\n\n\t\t1, 0, 0, 0,\n\t\t0, 1, 0, 0,\n\t\t0, 0, 1, 0,\n\t\t0, 0, 0, 1\n\n\t];\n\n\tif ( arguments.length > 0 ) {\n\n\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t}\n\n}\n\nObject.assign( Matrix4.prototype, {\n\n\tisMatrix4: true,\n\n\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t},\n\n\tidentity: function () {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t},\n\n\tcopy: function ( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t},\n\n\tcopyPosition: function ( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t},\n\n\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t},\n\n\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\textractRotation: function ( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationFromEuler: function ( euler ) {\n\n\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t},\n\n\tlookAt: function ( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( m, n ) {\n\n\t\tif ( n !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t}\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t},\n\n\tpremultiply: function ( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t},\n\n\tmultiplyMatrices: function ( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t},\n\n\tdeterminant: function () {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t},\n\n\ttranspose: function () {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t},\n\n\tsetPosition: function ( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\tif ( throwOnDegenerate !== undefined ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .getInverse() can no longer be configured to throw on degenerate.\" );\n\n\t\t}\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\t\t\tme = m.elements,\n\n\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t},\n\n\tgetMaxScaleOnAxis: function () {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t},\n\n\tmakeTranslation: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationX: function ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationY: function ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationZ: function ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\t return this;\n\n\t},\n\n\tmakeScale: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tmakeShear: function ( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, y, z, 0,\n\t\t\tx, 1, z, 0,\n\t\t\tx, y, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t},\n\n\tcompose: function ( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tdecompose: function ( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tlet sy = _v1.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tlet sz = _v1.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1.elements[ 0 ] *= invSX;\n\t\t_m1.elements[ 1 ] *= invSX;\n\t\t_m1.elements[ 2 ] *= invSX;\n\n\t\t_m1.elements[ 4 ] *= invSY;\n\t\t_m1.elements[ 5 ] *= invSY;\n\t\t_m1.elements[ 6 ] *= invSY;\n\n\t\t_m1.elements[ 8 ] *= invSZ;\n\t\t_m1.elements[ 9 ] *= invSZ;\n\t\t_m1.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t},\n\n\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\tif ( far === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t},\n\n\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n} );\n\nconst _matrix = new Matrix4();\nconst _quaternion$1 = new Quaternion();\n\nfunction Euler( x = 0, y = 0, z = 0, order = Euler.DefaultOrder ) {\n\n\tthis._x = x;\n\tthis._y = y;\n\tthis._z = z;\n\tthis._order = order;\n\n}\n\nEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\nEuler.DefaultOrder = 'XYZ';\n\nObject.defineProperties( Euler.prototype, {\n\n\tx: {\n\n\t\tget: function () {\n\n\t\t\treturn this._x;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._x = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\ty: {\n\n\t\tget: function () {\n\n\t\t\treturn this._y;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._y = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\tz: {\n\n\t\tget: function () {\n\n\t\t\treturn this._z;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._z = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t},\n\n\torder: {\n\n\t\tget: function () {\n\n\t\t\treturn this._order;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis._order = value;\n\t\t\tthis._onChangeCallback();\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( Euler.prototype, {\n\n\tisEuler: true,\n\n\tset: function ( x, y, z, order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order || this._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t},\n\n\tcopy: function ( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\tconst clamp = MathUtils.clamp;\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\torder = order || this._order;\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\tsetFromQuaternion: function ( q, order, update ) {\n\n\t\t_matrix.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix, order, update );\n\n\t},\n\n\tsetFromVector3: function ( v, order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t},\n\n\treorder: function ( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$1.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$1, newOrder );\n\n\t},\n\n\tequals: function ( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t},\n\n\tfromArray: function ( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t},\n\n\ttoVector3: function ( optionalResult ) {\n\n\t\tif ( optionalResult ) {\n\n\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t} else {\n\n\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t}\n\n\t},\n\n\t_onChange: function ( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\t_onChangeCallback: function () {}\n\n} );\n\nfunction Layers() {\n\n\tthis.mask = 1 | 0;\n\n}\n\nObject.assign( Layers.prototype, {\n\n\tset: function ( channel ) {\n\n\t\tthis.mask = 1 << channel | 0;\n\n\t},\n\n\tenable: function ( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t},\n\n\tenableAll: function () {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t},\n\n\ttoggle: function ( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t},\n\n\tdisable: function ( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t},\n\n\tdisableAll: function () {\n\n\t\tthis.mask = 0;\n\n\t},\n\n\ttest: function ( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n} );\n\nlet _object3DId = 0;\n\nconst _v1$1 = new Vector3();\nconst _q1 = new Quaternion();\nconst _m1$1 = new Matrix4();\nconst _target = new Vector3();\n\nconst _position = new Vector3();\nconst _scale = new Vector3();\nconst _quaternion$2 = new Quaternion();\n\nconst _xAxis = new Vector3( 1, 0, 0 );\nconst _yAxis = new Vector3( 0, 1, 0 );\nconst _zAxis = new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nfunction Object3D() {\n\n\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Object3D';\n\n\tthis.parent = null;\n\tthis.children = [];\n\n\tthis.up = Object3D.DefaultUp.clone();\n\n\tconst position = new Vector3();\n\tconst rotation = new Euler();\n\tconst quaternion = new Quaternion();\n\tconst scale = new Vector3( 1, 1, 1 );\n\n\tfunction onRotationChange() {\n\n\t\tquaternion.setFromEuler( rotation, false );\n\n\t}\n\n\tfunction onQuaternionChange() {\n\n\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t}\n\n\trotation._onChange( onRotationChange );\n\tquaternion._onChange( onQuaternionChange );\n\n\tObject.defineProperties( this, {\n\t\tposition: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: position\n\t\t},\n\t\trotation: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: rotation\n\t\t},\n\t\tquaternion: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: quaternion\n\t\t},\n\t\tscale: {\n\t\t\tconfigurable: true,\n\t\t\tenumerable: true,\n\t\t\tvalue: scale\n\t\t},\n\t\tmodelViewMatrix: {\n\t\t\tvalue: new Matrix4()\n\t\t},\n\t\tnormalMatrix: {\n\t\t\tvalue: new Matrix3()\n\t\t}\n\t} );\n\n\tthis.matrix = new Matrix4();\n\tthis.matrixWorld = new Matrix4();\n\n\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\tthis.matrixWorldNeedsUpdate = false;\n\n\tthis.layers = new Layers();\n\tthis.visible = true;\n\n\tthis.castShadow = false;\n\tthis.receiveShadow = false;\n\n\tthis.frustumCulled = true;\n\tthis.renderOrder = 0;\n\n\tthis.userData = {};\n\n}\n\nObject3D.DefaultUp = new Vector3( 0, 1, 0 );\nObject3D.DefaultMatrixAutoUpdate = true;\n\nObject3D.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Object3D,\n\n\tisObject3D: true,\n\n\tonBeforeRender: function () {},\n\tonAfterRender: function () {},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t},\n\n\tapplyQuaternion: function ( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t},\n\n\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t},\n\n\tsetRotationFromEuler: function ( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t},\n\n\tsetRotationFromMatrix: function ( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t},\n\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t},\n\n\trotateOnAxis: function ( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t},\n\n\trotateOnWorldAxis: function ( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function ( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t},\n\n\trotateY: function ( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t},\n\n\trotateZ: function ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t},\n\n\ttranslateOnAxis: function ( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$1.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t},\n\n\ttranslateX: function ( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t},\n\n\ttranslateY: function ( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t},\n\n\ttranslateZ: function ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t},\n\n\tlocalToWorld: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t},\n\n\tworldToLocal: function ( vector ) {\n\n\t\treturn vector.applyMatrix4( _m1$1.getInverse( this.matrixWorld ) );\n\n\t},\n\n\tlookAt: function ( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.inverse() );\n\n\t\t}\n\n\t},\n\n\tadd: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tremove: function ( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tattach: function ( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.getInverse( this.matrixWorld );\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t},\n\n\tgetObjectById: function ( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t},\n\n\tgetObjectByName: function ( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t},\n\n\tgetObjectByProperty: function ( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tgetWorldPosition: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldPosition() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t},\n\n\tgetWorldQuaternion: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldQuaternion() target is now required' );\n\t\t\ttarget = new Quaternion();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\tthis.matrixWorld.decompose( _position, target, _scale );\n\n\t\treturn target;\n\n\t},\n\n\tgetWorldScale: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldScale() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion$2, target );\n\n\t\treturn target;\n\n\t},\n\n\tgetWorldDirection: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getWorldDirection() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t},\n\n\traycast: function () {},\n\n\ttraverse: function ( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseVisible: function ( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t},\n\n\ttraverseAncestors: function ( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t},\n\n\tupdateMatrix: function () {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t},\n\n\tupdateWorldMatrix: function ( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t},\n\n\tclone: function ( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t},\n\n\tcopy: function ( source, recursive ) {\n\n\t\tif ( recursive === undefined ) recursive = true;\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Scene() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Scene';\n\n\tthis.background = null;\n\tthis.environment = null;\n\tthis.fog = null;\n\n\tthis.overrideMaterial = null;\n\n\tthis.autoUpdate = true; // checked by the renderer\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef\n\n\t}\n\n}\n\nScene.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Scene,\n\n\tisScene: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\tif ( this.environment !== null ) data.object.environment = this.environment.toJSON( meta );\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\treturn data;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nconst _points = [\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3(),\n\tnew Vector3()\n];\n\nconst _vector$1 = new Vector3();\n\nconst _box = new Box3();\n\n// triangle centered vertices\n\nconst _v0 = new Vector3();\nconst _v1$2 = new Vector3();\nconst _v2 = new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = new Vector3();\nconst _f1 = new Vector3();\nconst _f2 = new Vector3();\n\nconst _center = new Vector3();\nconst _extents = new Vector3();\nconst _triangleNormal = new Vector3();\nconst _testAxis = new Vector3();\n\nfunction Box3( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n}\n\n\nObject.assign( Box3.prototype, {\n\n\tisBox3: true,\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromArray: function ( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function ( center, size ) {\n\n\t\tconst halfSize = _vector$1.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromObject: function ( object ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getSize() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\texpandByObject: function ( object ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\t_box.copy( geometry.boundingBox );\n\t\t\t_box.applyMatrix4( object.matrixWorld );\n\n\t\t\tthis.union( _box );\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .getParameter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$1 );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$1.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t},\n\n\tintersectsTriangle: function ( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0.subVectors( triangle.a, _center );\n\t\t_v1$2.subVectors( triangle.b, _center );\n\t\t_v2.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$2, _v0 );\n\t\t_f1.subVectors( _v2, _v1$2 );\n\t\t_f2.subVectors( _v0, _v2 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0, _v1$2, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0, _v1$2, _v2, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0, _v1$2, _v2, _extents );\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\tconst clampedPoint = _vector$1.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t},\n\n\tgetBoundingSphere: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.error( 'THREE.Box3: .getBoundingSphere() target is now required' );\n\t\t\t//target = new Sphere(); // removed to avoid cyclic dependency\n\n\t\t}\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector$1 ).length() * 0.5;\n\n\t\treturn target;\n\n\t},\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the seperating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the seperating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is seperating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$1 = new Box3();\n\nfunction Sphere( center, radius ) {\n\n\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\tthis.radius = ( radius !== undefined ) ? radius : - 1;\n\n}\n\nObject.assign( Sphere.prototype, {\n\n\tset: function ( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$1.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\treturn ( this.radius < 0 );\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t},\n\n\tgetBoundingBox: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Sphere: .getBoundingBox() target is now required' );\n\t\t\ttarget = new Box3();\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n} );\n\nconst _vector$2 = new Vector3();\nconst _segCenter = new Vector3();\nconst _segDir = new Vector3();\nconst _diff = new Vector3();\n\nconst _edge1 = new Vector3();\nconst _edge2 = new Vector3();\nconst _normal = new Vector3();\n\nfunction Ray( origin, direction ) {\n\n\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\tthis.direction = ( direction !== undefined ) ? direction : new Vector3( 0, 0, - 1 );\n\n}\n\nObject.assign( Ray.prototype, {\n\n\tset: function ( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t},\n\n\tlookAt: function ( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\trecast: function ( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$2 ) );\n\n\t\treturn this;\n\n\t},\n\n\tclosestPointToPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t},\n\n\tdistanceSqToPoint: function ( point ) {\n\n\t\tconst directionDistance = _vector$2.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$2.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector$2.distanceToSquared( point );\n\n\t},\n\n\tdistanceSqToSegment: function ( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t},\n\n\tintersectSphere: function ( sphere, target ) {\n\n\t\t_vector$2.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$2.dot( this.direction );\n\t\tconst d2 = _vector$2.dot( _vector$2 ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t},\n\n\tdistanceToPlane: function ( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t},\n\n\tintersectPlane: function ( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t},\n\n\tintersectsPlane: function ( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t},\n\n\tintersectBox: function ( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn this.intersectBox( box, _vector$2 ) !== null;\n\n\t},\n\n\tintersectTriangle: function ( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t},\n\n\tapplyMatrix4: function ( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n} );\n\nconst _vector1 = new Vector3();\nconst _vector2 = new Vector3();\nconst _normalMatrix = new Matrix3();\n\nfunction Plane( normal, constant ) {\n\n\t// normal is assumed to be normalized\n\n\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n}\n\nObject.assign( Plane.prototype, {\n\n\tisPlane: true,\n\n\tset: function ( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t},\n\n\tsetComponents: function ( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCoplanarPoints: function ( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t},\n\n\tnormalize: function () {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t},\n\n\tnegate: function () {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t},\n\n\tdistanceToSphere: function ( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t},\n\n\tprojectPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .projectPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t},\n\n\tintersectLine: function ( line, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .intersectLine() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn undefined;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn undefined;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t},\n\n\tintersectsLine: function ( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t},\n\n\tcoplanarPoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Plane: .coplanarPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t},\n\n\tapplyMatrix4: function ( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n} );\n\nconst _v0$1 = new Vector3();\nconst _v1$3 = new Vector3();\nconst _v2$1 = new Vector3();\nconst _v3 = new Vector3();\n\nconst _vab = new Vector3();\nconst _vac = new Vector3();\nconst _vbc = new Vector3();\nconst _vap = new Vector3();\nconst _vbp = new Vector3();\nconst _vcp = new Vector3();\n\nfunction Triangle( a, b, c ) {\n\n\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n}\n\nObject.assign( Triangle, {\n\n\tgetNormal: function ( a, b, c, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getNormal() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t},\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tgetBarycoord: function ( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$1.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$1 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$1 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getBarycoord() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t},\n\n\tcontainsPoint: function ( point, a, b, c ) {\n\n\t\tTriangle.getBarycoord( point, a, b, c, _v3 );\n\n\t\treturn ( _v3.x >= 0 ) && ( _v3.y >= 0 ) && ( ( _v3.x + _v3.y ) <= 1 );\n\n\t},\n\n\tgetUV: function ( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3.x );\n\t\ttarget.addScaledVector( uv2, _v3.y );\n\t\ttarget.addScaledVector( uv3, _v3.z );\n\n\t\treturn target;\n\n\t},\n\n\tisFrontFacing: function ( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tset: function ( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t},\n\n\tgetArea: function () {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t},\n\n\tgetMidpoint: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getMidpoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t},\n\n\tgetNormal: function ( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t},\n\n\tgetPlane: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .getPlane() target is now required' );\n\t\t\ttarget = new Plane();\n\n\t\t}\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t},\n\n\tgetBarycoord: function ( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t},\n\n\tgetUV: function ( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t},\n\n\tisFrontFacing: function ( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t},\n\n\tclosestPointToPoint: function ( p, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Triangle: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t},\n\n\tequals: function ( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n} );\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction Color( r, g, b ) {\n\n\tif ( g === undefined && b === undefined ) {\n\n\t\t// r is THREE.Color, hex or string\n\t\treturn this.set( r );\n\n\t}\n\n\treturn this.setRGB( r, g, b );\n\n}\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nObject.assign( Color.prototype, {\n\n\tisColor: true,\n\n\tr: 1, g: 1, b: 1,\n\n\tset: function ( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetScalar: function ( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t},\n\n\tsetHex: function ( hex ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\treturn this;\n\n\t},\n\n\tsetRGB: function ( r, g, b ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\treturn this;\n\n\t},\n\n\tsetHSL: function ( h, s, l ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = MathUtils.euclideanModulo( h, 1 );\n\t\ts = MathUtils.clamp( s, 0, 1 );\n\t\tl = MathUtils.clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetStyle: function ( style ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\tconst l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetColorName: function ( style ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t},\n\n\tcopy: function ( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t},\n\n\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\tconst safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\treturn this;\n\n\t},\n\n\tconvertGammaToLinear: function ( gammaFactor ) {\n\n\t\tthis.copyGammaToLinear( this, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToGamma: function ( gammaFactor ) {\n\n\t\tthis.copyLinearToGamma( this, gammaFactor );\n\n\t\treturn this;\n\n\t},\n\n\tcopySRGBToLinear: function ( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t},\n\n\tcopyLinearToSRGB: function ( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t},\n\n\tconvertSRGBToLinear: function () {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t},\n\n\tconvertLinearToSRGB: function () {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t},\n\n\tgetHex: function () {\n\n\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t},\n\n\tgetHexString: function () {\n\n\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t},\n\n\tgetHSL: function ( target ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Color: .getHSL() target is now required' );\n\t\t\ttarget = { h: 0, s: 0, l: 0 };\n\n\t\t}\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t},\n\n\tgetStyle: function () {\n\n\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t},\n\n\toffsetHSL: function ( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t},\n\n\tadd: function ( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t},\n\n\taddColors: function ( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t},\n\n\taddScalar: function ( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t},\n\n\tsub: function ( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t},\n\n\tmultiply: function ( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t},\n\n\tmultiplyScalar: function ( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t},\n\n\tlerp: function ( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t},\n\n\tlerpHSL: function ( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = MathUtils.lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = MathUtils.lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = MathUtils.lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t},\n\n\tfromBufferAttribute: function ( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\tif ( attribute.normalized === true ) {\n\n\t\t\t// assuming Uint8Array\n\n\t\t\tthis.r /= 255;\n\t\t\tthis.g /= 255;\n\t\t\tthis.b /= 255;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn this.getHex();\n\n\t}\n\n} );\n\nColor.NAMES = _colorKeywords;\n\nfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\tthis.a = a;\n\tthis.b = b;\n\tthis.c = c;\n\n\tthis.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();\n\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\tthis.color = ( color && color.isColor ) ? color : new Color();\n\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n}\n\nObject.assign( Face3.prototype, {\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.a = source.a;\n\t\tthis.b = source.b;\n\t\tthis.c = source.c;\n\n\t\tthis.normal.copy( source.normal );\n\t\tthis.color.copy( source.color );\n\n\t\tthis.materialIndex = source.materialIndex;\n\n\t\tfor ( let i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t}\n\n\t\tfor ( let i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nlet materialId = 0;\n\nfunction Material() {\n\n\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Material';\n\n\tthis.fog = true;\n\n\tthis.blending = NormalBlending;\n\tthis.side = FrontSide;\n\tthis.flatShading = false;\n\tthis.vertexColors = false;\n\n\tthis.opacity = 1;\n\tthis.transparent = false;\n\n\tthis.blendSrc = SrcAlphaFactor;\n\tthis.blendDst = OneMinusSrcAlphaFactor;\n\tthis.blendEquation = AddEquation;\n\tthis.blendSrcAlpha = null;\n\tthis.blendDstAlpha = null;\n\tthis.blendEquationAlpha = null;\n\n\tthis.depthFunc = LessEqualDepth;\n\tthis.depthTest = true;\n\tthis.depthWrite = true;\n\n\tthis.stencilWriteMask = 0xff;\n\tthis.stencilFunc = AlwaysStencilFunc;\n\tthis.stencilRef = 0;\n\tthis.stencilFuncMask = 0xff;\n\tthis.stencilFail = KeepStencilOp;\n\tthis.stencilZFail = KeepStencilOp;\n\tthis.stencilZPass = KeepStencilOp;\n\tthis.stencilWrite = false;\n\n\tthis.clippingPlanes = null;\n\tthis.clipIntersection = false;\n\tthis.clipShadows = false;\n\n\tthis.shadowSide = null;\n\n\tthis.colorWrite = true;\n\n\tthis.precision = null; // override the renderer's default precision for this material\n\n\tthis.polygonOffset = false;\n\tthis.polygonOffsetFactor = 0;\n\tthis.polygonOffsetUnits = 0;\n\n\tthis.dithering = false;\n\n\tthis.alphaTest = 0;\n\tthis.premultipliedAlpha = false;\n\n\tthis.visible = true;\n\n\tthis.toneMapped = true;\n\n\tthis.userData = {};\n\n\tthis.version = 0;\n\n}\n\nMaterial.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Material,\n\n\tisMaterial: true,\n\n\tonBeforeCompile: function ( /* shaderobject, renderer */ ) {},\n\n\tcustomProgramCacheKey: function () {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t},\n\n\tsetValues: function ( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen && this.sheen.isColor ) data.sheen = this.sheen.getHex();\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\t\t\tdata.refractionRatio = this.refractionRatio;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\t\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\n\t\t}\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.morphTargets === true ) data.morphTargets = true;\n\t\tif ( this.morphNormals === true ) data.morphNormals = true;\n\t\tif ( this.skinning === true ) data.skinning = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.fog = source.fog;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.flatShading = source.flatShading;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nObject.defineProperty( Material.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * depthTest: ,\n * depthWrite: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: \n * }\n */\n\nfunction MeshBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshBasicMaterial';\n\n\tthis.color = new Color( 0xffffff ); // emissive\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshBasicMaterial.prototype = Object.create( Material.prototype );\nMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\nMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\nMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\nconst _vector$3 = new Vector3();\nconst _vector2$1 = new Vector2();\n\nfunction BufferAttribute( array, itemSize, normalized ) {\n\n\tif ( Array.isArray( array ) ) {\n\n\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t}\n\n\tthis.name = '';\n\n\tthis.array = array;\n\tthis.itemSize = itemSize;\n\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\tthis.normalized = normalized === true;\n\n\tthis.usage = StaticDrawUsage;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n}\n\nObject.defineProperty( BufferAttribute.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\n\tisBufferAttribute: true,\n\n\tonUploadCallback: function () {},\n\n\tsetUsage: function ( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyArray: function ( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t},\n\n\tcopyColorsArray: function ( colors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\tlet color = colors[ i ];\n\n\t\t\tif ( color === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\tcolor = new Color();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = color.r;\n\t\t\tarray[ offset ++ ] = color.g;\n\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector2sArray: function ( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector2();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector3sArray: function ( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector3();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcopyVector4sArray: function ( vectors ) {\n\n\t\tconst array = this.array;\n\t\tlet offset = 0;\n\n\t\tfor ( let i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\tlet vector = vectors[ i ];\n\n\t\t\tif ( vector === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\tvector = new Vector4();\n\n\t\t\t}\n\n\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix3: function ( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$3.fromBufferAttribute( this, i );\n\t\t\t\t_vector$3.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$3.x = this.getX( i );\n\t\t\t_vector$3.y = this.getY( i );\n\t\t\t_vector$3.z = this.getZ( i );\n\n\t\t\t_vector$3.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tapplyNormalMatrix: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$3.x = this.getX( i );\n\t\t\t_vector$3.y = this.getY( i );\n\t\t\t_vector$3.z = this.getZ( i );\n\n\t\t\t_vector$3.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttransformDirection: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$3.x = this.getX( i );\n\t\t\t_vector$3.y = this.getY( i );\n\t\t\t_vector$3.z = this.getZ( i );\n\n\t\t\t_vector$3.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$3.x, _vector$3.y, _vector$3.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize ];\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\treturn {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.prototype.slice.call( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t}\n\n} );\n\n//\n\nfunction Int8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int8Array( array ), itemSize, normalized );\n\n}\n\nInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\nfunction Uint8BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8Array( array ), itemSize, normalized );\n\n}\n\nUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\nfunction Uint8ClampedBufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize, normalized );\n\n}\n\nUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\nfunction Int16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int16Array( array ), itemSize, normalized );\n\n}\n\nInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\nfunction Uint16BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint16Array( array ), itemSize, normalized );\n\n}\n\nUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\nfunction Int32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Int32Array( array ), itemSize, normalized );\n\n}\n\nInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\nfunction Uint32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Uint32Array( array ), itemSize, normalized );\n\n}\n\nUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\nfunction Float32BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float32Array( array ), itemSize, normalized );\n\n}\n\nFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\nfunction Float64BufferAttribute( array, itemSize, normalized ) {\n\n\tBufferAttribute.call( this, new Float64Array( array ), itemSize, normalized );\n\n}\n\nFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\nFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\nfunction DirectGeometry() {\n\n\tthis.vertices = [];\n\tthis.normals = [];\n\tthis.colors = [];\n\tthis.uvs = [];\n\tthis.uvs2 = [];\n\n\tthis.groups = [];\n\n\tthis.morphTargets = {};\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\t// this.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.verticesNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nObject.assign( DirectGeometry.prototype, {\n\n\tcomputeGroups: function ( geometry ) {\n\n\t\tconst groups = [];\n\n\t\tlet group, i;\n\t\tlet materialIndex = undefined;\n\n\t\tconst faces = geometry.faces;\n\n\t\tfor ( i = 0; i < faces.length; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\t// materials\n\n\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t}\n\n\t\t\t\tgroup = {\n\t\t\t\t\tstart: i * 3,\n\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( group !== undefined ) {\n\n\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\tgroups.push( group );\n\n\t\t}\n\n\t\tthis.groups = groups;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tconst faces = geometry.faces;\n\t\tconst vertices = geometry.vertices;\n\t\tconst faceVertexUvs = geometry.faceVertexUvs;\n\n\t\tconst hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\tconst hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t// morphs\n\n\t\tconst morphTargets = geometry.morphTargets;\n\t\tconst morphTargetsLength = morphTargets.length;\n\n\t\tlet morphTargetsPosition;\n\n\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\tmorphTargetsPosition = [];\n\n\t\t\tfor ( let i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsPosition[ i ] = {\n\t\t\t\t\tname: morphTargets[ i ].name,\n\t\t\t\t \tdata: []\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t}\n\n\t\tconst morphNormals = geometry.morphNormals;\n\t\tconst morphNormalsLength = morphNormals.length;\n\n\t\tlet morphTargetsNormal;\n\n\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\tmorphTargetsNormal = [];\n\n\t\t\tfor ( let i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\tmorphTargetsNormal[ i ] = {\n\t\t\t\t\tname: morphNormals[ i ].name,\n\t\t\t\t \tdata: []\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t}\n\n\t\t// skins\n\n\t\tconst skinIndices = geometry.skinIndices;\n\t\tconst skinWeights = geometry.skinWeights;\n\n\t\tconst hasSkinIndices = skinIndices.length === vertices.length;\n\t\tconst hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t//\n\n\t\tif ( vertices.length > 0 && faces.length === 0 ) {\n\n\t\t\tconsole.error( 'THREE.DirectGeometry: Faceless geometries are not supported.' );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < faces.length; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tconst normal = face.normal;\n\n\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t}\n\n\t\t\tconst vertexColors = face.vertexColors;\n\n\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t} else {\n\n\t\t\t\tconst color = face.color;\n\n\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\tconst vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\tconst vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morphs\n\n\t\t\tfor ( let j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\tmorphTargetsPosition[ j ].data.push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\tconst morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\tmorphTargetsNormal[ j ].data.push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t}\n\n\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeGroups( geometry );\n\n\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction arrayMax( array ) {\n\n\tif ( array.length === 0 ) return - Infinity;\n\n\tlet max = array[ 0 ];\n\n\tfor ( let i = 1, l = array.length; i < l; ++ i ) {\n\n\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t}\n\n\treturn max;\n\n}\n\nlet _bufferGeometryId = 1; // BufferGeometry uses odd numbers as Id\n\nconst _m1$2 = new Matrix4();\nconst _obj = new Object3D();\nconst _offset = new Vector3();\nconst _box$2 = new Box3();\nconst _boxMorphTargets = new Box3();\nconst _vector$4 = new Vector3();\n\nfunction BufferGeometry() {\n\n\tObject.defineProperty( this, 'id', { value: _bufferGeometryId += 2 } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'BufferGeometry';\n\n\tthis.index = null;\n\tthis.attributes = {};\n\n\tthis.morphAttributes = {};\n\tthis.morphTargetsRelative = false;\n\n\tthis.groups = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\tthis.drawRange = { start: 0, count: Infinity };\n\n\tthis.userData = {};\n\n}\n\nBufferGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: BufferGeometry,\n\n\tisBufferGeometry: true,\n\n\tgetIndex: function () {\n\n\t\treturn this.index;\n\n\t},\n\n\tsetIndex: function ( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t},\n\n\tgetAttribute: function ( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t},\n\n\tsetAttribute: function ( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t},\n\n\tdeleteAttribute: function ( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t},\n\n\taddGroup: function ( start, count, materialIndex ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t} );\n\n\t},\n\n\tclearGroups: function () {\n\n\t\tthis.groups = [];\n\n\t},\n\n\tsetDrawRange: function ( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function ( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$2.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\trotateY: function ( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$2.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\trotateZ: function ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$2.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$2.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$2.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$2 );\n\n\t\treturn this;\n\n\t},\n\n\tlookAt: function ( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromObject: function ( object ) {\n\n\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\tconst positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\tconst colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\tthis.setAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\tthis.setAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\tconst lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\tthis.setAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t} else if ( object.isMesh ) {\n\n\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t},\n\n\tupdateFromObject: function ( object ) {\n\n\t\tlet geometry = object.geometry;\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tlet direct = geometry.__directGeometry;\n\n\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\tdirect = undefined;\n\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( direct === undefined ) {\n\n\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t}\n\n\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\tgeometry = direct;\n\n\t\t}\n\n\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\tconst attribute = this.attributes.position;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\tconst attribute = this.attributes.normal;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\tconst attribute = this.attributes.color;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\tconst attribute = this.attributes.uv;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\tconst attribute = this.attributes.lineDistance;\n\n\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tfromGeometry: function ( geometry ) {\n\n\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t},\n\n\tfromDirectGeometry: function ( geometry ) {\n\n\t\tconst positions = new Float32Array( geometry.vertices.length * 3 );\n\t\tthis.setAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\tconst normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\tthis.setAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t}\n\n\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\tconst colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\tthis.setAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\tconst uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\tthis.setAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t}\n\n\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\tconst uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\tthis.setAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t}\n\n\t\t// groups\n\n\t\tthis.groups = geometry.groups;\n\n\t\t// morphs\n\n\t\tfor ( const name in geometry.morphTargets ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphTargets = geometry.morphTargets[ name ];\n\n\t\t\tfor ( let i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\n\t\t\t\tconst attribute = new Float32BufferAttribute( morphTarget.data.length * 3, 3 );\n\t\t\t\tattribute.name = morphTarget.name;\n\n\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget.data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\t// skinning\n\n\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\tconst skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\tthis.setAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t}\n\n\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\tconst skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\tthis.setAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$4.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$4 );\n\n\t\t\t\t\t\t_vector$4.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$4 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$4.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$4 );\n\n\t\t\t\t\t\t_vector$4.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$4 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$4.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$4 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$4.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$4.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$4 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\t// backwards compatibility\n\n\t},\n\n\tcomputeVertexNormals: function () {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tmerge: function ( geometry, offset ) {\n\n\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( offset === undefined ) {\n\n\t\t\toffset = 0;\n\n\t\t\tconsole.warn(\n\t\t\t\t'THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. '\n\t\t\t\t+ 'Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge.'\n\t\t\t);\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\tconst attribute1 = attributes[ key ];\n\t\t\tconst attributeArray1 = attribute1.array;\n\n\t\t\tconst attribute2 = geometry.attributes[ key ];\n\t\t\tconst attributeArray2 = attribute2.array;\n\n\t\t\tconst attributeOffset = attribute2.itemSize * offset;\n\t\t\tconst length = Math.min( attributeArray2.length, attributeArray1.length - attributeOffset );\n\n\t\t\tfor ( let i = 0, j = attributeOffset; i < length; i ++, j ++ ) {\n\n\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tnormalizeNormals: function () {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$4.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$4.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$4.x, _vector$4.y, _vector$4.z );\n\n\t\t}\n\n\t},\n\n\ttoNonIndexed: function () {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst attributeData = attribute.toJSON( data.data );\n\n\t\t\tif ( attribute.name !== '' ) attributeData.name = attribute.name;\n\n\t\t\tdata.data.attributes[ key ] = attributeData;\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tconst attributeData = attribute.toJSON( data.data );\n\n\t\t\t\tif ( attribute.name !== '' ) attributeData.name = attribute.name;\n\n\t\t\t\tarray.push( attributeData );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t const parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t const values = [];\n\n\t\t for ( const key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t const geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new BufferGeometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\nconst _inverseMatrix = new Matrix4();\nconst _ray = new Ray();\nconst _sphere = new Sphere();\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _tempA = new Vector3();\nconst _tempB = new Vector3();\nconst _tempC = new Vector3();\n\nconst _morphA = new Vector3();\nconst _morphB = new Vector3();\nconst _morphC = new Vector3();\n\nconst _uvA = new Vector2();\nconst _uvB = new Vector2();\nconst _uvC = new Vector2();\n\nconst _intersectionPoint = new Vector3();\nconst _intersectionPointWorld = new Vector3();\n\nfunction Mesh( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Mesh';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new MeshBasicMaterial();\n\n\tthis.updateMorphTargets();\n\n}\n\nMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Mesh,\n\n\tisMesh: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.getInverse( matrixWorld );\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\tconst uv = geometry.attributes.uv;\n\t\t\tconst uv2 = geometry.attributes.uv2;\n\t\t\tconst groups = geometry.groups;\n\t\t\tconst drawRange = geometry.drawRange;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\t\tconst end = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\t\tconst a = i;\n\t\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst isMultiMaterial = Array.isArray( material );\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst faces = geometry.faces;\n\t\t\tlet uvs;\n\n\t\t\tconst faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\tfor ( let f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = faces[ f ];\n\t\t\t\tconst faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;\n\n\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\tconst fvA = vertices[ face.a ];\n\t\t\t\tconst fvB = vertices[ face.b ];\n\t\t\t\tconst fvC = vertices[ face.c ];\n\n\t\t\t\tintersection = checkIntersection( this, faceMaterial, raycaster, _ray, fvA, fvB, fvC, _intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uvs && uvs[ f ] ) {\n\n\t\t\t\t\t\tconst uvs_f = uvs[ f ];\n\t\t\t\t\t\t_uvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t_uvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t_uvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, fvA, fvB, fvC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = face;\n\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, position, morphPosition, morphTargetsRelative, uv, uv2, a, b, c ) {\n\n\t_vA.fromBufferAttribute( position, a );\n\t_vB.fromBufferAttribute( position, b );\n\t_vC.fromBufferAttribute( position, c );\n\n\tconst morphInfluences = object.morphTargetInfluences;\n\n\tif ( material.morphTargets && morphPosition && morphInfluences ) {\n\n\t\t_morphA.set( 0, 0, 0 );\n\t\t_morphB.set( 0, 0, 0 );\n\t\t_morphC.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\tconst influence = morphInfluences[ i ];\n\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t_tempA.fromBufferAttribute( morphAttribute, a );\n\t\t\t_tempB.fromBufferAttribute( morphAttribute, b );\n\t\t\t_tempC.fromBufferAttribute( morphAttribute, c );\n\n\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t} else {\n\n\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_vA.add( _morphA );\n\t\t_vB.add( _morphB );\n\t\t_vC.add( _morphC );\n\n\t}\n\n\tif ( object.isSkinnedMesh ) {\n\n\t\tobject.boneTransform( a, _vA );\n\t\tobject.boneTransform( b, _vB );\n\t\tobject.boneTransform( c, _vC );\n\n\t}\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA, _vB, _vC, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv, a );\n\t\t\t_uvB.fromBufferAttribute( uv, b );\n\t\t\t_uvC.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA.fromBufferAttribute( uv2, a );\n\t\t\t_uvB.fromBufferAttribute( uv2, b );\n\t\t\t_uvC.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() );\n\n\t\t}\n\n\t\tconst face = new Face3( a, b, c );\n\t\tTriangle.getNormal( _vA, _vB, _vC, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nlet _geometryId = 0; // Geometry uses even numbers as Id\nconst _m1$3 = new Matrix4();\nconst _obj$1 = new Object3D();\nconst _offset$1 = new Vector3();\n\nfunction Geometry() {\n\n\tObject.defineProperty( this, 'id', { value: _geometryId += 2 } );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.name = '';\n\tthis.type = 'Geometry';\n\n\tthis.vertices = [];\n\tthis.colors = [];\n\tthis.faces = [];\n\tthis.faceVertexUvs = [[]];\n\n\tthis.morphTargets = [];\n\tthis.morphNormals = [];\n\n\tthis.skinWeights = [];\n\tthis.skinIndices = [];\n\n\tthis.lineDistances = [];\n\n\tthis.boundingBox = null;\n\tthis.boundingSphere = null;\n\n\t// update flags\n\n\tthis.elementsNeedUpdate = false;\n\tthis.verticesNeedUpdate = false;\n\tthis.uvsNeedUpdate = false;\n\tthis.normalsNeedUpdate = false;\n\tthis.colorsNeedUpdate = false;\n\tthis.lineDistancesNeedUpdate = false;\n\tthis.groupsNeedUpdate = false;\n\n}\n\nGeometry.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: Geometry,\n\n\tisGeometry: true,\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\tfor ( let i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tconst vertex = this.vertices[ i ];\n\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\tfor ( let j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.verticesNeedUpdate = true;\n\t\tthis.normalsNeedUpdate = true;\n\n\t\treturn this;\n\n\t},\n\n\trotateX: function ( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1$3.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\trotateY: function ( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1$3.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\trotateZ: function ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1$3.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1$3.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1$3.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1$3 );\n\n\t\treturn this;\n\n\t},\n\n\tlookAt: function ( vector ) {\n\n\t\t_obj$1.lookAt( vector );\n\n\t\t_obj$1.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj$1.matrix );\n\n\t\treturn this;\n\n\t},\n\n\tfromBufferGeometry: function ( geometry ) {\n\n\t\tconst scope = this;\n\n\t\tconst index = geometry.index !== null ? geometry.index : undefined;\n\t\tconst attributes = geometry.attributes;\n\n\t\tif ( attributes.position === undefined ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.fromBufferGeometry(): Position attribute required for conversion.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst position = attributes.position;\n\t\tconst normal = attributes.normal;\n\t\tconst color = attributes.color;\n\t\tconst uv = attributes.uv;\n\t\tconst uv2 = attributes.uv2;\n\n\t\tif ( uv2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\tscope.vertices.push( new Vector3().fromBufferAttribute( position, i ) );\n\n\t\t\tif ( color !== undefined ) {\n\n\t\t\t\tscope.colors.push( new Color().fromBufferAttribute( color, i ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\tconst vertexColors = ( color === undefined ) ? [] : [\n\t\t\t\tscope.colors[ a ].clone(),\n\t\t\t\tscope.colors[ b ].clone(),\n\t\t\t\tscope.colors[ c ].clone()\n\t\t\t];\n\n\t\t\tconst vertexNormals = ( normal === undefined ) ? [] : [\n\t\t\t\tnew Vector3().fromBufferAttribute( normal, a ),\n\t\t\t\tnew Vector3().fromBufferAttribute( normal, b ),\n\t\t\t\tnew Vector3().fromBufferAttribute( normal, c )\n\t\t\t];\n\n\t\t\tconst face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\tscope.faces.push( face );\n\n\t\t\tif ( uv !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 0 ].push( [\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv, a ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv, b ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv, c )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t\tif ( uv2 !== undefined ) {\n\n\t\t\t\tscope.faceVertexUvs[ 1 ].push( [\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv2, a ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv2, b ),\n\t\t\t\t\tnew Vector2().fromBufferAttribute( uv2, c )\n\t\t\t\t] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst groups = geometry.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tconst start = group.start;\n\t\t\t\tconst count = group.count;\n\n\t\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\taddFace( index.getX( j ), index.getX( j + 1 ), index.getX( j + 2 ), group.materialIndex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\taddFace( j, j + 1, j + 2, group.materialIndex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < index.count; i += 3 ) {\n\n\t\t\t\t\taddFace( index.getX( i ), index.getX( i + 1 ), index.getX( i + 2 ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i += 3 ) {\n\n\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.computeFaceNormals();\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcenter: function () {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset$1 ).negate();\n\n\t\tthis.translate( _offset$1.x, _offset$1.y, _offset$1.z );\n\n\t\treturn this;\n\n\t},\n\n\tnormalize: function () {\n\n\t\tthis.computeBoundingSphere();\n\n\t\tconst center = this.boundingSphere.center;\n\t\tconst radius = this.boundingSphere.radius;\n\n\t\tconst s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\tconst matrix = new Matrix4();\n\t\tmatrix.set(\n\t\t\ts, 0, 0, - s * center.x,\n\t\t\t0, s, 0, - s * center.y,\n\t\t\t0, 0, s, - s * center.z,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\tthis.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tcomputeFaceNormals: function () {\n\n\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tconst vA = this.vertices[ face.a ];\n\t\t\tconst vB = this.vertices[ face.b ];\n\t\t\tconst vC = this.vertices[ face.c ];\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab );\n\n\t\t\tcb.normalize();\n\n\t\t\tface.normal.copy( cb );\n\n\t\t}\n\n\t},\n\n\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\tconst vertices = new Array( this.vertices.length );\n\n\t\tfor ( let v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ] = new Vector3();\n\n\t\t}\n\n\t\tif ( areaWeighted ) {\n\n\t\t\t// vertex normals weighted by triangle areas\n\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = this.faces[ f ];\n\n\t\t\t\tconst vA = this.vertices[ face.a ];\n\t\t\t\tconst vB = this.vertices[ face.b ];\n\t\t\t\tconst vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = this.faces[ f ];\n\n\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\tvertices[ v ].normalize();\n\n\t\t}\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeFlatVertexNormals: function () {\n\n\t\tthis.computeFaceNormals();\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t} else {\n\n\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.faces.length > 0 ) {\n\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t}\n\n\t},\n\n\tcomputeMorphNormals: function () {\n\n\t\t// save original normals\n\t\t// - create temp variables on first access\n\t\t// otherwise just copy (for faster repeated calls)\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t} else {\n\n\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t}\n\n\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\tfor ( let i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\tconst tmpGeo = new Geometry();\n\t\ttmpGeo.faces = this.faces;\n\n\t\tfor ( let i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t// create on first access\n\n\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\tconst dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\tconst dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tconst faceNormal = new Vector3();\n\t\t\t\t\tconst vertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphNormals = this.morphNormals[ i ];\n\n\t\t\t// set vertices to morph target\n\n\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t// compute morph normals\n\n\t\t\ttmpGeo.computeFaceNormals();\n\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t// store morph normals\n\n\t\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tconst face = this.faces[ f ];\n\n\t\t\t\tconst faceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\tconst vertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restore original normals\n\n\t\tfor ( let f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\tconst face = this.faces[ f ];\n\n\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t}\n\n\t},\n\n\tcomputeBoundingBox: function () {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t},\n\n\tcomputeBoundingSphere: function () {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t},\n\n\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\tif ( ! ( geometry && geometry.isGeometry ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet normalMatrix,\n\t\t\tvertexOffset = this.vertices.length,\n\t\t\tvertices1 = this.vertices,\n\t\t\tvertices2 = geometry.vertices,\n\t\t\tfaces1 = this.faces,\n\t\t\tfaces2 = geometry.faces,\n\t\t\tcolors1 = this.colors,\n\t\t\tcolors2 = geometry.colors;\n\n\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\tif ( matrix !== undefined ) {\n\n\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t}\n\n\t\t// vertices\n\n\t\tfor ( let i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\tconst vertex = vertices2[ i ];\n\n\t\t\tconst vertexCopy = vertex.clone();\n\n\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\tvertices1.push( vertexCopy );\n\n\t\t}\n\n\t\t// colors\n\n\t\tfor ( let i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tfor ( let i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\tlet face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t}\n\n\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\tfor ( let j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t}\n\n\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\tfaces1.push( faceCopy );\n\n\t\t}\n\n\t\t// uvs\n\n\t\tfor ( let i = 0, il = geometry.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tconst faceVertexUvs2 = geometry.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) this.faceVertexUvs[ i ] = [];\n\n\t\t\tfor ( let j = 0, jl = faceVertexUvs2.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uvs2 = faceVertexUvs2[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( let k = 0, kl = uvs2.length; k < kl; k ++ ) {\n\n\t\t\t\t\tuvsCopy.push( uvs2[ k ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tmergeMesh: function ( mesh ) {\n\n\t\tif ( ! ( mesh && mesh.isMesh ) ) {\n\n\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( mesh.matrixAutoUpdate ) mesh.updateMatrix();\n\n\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t},\n\n\t/*\n\t * Checks for duplicate vertices with hashmap.\n\t * Duplicated vertices are removed\n\t * and faces' vertices are updated.\n\t */\n\n\tmergeVertices: function () {\n\n\t\tconst verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\tconst unique = [], changes = [];\n\n\t\tconst precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\tconst precision = Math.pow( 10, precisionPoints );\n\n\t\tfor ( let i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\tconst v = this.vertices[ i ];\n\t\t\tconst key = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// if faces are completely degenerate after merging vertices, we\n\t\t// have to remove them from the geometry.\n\t\tconst faceIndicesToRemove = [];\n\n\t\tfor ( let i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\n\t\t\tface.a = changes[ face.a ];\n\t\t\tface.b = changes[ face.b ];\n\t\t\tface.c = changes[ face.c ];\n\n\t\t\tconst indices = [ face.a, face.b, face.c ];\n\n\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t// we have to remove the face as nothing can be saved\n\t\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\tconst idx = faceIndicesToRemove[ i ];\n\n\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\tfor ( let j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Use unique set of vertices\n\n\t\tconst diff = this.vertices.length - unique.length;\n\t\tthis.vertices = unique;\n\t\treturn diff;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.vertices = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tthis.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsortFacesByMaterialIndex: function () {\n\n\t\tconst faces = this.faces;\n\t\tconst length = faces.length;\n\n\t\t// tag faces\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tfaces[ i ]._id = i;\n\n\t\t}\n\n\t\t// sort faces\n\n\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t}\n\n\t\tfaces.sort( materialIndexSort );\n\n\t\t// sort uvs\n\n\t\tconst uvs1 = this.faceVertexUvs[ 0 ];\n\t\tconst uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\tlet newUvs1, newUvs2;\n\n\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst id = faces[ i ]._id;\n\n\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t}\n\n\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Geometry',\n\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Geometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tconst vertices = [];\n\n\t\tfor ( let i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\tconst vertex = this.vertices[ i ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst normals = [];\n\t\tconst normalsHash = {};\n\t\tconst colors = [];\n\t\tconst colorsHash = {};\n\t\tconst uvs = [];\n\t\tconst uvsHash = {};\n\n\t\tfor ( let i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\n\t\t\tconst hasMaterial = true;\n\t\t\tconst hasFaceUv = false; // deprecated\n\t\t\tconst hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\tconst hasFaceNormal = face.normal.length() > 0;\n\t\t\tconst hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\tconst hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\tconst hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\tlet faceType = 0;\n\n\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\tfaces.push( faceType );\n\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\tfaces.push( face.materialIndex );\n\n\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\tconst faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\tconst vertexNormals = face.vertexNormals;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t}\n\n\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\tconst vertexColors = face.vertexColors;\n\n\t\t\t\tfaces.push(\n\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t}\n\n\t\tfunction getNormalIndex( normal ) {\n\n\t\t\tconst hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\treturn normalsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getColorIndex( color ) {\n\n\t\t\tconst hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\tcolors.push( color.getHex() );\n\n\t\t\treturn colorsHash[ hash ];\n\n\t\t}\n\n\t\tfunction getUvIndex( uv ) {\n\n\t\t\tconst hash = uv.x.toString() + uv.y.toString();\n\n\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\treturn uvsHash[ hash ];\n\n\t\t}\n\n\t\tdata.data = {};\n\n\t\tdata.data.vertices = vertices;\n\t\tdata.data.normals = normals;\n\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\tdata.data.faces = faces;\n\n\t\treturn data;\n\n\t},\n\n\tclone: function () {\n\n\t\t/*\n\t\t // Handle primitives\n\n\t\t const parameters = this.parameters;\n\n\t\t if ( parameters !== undefined ) {\n\n\t\t const values = [];\n\n\t\t for ( const key in parameters ) {\n\n\t\t values.push( parameters[ key ] );\n\n\t\t }\n\n\t\t const geometry = Object.create( this.constructor.prototype );\n\t\t this.constructor.apply( geometry, values );\n\t\t return geometry;\n\n\t\t }\n\n\t\t return new this.constructor().copy( this );\n\t\t */\n\n\t\treturn new Geometry().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\t// reset\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\t\tthis.lineDistances = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// vertices\n\n\t\tconst vertices = source.vertices;\n\n\t\tfor ( let i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t}\n\n\t\t// colors\n\n\t\tconst colors = source.colors;\n\n\t\tfor ( let i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t}\n\n\t\t// faces\n\n\t\tconst faces = source.faces;\n\n\t\tfor ( let i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t}\n\n\t\t// face vertex uvs\n\n\t\tfor ( let i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\tconst faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\tfor ( let k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst uv = uvs[ k ];\n\n\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphTargets = source.morphTargets;\n\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = {};\n\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t// vertices\n\n\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t}\n\n\t\t// morph normals\n\n\t\tconst morphNormals = source.morphNormals;\n\n\t\tfor ( let i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\tconst morphNormal = {};\n\n\t\t\t// vertex normals\n\n\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\tconst destVertexNormal = {};\n\n\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// face normals\n\n\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\tfor ( let j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t}\n\n\t\t// skin weights\n\n\t\tconst skinWeights = source.skinWeights;\n\n\t\tfor ( let i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t}\n\n\t\t// skin indices\n\n\t\tconst skinIndices = source.skinIndices;\n\n\t\tfor ( let i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t}\n\n\t\t// line distances\n\n\t\tconst lineDistances = source.lineDistances;\n\n\t\tfor ( let i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\treturn this;\n\n\t},\n\n\tdispose: function () {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n} );\n\n// BoxGeometry\n\nclass BoxGeometry extends Geometry {\n\n\tconstructor( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n}\n\n// BoxBufferGeometry\n\nclass BoxBufferGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * parameters = {\n * defines: { \"label\" : \"value\" },\n * uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n *\n * fragmentShader: ,\n * vertexShader: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * lights: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction ShaderMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShaderMaterial';\n\n\tthis.defines = {};\n\tthis.uniforms = {};\n\n\tthis.vertexShader = default_vertex;\n\tthis.fragmentShader = default_fragment;\n\n\tthis.linewidth = 1;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false; // set to use scene fog\n\tthis.lights = false; // set to use scene lights\n\tthis.clipping = false; // set to use user-defined clipping planes\n\n\tthis.skinning = false; // set to use skinning attribute streams\n\tthis.morphTargets = false; // set to use morph targets\n\tthis.morphNormals = false; // set to use morph normals\n\n\tthis.extensions = {\n\t\tderivatives: false, // set to use derivatives\n\t\tfragDepth: false, // set to use fragment depth values\n\t\tdrawBuffers: false, // set to use draw buffers\n\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t};\n\n\t// When rendered geometry doesn't include these attributes but the material does,\n\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\tthis.defaultAttributeValues = {\n\t\t'color': [ 1, 1, 1 ],\n\t\t'uv': [ 0, 0 ],\n\t\t'uv2': [ 0, 0 ]\n\t};\n\n\tthis.index0AttributeName = undefined;\n\tthis.uniformsNeedUpdate = false;\n\n\tif ( parameters !== undefined ) {\n\n\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t}\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nShaderMaterial.prototype = Object.create( Material.prototype );\nShaderMaterial.prototype.constructor = ShaderMaterial;\n\nShaderMaterial.prototype.isShaderMaterial = true;\n\nShaderMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.fragmentShader = source.fragmentShader;\n\tthis.vertexShader = source.vertexShader;\n\n\tthis.uniforms = cloneUniforms( source.uniforms );\n\n\tthis.defines = Object.assign( {}, source.defines );\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.lights = source.lights;\n\tthis.clipping = source.clipping;\n\n\tthis.skinning = source.skinning;\n\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.extensions = Object.assign( {}, source.extensions );\n\n\treturn this;\n\n};\n\nShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\tconst data = Material.prototype.toJSON.call( this, meta );\n\n\tdata.uniforms = {};\n\n\tfor ( const name in this.uniforms ) {\n\n\t\tconst uniform = this.uniforms[ name ];\n\t\tconst value = uniform.value;\n\n\t\tif ( value && value.isTexture ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 't',\n\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t};\n\n\t\t} else if ( value && value.isColor ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'c',\n\t\t\t\tvalue: value.getHex()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v2',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v3',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'v4',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'm3',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\ttype: 'm4',\n\t\t\t\tvalue: value.toArray()\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tdata.uniforms[ name ] = {\n\t\t\t\tvalue: value\n\t\t\t};\n\n\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t}\n\n\t}\n\n\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\tdata.vertexShader = this.vertexShader;\n\tdata.fragmentShader = this.fragmentShader;\n\n\tconst extensions = {};\n\n\tfor ( const key in this.extensions ) {\n\n\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t}\n\n\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\treturn data;\n\n};\n\nfunction Camera() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Camera';\n\n\tthis.matrixWorldInverse = new Matrix4();\n\n\tthis.projectionMatrix = new Matrix4();\n\tthis.projectionMatrixInverse = new Matrix4();\n\n}\n\nCamera.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Camera,\n\n\tisCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t},\n\n\tgetWorldDirection: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Camera: .getWorldDirection() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\tthis.updateMatrixWorld( true );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tthis.matrixWorldInverse.getInverse( this.matrixWorld );\n\n\t},\n\n\tupdateWorldMatrix: function ( updateParents, updateChildren ) {\n\n\t\tObject3D.prototype.updateWorldMatrix.call( this, updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.getInverse( this.matrixWorld );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n} );\n\nfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'PerspectiveCamera';\n\n\tthis.fov = fov !== undefined ? fov : 50;\n\tthis.zoom = 1;\n\n\tthis.near = near !== undefined ? near : 0.1;\n\tthis.far = far !== undefined ? far : 2000;\n\tthis.focus = 10;\n\n\tthis.aspect = aspect !== undefined ? aspect : 1;\n\tthis.view = null;\n\n\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\tthis.updateProjectionMatrix();\n\n}\n\nPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: PerspectiveCamera,\n\n\tisPerspectiveCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t},\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength: function ( focalLength ) {\n\n\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = MathUtils.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength: function () {\n\n\t\tconst vExtentSlope = Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t},\n\n\tgetEffectiveFOV: function () {\n\n\t\treturn MathUtils.RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t},\n\n\tgetFilmWidth: function () {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t},\n\n\tgetFilmHeight: function () {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t},\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tlet near = this.near,\n\t\t\ttop = near * Math.tan( MathUtils.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\theight = 2 * top,\n\t\t\twidth = this.aspect * height,\n\t\t\tleft = - 0.5 * width,\n\t\t\tview = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.getInverse( this.projectionMatrix );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n} );\n\nconst fov = 90, aspect = 1;\n\nfunction CubeCamera( near, far, renderTarget ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'CubeCamera';\n\n\tif ( renderTarget.isWebGLCubeRenderTarget !== true ) {\n\n\t\tconsole.error( 'THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.' );\n\t\treturn;\n\n\t}\n\n\tthis.renderTarget = renderTarget;\n\n\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPX.layers = this.layers;\n\tcameraPX.up.set( 0, - 1, 0 );\n\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\tthis.add( cameraPX );\n\n\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNX.layers = this.layers;\n\tcameraNX.up.set( 0, - 1, 0 );\n\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\tthis.add( cameraNX );\n\n\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPY.layers = this.layers;\n\tcameraPY.up.set( 0, 0, 1 );\n\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\tthis.add( cameraPY );\n\n\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNY.layers = this.layers;\n\tcameraNY.up.set( 0, 0, - 1 );\n\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\tthis.add( cameraNY );\n\n\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraPZ.layers = this.layers;\n\tcameraPZ.up.set( 0, - 1, 0 );\n\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\tthis.add( cameraPZ );\n\n\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\tcameraNZ.layers = this.layers;\n\tcameraNZ.up.set( 0, - 1, 0 );\n\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\tthis.add( cameraNZ );\n\n\tthis.update = function ( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t};\n\n\tthis.clear = function ( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( renderTarget, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t};\n\n}\n\nCubeCamera.prototype = Object.create( Object3D.prototype );\nCubeCamera.prototype.constructor = CubeCamera;\n\nfunction WebGLCubeRenderTarget( size, options, dummy ) {\n\n\tif ( Number.isInteger( options ) ) {\n\n\t\tconsole.warn( 'THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )' );\n\n\t\toptions = dummy;\n\n\t}\n\n\tWebGLRenderTarget.call( this, size, size, options );\n\n}\n\nWebGLCubeRenderTarget.prototype = Object.create( WebGLRenderTarget.prototype );\nWebGLCubeRenderTarget.prototype.constructor = WebGLCubeRenderTarget;\n\nWebGLCubeRenderTarget.prototype.isWebGLCubeRenderTarget = true;\n\nWebGLCubeRenderTarget.prototype.fromEquirectangularTexture = function ( renderer, texture ) {\n\n\tthis.texture.type = texture.type;\n\tthis.texture.format = RGBAFormat; // see #18859\n\tthis.texture.encoding = texture.encoding;\n\n\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\tthis.texture.minFilter = texture.minFilter;\n\tthis.texture.magFilter = texture.magFilter;\n\n\tconst scene = new Scene();\n\n\tconst shader = {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: /* glsl */`\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t#include \n\t\t\t\t#include \n\n\t\t\t}\n\t\t`,\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tuniform sampler2D tEquirect;\n\n\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t}\n\t\t`\n\t};\n\n\tconst material = new ShaderMaterial( {\n\n\t\tname: 'CubemapFromEquirect',\n\n\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\tvertexShader: shader.vertexShader,\n\t\tfragmentShader: shader.fragmentShader,\n\t\tside: BackSide,\n\t\tblending: NoBlending\n\n\t} );\n\n\tmaterial.uniforms.tEquirect.value = texture;\n\n\tconst mesh = new Mesh( new BoxBufferGeometry( 5, 5, 5 ), material );\n\n\tscene.add( mesh );\n\n\tconst camera = new CubeCamera( 1, 10, this );\n\tcamera.update( renderer, scene );\n\n\tmesh.geometry.dispose();\n\tmesh.material.dispose();\n\n\treturn this;\n\n};\n\nfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { data: data || null, width: width || 1, height: height || 1 };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\tthis.unpackAlignment = 1;\n\n\tthis.needsUpdate = true;\n\n}\n\nDataTexture.prototype = Object.create( Texture.prototype );\nDataTexture.prototype.constructor = DataTexture;\n\nDataTexture.prototype.isDataTexture = true;\n\nconst _sphere$1 = new Sphere();\nconst _vector$5 = new Vector3();\n\nfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\tthis.planes = [\n\n\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t];\n\n}\n\nObject.assign( Frustum.prototype, {\n\n\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromProjectionMatrix: function ( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t},\n\n\tintersectsObject: function ( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$1 );\n\n\t},\n\n\tintersectsSprite: function ( sprite ) {\n\n\t\t_sphere$1.center.set( 0, 0, 0 );\n\t\t_sphere$1.radius = 0.7071067811865476;\n\t\t_sphere$1.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$1 );\n\n\t},\n\n\tintersectsSphere: function ( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$5.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$5.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$5.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$5 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n} );\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: new Matrix3() },\n\t\tuv2Transform: { value: new Matrix3() },\n\n\t\talphaMap: { value: null },\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 },\n\t\trefractionRatio: { value: 0.98 },\n\t\tmaxMipLevel: { value: 0 }\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotShadowMap: { value: [] },\n\t\tspotShadowMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\tuvTransform: { value: new Matrix3() }\n\n\t}\n\n};\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type = 5126;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\ttype = 5123;\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\n// PlaneGeometry\n\nfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PlaneGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\tthis.mergeVertices();\n\n}\n\nPlaneGeometry.prototype = Object.create( Geometry.prototype );\nPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n// PlaneBufferGeometry\n\nfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PlaneBufferGeometry';\n\n\tthis.parameters = {\n\t\twidth: width,\n\t\theight: height,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments\n\t};\n\n\twidth = width || 1;\n\theight = height || 1;\n\n\tconst width_half = width / 2;\n\tconst height_half = height / 2;\n\n\tconst gridX = Math.floor( widthSegments ) || 1;\n\tconst gridY = Math.floor( heightSegments ) || 1;\n\n\tconst gridX1 = gridX + 1;\n\tconst gridY1 = gridY + 1;\n\n\tconst segment_width = width / gridX;\n\tconst segment_height = height / gridY;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\tconst y = iy * segment_height - height_half;\n\n\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\tuvs.push( ix / gridX );\n\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\tconst a = ix + gridX1 * iy;\n\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec2 integrateSpecularBRDF( const in float dotNV, const in float roughness ) {\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\treturn vec2( -1.04, 1.04 ) * a004 + r.zw;\\n}\\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n#else\\n\\tif( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t}\\n\\treturn 1.0;\\n#endif\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nvec3 F_Schlick_RoughnessDependent( const in vec3 F0, const in float dotNV, const in float roughness ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotNV - 6.98316 ) * dotNV );\\n\\tvec3 Fr = max( vec3( 1.0 - roughness ), F0 ) - F0;\\n\\treturn Fr * fresnel + F0;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\\n\\treturn specularColor * brdf.x + brdf.y;\\n}\\nvoid BRDF_Specular_Multiscattering_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tvec3 F = F_Schlick_RoughnessDependent( specularColor, dotNV, roughness );\\n\\tvec2 brdf = integrateSpecularBRDF( dotNV, roughness );\\n\\tvec3 FssEss = F * brdf.x + brdf.y;\\n\\tfloat Ess = brdf.x + brdf.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie(float roughness, float NoH) {\\n\\tfloat invAlpha = 1.0 / roughness;\\n\\tfloat cos2h = NoH * NoH;\\n\\tfloat sin2h = max(1.0 - cos2h, 0.0078125);\\treturn (2.0 + invAlpha) * pow(sin2h, invAlpha * 0.5) / (2.0 * PI);\\n}\\nfloat V_Neubelt(float NoV, float NoL) {\\n\\treturn saturate(1.0 / (4.0 * (NoL + NoV - NoL * NoV)));\\n}\\nvec3 BRDF_Specular_Sheen( const in float roughness, const in vec3 L, const in GeometricContext geometry, vec3 specularColor ) {\\n\\tvec3 N = geometry.normal;\\n\\tvec3 V = geometry.viewDir;\\n\\tvec3 H = normalize( V + L );\\n\\tfloat dotNH = saturate( dot( N, H ) );\\n\\treturn specularColor * D_Charlie( roughness, dotNH ) * V_Neubelt( dot(N, V), dot(N, L) );\\n}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat max3( vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n#ifdef CLEARCOAT\\n\\tvec3 clearcoatNormal;\\n#endif\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat linearToRelativeLuminance( const in vec3 color ) {\\n\\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\\n\\treturn dot( weights, color.rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_maxMipLevel 8.0\\n#define cubeUV_minMipLevel 4.0\\n#define cubeUV_maxTileSize 256.0\\n#define cubeUV_minTileSize 16.0\\nfloat getFace(vec3 direction) {\\n vec3 absDirection = abs(direction);\\n float face = -1.0;\\n if (absDirection.x > absDirection.z) {\\n if (absDirection.x > absDirection.y)\\n face = direction.x > 0.0 ? 0.0 : 3.0;\\n else\\n face = direction.y > 0.0 ? 1.0 : 4.0;\\n } else {\\n if (absDirection.z > absDirection.y)\\n face = direction.z > 0.0 ? 2.0 : 5.0;\\n else\\n face = direction.y > 0.0 ? 1.0 : 4.0;\\n }\\n return face;\\n}\\nvec2 getUV(vec3 direction, float face) {\\n vec2 uv;\\n if (face == 0.0) {\\n uv = vec2(direction.z, direction.y) / abs(direction.x); } else if (face == 1.0) {\\n uv = vec2(-direction.x, -direction.z) / abs(direction.y); } else if (face == 2.0) {\\n uv = vec2(-direction.x, direction.y) / abs(direction.z); } else if (face == 3.0) {\\n uv = vec2(-direction.z, direction.y) / abs(direction.x); } else if (face == 4.0) {\\n uv = vec2(-direction.x, direction.z) / abs(direction.y); } else {\\n uv = vec2(direction.x, direction.y) / abs(direction.z); }\\n return 0.5 * (uv + 1.0);\\n}\\nvec3 bilinearCubeUV(sampler2D envMap, vec3 direction, float mipInt) {\\n float face = getFace(direction);\\n float filterInt = max(cubeUV_minMipLevel - mipInt, 0.0);\\n mipInt = max(mipInt, cubeUV_minMipLevel);\\n float faceSize = exp2(mipInt);\\n float texelSize = 1.0 / (3.0 * cubeUV_maxTileSize);\\n vec2 uv = getUV(direction, face) * (faceSize - 1.0);\\n vec2 f = fract(uv);\\n uv += 0.5 - f;\\n if (face > 2.0) {\\n uv.y += faceSize;\\n face -= 3.0;\\n }\\n uv.x += face * faceSize;\\n if(mipInt < cubeUV_maxMipLevel){\\n uv.y += 2.0 * cubeUV_maxTileSize;\\n }\\n uv.y += filterInt * 2.0 * cubeUV_minTileSize;\\n uv.x += 3.0 * max(0.0, cubeUV_maxTileSize - 2.0 * faceSize);\\n uv *= texelSize;\\n vec3 tl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\\n uv.x += texelSize;\\n vec3 tr = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\\n uv.y += texelSize;\\n vec3 br = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\\n uv.x -= texelSize;\\n vec3 bl = envMapTexelToLinear(texture2D(envMap, uv)).rgb;\\n vec3 tm = mix(tl, tr, f.x);\\n vec3 bm = mix(bl, br, f.x);\\n return mix(tm, bm, f.y);\\n}\\n#define r0 1.0\\n#define v0 0.339\\n#define m0 -2.0\\n#define r1 0.8\\n#define v1 0.276\\n#define m1 -1.0\\n#define r4 0.4\\n#define v4 0.046\\n#define m4 2.0\\n#define r5 0.305\\n#define v5 0.016\\n#define m5 3.0\\n#define r6 0.21\\n#define v6 0.0038\\n#define m6 4.0\\nfloat roughnessToMip(float roughness) {\\n float mip = 0.0;\\n if (roughness >= r1) {\\n mip = (r0 - roughness) * (m1 - m0) / (r0 - r1) + m0;\\n } else if (roughness >= r4) {\\n mip = (r1 - roughness) * (m4 - m1) / (r1 - r4) + m1;\\n } else if (roughness >= r5) {\\n mip = (r4 - roughness) * (m5 - m4) / (r4 - r5) + m4;\\n } else if (roughness >= r6) {\\n mip = (r5 - roughness) * (m6 - m5) / (r5 - r6) + m5;\\n } else {\\n mip = -2.0 * log2(1.16 * roughness); }\\n return mip;\\n}\\nvec4 textureCubeUV(sampler2D envMap, vec3 sampleDir, float roughness) {\\n float mip = clamp(roughnessToMip(roughness), m0, cubeUV_maxMipLevel);\\n float mipF = fract(mip);\\n float mipInt = floor(mip);\\n vec3 color0 = bilinearCubeUV(envMap, sampleDir, mipInt);\\n if (mipF == 0.0) {\\n return vec4(color0, 1.0);\\n } else {\\n vec3 color1 = bilinearCubeUV(envMap, sampleDir, mipInt + 1.0);\\n return vec4(mix(color0, color1, mipF), 1.0);\\n }\\n}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\\n\\tfloat D = max( maxRange / maxRGB, 1.0 );\\n\\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value ) {\\n\\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\\n\\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract( Le );\\n\\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\\n\\treturn vec4( max( vRGB, 0.0 ), 1.0 );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\t\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tvec2 sampleUV = equirectUv( reflectVec );\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifndef ENVMAP_TYPE_CUBE_UV\\n\\t\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform int maxMipLevel;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tfogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float fogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t#else\\n\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\\n\\treflectedLight.indirectDiffuse += PI * lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\nvIndirectFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n\\tvIndirectBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry );\\n#ifdef DOUBLE_SIDED\\n\\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\\n\\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry );\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in GeometricContext geometry ) {\\n\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP )\\n\\t#ifdef ENVMAP_MODE_REFRACTION\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float roughness, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat sigma = PI * roughness * roughness / ( 1.0 + roughness );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar + log2( sigma );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t vec3 reflectVec = reflect( -viewDir, normal );\\n\\t\\t reflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t#else\\n\\t\\t vec3 reflectVec = refract( -viewDir, normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( roughness, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV = equirectUv( reflectVec );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.specularRoughness = max( roughnessFactor, 0.0525 );material.specularRoughness += geometryRoughness;\\nmaterial.specularRoughness = min( material.specularRoughness, 1.0 );\\n#ifdef REFLECTIVITY\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#endif\\n#ifdef CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheen;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularRoughness;\\n\\tvec3 specularColor;\\n#ifdef CLEARCOAT\\n\\tfloat clearcoat;\\n\\tfloat clearcoatRoughness;\\n#endif\\n#ifdef USE_SHEEN\\n\\tvec3 sheenColor;\\n#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearcoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifdef CLEARCOAT\\n\\t\\tfloat ccDotNL = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = ccDotNL * directLight.color;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tccIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\\n\\t\\treflectedLight.directSpecular += ccIrradiance * material.clearcoat * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\\n\\t#else\\n\\t\\tfloat clearcoatDHR = 0.0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_Sheen(\\n\\t\\t\\tmaterial.specularRoughness,\\n\\t\\t\\tdirectLight.direction,\\n\\t\\t\\tgeometry,\\n\\t\\t\\tmaterial.sheenColor\\n\\t\\t);\\n\\t#else\\n\\t\\treflectedLight.directSpecular += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry.viewDir, geometry.normal, material.specularColor, material.specularRoughness);\\n\\t#endif\\n\\treflectedLight.directDiffuse += ( 1.0 - clearcoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef CLEARCOAT\\n\\t\\tfloat ccDotNV = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular += clearcoatRadiance * material.clearcoat * BRDF_Specular_GGX_Environment( geometry.viewDir, geometry.clearcoatNormal, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearcoatRoughness );\\n\\t\\tfloat ccDotNL = ccDotNV;\\n\\t\\tfloat clearcoatDHR = material.clearcoat * clearcoatDHRApprox( material.clearcoatRoughness, ccDotNL );\\n\\t#else\\n\\t\\tfloat clearcoatDHR = 0.0;\\n\\t#endif\\n\\tfloat clearcoatInv = 1.0 - clearcoatDHR;\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\tBRDF_Specular_Multiscattering_Environment( geometry, material.specularColor, material.specularRoughness, singleScattering, multiScattering );\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\\n\\treflectedLight.indirectSpecular += clearcoatInv * radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\n#ifdef CLEARCOAT\\n\\tgeometry.clearcoatNormal = clearcoatNormal;\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.normal, material.specularRoughness, maxMipLevel );\\n\\t#ifdef CLEARCOAT\\n\\t\\tclearcoatRadiance += getLightProbeIndirectRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness, maxMipLevel );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, uv );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifndef USE_MORPHNORMALS\\n\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t\\tbitangent = bitangent * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\t#endif\\n\\t\\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\nvec3 geometryNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef OBJECTSPACE_NORMALMAP\\n\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( TANGENTSPACE_NORMALMAP )\\n\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tnormal = normalize( vTBN * mapN );\\n\\t#else\\n\\t\\tnormal = perturbNormal2Arb( -vViewPosition, normal, mapN );\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef OBJECTSPACE_NORMALMAP\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\\n\\t\\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\\n\\t\\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\\n\\t#else\\n\\t\\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN );\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ));\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w);\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\tvec4 shadowWorldPosition;\\n\\t#endif\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform highp sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmissionmap_fragment = \"#ifdef USE_TRANSMISSIONMAP\\n\\ttotalTransmission *= texture2D( transmissionMap, vUv ).r;\\n#endif\";\n\nvar transmissionmap_pars_fragment = \"#ifdef USE_TRANSMISSIONMAP\\n\\tuniform sampler2D transmissionMap;\\n#endif\";\n\nvar uv_pars_fragment = \"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#ifdef USE_UV\\n\\t#ifdef UVS_VERTEX_ONLY\\n\\t\\tvec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#ifdef USE_UV\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n\\tuniform mat3 uv2Transform;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nvar background_frag = \"uniform sampler2D t2D;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\t#include \\n\\t#include \\n}\";\n\nvar background_vert = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nvar cube_frag = \"#include \\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 vReflect = vWorldDirection;\\n\\t#include \\n\\tgl_FragColor = envColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include \\n\\t#include \\n}\";\n\nvar cube_vert = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nvar depth_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main () {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nvar distanceRGBA_vert = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include \\n\\t\\t#include \\n\\t\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tvec4 texColor = texture2D( tEquirect, sampleUV );\\n\\tgl_FragColor = mapTexelToLinear( texColor );\\n\\t#include \\n\\t#include \\n}\";\n\nvar equirect_vert = \"varying vec3 vWorldDirection;\\n#include \\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include \\n\\t#include \\n}\";\n\nvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\n\\t\\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshbasic_vert = \"#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef USE_ENVMAP\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vIndirectFront;\\n\\t#endif\\n\\t#include \\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\nvarying vec3 vIndirectFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n\\tvarying vec3 vIndirectBack;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshmatcap_frag = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t\\tmatcapColor = matcapTexelToLinear( matcapColor );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshmatcap_vert = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#ifndef FLAT_SHADED\\n\\t\\tvNormal = normalize( transformedNormal );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nvar meshtoon_frag = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshtoon_vert = \"#define TOON\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include \\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphysical_frag = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define REFLECTIVITY\\n\\t#define CLEARCOAT\\n\\t#define TRANSMISSION\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef TRANSMISSION\\n\\tuniform float transmission;\\n#endif\\n#ifdef REFLECTIVITY\\n\\tuniform float reflectivity;\\n#endif\\n#ifdef CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheen;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#ifdef TRANSMISSION\\n\\t\\tfloat totalTransmission = transmission;\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#ifdef TRANSMISSION\\n\\t\\tdiffuseColor.a *= saturate( 1. - totalTransmission + linearToRelativeLuminance( reflectedLight.directSpecular + reflectedLight.indirectSpecular ) );\\n\\t#endif\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar meshphysical_vert = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\";\n\nvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar shadow_vert = \"#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar sprite_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include \\n\\t#include \\n\\t#include \\n\\t#include \\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nvar sprite_vert = \"uniform float rotation;\\nuniform vec2 center;\\n#include \\n#include \\n#include \\n#include \\n#include \\nvoid main() {\\n\\t#include \\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include \\n\\t#include \\n\\t#include \\n}\";\n\nconst ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_vertex: lights_lambert_vertex,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmissionmap_fragment: transmissionmap_fragment,\n\ttransmissionmap_pars_fragment: transmissionmap_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_frag: background_frag,\n\tbackground_vert: background_vert,\n\tcube_frag: cube_frag,\n\tcube_vert: cube_vert,\n\tdepth_frag: depth_frag,\n\tdepth_vert: depth_vert,\n\tdistanceRGBA_frag: distanceRGBA_frag,\n\tdistanceRGBA_vert: distanceRGBA_vert,\n\tequirect_frag: equirect_frag,\n\tequirect_vert: equirect_vert,\n\tlinedashed_frag: linedashed_frag,\n\tlinedashed_vert: linedashed_vert,\n\tmeshbasic_frag: meshbasic_frag,\n\tmeshbasic_vert: meshbasic_vert,\n\tmeshlambert_frag: meshlambert_frag,\n\tmeshlambert_vert: meshlambert_vert,\n\tmeshmatcap_frag: meshmatcap_frag,\n\tmeshmatcap_vert: meshmatcap_vert,\n\tmeshtoon_frag: meshtoon_frag,\n\tmeshtoon_vert: meshtoon_vert,\n\tmeshphong_frag: meshphong_frag,\n\tmeshphong_vert: meshphong_vert,\n\tmeshphysical_frag: meshphysical_frag,\n\tmeshphysical_vert: meshphysical_vert,\n\tnormal_frag: normal_frag,\n\tnormal_vert: normal_vert,\n\tpoints_frag: points_frag,\n\tpoints_vert: points_vert,\n\tshadow_frag: shadow_frag,\n\tshadow_vert: shadow_vert,\n\tsprite_frag: sprite_frag,\n\tsprite_vert: sprite_vert\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.normal_vert,\n\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\t/* -------------------------------------------------------------------------\n\t//\tCube map shader\n\t ------------------------------------------------------------------------- */\n\n\tcube: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.envmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tsheen: { value: new Color( 0x000000 ) },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nfunction WebGLBackground( renderer, state, objects, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = 0;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene, camera, forceClear ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.isWebGLCubeRenderTarget || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxBufferGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.cube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tconst texture = background.isWebGLCubeRenderTarget ? background.texture : background;\n\n\t\t\tboxMesh.material.uniforms.envMap.value = texture;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = texture.isCubeTexture ? - 1 : 1;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== texture.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = texture.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// enable code injection for non-built-in material\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha !== undefined ? alpha : 1;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( 34921 );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( geometry );\n\n\t\t\tif ( updateBuffers ) saveCache( geometry );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh === true ) {\n\n\t\t\tupdateBuffers = true;\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tif ( updateBuffers ) {\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( 34963, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {}\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( geometry ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tif ( Object.keys( cachedAttributes ).length !== Object.keys( geometryAttributes ).length ) return true;\n\n\t\tfor ( const key in geometryAttributes ) {\n\n\t\t\tconst cachedAttribute = cachedAttributes[ key ];\n\t\t\tconst geometryAttribute = geometryAttributes[ key ];\n\n\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\tif ( cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( geometry ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tconst data = {};\n\t\t\tdata.attribute = attribute;\n\n\t\t\tif ( attribute.data ) {\n\n\t\t\t\tdata.data = attribute.data;\n\n\t\t\t}\n\n\t\t\tcache[ key ] = data;\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\tconst geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute, data.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tenableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\t\t\t\t\t\tvertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, offset * bytesPerElement );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\tif ( geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tenableAttribute( programAttribute );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\t\t\t\t\t\tvertexAttribPointer( programAttribute, size, type, normalized, 0, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( name === 'instanceMatrix' ) {\n\n\t\t\t\t\tconst attribute = attributes.get( object.instanceMatrix );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 0, 1 );\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 1, 1 );\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 2, 1 );\n\t\t\t\t\tenableAttributeAndDivisor( programAttribute + 3, 1 );\n\n\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 0, 4, type, false, 64, 0 );\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 1, 4, type, false, 64, 16 );\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 2, 4, type, false, 64, 32 );\n\t\t\t\t\tgl.vertexAttribPointer( programAttribute + 3, 4, type, false, 64, 48 );\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatilibity\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\t/* eslint-disable no-undef */\n\tconst isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext ) ||\n\t\t( typeof WebGL2ComputeRenderingContext !== 'undefined' && gl instanceof WebGL2ComputeRenderingContext );\n\t/* eslint-enable no-undef */\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( 34930 );\n\tconst maxVertexTextures = gl.getParameter( 35660 );\n\tconst maxTextureSize = gl.getParameter( 3379 );\n\tconst maxCubemapSize = gl.getParameter( 34076 );\n\n\tconst maxAttributes = gl.getParameter( 34921 );\n\tconst maxVertexUniforms = gl.getParameter( 36347 );\n\tconst maxVaryings = gl.getParameter( 36348 );\n\tconst maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || !! extensions.get( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping() {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping, camera ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\t\tresetGlobalState();\n\n\t};\n\n\tthis.setState = function ( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = cache.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tcache.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tlet nPlanes = planes !== null ? planes.length : 0,\n\t\t\tdstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\treturn extensions[ name ];\n\n\t\t\t}\n\n\t\t\tlet extension;\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t}\n\n\t\t\textensions[ name ] = extension;\n\n\t\t\treturn !! extension;\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tif ( ! this.has( name ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = new WeakMap();\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\t\tconst buffergeometry = geometries.get( geometry );\n\n\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\tattributes.remove( buffergeometry.index );\n\n\t\t}\n\n\t\tfor ( const name in buffergeometry.attributes ) {\n\n\t\t\tattributes.remove( buffergeometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries.delete( geometry );\n\n\t\tconst attribute = wireframeAttributes.get( buffergeometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( buffergeometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tlet buffergeometry = geometries.get( geometry );\n\n\t\tif ( buffergeometry ) return buffergeometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tbuffergeometry = geometry;\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t}\n\n\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t}\n\n\t\tgeometries.set( geometry, buffergeometry );\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\tlet influences = influencesList[ geometry.id ];\n\n\t\tif ( influences === undefined ) {\n\n\t\t\t// initialise list\n\n\t\t\tinfluences = [];\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t}\n\n\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t}\n\n\t\t// Collect influences\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst influence = influences[ i ];\n\n\t\t\tinfluence[ 0 ] = i;\n\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t}\n\n\t\tinfluences.sort( absNumericalSort );\n\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tworkInfluences.sort( numericalSort );\n\n\t\tconst morphTargets = material.morphTargets && geometry.morphAttributes.position;\n\t\tconst morphNormals = material.morphNormals && geometry.morphAttributes.normal;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\tconst influence = workInfluences[ i ];\n\t\t\tconst index = influence[ 0 ];\n\t\t\tconst value = influence[ 1 ];\n\n\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t}\n\n\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t} else {\n\n\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== undefined ) {\n\n\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== undefined ) {\n\n\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t}\n\n\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\tbuffergeometry.updateFromObject( object );\n\n\t\t\t}\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tattributes.update( object.instanceMatrix, 34962 );\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\timages = images !== undefined ? images : [];\n\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\tformat = format !== undefined ? format : RGBFormat;\n\n\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.flipY = false;\n\n}\n\nCubeTexture.prototype = Object.create( Texture.prototype );\nCubeTexture.prototype.constructor = CubeTexture;\n\nCubeTexture.prototype.isCubeTexture = true;\n\nObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\tget: function () {\n\n\t\treturn this.image;\n\n\t},\n\n\tset: function ( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n} );\n\nfunction DataTexture2DArray( data, width, height, depth ) {\n\n\tTexture.call( this, null );\n\n\tthis.image = { data: data || null, width: width || 1, height: height || 1, depth: depth || 1 };\n\n\tthis.magFilter = NearestFilter;\n\tthis.minFilter = NearestFilter;\n\n\tthis.wrapR = ClampToEdgeWrapping;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\n\tthis.needsUpdate = true;\n\n}\n\nDataTexture2DArray.prototype = Object.create( Texture.prototype );\nDataTexture2DArray.prototype.constructor = DataTexture2DArray;\nDataTexture2DArray.prototype.isDataTexture2DArray = true;\n\nfunction DataTexture3D( data, width, height, depth ) {\n\n\t// We're going to add .setXXX() methods for setting properties later.\n\t// Users can still set in DataTexture3D directly.\n\t//\n\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t// \ttexture.anisotropy = 16;\n\t//\n\t// See #14839\n\n\tTexture.call( this, null );\n\n\tthis.image = { data: data || null, width: width || 1, height: height || 1, depth: depth || 1 };\n\n\tthis.magFilter = NearestFilter;\n\tthis.minFilter = NearestFilter;\n\n\tthis.wrapR = ClampToEdgeWrapping;\n\n\tthis.generateMipmaps = false;\n\tthis.flipY = false;\n\n\tthis.needsUpdate = true;\n\n\n}\n\nDataTexture3D.prototype = Object.create( Texture.prototype );\nDataTexture3D.prototype.constructor = DataTexture3D;\nDataTexture3D.prototype.isDataTexture3D = true;\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nconst emptyTexture = new Texture();\nconst emptyTexture2dArray = new DataTexture2DArray();\nconst emptyTexture3d = new DataTexture3D();\nconst emptyCubeTexture = new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tlet n = nBlocks * blockSize,\n\t\tr = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyTexture2dArray, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || emptyTexture3d, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.safeSetTextureCube( v || emptyCubeTexture, unit );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform2iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform3iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( arraysEqual( cache, v ) ) return;\n\n\tgl.uniform4iv( this.addr, v );\n\n\tcopyArray( cache, v );\n\n}\n\n// uint\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n// Array of scalars\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Integer / Boolean vectors or arrays thereof (always flat arrays)\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n\n// Array of vectors (flat or from THREE classes)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (flat or from THREE clases)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of textures (2D / Cube)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tgl.uniform1iv( this.addr, units );\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.safeSetTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nfunction SingleUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\tthis.id = id;\n\tthis.addr = addr;\n\tthis.cache = [];\n\tthis.size = activeInfo.size;\n\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t// this.path = activeInfo.name; // DEBUG\n\n}\n\nPureArrayUniform.prototype.updateCache = function ( data ) {\n\n\tlet cache = this.cache;\n\n\tif ( data instanceof Float32Array && cache.length !== data.length ) {\n\n\t\tthis.cache = new Float32Array( data.length );\n\n\t}\n\n\tcopyArray( cache, data );\n\n};\n\nfunction StructuredUniform( id ) {\n\n\tthis.id = id;\n\n\tthis.seq = [];\n\tthis.map = {};\n\n}\n\nStructuredUniform.prototype.setValue = function ( gl, value, textures ) {\n\n\tconst seq = this.seq;\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t}\n\n};\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ],\n\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nfunction WebGLUniforms( gl, program ) {\n\n\tthis.seq = [];\n\tthis.map = {};\n\n\tconst n = gl.getProgramParameter( program, 35718 );\n\n\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\tparseUniform( info, addr, this );\n\n\t}\n\n}\n\nWebGLUniforms.prototype.setValue = function ( gl, name, value, textures ) {\n\n\tconst u = this.map[ name ];\n\n\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n};\n\nWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\tconst v = object[ name ];\n\n\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n};\n\n\n// Static interface\n\nWebGLUniforms.upload = function ( gl, seq, values, textures ) {\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ],\n\t\t\tv = values[ u.id ];\n\n\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t}\n\n\t}\n\n};\n\nWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\tconst r = [];\n\n\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\tconst u = seq[ i ];\n\t\tif ( u.id in values ) r.push( u );\n\n\t}\n\n\treturn r;\n\n};\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nlet programIdCount = 0;\n\nfunction addLineNumbers( string ) {\n\n\tconst lines = string.split( '\\n' );\n\n\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t}\n\n\treturn lines.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tcase RGBEEncoding:\n\t\t\treturn [ 'RGBE', '( value )' ];\n\t\tcase RGBM7Encoding:\n\t\t\treturn [ 'RGBM', '( value, 7.0 )' ];\n\t\tcase RGBM16Encoding:\n\t\t\treturn [ 'RGBM', '( value, 16.0 )' ];\n\t\tcase RGBDEncoding:\n\t\t\treturn [ 'RGBD', '( value, 256.0 )' ];\n\t\tcase GammaEncoding:\n\t\t\treturn [ 'Gamma', '( value, float( GAMMA_FACTOR ) )' ];\n\t\tcase LogLuvEncoding:\n\t\t\treturn [ 'LogLuv', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, 35713 );\n\tconst log = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && log === '' ) return '';\n\n\t// --enable-privileged-webgl-extension\n\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\tconst source = gl.getShaderSource( shader );\n\n\treturn 'THREE.WebGLShader: gl.getShaderInfoLog() ' + type + '\\n' + log + addLineNumbers( source );\n\n}\n\nfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return ' + components[ 0 ] + 'ToLinear' + components[ 1 ] + '; }';\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst deprecatedUnrollLoopPattern = /#pragma unroll_loop[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\nconst unrollLoopPattern = /#pragma unroll_loop_start[\\s]+?for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}[\\s]+?#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string\n\t\t.replace( unrollLoopPattern, loopReplacer )\n\t\t.replace( deprecatedUnrollLoopPattern, deprecatedLoopReplacer );\n\n}\n\nfunction deprecatedLoopReplacer( match, start, end, snippet ) {\n\n\tconsole.warn( 'WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead.' );\n\treturn loopReplacer( match, start, end, snippet );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[ i \\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = \"precision \" + parameters.precision + \" float;\\nprecision \" + parameters.precision + \" int;\";\n\n\tif ( parameters.precision === \"highp\" ) {\n\n\t\tprecisionstring += \"\\n#define HIGH_PRECISION\";\n\n\t} else if ( parameters.precision === \"mediump\" ) {\n\n\t\tprecisionstring += \"\\n#define MEDIUM_PRECISION\";\n\n\t} else if ( parameters.precision === \"lowp\" ) {\n\n\t\tprecisionstring += \"\\n#define LOW_PRECISION\";\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t\tcase EquirectangularReflectionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\t\t\tcase EquirectangularRefractionMapping:\n\t\t\tcase CubeUVRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\n\n\tconst gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t' attribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest + ( parameters.alphaTest % 1 ? '' : '.0' ) : '', // add '.0' if integer\n\n\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t( ( parameters.extensionShaderTextureLOD || parameters.envMap ) && parameters.rendererExtensionShaderTextureLod ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tparameters.map ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\tparameters.matcap ? getTexelDecodingFunction( 'matcapTexelToLinear', parameters.matcapEncoding ) : '',\n\t\t\tparameters.envMap ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\tparameters.emissiveMap ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\tparameters.lightMap ? getTexelDecodingFunction( 'lightMapTexelToLinear', parameters.lightMapEncoding ) : '',\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.depthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && ! parameters.isRawShaderMaterial ) {\n\n\t\t// GLSL 3.0 conversion\n\n\t\tprefixVertex = [\n\t\t\t'#version 300 es\\n',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#version 300 es\\n',\n\t\t\t'#define varying in',\n\t\t\t'out highp vec4 pc_fragColor;',\n\t\t\t'#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = prefixVertex + vertexShader;\n\tconst fragmentGlsl = prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), '35715', gl.getProgramParameter( program, 35715 ), 'gl.getProgramInfoLog', programLog, vertexErrors, fragmentErrors );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nfunction WebGLPrograms( renderer, extensions, capabilities, bindingStates ) {\n\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst floatVertexTextures = capabilities.floatVertexTextures;\n\tconst maxVertexUniforms = capabilities.maxVertexUniforms;\n\tconst vertexTextures = capabilities.vertexTextures;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tconst parameterNames = [\n\t\t\"precision\", \"isWebGL2\", \"supportsVertexTextures\", \"outputEncoding\", \"instancing\",\n\t\t\"map\", \"mapEncoding\", \"matcap\", \"matcapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\", \"envMapCubeUV\",\n\t\t\"lightMap\", \"lightMapEncoding\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"objectSpaceNormalMap\", \"tangentSpaceNormalMap\", \"clearcoatMap\", \"clearcoatRoughnessMap\", \"clearcoatNormalMap\", \"displacementMap\", \"specularMap\",\n\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"vertexTangents\", \"vertexUvs\", \"uvsVertexOnly\", \"fog\", \"useFog\", \"fogExp2\",\n\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\"numDirLightShadows\", \"numPointLightShadows\", \"numSpotLightShadows\",\n\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\", \"dithering\",\n\t\t\"sheen\", \"transmissionMap\"\n\t];\n\n\tfunction allocateBones( object ) {\n\n\t\tconst skeleton = object.skeleton;\n\t\tconst bones = skeleton.bones;\n\n\t\tif ( floatVertexTextures ) {\n\n\t\t\treturn 1024;\n\n\t\t} else {\n\n\t\t\t// default for when object is not specified\n\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t//\n\t\t\t// - leave some extra space for other uniforms\n\t\t\t// - limit here is ANGLE's 254 max uniform vectors\n\t\t\t// (up to 54 should be safe)\n\n\t\t\tconst nVertexUniforms = maxVertexUniforms;\n\t\t\tconst nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\tconst maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\treturn maxBones;\n\n\t\t}\n\n\t}\n\n\tfunction getTextureEncodingFromMap( map ) {\n\n\t\tlet encoding;\n\n\t\tif ( ! map ) {\n\n\t\t\tencoding = LinearEncoding;\n\n\t\t} else if ( map.isTexture ) {\n\n\t\t\tencoding = map.encoding;\n\n\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\tencoding = map.texture.encoding;\n\n\t\t}\n\n\t\treturn encoding;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, nClipPlanes, nClipIntersection, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = material.envMap || environment;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tconst maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet vertexShader, fragmentShader;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial,\n\t\t\tisShaderMaterial: material.isShaderMaterial,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget !== null ) ? getTextureEncodingFromMap( currentRenderTarget.texture ) : renderer.outputEncoding,\n\t\t\tmap: !! material.map,\n\t\t\tmapEncoding: getTextureEncodingFromMap( material.map ),\n\t\t\tmatcap: !! material.matcap,\n\t\t\tmatcapEncoding: getTextureEncodingFromMap( material.matcap ),\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapEncoding: getTextureEncodingFromMap( envMap ),\n\t\t\tenvMapCubeUV: ( !! envMap ) && ( ( envMap.mapping === CubeUVReflectionMapping ) || ( envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\tlightMap: !! material.lightMap,\n\t\t\tlightMapEncoding: getTextureEncodingFromMap( material.lightMap ),\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap ),\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\t\t\tclearcoatMap: !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: !! material.clearcoatNormalMap,\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: !! material.sheen,\n\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( material.normalMap && material.vertexTangents ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.displacementMap || !! material.transmissionMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || !! material.transmissionMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: material.skinning && maxBones > 0,\n\t\t\tmaxBones: maxBones,\n\t\t\tuseVertexTexture: floatVertexTextures,\n\n\t\t\tmorphTargets: material.morphTargets,\n\t\t\tmorphNormals: material.morphNormals,\n\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\n\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\talphaTest: material.alphaTest,\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.get( 'EXT_frag_depth' ) !== null,\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.get( 'WEBGL_draw_buffers' ) !== null,\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.get( 'EXT_shader_texture_lod' ) !== null,\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.fragmentShader );\n\t\t\tarray.push( parameters.vertexShader );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === undefined ) {\n\n\t\t\tfor ( let i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\tarray.push( renderer.outputEncoding );\n\t\t\tarray.push( renderer.gammaFactor );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.program !== b.program ) {\n\n\t\treturn a.program.id - b.program.id;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList( properties ) {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transparent = [];\n\n\tconst defaultProgram = { id: - 1 };\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tprogram: materialProperties.program || defaultProgram,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.program = materialProperties.program || defaultProgram;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\t( material.transparent === true ? transparent : opaque ).push( renderItem );\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\t( material.transparent === true ? transparent : opaque ).unshift( renderItem );\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.program = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists( properties ) {\n\n\tlet lists = new WeakMap();\n\n\tfunction onSceneDispose( event ) {\n\n\t\tconst scene = event.target;\n\n\t\tscene.removeEventListener( 'dispose', onSceneDispose );\n\n\t\tlists.delete( scene );\n\n\t}\n\n\tfunction get( scene, camera ) {\n\n\t\tconst cameras = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( cameras === undefined ) {\n\n\t\t\tlist = new WebGLRenderList( properties );\n\t\t\tlists.set( scene, new WeakMap() );\n\t\t\tlists.get( scene ).set( camera, list );\n\n\t\t\tscene.addEventListener( 'dispose', onSceneDispose );\n\n\t\t} else {\n\n\t\t\tlist = cameras.get( camera );\n\t\t\tif ( list === undefined ) {\n\n\t\t\t\tlist = new WebGLRenderList( properties );\n\t\t\t\tcameras.set( camera, list );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 1 : 0 ) - ( lightA.castShadow ? 1 : 0 );\n\n}\n\nfunction WebGLLights() {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotShadowMatrix: [],\n\t\trectArea: [],\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: []\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, shadows, camera ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tlights.sort( shadowCastingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\t// (a) intensity is the total visible light emitted\n\t\t\t\t//uniforms.color.copy( color ).multiplyScalar( intensity / ( light.width * light.height * Math.PI ) );\n\n\t\t\t\t// (b) intensity is the brightness of the light\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotShadowMatrix.length = numSpotShadows;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState() {\n\n\tconst lights = new WebGLLights();\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( camera ) {\n\n\t\tlights.setup( lightsArray, shadowsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates() {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction onSceneDispose( event ) {\n\n\t\tconst scene = event.target;\n\n\t\tscene.removeEventListener( 'dispose', onSceneDispose );\n\n\t\trenderStates.delete( scene );\n\n\t}\n\n\tfunction get( scene, camera ) {\n\n\t\tlet renderState;\n\n\t\tif ( renderStates.has( scene ) === false ) {\n\n\t\t\trenderState = new WebGLRenderState();\n\t\t\trenderStates.set( scene, new WeakMap() );\n\t\t\trenderStates.get( scene ).set( camera, renderState );\n\n\t\t\tscene.addEventListener( 'dispose', onSceneDispose );\n\n\t\t} else {\n\n\t\t\tif ( renderStates.get( scene ).has( camera ) === false ) {\n\n\t\t\t\trenderState = new WebGLRenderState();\n\t\t\t\trenderStates.get( scene ).set( camera, renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStates.get( scene ).get( camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\n/**\n * parameters = {\n *\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n * }\n */\n\nfunction MeshDepthMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDepthMaterial';\n\n\tthis.depthPacking = BasicDepthPacking;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDepthMaterial.prototype = Object.create( Material.prototype );\nMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\nMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\nMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.depthPacking = source.depthPacking;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n *\n * referencePosition: ,\n * nearDistance: ,\n * farDistance: ,\n *\n * skinning: ,\n * morphTargets: ,\n *\n * map: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: \n *\n * }\n */\n\nfunction MeshDistanceMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshDistanceMaterial';\n\n\tthis.referencePosition = new Vector3();\n\tthis.nearDistance = 1;\n\tthis.farDistance = 1000;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.fog = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshDistanceMaterial.prototype = Object.create( Material.prototype );\nMeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;\n\nMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\nMeshDistanceMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.referencePosition.copy( source.referencePosition );\n\tthis.nearDistance = source.nearDistance;\n\tthis.farDistance = source.farDistance;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\treturn this;\n\n};\n\nvar vsm_frag = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include \\nvoid main() {\\n float mean = 0.0;\\n float squared_mean = 0.0;\\n\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy ) / resolution ) );\\n for ( float i = -1.0; i < 1.0 ; i += SAMPLE_RATE) {\\n #ifdef HORIZONAL_PASS\\n vec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( i, 0.0 ) * radius ) / resolution ) );\\n mean += distribution.x;\\n squared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n #else\\n float depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, i ) * radius ) / resolution ) );\\n mean += depth;\\n squared_mean += depth * depth;\\n #endif\\n }\\n mean = mean * HALF_SAMPLE_RATE;\\n squared_mean = squared_mean * HALF_SAMPLE_RATE;\\n float std_dev = sqrt( squared_mean - mean * mean );\\n gl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nvar vsm_vert = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, maxTextureSize ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterials = [],\n\t\t_distanceMaterials = [],\n\n\t\t_materialCache = {};\n\n\tconst shadowSide = { 0: BackSide, 1: FrontSide, 2: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\n\t\tdefines: {\n\t\t\tSAMPLE_RATE: 2.0 / 8.0,\n\t\t\tHALF_SAMPLE_RATE: 1.0 / 8.0\n\t\t},\n\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vsm_vert,\n\n\t\tfragmentShader: vsm_frag\n\n\t} );\n\n\tconst shadowMaterialHorizonal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizonal.defines.HORIZONAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t\"position\",\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > maxTextureSize || _shadowMapSize.y > maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null && ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat, stencilBuffer: false };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + \".shadowMap\";\n\n\t\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat, stencilBuffer: false };\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + \".shadowMap\";\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( ! shadow.isPointLightShadow && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizonal pass\n\n\t\tshadowMaterialHorizonal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizonal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizonal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizonal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterialVariant( useMorphing, useSkinning, useInstancing ) {\n\n\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\tlet material = _depthMaterials[ index ];\n\n\t\tif ( material === undefined ) {\n\n\t\t\tmaterial = new MeshDepthMaterial( {\n\n\t\t\t\tdepthPacking: RGBADepthPacking,\n\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning\n\n\t\t\t} );\n\n\t\t\t_depthMaterials[ index ] = material;\n\n\t\t}\n\n\t\treturn material;\n\n\t}\n\n\tfunction getDistanceMaterialVariant( useMorphing, useSkinning, useInstancing ) {\n\n\t\tconst index = useMorphing << 0 | useSkinning << 1 | useInstancing << 2;\n\n\t\tlet material = _distanceMaterials[ index ];\n\n\t\tif ( material === undefined ) {\n\n\t\t\tmaterial = new MeshDistanceMaterial( {\n\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning\n\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ index ] = material;\n\n\t\t}\n\n\t\treturn material;\n\n\t}\n\n\tfunction getDepthMaterial( object, geometry, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tlet getMaterialVariant = getDepthMaterialVariant;\n\t\tlet customMaterial = object.customDepthMaterial;\n\n\t\tif ( light.isPointLight === true ) {\n\n\t\t\tgetMaterialVariant = getDistanceMaterialVariant;\n\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t}\n\n\t\tif ( customMaterial === undefined ) {\n\n\t\t\tlet useMorphing = false;\n\n\t\t\tif ( material.morphTargets === true ) {\n\n\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t}\n\n\t\t\tlet useSkinning = false;\n\n\t\t\tif ( object.isSkinnedMesh === true ) {\n\n\t\t\t\tif ( material.skinning === true ) {\n\n\t\t\t\t\tuseSkinning = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst useInstancing = object.isInstancedMesh === true;\n\n\t\t\tresult = getMaterialVariant( useMorphing, useSkinning, useInstancing );\n\n\t\t} else {\n\n\t\t\tresult = customMaterial;\n\n\t\t}\n\n\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\tmaterial.clipShadows === true &&\n\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t// appropriate state\n\n\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t}\n\n\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult = cachedMaterial;\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, geometry, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef \t!== stencilRef \t||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = null;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( 35661 );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL\\ ES\\ ([0-9])/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst currentScissor = new Vector4();\n\tconst currentViewport = new Vector4();\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: 32774,\n\t\t[ SubtractEquation ]: 32778,\n\t\t[ ReverseSubtractEquation ]: 32779\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = 32775;\n\t\tequationToGL[ MaxEquation ] = 32776;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: 0,\n\t\t[ OneFactor ]: 1,\n\t\t[ SrcColorFactor ]: 768,\n\t\t[ SrcAlphaFactor ]: 770,\n\t\t[ SrcAlphaSaturateFactor ]: 776,\n\t\t[ DstColorFactor ]: 774,\n\t\t[ DstAlphaFactor ]: 772,\n\t\t[ OneMinusSrcColorFactor ]: 769,\n\t\t[ OneMinusSrcAlphaFactor ]: 771,\n\t\t[ OneMinusDstColorFactor ]: 775,\n\t\t[ OneMinusDstAlphaFactor ]: 773\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( ! currentBlendingEnabled ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 0, 769, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 769 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = null;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\tif ( currentTextureSlot === null ) {\n\n\t\t\tactiveTexture();\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlending = null;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( \"2d\" ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) :\n\t\t\tdocument.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? MathUtils.floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo( image ) {\n\n\t\treturn MathUtils.isPowerOfTwo( image.width ) && MathUtils.isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target, texture, width, height ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\t// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11\n\t\ttextureProperties.__maxMipLevel = Math.log( Math.max( width, height ) ) * Math.LOG2E;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 6407 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34837;\n\t\t\tif ( glType === 5131 ) internalFormat = 34843;\n\t\t\tif ( glType === 5121 ) internalFormat = 32849;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = 32856;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( renderTarget.texture );\n\n\t\tif ( ! renderTarget ) return;\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget.texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tinitTexture( textureProperties, texture );\n\n\t\t\tstate.activeTexture( 33984 + slot );\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\n\t\t\tconst isCompressed = ( texture && ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture ) );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tsupportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType );\n\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length;\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( 34067, texture, image.width, image.height );\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t} else {\n\n\t\t\tstate.activeTexture( 33984 + slot );\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\n\t\t}\n\n\t}\n\n\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( 34067, properties.get( texture ).__webglTexture );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: 10497,\n\t\t[ ClampToEdgeWrapping ]: 33071,\n\t\t[ MirroredRepeatWrapping ]: 33648\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: 9728,\n\t\t[ NearestMipmapNearestFilter ]: 9984,\n\t\t[ NearestMipmapLinearFilter ]: 9986,\n\n\t\t[ LinearFilter ]: 9729,\n\t\t[ LinearMipmapNearestFilter ]: 9985,\n\t\t[ LinearMipmapLinearFilter ]: 9987\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\tif ( extension ) {\n\n\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\tif ( texture.type === HalfFloatType && ( isWebGL2 || extensions.get( 'OES_texture_half_float_linear' ) ) === null ) return;\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = 3553;\n\n\t\tif ( texture.isDataTexture2DArray ) textureType = 35866;\n\t\tif ( texture.isDataTexture3D ) textureType = 32879;\n\n\t\tinitTexture( textureProperties, texture );\n\n\t\tstate.activeTexture( 33984 + slot );\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture );\n\n\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\n\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( texture.image ) === false;\n\t\tconst image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\n\t\tconst supportsMips = isPowerOfTwo( image ) || isWebGL2,\n\t\t\tglFormat = utils.convert( texture.format );\n\n\t\tlet glType = utils.convert( texture.type ),\n\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType );\n\n\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\tlet mipmap;\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t// populate depth texture with dummy data\n\n\t\t\tglInternalFormat = 6402;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\tglInternalFormat = 35056;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tglInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// validation checks for WebGL 1\n\n\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t} else if ( texture.isDataTexture2DArray ) {\n\n\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t} else if ( texture.isDataTexture3D ) {\n\n\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t} else {\n\n\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t// use manually created mipmaps if available\n\t\t\t// if there are no manual mipmaps\n\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttextureProperties.__maxMipLevel = mipmaps.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\t\t\t\ttextureProperties.__maxMipLevel = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tgenerateMipmap( textureType, texture, image.width, image.height );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( renderTarget.texture.format );\n\t\tconst glType = utils.convert( renderTarget.texture.type );\n\t\tconst glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );\n\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t_gl.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = 33189;\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst glFormat = utils.convert( renderTarget.texture.format );\n\t\t\tconst glType = utils.convert( renderTarget.texture.type );\n\t\t\tconst glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( renderTarget.texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\tinfo.memory.textures ++;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultisample = ( renderTarget.isWebGLMultisampleRenderTarget === true );\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\t// Handles WebGL2 RGBFormat fallback - #18858\n\n\t\tif ( isWebGL2 && renderTarget.texture.format === RGBFormat && ( renderTarget.texture.type === FloatType || renderTarget.texture.type === HalfFloatType ) ) {\n\n\t\t\trenderTarget.texture.format = RGBAFormat;\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.' );\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultisample ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer );\n\n\t\t\t\t\tconst glFormat = utils.convert( renderTarget.texture.format );\n\t\t\t\t\tconst glType = utils.convert( renderTarget.texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( renderTarget.texture.internalFormat, glFormat, glType );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer );\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, null );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, renderTarget.texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( 34067, null );\n\n\t\t} else {\n\n\t\t\tstate.bindTexture( 3553, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 3553, renderTarget.texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 36064, 3553 );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 3553, renderTarget.texture, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( 3553, null );\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\t\tconst supportsMips = isPowerOfTwo( renderTarget ) || isWebGL2;\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553;\n\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\tgenerateMipmap( target, texture, renderTarget.width, renderTarget.height );\n\t\t\tstate.bindTexture( target, null );\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.isWebGLMultisampleRenderTarget ) {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\t_gl.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t_gl.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = 16384;\n\n\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\t\t_gl.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer ); // see #18905\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn ( isWebGL2 && renderTarget.isWebGLMultisampleRenderTarget ) ?\n\t\t\tMath.min( maxSamples, renderTarget.samples ) : 0;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\t// backwards compatibility\n\n\tlet warnedTexture2D = false;\n\tlet warnedTextureCube = false;\n\n\tfunction safeSetTexture2D( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\tif ( warnedTexture2D === false ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\twarnedTexture2D = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\tsetTexture2D( texture, slot );\n\n\t}\n\n\tfunction safeSetTextureCube( texture, slot ) {\n\n\t\tif ( texture && texture.isWebGLCubeRenderTarget ) {\n\n\t\t\tif ( warnedTextureCube === false ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\twarnedTextureCube = true;\n\n\t\t\t}\n\n\t\t\ttexture = texture.texture;\n\n\t\t}\n\n\t\t// currently relying on the fact that WebGLCubeRenderTarget.texture is a Texture and NOT a CubeTexture\n\t\t// TODO: unify these code paths\n\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t// this function alone should take care of cube textures\n\t\t\tsetTextureCube( texture, slot );\n\n\t\t} else {\n\n\t\t\t// assumed: texture property of THREE.WebGLCubeRenderTarget\n\t\t\tsetTextureCubeDynamic( texture, slot );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\n\tthis.safeSetTexture2D = safeSetTexture2D;\n\tthis.safeSetTextureCube = safeSetTextureCube;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\t\tif ( p === UnsignedShort565Type ) return 33635;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBFormat ) return 6407;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\t\tif ( p === RedFormat ) return 6403;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedIntegerFormat ) return 36244;\n\t\tif ( p === RGFormat ) return 33319;\n\t\tif ( p === RGIntegerFormat ) return 33320;\n\t\tif ( p === RGBIntegerFormat ) return 36248;\n\t\tif ( p === RGBAIntegerFormat ) return 36249;\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_4x4_Format || p === SRGB8_ALPHA8_ASTC_5x4_Format || p === SRGB8_ALPHA8_ASTC_5x5_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_6x5_Format || p === SRGB8_ALPHA8_ASTC_6x6_Format || p === SRGB8_ALPHA8_ASTC_8x5_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_8x6_Format || p === SRGB8_ALPHA8_ASTC_8x8_Format || p === SRGB8_ALPHA8_ASTC_10x5_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_10x6_Format || p === SRGB8_ALPHA8_ASTC_10x8_Format || p === SRGB8_ALPHA8_ASTC_10x10_Format ||\n\t\t\tp === SRGB8_ALPHA8_ASTC_12x10_Format || p === SRGB8_ALPHA8_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\t// TODO Complete?\n\n\t\t\t\treturn p;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\t// TODO Complete?\n\n\t\t\t\treturn p;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nfunction ArrayCamera( array ) {\n\n\tPerspectiveCamera.call( this );\n\n\tthis.cameras = array || [];\n\n}\n\nArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {\n\n\tconstructor: ArrayCamera,\n\n\tisArrayCamera: true\n\n} );\n\nfunction Group() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Group';\n\n}\n\nGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Group,\n\n\tisGroup: true\n\n} );\n\nfunction WebXRController() {\n\n\tthis._targetRay = null;\n\tthis._grip = null;\n\tthis._hand = null;\n\n}\n\nObject.assign( WebXRController.prototype, {\n\n\tconstructor: WebXRController,\n\n\tgetHandSpace: function () {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = [];\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t\tif ( window.XRHand ) {\n\n\t\t\t\tfor ( let i = 0; i <= window.XRHand.LITTLE_PHALANX_TIP; i ++ ) {\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tlet joint = new Group();\n\t\t\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\t\t\tjoint.visible = false;\n\t\t\t\t\tthis._hand.joints.push( joint );\n\t\t\t\t\t// ??\n\t\t\t\t\tthis._hand.add( joint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t},\n\n\tgetTargetRaySpace: function () {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t},\n\n\tgetGripSpace: function () {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t},\n\n\tdispatchEvent: function ( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tdisconnect: function ( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tupdate: function ( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource ) {\n\n\t\t\tif ( inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( let i = 0; i <= window.XRHand.LITTLE_PHALANX_TIP; i ++ ) {\n\n\t\t\t\t\tif ( inputSource.hand[ i ] ) {\n\n\t\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\t\tlet jointPose = frame.getJointPose( inputSource.hand[ i ], referenceSpace );\n\t\t\t\t\t\tconst joint = hand.joints[ i ];\n\n\t\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t\t\t// Custom events\n\n\t\t\t\t\t\t// Check pinch\n\t\t\t\t\t\tconst indexTip = hand.joints[ window.XRHand.INDEX_PHALANX_TIP ];\n\t\t\t\t\t\tconst thumbTip = hand.joints[ window.XRHand.THUMB_PHALANX_TIP ];\n\t\t\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\t\t\ttype: \"pinchend\",\n\t\t\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\t\t\ttarget: this\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\t\t\ttype: \"pinchstart\",\n\t\t\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\t\t\ttarget: this\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction WebXRManager( renderer, gl ) {\n\n\tconst scope = this;\n\n\tlet session = null;\n\n\tlet framebufferScaleFactor = 1.0;\n\n\tlet referenceSpace = null;\n\tlet referenceSpaceType = 'local-floor';\n\n\tlet pose = null;\n\n\tconst controllers = [];\n\tconst inputSourcesMap = new Map();\n\n\t//\n\n\tconst cameraL = new PerspectiveCamera();\n\tcameraL.layers.enable( 1 );\n\tcameraL.viewport = new Vector4();\n\n\tconst cameraR = new PerspectiveCamera();\n\tcameraR.layers.enable( 2 );\n\tcameraR.viewport = new Vector4();\n\n\tconst cameras = [ cameraL, cameraR ];\n\n\tconst cameraVR = new ArrayCamera();\n\tcameraVR.layers.enable( 1 );\n\tcameraVR.layers.enable( 2 );\n\n\tlet _currentDepthNear = null;\n\tlet _currentDepthFar = null;\n\n\t//\n\n\tthis.enabled = false;\n\n\tthis.isPresenting = false;\n\n\tthis.getController = function ( index ) {\n\n\t\tlet controller = controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tcontrollers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller.getTargetRaySpace();\n\n\t};\n\n\tthis.getControllerGrip = function ( index ) {\n\n\t\tlet controller = controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tcontrollers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller.getGripSpace();\n\n\t};\n\n\tthis.getHand = function ( index ) {\n\n\t\tlet controller = controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tcontrollers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller.getHandSpace();\n\n\t};\n\n\t//\n\n\tfunction onSessionEvent( event ) {\n\n\t\tconst controller = inputSourcesMap.get( event.inputSource );\n\n\t\tif ( controller ) {\n\n\t\t\tcontroller.dispatchEvent( { type: event.type } );\n\n\t\t}\n\n\t}\n\n\tfunction onSessionEnd() {\n\n\t\tinputSourcesMap.forEach( function ( controller, inputSource ) {\n\n\t\t\tcontroller.disconnect( inputSource );\n\n\t\t} );\n\n\t\tinputSourcesMap.clear();\n\n\t\t//\n\n\t\trenderer.setFramebuffer( null );\n\t\trenderer.setRenderTarget( renderer.getRenderTarget() ); // Hack #15830\n\t\tanimation.stop();\n\n\t\tscope.isPresenting = false;\n\n\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t}\n\n\tfunction onRequestReferenceSpace( value ) {\n\n\t\treferenceSpace = value;\n\n\t\tanimation.setContext( session );\n\t\tanimation.start();\n\n\t\tscope.isPresenting = true;\n\n\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t}\n\n\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\tframebufferScaleFactor = value;\n\n\t\tif ( scope.isPresenting === true ) {\n\n\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t}\n\n\t};\n\n\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\treferenceSpaceType = value;\n\n\t\tif ( scope.isPresenting === true ) {\n\n\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t}\n\n\t};\n\n\tthis.getReferenceSpace = function () {\n\n\t\treturn referenceSpace;\n\n\t};\n\n\tthis.getSession = function () {\n\n\t\treturn session;\n\n\t};\n\n\tthis.setSession = function ( value ) {\n\n\t\tsession = value;\n\n\t\tif ( session !== null ) {\n\n\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\n\t\t\tconst attributes = gl.getContextAttributes();\n\n\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\tgl.makeXRCompatible();\n\n\t\t\t}\n\n\t\t\tconst layerInit = {\n\t\t\t\tantialias: attributes.antialias,\n\t\t\t\talpha: attributes.alpha,\n\t\t\t\tdepth: attributes.depth,\n\t\t\t\tstencil: attributes.stencil,\n\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t};\n\n\t\t\t// eslint-disable-next-line no-undef\n\t\t\tconst baseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\tsession.updateRenderState( { baseLayer: baseLayer } );\n\n\t\t\tsession.requestReferenceSpace( referenceSpaceType ).then( onRequestReferenceSpace );\n\n\t\t\t//\n\n\t\t\tsession.addEventListener( 'inputsourceschange', updateInputSources );\n\n\t\t}\n\n\t};\n\n\tfunction updateInputSources( event ) {\n\n\t\tconst inputSources = session.inputSources;\n\n\t\t// Assign inputSources to available controllers\n\n\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tinputSourcesMap.set( inputSources[ i ], controllers[ i ] );\n\n\t\t}\n\n\t\t// Notify disconnected\n\n\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\tconst inputSource = event.removed[ i ];\n\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\t\t\t\tinputSourcesMap.delete( inputSource );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Notify connected\n\n\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\tconst inputSource = event.added[ i ];\n\t\t\tconst controller = inputSourcesMap.get( inputSource );\n\n\t\t\tif ( controller ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t//\n\n\tconst cameraLPos = new Vector3();\n\tconst cameraRPos = new Vector3();\n\n\t/**\n\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t * the cameras' projection and world matrices have already been set.\n\t * And that near and far planes are identical for both cameras.\n\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t */\n\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t// VR systems will have identical far and near planes, and\n\t\t// most likely identical top and bottom frustum extents.\n\t\t// Use the left camera for these values.\n\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\tconst left = near * leftFov;\n\t\tconst right = near * rightFov;\n\n\t\t// Calculate the new camera's position offset from the\n\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t// TODO: Better way to apply this offset?\n\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\tcamera.translateX( xOffset );\n\t\tcamera.translateZ( zOffset );\n\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t\t// Find the union of the frustum values of the cameras and scale\n\t\t// the values so that the near plane's position does not change in world space,\n\t\t// although must now be relative to the new union camera.\n\t\tconst near2 = near + zOffset;\n\t\tconst far2 = far + zOffset;\n\t\tconst left2 = left - xOffset;\n\t\tconst right2 = right + ( ipd - xOffset );\n\t\tconst top2 = topFov * far / far2 * near2;\n\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t}\n\n\tfunction updateCamera( camera, parent ) {\n\n\t\tif ( parent === null ) {\n\n\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t} else {\n\n\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t}\n\n\t\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\t}\n\n\tthis.getCamera = function ( camera ) {\n\n\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\tsession.updateRenderState( {\n\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\tdepthFar: cameraVR.far\n\t\t\t} );\n\n\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t}\n\n\t\tconst parent = camera.parent;\n\t\tconst cameras = cameraVR.cameras;\n\n\t\tupdateCamera( cameraVR, parent );\n\n\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t}\n\n\t\t// update camera and its children\n\n\t\tcamera.matrixWorld.copy( cameraVR.matrixWorld );\n\n\t\tconst children = camera.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t}\n\n\t\t// update projection matrix for proper view frustum culling\n\n\t\tif ( cameras.length === 2 ) {\n\n\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t} else {\n\n\t\t\t// assume single camera setup (AR)\n\n\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t}\n\n\t\treturn cameraVR;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tpose = frame.getViewerPose( referenceSpace );\n\n\t\tif ( pose !== null ) {\n\n\t\t\tconst views = pose.views;\n\t\t\tconst baseLayer = session.renderState.baseLayer;\n\n\t\t\trenderer.setFramebuffer( baseLayer.framebuffer );\n\n\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\tconst view = views[ i ];\n\t\t\t\tconst viewport = baseLayer.getViewport( view );\n\n\t\t\t\tconst camera = cameras[ i ];\n\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst inputSources = session.inputSources;\n\n\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\tconst controller = controllers[ i ];\n\t\t\tconst inputSource = inputSources[ i ];\n\n\t\t\tcontroller.update( inputSource, frame, referenceSpace );\n\n\t\t}\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\n\t};\n\n\tthis.dispose = function () {};\n\n}\n\nObject.assign( WebXRManager.prototype, EventDispatcher.prototype );\n\nfunction WebGLMaterials( properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tuniforms.fogColor.value.copy( fog.color );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, environment, pixelRatio, height ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsLambert( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material, environment );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, environment );\n\n\t\t\t} else {\n\n\t\t\t\trefreshUniformsStandard( uniforms, material, environment );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDepth( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsNormal( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material, environment ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tconst envMap = material.envMap || environment;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = envMap.isCubeTexture ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\tvar maxMipLevel = properties.get( envMap ).__maxMipLevel;\n\n\t\t\tif ( maxMipLevel !== undefined ) {\n\n\t\t\t\tuniforms.maxMipLevel.value = maxMipLevel;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. normal map\n\t\t// 4. bump map\n\t\t// 5. alpha map\n\t\t// 6. emissive map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material, environment ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.envMap || environment ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, environment ) {\n\n\t\trefreshUniformsStandard( uniforms, material, environment );\n\n\t\tuniforms.reflectivity.value = material.reflectivity; // also part of uniforms common\n\n\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\t\tif ( material.sheen ) uniforms.sheen.value.copy( material.sheen );\n\n\t\tif ( material.clearcoatMap ) {\n\n\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.transmission.value = material.transmission;\n\n\t\tif ( material.transmissionMap ) {\n\n\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLRenderer( parameters ) {\n\n\tparameters = parameters || {};\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// morphs\n\n\tthis.maxMorphTargets = 8;\n\tthis.maxMorphNormals = 4;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _framebuffer = null;\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentFramebuffer = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\tlet _currentArrayCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tconst _clipping = new WebGLClipping();\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: _alpha,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\tif ( capabilities.isWebGL2 === false ) {\n\n\t\t\textensions.get( 'WEBGL_depth_texture' );\n\t\t\textensions.get( 'OES_texture_float' );\n\t\t\textensions.get( 'OES_texture_half_float' );\n\t\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\t\textensions.get( 'OES_standard_derivatives' );\n\t\t\textensions.get( 'OES_element_index_uint' );\n\t\t\textensions.get( 'OES_vertex_array_object' );\n\t\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t}\n\n\t\textensions.get( 'OES_texture_float_linear' );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t\tinfo = new WebGLInfo( _gl );\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl );\n\t\tprogramCache = new WebGLPrograms( _this, extensions, capabilities, bindingStates );\n\t\tmaterials = new WebGLMaterials( properties );\n\t\trenderLists = new WebGLRenderLists( properties );\n\t\trenderStates = new WebGLRenderStates();\n\n\t\tbackground = new WebGLBackground( _this, state, objects, _premultipliedAlpha );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// shadow map\n\n\tconst shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );\n\n\tthis.shadowMap = shadowMap;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getsize() now requires a Vector2 as an argument' );\n\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getdrawingBufferSize() now requires a Vector2 as an argument' );\n\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'WebGLRenderer: .getCurrentViewport() now requires a Vector4 as an argument' );\n\n\t\t\ttarget = new Vector4();\n\n\t\t}\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function () {\n\n\t\treturn background.getClearColor();\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color, depth, stencil ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color === undefined || color ) bits |= 16384;\n\t\tif ( depth === undefined || depth ) bits |= 256;\n\t\tif ( stencil === undefined || stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\n\t\txr.dispose();\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tinitGLContext();\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReference( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReference( material ) {\n\n\t\tconst programInfo = properties.get( material ).program;\n\n\t\tif ( programInfo !== undefined ) {\n\n\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tfunction renderObjectImmediate( object, program ) {\n\n\t\tobject.render( function ( object ) {\n\n\t\t\t_this.renderBufferImmediate( object, program );\n\n\t\t} );\n\n\t}\n\n\tthis.renderBufferImmediate = function ( object, program ) {\n\n\t\tbindingStates.initAttributes();\n\n\t\tconst buffers = properties.get( object );\n\n\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tif ( object.hasPositions ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.position );\n\t\t\t_gl.bufferData( 34962, object.positionArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.position );\n\t\t\t_gl.vertexAttribPointer( programAttributes.position, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasNormals ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.normal );\n\t\t\t_gl.bufferData( 34962, object.normalArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.normal );\n\t\t\t_gl.vertexAttribPointer( programAttributes.normal, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasUvs ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.uv );\n\t\t\t_gl.bufferData( 34962, object.uvArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.uv );\n\t\t\t_gl.vertexAttribPointer( programAttributes.uv, 2, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tif ( object.hasColors ) {\n\n\t\t\t_gl.bindBuffer( 34962, buffers.color );\n\t\t\t_gl.bufferData( 34962, object.colorArray, 35048 );\n\n\t\t\tbindingStates.enableAttribute( programAttributes.color );\n\t\t\t_gl.vertexAttribPointer( programAttributes.color, 3, 5126, false, 0, 0 );\n\n\t\t}\n\n\t\tbindingStates.disableUnusedAttributes();\n\n\t\t_gl.drawArrays( 4, 0, object.count );\n\n\t\tobject.count = 0;\n\n\t};\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\n\t\t//\n\n\t\tif ( index === null ) {\n\n\t\t\tif ( position === undefined || position.count === 0 ) return;\n\n\t\t} else if ( index.count === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tif ( material.morphTargets || material.morphNormals ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst dataCount = ( index !== null ) ? index.count : position.count;\n\n\t\tconst rangeStart = geometry.drawRange.start * rangeFactor;\n\t\tconst rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\tconst groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\tconst groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\tconst drawStart = Math.max( rangeStart, groupStart );\n\t\tconst drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\tconst drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 4 );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, geometry._maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tconst compiled = new WeakMap();\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tlet material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tlet material2 = material[ i ];\n\n\t\t\t\t\t\tif ( compiled.has( material2 ) === false ) {\n\n\t\t\t\t\t\t\tinitMaterial( material2, scene, object );\n\t\t\t\t\t\t\tcompiled.set( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( compiled.has( material ) === false ) {\n\n\t\t\t\t\tinitMaterial( material, scene, object );\n\t\t\t\t\tcompiled.set( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( xr.isPresenting ) return;\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof window !== 'undefined' ) animation.setContext( window );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tlet renderTarget, forceClear;\n\n\t\tif ( arguments[ 2 ] !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.render(): the renderTarget argument has been removed. Use .setRenderTarget() instead.' );\n\t\t\trenderTarget = arguments[ 2 ];\n\n\t\t}\n\n\t\tif ( arguments[ 3 ] !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.render(): the forceClear argument has been removed. Use .clear() instead.' );\n\t\t\tforceClear = arguments[ 3 ];\n\n\t\t}\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// reset caching for this frame\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\t// update scene graph\n\n\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tcamera = xr.getCamera( camera );\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, renderTarget || _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, camera );\n\t\tcurrentRenderState.init();\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\tcurrentRenderList = renderLists.get( scene, camera );\n\t\tcurrentRenderList.init();\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) _clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tcurrentRenderState.setupLights( camera );\n\n\t\tif ( _clippingEnabled === true ) _clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\tif ( renderTarget !== undefined ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene, camera, forceClear );\n\n\t\t// render scene\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t}\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t\t// _gl.finish();\n\n\t\tcurrentRenderList = null;\n\t\tcurrentRenderState = null;\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentRenderList.push( object, null, object.material, groupOrder, _vector3.z, null );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t_currentArrayCamera = camera;\n\n\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\tfor ( let j = 0, jl = cameras.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst camera2 = cameras[ j ];\n\n\t\t\t\t\tif ( object.layers.test( camera2.layers ) ) {\n\n\t\t\t\t\t\tstate.viewport( _currentViewport.copy( camera2.viewport ) );\n\n\t\t\t\t\t\tcurrentRenderState.setupLights( camera2 );\n\n\t\t\t\t\t\trenderObject( object, scene, camera2, geometry, material, group );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_currentArrayCamera = null;\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\tconst program = setProgram( camera, scene, material, object );\n\n\t\t\tstate.setMaterial( material );\n\n\t\t\tbindingStates.reset();\n\n\t\t\trenderObjectImmediate( object, program );\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\t\tcurrentRenderState = renderStates.get( scene, _currentArrayCamera || camera );\n\n\t}\n\n\tfunction initMaterial( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, _clipping.numPlanes, _clipping.numIntersection, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet program = materialProperties.program;\n\t\tlet programChange = true;\n\n\t\tif ( program === undefined ) {\n\n\t\t\t// new material\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t} else if ( program.cacheKey !== programCacheKey ) {\n\n\t\t\t// changed glsl or parameters\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t} else if ( materialProperties.lightsStateVersion !== lightsStateVersion ) {\n\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tprogramChange = false;\n\n\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t// same glsl and uniform list\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// only rebuild uniform list\n\t\t\tprogramChange = false;\n\n\t\t}\n\n\t\tif ( programChange ) {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material, parameters );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\n\t\t\tmaterialProperties.program = program;\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\t\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\n\t\t}\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tif ( material.morphTargets ) {\n\n\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\tfor ( let i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.morphNormals ) {\n\n\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\tfor ( let i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\tif ( programAttributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ! material.isShaderMaterial &&\n\t\t\t! material.isRawShaderMaterial ||\n\t\t\tmaterial.clipping === true ) {\n\n\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t}\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = materialProperties.program.getUniforms(),\n\t\t\tuniformsList =\n\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t}\n\n\tfunction setProgram( camera, scene, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : _currentRenderTarget.texture.encoding;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\t_clipping.setState(\n\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.environment !== environment ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tinitMaterial( material, scene, object );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tinitMaterial( material, scene, object );\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst program = materialProperties.program,\n\t\t\tp_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t// otherwise textures used for skinning can take over texture units reserved for other material textures\n\n\t\tif ( material.skinning ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tconst bones = skeleton.bones;\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === undefined ) {\n\n\t\t\t\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t\t\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t\t\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t\t\t\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t\t\t\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t\t\t\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\t\t\t\tlet size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\t\t\t\tsize = MathUtils.ceilPowerOfTwo( size );\n\t\t\t\t\t\tsize = Math.max( size, 4 );\n\n\t\t\t\t\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\t\t\t\t\tboneMatrices.set( skeleton.boneMatrices ); // copy current values\n\n\t\t\t\t\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\n\t\t\t\t\t\tskeleton.boneMatrices = boneMatrices;\n\t\t\t\t\t\tskeleton.boneTexture = boneTexture;\n\t\t\t\t\t\tskeleton.boneTextureSize = size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, environment, _pixelRatio, _height );\n\n\t\t\t// RectAreaLight Texture\n\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\tif ( m_uniforms.ltc_1 !== undefined ) m_uniforms.ltc_1.value = UniformsLib.LTC_1;\n\t\t\tif ( m_uniforms.ltc_2 !== undefined ) m_uniforms.ltc_2.value = UniformsLib.LTC_2;\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\t//\n\tthis.setFramebuffer = function ( value ) {\n\n\t\tif ( _framebuffer !== value && _currentRenderTarget === null ) _gl.bindFramebuffer( 36160, value );\n\n\t\t_framebuffer = value;\n\n\t};\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace, activeMipmapLevel ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t}\n\n\t\tlet framebuffer = _framebuffer;\n\t\tlet isCube = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace || 0 ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( renderTarget.isWebGLMultisampleRenderTarget ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + ( activeCubeFace || 0 ), textureProperties.__webglTexture, activeMipmapLevel || 0 );\n\n\t\t}\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tlet restore = false;\n\n\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t\trestore = true;\n\n\t\t\t}\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! ( textureType === HalfFloatType && ( capabilities.isWebGL2 ? extensions.get( 'EXT_color_buffer_float' ) : extensions.get( 'EXT_color_buffer_half_float' ) ) ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _gl.checkFramebufferStatus( 36160 ) === 36053 ) {\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( 36160, _currentFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level ) {\n\n\t\tif ( level === undefined ) level = 0;\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\t\tconst glFormat = utils.convert( texture.format );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexImage2D( 3553, level, glFormat, position.x, position.y, width, height, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level ) {\n\n\t\tif ( level === undefined ) level = 0;\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) ); // eslint-disable-line no-undef\n\n\t}\n\n}\n\nfunction WebGL1Renderer( parameters ) {\n\n\tWebGLRenderer.call( this, parameters );\n\n}\n\nWebGL1Renderer.prototype = Object.assign( Object.create( WebGLRenderer.prototype ), {\n\n\tconstructor: WebGL1Renderer,\n\n\tisWebGL1Renderer: true\n\n} );\n\nfunction FogExp2( color, density ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n}\n\nObject.assign( FogExp2.prototype, {\n\n\tisFogExp2: true,\n\n\tclone: function () {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t},\n\n\ttoJSON: function ( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n} );\n\nfunction Fog( color, near, far ) {\n\n\tthis.name = '';\n\n\tthis.color = new Color( color );\n\n\tthis.near = ( near !== undefined ) ? near : 1;\n\tthis.far = ( far !== undefined ) ? far : 1000;\n\n}\n\nObject.assign( Fog.prototype, {\n\n\tisFog: true,\n\n\tclone: function () {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t},\n\n\ttoJSON: function ( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n} );\n\nfunction InterleavedBuffer( array, stride ) {\n\n\tthis.array = array;\n\tthis.stride = stride;\n\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\tthis.usage = StaticDrawUsage;\n\tthis.updateRange = { offset: 0, count: - 1 };\n\n\tthis.version = 0;\n\n\tthis.uuid = MathUtils.generateUUID();\n\n}\n\nObject.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {\n\n\tset: function ( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\n\tisInterleavedBuffer: true,\n\n\tonUploadCallback: function () {},\n\n\tsetUsage: function ( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t},\n\n\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tset: function ( value, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function ( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = MathUtils.generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new InterleavedBuffer( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t},\n\n\tonUpload: function ( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = MathUtils.generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.prototype.slice.call( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n} );\n\nconst _vector$6 = new Vector3();\n\nfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\tthis.name = '';\n\n\tthis.data = interleavedBuffer;\n\tthis.itemSize = itemSize;\n\tthis.offset = offset;\n\n\tthis.normalized = normalized === true;\n\n}\n\nObject.defineProperties( InterleavedBufferAttribute.prototype, {\n\n\tcount: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.count;\n\n\t\t}\n\n\t},\n\n\tarray: {\n\n\t\tget: function () {\n\n\t\t\treturn this.data.array;\n\n\t\t}\n\n\t},\n\n\tneedsUpdate: {\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.data.needsUpdate = value;\n\n\t\t}\n\n\t}\n\n} );\n\nObject.assign( InterleavedBufferAttribute.prototype, {\n\n\tisInterleavedBufferAttribute: true,\n\n\tapplyMatrix4: function ( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.x = this.getX( i );\n\t\t\t_vector$6.y = this.getY( i );\n\t\t\t_vector$6.z = this.getZ( i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetX: function ( index, x ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t},\n\n\tsetY: function ( index, y ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetZ: function ( index, z ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetW: function ( index, w ) {\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tgetX: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t},\n\n\tgetY: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t},\n\n\tgetZ: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t},\n\n\tgetW: function ( index ) {\n\n\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t},\n\n\tsetXY: function ( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZ: function ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t},\n\n\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function ( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// deinterleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interlaved attribtue\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * map: new THREE.Texture( ),\n * alphaMap: new THREE.Texture( ),\n * rotation: ,\n * sizeAttenuation: \n * }\n */\n\nfunction SpriteMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'SpriteMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.rotation = 0;\n\n\tthis.sizeAttenuation = true;\n\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nSpriteMaterial.prototype = Object.create( Material.prototype );\nSpriteMaterial.prototype.constructor = SpriteMaterial;\nSpriteMaterial.prototype.isSpriteMaterial = true;\n\nSpriteMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.rotation = source.rotation;\n\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\treturn this;\n\n};\n\nlet _geometry;\n\nconst _intersectPoint = new Vector3();\nconst _worldScale = new Vector3();\nconst _mvPosition = new Vector3();\n\nconst _alignedPosition = new Vector2();\nconst _rotatedPosition = new Vector2();\nconst _viewWorldMatrix = new Matrix4();\n\nconst _vA$1 = new Vector3();\nconst _vB$1 = new Vector3();\nconst _vC$1 = new Vector3();\n\nconst _uvA$1 = new Vector2();\nconst _uvB$1 = new Vector2();\nconst _uvC$1 = new Vector2();\n\nfunction Sprite( material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Sprite';\n\n\tif ( _geometry === undefined ) {\n\n\t\t_geometry = new BufferGeometry();\n\n\t\tconst float32Array = new Float32Array( [\n\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t] );\n\n\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t}\n\n\tthis.geometry = _geometry;\n\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\tthis.center = new Vector2( 0.5, 0.5 );\n\n}\n\nSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Sprite,\n\n\tisSprite: true,\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA$1.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB$1.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC$1.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA$1.set( 0, 0 );\n\t\t_uvB$1.set( 1, 0 );\n\t\t_uvC$1.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA$1, _vB$1, _vC$1, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB$1.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB$1.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA$1, _vC$1, _vB$1, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getUV( _intersectPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$4 = new Vector3();\nconst _v2$2 = new Vector3();\n\nfunction LOD() {\n\n\tObject3D.call( this );\n\n\tthis._currentLevel = 0;\n\n\tthis.type = 'LOD';\n\n\tObject.defineProperties( this, {\n\t\tlevels: {\n\t\t\tenumerable: true,\n\t\t\tvalue: []\n\t\t}\n\t} );\n\n\tthis.autoUpdate = true;\n\n}\n\nLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: LOD,\n\n\tisLOD: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t},\n\n\taddLevel: function ( object, distance ) {\n\n\t\tif ( distance === undefined ) distance = 0;\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t},\n\n\tgetCurrentLevel: function () {\n\n\t\treturn this._currentLevel;\n\n\t},\n\n\tgetObjectForDistance: function ( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$4.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$4 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t},\n\n\tupdate: function ( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$4.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$4.distanceTo( _v2$2 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction SkinnedMesh( geometry, material ) {\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\tconsole.error( 'THREE.SkinnedMesh no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t}\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'SkinnedMesh';\n\n\tthis.bindMode = 'attached';\n\tthis.bindMatrix = new Matrix4();\n\tthis.bindMatrixInverse = new Matrix4();\n\n}\n\nSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: SkinnedMesh,\n\n\tisSkinnedMesh: true,\n\n\tcopy: function ( source ) {\n\n\t\tMesh.prototype.copy.call( this, source );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\n\t},\n\n\tbind: function ( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t},\n\n\tpose: function () {\n\n\t\tthis.skeleton.pose();\n\n\t},\n\n\tnormalizeSkinWeights: function () {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.x = skinWeight.getX( i );\n\t\t\tvector.y = skinWeight.getY( i );\n\t\t\tvector.z = skinWeight.getZ( i );\n\t\t\tvector.w = skinWeight.getW( i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tMesh.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t},\n\n\tboneTransform: ( function () {\n\n\t\tconst basePosition = new Vector3();\n\n\t\tconst skinIndex = new Vector4();\n\t\tconst skinWeight = new Vector4();\n\n\t\tconst vector = new Vector3();\n\t\tconst matrix = new Matrix4();\n\n\t\treturn function ( index, target ) {\n\n\t\t\tconst skeleton = this.skeleton;\n\t\t\tconst geometry = this.geometry;\n\n\t\t\tskinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t\tskinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t\tbasePosition.fromBufferAttribute( geometry.attributes.position, index ).applyMatrix4( this.bindMatrix );\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\t\tconst weight = skinWeight.getComponent( i );\n\n\t\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\t\tconst boneIndex = skinIndex.getComponent( i );\n\n\t\t\t\t\tmatrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\t\ttarget.addScaledVector( vector.copy( basePosition ).applyMatrix4( matrix ), weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t\t};\n\n\t}() )\n\n} );\n\nconst _offsetMatrix = new Matrix4();\nconst _identityMatrix = new Matrix4();\n\nfunction Skeleton( bones, boneInverses ) {\n\n\t// copy the bone array\n\n\tbones = bones || [];\n\n\tthis.bones = bones.slice( 0 );\n\tthis.boneMatrices = new Float32Array( this.bones.length * 16 );\n\n\tthis.frame = - 1;\n\n\t// use the supplied bone inverses or calculate the inverses\n\n\tif ( boneInverses === undefined ) {\n\n\t\tthis.calculateInverses();\n\n\t} else {\n\n\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Skeleton boneInverses is the wrong length.' );\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Skeleton.prototype, {\n\n\tcalculateInverses: function () {\n\n\t\tthis.boneInverses = [];\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.getInverse( this.bones[ i ].matrixWorld );\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t},\n\n\tpose: function () {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdate: function () {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== undefined ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t},\n\n\tgetBoneByName: function ( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t},\n\n\tdispose: function ( ) {\n\n\t\tif ( this.boneTexture ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = undefined;\n\n\t\t}\n\n\t}\n\n} );\n\nfunction Bone() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Bone';\n\n}\n\nBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Bone,\n\n\tisBone: true\n\n} );\n\nconst _instanceLocalMatrix = new Matrix4();\nconst _instanceWorldMatrix = new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _mesh = new Mesh();\n\nfunction InstancedMesh( geometry, material, count ) {\n\n\tMesh.call( this, geometry, material );\n\n\tthis.instanceMatrix = new BufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\tthis.count = count;\n\n\tthis.frustumCulled = false;\n\n}\n\nInstancedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\tconstructor: InstancedMesh,\n\n\tisInstancedMesh: true,\n\n\tcopy: function ( source ) {\n\n\t\tMesh.prototype.copy.call( this, source );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\t\tthis.count = source.count;\n\n\t\treturn this;\n\n\t},\n\n\tgetMatrixAt: function ( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t},\n\n\tsetMatrixAt: function ( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t}\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n * linecap: \"round\",\n * linejoin: \"round\"\n * }\n */\n\nfunction LineBasicMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'LineBasicMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.linewidth = 1;\n\tthis.linecap = 'round';\n\tthis.linejoin = 'round';\n\n\tthis.morphTargets = false;\n\n\tthis.setValues( parameters );\n\n}\n\nLineBasicMaterial.prototype = Object.create( Material.prototype );\nLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\nLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\nLineBasicMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.linewidth = source.linewidth;\n\tthis.linecap = source.linecap;\n\tthis.linejoin = source.linejoin;\n\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\nconst _start = new Vector3();\nconst _end = new Vector3();\nconst _inverseMatrix$1 = new Matrix4();\nconst _ray$1 = new Ray();\nconst _sphere$2 = new Sphere();\n\nfunction Line( geometry, material, mode ) {\n\n\tif ( mode === 1 ) {\n\n\t\tconsole.error( 'THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.' );\n\n\t}\n\n\tObject3D.call( this );\n\n\tthis.type = 'Line';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new LineBasicMaterial();\n\n\tthis.updateMorphTargets();\n\n}\n\nLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Line,\n\n\tisLine: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t},\n\n\tcomputeLineDistances: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t_start.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t\t_end.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i ] += _start.distanceTo( _end );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst lineDistances = geometry.lineDistances;\n\n\t\t\tlineDistances[ 0 ] = 0;\n\n\t\t\tfor ( let i = 1, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += vertices[ i - 1 ].distanceTo( vertices[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$2.copy( geometry.boundingSphere );\n\t\t_sphere$2.applyMatrix4( matrixWorld );\n\t\t_sphere$2.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$2 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.getInverse( matrixWorld );\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = ( this && this.isLineSegments ) ? 2 : 1;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positions = attributes.position.array;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst indices = index.array;\n\n\t\t\t\tfor ( let i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\tconst a = indices[ i ];\n\t\t\t\t\tconst b = indices[ i + 1 ];\n\n\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tface: null,\n\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst nbVertices = vertices.length;\n\n\t\t\tfor ( let i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nconst _start$1 = new Vector3();\nconst _end$1 = new Vector3();\n\nfunction LineSegments( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineSegments';\n\n}\n\nLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineSegments,\n\n\tisLineSegments: true,\n\n\tcomputeLineDistances: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t// we assume non-indexed geometry\n\n\t\t\tif ( geometry.index === null ) {\n\n\t\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\t\tconst lineDistances = [];\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t\t}\n\n\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\tconst vertices = geometry.vertices;\n\t\t\tconst lineDistances = geometry.lineDistances;\n\n\t\t\tfor ( let i = 0, l = vertices.length; i < l; i += 2 ) {\n\n\t\t\t\t_start$1.copy( vertices[ i ] );\n\t\t\t\t_end$1.copy( vertices[ i + 1 ] );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start$1.distanceTo( _end$1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction LineLoop( geometry, material ) {\n\n\tLine.call( this, geometry, material );\n\n\tthis.type = 'LineLoop';\n\n}\n\nLineLoop.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\tconstructor: LineLoop,\n\n\tisLineLoop: true,\n\n} );\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n * map: new THREE.Texture( ),\n * alphaMap: new THREE.Texture( ),\n *\n * size: ,\n * sizeAttenuation: \n *\n * morphTargets: \n * }\n */\n\nfunction PointsMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'PointsMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\n\tthis.alphaMap = null;\n\n\tthis.size = 1;\n\tthis.sizeAttenuation = true;\n\n\tthis.morphTargets = false;\n\n\tthis.setValues( parameters );\n\n}\n\nPointsMaterial.prototype = Object.create( Material.prototype );\nPointsMaterial.prototype.constructor = PointsMaterial;\n\nPointsMaterial.prototype.isPointsMaterial = true;\n\nPointsMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.size = source.size;\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\tthis.morphTargets = source.morphTargets;\n\n\treturn this;\n\n};\n\nconst _inverseMatrix$2 = new Matrix4();\nconst _ray$2 = new Ray();\nconst _sphere$3 = new Sphere();\nconst _position$1 = new Vector3();\n\nfunction Points( geometry, material ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Points';\n\n\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\tthis.material = material !== undefined ? material : new PointsMaterial();\n\n\tthis.updateMorphTargets();\n\n}\n\nPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Points,\n\n\tisPoints: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t},\n\n\traycast: function ( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$3.copy( geometry.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\t\t_sphere$3.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$2.getInverse( matrixWorld );\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst attributes = geometry.attributes;\n\t\t\tconst positions = attributes.position.array;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tconst indices = index.array;\n\n\t\t\t\tfor ( let i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst a = indices[ i ];\n\n\t\t\t\t\t_position$1.fromArray( positions, a * 3 );\n\n\t\t\t\t\ttestPoint( _position$1, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t_position$1.fromArray( positions, i * 3 );\n\n\t\t\t\t\ttestPoint( _position$1, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst vertices = geometry.vertices;\n\n\t\t\tfor ( let i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\ttestPoint( vertices[ i ], i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\tupdateMorphTargets: function () {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\t\t\tconst keys = Object.keys( morphAttributes );\n\n\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst morphTargets = geometry.morphTargets;\n\n\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n} );\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray$2.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray$2.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.format = format !== undefined ? format : RGBFormat;\n\n\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\tthis.generateMipmaps = false;\n\n\tconst scope = this;\n\n\tfunction updateVideo() {\n\n\t\tscope.needsUpdate = true;\n\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t}\n\n\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t}\n\n}\n\nVideoTexture.prototype = Object.assign( Object.create( Texture.prototype ), {\n\n\tconstructor: VideoTexture,\n\n\tisVideoTexture: true,\n\n\tupdate: function () {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n} );\n\nfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\tthis.image = { width: width, height: height };\n\tthis.mipmaps = mipmaps;\n\n\t// no flipping for cube textures\n\t// (also flipping doesn't work for compressed textures )\n\n\tthis.flipY = false;\n\n\t// can't generate mipmaps for compressed textures\n\t// mips must be embedded in DDS files\n\n\tthis.generateMipmaps = false;\n\n}\n\nCompressedTexture.prototype = Object.create( Texture.prototype );\nCompressedTexture.prototype.constructor = CompressedTexture;\n\nCompressedTexture.prototype.isCompressedTexture = true;\n\nfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.needsUpdate = true;\n\n}\n\nCanvasTexture.prototype = Object.create( Texture.prototype );\nCanvasTexture.prototype.constructor = CanvasTexture;\nCanvasTexture.prototype.isCanvasTexture = true;\n\nfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\tformat = format !== undefined ? format : DepthFormat;\n\n\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t}\n\n\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\tthis.image = { width: width, height: height };\n\n\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\tthis.flipY = false;\n\tthis.generateMipmaps\t= false;\n\n}\n\nDepthTexture.prototype = Object.create( Texture.prototype );\nDepthTexture.prototype.constructor = DepthTexture;\nDepthTexture.prototype.isDepthTexture = true;\n\nfunction WireframeGeometry( geometry ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'WireframeGeometry';\n\n\t// buffer\n\n\tconst vertices = [];\n\n\t// helper variables\n\n\tconst edge = [ 0, 0 ], edges = {};\n\tconst keys = [ 'a', 'b', 'c' ];\n\n\t// different logic for Geometry and BufferGeometry\n\n\tif ( geometry && geometry.isGeometry ) {\n\n\t\t// create a data structure that contains all edges without duplicates\n\n\t\tconst faces = geometry.faces;\n\n\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tconst edge1 = face[ keys[ j ] ];\n\t\t\t\tconst edge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\tconst key = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( const key in edges ) {\n\n\t\t\tconst e = edges[ key ];\n\n\t\t\tlet vertex = geometry.vertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\tlet vertex = new Vector3();\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\t// indexed BufferGeometry\n\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tconst indices = geometry.index;\n\t\t\tlet groups = geometry.groups;\n\n\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t}\n\n\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\tconst start = group.start;\n\t\t\t\tconst count = group.count;\n\n\t\t\t\tfor ( let i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\tconst edge1 = indices.getX( i + j );\n\t\t\t\t\t\tconst edge2 = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\t\tconst key = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( const key in edges ) {\n\n\t\t\t\tconst e = edges[ key ];\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// non-indexed BufferGeometry\n\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\nWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n/**\n * Parametric Surfaces Geometry\n * based on the brilliant article by @prideout https://prideout.net/blog/old/blog/index.html@p=44.html\n */\n\n// ParametricGeometry\n\nfunction ParametricGeometry( func, slices, stacks ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ParametricGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\tthis.mergeVertices();\n\n}\n\nParametricGeometry.prototype = Object.create( Geometry.prototype );\nParametricGeometry.prototype.constructor = ParametricGeometry;\n\n// ParametricBufferGeometry\n\nfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ParametricBufferGeometry';\n\n\tthis.parameters = {\n\t\tfunc: func,\n\t\tslices: slices,\n\t\tstacks: stacks\n\t};\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\tconst EPS = 0.00001;\n\n\tconst normal = new Vector3();\n\n\tconst p0 = new Vector3(), p1 = new Vector3();\n\tconst pu = new Vector3(), pv = new Vector3();\n\n\tif ( func.length < 3 ) {\n\n\t\tconsole.error( 'THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.' );\n\n\t}\n\n\t// generate vertices, normals and uvs\n\n\tconst sliceCount = slices + 1;\n\n\tfor ( let i = 0; i <= stacks; i ++ ) {\n\n\t\tconst v = i / stacks;\n\n\t\tfor ( let j = 0; j <= slices; j ++ ) {\n\n\t\t\tconst u = j / slices;\n\n\t\t\t// vertex\n\n\t\t\tfunc( u, v, p0 );\n\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t// normal\n\n\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\tfunc( u - EPS, v, p1 );\n\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u + EPS, v, p1 );\n\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\tfunc( u, v - EPS, p1 );\n\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t} else {\n\n\t\t\t\tfunc( u, v + EPS, p1 );\n\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t}\n\n\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u, v );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( let i = 0; i < stacks; i ++ ) {\n\n\t\tfor ( let j = 0; j < slices; j ++ ) {\n\n\t\t\tconst a = i * sliceCount + j;\n\t\t\tconst b = i * sliceCount + j + 1;\n\t\t\tconst c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\tconst d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t// faces one and two\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n// PolyhedronGeometry\n\nfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'PolyhedronGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\nPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n// PolyhedronBufferGeometry\n\nfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'PolyhedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tvertices: vertices,\n\t\tindices: indices,\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tradius = radius || 1;\n\tdetail = detail || 0;\n\n\t// default buffer data\n\n\tconst vertexBuffer = [];\n\tconst uvBuffer = [];\n\n\t// the subdivision creates the vertex buffer data\n\n\tsubdivide( detail );\n\n\t// all vertices should lie on a conceptual sphere with a given radius\n\n\tapplyRadius( radius );\n\n\t// finally, create the uv data\n\n\tgenerateUVs();\n\n\t// build non-indexed geometry\n\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\tif ( detail === 0 ) {\n\n\t\tthis.computeVertexNormals(); // flat normals\n\n\t} else {\n\n\t\tthis.normalizeNormals(); // smooth normals\n\n\t}\n\n\t// helper functions\n\n\tfunction subdivide( detail ) {\n\n\t\tconst a = new Vector3();\n\t\tconst b = new Vector3();\n\t\tconst c = new Vector3();\n\n\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t// get the vertices of the face\n\n\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t// perform subdivision\n\n\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t}\n\n\t}\n\n\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\tconst cols = Math.pow( 2, detail );\n\n\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\tconst v = [];\n\n\t\t// construct all of the vertices for this subdivision\n\n\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\tv[ i ] = [];\n\n\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\tconst rows = cols - i;\n\n\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// construct all of the faces\n\n\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction applyRadius( radius ) {\n\n\t\tconst vertex = new Vector3();\n\n\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tconst vertex = new Vector3();\n\n\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t}\n\n\t\tcorrectUVs();\n\n\t\tcorrectSeam();\n\n\t}\n\n\tfunction correctSeam() {\n\n\t\t// handle case when face straddles the seam, see #3269\n\n\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t// uv data of a single face\n\n\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction pushVertex( vertex ) {\n\n\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t}\n\n\tfunction getVertexByIndex( index, vertex ) {\n\n\t\tconst stride = index * 3;\n\n\t\tvertex.x = vertices[ stride + 0 ];\n\t\tvertex.y = vertices[ stride + 1 ];\n\t\tvertex.z = vertices[ stride + 2 ];\n\n\t}\n\n\tfunction correctUVs() {\n\n\t\tconst a = new Vector3();\n\t\tconst b = new Vector3();\n\t\tconst c = new Vector3();\n\n\t\tconst centroid = new Vector3();\n\n\t\tconst uvA = new Vector2();\n\t\tconst uvB = new Vector2();\n\t\tconst uvC = new Vector2();\n\n\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\tconst azi = azimuth( centroid );\n\n\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t}\n\n\t}\n\n\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t}\n\n\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t}\n\n\t}\n\n\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\tfunction azimuth( vector ) {\n\n\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t}\n\n\n\t// Angle above the XZ plane.\n\n\tfunction inclination( vector ) {\n\n\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t}\n\n}\n\nPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n// TetrahedronGeometry\n\nfunction TetrahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TetrahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\nTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n// TetrahedronBufferGeometry\n\nfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\tconst vertices = [\n\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t];\n\n\tconst indices = [\n\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'TetrahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n// OctahedronGeometry\n\nfunction OctahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'OctahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nOctahedronGeometry.prototype = Object.create( Geometry.prototype );\nOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n// OctahedronBufferGeometry\n\nfunction OctahedronBufferGeometry( radius, detail ) {\n\n\tconst vertices = [\n\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t];\n\n\tconst indices = [\n\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t1, 3, 4,\t1, 4, 2\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'OctahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n// IcosahedronGeometry\n\nfunction IcosahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'IcosahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\nIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n// IcosahedronBufferGeometry\n\nfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\tconst vertices = [\n\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t 0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t t, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t];\n\n\tconst indices = [\n\t\t 0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t 1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t 3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t 4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'IcosahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n// DodecahedronGeometry\n\nfunction DodecahedronGeometry( radius, detail ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'DodecahedronGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\tthis.mergeVertices();\n\n}\n\nDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\nDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n// DodecahedronBufferGeometry\n\nfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\tconst r = 1 / t;\n\n\tconst vertices = [\n\n\t\t// (±1, ±1, ±1)\n\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t// (0, ±1/φ, ±φ)\n\t\t 0, - r, - t, 0, - r, t,\n\t\t 0, r, - t, 0, r, t,\n\n\t\t// (±1/φ, ±φ, 0)\n\t\t- r, - t, 0, - r, t, 0,\n\t\t r, - t, 0, r, t, 0,\n\n\t\t// (±φ, 0, ±1/φ)\n\t\t- t, 0, - r, t, 0, - r,\n\t\t- t, 0, r, t, 0, r\n\t];\n\n\tconst indices = [\n\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t];\n\n\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\tthis.type = 'DodecahedronBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tdetail: detail\n\t};\n\n}\n\nDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\nDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n// TubeGeometry\n\nfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TubeGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\tconst bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = bufferGeometry.tangents;\n\tthis.normals = bufferGeometry.normals;\n\tthis.binormals = bufferGeometry.binormals;\n\n\t// create geometry\n\n\tthis.fromBufferGeometry( bufferGeometry );\n\tthis.mergeVertices();\n\n}\n\nTubeGeometry.prototype = Object.create( Geometry.prototype );\nTubeGeometry.prototype.constructor = TubeGeometry;\n\n// TubeBufferGeometry\n\nfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TubeBufferGeometry';\n\n\tthis.parameters = {\n\t\tpath: path,\n\t\ttubularSegments: tubularSegments,\n\t\tradius: radius,\n\t\tradialSegments: radialSegments,\n\t\tclosed: closed\n\t};\n\n\ttubularSegments = tubularSegments || 64;\n\tradius = radius || 1;\n\tradialSegments = radialSegments || 8;\n\tclosed = closed || false;\n\n\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t// expose internals\n\n\tthis.tangents = frames.tangents;\n\tthis.normals = frames.normals;\n\tthis.binormals = frames.binormals;\n\n\t// helper variables\n\n\tconst vertex = new Vector3();\n\tconst normal = new Vector3();\n\tconst uv = new Vector2();\n\tlet P = new Vector3();\n\n\t// buffer\n\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\tconst indices = [];\n\n\t// create buffer data\n\n\tgenerateBufferData();\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// functions\n\n\tfunction generateBufferData() {\n\n\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\tgenerateSegment( i );\n\n\t\t}\n\n\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t// at the regular position on the given path\n\t\t//\n\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t// uvs are generated in a separate function.\n\t\t// this makes it easy compute correct values for closed geometries\n\n\t\tgenerateUVs();\n\n\t\t// finally create faces\n\n\t\tgenerateIndices();\n\n\t}\n\n\tfunction generateSegment( i ) {\n\n\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t// retrieve corresponding normal and binormal\n\n\t\tconst N = frames.normals[ i ];\n\t\tconst B = frames.binormals[ i ];\n\n\t\t// generate normals and vertices for the current segment\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\tconst sin = Math.sin( v );\n\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t// normal\n\n\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\tnormal.normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\tfunction generateIndices() {\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction generateUVs() {\n\n\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\nTubeBufferGeometry.prototype.toJSON = function () {\n\n\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\tdata.path = this.parameters.path.toJSON();\n\n\treturn data;\n\n};\n\n// TorusKnotGeometry\n\nfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusKnotGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\tthis.mergeVertices();\n\n}\n\nTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\nTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n// TorusKnotBufferGeometry\n\nfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusKnotBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\ttubularSegments: tubularSegments,\n\t\tradialSegments: radialSegments,\n\t\tp: p,\n\t\tq: q\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\tp = p || 2;\n\tq = q || 3;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// helper variables\n\n\tconst vertex = new Vector3();\n\tconst normal = new Vector3();\n\n\tconst P1 = new Vector3();\n\tconst P2 = new Vector3();\n\n\tconst B = new Vector3();\n\tconst T = new Vector3();\n\tconst N = new Vector3();\n\n\t// generate vertices, normals and uvs\n\n\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t// calculate orthonormal basis\n\n\t\tT.subVectors( P2, P1 );\n\t\tN.addVectors( P2, P1 );\n\t\tB.crossVectors( T, N );\n\t\tN.crossVectors( B, T );\n\n\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\tB.normalize();\n\t\tN.normalize();\n\n\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t// now calculate the final vertex position.\n\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// this function calculates the current position on the torus curve\n\n\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\tconst cu = Math.cos( u );\n\t\tconst su = Math.sin( u );\n\t\tconst quOverP = q / p * u;\n\t\tconst cs = Math.cos( quOverP );\n\n\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t}\n\n}\n\nTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n// TorusGeometry\n\nfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TorusGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\tthis.mergeVertices();\n\n}\n\nTorusGeometry.prototype = Object.create( Geometry.prototype );\nTorusGeometry.prototype.constructor = TorusGeometry;\n\n// TorusBufferGeometry\n\nfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'TorusBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\ttube: tube,\n\t\tradialSegments: radialSegments,\n\t\ttubularSegments: tubularSegments,\n\t\tarc: arc\n\t};\n\n\tradius = radius || 1;\n\ttube = tube || 0.4;\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\tarc = arc || Math.PI * 2;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// helper variables\n\n\tconst center = new Vector3();\n\tconst vertex = new Vector3();\n\tconst normal = new Vector3();\n\n\t// generate vertices, normals and uvs\n\n\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\tconst u = i / tubularSegments * arc;\n\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( i / tubularSegments );\n\t\t\tuvs.push( j / radialSegments );\n\n\t\t}\n\n\t}\n\n\t// generate indices\n\n\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t// indices\n\n\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.2)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim ) {\n\n\t\tdim = dim || 2;\n\n\t\tlet hasHoles = holeIndices && holeIndices.length,\n\t\t\touterLen = hasHoles ? holeIndices[ 0 ] * dim : data.length,\n\t\t\touterNode = linkedList( data, 0, outerLen, dim, true ),\n\t\t\ttriangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 1 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim );\n\t\t\ttriangles.push( ear.i / dim );\n\t\t\ttriangles.push( next.i / dim );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tlet a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tlet p = ear.next.next;\n\n\twhile ( p !== ear.prev ) {\n\n\t\tif ( pointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tlet a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tlet minTX = a.x < b.x ? ( a.x < c.x ? a.x : c.x ) : ( b.x < c.x ? b.x : c.x ),\n\t\tminTY = a.y < b.y ? ( a.y < c.y ? a.y : c.y ) : ( b.y < c.y ? b.y : c.y ),\n\t\tmaxTX = a.x > b.x ? ( a.x > c.x ? a.x : c.x ) : ( b.x > c.x ? b.x : c.x ),\n\t\tmaxTY = a.y > b.y ? ( a.y > c.y ? a.y : c.y ) : ( b.y > c.y ? b.y : c.y );\n\n\t// z-order range for the current triangle bbox;\n\tlet minZ = zOrder( minTX, minTY, minX, minY, invSize ),\n\t\tmaxZ = zOrder( maxTX, maxTY, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p !== ear.prev && p !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n !== ear.prev && n !== ear.next &&\n\t\t\tpointInTriangle( a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y ) &&\n\t\t\tarea( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tlet a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim );\n\t\t\ttriangles.push( p.i / dim );\n\t\t\ttriangles.push( b.i / dim );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tlet queue = [],\n\t\ti, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\teliminateHole( queue[ i ], outerNode );\n\t\touterNode = filterPoints( outerNode, outerNode.next );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\touterNode = findHoleBridge( hole, outerNode );\n\tif ( outerNode ) {\n\n\t\tconst b = splitPolygon( outerNode, hole );\n\n\t\t// filter collinear points around the cuts\n\t\tfilterPoints( outerNode, outerNode.next );\n\t\tfilterPoints( b, b.next );\n\n\t}\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\thx = hole.x,\n\t\thy = hole.y,\n\t\tqx = - Infinity,\n\t\tm;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tlet x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tif ( x === hx ) {\n\n\t\t\t\t\tif ( hy === p.y ) return p;\n\t\t\t\t\tif ( hy === p.next.y ) return p.next;\n\n\t\t\t\t}\n\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\tif ( hx === qx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tlet stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y,\n\t\ttanMin = Infinity,\n\t\ttan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === null ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = 32767 * ( x - minX ) * invSize;\n\ty = 32767 * ( y - minY ) * invSize;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) - ( ax - px ) * ( cy - py ) >= 0 &&\n\t\t\t( ax - px ) * ( by - py ) - ( bx - px ) * ( ay - py ) >= 0 &&\n\t\t\t( bx - px ) * ( cy - py ) - ( cx - px ) * ( by - py ) >= 0;\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n\t\t( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n\t\t( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n\t\tequals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false,\n\t\tpx = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tlet a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = null;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nconst ShapeUtils = {\n\n\t// calculate area of the contour polygon\n\n\tarea: function ( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t},\n\n\tisClockWise: function ( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t},\n\n\ttriangulateShape: function ( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n};\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: , // number of points on the curves\n * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: , // Depth to extrude the shape\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into the original shape bevel goes\n * bevelSize: , // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: , // how far from shape outline does bevel start\n * bevelSegments: , // number of bevel layers\n *\n * extrudePath: // curve to extrude shape along\n *\n * UVGenerator: // object that provides UV generator functions\n *\n * }\n */\n\n// ExtrudeGeometry\n\nfunction ExtrudeGeometry( shapes, options ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ExtrudeGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tthis.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );\n\tthis.mergeVertices();\n\n}\n\nExtrudeGeometry.prototype = Object.create( Geometry.prototype );\nExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\nExtrudeGeometry.prototype.toJSON = function () {\n\n\tconst data = Geometry.prototype.toJSON.call( this );\n\n\tconst shapes = this.parameters.shapes;\n\tconst options = this.parameters.options;\n\n\treturn toJSON( shapes, options, data );\n\n};\n\n// ExtrudeBufferGeometry\n\nfunction ExtrudeBufferGeometry( shapes, options ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ExtrudeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\toptions: options\n\t};\n\n\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\tconst scope = this;\n\n\tconst verticesArray = [];\n\tconst uvArray = [];\n\n\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\tconst shape = shapes[ i ];\n\t\taddShape( shape );\n\n\t}\n\n\t// build geometry\n\n\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\tthis.computeVertexNormals();\n\n\t// functions\n\n\tfunction addShape( shape ) {\n\n\t\tconst placeholder = [];\n\n\t\t// options\n\n\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\tlet depth = options.depth !== undefined ? options.depth : 100;\n\n\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6;\n\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2;\n\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tconst extrudePath = options.extrudePath;\n\n\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t// deprecated options\n\n\t\tif ( options.amount !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry: amount has been renamed to depth.' );\n\t\t\tdepth = options.amount;\n\n\t\t}\n\n\t\t//\n\n\t\tlet extrudePts, extrudeByPath = false;\n\t\tlet splineTube, binormal, normal, position2;\n\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\t\t\tbevelOffset = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\tlet vertices = shapePoints.shape;\n\t\tconst holes = shapePoints.holes;\n\n\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tconst ahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t// but prevent crazy spikes\n\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tconst contourMovements = [];\n\n\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t// (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tconst holesMovements = [];\n\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tconst ahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tconst t = b / bevelSegments;\n\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t// contract shape\n\n\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t// Back facing vertices\n\n\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tconst t = b / bevelSegments;\n\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t// contract shape\n\n\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t///// Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tconst start = verticesArray.length / 3;\n\t\t\tlet layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\n\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tlet i = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tconst j = i;\n\t\t\t\tlet k = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tplaceholder.push( x );\n\t\t\tplaceholder.push( y );\n\t\t\tplaceholder.push( z );\n\n\t\t}\n\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\n\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( d );\n\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\t\t\taddVertex( d );\n\n\n\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t}\n\n\t\tfunction addVertex( index ) {\n\n\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t}\n\n\n\t\tfunction addUV( vector2 ) {\n\n\t\t\tuvArray.push( vector2.x );\n\t\t\tuvArray.push( vector2.y );\n\n\t\t}\n\n\t}\n\n}\n\nExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;\n\nExtrudeBufferGeometry.prototype.toJSON = function () {\n\n\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\tconst shapes = this.parameters.shapes;\n\tconst options = this.parameters.options;\n\n\treturn toJSON( shapes, options, data );\n\n};\n\n//\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < 0.01 ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n};\n\nfunction toJSON( shapes, options, data ) {\n\n\t//\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\t//\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * Text = 3D Text\n *\n * parameters = {\n * font: , // font\n *\n * size: , // size of the text\n * height: , // thickness to extrude text\n * curveSegments: , // number of points on the curves\n *\n * bevelEnabled: , // turn on bevel\n * bevelThickness: , // how deep into text bevel goes\n * bevelSize: , // how far from text outline (including bevelOffset) is bevel\n * bevelOffset: // how far from text outline does bevel start\n * }\n */\n\n// TextGeometry\n\nfunction TextGeometry( text, parameters ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'TextGeometry';\n\n\tthis.parameters = {\n\t\ttext: text,\n\t\tparameters: parameters\n\t};\n\n\tthis.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );\n\tthis.mergeVertices();\n\n}\n\nTextGeometry.prototype = Object.create( Geometry.prototype );\nTextGeometry.prototype.constructor = TextGeometry;\n\n// TextBufferGeometry\n\nfunction TextBufferGeometry( text, parameters ) {\n\n\tparameters = parameters || {};\n\n\tconst font = parameters.font;\n\n\tif ( ! ( font && font.isFont ) ) {\n\n\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\treturn new Geometry();\n\n\t}\n\n\tconst shapes = font.generateShapes( text, parameters.size );\n\n\t// translate parameters to ExtrudeGeometry API\n\n\tparameters.depth = parameters.height !== undefined ? parameters.height : 50;\n\n\t// defaults\n\n\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\tExtrudeBufferGeometry.call( this, shapes, parameters );\n\n\tthis.type = 'TextBufferGeometry';\n\n}\n\nTextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );\nTextBufferGeometry.prototype.constructor = TextBufferGeometry;\n\n// SphereGeometry\n\nfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'SphereGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nSphereGeometry.prototype = Object.create( Geometry.prototype );\nSphereGeometry.prototype.constructor = SphereGeometry;\n\n// SphereBufferGeometry\n\nfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'SphereBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\twidthSegments: widthSegments,\n\t\theightSegments: heightSegments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\n\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\tphiStart = phiStart !== undefined ? phiStart : 0;\n\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\tlet index = 0;\n\tconst grid = [];\n\n\tconst vertex = new Vector3();\n\tconst normal = new Vector3();\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// generate vertices, normals and uvs\n\n\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\tconst verticesRow = [];\n\n\t\tconst v = iy / heightSegments;\n\n\t\t// special case for the poles\n\n\t\tlet uOffset = 0;\n\n\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t}\n\n\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\tconst u = ix / widthSegments;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormal.copy( vertex ).normalize();\n\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\tverticesRow.push( index ++ );\n\n\t\t}\n\n\t\tgrid.push( verticesRow );\n\n\t}\n\n\t// indices\n\n\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n// RingGeometry\n\nfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'RingGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nRingGeometry.prototype = Object.create( Geometry.prototype );\nRingGeometry.prototype.constructor = RingGeometry;\n\n// RingBufferGeometry\n\nfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'RingBufferGeometry';\n\n\tthis.parameters = {\n\t\tinnerRadius: innerRadius,\n\t\touterRadius: outerRadius,\n\t\tthetaSegments: thetaSegments,\n\t\tphiSegments: phiSegments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tinnerRadius = innerRadius || 0.5;\n\touterRadius = outerRadius || 1;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// some helper variables\n\n\tlet radius = innerRadius;\n\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\tconst vertex = new Vector3();\n\tconst uv = new Vector2();\n\n\t// generate vertices, normals and uvs\n\n\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// increase the radius for next row of vertices\n\n\t\tradius += radiusStep;\n\n\t}\n\n\t// indices\n\n\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\tconst a = segment;\n\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\tconst d = segment + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n// LatheGeometry\n\nfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'LatheGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\tthis.mergeVertices();\n\n}\n\nLatheGeometry.prototype = Object.create( Geometry.prototype );\nLatheGeometry.prototype.constructor = LatheGeometry;\n\n// LatheBufferGeometry\n\nfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'LatheBufferGeometry';\n\n\tthis.parameters = {\n\t\tpoints: points,\n\t\tsegments: segments,\n\t\tphiStart: phiStart,\n\t\tphiLength: phiLength\n\t};\n\n\tsegments = Math.floor( segments ) || 12;\n\tphiStart = phiStart || 0;\n\tphiLength = phiLength || Math.PI * 2;\n\n\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\tphiLength = MathUtils.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst uvs = [];\n\n\t// helper variables\n\n\tconst inverseSegments = 1.0 / segments;\n\tconst vertex = new Vector3();\n\tconst uv = new Vector2();\n\n\t// generate vertices and uvs\n\n\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\tconst sin = Math.sin( phi );\n\t\tconst cos = Math.cos( phi );\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\tvertex.y = points[ j ].y;\n\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// uv\n\n\t\t\tuv.x = i / segments;\n\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\tconst base = j + i * points.length;\n\n\t\t\tconst a = base;\n\t\t\tconst b = base + points.length;\n\t\t\tconst c = base + points.length + 1;\n\t\t\tconst d = base + 1;\n\n\t\t\t// faces\n\n\t\t\tindices.push( a, b, d );\n\t\t\tindices.push( b, c, d );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t// generate normals\n\n\tthis.computeVertexNormals();\n\n\t// if the geometry is closed, we need to average the normals along the seam.\n\t// because the corresponding vertices are identical (but still have different UVs).\n\n\tif ( phiLength === Math.PI * 2 ) {\n\n\t\tconst normals = this.attributes.normal.array;\n\t\tconst n1 = new Vector3();\n\t\tconst n2 = new Vector3();\n\t\tconst n = new Vector3();\n\n\t\t// this is the buffer offset for the last line of vertices\n\n\t\tconst base = segments * points.length * 3;\n\n\t\tfor ( let i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t// select the normal of the vertex in the first line\n\n\t\t\tn1.x = normals[ j + 0 ];\n\t\t\tn1.y = normals[ j + 1 ];\n\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t// select the normal of the vertex in the last line\n\n\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t// average normals\n\n\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t// assign the new values to both normals\n\n\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t}\n\n\t}\n\n}\n\nLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n// ShapeGeometry\n\nfunction ShapeGeometry( shapes, curveSegments ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'ShapeGeometry';\n\n\tif ( typeof curveSegments === 'object' ) {\n\n\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\tcurveSegments = curveSegments.curveSegments;\n\n\t}\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\tthis.mergeVertices();\n\n}\n\nShapeGeometry.prototype = Object.create( Geometry.prototype );\nShapeGeometry.prototype.constructor = ShapeGeometry;\n\nShapeGeometry.prototype.toJSON = function () {\n\n\tconst data = Geometry.prototype.toJSON.call( this );\n\n\tconst shapes = this.parameters.shapes;\n\n\treturn toJSON$1( shapes, data );\n\n};\n\n// ShapeBufferGeometry\n\nfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'ShapeBufferGeometry';\n\n\tthis.parameters = {\n\t\tshapes: shapes,\n\t\tcurveSegments: curveSegments\n\t};\n\n\tcurveSegments = curveSegments || 12;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// helper variables\n\n\tlet groupStart = 0;\n\tlet groupCount = 0;\n\n\t// allow single and array values for \"shapes\" parameter\n\n\tif ( Array.isArray( shapes ) === false ) {\n\n\t\taddShape( shapes );\n\n\t} else {\n\n\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\taddShape( shapes[ i ] );\n\n\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\tgroupStart += groupCount;\n\t\t\tgroupCount = 0;\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t// helper functions\n\n\tfunction addShape( shape ) {\n\n\t\tconst indexOffset = vertices.length / 3;\n\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\tlet shapeVertices = points.shape;\n\t\tconst shapeHoles = points.holes;\n\n\t\t// check direction of vertices\n\n\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t// join vertices of inner and outer paths to a single array\n\n\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t}\n\n\t\t// vertices, normals, uvs\n\n\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\tnormals.push( 0, 0, 1 );\n\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t}\n\n\t\t// incides\n\n\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\tindices.push( a, b, c );\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t}\n\n}\n\nShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\nShapeBufferGeometry.prototype.toJSON = function () {\n\n\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\tconst shapes = this.parameters.shapes;\n\n\treturn toJSON$1( shapes, data );\n\n};\n\n//\n\nfunction toJSON$1( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'EdgesGeometry';\n\n\tthis.parameters = {\n\t\tthresholdAngle: thresholdAngle\n\t};\n\n\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t// buffer\n\n\tconst vertices = [];\n\n\t// helper variables\n\n\tconst thresholdDot = Math.cos( MathUtils.DEG2RAD * thresholdAngle );\n\tconst edge = [ 0, 0 ], edges = {};\n\tlet edge1, edge2, key;\n\tconst keys = [ 'a', 'b', 'c' ];\n\n\t// prepare source geometry\n\n\tlet geometry2;\n\n\tif ( geometry.isBufferGeometry ) {\n\n\t\tgeometry2 = new Geometry();\n\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t} else {\n\n\t\tgeometry2 = geometry.clone();\n\n\t}\n\n\tgeometry2.mergeVertices();\n\tgeometry2.computeFaceNormals();\n\n\tconst sourceVertices = geometry2.vertices;\n\tconst faces = geometry2.faces;\n\n\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tconst face = faces[ i ];\n\n\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\tedge[ 0 ] = Math.min( edge1, edge2 );\n\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t} else {\n\n\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// generate vertices\n\n\tfor ( key in edges ) {\n\n\t\tconst e = edges[ key ];\n\n\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\tlet vertex = sourceVertices[ e.index1 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t}\n\n\t// build geometry\n\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n}\n\nEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\nEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n// CylinderGeometry\n\nfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CylinderGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCylinderGeometry.prototype = Object.create( Geometry.prototype );\nCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n// CylinderBufferGeometry\n\nfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CylinderBufferGeometry';\n\n\tthis.parameters = {\n\t\tradiusTop: radiusTop,\n\t\tradiusBottom: radiusBottom,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tconst scope = this;\n\n\tradiusTop = radiusTop !== undefined ? radiusTop : 1;\n\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 1;\n\theight = height || 1;\n\n\tradialSegments = Math.floor( radialSegments ) || 8;\n\theightSegments = Math.floor( heightSegments ) || 1;\n\n\topenEnded = openEnded !== undefined ? openEnded : false;\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// helper variables\n\n\tlet index = 0;\n\tconst indexArray = [];\n\tconst halfHeight = height / 2;\n\tlet groupStart = 0;\n\n\t// generate geometry\n\n\tgenerateTorso();\n\n\tif ( openEnded === false ) {\n\n\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\tfunction generateTorso() {\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\tlet groupCount = 0;\n\n\t\t// this will be used to calculate the normal\n\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\tconst indexRow = [];\n\n\t\t\tconst v = y / heightSegments;\n\n\t\t\t// calculate the radius of the current row\n\n\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\t// now save vertices of the row in our index array\n\n\t\t\tindexArray.push( indexRow );\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t// update group counter\n\n\t\t\t\tgroupCount += 6;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n\tfunction generateCap( top ) {\n\n\t\tlet centerIndexStart, centerIndexEnd;\n\n\t\tconst uv = new Vector2();\n\t\tconst vertex = new Vector3();\n\n\t\tlet groupCount = 0;\n\n\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t// save the index of the first center vertex\n\t\tcenterIndexStart = index;\n\n\t\t// first we generate the center vertex data of the cap.\n\t\t// because the geometry needs one set of uvs per face,\n\t\t// we must generate a center vertex per face/segment\n\n\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t// vertex\n\n\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// save the index of the last center vertex\n\n\t\tcenterIndexEnd = index;\n\n\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\tconst u = x / radialSegments;\n\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * sinTheta;\n\t\t\tvertex.y = halfHeight * sign;\n\t\t\tvertex.z = radius * cosTheta;\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t// uv\n\n\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t// increase index\n\n\t\t\tindex ++;\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\tconst c = centerIndexStart + x;\n\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\tif ( top === true ) {\n\n\t\t\t\t// face top\n\n\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t} else {\n\n\t\t\t\t// face bottom\n\n\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t}\n\n\t\t\tgroupCount += 3;\n\n\t\t}\n\n\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t// calculate new start value for groups\n\n\t\tgroupStart += groupCount;\n\n\t}\n\n}\n\nCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n// ConeGeometry\n\nfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\nConeGeometry.prototype.constructor = ConeGeometry;\n\n// ConeBufferGeometry\n\nfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\tthis.type = 'ConeBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\theight: height,\n\t\tradialSegments: radialSegments,\n\t\theightSegments: heightSegments,\n\t\topenEnded: openEnded,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n}\n\nConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\nConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n// CircleGeometry\n\nfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tGeometry.call( this );\n\n\tthis.type = 'CircleGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\tthis.mergeVertices();\n\n}\n\nCircleGeometry.prototype = Object.create( Geometry.prototype );\nCircleGeometry.prototype.constructor = CircleGeometry;\n\n// CircleBufferGeometry\n\nfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'CircleBufferGeometry';\n\n\tthis.parameters = {\n\t\tradius: radius,\n\t\tsegments: segments,\n\t\tthetaStart: thetaStart,\n\t\tthetaLength: thetaLength\n\t};\n\n\tradius = radius || 1;\n\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t// buffers\n\n\tconst indices = [];\n\tconst vertices = [];\n\tconst normals = [];\n\tconst uvs = [];\n\n\t// helper variables\n\n\tconst vertex = new Vector3();\n\tconst uv = new Vector2();\n\n\t// center point\n\n\tvertices.push( 0, 0, 0 );\n\tnormals.push( 0, 0, 1 );\n\tuvs.push( 0.5, 0.5 );\n\n\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t// vertex\n\n\t\tvertex.x = radius * Math.cos( segment );\n\t\tvertex.y = radius * Math.sin( segment );\n\n\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t// normal\n\n\t\tnormals.push( 0, 0, 1 );\n\n\t\t// uvs\n\n\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\tuvs.push( uv.x, uv.y );\n\n\t}\n\n\t// indices\n\n\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\tindices.push( i, i + 1, 0 );\n\n\t}\n\n\t// build geometry\n\n\tthis.setIndex( indices );\n\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n}\n\nCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\nCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tWireframeGeometry: WireframeGeometry,\n\tParametricGeometry: ParametricGeometry,\n\tParametricBufferGeometry: ParametricBufferGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\tTubeGeometry: TubeGeometry,\n\tTubeBufferGeometry: TubeBufferGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusBufferGeometry: TorusBufferGeometry,\n\tTextGeometry: TextGeometry,\n\tTextBufferGeometry: TextBufferGeometry,\n\tSphereGeometry: SphereGeometry,\n\tSphereBufferGeometry: SphereBufferGeometry,\n\tRingGeometry: RingGeometry,\n\tRingBufferGeometry: RingBufferGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPlaneBufferGeometry: PlaneBufferGeometry,\n\tLatheGeometry: LatheGeometry,\n\tLatheBufferGeometry: LatheBufferGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tShapeBufferGeometry: ShapeBufferGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tExtrudeBufferGeometry: ExtrudeBufferGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tConeGeometry: ConeGeometry,\n\tConeBufferGeometry: ConeBufferGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tCylinderBufferGeometry: CylinderBufferGeometry,\n\tCircleGeometry: CircleGeometry,\n\tCircleBufferGeometry: CircleBufferGeometry,\n\tBoxGeometry: BoxGeometry,\n\tBoxBufferGeometry: BoxBufferGeometry\n});\n\n/**\n * parameters = {\n * color: \n * }\n */\n\nfunction ShadowMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'ShadowMaterial';\n\n\tthis.color = new Color( 0x000000 );\n\tthis.transparent = true;\n\n\tthis.setValues( parameters );\n\n}\n\nShadowMaterial.prototype = Object.create( Material.prototype );\nShadowMaterial.prototype.constructor = ShadowMaterial;\n\nShadowMaterial.prototype.isShadowMaterial = true;\n\nShadowMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\treturn this;\n\n};\n\nfunction RawShaderMaterial( parameters ) {\n\n\tShaderMaterial.call( this, parameters );\n\n\tthis.type = 'RawShaderMaterial';\n\n}\n\nRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\nRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\nRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n/**\n * parameters = {\n * color: ,\n * roughness: ,\n * metalness: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * roughnessMap: new THREE.Texture( ),\n *\n * metalnessMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * envMapIntensity: \n *\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshStandardMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.type = 'MeshStandardMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.roughness = 1.0;\n\tthis.metalness = 0.0;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.roughnessMap = null;\n\n\tthis.metalnessMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.envMapIntensity = 1.0;\n\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.vertexTangents = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshStandardMaterial.prototype = Object.create( Material.prototype );\nMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\nMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\nMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'STANDARD': '' };\n\n\tthis.color.copy( source.color );\n\tthis.roughness = source.roughness;\n\tthis.metalness = source.metalness;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.roughnessMap = source.roughnessMap;\n\n\tthis.metalnessMap = source.metalnessMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.envMapIntensity = source.envMapIntensity;\n\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\tthis.vertexTangents = source.vertexTangents;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * clearcoat: ,\n * clearcoatMap: new THREE.Texture( ),\n * clearcoatRoughness: ,\n * clearcoatRoughnessMap: new THREE.Texture( ),\n * clearcoatNormalScale: ,\n * clearcoatNormalMap: new THREE.Texture( ),\n *\n * reflectivity: ,\n *\n * sheen: ,\n *\n * transmission: ,\n * transmissionMap: new THREE.Texture( )\n * }\n */\n\nfunction MeshPhysicalMaterial( parameters ) {\n\n\tMeshStandardMaterial.call( this );\n\n\tthis.defines = {\n\n\t\t'STANDARD': '',\n\t\t'PHYSICAL': ''\n\n\t};\n\n\tthis.type = 'MeshPhysicalMaterial';\n\n\tthis.clearcoat = 0.0;\n\tthis.clearcoatMap = null;\n\tthis.clearcoatRoughness = 0.0;\n\tthis.clearcoatRoughnessMap = null;\n\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\tthis.clearcoatNormalMap = null;\n\n\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\tthis.sheen = null; // null will disable sheen bsdf\n\n\tthis.transmission = 0.0;\n\tthis.transmissionMap = null;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\nMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\nMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\nMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = {\n\n\t\t'STANDARD': '',\n\t\t'PHYSICAL': ''\n\n\t};\n\n\tthis.clearcoat = source.clearcoat;\n\tthis.clearcoatMap = source.clearcoatMap;\n\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\tthis.reflectivity = source.reflectivity;\n\n\tif ( source.sheen ) {\n\n\t\tthis.sheen = ( this.sheen || new Color() ).copy( source.sheen );\n\n\t} else {\n\n\t\tthis.sheen = null;\n\n\t}\n\n\tthis.transmission = source.transmission;\n\tthis.transmissionMap = source.transmissionMap;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * specular: ,\n * shininess: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.MultiplyOperation,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshPhongMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshPhongMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\tthis.specular = new Color( 0x111111 );\n\tthis.shininess = 30;\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshPhongMaterial.prototype = Object.create( Material.prototype );\nMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\nMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\nMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\tthis.specular.copy( source.specular );\n\tthis.shininess = source.shininess;\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n *\n * map: new THREE.Texture( ),\n * gradientMap: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * alphaMap: new THREE.Texture( ),\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshToonMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'TOON': '' };\n\n\tthis.type = 'MeshToonMaterial';\n\n\tthis.color = new Color( 0xffffff );\n\n\tthis.map = null;\n\tthis.gradientMap = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.alphaMap = null;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshToonMaterial.prototype = Object.create( Material.prototype );\nMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\nMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\nMeshToonMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\tthis.gradientMap = source.gradientMap;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * opacity: ,\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * wireframe: ,\n * wireframeLinewidth: \n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshNormalMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshNormalMaterial';\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\n\tthis.fog = false;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshNormalMaterial.prototype = Object.create( Material.prototype );\nMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\nMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\nMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * map: new THREE.Texture( ),\n *\n * lightMap: new THREE.Texture( ),\n * lightMapIntensity: \n *\n * aoMap: new THREE.Texture( ),\n * aoMapIntensity: \n *\n * emissive: ,\n * emissiveIntensity: \n * emissiveMap: new THREE.Texture( ),\n *\n * specularMap: new THREE.Texture( ),\n *\n * alphaMap: new THREE.Texture( ),\n *\n * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n * combine: THREE.Multiply,\n * reflectivity: ,\n * refractionRatio: ,\n *\n * wireframe: ,\n * wireframeLinewidth: ,\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshLambertMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.type = 'MeshLambertMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.map = null;\n\n\tthis.lightMap = null;\n\tthis.lightMapIntensity = 1.0;\n\n\tthis.aoMap = null;\n\tthis.aoMapIntensity = 1.0;\n\n\tthis.emissive = new Color( 0x000000 );\n\tthis.emissiveIntensity = 1.0;\n\tthis.emissiveMap = null;\n\n\tthis.specularMap = null;\n\n\tthis.alphaMap = null;\n\n\tthis.envMap = null;\n\tthis.combine = MultiplyOperation;\n\tthis.reflectivity = 1;\n\tthis.refractionRatio = 0.98;\n\n\tthis.wireframe = false;\n\tthis.wireframeLinewidth = 1;\n\tthis.wireframeLinecap = 'round';\n\tthis.wireframeLinejoin = 'round';\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshLambertMaterial.prototype = Object.create( Material.prototype );\nMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\nMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\nMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.color.copy( source.color );\n\n\tthis.map = source.map;\n\n\tthis.lightMap = source.lightMap;\n\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\tthis.aoMap = source.aoMap;\n\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\tthis.emissive.copy( source.emissive );\n\tthis.emissiveMap = source.emissiveMap;\n\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\tthis.specularMap = source.specularMap;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.envMap = source.envMap;\n\tthis.combine = source.combine;\n\tthis.reflectivity = source.reflectivity;\n\tthis.refractionRatio = source.refractionRatio;\n\n\tthis.wireframe = source.wireframe;\n\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\tthis.wireframeLinecap = source.wireframeLinecap;\n\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * matcap: new THREE.Texture( ),\n *\n * map: new THREE.Texture( ),\n *\n * bumpMap: new THREE.Texture( ),\n * bumpScale: ,\n *\n * normalMap: new THREE.Texture( ),\n * normalMapType: THREE.TangentSpaceNormalMap,\n * normalScale: ,\n *\n * displacementMap: new THREE.Texture( ),\n * displacementScale: ,\n * displacementBias: ,\n *\n * alphaMap: new THREE.Texture( ),\n *\n * skinning: ,\n * morphTargets: ,\n * morphNormals: \n * }\n */\n\nfunction MeshMatcapMaterial( parameters ) {\n\n\tMaterial.call( this );\n\n\tthis.defines = { 'MATCAP': '' };\n\n\tthis.type = 'MeshMatcapMaterial';\n\n\tthis.color = new Color( 0xffffff ); // diffuse\n\n\tthis.matcap = null;\n\n\tthis.map = null;\n\n\tthis.bumpMap = null;\n\tthis.bumpScale = 1;\n\n\tthis.normalMap = null;\n\tthis.normalMapType = TangentSpaceNormalMap;\n\tthis.normalScale = new Vector2( 1, 1 );\n\n\tthis.displacementMap = null;\n\tthis.displacementScale = 1;\n\tthis.displacementBias = 0;\n\n\tthis.alphaMap = null;\n\n\tthis.skinning = false;\n\tthis.morphTargets = false;\n\tthis.morphNormals = false;\n\n\tthis.setValues( parameters );\n\n}\n\nMeshMatcapMaterial.prototype = Object.create( Material.prototype );\nMeshMatcapMaterial.prototype.constructor = MeshMatcapMaterial;\n\nMeshMatcapMaterial.prototype.isMeshMatcapMaterial = true;\n\nMeshMatcapMaterial.prototype.copy = function ( source ) {\n\n\tMaterial.prototype.copy.call( this, source );\n\n\tthis.defines = { 'MATCAP': '' };\n\n\tthis.color.copy( source.color );\n\n\tthis.matcap = source.matcap;\n\n\tthis.map = source.map;\n\n\tthis.bumpMap = source.bumpMap;\n\tthis.bumpScale = source.bumpScale;\n\n\tthis.normalMap = source.normalMap;\n\tthis.normalMapType = source.normalMapType;\n\tthis.normalScale.copy( source.normalScale );\n\n\tthis.displacementMap = source.displacementMap;\n\tthis.displacementScale = source.displacementScale;\n\tthis.displacementBias = source.displacementBias;\n\n\tthis.alphaMap = source.alphaMap;\n\n\tthis.skinning = source.skinning;\n\tthis.morphTargets = source.morphTargets;\n\tthis.morphNormals = source.morphNormals;\n\n\treturn this;\n\n};\n\n/**\n * parameters = {\n * color: ,\n * opacity: ,\n *\n * linewidth: ,\n *\n * scale: ,\n * dashSize: ,\n * gapSize: \n * }\n */\n\nfunction LineDashedMaterial( parameters ) {\n\n\tLineBasicMaterial.call( this );\n\n\tthis.type = 'LineDashedMaterial';\n\n\tthis.scale = 1;\n\tthis.dashSize = 3;\n\tthis.gapSize = 1;\n\n\tthis.setValues( parameters );\n\n}\n\nLineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );\nLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\nLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\nLineDashedMaterial.prototype.copy = function ( source ) {\n\n\tLineBasicMaterial.prototype.copy.call( this, source );\n\n\tthis.scale = source.scale;\n\tthis.dashSize = source.dashSize;\n\tthis.gapSize = source.gapSize;\n\n\treturn this;\n\n};\n\nvar Materials = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tShadowMaterial: ShadowMaterial,\n\tSpriteMaterial: SpriteMaterial,\n\tRawShaderMaterial: RawShaderMaterial,\n\tShaderMaterial: ShaderMaterial,\n\tPointsMaterial: PointsMaterial,\n\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\tMeshStandardMaterial: MeshStandardMaterial,\n\tMeshPhongMaterial: MeshPhongMaterial,\n\tMeshToonMaterial: MeshToonMaterial,\n\tMeshNormalMaterial: MeshNormalMaterial,\n\tMeshLambertMaterial: MeshLambertMaterial,\n\tMeshDepthMaterial: MeshDepthMaterial,\n\tMeshDistanceMaterial: MeshDistanceMaterial,\n\tMeshBasicMaterial: MeshBasicMaterial,\n\tMeshMatcapMaterial: MeshMatcapMaterial,\n\tLineDashedMaterial: LineDashedMaterial,\n\tLineBasicMaterial: LineBasicMaterial,\n\tMaterial: Material\n});\n\nconst AnimationUtils = {\n\n\t// same as Array.prototype.slice, but also works on typed arrays\n\tarraySlice: function ( array, from, to ) {\n\n\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t}\n\n\t\treturn array.slice( from, to );\n\n\t},\n\n\t// converts an array to a specific type\n\tconvertArray: function ( array, type, forceClone ) {\n\n\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\treturn new type( array ); // create typed array\n\n\t\t}\n\n\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t},\n\n\tisTypedArray: function ( object ) {\n\n\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t! ( object instanceof DataView );\n\n\t},\n\n\t// returns an array by which times and values can be sorted\n\tgetKeyframeOrder: function ( times ) {\n\n\t\tfunction compareTime( i, j ) {\n\n\t\t\treturn times[ i ] - times[ j ];\n\n\t\t}\n\n\t\tconst n = times.length;\n\t\tconst result = new Array( n );\n\t\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\tresult.sort( compareTime );\n\n\t\treturn result;\n\n\t},\n\n\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\tsortedArray: function ( values, stride, order ) {\n\n\t\tconst nValues = values.length;\n\t\tconst result = new values.constructor( nValues );\n\n\t\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\tconst srcOffset = order[ i ] * stride;\n\n\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// function for parsing AOS keyframe formats\n\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tlet i = 1, key = jsonKeys[ 0 ];\n\n\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t}\n\n\t\tif ( key === undefined ) return; // no data\n\n\t\tlet value = key[ valuePropertyName ];\n\t\tif ( value === undefined ) return; // no data\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t// ...assume THREE.Math-ish\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t} else {\n\n\t\t\t// otherwise push as-is\n\n\t\t\tdo {\n\n\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t}\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t} while ( key !== undefined );\n\n\t\t}\n\n\t},\n\n\tsubclip: function ( sourceClip, name, startFrame, endFrame, fps ) {\n\n\t\tfps = fps || 30;\n\n\t\tconst clip = sourceClip.clone();\n\n\t\tclip.name = name;\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tconst track = clip.tracks[ i ];\n\t\t\tconst valueSize = track.getValueSize();\n\n\t\t\tconst times = [];\n\t\t\tconst values = [];\n\n\t\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( times.length === 0 ) continue;\n\n\t\t\ttrack.times = AnimationUtils.convertArray( times, track.times.constructor );\n\t\t\ttrack.values = AnimationUtils.convertArray( values, track.values.constructor );\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\t// find minimum .times value across all tracks in the trimmed clip\n\n\t\tlet minStartTime = Infinity;\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// shift all tracks such that clip begins at t=0\n\n\t\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t\t}\n\n\t\tclip.resetDuration();\n\n\t\treturn clip;\n\n\t},\n\n\tmakeClipAdditive: function ( targetClip, referenceFrame, referenceClip, fps ) {\n\n\t\tif ( referenceFrame === undefined ) referenceFrame = 0;\n\t\tif ( referenceClip === undefined ) referenceClip = targetClip;\n\t\tif ( fps === undefined || fps <= 0 ) fps = 30;\n\n\t\tconst numTracks = targetClip.tracks.length;\n\t\tconst referenceTime = referenceFrame / fps;\n\n\t\t// Make each track's values relative to the values at the reference frame\n\t\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t\t// Skip this track if it's non-numeric\n\t\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t\t} );\n\n\t\t\tif ( targetTrack === undefined ) continue;\n\n\t\t\tconst valueSize = referenceTrack.getValueSize();\n\t\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\t\tlet referenceValue;\n\n\t\t\t// Find the value to subtract out of the track\n\t\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, 0, referenceTrack.valueSize );\n\n\t\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\t\tconst startIndex = lastIndex * valueSize;\n\t\t\t\treferenceValue = AnimationUtils.arraySlice( referenceTrack.values, startIndex );\n\n\t\t\t} else {\n\n\t\t\t\t// Interpolate to the reference value\n\t\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\t\treferenceValue = interpolant.resultBuffer;\n\n\t\t\t}\n\n\t\t\t// Conjugate the quaternion\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\tconst referenceQuat = new Quaternion(\n\t\t\t\t\treferenceValue[ 0 ],\n\t\t\t\t\treferenceValue[ 1 ],\n\t\t\t\t\treferenceValue[ 2 ],\n\t\t\t\t\treferenceValue[ 3 ]\n\t\t\t\t).normalize().conjugate();\n\t\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t\t}\n\n\t\t\t// Subtract the reference value from all of the track values\n\n\t\t\tconst numTimes = targetTrack.times.length;\n\t\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\t\tconst valueStart = j * valueSize;\n\n\t\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart,\n\t\t\t\t\t\treferenceValue,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\t\tvalueStart\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\t\treturn targetClip;\n\n\t}\n\n};\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nfunction Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tthis.parameterPositions = parameterPositions;\n\tthis._cachedIndex = 0;\n\n\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\tthis.sampleValues = sampleValues;\n\tthis.valueSize = sampleSize;\n\n}\n\nObject.assign( Interpolant.prototype, {\n\n\tevaluate: function ( t ) {\n\n\t\tlet pp = this.parameterPositions,\n\t\t\ti1 = this._cachedIndex,\n\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t},\n\n\tsettings: null, // optional, subclass-specific settings structure\n\t// Note: The indirection allows central control of many interpolants.\n\n\t// --- Protected interface\n\n\tDefaultSettings_: {},\n\n\tgetSettings_: function () {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t},\n\n\tcopySampleValue_: function ( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t},\n\n\t// Template methods for derived classes:\n\n\tinterpolate_: function ( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t},\n\n\tintervalChanged_: function ( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n} );\n\n// DECLARE ALIAS AFTER assign prototype\nObject.assign( Interpolant.prototype, {\n\n\t//( 0, t, t0 ), returns this.resultBuffer\n\tbeforeStart_: Interpolant.prototype.copySampleValue_,\n\n\t//( N-1, tN-1, t ), returns this.resultBuffer\n\tafterEnd_: Interpolant.prototype.copySampleValue_,\n\n} );\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nfunction CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\tthis._weightPrev = - 0;\n\tthis._offsetPrev = - 0;\n\tthis._weightNext = - 0;\n\tthis._offsetNext = - 0;\n\n}\n\nCubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: CubicInterpolant,\n\n\tDefaultSettings_: {\n\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\n\t},\n\n\tintervalChanged_: function ( i1, t0, t1 ) {\n\n\t\tlet pp = this.parameterPositions,\n\t\t\tiPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t},\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\nfunction LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: LinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceeding\n * the parameter.\n */\n\nfunction DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nDiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: DiscreteInterpolant,\n\n\tinterpolate_: function ( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n} );\n\nfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\tthis.name = name;\n\n\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n}\n\n// Static methods\n\nObject.assign( KeyframeTrack, {\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\ttoJSON: function ( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n} );\n\nObject.assign( KeyframeTrack.prototype, {\n\n\tconstructor: KeyframeTrack,\n\n\tTimeBufferType: Float32Array,\n\n\tValueBufferType: Float32Array,\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tsetInterpolation: function ( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = \"unsupported interpolation for \" +\n\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t},\n\n\tgetInterpolation: function () {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t},\n\n\tgetValueSize: function () {\n\n\t\treturn this.values.length / this.times.length;\n\n\t},\n\n\t// move all keyframes either forwards or backwards in time\n\tshift: function ( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale: function ( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim: function ( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\tthis.values = AnimationUtils.arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate: function () {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize: function () {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = AnimationUtils.arraySlice( this.times ),\n\t\t\tvalues = AnimationUtils.arraySlice( this.values ),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\tconst times = AnimationUtils.arraySlice( this.times, 0 );\n\t\tconst values = AnimationUtils.arraySlice( this.values, 0 );\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n} );\n\n/**\n * A Track of Boolean keyframe values.\n */\n\nfunction BooleanKeyframeTrack( name, times, values ) {\n\n\tKeyframeTrack.call( this, name, times, values );\n\n}\n\nBooleanKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: BooleanKeyframeTrack,\n\n\tValueTypeName: 'bool',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\tInterpolantFactoryMethodSmooth: undefined\n\n\t// Note: Actually this track could have a optimized / compressed\n\t// representation of a single value and a custom interpolant that\n\t// computes \"firstValue ^ isOdd( index )\".\n\n} );\n\n/**\n * A Track of keyframe values that represent color.\n */\n\nfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nColorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: ColorKeyframeTrack,\n\n\tValueTypeName: 'color'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n\t// Note: Very basic implementation and nothing special yet.\n\t// However, this is the place for color space parameterization.\n\n} );\n\n/**\n * A Track of numeric keyframe values.\n */\n\nfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nNumberKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: NumberKeyframeTrack,\n\n\tValueTypeName: 'number'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nfunction QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n}\n\nQuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\tconstructor: QuaternionLinearInterpolant,\n\n\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n} );\n\n/**\n * A Track of quaternion keyframe values.\n */\n\nfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nQuaternionKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: QuaternionKeyframeTrack,\n\n\tValueTypeName: 'quaternion',\n\n\t// ValueBufferType is inherited\n\n\tDefaultInterpolation: InterpolateLinear,\n\n\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t},\n\n\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n} );\n\n/**\n * A Track that interpolates Strings\n */\n\nfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nStringKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: StringKeyframeTrack,\n\n\tValueTypeName: 'string',\n\tValueBufferType: Array,\n\n\tDefaultInterpolation: InterpolateDiscrete,\n\n\tInterpolantFactoryMethodLinear: undefined,\n\n\tInterpolantFactoryMethodSmooth: undefined\n\n} );\n\n/**\n * A Track of vectored keyframe values.\n */\n\nfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\tKeyframeTrack.call( this, name, times, values, interpolation );\n\n}\n\nVectorKeyframeTrack.prototype = Object.assign( Object.create( KeyframeTrack.prototype ), {\n\n\tconstructor: VectorKeyframeTrack,\n\n\tValueTypeName: 'vector'\n\n\t// ValueBufferType is inherited\n\n\t// DefaultInterpolation is inherited\n\n} );\n\nfunction AnimationClip( name, duration, tracks, blendMode ) {\n\n\tthis.name = name;\n\tthis.tracks = tracks;\n\tthis.duration = ( duration !== undefined ) ? duration : - 1;\n\tthis.blendMode = ( blendMode !== undefined ) ? blendMode : NormalAnimationBlendMode;\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\t// this means it should figure out its duration by scanning the tracks\n\tif ( this.duration < 0 ) {\n\n\t\tthis.resetDuration();\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nObject.assign( AnimationClip, {\n\n\tparse: function ( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( json.name, json.duration, tracks, json.blendMode );\n\n\t},\n\n\ttoJSON: function ( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t},\n\n\tCreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = AnimationUtils.getKeyframeOrder( times );\n\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new AnimationClip( name, - 1, tracks );\n\n\t},\n\n\tfindByName: function ( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\tCreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t},\n\n\t// parse the animation.hierarchy format\n\tparseAnimation: function ( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new AnimationClip( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n} );\n\nObject.assign( AnimationClip.prototype, {\n\n\tresetDuration: function () {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t},\n\n\ttrim: function () {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tvalidate: function () {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t},\n\n\toptimize: function () {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new AnimationClip( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n} );\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\tconst scope = this;\n\n\tlet isLoading = false;\n\tlet itemsLoaded = 0;\n\tlet itemsTotal = 0;\n\tlet urlModifier = undefined;\n\tconst handlers = [];\n\n\t// Refer to #5689 for the reason why we don't set .onStart\n\t// in the constructor\n\n\tthis.onStart = undefined;\n\tthis.onLoad = onLoad;\n\tthis.onProgress = onProgress;\n\tthis.onError = onError;\n\n\tthis.itemStart = function ( url ) {\n\n\t\titemsTotal ++;\n\n\t\tif ( isLoading === false ) {\n\n\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tisLoading = true;\n\n\t};\n\n\tthis.itemEnd = function ( url ) {\n\n\t\titemsLoaded ++;\n\n\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t}\n\n\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\tisLoading = false;\n\n\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\tscope.onLoad();\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.itemError = function ( url ) {\n\n\t\tif ( scope.onError !== undefined ) {\n\n\t\t\tscope.onError( url );\n\n\t\t}\n\n\t};\n\n\tthis.resolveURL = function ( url ) {\n\n\t\tif ( urlModifier ) {\n\n\t\t\treturn urlModifier( url );\n\n\t\t}\n\n\t\treturn url;\n\n\t};\n\n\tthis.setURLModifier = function ( transform ) {\n\n\t\turlModifier = transform;\n\n\t\treturn this;\n\n\t};\n\n\tthis.addHandler = function ( regex, loader ) {\n\n\t\thandlers.push( regex, loader );\n\n\t\treturn this;\n\n\t};\n\n\tthis.removeHandler = function ( regex ) {\n\n\t\tconst index = handlers.indexOf( regex );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\thandlers.splice( index, 2 );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tthis.getHandler = function ( file ) {\n\n\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\tconst regex = handlers[ i ];\n\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\treturn loader;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n}\n\nconst DefaultLoadingManager = new LoadingManager();\n\nfunction Loader( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\tthis.crossOrigin = 'anonymous';\n\tthis.path = '';\n\tthis.resourcePath = '';\n\tthis.requestHeader = {};\n\n}\n\nObject.assign( Loader.prototype, {\n\n\tload: function ( /* url, onLoad, onProgress, onError */ ) {},\n\n\tloadAsync: function ( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t},\n\n\tparse: function ( /* data */ ) {},\n\n\tsetCrossOrigin: function ( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t},\n\n\tsetPath: function ( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t},\n\n\tsetResourcePath: function ( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t},\n\n\tsetRequestHeader: function ( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n} );\n\nconst loading = {};\n\nfunction FileLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nFileLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: FileLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Check for data: URI\n\t\tconst dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\tconst dataUriRegexResult = url.match( dataUriRegex );\n\t\tlet request;\n\n\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\tif ( dataUriRegexResult ) {\n\n\t\t\tconst mimeType = dataUriRegexResult[ 1 ];\n\t\t\tconst isBase64 = !! dataUriRegexResult[ 2 ];\n\n\t\t\tlet data = dataUriRegexResult[ 3 ];\n\t\t\tdata = decodeURIComponent( data );\n\n\t\t\tif ( isBase64 ) data = atob( data );\n\n\t\t\ttry {\n\n\t\t\t\tlet response;\n\t\t\t\tconst responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\tconst view = new Uint8Array( data.length );\n\n\t\t\t\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\tresponse = new Blob( [ view.buffer ], { type: mimeType } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tresponse = view.buffer;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\t// Wait for next browser tick like standard XMLHttpRequest event dispatching does\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Initialise array for duplicate requests\n\n\t\t\tloading[ url ] = [];\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\trequest = new XMLHttpRequest();\n\n\t\t\trequest.open( 'GET', url, true );\n\n\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\tconst response = this.response;\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tif ( this.status === 200 || this.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( this.status === 0 ) console.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( response );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t}\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\trequest.addEventListener( 'abort', function ( event ) {\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\tfor ( const header in this.requestHeader ) {\n\n\t\t\t\trequest.setRequestHeader( header, this.requestHeader[ header ] );\n\n\t\t\t}\n\n\t\t\trequest.send( null );\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\treturn request;\n\n\t},\n\n\tsetResponseType: function ( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t},\n\n\tsetWithCredentials: function ( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t},\n\n\tsetMimeType: function ( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction AnimationLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nAnimationLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: AnimationLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n} );\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nfunction CompressedTextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nCompressedTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: CompressedTextureLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\t\ttexture.image = images;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n} );\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nfunction DataTextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nDataTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: DataTextureLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tconst texData = scope.parse( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n} );\n\nfunction ImageLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nImageLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: ImageLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.substr( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n} );\n\nfunction CubeTextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nCubeTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: CubeTextureLoader,\n\n\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n} );\n\nfunction TextureLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nTextureLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: TextureLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\n\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\tconst isJPEG = url.search( /\\.jpe?g($|\\?)/i ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n} );\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nfunction Curve() {\n\n\tthis.type = 'Curve';\n\n\tthis.arcLengthDivisions = 200;\n\n}\n\nObject.assign( Curve.prototype, {\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint: function ( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t},\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt: function ( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t},\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\t// Get total curve arc length\n\n\tgetLength: function () {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t},\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths: function ( divisions ) {\n\n\t\tif ( divisions === undefined ) divisions = this.arcLengthDivisions;\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t},\n\n\tupdateArcLengths: function () {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t},\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping: function ( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0, il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t},\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent: function ( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t},\n\n\tgetTangentAt: function ( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t},\n\n\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\t\t\ttangents[ i ].normalize();\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( MathUtils.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( MathUtils.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'EllipseCurve';\n\n\tthis.aX = aX || 0;\n\tthis.aY = aY || 0;\n\n\tthis.xRadius = xRadius || 1;\n\tthis.yRadius = yRadius || 1;\n\n\tthis.aStartAngle = aStartAngle || 0;\n\tthis.aEndAngle = aEndAngle || 2 * Math.PI;\n\n\tthis.aClockwise = aClockwise || false;\n\n\tthis.aRotation = aRotation || 0;\n\n}\n\nEllipseCurve.prototype = Object.create( Curve.prototype );\nEllipseCurve.prototype.constructor = EllipseCurve;\n\nEllipseCurve.prototype.isEllipseCurve = true;\n\nEllipseCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector2();\n\n\tconst twoPi = Math.PI * 2;\n\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t// ensures that deltaAngle is 0 .. 2 PI\n\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\tif ( samePoints ) {\n\n\t\t\tdeltaAngle = 0;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = twoPi;\n\n\t\t}\n\n\t}\n\n\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\tdeltaAngle = - twoPi;\n\n\t\t} else {\n\n\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t}\n\n\t}\n\n\tconst angle = this.aStartAngle + t * deltaAngle;\n\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\tif ( this.aRotation !== 0 ) {\n\n\t\tconst cos = Math.cos( this.aRotation );\n\t\tconst sin = Math.sin( this.aRotation );\n\n\t\tconst tx = x - this.aX;\n\t\tconst ty = y - this.aY;\n\n\t\t// Rotate the point about the center of the ellipse.\n\t\tx = tx * cos - ty * sin + this.aX;\n\t\ty = tx * sin + ty * cos + this.aY;\n\n\t}\n\n\treturn point.set( x, y );\n\n};\n\nEllipseCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.aX = source.aX;\n\tthis.aY = source.aY;\n\n\tthis.xRadius = source.xRadius;\n\tthis.yRadius = source.yRadius;\n\n\tthis.aStartAngle = source.aStartAngle;\n\tthis.aEndAngle = source.aEndAngle;\n\n\tthis.aClockwise = source.aClockwise;\n\n\tthis.aRotation = source.aRotation;\n\n\treturn this;\n\n};\n\n\nEllipseCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.aX = this.aX;\n\tdata.aY = this.aY;\n\n\tdata.xRadius = this.xRadius;\n\tdata.yRadius = this.yRadius;\n\n\tdata.aStartAngle = this.aStartAngle;\n\tdata.aEndAngle = this.aEndAngle;\n\n\tdata.aClockwise = this.aClockwise;\n\n\tdata.aRotation = this.aRotation;\n\n\treturn data;\n\n};\n\nEllipseCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.aX = json.aX;\n\tthis.aY = json.aY;\n\n\tthis.xRadius = json.xRadius;\n\tthis.yRadius = json.yRadius;\n\n\tthis.aStartAngle = json.aStartAngle;\n\tthis.aEndAngle = json.aEndAngle;\n\n\tthis.aClockwise = json.aClockwise;\n\n\tthis.aRotation = json.aRotation;\n\n\treturn this;\n\n};\n\nfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\tthis.type = 'ArcCurve';\n\n}\n\nArcCurve.prototype = Object.create( EllipseCurve.prototype );\nArcCurve.prototype.constructor = ArcCurve;\n\nArcCurve.prototype.isArcCurve = true;\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = new Vector3();\nconst px = new CubicPoly(), py = new CubicPoly(), pz = new CubicPoly();\n\nfunction CatmullRomCurve3( points, closed, curveType, tension ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CatmullRomCurve3';\n\n\tthis.points = points || [];\n\tthis.closed = closed || false;\n\tthis.curveType = curveType || 'centripetal';\n\tthis.tension = ( tension !== undefined ) ? tension : 0.5;\n\n}\n\nCatmullRomCurve3.prototype = Object.create( Curve.prototype );\nCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\nCatmullRomCurve3.prototype.isCatmullRomCurve3 = true;\n\nCatmullRomCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector3();\n\n\tconst points = this.points;\n\tconst l = points.length;\n\n\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\tlet intPoint = Math.floor( p );\n\tlet weight = p - intPoint;\n\n\tif ( this.closed ) {\n\n\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\tintPoint = l - 2;\n\t\tweight = 1;\n\n\t}\n\n\tlet p0, p1, p2, p3; // 4 points\n\n\tif ( this.closed || intPoint > 0 ) {\n\n\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate first point\n\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\tp0 = tmp;\n\n\t}\n\n\tp1 = points[ intPoint % l ];\n\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t} else {\n\n\t\t// extrapolate last point\n\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\tp3 = tmp;\n\n\t}\n\n\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t// init Centripetal / Chordal Catmull-Rom\n\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t// safety check for repeated points\n\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t}\n\n\tpoint.set(\n\t\tpx.calc( weight ),\n\t\tpy.calc( weight ),\n\t\tpz.calc( weight )\n\t);\n\n\treturn point;\n\n};\n\nCatmullRomCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tconst point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\tthis.closed = source.closed;\n\tthis.curveType = source.curveType;\n\tthis.tension = source.tension;\n\n\treturn this;\n\n};\n\nCatmullRomCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tconst point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\tdata.closed = this.closed;\n\tdata.curveType = this.curveType;\n\tdata.tension = this.tension;\n\n\treturn data;\n\n};\n\nCatmullRomCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tconst point = json.points[ i ];\n\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t}\n\n\tthis.closed = json.closed;\n\tthis.curveType = json.curveType;\n\tthis.tension = json.tension;\n\n\treturn this;\n\n};\n\n/**\n * Bezier Curves formulas obtained from\n * http://en.wikipedia.org/wiki/Bézier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\tthis.v3 = v3 || new Vector2();\n\n}\n\nCubicBezierCurve.prototype = Object.create( Curve.prototype );\nCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\nCubicBezierCurve.prototype.isCubicBezierCurve = true;\n\nCubicBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector2();\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'CubicBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\tthis.v3 = v3 || new Vector3();\n\n}\n\nCubicBezierCurve3.prototype = Object.create( Curve.prototype );\nCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\nCubicBezierCurve3.prototype.isCubicBezierCurve3 = true;\n\nCubicBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector3();\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\tpoint.set(\n\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t);\n\n\treturn point;\n\n};\n\nCubicBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\tthis.v3.copy( source.v3 );\n\n\treturn this;\n\n};\n\nCubicBezierCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\tdata.v3 = this.v3.toArray();\n\n\treturn data;\n\n};\n\nCubicBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\tthis.v3.fromArray( json.v3 );\n\n\treturn this;\n\n};\n\nfunction LineCurve( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve';\n\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nLineCurve.prototype = Object.create( Curve.prototype );\nLineCurve.prototype.constructor = LineCurve;\n\nLineCurve.prototype.isLineCurve = true;\n\nLineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector2();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve.prototype.getTangent = function ( t, optionalTarget ) {\n\n\tconst tangent = optionalTarget || new Vector2();\n\n\ttangent.copy( this.v2 ).sub( this.v1 ).normalize();\n\n\treturn tangent;\n\n};\n\nLineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction LineCurve3( v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'LineCurve3';\n\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nLineCurve3.prototype = Object.create( Curve.prototype );\nLineCurve3.prototype.constructor = LineCurve3;\n\nLineCurve3.prototype.isLineCurve3 = true;\n\nLineCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector3();\n\n\tif ( t === 1 ) {\n\n\t\tpoint.copy( this.v2 );\n\n\t} else {\n\n\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t}\n\n\treturn point;\n\n};\n\n// Line curve is linear, so we can overwrite default getPointAt\n\nLineCurve3.prototype.getPointAt = function ( u, optionalTarget ) {\n\n\treturn this.getPoint( u, optionalTarget );\n\n};\n\nLineCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nLineCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nLineCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve';\n\n\tthis.v0 = v0 || new Vector2();\n\tthis.v1 = v1 || new Vector2();\n\tthis.v2 = v2 || new Vector2();\n\n}\n\nQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\nQuadraticBezierCurve.prototype.isQuadraticBezierCurve = true;\n\nQuadraticBezierCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector2();\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'QuadraticBezierCurve3';\n\n\tthis.v0 = v0 || new Vector3();\n\tthis.v1 = v1 || new Vector3();\n\tthis.v2 = v2 || new Vector3();\n\n}\n\nQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\nQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\nQuadraticBezierCurve3.prototype.isQuadraticBezierCurve3 = true;\n\nQuadraticBezierCurve3.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector3();\n\n\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\tpoint.set(\n\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t);\n\n\treturn point;\n\n};\n\nQuadraticBezierCurve3.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.v0.copy( source.v0 );\n\tthis.v1.copy( source.v1 );\n\tthis.v2.copy( source.v2 );\n\n\treturn this;\n\n};\n\nQuadraticBezierCurve3.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.v0 = this.v0.toArray();\n\tdata.v1 = this.v1.toArray();\n\tdata.v2 = this.v2.toArray();\n\n\treturn data;\n\n};\n\nQuadraticBezierCurve3.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.v0.fromArray( json.v0 );\n\tthis.v1.fromArray( json.v1 );\n\tthis.v2.fromArray( json.v2 );\n\n\treturn this;\n\n};\n\nfunction SplineCurve( points ) {\n\n\tCurve.call( this );\n\n\tthis.type = 'SplineCurve';\n\n\tthis.points = points || [];\n\n}\n\nSplineCurve.prototype = Object.create( Curve.prototype );\nSplineCurve.prototype.constructor = SplineCurve;\n\nSplineCurve.prototype.isSplineCurve = true;\n\nSplineCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tconst point = optionalTarget || new Vector2();\n\n\tconst points = this.points;\n\tconst p = ( points.length - 1 ) * t;\n\n\tconst intPoint = Math.floor( p );\n\tconst weight = p - intPoint;\n\n\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\tconst p1 = points[ intPoint ];\n\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\tpoint.set(\n\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t);\n\n\treturn point;\n\n};\n\nSplineCurve.prototype.copy = function ( source ) {\n\n\tCurve.prototype.copy.call( this, source );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\tconst point = source.points[ i ];\n\n\t\tthis.points.push( point.clone() );\n\n\t}\n\n\treturn this;\n\n};\n\nSplineCurve.prototype.toJSON = function () {\n\n\tconst data = Curve.prototype.toJSON.call( this );\n\n\tdata.points = [];\n\n\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\tconst point = this.points[ i ];\n\t\tdata.points.push( point.toArray() );\n\n\t}\n\n\treturn data;\n\n};\n\nSplineCurve.prototype.fromJSON = function ( json ) {\n\n\tCurve.prototype.fromJSON.call( this, json );\n\n\tthis.points = [];\n\n\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\tconst point = json.points[ i ];\n\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t}\n\n\treturn this;\n\n};\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nfunction CurvePath() {\n\n\tCurve.call( this );\n\n\tthis.type = 'CurvePath';\n\n\tthis.curves = [];\n\tthis.autoClose = false; // Automatically closes the path\n\n}\n\nCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\tconstructor: CurvePath,\n\n\tadd: function ( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t},\n\n\tclosePath: function () {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t},\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint: function ( t ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurve.prototype.copy.call( this, source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = Curve.prototype.toJSON.call( this );\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurve.prototype.fromJSON.call( this, json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Path( points ) {\n\n\tCurvePath.call( this );\n\n\tthis.type = 'Path';\n\n\tthis.currentPoint = new Vector2();\n\n\tif ( points ) {\n\n\t\tthis.setFromPoints( points );\n\n\t}\n\n}\n\nPath.prototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\tconstructor: Path,\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t},\n\n\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t},\n\n\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t},\n\n\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t},\n\n\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tCurvePath.prototype.copy.call( this, source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = CurvePath.prototype.toJSON.call( this );\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tCurvePath.prototype.fromJSON.call( this, json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Shape( points ) {\n\n\tPath.call( this, points );\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\tthis.type = 'Shape';\n\n\tthis.holes = [];\n\n}\n\nShape.prototype = Object.assign( Object.create( Path.prototype ), {\n\n\tconstructor: Shape,\n\n\tgetPointsHoles: function ( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t},\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints: function ( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tPath.prototype.copy.call( this, source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = Path.prototype.toJSON.call( this );\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tPath.prototype.fromJSON.call( this, json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction Light( color, intensity ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Light';\n\n\tthis.color = new Color( color );\n\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\tthis.receiveShadow = undefined;\n\n}\n\nLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Light,\n\n\tisLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tObject3D.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\tLight.call( this, skyColor, intensity );\n\n\tthis.type = 'HemisphereLight';\n\n\tthis.castShadow = undefined;\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.groundColor = new Color( groundColor );\n\n}\n\nHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: HemisphereLight,\n\n\tisHemisphereLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction LightShadow( camera ) {\n\n\tthis.camera = camera;\n\n\tthis.bias = 0;\n\tthis.normalBias = 0;\n\tthis.radius = 1;\n\n\tthis.mapSize = new Vector2( 512, 512 );\n\n\tthis.map = null;\n\tthis.mapPass = null;\n\tthis.matrix = new Matrix4();\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis._frustum = new Frustum();\n\tthis._frameExtents = new Vector2( 1, 1 );\n\n\tthis._viewportCount = 1;\n\n\tthis._viewports = [\n\n\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t];\n\n}\n\nObject.assign( LightShadow.prototype, {\n\n\t_projScreenMatrix: new Matrix4(),\n\n\t_lightPositionWorld: new Vector3(),\n\n\t_lookTarget: new Vector3(),\n\n\tgetViewportCount: function () {\n\n\t\treturn this._viewportCount;\n\n\t},\n\n\tgetFrustum: function () {\n\n\t\treturn this._frustum;\n\n\t},\n\n\tupdateMatrices: function ( light ) {\n\n\t\tconst shadowCamera = this.camera,\n\t\t\tshadowMatrix = this.matrix,\n\t\t\tprojScreenMatrix = this._projScreenMatrix,\n\t\t\tlookTarget = this._lookTarget,\n\t\t\tlightPositionWorld = this._lightPositionWorld;\n\n\t\tlightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( lightPositionWorld );\n\n\t\tlookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( lookTarget );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\tprojScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( projScreenMatrix );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t},\n\n\tgetViewport: function ( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t},\n\n\tgetFrameExtents: function () {\n\n\t\treturn this._frameExtents;\n\n\t},\n\n\tcopy: function ( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n} );\n\nfunction SpotLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n}\n\nSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: SpotLightShadow,\n\n\tisSpotLightShadow: true,\n\n\tupdateMatrices: function ( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = MathUtils.RAD2DEG * 2 * light.angle;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tLightShadow.prototype.updateMatrices.call( this, light );\n\n\t}\n\n} );\n\nfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'SpotLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (17) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / Math.PI;\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new SpotLightShadow();\n\n}\n\nSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: SpotLight,\n\n\tisSpotLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction PointLightShadow() {\n\n\tLightShadow.call( this, new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\tthis._frameExtents = new Vector2( 4, 2 );\n\n\tthis._viewportCount = 6;\n\n\tthis._viewports = [\n\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t// following orientation:\n\t\t//\n\t\t// xzXZ\n\t\t// y Y\n\t\t//\n\t\t// X - Positive x direction\n\t\t// x - Negative x direction\n\t\t// Y - Positive y direction\n\t\t// y - Negative y direction\n\t\t// Z - Positive z direction\n\t\t// z - Negative z direction\n\n\t\t// positive X\n\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t// negative X\n\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t// positive Z\n\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t// negative Z\n\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t// positive Y\n\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t// negative Y\n\t\tnew Vector4( 1, 0, 1, 1 )\n\t];\n\n\tthis._cubeDirections = [\n\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t];\n\n\tthis._cubeUps = [\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t];\n\n}\n\nPointLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: PointLightShadow,\n\n\tisPointLightShadow: true,\n\n\tupdateMatrices: function ( light, viewportIndex ) {\n\n\t\tif ( viewportIndex === undefined ) viewportIndex = 0;\n\n\t\tconst camera = this.camera,\n\t\t\tshadowMatrix = this.matrix,\n\t\t\tlightPositionWorld = this._lightPositionWorld,\n\t\t\tlookTarget = this._lookTarget,\n\t\t\tprojScreenMatrix = this._projScreenMatrix;\n\n\t\tlightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( lightPositionWorld );\n\n\t\tlookTarget.copy( camera.position );\n\t\tlookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - lightPositionWorld.x, - lightPositionWorld.y, - lightPositionWorld.z );\n\n\t\tprojScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( projScreenMatrix );\n\n\t}\n\n} );\n\nfunction PointLight( color, intensity, distance, decay ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'PointLight';\n\n\tObject.defineProperty( this, 'power', {\n\t\tget: function () {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t},\n\t\tset: function ( power ) {\n\n\t\t\t// intensity = power per solid angle.\n\t\t\t// ref: equation (15) from https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t\t}\n\t} );\n\n\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\tthis.shadow = new PointLightShadow();\n\n}\n\nPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: PointLight,\n\n\tisPointLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\tCamera.call( this );\n\n\tthis.type = 'OrthographicCamera';\n\n\tthis.zoom = 1;\n\tthis.view = null;\n\n\tthis.left = ( left !== undefined ) ? left : - 1;\n\tthis.right = ( right !== undefined ) ? right : 1;\n\tthis.top = ( top !== undefined ) ? top : 1;\n\tthis.bottom = ( bottom !== undefined ) ? bottom : - 1;\n\n\tthis.near = ( near !== undefined ) ? near : 0.1;\n\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\tthis.updateProjectionMatrix();\n\n}\n\nOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\tconstructor: OrthographicCamera,\n\n\tisOrthographicCamera: true,\n\n\tcopy: function ( source, recursive ) {\n\n\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t},\n\n\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tclearViewOffset: function () {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t},\n\n\tupdateProjectionMatrix: function () {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.getInverse( this.projectionMatrix );\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction DirectionalLightShadow() {\n\n\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n}\n\nDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\tconstructor: DirectionalLightShadow,\n\n\tisDirectionalLightShadow: true,\n\n\tupdateMatrices: function ( light ) {\n\n\t\tLightShadow.prototype.updateMatrices.call( this, light );\n\n\t}\n\n} );\n\nfunction DirectionalLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'DirectionalLight';\n\n\tthis.position.copy( Object3D.DefaultUp );\n\tthis.updateMatrix();\n\n\tthis.target = new Object3D();\n\n\tthis.shadow = new DirectionalLightShadow();\n\n}\n\nDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: DirectionalLight,\n\n\tisDirectionalLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction AmbientLight( color, intensity ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'AmbientLight';\n\n\tthis.castShadow = undefined;\n\n}\n\nAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: AmbientLight,\n\n\tisAmbientLight: true\n\n} );\n\nfunction RectAreaLight( color, intensity, width, height ) {\n\n\tLight.call( this, color, intensity );\n\n\tthis.type = 'RectAreaLight';\n\n\tthis.width = ( width !== undefined ) ? width : 10;\n\tthis.height = ( height !== undefined ) ? height : 10;\n\n}\n\nRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: RectAreaLight,\n\n\tisRectAreaLight: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n} );\n\n/**\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nfunction SphericalHarmonics3() {\n\n\tthis.coefficients = [];\n\n\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\tthis.coefficients.push( new Vector3() );\n\n\t}\n\n}\n\nObject.assign( SphericalHarmonics3.prototype, {\n\n\tisSphericalHarmonics3: true,\n\n\tset: function ( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tzero: function () {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt: function ( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t},\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt: function ( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t},\n\n\tadd: function ( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\taddScaledSH: function ( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tscale: function ( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tlerp: function ( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t},\n\n\tcopy: function ( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tfromArray: function ( array, offset ) {\n\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\ttoArray: function ( array, offset ) {\n\n\t\tif ( array === undefined ) array = [];\n\t\tif ( offset === undefined ) offset = 0;\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n} );\n\nObject.assign( SphericalHarmonics3, {\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tgetBasisAt: function ( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n} );\n\nfunction LightProbe( sh, intensity ) {\n\n\tLight.call( this, undefined, intensity );\n\n\tthis.type = 'LightProbe';\n\n\tthis.sh = ( sh !== undefined ) ? sh : new SphericalHarmonics3();\n\n}\n\nLightProbe.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\tconstructor: LightProbe,\n\n\tisLightProbe: true,\n\n\tcopy: function ( source ) {\n\n\t\tLight.prototype.copy.call( this, source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t},\n\n\tfromJSON: function ( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = Light.prototype.toJSON.call( this, meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction MaterialLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n\tthis.textures = {};\n\n}\n\nMaterialLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: MaterialLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = new Materials[ json.type ]();\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = new Color().setHex( json.sheen );\n\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\t\tif ( json.morphNormals !== undefined ) material.morphNormals = json.morphNormals;\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.vertexTangents !== undefined ) material.vertexTangents = json.vertexTangents;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Deprecated\n\n\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\n\t\treturn material;\n\n\t},\n\n\tsetTextures: function ( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n} );\n\nconst LoaderUtils = {\n\n\tdecodeText: function ( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t},\n\n\textractUrlBase: function ( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.substr( 0, index + 1 );\n\n\t}\n\n};\n\nfunction InstancedBufferGeometry() {\n\n\tBufferGeometry.call( this );\n\n\tthis.type = 'InstancedBufferGeometry';\n\tthis.instanceCount = Infinity;\n\n}\n\nInstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {\n\n\tconstructor: InstancedBufferGeometry,\n\n\tisInstancedBufferGeometry: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferGeometry.prototype.copy.call( this, source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\ttoJSON: function () {\n\n\t\tconst data = BufferGeometry.prototype.toJSON.call( this );\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction InstancedBufferAttribute( array, itemSize, normalized, meshPerAttribute ) {\n\n\tif ( typeof ( normalized ) === 'number' ) {\n\n\t\tmeshPerAttribute = normalized;\n\n\t\tnormalized = false;\n\n\t\tconsole.error( 'THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.' );\n\n\t}\n\n\tBufferAttribute.call( this, array, itemSize, normalized );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {\n\n\tconstructor: InstancedBufferAttribute,\n\n\tisInstancedBufferAttribute: true,\n\n\tcopy: function ( source ) {\n\n\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ()\t{\n\n\t\tconst data = BufferAttribute.prototype.toJSON.call( this );\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction BufferGeometryLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nBufferGeometryLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: BufferGeometryLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = new TYPED_ARRAYS[ interleavedBuffer.type ]( buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\t// Workaround for IE11 pre KB2929437. See #11440\n\tUint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction ObjectLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nObjectLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: ObjectLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json, onLoad ) {\n\n\t\tconst shapes = this.parseShape( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials );\n\n\t\tif ( json.animations ) {\n\n\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t}\n\n\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t},\n\n\tparseShape: function ( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t},\n\n\tparseGeometries: function ( json, shapes ) {\n\n\t\tconst geometries = {};\n\t\tlet geometryShapes;\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\tcase 'DodecahedronBufferGeometry':\n\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\tcase 'IcosahedronBufferGeometry':\n\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\tcase 'OctahedronBufferGeometry':\n\t\t\t\t\tcase 'TetrahedronGeometry':\n\t\t\t\t\tcase 'TetrahedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TubeGeometry':\n\t\t\t\t\tcase 'TubeBufferGeometry':\n\n\t\t\t\t\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t\t\t\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\tdata.closed\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PolyhedronGeometry':\n\t\t\t\t\tcase 'PolyhedronBufferGeometry':\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tdata.vertices,\n\t\t\t\t\t\t\tdata.indices,\n\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\tdata.details\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ShapeGeometry':\n\t\t\t\t\tcase 'ShapeBufferGeometry':\n\n\t\t\t\t\t\tgeometryShapes = [];\n\n\t\t\t\t\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.curveSegments\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tcase 'ExtrudeGeometry':\n\t\t\t\t\tcase 'ExtrudeBufferGeometry':\n\n\t\t\t\t\t\tgeometryShapes = [];\n\n\t\t\t\t\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\t\t\t\t\tgeometryShapes.push( shape );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst extrudePath = data.options.extrudePath;\n\n\t\t\t\t\t\tif ( extrudePath !== undefined ) {\n\n\t\t\t\t\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\tgeometryShapes,\n\t\t\t\t\t\t\tdata.options\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Loading \"Geometry\" is not supported anymore.' );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t},\n\n\tparseMaterials: function ( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t// Deprecated\n\n\t\t\t\t\tconst array = [];\n\n\t\t\t\t\tfor ( let j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\tconst material = data.materials[ j ];\n\n\t\t\t\t\t\tif ( cache[ material.uuid ] === undefined ) {\n\n\t\t\t\t\t\t\tcache[ material.uuid ] = loader.parse( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tarray.push( cache[ material.uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t},\n\n\tparseAnimations: function ( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst data = json[ i ];\n\n\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\tif ( data.uuid !== undefined ) clip.uuid = data.uuid;\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t},\n\n\tparseImages: function ( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\timages[ image.uuid ] = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( currentUrl ) ? currentUrl : scope.resourcePath + currentUrl;\n\n\t\t\t\t\t\timages[ image.uuid ].push( loadImage( path ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.resourcePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t},\n\n\tparseTextures: function ( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( images[ data.image ] ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture( images[ data.image ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = new Texture( images[ data.image ] );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t},\n\n\tparseObject: function ( data, geometries, materials ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new BufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n} );\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\tCubeUVRefractionMapping: CubeUVRefractionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nfunction ImageBitmapLoader( manager ) {\n\n\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t}\n\n\tif ( typeof fetch === 'undefined' ) {\n\n\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t}\n\n\tLoader.call( this, manager );\n\n\tthis.options = { premultiplyAlpha: 'none' };\n\n}\n\nImageBitmapLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: ImageBitmapLoader,\n\n\tisImageBitmapLoader: true,\n\n\tsetOptions: function setOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t},\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tfetch( url ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, scope.options );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n} );\n\nfunction ShapePath() {\n\n\tthis.type = 'ShapePath';\n\n\tthis.color = new Color();\n\n\tthis.subPaths = [];\n\tthis.currentPath = null;\n\n}\n\nObject.assign( ShapePath.prototype, {\n\n\tmoveTo: function ( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t},\n\n\tlineTo: function ( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t},\n\n\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t},\n\n\tsplineThru: function ( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t},\n\n\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tlet solid, tmpPath, tmpShape, shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tconst toChange = [];\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\n\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction Font( data ) {\n\n\tthis.type = 'Font';\n\n\tthis.data = data;\n\n}\n\nObject.assign( Font.prototype, {\n\n\tisFont: true,\n\n\tgenerateShapes: function ( text, size ) {\n\n\t\tif ( size === undefined ) size = 100;\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\nfunction createPaths( text, size, data ) {\n\n\tconst chars = Array.from ? Array.from( text ) : String( text ).split( '' ); // workaround for IE11, see #13988\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\t\t\toffsetX += ret.offsetX;\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nfunction FontLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nFontLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: FontLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t}\n\n\t\t\tconst font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n} );\n\nlet _context;\n\nconst AudioContext = {\n\n\tgetContext: function () {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t},\n\n\tsetContext: function ( value ) {\n\n\t\t_context = value;\n\n\t}\n\n};\n\nfunction AudioLoader( manager ) {\n\n\tLoader.call( this, manager );\n\n}\n\nAudioLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: AudioLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n} );\n\nfunction HemisphereLightProbe( skyColor, groundColor, intensity ) {\n\n\tLightProbe.call( this, undefined, intensity );\n\n\tconst color1 = new Color().set( skyColor );\n\tconst color2 = new Color().set( groundColor );\n\n\tconst sky = new Vector3( color1.r, color1.g, color1.b );\n\tconst ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\tconst c0 = Math.sqrt( Math.PI );\n\tconst c1 = c0 * Math.sqrt( 0.75 );\n\n\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n}\n\nHemisphereLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), {\n\n\tconstructor: HemisphereLightProbe,\n\n\tisHemisphereLightProbe: true,\n\n\tcopy: function ( source ) { // modifying colors not currently supported\n\n\t\tLightProbe.prototype.copy.call( this, source );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = LightProbe.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\nfunction AmbientLightProbe( color, intensity ) {\n\n\tLightProbe.call( this, undefined, intensity );\n\n\tconst color1 = new Color().set( color );\n\n\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n}\n\nAmbientLightProbe.prototype = Object.assign( Object.create( LightProbe.prototype ), {\n\n\tconstructor: AmbientLightProbe,\n\n\tisAmbientLightProbe: true,\n\n\tcopy: function ( source ) { // modifying color not currently supported\n\n\t\tLightProbe.prototype.copy.call( this, source );\n\n\t\treturn this;\n\n\t},\n\n\ttoJSON: function ( meta ) {\n\n\t\tconst data = LightProbe.prototype.toJSON.call( this, meta );\n\n\t\t// data.sh = this.sh.toArray(); // todo\n\n\t\treturn data;\n\n\t}\n\n} );\n\nconst _eyeRight = new Matrix4();\nconst _eyeLeft = new Matrix4();\n\nfunction StereoCamera() {\n\n\tthis.type = 'StereoCamera';\n\n\tthis.aspect = 1;\n\n\tthis.eyeSep = 0.064;\n\n\tthis.cameraL = new PerspectiveCamera();\n\tthis.cameraL.layers.enable( 1 );\n\tthis.cameraL.matrixAutoUpdate = false;\n\n\tthis.cameraR = new PerspectiveCamera();\n\tthis.cameraR.layers.enable( 2 );\n\tthis.cameraR.matrixAutoUpdate = false;\n\n\tthis._cache = {\n\t\tfocus: null,\n\t\tfov: null,\n\t\taspect: null,\n\t\tnear: null,\n\t\tfar: null,\n\t\tzoom: null,\n\t\teyeSep: null\n\t};\n\n}\n\nObject.assign( StereoCamera.prototype, {\n\n\tupdate: function ( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\tconst projectionMatrix = camera.projectionMatrix.clone();\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( MathUtils.DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\tprojectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n} );\n\nfunction Clock( autoStart ) {\n\n\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\tthis.startTime = 0;\n\tthis.oldTime = 0;\n\tthis.elapsedTime = 0;\n\n\tthis.running = false;\n\n}\n\nObject.assign( Clock.prototype, {\n\n\tstart: function () {\n\n\t\tthis.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t},\n\n\tgetElapsedTime: function () {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t},\n\n\tgetDelta: function () {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = ( typeof performance === 'undefined' ? Date : performance ).now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n} );\n\nconst _position$2 = new Vector3();\nconst _quaternion$3 = new Quaternion();\nconst _scale$1 = new Vector3();\nconst _orientation = new Vector3();\n\nfunction AudioListener() {\n\n\tObject3D.call( this );\n\n\tthis.type = 'AudioListener';\n\n\tthis.context = AudioContext.getContext();\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( this.context.destination );\n\n\tthis.filter = null;\n\n\tthis.timeDelta = 0;\n\n\t// private\n\n\tthis._clock = new Clock();\n\n}\n\nAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: AudioListener,\n\n\tgetInput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tremoveFilter: function ( ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.filter;\n\n\t},\n\n\tsetFilter: function ( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t},\n\n\tgetMasterVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetMasterVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$2, _quaternion$3, _scale$1 );\n\n\t\t_orientation.set( 0, 0, - 1 ).applyQuaternion( _quaternion$3 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$2.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$2.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$2.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$2.x, _position$2.y, _position$2.z );\n\t\t\tlistener.setOrientation( _orientation.x, _orientation.y, _orientation.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n} );\n\nfunction Audio( listener ) {\n\n\tObject3D.call( this );\n\n\tthis.type = 'Audio';\n\n\tthis.listener = listener;\n\tthis.context = listener.context;\n\n\tthis.gain = this.context.createGain();\n\tthis.gain.connect( listener.getInput() );\n\n\tthis.autoplay = false;\n\n\tthis.buffer = null;\n\tthis.detune = 0;\n\tthis.loop = false;\n\tthis.loopStart = 0;\n\tthis.loopEnd = 0;\n\tthis.offset = 0;\n\tthis.duration = undefined;\n\tthis.playbackRate = 1;\n\tthis.isPlaying = false;\n\tthis.hasPlaybackControl = true;\n\tthis.sourceType = 'empty';\n\n\tthis._startedAt = 0;\n\tthis._progress = 0;\n\n\tthis.filters = [];\n\n}\n\nAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\tconstructor: Audio,\n\n\tgetOutput: function () {\n\n\t\treturn this.gain;\n\n\t},\n\n\tsetNodeSource: function ( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetMediaElementSource: function ( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetMediaStreamSource: function ( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t},\n\n\tsetBuffer: function ( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t},\n\n\tplay: function ( delay ) {\n\n\t\tif ( delay === undefined ) delay = 0;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t},\n\n\tpause: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t},\n\n\tconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tdisconnect: function () {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetFilters: function () {\n\n\t\treturn this.filters;\n\n\t},\n\n\tsetFilters: function ( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value;\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetDetune: function ( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetDetune: function () {\n\n\t\treturn this.detune;\n\n\t},\n\n\tgetFilter: function () {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t},\n\n\tsetFilter: function ( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t},\n\n\tsetPlaybackRate: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tgetPlaybackRate: function () {\n\n\t\treturn this.playbackRate;\n\n\t},\n\n\tonEnded: function () {\n\n\t\tthis.isPlaying = false;\n\n\t},\n\n\tgetLoop: function () {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t},\n\n\tsetLoop: function ( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetLoopStart: function ( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t},\n\n\tsetLoopEnd: function ( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetVolume: function () {\n\n\t\treturn this.gain.gain.value;\n\n\t},\n\n\tsetVolume: function ( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n} );\n\nconst _position$3 = new Vector3();\nconst _quaternion$4 = new Quaternion();\nconst _scale$2 = new Vector3();\nconst _orientation$1 = new Vector3();\n\nfunction PositionalAudio( listener ) {\n\n\tAudio.call( this, listener );\n\n\tthis.panner = this.context.createPanner();\n\tthis.panner.panningModel = 'HRTF';\n\tthis.panner.connect( this.gain );\n\n}\n\nPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\tconstructor: PositionalAudio,\n\n\tgetOutput: function () {\n\n\t\treturn this.panner;\n\n\t},\n\n\tgetRefDistance: function () {\n\n\t\treturn this.panner.refDistance;\n\n\t},\n\n\tsetRefDistance: function ( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetRolloffFactor: function () {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t},\n\n\tsetRolloffFactor: function ( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetDistanceModel: function () {\n\n\t\treturn this.panner.distanceModel;\n\n\t},\n\n\tsetDistanceModel: function ( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t},\n\n\tgetMaxDistance: function () {\n\n\t\treturn this.panner.maxDistance;\n\n\t},\n\n\tsetMaxDistance: function ( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t},\n\n\tsetDirectionalCone: function ( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t},\n\n\tupdateMatrixWorld: function ( force ) {\n\n\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$4, _scale$2 );\n\n\t\t_orientation$1.set( 0, 0, 1 ).applyQuaternion( _quaternion$4 );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position$3.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position$3.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position$3.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position$3.x, _position$3.y, _position$3.z );\n\t\t\tpanner.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z );\n\n\t\t}\n\n\t}\n\n} );\n\nfunction AudioAnalyser( audio, fftSize ) {\n\n\tthis.analyser = audio.context.createAnalyser();\n\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\taudio.getOutput().connect( this.analyser );\n\n}\n\nObject.assign( AudioAnalyser.prototype, {\n\n\tgetFrequencyData: function () {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t},\n\n\tgetAverageFrequency: function () {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n} );\n\nfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\tthis.binding = binding;\n\tthis.valueSize = valueSize;\n\n\tlet mixFunction,\n\t\tmixFunctionAdditive,\n\t\tsetIdentity;\n\n\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t//\n\t// interpolators can use .buffer as their .result\n\t// the data then goes to 'incoming'\n\t//\n\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t// the cumulative result and are compared to detect\n\t// changes\n\t//\n\t// 'orig' stores the original state of the property\n\t//\n\t// 'add' is used for additive cumulative results\n\t//\n\t// 'work' is optional and is only present for quaternion types. It is used\n\t// to store intermediate quaternion multiplication results\n\n\tswitch ( typeName ) {\n\n\t\tcase 'quaternion':\n\t\t\tmixFunction = this._slerp;\n\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\tthis._workIndex = 5;\n\t\t\tbreak;\n\n\t\tcase 'string':\n\t\tcase 'bool':\n\t\t\tmixFunction = this._select;\n\n\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t// additive is not relevant for non-numeric types\n\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tmixFunction = this._lerp;\n\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t}\n\n\tthis._mixBufferRegion = mixFunction;\n\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\tthis._setIdentity = setIdentity;\n\tthis._origIndex = 3;\n\tthis._addIndex = 4;\n\n\tthis.cumulativeWeight = 0;\n\tthis.cumulativeWeightAdditive = 0;\n\n\tthis.useCount = 0;\n\tthis.referenceCount = 0;\n\n}\n\nObject.assign( PropertyMixer.prototype, {\n\n\t// accumulate data in the 'incoming' region into 'accu'\n\taccumulate: function ( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t},\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive: function ( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t},\n\n\t// apply the state of 'accu' to the binding when accus differ\n\tapply: function ( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState: function () {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t},\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState: function () {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t},\n\n\t_setAdditiveIdentityNumeric: function () {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t},\n\n\t_setAdditiveIdentityQuaternion: function () {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * 4 + 3 ] = 1;\n\n\t},\n\n\t_setAdditiveIdentityOther: function () {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t},\n\n\n\t// mix functions\n\n\t_select: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_slerp: function ( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t},\n\n\t_slerpAdditive: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t},\n\n\t_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t},\n\n\t_lerpAdditive: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n} );\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\nfunction Composite( targetGroup, path, optionalParsedPath ) {\n\n\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis._targetGroup = targetGroup;\n\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n}\n\nObject.assign( Composite.prototype, {\n\n\tgetValue: function ( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t},\n\n\tsetValue: function ( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t},\n\n\tbind: function () {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t},\n\n\tunbind: function () {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n} );\n\n\nfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\tthis.path = path;\n\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\tthis.rootNode = rootNode;\n\n}\n\nObject.assign( PropertyBinding, {\n\n\tComposite: Composite,\n\n\tcreate: function ( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tsanitizeNodeName: function ( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t},\n\n\tparseTrackName: function ( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( ! matches ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t},\n\n\tfindNode: function ( root, nodeName ) {\n\n\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \".\" || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n} );\n\nObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable: function () {},\n\t_setValue_unavailable: function () {},\n\n\tBindingType: {\n\t\tDirect: 0,\n\t\tEntireArray: 1,\n\t\tArrayElement: 2,\n\t\tHasFromToArray: 3\n\t},\n\n\tVersioning: {\n\t\tNone: 0,\n\t\tNeedsUpdate: 1,\n\t\tMatrixWorldNeedsUpdate: 2\n\t},\n\n\tGetterByBindingType: [\n\n\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t},\n\n\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\tconst source = this.resolvedProperty;\n\n\t\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t}\n\n\t\t},\n\n\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t},\n\n\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t}\n\n\t],\n\n\tSetterByBindingTypeAndVersioning: [\n\n\t\t[\n\t\t\t// Direct\n\n\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// EntireArray\n\n\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\tconst dest = this.resolvedProperty;\n\n\t\t\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tconst dest = this.resolvedProperty;\n\n\t\t\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tconst dest = this.resolvedProperty;\n\n\t\t\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t}\n\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// ArrayElement\n\n\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t], [\n\n\t\t\t// HasToFromArray\n\n\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t},\n\n\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t]\n\n\t],\n\n\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t// prototype version of these methods with one that represents\n\t\t// the bound state. When the property is not found, the methods\n\t\t// become no-ops.\n\n\t},\n\n\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t},\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind: function () {\n\n\t\tlet targetObject = this.node,\n\t\t\tparsedPath = this.parsedPath,\n\n\t\t\tobjectName = parsedPath.objectName,\n\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t},\n\n\tunbind: function () {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n} );\n\n// DECLARE ALIAS AFTER assign prototype\nObject.assign( PropertyBinding.prototype, {\n\n\t// initial state of these methods that calls 'bind'\n\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n} );\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nfunction AnimationObjectGroup() {\n\n\tthis.uuid = MathUtils.generateUUID();\n\n\t// cached objects followed by the active ones\n\tthis._objects = Array.prototype.slice.call( arguments );\n\n\tthis.nCachedObjects_ = 0; // threshold\n\t// note: read by PropertyBinding.Composite\n\n\tconst indices = {};\n\tthis._indicesByUUID = indices; // for bookkeeping\n\n\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t}\n\n\tthis._paths = []; // inside: string\n\tthis._parsedPaths = []; // inside: { we don't care, here }\n\tthis._bindings = []; // inside: Array< PropertyBinding >\n\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\tconst scope = this;\n\n\tthis.stats = {\n\n\t\tobjects: {\n\t\t\tget total() {\n\n\t\t\t\treturn scope._objects.length;\n\n\t\t\t},\n\t\t\tget inUse() {\n\n\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t}\n\t\t},\n\t\tget bindingsPerObject() {\n\n\t\t\treturn scope._bindings.length;\n\n\t\t}\n\n\t};\n\n}\n\nObject.assign( AnimationObjectGroup.prototype, {\n\n\tisAnimationObjectGroup: true,\n\n\tadd: function () {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\tremove: function () {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// remove & forget\n\tuncache: function () {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t},\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_: function ( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tlet indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ],\n\t\t\tbindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t},\n\n\tunsubscribe_: function ( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n} );\n\nfunction AnimationAction( mixer, clip, localRoot, blendMode ) {\n\n\tthis._mixer = mixer;\n\tthis._clip = clip;\n\tthis._localRoot = localRoot || null;\n\tthis.blendMode = blendMode || clip.blendMode;\n\n\tconst tracks = clip.tracks,\n\t\tnTracks = tracks.length,\n\t\tinterpolants = new Array( nTracks );\n\n\tconst interpolantSettings = {\n\t\tendingStart: ZeroCurvatureEnding,\n\t\tendingEnd: ZeroCurvatureEnding\n\t};\n\n\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\tinterpolants[ i ] = interpolant;\n\t\tinterpolant.settings = interpolantSettings;\n\n\t}\n\n\tthis._interpolantSettings = interpolantSettings;\n\n\tthis._interpolants = interpolants; // bound by the mixer\n\n\t// inside: PropertyMixer (managed by the mixer)\n\tthis._propertyBindings = new Array( nTracks );\n\n\tthis._cacheIndex = null; // for the memory manager\n\tthis._byClipCacheIndex = null; // for the memory manager\n\n\tthis._timeScaleInterpolant = null;\n\tthis._weightInterpolant = null;\n\n\tthis.loop = LoopRepeat;\n\tthis._loopCount = - 1;\n\n\t// global mixer time when the action is to be started\n\t// it's set back to 'null' upon start of the action\n\tthis._startTime = null;\n\n\t// scaled local time of the action\n\t// gets clamped or wrapped to 0..clip.duration according to loop\n\tthis.time = 0;\n\n\tthis.timeScale = 1;\n\tthis._effectiveTimeScale = 1;\n\n\tthis.weight = 1;\n\tthis._effectiveWeight = 1;\n\n\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\tthis.paused = false; // true -> zero effective time scale\n\tthis.enabled = true; // false -> zero effective weight\n\n\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n}\n\nObject.assign( AnimationAction.prototype, {\n\n\t// State & Scheduling\n\n\tplay: function () {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t},\n\n\tstop: function () {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t},\n\n\treset: function () {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t},\n\n\tisRunning: function () {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t},\n\n\t// return true when play has been called\n\tisScheduled: function () {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t},\n\n\tstartAt: function ( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t},\n\n\tsetLoop: function ( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t},\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight: function ( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t},\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight: function () {\n\n\t\treturn this._effectiveWeight;\n\n\t},\n\n\tfadeIn: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t},\n\n\tfadeOut: function ( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t},\n\n\tcrossFadeFrom: function ( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tcrossFadeTo: function ( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t},\n\n\tstopFading: function () {\n\n\t\tlet weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale: function ( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale: function () {\n\n\t\treturn this._effectiveTimeScale;\n\n\t},\n\n\tsetDuration: function ( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\tsyncWith: function ( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t},\n\n\thalt: function ( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t},\n\n\twarp: function ( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t},\n\n\tstopWarping: function () {\n\n\t\tlet timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Object Accessors\n\n\tgetMixer: function () {\n\n\t\treturn this._mixer;\n\n\t},\n\n\tgetClip: function () {\n\n\t\treturn this._clip;\n\n\t},\n\n\tgetRoot: function () {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t},\n\n\t// Interna\n\n\t_update: function ( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t}\n\n\t\t\t// start\n\n\t\t\tthis._startTime = null; // unschedule\n\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_updateWeight: function ( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t},\n\n\t_updateTimeScale: function ( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t},\n\n\t_updateTime: function ( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t},\n\n\t_setEndings: function ( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_scheduleFading: function ( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nfunction AnimationMixer( root ) {\n\n\tthis._root = root;\n\tthis._initMemoryManager();\n\tthis._accuIndex = 0;\n\n\tthis.time = 0;\n\n\tthis.timeScale = 1.0;\n\n}\n\nAnimationMixer.prototype = Object.assign( Object.create( EventDispatcher.prototype ), {\n\n\tconstructor: AnimationMixer,\n\n\t_bindAction: function ( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t},\n\n\t_activateAction: function ( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t},\n\n\t_deactivateAction: function ( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t},\n\n\t// Memory manager\n\n\t_initMemoryManager: function () {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t},\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction: function ( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t},\n\n\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t},\n\n\t_removeInactiveAction: function ( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t},\n\n\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t_lendAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t},\n\n\t_takeBackAction: function ( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t},\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t},\n\n\t_removeInactiveBinding: function ( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t},\n\n\t_lendBinding: function ( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t},\n\n\t_takeBackBinding: function ( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t},\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant: function () {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t},\n\n\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t},\n\n\t_controlInterpolantsResultBuffer: new Float32Array( 1 ),\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction: function ( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tlet actionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\tprototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t},\n\n\t// get an existing action\n\texistingAction: function ( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t},\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction: function () {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// advance the time and update apply the animation\n\tupdate: function ( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime: function ( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t},\n\n\t// return this mixer's root target object\n\tgetRoot: function () {\n\n\t\treturn this._root;\n\n\t},\n\n\t// free all resources specific to a particular clip\n\tuncacheClip: function ( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t},\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot: function ( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t},\n\n\t// remove a targeted clip from the cache\n\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n} );\n\nfunction Uniform( value ) {\n\n\tif ( typeof value === 'string' ) {\n\n\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\tvalue = arguments[ 1 ];\n\n\t}\n\n\tthis.value = value;\n\n}\n\nUniform.prototype.clone = function () {\n\n\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n};\n\nfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\tInterleavedBuffer.call( this, array, stride );\n\n\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n}\n\nInstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {\n\n\tconstructor: InstancedInterleavedBuffer,\n\n\tisInstancedInterleavedBuffer: true,\n\n\tcopy: function ( source ) {\n\n\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function ( data ) {\n\n\t\tconst ib = InterleavedBuffer.prototype.clone.call( this, data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t},\n\n\ttoJSON: function ( data ) {\n\n\t\tconst json = InterleavedBuffer.prototype.toJSON.call( this, data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n} );\n\nfunction Raycaster( origin, direction, near, far ) {\n\n\tthis.ray = new Ray( origin, direction );\n\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\tthis.near = near || 0;\n\tthis.far = far || Infinity;\n\tthis.camera = null;\n\tthis.layers = new Layers();\n\n\tthis.params = {\n\t\tMesh: {},\n\t\tLine: { threshold: 1 },\n\t\tLOD: {},\n\t\tPoints: { threshold: 1 },\n\t\tSprite: {}\n\t};\n\n\tObject.defineProperties( this.params, {\n\t\tPointCloud: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\treturn this.Points;\n\n\t\t\t}\n\t\t}\n\t} );\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\nObject.assign( Raycaster.prototype, {\n\n\tset: function ( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t},\n\n\tsetFromCamera: function ( coords, camera ) {\n\n\t\tif ( ( camera && camera.isPerspectiveCamera ) ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( ( camera && camera.isOrthographicCamera ) ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t}\n\n\t},\n\n\tintersectObject: function ( object, recursive, optionalTarget ) {\n\n\t\tconst intersects = optionalTarget || [];\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t},\n\n\tintersectObjects: function ( objects, recursive, optionalTarget ) {\n\n\t\tconst intersects = optionalTarget || [];\n\n\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\treturn intersects;\n\n\t\t}\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n} );\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be betwee EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( MathUtils.clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nfunction Cylindrical( radius, theta, y ) {\n\n\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\treturn this;\n\n}\n\nObject.assign( Cylindrical.prototype, {\n\n\tset: function ( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t},\n\n\tsetFromVector3: function ( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t},\n\n\tsetFromCartesianCoords: function ( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n} );\n\nconst _vector$7 = new Vector2();\n\nfunction Box2( min, max ) {\n\n\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n}\n\nObject.assign( Box2.prototype, {\n\n\tset: function ( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t},\n\n\tsetFromPoints: function ( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t},\n\n\tsetFromCenterAndSize: function ( center, size ) {\n\n\t\tconst halfSize = _vector$7.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tmakeEmpty: function () {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t},\n\n\tisEmpty: function () {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getCenter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t},\n\n\tgetSize: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getSize() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t},\n\n\texpandByPoint: function ( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t},\n\n\texpandByVector: function ( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t},\n\n\texpandByScalar: function ( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t},\n\n\tcontainsPoint: function ( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t},\n\n\tcontainsBox: function ( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t},\n\n\tgetParameter: function ( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .getParameter() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t},\n\n\tintersectsBox: function ( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t},\n\n\tclampPoint: function ( point, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .clampPoint() target is now required' );\n\t\t\ttarget = new Vector2();\n\n\t\t}\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t},\n\n\tdistanceToPoint: function ( point ) {\n\n\t\tconst clampedPoint = _vector$7.copy( point ).clamp( this.min, this.max );\n\t\treturn clampedPoint.sub( point ).length();\n\n\t},\n\n\tintersect: function ( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t},\n\n\tunion: function ( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t},\n\n\ttranslate: function ( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n} );\n\nconst _startP = new Vector3();\nconst _startEnd = new Vector3();\n\nfunction Line3( start, end ) {\n\n\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n}\n\nObject.assign( Line3.prototype, {\n\n\tset: function ( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t},\n\n\tclone: function () {\n\n\t\treturn new this.constructor().copy( this );\n\n\t},\n\n\tcopy: function ( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t},\n\n\tgetCenter: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .getCenter() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t},\n\n\tdelta: function ( target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .delta() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t},\n\n\tdistanceSq: function () {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t},\n\n\tdistance: function () {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t},\n\n\tat: function ( t, target ) {\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .at() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tclosestPointToPointParameter: function ( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = MathUtils.clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t},\n\n\tclosestPointToPoint: function ( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\tif ( target === undefined ) {\n\n\t\t\tconsole.warn( 'THREE.Line3: .closestPointToPoint() target is now required' );\n\t\t\ttarget = new Vector3();\n\n\t\t}\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t},\n\n\tapplyMatrix4: function ( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t},\n\n\tequals: function ( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n} );\n\nfunction ImmediateRenderObject( material ) {\n\n\tObject3D.call( this );\n\n\tthis.material = material;\n\tthis.render = function ( /* renderCallback */ ) {};\n\n\tthis.hasPositions = false;\n\tthis.hasNormals = false;\n\tthis.hasColors = false;\n\tthis.hasUvs = false;\n\n\tthis.positionArray = null;\n\tthis.normalArray = null;\n\tthis.colorArray = null;\n\tthis.uvArray = null;\n\n\tthis.count = 0;\n\n}\n\nImmediateRenderObject.prototype = Object.create( Object3D.prototype );\nImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\nImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\nconst _vector$8 = new Vector3();\n\nfunction SpotLightHelper( light, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tconst geometry = new BufferGeometry();\n\n\tconst positions = [\n\t\t0, 0, 0, \t0, 0, 1,\n\t\t0, 0, 0, \t1, 0, 1,\n\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t0, 0, 0, \t0, 1, 1,\n\t\t0, 0, 0, \t0, - 1, 1\n\t];\n\n\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\tpositions.push(\n\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t);\n\n\t}\n\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\tthis.cone = new LineSegments( geometry, material );\n\tthis.add( this.cone );\n\n\tthis.update();\n\n}\n\nSpotLightHelper.prototype = Object.create( Object3D.prototype );\nSpotLightHelper.prototype.constructor = SpotLightHelper;\n\nSpotLightHelper.prototype.dispose = function () {\n\n\tthis.cone.geometry.dispose();\n\tthis.cone.material.dispose();\n\n};\n\nSpotLightHelper.prototype.update = function () {\n\n\tthis.light.updateMatrixWorld();\n\n\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t_vector$8.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\tthis.cone.lookAt( _vector$8 );\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.cone.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.cone.material.color.copy( this.light.color );\n\n\t}\n\n};\n\nconst _vector$9 = new Vector3();\nconst _boneMatrix = new Matrix4();\nconst _matrixWorldInv = new Matrix4();\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object && object.isBone ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nfunction SkeletonHelper( object ) {\n\n\tconst bones = getBoneList( object );\n\n\tconst geometry = new BufferGeometry();\n\n\tconst vertices = [];\n\tconst colors = [];\n\n\tconst color1 = new Color( 0, 0, 1 );\n\tconst color2 = new Color( 0, 1, 0 );\n\n\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\tconst bone = bones[ i ];\n\n\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t}\n\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.type = 'SkeletonHelper';\n\n\tthis.root = object;\n\tthis.bones = bones;\n\n\tthis.matrix = object.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n}\n\nSkeletonHelper.prototype = Object.create( LineSegments.prototype );\nSkeletonHelper.prototype.constructor = SkeletonHelper;\n\nSkeletonHelper.prototype.isSkeletonHelper = true;\n\nSkeletonHelper.prototype.updateMatrixWorld = function ( force ) {\n\n\tconst bones = this.bones;\n\n\tconst geometry = this.geometry;\n\tconst position = geometry.getAttribute( 'position' );\n\n\t_matrixWorldInv.getInverse( this.root.matrixWorld );\n\n\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\tconst bone = bones[ i ];\n\n\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t_vector$9.setFromMatrixPosition( _boneMatrix );\n\t\t\tposition.setXYZ( j, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t_vector$9.setFromMatrixPosition( _boneMatrix );\n\t\t\tposition.setXYZ( j + 1, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\tj += 2;\n\n\t\t}\n\n\t}\n\n\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\nfunction PointLightHelper( light, sphereSize, color ) {\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.color = color;\n\n\tconst geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\tMesh.call( this, geometry, material );\n\n\tthis.type = 'PointLightHelper';\n\n\tthis.matrix = this.light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n\n\t/*\n\tconst distanceGeometry = new THREE.IcosahedronBufferGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n}\n\nPointLightHelper.prototype = Object.create( Mesh.prototype );\nPointLightHelper.prototype.constructor = PointLightHelper;\n\nPointLightHelper.prototype.dispose = function () {\n\n\tthis.geometry.dispose();\n\tthis.material.dispose();\n\n};\n\nPointLightHelper.prototype.update = function () {\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.material.color.copy( this.light.color );\n\n\t}\n\n\t/*\n\tconst d = this.light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.visible = true;\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\t*/\n\n};\n\nconst _vector$a = new Vector3();\nconst _color1 = new Color();\nconst _color2 = new Color();\n\nfunction HemisphereLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tconst geometry = new OctahedronBufferGeometry( size );\n\tgeometry.rotateY( Math.PI * 0.5 );\n\n\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\tconst position = geometry.getAttribute( 'position' );\n\tconst colors = new Float32Array( position.count * 3 );\n\n\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\tthis.add( new Mesh( geometry, this.material ) );\n\n\tthis.update();\n\n}\n\nHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\nHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\nHemisphereLightHelper.prototype.dispose = function () {\n\n\tthis.children[ 0 ].geometry.dispose();\n\tthis.children[ 0 ].material.dispose();\n\n};\n\nHemisphereLightHelper.prototype.update = function () {\n\n\tconst mesh = this.children[ 0 ];\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.material.color.set( this.color );\n\n\t} else {\n\n\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t_color1.copy( this.light.color );\n\t\t_color2.copy( this.light.groundColor );\n\n\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t}\n\n\t\tcolors.needsUpdate = true;\n\n\t}\n\n\tmesh.lookAt( _vector$a.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n};\n\nfunction GridHelper( size, divisions, color1, color2 ) {\n\n\tsize = size || 10;\n\tdivisions = divisions || 10;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tconst center = divisions / 2;\n\tconst step = size / divisions;\n\tconst halfSize = size / 2;\n\n\tconst vertices = [], colors = [];\n\n\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\tconst color = i === center ? color1 : color2;\n\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\t\tcolor.toArray( colors, j ); j += 3;\n\n\t}\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.type = 'GridHelper';\n\n}\n\nGridHelper.prototype = Object.create( LineSegments.prototype );\nGridHelper.prototype.constructor = GridHelper;\n\nfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\tradius = radius || 10;\n\tradials = radials || 16;\n\tcircles = circles || 8;\n\tdivisions = divisions || 64;\n\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\tconst vertices = [];\n\tconst colors = [];\n\n\t// create the radials\n\n\tfor ( let i = 0; i <= radials; i ++ ) {\n\n\t\tconst v = ( i / radials ) * ( Math.PI * 2 );\n\n\t\tconst x = Math.sin( v ) * radius;\n\t\tconst z = Math.cos( v ) * radius;\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tvertices.push( x, 0, z );\n\n\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\tcolors.push( color.r, color.g, color.b );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t}\n\n\t// create the circles\n\n\tfor ( let i = 0; i <= circles; i ++ ) {\n\n\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\tconst r = radius - ( radius / circles * i );\n\n\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t// first vertex\n\n\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\tlet x = Math.sin( v ) * r;\n\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t// second vertex\n\n\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * r;\n\t\t\tz = Math.cos( v ) * r;\n\n\t\t\tvertices.push( x, 0, z );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t}\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.type = 'PolarGridHelper';\n\n}\n\nPolarGridHelper.prototype = Object.create( LineSegments.prototype );\nPolarGridHelper.prototype.constructor = PolarGridHelper;\n\nconst _v1$5 = new Vector3();\nconst _v2$3 = new Vector3();\nconst _v3$1 = new Vector3();\n\nfunction DirectionalLightHelper( light, size, color ) {\n\n\tObject3D.call( this );\n\n\tthis.light = light;\n\tthis.light.updateMatrixWorld();\n\n\tthis.matrix = light.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.color = color;\n\n\tif ( size === undefined ) size = 1;\n\n\tlet geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t- size, size, 0,\n\t\tsize, size, 0,\n\t\tsize, - size, 0,\n\t\t- size, - size, 0,\n\t\t- size, size, 0\n\t], 3 ) );\n\n\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\tthis.lightPlane = new Line( geometry, material );\n\tthis.add( this.lightPlane );\n\n\tgeometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\tthis.targetLine = new Line( geometry, material );\n\tthis.add( this.targetLine );\n\n\tthis.update();\n\n}\n\nDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\nDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\nDirectionalLightHelper.prototype.dispose = function () {\n\n\tthis.lightPlane.geometry.dispose();\n\tthis.lightPlane.material.dispose();\n\tthis.targetLine.geometry.dispose();\n\tthis.targetLine.material.dispose();\n\n};\n\nDirectionalLightHelper.prototype.update = function () {\n\n\t_v1$5.setFromMatrixPosition( this.light.matrixWorld );\n\t_v2$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\t_v3$1.subVectors( _v2$3, _v1$5 );\n\n\tthis.lightPlane.lookAt( _v2$3 );\n\n\tif ( this.color !== undefined ) {\n\n\t\tthis.lightPlane.material.color.set( this.color );\n\t\tthis.targetLine.material.color.set( this.color );\n\n\t} else {\n\n\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t}\n\n\tthis.targetLine.lookAt( _v2$3 );\n\tthis.targetLine.scale.z = _v3$1.length();\n\n};\n\nconst _vector$b = new Vector3();\nconst _camera = new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n */\n\nfunction CameraHelper( camera ) {\n\n\tconst geometry = new BufferGeometry();\n\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\tconst vertices = [];\n\tconst colors = [];\n\n\tconst pointMap = {};\n\n\t// colors\n\n\tconst colorFrustum = new Color( 0xffaa00 );\n\tconst colorCone = new Color( 0xff0000 );\n\tconst colorUp = new Color( 0x00aaff );\n\tconst colorTarget = new Color( 0xffffff );\n\tconst colorCross = new Color( 0x333333 );\n\n\t// near\n\n\taddLine( 'n1', 'n2', colorFrustum );\n\taddLine( 'n2', 'n4', colorFrustum );\n\taddLine( 'n4', 'n3', colorFrustum );\n\taddLine( 'n3', 'n1', colorFrustum );\n\n\t// far\n\n\taddLine( 'f1', 'f2', colorFrustum );\n\taddLine( 'f2', 'f4', colorFrustum );\n\taddLine( 'f4', 'f3', colorFrustum );\n\taddLine( 'f3', 'f1', colorFrustum );\n\n\t// sides\n\n\taddLine( 'n1', 'f1', colorFrustum );\n\taddLine( 'n2', 'f2', colorFrustum );\n\taddLine( 'n3', 'f3', colorFrustum );\n\taddLine( 'n4', 'f4', colorFrustum );\n\n\t// cone\n\n\taddLine( 'p', 'n1', colorCone );\n\taddLine( 'p', 'n2', colorCone );\n\taddLine( 'p', 'n3', colorCone );\n\taddLine( 'p', 'n4', colorCone );\n\n\t// up\n\n\taddLine( 'u1', 'u2', colorUp );\n\taddLine( 'u2', 'u3', colorUp );\n\taddLine( 'u3', 'u1', colorUp );\n\n\t// target\n\n\taddLine( 'c', 't', colorTarget );\n\taddLine( 'p', 'c', colorCross );\n\n\t// cross\n\n\taddLine( 'cn1', 'cn2', colorCross );\n\taddLine( 'cn3', 'cn4', colorCross );\n\n\taddLine( 'cf1', 'cf2', colorCross );\n\taddLine( 'cf3', 'cf4', colorCross );\n\n\tfunction addLine( a, b, color ) {\n\n\t\taddPoint( a, color );\n\t\taddPoint( b, color );\n\n\t}\n\n\tfunction addPoint( id, color ) {\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tcolors.push( color.r, color.g, color.b );\n\n\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\tpointMap[ id ] = [];\n\n\t\t}\n\n\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t}\n\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.type = 'CameraHelper';\n\n\tthis.camera = camera;\n\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\tthis.matrix = camera.matrixWorld;\n\tthis.matrixAutoUpdate = false;\n\n\tthis.pointMap = pointMap;\n\n\tthis.update();\n\n}\n\nCameraHelper.prototype = Object.create( LineSegments.prototype );\nCameraHelper.prototype.constructor = CameraHelper;\n\nCameraHelper.prototype.update = function () {\n\n\tconst geometry = this.geometry;\n\tconst pointMap = this.pointMap;\n\n\tconst w = 1, h = 1;\n\n\t// we need just camera projection matrix inverse\n\t// world matrix must be identity\n\n\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t// center / target\n\n\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t// near\n\n\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t// far\n\n\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t// up\n\n\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t// cross\n\n\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n};\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector$b.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector$b.x, _vector$b.y, _vector$b.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box$3 = new Box3();\n\nfunction BoxHelper( object, color ) {\n\n\tthis.object = object;\n\n\tif ( color === undefined ) color = 0xffff00;\n\n\tconst 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 ] );\n\tconst positions = new Float32Array( 8 * 3 );\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\tthis.type = 'BoxHelper';\n\n\tthis.matrixAutoUpdate = false;\n\n\tthis.update();\n\n}\n\nBoxHelper.prototype = Object.create( LineSegments.prototype );\nBoxHelper.prototype.constructor = BoxHelper;\n\nBoxHelper.prototype.update = function ( object ) {\n\n\tif ( object !== undefined ) {\n\n\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t}\n\n\tif ( this.object !== undefined ) {\n\n\t\t_box$3.setFromObject( this.object );\n\n\t}\n\n\tif ( _box$3.isEmpty() ) return;\n\n\tconst min = _box$3.min;\n\tconst max = _box$3.max;\n\n\t/*\n\t 5____4\n\t1/___0/|\n\t| 6__|_7\n\t2/___3/\n\n\t0: max.x, max.y, max.z\n\t1: min.x, max.y, max.z\n\t2: min.x, min.y, max.z\n\t3: max.x, min.y, max.z\n\t4: max.x, max.y, min.z\n\t5: min.x, max.y, min.z\n\t6: min.x, min.y, min.z\n\t7: max.x, min.y, min.z\n\t*/\n\n\tconst position = this.geometry.attributes.position;\n\tconst array = position.array;\n\n\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\tposition.needsUpdate = true;\n\n\tthis.geometry.computeBoundingSphere();\n\n\n};\n\nBoxHelper.prototype.setFromObject = function ( object ) {\n\n\tthis.object = object;\n\tthis.update();\n\n\treturn this;\n\n};\n\nBoxHelper.prototype.copy = function ( source ) {\n\n\tLineSegments.prototype.copy.call( this, source );\n\n\tthis.object = source.object;\n\n\treturn this;\n\n};\n\nfunction Box3Helper( box, color ) {\n\n\tthis.type = 'Box3Helper';\n\n\tthis.box = box;\n\n\tif ( color === undefined ) color = 0xffff00;\n\n\tconst 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 ] );\n\n\tconst 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 ];\n\n\tconst geometry = new BufferGeometry();\n\n\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\tthis.type = 'Box3Helper';\n\n\tthis.geometry.computeBoundingSphere();\n\n}\n\nBox3Helper.prototype = Object.create( LineSegments.prototype );\nBox3Helper.prototype.constructor = Box3Helper;\n\nBox3Helper.prototype.updateMatrixWorld = function ( force ) {\n\n\tconst box = this.box;\n\n\tif ( box.isEmpty() ) return;\n\n\tbox.getCenter( this.position );\n\n\tbox.getSize( this.scale );\n\n\tthis.scale.multiplyScalar( 0.5 );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\nfunction PlaneHelper( plane, size, hex ) {\n\n\tthis.plane = plane;\n\n\tthis.size = ( size === undefined ) ? 1 : size;\n\n\tconst color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\tconst 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 ];\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\tgeometry.computeBoundingSphere();\n\n\tLine.call( this, geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\tthis.type = 'PlaneHelper';\n\n\t//\n\n\tconst positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\tconst geometry2 = new BufferGeometry();\n\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\tgeometry2.computeBoundingSphere();\n\n\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n}\n\nPlaneHelper.prototype = Object.create( Line.prototype );\nPlaneHelper.prototype.constructor = PlaneHelper;\n\nPlaneHelper.prototype.updateMatrixWorld = function ( force ) {\n\n\tlet scale = - this.plane.constant;\n\n\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\tthis.children[ 0 ].material.side = ( scale < 0 ) ? BackSide : FrontSide; // renderer flips side when determinant < 0; flipping not wanted here\n\n\tthis.lookAt( this.plane.normal );\n\n\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n};\n\nconst _axis = new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t// dir is assumed to be normalized\n\n\tObject3D.call( this );\n\n\tthis.type = 'ArrowHelper';\n\n\tif ( dir === undefined ) dir = new Vector3( 0, 0, 1 );\n\tif ( origin === undefined ) origin = new Vector3( 0, 0, 0 );\n\tif ( length === undefined ) length = 1;\n\tif ( color === undefined ) color = 0xffff00;\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tif ( _lineGeometry === undefined ) {\n\n\t\t_lineGeometry = new BufferGeometry();\n\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t_coneGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t}\n\n\tthis.position.copy( origin );\n\n\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\tthis.line.matrixAutoUpdate = false;\n\tthis.add( this.line );\n\n\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\tthis.cone.matrixAutoUpdate = false;\n\tthis.add( this.cone );\n\n\tthis.setDirection( dir );\n\tthis.setLength( length, headLength, headWidth );\n\n}\n\nArrowHelper.prototype = Object.create( Object3D.prototype );\nArrowHelper.prototype.constructor = ArrowHelper;\n\nArrowHelper.prototype.setDirection = function ( dir ) {\n\n\t// dir is assumed to be normalized\n\n\tif ( dir.y > 0.99999 ) {\n\n\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t} else if ( dir.y < - 0.99999 ) {\n\n\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t} else {\n\n\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\tconst radians = Math.acos( dir.y );\n\n\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t}\n\n};\n\nArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\tif ( headLength === undefined ) headLength = 0.2 * length;\n\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\tthis.line.updateMatrix();\n\n\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\tthis.cone.position.y = length;\n\tthis.cone.updateMatrix();\n\n};\n\nArrowHelper.prototype.setColor = function ( color ) {\n\n\tthis.line.material.color.set( color );\n\tthis.cone.material.color.set( color );\n\n};\n\nArrowHelper.prototype.copy = function ( source ) {\n\n\tObject3D.prototype.copy.call( this, source, false );\n\n\tthis.line.copy( source.line );\n\tthis.cone.copy( source.cone );\n\n\treturn this;\n\n};\n\nfunction AxesHelper( size ) {\n\n\tsize = size || 1;\n\n\tconst vertices = [\n\t\t0, 0, 0,\tsize, 0, 0,\n\t\t0, 0, 0,\t0, size, 0,\n\t\t0, 0, 0,\t0, 0, size\n\t];\n\n\tconst colors = [\n\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t0, 0, 1,\t0, 0.6, 1\n\t];\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\tLineSegments.call( this, geometry, material );\n\n\tthis.type = 'AxesHelper';\n\n}\n\nAxesHelper.prototype = Object.create( LineSegments.prototype );\nAxesHelper.prototype.constructor = AxesHelper;\n\nconst LOD_MIN = 4;\nconst LOD_MAX = 8;\nconst SIZE_MAX = Math.pow( 2, LOD_MAX );\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\nconst TOTAL_LODS = LOD_MAX - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst ENCODINGS = {\n\t[ LinearEncoding ]: 0,\n\t[ sRGBEncoding ]: 1,\n\t[ RGBEEncoding ]: 2,\n\t[ RGBM7Encoding ]: 3,\n\t[ RGBM16Encoding ]: 4,\n\t[ RGBDEncoding ]: 5,\n\t[ GammaEncoding ]: 6\n};\n\nconst _flatCamera = new OrthographicCamera();\nconst { _lodPlanes, _sizeLods, _sigmas } = _createPlanes();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\tnew Vector3( 1, 1, 1 ),\n\tnew Vector3( - 1, 1, 1 ),\n\tnew Vector3( 1, 1, - 1 ),\n\tnew Vector3( - 1, 1, - 1 ),\n\tnew Vector3( 0, PHI, INV_PHI ),\n\tnew Vector3( 0, PHI, - INV_PHI ),\n\tnew Vector3( INV_PHI, 0, PHI ),\n\tnew Vector3( - INV_PHI, 0, PHI ),\n\tnew Vector3( PHI, INV_PHI, 0 ),\n\tnew Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n */\n\nfunction PMREMGenerator( renderer ) {\n\n\tthis._renderer = renderer;\n\tthis._pingPongRenderTarget = null;\n\n\tthis._blurMaterial = _getBlurShader( MAX_SAMPLES );\n\tthis._equirectShader = null;\n\tthis._cubemapShader = null;\n\n\tthis._compileMaterial( this._blurMaterial );\n\n}\n\nPMREMGenerator.prototype = {\n\n\tconstructor: PMREMGenerator,\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene: function ( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t},\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * (RGBFormat) or HDR (RGBEFormat). The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular: function ( equirectangular ) {\n\n\t\treturn this._fromTexture( equirectangular );\n\n\t},\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * (RGBFormat) or HDR (RGBEFormat). The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap: function ( cubemap ) {\n\n\t\treturn this._fromTexture( cubemap );\n\n\t},\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader: function () {\n\n\t\tif ( this._cubemapShader === null ) {\n\n\t\t\tthis._cubemapShader = _getCubemapShader();\n\t\t\tthis._compileMaterial( this._cubemapShader );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader: function () {\n\n\t\tif ( this._equirectShader === null ) {\n\n\t\t\tthis._equirectShader = _getEquirectShader();\n\t\t\tthis._compileMaterial( this._equirectShader );\n\n\t\t}\n\n\t},\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose: function () {\n\n\t\tthis._blurMaterial.dispose();\n\n\t\tif ( this._cubemapShader !== null ) this._cubemapShader.dispose();\n\t\tif ( this._equirectShader !== null ) this._equirectShader.dispose();\n\n\t\tfor ( let i = 0; i < _lodPlanes.length; i ++ ) {\n\n\t\t\t_lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t},\n\n\t// private interface\n\n\t_cleanup: function ( outputTarget ) {\n\n\t\tthis._pingPongRenderTarget.dispose();\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t},\n\n\t_fromTexture: function ( texture ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\tconst cubeUVRenderTarget = this._allocateTargets( texture );\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t},\n\n\t_allocateTargets: function ( texture ) { // warning: null texture is valid\n\n\t\tconst params = {\n\t\t\tmagFilter: NearestFilter,\n\t\t\tminFilter: NearestFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: UnsignedByteType,\n\t\t\tformat: RGBEFormat,\n\t\t\tencoding: _isLDR( texture ) ? texture.encoding : RGBEEncoding,\n\t\t\tdepthBuffer: false,\n\t\t\tstencilBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( params );\n\t\tcubeUVRenderTarget.depthBuffer = texture ? false : true;\n\t\tthis._pingPongRenderTarget = _createRenderTarget( params );\n\t\treturn cubeUVRenderTarget;\n\n\t},\n\n\t_compileMaterial: function ( material ) {\n\n\t\tconst tmpMesh = new Mesh( _lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t},\n\n\t_sceneToCubeUV: function ( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst outputEncoding = renderer.outputEncoding;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\tconst clearColor = renderer.getClearColor();\n\t\tconst clearAlpha = renderer.getClearAlpha();\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.outputEncoding = LinearEncoding;\n\n\t\tlet background = scene.background;\n\t\tif ( background && background.isColor ) {\n\n\t\t\tbackground.convertSRGBToLinear();\n\t\t\t// Convert linear to RGBE\n\t\t\tconst maxComponent = Math.max( background.r, background.g, background.b );\n\t\t\tconst fExp = Math.min( Math.max( Math.ceil( Math.log2( maxComponent ) ), - 128.0 ), 127.0 );\n\t\t\tbackground = background.multiplyScalar( Math.pow( 2.0, - fExp ) );\n\t\t\tconst alpha = ( fExp + 128.0 ) / 255.0;\n\t\t\trenderer.setClearColor( background, alpha );\n\t\t\tscene.background = null;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\t\t\tif ( col == 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col == 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\t_setViewport( cubeUVRenderTarget,\n\t\t\t\tcol * SIZE_MAX, i > 2 ? SIZE_MAX : 0, SIZE_MAX, SIZE_MAX );\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.outputEncoding = outputEncoding;\n\t\trenderer.setClearColor( clearColor, clearAlpha );\n\n\t},\n\n\t_textureToCubeUV: function ( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\tif ( this._cubemapShader == null ) {\n\n\t\t\t\tthis._cubemapShader = _getCubemapShader();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this._equirectShader == null ) {\n\n\t\t\t\tthis._equirectShader = _getEquirectShader();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = texture.isCubeTexture ? this._cubemapShader : this._equirectShader;\n\t\tconst mesh = new Mesh( _lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tif ( ! texture.isCubeTexture ) {\n\n\t\t\tuniforms[ 'texelSize' ].value.set( 1.0 / texture.image.width, 1.0 / texture.image.height );\n\n\t\t}\n\n\t\tuniforms[ 'inputEncoding' ].value = ENCODINGS[ texture.encoding ];\n\t\tuniforms[ 'outputEncoding' ].value = ENCODINGS[ cubeUVRenderTarget.texture.encoding ];\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * SIZE_MAX, 2 * SIZE_MAX );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t},\n\n\t_applyPMREM: function ( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < TOTAL_LODS; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( _sigmas[ i ] * _sigmas[ i ] - _sigmas[ i - 1 ] * _sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t},\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur: function ( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t},\n\n\t_halfBlur: function ( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( _lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = _sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i == 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = LOD_MAX - lodIn;\n\t\tblurUniforms[ 'inputEncoding' ].value = ENCODINGS[ targetIn.texture.encoding ];\n\t\tblurUniforms[ 'outputEncoding' ].value = ENCODINGS[ targetIn.texture.encoding ];\n\n\t\tconst outputSize = _sizeLods[ lodOut ];\n\t\tconst x = 3 * Math.max( 0, SIZE_MAX - 2 * outputSize );\n\t\tconst y = ( lodOut === 0 ? 0 : 2 * SIZE_MAX ) + 2 * outputSize * ( lodOut > LOD_MAX - LOD_MIN ? lodOut - LOD_MAX + LOD_MIN : 0 );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n};\n\nfunction _isLDR( texture ) {\n\n\tif ( texture === undefined || texture.type !== UnsignedByteType ) return false;\n\n\treturn texture.encoding === LinearEncoding || texture.encoding === sRGBEncoding || texture.encoding === GammaEncoding;\n\n}\n\nfunction _createPlanes() {\n\n\tconst _lodPlanes = [];\n\tconst _sizeLods = [];\n\tconst _sigmas = [];\n\n\tlet lod = LOD_MAX;\n\n\tfor ( let i = 0; i < TOTAL_LODS; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\t_sizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > LOD_MAX - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - LOD_MAX + LOD_MIN - 1 ];\n\n\t\t} else if ( i == 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\t_sigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 1 );\n\t\tconst min = - texelSize / 2;\n\t\tconst max = 1 + texelSize / 2;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\t_lodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { _lodPlanes, _sizeLods, _sigmas };\n\n}\n\nfunction _createRenderTarget( params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( 3 * SIZE_MAX, 3 * SIZE_MAX, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( maxSamples ) {\n\n\tconst weights = new Float32Array( maxSamples );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: { 'n': maxSamples },\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis },\n\t\t\t'inputEncoding': { value: ENCODINGS[ LinearEncoding ] },\n\t\t\t'outputEncoding': { value: ENCODINGS[ LinearEncoding ] }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${ _getEncodings() }\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include \n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectShader() {\n\n\tconst texelSize = new Vector2( 1, 1 );\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'texelSize': { value: texelSize },\n\t\t\t'inputEncoding': { value: ENCODINGS[ LinearEncoding ] },\n\t\t\t'outputEncoding': { value: ENCODINGS[ LinearEncoding ] }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${ _getEncodings() }\n\n\t\t\t#include \n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCubemapShader() {\n\n\tconst shaderMaterial = new RawShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'inputEncoding': { value: ENCODINGS[ LinearEncoding ] },\n\t\t\t'outputEncoding': { value: ENCODINGS[ LinearEncoding ] }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${ _getEncodings() }\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction _getEncodings() {\n\n\treturn /* glsl */`\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include \n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t`;\n\n}\n\nfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n}\n\nconst LineStrip = 0;\nconst LinePieces = 1;\nconst NoColors = 0;\nconst FaceColors = 1;\nconst VertexColors = 2;\n\nfunction MeshFaceMaterial( materials ) {\n\n\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\treturn materials;\n\n}\n\nfunction MultiMaterial( materials ) {\n\n\tif ( materials === undefined ) materials = [];\n\n\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\tmaterials.isMultiMaterial = true;\n\tmaterials.materials = materials;\n\tmaterials.clone = function () {\n\n\t\treturn materials.slice();\n\n\t};\n\n\treturn materials;\n\n}\n\nfunction PointCloud( geometry, material ) {\n\n\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction Particle( material ) {\n\n\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\treturn new Sprite( material );\n\n}\n\nfunction ParticleSystem( geometry, material ) {\n\n\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\treturn new Points( geometry, material );\n\n}\n\nfunction PointCloudMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleBasicMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction ParticleSystemMaterial( parameters ) {\n\n\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\treturn new PointsMaterial( parameters );\n\n}\n\nfunction Vertex( x, y, z ) {\n\n\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\treturn new Vector3( x, y, z );\n\n}\n\n//\n\nfunction DynamicBufferAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setUsage( THREE.DynamicDrawUsage ) instead.' );\n\treturn new BufferAttribute( array, itemSize ).setUsage( DynamicDrawUsage );\n\n}\n\nfunction Int8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\treturn new Int8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\treturn new Uint8BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n}\n\nfunction Int16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\treturn new Int16BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint16Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\treturn new Uint16BufferAttribute( array, itemSize );\n\n}\n\nfunction Int32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\treturn new Int32BufferAttribute( array, itemSize );\n\n}\n\nfunction Uint32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\treturn new Uint32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float32Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\treturn new Float32BufferAttribute( array, itemSize );\n\n}\n\nfunction Float64Attribute( array, itemSize ) {\n\n\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\treturn new Float64BufferAttribute( array, itemSize );\n\n}\n\n//\n\nCurve.create = function ( construct, getPoint ) {\n\n\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\tconstruct.prototype = Object.create( Curve.prototype );\n\tconstruct.prototype.constructor = construct;\n\tconstruct.prototype.getPoint = getPoint;\n\n\treturn construct;\n\n};\n\n//\n\nObject.assign( CurvePath.prototype, {\n\n\tcreatePointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from path points (for Line or Points objects)\n\n\t\tconst pts = this.getPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\t// generate geometry from equidistant sampling along the path\n\n\t\tconst pts = this.getSpacedPoints( divisions );\n\t\treturn this.createGeometry( pts );\n\n\t},\n\n\tcreateGeometry: function ( points ) {\n\n\t\tconsole.warn( 'THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.' );\n\n\t\tconst geometry = new Geometry();\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n} );\n\n//\n\nObject.assign( Path.prototype, {\n\n\tfromPoints: function ( points ) {\n\n\t\tconsole.warn( 'THREE.Path: .fromPoints() has been renamed to .setFromPoints().' );\n\t\treturn this.setFromPoints( points );\n\n\t}\n\n} );\n\n//\n\nfunction ClosedSplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\tthis.closed = true;\n\n}\n\nClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction SplineCurve3( points ) {\n\n\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n//\n\nfunction Spline( points ) {\n\n\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\tCatmullRomCurve3.call( this, points );\n\tthis.type = 'catmullrom';\n\n}\n\nSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\nObject.assign( Spline.prototype, {\n\n\tinitFromArray: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t},\n\tgetControlPointsArray: function ( /* optionalTarget */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t},\n\treparametrizeByArcLength: function ( /* samplingCoef */ ) {\n\n\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nfunction AxisHelper( size ) {\n\n\tconsole.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );\n\treturn new AxesHelper( size );\n\n}\n\nfunction BoundingBoxHelper( object, color ) {\n\n\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\treturn new BoxHelper( object, color );\n\n}\n\nfunction EdgesHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\nGridHelper.prototype.setColors = function () {\n\n\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n};\n\nSkeletonHelper.prototype.update = function () {\n\n\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n};\n\nfunction WireframeHelper( object, hex ) {\n\n\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n}\n\n//\n\nObject.assign( Loader.prototype, {\n\n\textractUrlBase: function ( url ) {\n\n\t\tconsole.warn( 'THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.' );\n\t\treturn LoaderUtils.extractUrlBase( url );\n\n\t}\n\n} );\n\nLoader.Handlers = {\n\n\tadd: function ( /* regex, loader */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.' );\n\n\t},\n\n\tget: function ( /* file */ ) {\n\n\t\tconsole.error( 'THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.' );\n\n\t}\n\n};\n\nfunction XHRLoader( manager ) {\n\n\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\treturn new FileLoader( manager );\n\n}\n\nfunction BinaryTextureLoader( manager ) {\n\n\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\treturn new DataTextureLoader( manager );\n\n}\n\nObject.assign( ObjectLoader.prototype, {\n\n\tsetTexturePath: function ( value ) {\n\n\t\tconsole.warn( 'THREE.ObjectLoader: .setTexturePath() has been renamed to .setResourcePath().' );\n\t\treturn this.setResourcePath( value );\n\n\t}\n\n} );\n\n//\n\nObject.assign( Box2.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Box3.prototype, {\n\n\tcenter: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t},\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t},\n\tsize: function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\treturn this.getSize( optionalTarget );\n\n\t}\n} );\n\nObject.assign( Sphere.prototype, {\n\n\tempty: function () {\n\n\t\tconsole.warn( 'THREE.Sphere: .empty() has been renamed to .isEmpty().' );\n\t\treturn this.isEmpty();\n\n\t},\n\n} );\n\nFrustum.prototype.setFromMatrix = function ( m ) {\n\n\tconsole.warn( 'THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix().' );\n\treturn this.setFromProjectionMatrix( m );\n\n};\n\nLine3.prototype.center = function ( optionalTarget ) {\n\n\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\treturn this.getCenter( optionalTarget );\n\n};\n\nObject.assign( MathUtils, {\n\n\trandom16: function () {\n\n\t\tconsole.warn( 'THREE.Math: .random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t},\n\n\tnearestPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().' );\n\t\treturn MathUtils.floorPowerOfTwo( value );\n\n\t},\n\n\tnextPowerOfTwo: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().' );\n\t\treturn MathUtils.ceilPowerOfTwo( value );\n\n\t}\n\n} );\n\nObject.assign( Matrix3.prototype, {\n\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\treturn vector.applyMatrix3( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.' );\n\n\t},\n\tapplyToBufferAttribute: function ( attribute ) {\n\n\t\tconsole.warn( 'THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead.' );\n\t\treturn attribute.applyMatrix3( this );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t}\n\n} );\n\nObject.assign( Matrix4.prototype, {\n\n\textractPosition: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\treturn this.copyPosition( m );\n\n\t},\n\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\treturn this.toArray( array, offset );\n\n\t},\n\tgetPosition: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\treturn new Vector3().setFromMatrixColumn( this, 3 );\n\n\t},\n\tsetRotationFromQuaternion: function ( q ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\treturn this.makeRotationFromQuaternion( q );\n\n\t},\n\tmultiplyToArray: function () {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n\t},\n\tmultiplyVector3: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector4: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\tmultiplyVector3Array: function ( /* a */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.' );\n\n\t},\n\trotateAxis: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\tv.transformDirection( this );\n\n\t},\n\tcrossVector: function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\treturn vector.applyMatrix4( this );\n\n\t},\n\ttranslate: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t},\n\trotateX: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t},\n\trotateY: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t},\n\trotateZ: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t},\n\trotateByAxis: function () {\n\n\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t},\n\tapplyToBufferAttribute: function ( attribute ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead.' );\n\t\treturn attribute.applyMatrix4( this );\n\n\t},\n\tapplyToVector3Array: function ( /* array, offset, length */ ) {\n\n\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t},\n\tmakeFrustum: function ( left, right, bottom, top, near, far ) {\n\n\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t}\n\n} );\n\nPlane.prototype.isIntersectionLine = function ( line ) {\n\n\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\treturn this.intersectsLine( line );\n\n};\n\nQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\treturn vector.applyQuaternion( this );\n\n};\n\nObject.assign( Ray.prototype, {\n\n\tisIntersectionBox: function ( box ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\treturn this.intersectsBox( box );\n\n\t},\n\tisIntersectionPlane: function ( plane ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\treturn this.intersectsPlane( plane );\n\n\t},\n\tisIntersectionSphere: function ( sphere ) {\n\n\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\treturn this.intersectsSphere( sphere );\n\n\t}\n\n} );\n\nObject.assign( Triangle.prototype, {\n\n\tarea: function () {\n\n\t\tconsole.warn( 'THREE.Triangle: .area() has been renamed to .getArea().' );\n\t\treturn this.getArea();\n\n\t},\n\tbarycoordFromPoint: function ( point, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn this.getBarycoord( point, target );\n\n\t},\n\tmidpoint: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .midpoint() has been renamed to .getMidpoint().' );\n\t\treturn this.getMidpoint( target );\n\n\t},\n\tnormal: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn this.getNormal( target );\n\n\t},\n\tplane: function ( target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .plane() has been renamed to .getPlane().' );\n\t\treturn this.getPlane( target );\n\n\t}\n\n} );\n\nObject.assign( Triangle, {\n\n\tbarycoordFromPoint: function ( point, a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().' );\n\t\treturn Triangle.getBarycoord( point, a, b, c, target );\n\n\t},\n\tnormal: function ( a, b, c, target ) {\n\n\t\tconsole.warn( 'THREE.Triangle: .normal() has been renamed to .getNormal().' );\n\t\treturn Triangle.getNormal( a, b, c, target );\n\n\t}\n\n} );\n\nObject.assign( Shape.prototype, {\n\n\textractAllPoints: function ( divisions ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.' );\n\t\treturn this.extractPoints( divisions );\n\n\t},\n\textrude: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\treturn new ExtrudeGeometry( this, options );\n\n\t},\n\tmakeGeometry: function ( options ) {\n\n\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\treturn new ShapeGeometry( this, options );\n\n\t}\n\n} );\n\nObject.assign( Vector2.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector3.prototype, {\n\n\tsetEulerFromRotationMatrix: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t},\n\tsetEulerFromQuaternion: function () {\n\n\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t},\n\tgetPositionFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\treturn this.setFromMatrixPosition( m );\n\n\t},\n\tgetScaleFromMatrix: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\treturn this.setFromMatrixScale( m );\n\n\t},\n\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t},\n\tapplyProjection: function ( m ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\treturn this.applyMatrix4( m );\n\n\t},\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tdistanceToManhattan: function ( v ) {\n\n\t\tconsole.warn( 'THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().' );\n\t\treturn this.manhattanDistanceTo( v );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\nObject.assign( Vector4.prototype, {\n\n\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\tconsole.warn( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t},\n\tlengthManhattan: function () {\n\n\t\tconsole.warn( 'THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().' );\n\t\treturn this.manhattanLength();\n\n\t}\n\n} );\n\n//\n\nObject.assign( Geometry.prototype, {\n\n\tcomputeTangents: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeLineDistances: function () {\n\n\t\tconsole.error( 'THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.' );\n\n\t},\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.Geometry: .applyMatrix() has been renamed to .applyMatrix4().' );\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nObject.assign( Object3D.prototype, {\n\n\tgetChildByName: function ( name ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\treturn this.getObjectByName( name );\n\n\t},\n\trenderDepth: function () {\n\n\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t},\n\ttranslate: function ( distance, axis ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\treturn this.translateOnAxis( axis, distance );\n\n\t},\n\tgetWorldRotation: function () {\n\n\t\tconsole.error( 'THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.' );\n\n\t},\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4().' );\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nObject.defineProperties( Object3D.prototype, {\n\n\teulerOrder: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\treturn this.rotation.order;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\tthis.rotation.order = value;\n\n\t\t}\n\t},\n\tuseQuaternion: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.assign( Mesh.prototype, {\n\n\tsetDrawMode: function () {\n\n\t\tconsole.error( 'THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n\t},\n\n} );\n\nObject.defineProperties( Mesh.prototype, {\n\n\tdrawMode: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode.' );\n\t\t\treturn TrianglesDrawMode;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.error( 'THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( LOD.prototype, {\n\n\tobjects: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\treturn this.levels;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperty( Skeleton.prototype, 'useVertexTexture', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t},\n\tset: function () {\n\n\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t}\n\n} );\n\nSkinnedMesh.prototype.initBones = function () {\n\n\tconsole.error( 'THREE.SkinnedMesh: initBones() has been removed.' );\n\n};\n\nObject.defineProperty( Curve.prototype, '__arcLengthDivisions', {\n\n\tget: function () {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\treturn this.arcLengthDivisions;\n\n\t},\n\tset: function ( value ) {\n\n\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\tthis.arcLengthDivisions = value;\n\n\t}\n\n} );\n\n//\n\nPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\tthis.setFocalLength( focalLength );\n\n};\n\n//\n\nObject.defineProperties( Light.prototype, {\n\tonlyShadow: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t}\n\t},\n\tshadowCameraFov: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\tthis.shadow.camera.fov = value;\n\n\t\t}\n\t},\n\tshadowCameraLeft: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\tthis.shadow.camera.left = value;\n\n\t\t}\n\t},\n\tshadowCameraRight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\tthis.shadow.camera.right = value;\n\n\t\t}\n\t},\n\tshadowCameraTop: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\tthis.shadow.camera.top = value;\n\n\t\t}\n\t},\n\tshadowCameraBottom: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t}\n\t},\n\tshadowCameraNear: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\tthis.shadow.camera.near = value;\n\n\t\t}\n\t},\n\tshadowCameraFar: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\tthis.shadow.camera.far = value;\n\n\t\t}\n\t},\n\tshadowCameraVisible: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t}\n\t},\n\tshadowBias: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\tthis.shadow.bias = value;\n\n\t\t}\n\t},\n\tshadowDarkness: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t}\n\t},\n\tshadowMapWidth: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t}\n\t},\n\tshadowMapHeight: {\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t}\n\t}\n} );\n\n//\n\nObject.defineProperties( BufferAttribute.prototype, {\n\n\tlength: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\treturn this.array.length;\n\n\t\t}\n\t},\n\tdynamic: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\treturn this.usage === DynamicDrawUsage;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead.' );\n\t\t\tthis.setUsage( DynamicDrawUsage );\n\n\t\t}\n\t}\n\n} );\n\nObject.assign( BufferAttribute.prototype, {\n\tsetDynamic: function ( value ) {\n\n\t\tconsole.warn( 'THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\t\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\t\treturn this;\n\n\t},\n\tcopyIndicesArray: function ( /* indices */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .copyIndicesArray() has been removed.' );\n\n\t},\n\tsetArray: function ( /* array */ ) {\n\n\t\tconsole.error( 'THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n\t}\n} );\n\nObject.assign( BufferGeometry.prototype, {\n\n\taddIndex: function ( index ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\tthis.setIndex( index );\n\n\t},\n\taddAttribute: function ( name, attribute ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute().' );\n\n\t\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\treturn this.setAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t}\n\n\t\tif ( name === 'index' ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\tthis.setIndex( attribute );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\treturn this.setAttribute( name, attribute );\n\n\t},\n\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\tif ( indexOffset !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\tthis.addGroup( start, count );\n\n\t},\n\tclearDrawCalls: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\tthis.clearGroups();\n\n\t},\n\tcomputeTangents: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t},\n\tcomputeOffsets: function () {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t},\n\tremoveAttribute: function ( name ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute().' );\n\n\t\treturn this.deleteAttribute( name );\n\n\t},\n\tapplyMatrix: function ( matrix ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4().' );\n\t\treturn this.applyMatrix4( matrix );\n\n\t}\n\n} );\n\nObject.defineProperties( BufferGeometry.prototype, {\n\n\tdrawcalls: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t},\n\toffsets: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\treturn this.groups;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( InstancedBufferGeometry.prototype, {\n\n\tmaxInstancedCount: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.' );\n\t\t\treturn this.instanceCount;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.InstancedBufferGeometry: .maxInstancedCount has been renamed to .instanceCount.' );\n\t\t\tthis.instanceCount = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( Raycaster.prototype, {\n\n\tlinePrecision: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.' );\n\t\t\treturn this.params.Line.threshold;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Raycaster: .linePrecision has been deprecated. Use .params.Line.threshold instead.' );\n\t\t\tthis.params.Line.threshold = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( InterleavedBuffer.prototype, {\n\n\tdynamic: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.' );\n\t\t\treturn this.usage === DynamicDrawUsage;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.InterleavedBuffer: .length has been deprecated. Use .usage instead.' );\n\t\t\tthis.setUsage( value );\n\n\t\t}\n\t}\n\n} );\n\nObject.assign( InterleavedBuffer.prototype, {\n\tsetDynamic: function ( value ) {\n\n\t\tconsole.warn( 'THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead.' );\n\t\tthis.setUsage( value === true ? DynamicDrawUsage : StaticDrawUsage );\n\t\treturn this;\n\n\t},\n\tsetArray: function ( /* array */ ) {\n\n\t\tconsole.error( 'THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers' );\n\n\t}\n} );\n\n//\n\nObject.assign( ExtrudeBufferGeometry.prototype, {\n\n\tgetArrays: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .getArrays() has been removed.' );\n\n\t},\n\n\taddShapeList: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.' );\n\n\t},\n\n\taddShape: function () {\n\n\t\tconsole.error( 'THREE.ExtrudeBufferGeometry: .addShape() has been removed.' );\n\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Uniform.prototype, {\n\n\tdynamic: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t}\n\t},\n\tonUpdate: {\n\t\tvalue: function () {\n\n\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\treturn this;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Material.prototype, {\n\n\twrapAround: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t}\n\t},\n\n\toverdraw: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .overdraw has been removed.' );\n\n\t\t}\n\t},\n\n\twrapRGB: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\treturn new Color();\n\n\t\t}\n\t},\n\n\tshading: {\n\t\tget: function () {\n\n\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t}\n\t},\n\n\tstencilMask: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\treturn this.stencilFuncMask;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.' + this.type + ': .stencilMask has been removed. Use .stencilFuncMask instead.' );\n\t\t\tthis.stencilFuncMask = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\tmetal: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( MeshPhysicalMaterial.prototype, {\n\n\ttransparency: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission.' );\n\t\t\treturn this.transmission;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.MeshPhysicalMaterial: .transparency has been renamed to .transmission.' );\n\t\t\tthis.transmission = value;\n\n\t\t}\n\t}\n\n} );\n\nObject.defineProperties( ShaderMaterial.prototype, {\n\n\tderivatives: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\treturn this.extensions.derivatives;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\tthis.extensions.derivatives = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.assign( WebGLRenderer.prototype, {\n\n\tclearTarget: function ( renderTarget, color, depth, stencil ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead.' );\n\t\tthis.setRenderTarget( renderTarget );\n\t\tthis.clear( color, depth, stencil );\n\n\t},\n\tanimate: function ( callback ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .animate() is now .setAnimationLoop().' );\n\t\tthis.setAnimationLoop( callback );\n\n\t},\n\tgetCurrentRenderTarget: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\t\treturn this.getRenderTarget();\n\n\t},\n\tgetMaxAnisotropy: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t},\n\tgetPrecision: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\t\treturn this.capabilities.precision;\n\n\t},\n\tresetGLState: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .resetGLState() is now .state.reset().' );\n\t\treturn this.state.reset();\n\n\t},\n\tsupportsFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t},\n\tsupportsHalfFloatTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t},\n\tsupportsStandardDerivatives: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t},\n\tsupportsCompressedTextureS3TC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t},\n\tsupportsCompressedTexturePVRTC: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t},\n\tsupportsBlendMinMax: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t},\n\tsupportsVertexTextures: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\treturn this.capabilities.vertexTextures;\n\n\t},\n\tsupportsInstancedArrays: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t},\n\tenableScissorTest: function ( boolean ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\tthis.setScissorTest( boolean );\n\n\t},\n\tinitMaterial: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t},\n\taddPrePlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t},\n\taddPostPlugin: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t},\n\tupdateShadowMap: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t},\n\tsetFaceCulling: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setFaceCulling() has been removed.' );\n\n\t},\n\tallocTextureUnit: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .allocTextureUnit() has been removed.' );\n\n\t},\n\tsetTexture: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTexture() has been removed.' );\n\n\t},\n\tsetTexture2D: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTexture2D() has been removed.' );\n\n\t},\n\tsetTextureCube: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .setTextureCube() has been removed.' );\n\n\t},\n\tgetActiveMipMapLevel: function () {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel().' );\n\t\treturn this.getActiveMipmapLevel();\n\n\t}\n\n} );\n\nObject.defineProperties( WebGLRenderer.prototype, {\n\n\tshadowMapEnabled: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.enabled;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\tthis.shadowMap.enabled = value;\n\n\t\t}\n\t},\n\tshadowMapType: {\n\t\tget: function () {\n\n\t\t\treturn this.shadowMap.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\tthis.shadowMap.type = value;\n\n\t\t}\n\t},\n\tshadowMapCullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* value */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\tcontext: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .context has been removed. Use .getContext() instead.' );\n\t\t\treturn this.getContext();\n\n\t\t}\n\t},\n\tvr: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .vr has been renamed to .xr' );\n\t\t\treturn this.xr;\n\n\t\t}\n\t},\n\tgammaInput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.' );\n\n\t\t}\n\t},\n\tgammaOutput: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\treturn false;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead.' );\n\t\t\tthis.outputEncoding = ( value === true ) ? sRGBEncoding : LinearEncoding;\n\n\t\t}\n\t},\n\ttoneMappingWhitePoint: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\t\t\treturn 1.0;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.' );\n\n\t\t}\n\t},\n\n} );\n\nObject.defineProperties( WebGLShadowMap.prototype, {\n\n\tcullFace: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function ( /* cullFace */ ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderReverseSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t},\n\trenderSingleSided: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\t\t\treturn undefined;\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.' );\n\n\t\t}\n\t}\n\n} );\n\nfunction WebGLRenderTargetCube( width, height, options ) {\n\n\tconsole.warn( 'THREE.WebGLRenderTargetCube( width, height, options ) is now WebGLCubeRenderTarget( size, options ).' );\n\treturn new WebGLCubeRenderTarget( width, options );\n\n}\n\n//\n\nObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\twrapS: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\treturn this.texture.wrapS;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\tthis.texture.wrapS = value;\n\n\t\t}\n\t},\n\twrapT: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\treturn this.texture.wrapT;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\tthis.texture.wrapT = value;\n\n\t\t}\n\t},\n\tmagFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\treturn this.texture.magFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\tthis.texture.magFilter = value;\n\n\t\t}\n\t},\n\tminFilter: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\treturn this.texture.minFilter;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\tthis.texture.minFilter = value;\n\n\t\t}\n\t},\n\tanisotropy: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\treturn this.texture.anisotropy;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\tthis.texture.anisotropy = value;\n\n\t\t}\n\t},\n\toffset: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\treturn this.texture.offset;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\tthis.texture.offset = value;\n\n\t\t}\n\t},\n\trepeat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\treturn this.texture.repeat;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\tthis.texture.repeat = value;\n\n\t\t}\n\t},\n\tformat: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\treturn this.texture.format;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\tthis.texture.format = value;\n\n\t\t}\n\t},\n\ttype: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\treturn this.texture.type;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\tthis.texture.type = value;\n\n\t\t}\n\t},\n\tgenerateMipmaps: {\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\treturn this.texture.generateMipmaps;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t}\n\t}\n\n} );\n\n//\n\nObject.defineProperties( Audio.prototype, {\n\n\tload: {\n\t\tvalue: function ( file ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\t\tconst scope = this;\n\t\t\tconst audioLoader = new AudioLoader();\n\t\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\t\tscope.setBuffer( buffer );\n\n\t\t\t} );\n\t\t\treturn this;\n\n\t\t}\n\t},\n\tstartTime: {\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Audio: .startTime is now .play( delay ).' );\n\n\t\t}\n\t}\n\n} );\n\nAudioAnalyser.prototype.getData = function () {\n\n\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\treturn this.getFrequencyData();\n\n};\n\n//\n\nCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\treturn this.update( renderer, scene );\n\n};\n\n//\n\nconst GeometryUtils = {\n\n\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\tlet matrix;\n\n\t\tif ( geometry2.isMesh ) {\n\n\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\tmatrix = geometry2.matrix;\n\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t}\n\n\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t},\n\n\tcenter: function ( geometry ) {\n\n\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\treturn geometry.center();\n\n\t}\n\n};\n\nImageUtils.crossOrigin = undefined;\n\nImageUtils.loadTexture = function ( url, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\tconst loader = new TextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( url, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadTextureCube = function ( urls, mapping, onLoad, onError ) {\n\n\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\tconst loader = new CubeTextureLoader();\n\tloader.setCrossOrigin( this.crossOrigin );\n\n\tconst texture = loader.load( urls, onLoad, undefined, onError );\n\n\tif ( mapping ) texture.mapping = mapping;\n\n\treturn texture;\n\n};\n\nImageUtils.loadCompressedTexture = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\nImageUtils.loadCompressedTextureCube = function () {\n\n\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n};\n\n//\n\nfunction CanvasRenderer() {\n\n\tconsole.error( 'THREE.CanvasRenderer has been removed' );\n\n}\n\n//\n\nfunction JSONLoader() {\n\n\tconsole.error( 'THREE.JSONLoader has been removed.' );\n\n}\n\n//\n\nconst SceneUtils = {\n\n\tcreateMultiMaterialObject: function ( /* geometry, materials */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tdetach: function ( /* child, parent, scene */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t},\n\n\tattach: function ( /* child, scene, parent */ ) {\n\n\t\tconsole.error( 'THREE.SceneUtils has been moved to /examples/jsm/utils/SceneUtils.js' );\n\n\t}\n\n};\n\n//\n\nfunction LensFlare() {\n\n\tconsole.error( 'THREE.LensFlare has been moved to /examples/jsm/objects/Lensflare.js' );\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t/* eslint-disable no-undef */\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\t/* eslint-enable no-undef */\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, AxisHelper, BackSide, BasicDepthPacking, BasicShadowMap, BinaryTextureLoader, Bone, BooleanKeyframeTrack, BoundingBoxHelper, Box2, Box3, Box3Helper, BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasRenderer, CanvasTexture, CatmullRomCurve3, CineonToneMapping, CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, ClosedSplineCurve3, Color, ColorKeyframeTrack, CompressedTexture, CompressedTextureLoader, ConeBufferGeometry, ConeGeometry, CubeCamera, BoxGeometry as CubeGeometry, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubeUVRefractionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderBufferGeometry, CylinderGeometry, Cylindrical, DataTexture, DataTexture2DArray, DataTexture3D, DataTextureLoader, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DirectionalLightShadow, DiscreteInterpolant, DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicBufferAttribute, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EdgesHelper, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeBufferGeometry, ExtrudeGeometry, Face3, Face4, FaceColors, FileLoader, FlatShading, Float32Attribute, Float32BufferAttribute, Float64Attribute, Float64BufferAttribute, FloatType, Fog, FogExp2, Font, FontLoader, FrontSide, Frustum, GammaEncoding, Geometry, GeometryUtils, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, ImmediateRenderObject, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16Attribute, Int16BufferAttribute, Int32Attribute, Int32BufferAttribute, Int8Attribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, JSONLoader, KeepStencilOp, KeyframeTrack, LOD, LatheBufferGeometry, LatheGeometry, Layers, LensFlare, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, LightShadow, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LinePieces, LineSegments, LineStrip, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LogLuvEncoding, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils as Math, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshFaceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiMaterial, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColors, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, ParametricBufferGeometry, ParametricGeometry, Particle, ParticleBasicMaterial, ParticleSystem, ParticleSystemMaterial, Path, PerspectiveCamera, Plane, PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointCloud, PointCloudMaterial, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDEncoding, RGBEEncoding, RGBEFormat, RGBFormat, RGBIntegerFormat, RGBM16Encoding, RGBM7Encoding, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingBufferGeometry, RingGeometry, SRGB8_ALPHA8_ASTC_10x10_Format, SRGB8_ALPHA8_ASTC_10x5_Format, SRGB8_ALPHA8_ASTC_10x6_Format, SRGB8_ALPHA8_ASTC_10x8_Format, SRGB8_ALPHA8_ASTC_12x10_Format, SRGB8_ALPHA8_ASTC_12x12_Format, SRGB8_ALPHA8_ASTC_4x4_Format, SRGB8_ALPHA8_ASTC_5x4_Format, SRGB8_ALPHA8_ASTC_5x5_Format, SRGB8_ALPHA8_ASTC_6x5_Format, SRGB8_ALPHA8_ASTC_6x6_Format, SRGB8_ALPHA8_ASTC_8x5_Format, SRGB8_ALPHA8_ASTC_8x6_Format, SRGB8_ALPHA8_ASTC_8x8_Format, Scene, SceneUtils, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, SmoothShading, Sphere, SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, Spline, SplineCurve, SplineCurve3, SpotLight, SpotLightHelper, SpotLightShadow, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronBufferGeometry, TetrahedronGeometry, TextBufferGeometry, TextGeometry, Texture, TextureLoader, TorusBufferGeometry, TorusGeometry, TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeBufferGeometry, TubeGeometry, UVMapping, Uint16Attribute, Uint16BufferAttribute, Uint32Attribute, Uint32BufferAttribute, Uint8Attribute, Uint8BufferAttribute, Uint8ClampedAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShort565Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, Vertex, VertexColors, VideoTexture, WebGL1Renderer, WebGLCubeRenderTarget, WebGLMultisampleRenderTarget, WebGLRenderTarget, WebGLRenderTargetCube, WebGLRenderer, WebGLUtils, WireframeGeometry, WireframeHelper, WrapAroundEnding, XHRLoader, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, sRGBEncoding };\n","export const TO_RADIANS = Math.PI / 180.0;\n\nexport const toRadians = val => (val * TO_RADIANS);\n\nimport * as THREE from 'three';\n\nexport const AMC_FILES = {\n \"golf\": [\n { name: \"golf_01\", src: \"assets/amc/golf/golf_01.amc\" },\n ],\n \"debug\": [\n { name: \"null\", src: \"assets/amc/debug/null.amc\" },\n ],\n \"walk\": [\n { name: \"walk_03\", src: \"assets/amc/walk/walk_03.amc\" },\n ],\n \"moderndance\": [\n { name: \"md_walk\", src: \"assets/amc/moderndance/md_walk.amc\" },\n { name: \"md_02\", src: \"assets/amc/moderndance/md_02.amc\" },\n { name: \"md_03\", src: \"assets/amc/moderndance/md_03.amc\" },\n { name: \"md_04\", src: \"assets/amc/moderndance/md_04.amc\" },\n { name: \"md_05\", src: \"assets/amc/moderndance/md_05.amc\" },\n { name: \"md_07\", src: \"assets/amc/moderndance/md_07.amc\" },\n ],\n \"mjackson\": [\n { name: \"mj_01\", src: \"assets/amc/mjackson/131_01.amc\" },\n { name: \"mj_02\", src: \"assets/amc/mjackson/131_02.amc\" },\n { name: \"mj_03\", src: \"assets/amc/mjackson/131_03.amc\" },\n { name: \"mj_04\", src: \"assets/amc/mjackson/131_04.amc\" },\n { name: \"mj_05\", src: \"assets/amc/mjackson/131_05.amc\" },\n { name: \"mj_06\", src: \"assets/amc/mjackson/131_06.amc\" },\n { name: \"mj_07\", src: \"assets/amc/mjackson/131_07.amc\" },\n { name: \"mj_08\", src: \"assets/amc/mjackson/131_08.amc\" },\n { name: \"mj_09\", src: \"assets/amc/mjackson/131_09.amc\" },\n { name: \"mj_10\", src: \"assets/amc/mjackson/131_10.amc\" },\n { name: \"mj_11\", src: \"assets/amc/mjackson/131_11.amc\" },\n { name: \"mj_12\", src: \"assets/amc/mjackson/131_12.amc\" },\n { name: \"mj_13\", src: \"assets/amc/mjackson/131_13.amc\" },\n { name: \"mj_14\", src: \"assets/amc/mjackson/131_14.amc\" },\n ],\n \"martialwalk\": [\n { name: \"mw_01\", src: \"assets/amc/martialwalk/135_01.amc\" },\n { name: \"mw_02\", src: \"assets/amc/martialwalk/135_02.amc\" },\n { name: \"mw_03\", src: \"assets/amc/martialwalk/135_03.amc\" },\n { name: \"mw_04\", src: \"assets/amc/martialwalk/135_04.amc\" },\n { name: \"mw_05\", src: \"assets/amc/martialwalk/135_05.amc\" },\n { name: \"mw_06\", src: \"assets/amc/martialwalk/135_06.amc\" },\n { name: \"mw_07\", src: \"assets/amc/martialwalk/135_07.amc\" },\n { name: \"mw_08\", src: \"assets/amc/martialwalk/135_08.amc\" },\n { name: \"mw_09\", src: \"assets/amc/martialwalk/135_09.amc\" },\n { name: \"mw_10\", src: \"assets/amc/martialwalk/135_10.amc\" },\n { name: \"mw_11\", src: \"assets/amc/martialwalk/135_11.amc\" },\n ]\n};\n\nexport const ASF_FILES = {\n \"golf\": {\n id: \"golf\",\n name: \"Golf\",\n namespace: \"GOLF\",\n src: \"assets/asf/golf.asf\"\n },\n \"walk\": {\n id: \"walk\",\n name: \"Walk\",\n namespace: \"WALK\",\n src: \"assets/asf/walk.asf\"\n },\n \"debug\": {\n id: \"debug\",\n name: \"Debug\",\n namespace: \"DEBUG\",\n src: \"assets/asf/debug.asf\"\n },\n \"moderndance\": {\n id: \"moderndance\",\n name: \"Modern Dance\",\n namespace: \"MODERNDANCE\",\n src: \"assets/asf/moderndance.asf\"\n },\n \"mjackson\": {\n id: \"mjackson\",\n name: \"Michael Jackson\",\n namespace: \"MJACKSON\",\n src: \"assets/asf/mjackson.asf\"\n },\n \"martialwalk\": {\n id: \"martialwalk\",\n name: \"Martial Art Walks\",\n namespace: \"MARTIALWALK\",\n src: \"assets/asf/martialwalk.asf\"\n }\n}\n\nexport const STAGE_FILES = {\n \"testscene\": {\n id: \"testscene\",\n type: \"GLTF\",\n name: \"testscene.glb\",\n description: \"Test scene\",\n src: \"assets/scenes/testscene.glb\",\n scale: 1,\n },\n \"CBdragon\": {\n id: \"CBdragon\",\n type: \"COLLADA\",\n name: \"CBdragon.dae\",\n description: \"Cornell Box with Dragon\",\n src: \"assets/scenes/CBdragon.dae\",\n scale: 50,\n },\n \"CBbunny\": {\n id: \"CBbunny\",\n type: \"COLLADA\",\n name: \"CBbunny.dae\",\n description: \"Cornell Box with Bunny\",\n src: \"assets/scenes/CBbunny.dae\",\n scale: 50,\n },\n \"CBspheres\": {\n id: \"CBspheres\",\n type: \"COLLADA\",\n name: \"CBspheres.dae\",\n description: \"Cornell Box with Spheres\",\n src: \"assets/scenes/CBspheres.dae\",\n scale: 50,\n },\n \"dragon\": {\n id: \"dragon\",\n type: \"COLLADA\",\n name: \"dragon.dae\",\n description: \"Dragon\",\n src: \"assets/scenes/dragon.dae\",\n scale: 50,\n },\n}\n\nexport const HOLOLIVE_TRANSFORM = {\n \"root\": {\n position: new THREE.Vector3(30, -18, 30),\n rotation: new THREE.Euler()\n },\n \"lfemur\": {\n position: new THREE.Vector3(),\n rotation: new THREE.Euler(-Math.PI / 4, 0, 0)\n },\n \"rfemur\": {\n position: new THREE.Vector3(),\n rotation: new THREE.Euler(-Math.PI / 4, 0, 0)\n }\n}\n\nexport const HOLOLIVE_BONEMAP = {\n \"root\": \"全ての親\", // Maybe センター\n\n // lhipjoint tree\n // \"lhipjoint\": \"左足\", // no degrees of freedom\n \"lfemur\": \"左足\",\n \"ltibia\": \"左ひざ\",\n \"lfoot\": \"lfoot\",\n \"ltoes\": \"左足首\",\n\n // rhipjoint tree\n // \"rhipjoint\": \"右足\", // no degrees of freedom\n \"rfemur\": \"右足\",\n \"rtibia\": \"右ひざ\",\n \"rfoot\": \"rfoot\",\n \"rtoes\": \"右足首\",\n\n // Back stuff\n \"lowerback\": \"lowerback\",\n \"upperback\": \"上半身\",\n \"thorax\": \"上半身2\",\n \"lowerneck\": \"首\",\n \"upperneck\": \"upperneck\",\n \"head\": \"頭\",\n\n \n \"rclavicle\": \"rclavicle\",\n \"rhumerus\": \"右腕\",\n \"rradius\": \"右ひじ\",\n \"rwrist\": \"右手首\",\n \"rhand\": \"右手捩\",\n \"rfingers\": \"右手先\",\n \"rthumb\": \"rthumb\",\n\n \"lclavicle\": \"lclavicle\",\n \"lhumerus\": \"左腕\",\n \"lradius\": \"左ひじ\",\n \"lwrist\": \"左手首\",\n \"lhand\": \"左手捩\",\n \"lfingers\": \"左手先\",\n \"lthumb\": \"lthumb\",\n \n};\n\nexport const MMD_FILES = {\n \"trackerman\": {\n id: \"trackerman\",\n type: \"FBX\",\n src: \"assets/fbx/trackerman.fbx\",\n name: \"Motion Capture Man\",\n name_jp: \"Motion Capture Man\",\n author: \"Mixamo.com\",\n website: \"https://www.mixamo.com/\",\n bonemap: {\n head: \"Head\",\n root: \"Hips\",\n lowerback: \"Spine\",\n lowerneck: \"Neck\",\n lclavicle: \"nobone\",\n lhumerus: \"LeftShoulder\",\n lradius: \"LeftArm\",\n lwrist: \"LeftForeArm\",\n lhand: \"LeftHand\",\n rclavicle: \"nobone\",\n rhumerus: \"RightShoulder\",\n rradius: \"RightArm\",\n rwrist: \"RightForeArm\",\n rhand: \"RightHand\",\n thorax: \"Spine2\",\n upperback: \"Spine1\",\n upperneck: \"Neck1\",\n lfemur: \"LeftUpLeg\",\n ltibia: \"LeftLeg\",\n lfoot: \"LeftFoot\",\n ltoes: \"LeftToeBase\",\n rfemur: \"RightUpLeg\",\n rtibia: \"RightLeg\",\n rfoot: \"RightFoot\",\n rtoes: \"RightToeBase\",\n },\n transforms: {\n \"root\": {\n position: new THREE.Vector3(-20, -20, 20),\n rotation: new THREE.Euler(0.5, 0, 0)\n },\n \"lowerback\": {\n position: new THREE.Vector3(),\n rotation: new THREE.Euler(Math.PI / 2, 0, 0),\n },\n \"lfemur\": {\n position: new THREE.Vector3(9.6, -3, 3),\n rotation: new THREE.Euler(-0.1884, 0, 0),\n },\n \"rfemur\": {\n position: new THREE.Vector3(-9.6, -3, 3),\n rotation: new THREE.Euler(-0.1884, 0, 0),\n },\n \"ltibia\": {\n position: new THREE.Vector3(0, -42, 0),\n rotation: new THREE.Euler(0, 0, 0),\n },\n \"rtibia\": {\n position: new THREE.Vector3(0, -42, 0),\n rotation: new THREE.Euler(0, 0, 0),\n },\n \"lfoot\": {\n position: new THREE.Vector3(0.006493491607029611, -39.1481200728814, -1.9998497455948971),\n rotation: new THREE.Euler(Math.PI / 2, 0, 0),\n },\n \"rfoot\": {\n position: new THREE.Vector3(0.0064930247571783895, -39.14820955917779, -1.9980972354863404),\n rotation: new THREE.Euler(Math.PI / 2, 0, 0),\n },\n \"lhumerus\": {\n position: new THREE.Vector3(10, 10, 0),\n rotation: new THREE.Euler(0, 0, 0),\n },\n \"rhumerus\": {\n position: new THREE.Vector3(-10, 10, 0),\n rotation: new THREE.Euler(0, 0, 0),\n },\n \"lradius\": {\n position: new THREE.Vector3(12.3, -5.6, 3),\n rotation: new THREE.Euler(0, 0, -0.4396),\n },\n \"rradius\": {\n position: new THREE.Vector3(-12.3, -5.6, 3),\n rotation: new THREE.Euler(0, 0, -0.4396),\n },\n \"lwrist\": {\n position: new THREE.Vector3(27.7, 0, 0),\n rotation: new THREE.Euler(0, 0, 0),\n },\n \"rwrist\": {\n position: new THREE.Vector3(-27.7, 0, 0),\n rotation: new THREE.Euler(0, 0, 0),\n },\n },\n supported: true,\n },\n \"korone\": {\n id: \"korone\",\n type: \"MMD\",\n src: \"assets/mmd/korone/戌神ころね_v4.pmx\",\n name: \"Inugami Korone\",\n name_jp: \"戌神ころね\",\n author: \"Cover Corp.\",\n website: \"https://www.mmd.hololive.tv/\",\n bonemap: HOLOLIVE_BONEMAP,\n transforms: HOLOLIVE_TRANSFORM,\n supported: false,\n },\n \"okayu\": {\n id: \"okayu\",\n type: \"MMD\",\n src: \"assets/mmd/okayu/猫又おかゆ.pmx\",\n name: \"Nekomata Okayu\",\n name_jp: \"猫又おかゆ\",\n author: \"Cover Corp.\",\n website: \"https://www.mmd.hololive.tv/\",\n bonemap: HOLOLIVE_BONEMAP,\n transforms: HOLOLIVE_TRANSFORM,\n supported: false,\n },\n \"mel\": {\n id: \"mel\",\n type: \"MMD\",\n src: \"assets/mmd/mel/夜空メル.pmx\",\n name: \"Yozora Mel\",\n name_jp: \"夜空メル\",\n author: \"Cover Corp.\",\n website: \"https://www.mmd.hololive.tv/\",\n bonemap: HOLOLIVE_BONEMAP,\n transforms: HOLOLIVE_TRANSFORM,\n supported: false,\n }\n}","/**\n * ASF Parser by Kevin Mo (@encadyma).\n */\n\nimport { toRadians } from './constants';\nimport * as THREE from 'three';\n\nexport class ASFParser {\n TOKEN_KEYWORD_RGX = /^:(\\w+)(?:\\s+([\\w\\d\\s\\.]+))?/;\n TOKEN_COMMENT_RGX = /^#(.+)/;\n TOKEN_BEGIN_RGX = /^begin$/;\n TOKEN_END_RGX = /^end$/;\n TOKEN_WHITESPACE_RGX = /^\\s*$/;\n TOKEN_TUPLE_RGX = /(\\w+\\s)?\\(((?:\\s?[\\d\\.e\\-]+)+)\\)/;\n\n tokens = [];\n errors = [];\n\n loaded = false;\n\n metadata = {\n version: null,\n name: \"Not Loaded\",\n namespace: null,\n units: {\n mass: 1.0,\n length: 1,\n angle: \"deg\"\n },\n documentation: null\n };\n\n root = {\n id: \"0\",\n name: \"root\",\n order: [],\n axis: [],\n position: [],\n orientation: [],\n lastRotation: new THREE.Quaternion(),\n quatRotation: new THREE.Quaternion()\n };\n\n bones = {};\n tree = {};\n\n three = {\n enabled: false,\n bones: {},\n skeleton: null,\n container: null,\n mesh: null,\n helper: null,\n stage: null\n };\n\n editor = {\n openedBones: {\n \"root\": false,\n },\n currBone: \"root\",\n isBaking: false,\n mmdView: false,\n shouldRotate: false,\n hidden: false,\n };\n\n mmd = {\n loaded: false,\n mesh: null,\n skeleton: null,\n metadata: {\n src: null,\n name: \"No Model\",\n author: \"None\"\n },\n bonemap: {},\n transforms: {},\n helper: null,\n currBone: null\n };\n\n baked = {\n status: false,\n tracks: [],\n name: null,\n fps: 120,\n clip: null,\n mixer: null,\n action: null,\n }\n\n /**\n * Tokenizes a given ASF file for the parser,\n * given in raw ASCII format.\n * @param {String} raw_file or a string from an ASF file\n * @returns {Array} processed tokens\n */\n tokenize(raw_file) {\n console.time(\"tokenize\");\n const lines = raw_file.split('\\n');\n let index = 0;\n this.tokens = [];\n\n let currentKey;\n\n while (index < lines.length) {\n const line = lines[index].trim();\n if (this.TOKEN_KEYWORD_RGX.test(line)) {\n // KEYWORDS - :keyword\n const matches = line.match(this.TOKEN_KEYWORD_RGX);\n currentKey = matches[1];\n this.tokens.push({ type: 'KEYWORD', words: (!matches[2] ? [matches[1]] : matches.slice(1)) });\n\n if (currentKey == \"documentation\") {\n // Interpret all as string until next keyword.\n index++;\n while (index < lines.length && !this.TOKEN_KEYWORD_RGX.test(lines[index].trim())) {\n this.tokens.push({ type: 'STRING', words: [lines[index].trim()] });\n index++;\n }\n continue;\n } else if (currentKey == \"root\" || currentKey == \"units\") {\n // Interpret all as properties until next keyword.\n index++;\n while (index < lines.length && !this.TOKEN_KEYWORD_RGX.test(lines[index].trim())) {\n this.tokens.push({ type: 'PROPERTY', words: lines[index].trim().split(/,?\\s+/) });\n index++;\n }\n continue;\n }\n }\n else if (this.TOKEN_COMMENT_RGX.test(line)) {\n // COMMENTS - # comment\n this.tokens.push({ type: 'COMMENT', words: line.match(this.TOKEN_COMMENT_RGX).slice(1) });\n }\n else if (this.TOKEN_BEGIN_RGX.test(line)) {\n // BEGIN TOKEN - begin\n this.tokens.push({ type: 'BEGIN', words: ['begin'] });\n\n // Begin reading until the end!\n index ++;\n while (index < lines.length && !this.TOKEN_END_RGX.test(lines[index].trim())) {\n if (currentKey == \"hierarchy\") {\n // Interpret as relations.\n this.tokens.push({ type: 'RELATION', words: lines[index].trim().split(/,?\\s+/) });\n } else if (currentKey != \"documentation\"){\n // Interpret as properties.\n const props = lines[index].trim().split(/,?\\s+/);\n if (props[0] == 'limits' && this.TOKEN_TUPLE_RGX.test(lines[index].trim())) {\n // Start consuming tuples\n let tuples = [];\n\n while (index < lines.length && this.TOKEN_TUPLE_RGX.test(lines[index].trim())\n && !this.TOKEN_END_RGX.test(lines[index].trim())) {\n tuples.push(lines[index].trim().match(this.TOKEN_TUPLE_RGX)[2]);\n index++;\n }\n\n this.tokens.push({ type: 'PROPERTY', words: ['limits', tuples] });\n continue;\n } else {\n this.tokens.push({ type: 'PROPERTY', words: lines[index].trim().split(/,?\\s+/) });\n }\n }\n index++;\n }\n continue;\n }\n else if (this.TOKEN_END_RGX.test(line)) {\n // END TOKEN - end\n this.tokens.push({ type: 'END', words: ['end'] });\n }\n else if (this.TOKEN_WHITESPACE_RGX.test(line)) {\n // WHITESPACE TOKEN -\n this.tokens.push({ type: 'WHITESPACE', words: [] });\n }\n else {\n // Unknown tokens are parsed as strings\n this.tokens.push({ type: 'STRING', words: [line] });\n }\n index++;\n }\n\n console.timeEnd(\"tokenize\");\n\n return this.tokens;\n }\n\n /**\n * Processes the current set of tokens.\n */\n process() {\n let index = 0;\n let currentKey;\n console.time(\"parser\");\n\n while (index < this.tokens.length) {\n const token = this.tokens[index];\n\n if (token.type == \"KEYWORD\") {\n currentKey = token.words[0];\n switch (currentKey) {\n case \"name\":\n this.metadata.name = token.words[1];\n break;\n case \"version\":\n this.metadata.version = token.words[1];\n break;\n case \"namespace\":\n this.metadata.namespace = token.words[1];\n break;\n case \"root\":\n case \"documentation\":\n case \"units\":\n case \"bonedata\":\n case \"hierarchy\":\n break;\n default:\n console.error(\"warning! cannot process keyword \" + JSON.stringify(token));\n this.errors.push(\"Cannot process keyword \" + JSON.stringify(token) + \" on index \" + index + \".\");\n break;\n }\n } else if (token.type == \"WHITESPACE\" || token.type == \"COMMENT\") {\n // Ignore them!\n } else if (currentKey == \"documentation\" && token.type == \"STRING\") {\n // Documentation stuff!\n if (!this.metadata.documentation) {\n this.metadata.documentation = token.words[0];\n } else {\n this.metadata.documentation += \" \" + token.words[0];\n }\n } else if (currentKey == \"units\" && token.type == \"PROPERTY\") {\n switch (token.words[0]) {\n case \"mass\":\n if (parseFloat(token.words[1]) == NaN) {\n console.error(\"error! argument @ \" + JSON.stringify(token) + \" not a float!\");\n this.errors.push(\"Argument to property `mass` @ \" + JSON.stringify(token) + \" on index \" + index + \" not a float.\");\n } else {\n this.metadata.units.mass = parseFloat(token.words[1]);\n }\n break;\n case \"length\":\n if (parseFloat(token.words[1]) == NaN) {\n console.error(\"error! argument @ \" + JSON.stringify(token) + \" not a float!\");\n this.errors.push(\"Argument to property `length` @ \" + JSON.stringify(token) + \" on index \" + index + \" not a float.\");\n } else {\n this.metadata.units.length = parseFloat(token.words[1]);\n }\n break;\n case \"angle\":\n this.metadata.units.angle = token.words[1];\n break;\n default:\n console.error(\"warning! cannot process keyword \" + JSON.stringify(token));\n this.errors.push(\"Cannot process keyword \" + JSON.stringify(token) + \" on index \" + index + \".\");\n break;\n }\n } else if (currentKey == \"root\") {\n // Enter into a read loop for root data.\n while (index < this.tokens.length && this.tokens[index].type != \"KEYWORD\") {\n if (this.tokens[index].type == \"PROPERTY\") {\n const prop = this.tokens[index];\n switch (this.tokens[index].words[0]) {\n case \"order\":\n this.root.order = this.tokens[index].words.slice(1).map(s => s.toUpperCase());\n break;\n case \"axis\":\n this.root.axis = prop.words[1].split(\"\");\n break;\n case \"position\":\n this.root.position = prop.words.slice(1).map(parseFloat);\n break;\n case \"orientation\":\n this.root.orientation = prop.words.slice(1).map(parseFloat);\n break;\n default:\n console.error(\"[2] warning! in rootdata loop, cannot process property \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Unexpected property \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in root data read.\");\n }\n } else {\n console.error(\"[1] warning! in rootdata loop, cannot process keyword \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Unexpected token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in root data read.\");\n }\n index++;\n }\n continue;\n } else if (currentKey == \"hierarchy\") {\n // Enter into a read loop for hierarchy data.\n while (index < this.tokens.length && this.tokens[index].type != \"KEYWORD\") {\n const SKIP_TYPES = [\"BEGIN\", \"END\", \"WHITESPACE\", \"COMMENT\"];\n if (this.tokens[index].type == \"RELATION\") {\n const rel = this.tokens[index].words;\n // We start searching the tree for the given keyword.\n if (rel[0] == \"root\") {\n // Inject children into the tree\n for (const child_name of rel.slice(1)) {\n this.tree[child_name] = null;\n }\n } else {\n // Traverse into the tree until we find the child.\n // If not, post an error.\n function traverse(tree) {\n if (!tree || Object.keys(tree).length == 0) {\n return false;\n }\n \n for (const child in tree) {\n if (child == rel[0]) {\n tree[child] = {};\n for (const future of rel.slice(1)) {\n tree[child][future] = null;\n }\n return true;\n } else if (traverse(tree[child])) {\n return true;\n }\n }\n }\n\n if (!traverse(this.tree)) {\n console.error(\"[2] warning! in hieradata loop, cannot find location for relation \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Confused relation \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in hierarchy data read.\");\n }\n }\n } else if (!SKIP_TYPES.includes(this.tokens[index].type)) {\n // Become lazy and just skip interpretation of begin/end.\n console.error(\"[1] warning! in hieradata loop, cannot process keyword \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Unexpected token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in hierarchy data read.\");\n }\n index++;\n }\n console.log(this.tree);\n continue;\n } else if (currentKey == \"bonedata\") {\n // Enter into a read loop collecting bone data.\n while (index < this.tokens.length && this.tokens[index].type != \"KEYWORD\") {\n if (this.tokens[index].type == \"WHITESPACE\" || this.tokens[index].type == \"COMMENT\") {\n // Ignore these again.\n } else if (this.tokens[index].type == \"BEGIN\") {\n // Start reading bone properties.\n let nextBone = {\n id: null,\n name: null,\n direction: [],\n length: 0,\n axis: [],\n axis_order: [],\n dof: [],\n limits: []\n };\n index++;\n\n while (index < this.tokens.length \n && this.tokens[index].type != \"END\"\n && this.tokens[index].type != \"KEYWORD\") {\n // Read all the properties of each bone, placing\n // them into the bone data structure.\n const prop = this.tokens[index];\n if (prop.type == \"PROPERTY\") {\n switch(prop.words[0]) {\n case \"id\":\n nextBone.id = prop.words[1];\n break;\n case \"name\":\n nextBone.name = prop.words[1];\n break;\n case \"direction\":\n nextBone.direction = prop.words.slice(1).map(parseFloat);\n break;\n case \"length\":\n nextBone.length = parseFloat(prop.words[1]);\n break;\n case \"axis\":\n nextBone.axis = prop.words.slice(1, -1).map(parseFloat);\n nextBone.axis_order = prop.words[prop.words.length - 1].split(\"\");\n break;\n case \"dof\":\n nextBone.dof = prop.words.slice(1).map(s => s.toUpperCase());\n break;\n case \"limits\":\n // Split each constraint argument into two, then parse.\n nextBone.limits = prop.words[1].map(l => l.split(/,?\\s+/).map(parseFloat));\n break;\n default:\n console.error(\"[3] warning! in bonedata loop, cannot process token \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Unexpected property token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in bone data read.\");\n }\n } else {\n console.error(\"[2] warning! in bonedata loop, cannot process token \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Unexpected non-property token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in bone data read.\");\n }\n \n index++;\n }\n\n this.bones[nextBone.name] = nextBone;\n\n // Add the bone to the editor\n this.editor.openedBones[nextBone.name] = false;\n\n if (this.tokens[index].type != \"KEYWORD\") {\n // If forced out by next keyword, we break out of the bonedata read loop.\n // Technically, this is incorrect syntax as there should\n // be a closing \"end\" tag for each bone.\n break;\n }\n } else {\n console.error(\"[1] warning! in bonedata loop, cannot process token \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Unexpected token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \" in bone data read.\");\n }\n index++;\n }\n } else {\n console.error(\"warning! cannot process token \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Cannot process token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \".\");\n }\n\n index++;\n }\n console.timeEnd(\"parser\");\n\n this.loaded = true;\n }\n\n /**\n * Constructs the three.js skeleton.\n */\n construct() {\n // Setup timers for construction!\n console.time(\"THREE.js skeleton construct\");\n\n // Setup the root node.\n this.three.bones = {};\n\n const root = new THREE.Bone();\n root.name = this.root.name;\n root.position.x = this.root.position[0];\n root.position.y = this.root.position[1];\n root.position.z = this.root.position[2];\n\n root.setRotationFromEuler(new THREE.Euler(\n ...this.root.orientation.map(toRadians),\n this.root.axis.join('')\n ));\n\n this.three.bones[this.root.name] = root;\n\n function traverse(tree, parent, newPos, lastRotation, g) {\n // Traverse through the root node.\n if (tree == null) {\n return;\n }\n\n for (const child in tree) {\n const bone = new THREE.Bone();\n bone.name = child;\n\n // Store the parent rotation somewhere.\n lastRotation = lastRotation || new THREE.Quaternion();\n\n // Setup the position based on\n // direction and length of the bone.\n const direction = (new THREE.Vector3(...g.bones[child].direction)).normalize();\n const rotation = (new THREE.Quaternion()).setFromUnitVectors(new THREE.Vector3(0, 0, 1), direction);\n const position = newPos || new THREE.Vector3();\n\n bone.position.x = position.x;\n bone.position.y = position.y;\n bone.position.z = position.z;\n\n bone.quaternion.multiply(lastRotation.clone().inverse());\n bone.quaternion.multiply(rotation);\n\n // Create the relation.\n parent.add(bone);\n g.three.bones[child] = bone;\n g.bones[child].quatRotation = rotation.clone();\n g.bones[child].lastRotation = lastRotation.clone();\n\n // Then we add more...\n traverse(tree[child], bone, new THREE.Vector3(0, 0, g.bones[child].length), rotation, g);\n }\n }\n\n traverse(this.tree, root, new THREE.Vector3(), new THREE.Quaternion(), this);\n\n // Create the skeleton from bones.\n this.three.skeleton = new THREE.Skeleton(Object.values(this.three.bones));\n\n this.three.helper = new THREE.SkeletonHelper(root);\n this.three.helper.skeleton = this.three.skeleton;\n\n this.three.container = new THREE.Group();\n this.three.container.add(root);\n\n this.three.enabled = true;\n console.timeEnd(\"THREE.js skeleton construct\");\n\n return this.three.skeleton;\n }\n\n /**\n * Imposes a keyframe on the current bones\n * based on incoming KEYDATA.\n */\n frameUpdate(keydata, updateBones = true) {\n console.time(\"frame update\");\n let result = {};\n\n if (updateBones) {\n this.three.bones[this.root.name].updateMatrixWorld();\n }\n \n for (const boneName in keydata) {\n if (!Object.keys(this.three.bones).includes(boneName)) {\n this.errors.push(`Unknown bone name ${boneName} in key data found.`);\n console.warn(`Unknown bone name ${boneName} in key data found.`);\n continue;\n }\n\n if (boneName == this.root.name) {\n // Update root parameters.\n if (this.root.order.length != keydata[boneName].length) {\n // Incorrect # of parameters.\n this.errors.push(`Incorrect number of motion parameters for root node, ${keydata[boneName].length} provided.`);\n console.error(`incorrect number of motion parameters for root node, ${keydata[boneName].length} provided.`);\n continue;\n }\n }\n\n const order = boneName == this.root.name ? this.root.order : this.bones[boneName].dof;\n const axis_order = boneName == this.root.name ? this.root.axis.join('') : this.bones[boneName].axis_order.join('');\n const axis_values = boneName == this.root.name ? this.root.orientation : this.bones[boneName].axis;\n\n let axisEuler = new THREE.Euler(toRadians(axis_values[0]), toRadians(axis_values[1]), toRadians(axis_values[2]), axis_order);\n const axis = new THREE.Quaternion();\n // NOTE: .setFromEuler does not operate properly, submitted new\n // PR to get this fixed...\n this.setFromEuler(axis, axisEuler);\n // axis.setFromEuler(axisEuler);\n const inverseAxis = axis.clone().conjugate();\n\n const position = (new THREE.Vector3()).copy(this.three.bones[boneName].position);\n \n const rotation = this.three.bones[boneName].rotation.clone();\n const transform = new THREE.Matrix4();\n\n for (let i = 0; i < order.length; i++) {\n // Iterate over each parameter according to the labels.\n // TODO: switch these to constants\n const m = new THREE.Matrix4();\n\n switch(order[i]) {\n case \"TX\":\n position.x = keydata[boneName][i];\n transform.multiplyMatrices(\n m.makeTranslation(keydata[boneName][i], 0, 0),\n transform\n );\n break;\n case \"TY\":\n position.y = keydata[boneName][i];\n transform.multiplyMatrices(\n m.makeTranslation(0, keydata[boneName][i], 0),\n transform\n );\n break;\n case \"TZ\":\n position.z = keydata[boneName][i];\n transform.multiplyMatrices(\n m.makeTranslation(0, 0, keydata[boneName][i]),\n transform\n );\n break;\n case \"RX\":\n rotation.x = toRadians(keydata[boneName][i]);\n transform.multiplyMatrices(\n m.makeRotationX(toRadians(keydata[boneName][i])),\n transform\n );\n break;\n case \"RY\":\n rotation.y = toRadians(keydata[boneName][i]);\n transform.multiplyMatrices(\n m.makeRotationY(toRadians(keydata[boneName][i])),\n transform\n );\n break;\n case \"RZ\":\n rotation.z = toRadians(keydata[boneName][i]);\n transform.multiplyMatrices(\n m.makeRotationZ(toRadians(keydata[boneName][i])),\n transform\n );\n break;\n default:\n this.errors.push(`Unknown motion channel ${order[i]} provided.`);\n console.error(`unknown motion channel ${order[i]} provided`);\n }\n }\n\n let newPos = new THREE.Vector3(),\n newQuaternion = new THREE.Quaternion(),\n newScale = new THREE.Vector3();\n \n transform.decompose(newPos, newQuaternion, newScale);\n\n // Process the final rotation!\n \n const prefinalRotation = (new THREE.Quaternion())\n .multiply(axis)\n .multiply(newQuaternion)\n .multiply(inverseAxis);\n \n const finalRotation = (new THREE.Quaternion())\n .multiply((boneName == this.root.name ? this.root : this.bones[boneName]).lastRotation.clone().inverse())\n .multiply(prefinalRotation)\n .multiply((boneName == this.root.name ? this.root : this.bones[boneName]).quatRotation.clone());\n\n if (updateBones) {\n this.three.bones[boneName].position.copy(position);\n this.three.bones[boneName].quaternion.copy(finalRotation);\n\n if (this.mmd.loaded && Object.keys(this.mmd.bonemap).includes(boneName) && this.mmd.bonemap[boneName] != null) {\n // Attempt to puppet the MMD model as well\n const mmdbone = this.mmd.skeleton.getBoneByName(this.mmd.bonemap[boneName]);\n if (mmdbone) {\n if (boneName == this.root.name) {\n const newPosition = position.clone();\n if (this.mmd.transforms[boneName]) {\n newPosition.add(this.mmd.transforms[boneName].position);\n }\n this.mmd.mesh.position.copy(newPosition);\n } else if (this.mmd.transforms[boneName] && this.mmd.transforms[boneName].position) {\n mmdbone.position.copy(this.mmd.transforms[boneName].position);\n }\n \n if (this.mmd.transforms[boneName] && this.mmd.transforms[boneName].rotation) {\n const newRotation = new THREE.Quaternion();\n this.setFromEuler(newRotation, this.mmd.transforms[boneName].rotation);\n newRotation.multiply(finalRotation);\n mmdbone.quaternion.copy(newRotation);\n } else {\n mmdbone.quaternion.copy(finalRotation);\n }\n // mmdbone.position.copy(position);\n }\n }\n }\n\n // Push this to results.\n result[boneName] = {\n uuid: this.three.bones[boneName].uuid,\n quaternion: finalRotation,\n position: position,\n };\n }\n\n if (updateBones) {\n this.three.bones[this.root.name].updateMatrixWorld();\n this.three.skeleton.update();\n }\n\n console.timeEnd(\"frame update\");\n \n return result;\n }\n\n bake(amcFrames, amcName) {\n const TIME_PER_FRAME = 1.0 / this.baked.fps;\n this.baked.tracks = [];\n\n let animationTracks = {};\n if (amcFrames.length <= 0) {\n console.error(\"There are no frames given.\")\n return;\n }\n\n for (const bone in amcFrames[0]) {\n animationTracks[bone] = {\n uuid: this.three.bones[bone].uuid,\n times: [],\n position: [],\n quaternion: [],\n };\n }\n\n for (let f = 0; f < amcFrames.length; f++) {\n const frame = this.frameUpdate(amcFrames[f], false);\n for (const bone in frame) {\n animationTracks[bone].times.push(f * TIME_PER_FRAME);\n\n // Due to the way KeyframeTracks store values in a Float32Array,\n // each value must be unpacked.\n animationTracks[bone].position.push(...frame[bone].position.toArray());\n animationTracks[bone].quaternion.push(...frame[bone].quaternion.toArray());\n }\n }\n\n // Generate a track per bone in animation tracks.\n for (const bone in animationTracks) {\n this.baked.tracks.push(\n new THREE.QuaternionKeyframeTrack(\n // animationTracks[bone].uuid + '.quaternion',\n `.bones[${bone}].quaternion`,\n animationTracks[bone].times,\n animationTracks[bone].quaternion\n )\n );\n this.baked.tracks.push(\n new THREE.VectorKeyframeTrack(\n // animationTracks[bone].uuid + '.position',\n `.bones[${bone}].position`,\n animationTracks[bone].times,\n animationTracks[bone].position\n )\n );\n }\n\n this.baked.clip = new THREE.AnimationClip(amcName, TIME_PER_FRAME * amcFrames.length, this.baked.tracks);\n\n this.baked.name = amcName;\n this.baked.mixer = new THREE.AnimationMixer(this.three.helper);\n this.baked.action = this.baked.mixer.clipAction(this.baked.clip).setEffectiveWeight(1.0);\n this.baked.status = true;\n\n return this.baked.action;\n }\n\n setFromEuler(quat, euler) {\n // three.js does not patch this until r120. PR#20042.\n // Until then, I'm bringing the math to this project...\n const x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n const cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n const s3 = sin( z / 2 );\n \n switch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tquat._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tquat._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tquat._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tquat._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tquat._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tquat._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tquat._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tquat._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tquat._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tquat._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tquat._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tquat._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tquat._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tquat._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tquat._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tquat._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tquat._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tquat._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tquat._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tquat._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tquat._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tquat._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tquat._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tquat._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'Inner THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n }\n \n quat._onChangeCallback();\n return quat;\n }\n}","\n\n\n\n
\n
💃 POSE PANEL
\n
\n

Select a bundled .ASF (CMU) skeleton file from the list below.

\n \n \n

Skeleton Info

\n
    \n
  • \n Name:\n {asf.metadata.name}\n
  • \n
  • \n ASF Version:\n {asf.metadata.version}\n
  • \n
  • \n Namespace:\n {asf.metadata.namespace}\n
  • \n
\n

Unit Info

\n
    \n
  • \n Mass:\n {asf.metadata.units.mass}\n
  • \n
  • \n Length:\n {asf.metadata.units.length}\n
  • \n
  • \n Angle Mode:\n {asf.metadata.units.angle}\n
  • \n
\n

File Info

\n

{asf.metadata.documentation}

\n
\n
\n","
\n
💃 INSPECTOR
\n
\n
    \n{#if asf.tokens.length > 0}\n{#each asf.tokens as token, index}\n
  • \n
    \n {index}\n {#if token.type == \"PROPERTY\"}\n   {token.words[0]} {token.words.slice(1).join(' ')}\n {:else if token.type == \"STRING\"}\n {token.words.join(' ')}\n {:else if token.type == \"KEYWORD\"}\n :{token.words[0]} {token.words.slice(1).join(' ')}\n {:else if token.type == \"RELATION\"}\n   {token.words.join(' → ')}\n {:else if token.type == \"COMMENT\"}\n #{token.words.join(' ')}\n {:else}\n {token.words.join(' ')}\n {/if}\n
    \n
    {token.type}
    \n
  • \n{/each}\n{:else}\n
  • \n
    \n 0\n No tokens loaded\n
    \n
    SYSTEM
    \n
  • \n{/if}\n
\n
\n
\n\n\n\n","
\n
\n {asf.editor.openedBones[name] ? \"-\" : \">\"}\n {name}\n
\n {#if asf.editor.openedBones[name] && tree != null && Object.keys(tree).length > 0}\n
\n {#each Object.keys(tree) as child}\n \n {/each}\n
\n {/if}\n
\n\n\n\n","
\n
\n {bone.userData.opened ? \"-\" : \">\"}\n {bone.name}\n
\n {#if bone.userData.opened && bone != null && bone.children.length > 0}\n
\n {#each bone.children as child}\n \n {/each}\n
\n {/if}\n
\n\n\n\n","\n\n\n\n
\n
🖱️ SKELETON TREE
\n
\n \n {#if asf.loaded && !asf.editor.mmdView}\n \n {:else if asf.editor.mmdView && asf.mmd.loaded}\n \n \n {:else}\n

Skeleton not loaded.

\n {/if}\n
\n
\n","\n\n\n\n
\n
🖱️ INSPECTOR
\n
\n \n {#if asf.loaded && mmdView}\n {#if asf.mmd.transforms[asf.editor.currBone]}\n

Set the MMD correction transforms that will be applied to the bone.

\n transform x:\n
\n transform y:\n
\n transform z:\n
\n euler x:\n
\n euler y:\n
\n euler z:\n
\n {:else}\n

No post-animated MMD transforms have been set for this bone.

\n \n {/if}\n {:else if asf.loaded && !mmdView}\n {#if asf.editor.currBone == asf.root.name}\n

Root Bone

\n
    \n
  • id: {asf.root.id}
  • \n
  • name: {asf.root.name}
  • \n
  • order: {asf.root.order}
  • \n
  • axis: {asf.root.axis}
  • \n
  • position: {asf.root.position}
  • \n
  • orientation: {asf.root.orientation}
  • \n
\n {:else}\n

{asf.editor.currBone}

\n
    \n
  • id: {asf.bones[asf.editor.currBone].id}
  • \n
  • name: {asf.bones[asf.editor.currBone].name}
  • \n
  • direction: {asf.bones[asf.editor.currBone].direction}
  • \n
  • length: {asf.bones[asf.editor.currBone].length}
  • \n
  • axis: {asf.bones[asf.editor.currBone].axis}
  • \n
  • axis order: {asf.bones[asf.editor.currBone].axis_order}
  • \n
  • dof: {asf.bones[asf.editor.currBone].dof}
  • \n
  • constraints: {asf.bones[asf.editor.currBone].limits}
  • \n
\n {/if}\n

Skeleton Properties

\n {#if asf.three.skeleton.getBoneByName(asf.editor.currBone)}\n
    \n
  • uuid: {asf.three.skeleton.getBoneByName(asf.editor.currBone).uuid}
  • \n
  • position: {vec3ToString(asf.three.bones[asf.editor.currBone].position)}
  • \n
  • rotation: {eulerToString(asf.three.bones[asf.editor.currBone].rotation)}
  • \n
  • quaternion: {quatToString(asf.three.bones[asf.editor.currBone].quaternion)}
  • \n
\n {:else}\n

Could not find the bone in the given skeleton.

\n {/if}\n

MMD Properties

\n {#if asf.mmd.loaded}\n Current Linked: {asf.mmd.bonemap[asf.editor.currBone] ? asf.mmd.bonemap[asf.editor.currBone] : \"no bone\"}\n
\n \n \n \n \n {:else}\n

No MMD model loaded

\n {/if}\n {:else}\n

No element selected.

\n {/if}\n
\n
\n","/**\n * AMC Parser by Kevin Mo (@encadyma).\n */\n\nexport class AMCParser {\n TOKEN_COMMENT_RGX = /^#(.+)/;\n TOKEN_KEYWORD_RGX = /^:(\\w+)(?:\\s+([\\w\\d\\s\\.]+))?/;\n TOKEN_KEYDATA_RGX = /^([\\w]+)\\s((?:(?:[\\d\\.\\e\\-]+)\\s*)+)$/;\n TOKEN_FRAMENUM_RGX = /^([\\d]+)$/;\n TOKEN_WHITESPACE_RGX = /^\\s*$/;\n\n loaded = false;\n tokens = [];\n\n frames = [];\n frameCount = 0;\n\n errors = [];\n\n metadata = {\n name: \"Unnamed AMC\",\n };\n\n player = {\n frame: 0,\n fps: 10,\n playInterval: null,\n }\n\n /**\n * Sets the AMC human-readable name.\n * @param {String} name new AMC file name\n */\n setName(name) {\n this.metadata.name = name;\n }\n\n /**\n * Tokenizes a given AMC file for the parser,\n * given in raw ASCII format.\n * @param {String} raw_file or a string from an AMC file\n * @returns {Array} processed tokens\n */\n tokenize(raw_file) {\n const lines = raw_file.split('\\n');\n let index = 0;\n this.tokens = [];\n\n console.time(\"tokenize amc\");\n\n while (index < lines.length) {\n const line = lines[index].trim();\n if (this.TOKEN_KEYWORD_RGX.test(line)) {\n // KEYWORD - :keyword\n const matches = line.match(this.TOKEN_KEYWORD_RGX);\n this.tokens.push({ type: 'KEYWORD', words: (!matches[2] ? [matches[1]] : matches.slice(1)) });\n } else if (this.TOKEN_COMMENT_RGX.test(line)) {\n // COMMENTS - # comment\n this.tokens.push({ type: 'COMMENT', words: line.match(this.TOKEN_COMMENT_RGX).slice(1) });\n } else if (this.TOKEN_FRAMENUM_RGX.test(line)) {\n // FRAMENUM - frame #\n const matches = line.match(this.TOKEN_FRAMENUM_RGX);\n this.tokens.push({ type: 'FRAMENUM', words: [matches[1]] });\n } else if (this.TOKEN_KEYDATA_RGX.test(line)) {\n // KEYDATA - bone # # #...\n const matches = line.match(this.TOKEN_KEYDATA_RGX);\n this.tokens.push({ type: 'KEYDATA', words: [matches[1], ...matches[2].split(/,?\\s+/)] });\n } else if (this.TOKEN_WHITESPACE_RGX.test(line)) {\n // WHITESPACE - \n this.tokens.push({ type: 'WHITESPACE', words: [] });\n } else {\n // Unknown tokens are parsed as strings\n this.tokens.push({ type: 'STRING', words: [line] });\n }\n index++;\n }\n\n console.timeEnd(\"tokenize amc\");\n\n return this.tokens;\n }\n\n process() {\n this.frames = [];\n this.frameCount = 0;\n\n console.time(\"parser amc\");\n\n let index = 0;\n while (index < this.tokens.length) {\n const token = this.tokens[index];\n if (token.type == \"KEYWORD\") {\n // Ignore keyword data for now... maybe\n // in the future when we expand the AMC\n // file format.\n } else if (token.type == \"COMMENT\") {\n // Ignore comments per usual.\n } else if (token.type == \"FRAMENUM\") {\n // We go on a frame data loop!\n const findex = parseInt(token.words[0]) - 1;\n while (this.frames.length <= findex) {\n // Push empty frames so we can index later.\n // Not elegant.\n this.frames.push(null);\n }\n\n let nextFrame = {};\n index++;\n\n while (index < this.tokens.length && this.tokens[index].type == \"KEYDATA\") {\n const kdata = this.tokens[index].words;\n nextFrame[kdata[0]] = kdata.slice(1).map(parseFloat);\n index++;\n }\n\n this.frames[findex] = nextFrame;\n this.frameCount = Math.max(this.frameCount, findex + 1);\n continue;\n } else if (token.type != \"WHITESPACE\") {\n console.error(\"warning! cannot process token \" + JSON.stringify(this.tokens[index]));\n this.errors.push(\"Cannot process token \" + JSON.stringify(this.tokens[index]) + \" on index \" + index + \".\");\n }\n\n index++;\n }\n\n this.loaded = true;\n\n console.log(this.frames);\n console.timeEnd(\"parser amc\");\n\n return this.frames;\n }\n}","
\n
🏃‍♀️ ANIMATE PANEL
\n
\n

Select an .AMC (CMU) Motion Capture file from the list below.

\n\n\n

Skeleton Info

\n
    \n
  • Name: {asf.metadata.name}
  • \n
  • ASF Version: {asf.metadata.version}
  • \n
  • Namespace: {asf.metadata.namespace}
  • \n
\n

Animation Info

\n
    \n
  • Name: {amc.metadata.name}
  • \n
  • Total Frames: {amc.frameCount}
  • \n
\n
\n
\n\n\n\n","
\n
🏃‍♀️ KEY INSPECTOR
\n
\n{#if amc.loaded}\n

frame {amc.player.frame}

\n{#each Object.entries(amc.frames[amc.player.frame]) as data}\n
\n{data[0]}\n\n{#each data[1] as kdata}\n{kdata}\n{/each}\n\n
\n{/each}\n{:else}\n

Nothing to inspect

\n{/if}\n
\n
\n\n\n\n","\n\n\n\n
\n
🏃‍♀️ TIMELINE
\n
\n {#if amc.loaded && asf.editor.isBaking}\n

baking view

\n \n \n {#if asf.baked.action && asf.baked.action.isRunning()}\n \n {:else}\n \n {/if}\n {:else if amc.loaded && !asf.editor.isBaking}\n

frame {amc.player.frame}

\n \n \n \n frame -1\n \n {#if amc.player.playInterval != null}\n \n {:else}\n \n slow play ({amc.player.fps} fps)\n \n {/if}\n \n \n frame +1\n \n \n last frame\n \n {:else}\n

Load some motion data first!

\n {/if}\n
\n
\n","import {\n\tFileLoader,\n\tLoader,\n\tTexture\n} from \"../../../build/three.module.js\";\n\nvar TGALoader = function ( manager ) {\n\n\tLoader.call( this, manager );\n\n};\n\nTGALoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: TGALoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar texture = new Texture();\n\n\t\tvar loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttexture.image = scope.parse( buffer );\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t},\n\n\tparse: function ( buffer ) {\n\n\t\t// reference from vthibault, https://github.com/vthibault/roBrowser/blob/master/src/Loaders/Targa.js\n\n\t\tfunction tgaCheckHeader( header ) {\n\n\t\t\tswitch ( header.image_type ) {\n\n\t\t\t\t// check indexed type\n\n\t\t\t\tcase TGA_TYPE_INDEXED:\n\t\t\t\tcase TGA_TYPE_RLE_INDEXED:\n\t\t\t\t\tif ( header.colormap_length > 256 || header.colormap_size !== 24 || header.colormap_type !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.TGALoader: Invalid type colormap data for indexed type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// check colormap type\n\n\t\t\t\tcase TGA_TYPE_RGB:\n\t\t\t\tcase TGA_TYPE_GREY:\n\t\t\t\tcase TGA_TYPE_RLE_RGB:\n\t\t\t\tcase TGA_TYPE_RLE_GREY:\n\t\t\t\t\tif ( header.colormap_type ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.TGALoader: Invalid type colormap data for colormap type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// What the need of a file without data ?\n\n\t\t\t\tcase TGA_TYPE_NO_DATA:\n\t\t\t\t\tconsole.error( 'THREE.TGALoader: No data.' );\n\n\t\t\t\t\t// Invalid type ?\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.TGALoader: Invalid type \"%s\".', header.image_type );\n\n\t\t\t}\n\n\t\t\t// check image width and height\n\n\t\t\tif ( header.width <= 0 || header.height <= 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.TGALoader: Invalid image size.' );\n\n\t\t\t}\n\n\t\t\t// check image pixel size\n\n\t\t\tif ( header.pixel_size !== 8 && header.pixel_size !== 16 &&\n\t\t\t\theader.pixel_size !== 24 && header.pixel_size !== 32 ) {\n\n\t\t\t\tconsole.error( 'THREE.TGALoader: Invalid pixel size \"%s\".', header.pixel_size );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// parse tga image buffer\n\n\t\tfunction tgaParse( use_rle, use_pal, header, offset, data ) {\n\n\t\t\tvar pixel_data,\n\t\t\t\tpixel_size,\n\t\t\t\tpixel_total,\n\t\t\t\tpalettes;\n\n\t\t\tpixel_size = header.pixel_size >> 3;\n\t\t\tpixel_total = header.width * header.height * pixel_size;\n\n\t\t\t // read palettes\n\n\t\t\t if ( use_pal ) {\n\n\t\t\t\t palettes = data.subarray( offset, offset += header.colormap_length * ( header.colormap_size >> 3 ) );\n\n\t\t\t }\n\n\t\t\t // read RLE\n\n\t\t\t if ( use_rle ) {\n\n\t\t\t\t pixel_data = new Uint8Array( pixel_total );\n\n\t\t\t\tvar c, count, i;\n\t\t\t\tvar shift = 0;\n\t\t\t\tvar pixels = new Uint8Array( pixel_size );\n\n\t\t\t\twhile ( shift < pixel_total ) {\n\n\t\t\t\t\tc = data[ offset ++ ];\n\t\t\t\t\tcount = ( c & 0x7f ) + 1;\n\n\t\t\t\t\t// RLE pixels\n\n\t\t\t\t\tif ( c & 0x80 ) {\n\n\t\t\t\t\t\t// bind pixel tmp array\n\n\t\t\t\t\t\tfor ( i = 0; i < pixel_size; ++ i ) {\n\n\t\t\t\t\t\t\tpixels[ i ] = data[ offset ++ ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// copy pixel array\n\n\t\t\t\t\t\tfor ( i = 0; i < count; ++ i ) {\n\n\t\t\t\t\t\t\tpixel_data.set( pixels, shift + i * pixel_size );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tshift += pixel_size * count;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// raw pixels\n\n\t\t\t\t\t\tcount *= pixel_size;\n\n\t\t\t\t\t\tfor ( i = 0; i < count; ++ i ) {\n\n\t\t\t\t\t\t\tpixel_data[ shift + i ] = data[ offset ++ ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tshift += count;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t } else {\n\n\t\t\t\t// raw pixels\n\n\t\t\t\tpixel_data = data.subarray(\n\t\t\t\t\t offset, offset += ( use_pal ? header.width * header.height : pixel_total )\n\t\t\t\t);\n\n\t\t\t }\n\n\t\t\t return {\n\t\t\t\tpixel_data: pixel_data,\n\t\t\t\tpalettes: palettes\n\t\t\t };\n\n\t\t}\n\n\t\tfunction tgaGetImageData8bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image, palettes ) {\n\n\t\t\tvar colormap = palettes;\n\t\t\tvar color, i = 0, x, y;\n\t\t\tvar width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i ++ ) {\n\n\t\t\t\t\tcolor = image[ i ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = 255;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = colormap[ ( color * 3 ) + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = colormap[ ( color * 3 ) + 1 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = colormap[ ( color * 3 ) + 2 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageData16bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tvar color, i = 0, x, y;\n\t\t\tvar width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 2 ) {\n\n\t\t\t\t\tcolor = image[ i + 0 ] + ( image[ i + 1 ] << 8 ); // Inversed ?\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = ( color & 0x7C00 ) >> 7;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = ( color & 0x03E0 ) >> 2;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = ( color & 0x001F ) >> 3;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = ( color & 0x8000 ) ? 0 : 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageData24bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tvar i = 0, x, y;\n\t\t\tvar width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 3 ) {\n\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = 255;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = image[ i + 1 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = image[ i + 2 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageData32bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tvar i = 0, x, y;\n\t\t\tvar width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 4 ) {\n\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = image[ i + 1 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = image[ i + 2 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = image[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageDataGrey8bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tvar color, i = 0, x, y;\n\t\t\tvar width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i ++ ) {\n\n\t\t\t\t\tcolor = image[ i ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = color;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = color;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = color;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageDataGrey16bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tvar i = 0, x, y;\n\t\t\tvar width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 2 ) {\n\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = image[ i + 1 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction getTgaRGBA( data, width, height, image, palette ) {\n\n\t\t\tvar x_start,\n\t\t\t\ty_start,\n\t\t\t\tx_step,\n\t\t\t\ty_step,\n\t\t\t\tx_end,\n\t\t\t\ty_end;\n\n\t\t\tswitch ( ( header.flags & TGA_ORIGIN_MASK ) >> TGA_ORIGIN_SHIFT ) {\n\n\t\t\t\tdefault:\n\t\t\t\tcase TGA_ORIGIN_UL:\n\t\t\t\t\tx_start = 0;\n\t\t\t\t\tx_step = 1;\n\t\t\t\t\tx_end = width;\n\t\t\t\t\ty_start = 0;\n\t\t\t\t\ty_step = 1;\n\t\t\t\t\ty_end = height;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TGA_ORIGIN_BL:\n\t\t\t\t\tx_start = 0;\n\t\t\t\t\tx_step = 1;\n\t\t\t\t\tx_end = width;\n\t\t\t\t\ty_start = height - 1;\n\t\t\t\t\ty_step = - 1;\n\t\t\t\t\ty_end = - 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TGA_ORIGIN_UR:\n\t\t\t\t\tx_start = width - 1;\n\t\t\t\t\tx_step = - 1;\n\t\t\t\t\tx_end = - 1;\n\t\t\t\t\ty_start = 0;\n\t\t\t\t\ty_step = 1;\n\t\t\t\t\ty_end = height;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TGA_ORIGIN_BR:\n\t\t\t\t\tx_start = width - 1;\n\t\t\t\t\tx_step = - 1;\n\t\t\t\t\tx_end = - 1;\n\t\t\t\t\ty_start = height - 1;\n\t\t\t\t\ty_step = - 1;\n\t\t\t\t\ty_end = - 1;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( use_grey ) {\n\n\t\t\t\tswitch ( header.pixel_size ) {\n\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\ttgaGetImageDataGrey8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 16:\n\t\t\t\t\t\ttgaGetImageDataGrey16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.TGALoader: Format not supported.' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( header.pixel_size ) {\n\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\ttgaGetImageData8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image, palette );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 16:\n\t\t\t\t\t\ttgaGetImageData16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 24:\n\t\t\t\t\t\ttgaGetImageData24bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 32:\n\t\t\t\t\t\ttgaGetImageData32bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.TGALoader: Format not supported.' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Load image data according to specific method\n\t\t\t// var func = 'tgaGetImageData' + (use_grey ? 'Grey' : '') + (header.pixel_size) + 'bits';\n\t\t\t// func(data, y_start, y_step, y_end, x_start, x_step, x_end, width, image, palette );\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// TGA constants\n\n\t\tvar TGA_TYPE_NO_DATA = 0,\n\t\t\tTGA_TYPE_INDEXED = 1,\n\t\t\tTGA_TYPE_RGB = 2,\n\t\t\tTGA_TYPE_GREY = 3,\n\t\t\tTGA_TYPE_RLE_INDEXED = 9,\n\t\t\tTGA_TYPE_RLE_RGB = 10,\n\t\t\tTGA_TYPE_RLE_GREY = 11,\n\n\t\t\tTGA_ORIGIN_MASK = 0x30,\n\t\t\tTGA_ORIGIN_SHIFT = 0x04,\n\t\t\tTGA_ORIGIN_BL = 0x00,\n\t\t\tTGA_ORIGIN_BR = 0x01,\n\t\t\tTGA_ORIGIN_UL = 0x02,\n\t\t\tTGA_ORIGIN_UR = 0x03;\n\n\t\tif ( buffer.length < 19 ) console.error( 'THREE.TGALoader: Not enough data to contain header.' );\n\n\t\tvar content = new Uint8Array( buffer ),\n\t\t\toffset = 0,\n\t\t\theader = {\n\t\t\t\tid_length: content[ offset ++ ],\n\t\t\t\tcolormap_type: content[ offset ++ ],\n\t\t\t\timage_type: content[ offset ++ ],\n\t\t\t\tcolormap_index: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\tcolormap_length: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\tcolormap_size: content[ offset ++ ],\n\t\t\t\torigin: [\n\t\t\t\t\tcontent[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\t\tcontent[ offset ++ ] | content[ offset ++ ] << 8\n\t\t\t\t],\n\t\t\t\twidth: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\theight: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\tpixel_size: content[ offset ++ ],\n\t\t\t\tflags: content[ offset ++ ]\n\t\t\t};\n\n\t\t// check tga if it is valid format\n\n\t\ttgaCheckHeader( header );\n\n\t\tif ( header.id_length + offset > buffer.length ) {\n\n\t\t\tconsole.error( 'THREE.TGALoader: No data.' );\n\n\t\t}\n\n\t\t// skip the needn't data\n\n\t\toffset += header.id_length;\n\n\t\t// get targa information about RLE compression and palette\n\n\t\tvar use_rle = false,\n\t\t\tuse_pal = false,\n\t\t\tuse_grey = false;\n\n\t\tswitch ( header.image_type ) {\n\n\t\t\tcase TGA_TYPE_RLE_INDEXED:\n\t\t\t\tuse_rle = true;\n\t\t\t\tuse_pal = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_INDEXED:\n\t\t\t\tuse_pal = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_RLE_RGB:\n\t\t\t\tuse_rle = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_RGB:\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_RLE_GREY:\n\t\t\t\tuse_rle = true;\n\t\t\t\tuse_grey = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_GREY:\n\t\t\t\tuse_grey = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t//\n\n\t\tvar useOffscreen = typeof OffscreenCanvas !== 'undefined';\n\n\t\tvar canvas = useOffscreen ? new OffscreenCanvas( header.width, header.height ) : document.createElement( 'canvas' );\n\t\tcanvas.width = header.width;\n\t\tcanvas.height = header.height;\n\n\t\tvar context = canvas.getContext( '2d' );\n\t\tvar imageData = context.createImageData( header.width, header.height );\n\n\t\tvar result = tgaParse( use_rle, use_pal, header, offset, content );\n\t\tgetTgaRGBA( imageData.data, header.width, header.height, result.pixel_data, result.palettes );\n\n\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\treturn useOffscreen ? canvas.transferToImageBitmap() : canvas;\n\n\t}\n\n} );\n\nexport { TGALoader };\n","import {\n\tAmbientLight,\n\tAnimationClip,\n\tBone,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tEuler,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tLoaderUtils,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshLambertMaterial,\n\tMeshPhongMaterial,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tScene,\n\tSkeleton,\n\tSkinnedMesh,\n\tSpotLight,\n\tTextureLoader,\n\tVector3,\n\tVectorKeyframeTrack\n} from \"../../../build/three.module.js\";\nimport { TGALoader } from \"../loaders/TGALoader.js\";\n\nvar ColladaLoader = function ( manager ) {\n\n\tLoader.call( this, manager );\n\n};\n\nColladaLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\tconstructor: ColladaLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\tvar loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\toptions: {\n\n\t\tset convertUpAxis( value ) {\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: options.convertUpAxis() has been removed. Up axis is converted automatically.' );\n\n\t\t}\n\n\t},\n\n\tparse: function ( text, path ) {\n\n\t\tfunction getElementsByTagName( xml, name ) {\n\n\t\t\t// Non recursive xml.getElementsByTagName() ...\n\n\t\t\tvar array = [];\n\t\t\tvar childNodes = xml.childNodes;\n\n\t\t\tfor ( var i = 0, l = childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = childNodes[ i ];\n\n\t\t\t\tif ( child.nodeName === name ) {\n\n\t\t\t\t\tarray.push( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseStrings( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tvar parts = text.trim().split( /\\s+/ );\n\t\t\tvar array = new Array( parts.length );\n\n\t\t\tfor ( var i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parts[ i ];\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseFloats( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tvar parts = text.trim().split( /\\s+/ );\n\t\t\tvar array = new Array( parts.length );\n\n\t\t\tfor ( var i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parseFloat( parts[ i ] );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseInts( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tvar parts = text.trim().split( /\\s+/ );\n\t\t\tvar array = new Array( parts.length );\n\n\t\t\tfor ( var i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parseInt( parts[ i ] );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseId( text ) {\n\n\t\t\treturn text.substring( 1 );\n\n\t\t}\n\n\t\tfunction generateId() {\n\n\t\t\treturn 'three_default_' + ( count ++ );\n\n\t\t}\n\n\t\tfunction isEmpty( object ) {\n\n\t\t\treturn Object.keys( object ).length === 0;\n\n\t\t}\n\n\t\t// asset\n\n\t\tfunction parseAsset( xml ) {\n\n\t\t\treturn {\n\t\t\t\tunit: parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ),\n\t\t\t\tupAxis: parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] )\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseAssetUnit( xml ) {\n\n\t\t\tif ( ( xml !== undefined ) && ( xml.hasAttribute( 'meter' ) === true ) ) {\n\n\t\t\t\treturn parseFloat( xml.getAttribute( 'meter' ) );\n\n\t\t\t} else {\n\n\t\t\t\treturn 1; // default 1 meter\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseAssetUpAxis( xml ) {\n\n\t\t\treturn xml !== undefined ? xml.textContent : 'Y_UP';\n\n\t\t}\n\n\t\t// library\n\n\t\tfunction parseLibrary( xml, libraryName, nodeName, parser ) {\n\n\t\t\tvar library = getElementsByTagName( xml, libraryName )[ 0 ];\n\n\t\t\tif ( library !== undefined ) {\n\n\t\t\t\tvar elements = getElementsByTagName( library, nodeName );\n\n\t\t\t\tfor ( var i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\t\tparser( elements[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildLibrary( data, builder ) {\n\n\t\t\tfor ( var name in data ) {\n\n\t\t\t\tvar object = data[ name ];\n\t\t\t\tobject.build = builder( data[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// get\n\n\t\tfunction getBuild( data, builder ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\tdata.build = builder( data );\n\n\t\t\treturn data.build;\n\n\t\t}\n\n\t\t// animation\n\n\t\tfunction parseAnimation( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tsources: {},\n\t\t\t\tsamplers: {},\n\t\t\t\tchannels: {}\n\t\t\t};\n\n\t\t\tvar hasChildren = false;\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tvar id;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tid = child.getAttribute( 'id' );\n\t\t\t\t\t\tdata.sources[ id ] = parseSource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'sampler':\n\t\t\t\t\t\tid = child.getAttribute( 'id' );\n\t\t\t\t\t\tdata.samplers[ id ] = parseAnimationSampler( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'channel':\n\t\t\t\t\t\tid = child.getAttribute( 'target' );\n\t\t\t\t\t\tdata.channels[ id ] = parseAnimationChannel( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'animation':\n\t\t\t\t\t\t// hierarchy of related animations\n\t\t\t\t\t\tparseAnimation( child );\n\t\t\t\t\t\thasChildren = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasChildren === false ) {\n\n\t\t\t\t// since 'id' attributes can be optional, it's necessary to generate a UUID for unqiue assignment\n\n\t\t\t\tlibrary.animations[ xml.getAttribute( 'id' ) || MathUtils.generateUUID() ] = data;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseAnimationSampler( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tinputs: {},\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tvar id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tvar semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tdata.inputs[ semantic ] = id;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseAnimationChannel( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tvar target = xml.getAttribute( 'target' );\n\n\t\t\t// parsing SID Addressing Syntax\n\n\t\t\tvar parts = target.split( '/' );\n\n\t\t\tvar id = parts.shift();\n\t\t\tvar sid = parts.shift();\n\n\t\t\t// check selection syntax\n\n\t\t\tvar arraySyntax = ( sid.indexOf( '(' ) !== - 1 );\n\t\t\tvar memberSyntax = ( sid.indexOf( '.' ) !== - 1 );\n\n\t\t\tif ( memberSyntax ) {\n\n\t\t\t\t// member selection access\n\n\t\t\t\tparts = sid.split( '.' );\n\t\t\t\tsid = parts.shift();\n\t\t\t\tdata.member = parts.shift();\n\n\t\t\t} else if ( arraySyntax ) {\n\n\t\t\t\t// array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices.\n\n\t\t\t\tvar indices = sid.split( '(' );\n\t\t\t\tsid = indices.shift();\n\n\t\t\t\tfor ( var i = 0; i < indices.length; i ++ ) {\n\n\t\t\t\t\tindices[ i ] = parseInt( indices[ i ].replace( /\\)/, '' ) );\n\n\t\t\t\t}\n\n\t\t\t\tdata.indices = indices;\n\n\t\t\t}\n\n\t\t\tdata.id = id;\n\t\t\tdata.sid = sid;\n\n\t\t\tdata.arraySyntax = arraySyntax;\n\t\t\tdata.memberSyntax = memberSyntax;\n\n\t\t\tdata.sampler = parseId( xml.getAttribute( 'source' ) );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildAnimation( data ) {\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar channels = data.channels;\n\t\t\tvar samplers = data.samplers;\n\t\t\tvar sources = data.sources;\n\n\t\t\tfor ( var target in channels ) {\n\n\t\t\t\tif ( channels.hasOwnProperty( target ) ) {\n\n\t\t\t\t\tvar channel = channels[ target ];\n\t\t\t\t\tvar sampler = samplers[ channel.sampler ];\n\n\t\t\t\t\tvar inputId = sampler.inputs.INPUT;\n\t\t\t\t\tvar outputId = sampler.inputs.OUTPUT;\n\n\t\t\t\t\tvar inputSource = sources[ inputId ];\n\t\t\t\t\tvar outputSource = sources[ outputId ];\n\n\t\t\t\t\tvar animation = buildAnimationChannel( channel, inputSource, outputSource );\n\n\t\t\t\t\tcreateKeyframeTracks( animation, tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn tracks;\n\n\t\t}\n\n\t\tfunction getAnimation( id ) {\n\n\t\t\treturn getBuild( library.animations[ id ], buildAnimation );\n\n\t\t}\n\n\t\tfunction buildAnimationChannel( channel, inputSource, outputSource ) {\n\n\t\t\tvar node = library.nodes[ channel.id ];\n\t\t\tvar object3D = getNode( node.id );\n\n\t\t\tvar transform = node.transforms[ channel.sid ];\n\t\t\tvar defaultMatrix = node.matrix.clone().transpose();\n\n\t\t\tvar time, stride;\n\t\t\tvar i, il, j, jl;\n\n\t\t\tvar data = {};\n\n\t\t\t// the collada spec allows the animation of data in various ways.\n\t\t\t// depending on the transform type (matrix, translate, rotate, scale), we execute different logic\n\n\t\t\tswitch ( transform ) {\n\n\t\t\t\tcase 'matrix':\n\n\t\t\t\t\tfor ( i = 0, il = inputSource.array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\ttime = inputSource.array[ i ];\n\t\t\t\t\t\tstride = i * outputSource.stride;\n\n\t\t\t\t\t\tif ( data[ time ] === undefined ) data[ time ] = {};\n\n\t\t\t\t\t\tif ( channel.arraySyntax === true ) {\n\n\t\t\t\t\t\t\tvar value = outputSource.array[ stride ];\n\t\t\t\t\t\t\tvar index = channel.indices[ 0 ] + 4 * channel.indices[ 1 ];\n\n\t\t\t\t\t\t\tdata[ time ][ index ] = value;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( j = 0, jl = outputSource.stride; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tdata[ time ][ j ] = outputSource.array[ stride + j ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'translate':\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Animation transform type \"%s\" not yet implemented.', transform );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rotate':\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Animation transform type \"%s\" not yet implemented.', transform );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'scale':\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Animation transform type \"%s\" not yet implemented.', transform );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tvar keyframes = prepareAnimationData( data, defaultMatrix );\n\n\t\t\tvar animation = {\n\t\t\t\tname: object3D.uuid,\n\t\t\t\tkeyframes: keyframes\n\t\t\t};\n\n\t\t\treturn animation;\n\n\t\t}\n\n\t\tfunction prepareAnimationData( data, defaultMatrix ) {\n\n\t\t\tvar keyframes = [];\n\n\t\t\t// transfer data into a sortable array\n\n\t\t\tfor ( var time in data ) {\n\n\t\t\t\tkeyframes.push( { time: parseFloat( time ), value: data[ time ] } );\n\n\t\t\t}\n\n\t\t\t// ensure keyframes are sorted by time\n\n\t\t\tkeyframes.sort( ascending );\n\n\t\t\t// now we clean up all animation data, so we can use them for keyframe tracks\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\ttransformAnimationData( keyframes, i, defaultMatrix.elements[ i ] );\n\n\t\t\t}\n\n\t\t\treturn keyframes;\n\n\t\t\t// array sort function\n\n\t\t\tfunction ascending( a, b ) {\n\n\t\t\t\treturn a.time - b.time;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar position = new Vector3();\n\t\tvar scale = new Vector3();\n\t\tvar quaternion = new Quaternion();\n\n\t\tfunction createKeyframeTracks( animation, tracks ) {\n\n\t\t\tvar keyframes = animation.keyframes;\n\t\t\tvar name = animation.name;\n\n\t\t\tvar times = [];\n\t\t\tvar positionData = [];\n\t\t\tvar quaternionData = [];\n\t\t\tvar scaleData = [];\n\n\t\t\tfor ( var i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\tvar keyframe = keyframes[ i ];\n\n\t\t\t\tvar time = keyframe.time;\n\t\t\t\tvar value = keyframe.value;\n\n\t\t\t\tmatrix.fromArray( value ).transpose();\n\t\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\t\ttimes.push( time );\n\t\t\t\tpositionData.push( position.x, position.y, position.z );\n\t\t\t\tquaternionData.push( quaternion.x, quaternion.y, quaternion.z, quaternion.w );\n\t\t\t\tscaleData.push( scale.x, scale.y, scale.z );\n\n\t\t\t}\n\n\t\t\tif ( positionData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.position', times, positionData ) );\n\t\t\tif ( quaternionData.length > 0 ) tracks.push( new QuaternionKeyframeTrack( name + '.quaternion', times, quaternionData ) );\n\t\t\tif ( scaleData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.scale', times, scaleData ) );\n\n\t\t\treturn tracks;\n\n\t\t}\n\n\t\tfunction transformAnimationData( keyframes, property, defaultValue ) {\n\n\t\t\tvar keyframe;\n\n\t\t\tvar empty = true;\n\t\t\tvar i, l;\n\n\t\t\t// check, if values of a property are missing in our keyframes\n\n\t\t\tfor ( i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\tkeyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] === undefined ) {\n\n\t\t\t\t\tkeyframe.value[ property ] = null; // mark as missing\n\n\t\t\t\t} else {\n\n\t\t\t\t\tempty = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( empty === true ) {\n\n\t\t\t\t// no values at all, so we set a default value\n\n\t\t\t\tfor ( i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\t\tkeyframe = keyframes[ i ];\n\n\t\t\t\t\tkeyframe.value[ property ] = defaultValue;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// filling gaps\n\n\t\t\t\tcreateMissingKeyframes( keyframes, property );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createMissingKeyframes( keyframes, property ) {\n\n\t\t\tvar prev, next;\n\n\t\t\tfor ( var i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\tvar keyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] === null ) {\n\n\t\t\t\t\tprev = getPrev( keyframes, i, property );\n\t\t\t\t\tnext = getNext( keyframes, i, property );\n\n\t\t\t\t\tif ( prev === null ) {\n\n\t\t\t\t\t\tkeyframe.value[ property ] = next.value[ property ];\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( next === null ) {\n\n\t\t\t\t\t\tkeyframe.value[ property ] = prev.value[ property ];\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinterpolate( keyframe, prev, next, property );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getPrev( keyframes, i, property ) {\n\n\t\t\twhile ( i >= 0 ) {\n\n\t\t\t\tvar keyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] !== null ) return keyframe;\n\n\t\t\t\ti --;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfunction getNext( keyframes, i, property ) {\n\n\t\t\twhile ( i < keyframes.length ) {\n\n\t\t\t\tvar keyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] !== null ) return keyframe;\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfunction interpolate( key, prev, next, property ) {\n\n\t\t\tif ( ( next.time - prev.time ) === 0 ) {\n\n\t\t\t\tkey.value[ property ] = prev.value[ property ];\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tkey.value[ property ] = ( ( key.time - prev.time ) * ( next.value[ property ] - prev.value[ property ] ) / ( next.time - prev.time ) ) + prev.value[ property ];\n\n\t\t}\n\n\t\t// animation clips\n\n\t\tfunction parseAnimationClip( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'id' ) || 'default',\n\t\t\t\tstart: parseFloat( xml.getAttribute( 'start' ) || 0 ),\n\t\t\t\tend: parseFloat( xml.getAttribute( 'end' ) || 0 ),\n\t\t\t\tanimations: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'instance_animation':\n\t\t\t\t\t\tdata.animations.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.clips[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildAnimationClip( data ) {\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar name = data.name;\n\t\t\tvar duration = ( data.end - data.start ) || - 1;\n\t\t\tvar animations = data.animations;\n\n\t\t\tfor ( var i = 0, il = animations.length; i < il; i ++ ) {\n\n\t\t\t\tvar animationTracks = getAnimation( animations[ i ] );\n\n\t\t\t\tfor ( var j = 0, jl = animationTracks.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttracks.push( animationTracks[ j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, duration, tracks );\n\n\t\t}\n\n\t\tfunction getAnimationClip( id ) {\n\n\t\t\treturn getBuild( library.clips[ id ], buildAnimationClip );\n\n\t\t}\n\n\t\t// controller\n\n\t\tfunction parseController( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'skin':\n\t\t\t\t\t\t// there is exactly one skin per controller\n\t\t\t\t\t\tdata.id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tdata.skin = parseSkin( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'morph':\n\t\t\t\t\t\tdata.id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Morph target animation not supported yet.' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.controllers[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseSkin( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tsources: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'bind_shape_matrix':\n\t\t\t\t\t\tdata.bindShapeMatrix = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tvar id = child.getAttribute( 'id' );\n\t\t\t\t\t\tdata.sources[ id ] = parseSource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'joints':\n\t\t\t\t\t\tdata.joints = parseJoints( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vertex_weights':\n\t\t\t\t\t\tdata.vertexWeights = parseVertexWeights( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseJoints( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tinputs: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tvar semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tvar id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tdata.inputs[ semantic ] = id;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseVertexWeights( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tinputs: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tvar semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tvar id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tvar offset = parseInt( child.getAttribute( 'offset' ) );\n\t\t\t\t\t\tdata.inputs[ semantic ] = { id: id, offset: offset };\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vcount':\n\t\t\t\t\t\tdata.vcount = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tdata.v = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildController( data ) {\n\n\t\t\tvar build = {\n\t\t\t\tid: data.id\n\t\t\t};\n\n\t\t\tvar geometry = library.geometries[ build.id ];\n\n\t\t\tif ( data.skin !== undefined ) {\n\n\t\t\t\tbuild.skin = buildSkin( data.skin );\n\n\t\t\t\t// we enhance the 'sources' property of the corresponding geometry with our skin data\n\n\t\t\t\tgeometry.sources.skinIndices = build.skin.indices;\n\t\t\t\tgeometry.sources.skinWeights = build.skin.weights;\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildSkin( data ) {\n\n\t\t\tvar BONE_LIMIT = 4;\n\n\t\t\tvar build = {\n\t\t\t\tjoints: [], // this must be an array to preserve the joint order\n\t\t\t\tindices: {\n\t\t\t\t\tarray: [],\n\t\t\t\t\tstride: BONE_LIMIT\n\t\t\t\t},\n\t\t\t\tweights: {\n\t\t\t\t\tarray: [],\n\t\t\t\t\tstride: BONE_LIMIT\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar sources = data.sources;\n\t\t\tvar vertexWeights = data.vertexWeights;\n\n\t\t\tvar vcount = vertexWeights.vcount;\n\t\t\tvar v = vertexWeights.v;\n\t\t\tvar jointOffset = vertexWeights.inputs.JOINT.offset;\n\t\t\tvar weightOffset = vertexWeights.inputs.WEIGHT.offset;\n\n\t\t\tvar jointSource = data.sources[ data.joints.inputs.JOINT ];\n\t\t\tvar inverseSource = data.sources[ data.joints.inputs.INV_BIND_MATRIX ];\n\n\t\t\tvar weights = sources[ vertexWeights.inputs.WEIGHT.id ].array;\n\t\t\tvar stride = 0;\n\n\t\t\tvar i, j, l;\n\n\t\t\t// procces skin data for each vertex\n\n\t\t\tfor ( i = 0, l = vcount.length; i < l; i ++ ) {\n\n\t\t\t\tvar jointCount = vcount[ i ]; // this is the amount of joints that affect a single vertex\n\t\t\t\tvar vertexSkinData = [];\n\n\t\t\t\tfor ( j = 0; j < jointCount; j ++ ) {\n\n\t\t\t\t\tvar skinIndex = v[ stride + jointOffset ];\n\t\t\t\t\tvar weightId = v[ stride + weightOffset ];\n\t\t\t\t\tvar skinWeight = weights[ weightId ];\n\n\t\t\t\t\tvertexSkinData.push( { index: skinIndex, weight: skinWeight } );\n\n\t\t\t\t\tstride += 2;\n\n\t\t\t\t}\n\n\t\t\t\t// we sort the joints in descending order based on the weights.\n\t\t\t\t// this ensures, we only procced the most important joints of the vertex\n\n\t\t\t\tvertexSkinData.sort( descending );\n\n\t\t\t\t// now we provide for each vertex a set of four index and weight values.\n\t\t\t\t// the order of the skin data matches the order of vertices\n\n\t\t\t\tfor ( j = 0; j < BONE_LIMIT; j ++ ) {\n\n\t\t\t\t\tvar d = vertexSkinData[ j ];\n\n\t\t\t\t\tif ( d !== undefined ) {\n\n\t\t\t\t\t\tbuild.indices.array.push( d.index );\n\t\t\t\t\t\tbuild.weights.array.push( d.weight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbuild.indices.array.push( 0 );\n\t\t\t\t\t\tbuild.weights.array.push( 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// setup bind matrix\n\n\t\t\tif ( data.bindShapeMatrix ) {\n\n\t\t\t\tbuild.bindMatrix = new Matrix4().fromArray( data.bindShapeMatrix ).transpose();\n\n\t\t\t} else {\n\n\t\t\t\tbuild.bindMatrix = new Matrix4().identity();\n\n\t\t\t}\n\n\t\t\t// process bones and inverse bind matrix data\n\n\t\t\tfor ( i = 0, l = jointSource.array.length; i < l; i ++ ) {\n\n\t\t\t\tvar name = jointSource.array[ i ];\n\t\t\t\tvar boneInverse = new Matrix4().fromArray( inverseSource.array, i * inverseSource.stride ).transpose();\n\n\t\t\t\tbuild.joints.push( { name: name, boneInverse: boneInverse } );\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t\t// array sort function\n\n\t\t\tfunction descending( a, b ) {\n\n\t\t\t\treturn b.weight - a.weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getController( id ) {\n\n\t\t\treturn getBuild( library.controllers[ id ], buildController );\n\n\t\t}\n\n\t\t// image\n\n\t\tfunction parseImage( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tinit_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent\n\t\t\t};\n\n\t\t\tlibrary.images[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildImage( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\treturn data.init_from;\n\n\t\t}\n\n\t\tfunction getImage( id ) {\n\n\t\t\tvar data = library.images[ id ];\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\treturn getBuild( data, buildImage );\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t find image with ID:', id );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// effect\n\n\t\tfunction parseEffect( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'profile_COMMON':\n\t\t\t\t\t\tdata.profile = parseEffectProfileCOMMON( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.effects[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseEffectProfileCOMMON( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tsurfaces: {},\n\t\t\t\tsamplers: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'newparam':\n\t\t\t\t\t\tparseEffectNewparam( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tdata.technique = parseEffectTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tdata.extra = parseEffectExtra( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectNewparam( xml, data ) {\n\n\t\t\tvar sid = xml.getAttribute( 'sid' );\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'surface':\n\t\t\t\t\t\tdata.surfaces[ sid ] = parseEffectSurface( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'sampler2D':\n\t\t\t\t\t\tdata.samplers[ sid ] = parseEffectSampler( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectSurface( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'init_from':\n\t\t\t\t\t\tdata.init_from = child.textContent;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectSampler( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tdata.source = child.textContent;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'constant':\n\t\t\t\t\tcase 'lambert':\n\t\t\t\t\tcase 'blinn':\n\t\t\t\t\tcase 'phong':\n\t\t\t\t\t\tdata.type = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseEffectParameters( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameters( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'emission':\n\t\t\t\t\tcase 'diffuse':\n\t\t\t\t\tcase 'specular':\n\t\t\t\t\tcase 'bump':\n\t\t\t\t\tcase 'ambient':\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseEffectParameter( child );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tdata[ child.nodeName ] = {\n\t\t\t\t\t\t\topaque: child.getAttribute( 'opaque' ),\n\t\t\t\t\t\t\tdata: parseEffectParameter( child )\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameter( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'float':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdata[ child.nodeName ] = { id: child.getAttribute( 'texture' ), extra: parseEffectParameterTexture( child ) };\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTexture( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\ttechnique: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tparseEffectParameterTextureExtra( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTextureExtra( xml, data ) {\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tparseEffectParameterTextureExtraTechnique( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectParameterTextureExtraTechnique( xml, data ) {\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'repeatU':\n\t\t\t\t\tcase 'repeatV':\n\t\t\t\t\tcase 'offsetU':\n\t\t\t\t\tcase 'offsetV':\n\t\t\t\t\t\tdata.technique[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'wrapU':\n\t\t\t\t\tcase 'wrapV':\n\n\t\t\t\t\t\t// some files have values for wrapU/wrapV which become NaN via parseInt\n\n\t\t\t\t\t\tif ( child.textContent.toUpperCase() === 'TRUE' ) {\n\n\t\t\t\t\t\t\tdata.technique[ child.nodeName ] = 1;\n\n\t\t\t\t\t\t} else if ( child.textContent.toUpperCase() === 'FALSE' ) {\n\n\t\t\t\t\t\t\tdata.technique[ child.nodeName ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdata.technique[ child.nodeName ] = parseInt( child.textContent );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectExtra( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tdata.technique = parseEffectExtraTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectExtraTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'double_sided':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseInt( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildEffect( data ) {\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getEffect( id ) {\n\n\t\t\treturn getBuild( library.effects[ id ], buildEffect );\n\n\t\t}\n\n\t\t// material\n\n\t\tfunction parseMaterial( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' )\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'instance_effect':\n\t\t\t\t\t\tdata.url = parseId( child.getAttribute( 'url' ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.materials[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction getTextureLoader( image ) {\n\n\t\t\tvar loader;\n\n\t\t\tvar extension = image.slice( ( image.lastIndexOf( '.' ) - 1 >>> 0 ) + 2 ); // http://www.jstips.co/en/javascript/get-file-extension/\n\t\t\textension = extension.toLowerCase();\n\n\t\t\tswitch ( extension ) {\n\n\t\t\t\tcase 'tga':\n\t\t\t\t\tloader = tgaLoader;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tloader = textureLoader;\n\n\t\t\t}\n\n\t\t\treturn loader;\n\n\t\t}\n\n\t\tfunction buildMaterial( data ) {\n\n\t\t\tvar effect = getEffect( data.url );\n\t\t\tvar technique = effect.profile.technique;\n\t\t\tvar extra = effect.profile.extra;\n\n\t\t\tvar material;\n\n\t\t\tswitch ( technique.type ) {\n\n\t\t\t\tcase 'phong':\n\t\t\t\tcase 'blinn':\n\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'lambert':\n\t\t\t\t\tmaterial = new MeshLambertMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tmaterial = new MeshBasicMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tmaterial.name = data.name || '';\n\n\t\t\tfunction getTexture( textureObject ) {\n\n\t\t\t\tvar sampler = effect.profile.samplers[ textureObject.id ];\n\t\t\t\tvar image = null;\n\n\t\t\t\t// get image\n\n\t\t\t\tif ( sampler !== undefined ) {\n\n\t\t\t\t\tvar surface = effect.profile.surfaces[ sampler.source ];\n\t\t\t\t\timage = getImage( surface.init_from );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).' );\n\t\t\t\t\timage = getImage( textureObject.id );\n\n\t\t\t\t}\n\n\t\t\t\t// create texture if image is avaiable\n\n\t\t\t\tif ( image !== null ) {\n\n\t\t\t\t\tvar loader = getTextureLoader( image );\n\n\t\t\t\t\tif ( loader !== undefined ) {\n\n\t\t\t\t\t\tvar texture = loader.load( image );\n\n\t\t\t\t\t\tvar extra = textureObject.extra;\n\n\t\t\t\t\t\tif ( extra !== undefined && extra.technique !== undefined && isEmpty( extra.technique ) === false ) {\n\n\t\t\t\t\t\t\tvar technique = extra.technique;\n\n\t\t\t\t\t\t\ttexture.wrapS = technique.wrapU ? RepeatWrapping : ClampToEdgeWrapping;\n\t\t\t\t\t\t\ttexture.wrapT = technique.wrapV ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\t\t\t\t\t\ttexture.offset.set( technique.offsetU || 0, technique.offsetV || 0 );\n\t\t\t\t\t\t\ttexture.repeat.set( technique.repeatU || 1, technique.repeatV || 1 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttexture.wrapS = RepeatWrapping;\n\t\t\t\t\t\t\ttexture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Loader for texture %s not found.', image );\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t create texture with ID:', textureObject.id );\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar parameters = technique.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tvar parameter = parameters[ key ];\n\n\t\t\t\tswitch ( key ) {\n\n\t\t\t\t\tcase 'diffuse':\n\t\t\t\t\t\tif ( parameter.color ) material.color.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.map = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specular':\n\t\t\t\t\t\tif ( parameter.color && material.specular ) material.specular.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.specularMap = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bump':\n\t\t\t\t\t\tif ( parameter.texture ) material.normalMap = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ambient':\n\t\t\t\t\t\tif ( parameter.texture ) material.lightMap = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\t\tif ( parameter.float && material.shininess ) material.shininess = parameter.float;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'emission':\n\t\t\t\t\t\tif ( parameter.color && material.emissive ) material.emissive.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar transparent = parameters[ 'transparent' ];\n\t\t\tvar transparency = parameters[ 'transparency' ];\n\n\t\t\t// does not exist but \n\n\t\t\tif ( transparency === undefined && transparent ) {\n\n\t\t\t\ttransparency = {\n\t\t\t\t\tfloat: 1\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// does not exist but \n\n\t\t\tif ( transparent === undefined && transparency ) {\n\n\t\t\t\ttransparent = {\n\t\t\t\t\topaque: 'A_ONE',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tcolor: [ 1, 1, 1, 1 ]\n\t\t\t\t\t} };\n\n\t\t\t}\n\n\t\t\tif ( transparent && transparency ) {\n\n\t\t\t\t// handle case if a texture exists but no color\n\n\t\t\t\tif ( transparent.data.texture ) {\n\n\t\t\t\t\t// we do not set an alpha map (see #13792)\n\n\t\t\t\t\tmaterial.transparent = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = transparent.data.color;\n\n\t\t\t\t\tswitch ( transparent.opaque ) {\n\n\t\t\t\t\t\tcase 'A_ONE':\n\t\t\t\t\t\t\tmaterial.opacity = color[ 3 ] * transparency.float;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'RGB_ZERO':\n\t\t\t\t\t\t\tmaterial.opacity = 1 - ( color[ 0 ] * transparency.float );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'A_ZERO':\n\t\t\t\t\t\t\tmaterial.opacity = 1 - ( color[ 3 ] * transparency.float );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'RGB_ONE':\n\t\t\t\t\t\t\tmaterial.opacity = color[ 0 ] * transparency.float;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Invalid opaque type \"%s\" of transparent tag.', transparent.opaque );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( material.opacity < 1 ) material.transparent = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( extra !== undefined && extra.technique !== undefined && extra.technique.double_sided === 1 ) {\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tfunction getMaterial( id ) {\n\n\t\t\treturn getBuild( library.materials[ id ], buildMaterial );\n\n\t\t}\n\n\t\t// camera\n\n\t\tfunction parseCamera( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' )\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'optics':\n\t\t\t\t\t\tdata.optics = parseCameraOptics( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.cameras[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseCameraOptics( xml ) {\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\treturn parseCameraTechnique( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {};\n\n\t\t}\n\n\t\tfunction parseCameraTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'perspective':\n\t\t\t\t\tcase 'orthographic':\n\n\t\t\t\t\t\tdata.technique = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseCameraParameters( child );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseCameraParameters( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'xfov':\n\t\t\t\t\tcase 'yfov':\n\t\t\t\t\tcase 'xmag':\n\t\t\t\t\tcase 'ymag':\n\t\t\t\t\tcase 'znear':\n\t\t\t\t\tcase 'zfar':\n\t\t\t\t\tcase 'aspect_ratio':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildCamera( data ) {\n\n\t\t\tvar camera;\n\n\t\t\tswitch ( data.optics.technique ) {\n\n\t\t\t\tcase 'perspective':\n\t\t\t\t\tcamera = new PerspectiveCamera(\n\t\t\t\t\t\tdata.optics.parameters.yfov,\n\t\t\t\t\t\tdata.optics.parameters.aspect_ratio,\n\t\t\t\t\t\tdata.optics.parameters.znear,\n\t\t\t\t\t\tdata.optics.parameters.zfar\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'orthographic':\n\t\t\t\t\tvar ymag = data.optics.parameters.ymag;\n\t\t\t\t\tvar xmag = data.optics.parameters.xmag;\n\t\t\t\t\tvar aspectRatio = data.optics.parameters.aspect_ratio;\n\n\t\t\t\t\txmag = ( xmag === undefined ) ? ( ymag * aspectRatio ) : xmag;\n\t\t\t\t\tymag = ( ymag === undefined ) ? ( xmag / aspectRatio ) : ymag;\n\n\t\t\t\t\txmag *= 0.5;\n\t\t\t\t\tymag *= 0.5;\n\n\t\t\t\t\tcamera = new OrthographicCamera(\n\t\t\t\t\t\t- xmag, xmag, ymag, - ymag, // left, right, top, bottom\n\t\t\t\t\t\tdata.optics.parameters.znear,\n\t\t\t\t\t\tdata.optics.parameters.zfar\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcamera.name = data.name || '';\n\n\t\t\treturn camera;\n\n\t\t}\n\n\t\tfunction getCamera( id ) {\n\n\t\t\tvar data = library.cameras[ id ];\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\treturn getBuild( data, buildCamera );\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t find camera with ID:', id );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// light\n\n\t\tfunction parseLight( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tdata = parseLightTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.lights[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseLightTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'directional':\n\t\t\t\t\tcase 'point':\n\t\t\t\t\tcase 'spot':\n\t\t\t\t\tcase 'ambient':\n\n\t\t\t\t\t\tdata.technique = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseLightParameters( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseLightParameters( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.color = new Color().fromArray( array );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'falloff_angle':\n\t\t\t\t\t\tdata.falloffAngle = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'quadratic_attenuation':\n\t\t\t\t\t\tvar f = parseFloat( child.textContent );\n\t\t\t\t\t\tdata.distance = f ? Math.sqrt( 1 / f ) : 0;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildLight( data ) {\n\n\t\t\tvar light;\n\n\t\t\tswitch ( data.technique ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\t\tlight = new DirectionalLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'point':\n\t\t\t\t\tlight = new PointLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'spot':\n\t\t\t\t\tlight = new SpotLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ambient':\n\t\t\t\t\tlight = new AmbientLight();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( data.parameters.color ) light.color.copy( data.parameters.color );\n\t\t\tif ( data.parameters.distance ) light.distance = data.parameters.distance;\n\n\t\t\treturn light;\n\n\t\t}\n\n\t\tfunction getLight( id ) {\n\n\t\t\tvar data = library.lights[ id ];\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\treturn getBuild( data, buildLight );\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t find light with ID:', id );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// geometry\n\n\t\tfunction parseGeometry( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tsources: {},\n\t\t\t\tvertices: {},\n\t\t\t\tprimitives: []\n\t\t\t};\n\n\t\t\tvar mesh = getElementsByTagName( xml, 'mesh' )[ 0 ];\n\n\t\t\t// the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep\n\t\t\tif ( mesh === undefined ) return;\n\n\t\t\tfor ( var i = 0; i < mesh.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = mesh.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tvar id = child.getAttribute( 'id' );\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tdata.sources[ id ] = parseSource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vertices':\n\t\t\t\t\t\t// data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];\n\t\t\t\t\t\tdata.vertices = parseGeometryVertices( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'polygons':\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\tcase 'polylist':\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\t\tdata.primitives.push( parseGeometryPrimitive( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.geometries[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseSource( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tarray: [],\n\t\t\t\tstride: 3\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'float_array':\n\t\t\t\t\t\tdata.array = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Name_array':\n\t\t\t\t\t\tdata.array = parseStrings( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tvar accessor = getElementsByTagName( child, 'accessor' )[ 0 ];\n\n\t\t\t\t\t\tif ( accessor !== undefined ) {\n\n\t\t\t\t\t\t\tdata.stride = parseInt( accessor.getAttribute( 'stride' ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseGeometryVertices( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tdata[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseGeometryPrimitive( xml ) {\n\n\t\t\tvar primitive = {\n\t\t\t\ttype: xml.nodeName,\n\t\t\t\tmaterial: xml.getAttribute( 'material' ),\n\t\t\t\tcount: parseInt( xml.getAttribute( 'count' ) ),\n\t\t\t\tinputs: {},\n\t\t\t\tstride: 0,\n\t\t\t\thasUV: false\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tvar id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tvar semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tvar offset = parseInt( child.getAttribute( 'offset' ) );\n\t\t\t\t\t\tvar set = parseInt( child.getAttribute( 'set' ) );\n\t\t\t\t\t\tvar inputname = ( set > 0 ? semantic + set : semantic );\n\t\t\t\t\t\tprimitive.inputs[ inputname ] = { id: id, offset: offset };\n\t\t\t\t\t\tprimitive.stride = Math.max( primitive.stride, offset + 1 );\n\t\t\t\t\t\tif ( semantic === 'TEXCOORD' ) primitive.hasUV = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vcount':\n\t\t\t\t\t\tprimitive.vcount = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'p':\n\t\t\t\t\t\tprimitive.p = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn primitive;\n\n\t\t}\n\n\t\tfunction groupPrimitives( primitives ) {\n\n\t\t\tvar build = {};\n\n\t\t\tfor ( var i = 0; i < primitives.length; i ++ ) {\n\n\t\t\t\tvar primitive = primitives[ i ];\n\n\t\t\t\tif ( build[ primitive.type ] === undefined ) build[ primitive.type ] = [];\n\n\t\t\t\tbuild[ primitive.type ].push( primitive );\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction checkUVCoordinates( primitives ) {\n\n\t\t\tvar count = 0;\n\n\t\t\tfor ( var i = 0, l = primitives.length; i < l; i ++ ) {\n\n\t\t\t\tvar primitive = primitives[ i ];\n\n\t\t\t\tif ( primitive.hasUV === true ) {\n\n\t\t\t\t\tcount ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( count > 0 && count < primitives.length ) {\n\n\t\t\t\tprimitives.uvsNeedsFix = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildGeometry( data ) {\n\n\t\t\tvar build = {};\n\n\t\t\tvar sources = data.sources;\n\t\t\tvar vertices = data.vertices;\n\t\t\tvar primitives = data.primitives;\n\n\t\t\tif ( primitives.length === 0 ) return {};\n\n\t\t\t// our goal is to create one buffer geometry for a single type of primitives\n\t\t\t// first, we group all primitives by their type\n\n\t\t\tvar groupedPrimitives = groupPrimitives( primitives );\n\n\t\t\tfor ( var type in groupedPrimitives ) {\n\n\t\t\t\tvar primitiveType = groupedPrimitives[ type ];\n\n\t\t\t\t// second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines)\n\n\t\t\t\tcheckUVCoordinates( primitiveType );\n\n\t\t\t\t// third, create a buffer geometry for each type of primitives\n\n\t\t\t\tbuild[ type ] = buildGeometryType( primitiveType, sources, vertices );\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildGeometryType( primitives, sources, vertices ) {\n\n\t\t\tvar build = {};\n\n\t\t\tvar position = { array: [], stride: 0 };\n\t\t\tvar normal = { array: [], stride: 0 };\n\t\t\tvar uv = { array: [], stride: 0 };\n\t\t\tvar uv2 = { array: [], stride: 0 };\n\t\t\tvar color = { array: [], stride: 0 };\n\n\t\t\tvar skinIndex = { array: [], stride: 4 };\n\t\t\tvar skinWeight = { array: [], stride: 4 };\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar materialKeys = [];\n\n\t\t\tvar start = 0;\n\n\t\t\tfor ( var p = 0; p < primitives.length; p ++ ) {\n\n\t\t\t\tvar primitive = primitives[ p ];\n\t\t\t\tvar inputs = primitive.inputs;\n\n\t\t\t\t// groups\n\n\t\t\t\tvar count = 0;\n\n\t\t\t\tswitch ( primitive.type ) {\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\t\tcount = primitive.count * 2;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\t\tcount = primitive.count * 3;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'polylist':\n\n\t\t\t\t\t\tfor ( var g = 0; g < primitive.count; g ++ ) {\n\n\t\t\t\t\t\t\tvar vc = primitive.vcount[ g ];\n\n\t\t\t\t\t\t\tswitch ( vc ) {\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\tcount += 3; // single triangle\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\tcount += 6; // quad, subdivided into two triangles\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tcount += ( vc - 2 ) * 3; // polylist with more than four vertices\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Unknow primitive type:', primitive.type );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addGroup( start, count, p );\n\t\t\t\tstart += count;\n\n\t\t\t\t// material\n\n\t\t\t\tif ( primitive.material ) {\n\n\t\t\t\t\tmaterialKeys.push( primitive.material );\n\n\t\t\t\t}\n\n\t\t\t\t// geometry data\n\n\t\t\t\tfor ( var name in inputs ) {\n\n\t\t\t\t\tvar input = inputs[ name ];\n\n\t\t\t\t\tswitch ( name )\t{\n\n\t\t\t\t\t\tcase 'VERTEX':\n\t\t\t\t\t\t\tfor ( var key in vertices ) {\n\n\t\t\t\t\t\t\t\tvar id = vertices[ key ];\n\n\t\t\t\t\t\t\t\tswitch ( key ) {\n\n\t\t\t\t\t\t\t\t\tcase 'POSITION':\n\t\t\t\t\t\t\t\t\t\tvar prevLength = position.array.length;\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, position.array );\n\t\t\t\t\t\t\t\t\t\tposition.stride = sources[ id ].stride;\n\n\t\t\t\t\t\t\t\t\t\tif ( sources.skinWeights && sources.skinIndices ) {\n\n\t\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources.skinIndices, input.offset, skinIndex.array );\n\t\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources.skinWeights, input.offset, skinWeight.array );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// see #3803\n\n\t\t\t\t\t\t\t\t\t\tif ( primitive.hasUV === false && primitives.uvsNeedsFix === true ) {\n\n\t\t\t\t\t\t\t\t\t\t\tvar count = ( position.array.length - prevLength ) / position.stride;\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// fill missing uv coordinates\n\n\t\t\t\t\t\t\t\t\t\t\t\tuv.array.push( 0, 0 );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'NORMAL':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, normal.array );\n\t\t\t\t\t\t\t\t\t\tnormal.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'COLOR':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, color.array );\n\t\t\t\t\t\t\t\t\t\tcolor.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'TEXCOORD':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, uv.array );\n\t\t\t\t\t\t\t\t\t\tuv.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'TEXCOORD1':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, uv2.array );\n\t\t\t\t\t\t\t\t\t\tuv.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Semantic \"%s\" not handled in geometry build process.', key );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'NORMAL':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, normal.array );\n\t\t\t\t\t\t\tnormal.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'COLOR':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, color.array );\n\t\t\t\t\t\t\tcolor.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TEXCOORD':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, uv.array );\n\t\t\t\t\t\t\tuv.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TEXCOORD1':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, uv2.array );\n\t\t\t\t\t\t\tuv2.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tif ( position.array.length > 0 ) geometry.setAttribute( 'position', new Float32BufferAttribute( position.array, position.stride ) );\n\t\t\tif ( normal.array.length > 0 ) geometry.setAttribute( 'normal', new Float32BufferAttribute( normal.array, normal.stride ) );\n\t\t\tif ( color.array.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( color.array, color.stride ) );\n\t\t\tif ( uv.array.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( uv.array, uv.stride ) );\n\t\t\tif ( uv2.array.length > 0 ) geometry.setAttribute( 'uv2', new Float32BufferAttribute( uv2.array, uv2.stride ) );\n\n\t\t\tif ( skinIndex.array.length > 0 ) geometry.setAttribute( 'skinIndex', new Float32BufferAttribute( skinIndex.array, skinIndex.stride ) );\n\t\t\tif ( skinWeight.array.length > 0 ) geometry.setAttribute( 'skinWeight', new Float32BufferAttribute( skinWeight.array, skinWeight.stride ) );\n\n\t\t\tbuild.data = geometry;\n\t\t\tbuild.type = primitives[ 0 ].type;\n\t\t\tbuild.materialKeys = materialKeys;\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildGeometryData( primitive, source, offset, array ) {\n\n\t\t\tvar indices = primitive.p;\n\t\t\tvar stride = primitive.stride;\n\t\t\tvar vcount = primitive.vcount;\n\n\t\t\tfunction pushVector( i ) {\n\n\t\t\t\tvar index = indices[ i + offset ] * sourceStride;\n\t\t\t\tvar length = index + sourceStride;\n\n\t\t\t\tfor ( ; index < length; index ++ ) {\n\n\t\t\t\t\tarray.push( sourceArray[ index ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar sourceArray = source.array;\n\t\t\tvar sourceStride = source.stride;\n\n\t\t\tif ( primitive.vcount !== undefined ) {\n\n\t\t\t\tvar index = 0;\n\n\t\t\t\tfor ( var i = 0, l = vcount.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar count = vcount[ i ];\n\n\t\t\t\t\tif ( count === 4 ) {\n\n\t\t\t\t\t\tvar a = index + stride * 0;\n\t\t\t\t\t\tvar b = index + stride * 1;\n\t\t\t\t\t\tvar c = index + stride * 2;\n\t\t\t\t\t\tvar d = index + stride * 3;\n\n\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( d );\n\t\t\t\t\t\tpushVector( b ); pushVector( c ); pushVector( d );\n\n\t\t\t\t\t} else if ( count === 3 ) {\n\n\t\t\t\t\t\tvar a = index + stride * 0;\n\t\t\t\t\t\tvar b = index + stride * 1;\n\t\t\t\t\t\tvar c = index + stride * 2;\n\n\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( c );\n\n\t\t\t\t\t} else if ( count > 4 ) {\n\n\t\t\t\t\t\tfor ( var k = 1, kl = ( count - 2 ); k <= kl; k ++ ) {\n\n\t\t\t\t\t\t\tvar a = index + stride * 0;\n\t\t\t\t\t\t\tvar b = index + stride * k;\n\t\t\t\t\t\t\tvar c = index + stride * ( k + 1 );\n\n\t\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( c );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex += stride * count;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += stride ) {\n\n\t\t\t\t\tpushVector( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getGeometry( id ) {\n\n\t\t\treturn getBuild( library.geometries[ id ], buildGeometry );\n\n\t\t}\n\n\t\t// kinematics\n\n\t\tfunction parseKinematicsModel( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\tjoints: {},\n\t\t\t\tlinks: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tparseKinematicsTechniqueCommon( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.kinematicsModels[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildKinematicsModel( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getKinematicsModel( id ) {\n\n\t\t\treturn getBuild( library.kinematicsModels[ id ], buildKinematicsModel );\n\n\t\t}\n\n\t\tfunction parseKinematicsTechniqueCommon( xml, data ) {\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'joint':\n\t\t\t\t\t\tdata.joints[ child.getAttribute( 'sid' ) ] = parseKinematicsJoint( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tdata.links.push( parseKinematicsLink( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseKinematicsJoint( xml ) {\n\n\t\t\tvar data;\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'prismatic':\n\t\t\t\t\tcase 'revolute':\n\t\t\t\t\t\tdata = parseKinematicsJointParameter( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsJointParameter( xml, data ) {\n\n\t\t\tvar data = {\n\t\t\t\tsid: xml.getAttribute( 'sid' ),\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\taxis: new Vector3(),\n\t\t\t\tlimits: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 0\n\t\t\t\t},\n\t\t\t\ttype: xml.nodeName,\n\t\t\t\tstatic: false,\n\t\t\t\tzeroPosition: 0,\n\t\t\t\tmiddlePosition: 0\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'axis':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.axis.fromArray( array );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'limits':\n\t\t\t\t\t\tvar max = child.getElementsByTagName( 'max' )[ 0 ];\n\t\t\t\t\t\tvar min = child.getElementsByTagName( 'min' )[ 0 ];\n\n\t\t\t\t\t\tdata.limits.max = parseFloat( max.textContent );\n\t\t\t\t\t\tdata.limits.min = parseFloat( min.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// if min is equal to or greater than max, consider the joint static\n\n\t\t\tif ( data.limits.min >= data.limits.max ) {\n\n\t\t\t\tdata.static = true;\n\n\t\t\t}\n\n\t\t\t// calculate middle position\n\n\t\t\tdata.middlePosition = ( data.limits.min + data.limits.max ) / 2.0;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsLink( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tsid: xml.getAttribute( 'sid' ),\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\tattachments: [],\n\t\t\t\ttransforms: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'attachment_full':\n\t\t\t\t\t\tdata.attachments.push( parseKinematicsAttachment( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tdata.transforms.push( parseKinematicsTransform( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsAttachment( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tjoint: xml.getAttribute( 'joint' ).split( '/' ).pop(),\n\t\t\t\ttransforms: [],\n\t\t\t\tlinks: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tdata.links.push( parseKinematicsLink( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tdata.transforms.push( parseKinematicsTransform( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsTransform( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\ttype: xml.nodeName\n\t\t\t};\n\n\t\t\tvar array = parseFloats( xml.textContent );\n\n\t\t\tswitch ( data.type ) {\n\n\t\t\t\tcase 'matrix':\n\t\t\t\t\tdata.obj = new Matrix4();\n\t\t\t\t\tdata.obj.fromArray( array ).transpose();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'translate':\n\t\t\t\t\tdata.obj = new Vector3();\n\t\t\t\t\tdata.obj.fromArray( array );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rotate':\n\t\t\t\t\tdata.obj = new Vector3();\n\t\t\t\t\tdata.obj.fromArray( array );\n\t\t\t\t\tdata.angle = MathUtils.degToRad( array[ 3 ] );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// physics\n\n\t\tfunction parsePhysicsModel( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\trigidBodies: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'rigid_body':\n\t\t\t\t\t\tdata.rigidBodies[ child.getAttribute( 'name' ) ] = {};\n\t\t\t\t\t\tparsePhysicsRigidBody( child, data.rigidBodies[ child.getAttribute( 'name' ) ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.physicsModels[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parsePhysicsRigidBody( xml, data ) {\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tparsePhysicsTechniqueCommon( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePhysicsTechniqueCommon( xml, data ) {\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'inertia':\n\t\t\t\t\t\tdata.inertia = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mass':\n\t\t\t\t\t\tdata.mass = parseFloats( child.textContent )[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// scene\n\n\t\tfunction parseKinematicsScene( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tbindJointAxis: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'bind_joint_axis':\n\t\t\t\t\t\tdata.bindJointAxis.push( parseKinematicsBindJointAxis( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.kinematicsScenes[ parseId( xml.getAttribute( 'url' ) ) ] = data;\n\n\t\t}\n\n\t\tfunction parseKinematicsBindJointAxis( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\ttarget: xml.getAttribute( 'target' ).split( '/' ).pop()\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'axis':\n\t\t\t\t\t\tvar param = child.getElementsByTagName( 'param' )[ 0 ];\n\t\t\t\t\t\tdata.axis = param.textContent;\n\t\t\t\t\t\tvar tmpJointIndex = data.axis.split( 'inst_' ).pop().split( 'axis' )[ 0 ];\n\t\t\t\t\t\tdata.jointIndex = tmpJointIndex.substr( 0, tmpJointIndex.length - 1 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildKinematicsScene( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getKinematicsScene( id ) {\n\n\t\t\treturn getBuild( library.kinematicsScenes[ id ], buildKinematicsScene );\n\n\t\t}\n\n\t\tfunction setupKinematics() {\n\n\t\t\tvar kinematicsModelId = Object.keys( library.kinematicsModels )[ 0 ];\n\t\t\tvar kinematicsSceneId = Object.keys( library.kinematicsScenes )[ 0 ];\n\t\t\tvar visualSceneId = Object.keys( library.visualScenes )[ 0 ];\n\n\t\t\tif ( kinematicsModelId === undefined || kinematicsSceneId === undefined ) return;\n\n\t\t\tvar kinematicsModel = getKinematicsModel( kinematicsModelId );\n\t\t\tvar kinematicsScene = getKinematicsScene( kinematicsSceneId );\n\t\t\tvar visualScene = getVisualScene( visualSceneId );\n\n\t\t\tvar bindJointAxis = kinematicsScene.bindJointAxis;\n\t\t\tvar jointMap = {};\n\n\t\t\tfor ( var i = 0, l = bindJointAxis.length; i < l; i ++ ) {\n\n\t\t\t\tvar axis = bindJointAxis[ i ];\n\n\t\t\t\t// the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix'\n\n\t\t\t\tvar targetElement = collada.querySelector( '[sid=\"' + axis.target + '\"]' );\n\n\t\t\t\tif ( targetElement ) {\n\n\t\t\t\t\t// get the parent of the transform element\n\n\t\t\t\t\tvar parentVisualElement = targetElement.parentElement;\n\n\t\t\t\t\t// connect the joint of the kinematics model with the element in the visual scene\n\n\t\t\t\t\tconnect( axis.jointIndex, parentVisualElement );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction connect( jointIndex, visualElement ) {\n\n\t\t\t\tvar visualElementName = visualElement.getAttribute( 'name' );\n\t\t\t\tvar joint = kinematicsModel.joints[ jointIndex ];\n\n\t\t\t\tvisualScene.traverse( function ( object ) {\n\n\t\t\t\t\tif ( object.name === visualElementName ) {\n\n\t\t\t\t\t\tjointMap[ jointIndex ] = {\n\t\t\t\t\t\t\tobject: object,\n\t\t\t\t\t\t\ttransforms: buildTransformList( visualElement ),\n\t\t\t\t\t\t\tjoint: joint,\n\t\t\t\t\t\t\tposition: joint.zeroPosition\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tvar m0 = new Matrix4();\n\n\t\t\tkinematics = {\n\n\t\t\t\tjoints: kinematicsModel && kinematicsModel.joints,\n\n\t\t\t\tgetJointValue: function ( jointIndex ) {\n\n\t\t\t\t\tvar jointData = jointMap[ jointIndex ];\n\n\t\t\t\t\tif ( jointData ) {\n\n\t\t\t\t\t\treturn jointData.position;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' doesn\\'t exist.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetJointValue: function ( jointIndex, value ) {\n\n\t\t\t\t\tvar jointData = jointMap[ jointIndex ];\n\n\t\t\t\t\tif ( jointData ) {\n\n\t\t\t\t\t\tvar joint = jointData.joint;\n\n\t\t\t\t\t\tif ( value > joint.limits.max || value < joint.limits.min ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').' );\n\n\t\t\t\t\t\t} else if ( joint.static ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' is static.' );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar object = jointData.object;\n\t\t\t\t\t\t\tvar axis = joint.axis;\n\t\t\t\t\t\t\tvar transforms = jointData.transforms;\n\n\t\t\t\t\t\t\tmatrix.identity();\n\n\t\t\t\t\t\t\t// each update, we have to apply all transforms in the correct order\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < transforms.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tvar transform = transforms[ i ];\n\n\t\t\t\t\t\t\t\t// if there is a connection of the transform node with a joint, apply the joint value\n\n\t\t\t\t\t\t\t\tif ( transform.sid && transform.sid.indexOf( jointIndex ) !== - 1 ) {\n\n\t\t\t\t\t\t\t\t\tswitch ( joint.type ) {\n\n\t\t\t\t\t\t\t\t\t\tcase 'revolute':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeRotationAxis( axis, MathUtils.degToRad( value ) ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'prismatic':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeTranslation( axis.x * value, axis.y * value, axis.z * value ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Unknown joint type: ' + joint.type );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tswitch ( transform.type ) {\n\n\t\t\t\t\t\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( transform.obj );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'translate':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeTranslation( transform.obj.x, transform.obj.y, transform.obj.z ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.scale( transform.obj );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeRotationAxis( transform.obj, transform.angle ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobject.matrix.copy( matrix );\n\t\t\t\t\t\t\tobject.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t\t\t\tjointMap[ jointIndex ].position = value;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.log( 'THREE.ColladaLoader: ' + jointIndex + ' does not exist.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction buildTransformList( node ) {\n\n\t\t\tvar transforms = [];\n\n\t\t\tvar xml = collada.querySelector( '[id=\"' + node.id + '\"]' );\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvar matrix = new Matrix4().fromArray( array ).transpose();\n\t\t\t\t\t\ttransforms.push( {\n\t\t\t\t\t\t\tsid: child.getAttribute( 'sid' ),\n\t\t\t\t\t\t\ttype: child.nodeName,\n\t\t\t\t\t\t\tobj: matrix\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvar vector = new Vector3().fromArray( array );\n\t\t\t\t\t\ttransforms.push( {\n\t\t\t\t\t\t\tsid: child.getAttribute( 'sid' ),\n\t\t\t\t\t\t\ttype: child.nodeName,\n\t\t\t\t\t\t\tobj: vector\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvar vector = new Vector3().fromArray( array );\n\t\t\t\t\t\tvar angle = MathUtils.degToRad( array[ 3 ] );\n\t\t\t\t\t\ttransforms.push( {\n\t\t\t\t\t\t\tsid: child.getAttribute( 'sid' ),\n\t\t\t\t\t\t\ttype: child.nodeName,\n\t\t\t\t\t\t\tobj: vector,\n\t\t\t\t\t\t\tangle: angle\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transforms;\n\n\t\t}\n\n\t\t// nodes\n\n\t\tfunction prepareNodes( xml ) {\n\n\t\t\tvar elements = xml.getElementsByTagName( 'node' );\n\n\t\t\t// ensure all node elements have id attributes\n\n\t\t\tfor ( var i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\tvar element = elements[ i ];\n\n\t\t\t\tif ( element.hasAttribute( 'id' ) === false ) {\n\n\t\t\t\t\telement.setAttribute( 'id', generateId() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar matrix = new Matrix4();\n\t\tvar vector = new Vector3();\n\n\t\tfunction parseNode( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\ttype: xml.getAttribute( 'type' ),\n\t\t\t\tid: xml.getAttribute( 'id' ),\n\t\t\t\tsid: xml.getAttribute( 'sid' ),\n\t\t\t\tmatrix: new Matrix4(),\n\t\t\t\tnodes: [],\n\t\t\t\tinstanceCameras: [],\n\t\t\t\tinstanceControllers: [],\n\t\t\t\tinstanceLights: [],\n\t\t\t\tinstanceGeometries: [],\n\t\t\t\tinstanceNodes: [],\n\t\t\t\ttransforms: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'node':\n\t\t\t\t\t\tdata.nodes.push( child.getAttribute( 'id' ) );\n\t\t\t\t\t\tparseNode( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_camera':\n\t\t\t\t\t\tdata.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_controller':\n\t\t\t\t\t\tdata.instanceControllers.push( parseNodeInstance( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_light':\n\t\t\t\t\t\tdata.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_geometry':\n\t\t\t\t\t\tdata.instanceGeometries.push( parseNodeInstance( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_node':\n\t\t\t\t\t\tdata.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.fromArray( array ).transpose() );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvector.fromArray( array );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvar angle = MathUtils.degToRad( array[ 3 ] );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.matrix.scale( vector.fromArray( array ) );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasNode( data.id ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id );\n\n\t\t\t} else {\n\n\t\t\t\tlibrary.nodes[ data.id ] = data;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseNodeInstance( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: parseId( xml.getAttribute( 'url' ) ),\n\t\t\t\tmaterials: {},\n\t\t\t\tskeletons: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'bind_material':\n\t\t\t\t\t\tvar instances = child.getElementsByTagName( 'instance_material' );\n\n\t\t\t\t\t\tfor ( var j = 0; j < instances.length; j ++ ) {\n\n\t\t\t\t\t\t\tvar instance = instances[ j ];\n\t\t\t\t\t\t\tvar symbol = instance.getAttribute( 'symbol' );\n\t\t\t\t\t\t\tvar target = instance.getAttribute( 'target' );\n\n\t\t\t\t\t\t\tdata.materials[ symbol ] = parseId( target );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skeleton':\n\t\t\t\t\t\tdata.skeletons.push( parseId( child.textContent ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildSkeleton( skeletons, joints ) {\n\n\t\t\tvar boneData = [];\n\t\t\tvar sortedBoneData = [];\n\n\t\t\tvar i, j, data;\n\n\t\t\t// a skeleton can have multiple root bones. collada expresses this\n\t\t\t// situtation with multiple \"skeleton\" tags per controller instance\n\n\t\t\tfor ( i = 0; i < skeletons.length; i ++ ) {\n\n\t\t\t\tvar skeleton = skeletons[ i ];\n\n\t\t\t\tvar root;\n\n\t\t\t\tif ( hasNode( skeleton ) ) {\n\n\t\t\t\t\troot = getNode( skeleton );\n\t\t\t\t\tbuildBoneHierarchy( root, joints, boneData );\n\n\t\t\t\t} else if ( hasVisualScene( skeleton ) ) {\n\n\t\t\t\t\t// handle case where the skeleton refers to the visual scene (#13335)\n\n\t\t\t\t\tvar visualScene = library.visualScenes[ skeleton ];\n\t\t\t\t\tvar children = visualScene.children;\n\n\t\t\t\t\tfor ( var j = 0; j < children.length; j ++ ) {\n\n\t\t\t\t\t\tvar child = children[ j ];\n\n\t\t\t\t\t\tif ( child.type === 'JOINT' ) {\n\n\t\t\t\t\t\t\tvar root = getNode( child.id );\n\t\t\t\t\t\t\tbuildBoneHierarchy( root, joints, boneData );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// sort bone data (the order is defined in the corresponding controller)\n\n\t\t\tfor ( i = 0; i < joints.length; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < boneData.length; j ++ ) {\n\n\t\t\t\t\tdata = boneData[ j ];\n\n\t\t\t\t\tif ( data.bone.name === joints[ i ].name ) {\n\n\t\t\t\t\t\tsortedBoneData[ i ] = data;\n\t\t\t\t\t\tdata.processed = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add unprocessed bone data at the end of the list\n\n\t\t\tfor ( i = 0; i < boneData.length; i ++ ) {\n\n\t\t\t\tdata = boneData[ i ];\n\n\t\t\t\tif ( data.processed === false ) {\n\n\t\t\t\t\tsortedBoneData.push( data );\n\t\t\t\t\tdata.processed = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// setup arrays for skeleton creation\n\n\t\t\tvar bones = [];\n\t\t\tvar boneInverses = [];\n\n\t\t\tfor ( i = 0; i < sortedBoneData.length; i ++ ) {\n\n\t\t\t\tdata = sortedBoneData[ i ];\n\n\t\t\t\tbones.push( data.bone );\n\t\t\t\tboneInverses.push( data.boneInverse );\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t}\n\n\t\tfunction buildBoneHierarchy( root, joints, boneData ) {\n\n\t\t\t// setup bone data from visual scene\n\n\t\t\troot.traverse( function ( object ) {\n\n\t\t\t\tif ( object.isBone === true ) {\n\n\t\t\t\t\tvar boneInverse;\n\n\t\t\t\t\t// retrieve the boneInverse from the controller data\n\n\t\t\t\t\tfor ( var i = 0; i < joints.length; i ++ ) {\n\n\t\t\t\t\t\tvar joint = joints[ i ];\n\n\t\t\t\t\t\tif ( joint.name === object.name ) {\n\n\t\t\t\t\t\t\tboneInverse = joint.boneInverse;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( boneInverse === undefined ) {\n\n\t\t\t\t\t\t// Unfortunately, there can be joints in the visual scene that are not part of the\n\t\t\t\t\t\t// corresponding controller. In this case, we have to create a dummy boneInverse matrix\n\t\t\t\t\t\t// for the respective bone. This bone won't affect any vertices, because there are no skin indices\n\t\t\t\t\t\t// and weights defined for it. But we still have to add the bone to the sorted bone list in order to\n\t\t\t\t\t\t// ensure a correct animation of the model.\n\n\t\t\t\t\t\tboneInverse = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneData.push( { bone: object, boneInverse: boneInverse, processed: false } );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction buildNode( data ) {\n\n\t\t\tvar objects = [];\n\n\t\t\tvar matrix = data.matrix;\n\t\t\tvar nodes = data.nodes;\n\t\t\tvar type = data.type;\n\t\t\tvar instanceCameras = data.instanceCameras;\n\t\t\tvar instanceControllers = data.instanceControllers;\n\t\t\tvar instanceLights = data.instanceLights;\n\t\t\tvar instanceGeometries = data.instanceGeometries;\n\t\t\tvar instanceNodes = data.instanceNodes;\n\n\t\t\t// nodes\n\n\t\t\tfor ( var i = 0, l = nodes.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getNode( nodes[ i ] ) );\n\n\t\t\t}\n\n\t\t\t// instance cameras\n\n\t\t\tfor ( var i = 0, l = instanceCameras.length; i < l; i ++ ) {\n\n\t\t\t\tvar instanceCamera = getCamera( instanceCameras[ i ] );\n\n\t\t\t\tif ( instanceCamera !== null ) {\n\n\t\t\t\t\tobjects.push( instanceCamera.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance controllers\n\n\t\t\tfor ( var i = 0, l = instanceControllers.length; i < l; i ++ ) {\n\n\t\t\t\tvar instance = instanceControllers[ i ];\n\t\t\t\tvar controller = getController( instance.id );\n\t\t\t\tvar geometries = getGeometry( controller.id );\n\t\t\t\tvar newObjects = buildObjects( geometries, instance.materials );\n\n\t\t\t\tvar skeletons = instance.skeletons;\n\t\t\t\tvar joints = controller.skin.joints;\n\n\t\t\t\tvar skeleton = buildSkeleton( skeletons, joints );\n\n\t\t\t\tfor ( var j = 0, jl = newObjects.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar object = newObjects[ j ];\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.bind( skeleton, controller.skin.bindMatrix );\n\t\t\t\t\t\tobject.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance lights\n\n\t\t\tfor ( var i = 0, l = instanceLights.length; i < l; i ++ ) {\n\n\t\t\t\tvar instanceLight = getLight( instanceLights[ i ] );\n\n\t\t\t\tif ( instanceLight !== null ) {\n\n\t\t\t\t\tobjects.push( instanceLight.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance geometries\n\n\t\t\tfor ( var i = 0, l = instanceGeometries.length; i < l; i ++ ) {\n\n\t\t\t\tvar instance = instanceGeometries[ i ];\n\n\t\t\t\t// a single geometry instance in collada can lead to multiple object3Ds.\n\t\t\t\t// this is the case when primitives are combined like triangles and lines\n\n\t\t\t\tvar geometries = getGeometry( instance.id );\n\t\t\t\tvar newObjects = buildObjects( geometries, instance.materials );\n\n\t\t\t\tfor ( var j = 0, jl = newObjects.length; j < jl; j ++ ) {\n\n\t\t\t\t\tobjects.push( newObjects[ j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance nodes\n\n\t\t\tfor ( var i = 0, l = instanceNodes.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getNode( instanceNodes[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tvar object;\n\n\t\t\tif ( nodes.length === 0 && objects.length === 1 ) {\n\n\t\t\t\tobject = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tobject = ( type === 'JOINT' ) ? new Bone() : new Group();\n\n\t\t\t\tfor ( var i = 0; i < objects.length; i ++ ) {\n\n\t\t\t\t\tobject.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobject.name = ( type === 'JOINT' ) ? data.sid : data.name;\n\t\t\tobject.matrix.copy( matrix );\n\t\t\tobject.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\treturn object;\n\n\t\t}\n\n\t\tvar fallbackMaterial = new MeshBasicMaterial( { color: 0xff00ff } );\n\n\t\tfunction resolveMaterialBinding( keys, instanceMaterials ) {\n\n\t\t\tvar materials = [];\n\n\t\t\tfor ( var i = 0, l = keys.length; i < l; i ++ ) {\n\n\t\t\t\tvar id = instanceMaterials[ keys[ i ] ];\n\n\t\t\t\tif ( id === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[ i ] );\n\t\t\t\t\tmaterials.push( fallbackMaterial );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterials.push( getMaterial( id ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t}\n\n\t\tfunction buildObjects( geometries, instanceMaterials ) {\n\n\t\t\tvar objects = [];\n\n\t\t\tfor ( var type in geometries ) {\n\n\t\t\t\tvar geometry = geometries[ type ];\n\n\t\t\t\tvar materials = resolveMaterialBinding( geometry.materialKeys, instanceMaterials );\n\n\t\t\t\t// handle case if no materials are defined\n\n\t\t\t\tif ( materials.length === 0 ) {\n\n\t\t\t\t\tif ( type === 'lines' || type === 'linestrips' ) {\n\n\t\t\t\t\t\tmaterials.push( new LineBasicMaterial() );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaterials.push( new MeshPhongMaterial() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// regard skinning\n\n\t\t\t\tvar skinning = ( geometry.data.attributes.skinIndex !== undefined );\n\n\t\t\t\tif ( skinning ) {\n\n\t\t\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tmaterials[ i ].skinning = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// choose between a single or multi materials (material array)\n\n\t\t\t\tvar material = ( materials.length === 1 ) ? materials[ 0 ] : materials;\n\n\t\t\t\t// now create a specific 3D object\n\n\t\t\t\tvar object;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\t\tobject = new LineSegments( geometry.data, material );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\t\tobject = new Line( geometry.data, material );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\tcase 'polylist':\n\t\t\t\t\t\tif ( skinning ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry.data, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry.data, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tobjects.push( object );\n\n\t\t\t}\n\n\t\t\treturn objects;\n\n\t\t}\n\n\t\tfunction hasNode( id ) {\n\n\t\t\treturn library.nodes[ id ] !== undefined;\n\n\t\t}\n\n\t\tfunction getNode( id ) {\n\n\t\t\treturn getBuild( library.nodes[ id ], buildNode );\n\n\t\t}\n\n\t\t// visual scenes\n\n\t\tfunction parseVisualScene( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tchildren: []\n\t\t\t};\n\n\t\t\tprepareNodes( xml );\n\n\t\t\tvar elements = getElementsByTagName( xml, 'node' );\n\n\t\t\tfor ( var i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\tdata.children.push( parseNode( elements[ i ] ) );\n\n\t\t\t}\n\n\t\t\tlibrary.visualScenes[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildVisualScene( data ) {\n\n\t\t\tvar group = new Group();\n\t\t\tgroup.name = data.name;\n\n\t\t\tvar children = data.children;\n\n\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tvar child = children[ i ];\n\n\t\t\t\tgroup.add( getNode( child.id ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tfunction hasVisualScene( id ) {\n\n\t\t\treturn library.visualScenes[ id ] !== undefined;\n\n\t\t}\n\n\t\tfunction getVisualScene( id ) {\n\n\t\t\treturn getBuild( library.visualScenes[ id ], buildVisualScene );\n\n\t\t}\n\n\t\t// scenes\n\n\t\tfunction parseScene( xml ) {\n\n\t\t\tvar instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ];\n\t\t\treturn getVisualScene( parseId( instance.getAttribute( 'url' ) ) );\n\n\t\t}\n\n\t\tfunction setupAnimations() {\n\n\t\t\tvar clips = library.clips;\n\n\t\t\tif ( isEmpty( clips ) === true ) {\n\n\t\t\t\tif ( isEmpty( library.animations ) === false ) {\n\n\t\t\t\t\t// if there are animations but no clips, we create a default clip for playback\n\n\t\t\t\t\tvar tracks = [];\n\n\t\t\t\t\tfor ( var id in library.animations ) {\n\n\t\t\t\t\t\tvar animationTracks = getAnimation( id );\n\n\t\t\t\t\t\tfor ( var i = 0, l = animationTracks.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\ttracks.push( animationTracks[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimations.push( new AnimationClip( 'default', - 1, tracks ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var id in clips ) {\n\n\t\t\t\t\tanimations.push( getAnimationClip( id ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// convert the parser error element into text with each child elements text\n\t\t// separated by new lines.\n\n\t\tfunction parserErrorToText( parserError ) {\n\n\t\t\tvar result = '';\n\t\t\tvar stack = [ parserError ];\n\n\t\t\twhile ( stack.length ) {\n\n\t\t\t\tvar node = stack.shift();\n\n\t\t\t\tif ( node.nodeType === Node.TEXT_NODE ) {\n\n\t\t\t\t\tresult += node.textContent;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult += '\\n';\n\t\t\t\t\tstack.push.apply( stack, node.childNodes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result.trim();\n\n\t\t}\n\n\t\tif ( text.length === 0 ) {\n\n\t\t\treturn { scene: new Scene() };\n\n\t\t}\n\n\t\tvar xml = new DOMParser().parseFromString( text, 'application/xml' );\n\n\t\tvar collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ];\n\n\t\tvar parserError = xml.getElementsByTagName( 'parsererror' )[ 0 ];\n\t\tif ( parserError !== undefined ) {\n\n\t\t\t// Chrome will return parser error with a div in it\n\n\t\t\tvar errorElement = getElementsByTagName( parserError, 'div' )[ 0 ];\n\t\t\tvar errorText;\n\n\t\t\tif ( errorElement ) {\n\n\t\t\t\terrorText = errorElement.textContent;\n\n\t\t\t} else {\n\n\t\t\t\terrorText = parserErrorToText( parserError );\n\n\t\t\t}\n\n\t\t\tconsole.error( 'THREE.ColladaLoader: Failed to parse collada file.\\n', errorText );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// metadata\n\n\t\tvar version = collada.getAttribute( 'version' );\n\t\tconsole.log( 'THREE.ColladaLoader: File version', version );\n\n\t\tvar asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] );\n\t\tvar textureLoader = new TextureLoader( this.manager );\n\t\ttextureLoader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\tvar tgaLoader;\n\n\t\tif ( TGALoader ) {\n\n\t\t\ttgaLoader = new TGALoader( this.manager );\n\t\t\ttgaLoader.setPath( this.resourcePath || path );\n\n\t\t}\n\n\t\t//\n\n\t\tvar animations = [];\n\t\tvar kinematics = {};\n\t\tvar count = 0;\n\n\t\t//\n\n\t\tvar library = {\n\t\t\tanimations: {},\n\t\t\tclips: {},\n\t\t\tcontrollers: {},\n\t\t\timages: {},\n\t\t\teffects: {},\n\t\t\tmaterials: {},\n\t\t\tcameras: {},\n\t\t\tlights: {},\n\t\t\tgeometries: {},\n\t\t\tnodes: {},\n\t\t\tvisualScenes: {},\n\t\t\tkinematicsModels: {},\n\t\t\tphysicsModels: {},\n\t\t\tkinematicsScenes: {}\n\t\t};\n\n\t\tparseLibrary( collada, 'library_animations', 'animation', parseAnimation );\n\t\tparseLibrary( collada, 'library_animation_clips', 'animation_clip', parseAnimationClip );\n\t\tparseLibrary( collada, 'library_controllers', 'controller', parseController );\n\t\tparseLibrary( collada, 'library_images', 'image', parseImage );\n\t\tparseLibrary( collada, 'library_effects', 'effect', parseEffect );\n\t\tparseLibrary( collada, 'library_materials', 'material', parseMaterial );\n\t\tparseLibrary( collada, 'library_cameras', 'camera', parseCamera );\n\t\tparseLibrary( collada, 'library_lights', 'light', parseLight );\n\t\tparseLibrary( collada, 'library_geometries', 'geometry', parseGeometry );\n\t\tparseLibrary( collada, 'library_nodes', 'node', parseNode );\n\t\tparseLibrary( collada, 'library_visual_scenes', 'visual_scene', parseVisualScene );\n\t\tparseLibrary( collada, 'library_kinematics_models', 'kinematics_model', parseKinematicsModel );\n\t\tparseLibrary( collada, 'library_physics_models', 'physics_model', parsePhysicsModel );\n\t\tparseLibrary( collada, 'scene', 'instance_kinematics_scene', parseKinematicsScene );\n\n\t\tbuildLibrary( library.animations, buildAnimation );\n\t\tbuildLibrary( library.clips, buildAnimationClip );\n\t\tbuildLibrary( library.controllers, buildController );\n\t\tbuildLibrary( library.images, buildImage );\n\t\tbuildLibrary( library.effects, buildEffect );\n\t\tbuildLibrary( library.materials, buildMaterial );\n\t\tbuildLibrary( library.cameras, buildCamera );\n\t\tbuildLibrary( library.lights, buildLight );\n\t\tbuildLibrary( library.geometries, buildGeometry );\n\t\tbuildLibrary( library.visualScenes, buildVisualScene );\n\n\t\tsetupAnimations();\n\t\tsetupKinematics();\n\n\t\tvar scene = parseScene( getElementsByTagName( collada, 'scene' )[ 0 ] );\n\n\t\tif ( asset.upAxis === 'Z_UP' ) {\n\n\t\t\tscene.quaternion.setFromEuler( new Euler( - Math.PI / 2, 0, 0 ) );\n\n\t\t}\n\n\t\tscene.scale.multiplyScalar( asset.unit );\n\n\t\treturn {\n\t\t\tanimations: animations,\n\t\t\tkinematics: kinematics,\n\t\t\tlibrary: library,\n\t\t\tscene: scene\n\t\t};\n\n\t}\n\n} );\n\nexport { ColladaLoader };\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tCanvasTexture,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternionKeyframeTrack,\n\tRGBAFormat,\n\tRGBFormat,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTangentSpaceNormalMap,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tsRGBEncoding\n} from \"../../../build/three.module.js\";\n\nvar GLTFLoader = ( function () {\n\n\tfunction GLTFLoader( manager ) {\n\n\t\tLoader.call( this, manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ddsLoader = null;\n\t\tthis.ktx2Loader = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t}\n\n\tGLTFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\t\tconstructor: GLTFLoader,\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar resourcePath;\n\n\t\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== '' ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t\t}\n\n\t\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tvar _onError = function ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t};\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.setRequestHeader( this.requestHeader );\n\n\t\t\tif ( scope.crossOrigin === 'use-credentials' ) {\n\n\t\t\t\tloader.setWithCredentials( true );\n\n\t\t\t}\n\n\t\t\tloader.load( url, function ( data ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, _onError );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t_onError( e );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, _onError );\n\n\t\t},\n\n\t\tsetDRACOLoader: function ( dracoLoader ) {\n\n\t\t\tthis.dracoLoader = dracoLoader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetDDSLoader: function ( ddsLoader ) {\n\n\t\t\tthis.ddsLoader = ddsLoader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetKTX2Loader: function ( ktx2Loader ) {\n\n\t\t\tthis.ktx2Loader = ktx2Loader;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tregister: function ( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunregister: function ( callback ) {\n\n\t\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tparse: function ( data, path, onLoad, onError ) {\n\n\t\t\tvar content;\n\t\t\tvar extensions = {};\n\t\t\tvar plugins = {};\n\n\t\t\tif ( typeof data === 'string' ) {\n\n\t\t\t\tcontent = data;\n\n\t\t\t} else {\n\n\t\t\t\tvar magic = LoaderUtils.decodeText( new Uint8Array( data, 0, 4 ) );\n\n\t\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontent = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcontent = LoaderUtils.decodeText( new Uint8Array( data ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar json = JSON.parse( content );\n\n\t\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar parser = new GLTFParser( json, {\n\n\t\t\t\tpath: path || this.resourcePath || '',\n\t\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\t\tmanager: this.manager,\n\t\t\t\tktx2Loader: this.ktx2Loader\n\n\t\t\t} );\n\n\t\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\t\tfor ( var i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\t\tvar plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t\t// Remove this workaround if we move all the existing\n\t\t\t\t// extension handlers to plugin system\n\t\t\t\textensions[ plugin.name ] = true;\n\n\t\t\t}\n\n\t\t\tif ( json.extensionsUsed ) {\n\n\t\t\t\tfor ( var i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\t\tvar extensionName = json.extensionsUsed[ i ];\n\t\t\t\t\tvar extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_LIGHTS_PUNCTUAL:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFLightsExtension( json );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsPbrSpecularGlossinessExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.MSFT_TEXTURE_DDS:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureDDSExtension( this.ddsLoader );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.setExtensions( extensions );\n\t\t\tparser.setPlugins( plugins );\n\t\t\tparser.parse( onLoad, onError );\n\n\t\t}\n\n\t} );\n\n\t/* GLTFREGISTRY */\n\n\tfunction GLTFRegistry() {\n\n\t\tvar objects = {};\n\n\t\treturn\t{\n\n\t\t\tget: function ( key ) {\n\n\t\t\t\treturn objects[ key ];\n\n\t\t\t},\n\n\t\t\tadd: function ( key, object ) {\n\n\t\t\t\tobjects[ key ] = object;\n\n\t\t\t},\n\n\t\t\tremove: function ( key ) {\n\n\t\t\t\tdelete objects[ key ];\n\n\t\t\t},\n\n\t\t\tremoveAll: function () {\n\n\t\t\t\tobjects = {};\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/*********************************/\n\t/********** EXTENSIONS ***********/\n\t/*********************************/\n\n\tvar EXTENSIONS = {\n\t\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\t\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\t\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\t\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\t\tKHR_MATERIALS_PBR_SPECULAR_GLOSSINESS: 'KHR_materials_pbrSpecularGlossiness',\n\t\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\t\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\t\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\t\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\t\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\t\tMSFT_TEXTURE_DDS: 'MSFT_texture_dds'\n\t};\n\n\t/**\n\t * DDS Texture Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/MSFT_texture_dds\n\t *\n\t */\n\tfunction GLTFTextureDDSExtension( ddsLoader ) {\n\n\t\tif ( ! ddsLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Attempting to load .dds texture without importing DDSLoader' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.MSFT_TEXTURE_DDS;\n\t\tthis.ddsLoader = ddsLoader;\n\n\t}\n\n\t/**\n\t * Punctual Lights Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n\t */\n\tfunction GLTFLightsExtension( json ) {\n\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\tvar extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ] ) || {};\n\t\tthis.lightDefs = extension.lights || [];\n\n\t}\n\n\tGLTFLightsExtension.prototype.loadLight = function ( lightIndex ) {\n\n\t\tvar lightDef = this.lightDefs[ lightIndex ];\n\t\tvar lightNode;\n\n\t\tvar color = new Color( 0xffffff );\n\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\n\t\tvar range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type, \"' + lightDef.type + '\".' );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = lightDef.name || ( 'light_' + lightIndex );\n\n\t\treturn Promise.resolve( lightNode );\n\n\t};\n\n\t/**\n\t * Unlit Materials Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n\t */\n\tfunction GLTFMaterialsUnlitExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tGLTFMaterialsUnlitExtension.prototype.getMaterialType = function () {\n\n\t\treturn MeshBasicMaterial;\n\n\t};\n\n\tGLTFMaterialsUnlitExtension.prototype.extendParams = function ( materialParams, materialDef, parser ) {\n\n\t\tvar pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tvar metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tvar array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Clearcoat Materials Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n\t */\n\tfunction GLTFMaterialsClearcoatExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tGLTFMaterialsClearcoatExtension.prototype.getMaterialType = function ( /* materialIndex */ ) {\n\n\t\treturn MeshPhysicalMaterial;\n\n\t};\n\n\tGLTFMaterialsClearcoatExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) {\n\n\t\tvar parser = this.parser;\n\t\tvar materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tvar extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tvar scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Transmission Materials Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n\t * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n\t */\n\tfunction GLTFMaterialsTransmissionExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tGLTFMaterialsTransmissionExtension.prototype.getMaterialType = function ( /* materialIndex */ ) {\n\n\t\treturn MeshPhysicalMaterial;\n\n\t};\n\n\tGLTFMaterialsTransmissionExtension.prototype.extendMaterialParams = function ( materialIndex, materialParams ) {\n\n\t\tvar parser = this.parser;\n\t\tvar materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tvar extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * BasisU Texture Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n\t * (draft PR https://github.com/KhronosGroup/glTF/pull/1751)\n\t */\n\tfunction GLTFTextureBasisUExtension( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tGLTFTextureBasisUExtension.prototype.loadTexture = function ( textureIndex ) {\n\n\t\tvar parser = this.parser;\n\t\tvar json = parser.json;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar extension = textureDef.extensions[ this.name ];\n\t\tvar source = json.images[ extension.source ];\n\t\tvar loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, source, loader );\n\n\t};\n\n\t/* BINARY EXTENSION */\n\tvar BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\n\tvar BINARY_EXTENSION_HEADER_LENGTH = 12;\n\tvar BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\n\tfunction GLTFBinaryExtension( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tvar headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\n\t\tthis.header = {\n\t\t\tmagic: LoaderUtils.decodeText( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tvar chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tvar chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkView.byteLength ) {\n\n\t\t\tvar chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tvar chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tvar contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = LoaderUtils.decodeText( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tvar byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * DRACO Mesh Compression Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n\t */\n\tfunction GLTFDracoMeshCompressionExtension( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tGLTFDracoMeshCompressionExtension.prototype.decodePrimitive = function ( primitive, parser ) {\n\n\t\tvar json = this.json;\n\t\tvar dracoLoader = this.dracoLoader;\n\t\tvar bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tvar gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tvar threeAttributeMap = {};\n\t\tvar attributeNormalizedMap = {};\n\t\tvar attributeTypeMap = {};\n\n\t\tfor ( var attributeName in gltfAttributeMap ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( attributeName in primitive.attributes ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tvar accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tvar componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( var attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tvar attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tvar normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Texture Transform Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n\t */\n\tfunction GLTFTextureTransformExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\tGLTFTextureTransformExtension.prototype.extendTexture = function ( texture, transform ) {\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t};\n\n\t/**\n\t * Specular-Glossiness Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_pbrSpecularGlossiness\n\t */\n\n\t/**\n\t * A sub class of StandardMaterial with some of the functionality\n\t * changed via the `onBeforeCompile` callback\n\t * @pailhead\n\t */\n\n\tfunction GLTFMeshStandardSGMaterial( params ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.isGLTFSpecularGlossinessMaterial = true;\n\n\t\t//various chunks that need replacing\n\t\tvar specularMapParsFragmentChunk = [\n\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t'\tuniform sampler2D specularMap;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar glossinessMapParsFragmentChunk = [\n\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t'\tuniform sampler2D glossinessMap;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar specularMapFragmentChunk = [\n\t\t\t'vec3 specularFactor = specular;',\n\t\t\t'#ifdef USE_SPECULARMAP',\n\t\t\t'\tvec4 texelSpecular = texture2D( specularMap, vUv );',\n\t\t\t'\ttexelSpecular = sRGBToLinear( texelSpecular );',\n\t\t\t'\t// reads channel RGB, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t'\tspecularFactor *= texelSpecular.rgb;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar glossinessMapFragmentChunk = [\n\t\t\t'float glossinessFactor = glossiness;',\n\t\t\t'#ifdef USE_GLOSSINESSMAP',\n\t\t\t'\tvec4 texelGlossiness = texture2D( glossinessMap, vUv );',\n\t\t\t'\t// reads channel A, compatible with a glTF Specular-Glossiness (RGBA) texture',\n\t\t\t'\tglossinessFactor *= texelGlossiness.a;',\n\t\t\t'#endif'\n\t\t].join( '\\n' );\n\n\t\tvar lightPhysicalFragmentChunk = [\n\t\t\t'PhysicalMaterial material;',\n\t\t\t'material.diffuseColor = diffuseColor.rgb;',\n\t\t\t'vec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );',\n\t\t\t'float geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );',\n\t\t\t'material.specularRoughness = max( 1.0 - glossinessFactor, 0.0525 );// 0.0525 corresponds to the base mip of a 256 cubemap.',\n\t\t\t'material.specularRoughness += geometryRoughness;',\n\t\t\t'material.specularRoughness = min( material.specularRoughness, 1.0 );',\n\t\t\t'material.specularColor = specularFactor.rgb;',\n\t\t].join( '\\n' );\n\n\t\tvar uniforms = {\n\t\t\tspecular: { value: new Color().setHex( 0xffffff ) },\n\t\t\tglossiness: { value: 1 },\n\t\t\tspecularMap: { value: null },\n\t\t\tglossinessMap: { value: null }\n\t\t};\n\n\t\tthis._extraUniforms = uniforms;\n\n\t\t// please see #14031 or #13198 for an alternate approach\n\t\tthis.onBeforeCompile = function ( shader ) {\n\n\t\t\tfor ( var uniformName in uniforms ) {\n\n\t\t\t\tshader.uniforms[ uniformName ] = uniforms[ uniformName ];\n\n\t\t\t}\n\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( 'uniform float roughness;', 'uniform vec3 specular;' );\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( 'uniform float metalness;', 'uniform float glossiness;' );\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( '#include ', specularMapParsFragmentChunk );\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( '#include ', glossinessMapParsFragmentChunk );\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( '#include ', specularMapFragmentChunk );\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( '#include ', glossinessMapFragmentChunk );\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace( '#include ', lightPhysicalFragmentChunk );\n\n\t\t};\n\n\t\t/*eslint-disable*/\n\t\tObject.defineProperties(\n\t\t\tthis,\n\t\t\t{\n\t\t\t\tspecular: {\n\t\t\t\t\tget: function () { return uniforms.specular.value; },\n\t\t\t\t\tset: function ( v ) { uniforms.specular.value = v; }\n\t\t\t\t},\n\t\t\t\tspecularMap: {\n\t\t\t\t\tget: function () { return uniforms.specularMap.value; },\n\t\t\t\t\tset: function ( v ) { uniforms.specularMap.value = v; }\n\t\t\t\t},\n\t\t\t\tglossiness: {\n\t\t\t\t\tget: function () { return uniforms.glossiness.value; },\n\t\t\t\t\tset: function ( v ) { uniforms.glossiness.value = v; }\n\t\t\t\t},\n\t\t\t\tglossinessMap: {\n\t\t\t\t\tget: function () { return uniforms.glossinessMap.value; },\n\t\t\t\t\tset: function ( v ) {\n\n\t\t\t\t\t\tuniforms.glossinessMap.value = v;\n\t\t\t\t\t\t//how about something like this - @pailhead\n\t\t\t\t\t\tif ( v ) {\n\n\t\t\t\t\t\t\tthis.defines.USE_GLOSSINESSMAP = '';\n\t\t\t\t\t\t\t// set USE_ROUGHNESSMAP to enable vUv\n\t\t\t\t\t\t\tthis.defines.USE_ROUGHNESSMAP = '';\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdelete this.defines.USE_ROUGHNESSMAP;\n\t\t\t\t\t\t\tdelete this.defines.USE_GLOSSINESSMAP;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\n\t\t/*eslint-enable*/\n\t\tdelete this.metalness;\n\t\tdelete this.roughness;\n\t\tdelete this.metalnessMap;\n\t\tdelete this.roughnessMap;\n\n\t\tthis.setValues( params );\n\n\t}\n\n\tGLTFMeshStandardSGMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tGLTFMeshStandardSGMaterial.prototype.constructor = GLTFMeshStandardSGMaterial;\n\n\tGLTFMeshStandardSGMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\t\tthis.specularMap = source.specularMap;\n\t\tthis.specular.copy( source.specular );\n\t\tthis.glossinessMap = source.glossinessMap;\n\t\tthis.glossiness = source.glossiness;\n\t\tdelete this.metalness;\n\t\tdelete this.roughness;\n\t\tdelete this.metalnessMap;\n\t\tdelete this.roughnessMap;\n\t\treturn this;\n\n\t};\n\n\tfunction GLTFMaterialsPbrSpecularGlossinessExtension() {\n\n\t\treturn {\n\n\t\t\tname: EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,\n\n\t\t\tspecularGlossinessParams: [\n\t\t\t\t'color',\n\t\t\t\t'map',\n\t\t\t\t'lightMap',\n\t\t\t\t'lightMapIntensity',\n\t\t\t\t'aoMap',\n\t\t\t\t'aoMapIntensity',\n\t\t\t\t'emissive',\n\t\t\t\t'emissiveIntensity',\n\t\t\t\t'emissiveMap',\n\t\t\t\t'bumpMap',\n\t\t\t\t'bumpScale',\n\t\t\t\t'normalMap',\n\t\t\t\t'normalMapType',\n\t\t\t\t'displacementMap',\n\t\t\t\t'displacementScale',\n\t\t\t\t'displacementBias',\n\t\t\t\t'specularMap',\n\t\t\t\t'specular',\n\t\t\t\t'glossinessMap',\n\t\t\t\t'glossiness',\n\t\t\t\t'alphaMap',\n\t\t\t\t'envMap',\n\t\t\t\t'envMapIntensity',\n\t\t\t\t'refractionRatio',\n\t\t\t],\n\n\t\t\tgetMaterialType: function () {\n\n\t\t\t\treturn GLTFMeshStandardSGMaterial;\n\n\t\t\t},\n\n\t\t\textendParams: function ( materialParams, materialDef, parser ) {\n\n\t\t\t\tvar pbrSpecularGlossiness = materialDef.extensions[ this.name ];\n\n\t\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\t\tvar pending = [];\n\n\t\t\t\tif ( Array.isArray( pbrSpecularGlossiness.diffuseFactor ) ) {\n\n\t\t\t\t\tvar array = pbrSpecularGlossiness.diffuseFactor;\n\n\t\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( pbrSpecularGlossiness.diffuseTexture !== undefined ) {\n\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', pbrSpecularGlossiness.diffuseTexture ) );\n\n\t\t\t\t}\n\n\t\t\t\tmaterialParams.emissive = new Color( 0.0, 0.0, 0.0 );\n\t\t\t\tmaterialParams.glossiness = pbrSpecularGlossiness.glossinessFactor !== undefined ? pbrSpecularGlossiness.glossinessFactor : 1.0;\n\t\t\t\tmaterialParams.specular = new Color( 1.0, 1.0, 1.0 );\n\n\t\t\t\tif ( Array.isArray( pbrSpecularGlossiness.specularFactor ) ) {\n\n\t\t\t\t\tmaterialParams.specular.fromArray( pbrSpecularGlossiness.specularFactor );\n\n\t\t\t\t}\n\n\t\t\t\tif ( pbrSpecularGlossiness.specularGlossinessTexture !== undefined ) {\n\n\t\t\t\t\tvar specGlossMapDef = pbrSpecularGlossiness.specularGlossinessTexture;\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'glossinessMap', specGlossMapDef ) );\n\t\t\t\t\tpending.push( parser.assignTexture( materialParams, 'specularMap', specGlossMapDef ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t},\n\n\t\t\tcreateMaterial: function ( materialParams ) {\n\n\t\t\t\tvar material = new GLTFMeshStandardSGMaterial( materialParams );\n\t\t\t\tmaterial.fog = true;\n\n\t\t\t\tmaterial.color = materialParams.color;\n\n\t\t\t\tmaterial.map = materialParams.map === undefined ? null : materialParams.map;\n\n\t\t\t\tmaterial.lightMap = null;\n\t\t\t\tmaterial.lightMapIntensity = 1.0;\n\n\t\t\t\tmaterial.aoMap = materialParams.aoMap === undefined ? null : materialParams.aoMap;\n\t\t\t\tmaterial.aoMapIntensity = 1.0;\n\n\t\t\t\tmaterial.emissive = materialParams.emissive;\n\t\t\t\tmaterial.emissiveIntensity = 1.0;\n\t\t\t\tmaterial.emissiveMap = materialParams.emissiveMap === undefined ? null : materialParams.emissiveMap;\n\n\t\t\t\tmaterial.bumpMap = materialParams.bumpMap === undefined ? null : materialParams.bumpMap;\n\t\t\t\tmaterial.bumpScale = 1;\n\n\t\t\t\tmaterial.normalMap = materialParams.normalMap === undefined ? null : materialParams.normalMap;\n\t\t\t\tmaterial.normalMapType = TangentSpaceNormalMap;\n\n\t\t\t\tif ( materialParams.normalScale ) material.normalScale = materialParams.normalScale;\n\n\t\t\t\tmaterial.displacementMap = null;\n\t\t\t\tmaterial.displacementScale = 1;\n\t\t\t\tmaterial.displacementBias = 0;\n\n\t\t\t\tmaterial.specularMap = materialParams.specularMap === undefined ? null : materialParams.specularMap;\n\t\t\t\tmaterial.specular = materialParams.specular;\n\n\t\t\t\tmaterial.glossinessMap = materialParams.glossinessMap === undefined ? null : materialParams.glossinessMap;\n\t\t\t\tmaterial.glossiness = materialParams.glossiness;\n\n\t\t\t\tmaterial.alphaMap = null;\n\n\t\t\t\tmaterial.envMap = materialParams.envMap === undefined ? null : materialParams.envMap;\n\t\t\t\tmaterial.envMapIntensity = 1.0;\n\n\t\t\t\tmaterial.refractionRatio = 0.98;\n\n\t\t\t\treturn material;\n\n\t\t\t},\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Mesh Quantization Extension\n\t *\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n\t */\n\tfunction GLTFMeshQuantizationExtension() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n\t/*********************************/\n\t/********** INTERPOLATION ********/\n\t/*********************************/\n\n\t// Spline Interpolation\n\t// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\n\tfunction GLTFCubicSplineInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tGLTFCubicSplineInterpolant.prototype = Object.create( Interpolant.prototype );\n\tGLTFCubicSplineInterpolant.prototype.constructor = GLTFCubicSplineInterpolant;\n\n\tGLTFCubicSplineInterpolant.prototype.copySampleValue_ = function ( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tvar result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( var i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\tGLTFCubicSplineInterpolant.prototype.beforeStart_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.afterEnd_ = GLTFCubicSplineInterpolant.prototype.copySampleValue_;\n\n\tGLTFCubicSplineInterpolant.prototype.interpolate_ = function ( i1, t0, t, t1 ) {\n\n\t\tvar result = this.resultBuffer;\n\t\tvar values = this.sampleValues;\n\t\tvar stride = this.valueSize;\n\n\t\tvar stride2 = stride * 2;\n\t\tvar stride3 = stride * 3;\n\n\t\tvar td = t1 - t0;\n\n\t\tvar p = ( t - t0 ) / td;\n\t\tvar pp = p * p;\n\t\tvar ppp = pp * p;\n\n\t\tvar offset1 = i1 * stride3;\n\t\tvar offset0 = offset1 - stride3;\n\n\t\tvar s2 = - 2 * ppp + 3 * pp;\n\t\tvar s3 = ppp - pp;\n\t\tvar s0 = 1 - s2;\n\t\tvar s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( var i = 0; i !== stride; i ++ ) {\n\n\t\t\tvar p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tvar m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tvar p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tvar m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t};\n\n\t/*********************************/\n\t/********** INTERNALS ************/\n\t/*********************************/\n\n\t/* CONSTANTS */\n\n\tvar WEBGL_CONSTANTS = {\n\t\tFLOAT: 5126,\n\t\t//FLOAT_MAT2: 35674,\n\t\tFLOAT_MAT3: 35675,\n\t\tFLOAT_MAT4: 35676,\n\t\tFLOAT_VEC2: 35664,\n\t\tFLOAT_VEC3: 35665,\n\t\tFLOAT_VEC4: 35666,\n\t\tLINEAR: 9729,\n\t\tREPEAT: 10497,\n\t\tSAMPLER_2D: 35678,\n\t\tPOINTS: 0,\n\t\tLINES: 1,\n\t\tLINE_LOOP: 2,\n\t\tLINE_STRIP: 3,\n\t\tTRIANGLES: 4,\n\t\tTRIANGLE_STRIP: 5,\n\t\tTRIANGLE_FAN: 6,\n\t\tUNSIGNED_BYTE: 5121,\n\t\tUNSIGNED_SHORT: 5123\n\t};\n\n\tvar WEBGL_COMPONENT_TYPES = {\n\t\t5120: Int8Array,\n\t\t5121: Uint8Array,\n\t\t5122: Int16Array,\n\t\t5123: Uint16Array,\n\t\t5125: Uint32Array,\n\t\t5126: Float32Array\n\t};\n\n\tvar WEBGL_FILTERS = {\n\t\t9728: NearestFilter,\n\t\t9729: LinearFilter,\n\t\t9984: NearestMipmapNearestFilter,\n\t\t9985: LinearMipmapNearestFilter,\n\t\t9986: NearestMipmapLinearFilter,\n\t\t9987: LinearMipmapLinearFilter\n\t};\n\n\tvar WEBGL_WRAPPINGS = {\n\t\t33071: ClampToEdgeWrapping,\n\t\t33648: MirroredRepeatWrapping,\n\t\t10497: RepeatWrapping\n\t};\n\n\tvar WEBGL_TYPE_SIZES = {\n\t\t'SCALAR': 1,\n\t\t'VEC2': 2,\n\t\t'VEC3': 3,\n\t\t'VEC4': 4,\n\t\t'MAT2': 4,\n\t\t'MAT3': 9,\n\t\t'MAT4': 16\n\t};\n\n\tvar ATTRIBUTES = {\n\t\tPOSITION: 'position',\n\t\tNORMAL: 'normal',\n\t\tTANGENT: 'tangent',\n\t\tTEXCOORD_0: 'uv',\n\t\tTEXCOORD_1: 'uv2',\n\t\tCOLOR_0: 'color',\n\t\tWEIGHTS_0: 'skinWeight',\n\t\tJOINTS_0: 'skinIndex',\n\t};\n\n\tvar PATH_PROPERTIES = {\n\t\tscale: 'scale',\n\t\ttranslation: 'position',\n\t\trotation: 'quaternion',\n\t\tweights: 'morphTargetInfluences'\n\t};\n\n\tvar INTERPOLATION = {\n\t\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\t\tLINEAR: InterpolateLinear,\n\t\tSTEP: InterpolateDiscrete\n\t};\n\n\tvar ALPHA_MODES = {\n\t\tOPAQUE: 'OPAQUE',\n\t\tMASK: 'MASK',\n\t\tBLEND: 'BLEND'\n\t};\n\n\tvar MIME_TYPE_FORMATS = {\n\t\t'image/png': RGBAFormat,\n\t\t'image/jpeg': RGBFormat\n\t};\n\n\t/* UTILITY FUNCTIONS */\n\n\tfunction resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n\t */\n\tfunction createDefaultMaterial( cache ) {\n\n\t\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\t\tcolor: 0xFFFFFF,\n\t\t\t\temissive: 0x000000,\n\t\t\t\tmetalness: 1,\n\t\t\t\troughness: 1,\n\t\t\t\ttransparent: false,\n\t\t\t\tdepthTest: true,\n\t\t\t\tside: FrontSide\n\t\t\t} );\n\n\t\t}\n\n\t\treturn cache[ 'DefaultMaterial' ];\n\n\t}\n\n\tfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t\t// Add unknown glTF extensions to an object's userData.\n\n\t\tfor ( var name in objectDef.extensions ) {\n\n\t\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @param {Object3D|Material|BufferGeometry} object\n\t * @param {GLTF.definition} gltfDef\n\t */\n\tfunction assignExtrasToUserData( object, gltfDef ) {\n\n\t\tif ( gltfDef.extras !== undefined ) {\n\n\t\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n\t *\n\t * @param {BufferGeometry} geometry\n\t * @param {Array} targets\n\t * @param {GLTFParser} parser\n\t * @return {Promise}\n\t */\n\tfunction addMorphTargets( geometry, targets, parser ) {\n\n\t\tvar hasMorphPosition = false;\n\t\tvar hasMorphNormal = false;\n\n\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tvar target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\n\t\t\tif ( hasMorphPosition && hasMorphNormal ) break;\n\n\t\t}\n\n\t\tif ( ! hasMorphPosition && ! hasMorphNormal ) return Promise.resolve( geometry );\n\n\t\tvar pendingPositionAccessors = [];\n\t\tvar pendingNormalAccessors = [];\n\n\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tvar target = targets[ i ];\n\n\t\t\tif ( hasMorphPosition ) {\n\n\t\t\t\tvar pendingAccessor = target.POSITION !== undefined\n\t\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t\t: geometry.attributes.position;\n\n\t\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t\tif ( hasMorphNormal ) {\n\n\t\t\t\tvar pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t\t: geometry.attributes.normal;\n\n\t\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( [\n\t\t\tPromise.all( pendingPositionAccessors ),\n\t\t\tPromise.all( pendingNormalAccessors )\n\t\t] ).then( function ( accessors ) {\n\n\t\t\tvar morphPositions = accessors[ 0 ];\n\t\t\tvar morphNormals = accessors[ 1 ];\n\n\t\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t\treturn geometry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * @param {Mesh} mesh\n\t * @param {GLTF.Mesh} meshDef\n\t */\n\tfunction updateMorphTargets( mesh, meshDef ) {\n\n\t\tmesh.updateMorphTargets();\n\n\t\tif ( meshDef.weights !== undefined ) {\n\n\t\t\tfor ( var i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\t\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\t\tvar targetNames = meshDef.extras.targetNames;\n\n\t\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\t\tfor ( var i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createPrimitiveKey( primitiveDef ) {\n\n\t\tvar dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\t\tvar geometryKey;\n\n\t\tif ( dracoExtension ) {\n\n\t\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t\t} else {\n\n\t\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t\t}\n\n\t\treturn geometryKey;\n\n\t}\n\n\tfunction createAttributesKey( attributes ) {\n\n\t\tvar attributesKey = '';\n\n\t\tvar keys = Object.keys( attributes ).sort();\n\n\t\tfor ( var i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t\t}\n\n\t\treturn attributesKey;\n\n\t}\n\n\t/* GLTF PARSER */\n\n\tfunction GLTFParser( json, options ) {\n\n\t\tthis.json = json || {};\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options || {};\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\t\tif ( typeof createImageBitmap !== 'undefined' && /Firefox/.test( navigator.userAgent ) === false ) {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tGLTFParser.prototype.setExtensions = function ( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t};\n\n\tGLTFParser.prototype.setPlugins = function ( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t};\n\n\tGLTFParser.prototype.parse = function ( onLoad, onError ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._markDefs();\n\n\t\tPromise.all( [\n\n\t\t\tthis.getDependencies( 'scene' ),\n\t\t\tthis.getDependencies( 'animation' ),\n\t\t\tthis.getDependencies( 'camera' ),\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tvar result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\tonLoad( result );\n\n\t\t} ).catch( onError );\n\n\t};\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\tGLTFParser.prototype._markDefs = function () {\n\n\t\tvar nodeDefs = this.json.nodes || [];\n\t\tvar skinDefs = this.json.skins || [];\n\t\tvar meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( var skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tvar joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( var i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( var nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tvar nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ]\n\t\t\t\t&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.lightCache, nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\tGLTFParser.prototype._addNodeRef = function ( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t};\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\tGLTFParser.prototype._getNodeRef = function ( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tvar ref = object.clone();\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t};\n\n\tGLTFParser.prototype._invokeOne = function ( func ) {\n\n\t\tvar extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( var i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tvar result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t};\n\n\tGLTFParser.prototype._invokeAll = function ( func ) {\n\n\t\tvar extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tpending.push( func( extensions[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.getDependency = function ( type, index ) {\n\n\t\tvar cacheKey = type + ':' + index;\n\t\tvar dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this.loadNode( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this.loadAnimation( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'light':\n\t\t\t\t\tdependency = this.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].loadLight( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t};\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise>}\n\t */\n\tGLTFParser.prototype.getDependencies = function ( type ) {\n\n\t\tvar dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tvar parser = this;\n\t\t\tvar defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadBuffer = function ( bufferIndex ) {\n\n\t\tvar bufferDef = this.json.buffers[ bufferIndex ];\n\t\tvar loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tvar options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadBufferView = function ( bufferViewIndex ) {\n\n\t\tvar bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tvar byteLength = bufferViewDef.byteLength || 0;\n\t\t\tvar byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadAccessor = function ( accessorIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\n\t\tvar accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\t// Ignore empty accessors, which may be used to declare runtime\n\t\t\t// information about attributes coming from another source (e.g. Draco\n\t\t\t// compression extension).\n\t\t\treturn Promise.resolve( null );\n\n\t\t}\n\n\t\tvar pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tvar bufferView = bufferViews[ 0 ];\n\n\t\t\tvar itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tvar TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tvar elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tvar itemBytes = elementBytes * itemSize;\n\t\t\tvar byteOffset = accessorDef.byteOffset || 0;\n\t\t\tvar byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tvar normalized = accessorDef.normalized === true;\n\t\t\tvar array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tvar ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tvar ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tvar ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tvar itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tvar TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tvar byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tvar byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tvar sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tvar sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadTexture = function ( textureIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar options = this.options;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tvar textureExtensions = textureDef.extensions || {};\n\n\t\tvar source;\n\n\t\tif ( textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ] ) {\n\n\t\t\tsource = json.images[ textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].source ];\n\n\t\t} else {\n\n\t\t\tsource = json.images[ textureDef.source ];\n\n\t\t}\n\n\t\tvar loader;\n\n\t\tif ( source.uri ) {\n\n\t\t\tloader = options.manager.getHandler( source.uri );\n\n\t\t}\n\n\t\tif ( ! loader ) {\n\n\t\t\tloader = textureExtensions[ EXTENSIONS.MSFT_TEXTURE_DDS ]\n\t\t\t\t? parser.extensions[ EXTENSIONS.MSFT_TEXTURE_DDS ].ddsLoader\n\t\t\t\t: this.textureLoader;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, source, loader );\n\n\t};\n\n\tGLTFParser.prototype.loadTextureImage = function ( textureIndex, source, loader ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar options = this.options;\n\n\t\tvar textureDef = json.textures[ textureIndex ];\n\n\t\tvar URL = self.URL || self.webkitURL;\n\n\t\tvar sourceURI = source.uri;\n\t\tvar isObjectURL = false;\n\n\t\tif ( source.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', source.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tvar blob = new Blob( [ bufferView ], { type: source.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tvar onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tresolve( new CanvasTexture( imageBitmap ) );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( textureDef.name ) texture.name = textureDef.name;\n\n\t\t\t// Ignore unknown mime types, like DDS files.\n\t\t\tif ( source.mimeType in MIME_TYPE_FORMATS ) {\n\n\t\t\t\ttexture.format = MIME_TYPE_FORMATS[ source.mimeType ];\n\n\t\t\t}\n\n\t\t\tvar samplers = json.samplers || {};\n\t\t\tvar sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, {\n\t\t\t\ttype: 'textures',\n\t\t\t\tindex: textureIndex\n\t\t\t} );\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.assignTexture = function ( materialParams, mapName, mapDef ) {\n\n\t\tvar parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture.isCompressedTexture ) {\n\n\t\t\t\tswitch ( mapName ) {\n\n\t\t\t\t\tcase 'aoMap':\n\t\t\t\t\tcase 'emissiveMap':\n\t\t\t\t\tcase 'metalnessMap':\n\t\t\t\t\tcase 'normalMap':\n\t\t\t\t\tcase 'roughnessMap':\n\t\t\t\t\t\ttexture.format = RGBFormat;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tvar transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tvar gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accomodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tGLTFParser.prototype.assignFinalMaterial = function ( mesh ) {\n\n\t\tvar geometry = mesh.geometry;\n\t\tvar material = mesh.material;\n\n\t\tvar useVertexTangents = geometry.attributes.tangent !== undefined;\n\t\tvar useVertexColors = geometry.attributes.color !== undefined;\n\t\tvar useFlatShading = geometry.attributes.normal === undefined;\n\t\tvar useSkinning = mesh.isSkinnedMesh === true;\n\t\tvar useMorphTargets = Object.keys( geometry.morphAttributes ).length > 0;\n\t\tvar useMorphNormals = useMorphTargets && geometry.morphAttributes.normal !== undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tvar cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tvar pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tvar cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tvar lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useVertexTangents || useVertexColors || useFlatShading || useSkinning || useMorphTargets ) {\n\n\t\t\tvar cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( material.isGLTFSpecularGlossinessMaterial ) cacheKey += 'specular-glossiness:';\n\t\t\tif ( useSkinning ) cacheKey += 'skinning:';\n\t\t\tif ( useVertexTangents ) cacheKey += 'vertex-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\t\t\tif ( useMorphTargets ) cacheKey += 'morph-targets:';\n\t\t\tif ( useMorphNormals ) cacheKey += 'morph-normals:';\n\n\t\t\tvar cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useSkinning ) cachedMaterial.skinning = true;\n\t\t\t\tif ( useVertexTangents ) cachedMaterial.vertexTangents = true;\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\t\t\t\tif ( useMorphTargets ) cachedMaterial.morphTargets = true;\n\t\t\t\tif ( useMorphNormals ) cachedMaterial.morphNormals = true;\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\t// workarounds for mesh and geometry\n\n\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t}\n\n\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\tif ( material.normalScale && ! useVertexTangents ) {\n\n\t\t\tmaterial.normalScale.y = - material.normalScale.y;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalScale && ! useVertexTangents ) {\n\n\t\t\tmaterial.clearcoatNormalScale.y = - material.clearcoatNormalScale.y;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t};\n\n\tGLTFParser.prototype.getMaterialType = function ( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadMaterial = function ( materialIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\t\tvar materialDef = json.materials[ materialIndex ];\n\n\t\tvar materialType;\n\t\tvar materialParams = {};\n\t\tvar materialExtensions = materialDef.extensions || {};\n\n\t\tvar pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ] ) {\n\n\t\t\tvar sgExtension = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ];\n\t\t\tmaterialType = sgExtension.getMaterialType();\n\t\t\tpending.push( sgExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else if ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tvar kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tvar metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tvar array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tvar alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tmaterialParams.normalScale.set( materialDef.normalTexture.scale, materialDef.normalTexture.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tmaterialParams.emissive = new Color().fromArray( materialDef.emissiveFactor );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tvar material;\n\n\t\t\tif ( materialType === GLTFMeshStandardSGMaterial ) {\n\n\t\t\t\tmaterial = extensions[ EXTENSIONS.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS ].createMaterial( materialParams );\n\n\t\t\t} else {\n\n\t\t\t\tmaterial = new materialType( materialParams );\n\n\t\t\t}\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\t// baseColorTexture, emissiveTexture, and specularGlossinessTexture use sRGB encoding.\n\t\t\tif ( material.map ) material.map.encoding = sRGBEncoding;\n\t\t\tif ( material.emissiveMap ) material.emissiveMap.encoding = sRGBEncoding;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { type: 'materials', index: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * @param {BufferGeometry} geometry\n\t * @param {GLTF.Primitive} primitiveDef\n\t * @param {GLTFParser} parser\n\t */\n\tfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\t\tvar attributes = primitiveDef.attributes;\n\n\t\tvar box = new Box3();\n\n\t\tif ( attributes.POSITION !== undefined ) {\n\n\t\t\tvar accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\t\tvar min = accessor.min;\n\t\t\tvar max = accessor.max;\n\n\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\tbox.set(\n\t\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] ) );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar targets = primitiveDef.targets;\n\n\t\tif ( targets !== undefined ) {\n\n\t\t\tvar maxDisplacement = new Vector3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\tfor ( var i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\t\tvar target = targets[ i ];\n\n\t\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\t\tvar accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\t\tvar min = accessor.min;\n\t\t\t\t\tvar max = accessor.max;\n\n\t\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\t\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\t\tbox.expandByVector( maxDisplacement );\n\n\t\t}\n\n\t\tgeometry.boundingBox = box;\n\n\t\tvar sphere = new Sphere();\n\n\t\tbox.getCenter( sphere.center );\n\t\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\t\tgeometry.boundingSphere = sphere;\n\n\t}\n\n\t/**\n\t * @param {BufferGeometry} geometry\n\t * @param {GLTF.Primitive} primitiveDef\n\t * @param {GLTFParser} parser\n\t * @return {Promise}\n\t */\n\tfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\t\tvar attributes = primitiveDef.attributes;\n\n\t\tvar pending = [];\n\n\t\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t\t.then( function ( accessor ) {\n\n\t\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tfor ( var gltfAttributeName in attributes ) {\n\n\t\t\tvar threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t\t}\n\n\t\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\t\tvar accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\t\tgeometry.setIndex( accessor );\n\n\t\t\t} );\n\n\t\t\tpending.push( accessor );\n\n\t\t}\n\n\t\tassignExtrasToUserData( geometry, primitiveDef );\n\n\t\tcomputeBounds( geometry, primitiveDef, parser );\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\treturn primitiveDef.targets !== undefined\n\t\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t\t: geometry;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * @param {BufferGeometry} geometry\n\t * @param {Number} drawMode\n\t * @return {BufferGeometry}\n\t */\n\tfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\t\tvar index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tvar indices = [];\n\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( var i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tvar numberOfTriangles = index.count - 2;\n\t\tvar newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( var i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( var i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tvar newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\n\t\treturn newGeometry;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array} primitives\n\t * @return {Promise>}\n\t */\n\tGLTFParser.prototype.loadGeometries = function ( primitives ) {\n\n\t\tvar parser = this;\n\t\tvar extensions = this.extensions;\n\t\tvar cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tvar primitive = primitives[ i ];\n\t\t\tvar cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tvar cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tvar geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadMesh = function ( meshIndex ) {\n\n\t\tvar parser = this;\n\t\tvar json = this.json;\n\n\t\tvar meshDef = json.meshes[ meshIndex ];\n\t\tvar primitives = meshDef.primitives;\n\n\t\tvar pending = [];\n\n\t\tfor ( var i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tvar material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tvar materials = results.slice( 0, results.length - 1 );\n\t\t\tvar geometries = results[ results.length - 1 ];\n\n\t\t\tvar meshes = [];\n\n\t\t\tfor ( var i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tvar geometry = geometries[ i ];\n\t\t\t\tvar primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tvar mesh;\n\n\t\t\t\tvar material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = meshDef.name || ( 'mesh_' + meshIndex );\n\n\t\t\t\tif ( geometries.length > 1 ) mesh.name += '_' + i;\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadCamera = function ( cameraIndex ) {\n\n\t\tvar camera;\n\t\tvar cameraDef = this.json.cameras[ cameraIndex ];\n\t\tvar params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = cameraDef.name;\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadSkin = function ( skinIndex ) {\n\n\t\tvar skinDef = this.json.skins[ skinIndex ];\n\n\t\tvar skinEntry = { joints: skinDef.joints };\n\n\t\tif ( skinDef.inverseBindMatrices === undefined ) {\n\n\t\t\treturn Promise.resolve( skinEntry );\n\n\t\t}\n\n\t\treturn this.getDependency( 'accessor', skinDef.inverseBindMatrices ).then( function ( accessor ) {\n\n\t\t\tskinEntry.inverseBindMatrices = accessor;\n\n\t\t\treturn skinEntry;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadAnimation = function ( animationIndex ) {\n\n\t\tvar json = this.json;\n\n\t\tvar animationDef = json.animations[ animationIndex ];\n\n\t\tvar pendingNodes = [];\n\t\tvar pendingInputAccessors = [];\n\t\tvar pendingOutputAccessors = [];\n\t\tvar pendingSamplers = [];\n\t\tvar pendingTargets = [];\n\n\t\tfor ( var i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tvar channel = animationDef.channels[ i ];\n\t\t\tvar sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tvar target = channel.target;\n\t\t\tvar name = target.node !== undefined ? target.node : target.id; // NOTE: target.id is deprecated.\n\t\t\tvar input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tvar output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tvar nodes = dependencies[ 0 ];\n\t\t\tvar inputAccessors = dependencies[ 1 ];\n\t\t\tvar outputAccessors = dependencies[ 2 ];\n\t\t\tvar samplers = dependencies[ 3 ];\n\t\t\tvar targets = dependencies[ 4 ];\n\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tvar node = nodes[ i ];\n\t\t\t\tvar inputAccessor = inputAccessors[ i ];\n\t\t\t\tvar outputAccessor = outputAccessors[ i ];\n\t\t\t\tvar sampler = samplers[ i ];\n\t\t\t\tvar target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tnode.updateMatrix();\n\t\t\t\tnode.matrixAutoUpdate = true;\n\n\t\t\t\tvar TypedKeyframeTrack;\n\n\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tvar targetName = node.name ? node.name : node.uuid;\n\n\t\t\t\tvar interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\t\t\t\tvar targetNames = [];\n\n\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\t// Node may be a Group (glTF mesh with several primitives) or a Mesh.\n\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\tif ( object.isMesh === true && object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t}\n\n\t\t\t\tvar outputArray = outputAccessor.array;\n\n\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\tvar scale;\n\n\t\t\t\t\tif ( outputArray.constructor === Int8Array ) {\n\n\t\t\t\t\t\tscale = 1 / 127;\n\n\t\t\t\t\t} else if ( outputArray.constructor === Uint8Array ) {\n\n\t\t\t\t\t\tscale = 1 / 255;\n\n\t\t\t\t\t} else if ( outputArray.constructor == Int16Array ) {\n\n\t\t\t\t\t\tscale = 1 / 32767;\n\n\t\t\t\t\t} else if ( outputArray.constructor === Uint16Array ) {\n\n\t\t\t\t\t\tscale = 1 / 65535;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported output accessor component type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\tfor ( var j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar track = new TypedKeyframeTrack(\n\t\t\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\t\t\tinputAccessor.array,\n\t\t\t\t\t\toutputArray,\n\t\t\t\t\t\tinterpolation\n\t\t\t\t\t);\n\n\t\t\t\t\t// Override interpolation with custom factory method.\n\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\t\t\t\t\treturn new GLTFCubicSplineInterpolant( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\t\treturn new AnimationClip( name, undefined, tracks );\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadNode = function ( nodeIndex ) {\n\n\t\tvar json = this.json;\n\t\tvar extensions = this.extensions;\n\t\tvar parser = this;\n\n\t\tvar nodeDef = json.nodes[ nodeIndex ];\n\n\t\treturn ( function () {\n\n\t\t\tvar pending = [];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tpending.push( parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\t\t\tvar node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\t\t\tfor ( var i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ]\n\t\t\t\t&& nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light !== undefined ) {\n\n\t\t\t\tvar lightIndex = nodeDef.extensions[ EXTENSIONS.KHR_LIGHTS_PUNCTUAL ].light;\n\n\t\t\t\tpending.push( parser.getDependency( 'light', lightIndex ).then( function ( light ) {\n\n\t\t\t\t\treturn parser._getNodeRef( parser.lightCache, lightIndex, light );\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending );\n\n\t\t}() ).then( function ( objects ) {\n\n\t\t\tvar node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( var i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = PropertyBinding.sanitizeNodeName( nodeDef.name );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tvar matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tparser.associations.set( node, { type: 'nodes', index: nodeIndex } );\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t};\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise}\n\t */\n\tGLTFParser.prototype.loadScene = function () {\n\n\t\t// scene node hierachy builder\n\n\t\tfunction buildNodeHierachy( nodeId, parentObject, json, parser ) {\n\n\t\t\tvar nodeDef = json.nodes[ nodeId ];\n\n\t\t\treturn parser.getDependency( 'node', nodeId ).then( function ( node ) {\n\n\t\t\t\tif ( nodeDef.skin === undefined ) return node;\n\n\t\t\t\t// build skeleton here as well\n\n\t\t\t\tvar skinEntry;\n\n\t\t\t\treturn parser.getDependency( 'skin', nodeDef.skin ).then( function ( skin ) {\n\n\t\t\t\t\tskinEntry = skin;\n\n\t\t\t\t\tvar pendingJoints = [];\n\n\t\t\t\t\tfor ( var i = 0, il = skinEntry.joints.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tpendingJoints.push( parser.getDependency( 'node', skinEntry.joints[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Promise.all( pendingJoints );\n\n\t\t\t\t} ).then( function ( jointNodes ) {\n\n\t\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\t\tif ( ! mesh.isMesh ) return;\n\n\t\t\t\t\t\tvar bones = [];\n\t\t\t\t\t\tvar boneInverses = [];\n\n\t\t\t\t\t\tfor ( var j = 0, jl = jointNodes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar jointNode = jointNodes[ j ];\n\n\t\t\t\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\t\t\t\tvar mat = new Matrix4();\n\n\t\t\t\t\t\t\t\tif ( skinEntry.inverseBindMatrices !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tmat.fromArray( skinEntry.inverseBindMatrices.array, j * 16 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinEntry.joints[ j ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmesh.bind( new Skeleton( bones, boneInverses ), mesh.matrixWorld );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} );\n\n\t\t\t} ).then( function ( node ) {\n\n\t\t\t\t// build node hierachy\n\n\t\t\t\tparentObject.add( node );\n\n\t\t\t\tvar pending = [];\n\n\t\t\t\tif ( nodeDef.children ) {\n\n\t\t\t\t\tvar children = nodeDef.children;\n\n\t\t\t\t\tfor ( var i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar child = children[ i ];\n\t\t\t\t\t\tpending.push( buildNodeHierachy( child, node, json, parser ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn Promise.all( pending );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn function loadScene( sceneIndex ) {\n\n\t\t\tvar json = this.json;\n\t\t\tvar extensions = this.extensions;\n\t\t\tvar sceneDef = this.json.scenes[ sceneIndex ];\n\t\t\tvar parser = this;\n\n\t\t\t// Loader returns Group, not Scene.\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\t\tvar scene = new Group();\n\t\t\tif ( sceneDef.name ) scene.name = sceneDef.name;\n\n\t\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\t\tvar nodeIds = sceneDef.nodes || [];\n\n\t\t\tvar pending = [];\n\n\t\t\tfor ( var i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\t\tpending.push( buildNodeHierachy( nodeIds[ i ], scene, json, parser ) );\n\n\t\t\t}\n\n\t\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\t\treturn scene;\n\n\t\t\t} );\n\n\t\t};\n\n\t}();\n\n\treturn GLTFLoader;\n\n} )();\n\nexport { GLTFLoader };\n","/** @license zlib.js 2012 - imaya [ https://github.com/imaya/zlib.js ] The MIT License */var mod={}, l=void 0,aa=mod;function r(c,d){var a=c.split(\".\"),b=aa;!(a[0]in b)&&b.execScript&&b.execScript(\"var \"+a[0]);for(var e;a.length&&(e=a.shift());)!a.length&&d!==l?b[e]=d:b=b[e]?b[e]:b[e]={}};var t=\"undefined\"!==typeof Uint8Array&&\"undefined\"!==typeof Uint16Array&&\"undefined\"!==typeof Uint32Array&&\"undefined\"!==typeof DataView;function v(c){var d=c.length,a=0,b=Number.POSITIVE_INFINITY,e,f,g,h,k,m,n,p,s,x;for(p=0;pa&&(a=c[p]),c[p]>=1;x=g<<16|p;for(s=m;s>>=1;switch(c){case 0:var d=this.input,a=this.a,b=this.c,e=this.b,f=d.length,g=l,h=l,k=b.length,m=l;this.d=this.f=0;if(a+1>=f)throw Error(\"invalid uncompressed block header: LEN\");g=d[a++]|d[a++]<<8;if(a+1>=f)throw Error(\"invalid uncompressed block header: NLEN\");h=d[a++]|d[a++]<<8;if(g===~h)throw Error(\"invalid uncompressed block header: length verify\");if(a+g>d.length)throw Error(\"input buffer is broken\");switch(this.i){case A:for(;e+\ng>b.length;){m=k-e;g-=m;if(t)b.set(d.subarray(a,a+m),e),e+=m,a+=m;else for(;m--;)b[e++]=d[a++];this.b=e;b=this.e();e=this.b}break;case y:for(;e+g>b.length;)b=this.e({p:2});break;default:throw Error(\"invalid inflate mode\");}if(t)b.set(d.subarray(a,a+g),e),e+=g,a+=g;else for(;g--;)b[e++]=d[a++];this.a=a;this.b=e;this.c=b;break;case 1:this.j(ba,ca);break;case 2:for(var n=C(this,5)+257,p=C(this,5)+1,s=C(this,4)+4,x=new (t?Uint8Array:Array)(D.length),S=l,T=l,U=l,u=l,M=l,F=l,z=l,q=l,V=l,q=0;q=P?8:255>=P?9:279>=P?7:8;var ba=v(O),Q=new (t?Uint8Array:Array)(30),R,ga;R=0;for(ga=Q.length;R=g)throw Error(\"input buffer is broken\");a|=e[f++]<>>d;c.d=b-d;c.a=f;return h}\nfunction E(c,d){for(var a=c.f,b=c.d,e=c.input,f=c.a,g=e.length,h=d[0],k=d[1],m,n;b=g);)a|=e[f++]<>>16;if(n>b)throw Error(\"invalid code length: \"+n);c.f=a>>n;c.d=b-n;c.a=f;return m&65535}\nw.prototype.j=function(c,d){var a=this.c,b=this.b;this.o=c;for(var e=a.length-258,f,g,h,k;256!==(f=E(this,c));)if(256>f)b>=e&&(this.b=b,a=this.e(),b=this.b),a[b++]=f;else{g=f-257;k=I[g];0=e&&(this.b=b,a=this.e(),b=this.b);for(;k--;)a[b]=a[b++-h]}for(;8<=this.d;)this.d-=8,this.a--;this.b=b};\nw.prototype.w=function(c,d){var a=this.c,b=this.b;this.o=c;for(var e=a.length,f,g,h,k;256!==(f=E(this,c));)if(256>f)b>=e&&(a=this.e(),e=a.length),a[b++]=f;else{g=f-257;k=I[g];0e&&(a=this.e(),e=a.length);for(;k--;)a[b]=a[b++-h]}for(;8<=this.d;)this.d-=8,this.a--;this.b=b};\nw.prototype.e=function(){var c=new (t?Uint8Array:Array)(this.b-32768),d=this.b-32768,a,b,e=this.c;if(t)c.set(e.subarray(32768,c.length));else{a=0;for(b=c.length;aa;++a)e[a]=e[d+a];this.b=32768;return e};\nw.prototype.z=function(c){var d,a=this.input.length/this.a+1|0,b,e,f,g=this.input,h=this.c;c&&(\"number\"===typeof c.p&&(a=c.p),\"number\"===typeof c.u&&(a+=c.u));2>a?(b=(g.length-this.a)/this.o[2],f=258*(b/2)|0,e=fd&&(this.c.length=d),c=this.c);return this.buffer=c};function W(c,d){var a,b;this.input=c;this.a=0;if(d||!(d={}))d.index&&(this.a=d.index),d.verify&&(this.A=d.verify);a=c[this.a++];b=c[this.a++];switch(a&15){case ha:this.method=ha;break;default:throw Error(\"unsupported compression method\");}if(0!==((a<<8)+b)%31)throw Error(\"invalid fcheck flag:\"+((a<<8)+b)%31);if(b&32)throw Error(\"fdict flag is not supported\");this.q=new w(c,{index:this.a,bufferSize:d.bufferSize,bufferType:d.bufferType,resize:d.resize})}\nW.prototype.k=function(){var c=this.input,d,a;d=this.q.k();this.a=this.q.a;if(this.A){a=(c[this.a++]<<24|c[this.a++]<<16|c[this.a++]<<8|c[this.a++])>>>0;var b=d;if(\"string\"===typeof b){var e=b.split(\"\"),f,g;f=0;for(g=e.length;f>>0;b=e}for(var h=1,k=0,m=b.length,n,p=0;0>>0)throw Error(\"invalid adler-32 checksum\");}return d};var ha=8;r(\"Zlib.Inflate\",W);r(\"Zlib.Inflate.prototype.decompress\",W.prototype.k);var X={ADAPTIVE:B.s,BLOCK:B.t},Y,Z,$,ia;if(Object.keys)Y=Object.keys(X);else for(Z in Y=[],$=0,X)Y[$++]=Z;$=0;for(ia=Y.length;$= U[ n ] ) {\n\n\t\t\treturn n - 1;\n\n\t\t}\n\n\t\tif ( u <= U[ p ] ) {\n\n\t\t\treturn p;\n\n\t\t}\n\n\t\tvar low = p;\n\t\tvar high = n;\n\t\tvar mid = Math.floor( ( low + high ) / 2 );\n\n\t\twhile ( u < U[ mid ] || u >= U[ mid + 1 ] ) {\n\n\t\t\tif ( u < U[ mid ] ) {\n\n\t\t\t\thigh = mid;\n\n\t\t\t} else {\n\n\t\t\t\tlow = mid;\n\n\t\t\t}\n\n\t\t\tmid = Math.floor( ( low + high ) / 2 );\n\n\t\t}\n\n\t\treturn mid;\n\n\t},\n\n\n\t/*\n\tCalculate basis functions. See The NURBS Book, page 70, algorithm A2.2\n\n\tspan : span in which u lies\n\tu : parametric point\n\tp : degree\n\tU : knot vector\n\n\treturns array[p+1] with basis functions values.\n\t*/\n\tcalcBasisFunctions: function ( span, u, p, U ) {\n\n\t\tvar N = [];\n\t\tvar left = [];\n\t\tvar right = [];\n\t\tN[ 0 ] = 1.0;\n\n\t\tfor ( var j = 1; j <= p; ++ j ) {\n\n\t\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\t\tright[ j ] = U[ span + j ] - u;\n\n\t\t\tvar saved = 0.0;\n\n\t\t\tfor ( var r = 0; r < j; ++ r ) {\n\n\t\t\t\tvar rv = right[ r + 1 ];\n\t\t\t\tvar lv = left[ j - r ];\n\t\t\t\tvar temp = N[ r ] / ( rv + lv );\n\t\t\t\tN[ r ] = saved + rv * temp;\n\t\t\t\tsaved = lv * temp;\n\n\t\t\t }\n\n\t\t\t N[ j ] = saved;\n\n\t\t }\n\n\t\t return N;\n\n\t},\n\n\n\t/*\n\tCalculate B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n\n\tp : degree of B-Spline\n\tU : knot vector\n\tP : control points (x, y, z, w)\n\tu : parametric point\n\n\treturns point for given u\n\t*/\n\tcalcBSplinePoint: function ( p, U, P, u ) {\n\n\t\tvar span = this.findSpan( p, u, U );\n\t\tvar N = this.calcBasisFunctions( span, u, p, U );\n\t\tvar C = new Vector4( 0, 0, 0, 0 );\n\n\t\tfor ( var j = 0; j <= p; ++ j ) {\n\n\t\t\tvar point = P[ span - p + j ];\n\t\t\tvar Nj = N[ j ];\n\t\t\tvar wNj = point.w * Nj;\n\t\t\tC.x += point.x * wNj;\n\t\t\tC.y += point.y * wNj;\n\t\t\tC.z += point.z * wNj;\n\t\t\tC.w += point.w * Nj;\n\n\t\t}\n\n\t\treturn C;\n\n\t},\n\n\n\t/*\n\tCalculate basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n\n\tspan : span in which u lies\n\tu : parametric point\n\tp : degree\n\tn : number of derivatives to calculate\n\tU : knot vector\n\n\treturns array[n+1][p+1] with basis functions derivatives\n\t*/\n\tcalcBasisFunctionDerivatives: function ( span, u, p, n, U ) {\n\n\t\tvar zeroArr = [];\n\t\tfor ( var i = 0; i <= p; ++ i )\n\t\t\tzeroArr[ i ] = 0.0;\n\n\t\tvar ders = [];\n\t\tfor ( var i = 0; i <= n; ++ i )\n\t\t\tders[ i ] = zeroArr.slice( 0 );\n\n\t\tvar ndu = [];\n\t\tfor ( var i = 0; i <= p; ++ i )\n\t\t\tndu[ i ] = zeroArr.slice( 0 );\n\n\t\tndu[ 0 ][ 0 ] = 1.0;\n\n\t\tvar left = zeroArr.slice( 0 );\n\t\tvar right = zeroArr.slice( 0 );\n\n\t\tfor ( var j = 1; j <= p; ++ j ) {\n\n\t\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\t\tright[ j ] = U[ span + j ] - u;\n\n\t\t\tvar saved = 0.0;\n\n\t\t\tfor ( var r = 0; r < j; ++ r ) {\n\n\t\t\t\tvar rv = right[ r + 1 ];\n\t\t\t\tvar lv = left[ j - r ];\n\t\t\t\tndu[ j ][ r ] = rv + lv;\n\n\t\t\t\tvar temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];\n\t\t\t\tndu[ r ][ j ] = saved + rv * temp;\n\t\t\t\tsaved = lv * temp;\n\n\t\t\t}\n\n\t\t\tndu[ j ][ j ] = saved;\n\n\t\t}\n\n\t\tfor ( var j = 0; j <= p; ++ j ) {\n\n\t\t\tders[ 0 ][ j ] = ndu[ j ][ p ];\n\n\t\t}\n\n\t\tfor ( var r = 0; r <= p; ++ r ) {\n\n\t\t\tvar s1 = 0;\n\t\t\tvar s2 = 1;\n\n\t\t\tvar a = [];\n\t\t\tfor ( var i = 0; i <= p; ++ i ) {\n\n\t\t\t\ta[ i ] = zeroArr.slice( 0 );\n\n\t\t\t}\n\n\t\t\ta[ 0 ][ 0 ] = 1.0;\n\n\t\t\tfor ( var k = 1; k <= n; ++ k ) {\n\n\t\t\t\tvar d = 0.0;\n\t\t\t\tvar rk = r - k;\n\t\t\t\tvar pk = p - k;\n\n\t\t\t\tif ( r >= k ) {\n\n\t\t\t\t\ta[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];\n\t\t\t\t\td = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];\n\n\t\t\t\t}\n\n\t\t\t\tvar j1 = ( rk >= - 1 ) ? 1 : - rk;\n\t\t\t\tvar j2 = ( r - 1 <= pk ) ? k - 1 : p - r;\n\n\t\t\t\tfor ( var j = j1; j <= j2; ++ j ) {\n\n\t\t\t\t\ta[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];\n\t\t\t\t\td += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( r <= pk ) {\n\n\t\t\t\t\ta[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];\n\t\t\t\t\td += a[ s2 ][ k ] * ndu[ r ][ pk ];\n\n\t\t\t\t}\n\n\t\t\t\tders[ k ][ r ] = d;\n\n\t\t\t\tvar j = s1;\n\t\t\t\ts1 = s2;\n\t\t\t\ts2 = j;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar r = p;\n\n\t\tfor ( var k = 1; k <= n; ++ k ) {\n\n\t\t\tfor ( var j = 0; j <= p; ++ j ) {\n\n\t\t\t\tders[ k ][ j ] *= r;\n\n\t\t\t}\n\n\t\t\tr *= p - k;\n\n\t\t}\n\n\t\treturn ders;\n\n\t},\n\n\n\t/*\n\t\tCalculate derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n\n\t\tp : degree\n\t\tU : knot vector\n\t\tP : control points\n\t\tu : Parametric points\n\t\tnd : number of derivatives\n\n\t\treturns array[d+1] with derivatives\n\t\t*/\n\tcalcBSplineDerivatives: function ( p, U, P, u, nd ) {\n\n\t\tvar du = nd < p ? nd : p;\n\t\tvar CK = [];\n\t\tvar span = this.findSpan( p, u, U );\n\t\tvar nders = this.calcBasisFunctionDerivatives( span, u, p, du, U );\n\t\tvar Pw = [];\n\n\t\tfor ( var i = 0; i < P.length; ++ i ) {\n\n\t\t\tvar point = P[ i ].clone();\n\t\t\tvar w = point.w;\n\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\n\t\t\tPw[ i ] = point;\n\n\t\t}\n\n\t\tfor ( var k = 0; k <= du; ++ k ) {\n\n\t\t\tvar point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );\n\n\t\t\tfor ( var j = 1; j <= p; ++ j ) {\n\n\t\t\t\tpoint.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );\n\n\t\t\t}\n\n\t\t\tCK[ k ] = point;\n\n\t\t}\n\n\t\tfor ( var k = du + 1; k <= nd + 1; ++ k ) {\n\n\t\t\tCK[ k ] = new Vector4( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn CK;\n\n\t},\n\n\n\t/*\n\tCalculate \"K over I\"\n\n\treturns k!/(i!(k-i)!)\n\t*/\n\tcalcKoverI: function ( k, i ) {\n\n\t\tvar nom = 1;\n\n\t\tfor ( var j = 2; j <= k; ++ j ) {\n\n\t\t\tnom *= j;\n\n\t\t}\n\n\t\tvar denom = 1;\n\n\t\tfor ( var j = 2; j <= i; ++ j ) {\n\n\t\t\tdenom *= j;\n\n\t\t}\n\n\t\tfor ( var j = 2; j <= k - i; ++ j ) {\n\n\t\t\tdenom *= j;\n\n\t\t}\n\n\t\treturn nom / denom;\n\n\t},\n\n\n\t/*\n\tCalculate derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n\n\tPders : result of function calcBSplineDerivatives\n\n\treturns array with derivatives for rational curve.\n\t*/\n\tcalcRationalCurveDerivatives: function ( Pders ) {\n\n\t\tvar nd = Pders.length;\n\t\tvar Aders = [];\n\t\tvar wders = [];\n\n\t\tfor ( var i = 0; i < nd; ++ i ) {\n\n\t\t\tvar point = Pders[ i ];\n\t\t\tAders[ i ] = new Vector3( point.x, point.y, point.z );\n\t\t\twders[ i ] = point.w;\n\n\t\t}\n\n\t\tvar CK = [];\n\n\t\tfor ( var k = 0; k < nd; ++ k ) {\n\n\t\t\tvar v = Aders[ k ].clone();\n\n\t\t\tfor ( var i = 1; i <= k; ++ i ) {\n\n\t\t\t\tv.sub( CK[ k - i ].clone().multiplyScalar( this.calcKoverI( k, i ) * wders[ i ] ) );\n\n\t\t\t}\n\n\t\t\tCK[ k ] = v.divideScalar( wders[ 0 ] );\n\n\t\t}\n\n\t\treturn CK;\n\n\t},\n\n\n\t/*\n\tCalculate NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n\n\tp : degree\n\tU : knot vector\n\tP : control points in homogeneous space\n\tu : parametric points\n\tnd : number of derivatives\n\n\treturns array with derivatives.\n\t*/\n\tcalcNURBSDerivatives: function ( p, U, P, u, nd ) {\n\n\t\tvar Pders = this.calcBSplineDerivatives( p, U, P, u, nd );\n\t\treturn this.calcRationalCurveDerivatives( Pders );\n\n\t},\n\n\n\t/*\n\tCalculate rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n\n\tp1, p2 : degrees of B-Spline surface\n\tU1, U2 : knot vectors\n\tP : control points (x, y, z, w)\n\tu, v : parametric values\n\n\treturns point for given (u, v)\n\t*/\n\tcalcSurfacePoint: function ( p, q, U, V, P, u, v, target ) {\n\n\t\tvar uspan = this.findSpan( p, u, U );\n\t\tvar vspan = this.findSpan( q, v, V );\n\t\tvar Nu = this.calcBasisFunctions( uspan, u, p, U );\n\t\tvar Nv = this.calcBasisFunctions( vspan, v, q, V );\n\t\tvar temp = [];\n\n\t\tfor ( var l = 0; l <= q; ++ l ) {\n\n\t\t\ttemp[ l ] = new Vector4( 0, 0, 0, 0 );\n\t\t\tfor ( var k = 0; k <= p; ++ k ) {\n\n\t\t\t\tvar point = P[ uspan - p + k ][ vspan - q + l ].clone();\n\t\t\t\tvar w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar Sw = new Vector4( 0, 0, 0, 0 );\n\t\tfor ( var l = 0; l <= q; ++ l ) {\n\n\t\t\tSw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );\n\n\t\t}\n\n\t\tSw.divideScalar( Sw.w );\n\t\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n\t}\n\n};\n\nexport { NURBSUtils };\n","import {\n\tCurve,\n\tVector3,\n\tVector4\n} from \"../../../build/three.module.js\";\nimport { NURBSUtils } from \"../curves/NURBSUtils.js\";\n/**\n * NURBS curve object\n *\n * Derives from Curve, overriding getPoint and getTangent.\n *\n * Implementation is based on (x, y [, z=0 [, w=1]]) control points with w=weight.\n *\n **/\n\nvar NURBSCurve = function ( degree, knots /* array of reals */, controlPoints /* array of Vector(2|3|4) */, startKnot /* index in knots */, endKnot /* index in knots */ ) {\n\n\tCurve.call( this );\n\n\tthis.degree = degree;\n\tthis.knots = knots;\n\tthis.controlPoints = [];\n\t// Used by periodic NURBS to remove hidden spans\n\tthis.startKnot = startKnot || 0;\n\tthis.endKnot = endKnot || ( this.knots.length - 1 );\n\tfor ( var i = 0; i < controlPoints.length; ++ i ) {\n\n\t\t// ensure Vector4 for control points\n\t\tvar point = controlPoints[ i ];\n\t\tthis.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t}\n\n};\n\n\nNURBSCurve.prototype = Object.create( Curve.prototype );\nNURBSCurve.prototype.constructor = NURBSCurve;\n\n\nNURBSCurve.prototype.getPoint = function ( t, optionalTarget ) {\n\n\tvar point = optionalTarget || new Vector3();\n\n\tvar u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u\n\n\t// following results in (wx, wy, wz, w) homogeneous point\n\tvar hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );\n\n\tif ( hpoint.w != 1.0 ) {\n\n\t\t// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\thpoint.divideScalar( hpoint.w );\n\n\t}\n\n\treturn point.set( hpoint.x, hpoint.y, hpoint.z );\n\n};\n\n\nNURBSCurve.prototype.getTangent = function ( t, optionalTarget ) {\n\n\tvar tangent = optionalTarget || new Vector3();\n\n\tvar u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );\n\tvar ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );\n\ttangent.copy( ders[ 1 ] ).normalize();\n\n\treturn tangent;\n\n};\n\nexport { NURBSCurve };\n","import {\n\tAmbientLight,\n\tAnimationClip,\n\tBone,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tEquirectangularReflectionMapping,\n\tEuler,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLoader,\n\tLoaderUtils,\n\tMathUtils,\n\tMatrix3,\n\tMatrix4,\n\tMesh,\n\tMeshLambertMaterial,\n\tMeshPhongMaterial,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tUint16BufferAttribute,\n\tVector3,\n\tVector4,\n\tVectorKeyframeTrack,\n\tsRGBEncoding\n} from \"../../../build/three.module.js\";\nimport { Inflate } from \"../libs/inflate.module.min.js\";\nimport { NURBSCurve } from \"../curves/NURBSCurve.js\";\n/**\n * Loader loads FBX file and generates Group representing FBX scene.\n * Requires FBX file to be >= 7.0 and in ASCII or >= 6400 in Binary format\n * Versions lower than this may load but will probably have errors\n *\n * Needs Support:\n * Morph normals / blend shape normals\n *\n * FBX format references:\n * \thttps://wiki.blender.org/index.php/User:Mont29/Foundation/FBX_File_Structure\n * \thttp://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html (C++ SDK reference)\n *\n * \tBinary format specification:\n *\t\thttps://code.blender.org/2013/08/fbx-binary-file-format-specification/\n */\n\n\nvar FBXLoader = ( function () {\n\n\tvar fbxTree;\n\tvar connections;\n\tvar sceneGraph;\n\n\tfunction FBXLoader( manager ) {\n\n\t\tLoader.call( this, manager );\n\n\t}\n\n\tFBXLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\t\tconstructor: FBXLoader,\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( scope.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.setRequestHeader( scope.requestHeader );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tonLoad( scope.parse( buffer, path ) );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tif ( onError ) {\n\n\t\t\t\t\t\tonError( e );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( FBXBuffer, path ) {\n\n\t\t\tif ( isFbxFormatBinary( FBXBuffer ) ) {\n\n\t\t\t\tfbxTree = new BinaryParser().parse( FBXBuffer );\n\n\t\t\t} else {\n\n\t\t\t\tvar FBXText = convertArrayBufferToString( FBXBuffer );\n\n\t\t\t\tif ( ! isFbxFormatASCII( FBXText ) ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown format.' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( getFbxVersion( FBXText ) < 7000 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion( FBXText ) );\n\n\t\t\t\t}\n\n\t\t\t\tfbxTree = new TextParser().parse( FBXText );\n\n\t\t\t}\n\n\t\t\t// console.log( fbxTree );\n\n\t\t\tvar textureLoader = new TextureLoader( this.manager ).setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\t\treturn new FBXTreeParser( textureLoader, this.manager ).parse( fbxTree );\n\n\t\t}\n\n\t} );\n\n\t// Parse the FBXTree object returned by the BinaryParser or TextParser and return a Group\n\tfunction FBXTreeParser( textureLoader, manager ) {\n\n\t\tthis.textureLoader = textureLoader;\n\t\tthis.manager = manager;\n\n\t}\n\n\tFBXTreeParser.prototype = {\n\n\t\tconstructor: FBXTreeParser,\n\n\t\tparse: function () {\n\n\t\t\tconnections = this.parseConnections();\n\n\t\t\tvar images = this.parseImages();\n\t\t\tvar textures = this.parseTextures( images );\n\t\t\tvar materials = this.parseMaterials( textures );\n\t\t\tvar deformers = this.parseDeformers();\n\t\t\tvar geometryMap = new GeometryParser().parse( deformers );\n\n\t\t\tthis.parseScene( deformers, geometryMap, materials );\n\n\t\t\treturn sceneGraph;\n\n\t\t},\n\n\t\t// Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry )\n\t\t// and details the connection type\n\t\tparseConnections: function () {\n\n\t\t\tvar connectionMap = new Map();\n\n\t\t\tif ( 'Connections' in fbxTree ) {\n\n\t\t\t\tvar rawConnections = fbxTree.Connections.connections;\n\n\t\t\t\trawConnections.forEach( function ( rawConnection ) {\n\n\t\t\t\t\tvar fromID = rawConnection[ 0 ];\n\t\t\t\t\tvar toID = rawConnection[ 1 ];\n\t\t\t\t\tvar relationship = rawConnection[ 2 ];\n\n\t\t\t\t\tif ( ! connectionMap.has( fromID ) ) {\n\n\t\t\t\t\t\tconnectionMap.set( fromID, {\n\t\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\t\tchildren: []\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar parentRelationship = { ID: toID, relationship: relationship };\n\t\t\t\t\tconnectionMap.get( fromID ).parents.push( parentRelationship );\n\n\t\t\t\t\tif ( ! connectionMap.has( toID ) ) {\n\n\t\t\t\t\t\tconnectionMap.set( toID, {\n\t\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\t\tchildren: []\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar childRelationship = { ID: fromID, relationship: relationship };\n\t\t\t\t\tconnectionMap.get( toID ).children.push( childRelationship );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn connectionMap;\n\n\t\t},\n\n\t\t// Parse FBXTree.Objects.Video for embedded image data\n\t\t// These images are connected to textures in FBXTree.Objects.Textures\n\t\t// via FBXTree.Connections.\n\t\tparseImages: function () {\n\n\t\t\tvar images = {};\n\t\t\tvar blobs = {};\n\n\t\t\tif ( 'Video' in fbxTree.Objects ) {\n\n\t\t\t\tvar videoNodes = fbxTree.Objects.Video;\n\n\t\t\t\tfor ( var nodeID in videoNodes ) {\n\n\t\t\t\t\tvar videoNode = videoNodes[ nodeID ];\n\n\t\t\t\t\tvar id = parseInt( nodeID );\n\n\t\t\t\t\timages[ id ] = videoNode.RelativeFilename || videoNode.Filename;\n\n\t\t\t\t\t// raw image data is in videoNode.Content\n\t\t\t\t\tif ( 'Content' in videoNode ) {\n\n\t\t\t\t\t\tvar arrayBufferContent = ( videoNode.Content instanceof ArrayBuffer ) && ( videoNode.Content.byteLength > 0 );\n\t\t\t\t\t\tvar base64Content = ( typeof videoNode.Content === 'string' ) && ( videoNode.Content !== '' );\n\n\t\t\t\t\t\tif ( arrayBufferContent || base64Content ) {\n\n\t\t\t\t\t\t\tvar image = this.parseImage( videoNodes[ nodeID ] );\n\n\t\t\t\t\t\t\tblobs[ videoNode.RelativeFilename || videoNode.Filename ] = image;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var id in images ) {\n\n\t\t\t\tvar filename = images[ id ];\n\n\t\t\t\tif ( blobs[ filename ] !== undefined ) images[ id ] = blobs[ filename ];\n\t\t\t\telse images[ id ] = images[ id ].split( '\\\\' ).pop();\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\t// Parse embedded image data in FBXTree.Video.Content\n\t\tparseImage: function ( videoNode ) {\n\n\t\t\tvar content = videoNode.Content;\n\t\t\tvar fileName = videoNode.RelativeFilename || videoNode.Filename;\n\t\t\tvar extension = fileName.slice( fileName.lastIndexOf( '.' ) + 1 ).toLowerCase();\n\n\t\t\tvar type;\n\n\t\t\tswitch ( extension ) {\n\n\t\t\t\tcase 'bmp':\n\n\t\t\t\t\ttype = 'image/bmp';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'jpg':\n\t\t\t\tcase 'jpeg':\n\n\t\t\t\t\ttype = 'image/jpeg';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'png':\n\n\t\t\t\t\ttype = 'image/png';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'tif':\n\n\t\t\t\t\ttype = 'image/tiff';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'tga':\n\n\t\t\t\t\tif ( this.manager.getHandler( '.tga' ) === null ) {\n\n\t\t\t\t\t\tconsole.warn( 'FBXLoader: TGA loader not found, skipping ', fileName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttype = 'image/tga';\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tconsole.warn( 'FBXLoader: Image type \"' + extension + '\" is not supported.' );\n\t\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( typeof content === 'string' ) { // ASCII format\n\n\t\t\t\treturn 'data:' + type + ';base64,' + content;\n\n\t\t\t} else { // Binary Format\n\n\t\t\t\tvar array = new Uint8Array( content );\n\t\t\t\treturn window.URL.createObjectURL( new Blob( [ array ], { type: type } ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Parse nodes in FBXTree.Objects.Texture\n\t\t// These contain details such as UV scaling, cropping, rotation etc and are connected\n\t\t// to images in FBXTree.Objects.Video\n\t\tparseTextures: function ( images ) {\n\n\t\t\tvar textureMap = new Map();\n\n\t\t\tif ( 'Texture' in fbxTree.Objects ) {\n\n\t\t\t\tvar textureNodes = fbxTree.Objects.Texture;\n\t\t\t\tfor ( var nodeID in textureNodes ) {\n\n\t\t\t\t\tvar texture = this.parseTexture( textureNodes[ nodeID ], images );\n\t\t\t\t\ttextureMap.set( parseInt( nodeID ), texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textureMap;\n\n\t\t},\n\n\t\t// Parse individual node in FBXTree.Objects.Texture\n\t\tparseTexture: function ( textureNode, images ) {\n\n\t\t\tvar texture = this.loadTexture( textureNode, images );\n\n\t\t\ttexture.ID = textureNode.id;\n\n\t\t\ttexture.name = textureNode.attrName;\n\n\t\t\tvar wrapModeU = textureNode.WrapModeU;\n\t\t\tvar wrapModeV = textureNode.WrapModeV;\n\n\t\t\tvar valueU = wrapModeU !== undefined ? wrapModeU.value : 0;\n\t\t\tvar valueV = wrapModeV !== undefined ? wrapModeV.value : 0;\n\n\t\t\t// http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a\n\t\t\t// 0: repeat(default), 1: clamp\n\n\t\t\ttexture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\t\tif ( 'Scaling' in textureNode ) {\n\n\t\t\t\tvar values = textureNode.Scaling.value;\n\n\t\t\t\ttexture.repeat.x = values[ 0 ];\n\t\t\t\ttexture.repeat.y = values[ 1 ];\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\t// load a texture specified as a blob or data URI, or via an external URL using TextureLoader\n\t\tloadTexture: function ( textureNode, images ) {\n\n\t\t\tvar fileName;\n\n\t\t\tvar currentPath = this.textureLoader.path;\n\n\t\t\tvar children = connections.get( textureNode.id ).children;\n\n\t\t\tif ( children !== undefined && children.length > 0 && images[ children[ 0 ].ID ] !== undefined ) {\n\n\t\t\t\tfileName = images[ children[ 0 ].ID ];\n\n\t\t\t\tif ( fileName.indexOf( 'blob:' ) === 0 || fileName.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\t\tthis.textureLoader.setPath( undefined );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar texture;\n\n\t\t\tvar extension = textureNode.FileName.slice( - 3 ).toLowerCase();\n\n\t\t\tif ( extension === 'tga' ) {\n\n\t\t\t\tvar loader = this.manager.getHandler( '.tga' );\n\n\t\t\t\tif ( loader === null ) {\n\n\t\t\t\t\tconsole.warn( 'FBXLoader: TGA loader not found, creating placeholder texture for', textureNode.RelativeFilename );\n\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = loader.load( fileName );\n\n\t\t\t\t}\n\n\t\t\t} else if ( extension === 'psd' ) {\n\n\t\t\t\tconsole.warn( 'FBXLoader: PSD textures are not supported, creating placeholder texture for', textureNode.RelativeFilename );\n\t\t\t\ttexture = new Texture();\n\n\t\t\t} else {\n\n\t\t\t\ttexture = this.textureLoader.load( fileName );\n\n\t\t\t}\n\n\t\t\tthis.textureLoader.setPath( currentPath );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\t// Parse nodes in FBXTree.Objects.Material\n\t\tparseMaterials: function ( textureMap ) {\n\n\t\t\tvar materialMap = new Map();\n\n\t\t\tif ( 'Material' in fbxTree.Objects ) {\n\n\t\t\t\tvar materialNodes = fbxTree.Objects.Material;\n\n\t\t\t\tfor ( var nodeID in materialNodes ) {\n\n\t\t\t\t\tvar material = this.parseMaterial( materialNodes[ nodeID ], textureMap );\n\n\t\t\t\t\tif ( material !== null ) materialMap.set( parseInt( nodeID ), material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materialMap;\n\n\t\t},\n\n\t\t// Parse single node in FBXTree.Objects.Material\n\t\t// Materials are connected to texture maps in FBXTree.Objects.Textures\n\t\t// FBX format currently only supports Lambert and Phong shading models\n\t\tparseMaterial: function ( materialNode, textureMap ) {\n\n\t\t\tvar ID = materialNode.id;\n\t\t\tvar name = materialNode.attrName;\n\t\t\tvar type = materialNode.ShadingModel;\n\n\t\t\t// Case where FBX wraps shading model in property object.\n\t\t\tif ( typeof type === 'object' ) {\n\n\t\t\t\ttype = type.value;\n\n\t\t\t}\n\n\t\t\t// Ignore unused materials which don't have any connections.\n\t\t\tif ( ! connections.has( ID ) ) return null;\n\n\t\t\tvar parameters = this.parseParameters( materialNode, textureMap, ID );\n\n\t\t\tvar material;\n\n\t\t\tswitch ( type.toLowerCase() ) {\n\n\t\t\t\tcase 'phong':\n\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'lambert':\n\t\t\t\t\tmaterial = new MeshLambertMaterial();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: unknown material type \"%s\". Defaulting to MeshPhongMaterial.', type );\n\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tmaterial.setValues( parameters );\n\t\t\tmaterial.name = name;\n\n\t\t\treturn material;\n\n\t\t},\n\n\t\t// Parse FBX material and return parameters suitable for a three.js material\n\t\t// Also parse the texture map and return any textures associated with the material\n\t\tparseParameters: function ( materialNode, textureMap, ID ) {\n\n\t\t\tvar parameters = {};\n\n\t\t\tif ( materialNode.BumpFactor ) {\n\n\t\t\t\tparameters.bumpScale = materialNode.BumpFactor.value;\n\n\t\t\t}\n\n\t\t\tif ( materialNode.Diffuse ) {\n\n\t\t\t\tparameters.color = new Color().fromArray( materialNode.Diffuse.value );\n\n\t\t\t} else if ( materialNode.DiffuseColor && materialNode.DiffuseColor.type === 'Color' ) {\n\n\t\t\t\t// The blender exporter exports diffuse here instead of in materialNode.Diffuse\n\t\t\t\tparameters.color = new Color().fromArray( materialNode.DiffuseColor.value );\n\n\t\t\t}\n\n\t\t\tif ( materialNode.DisplacementFactor ) {\n\n\t\t\t\tparameters.displacementScale = materialNode.DisplacementFactor.value;\n\n\t\t\t}\n\n\t\t\tif ( materialNode.Emissive ) {\n\n\t\t\t\tparameters.emissive = new Color().fromArray( materialNode.Emissive.value );\n\n\t\t\t} else if ( materialNode.EmissiveColor && materialNode.EmissiveColor.type === 'Color' ) {\n\n\t\t\t\t// The blender exporter exports emissive color here instead of in materialNode.Emissive\n\t\t\t\tparameters.emissive = new Color().fromArray( materialNode.EmissiveColor.value );\n\n\t\t\t}\n\n\t\t\tif ( materialNode.EmissiveFactor ) {\n\n\t\t\t\tparameters.emissiveIntensity = parseFloat( materialNode.EmissiveFactor.value );\n\n\t\t\t}\n\n\t\t\tif ( materialNode.Opacity ) {\n\n\t\t\t\tparameters.opacity = parseFloat( materialNode.Opacity.value );\n\n\t\t\t}\n\n\t\t\tif ( parameters.opacity < 1.0 ) {\n\n\t\t\t\tparameters.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( materialNode.ReflectionFactor ) {\n\n\t\t\t\tparameters.reflectivity = materialNode.ReflectionFactor.value;\n\n\t\t\t}\n\n\t\t\tif ( materialNode.Shininess ) {\n\n\t\t\t\tparameters.shininess = materialNode.Shininess.value;\n\n\t\t\t}\n\n\t\t\tif ( materialNode.Specular ) {\n\n\t\t\t\tparameters.specular = new Color().fromArray( materialNode.Specular.value );\n\n\t\t\t} else if ( materialNode.SpecularColor && materialNode.SpecularColor.type === 'Color' ) {\n\n\t\t\t\t// The blender exporter exports specular color here instead of in materialNode.Specular\n\t\t\t\tparameters.specular = new Color().fromArray( materialNode.SpecularColor.value );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\t\t\tconnections.get( ID ).children.forEach( function ( child ) {\n\n\t\t\t\tvar type = child.relationship;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'Bump':\n\t\t\t\t\t\tparameters.bumpMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Maya|TEX_ao_map':\n\t\t\t\t\t\tparameters.aoMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DiffuseColor':\n\t\t\t\t\tcase 'Maya|TEX_color_map':\n\t\t\t\t\t\tparameters.map = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tparameters.map.encoding = sRGBEncoding;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DisplacementColor':\n\t\t\t\t\t\tparameters.displacementMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EmissiveColor':\n\t\t\t\t\t\tparameters.emissiveMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tparameters.emissiveMap.encoding = sRGBEncoding;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'NormalMap':\n\t\t\t\t\tcase 'Maya|TEX_normal_map':\n\t\t\t\t\t\tparameters.normalMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ReflectionColor':\n\t\t\t\t\t\tparameters.envMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tparameters.envMap.mapping = EquirectangularReflectionMapping;\n\t\t\t\t\t\tparameters.envMap.encoding = sRGBEncoding;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpecularColor':\n\t\t\t\t\t\tparameters.specularMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tparameters.specularMap.encoding = sRGBEncoding;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'TransparentColor':\n\t\t\t\t\tcase 'TransparencyFactor':\n\t\t\t\t\t\tparameters.alphaMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\t\tparameters.transparent = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientColor':\n\t\t\t\t\tcase 'ShininessExponent': // AKA glossiness map\n\t\t\t\t\tcase 'SpecularFactor': // AKA specularLevel\n\t\t\t\t\tcase 'VectorDisplacementColor': // NOTE: Seems to be a copy of DisplacementColor\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: %s map is not supported in three.js, skipping texture.', type );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn parameters;\n\n\t\t},\n\n\t\t// get a texture from the textureMap for use by a material.\n\t\tgetTexture: function ( textureMap, id ) {\n\n\t\t\t// if the texture is a layered texture, just use the first layer and issue a warning\n\t\t\tif ( 'LayeredTexture' in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.' );\n\t\t\t\tid = connections.get( id ).children[ 0 ].ID;\n\n\t\t\t}\n\n\t\t\treturn textureMap.get( id );\n\n\t\t},\n\n\t\t// Parse nodes in FBXTree.Objects.Deformer\n\t\t// Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here\n\t\t// Generates map of Skeleton-like objects for use later when generating and binding skeletons.\n\t\tparseDeformers: function () {\n\n\t\t\tvar skeletons = {};\n\t\t\tvar morphTargets = {};\n\n\t\t\tif ( 'Deformer' in fbxTree.Objects ) {\n\n\t\t\t\tvar DeformerNodes = fbxTree.Objects.Deformer;\n\n\t\t\t\tfor ( var nodeID in DeformerNodes ) {\n\n\t\t\t\t\tvar deformerNode = DeformerNodes[ nodeID ];\n\n\t\t\t\t\tvar relationships = connections.get( parseInt( nodeID ) );\n\n\t\t\t\t\tif ( deformerNode.attrType === 'Skin' ) {\n\n\t\t\t\t\t\tvar skeleton = this.parseSkeleton( relationships, DeformerNodes );\n\t\t\t\t\t\tskeleton.ID = nodeID;\n\n\t\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: skeleton attached to more than one geometry is not supported.' );\n\t\t\t\t\t\tskeleton.geometryID = relationships.parents[ 0 ].ID;\n\n\t\t\t\t\t\tskeletons[ nodeID ] = skeleton;\n\n\t\t\t\t\t} else if ( deformerNode.attrType === 'BlendShape' ) {\n\n\t\t\t\t\t\tvar morphTarget = {\n\t\t\t\t\t\t\tid: nodeID,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tmorphTarget.rawTargets = this.parseMorphTargets( relationships, DeformerNodes );\n\t\t\t\t\t\tmorphTarget.id = nodeID;\n\n\t\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: morph target attached to more than one geometry is not supported.' );\n\n\t\t\t\t\t\tmorphTargets[ nodeID ] = morphTarget;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\n\t\t\t\tskeletons: skeletons,\n\t\t\t\tmorphTargets: morphTargets,\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Parse single nodes in FBXTree.Objects.Deformer\n\t\t// The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster'\n\t\t// Each skin node represents a skeleton and each cluster node represents a bone\n\t\tparseSkeleton: function ( relationships, deformerNodes ) {\n\n\t\t\tvar rawBones = [];\n\n\t\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\t\tvar boneNode = deformerNodes[ child.ID ];\n\n\t\t\t\tif ( boneNode.attrType !== 'Cluster' ) return;\n\n\t\t\t\tvar rawBone = {\n\n\t\t\t\t\tID: child.ID,\n\t\t\t\t\tindices: [],\n\t\t\t\t\tweights: [],\n\t\t\t\t\ttransformLink: new Matrix4().fromArray( boneNode.TransformLink.a ),\n\t\t\t\t\t// transform: new Matrix4().fromArray( boneNode.Transform.a ),\n\t\t\t\t\t// linkMode: boneNode.Mode,\n\n\t\t\t\t};\n\n\t\t\t\tif ( 'Indexes' in boneNode ) {\n\n\t\t\t\t\trawBone.indices = boneNode.Indexes.a;\n\t\t\t\t\trawBone.weights = boneNode.Weights.a;\n\n\t\t\t\t}\n\n\t\t\t\trawBones.push( rawBone );\n\n\t\t\t} );\n\n\t\t\treturn {\n\n\t\t\t\trawBones: rawBones,\n\t\t\t\tbones: []\n\n\t\t\t};\n\n\t\t},\n\n\t\t// The top level morph deformer node has type \"BlendShape\" and sub nodes have type \"BlendShapeChannel\"\n\t\tparseMorphTargets: function ( relationships, deformerNodes ) {\n\n\t\t\tvar rawMorphTargets = [];\n\n\t\t\tfor ( var i = 0; i < relationships.children.length; i ++ ) {\n\n\t\t\t\tvar child = relationships.children[ i ];\n\n\t\t\t\tvar morphTargetNode = deformerNodes[ child.ID ];\n\n\t\t\t\tvar rawMorphTarget = {\n\n\t\t\t\t\tname: morphTargetNode.attrName,\n\t\t\t\t\tinitialWeight: morphTargetNode.DeformPercent,\n\t\t\t\t\tid: morphTargetNode.id,\n\t\t\t\t\tfullWeights: morphTargetNode.FullWeights.a\n\n\t\t\t\t};\n\n\t\t\t\tif ( morphTargetNode.attrType !== 'BlendShapeChannel' ) return;\n\n\t\t\t\trawMorphTarget.geoID = connections.get( parseInt( child.ID ) ).children.filter( function ( child ) {\n\n\t\t\t\t\treturn child.relationship === undefined;\n\n\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\trawMorphTargets.push( rawMorphTarget );\n\n\t\t\t}\n\n\t\t\treturn rawMorphTargets;\n\n\t\t},\n\n\t\t// create the main Group() to be returned by the loader\n\t\tparseScene: function ( deformers, geometryMap, materialMap ) {\n\n\t\t\tsceneGraph = new Group();\n\n\t\t\tvar modelMap = this.parseModels( deformers.skeletons, geometryMap, materialMap );\n\n\t\t\tvar modelNodes = fbxTree.Objects.Model;\n\n\t\t\tvar scope = this;\n\t\t\tmodelMap.forEach( function ( model ) {\n\n\t\t\t\tvar modelNode = modelNodes[ model.ID ];\n\t\t\t\tscope.setLookAtProperties( model, modelNode );\n\n\t\t\t\tvar parentConnections = connections.get( model.ID ).parents;\n\n\t\t\t\tparentConnections.forEach( function ( connection ) {\n\n\t\t\t\t\tvar parent = modelMap.get( connection.ID );\n\t\t\t\t\tif ( parent !== undefined ) parent.add( model );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( model.parent === null ) {\n\n\t\t\t\t\tsceneGraph.add( model );\n\n\t\t\t\t}\n\n\n\t\t\t} );\n\n\t\t\tthis.bindSkeleton( deformers.skeletons, geometryMap, modelMap );\n\n\t\t\tthis.createAmbientLight();\n\n\t\t\tthis.setupMorphMaterials();\n\n\t\t\tsceneGraph.traverse( function ( node ) {\n\n\t\t\t\tif ( node.userData.transformData ) {\n\n\t\t\t\t\tif ( node.parent ) node.userData.transformData.parentMatrixWorld = node.parent.matrix;\n\n\t\t\t\t\tvar transform = generateTransform( node.userData.transformData );\n\n\t\t\t\t\tnode.applyMatrix4( transform );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tvar animations = new AnimationParser().parse();\n\n\t\t\t// if all the models where already combined in a single group, just return that\n\t\t\tif ( sceneGraph.children.length === 1 && sceneGraph.children[ 0 ].isGroup ) {\n\n\t\t\t\tsceneGraph.children[ 0 ].animations = animations;\n\t\t\t\tsceneGraph = sceneGraph.children[ 0 ];\n\n\t\t\t}\n\n\t\t\tsceneGraph.animations = animations;\n\n\t\t},\n\n\t\t// parse nodes in FBXTree.Objects.Model\n\t\tparseModels: function ( skeletons, geometryMap, materialMap ) {\n\n\t\t\tvar modelMap = new Map();\n\t\t\tvar modelNodes = fbxTree.Objects.Model;\n\n\t\t\tfor ( var nodeID in modelNodes ) {\n\n\t\t\t\tvar id = parseInt( nodeID );\n\t\t\t\tvar node = modelNodes[ nodeID ];\n\t\t\t\tvar relationships = connections.get( id );\n\n\t\t\t\tvar model = this.buildSkeleton( relationships, skeletons, id, node.attrName );\n\n\t\t\t\tif ( ! model ) {\n\n\t\t\t\t\tswitch ( node.attrType ) {\n\n\t\t\t\t\t\tcase 'Camera':\n\t\t\t\t\t\t\tmodel = this.createCamera( relationships );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Light':\n\t\t\t\t\t\t\tmodel = this.createLight( relationships );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Mesh':\n\t\t\t\t\t\t\tmodel = this.createMesh( relationships, geometryMap, materialMap );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'NurbsCurve':\n\t\t\t\t\t\t\tmodel = this.createCurve( relationships, geometryMap );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'LimbNode':\n\t\t\t\t\t\tcase 'Root':\n\t\t\t\t\t\t\tmodel = new Bone();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'Null':\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tmodel = new Group();\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmodel.name = node.attrName ? PropertyBinding.sanitizeNodeName( node.attrName ) : '';\n\n\t\t\t\t\tmodel.ID = id;\n\n\t\t\t\t}\n\n\t\t\t\tthis.getTransformData( model, node );\n\t\t\t\tmodelMap.set( id, model );\n\n\t\t\t}\n\n\t\t\treturn modelMap;\n\n\t\t},\n\n\t\tbuildSkeleton: function ( relationships, skeletons, id, name ) {\n\n\t\t\tvar bone = null;\n\n\t\t\trelationships.parents.forEach( function ( parent ) {\n\n\t\t\t\tfor ( var ID in skeletons ) {\n\n\t\t\t\t\tvar skeleton = skeletons[ ID ];\n\n\t\t\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t\t\tif ( rawBone.ID === parent.ID ) {\n\n\t\t\t\t\t\t\tvar subBone = bone;\n\t\t\t\t\t\t\tbone = new Bone();\n\n\t\t\t\t\t\t\tbone.matrixWorld.copy( rawBone.transformLink );\n\n\t\t\t\t\t\t\t// set name and id here - otherwise in cases where \"subBone\" is created it will not have a name / id\n\n\t\t\t\t\t\t\tbone.name = name ? PropertyBinding.sanitizeNodeName( name ) : '';\n\t\t\t\t\t\t\tbone.ID = id;\n\n\t\t\t\t\t\t\tskeleton.bones[ i ] = bone;\n\n\t\t\t\t\t\t\t// In cases where a bone is shared between multiple meshes\n\t\t\t\t\t\t\t// duplicate the bone here and and it as a child of the first bone\n\t\t\t\t\t\t\tif ( subBone !== null ) {\n\n\t\t\t\t\t\t\t\tbone.add( subBone );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn bone;\n\n\t\t},\n\n\t\t// create a PerspectiveCamera or OrthographicCamera\n\t\tcreateCamera: function ( relationships ) {\n\n\t\t\tvar model;\n\t\t\tvar cameraAttribute;\n\n\t\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\t\tvar attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\t\tcameraAttribute = attr;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( cameraAttribute === undefined ) {\n\n\t\t\t\tmodel = new Object3D();\n\n\t\t\t} else {\n\n\t\t\t\tvar type = 0;\n\t\t\t\tif ( cameraAttribute.CameraProjectionType !== undefined && cameraAttribute.CameraProjectionType.value === 1 ) {\n\n\t\t\t\t\ttype = 1;\n\n\t\t\t\t}\n\n\t\t\t\tvar nearClippingPlane = 1;\n\t\t\t\tif ( cameraAttribute.NearPlane !== undefined ) {\n\n\t\t\t\t\tnearClippingPlane = cameraAttribute.NearPlane.value / 1000;\n\n\t\t\t\t}\n\n\t\t\t\tvar farClippingPlane = 1000;\n\t\t\t\tif ( cameraAttribute.FarPlane !== undefined ) {\n\n\t\t\t\t\tfarClippingPlane = cameraAttribute.FarPlane.value / 1000;\n\n\t\t\t\t}\n\n\n\t\t\t\tvar width = window.innerWidth;\n\t\t\t\tvar height = window.innerHeight;\n\n\t\t\t\tif ( cameraAttribute.AspectWidth !== undefined && cameraAttribute.AspectHeight !== undefined ) {\n\n\t\t\t\t\twidth = cameraAttribute.AspectWidth.value;\n\t\t\t\t\theight = cameraAttribute.AspectHeight.value;\n\n\t\t\t\t}\n\n\t\t\t\tvar aspect = width / height;\n\n\t\t\t\tvar fov = 45;\n\t\t\t\tif ( cameraAttribute.FieldOfView !== undefined ) {\n\n\t\t\t\t\tfov = cameraAttribute.FieldOfView.value;\n\n\t\t\t\t}\n\n\t\t\t\tvar focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 0: // Perspective\n\t\t\t\t\t\tmodel = new PerspectiveCamera( fov, aspect, nearClippingPlane, farClippingPlane );\n\t\t\t\t\t\tif ( focalLength !== null ) model.setFocalLength( focalLength );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 1: // Orthographic\n\t\t\t\t\t\tmodel = new OrthographicCamera( - width / 2, width / 2, height / 2, - height / 2, nearClippingPlane, farClippingPlane );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown camera type ' + type + '.' );\n\t\t\t\t\t\tmodel = new Object3D();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn model;\n\n\t\t},\n\n\t\t// Create a DirectionalLight, PointLight or SpotLight\n\t\tcreateLight: function ( relationships ) {\n\n\t\t\tvar model;\n\t\t\tvar lightAttribute;\n\n\t\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\t\tvar attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\t\tlightAttribute = attr;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( lightAttribute === undefined ) {\n\n\t\t\t\tmodel = new Object3D();\n\n\t\t\t} else {\n\n\t\t\t\tvar type;\n\n\t\t\t\t// LightType can be undefined for Point lights\n\t\t\t\tif ( lightAttribute.LightType === undefined ) {\n\n\t\t\t\t\ttype = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttype = lightAttribute.LightType.value;\n\n\t\t\t\t}\n\n\t\t\t\tvar color = 0xffffff;\n\n\t\t\t\tif ( lightAttribute.Color !== undefined ) {\n\n\t\t\t\t\tcolor = new Color().fromArray( lightAttribute.Color.value );\n\n\t\t\t\t}\n\n\t\t\t\tvar intensity = ( lightAttribute.Intensity === undefined ) ? 1 : lightAttribute.Intensity.value / 100;\n\n\t\t\t\t// light disabled\n\t\t\t\tif ( lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === 0 ) {\n\n\t\t\t\t\tintensity = 0;\n\n\t\t\t\t}\n\n\t\t\t\tvar distance = 0;\n\t\t\t\tif ( lightAttribute.FarAttenuationEnd !== undefined ) {\n\n\t\t\t\t\tif ( lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === 0 ) {\n\n\t\t\t\t\t\tdistance = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdistance = lightAttribute.FarAttenuationEnd.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd?\n\t\t\t\tvar decay = 1;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 0: // Point\n\t\t\t\t\t\tmodel = new PointLight( color, intensity, distance, decay );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 1: // Directional\n\t\t\t\t\t\tmodel = new DirectionalLight( color, intensity );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 2: // Spot\n\t\t\t\t\t\tvar angle = Math.PI / 3;\n\n\t\t\t\t\t\tif ( lightAttribute.InnerAngle !== undefined ) {\n\n\t\t\t\t\t\t\tangle = MathUtils.degToRad( lightAttribute.InnerAngle.value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar penumbra = 0;\n\t\t\t\t\t\tif ( lightAttribute.OuterAngle !== undefined ) {\n\n\t\t\t\t\t\t\t// TODO: this is not correct - FBX calculates outer and inner angle in degrees\n\t\t\t\t\t\t\t// with OuterAngle > InnerAngle && OuterAngle <= Math.PI\n\t\t\t\t\t\t\t// while three.js uses a penumbra between (0, 1) to attenuate the inner angle\n\t\t\t\t\t\t\tpenumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );\n\t\t\t\t\t\t\tpenumbra = Math.max( penumbra, 1 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmodel = new SpotLight( color, intensity, distance, angle, penumbra, decay );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType.value + ', defaulting to a PointLight.' );\n\t\t\t\t\t\tmodel = new PointLight( color, intensity );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === 1 ) {\n\n\t\t\t\t\tmodel.castShadow = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn model;\n\n\t\t},\n\n\t\tcreateMesh: function ( relationships, geometryMap, materialMap ) {\n\n\t\t\tvar model;\n\t\t\tvar geometry = null;\n\t\t\tvar material = null;\n\t\t\tvar materials = [];\n\n\t\t\t// get geometry and materials(s) from connections\n\t\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\t\tif ( geometryMap.has( child.ID ) ) {\n\n\t\t\t\t\tgeometry = geometryMap.get( child.ID );\n\n\t\t\t\t}\n\n\t\t\t\tif ( materialMap.has( child.ID ) ) {\n\n\t\t\t\t\tmaterials.push( materialMap.get( child.ID ) );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( materials.length > 1 ) {\n\n\t\t\t\tmaterial = materials;\n\n\t\t\t} else if ( materials.length > 0 ) {\n\n\t\t\t\tmaterial = materials[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tmaterial = new MeshPhongMaterial( { color: 0xcccccc } );\n\t\t\t\tmaterials.push( material );\n\n\t\t\t}\n\n\t\t\tif ( 'color' in geometry.attributes ) {\n\n\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( geometry.FBX_Deformer ) {\n\n\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\tmaterial.skinning = true;\n\n\t\t\t\t} );\n\n\t\t\t\tmodel = new SkinnedMesh( geometry, material );\n\t\t\t\tmodel.normalizeSkinWeights();\n\n\t\t\t} else {\n\n\t\t\t\tmodel = new Mesh( geometry, material );\n\n\t\t\t}\n\n\t\t\treturn model;\n\n\t\t},\n\n\t\tcreateCurve: function ( relationships, geometryMap ) {\n\n\t\t\tvar geometry = relationships.children.reduce( function ( geo, child ) {\n\n\t\t\t\tif ( geometryMap.has( child.ID ) ) geo = geometryMap.get( child.ID );\n\n\t\t\t\treturn geo;\n\n\t\t\t}, null );\n\n\t\t\t// FBX does not list materials for Nurbs lines, so we'll just put our own in here.\n\t\t\tvar material = new LineBasicMaterial( { color: 0x3300ff, linewidth: 1 } );\n\t\t\treturn new Line( geometry, material );\n\n\t\t},\n\n\t\t// parse the model node for transform data\n\t\tgetTransformData: function ( model, modelNode ) {\n\n\t\t\tvar transformData = {};\n\n\t\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\t\telse transformData.eulerOrder = 'ZYX';\n\n\t\t\tif ( 'Lcl_Translation' in modelNode ) transformData.translation = modelNode.Lcl_Translation.value;\n\n\t\t\tif ( 'PreRotation' in modelNode ) transformData.preRotation = modelNode.PreRotation.value;\n\t\t\tif ( 'Lcl_Rotation' in modelNode ) transformData.rotation = modelNode.Lcl_Rotation.value;\n\t\t\tif ( 'PostRotation' in modelNode ) transformData.postRotation = modelNode.PostRotation.value;\n\n\t\t\tif ( 'Lcl_Scaling' in modelNode ) transformData.scale = modelNode.Lcl_Scaling.value;\n\n\t\t\tif ( 'ScalingOffset' in modelNode ) transformData.scalingOffset = modelNode.ScalingOffset.value;\n\t\t\tif ( 'ScalingPivot' in modelNode ) transformData.scalingPivot = modelNode.ScalingPivot.value;\n\n\t\t\tif ( 'RotationOffset' in modelNode ) transformData.rotationOffset = modelNode.RotationOffset.value;\n\t\t\tif ( 'RotationPivot' in modelNode ) transformData.rotationPivot = modelNode.RotationPivot.value;\n\n\t\t\tmodel.userData.transformData = transformData;\n\n\t\t},\n\n\t\tsetLookAtProperties: function ( model, modelNode ) {\n\n\t\t\tif ( 'LookAtProperty' in modelNode ) {\n\n\t\t\t\tvar children = connections.get( model.ID ).children;\n\n\t\t\t\tchildren.forEach( function ( child ) {\n\n\t\t\t\t\tif ( child.relationship === 'LookAtProperty' ) {\n\n\t\t\t\t\t\tvar lookAtTarget = fbxTree.Objects.Model[ child.ID ];\n\n\t\t\t\t\t\tif ( 'Lcl_Translation' in lookAtTarget ) {\n\n\t\t\t\t\t\t\tvar pos = lookAtTarget.Lcl_Translation.value;\n\n\t\t\t\t\t\t\t// DirectionalLight, SpotLight\n\t\t\t\t\t\t\tif ( model.target !== undefined ) {\n\n\t\t\t\t\t\t\t\tmodel.target.position.fromArray( pos );\n\t\t\t\t\t\t\t\tsceneGraph.add( model.target );\n\n\t\t\t\t\t\t\t} else { // Cameras and other Object3Ds\n\n\t\t\t\t\t\t\t\tmodel.lookAt( new Vector3().fromArray( pos ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbindSkeleton: function ( skeletons, geometryMap, modelMap ) {\n\n\t\t\tvar bindMatrices = this.parsePoseNodes();\n\n\t\t\tfor ( var ID in skeletons ) {\n\n\t\t\t\tvar skeleton = skeletons[ ID ];\n\n\t\t\t\tvar parents = connections.get( parseInt( skeleton.ID ) ).parents;\n\n\t\t\t\tparents.forEach( function ( parent ) {\n\n\t\t\t\t\tif ( geometryMap.has( parent.ID ) ) {\n\n\t\t\t\t\t\tvar geoID = parent.ID;\n\t\t\t\t\t\tvar geoRelationships = connections.get( geoID );\n\n\t\t\t\t\t\tgeoRelationships.parents.forEach( function ( geoConnParent ) {\n\n\t\t\t\t\t\t\tif ( modelMap.has( geoConnParent.ID ) ) {\n\n\t\t\t\t\t\t\t\tvar model = modelMap.get( geoConnParent.ID );\n\n\t\t\t\t\t\t\t\tmodel.bind( new Skeleton( skeleton.bones ), bindMatrices[ geoConnParent.ID ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t},\n\n\t\tparsePoseNodes: function () {\n\n\t\t\tvar bindMatrices = {};\n\n\t\t\tif ( 'Pose' in fbxTree.Objects ) {\n\n\t\t\t\tvar BindPoseNode = fbxTree.Objects.Pose;\n\n\t\t\t\tfor ( var nodeID in BindPoseNode ) {\n\n\t\t\t\t\tif ( BindPoseNode[ nodeID ].attrType === 'BindPose' ) {\n\n\t\t\t\t\t\tvar poseNodes = BindPoseNode[ nodeID ].PoseNode;\n\n\t\t\t\t\t\tif ( Array.isArray( poseNodes ) ) {\n\n\t\t\t\t\t\t\tposeNodes.forEach( function ( poseNode ) {\n\n\t\t\t\t\t\t\t\tbindMatrices[ poseNode.Node ] = new Matrix4().fromArray( poseNode.Matrix.a );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbindMatrices[ poseNodes.Node ] = new Matrix4().fromArray( poseNodes.Matrix.a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bindMatrices;\n\n\t\t},\n\n\t\t// Parse ambient color in FBXTree.GlobalSettings - if it's not set to black (default), create an ambient light\n\t\tcreateAmbientLight: function () {\n\n\t\t\tif ( 'GlobalSettings' in fbxTree && 'AmbientColor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\tvar ambientColor = fbxTree.GlobalSettings.AmbientColor.value;\n\t\t\t\tvar r = ambientColor[ 0 ];\n\t\t\t\tvar g = ambientColor[ 1 ];\n\t\t\t\tvar b = ambientColor[ 2 ];\n\n\t\t\t\tif ( r !== 0 || g !== 0 || b !== 0 ) {\n\n\t\t\t\t\tvar color = new Color( r, g, b );\n\t\t\t\t\tsceneGraph.add( new AmbientLight( color, 1 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tsetupMorphMaterials: function () {\n\n\t\t\tvar scope = this;\n\t\t\tsceneGraph.traverse( function ( child ) {\n\n\t\t\t\tif ( child.isMesh ) {\n\n\t\t\t\t\tif ( child.geometry.morphAttributes.position && child.geometry.morphAttributes.position.length ) {\n\n\t\t\t\t\t\tif ( Array.isArray( child.material ) ) {\n\n\t\t\t\t\t\t\tchild.material.forEach( function ( material, i ) {\n\n\t\t\t\t\t\t\t\tscope.setupMorphMaterial( child, material, i );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tscope.setupMorphMaterial( child, child.material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t},\n\n\t\tsetupMorphMaterial: function ( child, material, index ) {\n\n\t\t\tvar uuid = child.uuid;\n\t\t\tvar matUuid = material.uuid;\n\n\t\t\t// if a geometry has morph targets, it cannot share the material with other geometries\n\t\t\tvar sharedMat = false;\n\n\t\t\tsceneGraph.traverse( function ( node ) {\n\n\t\t\t\tif ( node.isMesh ) {\n\n\t\t\t\t\tif ( Array.isArray( node.material ) ) {\n\n\t\t\t\t\t\tnode.material.forEach( function ( mat ) {\n\n\t\t\t\t\t\t\tif ( mat.uuid === matUuid && node.uuid !== uuid ) sharedMat = true;\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else if ( node.material.uuid === matUuid && node.uuid !== uuid ) sharedMat = true;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( sharedMat === true ) {\n\n\t\t\t\tvar clonedMat = material.clone();\n\t\t\t\tclonedMat.morphTargets = true;\n\n\t\t\t\tif ( index === undefined ) child.material = clonedMat;\n\t\t\t\telse child.material[ index ] = clonedMat;\n\n\t\t\t} else material.morphTargets = true;\n\n\t\t}\n\n\t};\n\n\t// parse Geometry data from FBXTree and return map of BufferGeometries\n\tfunction GeometryParser() {}\n\n\tGeometryParser.prototype = {\n\n\t\tconstructor: GeometryParser,\n\n\t\t// Parse nodes in FBXTree.Objects.Geometry\n\t\tparse: function ( deformers ) {\n\n\t\t\tvar geometryMap = new Map();\n\n\t\t\tif ( 'Geometry' in fbxTree.Objects ) {\n\n\t\t\t\tvar geoNodes = fbxTree.Objects.Geometry;\n\n\t\t\t\tfor ( var nodeID in geoNodes ) {\n\n\t\t\t\t\tvar relationships = connections.get( parseInt( nodeID ) );\n\t\t\t\t\tvar geo = this.parseGeometry( relationships, geoNodes[ nodeID ], deformers );\n\n\t\t\t\t\tgeometryMap.set( parseInt( nodeID ), geo );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometryMap;\n\n\t\t},\n\n\t\t// Parse single node in FBXTree.Objects.Geometry\n\t\tparseGeometry: function ( relationships, geoNode, deformers ) {\n\n\t\t\tswitch ( geoNode.attrType ) {\n\n\t\t\t\tcase 'Mesh':\n\t\t\t\t\treturn this.parseMeshGeometry( relationships, geoNode, deformers );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'NurbsCurve':\n\t\t\t\t\treturn this.parseNurbsGeometry( geoNode );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t},\n\n\n\t\t// Parse single node mesh geometry in FBXTree.Objects.Geometry\n\t\tparseMeshGeometry: function ( relationships, geoNode, deformers ) {\n\n\t\t\tvar skeletons = deformers.skeletons;\n\t\t\tvar morphTargets = [];\n\n\t\t\tvar modelNodes = relationships.parents.map( function ( parent ) {\n\n\t\t\t\treturn fbxTree.Objects.Model[ parent.ID ];\n\n\t\t\t} );\n\n\t\t\t// don't create geometry if it is not associated with any models\n\t\t\tif ( modelNodes.length === 0 ) return;\n\n\t\t\tvar skeleton = relationships.children.reduce( function ( skeleton, child ) {\n\n\t\t\t\tif ( skeletons[ child.ID ] !== undefined ) skeleton = skeletons[ child.ID ];\n\n\t\t\t\treturn skeleton;\n\n\t\t\t}, null );\n\n\t\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\t\tif ( deformers.morphTargets[ child.ID ] !== undefined ) {\n\n\t\t\t\t\tmorphTargets.push( deformers.morphTargets[ child.ID ] );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// Assume one model and get the preRotation from that\n\t\t\t// if there is more than one model associated with the geometry this may cause problems\n\t\t\tvar modelNode = modelNodes[ 0 ];\n\n\t\t\tvar transformData = {};\n\n\t\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\t\tif ( 'GeometricTranslation' in modelNode ) transformData.translation = modelNode.GeometricTranslation.value;\n\t\t\tif ( 'GeometricRotation' in modelNode ) transformData.rotation = modelNode.GeometricRotation.value;\n\t\t\tif ( 'GeometricScaling' in modelNode ) transformData.scale = modelNode.GeometricScaling.value;\n\n\t\t\tvar transform = generateTransform( transformData );\n\n\t\t\treturn this.genGeometry( geoNode, skeleton, morphTargets, transform );\n\n\t\t},\n\n\t\t// Generate a BufferGeometry from a node in FBXTree.Objects.Geometry\n\t\tgenGeometry: function ( geoNode, skeleton, morphTargets, preTransform ) {\n\n\t\t\tvar geo = new BufferGeometry();\n\t\t\tif ( geoNode.attrName ) geo.name = geoNode.attrName;\n\n\t\t\tvar geoInfo = this.parseGeoNode( geoNode, skeleton );\n\t\t\tvar buffers = this.genBuffers( geoInfo );\n\n\t\t\tvar positionAttribute = new Float32BufferAttribute( buffers.vertex, 3 );\n\n\t\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\t\tgeo.setAttribute( 'position', positionAttribute );\n\n\t\t\tif ( buffers.colors.length > 0 ) {\n\n\t\t\t\tgeo.setAttribute( 'color', new Float32BufferAttribute( buffers.colors, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tgeo.setAttribute( 'skinIndex', new Uint16BufferAttribute( buffers.weightsIndices, 4 ) );\n\n\t\t\t\tgeo.setAttribute( 'skinWeight', new Float32BufferAttribute( buffers.vertexWeights, 4 ) );\n\n\t\t\t\t// used later to bind the skeleton to the model\n\t\t\t\tgeo.FBX_Deformer = skeleton;\n\n\t\t\t}\n\n\t\t\tif ( buffers.normal.length > 0 ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( preTransform );\n\n\t\t\t\tvar normalAttribute = new Float32BufferAttribute( buffers.normal, 3 );\n\t\t\t\tnormalAttribute.applyNormalMatrix( normalMatrix );\n\n\t\t\t\tgeo.setAttribute( 'normal', normalAttribute );\n\n\t\t\t}\n\n\t\t\tbuffers.uvs.forEach( function ( uvBuffer, i ) {\n\n\t\t\t\t// subsequent uv buffers are called 'uv1', 'uv2', ...\n\t\t\t\tvar name = 'uv' + ( i + 1 ).toString();\n\n\t\t\t\t// the first uv buffer is just called 'uv'\n\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\tname = 'uv';\n\n\t\t\t\t}\n\n\t\t\t\tgeo.setAttribute( name, new Float32BufferAttribute( buffers.uvs[ i ], 2 ) );\n\n\t\t\t} );\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\t// Convert the material indices of each vertex into rendering groups on the geometry.\n\t\t\t\tvar prevMaterialIndex = buffers.materialIndex[ 0 ];\n\t\t\t\tvar startIndex = 0;\n\n\t\t\t\tbuffers.materialIndex.forEach( function ( currentIndex, i ) {\n\n\t\t\t\t\tif ( currentIndex !== prevMaterialIndex ) {\n\n\t\t\t\t\t\tgeo.addGroup( startIndex, i - startIndex, prevMaterialIndex );\n\n\t\t\t\t\t\tprevMaterialIndex = currentIndex;\n\t\t\t\t\t\tstartIndex = i;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\t// the loop above doesn't add the last group, do that here.\n\t\t\t\tif ( geo.groups.length > 0 ) {\n\n\t\t\t\t\tvar lastGroup = geo.groups[ geo.groups.length - 1 ];\n\t\t\t\t\tvar lastIndex = lastGroup.start + lastGroup.count;\n\n\t\t\t\t\tif ( lastIndex !== buffers.materialIndex.length ) {\n\n\t\t\t\t\t\tgeo.addGroup( lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// case where there are multiple materials but the whole geometry is only\n\t\t\t\t// using one of them\n\t\t\t\tif ( geo.groups.length === 0 ) {\n\n\t\t\t\t\tgeo.addGroup( 0, buffers.materialIndex.length, buffers.materialIndex[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.addMorphTargets( geo, geoNode, morphTargets, preTransform );\n\n\t\t\treturn geo;\n\n\t\t},\n\n\t\tparseGeoNode: function ( geoNode, skeleton ) {\n\n\t\t\tvar geoInfo = {};\n\n\t\t\tgeoInfo.vertexPositions = ( geoNode.Vertices !== undefined ) ? geoNode.Vertices.a : [];\n\t\t\tgeoInfo.vertexIndices = ( geoNode.PolygonVertexIndex !== undefined ) ? geoNode.PolygonVertexIndex.a : [];\n\n\t\t\tif ( geoNode.LayerElementColor ) {\n\n\t\t\t\tgeoInfo.color = this.parseVertexColors( geoNode.LayerElementColor[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoNode.LayerElementMaterial ) {\n\n\t\t\t\tgeoInfo.material = this.parseMaterialIndices( geoNode.LayerElementMaterial[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoNode.LayerElementNormal ) {\n\n\t\t\t\tgeoInfo.normal = this.parseNormals( geoNode.LayerElementNormal[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoNode.LayerElementUV ) {\n\n\t\t\t\tgeoInfo.uv = [];\n\n\t\t\t\tvar i = 0;\n\t\t\t\twhile ( geoNode.LayerElementUV[ i ] ) {\n\n\t\t\t\t\tif ( geoNode.LayerElementUV[ i ].UV ) {\n\n\t\t\t\t\t\tgeoInfo.uv.push( this.parseUVs( geoNode.LayerElementUV[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ti ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeoInfo.weightTable = {};\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\tgeoInfo.skeleton = skeleton;\n\n\t\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t\t// loop over the bone's vertex indices and weights\n\t\t\t\t\trawBone.indices.forEach( function ( index, j ) {\n\n\t\t\t\t\t\tif ( geoInfo.weightTable[ index ] === undefined ) geoInfo.weightTable[ index ] = [];\n\n\t\t\t\t\t\tgeoInfo.weightTable[ index ].push( {\n\n\t\t\t\t\t\t\tid: i,\n\t\t\t\t\t\t\tweight: rawBone.weights[ j ],\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn geoInfo;\n\n\t\t},\n\n\t\tgenBuffers: function ( geoInfo ) {\n\n\t\t\tvar buffers = {\n\t\t\t\tvertex: [],\n\t\t\t\tnormal: [],\n\t\t\t\tcolors: [],\n\t\t\t\tuvs: [],\n\t\t\t\tmaterialIndex: [],\n\t\t\t\tvertexWeights: [],\n\t\t\t\tweightsIndices: [],\n\t\t\t};\n\n\t\t\tvar polygonIndex = 0;\n\t\t\tvar faceLength = 0;\n\t\t\tvar displayedWeightsWarning = false;\n\n\t\t\t// these will hold data for a single face\n\t\t\tvar facePositionIndexes = [];\n\t\t\tvar faceNormals = [];\n\t\t\tvar faceColors = [];\n\t\t\tvar faceUVs = [];\n\t\t\tvar faceWeights = [];\n\t\t\tvar faceWeightIndices = [];\n\n\t\t\tvar scope = this;\n\t\t\tgeoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {\n\n\t\t\t\tvar endOfFace = false;\n\n\t\t\t\t// Face index and vertex index arrays are combined in a single array\n\t\t\t\t// A cube with quad faces looks like this:\n\t\t\t\t// PolygonVertexIndex: *24 {\n\t\t\t\t// a: 0, 1, 3, -3, 2, 3, 5, -5, 4, 5, 7, -7, 6, 7, 1, -1, 1, 7, 5, -4, 6, 0, 2, -5\n\t\t\t\t// }\n\t\t\t\t// Negative numbers mark the end of a face - first face here is 0, 1, 3, -3\n\t\t\t\t// to find index of last vertex bit shift the index: ^ - 1\n\t\t\t\tif ( vertexIndex < 0 ) {\n\n\t\t\t\t\tvertexIndex = vertexIndex ^ - 1; // equivalent to ( x * -1 ) - 1\n\t\t\t\t\tendOfFace = true;\n\n\t\t\t\t}\n\n\t\t\t\tvar weightIndices = [];\n\t\t\t\tvar weights = [];\n\n\t\t\t\tfacePositionIndexes.push( vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2 );\n\n\t\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\t\tvar data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color );\n\n\t\t\t\t\tfaceColors.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\t\tif ( geoInfo.weightTable[ vertexIndex ] !== undefined ) {\n\n\t\t\t\t\t\tgeoInfo.weightTable[ vertexIndex ].forEach( function ( wt ) {\n\n\t\t\t\t\t\t\tweights.push( wt.weight );\n\t\t\t\t\t\t\tweightIndices.push( wt.id );\n\n\t\t\t\t\t\t} );\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( weights.length > 4 ) {\n\n\t\t\t\t\t\tif ( ! displayedWeightsWarning ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.' );\n\t\t\t\t\t\t\tdisplayedWeightsWarning = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar wIndex = [ 0, 0, 0, 0 ];\n\t\t\t\t\t\tvar Weight = [ 0, 0, 0, 0 ];\n\n\t\t\t\t\t\tweights.forEach( function ( weight, weightIndex ) {\n\n\t\t\t\t\t\t\tvar currentWeight = weight;\n\t\t\t\t\t\t\tvar currentIndex = weightIndices[ weightIndex ];\n\n\t\t\t\t\t\t\tWeight.forEach( function ( comparedWeight, comparedWeightIndex, comparedWeightArray ) {\n\n\t\t\t\t\t\t\t\tif ( currentWeight > comparedWeight ) {\n\n\t\t\t\t\t\t\t\t\tcomparedWeightArray[ comparedWeightIndex ] = currentWeight;\n\t\t\t\t\t\t\t\t\tcurrentWeight = comparedWeight;\n\n\t\t\t\t\t\t\t\t\tvar tmp = wIndex[ comparedWeightIndex ];\n\t\t\t\t\t\t\t\t\twIndex[ comparedWeightIndex ] = currentIndex;\n\t\t\t\t\t\t\t\t\tcurrentIndex = tmp;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tweightIndices = wIndex;\n\t\t\t\t\t\tweights = Weight;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if the weight array is shorter than 4 pad with 0s\n\t\t\t\t\twhile ( weights.length < 4 ) {\n\n\t\t\t\t\t\tweights.push( 0 );\n\t\t\t\t\t\tweightIndices.push( 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0; i < 4; ++ i ) {\n\n\t\t\t\t\t\tfaceWeights.push( weights[ i ] );\n\t\t\t\t\t\tfaceWeightIndices.push( weightIndices[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\t\tvar data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal );\n\n\t\t\t\t\tfaceNormals.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\t\tvar materialIndex = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material )[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\t\tgeoInfo.uv.forEach( function ( uv, i ) {\n\n\t\t\t\t\t\tvar data = getData( polygonVertexIndex, polygonIndex, vertexIndex, uv );\n\n\t\t\t\t\t\tif ( faceUVs[ i ] === undefined ) {\n\n\t\t\t\t\t\t\tfaceUVs[ i ] = [];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfaceUVs[ i ].push( data[ 0 ] );\n\t\t\t\t\t\tfaceUVs[ i ].push( data[ 1 ] );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tfaceLength ++;\n\n\t\t\t\tif ( endOfFace ) {\n\n\t\t\t\t\tscope.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );\n\n\t\t\t\t\tpolygonIndex ++;\n\t\t\t\t\tfaceLength = 0;\n\n\t\t\t\t\t// reset arrays for the next face\n\t\t\t\t\tfacePositionIndexes = [];\n\t\t\t\t\tfaceNormals = [];\n\t\t\t\t\tfaceColors = [];\n\t\t\t\t\tfaceUVs = [];\n\t\t\t\t\tfaceWeights = [];\n\t\t\t\t\tfaceWeightIndices = [];\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn buffers;\n\n\t\t},\n\n\t\t// Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris\n\t\tgenFace: function ( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength ) {\n\n\t\t\tfor ( var i = 2; i < faceLength; i ++ ) {\n\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ 0 ] ] );\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ 1 ] ] );\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ 2 ] ] );\n\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ ( i - 1 ) * 3 ] ] );\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ ( i - 1 ) * 3 + 1 ] ] );\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ ( i - 1 ) * 3 + 2 ] ] );\n\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i * 3 ] ] );\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i * 3 + 1 ] ] );\n\t\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i * 3 + 2 ] ] );\n\n\t\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ 0 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ 1 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ 2 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ 3 ] );\n\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ ( i - 1 ) * 4 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ ( i - 1 ) * 4 + 1 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ ( i - 1 ) * 4 + 2 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ ( i - 1 ) * 4 + 3 ] );\n\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i * 4 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i * 4 + 1 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i * 4 + 2 ] );\n\t\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i * 4 + 3 ] );\n\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ 0 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ 1 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ 2 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ 3 ] );\n\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ ( i - 1 ) * 4 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ ( i - 1 ) * 4 + 1 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ ( i - 1 ) * 4 + 2 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ ( i - 1 ) * 4 + 3 ] );\n\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i * 4 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i * 4 + 1 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i * 4 + 2 ] );\n\t\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i * 4 + 3 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\t\tbuffers.colors.push( faceColors[ 0 ] );\n\t\t\t\t\tbuffers.colors.push( faceColors[ 1 ] );\n\t\t\t\t\tbuffers.colors.push( faceColors[ 2 ] );\n\n\t\t\t\t\tbuffers.colors.push( faceColors[ ( i - 1 ) * 3 ] );\n\t\t\t\t\tbuffers.colors.push( faceColors[ ( i - 1 ) * 3 + 1 ] );\n\t\t\t\t\tbuffers.colors.push( faceColors[ ( i - 1 ) * 3 + 2 ] );\n\n\t\t\t\t\tbuffers.colors.push( faceColors[ i * 3 ] );\n\t\t\t\t\tbuffers.colors.push( faceColors[ i * 3 + 1 ] );\n\t\t\t\t\tbuffers.colors.push( faceColors[ i * 3 + 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\t\tbuffers.normal.push( faceNormals[ 0 ] );\n\t\t\t\t\tbuffers.normal.push( faceNormals[ 1 ] );\n\t\t\t\t\tbuffers.normal.push( faceNormals[ 2 ] );\n\n\t\t\t\t\tbuffers.normal.push( faceNormals[ ( i - 1 ) * 3 ] );\n\t\t\t\t\tbuffers.normal.push( faceNormals[ ( i - 1 ) * 3 + 1 ] );\n\t\t\t\t\tbuffers.normal.push( faceNormals[ ( i - 1 ) * 3 + 2 ] );\n\n\t\t\t\t\tbuffers.normal.push( faceNormals[ i * 3 ] );\n\t\t\t\t\tbuffers.normal.push( faceNormals[ i * 3 + 1 ] );\n\t\t\t\t\tbuffers.normal.push( faceNormals[ i * 3 + 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\t\tgeoInfo.uv.forEach( function ( uv, j ) {\n\n\t\t\t\t\t\tif ( buffers.uvs[ j ] === undefined ) buffers.uvs[ j ] = [];\n\n\t\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ 0 ] );\n\t\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ 1 ] );\n\n\t\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ ( i - 1 ) * 2 ] );\n\t\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ ( i - 1 ) * 2 + 1 ] );\n\n\t\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i * 2 ] );\n\t\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i * 2 + 1 ] );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\taddMorphTargets: function ( parentGeo, parentGeoNode, morphTargets, preTransform ) {\n\n\t\t\tif ( morphTargets.length === 0 ) return;\n\n\t\t\tparentGeo.morphTargetsRelative = true;\n\n\t\t\tparentGeo.morphAttributes.position = [];\n\t\t\t// parentGeo.morphAttributes.normal = []; // not implemented\n\n\t\t\tvar scope = this;\n\t\t\tmorphTargets.forEach( function ( morphTarget ) {\n\n\t\t\t\tmorphTarget.rawTargets.forEach( function ( rawTarget ) {\n\n\t\t\t\t\tvar morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];\n\n\t\t\t\t\tif ( morphGeoNode !== undefined ) {\n\n\t\t\t\t\t\tscope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t},\n\n\t\t// a morph geometry node is similar to a standard node, and the node is also contained\n\t\t// in FBXTree.Objects.Geometry, however it can only have attributes for position, normal\n\t\t// and a special attribute Index defining which vertices of the original geometry are affected\n\t\t// Normal and position attributes only have data for the vertices that are affected by the morph\n\t\tgenMorphGeometry: function ( parentGeo, parentGeoNode, morphGeoNode, preTransform, name ) {\n\n\t\t\tvar vertexIndices = ( parentGeoNode.PolygonVertexIndex !== undefined ) ? parentGeoNode.PolygonVertexIndex.a : [];\n\n\t\t\tvar morphPositionsSparse = ( morphGeoNode.Vertices !== undefined ) ? morphGeoNode.Vertices.a : [];\n\t\t\tvar indices = ( morphGeoNode.Indexes !== undefined ) ? morphGeoNode.Indexes.a : [];\n\n\t\t\tvar length = parentGeo.attributes.position.count * 3;\n\t\t\tvar morphPositions = new Float32Array( length );\n\n\t\t\tfor ( var i = 0; i < indices.length; i ++ ) {\n\n\t\t\t\tvar morphIndex = indices[ i ] * 3;\n\n\t\t\t\tmorphPositions[ morphIndex ] = morphPositionsSparse[ i * 3 ];\n\t\t\t\tmorphPositions[ morphIndex + 1 ] = morphPositionsSparse[ i * 3 + 1 ];\n\t\t\t\tmorphPositions[ morphIndex + 2 ] = morphPositionsSparse[ i * 3 + 2 ];\n\n\t\t\t}\n\n\t\t\t// TODO: add morph normal support\n\t\t\tvar morphGeoInfo = {\n\t\t\t\tvertexIndices: vertexIndices,\n\t\t\t\tvertexPositions: morphPositions,\n\n\t\t\t};\n\n\t\t\tvar morphBuffers = this.genBuffers( morphGeoInfo );\n\n\t\t\tvar positionAttribute = new Float32BufferAttribute( morphBuffers.vertex, 3 );\n\t\t\tpositionAttribute.name = name || morphGeoNode.attrName;\n\n\t\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\t\tparentGeo.morphAttributes.position.push( positionAttribute );\n\n\t\t},\n\n\t\t// Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists\n\t\tparseNormals: function ( NormalNode ) {\n\n\t\t\tvar mappingType = NormalNode.MappingInformationType;\n\t\t\tvar referenceType = NormalNode.ReferenceInformationType;\n\t\t\tvar buffer = NormalNode.Normals.a;\n\t\t\tvar indexBuffer = [];\n\t\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\t\tif ( 'NormalIndex' in NormalNode ) {\n\n\t\t\t\t\tindexBuffer = NormalNode.NormalIndex.a;\n\n\t\t\t\t} else if ( 'NormalsIndex' in NormalNode ) {\n\n\t\t\t\t\tindexBuffer = NormalNode.NormalsIndex.a;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdataSize: 3,\n\t\t\t\tbuffer: buffer,\n\t\t\t\tindices: indexBuffer,\n\t\t\t\tmappingType: mappingType,\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t},\n\n\t\t// Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists\n\t\tparseUVs: function ( UVNode ) {\n\n\t\t\tvar mappingType = UVNode.MappingInformationType;\n\t\t\tvar referenceType = UVNode.ReferenceInformationType;\n\t\t\tvar buffer = UVNode.UV.a;\n\t\t\tvar indexBuffer = [];\n\t\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\t\tindexBuffer = UVNode.UVIndex.a;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdataSize: 2,\n\t\t\t\tbuffer: buffer,\n\t\t\t\tindices: indexBuffer,\n\t\t\t\tmappingType: mappingType,\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t},\n\n\t\t// Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists\n\t\tparseVertexColors: function ( ColorNode ) {\n\n\t\t\tvar mappingType = ColorNode.MappingInformationType;\n\t\t\tvar referenceType = ColorNode.ReferenceInformationType;\n\t\t\tvar buffer = ColorNode.Colors.a;\n\t\t\tvar indexBuffer = [];\n\t\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\t\tindexBuffer = ColorNode.ColorIndex.a;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdataSize: 4,\n\t\t\t\tbuffer: buffer,\n\t\t\t\tindices: indexBuffer,\n\t\t\t\tmappingType: mappingType,\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t},\n\n\t\t// Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists\n\t\tparseMaterialIndices: function ( MaterialNode ) {\n\n\t\t\tvar mappingType = MaterialNode.MappingInformationType;\n\t\t\tvar referenceType = MaterialNode.ReferenceInformationType;\n\n\t\t\tif ( mappingType === 'NoMappingInformation' ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tdataSize: 1,\n\t\t\t\t\tbuffer: [ 0 ],\n\t\t\t\t\tindices: [ 0 ],\n\t\t\t\t\tmappingType: 'AllSame',\n\t\t\t\t\treferenceType: referenceType\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar materialIndexBuffer = MaterialNode.Materials.a;\n\n\t\t\t// Since materials are stored as indices, there's a bit of a mismatch between FBX and what\n\t\t\t// we expect.So we create an intermediate buffer that points to the index in the buffer,\n\t\t\t// for conforming with the other functions we've written for other data.\n\t\t\tvar materialIndices = [];\n\n\t\t\tfor ( var i = 0; i < materialIndexBuffer.length; ++ i ) {\n\n\t\t\t\tmaterialIndices.push( i );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdataSize: 1,\n\t\t\t\tbuffer: materialIndexBuffer,\n\t\t\t\tindices: materialIndices,\n\t\t\t\tmappingType: mappingType,\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t},\n\n\t\t// Generate a NurbGeometry from a node in FBXTree.Objects.Geometry\n\t\tparseNurbsGeometry: function ( geoNode ) {\n\n\t\t\tif ( NURBSCurve === undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.FBXLoader: The loader relies on NURBSCurve for any nurbs present in the model. Nurbs will show up as empty geometry.' );\n\t\t\t\treturn new BufferGeometry();\n\n\t\t\t}\n\n\t\t\tvar order = parseInt( geoNode.Order );\n\n\t\t\tif ( isNaN( order ) ) {\n\n\t\t\t\tconsole.error( 'THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geoNode.Order, geoNode.id );\n\t\t\t\treturn new BufferGeometry();\n\n\t\t\t}\n\n\t\t\tvar degree = order - 1;\n\n\t\t\tvar knots = geoNode.KnotVector.a;\n\t\t\tvar controlPoints = [];\n\t\t\tvar pointsValues = geoNode.Points.a;\n\n\t\t\tfor ( var i = 0, l = pointsValues.length; i < l; i += 4 ) {\n\n\t\t\t\tcontrolPoints.push( new Vector4().fromArray( pointsValues, i ) );\n\n\t\t\t}\n\n\t\t\tvar startKnot, endKnot;\n\n\t\t\tif ( geoNode.Form === 'Closed' ) {\n\n\t\t\t\tcontrolPoints.push( controlPoints[ 0 ] );\n\n\t\t\t} else if ( geoNode.Form === 'Periodic' ) {\n\n\t\t\t\tstartKnot = degree;\n\t\t\t\tendKnot = knots.length - 1 - startKnot;\n\n\t\t\t\tfor ( var i = 0; i < degree; ++ i ) {\n\n\t\t\t\t\tcontrolPoints.push( controlPoints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar curve = new NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );\n\t\t\tvar vertices = curve.getPoints( controlPoints.length * 7 );\n\n\t\t\tvar positions = new Float32Array( vertices.length * 3 );\n\n\t\t\tvertices.forEach( function ( vertex, i ) {\n\n\t\t\t\tvertex.toArray( positions, i * 3 );\n\n\t\t\t} );\n\n\t\t\tvar geometry = new BufferGeometry();\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t},\n\n\t};\n\n\t// parse animation data from FBXTree\n\tfunction AnimationParser() {}\n\n\tAnimationParser.prototype = {\n\n\t\tconstructor: AnimationParser,\n\n\t\t// take raw animation clips and turn them into three.js animation clips\n\t\tparse: function () {\n\n\t\t\tvar animationClips = [];\n\n\t\t\tvar rawClips = this.parseClips();\n\n\t\t\tif ( rawClips !== undefined ) {\n\n\t\t\t\tfor ( var key in rawClips ) {\n\n\t\t\t\t\tvar rawClip = rawClips[ key ];\n\n\t\t\t\t\tvar clip = this.addClip( rawClip );\n\n\t\t\t\t\tanimationClips.push( clip );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn animationClips;\n\n\t\t},\n\n\t\tparseClips: function () {\n\n\t\t\t// since the actual transformation data is stored in FBXTree.Objects.AnimationCurve,\n\t\t\t// if this is undefined we can safely assume there are no animations\n\t\t\tif ( fbxTree.Objects.AnimationCurve === undefined ) return undefined;\n\n\t\t\tvar curveNodesMap = this.parseAnimationCurveNodes();\n\n\t\t\tthis.parseAnimationCurves( curveNodesMap );\n\n\t\t\tvar layersMap = this.parseAnimationLayers( curveNodesMap );\n\t\t\tvar rawClips = this.parseAnimStacks( layersMap );\n\n\t\t\treturn rawClips;\n\n\t\t},\n\n\t\t// parse nodes in FBXTree.Objects.AnimationCurveNode\n\t\t// each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation )\n\t\t// and is referenced by an AnimationLayer\n\t\tparseAnimationCurveNodes: function () {\n\n\t\t\tvar rawCurveNodes = fbxTree.Objects.AnimationCurveNode;\n\n\t\t\tvar curveNodesMap = new Map();\n\n\t\t\tfor ( var nodeID in rawCurveNodes ) {\n\n\t\t\t\tvar rawCurveNode = rawCurveNodes[ nodeID ];\n\n\t\t\t\tif ( rawCurveNode.attrName.match( /S|R|T|DeformPercent/ ) !== null ) {\n\n\t\t\t\t\tvar curveNode = {\n\n\t\t\t\t\t\tid: rawCurveNode.id,\n\t\t\t\t\t\tattr: rawCurveNode.attrName,\n\t\t\t\t\t\tcurves: {},\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurveNodesMap.set( curveNode.id, curveNode );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn curveNodesMap;\n\n\t\t},\n\n\t\t// parse nodes in FBXTree.Objects.AnimationCurve and connect them up to\n\t\t// previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated\n\t\t// axis ( e.g. times and values of x rotation)\n\t\tparseAnimationCurves: function ( curveNodesMap ) {\n\n\t\t\tvar rawCurves = fbxTree.Objects.AnimationCurve;\n\n\t\t\t// TODO: Many values are identical up to roundoff error, but won't be optimised\n\t\t\t// e.g. position times: [0, 0.4, 0. 8]\n\t\t\t// position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809]\n\t\t\t// clearly, this should be optimised to\n\t\t\t// times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809]\n\t\t\t// this shows up in nearly every FBX file, and generally time array is length > 100\n\n\t\t\tfor ( var nodeID in rawCurves ) {\n\n\t\t\t\tvar animationCurve = {\n\n\t\t\t\t\tid: rawCurves[ nodeID ].id,\n\t\t\t\t\ttimes: rawCurves[ nodeID ].KeyTime.a.map( convertFBXTimeToSeconds ),\n\t\t\t\t\tvalues: rawCurves[ nodeID ].KeyValueFloat.a,\n\n\t\t\t\t};\n\n\t\t\t\tvar relationships = connections.get( animationCurve.id );\n\n\t\t\t\tif ( relationships !== undefined ) {\n\n\t\t\t\t\tvar animationCurveID = relationships.parents[ 0 ].ID;\n\t\t\t\t\tvar animationCurveRelationship = relationships.parents[ 0 ].relationship;\n\n\t\t\t\t\tif ( animationCurveRelationship.match( /X/ ) ) {\n\n\t\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'x' ] = animationCurve;\n\n\t\t\t\t\t} else if ( animationCurveRelationship.match( /Y/ ) ) {\n\n\t\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'y' ] = animationCurve;\n\n\t\t\t\t\t} else if ( animationCurveRelationship.match( /Z/ ) ) {\n\n\t\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'z' ] = animationCurve;\n\n\t\t\t\t\t} else if ( animationCurveRelationship.match( /d|DeformPercent/ ) && curveNodesMap.has( animationCurveID ) ) {\n\n\t\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'morph' ] = animationCurve;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references\n\t\t// to various AnimationCurveNodes and is referenced by an AnimationStack node\n\t\t// note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack\n\t\tparseAnimationLayers: function ( curveNodesMap ) {\n\n\t\t\tvar rawLayers = fbxTree.Objects.AnimationLayer;\n\n\t\t\tvar layersMap = new Map();\n\n\t\t\tfor ( var nodeID in rawLayers ) {\n\n\t\t\t\tvar layerCurveNodes = [];\n\n\t\t\t\tvar connection = connections.get( parseInt( nodeID ) );\n\n\t\t\t\tif ( connection !== undefined ) {\n\n\t\t\t\t\t// all the animationCurveNodes used in the layer\n\t\t\t\t\tvar children = connection.children;\n\n\t\t\t\t\tchildren.forEach( function ( child, i ) {\n\n\t\t\t\t\t\tif ( curveNodesMap.has( child.ID ) ) {\n\n\t\t\t\t\t\t\tvar curveNode = curveNodesMap.get( child.ID );\n\n\t\t\t\t\t\t\t// check that the curves are defined for at least one axis, otherwise ignore the curveNode\n\t\t\t\t\t\t\tif ( curveNode.curves.x !== undefined || curveNode.curves.y !== undefined || curveNode.curves.z !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\t\tvar modelID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t\tif ( modelID !== undefined ) {\n\n\t\t\t\t\t\t\t\t\t\tvar rawModel = fbxTree.Objects.Model[ modelID.toString() ];\n\n\t\t\t\t\t\t\t\t\t\tif ( rawModel === undefined ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered a unused curve.', child );\n\t\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tvar node = {\n\n\t\t\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\t\t\tID: rawModel.id,\n\t\t\t\t\t\t\t\t\t\t\tinitialPosition: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\t\tinitialRotation: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\t\tinitialScale: [ 1, 1, 1 ],\n\n\t\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t\tsceneGraph.traverse( function ( child ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( child.ID === rawModel.id ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tnode.transform = child.matrix;\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( child.userData.transformData ) node.eulerOrder = child.userData.transformData.eulerOrder;\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t\t\tif ( ! node.transform ) node.transform = new Matrix4();\n\n\t\t\t\t\t\t\t\t\t\t// if the animated model is pre rotated, we'll have to apply the pre rotations to every\n\t\t\t\t\t\t\t\t\t\t// animation value as well\n\t\t\t\t\t\t\t\t\t\tif ( 'PreRotation' in rawModel ) node.preRotation = rawModel.PreRotation.value;\n\t\t\t\t\t\t\t\t\t\tif ( 'PostRotation' in rawModel ) node.postRotation = rawModel.PostRotation.value;\n\n\t\t\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] ) layerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t\t} else if ( curveNode.curves.morph !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\t\tvar deformerID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t\tvar morpherID = connections.get( deformerID ).parents[ 0 ].ID;\n\t\t\t\t\t\t\t\t\tvar geoID = connections.get( morpherID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t\t// assuming geometry is not used in more than one model\n\t\t\t\t\t\t\t\t\tvar modelID = connections.get( geoID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t\tvar rawModel = fbxTree.Objects.Model[ modelID ];\n\n\t\t\t\t\t\t\t\t\tvar node = {\n\n\t\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\t\tmorphName: fbxTree.Objects.Deformer[ deformerID ].attrName,\n\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tlayerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tlayersMap.set( parseInt( nodeID ), layerCurveNodes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn layersMap;\n\n\t\t},\n\n\t\t// parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation\n\t\t// hierarchy. Each Stack node will be used to create a AnimationClip\n\t\tparseAnimStacks: function ( layersMap ) {\n\n\t\t\tvar rawStacks = fbxTree.Objects.AnimationStack;\n\n\t\t\t// connect the stacks (clips) up to the layers\n\t\t\tvar rawClips = {};\n\n\t\t\tfor ( var nodeID in rawStacks ) {\n\n\t\t\t\tvar children = connections.get( parseInt( nodeID ) ).children;\n\n\t\t\t\tif ( children.length > 1 ) {\n\n\t\t\t\t\t// it seems like stacks will always be associated with a single layer. But just in case there are files\n\t\t\t\t\t// where there are multiple layers per stack, we'll display a warning\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.' );\n\n\t\t\t\t}\n\n\t\t\t\tvar layer = layersMap.get( children[ 0 ].ID );\n\n\t\t\t\trawClips[ nodeID ] = {\n\n\t\t\t\t\tname: rawStacks[ nodeID ].attrName,\n\t\t\t\t\tlayer: layer,\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn rawClips;\n\n\t\t},\n\n\t\taddClip: function ( rawClip ) {\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar scope = this;\n\t\t\trawClip.layer.forEach( function ( rawTracks ) {\n\n\t\t\t\ttracks = tracks.concat( scope.generateTracks( rawTracks ) );\n\n\t\t\t} );\n\n\t\t\treturn new AnimationClip( rawClip.name, - 1, tracks );\n\n\t\t},\n\n\t\tgenerateTracks: function ( rawTracks ) {\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar initialPosition = new Vector3();\n\t\t\tvar initialRotation = new Quaternion();\n\t\t\tvar initialScale = new Vector3();\n\n\t\t\tif ( rawTracks.transform ) rawTracks.transform.decompose( initialPosition, initialRotation, initialScale );\n\n\t\t\tinitialPosition = initialPosition.toArray();\n\t\t\tinitialRotation = new Euler().setFromQuaternion( initialRotation, rawTracks.eulerOrder ).toArray();\n\t\t\tinitialScale = initialScale.toArray();\n\n\t\t\tif ( rawTracks.T !== undefined && Object.keys( rawTracks.T.curves ).length > 0 ) {\n\n\t\t\t\tvar positionTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.T.curves, initialPosition, 'position' );\n\t\t\t\tif ( positionTrack !== undefined ) tracks.push( positionTrack );\n\n\t\t\t}\n\n\t\t\tif ( rawTracks.R !== undefined && Object.keys( rawTracks.R.curves ).length > 0 ) {\n\n\t\t\t\tvar rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, initialRotation, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder );\n\t\t\t\tif ( rotationTrack !== undefined ) tracks.push( rotationTrack );\n\n\t\t\t}\n\n\t\t\tif ( rawTracks.S !== undefined && Object.keys( rawTracks.S.curves ).length > 0 ) {\n\n\t\t\t\tvar scaleTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.S.curves, initialScale, 'scale' );\n\t\t\t\tif ( scaleTrack !== undefined ) tracks.push( scaleTrack );\n\n\t\t\t}\n\n\t\t\tif ( rawTracks.DeformPercent !== undefined ) {\n\n\t\t\t\tvar morphTrack = this.generateMorphTrack( rawTracks );\n\t\t\t\tif ( morphTrack !== undefined ) tracks.push( morphTrack );\n\n\t\t\t}\n\n\t\t\treturn tracks;\n\n\t\t},\n\n\t\tgenerateVectorTrack: function ( modelName, curves, initialValue, type ) {\n\n\t\t\tvar times = this.getTimesForAllAxes( curves );\n\t\t\tvar values = this.getKeyframeTrackValues( times, curves, initialValue );\n\n\t\t\treturn new VectorKeyframeTrack( modelName + '.' + type, times, values );\n\n\t\t},\n\n\t\tgenerateRotationTrack: function ( modelName, curves, initialValue, preRotation, postRotation, eulerOrder ) {\n\n\t\t\tif ( curves.x !== undefined ) {\n\n\t\t\t\tthis.interpolateRotations( curves.x );\n\t\t\t\tcurves.x.values = curves.x.values.map( MathUtils.degToRad );\n\n\t\t\t}\n\n\t\t\tif ( curves.y !== undefined ) {\n\n\t\t\t\tthis.interpolateRotations( curves.y );\n\t\t\t\tcurves.y.values = curves.y.values.map( MathUtils.degToRad );\n\n\t\t\t}\n\n\t\t\tif ( curves.z !== undefined ) {\n\n\t\t\t\tthis.interpolateRotations( curves.z );\n\t\t\t\tcurves.z.values = curves.z.values.map( MathUtils.degToRad );\n\n\t\t\t}\n\n\t\t\tvar times = this.getTimesForAllAxes( curves );\n\t\t\tvar values = this.getKeyframeTrackValues( times, curves, initialValue );\n\n\t\t\tif ( preRotation !== undefined ) {\n\n\t\t\t\tpreRotation = preRotation.map( MathUtils.degToRad );\n\t\t\t\tpreRotation.push( eulerOrder );\n\n\t\t\t\tpreRotation = new Euler().fromArray( preRotation );\n\t\t\t\tpreRotation = new Quaternion().setFromEuler( preRotation );\n\n\t\t\t}\n\n\t\t\tif ( postRotation !== undefined ) {\n\n\t\t\t\tpostRotation = postRotation.map( MathUtils.degToRad );\n\t\t\t\tpostRotation.push( eulerOrder );\n\n\t\t\t\tpostRotation = new Euler().fromArray( postRotation );\n\t\t\t\tpostRotation = new Quaternion().setFromEuler( postRotation ).inverse();\n\n\t\t\t}\n\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar euler = new Euler();\n\n\t\t\tvar quaternionValues = [];\n\n\t\t\tfor ( var i = 0; i < values.length; i += 3 ) {\n\n\t\t\t\teuler.set( values[ i ], values[ i + 1 ], values[ i + 2 ], eulerOrder );\n\n\t\t\t\tquaternion.setFromEuler( euler );\n\n\t\t\t\tif ( preRotation !== undefined ) quaternion.premultiply( preRotation );\n\t\t\t\tif ( postRotation !== undefined ) quaternion.multiply( postRotation );\n\n\t\t\t\tquaternion.toArray( quaternionValues, ( i / 3 ) * 4 );\n\n\t\t\t}\n\n\t\t\treturn new QuaternionKeyframeTrack( modelName + '.quaternion', times, quaternionValues );\n\n\t\t},\n\n\t\tgenerateMorphTrack: function ( rawTracks ) {\n\n\t\t\tvar curves = rawTracks.DeformPercent.curves.morph;\n\t\t\tvar values = curves.values.map( function ( val ) {\n\n\t\t\t\treturn val / 100;\n\n\t\t\t} );\n\n\t\t\tvar morphNum = sceneGraph.getObjectByName( rawTracks.modelName ).morphTargetDictionary[ rawTracks.morphName ];\n\n\t\t\treturn new NumberKeyframeTrack( rawTracks.modelName + '.morphTargetInfluences[' + morphNum + ']', curves.times, values );\n\n\t\t},\n\n\t\t// For all animated objects, times are defined separately for each axis\n\t\t// Here we'll combine the times into one sorted array without duplicates\n\t\tgetTimesForAllAxes: function ( curves ) {\n\n\t\t\tvar times = [];\n\n\t\t\t// first join together the times for each axis, if defined\n\t\t\tif ( curves.x !== undefined ) times = times.concat( curves.x.times );\n\t\t\tif ( curves.y !== undefined ) times = times.concat( curves.y.times );\n\t\t\tif ( curves.z !== undefined ) times = times.concat( curves.z.times );\n\n\t\t\t// then sort them and remove duplicates\n\t\t\ttimes = times.sort( function ( a, b ) {\n\n\t\t\t\treturn a - b;\n\n\t\t\t} ).filter( function ( elem, index, array ) {\n\n\t\t\t\treturn array.indexOf( elem ) == index;\n\n\t\t\t} );\n\n\t\t\treturn times;\n\n\t\t},\n\n\t\tgetKeyframeTrackValues: function ( times, curves, initialValue ) {\n\n\t\t\tvar prevValue = initialValue;\n\n\t\t\tvar values = [];\n\n\t\t\tvar xIndex = - 1;\n\t\t\tvar yIndex = - 1;\n\t\t\tvar zIndex = - 1;\n\n\t\t\ttimes.forEach( function ( time ) {\n\n\t\t\t\tif ( curves.x ) xIndex = curves.x.times.indexOf( time );\n\t\t\t\tif ( curves.y ) yIndex = curves.y.times.indexOf( time );\n\t\t\t\tif ( curves.z ) zIndex = curves.z.times.indexOf( time );\n\n\t\t\t\t// if there is an x value defined for this frame, use that\n\t\t\t\tif ( xIndex !== - 1 ) {\n\n\t\t\t\t\tvar xValue = curves.x.values[ xIndex ];\n\t\t\t\t\tvalues.push( xValue );\n\t\t\t\t\tprevValue[ 0 ] = xValue;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// otherwise use the x value from the previous frame\n\t\t\t\t\tvalues.push( prevValue[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( yIndex !== - 1 ) {\n\n\t\t\t\t\tvar yValue = curves.y.values[ yIndex ];\n\t\t\t\t\tvalues.push( yValue );\n\t\t\t\t\tprevValue[ 1 ] = yValue;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvalues.push( prevValue[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( zIndex !== - 1 ) {\n\n\t\t\t\t\tvar zValue = curves.z.values[ zIndex ];\n\t\t\t\t\tvalues.push( zValue );\n\t\t\t\t\tprevValue[ 2 ] = zValue;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvalues.push( prevValue[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn values;\n\n\t\t},\n\n\t\t// Rotations are defined as Euler angles which can have values of any size\n\t\t// These will be converted to quaternions which don't support values greater than\n\t\t// PI, so we'll interpolate large rotations\n\t\tinterpolateRotations: function ( curve ) {\n\n\t\t\tfor ( var i = 1; i < curve.values.length; i ++ ) {\n\n\t\t\t\tvar initialValue = curve.values[ i - 1 ];\n\t\t\t\tvar valuesSpan = curve.values[ i ] - initialValue;\n\n\t\t\t\tvar absoluteSpan = Math.abs( valuesSpan );\n\n\t\t\t\tif ( absoluteSpan >= 180 ) {\n\n\t\t\t\t\tvar numSubIntervals = absoluteSpan / 180;\n\n\t\t\t\t\tvar step = valuesSpan / numSubIntervals;\n\t\t\t\t\tvar nextValue = initialValue + step;\n\n\t\t\t\t\tvar initialTime = curve.times[ i - 1 ];\n\t\t\t\t\tvar timeSpan = curve.times[ i ] - initialTime;\n\t\t\t\t\tvar interval = timeSpan / numSubIntervals;\n\t\t\t\t\tvar nextTime = initialTime + interval;\n\n\t\t\t\t\tvar interpolatedTimes = [];\n\t\t\t\t\tvar interpolatedValues = [];\n\n\t\t\t\t\twhile ( nextTime < curve.times[ i ] ) {\n\n\t\t\t\t\t\tinterpolatedTimes.push( nextTime );\n\t\t\t\t\t\tnextTime += interval;\n\n\t\t\t\t\t\tinterpolatedValues.push( nextValue );\n\t\t\t\t\t\tnextValue += step;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurve.times = inject( curve.times, i, interpolatedTimes );\n\t\t\t\t\tcurve.values = inject( curve.values, i, interpolatedValues );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t};\n\n\t// parse an FBX file in ASCII format\n\tfunction TextParser() {}\n\n\tTextParser.prototype = {\n\n\t\tconstructor: TextParser,\n\n\t\tgetPrevNode: function () {\n\n\t\t\treturn this.nodeStack[ this.currentIndent - 2 ];\n\n\t\t},\n\n\t\tgetCurrentNode: function () {\n\n\t\t\treturn this.nodeStack[ this.currentIndent - 1 ];\n\n\t\t},\n\n\t\tgetCurrentProp: function () {\n\n\t\t\treturn this.currentProp;\n\n\t\t},\n\n\t\tpushStack: function ( node ) {\n\n\t\t\tthis.nodeStack.push( node );\n\t\t\tthis.currentIndent += 1;\n\n\t\t},\n\n\t\tpopStack: function () {\n\n\t\t\tthis.nodeStack.pop();\n\t\t\tthis.currentIndent -= 1;\n\n\t\t},\n\n\t\tsetCurrentProp: function ( val, name ) {\n\n\t\t\tthis.currentProp = val;\n\t\t\tthis.currentPropName = name;\n\n\t\t},\n\n\t\tparse: function ( text ) {\n\n\t\t\tthis.currentIndent = 0;\n\n\t\t\tthis.allNodes = new FBXTree();\n\t\t\tthis.nodeStack = [];\n\t\t\tthis.currentProp = [];\n\t\t\tthis.currentPropName = '';\n\n\t\t\tvar scope = this;\n\n\t\t\tvar split = text.split( /[\\r\\n]+/ );\n\n\t\t\tsplit.forEach( function ( line, i ) {\n\n\t\t\t\tvar matchComment = line.match( /^[\\s\\t]*;/ );\n\t\t\t\tvar matchEmpty = line.match( /^[\\s\\t]*$/ );\n\n\t\t\t\tif ( matchComment || matchEmpty ) return;\n\n\t\t\t\tvar matchBeginning = line.match( '^\\\\t{' + scope.currentIndent + '}(\\\\w+):(.*){', '' );\n\t\t\t\tvar matchProperty = line.match( '^\\\\t{' + ( scope.currentIndent ) + '}(\\\\w+):[\\\\s\\\\t\\\\r\\\\n](.*)' );\n\t\t\t\tvar matchEnd = line.match( '^\\\\t{' + ( scope.currentIndent - 1 ) + '}}' );\n\n\t\t\t\tif ( matchBeginning ) {\n\n\t\t\t\t\tscope.parseNodeBegin( line, matchBeginning );\n\n\t\t\t\t} else if ( matchProperty ) {\n\n\t\t\t\t\tscope.parseNodeProperty( line, matchProperty, split[ ++ i ] );\n\n\t\t\t\t} else if ( matchEnd ) {\n\n\t\t\t\t\tscope.popStack();\n\n\t\t\t\t} else if ( line.match( /^[^\\s\\t}]/ ) ) {\n\n\t\t\t\t\t// large arrays are split over multiple lines terminated with a ',' character\n\t\t\t\t\t// if this is encountered the line needs to be joined to the previous line\n\t\t\t\t\tscope.parseNodePropertyContinued( line );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn this.allNodes;\n\n\t\t},\n\n\t\tparseNodeBegin: function ( line, property ) {\n\n\t\t\tvar nodeName = property[ 1 ].trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\t\tvar nodeAttrs = property[ 2 ].split( ',' ).map( function ( attr ) {\n\n\t\t\t\treturn attr.trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\t\t} );\n\n\t\t\tvar node = { name: nodeName };\n\t\t\tvar attrs = this.parseNodeAttr( nodeAttrs );\n\n\t\t\tvar currentNode = this.getCurrentNode();\n\n\t\t\t// a top node\n\t\t\tif ( this.currentIndent === 0 ) {\n\n\t\t\t\tthis.allNodes.add( nodeName, node );\n\n\t\t\t} else { // a subnode\n\n\t\t\t\t// if the subnode already exists, append it\n\t\t\t\tif ( nodeName in currentNode ) {\n\n\t\t\t\t\t// special case Pose needs PoseNodes as an array\n\t\t\t\t\tif ( nodeName === 'PoseNode' ) {\n\n\t\t\t\t\t\tcurrentNode.PoseNode.push( node );\n\n\t\t\t\t\t} else if ( currentNode[ nodeName ].id !== undefined ) {\n\n\t\t\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\t\t\tcurrentNode[ nodeName ][ currentNode[ nodeName ].id ] = currentNode[ nodeName ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attrs.id !== '' ) currentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t\t} else if ( typeof attrs.id === 'number' ) {\n\n\t\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\t\tcurrentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t\t} else if ( nodeName !== 'Properties70' ) {\n\n\t\t\t\t\tif ( nodeName === 'PoseNode' )\tcurrentNode[ nodeName ] = [ node ];\n\t\t\t\t\telse currentNode[ nodeName ] = node;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( typeof attrs.id === 'number' ) node.id = attrs.id;\n\t\t\tif ( attrs.name !== '' ) node.attrName = attrs.name;\n\t\t\tif ( attrs.type !== '' ) node.attrType = attrs.type;\n\n\t\t\tthis.pushStack( node );\n\n\t\t},\n\n\t\tparseNodeAttr: function ( attrs ) {\n\n\t\t\tvar id = attrs[ 0 ];\n\n\t\t\tif ( attrs[ 0 ] !== '' ) {\n\n\t\t\t\tid = parseInt( attrs[ 0 ] );\n\n\t\t\t\tif ( isNaN( id ) ) {\n\n\t\t\t\t\tid = attrs[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar name = '', type = '';\n\n\t\t\tif ( attrs.length > 1 ) {\n\n\t\t\t\tname = attrs[ 1 ].replace( /^(\\w+)::/, '' );\n\t\t\t\ttype = attrs[ 2 ];\n\n\t\t\t}\n\n\t\t\treturn { id: id, name: name, type: type };\n\n\t\t},\n\n\t\tparseNodeProperty: function ( line, property, contentLine ) {\n\n\t\t\tvar propName = property[ 1 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\t\t\tvar propValue = property[ 2 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\n\t\t\t// for special case: base64 image data follows \"Content: ,\" line\n\t\t\t//\tContent: ,\n\t\t\t//\t \"/9j/4RDaRXhpZgAATU0A...\"\n\t\t\tif ( propName === 'Content' && propValue === ',' ) {\n\n\t\t\t\tpropValue = contentLine.replace( /\"/g, '' ).replace( /,$/, '' ).trim();\n\n\t\t\t}\n\n\t\t\tvar currentNode = this.getCurrentNode();\n\t\t\tvar parentName = currentNode.name;\n\n\t\t\tif ( parentName === 'Properties70' ) {\n\n\t\t\t\tthis.parseNodeSpecialProperty( line, propName, propValue );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// Connections\n\t\t\tif ( propName === 'C' ) {\n\n\t\t\t\tvar connProps = propValue.split( ',' ).slice( 1 );\n\t\t\t\tvar from = parseInt( connProps[ 0 ] );\n\t\t\t\tvar to = parseInt( connProps[ 1 ] );\n\n\t\t\t\tvar rest = propValue.split( ',' ).slice( 3 );\n\n\t\t\t\trest = rest.map( function ( elem ) {\n\n\t\t\t\t\treturn elem.trim().replace( /^\"/, '' );\n\n\t\t\t\t} );\n\n\t\t\t\tpropName = 'connections';\n\t\t\t\tpropValue = [ from, to ];\n\t\t\t\tappend( propValue, rest );\n\n\t\t\t\tif ( currentNode[ propName ] === undefined ) {\n\n\t\t\t\t\tcurrentNode[ propName ] = [];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Node\n\t\t\tif ( propName === 'Node' ) currentNode.id = propValue;\n\n\t\t\t// connections\n\t\t\tif ( propName in currentNode && Array.isArray( currentNode[ propName ] ) ) {\n\n\t\t\t\tcurrentNode[ propName ].push( propValue );\n\n\t\t\t} else {\n\n\t\t\t\tif ( propName !== 'a' ) currentNode[ propName ] = propValue;\n\t\t\t\telse currentNode.a = propValue;\n\n\t\t\t}\n\n\t\t\tthis.setCurrentProp( currentNode, propName );\n\n\t\t\t// convert string to array, unless it ends in ',' in which case more will be added to it\n\t\t\tif ( propName === 'a' && propValue.slice( - 1 ) !== ',' ) {\n\n\t\t\t\tcurrentNode.a = parseNumberArray( propValue );\n\n\t\t\t}\n\n\t\t},\n\n\t\tparseNodePropertyContinued: function ( line ) {\n\n\t\t\tvar currentNode = this.getCurrentNode();\n\n\t\t\tcurrentNode.a += line;\n\n\t\t\t// if the line doesn't end in ',' we have reached the end of the property value\n\t\t\t// so convert the string to an array\n\t\t\tif ( line.slice( - 1 ) !== ',' ) {\n\n\t\t\t\tcurrentNode.a = parseNumberArray( currentNode.a );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// parse \"Property70\"\n\t\tparseNodeSpecialProperty: function ( line, propName, propValue ) {\n\n\t\t\t// split this\n\t\t\t// P: \"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\",1,1,1\n\t\t\t// into array like below\n\t\t\t// [\"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\", \"1,1,1\" ]\n\t\t\tvar props = propValue.split( '\",' ).map( function ( prop ) {\n\n\t\t\t\treturn prop.trim().replace( /^\\\"/, '' ).replace( /\\s/, '_' );\n\n\t\t\t} );\n\n\t\t\tvar innerPropName = props[ 0 ];\n\t\t\tvar innerPropType1 = props[ 1 ];\n\t\t\tvar innerPropType2 = props[ 2 ];\n\t\t\tvar innerPropFlag = props[ 3 ];\n\t\t\tvar innerPropValue = props[ 4 ];\n\n\t\t\t// cast values where needed, otherwise leave as strings\n\t\t\tswitch ( innerPropType1 ) {\n\n\t\t\t\tcase 'int':\n\t\t\t\tcase 'enum':\n\t\t\t\tcase 'bool':\n\t\t\t\tcase 'ULongLong':\n\t\t\t\tcase 'double':\n\t\t\t\tcase 'Number':\n\t\t\t\tcase 'FieldOfView':\n\t\t\t\t\tinnerPropValue = parseFloat( innerPropValue );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Color':\n\t\t\t\tcase 'ColorRGB':\n\t\t\t\tcase 'Vector3D':\n\t\t\t\tcase 'Lcl_Translation':\n\t\t\t\tcase 'Lcl_Rotation':\n\t\t\t\tcase 'Lcl_Scaling':\n\t\t\t\t\tinnerPropValue = parseNumberArray( innerPropValue );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// CAUTION: these props must append to parent's parent\n\t\t\tthis.getPrevNode()[ innerPropName ] = {\n\n\t\t\t\t'type': innerPropType1,\n\t\t\t\t'type2': innerPropType2,\n\t\t\t\t'flag': innerPropFlag,\n\t\t\t\t'value': innerPropValue\n\n\t\t\t};\n\n\t\t\tthis.setCurrentProp( this.getPrevNode(), innerPropName );\n\n\t\t},\n\n\t};\n\n\t// Parse an FBX file in Binary format\n\tfunction BinaryParser() {}\n\n\tBinaryParser.prototype = {\n\n\t\tconstructor: BinaryParser,\n\n\t\tparse: function ( buffer ) {\n\n\t\t\tvar reader = new BinaryReader( buffer );\n\t\t\treader.skip( 23 ); // skip magic 23 bytes\n\n\t\t\tvar version = reader.getUint32();\n\n\t\t\tif ( version < 6400 ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + version );\n\n\t\t\t}\n\n\t\t\tvar allNodes = new FBXTree();\n\n\t\t\twhile ( ! this.endOfContent( reader ) ) {\n\n\t\t\t\tvar node = this.parseNode( reader, version );\n\t\t\t\tif ( node !== null ) allNodes.add( node.name, node );\n\n\t\t\t}\n\n\t\t\treturn allNodes;\n\n\t\t},\n\n\t\t// Check if reader has reached the end of content.\n\t\tendOfContent: function ( reader ) {\n\n\t\t\t// footer size: 160bytes + 16-byte alignment padding\n\t\t\t// - 16bytes: magic\n\t\t\t// - padding til 16-byte alignment (at least 1byte?)\n\t\t\t//\t(seems like some exporters embed fixed 15 or 16bytes?)\n\t\t\t// - 4bytes: magic\n\t\t\t// - 4bytes: version\n\t\t\t// - 120bytes: zero\n\t\t\t// - 16bytes: magic\n\t\t\tif ( reader.size() % 16 === 0 ) {\n\n\t\t\t\treturn ( ( reader.getOffset() + 160 + 16 ) & ~ 0xf ) >= reader.size();\n\n\t\t\t} else {\n\n\t\t\t\treturn reader.getOffset() + 160 + 16 >= reader.size();\n\n\t\t\t}\n\n\t\t},\n\n\t\t// recursively parse nodes until the end of the file is reached\n\t\tparseNode: function ( reader, version ) {\n\n\t\t\tvar node = {};\n\n\t\t\t// The first three data sizes depends on version.\n\t\t\tvar endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\t\t\tvar numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\n\t\t\t( version >= 7500 ) ? reader.getUint64() : reader.getUint32(); // the returned propertyListLen is not used\n\n\t\t\tvar nameLen = reader.getUint8();\n\t\t\tvar name = reader.getString( nameLen );\n\n\t\t\t// Regards this node as NULL-record if endOffset is zero\n\t\t\tif ( endOffset === 0 ) return null;\n\n\t\t\tvar propertyList = [];\n\n\t\t\tfor ( var i = 0; i < numProperties; i ++ ) {\n\n\t\t\t\tpropertyList.push( this.parseProperty( reader ) );\n\n\t\t\t}\n\n\t\t\t// Regards the first three elements in propertyList as id, attrName, and attrType\n\t\t\tvar id = propertyList.length > 0 ? propertyList[ 0 ] : '';\n\t\t\tvar attrName = propertyList.length > 1 ? propertyList[ 1 ] : '';\n\t\t\tvar attrType = propertyList.length > 2 ? propertyList[ 2 ] : '';\n\n\t\t\t// check if this node represents just a single property\n\t\t\t// like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}\n\t\t\tnode.singleProperty = ( numProperties === 1 && reader.getOffset() === endOffset ) ? true : false;\n\n\t\t\twhile ( endOffset > reader.getOffset() ) {\n\n\t\t\t\tvar subNode = this.parseNode( reader, version );\n\n\t\t\t\tif ( subNode !== null ) this.parseSubNode( name, node, subNode );\n\n\t\t\t}\n\n\t\t\tnode.propertyList = propertyList; // raw property list used by parent\n\n\t\t\tif ( typeof id === 'number' ) node.id = id;\n\t\t\tif ( attrName !== '' ) node.attrName = attrName;\n\t\t\tif ( attrType !== '' ) node.attrType = attrType;\n\t\t\tif ( name !== '' ) node.name = name;\n\n\t\t\treturn node;\n\n\t\t},\n\n\t\tparseSubNode: function ( name, node, subNode ) {\n\n\t\t\t// special case: child node is single property\n\t\t\tif ( subNode.singleProperty === true ) {\n\n\t\t\t\tvar value = subNode.propertyList[ 0 ];\n\n\t\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t\t\tsubNode.a = value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode[ subNode.name ] = value;\n\n\t\t\t\t}\n\n\t\t\t} else if ( name === 'Connections' && subNode.name === 'C' ) {\n\n\t\t\t\tvar array = [];\n\n\t\t\t\tsubNode.propertyList.forEach( function ( property, i ) {\n\n\t\t\t\t\t// first Connection is FBX type (OO, OP, etc.). We'll discard these\n\t\t\t\t\tif ( i !== 0 ) array.push( property );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( node.connections === undefined ) {\n\n\t\t\t\t\tnode.connections = [];\n\n\t\t\t\t}\n\n\t\t\t\tnode.connections.push( array );\n\n\t\t\t} else if ( subNode.name === 'Properties70' ) {\n\n\t\t\t\tvar keys = Object.keys( subNode );\n\n\t\t\t\tkeys.forEach( function ( key ) {\n\n\t\t\t\t\tnode[ key ] = subNode[ key ];\n\n\t\t\t\t} );\n\n\t\t\t} else if ( name === 'Properties70' && subNode.name === 'P' ) {\n\n\t\t\t\tvar innerPropName = subNode.propertyList[ 0 ];\n\t\t\t\tvar innerPropType1 = subNode.propertyList[ 1 ];\n\t\t\t\tvar innerPropType2 = subNode.propertyList[ 2 ];\n\t\t\t\tvar innerPropFlag = subNode.propertyList[ 3 ];\n\t\t\t\tvar innerPropValue;\n\n\t\t\t\tif ( innerPropName.indexOf( 'Lcl ' ) === 0 ) innerPropName = innerPropName.replace( 'Lcl ', 'Lcl_' );\n\t\t\t\tif ( innerPropType1.indexOf( 'Lcl ' ) === 0 ) innerPropType1 = innerPropType1.replace( 'Lcl ', 'Lcl_' );\n\n\t\t\t\tif ( innerPropType1 === 'Color' || innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' || innerPropType1 === 'Vector3D' || innerPropType1.indexOf( 'Lcl_' ) === 0 ) {\n\n\t\t\t\t\tinnerPropValue = [\n\t\t\t\t\t\tsubNode.propertyList[ 4 ],\n\t\t\t\t\t\tsubNode.propertyList[ 5 ],\n\t\t\t\t\t\tsubNode.propertyList[ 6 ]\n\t\t\t\t\t];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinnerPropValue = subNode.propertyList[ 4 ];\n\n\t\t\t\t}\n\n\t\t\t\t// this will be copied to parent, see above\n\t\t\t\tnode[ innerPropName ] = {\n\n\t\t\t\t\t'type': innerPropType1,\n\t\t\t\t\t'type2': innerPropType2,\n\t\t\t\t\t'flag': innerPropFlag,\n\t\t\t\t\t'value': innerPropValue\n\n\t\t\t\t};\n\n\t\t\t} else if ( node[ subNode.name ] === undefined ) {\n\n\t\t\t\tif ( typeof subNode.id === 'number' ) {\n\n\t\t\t\t\tnode[ subNode.name ] = {};\n\t\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( subNode.name === 'PoseNode' ) {\n\n\t\t\t\t\tif ( ! Array.isArray( node[ subNode.name ] ) ) {\n\n\t\t\t\t\t\tnode[ subNode.name ] = [ node[ subNode.name ] ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnode[ subNode.name ].push( subNode );\n\n\t\t\t\t} else if ( node[ subNode.name ][ subNode.id ] === undefined ) {\n\n\t\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tparseProperty: function ( reader ) {\n\n\t\t\tvar type = reader.getString( 1 );\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'C':\n\t\t\t\t\treturn reader.getBoolean();\n\n\t\t\t\tcase 'D':\n\t\t\t\t\treturn reader.getFloat64();\n\n\t\t\t\tcase 'F':\n\t\t\t\t\treturn reader.getFloat32();\n\n\t\t\t\tcase 'I':\n\t\t\t\t\treturn reader.getInt32();\n\n\t\t\t\tcase 'L':\n\t\t\t\t\treturn reader.getInt64();\n\n\t\t\t\tcase 'R':\n\t\t\t\t\tvar length = reader.getUint32();\n\t\t\t\t\treturn reader.getArrayBuffer( length );\n\n\t\t\t\tcase 'S':\n\t\t\t\t\tvar length = reader.getUint32();\n\t\t\t\t\treturn reader.getString( length );\n\n\t\t\t\tcase 'Y':\n\t\t\t\t\treturn reader.getInt16();\n\n\t\t\t\tcase 'b':\n\t\t\t\tcase 'c':\n\t\t\t\tcase 'd':\n\t\t\t\tcase 'f':\n\t\t\t\tcase 'i':\n\t\t\t\tcase 'l':\n\n\t\t\t\t\tvar arrayLength = reader.getUint32();\n\t\t\t\t\tvar encoding = reader.getUint32(); // 0: non-compressed, 1: compressed\n\t\t\t\t\tvar compressedLength = reader.getUint32();\n\n\t\t\t\t\tif ( encoding === 0 ) {\n\n\t\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\t\tcase 'c':\n\t\t\t\t\t\t\t\treturn reader.getBooleanArray( arrayLength );\n\n\t\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\t\treturn reader.getFloat64Array( arrayLength );\n\n\t\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\t\t\treturn reader.getFloat32Array( arrayLength );\n\n\t\t\t\t\t\t\tcase 'i':\n\t\t\t\t\t\t\t\treturn reader.getInt32Array( arrayLength );\n\n\t\t\t\t\t\t\tcase 'l':\n\t\t\t\t\t\t\t\treturn reader.getInt64Array( arrayLength );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( typeof Inflate === 'undefined' ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.FBXLoader: External library Inflate.min.js required, obtain or import from https://github.com/imaya/zlib.js' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar inflate = new Inflate( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) ); // eslint-disable-line no-undef\n\t\t\t\t\tvar reader2 = new BinaryReader( inflate.decompress().buffer );\n\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'c':\n\t\t\t\t\t\t\treturn reader2.getBooleanArray( arrayLength );\n\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\treturn reader2.getFloat64Array( arrayLength );\n\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\t\treturn reader2.getFloat32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'i':\n\t\t\t\t\t\t\treturn reader2.getInt32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'l':\n\t\t\t\t\t\t\treturn reader2.getInt64Array( arrayLength );\n\n\t\t\t\t\t}\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown property type ' + type );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tfunction BinaryReader( buffer, littleEndian ) {\n\n\t\tthis.dv = new DataView( buffer );\n\t\tthis.offset = 0;\n\t\tthis.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;\n\n\t}\n\n\tBinaryReader.prototype = {\n\n\t\tconstructor: BinaryReader,\n\n\t\tgetOffset: function () {\n\n\t\t\treturn this.offset;\n\n\t\t},\n\n\t\tsize: function () {\n\n\t\t\treturn this.dv.buffer.byteLength;\n\n\t\t},\n\n\t\tskip: function ( length ) {\n\n\t\t\tthis.offset += length;\n\n\t\t},\n\n\t\t// seems like true/false representation depends on exporter.\n\t\t// true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54)\n\t\t// then sees LSB.\n\t\tgetBoolean: function () {\n\n\t\t\treturn ( this.getUint8() & 1 ) === 1;\n\n\t\t},\n\n\t\tgetBooleanArray: function ( size ) {\n\n\t\t\tvar a = [];\n\n\t\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\t\ta.push( this.getBoolean() );\n\n\t\t\t}\n\n\t\t\treturn a;\n\n\t\t},\n\n\t\tgetUint8: function () {\n\n\t\t\tvar value = this.dv.getUint8( this.offset );\n\t\t\tthis.offset += 1;\n\t\t\treturn value;\n\n\t\t},\n\n\t\tgetInt16: function () {\n\n\t\t\tvar value = this.dv.getInt16( this.offset, this.littleEndian );\n\t\t\tthis.offset += 2;\n\t\t\treturn value;\n\n\t\t},\n\n\t\tgetInt32: function () {\n\n\t\t\tvar value = this.dv.getInt32( this.offset, this.littleEndian );\n\t\t\tthis.offset += 4;\n\t\t\treturn value;\n\n\t\t},\n\n\t\tgetInt32Array: function ( size ) {\n\n\t\t\tvar a = [];\n\n\t\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\t\ta.push( this.getInt32() );\n\n\t\t\t}\n\n\t\t\treturn a;\n\n\t\t},\n\n\t\tgetUint32: function () {\n\n\t\t\tvar value = this.dv.getUint32( this.offset, this.littleEndian );\n\t\t\tthis.offset += 4;\n\t\t\treturn value;\n\n\t\t},\n\n\t\t// JavaScript doesn't support 64-bit integer so calculate this here\n\t\t// 1 << 32 will return 1 so using multiply operation instead here.\n\t\t// There's a possibility that this method returns wrong value if the value\n\t\t// is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.\n\t\t// TODO: safely handle 64-bit integer\n\t\tgetInt64: function () {\n\n\t\t\tvar low, high;\n\n\t\t\tif ( this.littleEndian ) {\n\n\t\t\t\tlow = this.getUint32();\n\t\t\t\thigh = this.getUint32();\n\n\t\t\t} else {\n\n\t\t\t\thigh = this.getUint32();\n\t\t\t\tlow = this.getUint32();\n\n\t\t\t}\n\n\t\t\t// calculate negative value\n\t\t\tif ( high & 0x80000000 ) {\n\n\t\t\t\thigh = ~ high & 0xFFFFFFFF;\n\t\t\t\tlow = ~ low & 0xFFFFFFFF;\n\n\t\t\t\tif ( low === 0xFFFFFFFF ) high = ( high + 1 ) & 0xFFFFFFFF;\n\n\t\t\t\tlow = ( low + 1 ) & 0xFFFFFFFF;\n\n\t\t\t\treturn - ( high * 0x100000000 + low );\n\n\t\t\t}\n\n\t\t\treturn high * 0x100000000 + low;\n\n\t\t},\n\n\t\tgetInt64Array: function ( size ) {\n\n\t\t\tvar a = [];\n\n\t\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\t\ta.push( this.getInt64() );\n\n\t\t\t}\n\n\t\t\treturn a;\n\n\t\t},\n\n\t\t// Note: see getInt64() comment\n\t\tgetUint64: function () {\n\n\t\t\tvar low, high;\n\n\t\t\tif ( this.littleEndian ) {\n\n\t\t\t\tlow = this.getUint32();\n\t\t\t\thigh = this.getUint32();\n\n\t\t\t} else {\n\n\t\t\t\thigh = this.getUint32();\n\t\t\t\tlow = this.getUint32();\n\n\t\t\t}\n\n\t\t\treturn high * 0x100000000 + low;\n\n\t\t},\n\n\t\tgetFloat32: function () {\n\n\t\t\tvar value = this.dv.getFloat32( this.offset, this.littleEndian );\n\t\t\tthis.offset += 4;\n\t\t\treturn value;\n\n\t\t},\n\n\t\tgetFloat32Array: function ( size ) {\n\n\t\t\tvar a = [];\n\n\t\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\t\ta.push( this.getFloat32() );\n\n\t\t\t}\n\n\t\t\treturn a;\n\n\t\t},\n\n\t\tgetFloat64: function () {\n\n\t\t\tvar value = this.dv.getFloat64( this.offset, this.littleEndian );\n\t\t\tthis.offset += 8;\n\t\t\treturn value;\n\n\t\t},\n\n\t\tgetFloat64Array: function ( size ) {\n\n\t\t\tvar a = [];\n\n\t\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\t\ta.push( this.getFloat64() );\n\n\t\t\t}\n\n\t\t\treturn a;\n\n\t\t},\n\n\t\tgetArrayBuffer: function ( size ) {\n\n\t\t\tvar value = this.dv.buffer.slice( this.offset, this.offset + size );\n\t\t\tthis.offset += size;\n\t\t\treturn value;\n\n\t\t},\n\n\t\tgetString: function ( size ) {\n\n\t\t\t// note: safari 9 doesn't support Uint8Array.indexOf; create intermediate array instead\n\t\t\tvar a = [];\n\n\t\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\t\ta[ i ] = this.getUint8();\n\n\t\t\t}\n\n\t\t\tvar nullByte = a.indexOf( 0 );\n\t\t\tif ( nullByte >= 0 ) a = a.slice( 0, nullByte );\n\n\t\t\treturn LoaderUtils.decodeText( new Uint8Array( a ) );\n\n\t\t}\n\n\t};\n\n\t// FBXTree holds a representation of the FBX data, returned by the TextParser ( FBX ASCII format)\n\t// and BinaryParser( FBX Binary format)\n\tfunction FBXTree() {}\n\n\tFBXTree.prototype = {\n\n\t\tconstructor: FBXTree,\n\n\t\tadd: function ( key, val ) {\n\n\t\t\tthis[ key ] = val;\n\n\t\t},\n\n\t};\n\n\t// ************** UTILITY FUNCTIONS **************\n\n\tfunction isFbxFormatBinary( buffer ) {\n\n\t\tvar CORRECT = 'Kaydara FBX Binary \\0';\n\n\t\treturn buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString( buffer, 0, CORRECT.length );\n\n\t}\n\n\tfunction isFbxFormatASCII( text ) {\n\n\t\tvar CORRECT = [ 'K', 'a', 'y', 'd', 'a', 'r', 'a', '\\\\', 'F', 'B', 'X', '\\\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\\\', '\\\\' ];\n\n\t\tvar cursor = 0;\n\n\t\tfunction read( offset ) {\n\n\t\t\tvar result = text[ offset - 1 ];\n\t\t\ttext = text.slice( cursor + offset );\n\t\t\tcursor ++;\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfor ( var i = 0; i < CORRECT.length; ++ i ) {\n\n\t\t\tvar num = read( 1 );\n\t\t\tif ( num === CORRECT[ i ] ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getFbxVersion( text ) {\n\n\t\tvar versionRegExp = /FBXVersion: (\\d+)/;\n\t\tvar match = text.match( versionRegExp );\n\n\t\tif ( match ) {\n\n\t\t\tvar version = parseInt( match[ 1 ] );\n\t\t\treturn version;\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.FBXLoader: Cannot find the version number for the file given.' );\n\n\t}\n\n\t// Converts FBX ticks into real time seconds.\n\tfunction convertFBXTimeToSeconds( time ) {\n\n\t\treturn time / 46186158000;\n\n\t}\n\n\tvar dataArray = [];\n\n\t// extracts the data from the correct position in the FBX array based on indexing type\n\tfunction getData( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {\n\n\t\tvar index;\n\n\t\tswitch ( infoObject.mappingType ) {\n\n\t\t\tcase 'ByPolygonVertex' :\n\t\t\t\tindex = polygonVertexIndex;\n\t\t\t\tbreak;\n\t\t\tcase 'ByPolygon' :\n\t\t\t\tindex = polygonIndex;\n\t\t\t\tbreak;\n\t\t\tcase 'ByVertice' :\n\t\t\t\tindex = vertexIndex;\n\t\t\t\tbreak;\n\t\t\tcase 'AllSame' :\n\t\t\t\tindex = infoObject.indices[ 0 ];\n\t\t\t\tbreak;\n\t\t\tdefault :\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: unknown attribute mapping type ' + infoObject.mappingType );\n\n\t\t}\n\n\t\tif ( infoObject.referenceType === 'IndexToDirect' ) index = infoObject.indices[ index ];\n\n\t\tvar from = index * infoObject.dataSize;\n\t\tvar to = from + infoObject.dataSize;\n\n\t\treturn slice( dataArray, infoObject.buffer, from, to );\n\n\t}\n\n\tvar tempEuler = new Euler();\n\tvar tempVec = new Vector3();\n\n\t// generate transformation from FBX transform data\n\t// ref: https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_10CDD63C_79C1_4F2D_BB28_AD2BE65A02ED_htm\n\t// ref: http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=cpp_ref/_transformations_2main_8cxx-example.html,topicNumber=cpp_ref__transformations_2main_8cxx_example_htmlfc10a1e1-b18d-4e72-9dc0-70d0f1959f5e\n\tfunction generateTransform( transformData ) {\n\n\t\tvar lTranslationM = new Matrix4();\n\t\tvar lPreRotationM = new Matrix4();\n\t\tvar lRotationM = new Matrix4();\n\t\tvar lPostRotationM = new Matrix4();\n\n\t\tvar lScalingM = new Matrix4();\n\t\tvar lScalingPivotM = new Matrix4();\n\t\tvar lScalingOffsetM = new Matrix4();\n\t\tvar lRotationOffsetM = new Matrix4();\n\t\tvar lRotationPivotM = new Matrix4();\n\n\t\tvar lParentGX = new Matrix4();\n\t\tvar lGlobalT = new Matrix4();\n\n\t\tvar inheritType = ( transformData.inheritType ) ? transformData.inheritType : 0;\n\n\t\tif ( transformData.translation ) lTranslationM.setPosition( tempVec.fromArray( transformData.translation ) );\n\n\t\tif ( transformData.preRotation ) {\n\n\t\t\tvar array = transformData.preRotation.map( MathUtils.degToRad );\n\t\t\tarray.push( transformData.eulerOrder );\n\t\t\tlPreRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t\t}\n\n\t\tif ( transformData.rotation ) {\n\n\t\t\tvar array = transformData.rotation.map( MathUtils.degToRad );\n\t\t\tarray.push( transformData.eulerOrder );\n\t\t\tlRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t\t}\n\n\t\tif ( transformData.postRotation ) {\n\n\t\t\tvar array = transformData.postRotation.map( MathUtils.degToRad );\n\t\t\tarray.push( transformData.eulerOrder );\n\t\t\tlPostRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t\t}\n\n\t\tif ( transformData.scale ) lScalingM.scale( tempVec.fromArray( transformData.scale ) );\n\n\t\t// Pivots and offsets\n\t\tif ( transformData.scalingOffset ) lScalingOffsetM.setPosition( tempVec.fromArray( transformData.scalingOffset ) );\n\t\tif ( transformData.scalingPivot ) lScalingPivotM.setPosition( tempVec.fromArray( transformData.scalingPivot ) );\n\t\tif ( transformData.rotationOffset ) lRotationOffsetM.setPosition( tempVec.fromArray( transformData.rotationOffset ) );\n\t\tif ( transformData.rotationPivot ) lRotationPivotM.setPosition( tempVec.fromArray( transformData.rotationPivot ) );\n\n\t\t// parent transform\n\t\tif ( transformData.parentMatrixWorld ) lParentGX = transformData.parentMatrixWorld;\n\n\t\t// Global Rotation\n\t\tvar lLRM = lPreRotationM.multiply( lRotationM ).multiply( lPostRotationM );\n\t\tvar lParentGRM = new Matrix4();\n\t\tlParentGX.extractRotation( lParentGRM );\n\n\t\t// Global Shear*Scaling\n\t\tvar lParentTM = new Matrix4();\n\t\tlParentTM.copyPosition( lParentGX );\n\n\t\tvar lParentGSM = new Matrix4();\n\t\tlParentGSM.getInverse( lParentGRM ).multiply( lParentGX );\n\n\t\tvar lGlobalRS = new Matrix4();\n\n\t\tif ( inheritType === 0 ) {\n\n\t\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM ).multiply( lScalingM );\n\n\t\t} else if ( inheritType === 1 ) {\n\n\t\t\tlGlobalRS.copy( lParentGRM ).multiply( lParentGSM ).multiply( lLRM ).multiply( lScalingM );\n\n\t\t} else {\n\n\t\t\tvar lParentLSM_inv = new Matrix4().getInverse( lScalingM );\n\t\t\tvar lParentGSM_noLocal = new Matrix4().multiply( lParentGSM ).multiply( lParentLSM_inv );\n\n\t\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM_noLocal ).multiply( lScalingM );\n\n\t\t}\n\n\t\tvar lRotationPivotM_inv = new Matrix4().getInverse( lRotationPivotM );\n\t\tvar lScalingPivotM_inv = new Matrix4().getInverse( lScalingPivotM );\n\t\t// Calculate the local transform matrix\n\t\tvar lTransform = new Matrix4();\n\t\tlTransform.copy( lTranslationM ).multiply( lRotationOffsetM ).multiply( lRotationPivotM ).multiply( lPreRotationM ).multiply( lRotationM ).multiply( lPostRotationM ).multiply( lRotationPivotM_inv ).multiply( lScalingOffsetM ).multiply( lScalingPivotM ).multiply( lScalingM ).multiply( lScalingPivotM_inv );\n\n\t\tvar lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition( lTransform );\n\n\t\tvar lGlobalTranslation = new Matrix4().copy( lParentGX ).multiply( lLocalTWithAllPivotAndOffsetInfo );\n\t\tlGlobalT.copyPosition( lGlobalTranslation );\n\n\t\tlTransform = new Matrix4().multiply( lGlobalT ).multiply( lGlobalRS );\n\n\t\treturn lTransform;\n\n\t}\n\n\t// Returns the three.js intrinsic Euler order corresponding to FBX extrinsic Euler order\n\t// ref: http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_euler_html\n\tfunction getEulerOrder( order ) {\n\n\t\torder = order || 0;\n\n\t\tvar enums = [\n\t\t\t'ZYX', // -> XYZ extrinsic\n\t\t\t'YZX', // -> XZY extrinsic\n\t\t\t'XZY', // -> YZX extrinsic\n\t\t\t'ZXY', // -> YXZ extrinsic\n\t\t\t'YXZ', // -> ZXY extrinsic\n\t\t\t'XYZ', // -> ZYX extrinsic\n\t\t\t//'SphericXYZ', // not possible to support\n\t\t];\n\n\t\tif ( order === 6 ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.' );\n\t\t\treturn enums[ 0 ];\n\n\t\t}\n\n\t\treturn enums[ order ];\n\n\t}\n\n\t// Parses comma separated list of numbers and returns them an array.\n\t// Used internally by the TextParser\n\tfunction parseNumberArray( value ) {\n\n\t\tvar array = value.split( ',' ).map( function ( val ) {\n\n\t\t\treturn parseFloat( val );\n\n\t\t} );\n\n\t\treturn array;\n\n\t}\n\n\tfunction convertArrayBufferToString( buffer, from, to ) {\n\n\t\tif ( from === undefined ) from = 0;\n\t\tif ( to === undefined ) to = buffer.byteLength;\n\n\t\treturn LoaderUtils.decodeText( new Uint8Array( buffer, from, to ) );\n\n\t}\n\n\tfunction append( a, b ) {\n\n\t\tfor ( var i = 0, j = a.length, l = b.length; i < l; i ++, j ++ ) {\n\n\t\t\ta[ j ] = b[ i ];\n\n\t\t}\n\n\t}\n\n\tfunction slice( a, b, from, to ) {\n\n\t\tfor ( var i = from, j = 0; i < to; i ++, j ++ ) {\n\n\t\t\ta[ j ] = b[ i ];\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\t// inject array a2 into array a1 at index\n\tfunction inject( a1, index, a2 ) {\n\n\t\treturn a1.slice( 0, index ).concat( a2 ).concat( a1.slice( index ) );\n\n\t}\n\n\treturn FBXLoader;\n\n} )();\n\nexport { FBXLoader };\n","/**\n * @author Takahiro / https://github.com/takahirox\n *\n * Simple CharsetEncoder.\n */\n\nfunction CharsetEncoder() {\n}\n\n/*\n * Converts from Shift_JIS Uint8Array data to Unicode strings.\n */\nCharsetEncoder.prototype.s2u = function ( uint8Array ) {\n\n\tvar t = this.s2uTable;\n\tvar str = '';\n\tvar p = 0;\n\n\twhile ( p < uint8Array.length ) {\n\n\t\tvar key = uint8Array[ p ++ ];\n\n\t\tif ( ! ( ( key >= 0x00 && key <= 0x7e ) ||\n ( key >= 0xa1 && key <= 0xdf ) ) &&\n p < uint8Array.length ) {\n\n\t\t\tkey = ( key << 8 ) | uint8Array[ p ++ ];\n\n\t\t}\n\n\t\tif ( t[ key ] === undefined ) {\n\n\t\t\tthrow 'unknown char code ' + key + '.';\n\n\t\t}\n\n\t\tstr += String.fromCharCode( t[ key ] );\n\n\t}\n\n\treturn str;\n\n};\n\nCharsetEncoder.prototype.s2uTable = {\n\t0: 0,\n\t1: 1,\n\t2: 2,\n\t3: 3,\n\t4: 4,\n\t5: 5,\n\t6: 6,\n\t7: 7,\n\t8: 8,\n\t9: 9,\n\t10: 10,\n\t11: 11,\n\t12: 12,\n\t13: 13,\n\t14: 14,\n\t15: 15,\n\t16: 16,\n\t17: 17,\n\t18: 18,\n\t19: 19,\n\t20: 20,\n\t21: 21,\n\t22: 22,\n\t23: 23,\n\t24: 24,\n\t25: 25,\n\t26: 26,\n\t27: 27,\n\t28: 28,\n\t29: 29,\n\t30: 30,\n\t31: 31,\n\t32: 32,\n\t33: 33,\n\t34: 34,\n\t35: 35,\n\t36: 36,\n\t37: 37,\n\t38: 38,\n\t39: 39,\n\t40: 40,\n\t41: 41,\n\t42: 42,\n\t43: 43,\n\t44: 44,\n\t45: 45,\n\t46: 46,\n\t47: 47,\n\t48: 48,\n\t49: 49,\n\t50: 50,\n\t51: 51,\n\t52: 52,\n\t53: 53,\n\t54: 54,\n\t55: 55,\n\t56: 56,\n\t57: 57,\n\t58: 58,\n\t59: 59,\n\t60: 60,\n\t61: 61,\n\t62: 62,\n\t63: 63,\n\t64: 64,\n\t65: 65,\n\t66: 66,\n\t67: 67,\n\t68: 68,\n\t69: 69,\n\t70: 70,\n\t71: 71,\n\t72: 72,\n\t73: 73,\n\t74: 74,\n\t75: 75,\n\t76: 76,\n\t77: 77,\n\t78: 78,\n\t79: 79,\n\t80: 80,\n\t81: 81,\n\t82: 82,\n\t83: 83,\n\t84: 84,\n\t85: 85,\n\t86: 86,\n\t87: 87,\n\t88: 88,\n\t89: 89,\n\t90: 90,\n\t91: 91,\n\t92: 92,\n\t93: 93,\n\t94: 94,\n\t95: 95,\n\t96: 96,\n\t97: 97,\n\t98: 98,\n\t99: 99,\n\t100: 100,\n\t101: 101,\n\t102: 102,\n\t103: 103,\n\t104: 104,\n\t105: 105,\n\t106: 106,\n\t107: 107,\n\t108: 108,\n\t109: 109,\n\t110: 110,\n\t111: 111,\n\t112: 112,\n\t113: 113,\n\t114: 114,\n\t115: 115,\n\t116: 116,\n\t117: 117,\n\t118: 118,\n\t119: 119,\n\t120: 120,\n\t121: 121,\n\t122: 122,\n\t123: 123,\n\t124: 124,\n\t125: 125,\n\t126: 126,\n\t161: 65377,\n\t162: 65378,\n\t163: 65379,\n\t164: 65380,\n\t165: 65381,\n\t166: 65382,\n\t167: 65383,\n\t168: 65384,\n\t169: 65385,\n\t170: 65386,\n\t171: 65387,\n\t172: 65388,\n\t173: 65389,\n\t174: 65390,\n\t175: 65391,\n\t176: 65392,\n\t177: 65393,\n\t178: 65394,\n\t179: 65395,\n\t180: 65396,\n\t181: 65397,\n\t182: 65398,\n\t183: 65399,\n\t184: 65400,\n\t185: 65401,\n\t186: 65402,\n\t187: 65403,\n\t188: 65404,\n\t189: 65405,\n\t190: 65406,\n\t191: 65407,\n\t192: 65408,\n\t193: 65409,\n\t194: 65410,\n\t195: 65411,\n\t196: 65412,\n\t197: 65413,\n\t198: 65414,\n\t199: 65415,\n\t200: 65416,\n\t201: 65417,\n\t202: 65418,\n\t203: 65419,\n\t204: 65420,\n\t205: 65421,\n\t206: 65422,\n\t207: 65423,\n\t208: 65424,\n\t209: 65425,\n\t210: 65426,\n\t211: 65427,\n\t212: 65428,\n\t213: 65429,\n\t214: 65430,\n\t215: 65431,\n\t216: 65432,\n\t217: 65433,\n\t218: 65434,\n\t219: 65435,\n\t220: 65436,\n\t221: 65437,\n\t222: 65438,\n\t223: 65439,\n\t33088: 12288,\n\t33089: 12289,\n\t33090: 12290,\n\t33091: 65292,\n\t33092: 65294,\n\t33093: 12539,\n\t33094: 65306,\n\t33095: 65307,\n\t33096: 65311,\n\t33097: 65281,\n\t33098: 12443,\n\t33099: 12444,\n\t33100: 180,\n\t33101: 65344,\n\t33102: 168,\n\t33103: 65342,\n\t33104: 65507,\n\t33105: 65343,\n\t33106: 12541,\n\t33107: 12542,\n\t33108: 12445,\n\t33109: 12446,\n\t33110: 12291,\n\t33111: 20189,\n\t33112: 12293,\n\t33113: 12294,\n\t33114: 12295,\n\t33115: 12540,\n\t33116: 8213,\n\t33117: 8208,\n\t33118: 65295,\n\t33119: 65340,\n\t33120: 65374,\n\t33121: 8741,\n\t33122: 65372,\n\t33123: 8230,\n\t33124: 8229,\n\t33125: 8216,\n\t33126: 8217,\n\t33127: 8220,\n\t33128: 8221,\n\t33129: 65288,\n\t33130: 65289,\n\t33131: 12308,\n\t33132: 12309,\n\t33133: 65339,\n\t33134: 65341,\n\t33135: 65371,\n\t33136: 65373,\n\t33137: 12296,\n\t33138: 12297,\n\t33139: 12298,\n\t33140: 12299,\n\t33141: 12300,\n\t33142: 12301,\n\t33143: 12302,\n\t33144: 12303,\n\t33145: 12304,\n\t33146: 12305,\n\t33147: 65291,\n\t33148: 65293,\n\t33149: 177,\n\t33150: 215,\n\t33152: 247,\n\t33153: 65309,\n\t33154: 8800,\n\t33155: 65308,\n\t33156: 65310,\n\t33157: 8806,\n\t33158: 8807,\n\t33159: 8734,\n\t33160: 8756,\n\t33161: 9794,\n\t33162: 9792,\n\t33163: 176,\n\t33164: 8242,\n\t33165: 8243,\n\t33166: 8451,\n\t33167: 65509,\n\t33168: 65284,\n\t33169: 65504,\n\t33170: 65505,\n\t33171: 65285,\n\t33172: 65283,\n\t33173: 65286,\n\t33174: 65290,\n\t33175: 65312,\n\t33176: 167,\n\t33177: 9734,\n\t33178: 9733,\n\t33179: 9675,\n\t33180: 9679,\n\t33181: 9678,\n\t33182: 9671,\n\t33183: 9670,\n\t33184: 9633,\n\t33185: 9632,\n\t33186: 9651,\n\t33187: 9650,\n\t33188: 9661,\n\t33189: 9660,\n\t33190: 8251,\n\t33191: 12306,\n\t33192: 8594,\n\t33193: 8592,\n\t33194: 8593,\n\t33195: 8595,\n\t33196: 12307,\n\t33208: 8712,\n\t33209: 8715,\n\t33210: 8838,\n\t33211: 8839,\n\t33212: 8834,\n\t33213: 8835,\n\t33214: 8746,\n\t33215: 8745,\n\t33224: 8743,\n\t33225: 8744,\n\t33226: 65506,\n\t33227: 8658,\n\t33228: 8660,\n\t33229: 8704,\n\t33230: 8707,\n\t33242: 8736,\n\t33243: 8869,\n\t33244: 8978,\n\t33245: 8706,\n\t33246: 8711,\n\t33247: 8801,\n\t33248: 8786,\n\t33249: 8810,\n\t33250: 8811,\n\t33251: 8730,\n\t33252: 8765,\n\t33253: 8733,\n\t33254: 8757,\n\t33255: 8747,\n\t33256: 8748,\n\t33264: 8491,\n\t33265: 8240,\n\t33266: 9839,\n\t33267: 9837,\n\t33268: 9834,\n\t33269: 8224,\n\t33270: 8225,\n\t33271: 182,\n\t33276: 9711,\n\t33359: 65296,\n\t33360: 65297,\n\t33361: 65298,\n\t33362: 65299,\n\t33363: 65300,\n\t33364: 65301,\n\t33365: 65302,\n\t33366: 65303,\n\t33367: 65304,\n\t33368: 65305,\n\t33376: 65313,\n\t33377: 65314,\n\t33378: 65315,\n\t33379: 65316,\n\t33380: 65317,\n\t33381: 65318,\n\t33382: 65319,\n\t33383: 65320,\n\t33384: 65321,\n\t33385: 65322,\n\t33386: 65323,\n\t33387: 65324,\n\t33388: 65325,\n\t33389: 65326,\n\t33390: 65327,\n\t33391: 65328,\n\t33392: 65329,\n\t33393: 65330,\n\t33394: 65331,\n\t33395: 65332,\n\t33396: 65333,\n\t33397: 65334,\n\t33398: 65335,\n\t33399: 65336,\n\t33400: 65337,\n\t33401: 65338,\n\t33409: 65345,\n\t33410: 65346,\n\t33411: 65347,\n\t33412: 65348,\n\t33413: 65349,\n\t33414: 65350,\n\t33415: 65351,\n\t33416: 65352,\n\t33417: 65353,\n\t33418: 65354,\n\t33419: 65355,\n\t33420: 65356,\n\t33421: 65357,\n\t33422: 65358,\n\t33423: 65359,\n\t33424: 65360,\n\t33425: 65361,\n\t33426: 65362,\n\t33427: 65363,\n\t33428: 65364,\n\t33429: 65365,\n\t33430: 65366,\n\t33431: 65367,\n\t33432: 65368,\n\t33433: 65369,\n\t33434: 65370,\n\t33439: 12353,\n\t33440: 12354,\n\t33441: 12355,\n\t33442: 12356,\n\t33443: 12357,\n\t33444: 12358,\n\t33445: 12359,\n\t33446: 12360,\n\t33447: 12361,\n\t33448: 12362,\n\t33449: 12363,\n\t33450: 12364,\n\t33451: 12365,\n\t33452: 12366,\n\t33453: 12367,\n\t33454: 12368,\n\t33455: 12369,\n\t33456: 12370,\n\t33457: 12371,\n\t33458: 12372,\n\t33459: 12373,\n\t33460: 12374,\n\t33461: 12375,\n\t33462: 12376,\n\t33463: 12377,\n\t33464: 12378,\n\t33465: 12379,\n\t33466: 12380,\n\t33467: 12381,\n\t33468: 12382,\n\t33469: 12383,\n\t33470: 12384,\n\t33471: 12385,\n\t33472: 12386,\n\t33473: 12387,\n\t33474: 12388,\n\t33475: 12389,\n\t33476: 12390,\n\t33477: 12391,\n\t33478: 12392,\n\t33479: 12393,\n\t33480: 12394,\n\t33481: 12395,\n\t33482: 12396,\n\t33483: 12397,\n\t33484: 12398,\n\t33485: 12399,\n\t33486: 12400,\n\t33487: 12401,\n\t33488: 12402,\n\t33489: 12403,\n\t33490: 12404,\n\t33491: 12405,\n\t33492: 12406,\n\t33493: 12407,\n\t33494: 12408,\n\t33495: 12409,\n\t33496: 12410,\n\t33497: 12411,\n\t33498: 12412,\n\t33499: 12413,\n\t33500: 12414,\n\t33501: 12415,\n\t33502: 12416,\n\t33503: 12417,\n\t33504: 12418,\n\t33505: 12419,\n\t33506: 12420,\n\t33507: 12421,\n\t33508: 12422,\n\t33509: 12423,\n\t33510: 12424,\n\t33511: 12425,\n\t33512: 12426,\n\t33513: 12427,\n\t33514: 12428,\n\t33515: 12429,\n\t33516: 12430,\n\t33517: 12431,\n\t33518: 12432,\n\t33519: 12433,\n\t33520: 12434,\n\t33521: 12435,\n\t33600: 12449,\n\t33601: 12450,\n\t33602: 12451,\n\t33603: 12452,\n\t33604: 12453,\n\t33605: 12454,\n\t33606: 12455,\n\t33607: 12456,\n\t33608: 12457,\n\t33609: 12458,\n\t33610: 12459,\n\t33611: 12460,\n\t33612: 12461,\n\t33613: 12462,\n\t33614: 12463,\n\t33615: 12464,\n\t33616: 12465,\n\t33617: 12466,\n\t33618: 12467,\n\t33619: 12468,\n\t33620: 12469,\n\t33621: 12470,\n\t33622: 12471,\n\t33623: 12472,\n\t33624: 12473,\n\t33625: 12474,\n\t33626: 12475,\n\t33627: 12476,\n\t33628: 12477,\n\t33629: 12478,\n\t33630: 12479,\n\t33631: 12480,\n\t33632: 12481,\n\t33633: 12482,\n\t33634: 12483,\n\t33635: 12484,\n\t33636: 12485,\n\t33637: 12486,\n\t33638: 12487,\n\t33639: 12488,\n\t33640: 12489,\n\t33641: 12490,\n\t33642: 12491,\n\t33643: 12492,\n\t33644: 12493,\n\t33645: 12494,\n\t33646: 12495,\n\t33647: 12496,\n\t33648: 12497,\n\t33649: 12498,\n\t33650: 12499,\n\t33651: 12500,\n\t33652: 12501,\n\t33653: 12502,\n\t33654: 12503,\n\t33655: 12504,\n\t33656: 12505,\n\t33657: 12506,\n\t33658: 12507,\n\t33659: 12508,\n\t33660: 12509,\n\t33661: 12510,\n\t33662: 12511,\n\t33664: 12512,\n\t33665: 12513,\n\t33666: 12514,\n\t33667: 12515,\n\t33668: 12516,\n\t33669: 12517,\n\t33670: 12518,\n\t33671: 12519,\n\t33672: 12520,\n\t33673: 12521,\n\t33674: 12522,\n\t33675: 12523,\n\t33676: 12524,\n\t33677: 12525,\n\t33678: 12526,\n\t33679: 12527,\n\t33680: 12528,\n\t33681: 12529,\n\t33682: 12530,\n\t33683: 12531,\n\t33684: 12532,\n\t33685: 12533,\n\t33686: 12534,\n\t33695: 913,\n\t33696: 914,\n\t33697: 915,\n\t33698: 916,\n\t33699: 917,\n\t33700: 918,\n\t33701: 919,\n\t33702: 920,\n\t33703: 921,\n\t33704: 922,\n\t33705: 923,\n\t33706: 924,\n\t33707: 925,\n\t33708: 926,\n\t33709: 927,\n\t33710: 928,\n\t33711: 929,\n\t33712: 931,\n\t33713: 932,\n\t33714: 933,\n\t33715: 934,\n\t33716: 935,\n\t33717: 936,\n\t33718: 937,\n\t33727: 945,\n\t33728: 946,\n\t33729: 947,\n\t33730: 948,\n\t33731: 949,\n\t33732: 950,\n\t33733: 951,\n\t33734: 952,\n\t33735: 953,\n\t33736: 954,\n\t33737: 955,\n\t33738: 956,\n\t33739: 957,\n\t33740: 958,\n\t33741: 959,\n\t33742: 960,\n\t33743: 961,\n\t33744: 963,\n\t33745: 964,\n\t33746: 965,\n\t33747: 966,\n\t33748: 967,\n\t33749: 968,\n\t33750: 969,\n\t33856: 1040,\n\t33857: 1041,\n\t33858: 1042,\n\t33859: 1043,\n\t33860: 1044,\n\t33861: 1045,\n\t33862: 1025,\n\t33863: 1046,\n\t33864: 1047,\n\t33865: 1048,\n\t33866: 1049,\n\t33867: 1050,\n\t33868: 1051,\n\t33869: 1052,\n\t33870: 1053,\n\t33871: 1054,\n\t33872: 1055,\n\t33873: 1056,\n\t33874: 1057,\n\t33875: 1058,\n\t33876: 1059,\n\t33877: 1060,\n\t33878: 1061,\n\t33879: 1062,\n\t33880: 1063,\n\t33881: 1064,\n\t33882: 1065,\n\t33883: 1066,\n\t33884: 1067,\n\t33885: 1068,\n\t33886: 1069,\n\t33887: 1070,\n\t33888: 1071,\n\t33904: 1072,\n\t33905: 1073,\n\t33906: 1074,\n\t33907: 1075,\n\t33908: 1076,\n\t33909: 1077,\n\t33910: 1105,\n\t33911: 1078,\n\t33912: 1079,\n\t33913: 1080,\n\t33914: 1081,\n\t33915: 1082,\n\t33916: 1083,\n\t33917: 1084,\n\t33918: 1085,\n\t33920: 1086,\n\t33921: 1087,\n\t33922: 1088,\n\t33923: 1089,\n\t33924: 1090,\n\t33925: 1091,\n\t33926: 1092,\n\t33927: 1093,\n\t33928: 1094,\n\t33929: 1095,\n\t33930: 1096,\n\t33931: 1097,\n\t33932: 1098,\n\t33933: 1099,\n\t33934: 1100,\n\t33935: 1101,\n\t33936: 1102,\n\t33937: 1103,\n\t33951: 9472,\n\t33952: 9474,\n\t33953: 9484,\n\t33954: 9488,\n\t33955: 9496,\n\t33956: 9492,\n\t33957: 9500,\n\t33958: 9516,\n\t33959: 9508,\n\t33960: 9524,\n\t33961: 9532,\n\t33962: 9473,\n\t33963: 9475,\n\t33964: 9487,\n\t33965: 9491,\n\t33966: 9499,\n\t33967: 9495,\n\t33968: 9507,\n\t33969: 9523,\n\t33970: 9515,\n\t33971: 9531,\n\t33972: 9547,\n\t33973: 9504,\n\t33974: 9519,\n\t33975: 9512,\n\t33976: 9527,\n\t33977: 9535,\n\t33978: 9501,\n\t33979: 9520,\n\t33980: 9509,\n\t33981: 9528,\n\t33982: 9538,\n\t34624: 9312,\n\t34625: 9313,\n\t34626: 9314,\n\t34627: 9315,\n\t34628: 9316,\n\t34629: 9317,\n\t34630: 9318,\n\t34631: 9319,\n\t34632: 9320,\n\t34633: 9321,\n\t34634: 9322,\n\t34635: 9323,\n\t34636: 9324,\n\t34637: 9325,\n\t34638: 9326,\n\t34639: 9327,\n\t34640: 9328,\n\t34641: 9329,\n\t34642: 9330,\n\t34643: 9331,\n\t34644: 8544,\n\t34645: 8545,\n\t34646: 8546,\n\t34647: 8547,\n\t34648: 8548,\n\t34649: 8549,\n\t34650: 8550,\n\t34651: 8551,\n\t34652: 8552,\n\t34653: 8553,\n\t34655: 13129,\n\t34656: 13076,\n\t34657: 13090,\n\t34658: 13133,\n\t34659: 13080,\n\t34660: 13095,\n\t34661: 13059,\n\t34662: 13110,\n\t34663: 13137,\n\t34664: 13143,\n\t34665: 13069,\n\t34666: 13094,\n\t34667: 13091,\n\t34668: 13099,\n\t34669: 13130,\n\t34670: 13115,\n\t34671: 13212,\n\t34672: 13213,\n\t34673: 13214,\n\t34674: 13198,\n\t34675: 13199,\n\t34676: 13252,\n\t34677: 13217,\n\t34686: 13179,\n\t34688: 12317,\n\t34689: 12319,\n\t34690: 8470,\n\t34691: 13261,\n\t34692: 8481,\n\t34693: 12964,\n\t34694: 12965,\n\t34695: 12966,\n\t34696: 12967,\n\t34697: 12968,\n\t34698: 12849,\n\t34699: 12850,\n\t34700: 12857,\n\t34701: 13182,\n\t34702: 13181,\n\t34703: 13180,\n\t34704: 8786,\n\t34705: 8801,\n\t34706: 8747,\n\t34707: 8750,\n\t34708: 8721,\n\t34709: 8730,\n\t34710: 8869,\n\t34711: 8736,\n\t34712: 8735,\n\t34713: 8895,\n\t34714: 8757,\n\t34715: 8745,\n\t34716: 8746,\n\t34975: 20124,\n\t34976: 21782,\n\t34977: 23043,\n\t34978: 38463,\n\t34979: 21696,\n\t34980: 24859,\n\t34981: 25384,\n\t34982: 23030,\n\t34983: 36898,\n\t34984: 33909,\n\t34985: 33564,\n\t34986: 31312,\n\t34987: 24746,\n\t34988: 25569,\n\t34989: 28197,\n\t34990: 26093,\n\t34991: 33894,\n\t34992: 33446,\n\t34993: 39925,\n\t34994: 26771,\n\t34995: 22311,\n\t34996: 26017,\n\t34997: 25201,\n\t34998: 23451,\n\t34999: 22992,\n\t35000: 34427,\n\t35001: 39156,\n\t35002: 32098,\n\t35003: 32190,\n\t35004: 39822,\n\t35005: 25110,\n\t35006: 31903,\n\t35007: 34999,\n\t35008: 23433,\n\t35009: 24245,\n\t35010: 25353,\n\t35011: 26263,\n\t35012: 26696,\n\t35013: 38343,\n\t35014: 38797,\n\t35015: 26447,\n\t35016: 20197,\n\t35017: 20234,\n\t35018: 20301,\n\t35019: 20381,\n\t35020: 20553,\n\t35021: 22258,\n\t35022: 22839,\n\t35023: 22996,\n\t35024: 23041,\n\t35025: 23561,\n\t35026: 24799,\n\t35027: 24847,\n\t35028: 24944,\n\t35029: 26131,\n\t35030: 26885,\n\t35031: 28858,\n\t35032: 30031,\n\t35033: 30064,\n\t35034: 31227,\n\t35035: 32173,\n\t35036: 32239,\n\t35037: 32963,\n\t35038: 33806,\n\t35039: 34915,\n\t35040: 35586,\n\t35041: 36949,\n\t35042: 36986,\n\t35043: 21307,\n\t35044: 20117,\n\t35045: 20133,\n\t35046: 22495,\n\t35047: 32946,\n\t35048: 37057,\n\t35049: 30959,\n\t35050: 19968,\n\t35051: 22769,\n\t35052: 28322,\n\t35053: 36920,\n\t35054: 31282,\n\t35055: 33576,\n\t35056: 33419,\n\t35057: 39983,\n\t35058: 20801,\n\t35059: 21360,\n\t35060: 21693,\n\t35061: 21729,\n\t35062: 22240,\n\t35063: 23035,\n\t35064: 24341,\n\t35065: 39154,\n\t35066: 28139,\n\t35067: 32996,\n\t35068: 34093,\n\t35136: 38498,\n\t35137: 38512,\n\t35138: 38560,\n\t35139: 38907,\n\t35140: 21515,\n\t35141: 21491,\n\t35142: 23431,\n\t35143: 28879,\n\t35144: 32701,\n\t35145: 36802,\n\t35146: 38632,\n\t35147: 21359,\n\t35148: 40284,\n\t35149: 31418,\n\t35150: 19985,\n\t35151: 30867,\n\t35152: 33276,\n\t35153: 28198,\n\t35154: 22040,\n\t35155: 21764,\n\t35156: 27421,\n\t35157: 34074,\n\t35158: 39995,\n\t35159: 23013,\n\t35160: 21417,\n\t35161: 28006,\n\t35162: 29916,\n\t35163: 38287,\n\t35164: 22082,\n\t35165: 20113,\n\t35166: 36939,\n\t35167: 38642,\n\t35168: 33615,\n\t35169: 39180,\n\t35170: 21473,\n\t35171: 21942,\n\t35172: 23344,\n\t35173: 24433,\n\t35174: 26144,\n\t35175: 26355,\n\t35176: 26628,\n\t35177: 27704,\n\t35178: 27891,\n\t35179: 27945,\n\t35180: 29787,\n\t35181: 30408,\n\t35182: 31310,\n\t35183: 38964,\n\t35184: 33521,\n\t35185: 34907,\n\t35186: 35424,\n\t35187: 37613,\n\t35188: 28082,\n\t35189: 30123,\n\t35190: 30410,\n\t35191: 39365,\n\t35192: 24742,\n\t35193: 35585,\n\t35194: 36234,\n\t35195: 38322,\n\t35196: 27022,\n\t35197: 21421,\n\t35198: 20870,\n\t35200: 22290,\n\t35201: 22576,\n\t35202: 22852,\n\t35203: 23476,\n\t35204: 24310,\n\t35205: 24616,\n\t35206: 25513,\n\t35207: 25588,\n\t35208: 27839,\n\t35209: 28436,\n\t35210: 28814,\n\t35211: 28948,\n\t35212: 29017,\n\t35213: 29141,\n\t35214: 29503,\n\t35215: 32257,\n\t35216: 33398,\n\t35217: 33489,\n\t35218: 34199,\n\t35219: 36960,\n\t35220: 37467,\n\t35221: 40219,\n\t35222: 22633,\n\t35223: 26044,\n\t35224: 27738,\n\t35225: 29989,\n\t35226: 20985,\n\t35227: 22830,\n\t35228: 22885,\n\t35229: 24448,\n\t35230: 24540,\n\t35231: 25276,\n\t35232: 26106,\n\t35233: 27178,\n\t35234: 27431,\n\t35235: 27572,\n\t35236: 29579,\n\t35237: 32705,\n\t35238: 35158,\n\t35239: 40236,\n\t35240: 40206,\n\t35241: 40644,\n\t35242: 23713,\n\t35243: 27798,\n\t35244: 33659,\n\t35245: 20740,\n\t35246: 23627,\n\t35247: 25014,\n\t35248: 33222,\n\t35249: 26742,\n\t35250: 29281,\n\t35251: 20057,\n\t35252: 20474,\n\t35253: 21368,\n\t35254: 24681,\n\t35255: 28201,\n\t35256: 31311,\n\t35257: 38899,\n\t35258: 19979,\n\t35259: 21270,\n\t35260: 20206,\n\t35261: 20309,\n\t35262: 20285,\n\t35263: 20385,\n\t35264: 20339,\n\t35265: 21152,\n\t35266: 21487,\n\t35267: 22025,\n\t35268: 22799,\n\t35269: 23233,\n\t35270: 23478,\n\t35271: 23521,\n\t35272: 31185,\n\t35273: 26247,\n\t35274: 26524,\n\t35275: 26550,\n\t35276: 27468,\n\t35277: 27827,\n\t35278: 28779,\n\t35279: 29634,\n\t35280: 31117,\n\t35281: 31166,\n\t35282: 31292,\n\t35283: 31623,\n\t35284: 33457,\n\t35285: 33499,\n\t35286: 33540,\n\t35287: 33655,\n\t35288: 33775,\n\t35289: 33747,\n\t35290: 34662,\n\t35291: 35506,\n\t35292: 22057,\n\t35293: 36008,\n\t35294: 36838,\n\t35295: 36942,\n\t35296: 38686,\n\t35297: 34442,\n\t35298: 20420,\n\t35299: 23784,\n\t35300: 25105,\n\t35301: 29273,\n\t35302: 30011,\n\t35303: 33253,\n\t35304: 33469,\n\t35305: 34558,\n\t35306: 36032,\n\t35307: 38597,\n\t35308: 39187,\n\t35309: 39381,\n\t35310: 20171,\n\t35311: 20250,\n\t35312: 35299,\n\t35313: 22238,\n\t35314: 22602,\n\t35315: 22730,\n\t35316: 24315,\n\t35317: 24555,\n\t35318: 24618,\n\t35319: 24724,\n\t35320: 24674,\n\t35321: 25040,\n\t35322: 25106,\n\t35323: 25296,\n\t35324: 25913,\n\t35392: 39745,\n\t35393: 26214,\n\t35394: 26800,\n\t35395: 28023,\n\t35396: 28784,\n\t35397: 30028,\n\t35398: 30342,\n\t35399: 32117,\n\t35400: 33445,\n\t35401: 34809,\n\t35402: 38283,\n\t35403: 38542,\n\t35404: 35997,\n\t35405: 20977,\n\t35406: 21182,\n\t35407: 22806,\n\t35408: 21683,\n\t35409: 23475,\n\t35410: 23830,\n\t35411: 24936,\n\t35412: 27010,\n\t35413: 28079,\n\t35414: 30861,\n\t35415: 33995,\n\t35416: 34903,\n\t35417: 35442,\n\t35418: 37799,\n\t35419: 39608,\n\t35420: 28012,\n\t35421: 39336,\n\t35422: 34521,\n\t35423: 22435,\n\t35424: 26623,\n\t35425: 34510,\n\t35426: 37390,\n\t35427: 21123,\n\t35428: 22151,\n\t35429: 21508,\n\t35430: 24275,\n\t35431: 25313,\n\t35432: 25785,\n\t35433: 26684,\n\t35434: 26680,\n\t35435: 27579,\n\t35436: 29554,\n\t35437: 30906,\n\t35438: 31339,\n\t35439: 35226,\n\t35440: 35282,\n\t35441: 36203,\n\t35442: 36611,\n\t35443: 37101,\n\t35444: 38307,\n\t35445: 38548,\n\t35446: 38761,\n\t35447: 23398,\n\t35448: 23731,\n\t35449: 27005,\n\t35450: 38989,\n\t35451: 38990,\n\t35452: 25499,\n\t35453: 31520,\n\t35454: 27179,\n\t35456: 27263,\n\t35457: 26806,\n\t35458: 39949,\n\t35459: 28511,\n\t35460: 21106,\n\t35461: 21917,\n\t35462: 24688,\n\t35463: 25324,\n\t35464: 27963,\n\t35465: 28167,\n\t35466: 28369,\n\t35467: 33883,\n\t35468: 35088,\n\t35469: 36676,\n\t35470: 19988,\n\t35471: 39993,\n\t35472: 21494,\n\t35473: 26907,\n\t35474: 27194,\n\t35475: 38788,\n\t35476: 26666,\n\t35477: 20828,\n\t35478: 31427,\n\t35479: 33970,\n\t35480: 37340,\n\t35481: 37772,\n\t35482: 22107,\n\t35483: 40232,\n\t35484: 26658,\n\t35485: 33541,\n\t35486: 33841,\n\t35487: 31909,\n\t35488: 21000,\n\t35489: 33477,\n\t35490: 29926,\n\t35491: 20094,\n\t35492: 20355,\n\t35493: 20896,\n\t35494: 23506,\n\t35495: 21002,\n\t35496: 21208,\n\t35497: 21223,\n\t35498: 24059,\n\t35499: 21914,\n\t35500: 22570,\n\t35501: 23014,\n\t35502: 23436,\n\t35503: 23448,\n\t35504: 23515,\n\t35505: 24178,\n\t35506: 24185,\n\t35507: 24739,\n\t35508: 24863,\n\t35509: 24931,\n\t35510: 25022,\n\t35511: 25563,\n\t35512: 25954,\n\t35513: 26577,\n\t35514: 26707,\n\t35515: 26874,\n\t35516: 27454,\n\t35517: 27475,\n\t35518: 27735,\n\t35519: 28450,\n\t35520: 28567,\n\t35521: 28485,\n\t35522: 29872,\n\t35523: 29976,\n\t35524: 30435,\n\t35525: 30475,\n\t35526: 31487,\n\t35527: 31649,\n\t35528: 31777,\n\t35529: 32233,\n\t35530: 32566,\n\t35531: 32752,\n\t35532: 32925,\n\t35533: 33382,\n\t35534: 33694,\n\t35535: 35251,\n\t35536: 35532,\n\t35537: 36011,\n\t35538: 36996,\n\t35539: 37969,\n\t35540: 38291,\n\t35541: 38289,\n\t35542: 38306,\n\t35543: 38501,\n\t35544: 38867,\n\t35545: 39208,\n\t35546: 33304,\n\t35547: 20024,\n\t35548: 21547,\n\t35549: 23736,\n\t35550: 24012,\n\t35551: 29609,\n\t35552: 30284,\n\t35553: 30524,\n\t35554: 23721,\n\t35555: 32747,\n\t35556: 36107,\n\t35557: 38593,\n\t35558: 38929,\n\t35559: 38996,\n\t35560: 39000,\n\t35561: 20225,\n\t35562: 20238,\n\t35563: 21361,\n\t35564: 21916,\n\t35565: 22120,\n\t35566: 22522,\n\t35567: 22855,\n\t35568: 23305,\n\t35569: 23492,\n\t35570: 23696,\n\t35571: 24076,\n\t35572: 24190,\n\t35573: 24524,\n\t35574: 25582,\n\t35575: 26426,\n\t35576: 26071,\n\t35577: 26082,\n\t35578: 26399,\n\t35579: 26827,\n\t35580: 26820,\n\t35648: 27231,\n\t35649: 24112,\n\t35650: 27589,\n\t35651: 27671,\n\t35652: 27773,\n\t35653: 30079,\n\t35654: 31048,\n\t35655: 23395,\n\t35656: 31232,\n\t35657: 32000,\n\t35658: 24509,\n\t35659: 35215,\n\t35660: 35352,\n\t35661: 36020,\n\t35662: 36215,\n\t35663: 36556,\n\t35664: 36637,\n\t35665: 39138,\n\t35666: 39438,\n\t35667: 39740,\n\t35668: 20096,\n\t35669: 20605,\n\t35670: 20736,\n\t35671: 22931,\n\t35672: 23452,\n\t35673: 25135,\n\t35674: 25216,\n\t35675: 25836,\n\t35676: 27450,\n\t35677: 29344,\n\t35678: 30097,\n\t35679: 31047,\n\t35680: 32681,\n\t35681: 34811,\n\t35682: 35516,\n\t35683: 35696,\n\t35684: 25516,\n\t35685: 33738,\n\t35686: 38816,\n\t35687: 21513,\n\t35688: 21507,\n\t35689: 21931,\n\t35690: 26708,\n\t35691: 27224,\n\t35692: 35440,\n\t35693: 30759,\n\t35694: 26485,\n\t35695: 40653,\n\t35696: 21364,\n\t35697: 23458,\n\t35698: 33050,\n\t35699: 34384,\n\t35700: 36870,\n\t35701: 19992,\n\t35702: 20037,\n\t35703: 20167,\n\t35704: 20241,\n\t35705: 21450,\n\t35706: 21560,\n\t35707: 23470,\n\t35708: 24339,\n\t35709: 24613,\n\t35710: 25937,\n\t35712: 26429,\n\t35713: 27714,\n\t35714: 27762,\n\t35715: 27875,\n\t35716: 28792,\n\t35717: 29699,\n\t35718: 31350,\n\t35719: 31406,\n\t35720: 31496,\n\t35721: 32026,\n\t35722: 31998,\n\t35723: 32102,\n\t35724: 26087,\n\t35725: 29275,\n\t35726: 21435,\n\t35727: 23621,\n\t35728: 24040,\n\t35729: 25298,\n\t35730: 25312,\n\t35731: 25369,\n\t35732: 28192,\n\t35733: 34394,\n\t35734: 35377,\n\t35735: 36317,\n\t35736: 37624,\n\t35737: 28417,\n\t35738: 31142,\n\t35739: 39770,\n\t35740: 20136,\n\t35741: 20139,\n\t35742: 20140,\n\t35743: 20379,\n\t35744: 20384,\n\t35745: 20689,\n\t35746: 20807,\n\t35747: 31478,\n\t35748: 20849,\n\t35749: 20982,\n\t35750: 21332,\n\t35751: 21281,\n\t35752: 21375,\n\t35753: 21483,\n\t35754: 21932,\n\t35755: 22659,\n\t35756: 23777,\n\t35757: 24375,\n\t35758: 24394,\n\t35759: 24623,\n\t35760: 24656,\n\t35761: 24685,\n\t35762: 25375,\n\t35763: 25945,\n\t35764: 27211,\n\t35765: 27841,\n\t35766: 29378,\n\t35767: 29421,\n\t35768: 30703,\n\t35769: 33016,\n\t35770: 33029,\n\t35771: 33288,\n\t35772: 34126,\n\t35773: 37111,\n\t35774: 37857,\n\t35775: 38911,\n\t35776: 39255,\n\t35777: 39514,\n\t35778: 20208,\n\t35779: 20957,\n\t35780: 23597,\n\t35781: 26241,\n\t35782: 26989,\n\t35783: 23616,\n\t35784: 26354,\n\t35785: 26997,\n\t35786: 29577,\n\t35787: 26704,\n\t35788: 31873,\n\t35789: 20677,\n\t35790: 21220,\n\t35791: 22343,\n\t35792: 24062,\n\t35793: 37670,\n\t35794: 26020,\n\t35795: 27427,\n\t35796: 27453,\n\t35797: 29748,\n\t35798: 31105,\n\t35799: 31165,\n\t35800: 31563,\n\t35801: 32202,\n\t35802: 33465,\n\t35803: 33740,\n\t35804: 34943,\n\t35805: 35167,\n\t35806: 35641,\n\t35807: 36817,\n\t35808: 37329,\n\t35809: 21535,\n\t35810: 37504,\n\t35811: 20061,\n\t35812: 20534,\n\t35813: 21477,\n\t35814: 21306,\n\t35815: 29399,\n\t35816: 29590,\n\t35817: 30697,\n\t35818: 33510,\n\t35819: 36527,\n\t35820: 39366,\n\t35821: 39368,\n\t35822: 39378,\n\t35823: 20855,\n\t35824: 24858,\n\t35825: 34398,\n\t35826: 21936,\n\t35827: 31354,\n\t35828: 20598,\n\t35829: 23507,\n\t35830: 36935,\n\t35831: 38533,\n\t35832: 20018,\n\t35833: 27355,\n\t35834: 37351,\n\t35835: 23633,\n\t35836: 23624,\n\t35904: 25496,\n\t35905: 31391,\n\t35906: 27795,\n\t35907: 38772,\n\t35908: 36705,\n\t35909: 31402,\n\t35910: 29066,\n\t35911: 38536,\n\t35912: 31874,\n\t35913: 26647,\n\t35914: 32368,\n\t35915: 26705,\n\t35916: 37740,\n\t35917: 21234,\n\t35918: 21531,\n\t35919: 34219,\n\t35920: 35347,\n\t35921: 32676,\n\t35922: 36557,\n\t35923: 37089,\n\t35924: 21350,\n\t35925: 34952,\n\t35926: 31041,\n\t35927: 20418,\n\t35928: 20670,\n\t35929: 21009,\n\t35930: 20804,\n\t35931: 21843,\n\t35932: 22317,\n\t35933: 29674,\n\t35934: 22411,\n\t35935: 22865,\n\t35936: 24418,\n\t35937: 24452,\n\t35938: 24693,\n\t35939: 24950,\n\t35940: 24935,\n\t35941: 25001,\n\t35942: 25522,\n\t35943: 25658,\n\t35944: 25964,\n\t35945: 26223,\n\t35946: 26690,\n\t35947: 28179,\n\t35948: 30054,\n\t35949: 31293,\n\t35950: 31995,\n\t35951: 32076,\n\t35952: 32153,\n\t35953: 32331,\n\t35954: 32619,\n\t35955: 33550,\n\t35956: 33610,\n\t35957: 34509,\n\t35958: 35336,\n\t35959: 35427,\n\t35960: 35686,\n\t35961: 36605,\n\t35962: 38938,\n\t35963: 40335,\n\t35964: 33464,\n\t35965: 36814,\n\t35966: 39912,\n\t35968: 21127,\n\t35969: 25119,\n\t35970: 25731,\n\t35971: 28608,\n\t35972: 38553,\n\t35973: 26689,\n\t35974: 20625,\n\t35975: 27424,\n\t35976: 27770,\n\t35977: 28500,\n\t35978: 31348,\n\t35979: 32080,\n\t35980: 34880,\n\t35981: 35363,\n\t35982: 26376,\n\t35983: 20214,\n\t35984: 20537,\n\t35985: 20518,\n\t35986: 20581,\n\t35987: 20860,\n\t35988: 21048,\n\t35989: 21091,\n\t35990: 21927,\n\t35991: 22287,\n\t35992: 22533,\n\t35993: 23244,\n\t35994: 24314,\n\t35995: 25010,\n\t35996: 25080,\n\t35997: 25331,\n\t35998: 25458,\n\t35999: 26908,\n\t36000: 27177,\n\t36001: 29309,\n\t36002: 29356,\n\t36003: 29486,\n\t36004: 30740,\n\t36005: 30831,\n\t36006: 32121,\n\t36007: 30476,\n\t36008: 32937,\n\t36009: 35211,\n\t36010: 35609,\n\t36011: 36066,\n\t36012: 36562,\n\t36013: 36963,\n\t36014: 37749,\n\t36015: 38522,\n\t36016: 38997,\n\t36017: 39443,\n\t36018: 40568,\n\t36019: 20803,\n\t36020: 21407,\n\t36021: 21427,\n\t36022: 24187,\n\t36023: 24358,\n\t36024: 28187,\n\t36025: 28304,\n\t36026: 29572,\n\t36027: 29694,\n\t36028: 32067,\n\t36029: 33335,\n\t36030: 35328,\n\t36031: 35578,\n\t36032: 38480,\n\t36033: 20046,\n\t36034: 20491,\n\t36035: 21476,\n\t36036: 21628,\n\t36037: 22266,\n\t36038: 22993,\n\t36039: 23396,\n\t36040: 24049,\n\t36041: 24235,\n\t36042: 24359,\n\t36043: 25144,\n\t36044: 25925,\n\t36045: 26543,\n\t36046: 28246,\n\t36047: 29392,\n\t36048: 31946,\n\t36049: 34996,\n\t36050: 32929,\n\t36051: 32993,\n\t36052: 33776,\n\t36053: 34382,\n\t36054: 35463,\n\t36055: 36328,\n\t36056: 37431,\n\t36057: 38599,\n\t36058: 39015,\n\t36059: 40723,\n\t36060: 20116,\n\t36061: 20114,\n\t36062: 20237,\n\t36063: 21320,\n\t36064: 21577,\n\t36065: 21566,\n\t36066: 23087,\n\t36067: 24460,\n\t36068: 24481,\n\t36069: 24735,\n\t36070: 26791,\n\t36071: 27278,\n\t36072: 29786,\n\t36073: 30849,\n\t36074: 35486,\n\t36075: 35492,\n\t36076: 35703,\n\t36077: 37264,\n\t36078: 20062,\n\t36079: 39881,\n\t36080: 20132,\n\t36081: 20348,\n\t36082: 20399,\n\t36083: 20505,\n\t36084: 20502,\n\t36085: 20809,\n\t36086: 20844,\n\t36087: 21151,\n\t36088: 21177,\n\t36089: 21246,\n\t36090: 21402,\n\t36091: 21475,\n\t36092: 21521,\n\t36160: 21518,\n\t36161: 21897,\n\t36162: 22353,\n\t36163: 22434,\n\t36164: 22909,\n\t36165: 23380,\n\t36166: 23389,\n\t36167: 23439,\n\t36168: 24037,\n\t36169: 24039,\n\t36170: 24055,\n\t36171: 24184,\n\t36172: 24195,\n\t36173: 24218,\n\t36174: 24247,\n\t36175: 24344,\n\t36176: 24658,\n\t36177: 24908,\n\t36178: 25239,\n\t36179: 25304,\n\t36180: 25511,\n\t36181: 25915,\n\t36182: 26114,\n\t36183: 26179,\n\t36184: 26356,\n\t36185: 26477,\n\t36186: 26657,\n\t36187: 26775,\n\t36188: 27083,\n\t36189: 27743,\n\t36190: 27946,\n\t36191: 28009,\n\t36192: 28207,\n\t36193: 28317,\n\t36194: 30002,\n\t36195: 30343,\n\t36196: 30828,\n\t36197: 31295,\n\t36198: 31968,\n\t36199: 32005,\n\t36200: 32024,\n\t36201: 32094,\n\t36202: 32177,\n\t36203: 32789,\n\t36204: 32771,\n\t36205: 32943,\n\t36206: 32945,\n\t36207: 33108,\n\t36208: 33167,\n\t36209: 33322,\n\t36210: 33618,\n\t36211: 34892,\n\t36212: 34913,\n\t36213: 35611,\n\t36214: 36002,\n\t36215: 36092,\n\t36216: 37066,\n\t36217: 37237,\n\t36218: 37489,\n\t36219: 30783,\n\t36220: 37628,\n\t36221: 38308,\n\t36222: 38477,\n\t36224: 38917,\n\t36225: 39321,\n\t36226: 39640,\n\t36227: 40251,\n\t36228: 21083,\n\t36229: 21163,\n\t36230: 21495,\n\t36231: 21512,\n\t36232: 22741,\n\t36233: 25335,\n\t36234: 28640,\n\t36235: 35946,\n\t36236: 36703,\n\t36237: 40633,\n\t36238: 20811,\n\t36239: 21051,\n\t36240: 21578,\n\t36241: 22269,\n\t36242: 31296,\n\t36243: 37239,\n\t36244: 40288,\n\t36245: 40658,\n\t36246: 29508,\n\t36247: 28425,\n\t36248: 33136,\n\t36249: 29969,\n\t36250: 24573,\n\t36251: 24794,\n\t36252: 39592,\n\t36253: 29403,\n\t36254: 36796,\n\t36255: 27492,\n\t36256: 38915,\n\t36257: 20170,\n\t36258: 22256,\n\t36259: 22372,\n\t36260: 22718,\n\t36261: 23130,\n\t36262: 24680,\n\t36263: 25031,\n\t36264: 26127,\n\t36265: 26118,\n\t36266: 26681,\n\t36267: 26801,\n\t36268: 28151,\n\t36269: 30165,\n\t36270: 32058,\n\t36271: 33390,\n\t36272: 39746,\n\t36273: 20123,\n\t36274: 20304,\n\t36275: 21449,\n\t36276: 21766,\n\t36277: 23919,\n\t36278: 24038,\n\t36279: 24046,\n\t36280: 26619,\n\t36281: 27801,\n\t36282: 29811,\n\t36283: 30722,\n\t36284: 35408,\n\t36285: 37782,\n\t36286: 35039,\n\t36287: 22352,\n\t36288: 24231,\n\t36289: 25387,\n\t36290: 20661,\n\t36291: 20652,\n\t36292: 20877,\n\t36293: 26368,\n\t36294: 21705,\n\t36295: 22622,\n\t36296: 22971,\n\t36297: 23472,\n\t36298: 24425,\n\t36299: 25165,\n\t36300: 25505,\n\t36301: 26685,\n\t36302: 27507,\n\t36303: 28168,\n\t36304: 28797,\n\t36305: 37319,\n\t36306: 29312,\n\t36307: 30741,\n\t36308: 30758,\n\t36309: 31085,\n\t36310: 25998,\n\t36311: 32048,\n\t36312: 33756,\n\t36313: 35009,\n\t36314: 36617,\n\t36315: 38555,\n\t36316: 21092,\n\t36317: 22312,\n\t36318: 26448,\n\t36319: 32618,\n\t36320: 36001,\n\t36321: 20916,\n\t36322: 22338,\n\t36323: 38442,\n\t36324: 22586,\n\t36325: 27018,\n\t36326: 32948,\n\t36327: 21682,\n\t36328: 23822,\n\t36329: 22524,\n\t36330: 30869,\n\t36331: 40442,\n\t36332: 20316,\n\t36333: 21066,\n\t36334: 21643,\n\t36335: 25662,\n\t36336: 26152,\n\t36337: 26388,\n\t36338: 26613,\n\t36339: 31364,\n\t36340: 31574,\n\t36341: 32034,\n\t36342: 37679,\n\t36343: 26716,\n\t36344: 39853,\n\t36345: 31545,\n\t36346: 21273,\n\t36347: 20874,\n\t36348: 21047,\n\t36416: 23519,\n\t36417: 25334,\n\t36418: 25774,\n\t36419: 25830,\n\t36420: 26413,\n\t36421: 27578,\n\t36422: 34217,\n\t36423: 38609,\n\t36424: 30352,\n\t36425: 39894,\n\t36426: 25420,\n\t36427: 37638,\n\t36428: 39851,\n\t36429: 30399,\n\t36430: 26194,\n\t36431: 19977,\n\t36432: 20632,\n\t36433: 21442,\n\t36434: 23665,\n\t36435: 24808,\n\t36436: 25746,\n\t36437: 25955,\n\t36438: 26719,\n\t36439: 29158,\n\t36440: 29642,\n\t36441: 29987,\n\t36442: 31639,\n\t36443: 32386,\n\t36444: 34453,\n\t36445: 35715,\n\t36446: 36059,\n\t36447: 37240,\n\t36448: 39184,\n\t36449: 26028,\n\t36450: 26283,\n\t36451: 27531,\n\t36452: 20181,\n\t36453: 20180,\n\t36454: 20282,\n\t36455: 20351,\n\t36456: 21050,\n\t36457: 21496,\n\t36458: 21490,\n\t36459: 21987,\n\t36460: 22235,\n\t36461: 22763,\n\t36462: 22987,\n\t36463: 22985,\n\t36464: 23039,\n\t36465: 23376,\n\t36466: 23629,\n\t36467: 24066,\n\t36468: 24107,\n\t36469: 24535,\n\t36470: 24605,\n\t36471: 25351,\n\t36472: 25903,\n\t36473: 23388,\n\t36474: 26031,\n\t36475: 26045,\n\t36476: 26088,\n\t36477: 26525,\n\t36478: 27490,\n\t36480: 27515,\n\t36481: 27663,\n\t36482: 29509,\n\t36483: 31049,\n\t36484: 31169,\n\t36485: 31992,\n\t36486: 32025,\n\t36487: 32043,\n\t36488: 32930,\n\t36489: 33026,\n\t36490: 33267,\n\t36491: 35222,\n\t36492: 35422,\n\t36493: 35433,\n\t36494: 35430,\n\t36495: 35468,\n\t36496: 35566,\n\t36497: 36039,\n\t36498: 36060,\n\t36499: 38604,\n\t36500: 39164,\n\t36501: 27503,\n\t36502: 20107,\n\t36503: 20284,\n\t36504: 20365,\n\t36505: 20816,\n\t36506: 23383,\n\t36507: 23546,\n\t36508: 24904,\n\t36509: 25345,\n\t36510: 26178,\n\t36511: 27425,\n\t36512: 28363,\n\t36513: 27835,\n\t36514: 29246,\n\t36515: 29885,\n\t36516: 30164,\n\t36517: 30913,\n\t36518: 31034,\n\t36519: 32780,\n\t36520: 32819,\n\t36521: 33258,\n\t36522: 33940,\n\t36523: 36766,\n\t36524: 27728,\n\t36525: 40575,\n\t36526: 24335,\n\t36527: 35672,\n\t36528: 40235,\n\t36529: 31482,\n\t36530: 36600,\n\t36531: 23437,\n\t36532: 38635,\n\t36533: 19971,\n\t36534: 21489,\n\t36535: 22519,\n\t36536: 22833,\n\t36537: 23241,\n\t36538: 23460,\n\t36539: 24713,\n\t36540: 28287,\n\t36541: 28422,\n\t36542: 30142,\n\t36543: 36074,\n\t36544: 23455,\n\t36545: 34048,\n\t36546: 31712,\n\t36547: 20594,\n\t36548: 26612,\n\t36549: 33437,\n\t36550: 23649,\n\t36551: 34122,\n\t36552: 32286,\n\t36553: 33294,\n\t36554: 20889,\n\t36555: 23556,\n\t36556: 25448,\n\t36557: 36198,\n\t36558: 26012,\n\t36559: 29038,\n\t36560: 31038,\n\t36561: 32023,\n\t36562: 32773,\n\t36563: 35613,\n\t36564: 36554,\n\t36565: 36974,\n\t36566: 34503,\n\t36567: 37034,\n\t36568: 20511,\n\t36569: 21242,\n\t36570: 23610,\n\t36571: 26451,\n\t36572: 28796,\n\t36573: 29237,\n\t36574: 37196,\n\t36575: 37320,\n\t36576: 37675,\n\t36577: 33509,\n\t36578: 23490,\n\t36579: 24369,\n\t36580: 24825,\n\t36581: 20027,\n\t36582: 21462,\n\t36583: 23432,\n\t36584: 25163,\n\t36585: 26417,\n\t36586: 27530,\n\t36587: 29417,\n\t36588: 29664,\n\t36589: 31278,\n\t36590: 33131,\n\t36591: 36259,\n\t36592: 37202,\n\t36593: 39318,\n\t36594: 20754,\n\t36595: 21463,\n\t36596: 21610,\n\t36597: 23551,\n\t36598: 25480,\n\t36599: 27193,\n\t36600: 32172,\n\t36601: 38656,\n\t36602: 22234,\n\t36603: 21454,\n\t36604: 21608,\n\t36672: 23447,\n\t36673: 23601,\n\t36674: 24030,\n\t36675: 20462,\n\t36676: 24833,\n\t36677: 25342,\n\t36678: 27954,\n\t36679: 31168,\n\t36680: 31179,\n\t36681: 32066,\n\t36682: 32333,\n\t36683: 32722,\n\t36684: 33261,\n\t36685: 33311,\n\t36686: 33936,\n\t36687: 34886,\n\t36688: 35186,\n\t36689: 35728,\n\t36690: 36468,\n\t36691: 36655,\n\t36692: 36913,\n\t36693: 37195,\n\t36694: 37228,\n\t36695: 38598,\n\t36696: 37276,\n\t36697: 20160,\n\t36698: 20303,\n\t36699: 20805,\n\t36700: 21313,\n\t36701: 24467,\n\t36702: 25102,\n\t36703: 26580,\n\t36704: 27713,\n\t36705: 28171,\n\t36706: 29539,\n\t36707: 32294,\n\t36708: 37325,\n\t36709: 37507,\n\t36710: 21460,\n\t36711: 22809,\n\t36712: 23487,\n\t36713: 28113,\n\t36714: 31069,\n\t36715: 32302,\n\t36716: 31899,\n\t36717: 22654,\n\t36718: 29087,\n\t36719: 20986,\n\t36720: 34899,\n\t36721: 36848,\n\t36722: 20426,\n\t36723: 23803,\n\t36724: 26149,\n\t36725: 30636,\n\t36726: 31459,\n\t36727: 33308,\n\t36728: 39423,\n\t36729: 20934,\n\t36730: 24490,\n\t36731: 26092,\n\t36732: 26991,\n\t36733: 27529,\n\t36734: 28147,\n\t36736: 28310,\n\t36737: 28516,\n\t36738: 30462,\n\t36739: 32020,\n\t36740: 24033,\n\t36741: 36981,\n\t36742: 37255,\n\t36743: 38918,\n\t36744: 20966,\n\t36745: 21021,\n\t36746: 25152,\n\t36747: 26257,\n\t36748: 26329,\n\t36749: 28186,\n\t36750: 24246,\n\t36751: 32210,\n\t36752: 32626,\n\t36753: 26360,\n\t36754: 34223,\n\t36755: 34295,\n\t36756: 35576,\n\t36757: 21161,\n\t36758: 21465,\n\t36759: 22899,\n\t36760: 24207,\n\t36761: 24464,\n\t36762: 24661,\n\t36763: 37604,\n\t36764: 38500,\n\t36765: 20663,\n\t36766: 20767,\n\t36767: 21213,\n\t36768: 21280,\n\t36769: 21319,\n\t36770: 21484,\n\t36771: 21736,\n\t36772: 21830,\n\t36773: 21809,\n\t36774: 22039,\n\t36775: 22888,\n\t36776: 22974,\n\t36777: 23100,\n\t36778: 23477,\n\t36779: 23558,\n\t36780: 23567,\n\t36781: 23569,\n\t36782: 23578,\n\t36783: 24196,\n\t36784: 24202,\n\t36785: 24288,\n\t36786: 24432,\n\t36787: 25215,\n\t36788: 25220,\n\t36789: 25307,\n\t36790: 25484,\n\t36791: 25463,\n\t36792: 26119,\n\t36793: 26124,\n\t36794: 26157,\n\t36795: 26230,\n\t36796: 26494,\n\t36797: 26786,\n\t36798: 27167,\n\t36799: 27189,\n\t36800: 27836,\n\t36801: 28040,\n\t36802: 28169,\n\t36803: 28248,\n\t36804: 28988,\n\t36805: 28966,\n\t36806: 29031,\n\t36807: 30151,\n\t36808: 30465,\n\t36809: 30813,\n\t36810: 30977,\n\t36811: 31077,\n\t36812: 31216,\n\t36813: 31456,\n\t36814: 31505,\n\t36815: 31911,\n\t36816: 32057,\n\t36817: 32918,\n\t36818: 33750,\n\t36819: 33931,\n\t36820: 34121,\n\t36821: 34909,\n\t36822: 35059,\n\t36823: 35359,\n\t36824: 35388,\n\t36825: 35412,\n\t36826: 35443,\n\t36827: 35937,\n\t36828: 36062,\n\t36829: 37284,\n\t36830: 37478,\n\t36831: 37758,\n\t36832: 37912,\n\t36833: 38556,\n\t36834: 38808,\n\t36835: 19978,\n\t36836: 19976,\n\t36837: 19998,\n\t36838: 20055,\n\t36839: 20887,\n\t36840: 21104,\n\t36841: 22478,\n\t36842: 22580,\n\t36843: 22732,\n\t36844: 23330,\n\t36845: 24120,\n\t36846: 24773,\n\t36847: 25854,\n\t36848: 26465,\n\t36849: 26454,\n\t36850: 27972,\n\t36851: 29366,\n\t36852: 30067,\n\t36853: 31331,\n\t36854: 33976,\n\t36855: 35698,\n\t36856: 37304,\n\t36857: 37664,\n\t36858: 22065,\n\t36859: 22516,\n\t36860: 39166,\n\t36928: 25325,\n\t36929: 26893,\n\t36930: 27542,\n\t36931: 29165,\n\t36932: 32340,\n\t36933: 32887,\n\t36934: 33394,\n\t36935: 35302,\n\t36936: 39135,\n\t36937: 34645,\n\t36938: 36785,\n\t36939: 23611,\n\t36940: 20280,\n\t36941: 20449,\n\t36942: 20405,\n\t36943: 21767,\n\t36944: 23072,\n\t36945: 23517,\n\t36946: 23529,\n\t36947: 24515,\n\t36948: 24910,\n\t36949: 25391,\n\t36950: 26032,\n\t36951: 26187,\n\t36952: 26862,\n\t36953: 27035,\n\t36954: 28024,\n\t36955: 28145,\n\t36956: 30003,\n\t36957: 30137,\n\t36958: 30495,\n\t36959: 31070,\n\t36960: 31206,\n\t36961: 32051,\n\t36962: 33251,\n\t36963: 33455,\n\t36964: 34218,\n\t36965: 35242,\n\t36966: 35386,\n\t36967: 36523,\n\t36968: 36763,\n\t36969: 36914,\n\t36970: 37341,\n\t36971: 38663,\n\t36972: 20154,\n\t36973: 20161,\n\t36974: 20995,\n\t36975: 22645,\n\t36976: 22764,\n\t36977: 23563,\n\t36978: 29978,\n\t36979: 23613,\n\t36980: 33102,\n\t36981: 35338,\n\t36982: 36805,\n\t36983: 38499,\n\t36984: 38765,\n\t36985: 31525,\n\t36986: 35535,\n\t36987: 38920,\n\t36988: 37218,\n\t36989: 22259,\n\t36990: 21416,\n\t36992: 36887,\n\t36993: 21561,\n\t36994: 22402,\n\t36995: 24101,\n\t36996: 25512,\n\t36997: 27700,\n\t36998: 28810,\n\t36999: 30561,\n\t37000: 31883,\n\t37001: 32736,\n\t37002: 34928,\n\t37003: 36930,\n\t37004: 37204,\n\t37005: 37648,\n\t37006: 37656,\n\t37007: 38543,\n\t37008: 29790,\n\t37009: 39620,\n\t37010: 23815,\n\t37011: 23913,\n\t37012: 25968,\n\t37013: 26530,\n\t37014: 36264,\n\t37015: 38619,\n\t37016: 25454,\n\t37017: 26441,\n\t37018: 26905,\n\t37019: 33733,\n\t37020: 38935,\n\t37021: 38592,\n\t37022: 35070,\n\t37023: 28548,\n\t37024: 25722,\n\t37025: 23544,\n\t37026: 19990,\n\t37027: 28716,\n\t37028: 30045,\n\t37029: 26159,\n\t37030: 20932,\n\t37031: 21046,\n\t37032: 21218,\n\t37033: 22995,\n\t37034: 24449,\n\t37035: 24615,\n\t37036: 25104,\n\t37037: 25919,\n\t37038: 25972,\n\t37039: 26143,\n\t37040: 26228,\n\t37041: 26866,\n\t37042: 26646,\n\t37043: 27491,\n\t37044: 28165,\n\t37045: 29298,\n\t37046: 29983,\n\t37047: 30427,\n\t37048: 31934,\n\t37049: 32854,\n\t37050: 22768,\n\t37051: 35069,\n\t37052: 35199,\n\t37053: 35488,\n\t37054: 35475,\n\t37055: 35531,\n\t37056: 36893,\n\t37057: 37266,\n\t37058: 38738,\n\t37059: 38745,\n\t37060: 25993,\n\t37061: 31246,\n\t37062: 33030,\n\t37063: 38587,\n\t37064: 24109,\n\t37065: 24796,\n\t37066: 25114,\n\t37067: 26021,\n\t37068: 26132,\n\t37069: 26512,\n\t37070: 30707,\n\t37071: 31309,\n\t37072: 31821,\n\t37073: 32318,\n\t37074: 33034,\n\t37075: 36012,\n\t37076: 36196,\n\t37077: 36321,\n\t37078: 36447,\n\t37079: 30889,\n\t37080: 20999,\n\t37081: 25305,\n\t37082: 25509,\n\t37083: 25666,\n\t37084: 25240,\n\t37085: 35373,\n\t37086: 31363,\n\t37087: 31680,\n\t37088: 35500,\n\t37089: 38634,\n\t37090: 32118,\n\t37091: 33292,\n\t37092: 34633,\n\t37093: 20185,\n\t37094: 20808,\n\t37095: 21315,\n\t37096: 21344,\n\t37097: 23459,\n\t37098: 23554,\n\t37099: 23574,\n\t37100: 24029,\n\t37101: 25126,\n\t37102: 25159,\n\t37103: 25776,\n\t37104: 26643,\n\t37105: 26676,\n\t37106: 27849,\n\t37107: 27973,\n\t37108: 27927,\n\t37109: 26579,\n\t37110: 28508,\n\t37111: 29006,\n\t37112: 29053,\n\t37113: 26059,\n\t37114: 31359,\n\t37115: 31661,\n\t37116: 32218,\n\t37184: 32330,\n\t37185: 32680,\n\t37186: 33146,\n\t37187: 33307,\n\t37188: 33337,\n\t37189: 34214,\n\t37190: 35438,\n\t37191: 36046,\n\t37192: 36341,\n\t37193: 36984,\n\t37194: 36983,\n\t37195: 37549,\n\t37196: 37521,\n\t37197: 38275,\n\t37198: 39854,\n\t37199: 21069,\n\t37200: 21892,\n\t37201: 28472,\n\t37202: 28982,\n\t37203: 20840,\n\t37204: 31109,\n\t37205: 32341,\n\t37206: 33203,\n\t37207: 31950,\n\t37208: 22092,\n\t37209: 22609,\n\t37210: 23720,\n\t37211: 25514,\n\t37212: 26366,\n\t37213: 26365,\n\t37214: 26970,\n\t37215: 29401,\n\t37216: 30095,\n\t37217: 30094,\n\t37218: 30990,\n\t37219: 31062,\n\t37220: 31199,\n\t37221: 31895,\n\t37222: 32032,\n\t37223: 32068,\n\t37224: 34311,\n\t37225: 35380,\n\t37226: 38459,\n\t37227: 36961,\n\t37228: 40736,\n\t37229: 20711,\n\t37230: 21109,\n\t37231: 21452,\n\t37232: 21474,\n\t37233: 20489,\n\t37234: 21930,\n\t37235: 22766,\n\t37236: 22863,\n\t37237: 29245,\n\t37238: 23435,\n\t37239: 23652,\n\t37240: 21277,\n\t37241: 24803,\n\t37242: 24819,\n\t37243: 25436,\n\t37244: 25475,\n\t37245: 25407,\n\t37246: 25531,\n\t37248: 25805,\n\t37249: 26089,\n\t37250: 26361,\n\t37251: 24035,\n\t37252: 27085,\n\t37253: 27133,\n\t37254: 28437,\n\t37255: 29157,\n\t37256: 20105,\n\t37257: 30185,\n\t37258: 30456,\n\t37259: 31379,\n\t37260: 31967,\n\t37261: 32207,\n\t37262: 32156,\n\t37263: 32865,\n\t37264: 33609,\n\t37265: 33624,\n\t37266: 33900,\n\t37267: 33980,\n\t37268: 34299,\n\t37269: 35013,\n\t37270: 36208,\n\t37271: 36865,\n\t37272: 36973,\n\t37273: 37783,\n\t37274: 38684,\n\t37275: 39442,\n\t37276: 20687,\n\t37277: 22679,\n\t37278: 24974,\n\t37279: 33235,\n\t37280: 34101,\n\t37281: 36104,\n\t37282: 36896,\n\t37283: 20419,\n\t37284: 20596,\n\t37285: 21063,\n\t37286: 21363,\n\t37287: 24687,\n\t37288: 25417,\n\t37289: 26463,\n\t37290: 28204,\n\t37291: 36275,\n\t37292: 36895,\n\t37293: 20439,\n\t37294: 23646,\n\t37295: 36042,\n\t37296: 26063,\n\t37297: 32154,\n\t37298: 21330,\n\t37299: 34966,\n\t37300: 20854,\n\t37301: 25539,\n\t37302: 23384,\n\t37303: 23403,\n\t37304: 23562,\n\t37305: 25613,\n\t37306: 26449,\n\t37307: 36956,\n\t37308: 20182,\n\t37309: 22810,\n\t37310: 22826,\n\t37311: 27760,\n\t37312: 35409,\n\t37313: 21822,\n\t37314: 22549,\n\t37315: 22949,\n\t37316: 24816,\n\t37317: 25171,\n\t37318: 26561,\n\t37319: 33333,\n\t37320: 26965,\n\t37321: 38464,\n\t37322: 39364,\n\t37323: 39464,\n\t37324: 20307,\n\t37325: 22534,\n\t37326: 23550,\n\t37327: 32784,\n\t37328: 23729,\n\t37329: 24111,\n\t37330: 24453,\n\t37331: 24608,\n\t37332: 24907,\n\t37333: 25140,\n\t37334: 26367,\n\t37335: 27888,\n\t37336: 28382,\n\t37337: 32974,\n\t37338: 33151,\n\t37339: 33492,\n\t37340: 34955,\n\t37341: 36024,\n\t37342: 36864,\n\t37343: 36910,\n\t37344: 38538,\n\t37345: 40667,\n\t37346: 39899,\n\t37347: 20195,\n\t37348: 21488,\n\t37349: 22823,\n\t37350: 31532,\n\t37351: 37261,\n\t37352: 38988,\n\t37353: 40441,\n\t37354: 28381,\n\t37355: 28711,\n\t37356: 21331,\n\t37357: 21828,\n\t37358: 23429,\n\t37359: 25176,\n\t37360: 25246,\n\t37361: 25299,\n\t37362: 27810,\n\t37363: 28655,\n\t37364: 29730,\n\t37365: 35351,\n\t37366: 37944,\n\t37367: 28609,\n\t37368: 35582,\n\t37369: 33592,\n\t37370: 20967,\n\t37371: 34552,\n\t37372: 21482,\n\t37440: 21481,\n\t37441: 20294,\n\t37442: 36948,\n\t37443: 36784,\n\t37444: 22890,\n\t37445: 33073,\n\t37446: 24061,\n\t37447: 31466,\n\t37448: 36799,\n\t37449: 26842,\n\t37450: 35895,\n\t37451: 29432,\n\t37452: 40008,\n\t37453: 27197,\n\t37454: 35504,\n\t37455: 20025,\n\t37456: 21336,\n\t37457: 22022,\n\t37458: 22374,\n\t37459: 25285,\n\t37460: 25506,\n\t37461: 26086,\n\t37462: 27470,\n\t37463: 28129,\n\t37464: 28251,\n\t37465: 28845,\n\t37466: 30701,\n\t37467: 31471,\n\t37468: 31658,\n\t37469: 32187,\n\t37470: 32829,\n\t37471: 32966,\n\t37472: 34507,\n\t37473: 35477,\n\t37474: 37723,\n\t37475: 22243,\n\t37476: 22727,\n\t37477: 24382,\n\t37478: 26029,\n\t37479: 26262,\n\t37480: 27264,\n\t37481: 27573,\n\t37482: 30007,\n\t37483: 35527,\n\t37484: 20516,\n\t37485: 30693,\n\t37486: 22320,\n\t37487: 24347,\n\t37488: 24677,\n\t37489: 26234,\n\t37490: 27744,\n\t37491: 30196,\n\t37492: 31258,\n\t37493: 32622,\n\t37494: 33268,\n\t37495: 34584,\n\t37496: 36933,\n\t37497: 39347,\n\t37498: 31689,\n\t37499: 30044,\n\t37500: 31481,\n\t37501: 31569,\n\t37502: 33988,\n\t37504: 36880,\n\t37505: 31209,\n\t37506: 31378,\n\t37507: 33590,\n\t37508: 23265,\n\t37509: 30528,\n\t37510: 20013,\n\t37511: 20210,\n\t37512: 23449,\n\t37513: 24544,\n\t37514: 25277,\n\t37515: 26172,\n\t37516: 26609,\n\t37517: 27880,\n\t37518: 34411,\n\t37519: 34935,\n\t37520: 35387,\n\t37521: 37198,\n\t37522: 37619,\n\t37523: 39376,\n\t37524: 27159,\n\t37525: 28710,\n\t37526: 29482,\n\t37527: 33511,\n\t37528: 33879,\n\t37529: 36015,\n\t37530: 19969,\n\t37531: 20806,\n\t37532: 20939,\n\t37533: 21899,\n\t37534: 23541,\n\t37535: 24086,\n\t37536: 24115,\n\t37537: 24193,\n\t37538: 24340,\n\t37539: 24373,\n\t37540: 24427,\n\t37541: 24500,\n\t37542: 25074,\n\t37543: 25361,\n\t37544: 26274,\n\t37545: 26397,\n\t37546: 28526,\n\t37547: 29266,\n\t37548: 30010,\n\t37549: 30522,\n\t37550: 32884,\n\t37551: 33081,\n\t37552: 33144,\n\t37553: 34678,\n\t37554: 35519,\n\t37555: 35548,\n\t37556: 36229,\n\t37557: 36339,\n\t37558: 37530,\n\t37559: 38263,\n\t37560: 38914,\n\t37561: 40165,\n\t37562: 21189,\n\t37563: 25431,\n\t37564: 30452,\n\t37565: 26389,\n\t37566: 27784,\n\t37567: 29645,\n\t37568: 36035,\n\t37569: 37806,\n\t37570: 38515,\n\t37571: 27941,\n\t37572: 22684,\n\t37573: 26894,\n\t37574: 27084,\n\t37575: 36861,\n\t37576: 37786,\n\t37577: 30171,\n\t37578: 36890,\n\t37579: 22618,\n\t37580: 26626,\n\t37581: 25524,\n\t37582: 27131,\n\t37583: 20291,\n\t37584: 28460,\n\t37585: 26584,\n\t37586: 36795,\n\t37587: 34086,\n\t37588: 32180,\n\t37589: 37716,\n\t37590: 26943,\n\t37591: 28528,\n\t37592: 22378,\n\t37593: 22775,\n\t37594: 23340,\n\t37595: 32044,\n\t37596: 29226,\n\t37597: 21514,\n\t37598: 37347,\n\t37599: 40372,\n\t37600: 20141,\n\t37601: 20302,\n\t37602: 20572,\n\t37603: 20597,\n\t37604: 21059,\n\t37605: 35998,\n\t37606: 21576,\n\t37607: 22564,\n\t37608: 23450,\n\t37609: 24093,\n\t37610: 24213,\n\t37611: 24237,\n\t37612: 24311,\n\t37613: 24351,\n\t37614: 24716,\n\t37615: 25269,\n\t37616: 25402,\n\t37617: 25552,\n\t37618: 26799,\n\t37619: 27712,\n\t37620: 30855,\n\t37621: 31118,\n\t37622: 31243,\n\t37623: 32224,\n\t37624: 33351,\n\t37625: 35330,\n\t37626: 35558,\n\t37627: 36420,\n\t37628: 36883,\n\t37696: 37048,\n\t37697: 37165,\n\t37698: 37336,\n\t37699: 40718,\n\t37700: 27877,\n\t37701: 25688,\n\t37702: 25826,\n\t37703: 25973,\n\t37704: 28404,\n\t37705: 30340,\n\t37706: 31515,\n\t37707: 36969,\n\t37708: 37841,\n\t37709: 28346,\n\t37710: 21746,\n\t37711: 24505,\n\t37712: 25764,\n\t37713: 36685,\n\t37714: 36845,\n\t37715: 37444,\n\t37716: 20856,\n\t37717: 22635,\n\t37718: 22825,\n\t37719: 23637,\n\t37720: 24215,\n\t37721: 28155,\n\t37722: 32399,\n\t37723: 29980,\n\t37724: 36028,\n\t37725: 36578,\n\t37726: 39003,\n\t37727: 28857,\n\t37728: 20253,\n\t37729: 27583,\n\t37730: 28593,\n\t37731: 30000,\n\t37732: 38651,\n\t37733: 20814,\n\t37734: 21520,\n\t37735: 22581,\n\t37736: 22615,\n\t37737: 22956,\n\t37738: 23648,\n\t37739: 24466,\n\t37740: 26007,\n\t37741: 26460,\n\t37742: 28193,\n\t37743: 30331,\n\t37744: 33759,\n\t37745: 36077,\n\t37746: 36884,\n\t37747: 37117,\n\t37748: 37709,\n\t37749: 30757,\n\t37750: 30778,\n\t37751: 21162,\n\t37752: 24230,\n\t37753: 22303,\n\t37754: 22900,\n\t37755: 24594,\n\t37756: 20498,\n\t37757: 20826,\n\t37758: 20908,\n\t37760: 20941,\n\t37761: 20992,\n\t37762: 21776,\n\t37763: 22612,\n\t37764: 22616,\n\t37765: 22871,\n\t37766: 23445,\n\t37767: 23798,\n\t37768: 23947,\n\t37769: 24764,\n\t37770: 25237,\n\t37771: 25645,\n\t37772: 26481,\n\t37773: 26691,\n\t37774: 26812,\n\t37775: 26847,\n\t37776: 30423,\n\t37777: 28120,\n\t37778: 28271,\n\t37779: 28059,\n\t37780: 28783,\n\t37781: 29128,\n\t37782: 24403,\n\t37783: 30168,\n\t37784: 31095,\n\t37785: 31561,\n\t37786: 31572,\n\t37787: 31570,\n\t37788: 31958,\n\t37789: 32113,\n\t37790: 21040,\n\t37791: 33891,\n\t37792: 34153,\n\t37793: 34276,\n\t37794: 35342,\n\t37795: 35588,\n\t37796: 35910,\n\t37797: 36367,\n\t37798: 36867,\n\t37799: 36879,\n\t37800: 37913,\n\t37801: 38518,\n\t37802: 38957,\n\t37803: 39472,\n\t37804: 38360,\n\t37805: 20685,\n\t37806: 21205,\n\t37807: 21516,\n\t37808: 22530,\n\t37809: 23566,\n\t37810: 24999,\n\t37811: 25758,\n\t37812: 27934,\n\t37813: 30643,\n\t37814: 31461,\n\t37815: 33012,\n\t37816: 33796,\n\t37817: 36947,\n\t37818: 37509,\n\t37819: 23776,\n\t37820: 40199,\n\t37821: 21311,\n\t37822: 24471,\n\t37823: 24499,\n\t37824: 28060,\n\t37825: 29305,\n\t37826: 30563,\n\t37827: 31167,\n\t37828: 31716,\n\t37829: 27602,\n\t37830: 29420,\n\t37831: 35501,\n\t37832: 26627,\n\t37833: 27233,\n\t37834: 20984,\n\t37835: 31361,\n\t37836: 26932,\n\t37837: 23626,\n\t37838: 40182,\n\t37839: 33515,\n\t37840: 23493,\n\t37841: 37193,\n\t37842: 28702,\n\t37843: 22136,\n\t37844: 23663,\n\t37845: 24775,\n\t37846: 25958,\n\t37847: 27788,\n\t37848: 35930,\n\t37849: 36929,\n\t37850: 38931,\n\t37851: 21585,\n\t37852: 26311,\n\t37853: 37389,\n\t37854: 22856,\n\t37855: 37027,\n\t37856: 20869,\n\t37857: 20045,\n\t37858: 20970,\n\t37859: 34201,\n\t37860: 35598,\n\t37861: 28760,\n\t37862: 25466,\n\t37863: 37707,\n\t37864: 26978,\n\t37865: 39348,\n\t37866: 32260,\n\t37867: 30071,\n\t37868: 21335,\n\t37869: 26976,\n\t37870: 36575,\n\t37871: 38627,\n\t37872: 27741,\n\t37873: 20108,\n\t37874: 23612,\n\t37875: 24336,\n\t37876: 36841,\n\t37877: 21250,\n\t37878: 36049,\n\t37879: 32905,\n\t37880: 34425,\n\t37881: 24319,\n\t37882: 26085,\n\t37883: 20083,\n\t37884: 20837,\n\t37952: 22914,\n\t37953: 23615,\n\t37954: 38894,\n\t37955: 20219,\n\t37956: 22922,\n\t37957: 24525,\n\t37958: 35469,\n\t37959: 28641,\n\t37960: 31152,\n\t37961: 31074,\n\t37962: 23527,\n\t37963: 33905,\n\t37964: 29483,\n\t37965: 29105,\n\t37966: 24180,\n\t37967: 24565,\n\t37968: 25467,\n\t37969: 25754,\n\t37970: 29123,\n\t37971: 31896,\n\t37972: 20035,\n\t37973: 24316,\n\t37974: 20043,\n\t37975: 22492,\n\t37976: 22178,\n\t37977: 24745,\n\t37978: 28611,\n\t37979: 32013,\n\t37980: 33021,\n\t37981: 33075,\n\t37982: 33215,\n\t37983: 36786,\n\t37984: 35223,\n\t37985: 34468,\n\t37986: 24052,\n\t37987: 25226,\n\t37988: 25773,\n\t37989: 35207,\n\t37990: 26487,\n\t37991: 27874,\n\t37992: 27966,\n\t37993: 29750,\n\t37994: 30772,\n\t37995: 23110,\n\t37996: 32629,\n\t37997: 33453,\n\t37998: 39340,\n\t37999: 20467,\n\t38000: 24259,\n\t38001: 25309,\n\t38002: 25490,\n\t38003: 25943,\n\t38004: 26479,\n\t38005: 30403,\n\t38006: 29260,\n\t38007: 32972,\n\t38008: 32954,\n\t38009: 36649,\n\t38010: 37197,\n\t38011: 20493,\n\t38012: 22521,\n\t38013: 23186,\n\t38014: 26757,\n\t38016: 26995,\n\t38017: 29028,\n\t38018: 29437,\n\t38019: 36023,\n\t38020: 22770,\n\t38021: 36064,\n\t38022: 38506,\n\t38023: 36889,\n\t38024: 34687,\n\t38025: 31204,\n\t38026: 30695,\n\t38027: 33833,\n\t38028: 20271,\n\t38029: 21093,\n\t38030: 21338,\n\t38031: 25293,\n\t38032: 26575,\n\t38033: 27850,\n\t38034: 30333,\n\t38035: 31636,\n\t38036: 31893,\n\t38037: 33334,\n\t38038: 34180,\n\t38039: 36843,\n\t38040: 26333,\n\t38041: 28448,\n\t38042: 29190,\n\t38043: 32283,\n\t38044: 33707,\n\t38045: 39361,\n\t38046: 40614,\n\t38047: 20989,\n\t38048: 31665,\n\t38049: 30834,\n\t38050: 31672,\n\t38051: 32903,\n\t38052: 31560,\n\t38053: 27368,\n\t38054: 24161,\n\t38055: 32908,\n\t38056: 30033,\n\t38057: 30048,\n\t38058: 20843,\n\t38059: 37474,\n\t38060: 28300,\n\t38061: 30330,\n\t38062: 37271,\n\t38063: 39658,\n\t38064: 20240,\n\t38065: 32624,\n\t38066: 25244,\n\t38067: 31567,\n\t38068: 38309,\n\t38069: 40169,\n\t38070: 22138,\n\t38071: 22617,\n\t38072: 34532,\n\t38073: 38588,\n\t38074: 20276,\n\t38075: 21028,\n\t38076: 21322,\n\t38077: 21453,\n\t38078: 21467,\n\t38079: 24070,\n\t38080: 25644,\n\t38081: 26001,\n\t38082: 26495,\n\t38083: 27710,\n\t38084: 27726,\n\t38085: 29256,\n\t38086: 29359,\n\t38087: 29677,\n\t38088: 30036,\n\t38089: 32321,\n\t38090: 33324,\n\t38091: 34281,\n\t38092: 36009,\n\t38093: 31684,\n\t38094: 37318,\n\t38095: 29033,\n\t38096: 38930,\n\t38097: 39151,\n\t38098: 25405,\n\t38099: 26217,\n\t38100: 30058,\n\t38101: 30436,\n\t38102: 30928,\n\t38103: 34115,\n\t38104: 34542,\n\t38105: 21290,\n\t38106: 21329,\n\t38107: 21542,\n\t38108: 22915,\n\t38109: 24199,\n\t38110: 24444,\n\t38111: 24754,\n\t38112: 25161,\n\t38113: 25209,\n\t38114: 25259,\n\t38115: 26000,\n\t38116: 27604,\n\t38117: 27852,\n\t38118: 30130,\n\t38119: 30382,\n\t38120: 30865,\n\t38121: 31192,\n\t38122: 32203,\n\t38123: 32631,\n\t38124: 32933,\n\t38125: 34987,\n\t38126: 35513,\n\t38127: 36027,\n\t38128: 36991,\n\t38129: 38750,\n\t38130: 39131,\n\t38131: 27147,\n\t38132: 31800,\n\t38133: 20633,\n\t38134: 23614,\n\t38135: 24494,\n\t38136: 26503,\n\t38137: 27608,\n\t38138: 29749,\n\t38139: 30473,\n\t38140: 32654,\n\t38208: 40763,\n\t38209: 26570,\n\t38210: 31255,\n\t38211: 21305,\n\t38212: 30091,\n\t38213: 39661,\n\t38214: 24422,\n\t38215: 33181,\n\t38216: 33777,\n\t38217: 32920,\n\t38218: 24380,\n\t38219: 24517,\n\t38220: 30050,\n\t38221: 31558,\n\t38222: 36924,\n\t38223: 26727,\n\t38224: 23019,\n\t38225: 23195,\n\t38226: 32016,\n\t38227: 30334,\n\t38228: 35628,\n\t38229: 20469,\n\t38230: 24426,\n\t38231: 27161,\n\t38232: 27703,\n\t38233: 28418,\n\t38234: 29922,\n\t38235: 31080,\n\t38236: 34920,\n\t38237: 35413,\n\t38238: 35961,\n\t38239: 24287,\n\t38240: 25551,\n\t38241: 30149,\n\t38242: 31186,\n\t38243: 33495,\n\t38244: 37672,\n\t38245: 37618,\n\t38246: 33948,\n\t38247: 34541,\n\t38248: 39981,\n\t38249: 21697,\n\t38250: 24428,\n\t38251: 25996,\n\t38252: 27996,\n\t38253: 28693,\n\t38254: 36007,\n\t38255: 36051,\n\t38256: 38971,\n\t38257: 25935,\n\t38258: 29942,\n\t38259: 19981,\n\t38260: 20184,\n\t38261: 22496,\n\t38262: 22827,\n\t38263: 23142,\n\t38264: 23500,\n\t38265: 20904,\n\t38266: 24067,\n\t38267: 24220,\n\t38268: 24598,\n\t38269: 25206,\n\t38270: 25975,\n\t38272: 26023,\n\t38273: 26222,\n\t38274: 28014,\n\t38275: 29238,\n\t38276: 31526,\n\t38277: 33104,\n\t38278: 33178,\n\t38279: 33433,\n\t38280: 35676,\n\t38281: 36000,\n\t38282: 36070,\n\t38283: 36212,\n\t38284: 38428,\n\t38285: 38468,\n\t38286: 20398,\n\t38287: 25771,\n\t38288: 27494,\n\t38289: 33310,\n\t38290: 33889,\n\t38291: 34154,\n\t38292: 37096,\n\t38293: 23553,\n\t38294: 26963,\n\t38295: 39080,\n\t38296: 33914,\n\t38297: 34135,\n\t38298: 20239,\n\t38299: 21103,\n\t38300: 24489,\n\t38301: 24133,\n\t38302: 26381,\n\t38303: 31119,\n\t38304: 33145,\n\t38305: 35079,\n\t38306: 35206,\n\t38307: 28149,\n\t38308: 24343,\n\t38309: 25173,\n\t38310: 27832,\n\t38311: 20175,\n\t38312: 29289,\n\t38313: 39826,\n\t38314: 20998,\n\t38315: 21563,\n\t38316: 22132,\n\t38317: 22707,\n\t38318: 24996,\n\t38319: 25198,\n\t38320: 28954,\n\t38321: 22894,\n\t38322: 31881,\n\t38323: 31966,\n\t38324: 32027,\n\t38325: 38640,\n\t38326: 25991,\n\t38327: 32862,\n\t38328: 19993,\n\t38329: 20341,\n\t38330: 20853,\n\t38331: 22592,\n\t38332: 24163,\n\t38333: 24179,\n\t38334: 24330,\n\t38335: 26564,\n\t38336: 20006,\n\t38337: 34109,\n\t38338: 38281,\n\t38339: 38491,\n\t38340: 31859,\n\t38341: 38913,\n\t38342: 20731,\n\t38343: 22721,\n\t38344: 30294,\n\t38345: 30887,\n\t38346: 21029,\n\t38347: 30629,\n\t38348: 34065,\n\t38349: 31622,\n\t38350: 20559,\n\t38351: 22793,\n\t38352: 29255,\n\t38353: 31687,\n\t38354: 32232,\n\t38355: 36794,\n\t38356: 36820,\n\t38357: 36941,\n\t38358: 20415,\n\t38359: 21193,\n\t38360: 23081,\n\t38361: 24321,\n\t38362: 38829,\n\t38363: 20445,\n\t38364: 33303,\n\t38365: 37610,\n\t38366: 22275,\n\t38367: 25429,\n\t38368: 27497,\n\t38369: 29995,\n\t38370: 35036,\n\t38371: 36628,\n\t38372: 31298,\n\t38373: 21215,\n\t38374: 22675,\n\t38375: 24917,\n\t38376: 25098,\n\t38377: 26286,\n\t38378: 27597,\n\t38379: 31807,\n\t38380: 33769,\n\t38381: 20515,\n\t38382: 20472,\n\t38383: 21253,\n\t38384: 21574,\n\t38385: 22577,\n\t38386: 22857,\n\t38387: 23453,\n\t38388: 23792,\n\t38389: 23791,\n\t38390: 23849,\n\t38391: 24214,\n\t38392: 25265,\n\t38393: 25447,\n\t38394: 25918,\n\t38395: 26041,\n\t38396: 26379,\n\t38464: 27861,\n\t38465: 27873,\n\t38466: 28921,\n\t38467: 30770,\n\t38468: 32299,\n\t38469: 32990,\n\t38470: 33459,\n\t38471: 33804,\n\t38472: 34028,\n\t38473: 34562,\n\t38474: 35090,\n\t38475: 35370,\n\t38476: 35914,\n\t38477: 37030,\n\t38478: 37586,\n\t38479: 39165,\n\t38480: 40179,\n\t38481: 40300,\n\t38482: 20047,\n\t38483: 20129,\n\t38484: 20621,\n\t38485: 21078,\n\t38486: 22346,\n\t38487: 22952,\n\t38488: 24125,\n\t38489: 24536,\n\t38490: 24537,\n\t38491: 25151,\n\t38492: 26292,\n\t38493: 26395,\n\t38494: 26576,\n\t38495: 26834,\n\t38496: 20882,\n\t38497: 32033,\n\t38498: 32938,\n\t38499: 33192,\n\t38500: 35584,\n\t38501: 35980,\n\t38502: 36031,\n\t38503: 37502,\n\t38504: 38450,\n\t38505: 21536,\n\t38506: 38956,\n\t38507: 21271,\n\t38508: 20693,\n\t38509: 21340,\n\t38510: 22696,\n\t38511: 25778,\n\t38512: 26420,\n\t38513: 29287,\n\t38514: 30566,\n\t38515: 31302,\n\t38516: 37350,\n\t38517: 21187,\n\t38518: 27809,\n\t38519: 27526,\n\t38520: 22528,\n\t38521: 24140,\n\t38522: 22868,\n\t38523: 26412,\n\t38524: 32763,\n\t38525: 20961,\n\t38526: 30406,\n\t38528: 25705,\n\t38529: 30952,\n\t38530: 39764,\n\t38531: 40635,\n\t38532: 22475,\n\t38533: 22969,\n\t38534: 26151,\n\t38535: 26522,\n\t38536: 27598,\n\t38537: 21737,\n\t38538: 27097,\n\t38539: 24149,\n\t38540: 33180,\n\t38541: 26517,\n\t38542: 39850,\n\t38543: 26622,\n\t38544: 40018,\n\t38545: 26717,\n\t38546: 20134,\n\t38547: 20451,\n\t38548: 21448,\n\t38549: 25273,\n\t38550: 26411,\n\t38551: 27819,\n\t38552: 36804,\n\t38553: 20397,\n\t38554: 32365,\n\t38555: 40639,\n\t38556: 19975,\n\t38557: 24930,\n\t38558: 28288,\n\t38559: 28459,\n\t38560: 34067,\n\t38561: 21619,\n\t38562: 26410,\n\t38563: 39749,\n\t38564: 24051,\n\t38565: 31637,\n\t38566: 23724,\n\t38567: 23494,\n\t38568: 34588,\n\t38569: 28234,\n\t38570: 34001,\n\t38571: 31252,\n\t38572: 33032,\n\t38573: 22937,\n\t38574: 31885,\n\t38575: 27665,\n\t38576: 30496,\n\t38577: 21209,\n\t38578: 22818,\n\t38579: 28961,\n\t38580: 29279,\n\t38581: 30683,\n\t38582: 38695,\n\t38583: 40289,\n\t38584: 26891,\n\t38585: 23167,\n\t38586: 23064,\n\t38587: 20901,\n\t38588: 21517,\n\t38589: 21629,\n\t38590: 26126,\n\t38591: 30431,\n\t38592: 36855,\n\t38593: 37528,\n\t38594: 40180,\n\t38595: 23018,\n\t38596: 29277,\n\t38597: 28357,\n\t38598: 20813,\n\t38599: 26825,\n\t38600: 32191,\n\t38601: 32236,\n\t38602: 38754,\n\t38603: 40634,\n\t38604: 25720,\n\t38605: 27169,\n\t38606: 33538,\n\t38607: 22916,\n\t38608: 23391,\n\t38609: 27611,\n\t38610: 29467,\n\t38611: 30450,\n\t38612: 32178,\n\t38613: 32791,\n\t38614: 33945,\n\t38615: 20786,\n\t38616: 26408,\n\t38617: 40665,\n\t38618: 30446,\n\t38619: 26466,\n\t38620: 21247,\n\t38621: 39173,\n\t38622: 23588,\n\t38623: 25147,\n\t38624: 31870,\n\t38625: 36016,\n\t38626: 21839,\n\t38627: 24758,\n\t38628: 32011,\n\t38629: 38272,\n\t38630: 21249,\n\t38631: 20063,\n\t38632: 20918,\n\t38633: 22812,\n\t38634: 29242,\n\t38635: 32822,\n\t38636: 37326,\n\t38637: 24357,\n\t38638: 30690,\n\t38639: 21380,\n\t38640: 24441,\n\t38641: 32004,\n\t38642: 34220,\n\t38643: 35379,\n\t38644: 36493,\n\t38645: 38742,\n\t38646: 26611,\n\t38647: 34222,\n\t38648: 37971,\n\t38649: 24841,\n\t38650: 24840,\n\t38651: 27833,\n\t38652: 30290,\n\t38720: 35565,\n\t38721: 36664,\n\t38722: 21807,\n\t38723: 20305,\n\t38724: 20778,\n\t38725: 21191,\n\t38726: 21451,\n\t38727: 23461,\n\t38728: 24189,\n\t38729: 24736,\n\t38730: 24962,\n\t38731: 25558,\n\t38732: 26377,\n\t38733: 26586,\n\t38734: 28263,\n\t38735: 28044,\n\t38736: 29494,\n\t38737: 29495,\n\t38738: 30001,\n\t38739: 31056,\n\t38740: 35029,\n\t38741: 35480,\n\t38742: 36938,\n\t38743: 37009,\n\t38744: 37109,\n\t38745: 38596,\n\t38746: 34701,\n\t38747: 22805,\n\t38748: 20104,\n\t38749: 20313,\n\t38750: 19982,\n\t38751: 35465,\n\t38752: 36671,\n\t38753: 38928,\n\t38754: 20653,\n\t38755: 24188,\n\t38756: 22934,\n\t38757: 23481,\n\t38758: 24248,\n\t38759: 25562,\n\t38760: 25594,\n\t38761: 25793,\n\t38762: 26332,\n\t38763: 26954,\n\t38764: 27096,\n\t38765: 27915,\n\t38766: 28342,\n\t38767: 29076,\n\t38768: 29992,\n\t38769: 31407,\n\t38770: 32650,\n\t38771: 32768,\n\t38772: 33865,\n\t38773: 33993,\n\t38774: 35201,\n\t38775: 35617,\n\t38776: 36362,\n\t38777: 36965,\n\t38778: 38525,\n\t38779: 39178,\n\t38780: 24958,\n\t38781: 25233,\n\t38782: 27442,\n\t38784: 27779,\n\t38785: 28020,\n\t38786: 32716,\n\t38787: 32764,\n\t38788: 28096,\n\t38789: 32645,\n\t38790: 34746,\n\t38791: 35064,\n\t38792: 26469,\n\t38793: 33713,\n\t38794: 38972,\n\t38795: 38647,\n\t38796: 27931,\n\t38797: 32097,\n\t38798: 33853,\n\t38799: 37226,\n\t38800: 20081,\n\t38801: 21365,\n\t38802: 23888,\n\t38803: 27396,\n\t38804: 28651,\n\t38805: 34253,\n\t38806: 34349,\n\t38807: 35239,\n\t38808: 21033,\n\t38809: 21519,\n\t38810: 23653,\n\t38811: 26446,\n\t38812: 26792,\n\t38813: 29702,\n\t38814: 29827,\n\t38815: 30178,\n\t38816: 35023,\n\t38817: 35041,\n\t38818: 37324,\n\t38819: 38626,\n\t38820: 38520,\n\t38821: 24459,\n\t38822: 29575,\n\t38823: 31435,\n\t38824: 33870,\n\t38825: 25504,\n\t38826: 30053,\n\t38827: 21129,\n\t38828: 27969,\n\t38829: 28316,\n\t38830: 29705,\n\t38831: 30041,\n\t38832: 30827,\n\t38833: 31890,\n\t38834: 38534,\n\t38835: 31452,\n\t38836: 40845,\n\t38837: 20406,\n\t38838: 24942,\n\t38839: 26053,\n\t38840: 34396,\n\t38841: 20102,\n\t38842: 20142,\n\t38843: 20698,\n\t38844: 20001,\n\t38845: 20940,\n\t38846: 23534,\n\t38847: 26009,\n\t38848: 26753,\n\t38849: 28092,\n\t38850: 29471,\n\t38851: 30274,\n\t38852: 30637,\n\t38853: 31260,\n\t38854: 31975,\n\t38855: 33391,\n\t38856: 35538,\n\t38857: 36988,\n\t38858: 37327,\n\t38859: 38517,\n\t38860: 38936,\n\t38861: 21147,\n\t38862: 32209,\n\t38863: 20523,\n\t38864: 21400,\n\t38865: 26519,\n\t38866: 28107,\n\t38867: 29136,\n\t38868: 29747,\n\t38869: 33256,\n\t38870: 36650,\n\t38871: 38563,\n\t38872: 40023,\n\t38873: 40607,\n\t38874: 29792,\n\t38875: 22593,\n\t38876: 28057,\n\t38877: 32047,\n\t38878: 39006,\n\t38879: 20196,\n\t38880: 20278,\n\t38881: 20363,\n\t38882: 20919,\n\t38883: 21169,\n\t38884: 23994,\n\t38885: 24604,\n\t38886: 29618,\n\t38887: 31036,\n\t38888: 33491,\n\t38889: 37428,\n\t38890: 38583,\n\t38891: 38646,\n\t38892: 38666,\n\t38893: 40599,\n\t38894: 40802,\n\t38895: 26278,\n\t38896: 27508,\n\t38897: 21015,\n\t38898: 21155,\n\t38899: 28872,\n\t38900: 35010,\n\t38901: 24265,\n\t38902: 24651,\n\t38903: 24976,\n\t38904: 28451,\n\t38905: 29001,\n\t38906: 31806,\n\t38907: 32244,\n\t38908: 32879,\n\t38976: 34030,\n\t38977: 36899,\n\t38978: 37676,\n\t38979: 21570,\n\t38980: 39791,\n\t38981: 27347,\n\t38982: 28809,\n\t38983: 36034,\n\t38984: 36335,\n\t38985: 38706,\n\t38986: 21172,\n\t38987: 23105,\n\t38988: 24266,\n\t38989: 24324,\n\t38990: 26391,\n\t38991: 27004,\n\t38992: 27028,\n\t38993: 28010,\n\t38994: 28431,\n\t38995: 29282,\n\t38996: 29436,\n\t38997: 31725,\n\t38998: 32769,\n\t38999: 32894,\n\t39000: 34635,\n\t39001: 37070,\n\t39002: 20845,\n\t39003: 40595,\n\t39004: 31108,\n\t39005: 32907,\n\t39006: 37682,\n\t39007: 35542,\n\t39008: 20525,\n\t39009: 21644,\n\t39010: 35441,\n\t39011: 27498,\n\t39012: 36036,\n\t39013: 33031,\n\t39014: 24785,\n\t39015: 26528,\n\t39016: 40434,\n\t39017: 20121,\n\t39018: 20120,\n\t39019: 39952,\n\t39020: 35435,\n\t39021: 34241,\n\t39022: 34152,\n\t39023: 26880,\n\t39024: 28286,\n\t39025: 30871,\n\t39026: 33109,\n\t39071: 24332,\n\t39072: 19984,\n\t39073: 19989,\n\t39074: 20010,\n\t39075: 20017,\n\t39076: 20022,\n\t39077: 20028,\n\t39078: 20031,\n\t39079: 20034,\n\t39080: 20054,\n\t39081: 20056,\n\t39082: 20098,\n\t39083: 20101,\n\t39084: 35947,\n\t39085: 20106,\n\t39086: 33298,\n\t39087: 24333,\n\t39088: 20110,\n\t39089: 20126,\n\t39090: 20127,\n\t39091: 20128,\n\t39092: 20130,\n\t39093: 20144,\n\t39094: 20147,\n\t39095: 20150,\n\t39096: 20174,\n\t39097: 20173,\n\t39098: 20164,\n\t39099: 20166,\n\t39100: 20162,\n\t39101: 20183,\n\t39102: 20190,\n\t39103: 20205,\n\t39104: 20191,\n\t39105: 20215,\n\t39106: 20233,\n\t39107: 20314,\n\t39108: 20272,\n\t39109: 20315,\n\t39110: 20317,\n\t39111: 20311,\n\t39112: 20295,\n\t39113: 20342,\n\t39114: 20360,\n\t39115: 20367,\n\t39116: 20376,\n\t39117: 20347,\n\t39118: 20329,\n\t39119: 20336,\n\t39120: 20369,\n\t39121: 20335,\n\t39122: 20358,\n\t39123: 20374,\n\t39124: 20760,\n\t39125: 20436,\n\t39126: 20447,\n\t39127: 20430,\n\t39128: 20440,\n\t39129: 20443,\n\t39130: 20433,\n\t39131: 20442,\n\t39132: 20432,\n\t39133: 20452,\n\t39134: 20453,\n\t39135: 20506,\n\t39136: 20520,\n\t39137: 20500,\n\t39138: 20522,\n\t39139: 20517,\n\t39140: 20485,\n\t39141: 20252,\n\t39142: 20470,\n\t39143: 20513,\n\t39144: 20521,\n\t39145: 20524,\n\t39146: 20478,\n\t39147: 20463,\n\t39148: 20497,\n\t39149: 20486,\n\t39150: 20547,\n\t39151: 20551,\n\t39152: 26371,\n\t39153: 20565,\n\t39154: 20560,\n\t39155: 20552,\n\t39156: 20570,\n\t39157: 20566,\n\t39158: 20588,\n\t39159: 20600,\n\t39160: 20608,\n\t39161: 20634,\n\t39162: 20613,\n\t39163: 20660,\n\t39164: 20658,\n\t39232: 20681,\n\t39233: 20682,\n\t39234: 20659,\n\t39235: 20674,\n\t39236: 20694,\n\t39237: 20702,\n\t39238: 20709,\n\t39239: 20717,\n\t39240: 20707,\n\t39241: 20718,\n\t39242: 20729,\n\t39243: 20725,\n\t39244: 20745,\n\t39245: 20737,\n\t39246: 20738,\n\t39247: 20758,\n\t39248: 20757,\n\t39249: 20756,\n\t39250: 20762,\n\t39251: 20769,\n\t39252: 20794,\n\t39253: 20791,\n\t39254: 20796,\n\t39255: 20795,\n\t39256: 20799,\n\t39257: 20800,\n\t39258: 20818,\n\t39259: 20812,\n\t39260: 20820,\n\t39261: 20834,\n\t39262: 31480,\n\t39263: 20841,\n\t39264: 20842,\n\t39265: 20846,\n\t39266: 20864,\n\t39267: 20866,\n\t39268: 22232,\n\t39269: 20876,\n\t39270: 20873,\n\t39271: 20879,\n\t39272: 20881,\n\t39273: 20883,\n\t39274: 20885,\n\t39275: 20886,\n\t39276: 20900,\n\t39277: 20902,\n\t39278: 20898,\n\t39279: 20905,\n\t39280: 20906,\n\t39281: 20907,\n\t39282: 20915,\n\t39283: 20913,\n\t39284: 20914,\n\t39285: 20912,\n\t39286: 20917,\n\t39287: 20925,\n\t39288: 20933,\n\t39289: 20937,\n\t39290: 20955,\n\t39291: 20960,\n\t39292: 34389,\n\t39293: 20969,\n\t39294: 20973,\n\t39296: 20976,\n\t39297: 20981,\n\t39298: 20990,\n\t39299: 20996,\n\t39300: 21003,\n\t39301: 21012,\n\t39302: 21006,\n\t39303: 21031,\n\t39304: 21034,\n\t39305: 21038,\n\t39306: 21043,\n\t39307: 21049,\n\t39308: 21071,\n\t39309: 21060,\n\t39310: 21067,\n\t39311: 21068,\n\t39312: 21086,\n\t39313: 21076,\n\t39314: 21098,\n\t39315: 21108,\n\t39316: 21097,\n\t39317: 21107,\n\t39318: 21119,\n\t39319: 21117,\n\t39320: 21133,\n\t39321: 21140,\n\t39322: 21138,\n\t39323: 21105,\n\t39324: 21128,\n\t39325: 21137,\n\t39326: 36776,\n\t39327: 36775,\n\t39328: 21164,\n\t39329: 21165,\n\t39330: 21180,\n\t39331: 21173,\n\t39332: 21185,\n\t39333: 21197,\n\t39334: 21207,\n\t39335: 21214,\n\t39336: 21219,\n\t39337: 21222,\n\t39338: 39149,\n\t39339: 21216,\n\t39340: 21235,\n\t39341: 21237,\n\t39342: 21240,\n\t39343: 21241,\n\t39344: 21254,\n\t39345: 21256,\n\t39346: 30008,\n\t39347: 21261,\n\t39348: 21264,\n\t39349: 21263,\n\t39350: 21269,\n\t39351: 21274,\n\t39352: 21283,\n\t39353: 21295,\n\t39354: 21297,\n\t39355: 21299,\n\t39356: 21304,\n\t39357: 21312,\n\t39358: 21318,\n\t39359: 21317,\n\t39360: 19991,\n\t39361: 21321,\n\t39362: 21325,\n\t39363: 20950,\n\t39364: 21342,\n\t39365: 21353,\n\t39366: 21358,\n\t39367: 22808,\n\t39368: 21371,\n\t39369: 21367,\n\t39370: 21378,\n\t39371: 21398,\n\t39372: 21408,\n\t39373: 21414,\n\t39374: 21413,\n\t39375: 21422,\n\t39376: 21424,\n\t39377: 21430,\n\t39378: 21443,\n\t39379: 31762,\n\t39380: 38617,\n\t39381: 21471,\n\t39382: 26364,\n\t39383: 29166,\n\t39384: 21486,\n\t39385: 21480,\n\t39386: 21485,\n\t39387: 21498,\n\t39388: 21505,\n\t39389: 21565,\n\t39390: 21568,\n\t39391: 21548,\n\t39392: 21549,\n\t39393: 21564,\n\t39394: 21550,\n\t39395: 21558,\n\t39396: 21545,\n\t39397: 21533,\n\t39398: 21582,\n\t39399: 21647,\n\t39400: 21621,\n\t39401: 21646,\n\t39402: 21599,\n\t39403: 21617,\n\t39404: 21623,\n\t39405: 21616,\n\t39406: 21650,\n\t39407: 21627,\n\t39408: 21632,\n\t39409: 21622,\n\t39410: 21636,\n\t39411: 21648,\n\t39412: 21638,\n\t39413: 21703,\n\t39414: 21666,\n\t39415: 21688,\n\t39416: 21669,\n\t39417: 21676,\n\t39418: 21700,\n\t39419: 21704,\n\t39420: 21672,\n\t39488: 21675,\n\t39489: 21698,\n\t39490: 21668,\n\t39491: 21694,\n\t39492: 21692,\n\t39493: 21720,\n\t39494: 21733,\n\t39495: 21734,\n\t39496: 21775,\n\t39497: 21780,\n\t39498: 21757,\n\t39499: 21742,\n\t39500: 21741,\n\t39501: 21754,\n\t39502: 21730,\n\t39503: 21817,\n\t39504: 21824,\n\t39505: 21859,\n\t39506: 21836,\n\t39507: 21806,\n\t39508: 21852,\n\t39509: 21829,\n\t39510: 21846,\n\t39511: 21847,\n\t39512: 21816,\n\t39513: 21811,\n\t39514: 21853,\n\t39515: 21913,\n\t39516: 21888,\n\t39517: 21679,\n\t39518: 21898,\n\t39519: 21919,\n\t39520: 21883,\n\t39521: 21886,\n\t39522: 21912,\n\t39523: 21918,\n\t39524: 21934,\n\t39525: 21884,\n\t39526: 21891,\n\t39527: 21929,\n\t39528: 21895,\n\t39529: 21928,\n\t39530: 21978,\n\t39531: 21957,\n\t39532: 21983,\n\t39533: 21956,\n\t39534: 21980,\n\t39535: 21988,\n\t39536: 21972,\n\t39537: 22036,\n\t39538: 22007,\n\t39539: 22038,\n\t39540: 22014,\n\t39541: 22013,\n\t39542: 22043,\n\t39543: 22009,\n\t39544: 22094,\n\t39545: 22096,\n\t39546: 29151,\n\t39547: 22068,\n\t39548: 22070,\n\t39549: 22066,\n\t39550: 22072,\n\t39552: 22123,\n\t39553: 22116,\n\t39554: 22063,\n\t39555: 22124,\n\t39556: 22122,\n\t39557: 22150,\n\t39558: 22144,\n\t39559: 22154,\n\t39560: 22176,\n\t39561: 22164,\n\t39562: 22159,\n\t39563: 22181,\n\t39564: 22190,\n\t39565: 22198,\n\t39566: 22196,\n\t39567: 22210,\n\t39568: 22204,\n\t39569: 22209,\n\t39570: 22211,\n\t39571: 22208,\n\t39572: 22216,\n\t39573: 22222,\n\t39574: 22225,\n\t39575: 22227,\n\t39576: 22231,\n\t39577: 22254,\n\t39578: 22265,\n\t39579: 22272,\n\t39580: 22271,\n\t39581: 22276,\n\t39582: 22281,\n\t39583: 22280,\n\t39584: 22283,\n\t39585: 22285,\n\t39586: 22291,\n\t39587: 22296,\n\t39588: 22294,\n\t39589: 21959,\n\t39590: 22300,\n\t39591: 22310,\n\t39592: 22327,\n\t39593: 22328,\n\t39594: 22350,\n\t39595: 22331,\n\t39596: 22336,\n\t39597: 22351,\n\t39598: 22377,\n\t39599: 22464,\n\t39600: 22408,\n\t39601: 22369,\n\t39602: 22399,\n\t39603: 22409,\n\t39604: 22419,\n\t39605: 22432,\n\t39606: 22451,\n\t39607: 22436,\n\t39608: 22442,\n\t39609: 22448,\n\t39610: 22467,\n\t39611: 22470,\n\t39612: 22484,\n\t39613: 22482,\n\t39614: 22483,\n\t39615: 22538,\n\t39616: 22486,\n\t39617: 22499,\n\t39618: 22539,\n\t39619: 22553,\n\t39620: 22557,\n\t39621: 22642,\n\t39622: 22561,\n\t39623: 22626,\n\t39624: 22603,\n\t39625: 22640,\n\t39626: 27584,\n\t39627: 22610,\n\t39628: 22589,\n\t39629: 22649,\n\t39630: 22661,\n\t39631: 22713,\n\t39632: 22687,\n\t39633: 22699,\n\t39634: 22714,\n\t39635: 22750,\n\t39636: 22715,\n\t39637: 22712,\n\t39638: 22702,\n\t39639: 22725,\n\t39640: 22739,\n\t39641: 22737,\n\t39642: 22743,\n\t39643: 22745,\n\t39644: 22744,\n\t39645: 22757,\n\t39646: 22748,\n\t39647: 22756,\n\t39648: 22751,\n\t39649: 22767,\n\t39650: 22778,\n\t39651: 22777,\n\t39652: 22779,\n\t39653: 22780,\n\t39654: 22781,\n\t39655: 22786,\n\t39656: 22794,\n\t39657: 22800,\n\t39658: 22811,\n\t39659: 26790,\n\t39660: 22821,\n\t39661: 22828,\n\t39662: 22829,\n\t39663: 22834,\n\t39664: 22840,\n\t39665: 22846,\n\t39666: 31442,\n\t39667: 22869,\n\t39668: 22864,\n\t39669: 22862,\n\t39670: 22874,\n\t39671: 22872,\n\t39672: 22882,\n\t39673: 22880,\n\t39674: 22887,\n\t39675: 22892,\n\t39676: 22889,\n\t39744: 22904,\n\t39745: 22913,\n\t39746: 22941,\n\t39747: 20318,\n\t39748: 20395,\n\t39749: 22947,\n\t39750: 22962,\n\t39751: 22982,\n\t39752: 23016,\n\t39753: 23004,\n\t39754: 22925,\n\t39755: 23001,\n\t39756: 23002,\n\t39757: 23077,\n\t39758: 23071,\n\t39759: 23057,\n\t39760: 23068,\n\t39761: 23049,\n\t39762: 23066,\n\t39763: 23104,\n\t39764: 23148,\n\t39765: 23113,\n\t39766: 23093,\n\t39767: 23094,\n\t39768: 23138,\n\t39769: 23146,\n\t39770: 23194,\n\t39771: 23228,\n\t39772: 23230,\n\t39773: 23243,\n\t39774: 23234,\n\t39775: 23229,\n\t39776: 23267,\n\t39777: 23255,\n\t39778: 23270,\n\t39779: 23273,\n\t39780: 23254,\n\t39781: 23290,\n\t39782: 23291,\n\t39783: 23308,\n\t39784: 23307,\n\t39785: 23318,\n\t39786: 23346,\n\t39787: 23248,\n\t39788: 23338,\n\t39789: 23350,\n\t39790: 23358,\n\t39791: 23363,\n\t39792: 23365,\n\t39793: 23360,\n\t39794: 23377,\n\t39795: 23381,\n\t39796: 23386,\n\t39797: 23387,\n\t39798: 23397,\n\t39799: 23401,\n\t39800: 23408,\n\t39801: 23411,\n\t39802: 23413,\n\t39803: 23416,\n\t39804: 25992,\n\t39805: 23418,\n\t39806: 23424,\n\t39808: 23427,\n\t39809: 23462,\n\t39810: 23480,\n\t39811: 23491,\n\t39812: 23495,\n\t39813: 23497,\n\t39814: 23508,\n\t39815: 23504,\n\t39816: 23524,\n\t39817: 23526,\n\t39818: 23522,\n\t39819: 23518,\n\t39820: 23525,\n\t39821: 23531,\n\t39822: 23536,\n\t39823: 23542,\n\t39824: 23539,\n\t39825: 23557,\n\t39826: 23559,\n\t39827: 23560,\n\t39828: 23565,\n\t39829: 23571,\n\t39830: 23584,\n\t39831: 23586,\n\t39832: 23592,\n\t39833: 23608,\n\t39834: 23609,\n\t39835: 23617,\n\t39836: 23622,\n\t39837: 23630,\n\t39838: 23635,\n\t39839: 23632,\n\t39840: 23631,\n\t39841: 23409,\n\t39842: 23660,\n\t39843: 23662,\n\t39844: 20066,\n\t39845: 23670,\n\t39846: 23673,\n\t39847: 23692,\n\t39848: 23697,\n\t39849: 23700,\n\t39850: 22939,\n\t39851: 23723,\n\t39852: 23739,\n\t39853: 23734,\n\t39854: 23740,\n\t39855: 23735,\n\t39856: 23749,\n\t39857: 23742,\n\t39858: 23751,\n\t39859: 23769,\n\t39860: 23785,\n\t39861: 23805,\n\t39862: 23802,\n\t39863: 23789,\n\t39864: 23948,\n\t39865: 23786,\n\t39866: 23819,\n\t39867: 23829,\n\t39868: 23831,\n\t39869: 23900,\n\t39870: 23839,\n\t39871: 23835,\n\t39872: 23825,\n\t39873: 23828,\n\t39874: 23842,\n\t39875: 23834,\n\t39876: 23833,\n\t39877: 23832,\n\t39878: 23884,\n\t39879: 23890,\n\t39880: 23886,\n\t39881: 23883,\n\t39882: 23916,\n\t39883: 23923,\n\t39884: 23926,\n\t39885: 23943,\n\t39886: 23940,\n\t39887: 23938,\n\t39888: 23970,\n\t39889: 23965,\n\t39890: 23980,\n\t39891: 23982,\n\t39892: 23997,\n\t39893: 23952,\n\t39894: 23991,\n\t39895: 23996,\n\t39896: 24009,\n\t39897: 24013,\n\t39898: 24019,\n\t39899: 24018,\n\t39900: 24022,\n\t39901: 24027,\n\t39902: 24043,\n\t39903: 24050,\n\t39904: 24053,\n\t39905: 24075,\n\t39906: 24090,\n\t39907: 24089,\n\t39908: 24081,\n\t39909: 24091,\n\t39910: 24118,\n\t39911: 24119,\n\t39912: 24132,\n\t39913: 24131,\n\t39914: 24128,\n\t39915: 24142,\n\t39916: 24151,\n\t39917: 24148,\n\t39918: 24159,\n\t39919: 24162,\n\t39920: 24164,\n\t39921: 24135,\n\t39922: 24181,\n\t39923: 24182,\n\t39924: 24186,\n\t39925: 40636,\n\t39926: 24191,\n\t39927: 24224,\n\t39928: 24257,\n\t39929: 24258,\n\t39930: 24264,\n\t39931: 24272,\n\t39932: 24271,\n\t40000: 24278,\n\t40001: 24291,\n\t40002: 24285,\n\t40003: 24282,\n\t40004: 24283,\n\t40005: 24290,\n\t40006: 24289,\n\t40007: 24296,\n\t40008: 24297,\n\t40009: 24300,\n\t40010: 24305,\n\t40011: 24307,\n\t40012: 24304,\n\t40013: 24308,\n\t40014: 24312,\n\t40015: 24318,\n\t40016: 24323,\n\t40017: 24329,\n\t40018: 24413,\n\t40019: 24412,\n\t40020: 24331,\n\t40021: 24337,\n\t40022: 24342,\n\t40023: 24361,\n\t40024: 24365,\n\t40025: 24376,\n\t40026: 24385,\n\t40027: 24392,\n\t40028: 24396,\n\t40029: 24398,\n\t40030: 24367,\n\t40031: 24401,\n\t40032: 24406,\n\t40033: 24407,\n\t40034: 24409,\n\t40035: 24417,\n\t40036: 24429,\n\t40037: 24435,\n\t40038: 24439,\n\t40039: 24451,\n\t40040: 24450,\n\t40041: 24447,\n\t40042: 24458,\n\t40043: 24456,\n\t40044: 24465,\n\t40045: 24455,\n\t40046: 24478,\n\t40047: 24473,\n\t40048: 24472,\n\t40049: 24480,\n\t40050: 24488,\n\t40051: 24493,\n\t40052: 24508,\n\t40053: 24534,\n\t40054: 24571,\n\t40055: 24548,\n\t40056: 24568,\n\t40057: 24561,\n\t40058: 24541,\n\t40059: 24755,\n\t40060: 24575,\n\t40061: 24609,\n\t40062: 24672,\n\t40064: 24601,\n\t40065: 24592,\n\t40066: 24617,\n\t40067: 24590,\n\t40068: 24625,\n\t40069: 24603,\n\t40070: 24597,\n\t40071: 24619,\n\t40072: 24614,\n\t40073: 24591,\n\t40074: 24634,\n\t40075: 24666,\n\t40076: 24641,\n\t40077: 24682,\n\t40078: 24695,\n\t40079: 24671,\n\t40080: 24650,\n\t40081: 24646,\n\t40082: 24653,\n\t40083: 24675,\n\t40084: 24643,\n\t40085: 24676,\n\t40086: 24642,\n\t40087: 24684,\n\t40088: 24683,\n\t40089: 24665,\n\t40090: 24705,\n\t40091: 24717,\n\t40092: 24807,\n\t40093: 24707,\n\t40094: 24730,\n\t40095: 24708,\n\t40096: 24731,\n\t40097: 24726,\n\t40098: 24727,\n\t40099: 24722,\n\t40100: 24743,\n\t40101: 24715,\n\t40102: 24801,\n\t40103: 24760,\n\t40104: 24800,\n\t40105: 24787,\n\t40106: 24756,\n\t40107: 24560,\n\t40108: 24765,\n\t40109: 24774,\n\t40110: 24757,\n\t40111: 24792,\n\t40112: 24909,\n\t40113: 24853,\n\t40114: 24838,\n\t40115: 24822,\n\t40116: 24823,\n\t40117: 24832,\n\t40118: 24820,\n\t40119: 24826,\n\t40120: 24835,\n\t40121: 24865,\n\t40122: 24827,\n\t40123: 24817,\n\t40124: 24845,\n\t40125: 24846,\n\t40126: 24903,\n\t40127: 24894,\n\t40128: 24872,\n\t40129: 24871,\n\t40130: 24906,\n\t40131: 24895,\n\t40132: 24892,\n\t40133: 24876,\n\t40134: 24884,\n\t40135: 24893,\n\t40136: 24898,\n\t40137: 24900,\n\t40138: 24947,\n\t40139: 24951,\n\t40140: 24920,\n\t40141: 24921,\n\t40142: 24922,\n\t40143: 24939,\n\t40144: 24948,\n\t40145: 24943,\n\t40146: 24933,\n\t40147: 24945,\n\t40148: 24927,\n\t40149: 24925,\n\t40150: 24915,\n\t40151: 24949,\n\t40152: 24985,\n\t40153: 24982,\n\t40154: 24967,\n\t40155: 25004,\n\t40156: 24980,\n\t40157: 24986,\n\t40158: 24970,\n\t40159: 24977,\n\t40160: 25003,\n\t40161: 25006,\n\t40162: 25036,\n\t40163: 25034,\n\t40164: 25033,\n\t40165: 25079,\n\t40166: 25032,\n\t40167: 25027,\n\t40168: 25030,\n\t40169: 25018,\n\t40170: 25035,\n\t40171: 32633,\n\t40172: 25037,\n\t40173: 25062,\n\t40174: 25059,\n\t40175: 25078,\n\t40176: 25082,\n\t40177: 25076,\n\t40178: 25087,\n\t40179: 25085,\n\t40180: 25084,\n\t40181: 25086,\n\t40182: 25088,\n\t40183: 25096,\n\t40184: 25097,\n\t40185: 25101,\n\t40186: 25100,\n\t40187: 25108,\n\t40188: 25115,\n\t40256: 25118,\n\t40257: 25121,\n\t40258: 25130,\n\t40259: 25134,\n\t40260: 25136,\n\t40261: 25138,\n\t40262: 25139,\n\t40263: 25153,\n\t40264: 25166,\n\t40265: 25182,\n\t40266: 25187,\n\t40267: 25179,\n\t40268: 25184,\n\t40269: 25192,\n\t40270: 25212,\n\t40271: 25218,\n\t40272: 25225,\n\t40273: 25214,\n\t40274: 25234,\n\t40275: 25235,\n\t40276: 25238,\n\t40277: 25300,\n\t40278: 25219,\n\t40279: 25236,\n\t40280: 25303,\n\t40281: 25297,\n\t40282: 25275,\n\t40283: 25295,\n\t40284: 25343,\n\t40285: 25286,\n\t40286: 25812,\n\t40287: 25288,\n\t40288: 25308,\n\t40289: 25292,\n\t40290: 25290,\n\t40291: 25282,\n\t40292: 25287,\n\t40293: 25243,\n\t40294: 25289,\n\t40295: 25356,\n\t40296: 25326,\n\t40297: 25329,\n\t40298: 25383,\n\t40299: 25346,\n\t40300: 25352,\n\t40301: 25327,\n\t40302: 25333,\n\t40303: 25424,\n\t40304: 25406,\n\t40305: 25421,\n\t40306: 25628,\n\t40307: 25423,\n\t40308: 25494,\n\t40309: 25486,\n\t40310: 25472,\n\t40311: 25515,\n\t40312: 25462,\n\t40313: 25507,\n\t40314: 25487,\n\t40315: 25481,\n\t40316: 25503,\n\t40317: 25525,\n\t40318: 25451,\n\t40320: 25449,\n\t40321: 25534,\n\t40322: 25577,\n\t40323: 25536,\n\t40324: 25542,\n\t40325: 25571,\n\t40326: 25545,\n\t40327: 25554,\n\t40328: 25590,\n\t40329: 25540,\n\t40330: 25622,\n\t40331: 25652,\n\t40332: 25606,\n\t40333: 25619,\n\t40334: 25638,\n\t40335: 25654,\n\t40336: 25885,\n\t40337: 25623,\n\t40338: 25640,\n\t40339: 25615,\n\t40340: 25703,\n\t40341: 25711,\n\t40342: 25718,\n\t40343: 25678,\n\t40344: 25898,\n\t40345: 25749,\n\t40346: 25747,\n\t40347: 25765,\n\t40348: 25769,\n\t40349: 25736,\n\t40350: 25788,\n\t40351: 25818,\n\t40352: 25810,\n\t40353: 25797,\n\t40354: 25799,\n\t40355: 25787,\n\t40356: 25816,\n\t40357: 25794,\n\t40358: 25841,\n\t40359: 25831,\n\t40360: 33289,\n\t40361: 25824,\n\t40362: 25825,\n\t40363: 25260,\n\t40364: 25827,\n\t40365: 25839,\n\t40366: 25900,\n\t40367: 25846,\n\t40368: 25844,\n\t40369: 25842,\n\t40370: 25850,\n\t40371: 25856,\n\t40372: 25853,\n\t40373: 25880,\n\t40374: 25884,\n\t40375: 25861,\n\t40376: 25892,\n\t40377: 25891,\n\t40378: 25899,\n\t40379: 25908,\n\t40380: 25909,\n\t40381: 25911,\n\t40382: 25910,\n\t40383: 25912,\n\t40384: 30027,\n\t40385: 25928,\n\t40386: 25942,\n\t40387: 25941,\n\t40388: 25933,\n\t40389: 25944,\n\t40390: 25950,\n\t40391: 25949,\n\t40392: 25970,\n\t40393: 25976,\n\t40394: 25986,\n\t40395: 25987,\n\t40396: 35722,\n\t40397: 26011,\n\t40398: 26015,\n\t40399: 26027,\n\t40400: 26039,\n\t40401: 26051,\n\t40402: 26054,\n\t40403: 26049,\n\t40404: 26052,\n\t40405: 26060,\n\t40406: 26066,\n\t40407: 26075,\n\t40408: 26073,\n\t40409: 26080,\n\t40410: 26081,\n\t40411: 26097,\n\t40412: 26482,\n\t40413: 26122,\n\t40414: 26115,\n\t40415: 26107,\n\t40416: 26483,\n\t40417: 26165,\n\t40418: 26166,\n\t40419: 26164,\n\t40420: 26140,\n\t40421: 26191,\n\t40422: 26180,\n\t40423: 26185,\n\t40424: 26177,\n\t40425: 26206,\n\t40426: 26205,\n\t40427: 26212,\n\t40428: 26215,\n\t40429: 26216,\n\t40430: 26207,\n\t40431: 26210,\n\t40432: 26224,\n\t40433: 26243,\n\t40434: 26248,\n\t40435: 26254,\n\t40436: 26249,\n\t40437: 26244,\n\t40438: 26264,\n\t40439: 26269,\n\t40440: 26305,\n\t40441: 26297,\n\t40442: 26313,\n\t40443: 26302,\n\t40444: 26300,\n\t40512: 26308,\n\t40513: 26296,\n\t40514: 26326,\n\t40515: 26330,\n\t40516: 26336,\n\t40517: 26175,\n\t40518: 26342,\n\t40519: 26345,\n\t40520: 26352,\n\t40521: 26357,\n\t40522: 26359,\n\t40523: 26383,\n\t40524: 26390,\n\t40525: 26398,\n\t40526: 26406,\n\t40527: 26407,\n\t40528: 38712,\n\t40529: 26414,\n\t40530: 26431,\n\t40531: 26422,\n\t40532: 26433,\n\t40533: 26424,\n\t40534: 26423,\n\t40535: 26438,\n\t40536: 26462,\n\t40537: 26464,\n\t40538: 26457,\n\t40539: 26467,\n\t40540: 26468,\n\t40541: 26505,\n\t40542: 26480,\n\t40543: 26537,\n\t40544: 26492,\n\t40545: 26474,\n\t40546: 26508,\n\t40547: 26507,\n\t40548: 26534,\n\t40549: 26529,\n\t40550: 26501,\n\t40551: 26551,\n\t40552: 26607,\n\t40553: 26548,\n\t40554: 26604,\n\t40555: 26547,\n\t40556: 26601,\n\t40557: 26552,\n\t40558: 26596,\n\t40559: 26590,\n\t40560: 26589,\n\t40561: 26594,\n\t40562: 26606,\n\t40563: 26553,\n\t40564: 26574,\n\t40565: 26566,\n\t40566: 26599,\n\t40567: 27292,\n\t40568: 26654,\n\t40569: 26694,\n\t40570: 26665,\n\t40571: 26688,\n\t40572: 26701,\n\t40573: 26674,\n\t40574: 26702,\n\t40576: 26803,\n\t40577: 26667,\n\t40578: 26713,\n\t40579: 26723,\n\t40580: 26743,\n\t40581: 26751,\n\t40582: 26783,\n\t40583: 26767,\n\t40584: 26797,\n\t40585: 26772,\n\t40586: 26781,\n\t40587: 26779,\n\t40588: 26755,\n\t40589: 27310,\n\t40590: 26809,\n\t40591: 26740,\n\t40592: 26805,\n\t40593: 26784,\n\t40594: 26810,\n\t40595: 26895,\n\t40596: 26765,\n\t40597: 26750,\n\t40598: 26881,\n\t40599: 26826,\n\t40600: 26888,\n\t40601: 26840,\n\t40602: 26914,\n\t40603: 26918,\n\t40604: 26849,\n\t40605: 26892,\n\t40606: 26829,\n\t40607: 26836,\n\t40608: 26855,\n\t40609: 26837,\n\t40610: 26934,\n\t40611: 26898,\n\t40612: 26884,\n\t40613: 26839,\n\t40614: 26851,\n\t40615: 26917,\n\t40616: 26873,\n\t40617: 26848,\n\t40618: 26863,\n\t40619: 26920,\n\t40620: 26922,\n\t40621: 26906,\n\t40622: 26915,\n\t40623: 26913,\n\t40624: 26822,\n\t40625: 27001,\n\t40626: 26999,\n\t40627: 26972,\n\t40628: 27000,\n\t40629: 26987,\n\t40630: 26964,\n\t40631: 27006,\n\t40632: 26990,\n\t40633: 26937,\n\t40634: 26996,\n\t40635: 26941,\n\t40636: 26969,\n\t40637: 26928,\n\t40638: 26977,\n\t40639: 26974,\n\t40640: 26973,\n\t40641: 27009,\n\t40642: 26986,\n\t40643: 27058,\n\t40644: 27054,\n\t40645: 27088,\n\t40646: 27071,\n\t40647: 27073,\n\t40648: 27091,\n\t40649: 27070,\n\t40650: 27086,\n\t40651: 23528,\n\t40652: 27082,\n\t40653: 27101,\n\t40654: 27067,\n\t40655: 27075,\n\t40656: 27047,\n\t40657: 27182,\n\t40658: 27025,\n\t40659: 27040,\n\t40660: 27036,\n\t40661: 27029,\n\t40662: 27060,\n\t40663: 27102,\n\t40664: 27112,\n\t40665: 27138,\n\t40666: 27163,\n\t40667: 27135,\n\t40668: 27402,\n\t40669: 27129,\n\t40670: 27122,\n\t40671: 27111,\n\t40672: 27141,\n\t40673: 27057,\n\t40674: 27166,\n\t40675: 27117,\n\t40676: 27156,\n\t40677: 27115,\n\t40678: 27146,\n\t40679: 27154,\n\t40680: 27329,\n\t40681: 27171,\n\t40682: 27155,\n\t40683: 27204,\n\t40684: 27148,\n\t40685: 27250,\n\t40686: 27190,\n\t40687: 27256,\n\t40688: 27207,\n\t40689: 27234,\n\t40690: 27225,\n\t40691: 27238,\n\t40692: 27208,\n\t40693: 27192,\n\t40694: 27170,\n\t40695: 27280,\n\t40696: 27277,\n\t40697: 27296,\n\t40698: 27268,\n\t40699: 27298,\n\t40700: 27299,\n\t40768: 27287,\n\t40769: 34327,\n\t40770: 27323,\n\t40771: 27331,\n\t40772: 27330,\n\t40773: 27320,\n\t40774: 27315,\n\t40775: 27308,\n\t40776: 27358,\n\t40777: 27345,\n\t40778: 27359,\n\t40779: 27306,\n\t40780: 27354,\n\t40781: 27370,\n\t40782: 27387,\n\t40783: 27397,\n\t40784: 34326,\n\t40785: 27386,\n\t40786: 27410,\n\t40787: 27414,\n\t40788: 39729,\n\t40789: 27423,\n\t40790: 27448,\n\t40791: 27447,\n\t40792: 30428,\n\t40793: 27449,\n\t40794: 39150,\n\t40795: 27463,\n\t40796: 27459,\n\t40797: 27465,\n\t40798: 27472,\n\t40799: 27481,\n\t40800: 27476,\n\t40801: 27483,\n\t40802: 27487,\n\t40803: 27489,\n\t40804: 27512,\n\t40805: 27513,\n\t40806: 27519,\n\t40807: 27520,\n\t40808: 27524,\n\t40809: 27523,\n\t40810: 27533,\n\t40811: 27544,\n\t40812: 27541,\n\t40813: 27550,\n\t40814: 27556,\n\t40815: 27562,\n\t40816: 27563,\n\t40817: 27567,\n\t40818: 27570,\n\t40819: 27569,\n\t40820: 27571,\n\t40821: 27575,\n\t40822: 27580,\n\t40823: 27590,\n\t40824: 27595,\n\t40825: 27603,\n\t40826: 27615,\n\t40827: 27628,\n\t40828: 27627,\n\t40829: 27635,\n\t40830: 27631,\n\t40832: 40638,\n\t40833: 27656,\n\t40834: 27667,\n\t40835: 27668,\n\t40836: 27675,\n\t40837: 27684,\n\t40838: 27683,\n\t40839: 27742,\n\t40840: 27733,\n\t40841: 27746,\n\t40842: 27754,\n\t40843: 27778,\n\t40844: 27789,\n\t40845: 27802,\n\t40846: 27777,\n\t40847: 27803,\n\t40848: 27774,\n\t40849: 27752,\n\t40850: 27763,\n\t40851: 27794,\n\t40852: 27792,\n\t40853: 27844,\n\t40854: 27889,\n\t40855: 27859,\n\t40856: 27837,\n\t40857: 27863,\n\t40858: 27845,\n\t40859: 27869,\n\t40860: 27822,\n\t40861: 27825,\n\t40862: 27838,\n\t40863: 27834,\n\t40864: 27867,\n\t40865: 27887,\n\t40866: 27865,\n\t40867: 27882,\n\t40868: 27935,\n\t40869: 34893,\n\t40870: 27958,\n\t40871: 27947,\n\t40872: 27965,\n\t40873: 27960,\n\t40874: 27929,\n\t40875: 27957,\n\t40876: 27955,\n\t40877: 27922,\n\t40878: 27916,\n\t40879: 28003,\n\t40880: 28051,\n\t40881: 28004,\n\t40882: 27994,\n\t40883: 28025,\n\t40884: 27993,\n\t40885: 28046,\n\t40886: 28053,\n\t40887: 28644,\n\t40888: 28037,\n\t40889: 28153,\n\t40890: 28181,\n\t40891: 28170,\n\t40892: 28085,\n\t40893: 28103,\n\t40894: 28134,\n\t40895: 28088,\n\t40896: 28102,\n\t40897: 28140,\n\t40898: 28126,\n\t40899: 28108,\n\t40900: 28136,\n\t40901: 28114,\n\t40902: 28101,\n\t40903: 28154,\n\t40904: 28121,\n\t40905: 28132,\n\t40906: 28117,\n\t40907: 28138,\n\t40908: 28142,\n\t40909: 28205,\n\t40910: 28270,\n\t40911: 28206,\n\t40912: 28185,\n\t40913: 28274,\n\t40914: 28255,\n\t40915: 28222,\n\t40916: 28195,\n\t40917: 28267,\n\t40918: 28203,\n\t40919: 28278,\n\t40920: 28237,\n\t40921: 28191,\n\t40922: 28227,\n\t40923: 28218,\n\t40924: 28238,\n\t40925: 28196,\n\t40926: 28415,\n\t40927: 28189,\n\t40928: 28216,\n\t40929: 28290,\n\t40930: 28330,\n\t40931: 28312,\n\t40932: 28361,\n\t40933: 28343,\n\t40934: 28371,\n\t40935: 28349,\n\t40936: 28335,\n\t40937: 28356,\n\t40938: 28338,\n\t40939: 28372,\n\t40940: 28373,\n\t40941: 28303,\n\t40942: 28325,\n\t40943: 28354,\n\t40944: 28319,\n\t40945: 28481,\n\t40946: 28433,\n\t40947: 28748,\n\t40948: 28396,\n\t40949: 28408,\n\t40950: 28414,\n\t40951: 28479,\n\t40952: 28402,\n\t40953: 28465,\n\t40954: 28399,\n\t40955: 28466,\n\t40956: 28364,\n\t57408: 28478,\n\t57409: 28435,\n\t57410: 28407,\n\t57411: 28550,\n\t57412: 28538,\n\t57413: 28536,\n\t57414: 28545,\n\t57415: 28544,\n\t57416: 28527,\n\t57417: 28507,\n\t57418: 28659,\n\t57419: 28525,\n\t57420: 28546,\n\t57421: 28540,\n\t57422: 28504,\n\t57423: 28558,\n\t57424: 28561,\n\t57425: 28610,\n\t57426: 28518,\n\t57427: 28595,\n\t57428: 28579,\n\t57429: 28577,\n\t57430: 28580,\n\t57431: 28601,\n\t57432: 28614,\n\t57433: 28586,\n\t57434: 28639,\n\t57435: 28629,\n\t57436: 28652,\n\t57437: 28628,\n\t57438: 28632,\n\t57439: 28657,\n\t57440: 28654,\n\t57441: 28635,\n\t57442: 28681,\n\t57443: 28683,\n\t57444: 28666,\n\t57445: 28689,\n\t57446: 28673,\n\t57447: 28687,\n\t57448: 28670,\n\t57449: 28699,\n\t57450: 28698,\n\t57451: 28532,\n\t57452: 28701,\n\t57453: 28696,\n\t57454: 28703,\n\t57455: 28720,\n\t57456: 28734,\n\t57457: 28722,\n\t57458: 28753,\n\t57459: 28771,\n\t57460: 28825,\n\t57461: 28818,\n\t57462: 28847,\n\t57463: 28913,\n\t57464: 28844,\n\t57465: 28856,\n\t57466: 28851,\n\t57467: 28846,\n\t57468: 28895,\n\t57469: 28875,\n\t57470: 28893,\n\t57472: 28889,\n\t57473: 28937,\n\t57474: 28925,\n\t57475: 28956,\n\t57476: 28953,\n\t57477: 29029,\n\t57478: 29013,\n\t57479: 29064,\n\t57480: 29030,\n\t57481: 29026,\n\t57482: 29004,\n\t57483: 29014,\n\t57484: 29036,\n\t57485: 29071,\n\t57486: 29179,\n\t57487: 29060,\n\t57488: 29077,\n\t57489: 29096,\n\t57490: 29100,\n\t57491: 29143,\n\t57492: 29113,\n\t57493: 29118,\n\t57494: 29138,\n\t57495: 29129,\n\t57496: 29140,\n\t57497: 29134,\n\t57498: 29152,\n\t57499: 29164,\n\t57500: 29159,\n\t57501: 29173,\n\t57502: 29180,\n\t57503: 29177,\n\t57504: 29183,\n\t57505: 29197,\n\t57506: 29200,\n\t57507: 29211,\n\t57508: 29224,\n\t57509: 29229,\n\t57510: 29228,\n\t57511: 29232,\n\t57512: 29234,\n\t57513: 29243,\n\t57514: 29244,\n\t57515: 29247,\n\t57516: 29248,\n\t57517: 29254,\n\t57518: 29259,\n\t57519: 29272,\n\t57520: 29300,\n\t57521: 29310,\n\t57522: 29314,\n\t57523: 29313,\n\t57524: 29319,\n\t57525: 29330,\n\t57526: 29334,\n\t57527: 29346,\n\t57528: 29351,\n\t57529: 29369,\n\t57530: 29362,\n\t57531: 29379,\n\t57532: 29382,\n\t57533: 29380,\n\t57534: 29390,\n\t57535: 29394,\n\t57536: 29410,\n\t57537: 29408,\n\t57538: 29409,\n\t57539: 29433,\n\t57540: 29431,\n\t57541: 20495,\n\t57542: 29463,\n\t57543: 29450,\n\t57544: 29468,\n\t57545: 29462,\n\t57546: 29469,\n\t57547: 29492,\n\t57548: 29487,\n\t57549: 29481,\n\t57550: 29477,\n\t57551: 29502,\n\t57552: 29518,\n\t57553: 29519,\n\t57554: 40664,\n\t57555: 29527,\n\t57556: 29546,\n\t57557: 29544,\n\t57558: 29552,\n\t57559: 29560,\n\t57560: 29557,\n\t57561: 29563,\n\t57562: 29562,\n\t57563: 29640,\n\t57564: 29619,\n\t57565: 29646,\n\t57566: 29627,\n\t57567: 29632,\n\t57568: 29669,\n\t57569: 29678,\n\t57570: 29662,\n\t57571: 29858,\n\t57572: 29701,\n\t57573: 29807,\n\t57574: 29733,\n\t57575: 29688,\n\t57576: 29746,\n\t57577: 29754,\n\t57578: 29781,\n\t57579: 29759,\n\t57580: 29791,\n\t57581: 29785,\n\t57582: 29761,\n\t57583: 29788,\n\t57584: 29801,\n\t57585: 29808,\n\t57586: 29795,\n\t57587: 29802,\n\t57588: 29814,\n\t57589: 29822,\n\t57590: 29835,\n\t57591: 29854,\n\t57592: 29863,\n\t57593: 29898,\n\t57594: 29903,\n\t57595: 29908,\n\t57596: 29681,\n\t57664: 29920,\n\t57665: 29923,\n\t57666: 29927,\n\t57667: 29929,\n\t57668: 29934,\n\t57669: 29938,\n\t57670: 29936,\n\t57671: 29937,\n\t57672: 29944,\n\t57673: 29943,\n\t57674: 29956,\n\t57675: 29955,\n\t57676: 29957,\n\t57677: 29964,\n\t57678: 29966,\n\t57679: 29965,\n\t57680: 29973,\n\t57681: 29971,\n\t57682: 29982,\n\t57683: 29990,\n\t57684: 29996,\n\t57685: 30012,\n\t57686: 30020,\n\t57687: 30029,\n\t57688: 30026,\n\t57689: 30025,\n\t57690: 30043,\n\t57691: 30022,\n\t57692: 30042,\n\t57693: 30057,\n\t57694: 30052,\n\t57695: 30055,\n\t57696: 30059,\n\t57697: 30061,\n\t57698: 30072,\n\t57699: 30070,\n\t57700: 30086,\n\t57701: 30087,\n\t57702: 30068,\n\t57703: 30090,\n\t57704: 30089,\n\t57705: 30082,\n\t57706: 30100,\n\t57707: 30106,\n\t57708: 30109,\n\t57709: 30117,\n\t57710: 30115,\n\t57711: 30146,\n\t57712: 30131,\n\t57713: 30147,\n\t57714: 30133,\n\t57715: 30141,\n\t57716: 30136,\n\t57717: 30140,\n\t57718: 30129,\n\t57719: 30157,\n\t57720: 30154,\n\t57721: 30162,\n\t57722: 30169,\n\t57723: 30179,\n\t57724: 30174,\n\t57725: 30206,\n\t57726: 30207,\n\t57728: 30204,\n\t57729: 30209,\n\t57730: 30192,\n\t57731: 30202,\n\t57732: 30194,\n\t57733: 30195,\n\t57734: 30219,\n\t57735: 30221,\n\t57736: 30217,\n\t57737: 30239,\n\t57738: 30247,\n\t57739: 30240,\n\t57740: 30241,\n\t57741: 30242,\n\t57742: 30244,\n\t57743: 30260,\n\t57744: 30256,\n\t57745: 30267,\n\t57746: 30279,\n\t57747: 30280,\n\t57748: 30278,\n\t57749: 30300,\n\t57750: 30296,\n\t57751: 30305,\n\t57752: 30306,\n\t57753: 30312,\n\t57754: 30313,\n\t57755: 30314,\n\t57756: 30311,\n\t57757: 30316,\n\t57758: 30320,\n\t57759: 30322,\n\t57760: 30326,\n\t57761: 30328,\n\t57762: 30332,\n\t57763: 30336,\n\t57764: 30339,\n\t57765: 30344,\n\t57766: 30347,\n\t57767: 30350,\n\t57768: 30358,\n\t57769: 30355,\n\t57770: 30361,\n\t57771: 30362,\n\t57772: 30384,\n\t57773: 30388,\n\t57774: 30392,\n\t57775: 30393,\n\t57776: 30394,\n\t57777: 30402,\n\t57778: 30413,\n\t57779: 30422,\n\t57780: 30418,\n\t57781: 30430,\n\t57782: 30433,\n\t57783: 30437,\n\t57784: 30439,\n\t57785: 30442,\n\t57786: 34351,\n\t57787: 30459,\n\t57788: 30472,\n\t57789: 30471,\n\t57790: 30468,\n\t57791: 30505,\n\t57792: 30500,\n\t57793: 30494,\n\t57794: 30501,\n\t57795: 30502,\n\t57796: 30491,\n\t57797: 30519,\n\t57798: 30520,\n\t57799: 30535,\n\t57800: 30554,\n\t57801: 30568,\n\t57802: 30571,\n\t57803: 30555,\n\t57804: 30565,\n\t57805: 30591,\n\t57806: 30590,\n\t57807: 30585,\n\t57808: 30606,\n\t57809: 30603,\n\t57810: 30609,\n\t57811: 30624,\n\t57812: 30622,\n\t57813: 30640,\n\t57814: 30646,\n\t57815: 30649,\n\t57816: 30655,\n\t57817: 30652,\n\t57818: 30653,\n\t57819: 30651,\n\t57820: 30663,\n\t57821: 30669,\n\t57822: 30679,\n\t57823: 30682,\n\t57824: 30684,\n\t57825: 30691,\n\t57826: 30702,\n\t57827: 30716,\n\t57828: 30732,\n\t57829: 30738,\n\t57830: 31014,\n\t57831: 30752,\n\t57832: 31018,\n\t57833: 30789,\n\t57834: 30862,\n\t57835: 30836,\n\t57836: 30854,\n\t57837: 30844,\n\t57838: 30874,\n\t57839: 30860,\n\t57840: 30883,\n\t57841: 30901,\n\t57842: 30890,\n\t57843: 30895,\n\t57844: 30929,\n\t57845: 30918,\n\t57846: 30923,\n\t57847: 30932,\n\t57848: 30910,\n\t57849: 30908,\n\t57850: 30917,\n\t57851: 30922,\n\t57852: 30956,\n\t57920: 30951,\n\t57921: 30938,\n\t57922: 30973,\n\t57923: 30964,\n\t57924: 30983,\n\t57925: 30994,\n\t57926: 30993,\n\t57927: 31001,\n\t57928: 31020,\n\t57929: 31019,\n\t57930: 31040,\n\t57931: 31072,\n\t57932: 31063,\n\t57933: 31071,\n\t57934: 31066,\n\t57935: 31061,\n\t57936: 31059,\n\t57937: 31098,\n\t57938: 31103,\n\t57939: 31114,\n\t57940: 31133,\n\t57941: 31143,\n\t57942: 40779,\n\t57943: 31146,\n\t57944: 31150,\n\t57945: 31155,\n\t57946: 31161,\n\t57947: 31162,\n\t57948: 31177,\n\t57949: 31189,\n\t57950: 31207,\n\t57951: 31212,\n\t57952: 31201,\n\t57953: 31203,\n\t57954: 31240,\n\t57955: 31245,\n\t57956: 31256,\n\t57957: 31257,\n\t57958: 31264,\n\t57959: 31263,\n\t57960: 31104,\n\t57961: 31281,\n\t57962: 31291,\n\t57963: 31294,\n\t57964: 31287,\n\t57965: 31299,\n\t57966: 31319,\n\t57967: 31305,\n\t57968: 31329,\n\t57969: 31330,\n\t57970: 31337,\n\t57971: 40861,\n\t57972: 31344,\n\t57973: 31353,\n\t57974: 31357,\n\t57975: 31368,\n\t57976: 31383,\n\t57977: 31381,\n\t57978: 31384,\n\t57979: 31382,\n\t57980: 31401,\n\t57981: 31432,\n\t57982: 31408,\n\t57984: 31414,\n\t57985: 31429,\n\t57986: 31428,\n\t57987: 31423,\n\t57988: 36995,\n\t57989: 31431,\n\t57990: 31434,\n\t57991: 31437,\n\t57992: 31439,\n\t57993: 31445,\n\t57994: 31443,\n\t57995: 31449,\n\t57996: 31450,\n\t57997: 31453,\n\t57998: 31457,\n\t57999: 31458,\n\t58000: 31462,\n\t58001: 31469,\n\t58002: 31472,\n\t58003: 31490,\n\t58004: 31503,\n\t58005: 31498,\n\t58006: 31494,\n\t58007: 31539,\n\t58008: 31512,\n\t58009: 31513,\n\t58010: 31518,\n\t58011: 31541,\n\t58012: 31528,\n\t58013: 31542,\n\t58014: 31568,\n\t58015: 31610,\n\t58016: 31492,\n\t58017: 31565,\n\t58018: 31499,\n\t58019: 31564,\n\t58020: 31557,\n\t58021: 31605,\n\t58022: 31589,\n\t58023: 31604,\n\t58024: 31591,\n\t58025: 31600,\n\t58026: 31601,\n\t58027: 31596,\n\t58028: 31598,\n\t58029: 31645,\n\t58030: 31640,\n\t58031: 31647,\n\t58032: 31629,\n\t58033: 31644,\n\t58034: 31642,\n\t58035: 31627,\n\t58036: 31634,\n\t58037: 31631,\n\t58038: 31581,\n\t58039: 31641,\n\t58040: 31691,\n\t58041: 31681,\n\t58042: 31692,\n\t58043: 31695,\n\t58044: 31668,\n\t58045: 31686,\n\t58046: 31709,\n\t58047: 31721,\n\t58048: 31761,\n\t58049: 31764,\n\t58050: 31718,\n\t58051: 31717,\n\t58052: 31840,\n\t58053: 31744,\n\t58054: 31751,\n\t58055: 31763,\n\t58056: 31731,\n\t58057: 31735,\n\t58058: 31767,\n\t58059: 31757,\n\t58060: 31734,\n\t58061: 31779,\n\t58062: 31783,\n\t58063: 31786,\n\t58064: 31775,\n\t58065: 31799,\n\t58066: 31787,\n\t58067: 31805,\n\t58068: 31820,\n\t58069: 31811,\n\t58070: 31828,\n\t58071: 31823,\n\t58072: 31808,\n\t58073: 31824,\n\t58074: 31832,\n\t58075: 31839,\n\t58076: 31844,\n\t58077: 31830,\n\t58078: 31845,\n\t58079: 31852,\n\t58080: 31861,\n\t58081: 31875,\n\t58082: 31888,\n\t58083: 31908,\n\t58084: 31917,\n\t58085: 31906,\n\t58086: 31915,\n\t58087: 31905,\n\t58088: 31912,\n\t58089: 31923,\n\t58090: 31922,\n\t58091: 31921,\n\t58092: 31918,\n\t58093: 31929,\n\t58094: 31933,\n\t58095: 31936,\n\t58096: 31941,\n\t58097: 31938,\n\t58098: 31960,\n\t58099: 31954,\n\t58100: 31964,\n\t58101: 31970,\n\t58102: 39739,\n\t58103: 31983,\n\t58104: 31986,\n\t58105: 31988,\n\t58106: 31990,\n\t58107: 31994,\n\t58108: 32006,\n\t58176: 32002,\n\t58177: 32028,\n\t58178: 32021,\n\t58179: 32010,\n\t58180: 32069,\n\t58181: 32075,\n\t58182: 32046,\n\t58183: 32050,\n\t58184: 32063,\n\t58185: 32053,\n\t58186: 32070,\n\t58187: 32115,\n\t58188: 32086,\n\t58189: 32078,\n\t58190: 32114,\n\t58191: 32104,\n\t58192: 32110,\n\t58193: 32079,\n\t58194: 32099,\n\t58195: 32147,\n\t58196: 32137,\n\t58197: 32091,\n\t58198: 32143,\n\t58199: 32125,\n\t58200: 32155,\n\t58201: 32186,\n\t58202: 32174,\n\t58203: 32163,\n\t58204: 32181,\n\t58205: 32199,\n\t58206: 32189,\n\t58207: 32171,\n\t58208: 32317,\n\t58209: 32162,\n\t58210: 32175,\n\t58211: 32220,\n\t58212: 32184,\n\t58213: 32159,\n\t58214: 32176,\n\t58215: 32216,\n\t58216: 32221,\n\t58217: 32228,\n\t58218: 32222,\n\t58219: 32251,\n\t58220: 32242,\n\t58221: 32225,\n\t58222: 32261,\n\t58223: 32266,\n\t58224: 32291,\n\t58225: 32289,\n\t58226: 32274,\n\t58227: 32305,\n\t58228: 32287,\n\t58229: 32265,\n\t58230: 32267,\n\t58231: 32290,\n\t58232: 32326,\n\t58233: 32358,\n\t58234: 32315,\n\t58235: 32309,\n\t58236: 32313,\n\t58237: 32323,\n\t58238: 32311,\n\t58240: 32306,\n\t58241: 32314,\n\t58242: 32359,\n\t58243: 32349,\n\t58244: 32342,\n\t58245: 32350,\n\t58246: 32345,\n\t58247: 32346,\n\t58248: 32377,\n\t58249: 32362,\n\t58250: 32361,\n\t58251: 32380,\n\t58252: 32379,\n\t58253: 32387,\n\t58254: 32213,\n\t58255: 32381,\n\t58256: 36782,\n\t58257: 32383,\n\t58258: 32392,\n\t58259: 32393,\n\t58260: 32396,\n\t58261: 32402,\n\t58262: 32400,\n\t58263: 32403,\n\t58264: 32404,\n\t58265: 32406,\n\t58266: 32398,\n\t58267: 32411,\n\t58268: 32412,\n\t58269: 32568,\n\t58270: 32570,\n\t58271: 32581,\n\t58272: 32588,\n\t58273: 32589,\n\t58274: 32590,\n\t58275: 32592,\n\t58276: 32593,\n\t58277: 32597,\n\t58278: 32596,\n\t58279: 32600,\n\t58280: 32607,\n\t58281: 32608,\n\t58282: 32616,\n\t58283: 32617,\n\t58284: 32615,\n\t58285: 32632,\n\t58286: 32642,\n\t58287: 32646,\n\t58288: 32643,\n\t58289: 32648,\n\t58290: 32647,\n\t58291: 32652,\n\t58292: 32660,\n\t58293: 32670,\n\t58294: 32669,\n\t58295: 32666,\n\t58296: 32675,\n\t58297: 32687,\n\t58298: 32690,\n\t58299: 32697,\n\t58300: 32686,\n\t58301: 32694,\n\t58302: 32696,\n\t58303: 35697,\n\t58304: 32709,\n\t58305: 32710,\n\t58306: 32714,\n\t58307: 32725,\n\t58308: 32724,\n\t58309: 32737,\n\t58310: 32742,\n\t58311: 32745,\n\t58312: 32755,\n\t58313: 32761,\n\t58314: 39132,\n\t58315: 32774,\n\t58316: 32772,\n\t58317: 32779,\n\t58318: 32786,\n\t58319: 32792,\n\t58320: 32793,\n\t58321: 32796,\n\t58322: 32801,\n\t58323: 32808,\n\t58324: 32831,\n\t58325: 32827,\n\t58326: 32842,\n\t58327: 32838,\n\t58328: 32850,\n\t58329: 32856,\n\t58330: 32858,\n\t58331: 32863,\n\t58332: 32866,\n\t58333: 32872,\n\t58334: 32883,\n\t58335: 32882,\n\t58336: 32880,\n\t58337: 32886,\n\t58338: 32889,\n\t58339: 32893,\n\t58340: 32895,\n\t58341: 32900,\n\t58342: 32902,\n\t58343: 32901,\n\t58344: 32923,\n\t58345: 32915,\n\t58346: 32922,\n\t58347: 32941,\n\t58348: 20880,\n\t58349: 32940,\n\t58350: 32987,\n\t58351: 32997,\n\t58352: 32985,\n\t58353: 32989,\n\t58354: 32964,\n\t58355: 32986,\n\t58356: 32982,\n\t58357: 33033,\n\t58358: 33007,\n\t58359: 33009,\n\t58360: 33051,\n\t58361: 33065,\n\t58362: 33059,\n\t58363: 33071,\n\t58364: 33099,\n\t58432: 38539,\n\t58433: 33094,\n\t58434: 33086,\n\t58435: 33107,\n\t58436: 33105,\n\t58437: 33020,\n\t58438: 33137,\n\t58439: 33134,\n\t58440: 33125,\n\t58441: 33126,\n\t58442: 33140,\n\t58443: 33155,\n\t58444: 33160,\n\t58445: 33162,\n\t58446: 33152,\n\t58447: 33154,\n\t58448: 33184,\n\t58449: 33173,\n\t58450: 33188,\n\t58451: 33187,\n\t58452: 33119,\n\t58453: 33171,\n\t58454: 33193,\n\t58455: 33200,\n\t58456: 33205,\n\t58457: 33214,\n\t58458: 33208,\n\t58459: 33213,\n\t58460: 33216,\n\t58461: 33218,\n\t58462: 33210,\n\t58463: 33225,\n\t58464: 33229,\n\t58465: 33233,\n\t58466: 33241,\n\t58467: 33240,\n\t58468: 33224,\n\t58469: 33242,\n\t58470: 33247,\n\t58471: 33248,\n\t58472: 33255,\n\t58473: 33274,\n\t58474: 33275,\n\t58475: 33278,\n\t58476: 33281,\n\t58477: 33282,\n\t58478: 33285,\n\t58479: 33287,\n\t58480: 33290,\n\t58481: 33293,\n\t58482: 33296,\n\t58483: 33302,\n\t58484: 33321,\n\t58485: 33323,\n\t58486: 33336,\n\t58487: 33331,\n\t58488: 33344,\n\t58489: 33369,\n\t58490: 33368,\n\t58491: 33373,\n\t58492: 33370,\n\t58493: 33375,\n\t58494: 33380,\n\t58496: 33378,\n\t58497: 33384,\n\t58498: 33386,\n\t58499: 33387,\n\t58500: 33326,\n\t58501: 33393,\n\t58502: 33399,\n\t58503: 33400,\n\t58504: 33406,\n\t58505: 33421,\n\t58506: 33426,\n\t58507: 33451,\n\t58508: 33439,\n\t58509: 33467,\n\t58510: 33452,\n\t58511: 33505,\n\t58512: 33507,\n\t58513: 33503,\n\t58514: 33490,\n\t58515: 33524,\n\t58516: 33523,\n\t58517: 33530,\n\t58518: 33683,\n\t58519: 33539,\n\t58520: 33531,\n\t58521: 33529,\n\t58522: 33502,\n\t58523: 33542,\n\t58524: 33500,\n\t58525: 33545,\n\t58526: 33497,\n\t58527: 33589,\n\t58528: 33588,\n\t58529: 33558,\n\t58530: 33586,\n\t58531: 33585,\n\t58532: 33600,\n\t58533: 33593,\n\t58534: 33616,\n\t58535: 33605,\n\t58536: 33583,\n\t58537: 33579,\n\t58538: 33559,\n\t58539: 33560,\n\t58540: 33669,\n\t58541: 33690,\n\t58542: 33706,\n\t58543: 33695,\n\t58544: 33698,\n\t58545: 33686,\n\t58546: 33571,\n\t58547: 33678,\n\t58548: 33671,\n\t58549: 33674,\n\t58550: 33660,\n\t58551: 33717,\n\t58552: 33651,\n\t58553: 33653,\n\t58554: 33696,\n\t58555: 33673,\n\t58556: 33704,\n\t58557: 33780,\n\t58558: 33811,\n\t58559: 33771,\n\t58560: 33742,\n\t58561: 33789,\n\t58562: 33795,\n\t58563: 33752,\n\t58564: 33803,\n\t58565: 33729,\n\t58566: 33783,\n\t58567: 33799,\n\t58568: 33760,\n\t58569: 33778,\n\t58570: 33805,\n\t58571: 33826,\n\t58572: 33824,\n\t58573: 33725,\n\t58574: 33848,\n\t58575: 34054,\n\t58576: 33787,\n\t58577: 33901,\n\t58578: 33834,\n\t58579: 33852,\n\t58580: 34138,\n\t58581: 33924,\n\t58582: 33911,\n\t58583: 33899,\n\t58584: 33965,\n\t58585: 33902,\n\t58586: 33922,\n\t58587: 33897,\n\t58588: 33862,\n\t58589: 33836,\n\t58590: 33903,\n\t58591: 33913,\n\t58592: 33845,\n\t58593: 33994,\n\t58594: 33890,\n\t58595: 33977,\n\t58596: 33983,\n\t58597: 33951,\n\t58598: 34009,\n\t58599: 33997,\n\t58600: 33979,\n\t58601: 34010,\n\t58602: 34000,\n\t58603: 33985,\n\t58604: 33990,\n\t58605: 34006,\n\t58606: 33953,\n\t58607: 34081,\n\t58608: 34047,\n\t58609: 34036,\n\t58610: 34071,\n\t58611: 34072,\n\t58612: 34092,\n\t58613: 34079,\n\t58614: 34069,\n\t58615: 34068,\n\t58616: 34044,\n\t58617: 34112,\n\t58618: 34147,\n\t58619: 34136,\n\t58620: 34120,\n\t58688: 34113,\n\t58689: 34306,\n\t58690: 34123,\n\t58691: 34133,\n\t58692: 34176,\n\t58693: 34212,\n\t58694: 34184,\n\t58695: 34193,\n\t58696: 34186,\n\t58697: 34216,\n\t58698: 34157,\n\t58699: 34196,\n\t58700: 34203,\n\t58701: 34282,\n\t58702: 34183,\n\t58703: 34204,\n\t58704: 34167,\n\t58705: 34174,\n\t58706: 34192,\n\t58707: 34249,\n\t58708: 34234,\n\t58709: 34255,\n\t58710: 34233,\n\t58711: 34256,\n\t58712: 34261,\n\t58713: 34269,\n\t58714: 34277,\n\t58715: 34268,\n\t58716: 34297,\n\t58717: 34314,\n\t58718: 34323,\n\t58719: 34315,\n\t58720: 34302,\n\t58721: 34298,\n\t58722: 34310,\n\t58723: 34338,\n\t58724: 34330,\n\t58725: 34352,\n\t58726: 34367,\n\t58727: 34381,\n\t58728: 20053,\n\t58729: 34388,\n\t58730: 34399,\n\t58731: 34407,\n\t58732: 34417,\n\t58733: 34451,\n\t58734: 34467,\n\t58735: 34473,\n\t58736: 34474,\n\t58737: 34443,\n\t58738: 34444,\n\t58739: 34486,\n\t58740: 34479,\n\t58741: 34500,\n\t58742: 34502,\n\t58743: 34480,\n\t58744: 34505,\n\t58745: 34851,\n\t58746: 34475,\n\t58747: 34516,\n\t58748: 34526,\n\t58749: 34537,\n\t58750: 34540,\n\t58752: 34527,\n\t58753: 34523,\n\t58754: 34543,\n\t58755: 34578,\n\t58756: 34566,\n\t58757: 34568,\n\t58758: 34560,\n\t58759: 34563,\n\t58760: 34555,\n\t58761: 34577,\n\t58762: 34569,\n\t58763: 34573,\n\t58764: 34553,\n\t58765: 34570,\n\t58766: 34612,\n\t58767: 34623,\n\t58768: 34615,\n\t58769: 34619,\n\t58770: 34597,\n\t58771: 34601,\n\t58772: 34586,\n\t58773: 34656,\n\t58774: 34655,\n\t58775: 34680,\n\t58776: 34636,\n\t58777: 34638,\n\t58778: 34676,\n\t58779: 34647,\n\t58780: 34664,\n\t58781: 34670,\n\t58782: 34649,\n\t58783: 34643,\n\t58784: 34659,\n\t58785: 34666,\n\t58786: 34821,\n\t58787: 34722,\n\t58788: 34719,\n\t58789: 34690,\n\t58790: 34735,\n\t58791: 34763,\n\t58792: 34749,\n\t58793: 34752,\n\t58794: 34768,\n\t58795: 38614,\n\t58796: 34731,\n\t58797: 34756,\n\t58798: 34739,\n\t58799: 34759,\n\t58800: 34758,\n\t58801: 34747,\n\t58802: 34799,\n\t58803: 34802,\n\t58804: 34784,\n\t58805: 34831,\n\t58806: 34829,\n\t58807: 34814,\n\t58808: 34806,\n\t58809: 34807,\n\t58810: 34830,\n\t58811: 34770,\n\t58812: 34833,\n\t58813: 34838,\n\t58814: 34837,\n\t58815: 34850,\n\t58816: 34849,\n\t58817: 34865,\n\t58818: 34870,\n\t58819: 34873,\n\t58820: 34855,\n\t58821: 34875,\n\t58822: 34884,\n\t58823: 34882,\n\t58824: 34898,\n\t58825: 34905,\n\t58826: 34910,\n\t58827: 34914,\n\t58828: 34923,\n\t58829: 34945,\n\t58830: 34942,\n\t58831: 34974,\n\t58832: 34933,\n\t58833: 34941,\n\t58834: 34997,\n\t58835: 34930,\n\t58836: 34946,\n\t58837: 34967,\n\t58838: 34962,\n\t58839: 34990,\n\t58840: 34969,\n\t58841: 34978,\n\t58842: 34957,\n\t58843: 34980,\n\t58844: 34992,\n\t58845: 35007,\n\t58846: 34993,\n\t58847: 35011,\n\t58848: 35012,\n\t58849: 35028,\n\t58850: 35032,\n\t58851: 35033,\n\t58852: 35037,\n\t58853: 35065,\n\t58854: 35074,\n\t58855: 35068,\n\t58856: 35060,\n\t58857: 35048,\n\t58858: 35058,\n\t58859: 35076,\n\t58860: 35084,\n\t58861: 35082,\n\t58862: 35091,\n\t58863: 35139,\n\t58864: 35102,\n\t58865: 35109,\n\t58866: 35114,\n\t58867: 35115,\n\t58868: 35137,\n\t58869: 35140,\n\t58870: 35131,\n\t58871: 35126,\n\t58872: 35128,\n\t58873: 35148,\n\t58874: 35101,\n\t58875: 35168,\n\t58876: 35166,\n\t58944: 35174,\n\t58945: 35172,\n\t58946: 35181,\n\t58947: 35178,\n\t58948: 35183,\n\t58949: 35188,\n\t58950: 35191,\n\t58951: 35198,\n\t58952: 35203,\n\t58953: 35208,\n\t58954: 35210,\n\t58955: 35219,\n\t58956: 35224,\n\t58957: 35233,\n\t58958: 35241,\n\t58959: 35238,\n\t58960: 35244,\n\t58961: 35247,\n\t58962: 35250,\n\t58963: 35258,\n\t58964: 35261,\n\t58965: 35263,\n\t58966: 35264,\n\t58967: 35290,\n\t58968: 35292,\n\t58969: 35293,\n\t58970: 35303,\n\t58971: 35316,\n\t58972: 35320,\n\t58973: 35331,\n\t58974: 35350,\n\t58975: 35344,\n\t58976: 35340,\n\t58977: 35355,\n\t58978: 35357,\n\t58979: 35365,\n\t58980: 35382,\n\t58981: 35393,\n\t58982: 35419,\n\t58983: 35410,\n\t58984: 35398,\n\t58985: 35400,\n\t58986: 35452,\n\t58987: 35437,\n\t58988: 35436,\n\t58989: 35426,\n\t58990: 35461,\n\t58991: 35458,\n\t58992: 35460,\n\t58993: 35496,\n\t58994: 35489,\n\t58995: 35473,\n\t58996: 35493,\n\t58997: 35494,\n\t58998: 35482,\n\t58999: 35491,\n\t59000: 35524,\n\t59001: 35533,\n\t59002: 35522,\n\t59003: 35546,\n\t59004: 35563,\n\t59005: 35571,\n\t59006: 35559,\n\t59008: 35556,\n\t59009: 35569,\n\t59010: 35604,\n\t59011: 35552,\n\t59012: 35554,\n\t59013: 35575,\n\t59014: 35550,\n\t59015: 35547,\n\t59016: 35596,\n\t59017: 35591,\n\t59018: 35610,\n\t59019: 35553,\n\t59020: 35606,\n\t59021: 35600,\n\t59022: 35607,\n\t59023: 35616,\n\t59024: 35635,\n\t59025: 38827,\n\t59026: 35622,\n\t59027: 35627,\n\t59028: 35646,\n\t59029: 35624,\n\t59030: 35649,\n\t59031: 35660,\n\t59032: 35663,\n\t59033: 35662,\n\t59034: 35657,\n\t59035: 35670,\n\t59036: 35675,\n\t59037: 35674,\n\t59038: 35691,\n\t59039: 35679,\n\t59040: 35692,\n\t59041: 35695,\n\t59042: 35700,\n\t59043: 35709,\n\t59044: 35712,\n\t59045: 35724,\n\t59046: 35726,\n\t59047: 35730,\n\t59048: 35731,\n\t59049: 35734,\n\t59050: 35737,\n\t59051: 35738,\n\t59052: 35898,\n\t59053: 35905,\n\t59054: 35903,\n\t59055: 35912,\n\t59056: 35916,\n\t59057: 35918,\n\t59058: 35920,\n\t59059: 35925,\n\t59060: 35938,\n\t59061: 35948,\n\t59062: 35960,\n\t59063: 35962,\n\t59064: 35970,\n\t59065: 35977,\n\t59066: 35973,\n\t59067: 35978,\n\t59068: 35981,\n\t59069: 35982,\n\t59070: 35988,\n\t59071: 35964,\n\t59072: 35992,\n\t59073: 25117,\n\t59074: 36013,\n\t59075: 36010,\n\t59076: 36029,\n\t59077: 36018,\n\t59078: 36019,\n\t59079: 36014,\n\t59080: 36022,\n\t59081: 36040,\n\t59082: 36033,\n\t59083: 36068,\n\t59084: 36067,\n\t59085: 36058,\n\t59086: 36093,\n\t59087: 36090,\n\t59088: 36091,\n\t59089: 36100,\n\t59090: 36101,\n\t59091: 36106,\n\t59092: 36103,\n\t59093: 36111,\n\t59094: 36109,\n\t59095: 36112,\n\t59096: 40782,\n\t59097: 36115,\n\t59098: 36045,\n\t59099: 36116,\n\t59100: 36118,\n\t59101: 36199,\n\t59102: 36205,\n\t59103: 36209,\n\t59104: 36211,\n\t59105: 36225,\n\t59106: 36249,\n\t59107: 36290,\n\t59108: 36286,\n\t59109: 36282,\n\t59110: 36303,\n\t59111: 36314,\n\t59112: 36310,\n\t59113: 36300,\n\t59114: 36315,\n\t59115: 36299,\n\t59116: 36330,\n\t59117: 36331,\n\t59118: 36319,\n\t59119: 36323,\n\t59120: 36348,\n\t59121: 36360,\n\t59122: 36361,\n\t59123: 36351,\n\t59124: 36381,\n\t59125: 36382,\n\t59126: 36368,\n\t59127: 36383,\n\t59128: 36418,\n\t59129: 36405,\n\t59130: 36400,\n\t59131: 36404,\n\t59132: 36426,\n\t59200: 36423,\n\t59201: 36425,\n\t59202: 36428,\n\t59203: 36432,\n\t59204: 36424,\n\t59205: 36441,\n\t59206: 36452,\n\t59207: 36448,\n\t59208: 36394,\n\t59209: 36451,\n\t59210: 36437,\n\t59211: 36470,\n\t59212: 36466,\n\t59213: 36476,\n\t59214: 36481,\n\t59215: 36487,\n\t59216: 36485,\n\t59217: 36484,\n\t59218: 36491,\n\t59219: 36490,\n\t59220: 36499,\n\t59221: 36497,\n\t59222: 36500,\n\t59223: 36505,\n\t59224: 36522,\n\t59225: 36513,\n\t59226: 36524,\n\t59227: 36528,\n\t59228: 36550,\n\t59229: 36529,\n\t59230: 36542,\n\t59231: 36549,\n\t59232: 36552,\n\t59233: 36555,\n\t59234: 36571,\n\t59235: 36579,\n\t59236: 36604,\n\t59237: 36603,\n\t59238: 36587,\n\t59239: 36606,\n\t59240: 36618,\n\t59241: 36613,\n\t59242: 36629,\n\t59243: 36626,\n\t59244: 36633,\n\t59245: 36627,\n\t59246: 36636,\n\t59247: 36639,\n\t59248: 36635,\n\t59249: 36620,\n\t59250: 36646,\n\t59251: 36659,\n\t59252: 36667,\n\t59253: 36665,\n\t59254: 36677,\n\t59255: 36674,\n\t59256: 36670,\n\t59257: 36684,\n\t59258: 36681,\n\t59259: 36678,\n\t59260: 36686,\n\t59261: 36695,\n\t59262: 36700,\n\t59264: 36706,\n\t59265: 36707,\n\t59266: 36708,\n\t59267: 36764,\n\t59268: 36767,\n\t59269: 36771,\n\t59270: 36781,\n\t59271: 36783,\n\t59272: 36791,\n\t59273: 36826,\n\t59274: 36837,\n\t59275: 36834,\n\t59276: 36842,\n\t59277: 36847,\n\t59278: 36999,\n\t59279: 36852,\n\t59280: 36869,\n\t59281: 36857,\n\t59282: 36858,\n\t59283: 36881,\n\t59284: 36885,\n\t59285: 36897,\n\t59286: 36877,\n\t59287: 36894,\n\t59288: 36886,\n\t59289: 36875,\n\t59290: 36903,\n\t59291: 36918,\n\t59292: 36917,\n\t59293: 36921,\n\t59294: 36856,\n\t59295: 36943,\n\t59296: 36944,\n\t59297: 36945,\n\t59298: 36946,\n\t59299: 36878,\n\t59300: 36937,\n\t59301: 36926,\n\t59302: 36950,\n\t59303: 36952,\n\t59304: 36958,\n\t59305: 36968,\n\t59306: 36975,\n\t59307: 36982,\n\t59308: 38568,\n\t59309: 36978,\n\t59310: 36994,\n\t59311: 36989,\n\t59312: 36993,\n\t59313: 36992,\n\t59314: 37002,\n\t59315: 37001,\n\t59316: 37007,\n\t59317: 37032,\n\t59318: 37039,\n\t59319: 37041,\n\t59320: 37045,\n\t59321: 37090,\n\t59322: 37092,\n\t59323: 25160,\n\t59324: 37083,\n\t59325: 37122,\n\t59326: 37138,\n\t59327: 37145,\n\t59328: 37170,\n\t59329: 37168,\n\t59330: 37194,\n\t59331: 37206,\n\t59332: 37208,\n\t59333: 37219,\n\t59334: 37221,\n\t59335: 37225,\n\t59336: 37235,\n\t59337: 37234,\n\t59338: 37259,\n\t59339: 37257,\n\t59340: 37250,\n\t59341: 37282,\n\t59342: 37291,\n\t59343: 37295,\n\t59344: 37290,\n\t59345: 37301,\n\t59346: 37300,\n\t59347: 37306,\n\t59348: 37312,\n\t59349: 37313,\n\t59350: 37321,\n\t59351: 37323,\n\t59352: 37328,\n\t59353: 37334,\n\t59354: 37343,\n\t59355: 37345,\n\t59356: 37339,\n\t59357: 37372,\n\t59358: 37365,\n\t59359: 37366,\n\t59360: 37406,\n\t59361: 37375,\n\t59362: 37396,\n\t59363: 37420,\n\t59364: 37397,\n\t59365: 37393,\n\t59366: 37470,\n\t59367: 37463,\n\t59368: 37445,\n\t59369: 37449,\n\t59370: 37476,\n\t59371: 37448,\n\t59372: 37525,\n\t59373: 37439,\n\t59374: 37451,\n\t59375: 37456,\n\t59376: 37532,\n\t59377: 37526,\n\t59378: 37523,\n\t59379: 37531,\n\t59380: 37466,\n\t59381: 37583,\n\t59382: 37561,\n\t59383: 37559,\n\t59384: 37609,\n\t59385: 37647,\n\t59386: 37626,\n\t59387: 37700,\n\t59388: 37678,\n\t59456: 37657,\n\t59457: 37666,\n\t59458: 37658,\n\t59459: 37667,\n\t59460: 37690,\n\t59461: 37685,\n\t59462: 37691,\n\t59463: 37724,\n\t59464: 37728,\n\t59465: 37756,\n\t59466: 37742,\n\t59467: 37718,\n\t59468: 37808,\n\t59469: 37804,\n\t59470: 37805,\n\t59471: 37780,\n\t59472: 37817,\n\t59473: 37846,\n\t59474: 37847,\n\t59475: 37864,\n\t59476: 37861,\n\t59477: 37848,\n\t59478: 37827,\n\t59479: 37853,\n\t59480: 37840,\n\t59481: 37832,\n\t59482: 37860,\n\t59483: 37914,\n\t59484: 37908,\n\t59485: 37907,\n\t59486: 37891,\n\t59487: 37895,\n\t59488: 37904,\n\t59489: 37942,\n\t59490: 37931,\n\t59491: 37941,\n\t59492: 37921,\n\t59493: 37946,\n\t59494: 37953,\n\t59495: 37970,\n\t59496: 37956,\n\t59497: 37979,\n\t59498: 37984,\n\t59499: 37986,\n\t59500: 37982,\n\t59501: 37994,\n\t59502: 37417,\n\t59503: 38000,\n\t59504: 38005,\n\t59505: 38007,\n\t59506: 38013,\n\t59507: 37978,\n\t59508: 38012,\n\t59509: 38014,\n\t59510: 38017,\n\t59511: 38015,\n\t59512: 38274,\n\t59513: 38279,\n\t59514: 38282,\n\t59515: 38292,\n\t59516: 38294,\n\t59517: 38296,\n\t59518: 38297,\n\t59520: 38304,\n\t59521: 38312,\n\t59522: 38311,\n\t59523: 38317,\n\t59524: 38332,\n\t59525: 38331,\n\t59526: 38329,\n\t59527: 38334,\n\t59528: 38346,\n\t59529: 28662,\n\t59530: 38339,\n\t59531: 38349,\n\t59532: 38348,\n\t59533: 38357,\n\t59534: 38356,\n\t59535: 38358,\n\t59536: 38364,\n\t59537: 38369,\n\t59538: 38373,\n\t59539: 38370,\n\t59540: 38433,\n\t59541: 38440,\n\t59542: 38446,\n\t59543: 38447,\n\t59544: 38466,\n\t59545: 38476,\n\t59546: 38479,\n\t59547: 38475,\n\t59548: 38519,\n\t59549: 38492,\n\t59550: 38494,\n\t59551: 38493,\n\t59552: 38495,\n\t59553: 38502,\n\t59554: 38514,\n\t59555: 38508,\n\t59556: 38541,\n\t59557: 38552,\n\t59558: 38549,\n\t59559: 38551,\n\t59560: 38570,\n\t59561: 38567,\n\t59562: 38577,\n\t59563: 38578,\n\t59564: 38576,\n\t59565: 38580,\n\t59566: 38582,\n\t59567: 38584,\n\t59568: 38585,\n\t59569: 38606,\n\t59570: 38603,\n\t59571: 38601,\n\t59572: 38605,\n\t59573: 35149,\n\t59574: 38620,\n\t59575: 38669,\n\t59576: 38613,\n\t59577: 38649,\n\t59578: 38660,\n\t59579: 38662,\n\t59580: 38664,\n\t59581: 38675,\n\t59582: 38670,\n\t59583: 38673,\n\t59584: 38671,\n\t59585: 38678,\n\t59586: 38681,\n\t59587: 38692,\n\t59588: 38698,\n\t59589: 38704,\n\t59590: 38713,\n\t59591: 38717,\n\t59592: 38718,\n\t59593: 38724,\n\t59594: 38726,\n\t59595: 38728,\n\t59596: 38722,\n\t59597: 38729,\n\t59598: 38748,\n\t59599: 38752,\n\t59600: 38756,\n\t59601: 38758,\n\t59602: 38760,\n\t59603: 21202,\n\t59604: 38763,\n\t59605: 38769,\n\t59606: 38777,\n\t59607: 38789,\n\t59608: 38780,\n\t59609: 38785,\n\t59610: 38778,\n\t59611: 38790,\n\t59612: 38795,\n\t59613: 38799,\n\t59614: 38800,\n\t59615: 38812,\n\t59616: 38824,\n\t59617: 38822,\n\t59618: 38819,\n\t59619: 38835,\n\t59620: 38836,\n\t59621: 38851,\n\t59622: 38854,\n\t59623: 38856,\n\t59624: 38859,\n\t59625: 38876,\n\t59626: 38893,\n\t59627: 40783,\n\t59628: 38898,\n\t59629: 31455,\n\t59630: 38902,\n\t59631: 38901,\n\t59632: 38927,\n\t59633: 38924,\n\t59634: 38968,\n\t59635: 38948,\n\t59636: 38945,\n\t59637: 38967,\n\t59638: 38973,\n\t59639: 38982,\n\t59640: 38991,\n\t59641: 38987,\n\t59642: 39019,\n\t59643: 39023,\n\t59644: 39024,\n\t59712: 39025,\n\t59713: 39028,\n\t59714: 39027,\n\t59715: 39082,\n\t59716: 39087,\n\t59717: 39089,\n\t59718: 39094,\n\t59719: 39108,\n\t59720: 39107,\n\t59721: 39110,\n\t59722: 39145,\n\t59723: 39147,\n\t59724: 39171,\n\t59725: 39177,\n\t59726: 39186,\n\t59727: 39188,\n\t59728: 39192,\n\t59729: 39201,\n\t59730: 39197,\n\t59731: 39198,\n\t59732: 39204,\n\t59733: 39200,\n\t59734: 39212,\n\t59735: 39214,\n\t59736: 39229,\n\t59737: 39230,\n\t59738: 39234,\n\t59739: 39241,\n\t59740: 39237,\n\t59741: 39248,\n\t59742: 39243,\n\t59743: 39249,\n\t59744: 39250,\n\t59745: 39244,\n\t59746: 39253,\n\t59747: 39319,\n\t59748: 39320,\n\t59749: 39333,\n\t59750: 39341,\n\t59751: 39342,\n\t59752: 39356,\n\t59753: 39391,\n\t59754: 39387,\n\t59755: 39389,\n\t59756: 39384,\n\t59757: 39377,\n\t59758: 39405,\n\t59759: 39406,\n\t59760: 39409,\n\t59761: 39410,\n\t59762: 39419,\n\t59763: 39416,\n\t59764: 39425,\n\t59765: 39439,\n\t59766: 39429,\n\t59767: 39394,\n\t59768: 39449,\n\t59769: 39467,\n\t59770: 39479,\n\t59771: 39493,\n\t59772: 39490,\n\t59773: 39488,\n\t59774: 39491,\n\t59776: 39486,\n\t59777: 39509,\n\t59778: 39501,\n\t59779: 39515,\n\t59780: 39511,\n\t59781: 39519,\n\t59782: 39522,\n\t59783: 39525,\n\t59784: 39524,\n\t59785: 39529,\n\t59786: 39531,\n\t59787: 39530,\n\t59788: 39597,\n\t59789: 39600,\n\t59790: 39612,\n\t59791: 39616,\n\t59792: 39631,\n\t59793: 39633,\n\t59794: 39635,\n\t59795: 39636,\n\t59796: 39646,\n\t59797: 39647,\n\t59798: 39650,\n\t59799: 39651,\n\t59800: 39654,\n\t59801: 39663,\n\t59802: 39659,\n\t59803: 39662,\n\t59804: 39668,\n\t59805: 39665,\n\t59806: 39671,\n\t59807: 39675,\n\t59808: 39686,\n\t59809: 39704,\n\t59810: 39706,\n\t59811: 39711,\n\t59812: 39714,\n\t59813: 39715,\n\t59814: 39717,\n\t59815: 39719,\n\t59816: 39720,\n\t59817: 39721,\n\t59818: 39722,\n\t59819: 39726,\n\t59820: 39727,\n\t59821: 39730,\n\t59822: 39748,\n\t59823: 39747,\n\t59824: 39759,\n\t59825: 39757,\n\t59826: 39758,\n\t59827: 39761,\n\t59828: 39768,\n\t59829: 39796,\n\t59830: 39827,\n\t59831: 39811,\n\t59832: 39825,\n\t59833: 39830,\n\t59834: 39831,\n\t59835: 39839,\n\t59836: 39840,\n\t59837: 39848,\n\t59838: 39860,\n\t59839: 39872,\n\t59840: 39882,\n\t59841: 39865,\n\t59842: 39878,\n\t59843: 39887,\n\t59844: 39889,\n\t59845: 39890,\n\t59846: 39907,\n\t59847: 39906,\n\t59848: 39908,\n\t59849: 39892,\n\t59850: 39905,\n\t59851: 39994,\n\t59852: 39922,\n\t59853: 39921,\n\t59854: 39920,\n\t59855: 39957,\n\t59856: 39956,\n\t59857: 39945,\n\t59858: 39955,\n\t59859: 39948,\n\t59860: 39942,\n\t59861: 39944,\n\t59862: 39954,\n\t59863: 39946,\n\t59864: 39940,\n\t59865: 39982,\n\t59866: 39963,\n\t59867: 39973,\n\t59868: 39972,\n\t59869: 39969,\n\t59870: 39984,\n\t59871: 40007,\n\t59872: 39986,\n\t59873: 40006,\n\t59874: 39998,\n\t59875: 40026,\n\t59876: 40032,\n\t59877: 40039,\n\t59878: 40054,\n\t59879: 40056,\n\t59880: 40167,\n\t59881: 40172,\n\t59882: 40176,\n\t59883: 40201,\n\t59884: 40200,\n\t59885: 40171,\n\t59886: 40195,\n\t59887: 40198,\n\t59888: 40234,\n\t59889: 40230,\n\t59890: 40367,\n\t59891: 40227,\n\t59892: 40223,\n\t59893: 40260,\n\t59894: 40213,\n\t59895: 40210,\n\t59896: 40257,\n\t59897: 40255,\n\t59898: 40254,\n\t59899: 40262,\n\t59900: 40264,\n\t59968: 40285,\n\t59969: 40286,\n\t59970: 40292,\n\t59971: 40273,\n\t59972: 40272,\n\t59973: 40281,\n\t59974: 40306,\n\t59975: 40329,\n\t59976: 40327,\n\t59977: 40363,\n\t59978: 40303,\n\t59979: 40314,\n\t59980: 40346,\n\t59981: 40356,\n\t59982: 40361,\n\t59983: 40370,\n\t59984: 40388,\n\t59985: 40385,\n\t59986: 40379,\n\t59987: 40376,\n\t59988: 40378,\n\t59989: 40390,\n\t59990: 40399,\n\t59991: 40386,\n\t59992: 40409,\n\t59993: 40403,\n\t59994: 40440,\n\t59995: 40422,\n\t59996: 40429,\n\t59997: 40431,\n\t59998: 40445,\n\t59999: 40474,\n\t60000: 40475,\n\t60001: 40478,\n\t60002: 40565,\n\t60003: 40569,\n\t60004: 40573,\n\t60005: 40577,\n\t60006: 40584,\n\t60007: 40587,\n\t60008: 40588,\n\t60009: 40594,\n\t60010: 40597,\n\t60011: 40593,\n\t60012: 40605,\n\t60013: 40613,\n\t60014: 40617,\n\t60015: 40632,\n\t60016: 40618,\n\t60017: 40621,\n\t60018: 38753,\n\t60019: 40652,\n\t60020: 40654,\n\t60021: 40655,\n\t60022: 40656,\n\t60023: 40660,\n\t60024: 40668,\n\t60025: 40670,\n\t60026: 40669,\n\t60027: 40672,\n\t60028: 40677,\n\t60029: 40680,\n\t60030: 40687,\n\t60032: 40692,\n\t60033: 40694,\n\t60034: 40695,\n\t60035: 40697,\n\t60036: 40699,\n\t60037: 40700,\n\t60038: 40701,\n\t60039: 40711,\n\t60040: 40712,\n\t60041: 30391,\n\t60042: 40725,\n\t60043: 40737,\n\t60044: 40748,\n\t60045: 40766,\n\t60046: 40778,\n\t60047: 40786,\n\t60048: 40788,\n\t60049: 40803,\n\t60050: 40799,\n\t60051: 40800,\n\t60052: 40801,\n\t60053: 40806,\n\t60054: 40807,\n\t60055: 40812,\n\t60056: 40810,\n\t60057: 40823,\n\t60058: 40818,\n\t60059: 40822,\n\t60060: 40853,\n\t60061: 40860,\n\t60062: 40864,\n\t60063: 22575,\n\t60064: 27079,\n\t60065: 36953,\n\t60066: 29796,\n\t60067: 20956,\n\t60068: 29081,\n\t60736: 32394,\n\t60737: 35100,\n\t60738: 37704,\n\t60739: 37512,\n\t60740: 34012,\n\t60741: 20425,\n\t60742: 28859,\n\t60743: 26161,\n\t60744: 26824,\n\t60745: 37625,\n\t60746: 26363,\n\t60747: 24389,\n\t60748: 20008,\n\t60749: 20193,\n\t60750: 20220,\n\t60751: 20224,\n\t60752: 20227,\n\t60753: 20281,\n\t60754: 20310,\n\t60755: 20370,\n\t60756: 20362,\n\t60757: 20378,\n\t60758: 20372,\n\t60759: 20429,\n\t60760: 20544,\n\t60761: 20514,\n\t60762: 20479,\n\t60763: 20510,\n\t60764: 20550,\n\t60765: 20592,\n\t60766: 20546,\n\t60767: 20628,\n\t60768: 20724,\n\t60769: 20696,\n\t60770: 20810,\n\t60771: 20836,\n\t60772: 20893,\n\t60773: 20926,\n\t60774: 20972,\n\t60775: 21013,\n\t60776: 21148,\n\t60777: 21158,\n\t60778: 21184,\n\t60779: 21211,\n\t60780: 21248,\n\t60781: 21255,\n\t60782: 21284,\n\t60783: 21362,\n\t60784: 21395,\n\t60785: 21426,\n\t60786: 21469,\n\t60787: 64014,\n\t60788: 21660,\n\t60789: 21642,\n\t60790: 21673,\n\t60791: 21759,\n\t60792: 21894,\n\t60793: 22361,\n\t60794: 22373,\n\t60795: 22444,\n\t60796: 22472,\n\t60797: 22471,\n\t60798: 64015,\n\t60800: 64016,\n\t60801: 22686,\n\t60802: 22706,\n\t60803: 22795,\n\t60804: 22867,\n\t60805: 22875,\n\t60806: 22877,\n\t60807: 22883,\n\t60808: 22948,\n\t60809: 22970,\n\t60810: 23382,\n\t60811: 23488,\n\t60812: 29999,\n\t60813: 23512,\n\t60814: 23532,\n\t60815: 23582,\n\t60816: 23718,\n\t60817: 23738,\n\t60818: 23797,\n\t60819: 23847,\n\t60820: 23891,\n\t60821: 64017,\n\t60822: 23874,\n\t60823: 23917,\n\t60824: 23992,\n\t60825: 23993,\n\t60826: 24016,\n\t60827: 24353,\n\t60828: 24372,\n\t60829: 24423,\n\t60830: 24503,\n\t60831: 24542,\n\t60832: 24669,\n\t60833: 24709,\n\t60834: 24714,\n\t60835: 24798,\n\t60836: 24789,\n\t60837: 24864,\n\t60838: 24818,\n\t60839: 24849,\n\t60840: 24887,\n\t60841: 24880,\n\t60842: 24984,\n\t60843: 25107,\n\t60844: 25254,\n\t60845: 25589,\n\t60846: 25696,\n\t60847: 25757,\n\t60848: 25806,\n\t60849: 25934,\n\t60850: 26112,\n\t60851: 26133,\n\t60852: 26171,\n\t60853: 26121,\n\t60854: 26158,\n\t60855: 26142,\n\t60856: 26148,\n\t60857: 26213,\n\t60858: 26199,\n\t60859: 26201,\n\t60860: 64018,\n\t60861: 26227,\n\t60862: 26265,\n\t60863: 26272,\n\t60864: 26290,\n\t60865: 26303,\n\t60866: 26362,\n\t60867: 26382,\n\t60868: 63785,\n\t60869: 26470,\n\t60870: 26555,\n\t60871: 26706,\n\t60872: 26560,\n\t60873: 26625,\n\t60874: 26692,\n\t60875: 26831,\n\t60876: 64019,\n\t60877: 26984,\n\t60878: 64020,\n\t60879: 27032,\n\t60880: 27106,\n\t60881: 27184,\n\t60882: 27243,\n\t60883: 27206,\n\t60884: 27251,\n\t60885: 27262,\n\t60886: 27362,\n\t60887: 27364,\n\t60888: 27606,\n\t60889: 27711,\n\t60890: 27740,\n\t60891: 27782,\n\t60892: 27759,\n\t60893: 27866,\n\t60894: 27908,\n\t60895: 28039,\n\t60896: 28015,\n\t60897: 28054,\n\t60898: 28076,\n\t60899: 28111,\n\t60900: 28152,\n\t60901: 28146,\n\t60902: 28156,\n\t60903: 28217,\n\t60904: 28252,\n\t60905: 28199,\n\t60906: 28220,\n\t60907: 28351,\n\t60908: 28552,\n\t60909: 28597,\n\t60910: 28661,\n\t60911: 28677,\n\t60912: 28679,\n\t60913: 28712,\n\t60914: 28805,\n\t60915: 28843,\n\t60916: 28943,\n\t60917: 28932,\n\t60918: 29020,\n\t60919: 28998,\n\t60920: 28999,\n\t60921: 64021,\n\t60922: 29121,\n\t60923: 29182,\n\t60924: 29361,\n\t60992: 29374,\n\t60993: 29476,\n\t60994: 64022,\n\t60995: 29559,\n\t60996: 29629,\n\t60997: 29641,\n\t60998: 29654,\n\t60999: 29667,\n\t61000: 29650,\n\t61001: 29703,\n\t61002: 29685,\n\t61003: 29734,\n\t61004: 29738,\n\t61005: 29737,\n\t61006: 29742,\n\t61007: 29794,\n\t61008: 29833,\n\t61009: 29855,\n\t61010: 29953,\n\t61011: 30063,\n\t61012: 30338,\n\t61013: 30364,\n\t61014: 30366,\n\t61015: 30363,\n\t61016: 30374,\n\t61017: 64023,\n\t61018: 30534,\n\t61019: 21167,\n\t61020: 30753,\n\t61021: 30798,\n\t61022: 30820,\n\t61023: 30842,\n\t61024: 31024,\n\t61025: 64024,\n\t61026: 64025,\n\t61027: 64026,\n\t61028: 31124,\n\t61029: 64027,\n\t61030: 31131,\n\t61031: 31441,\n\t61032: 31463,\n\t61033: 64028,\n\t61034: 31467,\n\t61035: 31646,\n\t61036: 64029,\n\t61037: 32072,\n\t61038: 32092,\n\t61039: 32183,\n\t61040: 32160,\n\t61041: 32214,\n\t61042: 32338,\n\t61043: 32583,\n\t61044: 32673,\n\t61045: 64030,\n\t61046: 33537,\n\t61047: 33634,\n\t61048: 33663,\n\t61049: 33735,\n\t61050: 33782,\n\t61051: 33864,\n\t61052: 33972,\n\t61053: 34131,\n\t61054: 34137,\n\t61056: 34155,\n\t61057: 64031,\n\t61058: 34224,\n\t61059: 64032,\n\t61060: 64033,\n\t61061: 34823,\n\t61062: 35061,\n\t61063: 35346,\n\t61064: 35383,\n\t61065: 35449,\n\t61066: 35495,\n\t61067: 35518,\n\t61068: 35551,\n\t61069: 64034,\n\t61070: 35574,\n\t61071: 35667,\n\t61072: 35711,\n\t61073: 36080,\n\t61074: 36084,\n\t61075: 36114,\n\t61076: 36214,\n\t61077: 64035,\n\t61078: 36559,\n\t61079: 64036,\n\t61080: 64037,\n\t61081: 36967,\n\t61082: 37086,\n\t61083: 64038,\n\t61084: 37141,\n\t61085: 37159,\n\t61086: 37338,\n\t61087: 37335,\n\t61088: 37342,\n\t61089: 37357,\n\t61090: 37358,\n\t61091: 37348,\n\t61092: 37349,\n\t61093: 37382,\n\t61094: 37392,\n\t61095: 37386,\n\t61096: 37434,\n\t61097: 37440,\n\t61098: 37436,\n\t61099: 37454,\n\t61100: 37465,\n\t61101: 37457,\n\t61102: 37433,\n\t61103: 37479,\n\t61104: 37543,\n\t61105: 37495,\n\t61106: 37496,\n\t61107: 37607,\n\t61108: 37591,\n\t61109: 37593,\n\t61110: 37584,\n\t61111: 64039,\n\t61112: 37589,\n\t61113: 37600,\n\t61114: 37587,\n\t61115: 37669,\n\t61116: 37665,\n\t61117: 37627,\n\t61118: 64040,\n\t61119: 37662,\n\t61120: 37631,\n\t61121: 37661,\n\t61122: 37634,\n\t61123: 37744,\n\t61124: 37719,\n\t61125: 37796,\n\t61126: 37830,\n\t61127: 37854,\n\t61128: 37880,\n\t61129: 37937,\n\t61130: 37957,\n\t61131: 37960,\n\t61132: 38290,\n\t61133: 63964,\n\t61134: 64041,\n\t61135: 38557,\n\t61136: 38575,\n\t61137: 38707,\n\t61138: 38715,\n\t61139: 38723,\n\t61140: 38733,\n\t61141: 38735,\n\t61142: 38737,\n\t61143: 38741,\n\t61144: 38999,\n\t61145: 39013,\n\t61146: 64042,\n\t61147: 64043,\n\t61148: 39207,\n\t61149: 64044,\n\t61150: 39326,\n\t61151: 39502,\n\t61152: 39641,\n\t61153: 39644,\n\t61154: 39797,\n\t61155: 39794,\n\t61156: 39823,\n\t61157: 39857,\n\t61158: 39867,\n\t61159: 39936,\n\t61160: 40304,\n\t61161: 40299,\n\t61162: 64045,\n\t61163: 40473,\n\t61164: 40657,\n\t61167: 8560,\n\t61168: 8561,\n\t61169: 8562,\n\t61170: 8563,\n\t61171: 8564,\n\t61172: 8565,\n\t61173: 8566,\n\t61174: 8567,\n\t61175: 8568,\n\t61176: 8569,\n\t61177: 65506,\n\t61178: 65508,\n\t61179: 65287,\n\t61180: 65282,\n\t61504: 57344,\n\t61505: 57345,\n\t61506: 57346,\n\t61507: 57347,\n\t61508: 57348,\n\t61509: 57349,\n\t61510: 57350,\n\t61511: 57351,\n\t61512: 57352,\n\t61513: 57353,\n\t61514: 57354,\n\t61515: 57355,\n\t61516: 57356,\n\t61517: 57357,\n\t61518: 57358,\n\t61519: 57359,\n\t61520: 57360,\n\t61521: 57361,\n\t61522: 57362,\n\t61523: 57363,\n\t61524: 57364,\n\t61525: 57365,\n\t61526: 57366,\n\t61527: 57367,\n\t61528: 57368,\n\t61529: 57369,\n\t61530: 57370,\n\t61531: 57371,\n\t61532: 57372,\n\t61533: 57373,\n\t61534: 57374,\n\t61535: 57375,\n\t61536: 57376,\n\t61537: 57377,\n\t61538: 57378,\n\t61539: 57379,\n\t61540: 57380,\n\t61541: 57381,\n\t61542: 57382,\n\t61543: 57383,\n\t61544: 57384,\n\t61545: 57385,\n\t61546: 57386,\n\t61547: 57387,\n\t61548: 57388,\n\t61549: 57389,\n\t61550: 57390,\n\t61551: 57391,\n\t61552: 57392,\n\t61553: 57393,\n\t61554: 57394,\n\t61555: 57395,\n\t61556: 57396,\n\t61557: 57397,\n\t61558: 57398,\n\t61559: 57399,\n\t61560: 57400,\n\t61561: 57401,\n\t61562: 57402,\n\t61563: 57403,\n\t61564: 57404,\n\t61565: 57405,\n\t61566: 57406,\n\t61568: 57407,\n\t61569: 57408,\n\t61570: 57409,\n\t61571: 57410,\n\t61572: 57411,\n\t61573: 57412,\n\t61574: 57413,\n\t61575: 57414,\n\t61576: 57415,\n\t61577: 57416,\n\t61578: 57417,\n\t61579: 57418,\n\t61580: 57419,\n\t61581: 57420,\n\t61582: 57421,\n\t61583: 57422,\n\t61584: 57423,\n\t61585: 57424,\n\t61586: 57425,\n\t61587: 57426,\n\t61588: 57427,\n\t61589: 57428,\n\t61590: 57429,\n\t61591: 57430,\n\t61592: 57431,\n\t61593: 57432,\n\t61594: 57433,\n\t61595: 57434,\n\t61596: 57435,\n\t61597: 57436,\n\t61598: 57437,\n\t61599: 57438,\n\t61600: 57439,\n\t61601: 57440,\n\t61602: 57441,\n\t61603: 57442,\n\t61604: 57443,\n\t61605: 57444,\n\t61606: 57445,\n\t61607: 57446,\n\t61608: 57447,\n\t61609: 57448,\n\t61610: 57449,\n\t61611: 57450,\n\t61612: 57451,\n\t61613: 57452,\n\t61614: 57453,\n\t61615: 57454,\n\t61616: 57455,\n\t61617: 57456,\n\t61618: 57457,\n\t61619: 57458,\n\t61620: 57459,\n\t61621: 57460,\n\t61622: 57461,\n\t61623: 57462,\n\t61624: 57463,\n\t61625: 57464,\n\t61626: 57465,\n\t61627: 57466,\n\t61628: 57467,\n\t61629: 57468,\n\t61630: 57469,\n\t61631: 57470,\n\t61632: 57471,\n\t61633: 57472,\n\t61634: 57473,\n\t61635: 57474,\n\t61636: 57475,\n\t61637: 57476,\n\t61638: 57477,\n\t61639: 57478,\n\t61640: 57479,\n\t61641: 57480,\n\t61642: 57481,\n\t61643: 57482,\n\t61644: 57483,\n\t61645: 57484,\n\t61646: 57485,\n\t61647: 57486,\n\t61648: 57487,\n\t61649: 57488,\n\t61650: 57489,\n\t61651: 57490,\n\t61652: 57491,\n\t61653: 57492,\n\t61654: 57493,\n\t61655: 57494,\n\t61656: 57495,\n\t61657: 57496,\n\t61658: 57497,\n\t61659: 57498,\n\t61660: 57499,\n\t61661: 57500,\n\t61662: 57501,\n\t61663: 57502,\n\t61664: 57503,\n\t61665: 57504,\n\t61666: 57505,\n\t61667: 57506,\n\t61668: 57507,\n\t61669: 57508,\n\t61670: 57509,\n\t61671: 57510,\n\t61672: 57511,\n\t61673: 57512,\n\t61674: 57513,\n\t61675: 57514,\n\t61676: 57515,\n\t61677: 57516,\n\t61678: 57517,\n\t61679: 57518,\n\t61680: 57519,\n\t61681: 57520,\n\t61682: 57521,\n\t61683: 57522,\n\t61684: 57523,\n\t61685: 57524,\n\t61686: 57525,\n\t61687: 57526,\n\t61688: 57527,\n\t61689: 57528,\n\t61690: 57529,\n\t61691: 57530,\n\t61692: 57531,\n\t61760: 57532,\n\t61761: 57533,\n\t61762: 57534,\n\t61763: 57535,\n\t61764: 57536,\n\t61765: 57537,\n\t61766: 57538,\n\t61767: 57539,\n\t61768: 57540,\n\t61769: 57541,\n\t61770: 57542,\n\t61771: 57543,\n\t61772: 57544,\n\t61773: 57545,\n\t61774: 57546,\n\t61775: 57547,\n\t61776: 57548,\n\t61777: 57549,\n\t61778: 57550,\n\t61779: 57551,\n\t61780: 57552,\n\t61781: 57553,\n\t61782: 57554,\n\t61783: 57555,\n\t61784: 57556,\n\t61785: 57557,\n\t61786: 57558,\n\t61787: 57559,\n\t61788: 57560,\n\t61789: 57561,\n\t61790: 57562,\n\t61791: 57563,\n\t61792: 57564,\n\t61793: 57565,\n\t61794: 57566,\n\t61795: 57567,\n\t61796: 57568,\n\t61797: 57569,\n\t61798: 57570,\n\t61799: 57571,\n\t61800: 57572,\n\t61801: 57573,\n\t61802: 57574,\n\t61803: 57575,\n\t61804: 57576,\n\t61805: 57577,\n\t61806: 57578,\n\t61807: 57579,\n\t61808: 57580,\n\t61809: 57581,\n\t61810: 57582,\n\t61811: 57583,\n\t61812: 57584,\n\t61813: 57585,\n\t61814: 57586,\n\t61815: 57587,\n\t61816: 57588,\n\t61817: 57589,\n\t61818: 57590,\n\t61819: 57591,\n\t61820: 57592,\n\t61821: 57593,\n\t61822: 57594,\n\t61824: 57595,\n\t61825: 57596,\n\t61826: 57597,\n\t61827: 57598,\n\t61828: 57599,\n\t61829: 57600,\n\t61830: 57601,\n\t61831: 57602,\n\t61832: 57603,\n\t61833: 57604,\n\t61834: 57605,\n\t61835: 57606,\n\t61836: 57607,\n\t61837: 57608,\n\t61838: 57609,\n\t61839: 57610,\n\t61840: 57611,\n\t61841: 57612,\n\t61842: 57613,\n\t61843: 57614,\n\t61844: 57615,\n\t61845: 57616,\n\t61846: 57617,\n\t61847: 57618,\n\t61848: 57619,\n\t61849: 57620,\n\t61850: 57621,\n\t61851: 57622,\n\t61852: 57623,\n\t61853: 57624,\n\t61854: 57625,\n\t61855: 57626,\n\t61856: 57627,\n\t61857: 57628,\n\t61858: 57629,\n\t61859: 57630,\n\t61860: 57631,\n\t61861: 57632,\n\t61862: 57633,\n\t61863: 57634,\n\t61864: 57635,\n\t61865: 57636,\n\t61866: 57637,\n\t61867: 57638,\n\t61868: 57639,\n\t61869: 57640,\n\t61870: 57641,\n\t61871: 57642,\n\t61872: 57643,\n\t61873: 57644,\n\t61874: 57645,\n\t61875: 57646,\n\t61876: 57647,\n\t61877: 57648,\n\t61878: 57649,\n\t61879: 57650,\n\t61880: 57651,\n\t61881: 57652,\n\t61882: 57653,\n\t61883: 57654,\n\t61884: 57655,\n\t61885: 57656,\n\t61886: 57657,\n\t61887: 57658,\n\t61888: 57659,\n\t61889: 57660,\n\t61890: 57661,\n\t61891: 57662,\n\t61892: 57663,\n\t61893: 57664,\n\t61894: 57665,\n\t61895: 57666,\n\t61896: 57667,\n\t61897: 57668,\n\t61898: 57669,\n\t61899: 57670,\n\t61900: 57671,\n\t61901: 57672,\n\t61902: 57673,\n\t61903: 57674,\n\t61904: 57675,\n\t61905: 57676,\n\t61906: 57677,\n\t61907: 57678,\n\t61908: 57679,\n\t61909: 57680,\n\t61910: 57681,\n\t61911: 57682,\n\t61912: 57683,\n\t61913: 57684,\n\t61914: 57685,\n\t61915: 57686,\n\t61916: 57687,\n\t61917: 57688,\n\t61918: 57689,\n\t61919: 57690,\n\t61920: 57691,\n\t61921: 57692,\n\t61922: 57693,\n\t61923: 57694,\n\t61924: 57695,\n\t61925: 57696,\n\t61926: 57697,\n\t61927: 57698,\n\t61928: 57699,\n\t61929: 57700,\n\t61930: 57701,\n\t61931: 57702,\n\t61932: 57703,\n\t61933: 57704,\n\t61934: 57705,\n\t61935: 57706,\n\t61936: 57707,\n\t61937: 57708,\n\t61938: 57709,\n\t61939: 57710,\n\t61940: 57711,\n\t61941: 57712,\n\t61942: 57713,\n\t61943: 57714,\n\t61944: 57715,\n\t61945: 57716,\n\t61946: 57717,\n\t61947: 57718,\n\t61948: 57719,\n\t62016: 57720,\n\t62017: 57721,\n\t62018: 57722,\n\t62019: 57723,\n\t62020: 57724,\n\t62021: 57725,\n\t62022: 57726,\n\t62023: 57727,\n\t62024: 57728,\n\t62025: 57729,\n\t62026: 57730,\n\t62027: 57731,\n\t62028: 57732,\n\t62029: 57733,\n\t62030: 57734,\n\t62031: 57735,\n\t62032: 57736,\n\t62033: 57737,\n\t62034: 57738,\n\t62035: 57739,\n\t62036: 57740,\n\t62037: 57741,\n\t62038: 57742,\n\t62039: 57743,\n\t62040: 57744,\n\t62041: 57745,\n\t62042: 57746,\n\t62043: 57747,\n\t62044: 57748,\n\t62045: 57749,\n\t62046: 57750,\n\t62047: 57751,\n\t62048: 57752,\n\t62049: 57753,\n\t62050: 57754,\n\t62051: 57755,\n\t62052: 57756,\n\t62053: 57757,\n\t62054: 57758,\n\t62055: 57759,\n\t62056: 57760,\n\t62057: 57761,\n\t62058: 57762,\n\t62059: 57763,\n\t62060: 57764,\n\t62061: 57765,\n\t62062: 57766,\n\t62063: 57767,\n\t62064: 57768,\n\t62065: 57769,\n\t62066: 57770,\n\t62067: 57771,\n\t62068: 57772,\n\t62069: 57773,\n\t62070: 57774,\n\t62071: 57775,\n\t62072: 57776,\n\t62073: 57777,\n\t62074: 57778,\n\t62075: 57779,\n\t62076: 57780,\n\t62077: 57781,\n\t62078: 57782,\n\t62080: 57783,\n\t62081: 57784,\n\t62082: 57785,\n\t62083: 57786,\n\t62084: 57787,\n\t62085: 57788,\n\t62086: 57789,\n\t62087: 57790,\n\t62088: 57791,\n\t62089: 57792,\n\t62090: 57793,\n\t62091: 57794,\n\t62092: 57795,\n\t62093: 57796,\n\t62094: 57797,\n\t62095: 57798,\n\t62096: 57799,\n\t62097: 57800,\n\t62098: 57801,\n\t62099: 57802,\n\t62100: 57803,\n\t62101: 57804,\n\t62102: 57805,\n\t62103: 57806,\n\t62104: 57807,\n\t62105: 57808,\n\t62106: 57809,\n\t62107: 57810,\n\t62108: 57811,\n\t62109: 57812,\n\t62110: 57813,\n\t62111: 57814,\n\t62112: 57815,\n\t62113: 57816,\n\t62114: 57817,\n\t62115: 57818,\n\t62116: 57819,\n\t62117: 57820,\n\t62118: 57821,\n\t62119: 57822,\n\t62120: 57823,\n\t62121: 57824,\n\t62122: 57825,\n\t62123: 57826,\n\t62124: 57827,\n\t62125: 57828,\n\t62126: 57829,\n\t62127: 57830,\n\t62128: 57831,\n\t62129: 57832,\n\t62130: 57833,\n\t62131: 57834,\n\t62132: 57835,\n\t62133: 57836,\n\t62134: 57837,\n\t62135: 57838,\n\t62136: 57839,\n\t62137: 57840,\n\t62138: 57841,\n\t62139: 57842,\n\t62140: 57843,\n\t62141: 57844,\n\t62142: 57845,\n\t62143: 57846,\n\t62144: 57847,\n\t62145: 57848,\n\t62146: 57849,\n\t62147: 57850,\n\t62148: 57851,\n\t62149: 57852,\n\t62150: 57853,\n\t62151: 57854,\n\t62152: 57855,\n\t62153: 57856,\n\t62154: 57857,\n\t62155: 57858,\n\t62156: 57859,\n\t62157: 57860,\n\t62158: 57861,\n\t62159: 57862,\n\t62160: 57863,\n\t62161: 57864,\n\t62162: 57865,\n\t62163: 57866,\n\t62164: 57867,\n\t62165: 57868,\n\t62166: 57869,\n\t62167: 57870,\n\t62168: 57871,\n\t62169: 57872,\n\t62170: 57873,\n\t62171: 57874,\n\t62172: 57875,\n\t62173: 57876,\n\t62174: 57877,\n\t62175: 57878,\n\t62176: 57879,\n\t62177: 57880,\n\t62178: 57881,\n\t62179: 57882,\n\t62180: 57883,\n\t62181: 57884,\n\t62182: 57885,\n\t62183: 57886,\n\t62184: 57887,\n\t62185: 57888,\n\t62186: 57889,\n\t62187: 57890,\n\t62188: 57891,\n\t62189: 57892,\n\t62190: 57893,\n\t62191: 57894,\n\t62192: 57895,\n\t62193: 57896,\n\t62194: 57897,\n\t62195: 57898,\n\t62196: 57899,\n\t62197: 57900,\n\t62198: 57901,\n\t62199: 57902,\n\t62200: 57903,\n\t62201: 57904,\n\t62202: 57905,\n\t62203: 57906,\n\t62204: 57907,\n\t62272: 57908,\n\t62273: 57909,\n\t62274: 57910,\n\t62275: 57911,\n\t62276: 57912,\n\t62277: 57913,\n\t62278: 57914,\n\t62279: 57915,\n\t62280: 57916,\n\t62281: 57917,\n\t62282: 57918,\n\t62283: 57919,\n\t62284: 57920,\n\t62285: 57921,\n\t62286: 57922,\n\t62287: 57923,\n\t62288: 57924,\n\t62289: 57925,\n\t62290: 57926,\n\t62291: 57927,\n\t62292: 57928,\n\t62293: 57929,\n\t62294: 57930,\n\t62295: 57931,\n\t62296: 57932,\n\t62297: 57933,\n\t62298: 57934,\n\t62299: 57935,\n\t62300: 57936,\n\t62301: 57937,\n\t62302: 57938,\n\t62303: 57939,\n\t62304: 57940,\n\t62305: 57941,\n\t62306: 57942,\n\t62307: 57943,\n\t62308: 57944,\n\t62309: 57945,\n\t62310: 57946,\n\t62311: 57947,\n\t62312: 57948,\n\t62313: 57949,\n\t62314: 57950,\n\t62315: 57951,\n\t62316: 57952,\n\t62317: 57953,\n\t62318: 57954,\n\t62319: 57955,\n\t62320: 57956,\n\t62321: 57957,\n\t62322: 57958,\n\t62323: 57959,\n\t62324: 57960,\n\t62325: 57961,\n\t62326: 57962,\n\t62327: 57963,\n\t62328: 57964,\n\t62329: 57965,\n\t62330: 57966,\n\t62331: 57967,\n\t62332: 57968,\n\t62333: 57969,\n\t62334: 57970,\n\t62336: 57971,\n\t62337: 57972,\n\t62338: 57973,\n\t62339: 57974,\n\t62340: 57975,\n\t62341: 57976,\n\t62342: 57977,\n\t62343: 57978,\n\t62344: 57979,\n\t62345: 57980,\n\t62346: 57981,\n\t62347: 57982,\n\t62348: 57983,\n\t62349: 57984,\n\t62350: 57985,\n\t62351: 57986,\n\t62352: 57987,\n\t62353: 57988,\n\t62354: 57989,\n\t62355: 57990,\n\t62356: 57991,\n\t62357: 57992,\n\t62358: 57993,\n\t62359: 57994,\n\t62360: 57995,\n\t62361: 57996,\n\t62362: 57997,\n\t62363: 57998,\n\t62364: 57999,\n\t62365: 58000,\n\t62366: 58001,\n\t62367: 58002,\n\t62368: 58003,\n\t62369: 58004,\n\t62370: 58005,\n\t62371: 58006,\n\t62372: 58007,\n\t62373: 58008,\n\t62374: 58009,\n\t62375: 58010,\n\t62376: 58011,\n\t62377: 58012,\n\t62378: 58013,\n\t62379: 58014,\n\t62380: 58015,\n\t62381: 58016,\n\t62382: 58017,\n\t62383: 58018,\n\t62384: 58019,\n\t62385: 58020,\n\t62386: 58021,\n\t62387: 58022,\n\t62388: 58023,\n\t62389: 58024,\n\t62390: 58025,\n\t62391: 58026,\n\t62392: 58027,\n\t62393: 58028,\n\t62394: 58029,\n\t62395: 58030,\n\t62396: 58031,\n\t62397: 58032,\n\t62398: 58033,\n\t62399: 58034,\n\t62400: 58035,\n\t62401: 58036,\n\t62402: 58037,\n\t62403: 58038,\n\t62404: 58039,\n\t62405: 58040,\n\t62406: 58041,\n\t62407: 58042,\n\t62408: 58043,\n\t62409: 58044,\n\t62410: 58045,\n\t62411: 58046,\n\t62412: 58047,\n\t62413: 58048,\n\t62414: 58049,\n\t62415: 58050,\n\t62416: 58051,\n\t62417: 58052,\n\t62418: 58053,\n\t62419: 58054,\n\t62420: 58055,\n\t62421: 58056,\n\t62422: 58057,\n\t62423: 58058,\n\t62424: 58059,\n\t62425: 58060,\n\t62426: 58061,\n\t62427: 58062,\n\t62428: 58063,\n\t62429: 58064,\n\t62430: 58065,\n\t62431: 58066,\n\t62432: 58067,\n\t62433: 58068,\n\t62434: 58069,\n\t62435: 58070,\n\t62436: 58071,\n\t62437: 58072,\n\t62438: 58073,\n\t62439: 58074,\n\t62440: 58075,\n\t62441: 58076,\n\t62442: 58077,\n\t62443: 58078,\n\t62444: 58079,\n\t62445: 58080,\n\t62446: 58081,\n\t62447: 58082,\n\t62448: 58083,\n\t62449: 58084,\n\t62450: 58085,\n\t62451: 58086,\n\t62452: 58087,\n\t62453: 58088,\n\t62454: 58089,\n\t62455: 58090,\n\t62456: 58091,\n\t62457: 58092,\n\t62458: 58093,\n\t62459: 58094,\n\t62460: 58095,\n\t62528: 58096,\n\t62529: 58097,\n\t62530: 58098,\n\t62531: 58099,\n\t62532: 58100,\n\t62533: 58101,\n\t62534: 58102,\n\t62535: 58103,\n\t62536: 58104,\n\t62537: 58105,\n\t62538: 58106,\n\t62539: 58107,\n\t62540: 58108,\n\t62541: 58109,\n\t62542: 58110,\n\t62543: 58111,\n\t62544: 58112,\n\t62545: 58113,\n\t62546: 58114,\n\t62547: 58115,\n\t62548: 58116,\n\t62549: 58117,\n\t62550: 58118,\n\t62551: 58119,\n\t62552: 58120,\n\t62553: 58121,\n\t62554: 58122,\n\t62555: 58123,\n\t62556: 58124,\n\t62557: 58125,\n\t62558: 58126,\n\t62559: 58127,\n\t62560: 58128,\n\t62561: 58129,\n\t62562: 58130,\n\t62563: 58131,\n\t62564: 58132,\n\t62565: 58133,\n\t62566: 58134,\n\t62567: 58135,\n\t62568: 58136,\n\t62569: 58137,\n\t62570: 58138,\n\t62571: 58139,\n\t62572: 58140,\n\t62573: 58141,\n\t62574: 58142,\n\t62575: 58143,\n\t62576: 58144,\n\t62577: 58145,\n\t62578: 58146,\n\t62579: 58147,\n\t62580: 58148,\n\t62581: 58149,\n\t62582: 58150,\n\t62583: 58151,\n\t62584: 58152,\n\t62585: 58153,\n\t62586: 58154,\n\t62587: 58155,\n\t62588: 58156,\n\t62589: 58157,\n\t62590: 58158,\n\t62592: 58159,\n\t62593: 58160,\n\t62594: 58161,\n\t62595: 58162,\n\t62596: 58163,\n\t62597: 58164,\n\t62598: 58165,\n\t62599: 58166,\n\t62600: 58167,\n\t62601: 58168,\n\t62602: 58169,\n\t62603: 58170,\n\t62604: 58171,\n\t62605: 58172,\n\t62606: 58173,\n\t62607: 58174,\n\t62608: 58175,\n\t62609: 58176,\n\t62610: 58177,\n\t62611: 58178,\n\t62612: 58179,\n\t62613: 58180,\n\t62614: 58181,\n\t62615: 58182,\n\t62616: 58183,\n\t62617: 58184,\n\t62618: 58185,\n\t62619: 58186,\n\t62620: 58187,\n\t62621: 58188,\n\t62622: 58189,\n\t62623: 58190,\n\t62624: 58191,\n\t62625: 58192,\n\t62626: 58193,\n\t62627: 58194,\n\t62628: 58195,\n\t62629: 58196,\n\t62630: 58197,\n\t62631: 58198,\n\t62632: 58199,\n\t62633: 58200,\n\t62634: 58201,\n\t62635: 58202,\n\t62636: 58203,\n\t62637: 58204,\n\t62638: 58205,\n\t62639: 58206,\n\t62640: 58207,\n\t62641: 58208,\n\t62642: 58209,\n\t62643: 58210,\n\t62644: 58211,\n\t62645: 58212,\n\t62646: 58213,\n\t62647: 58214,\n\t62648: 58215,\n\t62649: 58216,\n\t62650: 58217,\n\t62651: 58218,\n\t62652: 58219,\n\t62653: 58220,\n\t62654: 58221,\n\t62655: 58222,\n\t62656: 58223,\n\t62657: 58224,\n\t62658: 58225,\n\t62659: 58226,\n\t62660: 58227,\n\t62661: 58228,\n\t62662: 58229,\n\t62663: 58230,\n\t62664: 58231,\n\t62665: 58232,\n\t62666: 58233,\n\t62667: 58234,\n\t62668: 58235,\n\t62669: 58236,\n\t62670: 58237,\n\t62671: 58238,\n\t62672: 58239,\n\t62673: 58240,\n\t62674: 58241,\n\t62675: 58242,\n\t62676: 58243,\n\t62677: 58244,\n\t62678: 58245,\n\t62679: 58246,\n\t62680: 58247,\n\t62681: 58248,\n\t62682: 58249,\n\t62683: 58250,\n\t62684: 58251,\n\t62685: 58252,\n\t62686: 58253,\n\t62687: 58254,\n\t62688: 58255,\n\t62689: 58256,\n\t62690: 58257,\n\t62691: 58258,\n\t62692: 58259,\n\t62693: 58260,\n\t62694: 58261,\n\t62695: 58262,\n\t62696: 58263,\n\t62697: 58264,\n\t62698: 58265,\n\t62699: 58266,\n\t62700: 58267,\n\t62701: 58268,\n\t62702: 58269,\n\t62703: 58270,\n\t62704: 58271,\n\t62705: 58272,\n\t62706: 58273,\n\t62707: 58274,\n\t62708: 58275,\n\t62709: 58276,\n\t62710: 58277,\n\t62711: 58278,\n\t62712: 58279,\n\t62713: 58280,\n\t62714: 58281,\n\t62715: 58282,\n\t62716: 58283,\n\t62784: 58284,\n\t62785: 58285,\n\t62786: 58286,\n\t62787: 58287,\n\t62788: 58288,\n\t62789: 58289,\n\t62790: 58290,\n\t62791: 58291,\n\t62792: 58292,\n\t62793: 58293,\n\t62794: 58294,\n\t62795: 58295,\n\t62796: 58296,\n\t62797: 58297,\n\t62798: 58298,\n\t62799: 58299,\n\t62800: 58300,\n\t62801: 58301,\n\t62802: 58302,\n\t62803: 58303,\n\t62804: 58304,\n\t62805: 58305,\n\t62806: 58306,\n\t62807: 58307,\n\t62808: 58308,\n\t62809: 58309,\n\t62810: 58310,\n\t62811: 58311,\n\t62812: 58312,\n\t62813: 58313,\n\t62814: 58314,\n\t62815: 58315,\n\t62816: 58316,\n\t62817: 58317,\n\t62818: 58318,\n\t62819: 58319,\n\t62820: 58320,\n\t62821: 58321,\n\t62822: 58322,\n\t62823: 58323,\n\t62824: 58324,\n\t62825: 58325,\n\t62826: 58326,\n\t62827: 58327,\n\t62828: 58328,\n\t62829: 58329,\n\t62830: 58330,\n\t62831: 58331,\n\t62832: 58332,\n\t62833: 58333,\n\t62834: 58334,\n\t62835: 58335,\n\t62836: 58336,\n\t62837: 58337,\n\t62838: 58338,\n\t62839: 58339,\n\t62840: 58340,\n\t62841: 58341,\n\t62842: 58342,\n\t62843: 58343,\n\t62844: 58344,\n\t62845: 58345,\n\t62846: 58346,\n\t62848: 58347,\n\t62849: 58348,\n\t62850: 58349,\n\t62851: 58350,\n\t62852: 58351,\n\t62853: 58352,\n\t62854: 58353,\n\t62855: 58354,\n\t62856: 58355,\n\t62857: 58356,\n\t62858: 58357,\n\t62859: 58358,\n\t62860: 58359,\n\t62861: 58360,\n\t62862: 58361,\n\t62863: 58362,\n\t62864: 58363,\n\t62865: 58364,\n\t62866: 58365,\n\t62867: 58366,\n\t62868: 58367,\n\t62869: 58368,\n\t62870: 58369,\n\t62871: 58370,\n\t62872: 58371,\n\t62873: 58372,\n\t62874: 58373,\n\t62875: 58374,\n\t62876: 58375,\n\t62877: 58376,\n\t62878: 58377,\n\t62879: 58378,\n\t62880: 58379,\n\t62881: 58380,\n\t62882: 58381,\n\t62883: 58382,\n\t62884: 58383,\n\t62885: 58384,\n\t62886: 58385,\n\t62887: 58386,\n\t62888: 58387,\n\t62889: 58388,\n\t62890: 58389,\n\t62891: 58390,\n\t62892: 58391,\n\t62893: 58392,\n\t62894: 58393,\n\t62895: 58394,\n\t62896: 58395,\n\t62897: 58396,\n\t62898: 58397,\n\t62899: 58398,\n\t62900: 58399,\n\t62901: 58400,\n\t62902: 58401,\n\t62903: 58402,\n\t62904: 58403,\n\t62905: 58404,\n\t62906: 58405,\n\t62907: 58406,\n\t62908: 58407,\n\t62909: 58408,\n\t62910: 58409,\n\t62911: 58410,\n\t62912: 58411,\n\t62913: 58412,\n\t62914: 58413,\n\t62915: 58414,\n\t62916: 58415,\n\t62917: 58416,\n\t62918: 58417,\n\t62919: 58418,\n\t62920: 58419,\n\t62921: 58420,\n\t62922: 58421,\n\t62923: 58422,\n\t62924: 58423,\n\t62925: 58424,\n\t62926: 58425,\n\t62927: 58426,\n\t62928: 58427,\n\t62929: 58428,\n\t62930: 58429,\n\t62931: 58430,\n\t62932: 58431,\n\t62933: 58432,\n\t62934: 58433,\n\t62935: 58434,\n\t62936: 58435,\n\t62937: 58436,\n\t62938: 58437,\n\t62939: 58438,\n\t62940: 58439,\n\t62941: 58440,\n\t62942: 58441,\n\t62943: 58442,\n\t62944: 58443,\n\t62945: 58444,\n\t62946: 58445,\n\t62947: 58446,\n\t62948: 58447,\n\t62949: 58448,\n\t62950: 58449,\n\t62951: 58450,\n\t62952: 58451,\n\t62953: 58452,\n\t62954: 58453,\n\t62955: 58454,\n\t62956: 58455,\n\t62957: 58456,\n\t62958: 58457,\n\t62959: 58458,\n\t62960: 58459,\n\t62961: 58460,\n\t62962: 58461,\n\t62963: 58462,\n\t62964: 58463,\n\t62965: 58464,\n\t62966: 58465,\n\t62967: 58466,\n\t62968: 58467,\n\t62969: 58468,\n\t62970: 58469,\n\t62971: 58470,\n\t62972: 58471,\n\t63040: 58472,\n\t63041: 58473,\n\t63042: 58474,\n\t63043: 58475,\n\t63044: 58476,\n\t63045: 58477,\n\t63046: 58478,\n\t63047: 58479,\n\t63048: 58480,\n\t63049: 58481,\n\t63050: 58482,\n\t63051: 58483,\n\t63052: 58484,\n\t63053: 58485,\n\t63054: 58486,\n\t63055: 58487,\n\t63056: 58488,\n\t63057: 58489,\n\t63058: 58490,\n\t63059: 58491,\n\t63060: 58492,\n\t63061: 58493,\n\t63062: 58494,\n\t63063: 58495,\n\t63064: 58496,\n\t63065: 58497,\n\t63066: 58498,\n\t63067: 58499,\n\t63068: 58500,\n\t63069: 58501,\n\t63070: 58502,\n\t63071: 58503,\n\t63072: 58504,\n\t63073: 58505,\n\t63074: 58506,\n\t63075: 58507,\n\t63076: 58508,\n\t63077: 58509,\n\t63078: 58510,\n\t63079: 58511,\n\t63080: 58512,\n\t63081: 58513,\n\t63082: 58514,\n\t63083: 58515,\n\t63084: 58516,\n\t63085: 58517,\n\t63086: 58518,\n\t63087: 58519,\n\t63088: 58520,\n\t63089: 58521,\n\t63090: 58522,\n\t63091: 58523,\n\t63092: 58524,\n\t63093: 58525,\n\t63094: 58526,\n\t63095: 58527,\n\t63096: 58528,\n\t63097: 58529,\n\t63098: 58530,\n\t63099: 58531,\n\t63100: 58532,\n\t63101: 58533,\n\t63102: 58534,\n\t63104: 58535,\n\t63105: 58536,\n\t63106: 58537,\n\t63107: 58538,\n\t63108: 58539,\n\t63109: 58540,\n\t63110: 58541,\n\t63111: 58542,\n\t63112: 58543,\n\t63113: 58544,\n\t63114: 58545,\n\t63115: 58546,\n\t63116: 58547,\n\t63117: 58548,\n\t63118: 58549,\n\t63119: 58550,\n\t63120: 58551,\n\t63121: 58552,\n\t63122: 58553,\n\t63123: 58554,\n\t63124: 58555,\n\t63125: 58556,\n\t63126: 58557,\n\t63127: 58558,\n\t63128: 58559,\n\t63129: 58560,\n\t63130: 58561,\n\t63131: 58562,\n\t63132: 58563,\n\t63133: 58564,\n\t63134: 58565,\n\t63135: 58566,\n\t63136: 58567,\n\t63137: 58568,\n\t63138: 58569,\n\t63139: 58570,\n\t63140: 58571,\n\t63141: 58572,\n\t63142: 58573,\n\t63143: 58574,\n\t63144: 58575,\n\t63145: 58576,\n\t63146: 58577,\n\t63147: 58578,\n\t63148: 58579,\n\t63149: 58580,\n\t63150: 58581,\n\t63151: 58582,\n\t63152: 58583,\n\t63153: 58584,\n\t63154: 58585,\n\t63155: 58586,\n\t63156: 58587,\n\t63157: 58588,\n\t63158: 58589,\n\t63159: 58590,\n\t63160: 58591,\n\t63161: 58592,\n\t63162: 58593,\n\t63163: 58594,\n\t63164: 58595,\n\t63165: 58596,\n\t63166: 58597,\n\t63167: 58598,\n\t63168: 58599,\n\t63169: 58600,\n\t63170: 58601,\n\t63171: 58602,\n\t63172: 58603,\n\t63173: 58604,\n\t63174: 58605,\n\t63175: 58606,\n\t63176: 58607,\n\t63177: 58608,\n\t63178: 58609,\n\t63179: 58610,\n\t63180: 58611,\n\t63181: 58612,\n\t63182: 58613,\n\t63183: 58614,\n\t63184: 58615,\n\t63185: 58616,\n\t63186: 58617,\n\t63187: 58618,\n\t63188: 58619,\n\t63189: 58620,\n\t63190: 58621,\n\t63191: 58622,\n\t63192: 58623,\n\t63193: 58624,\n\t63194: 58625,\n\t63195: 58626,\n\t63196: 58627,\n\t63197: 58628,\n\t63198: 58629,\n\t63199: 58630,\n\t63200: 58631,\n\t63201: 58632,\n\t63202: 58633,\n\t63203: 58634,\n\t63204: 58635,\n\t63205: 58636,\n\t63206: 58637,\n\t63207: 58638,\n\t63208: 58639,\n\t63209: 58640,\n\t63210: 58641,\n\t63211: 58642,\n\t63212: 58643,\n\t63213: 58644,\n\t63214: 58645,\n\t63215: 58646,\n\t63216: 58647,\n\t63217: 58648,\n\t63218: 58649,\n\t63219: 58650,\n\t63220: 58651,\n\t63221: 58652,\n\t63222: 58653,\n\t63223: 58654,\n\t63224: 58655,\n\t63225: 58656,\n\t63226: 58657,\n\t63227: 58658,\n\t63228: 58659,\n\t63296: 58660,\n\t63297: 58661,\n\t63298: 58662,\n\t63299: 58663,\n\t63300: 58664,\n\t63301: 58665,\n\t63302: 58666,\n\t63303: 58667,\n\t63304: 58668,\n\t63305: 58669,\n\t63306: 58670,\n\t63307: 58671,\n\t63308: 58672,\n\t63309: 58673,\n\t63310: 58674,\n\t63311: 58675,\n\t63312: 58676,\n\t63313: 58677,\n\t63314: 58678,\n\t63315: 58679,\n\t63316: 58680,\n\t63317: 58681,\n\t63318: 58682,\n\t63319: 58683,\n\t63320: 58684,\n\t63321: 58685,\n\t63322: 58686,\n\t63323: 58687,\n\t63324: 58688,\n\t63325: 58689,\n\t63326: 58690,\n\t63327: 58691,\n\t63328: 58692,\n\t63329: 58693,\n\t63330: 58694,\n\t63331: 58695,\n\t63332: 58696,\n\t63333: 58697,\n\t63334: 58698,\n\t63335: 58699,\n\t63336: 58700,\n\t63337: 58701,\n\t63338: 58702,\n\t63339: 58703,\n\t63340: 58704,\n\t63341: 58705,\n\t63342: 58706,\n\t63343: 58707,\n\t63344: 58708,\n\t63345: 58709,\n\t63346: 58710,\n\t63347: 58711,\n\t63348: 58712,\n\t63349: 58713,\n\t63350: 58714,\n\t63351: 58715,\n\t63352: 58716,\n\t63353: 58717,\n\t63354: 58718,\n\t63355: 58719,\n\t63356: 58720,\n\t63357: 58721,\n\t63358: 58722,\n\t63360: 58723,\n\t63361: 58724,\n\t63362: 58725,\n\t63363: 58726,\n\t63364: 58727,\n\t63365: 58728,\n\t63366: 58729,\n\t63367: 58730,\n\t63368: 58731,\n\t63369: 58732,\n\t63370: 58733,\n\t63371: 58734,\n\t63372: 58735,\n\t63373: 58736,\n\t63374: 58737,\n\t63375: 58738,\n\t63376: 58739,\n\t63377: 58740,\n\t63378: 58741,\n\t63379: 58742,\n\t63380: 58743,\n\t63381: 58744,\n\t63382: 58745,\n\t63383: 58746,\n\t63384: 58747,\n\t63385: 58748,\n\t63386: 58749,\n\t63387: 58750,\n\t63388: 58751,\n\t63389: 58752,\n\t63390: 58753,\n\t63391: 58754,\n\t63392: 58755,\n\t63393: 58756,\n\t63394: 58757,\n\t63395: 58758,\n\t63396: 58759,\n\t63397: 58760,\n\t63398: 58761,\n\t63399: 58762,\n\t63400: 58763,\n\t63401: 58764,\n\t63402: 58765,\n\t63403: 58766,\n\t63404: 58767,\n\t63405: 58768,\n\t63406: 58769,\n\t63407: 58770,\n\t63408: 58771,\n\t63409: 58772,\n\t63410: 58773,\n\t63411: 58774,\n\t63412: 58775,\n\t63413: 58776,\n\t63414: 58777,\n\t63415: 58778,\n\t63416: 58779,\n\t63417: 58780,\n\t63418: 58781,\n\t63419: 58782,\n\t63420: 58783,\n\t63421: 58784,\n\t63422: 58785,\n\t63423: 58786,\n\t63424: 58787,\n\t63425: 58788,\n\t63426: 58789,\n\t63427: 58790,\n\t63428: 58791,\n\t63429: 58792,\n\t63430: 58793,\n\t63431: 58794,\n\t63432: 58795,\n\t63433: 58796,\n\t63434: 58797,\n\t63435: 58798,\n\t63436: 58799,\n\t63437: 58800,\n\t63438: 58801,\n\t63439: 58802,\n\t63440: 58803,\n\t63441: 58804,\n\t63442: 58805,\n\t63443: 58806,\n\t63444: 58807,\n\t63445: 58808,\n\t63446: 58809,\n\t63447: 58810,\n\t63448: 58811,\n\t63449: 58812,\n\t63450: 58813,\n\t63451: 58814,\n\t63452: 58815,\n\t63453: 58816,\n\t63454: 58817,\n\t63455: 58818,\n\t63456: 58819,\n\t63457: 58820,\n\t63458: 58821,\n\t63459: 58822,\n\t63460: 58823,\n\t63461: 58824,\n\t63462: 58825,\n\t63463: 58826,\n\t63464: 58827,\n\t63465: 58828,\n\t63466: 58829,\n\t63467: 58830,\n\t63468: 58831,\n\t63469: 58832,\n\t63470: 58833,\n\t63471: 58834,\n\t63472: 58835,\n\t63473: 58836,\n\t63474: 58837,\n\t63475: 58838,\n\t63476: 58839,\n\t63477: 58840,\n\t63478: 58841,\n\t63479: 58842,\n\t63480: 58843,\n\t63481: 58844,\n\t63482: 58845,\n\t63483: 58846,\n\t63484: 58847,\n\t63552: 58848,\n\t63553: 58849,\n\t63554: 58850,\n\t63555: 58851,\n\t63556: 58852,\n\t63557: 58853,\n\t63558: 58854,\n\t63559: 58855,\n\t63560: 58856,\n\t63561: 58857,\n\t63562: 58858,\n\t63563: 58859,\n\t63564: 58860,\n\t63565: 58861,\n\t63566: 58862,\n\t63567: 58863,\n\t63568: 58864,\n\t63569: 58865,\n\t63570: 58866,\n\t63571: 58867,\n\t63572: 58868,\n\t63573: 58869,\n\t63574: 58870,\n\t63575: 58871,\n\t63576: 58872,\n\t63577: 58873,\n\t63578: 58874,\n\t63579: 58875,\n\t63580: 58876,\n\t63581: 58877,\n\t63582: 58878,\n\t63583: 58879,\n\t63584: 58880,\n\t63585: 58881,\n\t63586: 58882,\n\t63587: 58883,\n\t63588: 58884,\n\t63589: 58885,\n\t63590: 58886,\n\t63591: 58887,\n\t63592: 58888,\n\t63593: 58889,\n\t63594: 58890,\n\t63595: 58891,\n\t63596: 58892,\n\t63597: 58893,\n\t63598: 58894,\n\t63599: 58895,\n\t63600: 58896,\n\t63601: 58897,\n\t63602: 58898,\n\t63603: 58899,\n\t63604: 58900,\n\t63605: 58901,\n\t63606: 58902,\n\t63607: 58903,\n\t63608: 58904,\n\t63609: 58905,\n\t63610: 58906,\n\t63611: 58907,\n\t63612: 58908,\n\t63613: 58909,\n\t63614: 58910,\n\t63616: 58911,\n\t63617: 58912,\n\t63618: 58913,\n\t63619: 58914,\n\t63620: 58915,\n\t63621: 58916,\n\t63622: 58917,\n\t63623: 58918,\n\t63624: 58919,\n\t63625: 58920,\n\t63626: 58921,\n\t63627: 58922,\n\t63628: 58923,\n\t63629: 58924,\n\t63630: 58925,\n\t63631: 58926,\n\t63632: 58927,\n\t63633: 58928,\n\t63634: 58929,\n\t63635: 58930,\n\t63636: 58931,\n\t63637: 58932,\n\t63638: 58933,\n\t63639: 58934,\n\t63640: 58935,\n\t63641: 58936,\n\t63642: 58937,\n\t63643: 58938,\n\t63644: 58939,\n\t63645: 58940,\n\t63646: 58941,\n\t63647: 58942,\n\t63648: 58943,\n\t63649: 58944,\n\t63650: 58945,\n\t63651: 58946,\n\t63652: 58947,\n\t63653: 58948,\n\t63654: 58949,\n\t63655: 58950,\n\t63656: 58951,\n\t63657: 58952,\n\t63658: 58953,\n\t63659: 58954,\n\t63660: 58955,\n\t63661: 58956,\n\t63662: 58957,\n\t63663: 58958,\n\t63664: 58959,\n\t63665: 58960,\n\t63666: 58961,\n\t63667: 58962,\n\t63668: 58963,\n\t63669: 58964,\n\t63670: 58965,\n\t63671: 58966,\n\t63672: 58967,\n\t63673: 58968,\n\t63674: 58969,\n\t63675: 58970,\n\t63676: 58971,\n\t63677: 58972,\n\t63678: 58973,\n\t63679: 58974,\n\t63680: 58975,\n\t63681: 58976,\n\t63682: 58977,\n\t63683: 58978,\n\t63684: 58979,\n\t63685: 58980,\n\t63686: 58981,\n\t63687: 58982,\n\t63688: 58983,\n\t63689: 58984,\n\t63690: 58985,\n\t63691: 58986,\n\t63692: 58987,\n\t63693: 58988,\n\t63694: 58989,\n\t63695: 58990,\n\t63696: 58991,\n\t63697: 58992,\n\t63698: 58993,\n\t63699: 58994,\n\t63700: 58995,\n\t63701: 58996,\n\t63702: 58997,\n\t63703: 58998,\n\t63704: 58999,\n\t63705: 59000,\n\t63706: 59001,\n\t63707: 59002,\n\t63708: 59003,\n\t63709: 59004,\n\t63710: 59005,\n\t63711: 59006,\n\t63712: 59007,\n\t63713: 59008,\n\t63714: 59009,\n\t63715: 59010,\n\t63716: 59011,\n\t63717: 59012,\n\t63718: 59013,\n\t63719: 59014,\n\t63720: 59015,\n\t63721: 59016,\n\t63722: 59017,\n\t63723: 59018,\n\t63724: 59019,\n\t63725: 59020,\n\t63726: 59021,\n\t63727: 59022,\n\t63728: 59023,\n\t63729: 59024,\n\t63730: 59025,\n\t63731: 59026,\n\t63732: 59027,\n\t63733: 59028,\n\t63734: 59029,\n\t63735: 59030,\n\t63736: 59031,\n\t63737: 59032,\n\t63738: 59033,\n\t63739: 59034,\n\t63740: 59035,\n\t64064: 8560,\n\t64065: 8561,\n\t64066: 8562,\n\t64067: 8563,\n\t64068: 8564,\n\t64069: 8565,\n\t64070: 8566,\n\t64071: 8567,\n\t64072: 8568,\n\t64073: 8569,\n\t64074: 8544,\n\t64075: 8545,\n\t64076: 8546,\n\t64077: 8547,\n\t64078: 8548,\n\t64079: 8549,\n\t64080: 8550,\n\t64081: 8551,\n\t64082: 8552,\n\t64083: 8553,\n\t64084: 65506,\n\t64085: 65508,\n\t64086: 65287,\n\t64087: 65282,\n\t64088: 12849,\n\t64089: 8470,\n\t64090: 8481,\n\t64091: 8757,\n\t64092: 32394,\n\t64093: 35100,\n\t64094: 37704,\n\t64095: 37512,\n\t64096: 34012,\n\t64097: 20425,\n\t64098: 28859,\n\t64099: 26161,\n\t64100: 26824,\n\t64101: 37625,\n\t64102: 26363,\n\t64103: 24389,\n\t64104: 20008,\n\t64105: 20193,\n\t64106: 20220,\n\t64107: 20224,\n\t64108: 20227,\n\t64109: 20281,\n\t64110: 20310,\n\t64111: 20370,\n\t64112: 20362,\n\t64113: 20378,\n\t64114: 20372,\n\t64115: 20429,\n\t64116: 20544,\n\t64117: 20514,\n\t64118: 20479,\n\t64119: 20510,\n\t64120: 20550,\n\t64121: 20592,\n\t64122: 20546,\n\t64123: 20628,\n\t64124: 20724,\n\t64125: 20696,\n\t64126: 20810,\n\t64128: 20836,\n\t64129: 20893,\n\t64130: 20926,\n\t64131: 20972,\n\t64132: 21013,\n\t64133: 21148,\n\t64134: 21158,\n\t64135: 21184,\n\t64136: 21211,\n\t64137: 21248,\n\t64138: 21255,\n\t64139: 21284,\n\t64140: 21362,\n\t64141: 21395,\n\t64142: 21426,\n\t64143: 21469,\n\t64144: 64014,\n\t64145: 21660,\n\t64146: 21642,\n\t64147: 21673,\n\t64148: 21759,\n\t64149: 21894,\n\t64150: 22361,\n\t64151: 22373,\n\t64152: 22444,\n\t64153: 22472,\n\t64154: 22471,\n\t64155: 64015,\n\t64156: 64016,\n\t64157: 22686,\n\t64158: 22706,\n\t64159: 22795,\n\t64160: 22867,\n\t64161: 22875,\n\t64162: 22877,\n\t64163: 22883,\n\t64164: 22948,\n\t64165: 22970,\n\t64166: 23382,\n\t64167: 23488,\n\t64168: 29999,\n\t64169: 23512,\n\t64170: 23532,\n\t64171: 23582,\n\t64172: 23718,\n\t64173: 23738,\n\t64174: 23797,\n\t64175: 23847,\n\t64176: 23891,\n\t64177: 64017,\n\t64178: 23874,\n\t64179: 23917,\n\t64180: 23992,\n\t64181: 23993,\n\t64182: 24016,\n\t64183: 24353,\n\t64184: 24372,\n\t64185: 24423,\n\t64186: 24503,\n\t64187: 24542,\n\t64188: 24669,\n\t64189: 24709,\n\t64190: 24714,\n\t64191: 24798,\n\t64192: 24789,\n\t64193: 24864,\n\t64194: 24818,\n\t64195: 24849,\n\t64196: 24887,\n\t64197: 24880,\n\t64198: 24984,\n\t64199: 25107,\n\t64200: 25254,\n\t64201: 25589,\n\t64202: 25696,\n\t64203: 25757,\n\t64204: 25806,\n\t64205: 25934,\n\t64206: 26112,\n\t64207: 26133,\n\t64208: 26171,\n\t64209: 26121,\n\t64210: 26158,\n\t64211: 26142,\n\t64212: 26148,\n\t64213: 26213,\n\t64214: 26199,\n\t64215: 26201,\n\t64216: 64018,\n\t64217: 26227,\n\t64218: 26265,\n\t64219: 26272,\n\t64220: 26290,\n\t64221: 26303,\n\t64222: 26362,\n\t64223: 26382,\n\t64224: 63785,\n\t64225: 26470,\n\t64226: 26555,\n\t64227: 26706,\n\t64228: 26560,\n\t64229: 26625,\n\t64230: 26692,\n\t64231: 26831,\n\t64232: 64019,\n\t64233: 26984,\n\t64234: 64020,\n\t64235: 27032,\n\t64236: 27106,\n\t64237: 27184,\n\t64238: 27243,\n\t64239: 27206,\n\t64240: 27251,\n\t64241: 27262,\n\t64242: 27362,\n\t64243: 27364,\n\t64244: 27606,\n\t64245: 27711,\n\t64246: 27740,\n\t64247: 27782,\n\t64248: 27759,\n\t64249: 27866,\n\t64250: 27908,\n\t64251: 28039,\n\t64252: 28015,\n\t64320: 28054,\n\t64321: 28076,\n\t64322: 28111,\n\t64323: 28152,\n\t64324: 28146,\n\t64325: 28156,\n\t64326: 28217,\n\t64327: 28252,\n\t64328: 28199,\n\t64329: 28220,\n\t64330: 28351,\n\t64331: 28552,\n\t64332: 28597,\n\t64333: 28661,\n\t64334: 28677,\n\t64335: 28679,\n\t64336: 28712,\n\t64337: 28805,\n\t64338: 28843,\n\t64339: 28943,\n\t64340: 28932,\n\t64341: 29020,\n\t64342: 28998,\n\t64343: 28999,\n\t64344: 64021,\n\t64345: 29121,\n\t64346: 29182,\n\t64347: 29361,\n\t64348: 29374,\n\t64349: 29476,\n\t64350: 64022,\n\t64351: 29559,\n\t64352: 29629,\n\t64353: 29641,\n\t64354: 29654,\n\t64355: 29667,\n\t64356: 29650,\n\t64357: 29703,\n\t64358: 29685,\n\t64359: 29734,\n\t64360: 29738,\n\t64361: 29737,\n\t64362: 29742,\n\t64363: 29794,\n\t64364: 29833,\n\t64365: 29855,\n\t64366: 29953,\n\t64367: 30063,\n\t64368: 30338,\n\t64369: 30364,\n\t64370: 30366,\n\t64371: 30363,\n\t64372: 30374,\n\t64373: 64023,\n\t64374: 30534,\n\t64375: 21167,\n\t64376: 30753,\n\t64377: 30798,\n\t64378: 30820,\n\t64379: 30842,\n\t64380: 31024,\n\t64381: 64024,\n\t64382: 64025,\n\t64384: 64026,\n\t64385: 31124,\n\t64386: 64027,\n\t64387: 31131,\n\t64388: 31441,\n\t64389: 31463,\n\t64390: 64028,\n\t64391: 31467,\n\t64392: 31646,\n\t64393: 64029,\n\t64394: 32072,\n\t64395: 32092,\n\t64396: 32183,\n\t64397: 32160,\n\t64398: 32214,\n\t64399: 32338,\n\t64400: 32583,\n\t64401: 32673,\n\t64402: 64030,\n\t64403: 33537,\n\t64404: 33634,\n\t64405: 33663,\n\t64406: 33735,\n\t64407: 33782,\n\t64408: 33864,\n\t64409: 33972,\n\t64410: 34131,\n\t64411: 34137,\n\t64412: 34155,\n\t64413: 64031,\n\t64414: 34224,\n\t64415: 64032,\n\t64416: 64033,\n\t64417: 34823,\n\t64418: 35061,\n\t64419: 35346,\n\t64420: 35383,\n\t64421: 35449,\n\t64422: 35495,\n\t64423: 35518,\n\t64424: 35551,\n\t64425: 64034,\n\t64426: 35574,\n\t64427: 35667,\n\t64428: 35711,\n\t64429: 36080,\n\t64430: 36084,\n\t64431: 36114,\n\t64432: 36214,\n\t64433: 64035,\n\t64434: 36559,\n\t64435: 64036,\n\t64436: 64037,\n\t64437: 36967,\n\t64438: 37086,\n\t64439: 64038,\n\t64440: 37141,\n\t64441: 37159,\n\t64442: 37338,\n\t64443: 37335,\n\t64444: 37342,\n\t64445: 37357,\n\t64446: 37358,\n\t64447: 37348,\n\t64448: 37349,\n\t64449: 37382,\n\t64450: 37392,\n\t64451: 37386,\n\t64452: 37434,\n\t64453: 37440,\n\t64454: 37436,\n\t64455: 37454,\n\t64456: 37465,\n\t64457: 37457,\n\t64458: 37433,\n\t64459: 37479,\n\t64460: 37543,\n\t64461: 37495,\n\t64462: 37496,\n\t64463: 37607,\n\t64464: 37591,\n\t64465: 37593,\n\t64466: 37584,\n\t64467: 64039,\n\t64468: 37589,\n\t64469: 37600,\n\t64470: 37587,\n\t64471: 37669,\n\t64472: 37665,\n\t64473: 37627,\n\t64474: 64040,\n\t64475: 37662,\n\t64476: 37631,\n\t64477: 37661,\n\t64478: 37634,\n\t64479: 37744,\n\t64480: 37719,\n\t64481: 37796,\n\t64482: 37830,\n\t64483: 37854,\n\t64484: 37880,\n\t64485: 37937,\n\t64486: 37957,\n\t64487: 37960,\n\t64488: 38290,\n\t64489: 63964,\n\t64490: 64041,\n\t64491: 38557,\n\t64492: 38575,\n\t64493: 38707,\n\t64494: 38715,\n\t64495: 38723,\n\t64496: 38733,\n\t64497: 38735,\n\t64498: 38737,\n\t64499: 38741,\n\t64500: 38999,\n\t64501: 39013,\n\t64502: 64042,\n\t64503: 64043,\n\t64504: 39207,\n\t64505: 64044,\n\t64506: 39326,\n\t64507: 39502,\n\t64508: 39641,\n\t64576: 39644,\n\t64577: 39797,\n\t64578: 39794,\n\t64579: 39823,\n\t64580: 39857,\n\t64581: 39867,\n\t64582: 39936,\n\t64583: 40304,\n\t64584: 40299,\n\t64585: 64045,\n\t64586: 40473,\n\t64587: 40657\n};\n\n/**\n * @author takahiro / https://github.com/takahirox\n */\n\nfunction DataViewEx( buffer, littleEndian ) {\n\n\tthis.dv = new DataView( buffer );\n\tthis.offset = 0;\n\tthis.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;\n\tthis.encoder = new CharsetEncoder();\n\n}\n\nDataViewEx.prototype = {\n\n\tconstructor: DataViewEx,\n\n\tgetInt8: function () {\n\n\t\tvar value = this.dv.getInt8( this.offset );\n\t\tthis.offset += 1;\n\t\treturn value;\n\n\t},\n\n\tgetInt8Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt8() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetUint8: function () {\n\n\t\tvar value = this.dv.getUint8( this.offset );\n\t\tthis.offset += 1;\n\t\treturn value;\n\n\t},\n\n\tgetUint8Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getUint8() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\n\tgetInt16: function () {\n\n\t\tvar value = this.dv.getInt16( this.offset, this.littleEndian );\n\t\tthis.offset += 2;\n\t\treturn value;\n\n\t},\n\n\tgetInt16Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt16() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetUint16: function () {\n\n\t\tvar value = this.dv.getUint16( this.offset, this.littleEndian );\n\t\tthis.offset += 2;\n\t\treturn value;\n\n\t},\n\n\tgetUint16Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getUint16() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetInt32: function () {\n\n\t\tvar value = this.dv.getInt32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t},\n\n\tgetInt32Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetUint32: function () {\n\n\t\tvar value = this.dv.getUint32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t},\n\n\tgetUint32Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getUint32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetFloat32: function () {\n\n\t\tvar value = this.dv.getFloat32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t},\n\n\tgetFloat32Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetFloat64: function () {\n\n\t\tvar value = this.dv.getFloat64( this.offset, this.littleEndian );\n\t\tthis.offset += 8;\n\t\treturn value;\n\n\t},\n\n\tgetFloat64Array: function ( size ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetIndex: function ( type, isUnsigned ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 1:\n\t\t\t\treturn ( isUnsigned === true ) ? this.getUint8() : this.getInt8();\n\n\t\t\tcase 2:\n\t\t\t\treturn ( isUnsigned === true ) ? this.getUint16() : this.getInt16();\n\n\t\t\tcase 4:\n\t\t\t\treturn this.getInt32(); // No Uint32\n\n\t\t\tdefault:\n\t\t\t\tthrow 'unknown number type ' + type + ' exception.';\n\n\t\t}\n\n\t},\n\n\tgetIndexArray: function ( type, size, isUnsigned ) {\n\n\t\tvar a = [];\n\n\t\tfor ( var i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getIndex( type, isUnsigned ) );\n\n\t\t}\n\n\t\treturn a;\n\n\t},\n\n\tgetChars: function ( size ) {\n\n\t\tvar str = '';\n\n\t\twhile ( size > 0 ) {\n\n\t\t\tvar value = this.getUint8();\n\t\t\tsize --;\n\n\t\t\tif ( value === 0 ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tstr += String.fromCharCode( value );\n\n\t\t}\n\n\t\twhile ( size > 0 ) {\n\n\t\t\tthis.getUint8();\n\t\t\tsize --;\n\n\t\t}\n\n\t\treturn str;\n\n\t},\n\n\tgetSjisStringsAsUnicode: function ( size ) {\n\n\t\tvar a = [];\n\n\t\twhile ( size > 0 ) {\n\n\t\t\tvar value = this.getUint8();\n\t\t\tsize --;\n\n\t\t\tif ( value === 0 ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\ta.push( value );\n\n\t\t}\n\n\t\twhile ( size > 0 ) {\n\n\t\t\tthis.getUint8();\n\t\t\tsize --;\n\n\t\t}\n\n\t\treturn this.encoder.s2u( new Uint8Array( a ) );\n\n\t},\n\n\tgetUnicodeStrings: function ( size ) {\n\n\t\tvar str = '';\n\n\t\twhile ( size > 0 ) {\n\n\t\t\tvar value = this.getUint16();\n\t\t\tsize -= 2;\n\n\t\t\tif ( value === 0 ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tstr += String.fromCharCode( value );\n\n\t\t}\n\n\t\twhile ( size > 0 ) {\n\n\t\t\tthis.getUint8();\n\t\t\tsize --;\n\n\t\t}\n\n\t\treturn str;\n\n\t},\n\n\tgetTextBuffer: function () {\n\n\t\tvar size = this.getUint32();\n\t\treturn this.getUnicodeStrings( size );\n\n\t}\n\n};\n\n/**\n * @author takahiro / https://github.com/takahirox\n */\n\nfunction DataCreationHelper() {\n}\n\nDataCreationHelper.prototype = {\n\n\tconstructor: DataCreationHelper,\n\n\tleftToRightVector3: function ( v ) {\n\n\t\tv[ 2 ] = - v[ 2 ];\n\n\t},\n\n\tleftToRightQuaternion: function ( q ) {\n\n\t\tq[ 0 ] = - q[ 0 ];\n\t\tq[ 1 ] = - q[ 1 ];\n\n\t},\n\n\tleftToRightEuler: function ( r ) {\n\n\t\tr[ 0 ] = - r[ 0 ];\n\t\tr[ 1 ] = - r[ 1 ];\n\n\t},\n\n\tleftToRightIndexOrder: function ( p ) {\n\n\t\tvar tmp = p[ 2 ];\n\t\tp[ 2 ] = p[ 0 ];\n\t\tp[ 0 ] = tmp;\n\n\t},\n\n\tleftToRightVector3Range: function ( v1, v2 ) {\n\n\t\tvar tmp = - v2[ 2 ];\n\t\tv2[ 2 ] = - v1[ 2 ];\n\t\tv1[ 2 ] = tmp;\n\n\t},\n\n\tleftToRightEulerRange: function ( r1, r2 ) {\n\n\t\tvar tmp1 = - r2[ 0 ];\n\t\tvar tmp2 = - r2[ 1 ];\n\t\tr2[ 0 ] = - r1[ 0 ];\n\t\tr2[ 1 ] = - r1[ 1 ];\n\t\tr1[ 0 ] = tmp1;\n\t\tr1[ 1 ] = tmp2;\n\n\t}\n\n};\n\n/**\n * @author takahiro / https://github.com/takahirox\n */\n\nfunction Parser() {\n}\n\nParser.prototype.parsePmd = function ( buffer, leftToRight ) {\n\n\tvar pmd = {};\n\tvar dv = new DataViewEx( buffer );\n\n\tpmd.metadata = {};\n\tpmd.metadata.format = 'pmd';\n\tpmd.metadata.coordinateSystem = 'left';\n\n\tvar parseHeader = function () {\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.magic = dv.getChars( 3 );\n\n\t\tif ( metadata.magic !== 'Pmd' ) {\n\n\t\t\tthrow 'PMD file magic is not Pmd, but ' + metadata.magic;\n\n\t\t}\n\n\t\tmetadata.version = dv.getFloat32();\n\t\tmetadata.modelName = dv.getSjisStringsAsUnicode( 20 );\n\t\tmetadata.comment = dv.getSjisStringsAsUnicode( 256 );\n\n\t};\n\n\tvar parseVertices = function () {\n\n\t\tvar parseVertex = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.normal = dv.getFloat32Array( 3 );\n\t\t\tp.uv = dv.getFloat32Array( 2 );\n\t\t\tp.skinIndices = dv.getUint16Array( 2 );\n\t\t\tp.skinWeights = [ dv.getUint8() / 100 ];\n\t\t\tp.skinWeights.push( 1.0 - p.skinWeights[ 0 ] );\n\t\t\tp.edgeFlag = dv.getUint8();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.vertexCount = dv.getUint32();\n\n\t\tpmd.vertices = [];\n\n\t\tfor ( var i = 0; i < metadata.vertexCount; i ++ ) {\n\n\t\t\tpmd.vertices.push( parseVertex() );\n\n\t\t}\n\n\t};\n\n\tvar parseFaces = function () {\n\n\t\tvar parseFace = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.indices = dv.getUint16Array( 3 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.faceCount = dv.getUint32() / 3;\n\n\t\tpmd.faces = [];\n\n\t\tfor ( var i = 0; i < metadata.faceCount; i ++ ) {\n\n\t\t\tpmd.faces.push( parseFace() );\n\n\t\t}\n\n\t};\n\n\tvar parseMaterials = function () {\n\n\t\tvar parseMaterial = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.diffuse = dv.getFloat32Array( 4 );\n\t\t\tp.shininess = dv.getFloat32();\n\t\t\tp.specular = dv.getFloat32Array( 3 );\n\t\t\tp.ambient = dv.getFloat32Array( 3 );\n\t\t\tp.toonIndex = dv.getInt8();\n\t\t\tp.edgeFlag = dv.getUint8();\n\t\t\tp.faceCount = dv.getUint32() / 3;\n\t\t\tp.fileName = dv.getSjisStringsAsUnicode( 20 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.materialCount = dv.getUint32();\n\n\t\tpmd.materials = [];\n\n\t\tfor ( var i = 0; i < metadata.materialCount; i ++ ) {\n\n\t\t\tpmd.materials.push( parseMaterial() );\n\n\t\t}\n\n\t};\n\n\tvar parseBones = function () {\n\n\t\tvar parseBone = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 20 );\n\t\t\tp.parentIndex = dv.getInt16();\n\t\t\tp.tailIndex = dv.getInt16();\n\t\t\tp.type = dv.getUint8();\n\t\t\tp.ikIndex = dv.getInt16();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.boneCount = dv.getUint16();\n\n\t\tpmd.bones = [];\n\n\t\tfor ( var i = 0; i < metadata.boneCount; i ++ ) {\n\n\t\t\tpmd.bones.push( parseBone() );\n\n\t\t}\n\n\t};\n\n\tvar parseIks = function () {\n\n\t\tvar parseIk = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.target = dv.getUint16();\n\t\t\tp.effector = dv.getUint16();\n\t\t\tp.linkCount = dv.getUint8();\n\t\t\tp.iteration = dv.getUint16();\n\t\t\tp.maxAngle = dv.getFloat32();\n\n\t\t\tp.links = [];\n\t\t\tfor ( var i = 0; i < p.linkCount; i ++ ) {\n\n\t\t\t\tvar link = {};\n\t\t\t\tlink.index = dv.getUint16();\n\t\t\t\tp.links.push( link );\n\n\t\t\t}\n\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.ikCount = dv.getUint16();\n\n\t\tpmd.iks = [];\n\n\t\tfor ( var i = 0; i < metadata.ikCount; i ++ ) {\n\n\t\t\tpmd.iks.push( parseIk() );\n\n\t\t}\n\n\t};\n\n\tvar parseMorphs = function () {\n\n\t\tvar parseMorph = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 20 );\n\t\t\tp.elementCount = dv.getUint32();\n\t\t\tp.type = dv.getUint8();\n\n\t\t\tp.elements = [];\n\t\t\tfor ( var i = 0; i < p.elementCount; i ++ ) {\n\n\t\t\t\tp.elements.push( {\n\t\t\t\t\tindex: dv.getUint32(),\n\t\t\t\t\tposition: dv.getFloat32Array( 3 )\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.morphCount = dv.getUint16();\n\n\t\tpmd.morphs = [];\n\n\t\tfor ( var i = 0; i < metadata.morphCount; i ++ ) {\n\n\t\t\tpmd.morphs.push( parseMorph() );\n\n\t\t}\n\n\n\t};\n\n\tvar parseMorphFrames = function () {\n\n\t\tvar parseMorphFrame = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.index = dv.getUint16();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.morphFrameCount = dv.getUint8();\n\n\t\tpmd.morphFrames = [];\n\n\t\tfor ( var i = 0; i < metadata.morphFrameCount; i ++ ) {\n\n\t\t\tpmd.morphFrames.push( parseMorphFrame() );\n\n\t\t}\n\n\t};\n\n\tvar parseBoneFrameNames = function () {\n\n\t\tvar parseBoneFrameName = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 50 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.boneFrameNameCount = dv.getUint8();\n\n\t\tpmd.boneFrameNames = [];\n\n\t\tfor ( var i = 0; i < metadata.boneFrameNameCount; i ++ ) {\n\n\t\t\tpmd.boneFrameNames.push( parseBoneFrameName() );\n\n\t\t}\n\n\t};\n\n\tvar parseBoneFrames = function () {\n\n\t\tvar parseBoneFrame = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.boneIndex = dv.getInt16();\n\t\t\tp.frameIndex = dv.getUint8();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.boneFrameCount = dv.getUint32();\n\n\t\tpmd.boneFrames = [];\n\n\t\tfor ( var i = 0; i < metadata.boneFrameCount; i ++ ) {\n\n\t\t\tpmd.boneFrames.push( parseBoneFrame() );\n\n\t\t}\n\n\t};\n\n\tvar parseEnglishHeader = function () {\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.englishCompatibility = dv.getUint8();\n\n\t\tif ( metadata.englishCompatibility > 0 ) {\n\n\t\t\tmetadata.englishModelName = dv.getSjisStringsAsUnicode( 20 );\n\t\t\tmetadata.englishComment = dv.getSjisStringsAsUnicode( 256 );\n\n\t\t}\n\n\t};\n\n\tvar parseEnglishBoneNames = function () {\n\n\t\tvar parseEnglishBoneName = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 20 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\n\t\tif ( metadata.englishCompatibility === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tpmd.englishBoneNames = [];\n\n\t\tfor ( var i = 0; i < metadata.boneCount; i ++ ) {\n\n\t\t\tpmd.englishBoneNames.push( parseEnglishBoneName() );\n\n\t\t}\n\n\t};\n\n\tvar parseEnglishMorphNames = function () {\n\n\t\tvar parseEnglishMorphName = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 20 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\n\t\tif ( metadata.englishCompatibility === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tpmd.englishMorphNames = [];\n\n\t\tfor ( var i = 0; i < metadata.morphCount - 1; i ++ ) {\n\n\t\t\tpmd.englishMorphNames.push( parseEnglishMorphName() );\n\n\t\t}\n\n\t};\n\n\tvar parseEnglishBoneFrameNames = function () {\n\n\t\tvar parseEnglishBoneFrameName = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 50 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\n\t\tif ( metadata.englishCompatibility === 0 ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tpmd.englishBoneFrameNames = [];\n\n\t\tfor ( var i = 0; i < metadata.boneFrameNameCount; i ++ ) {\n\n\t\t\tpmd.englishBoneFrameNames.push( parseEnglishBoneFrameName() );\n\n\t\t}\n\n\t};\n\n\tvar parseToonTextures = function () {\n\n\t\tvar parseToonTexture = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.fileName = dv.getSjisStringsAsUnicode( 100 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tpmd.toonTextures = [];\n\n\t\tfor ( var i = 0; i < 10; i ++ ) {\n\n\t\t\tpmd.toonTextures.push( parseToonTexture() );\n\n\t\t}\n\n\t};\n\n\tvar parseRigidBodies = function () {\n\n\t\tvar parseRigidBody = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 20 );\n\t\t\tp.boneIndex = dv.getInt16();\n\t\t\tp.groupIndex = dv.getUint8();\n\t\t\tp.groupTarget = dv.getUint16();\n\t\t\tp.shapeType = dv.getUint8();\n\t\t\tp.width = dv.getFloat32();\n\t\t\tp.height = dv.getFloat32();\n\t\t\tp.depth = dv.getFloat32();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.rotation = dv.getFloat32Array( 3 );\n\t\t\tp.weight = dv.getFloat32();\n\t\t\tp.positionDamping = dv.getFloat32();\n\t\t\tp.rotationDamping = dv.getFloat32();\n\t\t\tp.restitution = dv.getFloat32();\n\t\t\tp.friction = dv.getFloat32();\n\t\t\tp.type = dv.getUint8();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.rigidBodyCount = dv.getUint32();\n\n\t\tpmd.rigidBodies = [];\n\n\t\tfor ( var i = 0; i < metadata.rigidBodyCount; i ++ ) {\n\n\t\t\tpmd.rigidBodies.push( parseRigidBody() );\n\n\t\t}\n\n\t};\n\n\tvar parseConstraints = function () {\n\n\t\tvar parseConstraint = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getSjisStringsAsUnicode( 20 );\n\t\t\tp.rigidBodyIndex1 = dv.getUint32();\n\t\t\tp.rigidBodyIndex2 = dv.getUint32();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.rotation = dv.getFloat32Array( 3 );\n\t\t\tp.translationLimitation1 = dv.getFloat32Array( 3 );\n\t\t\tp.translationLimitation2 = dv.getFloat32Array( 3 );\n\t\t\tp.rotationLimitation1 = dv.getFloat32Array( 3 );\n\t\t\tp.rotationLimitation2 = dv.getFloat32Array( 3 );\n\t\t\tp.springPosition = dv.getFloat32Array( 3 );\n\t\t\tp.springRotation = dv.getFloat32Array( 3 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmd.metadata;\n\t\tmetadata.constraintCount = dv.getUint32();\n\n\t\tpmd.constraints = [];\n\n\t\tfor ( var i = 0; i < metadata.constraintCount; i ++ ) {\n\n\t\t\tpmd.constraints.push( parseConstraint() );\n\n\t\t}\n\n\t};\n\n\tparseHeader();\n\tparseVertices();\n\tparseFaces();\n\tparseMaterials();\n\tparseBones();\n\tparseIks();\n\tparseMorphs();\n\tparseMorphFrames();\n\tparseBoneFrameNames();\n\tparseBoneFrames();\n\tparseEnglishHeader();\n\tparseEnglishBoneNames();\n\tparseEnglishMorphNames();\n\tparseEnglishBoneFrameNames();\n\tparseToonTextures();\n\tparseRigidBodies();\n\tparseConstraints();\n\n\tif ( leftToRight === true ) this.leftToRightModel( pmd );\n\n\t// console.log( pmd ); // for console debug\n\n\treturn pmd;\n\n};\n\nParser.prototype.parsePmx = function ( buffer, leftToRight ) {\n\n\tvar pmx = {};\n\tvar dv = new DataViewEx( buffer );\n\n\tpmx.metadata = {};\n\tpmx.metadata.format = 'pmx';\n\tpmx.metadata.coordinateSystem = 'left';\n\n\tvar parseHeader = function () {\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.magic = dv.getChars( 4 );\n\n\t\t// Note: don't remove the last blank space.\n\t\tif ( metadata.magic !== 'PMX ' ) {\n\n\t\t\tthrow 'PMX file magic is not PMX , but ' + metadata.magic;\n\n\t\t}\n\n\t\tmetadata.version = dv.getFloat32();\n\n\t\tif ( metadata.version !== 2.0 && metadata.version !== 2.1 ) {\n\n\t\t\tthrow 'PMX version ' + metadata.version + ' is not supported.';\n\n\t\t}\n\n\t\tmetadata.headerSize = dv.getUint8();\n\t\tmetadata.encoding = dv.getUint8();\n\t\tmetadata.additionalUvNum = dv.getUint8();\n\t\tmetadata.vertexIndexSize = dv.getUint8();\n\t\tmetadata.textureIndexSize = dv.getUint8();\n\t\tmetadata.materialIndexSize = dv.getUint8();\n\t\tmetadata.boneIndexSize = dv.getUint8();\n\t\tmetadata.morphIndexSize = dv.getUint8();\n\t\tmetadata.rigidBodyIndexSize = dv.getUint8();\n\t\tmetadata.modelName = dv.getTextBuffer();\n\t\tmetadata.englishModelName = dv.getTextBuffer();\n\t\tmetadata.comment = dv.getTextBuffer();\n\t\tmetadata.englishComment = dv.getTextBuffer();\n\n\t};\n\n\tvar parseVertices = function () {\n\n\t\tvar parseVertex = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.normal = dv.getFloat32Array( 3 );\n\t\t\tp.uv = dv.getFloat32Array( 2 );\n\n\t\t\tp.auvs = [];\n\n\t\t\tfor ( var i = 0; i < pmx.metadata.additionalUvNum; i ++ ) {\n\n\t\t\t\tp.auvs.push( dv.getFloat32Array( 4 ) );\n\n\t\t\t}\n\n\t\t\tp.type = dv.getUint8();\n\n\t\t\tvar indexSize = metadata.boneIndexSize;\n\n\t\t\tif ( p.type === 0 ) { // BDEF1\n\n\t\t\t\tp.skinIndices = dv.getIndexArray( indexSize, 1 );\n\t\t\t\tp.skinWeights = [ 1.0 ];\n\n\t\t\t} else if ( p.type === 1 ) { // BDEF2\n\n\t\t\t\tp.skinIndices = dv.getIndexArray( indexSize, 2 );\n\t\t\t\tp.skinWeights = dv.getFloat32Array( 1 );\n\t\t\t\tp.skinWeights.push( 1.0 - p.skinWeights[ 0 ] );\n\n\t\t\t} else if ( p.type === 2 ) { // BDEF4\n\n\t\t\t\tp.skinIndices = dv.getIndexArray( indexSize, 4 );\n\t\t\t\tp.skinWeights = dv.getFloat32Array( 4 );\n\n\t\t\t} else if ( p.type === 3 ) { // SDEF\n\n\t\t\t\tp.skinIndices = dv.getIndexArray( indexSize, 2 );\n\t\t\t\tp.skinWeights = dv.getFloat32Array( 1 );\n\t\t\t\tp.skinWeights.push( 1.0 - p.skinWeights[ 0 ] );\n\n\t\t\t\tp.skinC = dv.getFloat32Array( 3 );\n\t\t\t\tp.skinR0 = dv.getFloat32Array( 3 );\n\t\t\t\tp.skinR1 = dv.getFloat32Array( 3 );\n\n\t\t\t\t// SDEF is not supported yet and is handled as BDEF2 so far.\n\t\t\t\t// TODO: SDEF support\n\t\t\t\tp.type = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow 'unsupport bone type ' + p.type + ' exception.';\n\n\t\t\t}\n\n\t\t\tp.edgeRatio = dv.getFloat32();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.vertexCount = dv.getUint32();\n\n\t\tpmx.vertices = [];\n\n\t\tfor ( var i = 0; i < metadata.vertexCount; i ++ ) {\n\n\t\t\tpmx.vertices.push( parseVertex() );\n\n\t\t}\n\n\t};\n\n\tvar parseFaces = function () {\n\n\t\tvar parseFace = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.indices = dv.getIndexArray( metadata.vertexIndexSize, 3, true );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.faceCount = dv.getUint32() / 3;\n\n\t\tpmx.faces = [];\n\n\t\tfor ( var i = 0; i < metadata.faceCount; i ++ ) {\n\n\t\t\tpmx.faces.push( parseFace() );\n\n\t\t}\n\n\t};\n\n\tvar parseTextures = function () {\n\n\t\tvar parseTexture = function () {\n\n\t\t\treturn dv.getTextBuffer();\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.textureCount = dv.getUint32();\n\n\t\tpmx.textures = [];\n\n\t\tfor ( var i = 0; i < metadata.textureCount; i ++ ) {\n\n\t\t\tpmx.textures.push( parseTexture() );\n\n\t\t}\n\n\t};\n\n\tvar parseMaterials = function () {\n\n\t\tvar parseMaterial = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getTextBuffer();\n\t\t\tp.englishName = dv.getTextBuffer();\n\t\t\tp.diffuse = dv.getFloat32Array( 4 );\n\t\t\tp.specular = dv.getFloat32Array( 3 );\n\t\t\tp.shininess = dv.getFloat32();\n\t\t\tp.ambient = dv.getFloat32Array( 3 );\n\t\t\tp.flag = dv.getUint8();\n\t\t\tp.edgeColor = dv.getFloat32Array( 4 );\n\t\t\tp.edgeSize = dv.getFloat32();\n\t\t\tp.textureIndex = dv.getIndex( pmx.metadata.textureIndexSize );\n\t\t\tp.envTextureIndex = dv.getIndex( pmx.metadata.textureIndexSize );\n\t\t\tp.envFlag = dv.getUint8();\n\t\t\tp.toonFlag = dv.getUint8();\n\n\t\t\tif ( p.toonFlag === 0 ) {\n\n\t\t\t\tp.toonIndex = dv.getIndex( pmx.metadata.textureIndexSize );\n\n\t\t\t} else if ( p.toonFlag === 1 ) {\n\n\t\t\t\tp.toonIndex = dv.getInt8();\n\n\t\t\t} else {\n\n\t\t\t\tthrow 'unknown toon flag ' + p.toonFlag + ' exception.';\n\n\t\t\t}\n\n\t\t\tp.comment = dv.getTextBuffer();\n\t\t\tp.faceCount = dv.getUint32() / 3;\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.materialCount = dv.getUint32();\n\n\t\tpmx.materials = [];\n\n\t\tfor ( var i = 0; i < metadata.materialCount; i ++ ) {\n\n\t\t\tpmx.materials.push( parseMaterial() );\n\n\t\t}\n\n\t};\n\n\tvar parseBones = function () {\n\n\t\tvar parseBone = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getTextBuffer();\n\t\t\tp.englishName = dv.getTextBuffer();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.parentIndex = dv.getIndex( pmx.metadata.boneIndexSize );\n\t\t\tp.transformationClass = dv.getUint32();\n\t\t\tp.flag = dv.getUint16();\n\n\t\t\tif ( p.flag & 0x1 ) {\n\n\t\t\t\tp.connectIndex = dv.getIndex( pmx.metadata.boneIndexSize );\n\n\t\t\t} else {\n\n\t\t\t\tp.offsetPosition = dv.getFloat32Array( 3 );\n\n\t\t\t}\n\n\t\t\tif ( p.flag & 0x100 || p.flag & 0x200 ) {\n\n\t\t\t\t// Note: I don't think Grant is an appropriate name\n\t\t\t\t// but I found that some English translated MMD tools use this term\n\t\t\t\t// so I've named it Grant so far.\n\t\t\t\t// I'd rename to more appropriate name from Grant later.\n\t\t\t\tvar grant = {};\n\n\t\t\t\tgrant.isLocal = ( p.flag & 0x80 ) !== 0 ? true : false;\n\t\t\t\tgrant.affectRotation = ( p.flag & 0x100 ) !== 0 ? true : false;\n\t\t\t\tgrant.affectPosition = ( p.flag & 0x200 ) !== 0 ? true : false;\n\t\t\t\tgrant.parentIndex = dv.getIndex( pmx.metadata.boneIndexSize );\n\t\t\t\tgrant.ratio = dv.getFloat32();\n\n\t\t\t\tp.grant = grant;\n\n\t\t\t}\n\n\t\t\tif ( p.flag & 0x400 ) {\n\n\t\t\t\tp.fixAxis = dv.getFloat32Array( 3 );\n\n\t\t\t}\n\n\t\t\tif ( p.flag & 0x800 ) {\n\n\t\t\t\tp.localXVector = dv.getFloat32Array( 3 );\n\t\t\t\tp.localZVector = dv.getFloat32Array( 3 );\n\n\t\t\t}\n\n\t\t\tif ( p.flag & 0x2000 ) {\n\n\t\t\t\tp.key = dv.getUint32();\n\n\t\t\t}\n\n\t\t\tif ( p.flag & 0x20 ) {\n\n\t\t\t\tvar ik = {};\n\n\t\t\t\tik.effector = dv.getIndex( pmx.metadata.boneIndexSize );\n\t\t\t\tik.target = null;\n\t\t\t\tik.iteration = dv.getUint32();\n\t\t\t\tik.maxAngle = dv.getFloat32();\n\t\t\t\tik.linkCount = dv.getUint32();\n\t\t\t\tik.links = [];\n\n\t\t\t\tfor ( var i = 0; i < ik.linkCount; i ++ ) {\n\n\t\t\t\t\tvar link = {};\n\t\t\t\t\tlink.index = dv.getIndex( pmx.metadata.boneIndexSize );\n\t\t\t\t\tlink.angleLimitation = dv.getUint8();\n\n\t\t\t\t\tif ( link.angleLimitation === 1 ) {\n\n\t\t\t\t\t\tlink.lowerLimitationAngle = dv.getFloat32Array( 3 );\n\t\t\t\t\t\tlink.upperLimitationAngle = dv.getFloat32Array( 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tik.links.push( link );\n\n\t\t\t\t}\n\n\t\t\t\tp.ik = ik;\n\n\t\t\t}\n\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.boneCount = dv.getUint32();\n\n\t\tpmx.bones = [];\n\n\t\tfor ( var i = 0; i < metadata.boneCount; i ++ ) {\n\n\t\t\tpmx.bones.push( parseBone() );\n\n\t\t}\n\n\t};\n\n\tvar parseMorphs = function () {\n\n\t\tvar parseMorph = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getTextBuffer();\n\t\t\tp.englishName = dv.getTextBuffer();\n\t\t\tp.panel = dv.getUint8();\n\t\t\tp.type = dv.getUint8();\n\t\t\tp.elementCount = dv.getUint32();\n\t\t\tp.elements = [];\n\n\t\t\tfor ( var i = 0; i < p.elementCount; i ++ ) {\n\n\t\t\t\tif ( p.type === 0 ) { // group morph\n\n\t\t\t\t\tvar m = {};\n\t\t\t\t\tm.index = dv.getIndex( pmx.metadata.morphIndexSize );\n\t\t\t\t\tm.ratio = dv.getFloat32();\n\t\t\t\t\tp.elements.push( m );\n\n\t\t\t\t} else if ( p.type === 1 ) { // vertex morph\n\n\t\t\t\t\tvar m = {};\n\t\t\t\t\tm.index = dv.getIndex( pmx.metadata.vertexIndexSize, true );\n\t\t\t\t\tm.position = dv.getFloat32Array( 3 );\n\t\t\t\t\tp.elements.push( m );\n\n\t\t\t\t} else if ( p.type === 2 ) { // bone morph\n\n\t\t\t\t\tvar m = {};\n\t\t\t\t\tm.index = dv.getIndex( pmx.metadata.boneIndexSize );\n\t\t\t\t\tm.position = dv.getFloat32Array( 3 );\n\t\t\t\t\tm.rotation = dv.getFloat32Array( 4 );\n\t\t\t\t\tp.elements.push( m );\n\n\t\t\t\t} else if ( p.type === 3 ) { // uv morph\n\n\t\t\t\t\tvar m = {};\n\t\t\t\t\tm.index = dv.getIndex( pmx.metadata.vertexIndexSize, true );\n\t\t\t\t\tm.uv = dv.getFloat32Array( 4 );\n\t\t\t\t\tp.elements.push( m );\n\n\t\t\t\t} else if ( p.type === 4 ) { // additional uv1\n\n\t\t\t\t\t// TODO: implement\n\n\t\t\t\t} else if ( p.type === 5 ) { // additional uv2\n\n\t\t\t\t\t// TODO: implement\n\n\t\t\t\t} else if ( p.type === 6 ) { // additional uv3\n\n\t\t\t\t\t// TODO: implement\n\n\t\t\t\t} else if ( p.type === 7 ) { // additional uv4\n\n\t\t\t\t\t// TODO: implement\n\n\t\t\t\t} else if ( p.type === 8 ) { // material morph\n\n\t\t\t\t\tvar m = {};\n\t\t\t\t\tm.index = dv.getIndex( pmx.metadata.materialIndexSize );\n\t\t\t\t\tm.type = dv.getUint8();\n\t\t\t\t\tm.diffuse = dv.getFloat32Array( 4 );\n\t\t\t\t\tm.specular = dv.getFloat32Array( 3 );\n\t\t\t\t\tm.shininess = dv.getFloat32();\n\t\t\t\t\tm.ambient = dv.getFloat32Array( 3 );\n\t\t\t\t\tm.edgeColor = dv.getFloat32Array( 4 );\n\t\t\t\t\tm.edgeSize = dv.getFloat32();\n\t\t\t\t\tm.textureColor = dv.getFloat32Array( 4 );\n\t\t\t\t\tm.sphereTextureColor = dv.getFloat32Array( 4 );\n\t\t\t\t\tm.toonColor = dv.getFloat32Array( 4 );\n\t\t\t\t\tp.elements.push( m );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.morphCount = dv.getUint32();\n\n\t\tpmx.morphs = [];\n\n\t\tfor ( var i = 0; i < metadata.morphCount; i ++ ) {\n\n\t\t\tpmx.morphs.push( parseMorph() );\n\n\t\t}\n\n\t};\n\n\tvar parseFrames = function () {\n\n\t\tvar parseFrame = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getTextBuffer();\n\t\t\tp.englishName = dv.getTextBuffer();\n\t\t\tp.type = dv.getUint8();\n\t\t\tp.elementCount = dv.getUint32();\n\t\t\tp.elements = [];\n\n\t\t\tfor ( var i = 0; i < p.elementCount; i ++ ) {\n\n\t\t\t\tvar e = {};\n\t\t\t\te.target = dv.getUint8();\n\t\t\t\te.index = ( e.target === 0 ) ? dv.getIndex( pmx.metadata.boneIndexSize ) : dv.getIndex( pmx.metadata.morphIndexSize );\n\t\t\t\tp.elements.push( e );\n\n\t\t\t}\n\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.frameCount = dv.getUint32();\n\n\t\tpmx.frames = [];\n\n\t\tfor ( var i = 0; i < metadata.frameCount; i ++ ) {\n\n\t\t\tpmx.frames.push( parseFrame() );\n\n\t\t}\n\n\t};\n\n\tvar parseRigidBodies = function () {\n\n\t\tvar parseRigidBody = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getTextBuffer();\n\t\t\tp.englishName = dv.getTextBuffer();\n\t\t\tp.boneIndex = dv.getIndex( pmx.metadata.boneIndexSize );\n\t\t\tp.groupIndex = dv.getUint8();\n\t\t\tp.groupTarget = dv.getUint16();\n\t\t\tp.shapeType = dv.getUint8();\n\t\t\tp.width = dv.getFloat32();\n\t\t\tp.height = dv.getFloat32();\n\t\t\tp.depth = dv.getFloat32();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.rotation = dv.getFloat32Array( 3 );\n\t\t\tp.weight = dv.getFloat32();\n\t\t\tp.positionDamping = dv.getFloat32();\n\t\t\tp.rotationDamping = dv.getFloat32();\n\t\t\tp.restitution = dv.getFloat32();\n\t\t\tp.friction = dv.getFloat32();\n\t\t\tp.type = dv.getUint8();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.rigidBodyCount = dv.getUint32();\n\n\t\tpmx.rigidBodies = [];\n\n\t\tfor ( var i = 0; i < metadata.rigidBodyCount; i ++ ) {\n\n\t\t\tpmx.rigidBodies.push( parseRigidBody() );\n\n\t\t}\n\n\t};\n\n\tvar parseConstraints = function () {\n\n\t\tvar parseConstraint = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.name = dv.getTextBuffer();\n\t\t\tp.englishName = dv.getTextBuffer();\n\t\t\tp.type = dv.getUint8();\n\t\t\tp.rigidBodyIndex1 = dv.getIndex( pmx.metadata.rigidBodyIndexSize );\n\t\t\tp.rigidBodyIndex2 = dv.getIndex( pmx.metadata.rigidBodyIndexSize );\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.rotation = dv.getFloat32Array( 3 );\n\t\t\tp.translationLimitation1 = dv.getFloat32Array( 3 );\n\t\t\tp.translationLimitation2 = dv.getFloat32Array( 3 );\n\t\t\tp.rotationLimitation1 = dv.getFloat32Array( 3 );\n\t\t\tp.rotationLimitation2 = dv.getFloat32Array( 3 );\n\t\t\tp.springPosition = dv.getFloat32Array( 3 );\n\t\t\tp.springRotation = dv.getFloat32Array( 3 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = pmx.metadata;\n\t\tmetadata.constraintCount = dv.getUint32();\n\n\t\tpmx.constraints = [];\n\n\t\tfor ( var i = 0; i < metadata.constraintCount; i ++ ) {\n\n\t\t\tpmx.constraints.push( parseConstraint() );\n\n\t\t}\n\n\t};\n\n\tparseHeader();\n\tparseVertices();\n\tparseFaces();\n\tparseTextures();\n\tparseMaterials();\n\tparseBones();\n\tparseMorphs();\n\tparseFrames();\n\tparseRigidBodies();\n\tparseConstraints();\n\n\tif ( leftToRight === true ) this.leftToRightModel( pmx );\n\n\t// console.log( pmx ); // for console debug\n\n\treturn pmx;\n\n};\n\nParser.prototype.parseVmd = function ( buffer, leftToRight ) {\n\n\tvar vmd = {};\n\tvar dv = new DataViewEx( buffer );\n\n\tvmd.metadata = {};\n\tvmd.metadata.coordinateSystem = 'left';\n\n\tvar parseHeader = function () {\n\n\t\tvar metadata = vmd.metadata;\n\t\tmetadata.magic = dv.getChars( 30 );\n\n\t\tif ( metadata.magic !== 'Vocaloid Motion Data 0002' ) {\n\n\t\t\tthrow 'VMD file magic is not Vocaloid Motion Data 0002, but ' + metadata.magic;\n\n\t\t}\n\n\t\tmetadata.name = dv.getSjisStringsAsUnicode( 20 );\n\n\t};\n\n\tvar parseMotions = function () {\n\n\t\tvar parseMotion = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.boneName = dv.getSjisStringsAsUnicode( 15 );\n\t\t\tp.frameNum = dv.getUint32();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.rotation = dv.getFloat32Array( 4 );\n\t\t\tp.interpolation = dv.getUint8Array( 64 );\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = vmd.metadata;\n\t\tmetadata.motionCount = dv.getUint32();\n\n\t\tvmd.motions = [];\n\t\tfor ( var i = 0; i < metadata.motionCount; i ++ ) {\n\n\t\t\tvmd.motions.push( parseMotion() );\n\n\t\t}\n\n\t};\n\n\tvar parseMorphs = function () {\n\n\t\tvar parseMorph = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.morphName = dv.getSjisStringsAsUnicode( 15 );\n\t\t\tp.frameNum = dv.getUint32();\n\t\t\tp.weight = dv.getFloat32();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = vmd.metadata;\n\t\tmetadata.morphCount = dv.getUint32();\n\n\t\tvmd.morphs = [];\n\t\tfor ( var i = 0; i < metadata.morphCount; i ++ ) {\n\n\t\t\tvmd.morphs.push( parseMorph() );\n\n\t\t}\n\n\t};\n\n\tvar parseCameras = function () {\n\n\t\tvar parseCamera = function () {\n\n\t\t\tvar p = {};\n\t\t\tp.frameNum = dv.getUint32();\n\t\t\tp.distance = dv.getFloat32();\n\t\t\tp.position = dv.getFloat32Array( 3 );\n\t\t\tp.rotation = dv.getFloat32Array( 3 );\n\t\t\tp.interpolation = dv.getUint8Array( 24 );\n\t\t\tp.fov = dv.getUint32();\n\t\t\tp.perspective = dv.getUint8();\n\t\t\treturn p;\n\n\t\t};\n\n\t\tvar metadata = vmd.metadata;\n\t\tmetadata.cameraCount = dv.getUint32();\n\n\t\tvmd.cameras = [];\n\t\tfor ( var i = 0; i < metadata.cameraCount; i ++ ) {\n\n\t\t\tvmd.cameras.push( parseCamera() );\n\n\t\t}\n\n\t};\n\n\tparseHeader();\n\tparseMotions();\n\tparseMorphs();\n\tparseCameras();\n\n\tif ( leftToRight === true ) this.leftToRightVmd( vmd );\n\n\t// console.log( vmd ); // for console debug\n\n\treturn vmd;\n\n};\n\nParser.prototype.parseVpd = function ( text, leftToRight ) {\n\n\tvar vpd = {};\n\n\tvpd.metadata = {};\n\tvpd.metadata.coordinateSystem = 'left';\n\n\tvpd.bones = [];\n\n\tvar commentPatternG = /\\/\\/\\w*(\\r|\\n|\\r\\n)/g;\n\tvar newlinePattern = /\\r|\\n|\\r\\n/;\n\n\tvar lines = text.replace( commentPatternG, '' ).split( newlinePattern );\n\n\tfunction throwError() {\n\n\t\tthrow 'the file seems not vpd file.';\n\n\t}\n\n\tfunction checkMagic() {\n\n\t\tif ( lines[ 0 ] !== 'Vocaloid Pose Data file' ) {\n\n\t\t\tthrowError();\n\n\t\t}\n\n\t}\n\n\tfunction parseHeader() {\n\n\t\tif ( lines.length < 4 ) {\n\n\t\t\tthrowError();\n\n\t\t}\n\n\t\tvpd.metadata.parentFile = lines[ 2 ];\n\t\tvpd.metadata.boneCount = parseInt( lines[ 3 ] );\n\n\t}\n\n\tfunction parseBones() {\n\n\t\tvar boneHeaderPattern = /^\\s*(Bone[0-9]+)\\s*\\{\\s*(.*)$/;\n\t\tvar boneVectorPattern = /^\\s*(-?[0-9]+\\.[0-9]+)\\s*,\\s*(-?[0-9]+\\.[0-9]+)\\s*,\\s*(-?[0-9]+\\.[0-9]+)\\s*;/;\n\t\tvar boneQuaternionPattern = /^\\s*(-?[0-9]+\\.[0-9]+)\\s*,\\s*(-?[0-9]+\\.[0-9]+)\\s*,\\s*(-?[0-9]+\\.[0-9]+)\\s*,\\s*(-?[0-9]+\\.[0-9]+)\\s*;/;\n\t\tvar boneFooterPattern = /^\\s*}/;\n\n\t\tvar bones = vpd.bones;\n\t\tvar n = null;\n\t\tvar v = null;\n\t\tvar q = null;\n\n\t\tfor ( var i = 4; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\n\t\t\tvar result;\n\n\t\t\tresult = line.match( boneHeaderPattern );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\tif ( n !== null ) {\n\n\t\t\t\t\tthrowError();\n\n\t\t\t\t}\n\n\t\t\t\tn = result[ 2 ];\n\n\t\t\t}\n\n\t\t\tresult = line.match( boneVectorPattern );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\tif ( v !== null ) {\n\n\t\t\t\t\tthrowError();\n\n\t\t\t\t}\n\n\t\t\t\tv = [\n\n\t\t\t\t\tparseFloat( result[ 1 ] ),\n\t\t\t\t\tparseFloat( result[ 2 ] ),\n\t\t\t\t\tparseFloat( result[ 3 ] )\n\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t\tresult = line.match( boneQuaternionPattern );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\tif ( q !== null ) {\n\n\t\t\t\t\tthrowError();\n\n\t\t\t\t}\n\n\t\t\t\tq = [\n\n\t\t\t\t\tparseFloat( result[ 1 ] ),\n\t\t\t\t\tparseFloat( result[ 2 ] ),\n\t\t\t\t\tparseFloat( result[ 3 ] ),\n\t\t\t\t\tparseFloat( result[ 4 ] )\n\n\t\t\t\t];\n\n\n\t\t\t}\n\n\t\t\tresult = line.match( boneFooterPattern );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\tif ( n === null || v === null || q === null ) {\n\n\t\t\t\t\tthrowError();\n\n\t\t\t\t}\n\n\t\t\t\tbones.push( {\n\n\t\t\t\t\tname: n,\n\t\t\t\t\ttranslation: v,\n\t\t\t\t\tquaternion: q\n\n\t\t\t\t} );\n\n\t\t\t\tn = null;\n\t\t\t\tv = null;\n\t\t\t\tq = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( n !== null || v !== null || q !== null ) {\n\n\t\t\tthrowError();\n\n\t\t}\n\n\t}\n\n\tcheckMagic();\n\tparseHeader();\n\tparseBones();\n\n\tif ( leftToRight === true ) this.leftToRightVpd( vpd );\n\n\t// console.log( vpd ); // for console debug\n\n\treturn vpd;\n\n};\n\nParser.prototype.mergeVmds = function ( vmds ) {\n\n\tvar v = {};\n\tv.metadata = {};\n\tv.metadata.name = vmds[ 0 ].metadata.name;\n\tv.metadata.coordinateSystem = vmds[ 0 ].metadata.coordinateSystem;\n\tv.metadata.motionCount = 0;\n\tv.metadata.morphCount = 0;\n\tv.metadata.cameraCount = 0;\n\tv.motions = [];\n\tv.morphs = [];\n\tv.cameras = [];\n\n\tfor ( var i = 0; i < vmds.length; i ++ ) {\n\n\t\tvar v2 = vmds[ i ];\n\n\t\tv.metadata.motionCount += v2.metadata.motionCount;\n\t\tv.metadata.morphCount += v2.metadata.morphCount;\n\t\tv.metadata.cameraCount += v2.metadata.cameraCount;\n\n\t\tfor ( var j = 0; j < v2.metadata.motionCount; j ++ ) {\n\n\t\t\tv.motions.push( v2.motions[ j ] );\n\n\t\t}\n\n\t\tfor ( var j = 0; j < v2.metadata.morphCount; j ++ ) {\n\n\t\t\tv.morphs.push( v2.morphs[ j ] );\n\n\t\t}\n\n\t\tfor ( var j = 0; j < v2.metadata.cameraCount; j ++ ) {\n\n\t\t\tv.cameras.push( v2.cameras[ j ] );\n\n\t\t}\n\n\t}\n\n\treturn v;\n\n};\n\nParser.prototype.leftToRightModel = function ( model ) {\n\n\tif ( model.metadata.coordinateSystem === 'right' ) {\n\n\t\treturn;\n\n\t}\n\n\tmodel.metadata.coordinateSystem = 'right';\n\n\tvar helper = new DataCreationHelper();\n\n\tfor ( var i = 0; i < model.metadata.vertexCount; i ++ ) {\n\n\t\thelper.leftToRightVector3( model.vertices[ i ].position );\n\t\thelper.leftToRightVector3( model.vertices[ i ].normal );\n\n\t}\n\n\tfor ( var i = 0; i < model.metadata.faceCount; i ++ ) {\n\n\t\thelper.leftToRightIndexOrder( model.faces[ i ].indices );\n\n\t}\n\n\tfor ( var i = 0; i < model.metadata.boneCount; i ++ ) {\n\n\t\thelper.leftToRightVector3( model.bones[ i ].position );\n\n\t}\n\n\t// TODO: support other morph for PMX\n\tfor ( var i = 0; i < model.metadata.morphCount; i ++ ) {\n\n\t\tvar m = model.morphs[ i ];\n\n\t\tif ( model.metadata.format === 'pmx' && m.type !== 1 ) {\n\n\t\t\t// TODO: implement\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tfor ( var j = 0; j < m.elements.length; j ++ ) {\n\n\t\t\thelper.leftToRightVector3( m.elements[ j ].position );\n\n\t\t}\n\n\t}\n\n\tfor ( var i = 0; i < model.metadata.rigidBodyCount; i ++ ) {\n\n\t\thelper.leftToRightVector3( model.rigidBodies[ i ].position );\n\t\thelper.leftToRightEuler( model.rigidBodies[ i ].rotation );\n\n\t}\n\n\tfor ( var i = 0; i < model.metadata.constraintCount; i ++ ) {\n\n\t\thelper.leftToRightVector3( model.constraints[ i ].position );\n\t\thelper.leftToRightEuler( model.constraints[ i ].rotation );\n\t\thelper.leftToRightVector3Range( model.constraints[ i ].translationLimitation1, model.constraints[ i ].translationLimitation2 );\n\t\thelper.leftToRightEulerRange( model.constraints[ i ].rotationLimitation1, model.constraints[ i ].rotationLimitation2 );\n\n\t}\n\n};\n\nParser.prototype.leftToRightVmd = function ( vmd ) {\n\n\tif ( vmd.metadata.coordinateSystem === 'right' ) {\n\n\t\treturn;\n\n\t}\n\n\tvmd.metadata.coordinateSystem = 'right';\n\n\tvar helper = new DataCreationHelper();\n\n\tfor ( var i = 0; i < vmd.metadata.motionCount; i ++ ) {\n\n\t\thelper.leftToRightVector3( vmd.motions[ i ].position );\n\t\thelper.leftToRightQuaternion( vmd.motions[ i ].rotation );\n\n\t}\n\n\tfor ( var i = 0; i < vmd.metadata.cameraCount; i ++ ) {\n\n\t\thelper.leftToRightVector3( vmd.cameras[ i ].position );\n\t\thelper.leftToRightEuler( vmd.cameras[ i ].rotation );\n\n\t}\n\n};\n\nParser.prototype.leftToRightVpd = function ( vpd ) {\n\n\tif ( vpd.metadata.coordinateSystem === 'right' ) {\n\n\t\treturn;\n\n\t}\n\n\tvpd.metadata.coordinateSystem = 'right';\n\n\tvar helper = new DataCreationHelper();\n\n\tfor ( var i = 0; i < vpd.bones.length; i ++ ) {\n\n\t\thelper.leftToRightVector3( vpd.bones[ i ].translation );\n\t\thelper.leftToRightQuaternion( vpd.bones[ i ].quaternion );\n\n\t}\n\n};\n\nvar MMDParser = { CharsetEncoder, Parser };\n\nexport { MMDParser };\n","import {\n\tAddOperation,\n\tAnimationClip,\n\tBone,\n\tBufferGeometry,\n\tColor,\n\tCustomBlending,\n\tDoubleSide,\n\tDstAlphaFactor,\n\tEuler,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tFrontSide,\n\tInterpolant,\n\tLoader,\n\tLoaderUtils,\n\tMeshToonMaterial,\n\tMultiplyOperation,\n\tNearestFilter,\n\tNumberKeyframeTrack,\n\tOneMinusSrcAlphaFactor,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSrcAlphaFactor,\n\tTextureLoader,\n\tUint16BufferAttribute,\n\tVector3,\n\tVectorKeyframeTrack\n} from \"../../../build/three.module.js\";\nimport { TGALoader } from \"../loaders/TGALoader.js\";\nimport { MMDParser } from \"../libs/mmdparser.module.js\";\n/**\n * Dependencies\n * - mmd-parser https://github.com/takahirox/mmd-parser\n * - TGALoader\n * - OutlineEffect\n *\n * MMDLoader creates Three.js Objects from MMD resources as\n * PMD, PMX, VMD, and VPD files.\n *\n * PMD/PMX is a model data format, VMD is a motion data format\n * VPD is a posing data format used in MMD(Miku Miku Dance).\n *\n * MMD official site\n * - https://sites.google.com/view/evpvp/\n *\n * PMD, VMD format (in Japanese)\n * - http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4\n *\n * PMX format\n * - https://gist.github.com/felixjones/f8a06bd48f9da9a4539f\n *\n * TODO\n * - light motion in vmd support.\n * - SDEF support.\n * - uv/material/bone morphing support.\n * - more precise grant skinning support.\n * - shadow support.\n */\n\nvar MMDLoader = ( function () {\n\n\t/**\n\t * @param {THREE.LoadingManager} manager\n\t */\n\tfunction MMDLoader( manager ) {\n\n\t\tLoader.call( this, manager );\n\n\t\tthis.loader = new FileLoader( this.manager );\n\n\t\tthis.parser = null; // lazy generation\n\t\tthis.meshBuilder = new MeshBuilder( this.manager );\n\t\tthis.animationBuilder = new AnimationBuilder();\n\n\t}\n\n\tMMDLoader.prototype = Object.assign( Object.create( Loader.prototype ), {\n\n\t\tconstructor: MMDLoader,\n\n\t\t/**\n\t\t * @param {string} animationPath\n\t\t * @return {MMDLoader}\n\t\t */\n\t\tsetAnimationPath: function ( animationPath ) {\n\n\t\t\tthis.animationPath = animationPath;\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Load MMD assets as Three.js Object\n\n\t\t/**\n\t\t * Loads Model file (.pmd or .pmx) as a SkinnedMesh.\n\t\t *\n\t\t * @param {string} url - url to Model(.pmd or .pmx) file\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar builder = this.meshBuilder.setCrossOrigin( this.crossOrigin );\n\n\t\t\t// resource path\n\n\t\t\tvar resourcePath;\n\n\t\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\t\tresourcePath = this.resourcePath;\n\n\t\t\t} else if ( this.path !== '' ) {\n\n\t\t\t\tresourcePath = this.path;\n\n\t\t\t} else {\n\n\t\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t\t}\n\n\t\t\tvar modelExtension = this._extractExtension( url ).toLowerCase();\n\n\t\t\t// Should I detect by seeing header?\n\t\t\tif ( modelExtension !== 'pmd' && modelExtension !== 'pmx' ) {\n\n\t\t\t\tif ( onError ) onError( new Error( 'THREE.MMDLoader: Unknown model file extension .' + modelExtension + '.' ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis[ modelExtension === 'pmd' ? 'loadPMD' : 'loadPMX' ]( url, function ( data ) {\n\n\t\t\t\tonLoad(\tbuilder.build( data, resourcePath, onProgress, onError )\t);\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\t/**\n\t\t * Loads Motion file(s) (.vmd) as a AnimationClip.\n\t\t * If two or more files are specified, they'll be merged.\n\t\t *\n\t\t * @param {string|Array} url - url(s) to animation(.vmd) file(s)\n\t\t * @param {SkinnedMesh|THREE.Camera} object - tracks will be fitting to this object\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tloadAnimation: function ( url, object, onLoad, onProgress, onError ) {\n\n\t\t\tvar builder = this.animationBuilder;\n\n\t\t\tthis.loadVMD( url, function ( vmd ) {\n\n\t\t\t\tonLoad( object.isCamera\n\t\t\t\t\t? builder.buildCameraAnimation( vmd )\n\t\t\t\t\t: builder.build( vmd, object ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\t/**\n\t\t * Loads mode file and motion file(s) as an object containing\n\t\t * a SkinnedMesh and a AnimationClip.\n\t\t * Tracks of AnimationClip are fitting to the model.\n\t\t *\n\t\t * @param {string} modelUrl - url to Model(.pmd or .pmx) file\n\t\t * @param {string|Array{string}} vmdUrl - url(s) to animation(.vmd) file\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tloadWithAnimation: function ( modelUrl, vmdUrl, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.load( modelUrl, function ( mesh ) {\n\n\t\t\t\tscope.loadAnimation( vmdUrl, mesh, function ( animation ) {\n\n\t\t\t\t\tonLoad( {\n\t\t\t\t\t\tmesh: mesh,\n\t\t\t\t\t\tanimation: animation\n\t\t\t\t\t} );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\t// Load MMD assets as Object data parsed by MMDParser\n\n\t\t/**\n\t\t * Loads .pmd file as an Object.\n\t\t *\n\t\t * @param {string} url - url to .pmd file\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tloadPMD: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar parser = this._getParser();\n\n\t\t\tthis.loader\n\t\t\t\t.setMimeType( undefined )\n\t\t\t\t.setPath( this.path )\n\t\t\t\t.setResponseType( 'arraybuffer' )\n\t\t\t\t.setRequestHeader( this.requestHeader )\n\t\t\t\t.load( url, function ( buffer ) {\n\n\t\t\t\t\tonLoad( parser.parsePmd( buffer, true ) );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\t/**\n\t\t * Loads .pmx file as an Object.\n\t\t *\n\t\t * @param {string} url - url to .pmx file\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tloadPMX: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar parser = this._getParser();\n\n\t\t\tthis.loader\n\t\t\t\t.setMimeType( undefined )\n\t\t\t\t.setPath( this.path )\n\t\t\t\t.setResponseType( 'arraybuffer' )\n\t\t\t\t.setRequestHeader( this.requestHeader )\n\t\t\t\t.load( url, function ( buffer ) {\n\n\t\t\t\t\tonLoad( parser.parsePmx( buffer, true ) );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\t/**\n\t\t * Loads .vmd file as an Object. If two or more files are specified\n\t\t * they'll be merged.\n\t\t *\n\t\t * @param {string|Array} url - url(s) to .vmd file(s)\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tloadVMD: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar urls = Array.isArray( url ) ? url : [ url ];\n\n\t\t\tvar vmds = [];\n\t\t\tvar vmdNum = urls.length;\n\n\t\t\tvar parser = this._getParser();\n\n\t\t\tthis.loader\n\t\t\t\t.setMimeType( undefined )\n\t\t\t\t.setPath( this.animationPath )\n\t\t\t\t.setResponseType( 'arraybuffer' )\n\t\t\t\t.setRequestHeader( this.requestHeader );\n\n\t\t\tfor ( var i = 0, il = urls.length; i < il; i ++ ) {\n\n\t\t\t\tthis.loader.load( urls[ i ], function ( buffer ) {\n\n\t\t\t\t\tvmds.push( parser.parseVmd( buffer, true ) );\n\n\t\t\t\t\tif ( vmds.length === vmdNum ) onLoad( parser.mergeVmds( vmds ) );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Loads .vpd file as an Object.\n\t\t *\n\t\t * @param {string} url - url to .vpd file\n\t\t * @param {boolean} isUnicode\n\t\t * @param {function} onLoad\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t */\n\t\tloadVPD: function ( url, isUnicode, onLoad, onProgress, onError ) {\n\n\t\t\tvar parser = this._getParser();\n\n\t\t\tthis.loader\n\t\t\t\t.setMimeType( isUnicode ? undefined : 'text/plain; charset=shift_jis' )\n\t\t\t\t.setPath( this.animationPath )\n\t\t\t\t.setResponseType( 'text' )\n\t\t\t\t.setRequestHeader( this.requestHeader )\n\t\t\t\t.load( url, function ( text ) {\n\n\t\t\t\t\tonLoad( parser.parseVpd( text, true ) );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\t// private methods\n\n\t\t_extractExtension: function ( url ) {\n\n\t\t\tvar index = url.lastIndexOf( '.' );\n\t\t\treturn index < 0 ? '' : url.slice( index + 1 );\n\n\t\t},\n\n\t\t_getParser: function () {\n\n\t\t\tif ( this.parser === null ) {\n\n\t\t\t\tif ( typeof MMDParser === 'undefined' ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.MMDLoader: Import MMDParser https://github.com/takahirox/mmd-parser' );\n\n\t\t\t\t}\n\n\t\t\t\tthis.parser = new MMDParser.Parser();\n\n\t\t\t}\n\n\t\t\treturn this.parser;\n\n\t\t}\n\n\t} );\n\n\t// Utilities\n\n\t/*\n\t * base64 encoded defalut toon textures toon00.bmp - toon10.bmp.\n\t * We don't need to request external toon image files.\n\t * This idea is from http://www20.atpages.jp/katwat/three.js_r58/examples/mytest37/mmd.three.js\n\t */\n\tvar DEFAULT_TOON_TEXTURES = [\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAN0lEQVRYR+3WQREAMBACsZ5/bWiiMvgEBTt5cW37hjsBBAgQIECAwFwgyfYPCCBAgAABAgTWAh8aBHZBl14e8wAAAABJRU5ErkJggg==',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOUlEQVRYR+3WMREAMAwDsYY/yoDI7MLwIiP40+RJklfcCCBAgAABAgTqArfb/QMCCBAgQIAAgbbAB3z/e0F3js2cAAAAAElFTkSuQmCC',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAN0lEQVRYR+3WQREAMBACsZ5/B5ilMvgEBTt5cW37hjsBBAgQIECAwFwgyfYPCCBAgAABAgTWAh81dWyx0gFwKAAAAABJRU5ErkJggg==',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAOklEQVRYR+3WoREAMAwDsWb/UQtCy9wxTOQJ/oQ8SXKKGwEECBAgQIBAXeDt7f4BAQQIECBAgEBb4AOz8Hzx7WLY4wAAAABJRU5ErkJggg==',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABPUlEQVRYR+1XwW7CMAy1+f9fZOMysSEOEweEOPRNdm3HbdOyIhAcklPrOs/PLy9RygBALxzcCDQFmgJNgaZAU6Ap0BR4PwX8gsRMVLssMRH5HcpzJEaWL7EVg9F1IHRlyqQohgVr4FGUlUcMJSjcUlDw0zvjeun70cLWmneoyf7NgBTQSniBTQQSuJAZsOnnaczjIMb5hCiuHKxokCrJfVnrctyZL0PkJAJe1HMil4nxeyi3Ypfn1kX51jpPvo/JeCNC4PhVdHdJw2XjBR8brF8PEIhNVn12AgP7uHsTBguBn53MUZCqv7Lp07Pn5k1Ro+uWmUNn7D+M57rtk7aG0Vo73xyF/fbFf0bPJjDXngnGocDTdFhygZjwUQrMNrDcmZlQT50VJ/g/UwNyHpu778+yW+/ksOz/BFo54P4AsUXMfRq7XWsAAAAASUVORK5CYII=',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAACMElEQVRYR+2Xv4pTQRTGf2dubhLdICiii2KnYKHVolhauKWPoGAnNr6BD6CvIVaihYuI2i1ia0BY0MZGRHQXjZj/mSPnnskfNWiWZUlzJ5k7M2cm833nO5Mziej2DWWJRUoCpQKlAntSQCqgw39/iUWAGmh37jrRnVsKlgpiqmkoGVABA7E57fvY+pJDdgKqF6HzFCSADkDq+F6AHABtQ+UMVE5D7zXod7fFNhTEckTbj5XQgHzNN+5tQvc5NG7C6BNkp6D3EmpXHDR+dQAjFLchW3VS9rlw3JBh+B7ys5Cf9z0GW1C/7P32AyBAOAz1q4jGliIH3YPuBnSfQX4OGreTIgEYQb/pBDtPnEQ4CivXYPAWBk13oHrB54yA9QuSn2H4AcKRpEILDt0BUzj+RLR1V5EqjD66NPRBVpLcQwjHoHYJOhsQv6U4mnzmrIXJCFr4LDwm/xBUoboG9XX4cc9VKdYoSA2yk5NQLJaKDUjTBoveG3Z2TElTxwjNK4M3LEZgUdDdruvcXzKBpStgp2NPiWi3ks9ZXxIoFVi+AvHLdc9TqtjL3/aYjpPlrzOcEnK62Szhimdd7xX232zFDTgtxezOu3WNMRLjiKgjtOhHVMd1loynVHvOgjuIIJMaELEqhJAV/RCSLbWTcfPFakFgFlALTRRvx+ok6Hlp/Q+v3fmx90bMyUzaEAhmM3KvHlXTL5DxnbGf/1M8RNNACLL5MNtPxP/mypJAqcDSFfgFhpYqWUzhTEAAAAAASUVORK5CYII=',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII=',\n\t\t'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAL0lEQVRYR+3QQREAAAzCsOFfNJPBJ1XQS9r2hsUAAQIECBAgQIAAAQIECBAgsBZ4MUx/ofm2I/kAAAAASUVORK5CYII='\n\t];\n\n\t// Builders. They build Three.js object from Object data parsed by MMDParser.\n\n\t/**\n\t * @param {THREE.LoadingManager} manager\n\t */\n\tfunction MeshBuilder( manager ) {\n\n\t\tthis.geometryBuilder = new GeometryBuilder();\n\t\tthis.materialBuilder = new MaterialBuilder( manager );\n\n\t}\n\n\tMeshBuilder.prototype = {\n\n\t\tconstructor: MeshBuilder,\n\n\t\tcrossOrigin: 'anonymous',\n\n\t\t/**\n\t\t * @param {string} crossOrigin\n\t\t * @return {MeshBuilder}\n\t\t */\n\t\tsetCrossOrigin: function ( crossOrigin ) {\n\n\t\t\tthis.crossOrigin = crossOrigin;\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} data - parsed PMD/PMX data\n\t\t * @param {string} resourcePath\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t * @return {SkinnedMesh}\n\t\t */\n\t\tbuild: function ( data, resourcePath, onProgress, onError ) {\n\n\t\t\tvar geometry = this.geometryBuilder.build( data );\n\t\t\tvar material = this.materialBuilder\n\t\t\t\t.setCrossOrigin( this.crossOrigin )\n\t\t\t\t.setResourcePath( resourcePath )\n\t\t\t\t.build( data, geometry, onProgress, onError );\n\n\t\t\tvar mesh = new SkinnedMesh( geometry, material );\n\n\t\t\tvar skeleton = new Skeleton( initBones( mesh ) );\n\t\t\tmesh.bind( skeleton );\n\n\t\t\t// console.log( mesh ); // for console debug\n\n\t\t\treturn mesh;\n\n\t\t}\n\n\t};\n\n\t// TODO: Try to remove this function\n\n\tfunction initBones( mesh ) {\n\n\t\tvar geometry = mesh.geometry;\n\n\t\tvar bones = [], bone, gbone;\n\t\tvar i, il;\n\n\t\tif ( geometry && geometry.bones !== undefined ) {\n\n\t\t\t// first, create array of 'Bone' objects from geometry data\n\n\t\t\tfor ( i = 0, il = geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\tgbone = geometry.bones[ i ];\n\n\t\t\t\t// create new 'Bone' object\n\n\t\t\t\tbone = new Bone();\n\t\t\t\tbones.push( bone );\n\n\t\t\t\t// apply values\n\n\t\t\t\tbone.name = gbone.name;\n\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t}\n\n\t\t\t// second, create bone hierarchy\n\n\t\t\tfor ( i = 0, il = geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\tgbone = geometry.bones[ i ];\n\n\t\t\t\tif ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {\n\n\t\t\t\t\t// subsequent bones in the hierarchy\n\n\t\t\t\t\tbones[ gbone.parent ].add( bones[ i ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// topmost bone, immediate child of the skinned mesh\n\n\t\t\t\t\tmesh.add( bones[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// now the bones are part of the scene graph and children of the skinned mesh.\n\t\t// let's update the corresponding matrices\n\n\t\tmesh.updateMatrixWorld( true );\n\n\t\treturn bones;\n\n\t}\n\n\t//\n\n\tfunction GeometryBuilder() {\n\n\t}\n\n\tGeometryBuilder.prototype = {\n\n\t\tconstructor: GeometryBuilder,\n\n\t\t/**\n\t\t * @param {Object} data - parsed PMD/PMX data\n\t\t * @return {BufferGeometry}\n\t\t */\n\t\tbuild: function ( data ) {\n\n\t\t\t// for geometry\n\t\t\tvar positions = [];\n\t\t\tvar uvs = [];\n\t\t\tvar normals = [];\n\n\t\t\tvar indices = [];\n\n\t\t\tvar groups = [];\n\n\t\t\tvar bones = [];\n\t\t\tvar skinIndices = [];\n\t\t\tvar skinWeights = [];\n\n\t\t\tvar morphTargets = [];\n\t\t\tvar morphPositions = [];\n\n\t\t\tvar iks = [];\n\t\t\tvar grants = [];\n\n\t\t\tvar rigidBodies = [];\n\t\t\tvar constraints = [];\n\n\t\t\t// for work\n\t\t\tvar offset = 0;\n\t\t\tvar boneTypeTable = {};\n\n\t\t\t// positions, normals, uvs, skinIndices, skinWeights\n\n\t\t\tfor ( var i = 0; i < data.metadata.vertexCount; i ++ ) {\n\n\t\t\t\tvar v = data.vertices[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = v.position.length; j < jl; j ++ ) {\n\n\t\t\t\t\tpositions.push( v.position[ j ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = v.normal.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormals.push( v.normal[ j ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = v.uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvs.push( v.uv[ j ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tskinIndices.push( v.skinIndices.length - 1 >= j ? v.skinIndices[ j ] : 0.0 );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tskinWeights.push( v.skinWeights.length - 1 >= j ? v.skinWeights[ j ] : 0.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( var i = 0; i < data.metadata.faceCount; i ++ ) {\n\n\t\t\t\tvar face = data.faces[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = face.indices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tindices.push( face.indices[ j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tfor ( var i = 0; i < data.metadata.materialCount; i ++ ) {\n\n\t\t\t\tvar material = data.materials[ i ];\n\n\t\t\t\tgroups.push( {\n\t\t\t\t\toffset: offset * 3,\n\t\t\t\t\tcount: material.faceCount * 3\n\t\t\t\t} );\n\n\t\t\t\toffset += material.faceCount;\n\n\t\t\t}\n\n\t\t\t// bones\n\n\t\t\tfor ( var i = 0; i < data.metadata.rigidBodyCount; i ++ ) {\n\n\t\t\t\tvar body = data.rigidBodies[ i ];\n\t\t\t\tvar value = boneTypeTable[ body.boneIndex ];\n\n\t\t\t\t// keeps greater number if already value is set without any special reasons\n\t\t\t\tvalue = value === undefined ? body.type : Math.max( body.type, value );\n\n\t\t\t\tboneTypeTable[ body.boneIndex ] = value;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < data.metadata.boneCount; i ++ ) {\n\n\t\t\t\tvar boneData = data.bones[ i ];\n\n\t\t\t\tvar bone = {\n\t\t\t\t\tparent: boneData.parentIndex,\n\t\t\t\t\tname: boneData.name,\n\t\t\t\t\tpos: boneData.position.slice( 0, 3 ),\n\t\t\t\t\trotq: [ 0, 0, 0, 1 ],\n\t\t\t\t\tscl: [ 1, 1, 1 ],\n\t\t\t\t\trigidBodyType: boneTypeTable[ i ] !== undefined ? boneTypeTable[ i ] : - 1\n\t\t\t\t};\n\n\t\t\t\tif ( bone.parent !== - 1 ) {\n\n\t\t\t\t\tbone.pos[ 0 ] -= data.bones[ bone.parent ].position[ 0 ];\n\t\t\t\t\tbone.pos[ 1 ] -= data.bones[ bone.parent ].position[ 1 ];\n\t\t\t\t\tbone.pos[ 2 ] -= data.bones[ bone.parent ].position[ 2 ];\n\n\t\t\t\t}\n\n\t\t\t\tbones.push( bone );\n\n\t\t\t}\n\n\t\t\t// iks\n\n\t\t\t// TODO: remove duplicated codes between PMD and PMX\n\t\t\tif ( data.metadata.format === 'pmd' ) {\n\n\t\t\t\tfor ( var i = 0; i < data.metadata.ikCount; i ++ ) {\n\n\t\t\t\t\tvar ik = data.iks[ i ];\n\n\t\t\t\t\tvar param = {\n\t\t\t\t\t\ttarget: ik.target,\n\t\t\t\t\t\teffector: ik.effector,\n\t\t\t\t\t\titeration: ik.iteration,\n\t\t\t\t\t\tmaxAngle: ik.maxAngle * 4,\n\t\t\t\t\t\tlinks: []\n\t\t\t\t\t};\n\n\t\t\t\t\tfor ( var j = 0, jl = ik.links.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar link = {};\n\t\t\t\t\t\tlink.index = ik.links[ j ].index;\n\t\t\t\t\t\tlink.enabled = true;\n\n\t\t\t\t\t\tif ( data.bones[ link.index ].name.indexOf( 'ひざ' ) >= 0 ) {\n\n\t\t\t\t\t\t\tlink.limitation = new Vector3( 1.0, 0.0, 0.0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparam.links.push( link );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tiks.push( param );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0; i < data.metadata.boneCount; i ++ ) {\n\n\t\t\t\t\tvar ik = data.bones[ i ].ik;\n\n\t\t\t\t\tif ( ik === undefined ) continue;\n\n\t\t\t\t\tvar param = {\n\t\t\t\t\t\ttarget: i,\n\t\t\t\t\t\teffector: ik.effector,\n\t\t\t\t\t\titeration: ik.iteration,\n\t\t\t\t\t\tmaxAngle: ik.maxAngle,\n\t\t\t\t\t\tlinks: []\n\t\t\t\t\t};\n\n\t\t\t\t\tfor ( var j = 0, jl = ik.links.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar link = {};\n\t\t\t\t\t\tlink.index = ik.links[ j ].index;\n\t\t\t\t\t\tlink.enabled = true;\n\n\t\t\t\t\t\tif ( ik.links[ j ].angleLimitation === 1 ) {\n\n\t\t\t\t\t\t\t// Revert if rotationMin/Max doesn't work well\n\t\t\t\t\t\t\t// link.limitation = new Vector3( 1.0, 0.0, 0.0 );\n\n\t\t\t\t\t\t\tvar rotationMin = ik.links[ j ].lowerLimitationAngle;\n\t\t\t\t\t\t\tvar rotationMax = ik.links[ j ].upperLimitationAngle;\n\n\t\t\t\t\t\t\t// Convert Left to Right coordinate by myself because\n\t\t\t\t\t\t\t// MMDParser doesn't convert. It's a MMDParser's bug\n\n\t\t\t\t\t\t\tvar tmp1 = - rotationMax[ 0 ];\n\t\t\t\t\t\t\tvar tmp2 = - rotationMax[ 1 ];\n\t\t\t\t\t\t\trotationMax[ 0 ] = - rotationMin[ 0 ];\n\t\t\t\t\t\t\trotationMax[ 1 ] = - rotationMin[ 1 ];\n\t\t\t\t\t\t\trotationMin[ 0 ] = tmp1;\n\t\t\t\t\t\t\trotationMin[ 1 ] = tmp2;\n\n\t\t\t\t\t\t\tlink.rotationMin = new Vector3().fromArray( rotationMin );\n\t\t\t\t\t\t\tlink.rotationMax = new Vector3().fromArray( rotationMax );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparam.links.push( link );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tiks.push( param );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// grants\n\n\t\t\tif ( data.metadata.format === 'pmx' ) {\n\n\t\t\t\tfor ( var i = 0; i < data.metadata.boneCount; i ++ ) {\n\n\t\t\t\t\tvar boneData = data.bones[ i ];\n\t\t\t\t\tvar grant = boneData.grant;\n\n\t\t\t\t\tif ( grant === undefined ) continue;\n\n\t\t\t\t\tvar param = {\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tparentIndex: grant.parentIndex,\n\t\t\t\t\t\tratio: grant.ratio,\n\t\t\t\t\t\tisLocal: grant.isLocal,\n\t\t\t\t\t\taffectRotation: grant.affectRotation,\n\t\t\t\t\t\taffectPosition: grant.affectPosition,\n\t\t\t\t\t\ttransformationClass: boneData.transformationClass\n\t\t\t\t\t};\n\n\t\t\t\t\tgrants.push( param );\n\n\t\t\t\t}\n\n\t\t\t\tgrants.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a.transformationClass - b.transformationClass;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t// morph\n\n\t\t\tfunction updateAttributes( attribute, morph, ratio ) {\n\n\t\t\t\tfor ( var i = 0; i < morph.elementCount; i ++ ) {\n\n\t\t\t\t\tvar element = morph.elements[ i ];\n\n\t\t\t\t\tvar index;\n\n\t\t\t\t\tif ( data.metadata.format === 'pmd' ) {\n\n\t\t\t\t\t\tindex = data.morphs[ 0 ].elements[ element.index ].index;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tindex = element.index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tattribute.array[ index * 3 + 0 ] += element.position[ 0 ] * ratio;\n\t\t\t\t\tattribute.array[ index * 3 + 1 ] += element.position[ 1 ] * ratio;\n\t\t\t\t\tattribute.array[ index * 3 + 2 ] += element.position[ 2 ] * ratio;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < data.metadata.morphCount; i ++ ) {\n\n\t\t\t\tvar morph = data.morphs[ i ];\n\t\t\t\tvar params = { name: morph.name };\n\n\t\t\t\tvar attribute = new Float32BufferAttribute( data.metadata.vertexCount * 3, 3 );\n\t\t\t\tattribute.name = morph.name;\n\n\t\t\t\tfor ( var j = 0; j < data.metadata.vertexCount * 3; j ++ ) {\n\n\t\t\t\t\tattribute.array[ j ] = positions[ j ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.metadata.format === 'pmd' ) {\n\n\t\t\t\t\tif ( i !== 0 ) {\n\n\t\t\t\t\t\tupdateAttributes( attribute, morph, 1.0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morph.type === 0 ) { // group\n\n\t\t\t\t\t\tfor ( var j = 0; j < morph.elementCount; j ++ ) {\n\n\t\t\t\t\t\t\tvar morph2 = data.morphs[ morph.elements[ j ].index ];\n\t\t\t\t\t\t\tvar ratio = morph.elements[ j ].ratio;\n\n\t\t\t\t\t\t\tif ( morph2.type === 1 ) {\n\n\t\t\t\t\t\t\t\tupdateAttributes( attribute, morph2, ratio );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( morph.type === 1 ) { // vertex\n\n\t\t\t\t\t\tupdateAttributes( attribute, morph, 1.0 );\n\n\t\t\t\t\t} else if ( morph.type === 2 ) { // bone\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t} else if ( morph.type === 3 ) { // uv\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t} else if ( morph.type === 4 ) { // additional uv1\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t} else if ( morph.type === 5 ) { // additional uv2\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t} else if ( morph.type === 6 ) { // additional uv3\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t} else if ( morph.type === 7 ) { // additional uv4\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t} else if ( morph.type === 8 ) { // material\n\n\t\t\t\t\t\t// TODO: implement\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmorphTargets.push( params );\n\t\t\t\tmorphPositions.push( attribute );\n\n\t\t\t}\n\n\t\t\t// rigid bodies from rigidBodies field.\n\n\t\t\tfor ( var i = 0; i < data.metadata.rigidBodyCount; i ++ ) {\n\n\t\t\t\tvar rigidBody = data.rigidBodies[ i ];\n\t\t\t\tvar params = {};\n\n\t\t\t\tfor ( var key in rigidBody ) {\n\n\t\t\t\t\tparams[ key ] = rigidBody[ key ];\n\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * RigidBody position parameter in PMX seems global position\n\t\t\t\t * while the one in PMD seems offset from corresponding bone.\n\t\t\t\t * So unify being offset.\n\t\t\t\t */\n\t\t\t\tif ( data.metadata.format === 'pmx' ) {\n\n\t\t\t\t\tif ( params.boneIndex !== - 1 ) {\n\n\t\t\t\t\t\tvar bone = data.bones[ params.boneIndex ];\n\t\t\t\t\t\tparams.position[ 0 ] -= bone.position[ 0 ];\n\t\t\t\t\t\tparams.position[ 1 ] -= bone.position[ 1 ];\n\t\t\t\t\t\tparams.position[ 2 ] -= bone.position[ 2 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\trigidBodies.push( params );\n\n\t\t\t}\n\n\t\t\t// constraints from constraints field.\n\n\t\t\tfor ( var i = 0; i < data.metadata.constraintCount; i ++ ) {\n\n\t\t\t\tvar constraint = data.constraints[ i ];\n\t\t\t\tvar params = {};\n\n\t\t\t\tfor ( var key in constraint ) {\n\n\t\t\t\t\tparams[ key ] = constraint[ key ];\n\n\t\t\t\t}\n\n\t\t\t\tvar bodyA = rigidBodies[ params.rigidBodyIndex1 ];\n\t\t\t\tvar bodyB = rigidBodies[ params.rigidBodyIndex2 ];\n\n\t\t\t\t// Refer to http://www20.atpages.jp/katwat/wp/?p=4135\n\t\t\t\tif ( bodyA.type !== 0 && bodyB.type === 2 ) {\n\n\t\t\t\t\tif ( bodyA.boneIndex !== - 1 && bodyB.boneIndex !== - 1 &&\n\t\t\t\t\t data.bones[ bodyB.boneIndex ].parentIndex === bodyA.boneIndex ) {\n\n\t\t\t\t\t\tbodyB.type = 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconstraints.push( params );\n\n\t\t\t}\n\n\t\t\t// build BufferGeometry.\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\t\tgeometry.setAttribute( 'skinIndex', new Uint16BufferAttribute( skinIndices, 4 ) );\n\t\t\tgeometry.setAttribute( 'skinWeight', new Float32BufferAttribute( skinWeights, 4 ) );\n\t\t\tgeometry.setIndex( indices );\n\n\t\t\tfor ( var i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgeometry.addGroup( groups[ i ].offset, groups[ i ].count, i );\n\n\t\t\t}\n\n\t\t\tgeometry.bones = bones;\n\n\t\t\tgeometry.morphTargets = morphTargets;\n\t\t\tgeometry.morphAttributes.position = morphPositions;\n\t\t\tgeometry.morphTargetsRelative = false;\n\n\t\t\tgeometry.userData.MMD = {\n\t\t\t\tbones: bones,\n\t\t\t\tiks: iks,\n\t\t\t\tgrants: grants,\n\t\t\t\trigidBodies: rigidBodies,\n\t\t\t\tconstraints: constraints,\n\t\t\t\tformat: data.metadata.format\n\t\t\t};\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t};\n\n\t//\n\n\t/**\n\t * @param {THREE.LoadingManager} manager\n\t */\n\tfunction MaterialBuilder( manager ) {\n\n\t\tthis.manager = manager;\n\n\t\tthis.textureLoader = new TextureLoader( this.manager );\n\t\tthis.tgaLoader = null; // lazy generation\n\n\t}\n\n\tMaterialBuilder.prototype = {\n\n\t\tconstructor: MaterialBuilder,\n\n\t\tcrossOrigin: 'anonymous',\n\n\t\tresourcePath: undefined,\n\n\t\t/**\n\t\t * @param {string} crossOrigin\n\t\t * @return {MaterialBuilder}\n\t\t */\n\t\tsetCrossOrigin: function ( crossOrigin ) {\n\n\t\t\tthis.crossOrigin = crossOrigin;\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * @param {string} resourcePath\n\t\t * @return {MaterialBuilder}\n\t\t */\n\t\tsetResourcePath: function ( resourcePath ) {\n\n\t\t\tthis.resourcePath = resourcePath;\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} data - parsed PMD/PMX data\n\t\t * @param {BufferGeometry} geometry - some properties are dependend on geometry\n\t\t * @param {function} onProgress\n\t\t * @param {function} onError\n\t\t * @return {Array}\n\t\t */\n\t\tbuild: function ( data, geometry /*, onProgress, onError */ ) {\n\n\t\t\tvar materials = [];\n\n\t\t\tvar textures = {};\n\n\t\t\tthis.textureLoader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t// materials\n\n\t\t\tfor ( var i = 0; i < data.metadata.materialCount; i ++ ) {\n\n\t\t\t\tvar material = data.materials[ i ];\n\n\t\t\t\tvar params = { userData: {} };\n\n\t\t\t\tif ( material.name !== undefined ) params.name = material.name;\n\n\t\t\t\t/*\n\t\t\t\t * Color\n\t\t\t\t *\n\t\t\t\t * MMD MeshToonMaterial\n\t\t\t\t * diffuse - color\n\t\t\t\t * specular - specular\n\t\t\t\t * ambient - emissive * a\n\t\t\t\t * (a = 1.0 without map texture or 0.2 with map texture)\n\t\t\t\t *\n\t\t\t\t * MeshToonMaterial doesn't have ambient. Set it to emissive instead.\n\t\t\t\t * It'll be too bright if material has map texture so using coef 0.2.\n\t\t\t\t */\n\t\t\t\tparams.color = new Color().fromArray( material.diffuse );\n\t\t\t\tparams.opacity = material.diffuse[ 3 ];\n\t\t\t\tparams.specular = new Color().fromArray( material.specular );\n\t\t\t\tparams.emissive = new Color().fromArray( material.ambient );\n\t\t\t\tparams.shininess = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\t\t\t\tparams.transparent = params.opacity !== 1.0;\n\n\t\t\t\t//\n\n\t\t\t\tparams.skinning = geometry.bones.length > 0 ? true : false;\n\t\t\t\tparams.morphTargets = geometry.morphTargets.length > 0 ? true : false;\n\t\t\t\tparams.fog = true;\n\n\t\t\t\t// blend\n\n\t\t\t\tparams.blending = CustomBlending;\n\t\t\t\tparams.blendSrc = SrcAlphaFactor;\n\t\t\t\tparams.blendDst = OneMinusSrcAlphaFactor;\n\t\t\t\tparams.blendSrcAlpha = SrcAlphaFactor;\n\t\t\t\tparams.blendDstAlpha = DstAlphaFactor;\n\n\t\t\t\t// side\n\n\t\t\t\tif ( data.metadata.format === 'pmx' && ( material.flag & 0x1 ) === 1 ) {\n\n\t\t\t\t\tparams.side = DoubleSide;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tparams.side = params.opacity === 1.0 ? FrontSide : DoubleSide;\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.metadata.format === 'pmd' ) {\n\n\t\t\t\t\t// map, envMap\n\n\t\t\t\t\tif ( material.fileName ) {\n\n\t\t\t\t\t\tvar fileName = material.fileName;\n\t\t\t\t\t\tvar fileNames = fileName.split( '*' );\n\n\t\t\t\t\t\t// fileNames[ 0 ]: mapFileName\n\t\t\t\t\t\t// fileNames[ 1 ]: envMapFileName( optional )\n\n\t\t\t\t\t\tparams.map = this._loadTexture( fileNames[ 0 ], textures );\n\n\t\t\t\t\t\tif ( fileNames.length > 1 ) {\n\n\t\t\t\t\t\t\tvar extension = fileNames[ 1 ].slice( - 4 ).toLowerCase();\n\n\t\t\t\t\t\t\tparams.envMap = this._loadTexture(\n\t\t\t\t\t\t\t\tfileNames[ 1 ],\n\t\t\t\t\t\t\t\ttextures\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tparams.combine = extension === '.sph'\n\t\t\t\t\t\t\t\t? MultiplyOperation\n\t\t\t\t\t\t\t\t: AddOperation;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// gradientMap\n\n\t\t\t\t\tvar toonFileName = ( material.toonIndex === - 1 )\n\t\t\t\t\t\t? 'toon00.bmp'\n\t\t\t\t\t\t: data.toonTextures[ material.toonIndex ].fileName;\n\n\t\t\t\t\tparams.gradientMap = this._loadTexture(\n\t\t\t\t\t\ttoonFileName,\n\t\t\t\t\t\ttextures,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tisToonTexture: true,\n\t\t\t\t\t\t\tisDefaultToonTexture: this._isDefaultToonTexture( toonFileName )\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// parameters for OutlineEffect\n\n\t\t\t\t\tparams.userData.outlineParameters = {\n\t\t\t\t\t\tthickness: material.edgeFlag === 1 ? 0.003 : 0.0,\n\t\t\t\t\t\tcolor: [ 0, 0, 0 ],\n\t\t\t\t\t\talpha: 1.0,\n\t\t\t\t\t\tvisible: material.edgeFlag === 1\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// map\n\n\t\t\t\t\tif ( material.textureIndex !== - 1 ) {\n\n\t\t\t\t\t\tparams.map = this._loadTexture( data.textures[ material.textureIndex ], textures );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// envMap TODO: support m.envFlag === 3\n\n\t\t\t\t\tif ( material.envTextureIndex !== - 1 && ( material.envFlag === 1 || material.envFlag == 2 ) ) {\n\n\t\t\t\t\t\tparams.envMap = this._loadTexture(\n\t\t\t\t\t\t\tdata.textures[ material.envTextureIndex ],\n\t\t\t\t\t\t\ttextures\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tparams.combine = material.envFlag === 1\n\t\t\t\t\t\t\t? MultiplyOperation\n\t\t\t\t\t\t\t: AddOperation;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// gradientMap\n\n\t\t\t\t\tvar toonFileName, isDefaultToon;\n\n\t\t\t\t\tif ( material.toonIndex === - 1 || material.toonFlag !== 0 ) {\n\n\t\t\t\t\t\ttoonFileName = 'toon' + ( '0' + ( material.toonIndex + 1 ) ).slice( - 2 ) + '.bmp';\n\t\t\t\t\t\tisDefaultToon = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttoonFileName = data.textures[ material.toonIndex ];\n\t\t\t\t\t\tisDefaultToon = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tparams.gradientMap = this._loadTexture(\n\t\t\t\t\t\ttoonFileName,\n\t\t\t\t\t\ttextures,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tisToonTexture: true,\n\t\t\t\t\t\t\tisDefaultToonTexture: isDefaultToon\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t// parameters for OutlineEffect\n\t\t\t\t\tparams.userData.outlineParameters = {\n\t\t\t\t\t\tthickness: material.edgeSize / 300, // TODO: better calculation?\n\t\t\t\t\t\tcolor: material.edgeColor.slice( 0, 3 ),\n\t\t\t\t\t\talpha: material.edgeColor[ 3 ],\n\t\t\t\t\t\tvisible: ( material.flag & 0x10 ) !== 0 && material.edgeSize > 0.0\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tif ( params.map !== undefined ) {\n\n\t\t\t\t\tif ( ! params.transparent ) {\n\n\t\t\t\t\t\tthis._checkImageTransparency( params.map, geometry, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tparams.emissive.multiplyScalar( 0.2 );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.push( new MeshToonMaterial( params ) );\n\n\t\t\t}\n\n\t\t\tif ( data.metadata.format === 'pmx' ) {\n\n\t\t\t\t// set transparent true if alpha morph is defined.\n\n\t\t\t\tfunction checkAlphaMorph( elements, materials ) {\n\n\t\t\t\t\tfor ( var i = 0, il = elements.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tvar element = elements[ i ];\n\n\t\t\t\t\t\tif ( element.index === - 1 ) continue;\n\n\t\t\t\t\t\tvar material = materials[ element.index ];\n\n\t\t\t\t\t\tif ( material.opacity !== element.diffuse[ 3 ] ) {\n\n\t\t\t\t\t\t\tmaterial.transparent = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0, il = data.morphs.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar morph = data.morphs[ i ];\n\t\t\t\t\tvar elements = morph.elements;\n\n\t\t\t\t\tif ( morph.type === 0 ) {\n\n\t\t\t\t\t\tfor ( var j = 0, jl = elements.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tvar morph2 = data.morphs[ elements[ j ].index ];\n\n\t\t\t\t\t\t\tif ( morph2.type !== 8 ) continue;\n\n\t\t\t\t\t\t\tcheckAlphaMorph( morph2.elements, materials );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( morph.type === 8 ) {\n\n\t\t\t\t\t\tcheckAlphaMorph( elements, materials );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\t// private methods\n\n\t\t_getTGALoader: function () {\n\n\t\t\tif ( this.tgaLoader === null ) {\n\n\t\t\t\tif ( TGALoader === undefined ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.MMDLoader: Import TGALoader' );\n\n\t\t\t\t}\n\n\t\t\t\tthis.tgaLoader = new TGALoader( this.manager );\n\n\t\t\t}\n\n\t\t\treturn this.tgaLoader;\n\n\t\t},\n\n\t\t_isDefaultToonTexture: function ( name ) {\n\n\t\t\tif ( name.length !== 10 ) return false;\n\n\t\t\treturn /toon(10|0[0-9])\\.bmp/.test( name );\n\n\t\t},\n\n\t\t_loadTexture: function ( filePath, textures, params, onProgress, onError ) {\n\n\t\t\tparams = params || {};\n\n\t\t\tvar scope = this;\n\n\t\t\tvar fullPath;\n\n\t\t\tif ( params.isDefaultToonTexture === true ) {\n\n\t\t\t\tvar index;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tindex = parseInt( filePath.match( /toon([0-9]{2})\\.bmp$/ )[ 1 ] );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MMDLoader: ' + filePath + ' seems like a '\n\t\t\t\t\t\t+ 'not right default texture path. Using toon00.bmp instead.' );\n\n\t\t\t\t\tindex = 0;\n\n\t\t\t\t}\n\n\t\t\t\tfullPath = DEFAULT_TOON_TEXTURES[ index ];\n\n\t\t\t} else {\n\n\t\t\t\tfullPath = this.resourcePath + filePath;\n\n\t\t\t}\n\n\t\t\tif ( textures[ fullPath ] !== undefined ) return textures[ fullPath ];\n\n\t\t\tvar loader = this.manager.getHandler( fullPath );\n\n\t\t\tif ( loader === null ) {\n\n\t\t\t\tloader = ( filePath.slice( - 4 ).toLowerCase() === '.tga' )\n\t\t\t\t\t? this._getTGALoader()\n\t\t\t\t\t: this.textureLoader;\n\n\t\t\t}\n\n\t\t\tvar texture = loader.load( fullPath, function ( t ) {\n\n\t\t\t\t// MMD toon texture is Axis-Y oriented\n\t\t\t\t// but Three.js gradient map is Axis-X oriented.\n\t\t\t\t// So here replaces the toon texture image with the rotated one.\n\t\t\t\tif ( params.isToonTexture === true ) {\n\n\t\t\t\t\tt.image = scope._getRotatedImage( t.image );\n\n\t\t\t\t\tt.magFilter = NearestFilter;\n\t\t\t\t\tt.minFilter = NearestFilter;\n\n\t\t\t\t}\n\n\t\t\t\tt.flipY = false;\n\t\t\t\tt.wrapS = RepeatWrapping;\n\t\t\t\tt.wrapT = RepeatWrapping;\n\n\t\t\t\tfor ( var i = 0; i < texture.readyCallbacks.length; i ++ ) {\n\n\t\t\t\t\ttexture.readyCallbacks[ i ]( texture );\n\n\t\t\t\t}\n\n\t\t\t\tdelete texture.readyCallbacks;\n\n\t\t\t}, onProgress, onError );\n\n\t\t\ttexture.readyCallbacks = [];\n\n\t\t\ttextures[ fullPath ] = texture;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\t_getRotatedImage: function ( image ) {\n\n\t\t\tvar canvas = document.createElement( 'canvas' );\n\t\t\tvar context = canvas.getContext( '2d' );\n\n\t\t\tvar width = image.width;\n\t\t\tvar height = image.height;\n\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\n\t\t\tcontext.clearRect( 0, 0, width, height );\n\t\t\tcontext.translate( width / 2.0, height / 2.0 );\n\t\t\tcontext.rotate( 0.5 * Math.PI ); // 90.0 * Math.PI / 180.0\n\t\t\tcontext.translate( - width / 2.0, - height / 2.0 );\n\t\t\tcontext.drawImage( image, 0, 0 );\n\n\t\t\treturn context.getImageData( 0, 0, width, height );\n\n\t\t},\n\n\t\t// Check if the partial image area used by the texture is transparent.\n\t\t_checkImageTransparency: function ( map, geometry, groupIndex ) {\n\n\t\t\tmap.readyCallbacks.push( function ( texture ) {\n\n\t\t\t\t// Is there any efficient ways?\n\t\t\t\tfunction createImageData( image ) {\n\n\t\t\t\t\tvar canvas = document.createElement( 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\t\tcontext.drawImage( image, 0, 0 );\n\n\t\t\t\t\treturn context.getImageData( 0, 0, canvas.width, canvas.height );\n\n\t\t\t\t}\n\n\t\t\t\tfunction detectImageTransparency( image, uvs, indices ) {\n\n\t\t\t\t\tvar width = image.width;\n\t\t\t\t\tvar height = image.height;\n\t\t\t\t\tvar data = image.data;\n\t\t\t\t\tvar threshold = 253;\n\n\t\t\t\t\tif ( data.length / ( width * height ) !== 4 ) return false;\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\tvar centerUV = { x: 0.0, y: 0.0 };\n\n\t\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tvar index = indices[ i * 3 + j ];\n\t\t\t\t\t\t\tvar uv = { x: uvs[ index * 2 + 0 ], y: uvs[ index * 2 + 1 ] };\n\n\t\t\t\t\t\t\tif ( getAlphaByUv( image, uv ) < threshold ) return true;\n\n\t\t\t\t\t\t\tcenterUV.x += uv.x;\n\t\t\t\t\t\t\tcenterUV.y += uv.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcenterUV.x /= 3;\n\t\t\t\t\t\tcenterUV.y /= 3;\n\n\t\t\t\t\t\tif ( getAlphaByUv( image, centerUV ) < threshold ) return true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * This method expects\n\t\t\t\t * texture.flipY = false\n\t\t\t\t * texture.wrapS = RepeatWrapping\n\t\t\t\t * texture.wrapT = RepeatWrapping\n\t\t\t\t * TODO: more precise\n\t\t\t\t */\n\t\t\t\tfunction getAlphaByUv( image, uv ) {\n\n\t\t\t\t\tvar width = image.width;\n\t\t\t\t\tvar height = image.height;\n\n\t\t\t\t\tvar x = Math.round( uv.x * width ) % width;\n\t\t\t\t\tvar y = Math.round( uv.y * height ) % height;\n\n\t\t\t\t\tif ( x < 0 ) x += width;\n\t\t\t\t\tif ( y < 0 ) y += height;\n\n\t\t\t\t\tvar index = y * width + x;\n\n\t\t\t\t\treturn image.data[ index * 4 + 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tvar imageData = texture.image.data !== undefined\n\t\t\t\t\t? texture.image\n\t\t\t\t\t: createImageData( texture.image );\n\n\t\t\t\tvar group = geometry.groups[ groupIndex ];\n\n\t\t\t\tif ( detectImageTransparency(\n\t\t\t\t\timageData,\n\t\t\t\t\tgeometry.attributes.uv.array,\n\t\t\t\t\tgeometry.index.array.slice( group.start, group.start + group.count ) ) ) {\n\n\t\t\t\t\tmap.transparent = true;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction AnimationBuilder() {\n\n\t}\n\n\tAnimationBuilder.prototype = {\n\n\t\tconstructor: AnimationBuilder,\n\n\t\t/**\n\t\t * @param {Object} vmd - parsed VMD data\n\t\t * @param {SkinnedMesh} mesh - tracks will be fitting to mesh\n\t\t * @return {AnimationClip}\n\t\t */\n\t\tbuild: function ( vmd, mesh ) {\n\n\t\t\t// combine skeletal and morph animations\n\n\t\t\tvar tracks = this.buildSkeletalAnimation( vmd, mesh ).tracks;\n\t\t\tvar tracks2 = this.buildMorphAnimation( vmd, mesh ).tracks;\n\n\t\t\tfor ( var i = 0, il = tracks2.length; i < il; i ++ ) {\n\n\t\t\t\ttracks.push( tracks2[ i ] );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( '', - 1, tracks );\n\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} vmd - parsed VMD data\n\t\t * @param {SkinnedMesh} mesh - tracks will be fitting to mesh\n\t\t * @return {AnimationClip}\n\t\t */\n\t\tbuildSkeletalAnimation: function ( vmd, mesh ) {\n\n\t\t\tfunction pushInterpolation( array, interpolation, index ) {\n\n\t\t\t\tarray.push( interpolation[ index + 0 ] / 127 ); // x1\n\t\t\t\tarray.push( interpolation[ index + 8 ] / 127 ); // x2\n\t\t\t\tarray.push( interpolation[ index + 4 ] / 127 ); // y1\n\t\t\t\tarray.push( interpolation[ index + 12 ] / 127 ); // y2\n\n\t\t\t}\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar motions = {};\n\t\t\tvar bones = mesh.skeleton.bones;\n\t\t\tvar boneNameDictionary = {};\n\n\t\t\tfor ( var i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t\tboneNameDictionary[ bones[ i ].name ] = true;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < vmd.metadata.motionCount; i ++ ) {\n\n\t\t\t\tvar motion = vmd.motions[ i ];\n\t\t\t\tvar boneName = motion.boneName;\n\n\t\t\t\tif ( boneNameDictionary[ boneName ] === undefined ) continue;\n\n\t\t\t\tmotions[ boneName ] = motions[ boneName ] || [];\n\t\t\t\tmotions[ boneName ].push( motion );\n\n\t\t\t}\n\n\t\t\tfor ( var key in motions ) {\n\n\t\t\t\tvar array = motions[ key ];\n\n\t\t\t\tarray.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a.frameNum - b.frameNum;\n\n\t\t\t\t} );\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar positions = [];\n\t\t\t\tvar rotations = [];\n\t\t\t\tvar pInterpolations = [];\n\t\t\t\tvar rInterpolations = [];\n\n\t\t\t\tvar basePosition = mesh.skeleton.getBoneByName( key ).position.toArray();\n\n\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\tvar time = array[ i ].frameNum / 30;\n\t\t\t\t\tvar position = array[ i ].position;\n\t\t\t\t\tvar rotation = array[ i ].rotation;\n\t\t\t\t\tvar interpolation = array[ i ].interpolation;\n\n\t\t\t\t\ttimes.push( time );\n\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) positions.push( basePosition[ j ] + position[ j ] );\n\t\t\t\t\tfor ( var j = 0; j < 4; j ++ ) rotations.push( rotation[ j ] );\n\t\t\t\t\tfor ( var j = 0; j < 3; j ++ ) pushInterpolation( pInterpolations, interpolation, j );\n\n\t\t\t\t\tpushInterpolation( rInterpolations, interpolation, 3 );\n\n\t\t\t\t}\n\n\t\t\t\tvar targetName = '.bones[' + key + ']';\n\n\t\t\t\ttracks.push( this._createTrack( targetName + '.position', VectorKeyframeTrack, times, positions, pInterpolations ) );\n\t\t\t\ttracks.push( this._createTrack( targetName + '.quaternion', QuaternionKeyframeTrack, times, rotations, rInterpolations ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( '', - 1, tracks );\n\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} vmd - parsed VMD data\n\t\t * @param {SkinnedMesh} mesh - tracks will be fitting to mesh\n\t\t * @return {AnimationClip}\n\t\t */\n\t\tbuildMorphAnimation: function ( vmd, mesh ) {\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar morphs = {};\n\t\t\tvar morphTargetDictionary = mesh.morphTargetDictionary;\n\n\t\t\tfor ( var i = 0; i < vmd.metadata.morphCount; i ++ ) {\n\n\t\t\t\tvar morph = vmd.morphs[ i ];\n\t\t\t\tvar morphName = morph.morphName;\n\n\t\t\t\tif ( morphTargetDictionary[ morphName ] === undefined ) continue;\n\n\t\t\t\tmorphs[ morphName ] = morphs[ morphName ] || [];\n\t\t\t\tmorphs[ morphName ].push( morph );\n\n\t\t\t}\n\n\t\t\tfor ( var key in morphs ) {\n\n\t\t\t\tvar array = morphs[ key ];\n\n\t\t\t\tarray.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a.frameNum - b.frameNum;\n\n\t\t\t\t} );\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\ttimes.push( array[ i ].frameNum / 30 );\n\t\t\t\t\tvalues.push( array[ i ].weight );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluences[' + morphTargetDictionary[ key ] + ']', times, values ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( '', - 1, tracks );\n\n\t\t},\n\n\t\t/**\n\t\t * @param {Object} vmd - parsed VMD data\n\t\t * @return {AnimationClip}\n\t\t */\n\t\tbuildCameraAnimation: function ( vmd ) {\n\n\t\t\tfunction pushVector3( array, vec ) {\n\n\t\t\t\tarray.push( vec.x );\n\t\t\t\tarray.push( vec.y );\n\t\t\t\tarray.push( vec.z );\n\n\t\t\t}\n\n\t\t\tfunction pushQuaternion( array, q ) {\n\n\t\t\t\tarray.push( q.x );\n\t\t\t\tarray.push( q.y );\n\t\t\t\tarray.push( q.z );\n\t\t\t\tarray.push( q.w );\n\n\t\t\t}\n\n\t\t\tfunction pushInterpolation( array, interpolation, index ) {\n\n\t\t\t\tarray.push( interpolation[ index * 4 + 0 ] / 127 ); // x1\n\t\t\t\tarray.push( interpolation[ index * 4 + 1 ] / 127 ); // x2\n\t\t\t\tarray.push( interpolation[ index * 4 + 2 ] / 127 ); // y1\n\t\t\t\tarray.push( interpolation[ index * 4 + 3 ] / 127 ); // y2\n\n\t\t\t}\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar cameras = vmd.cameras === undefined ? [] : vmd.cameras.slice();\n\n\t\t\tcameras.sort( function ( a, b ) {\n\n\t\t\t\treturn a.frameNum - b.frameNum;\n\n\t\t\t} );\n\n\t\t\tvar times = [];\n\t\t\tvar centers = [];\n\t\t\tvar quaternions = [];\n\t\t\tvar positions = [];\n\t\t\tvar fovs = [];\n\n\t\t\tvar cInterpolations = [];\n\t\t\tvar qInterpolations = [];\n\t\t\tvar pInterpolations = [];\n\t\t\tvar fInterpolations = [];\n\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar euler = new Euler();\n\t\t\tvar position = new Vector3();\n\t\t\tvar center = new Vector3();\n\n\t\t\tfor ( var i = 0, il = cameras.length; i < il; i ++ ) {\n\n\t\t\t\tvar motion = cameras[ i ];\n\n\t\t\t\tvar time = motion.frameNum / 30;\n\t\t\t\tvar pos = motion.position;\n\t\t\t\tvar rot = motion.rotation;\n\t\t\t\tvar distance = motion.distance;\n\t\t\t\tvar fov = motion.fov;\n\t\t\t\tvar interpolation = motion.interpolation;\n\n\t\t\t\ttimes.push( time );\n\n\t\t\t\tposition.set( 0, 0, - distance );\n\t\t\t\tcenter.set( pos[ 0 ], pos[ 1 ], pos[ 2 ] );\n\n\t\t\t\teuler.set( - rot[ 0 ], - rot[ 1 ], - rot[ 2 ] );\n\t\t\t\tquaternion.setFromEuler( euler );\n\n\t\t\t\tposition.add( center );\n\t\t\t\tposition.applyQuaternion( quaternion );\n\n\t\t\t\tpushVector3( centers, center );\n\t\t\t\tpushQuaternion( quaternions, quaternion );\n\t\t\t\tpushVector3( positions, position );\n\n\t\t\t\tfovs.push( fov );\n\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tpushInterpolation( cInterpolations, interpolation, j );\n\n\t\t\t\t}\n\n\t\t\t\tpushInterpolation( qInterpolations, interpolation, 3 );\n\n\t\t\t\t// use the same parameter for x, y, z axis.\n\t\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tpushInterpolation( pInterpolations, interpolation, 4 );\n\n\t\t\t\t}\n\n\t\t\t\tpushInterpolation( fInterpolations, interpolation, 5 );\n\n\t\t\t}\n\n\t\t\tvar tracks = [];\n\n\t\t\t// I expect an object whose name 'target' exists under THREE.Camera\n\t\t\ttracks.push( this._createTrack( 'target.position', VectorKeyframeTrack, times, centers, cInterpolations ) );\n\n\t\t\ttracks.push( this._createTrack( '.quaternion', QuaternionKeyframeTrack, times, quaternions, qInterpolations ) );\n\t\t\ttracks.push( this._createTrack( '.position', VectorKeyframeTrack, times, positions, pInterpolations ) );\n\t\t\ttracks.push( this._createTrack( '.fov', NumberKeyframeTrack, times, fovs, fInterpolations ) );\n\n\t\t\treturn new AnimationClip( '', - 1, tracks );\n\n\t\t},\n\n\t\t// private method\n\n\t\t_createTrack: function ( node, typedKeyframeTrack, times, values, interpolations ) {\n\n\t\t\t/*\n\t\t\t * optimizes here not to let KeyframeTrackPrototype optimize\n\t\t\t * because KeyframeTrackPrototype optimizes times and values but\n\t\t\t * doesn't optimize interpolations.\n\t\t\t */\n\t\t\tif ( times.length > 2 ) {\n\n\t\t\t\ttimes = times.slice();\n\t\t\t\tvalues = values.slice();\n\t\t\t\tinterpolations = interpolations.slice();\n\n\t\t\t\tvar stride = values.length / times.length;\n\t\t\t\tvar interpolateStride = interpolations.length / times.length;\n\n\t\t\t\tvar index = 1;\n\n\t\t\t\tfor ( var aheadIndex = 2, endIndex = times.length; aheadIndex < endIndex; aheadIndex ++ ) {\n\n\t\t\t\t\tfor ( var i = 0; i < stride; i ++ ) {\n\n\t\t\t\t\t\tif ( values[ index * stride + i ] !== values[ ( index - 1 ) * stride + i ] ||\n\t\t\t\t\t\t\tvalues[ index * stride + i ] !== values[ aheadIndex * stride + i ] ) {\n\n\t\t\t\t\t\t\tindex ++;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( aheadIndex > index ) {\n\n\t\t\t\t\t\ttimes[ index ] = times[ aheadIndex ];\n\n\t\t\t\t\t\tfor ( var i = 0; i < stride; i ++ ) {\n\n\t\t\t\t\t\t\tvalues[ index * stride + i ] = values[ aheadIndex * stride + i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( var i = 0; i < interpolateStride; i ++ ) {\n\n\t\t\t\t\t\t\tinterpolations[ index * interpolateStride + i ] = interpolations[ aheadIndex * interpolateStride + i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\ttimes.length = index + 1;\n\t\t\t\tvalues.length = ( index + 1 ) * stride;\n\t\t\t\tinterpolations.length = ( index + 1 ) * interpolateStride;\n\n\t\t\t}\n\n\t\t\tvar track = new typedKeyframeTrack( node, times, values );\n\n\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodCubicBezier( result ) {\n\n\t\t\t\treturn new CubicBezierInterpolation( this.times, this.values, this.getValueSize(), result, new Float32Array( interpolations ) );\n\n\t\t\t};\n\n\t\t\treturn track;\n\n\t\t}\n\n\t};\n\n\t// interpolation\n\n\tfunction CubicBezierInterpolation( parameterPositions, sampleValues, sampleSize, resultBuffer, params ) {\n\n\t\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis.interpolationParams = params;\n\n\t}\n\n\tCubicBezierInterpolation.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicBezierInterpolation,\n\n\t\tinterpolate_: function ( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer;\n\t\t\tvar values = this.sampleValues;\n\t\t\tvar stride = this.valueSize;\n\t\t\tvar params = this.interpolationParams;\n\n\t\t\tvar offset1 = i1 * stride;\n\t\t\tvar offset0 = offset1 - stride;\n\n\t\t\t// No interpolation if next key frame is in one frame in 30fps.\n\t\t\t// This is from MMD animation spec.\n\t\t\t// '1.5' is for precision loss. times are Float32 in Three.js Animation system.\n\t\t\tvar weight1 = ( ( t1 - t0 ) < 1 / 30 * 1.5 ) ? 0.0 : ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tif ( stride === 4 ) { // Quaternion\n\n\t\t\t\tvar x1 = params[ i1 * 4 + 0 ];\n\t\t\t\tvar x2 = params[ i1 * 4 + 1 ];\n\t\t\t\tvar y1 = params[ i1 * 4 + 2 ];\n\t\t\t\tvar y2 = params[ i1 * 4 + 3 ];\n\n\t\t\t\tvar ratio = this._calculate( x1, x2, y1, y2, weight1 );\n\n\t\t\t\tQuaternion.slerpFlat( result, 0, values, offset0, values, offset1, ratio );\n\n\t\t\t} else if ( stride === 3 ) { // Vector3\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tvar x1 = params[ i1 * 12 + i * 4 + 0 ];\n\t\t\t\t\tvar x2 = params[ i1 * 12 + i * 4 + 1 ];\n\t\t\t\t\tvar y1 = params[ i1 * 12 + i * 4 + 2 ];\n\t\t\t\t\tvar y2 = params[ i1 * 12 + i * 4 + 3 ];\n\n\t\t\t\t\tvar ratio = this._calculate( x1, x2, y1, y2, weight1 );\n\n\t\t\t\t\tresult[ i ] = values[ offset0 + i ] * ( 1 - ratio ) + values[ offset1 + i ] * ratio;\n\n\t\t\t\t}\n\n\t\t\t} else { // Number\n\n\t\t\t\tvar x1 = params[ i1 * 4 + 0 ];\n\t\t\t\tvar x2 = params[ i1 * 4 + 1 ];\n\t\t\t\tvar y1 = params[ i1 * 4 + 2 ];\n\t\t\t\tvar y2 = params[ i1 * 4 + 3 ];\n\n\t\t\t\tvar ratio = this._calculate( x1, x2, y1, y2, weight1 );\n\n\t\t\t\tresult[ 0 ] = values[ offset0 ] * ( 1 - ratio ) + values[ offset1 ] * ratio;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t_calculate: function ( x1, x2, y1, y2, x ) {\n\n\t\t\t/*\n\t\t\t * Cubic Bezier curves\n\t\t\t * https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B.C3.A9zier_curves\n\t\t\t *\n\t\t\t * B(t) = ( 1 - t ) ^ 3 * P0\n\t\t\t * + 3 * ( 1 - t ) ^ 2 * t * P1\n\t\t\t * + 3 * ( 1 - t ) * t^2 * P2\n\t\t\t * + t ^ 3 * P3\n\t\t\t * ( 0 <= t <= 1 )\n\t\t\t *\n\t\t\t * MMD uses Cubic Bezier curves for bone and camera animation interpolation.\n\t\t\t * http://d.hatena.ne.jp/edvakf/20111016/1318716097\n\t\t\t *\n\t\t\t * x = ( 1 - t ) ^ 3 * x0\n\t\t\t * + 3 * ( 1 - t ) ^ 2 * t * x1\n\t\t\t * + 3 * ( 1 - t ) * t^2 * x2\n\t\t\t * + t ^ 3 * x3\n\t\t\t * y = ( 1 - t ) ^ 3 * y0\n\t\t\t * + 3 * ( 1 - t ) ^ 2 * t * y1\n\t\t\t * + 3 * ( 1 - t ) * t^2 * y2\n\t\t\t * + t ^ 3 * y3\n\t\t\t * ( x0 = 0, y0 = 0 )\n\t\t\t * ( x3 = 1, y3 = 1 )\n\t\t\t * ( 0 <= t, x1, x2, y1, y2 <= 1 )\n\t\t\t *\n\t\t\t * Here solves this equation with Bisection method,\n\t\t\t * https://en.wikipedia.org/wiki/Bisection_method\n\t\t\t * gets t, and then calculate y.\n\t\t\t *\n\t\t\t * f(t) = 3 * ( 1 - t ) ^ 2 * t * x1\n\t\t\t * + 3 * ( 1 - t ) * t^2 * x2\n\t\t\t * + t ^ 3 - x = 0\n\t\t\t *\n\t\t\t * (Another option: Newton's method\n\t\t\t * https://en.wikipedia.org/wiki/Newton%27s_method)\n\t\t\t */\n\n\t\t\tvar c = 0.5;\n\t\t\tvar t = c;\n\t\t\tvar s = 1.0 - t;\n\t\t\tvar loop = 15;\n\t\t\tvar eps = 1e-5;\n\t\t\tvar math = Math;\n\n\t\t\tvar sst3, stt3, ttt;\n\n\t\t\tfor ( var i = 0; i < loop; i ++ ) {\n\n\t\t\t\tsst3 = 3.0 * s * s * t;\n\t\t\t\tstt3 = 3.0 * s * t * t;\n\t\t\t\tttt = t * t * t;\n\n\t\t\t\tvar ft = ( sst3 * x1 ) + ( stt3 * x2 ) + ( ttt ) - x;\n\n\t\t\t\tif ( math.abs( ft ) < eps ) break;\n\n\t\t\t\tc /= 2.0;\n\n\t\t\t\tt += ( ft < 0 ) ? c : - c;\n\t\t\t\ts = 1.0 - t;\n\n\t\t\t}\n\n\t\t\treturn ( sst3 * y1 ) + ( stt3 * y2 ) + ttt;\n\n\t\t}\n\n\t} );\n\n\treturn MMDLoader;\n\n} )();\n\nexport { MMDLoader };\n","\n\n\n\n
\n
🎭 STAGE PANEL
\n
\n

(Experimental) Select a bundled character model from the list below.

\n \n \n

Select a bundled scene from the list below.

\n \n \n
status: {statusMsg}
\n {#if selectedScene != null}\n
scene description: {selectedScene.description}
\n {/if}\n
\n
\n","\n\n\n\n\n","import {\n\tEventDispatcher,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3\n} from \"../../../build/three.module.js\";\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n// Orbit - left mouse / touch: one-finger move\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move\n\nvar OrbitControls = function ( object, domElement ) {\n\n\tif ( domElement === undefined ) console.warn( 'THREE.OrbitControls: The second parameter \"domElement\" is now mandatory.' );\n\tif ( domElement === document ) console.error( 'THREE.OrbitControls: \"document\" should not be used as the target \"domElement\". Please use \"renderer.domElement\" instead.' );\n\n\tthis.object = object;\n\tthis.domElement = domElement;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, the interval [ min, max ] must be a sub-interval of [ - 2 PI, 2 PI ], with ( max - min < 2 PI )\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.05;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.panSpeed = 1.0;\n\tthis.screenSpacePanning = true; // if false, pan orthogonal to world-space direction camera.up\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t// Touch fingers\n\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn spherical.phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn spherical.theta;\n\n\t};\n\n\tthis.saveState = function () {\n\n\t\tscope.target0.copy( scope.target );\n\t\tscope.position0.copy( scope.object.position );\n\t\tscope.zoom0 = scope.object.zoom;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function () {\n\n\t\tvar offset = new Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new Vector3();\n\t\tvar lastQuaternion = new Quaternion();\n\n\t\tvar twoPI = 2 * Math.PI;\n\n\t\treturn function update() {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\t\t\tspherical.setFromVector3( offset );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\tif ( scope.enableDamping ) {\n\n\t\t\t\tspherical.theta += sphericalDelta.theta * scope.dampingFactor;\n\t\t\t\tspherical.phi += sphericalDelta.phi * scope.dampingFactor;\n\n\t\t\t} else {\n\n\t\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t}\n\n\t\t\t// restrict theta to be between desired limits\n\n\t\t\tvar min = scope.minAzimuthAngle;\n\t\t\tvar max = scope.maxAzimuthAngle;\n\n\t\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\t\tif ( min < - Math.PI ) min += twoPI; else if ( min > Math.PI ) min -= twoPI;\n\n\t\t\t\tif ( max < - Math.PI ) max += twoPI; else if ( max > Math.PI ) max -= twoPI;\n\n\t\t\t\tif ( min < max ) {\n\n\t\t\t\t\tspherical.theta = Math.max( min, Math.min( max, spherical.theta ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tspherical.theta = ( spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\t\tMath.max( min, spherical.theta ) :\n\t\t\t\t\t\tMath.min( max, spherical.theta );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\tspherical.makeSafe();\n\n\n\t\t\tspherical.radius *= scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t// move target to panned location\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tscope.target.addScaledVector( panOffset, scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tscope.target.add( panOffset );\n\n\t\t\t}\n\n\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t\tpanOffset.multiplyScalar( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function () {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'wheel', onMouseWheel, false );\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tscope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tscope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\tscope.domElement.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = {\n\t\tNONE: - 1,\n\t\tROTATE: 0,\n\t\tDOLLY: 1,\n\t\tPAN: 2,\n\t\tTOUCH_ROTATE: 3,\n\t\tTOUCH_PAN: 4,\n\t\tTOUCH_DOLLY_PAN: 5,\n\t\tTOUCH_DOLLY_ROTATE: 6\n\t};\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar spherical = new Spherical();\n\tvar sphericalDelta = new Spherical();\n\n\tvar scale = 1;\n\tvar panOffset = new Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new Vector2();\n\tvar rotateEnd = new Vector2();\n\tvar rotateDelta = new Vector2();\n\n\tvar panStart = new Vector2();\n\tvar panEnd = new Vector2();\n\tvar panDelta = new Vector2();\n\n\tvar dollyStart = new Vector2();\n\tvar dollyEnd = new Vector2();\n\tvar dollyDelta = new Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tsphericalDelta.theta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tsphericalDelta.phi -= angle;\n\n\t}\n\n\tvar panLeft = function () {\n\n\t\tvar v = new Vector3();\n\n\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\tv.multiplyScalar( - distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\tvar panUp = function () {\n\n\t\tvar v = new Vector3();\n\n\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\tif ( scope.screenSpacePanning === true ) {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tv.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t\tv.crossVectors( scope.object.up, v );\n\n\t\t\t}\n\n\t\t\tv.multiplyScalar( distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function () {\n\n\t\tvar offset = new Vector3();\n\n\t\treturn function pan( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement;\n\n\t\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object.isPerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object.isOrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement;\n\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( /*event*/ ) {\n\n\t\t// no-op\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\tvar needsUpdate = false;\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tscope.update();\n\n\t\t}\n\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\trotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartDollyPan( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\tif ( scope.enablePan ) handleTouchStartPan( event );\n\n\t}\n\n\tfunction handleTouchStartDollyRotate( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchStartDolly( event );\n\n\t\tif ( scope.enableRotate ) handleTouchStartRotate( event );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\trotateEnd.set( x, y );\n\n\t\t}\n\n\t\trotateDelta.subVectors( rotateEnd, rotateStart ).multiplyScalar( scope.rotateSpeed );\n\n\t\tvar element = scope.domElement;\n\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\tif ( event.touches.length == 1 ) {\n\n\t\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\t} else {\n\n\t\t\tvar x = 0.5 * ( event.touches[ 0 ].pageX + event.touches[ 1 ].pageX );\n\t\t\tvar y = 0.5 * ( event.touches[ 0 ].pageY + event.touches[ 1 ].pageY );\n\n\t\t\tpanEnd.set( x, y );\n\n\t\t}\n\n\t\tpanDelta.subVectors( panEnd, panStart ).multiplyScalar( scope.panSpeed );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.set( 0, Math.pow( dollyEnd.y / dollyStart.y, scope.zoomSpeed ) );\n\n\t\tdollyOut( dollyDelta.y );\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t}\n\n\tfunction handleTouchMoveDollyPan( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\tif ( scope.enablePan ) handleTouchMovePan( event );\n\n\t}\n\n\tfunction handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( scope.enableZoom ) handleTouchMoveDolly( event );\n\n\t\tif ( scope.enableRotate ) handleTouchMoveRotate( event );\n\n\t}\n\n\tfunction handleTouchEnd( /*event*/ ) {\n\n\t\t// no-op\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\t// Prevent the browser from scrolling.\n\t\tevent.preventDefault();\n\n\t\t// Manually set the focus since calling preventDefault above\n\t\t// prevents the browser from setting it automatically.\n\n\t\tscope.domElement.focus ? scope.domElement.focus() : window.focus();\n\n\t\tvar mouseAction;\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase 0:\n\n\t\t\t\tmouseAction = scope.mouseButtons.LEFT;\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\n\t\t\t\tmouseAction = scope.mouseButtons.MIDDLE;\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\n\t\t\t\tmouseAction = scope.mouseButtons.RIGHT;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tmouseAction = - 1;\n\n\t\t}\n\n\t\tswitch ( mouseAction ) {\n\n\t\t\tcase MOUSE.DOLLY:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseDownDolly( event );\n\n\t\t\t\tstate = STATE.DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase MOUSE.ROTATE:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase MOUSE.PAN:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\thandleMouseDownRotate( event );\n\n\t\t\t\t\tstate = STATE.ROTATE;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\thandleMouseDownPan( event );\n\n\t\t\t\t\tstate = STATE.PAN;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.domElement.ownerDocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tscope.domElement.ownerDocument.addEventListener( 'mouseup', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tswitch ( state ) {\n\n\t\t\tcase STATE.ROTATE:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleMouseMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.DOLLY:\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleMouseMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleMouseMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tscope.domElement.ownerDocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tscope.domElement.ownerDocument.removeEventListener( 'mouseup', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tscope.dispatchEvent( startEvent );\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault(); // prevent scrolling\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\n\t\t\t\tswitch ( scope.touches.ONE ) {\n\n\t\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\n\t\t\t\tswitch ( scope.touches.TWO ) {\n\n\t\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\t\t\thandleTouchStartDollyPan( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\t\t\thandleTouchStartDollyRotate( event );\n\n\t\t\t\t\t\tstate = STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tstate = STATE.NONE;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault(); // prevent scrolling\n\t\tevent.stopPropagation();\n\n\t\tswitch ( state ) {\n\n\t\t\tcase STATE.TOUCH_ROTATE:\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.TOUCH_PAN:\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.TOUCH_DOLLY_PAN:\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchMoveDollyPan( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tcase STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\t\tif ( scope.enableZoom === false && scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchMoveDollyRotate( event );\n\n\t\t\t\tscope.update();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'wheel', onMouseWheel, false );\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\tscope.domElement.addEventListener( 'keydown', onKeyDown, false );\n\n\t// make sure element can receive keys.\n\n\tif ( scope.domElement.tabIndex === - 1 ) {\n\n\t\tscope.domElement.tabIndex = 0;\n\n\t}\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nOrbitControls.prototype = Object.create( EventDispatcher.prototype );\nOrbitControls.prototype.constructor = OrbitControls;\n\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n// This is very similar to OrbitControls, another set of touch behavior\n//\n// Orbit - right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate\n// Zoom - middle mouse, or mousewheel / touch: two-finger spread or squish\n// Pan - left mouse, or arrow keys / touch: one-finger move\n\nvar MapControls = function ( object, domElement ) {\n\n\tOrbitControls.call( this, object, domElement );\n\n\tthis.screenSpacePanning = false; // pan orthogonal to world-space direction camera.up\n\n\tthis.mouseButtons.LEFT = MOUSE.PAN;\n\tthis.mouseButtons.RIGHT = MOUSE.ROTATE;\n\n\tthis.touches.ONE = TOUCH.PAN;\n\tthis.touches.TWO = TOUCH.DOLLY_ROTATE;\n\n};\n\nMapControls.prototype = Object.create( EventDispatcher.prototype );\nMapControls.prototype.constructor = MapControls;\n\nexport { OrbitControls, MapControls };\n","var Stats = function () {\n\n\tvar mode = 0;\n\n\tvar container = document.createElement( 'div' );\n\tcontainer.style.cssText = 'position:fixed;top:0;left:0;cursor:pointer;opacity:0.9;z-index:10000';\n\tcontainer.addEventListener( 'click', function ( event ) {\n\n\t\tevent.preventDefault();\n\t\tshowPanel( ++ mode % container.children.length );\n\n\t}, false );\n\n\t//\n\n\tfunction addPanel( panel ) {\n\n\t\tcontainer.appendChild( panel.dom );\n\t\treturn panel;\n\n\t}\n\n\tfunction showPanel( id ) {\n\n\t\tfor ( var i = 0; i < container.children.length; i ++ ) {\n\n\t\t\tcontainer.children[ i ].style.display = i === id ? 'block' : 'none';\n\n\t\t}\n\n\t\tmode = id;\n\n\t}\n\n\t//\n\n\tvar beginTime = ( performance || Date ).now(), prevTime = beginTime, frames = 0;\n\n\tvar fpsPanel = addPanel( new Stats.Panel( 'FPS', '#0ff', '#002' ) );\n\tvar msPanel = addPanel( new Stats.Panel( 'MS', '#0f0', '#020' ) );\n\n\tif ( self.performance && self.performance.memory ) {\n\n\t\tvar memPanel = addPanel( new Stats.Panel( 'MB', '#f08', '#201' ) );\n\n\t}\n\n\tshowPanel( 0 );\n\n\treturn {\n\n\t\tREVISION: 16,\n\n\t\tdom: container,\n\n\t\taddPanel: addPanel,\n\t\tshowPanel: showPanel,\n\n\t\tbegin: function () {\n\n\t\t\tbeginTime = ( performance || Date ).now();\n\n\t\t},\n\n\t\tend: function () {\n\n\t\t\tframes ++;\n\n\t\t\tvar time = ( performance || Date ).now();\n\n\t\t\tmsPanel.update( time - beginTime, 200 );\n\n\t\t\tif ( time >= prevTime + 1000 ) {\n\n\t\t\t\tfpsPanel.update( ( frames * 1000 ) / ( time - prevTime ), 100 );\n\n\t\t\t\tprevTime = time;\n\t\t\t\tframes = 0;\n\n\t\t\t\tif ( memPanel ) {\n\n\t\t\t\t\tvar memory = performance.memory;\n\t\t\t\t\tmemPanel.update( memory.usedJSHeapSize / 1048576, memory.jsHeapSizeLimit / 1048576 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn time;\n\n\t\t},\n\n\t\tupdate: function () {\n\n\t\t\tbeginTime = this.end();\n\n\t\t},\n\n\t\t// Backwards Compatibility\n\n\t\tdomElement: container,\n\t\tsetMode: showPanel\n\n\t};\n\n};\n\nStats.Panel = function ( name, fg, bg ) {\n\n\tvar min = Infinity, max = 0, round = Math.round;\n\tvar PR = round( window.devicePixelRatio || 1 );\n\n\tvar WIDTH = 80 * PR, HEIGHT = 48 * PR,\n\t\tTEXT_X = 3 * PR, TEXT_Y = 2 * PR,\n\t\tGRAPH_X = 3 * PR, GRAPH_Y = 15 * PR,\n\t\tGRAPH_WIDTH = 74 * PR, GRAPH_HEIGHT = 30 * PR;\n\n\tvar canvas = document.createElement( 'canvas' );\n\tcanvas.width = WIDTH;\n\tcanvas.height = HEIGHT;\n\tcanvas.style.cssText = 'width:80px;height:48px';\n\n\tvar context = canvas.getContext( '2d' );\n\tcontext.font = 'bold ' + ( 9 * PR ) + 'px Helvetica,Arial,sans-serif';\n\tcontext.textBaseline = 'top';\n\n\tcontext.fillStyle = bg;\n\tcontext.fillRect( 0, 0, WIDTH, HEIGHT );\n\n\tcontext.fillStyle = fg;\n\tcontext.fillText( name, TEXT_X, TEXT_Y );\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\tcontext.fillStyle = bg;\n\tcontext.globalAlpha = 0.9;\n\tcontext.fillRect( GRAPH_X, GRAPH_Y, GRAPH_WIDTH, GRAPH_HEIGHT );\n\n\treturn {\n\n\t\tdom: canvas,\n\n\t\tupdate: function ( value, maxValue ) {\n\n\t\t\tmin = Math.min( min, value );\n\t\t\tmax = Math.max( max, value );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 1;\n\t\t\tcontext.fillRect( 0, 0, WIDTH, GRAPH_Y );\n\t\t\tcontext.fillStyle = fg;\n\t\t\tcontext.fillText( round( value ) + ' ' + name + ' (' + round( min ) + '-' + round( max ) + ')', TEXT_X, TEXT_Y );\n\n\t\t\tcontext.drawImage( canvas, GRAPH_X + PR, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT, GRAPH_X, GRAPH_Y, GRAPH_WIDTH - PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, GRAPH_HEIGHT );\n\n\t\t\tcontext.fillStyle = bg;\n\t\t\tcontext.globalAlpha = 0.9;\n\t\t\tcontext.fillRect( GRAPH_X + GRAPH_WIDTH - PR, GRAPH_Y, PR, round( ( 1 - ( value / maxValue ) ) * GRAPH_HEIGHT ) );\n\n\t\t}\n\n\t};\n\n};\n\nexport default Stats;\n","
\n
\n\n\n\n","\n\n\n\n
\n \n {#if !asf.editor.hidden}\n
\n {#if selectedView == 'view'}\n \n {:else if selectedView == 'pose'}\n \n \n {:else if selectedView == 'tweak'}\n \n \n {:else if selectedView == 'animate'}\n \n \n \n {:else if selectedView == 'stage'}\n \n {:else}\n \n {/if}\n
\n {/if}\n \n \n
\n","import App from './App.svelte';\n\nconst app = new App({\n\ttarget: document.body\n});\n\nexport default app;"],"names":["noop","identity","x","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","is_client","window","now","performance","Date","raf","cb","requestAnimationFrame","tasks","Set","run_tasks","task","c","delete","f","size","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","i","length","d","element","name","document","createElement","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","attr","attribute","value","removeAttribute","getAttribute","setAttribute","to_number","undefined","set_data","wholeText","set_input_value","input","set_style","key","important","style","setProperty","select_option","select","option","__value","selected","select_value","selected_option","querySelector","toggle_class","toggle","classList","custom_event","type","detail","e","createEvent","initCustomEvent","active_docs","current_component","active","create_rule","duration","delay","ease","uid","step","keyframes","p","t","rule","str","hash","charCodeAt","doc","ownerDocument","add","stylesheet","__svelte_stylesheet","head","sheet","current_rules","__svelte_rules","insertRule","cssRules","animation","delete_rule","previous","split","next","filter","anim","indexOf","deleted","join","deleteRule","clear","set_current_component","component","get_current_component","Error","onMount","$$","on_mount","push","createEventDispatcher","callbacks","slice","call","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","add_render_callback","add_flush_callback","flushing","seen_callbacks","flush","update","pop","callback","has","fragment","before_update","dirty","ctx","after_update","promise","dispatch","direction","kind","dispatchEvent","outroing","outros","group_outros","r","check_outros","transition_in","block","local","transition_out","o","null_transition","create_bidirectional_transition","params","intro","config","running_program","pending_program","animation_name","clear_animation","init","program","Math","abs","start","end","group","go","easing","tick","css","fulfill","loop","[object Object]","then","bind","index","props","bound","create_component","mount_component","on_destroy","m","new_on_destroy","map","destroy_component","make_dirty","fill","instance","create_fragment","not_equal","parent_component","prop_values","context","Map","skip_bound","ready","ret","rest","hydrate","nodes","Array","from","childNodes","children","l","SvelteComponent","this","$destroy","splice","$$props","obj","$$set","keys","fade","linear","getComputedStyle","opacity","editor","hidden","selectedView","asf","nextView","metadata","player","fps","loaded","shouldRotate","amc","Number","EPSILON","pow","isInteger","isFinite","floor","sign","Function","prototype","defineProperty","get","toString","match","assign","TypeError","output","arguments","source","nextKey","hasOwnProperty","MOUSE","TOUCH","EventDispatcher","listener","_listeners","listeners","hasEventListener","listenerArray","array","_lut","_seed","MathUtils","DEG2RAD","PI","RAD2DEG","generateUUID","d0","random","d1","d2","d3","toUpperCase","clamp","min","max","euclideanModulo","n","mapLinear","a1","a2","b1","b2","lerp","y","smoothstep","smootherstep","randInt","low","high","randFloat","randFloatSpread","range","seededRandom","s","degToRad","degrees","radToDeg","radians","isPowerOfTwo","ceilPowerOfTwo","ceil","log","LN2","floorPowerOfTwo","setQuaternionFromProperEuler","q","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","set","console","warn","Vector2","Matrix3","elements","error","_canvas","defineProperties","width","height","isVector2","setScalar","scalar","setX","setY","setComponent","getComponent","clone","constructor","copy","v","w","addVectors","addScalar","addScaledVector","sub","subVectors","subScalar","multiply","multiplyScalar","divide","divideScalar","applyMatrix3","clampScalar","minVal","maxVal","clampLength","round","roundToZero","negate","dot","cross","lengthSq","sqrt","manhattanLength","normalize","angle","atan2","distanceTo","distanceToSquared","dx","dy","manhattanDistanceTo","setLength","alpha","lerpVectors","v1","v2","equals","fromArray","offset","toArray","fromBufferAttribute","getX","getY","rotateAround","center","isMatrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","te","me","extractBasis","xAxis","yAxis","zAxis","setFromMatrix3Column","setFromMatrix4","multiplyMatrices","premultiply","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","determinant","g","h","getInverse","matrix","throwOnDegenerate","t11","t12","t13","det","detInv","transpose","tmp","getNormalMatrix","matrix4","transposeIntoArray","setUvTransform","tx","ty","sx","sy","rotation","cx","cy","scale","rotate","theta","translate","ImageUtils","getDataURL","image","test","src","HTMLCanvasElement","canvas","createElementNS","getContext","ImageData","putImageData","drawImage","toDataURL","textureId","Texture","mapping","wrapS","wrapT","magFilter","minFilter","format","anisotropy","encoding","uuid","DEFAULT_IMAGE","mipmaps","DEFAULT_MAPPING","internalFormat","repeat","matrixAutoUpdate","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","version","onUpdate","Vector4","z","WebGLRenderTarget","scissor","scissorTest","viewport","texture","depthBuffer","stencilBuffer","depthTexture","WebGLMultisampleRenderTarget","samples","Quaternion","_x","_y","_z","_w","isTexture","updateMatrix","toJSON","meta","isRootObject","textures","generator","wrap","images","url","isArray","dispose","transformUv","uv","isVector4","setZ","setW","applyMatrix4","setAxisAngleFromQuaternion","acos","setAxisAngleFromRotationMatrix","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","getZ","getW","isWebGLRenderTarget","setSize","isWebGLMultisampleRenderTarget","slerp","qa","qb","qm","slerpFlat","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","len","tDir","multiplyQuaternionsFlat","_onChangeCallback","isQuaternion","quaternion","setFromEuler","euler","isEuler","c1","c3","s1","s3","setFromAxisAngle","axis","halfAngle","setFromRotationMatrix","trace","setFromUnitVectors","vFrom","vTo","angleTo","rotateTowards","inverse","conjugate","multiplyQuaternions","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","_onChange","_vector","Vector3","_quaternion","isVector3","multiplyVectors","applyEuler","applyQuaternion","applyAxisAngle","applyNormalMatrix","qx","qy","qz","qw","ix","iy","iz","iw","project","camera","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","denominator","projectOnPlane","planeNormal","reflect","normal","dz","setFromSpherical","setFromSphericalCoords","radius","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","setFromMatrixColumn","sz","_v1","_m1","Matrix4","_zero","_one","isMatrix4","n14","n24","n34","n41","n42","n43","n44","copyPosition","makeBasis","extractRotation","scaleX","scaleY","scaleZ","makeRotationFromEuler","af","bf","ce","cf","de","df","ac","ad","bc","bd","makeRotationFromQuaternion","compose","lookAt","eye","up","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","setPosition","t14","getMaxScaleOnAxis","scaleXSq","scaleYSq","scaleZSq","makeTranslation","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeScale","makeShear","position","x2","y2","z2","wx","wy","wz","decompose","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","makeOrthographic","_matrix","_quaternion$1","Euler","DefaultOrder","_order","Layers","mask","RotationOrders","asin","setFromQuaternion","setFromVector3","reorder","newOrder","toVector3","optionalResult","channel","enable","enableAll","disable","disableAll","layers","_object3DId","_v1$1","_q1","_m1$1","_target","_position","_scale","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","Object3D","parent","DefaultUp","configurable","enumerable","modelViewMatrix","normalMatrix","DefaultMatrixAutoUpdate","matrixWorldNeedsUpdate","visible","castShadow","receiveShadow","frustumCulled","renderOrder","userData","Scene","background","environment","fog","overrideMaterial","autoUpdate","__THREE_DEVTOOLS__","CustomEvent","isObject3D","onBeforeRender","onAfterRender","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","distance","translateX","translateY","translateZ","localToWorld","vector","worldToLocal","updateWorldMatrix","isCamera","isLight","object","remove","attach","getObjectById","id","getObjectByProperty","getObjectByName","getWorldPosition","updateMatrixWorld","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverse","traverseVisible","traverseAncestors","force","updateParents","updateChildren","geometries","materials","shapes","serialize","library","JSON","stringify","isInstancedMesh","count","instanceMatrix","isMesh","isLine","isPoints","geometry","parameters","shape","material","uuids","extractFromCache","cache","values","recursive","parse","child","isScene","_points","_vector$1","_box","Box3","_v0","_v1$2","_v2","_f0","_f1","_f2","_center","_extents","_triangleNormal","_testAxis","Infinity","satForAxes","axes","v0","extents","j","p0","p1","p2","isBox3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromBufferAttribute","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","halfSize","setFromObject","expandByObject","box","isEmpty","getCenter","getSize","point","expandByVector","expandByScalar","boundingBox","computeBoundingBox","union","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","triangle","distanceToPoint","getBoundingSphere","intersect","_box$1","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","_vector$2","_segCenter","_segDir","_diff","_edge1","_edge2","_normal","Ray","origin","ray","at","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","intersectTriangle","backfaceCulling","DdN","DdQxE2","DdE1xQ","QdN","_vector1","_vector2","_normalMatrix","Plane","isPlane","setComponents","setFromNormalAndCoplanarPoint","setFromCoplanarPoints","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","line","delta","intersectsLine","startSign","endSign","coplanarPoint","optionalNormalMatrix","referencePoint","_v0$1","_v1$3","_v2$1","_v3","_vab","_vac","_vbc","_vap","_vbp","_vcp","Triangle","getNormal","targetLengthSq","getBarycoord","dot00","dot01","dot02","dot11","dot12","denom","invDenom","u","getUV","p3","uv1","uv2","uv3","isFrontFacing","setFromPointsAndIndices","i0","i1","i2","getArea","getMidpoint","getPlane","d4","vc","d5","d6","vb","va","_colorKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","_hslA","_hslB","Color","setRGB","hue2rgb","SRGBToLinear","LinearToSRGB","Face3","color","materialIndex","vertexNormals","isColor","vertexColors","setHex","setStyle","hex","setHSL","handleAlpha","string","parseFloat","exec","components","parseInt","charAt","setColorName","copyGammaToLinear","gammaFactor","copyLinearToGamma","safeInverse","convertGammaToLinear","convertLinearToGamma","copySRGBToLinear","copyLinearToSRGB","convertSRGBToLinear","convertLinearToSRGB","getHex","getHexString","getHSL","hue","saturation","lightness","getStyle","offsetHSL","addColors","color1","color2","lerpHSL","normalized","NAMES","materialId","Material","blending","side","flatShading","transparent","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","depthTest","depthWrite","stencilWriteMask","stencilFunc","stencilRef","stencilFuncMask","stencilFail","stencilZFail","stencilZPass","stencilWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","precision","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaTest","premultipliedAlpha","toneMapped","MeshBasicMaterial","lightMap","lightMapIntensity","aoMap","aoMapIntensity","specularMap","alphaMap","envMap","combine","reflectivity","refractionRatio","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","skinning","morphTargets","setValues","isMaterial","onBeforeCompile","customProgramCacheKey","newValue","currentValue","isRoot","roughness","metalness","sheen","emissive","emissiveIntensity","specular","shininess","clearcoat","clearcoatRoughness","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","matcap","bumpMap","bumpScale","normalMap","normalMapType","normalScale","displacementMap","displacementScale","displacementBias","roughnessMap","metalnessMap","emissiveMap","envMapIntensity","gradientMap","sizeAttenuation","linewidth","dashSize","gapSize","morphNormals","srcPlanes","dstPlanes","isMeshBasicMaterial","_vector$3","_vector2$1","BufferAttribute","itemSize","usage","updateRange","Int8BufferAttribute","Int8Array","Uint8BufferAttribute","Uint8Array","Uint8ClampedBufferAttribute","Uint8ClampedArray","Int16BufferAttribute","Int16Array","Uint16BufferAttribute","Uint16Array","Int32BufferAttribute","Int32Array","Uint32BufferAttribute","Uint32Array","Float32BufferAttribute","Float32Array","Float64BufferAttribute","Float64Array","DirectGeometry","vertices","normals","colors","uvs","uvs2","groups","skinWeights","skinIndices","boundingSphere","verticesNeedUpdate","normalsNeedUpdate","colorsNeedUpdate","uvsNeedUpdate","groupsNeedUpdate","arrayMax","isBufferAttribute","onUploadCallback","setUsage","copyAt","index1","index2","copyArray","copyColorsArray","copyVector2sArray","vectors","copyVector3sArray","copyVector4sArray","setXY","setXYZ","setXYZW","onUpload","computeGroups","faces","face","fromGeometry","faceVertexUvs","hasFaceVertexUv","hasFaceVertexUv2","morphTargetsLength","morphTargetsPosition","morphNormalsLength","morphTargetsNormal","hasSkinIndices","hasSkinWeights","vertexUvs","morphTarget","morphNormal","_bufferGeometryId","_m1$2","_obj","_offset","_box$2","_boxMorphTargets","_vector$4","BufferGeometry","attributes","morphAttributes","morphTargetsRelative","drawRange","isBufferGeometry","getIndex","setIndex","deleteAttribute","addGroup","clearGroups","setDrawRange","needsUpdate","tangent","computeBoundingSphere","positions","lineDistances","isGeometry","updateFromObject","direct","__directGeometry","elementsNeedUpdate","lineDistancesNeedUpdate","lineDistance","fromDirectGeometry","morphAttributesPosition","morphAttribute","isNaN","jl","computeFaceNormals","computeVertexNormals","positionAttribute","normalAttribute","pA","pB","pC","nA","nB","nC","ab","vA","vB","vC","normalizeNormals","merge","attributeArray1","attribute2","attributeArray2","attributeOffset","toNonIndexed","convertBufferAttribute","indices","array2","geometry2","newAttribute","morphArray","attributeData","hasMorphAttributes","attributeArray","_inverseMatrix","_ray","_sphere","_vA","_vB","_vC","_tempA","_tempB","_tempC","_morphA","_morphB","_morphC","_uvA","_uvB","_uvC","_intersectionPoint","_intersectionPointWorld","Mesh","updateMorphTargets","checkIntersection","raycaster","checkBufferGeometryIntersection","morphPosition","morphInfluences","morphTargetInfluences","influence","isSkinnedMesh","boneTransform","intersection","morphTargetDictionary","ml","String","intersects","groupMaterial","faceIndex","isMultiMaterial","fl","faceMaterial","fvA","fvB","fvC","uvs_f","_geometryId","_m1$3","_obj$1","_offset$1","Geometry","fromBufferGeometry","scope","addFace","areaWeighted","vl","computeFlatVertexNormals","computeMorphNormals","__originalFaceNormal","__originalVertexNormals","tmpGeo","faceNormals","dstNormalsFace","dstNormalsVertex","faceNormal","materialIndexOffset","vertexOffset","vertices1","vertices2","faces1","faces2","colors1","colors2","vertexCopy","faceCopy","faceVertexNormals","faceVertexColors","faceVertexUvs2","uvsCopy","k","kl","mergeMesh","mesh","mergeVertices","verticesMap","unique","changes","faceIndicesToRemove","idx","diff","sortFacesByMaterialIndex","_id","sort","uvs1","newUvs1","newUvs2","vertex","normalsHash","colorsHash","uvsHash","hasMaterial","hasFaceUv","hasFaceNormal","hasFaceVertexNormal","hasFaceColor","hasFaceVertexColor","faceType","setBit","getUvIndex","getNormalIndex","getColorIndex","enabled","srcVertexNormal","destVertexNormal","BoxGeometry","depth","widthSegments","heightSegments","depthSegments","super","BoxBufferGeometry","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","cloneUniforms","property","mergeUniforms","uniforms","merged","UniformsUtils","ShaderMaterial","defines","vertexShader","fragmentShader","lights","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","Camera","PerspectiveCamera","fov","aspect","zoom","focus","view","filmGauge","filmOffset","updateProjectionMatrix","isShaderMaterial","isPerspectiveCamera","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","getEffectiveFOV","getFilmWidth","setViewOffset","fullWidth","fullHeight","offsetX","offsetY","clearViewOffset","skew","CubeCamera","renderTarget","isWebGLCubeRenderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","renderer","scene","currentXrEnabled","xr","currentRenderTarget","getRenderTarget","setRenderTarget","render","stencil","WebGLCubeRenderTarget","dummy","DataTexture","fromEquirectangularTexture","shader","tEquirect","isDataTexture","_sphere$1","_vector$5","Frustum","p4","p5","planes","frustum","setFromProjectionMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","intersectsSprite","sprite","negRadius","UniformsLib","common","diffuse","uvTransform","uv2Transform","specularmap","envmap","flipEnvMap","maxMipLevel","aomap","lightmap","emissivemap","bumpmap","normalmap","displacementmap","roughnessmap","metalnessmap","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","properties","directionalLightShadows","shadowBias","shadowNormalBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotLightShadows","spotShadowMap","spotShadowMatrix","pointLights","pointLightShadows","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","time","frame","stop","cancelAnimationFrame","setAnimationLoop","setContext","WebGLAttributes","gl","capabilities","isWebGL2","buffers","WeakMap","isInterleavedBufferAttribute","deleteBuffer","buffer","bufferType","createBuffer","bindBuffer","bufferData","bytesPerElement","BYTES_PER_ELEMENT","bufferSubData","subarray","updateBuffer","PlaneGeometry","PlaneBufferGeometry","width_half","height_half","segment_width","segment_height","ShaderChunk","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_vertex","lights_pars_begin","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmissionmap_fragment","transmissionmap_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","background_frag","background_vert","cube_frag","cube_vert","depth_frag","depth_vert","distanceRGBA_frag","distanceRGBA_vert","equirect_frag","equirect_vert","linedashed_frag","linedashed_vert","meshbasic_frag","meshbasic_vert","meshlambert_frag","meshlambert_vert","meshmatcap_frag","meshmatcap_vert","meshtoon_frag","meshtoon_vert","meshphong_frag","meshphong_vert","meshphysical_frag","meshphysical_vert","normal_frag","normal_vert","points_frag","points_vert","shadow_frag","shadow_vert","sprite_frag","sprite_vert","ShaderLib","basic","lambert","phong","standard","toon","dashed","totalSize","t2D","cube","equirect","distanceRGBA","referencePosition","nearDistance","farDistance","shadow","WebGLBackground","state","objects","clearColor","planeMesh","boxMesh","clearAlpha","currentBackground","currentBackgroundVersion","currentTonemapping","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","renderList","forceClear","session","getSession","environmentBlendMode","autoClear","autoClearColor","autoClearDepth","autoClearStencil","isCubeTexture","toneMapping","unshift","WebGLBindingStates","maxVertexAttributes","extension","vaoAvailable","bindingStates","defaultState","createBindingState","currentState","bindVertexArrayObject","vao","bindVertexArray","bindVertexArrayOES","deleteVertexArrayObject","deleteVertexArray","deleteVertexArrayOES","newAttributes","enabledAttributes","attributeDivisors","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","disableUnusedAttributes","disableVertexAttribArray","vertexAttribPointer","stride","vertexAttribIPointer","reset","resetDefaultState","setup","updateBuffers","programMap","stateMap","createVertexArray","createVertexArrayOES","getBindingState","cachedAttributes","geometryAttributes","cachedAttribute","geometryAttribute","saveCache","isInstancedBufferGeometry","programAttributes","getAttributes","materialDefaultAttributeValues","programAttribute","isInstancedInterleavedBuffer","_maxInstanceCount","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","setupVertexAttributes","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","WebGLBufferRenderer","info","mode","setMode","drawArrays","renderInstances","primcount","methodName","WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","WebGL2RenderingContext","WebGL2ComputeRenderingContext","maxPrecision","logarithmicDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","floatFragmentTextures","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","floatVertexTextures","maxSamples","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","resetGlobalState","numPlanes","numIntersection","projectPlanes","skipTransform","nPlanes","dstArray","flatSize","viewMatrix","i4","enableLocalClipping","beginShadows","endShadows","setState","fromCache","nGlobal","lGlobal","clippingState","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","buffergeometry","memory","updateWireframeAttribute","geometryIndex","geometryPosition","previousAttribute","_bufferGeometry","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","drawElements","WebGLInfo","calls","triangles","lines","programs","autoReset","instanceCount","numericalSort","absNumericalSort","WebGLMorphtargets","influencesList","workInfluences","objectInfluences","influences","MAX_SAFE_INTEGER","morphInfluencesSum","morphBaseInfluence","getUniforms","setValue","WebGLObjects","updateMap","CubeTexture","DataTexture2DArray","wrapR","DataTexture3D","physical","transmission","transmissionMap","isDataTexture2DArray","isDataTexture3D","emptyTexture","emptyTexture2dArray","emptyTexture3d","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocateTextureUnit","setValueV1f","uniform1f","addr","setValueV2f","uniform2f","uniform2fv","setValueV3f","uniform3f","uniform3fv","setValueV4f","uniform4f","uniform4fv","setValueM2","uniformMatrix2fv","setValueM3","uniformMatrix3fv","setValueM4","uniformMatrix4fv","setValueT1","unit","uniform1i","safeSetTexture2D","setValueT2DArray1","setTexture2DArray","setValueT3D1","setTexture3D","setValueT6","safeSetTextureCube","setValueV1i","setValueV2i","uniform2iv","setValueV3i","uniform3iv","setValueV4i","uniform4iv","setValueV1ui","uniform1ui","setValueV1fArray","uniform1fv","setValueV1iArray","uniform1iv","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueT1Array","units","setValueT6Array","SingleUniform","activeInfo","getSingularSetter","PureArrayUniform","getPureArraySetter","StructuredUniform","seq","updateCache","RePathPart","addUniform","container","uniformObject","parseUniform","path","pathLength","lastIndex","matchEnd","idIsIndex","subscript","WebGLUniforms","getProgramParameter","getActiveUniform","getUniformLocation","WebGLShader","createShader","shaderSource","compileShader","setOptional","upload","seqWithValue","programIdCount","getEncodingComponents","getShaderErrors","status","getShaderParameter","getShaderInfoLog","trim","addLineNumbers","getShaderSource","getTexelDecodingFunction","functionName","getTexelEncodingFunction","getToneMappingFunction","toneMappingName","filterEmptyLine","replaceLightNums","replace","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","numDirLightShadows","numSpotLightShadows","numPointLightShadows","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","includePattern","resolveIncludes","includeReplacer","include","deprecatedUnrollLoopPattern","unrollLoopPattern","unrollLoops","loopReplacer","deprecatedLoopReplacer","snippet","generatePrecision","precisionstring","WebGLProgram","cacheKey","shadowMapTypeDefine","shadowMapType","generateShadowMapTypeDefine","envMapTypeDefine","envMapMode","generateEnvMapTypeDefine","envMapModeDefine","generateEnvMapModeDefine","envMapBlendingDefine","generateEnvMapBlendingDefine","gammaFactorDefine","customExtensions","extensionDerivatives","envMapCubeUV","tangentSpaceNormalMap","shaderID","extensionFragDepth","rendererExtensionFragDepth","extensionDrawBuffers","rendererExtensionDrawBuffers","extensionShaderTextureLOD","rendererExtensionShaderTextureLod","generateExtensions","customDefines","chunks","generateDefines","createProgram","prefixVertex","prefixFragment","isRawShaderMaterial","shaderName","instancing","supportsVertexTextures","maxBones","useFog","fogExp2","objectSpaceNormalMap","vertexTangents","uvsVertexOnly","useVertexTexture","doubleSided","flipSided","shadowMapEnabled","physicallyCorrectLights","mapEncoding","matcapEncoding","envMapEncoding","emissiveMapEncoding","lightMapEncoding","outputEncoding","depthPacking","fragmentGlsl","glVertexShader","glFragmentShader","attachShader","bindAttribLocation","linkProgram","debug","checkShaderErrors","programLog","getProgramInfoLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","getError","diagnostics","prefix","cachedUniforms","deleteShader","getActiveAttrib","getAttribLocation","fetchAttributeLocations","destroy","deleteProgram","usedTimes","WebGLPrograms","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","MeshMatcapMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","SpriteMaterial","parameterNames","getTextureEncodingFromMap","getParameters","shadows","nClipPlanes","nClipIntersection","isMeshStandardMaterial","bones","skeleton","nVertexUniforms","nVertexMatrices","allocateBones","isFogExp2","maxMorphTargets","maxMorphNormals","directional","spot","rectArea","hemi","shadowMap","getProgramCacheKey","acquireProgram","pl","preexistingProgram","releaseProgram","WebGLProperties","painterSortStable","groupOrder","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","opaque","defaultProgram","getNextRenderItem","renderItem","materialProperties","finish","customOpaqueSort","customTransparentSort","WebGLRenderLists","lists","onSceneDispose","cameras","list","UniformsCache","light","halfWidth","halfHeight","nextVersion","shadowCastingLightsFirst","lightA","lightB","WebGLLights","shadowCache","ShadowUniformsCache","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","ambient","probe","directionalShadow","spotShadow","pointShadow","vector3","matrix42","intensity","isAmbientLight","isLightProbe","sh","coefficients","isDirectionalLight","shadowUniforms","bias","normalBias","mapSize","isSpotLight","penumbra","isRectAreaLight","isPointLight","isHemisphereLight","WebGLRenderState","lightsArray","shadowsArray","setupLights","pushLight","pushShadow","shadowLight","WebGLRenderStates","renderStates","renderState","isMeshDepthMaterial","isMeshDistanceMaterial","WebGLShadowMap","_renderer","_objects","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterials","_distanceMaterials","_materialCache","0","1","2","shadowMaterialVertical","SAMPLE_RATE","HALF_SAMPLE_RATE","shadow_pass","resolution","shadowMaterialHorizonal","HORIZONAL_PASS","fullScreenTri","fullScreenMesh","VSMPass","mapPass","renderBufferDirect","getDepthMaterialVariant","useMorphing","useSkinning","useInstancing","getDistanceMaterialVariant","getDepthMaterial","result","getMaterialVariant","customMaterial","customDepthMaterial","customDistanceMaterial","keyA","keyB","materialsForVariant","cachedMaterial","renderObject","shadowCamera","depthMaterial","activeCubeFace","getActiveCubeFace","activeMipmapLevel","getActiveMipmapLevel","_state","setBlending","setTest","setScissorTest","shadowFrameExtents","getFrameExtents","isPointLightShadow","pars","viewportCount","getViewportCount","vp","getViewport","updateMatrices","getFrustum","WebGLState","colorBuffer","locked","currentColorMask","currentColorClear","setMask","colorMask","setLocked","lock","currentDepthMask","currentDepthFunc","currentDepthClear","depthMask","setFunc","clearDepth","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","setOp","stencilOp","clearStencil","enabledCapabilities","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","currentScissor","currentViewport","createTexture","bindTexture","texParameteri","texImage2D","emptyTextures","setFlipSided","setCullFace","equationToGL","100","101","102","MIN_EXT","MAX_EXT","factorToGL","200","201","202","204","210","208","206","203","205","209","207","blendEquationSeparate","blendFuncSeparate","blendFunc","frontFace","cullFace","setPolygonOffset","factor","activeTexture","webglSlot","useProgram","setMaterial","frontFaceCW","setLineWidth","lineWidth","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","apply","texImage3D","WebGLTextures","_gl","utils","_videoTextures","useOffscreenCanvas","OffscreenCanvas","err","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","maxSize","HTMLImageElement","ImageBitmap","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","__maxMipLevel","LOG2E","getInternalFormat","internalFormatName","glFormat","glType","filterFallback","onTextureDispose","textureProperties","__webglInit","deleteTexture","__webglTexture","deallocateTexture","isVideoTexture","onRenderTargetDispose","renderTargetProperties","deleteFramebuffer","__webglFramebuffer","__webglDepthbuffer","deleteRenderbuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","deallocateRenderTarget","textureUnits","setTexture2D","slot","updateVideoTexture","__version","complete","uploadTexture","setTextureCube","initTexture","pixelStorei","isCompressed","isCompressedTexture","cubeImage","convert","glInternalFormat","setTextureParameters","mipmap","mipmapImage","setTextureCubeDynamic","wrappingToGL","1000","1001","1002","filterToGL","1003","1004","1005","1006","1007","1008","textureType","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","textureNeedsPowerOfTwo","isDepthTexture","setupFrameBufferTexture","framebuffer","attachment","textureTarget","bindFramebuffer","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","getRenderTargetSamples","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","setupDepthRenderbuffer","isCube","webglDepthTexture","setupDepthTexture","createRenderbuffer","warnedTexture2D","warnedTextureCube","textureUnit","resetTextureUnits","setupRenderTarget","createFramebuffer","updateRenderTargetMipmap","updateMultisampleRenderTarget","blitFramebuffer","WebGLUtils","HALF_FLOAT_OES","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","COMPRESSED_RGB8_ETC2","COMPRESSED_RGBA8_ETC2_EAC","UNSIGNED_INT_24_8_WEBGL","ArrayCamera","Group","WebXRController","_targetRay","_grip","_hand","WebXRManager","framebufferScaleFactor","referenceSpace","referenceSpaceType","pose","controllers","inputSourcesMap","cameraL","cameraR","cameraVR","_currentDepthNear","_currentDepthFar","onSessionEvent","controller","inputSource","onSessionEnd","disconnect","setFramebuffer","isPresenting","onRequestReferenceSpace","updateInputSources","inputSources","removed","added","getController","getTargetRaySpace","getControllerGrip","getGripSpace","getHand","getHandSpace","setFramebufferScaleFactor","setReferenceSpaceType","getReferenceSpace","setSession","getContextAttributes","xrCompatible","makeXRCompatible","layerInit","antialias","baseLayer","XRWebGLLayer","updateRenderState","requestReferenceSpace","cameraLPos","cameraRPos","updateCamera","getCamera","depthNear","depthFar","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","setProjectionFromUnion","onAnimationFrameCallback","getViewerPose","views","cameraVRNeedsUpdate","transform","WebGLMaterials","refreshUniformsCommon","uvScaleMap","uv2ScaleMap","refreshUniformsStandard","refreshFogUniforms","isFog","density","refreshMaterialUniforms","pixelRatio","isMeshLambertMaterial","refreshUniformsLambert","isMeshToonMaterial","refreshUniformsToon","isMeshPhongMaterial","refreshUniformsPhong","isMeshPhysicalMaterial","refreshUniformsPhysical","isMeshMatcapMaterial","refreshUniformsMatcap","refreshUniformsDepth","refreshUniformsDistance","isMeshNormalMaterial","refreshUniformsNormal","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isSpriteMaterial","refreshUniformsSprites","isShadowMaterial","WebGLRenderer","_context","_alpha","_depth","_stencil","_antialias","_premultipliedAlpha","_preserveDrawingBuffer","preserveDrawingBuffer","_powerPreference","powerPreference","_failIfMajorPerformanceCaveat","failIfMajorPerformanceCaveat","currentRenderList","currentRenderState","domElement","sortObjects","toneMappingExposure","_this","_isContextLost","_framebuffer","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentFramebuffer","_currentMaterialId","_currentCamera","_currentArrayCamera","_currentViewport","_currentScissor","_currentScissorTest","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clipping","_clippingEnabled","_localClippingEnabled","_projScreenMatrix","_vector3","_emptyScene","getTargetPixelRatio","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","contextNames","contextAttributes","contextName","onContextLost","onContextRestore","isWebGL1Renderer","shift","rangeMin","rangeMax","message","initGLContext","preventDefault","onMaterialDispose","releaseMaterialProgramReference","deallocateMaterial","programInfo","forceContextLoss","loseContext","forceContextRestore","restoreContext","getPixelRatio","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","setDrawingBufferSize","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","setOpaqueSort","method","setTransparentSort","bits","renderBufferImmediate","hasPositions","hasNormals","hasUvs","hasColors","positionArray","normalArray","uvArray","colorArray","setProgram","rangeFactor","dataCount","rangeStart","rangeCount","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isSprite","compile","compiled","material2","initMaterial","projectObject","isGroup","isLOD","isImmediateRenderObject","renderObjects","isArrayCamera","camera2","renderObjectImmediate","lightsStateVersion","programCacheKey","programChange","numSupportedMorphTargets","numSupportedMorphNormals","needsLights","materialNeedsLights","progUniforms","uniformsList","useCache","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","isOrthographicCamera","boneTexture","boneMatrices","boneTextureSize","ltc_1","LTC_1","ltc_2","LTC_2","opaqueObjects","transparentObjects","readRenderTargetPixels","activeCubeFaceIndex","restore","textureFormat","checkFramebufferStatus","readPixels","copyFramebufferToTexture","level","levelScale","copyTexImage2D","copyTextureToTexture","srcTexture","dstTexture","texSubImage2D","compressedTexSubImage2D","WebGL1Renderer","FogExp2","Fog","InterleavedBuffer","joints","inputState","pinching","XRHand","LITTLE_PHALANX_TIP","joint","inputPose","gripPose","handPose","targetRay","grip","hand","jointPose","getJointPose","jointRadius","indexTip","INDEX_PHALANX_TIP","thumbTip","THUMB_PHALANX_TIP","distanceToPinch","threshold","handedness","getPose","targetRaySpace","gripSpace","isInterleavedBuffer","arrayBuffers","_uuid","ib","_vector$6","InterleavedBufferAttribute","interleavedBuffer","_geometry","interleavedBuffers","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA$1","_vB$1","_vC$1","_uvA$1","_uvB$1","_uvC$1","Sprite","transformVertex","vertexPosition","mvPosition","_v1$4","_v2$2","LOD","_currentLevel","levels","SkinnedMesh","bindMode","bindMatrix","bindMatrixInverse","addLevel","getCurrentLevel","getObjectForDistance","calculateInverses","normalizeSkinWeights","skinWeight","basePosition","skinIndex","weight","boneIndex","boneInverses","_offsetMatrix","_identityMatrix","Skeleton","Bone","bone","isBone","getBoneByName","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_mesh","InstancedMesh","linecap","linejoin","getMatrixAt","raycastTimes","instanceId","setMatrixAt","_start","_end","_inverseMatrix$1","_ray$1","_sphere$2","Line","computeLineDistances","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","nbVertices","_start$1","_end$1","LineSegments","LineLoop","_inverseMatrix$2","_ray$2","_sphere$3","_position$1","Points","testPoint","rayPointDistanceSq","intersectPoint","distanceToRay","VideoTexture","video","requestVideoFrameCallback","updateVideo","CompressedTexture","CanvasTexture","DepthTexture","WireframeGeometry","edge","edges","edge1","edge2","ol","ParametricGeometry","func","slices","stacks","ParametricBufferGeometry","EPS","pu","pv","sliceCount","PolyhedronGeometry","PolyhedronBufferGeometry","vertexBuffer","uvBuffer","subdivideFace","cols","aj","bj","rows","pushVertex","getVertexByIndex","correctUV","azimuth","subdivide","applyRadius","centroid","uvA","uvB","uvC","azi","correctUVs","correctSeam","generateUVs","TetrahedronGeometry","TetrahedronBufferGeometry","OctahedronGeometry","OctahedronBufferGeometry","IcosahedronGeometry","IcosahedronBufferGeometry","DodecahedronGeometry","DodecahedronBufferGeometry","TubeGeometry","tubularSegments","radialSegments","closed","taper","bufferGeometry","TubeBufferGeometry","tangents","binormals","frames","computeFrenetFrames","P","generateSegment","getPointAt","N","B","generateIndices","generateBufferData","TorusKnotGeometry","tube","heightScale","TorusKnotBufferGeometry","P1","P2","T","calculatePositionOnCurve","cu","su","quOverP","cs","TorusGeometry","arc","TorusBufferGeometry","readyState","HAVE_CURRENT_DATA","isCanvasTexture","Earcut","holeIndices","dim","invSize","hasHoles","outerLen","outerNode","linkedList","prev","queue","steiner","getLeftmost","compareX","eliminateHole","filterPoints","eliminateHoles","earcutLinked","clockwise","last","sum","signedArea","insertNode","removeNode","again","area","ear","pass","zOrder","prevZ","nextZ","tail","numMerges","pSize","qSize","inSize","sortLinked","indexCurve","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","locallyInside","isValidDiagonal","splitPolygon","hole","hx","hy","mx","my","tanMin","sectorContainsSector","findHoleBridge","leftmost","px","py","intersectsPolygon","inside","middleInside","q1","q2","o1","o2","o3","o4","onSegment","num","Node","an","bp","ShapeUtils","contour","isClockWise","pts","triangulateShape","holes","removeDupEndPts","addContour","holeIndex","ExtrudeGeometry","ExtrudeBufferGeometry","verticesArray","addShape","placeholder","curveSegments","steps","bevelEnabled","bevelThickness","bevelSize","bevelOffset","bevelSegments","extrudePath","uvgen","UVGenerator","WorldUVGenerator","amount","extrudePts","splineTube","binormal","position2","extrudeByPath","getSpacedPoints","shapePoints","extractPoints","reverse","hl","ahole","concat","scalePt2","pt","vec","vlen","flen","getBevelVec","inPt","inPrev","inNext","v_trans_x","v_trans_y","shrink_by","v_prev_x","v_prev_y","v_next_x","v_next_y","v_prev_lensq","collinear0","v_prev_len","v_next_len","ptPrevShift_x","ptPrevShift_y","sf","v_trans_lensq","direction_eq","contourMovements","holesMovements","oneHoleMovements","verticesMovements","bs","vert","sidewalls","layeroffset","sl","slen1","slen2","f4","f3","addVertex","nextIndex","generateTopUV","addUV","generateSideWallUV","vector2","layer","buildLidFaces","buildSideFaces","indexA","indexB","indexC","a_x","a_y","b_x","b_y","c_x","c_y","indexD","a_z","b_z","c_z","d_x","d_y","d_z","TextGeometry","TextBufferGeometry","font","isFont","generateShapes","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","SphereBufferGeometry","thetaEnd","grid","verticesRow","uOffset","RingGeometry","innerRadius","outerRadius","thetaSegments","phiSegments","RingBufferGeometry","radiusStep","segment","thetaSegmentLevel","LatheGeometry","segments","LatheBufferGeometry","inverseSegments","base","n1","n2","ShapeGeometry","ShapeBufferGeometry","indexOffset","shapeVertices","shapeHoles","shapeHole","toJSON$1","EdgesGeometry","thresholdAngle","thresholdDot","sourceVertices","face1","face2","CylinderGeometry","radiusTop","radiusBottom","openEnded","CylinderBufferGeometry","indexArray","generateCap","centerIndexStart","centerIndexEnd","cosTheta","sinTheta","slope","indexRow","generateTorso","ConeGeometry","ConeBufferGeometry","CircleGeometry","CircleBufferGeometry","Geometries","freeze","__proto__","RawShaderMaterial","STANDARD","PHYSICAL","TOON","MATCAP","Materials","AnimationUtils","arraySlice","to","isTypedArray","convertArray","forceClone","ArrayBuffer","isView","DataView","getKeyframeOrder","times","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","subclip","sourceClip","startFrame","endFrame","clip","tracks","track","valueSize","getValueSize","minStartTime","resetDuration","makeClipAdditive","targetClip","referenceFrame","referenceClip","numTracks","referenceTime","referenceTrack","referenceTrackType","ValueTypeName","targetTrack","find","referenceValue","startIndex","interpolant","createInterpolant","evaluate","resultBuffer","numTimes","valueStart","blendMode","Interpolant","parameterPositions","sampleValues","sampleSize","_cachedIndex","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","LinearInterpolant","DiscreteInterpolant","KeyframeTrack","interpolation","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","parseKeyframeTrack","json","trackType","typeName","toLowerCase","getTrackTypeForValueTypeName","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","afterEnd_","t1global","beforeStart_","mid","intervalChanged_","interpolate_","settings","DefaultSettings_","getSettings_","copySampleValue_","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o0","oP","oN","wP","wN","ppp","sP","sN","offset1","offset0","weight1","weight0","getInterpolation","InterpolantFactoryMethodDiscrete","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","timeOffset","timeScale","startTime","endTime","nKeys","validate","valid","prevTime","currTime","optimize","smoothInterpolation","writeIndex","keep","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","jsonTracks","frameTime","clipTracks","CreateFromMorphTargetSequence","morphTargetSequence","noLoop","numMorphTargets","findByName","objectOrClipArray","clipArray","animations","CreateClipsFromMorphTargetSequences","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","parseAnimation","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","Cache","files","file","LoadingManager","onLoad","onProgress","onError","isLoading","itemsLoaded","itemsTotal","urlModifier","handlers","onStart","itemStart","itemEnd","itemError","resolveURL","setURLModifier","addHandler","regex","loader","removeHandler","getHandler","global","DefaultLoadingManager","Loader","manager","crossOrigin","resourcePath","requestHeader","load","loadAsync","reject","setCrossOrigin","setPath","setResourcePath","setRequestHeader","loading","FileLoader","AnimationLoader","CompressedTextureLoader","DataTextureLoader","ImageLoader","CubeTextureLoader","TextureLoader","Curve","arcLengthDivisions","EllipseCurve","aX","aY","xRadius","yRadius","aStartAngle","aEndAngle","aClockwise","aRotation","ArcCurve","aRadius","CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","t2","calc","cached","setTimeout","dataUriRegexResult","request","mimeType","isBase64","decodeURIComponent","atob","response","responseType","Blob","parser","DOMParser","parseFromString","XMLHttpRequest","open","withCredentials","overrideMimeType","header","send","setResponseType","setWithCredentials","setMimeType","loadTexture","texDatas","mipmapCount","isCubemap","texData","onImageLoad","onImageError","substr","urls","isJPEG","search","getPoint","optionalTarget","getUtoTmapping","getPoints","divisions","getLength","lengths","getLengths","cacheArcLengths","current","updateArcLengths","arcLengths","targetArcLength","comparison","lengthBefore","getTangent","pt1","pt2","getTangentAt","mat","MAX_VALUE","tz","fromJSON","isEllipseCurve","twoPi","deltaAngle","samePoints","isArcCurve","pz","CatmullRomCurve3","curveType","CatmullRom","QuadraticBezier","QuadraticBezierP0","QuadraticBezierP1","QuadraticBezierP2","CubicBezier","CubicBezierP0","CubicBezierP1","CubicBezierP2","CubicBezierP3","CubicBezierCurve","v3","CubicBezierCurve3","LineCurve","LineCurve3","QuadraticBezierCurve","QuadraticBezierCurve3","SplineCurve","isCatmullRomCurve3","intPoint","isCubicBezierCurve","isCubicBezierCurve3","isLineCurve","isLineCurve3","isQuadraticBezierCurve","isQuadraticBezierCurve3","isSplineCurve","Curves","CurvePath","curves","autoClose","Path","currentPoint","Shape","Light","HemisphereLight","LightShadow","_frameExtents","_viewportCount","_viewports","SpotLightShadow","SpotLight","power","PointLightShadow","_cubeDirections","_cubeUps","PointLight","OrthographicCamera","DirectionalLightShadow","DirectionalLight","AmbientLight","RectAreaLight","SphericalHarmonics3","LightProbe","MaterialLoader","curve","closePath","startPoint","endPoint","curveLengths","getCurveLengths","segmentLength","lens","cacheLengths","sums","moveTo","lineTo","quadraticCurveTo","aCPx","aCPy","bezierCurveTo","aCP1x","aCP1y","aCP2x","aCP2y","splineThru","absarc","absellipse","ellipse","firstPoint","lastPoint","getPointsHoles","holesPts","_lightPositionWorld","_lookTarget","shadowMatrix","projScreenMatrix","lookTarget","lightPositionWorld","viewportIndex","isSpotLightShadow","scaleW","scaleH","isDirectionalLightShadow","isSphericalHarmonics3","zero","getAt","coeff","getIrradianceAt","addScaledSH","getBasisAt","shBasis","getTexture","shading","setTextures","LoaderUtils","TextDecoder","decode","fromCharCode","escape","lastIndexOf","InstancedBufferGeometry","InstancedBufferAttribute","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","arrayBuffer","getArrayBuffer","TYPED_ARRAYS","typedArray","bufferAttribute","drawcalls","offsets","ObjectLoader","parseShape","parseGeometries","parseImages","parseTextures","parseMaterials","parseObject","parseAnimations","geometryShapes","bufferGeometryLoader","details","loadImage","currentUrl","parseConstant","TEXTURE_MAPPING","TEXTURE_WRAPPING","TEXTURE_FILTER","getGeometry","getMaterial","UVMapping","CubeReflectionMapping","CubeRefractionMapping","EquirectangularReflectionMapping","EquirectangularRefractionMapping","CubeUVReflectionMapping","CubeUVRefractionMapping","RepeatWrapping","ClampToEdgeWrapping","MirroredRepeatWrapping","NearestFilter","NearestMipmapNearestFilter","NearestMipmapLinearFilter","LinearFilter","LinearMipmapNearestFilter","LinearMipmapLinearFilter","ImageBitmapLoader","createImageBitmap","fetch","ShapePath","subPaths","currentPath","Font","createPath","char","glyph","glyphs","familyName","cpx","cpy","cpx1","cpy1","cpx2","cpy2","outline","_cachedOutline","ha","FontLoader","isImageBitmapLoader","setOptions","res","blob","imageBitmap","catch","toShapes","isCCW","noHoles","toShapesNoHoles","inSubpaths","tmpPath","tmpShape","isPointInsidePolygon","inPolygon","polyLen","edgeLowPt","edgeHighPt","edgeDx","edgeDy","perpEdge","solid","holesFirst","betterShapeHoles","newShapes","tmpPoints","tmpHoles","newShapeHoles","mainIdx","ambiguous","toChange","sIdx","sLen","sho","hIdx","ho","hole_unassigned","s2Idx","froms","tos","paths","chars","line_height","yMax","yMin","underlineThickness","createPaths","substring","AudioContext","webkitAudioContext","AudioLoader","HemisphereLightProbe","sky","ground","AmbientLightProbe","bufferCopy","decodeAudioData","audioBuffer","isHemisphereLightProbe","isAmbientLightProbe","_eyeRight","_eyeLeft","Clock","autoStart","oldTime","elapsedTime","running","eyeSep","_cache","eyeSepHalf","eyeSepOnProjection","ymax","xmin","xmax","getElapsedTime","getDelta","newTime","_position$2","_quaternion$3","_scale$1","_orientation","AudioListener","gain","createGain","connect","destination","timeDelta","_clock","Audio","getInput","autoplay","detune","loopStart","loopEnd","playbackRate","isPlaying","hasPlaybackControl","sourceType","_startedAt","_progress","filters","removeFilter","getFilter","setFilter","getMasterVolume","setMasterVolume","setTargetAtTime","currentTime","positionX","linearRampToValueAtTime","positionY","positionZ","forwardX","forwardY","forwardZ","upX","upY","upZ","setOrientation","getOutput","setNodeSource","audioNode","setMediaElementSource","mediaElement","createMediaElementSource","setMediaStreamSource","mediaStream","createMediaStreamSource","setBuffer","play","createBufferSource","onended","onEnded","setDetune","setPlaybackRate","pause","getFilters","setFilters","getDetune","getPlaybackRate","getLoop","setLoop","setLoopStart","setLoopEnd","getVolume","setVolume","_position$3","_quaternion$4","_scale$2","_orientation$1","PositionalAudio","panner","createPanner","panningModel","AudioAnalyser","audio","fftSize","analyser","createAnalyser","frequencyBinCount","PropertyMixer","binding","mixFunction","mixFunctionAdditive","setIdentity","_slerp","_slerpAdditive","_setAdditiveIdentityQuaternion","_workIndex","_select","_setAdditiveIdentityOther","_lerp","_lerpAdditive","_setAdditiveIdentityNumeric","_mixBufferRegion","_mixBufferRegionAdditive","_setIdentity","_origIndex","_addIndex","cumulativeWeight","cumulativeWeightAdditive","useCount","referenceCount","getRefDistance","refDistance","setRefDistance","getRolloffFactor","rolloffFactor","setRolloffFactor","getDistanceModel","distanceModel","setDistanceModel","getMaxDistance","maxDistance","setMaxDistance","setDirectionalCone","coneInnerAngle","coneOuterAngle","coneOuterGain","orientationX","orientationY","orientationZ","getFrequencyData","getByteFrequencyData","getAverageFrequency","accumulate","accuIndex","currentWeight","mix","accumulateAdditive","weightAdditive","originalValueOffset","saveOriginalState","getValue","restoreOriginalState","endIndex","targetIndex","workOffset","_reservedRe","RegExp","_wordCharOrDot","_directoryRe","_nodeRe","_objectRe","_propertyRe","_trackRe","_supportedObjectNames","Composite","targetGroup","optionalParsedPath","parsedPath","PropertyBinding","parseTrackName","_targetGroup","_bindings","subscribe_","rootNode","findNode","nodeName","AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","_loopCount","_startTime","_effectiveTimeScale","_effectiveWeight","repetitions","paused","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","AnimationMixer","root","_root","_initMemoryManager","_accuIndex","Uniform","InstancedInterleavedBuffer","Raycaster","PointCloud","ascSort","intersectObject","firstValidIndex","nCachedObjects_","bindings","unbind","isAnimationObjectGroup","sanitizeNodeName","matches","results","objectName","objectIndex","propertyIndex","lastDot","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","BindingType","Direct","EntireArray","ArrayElement","HasFromToArray","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","GetterByBindingType","resolvedProperty","SetterByBindingTypeAndVersioning","targetObject","dest","targetArray","sourceArray","nodeProperty","versioning","bindingType","_getValue_unbound","_setValue_unbound","_indicesByUUID","_paths","_parsedPaths","_bindingsIndicesByPath","stats","total","inUse","bindingsPerObject","indicesByUUID","parsedPaths","nBindings","knownObject","nObjects","nCachedObjects","firstActiveIndex","lastCachedObject","bindingsForPath","lastCached","lastCachedIndex","firstActiveObject","firstActive","uncache","lastObject","indicesByPath","unsubscribe_","lastBindingsIndex","lastBindings","_activateAction","_deactivateAction","stopFading","stopWarping","isRunning","_isActiveAction","isScheduled","startAt","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","action","halt","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_update","deltaTime","timeDirection","_updateWeight","timeRunning","_updateTimeScale","clipTime","_updateTime","propertyMixers","interpolantValue","loopCount","pingPong","_setEndings","handle_stop","loopDelta","pending","atStart","atEnd","weightNow","weightThen","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","actions","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","_controlInterpolantsResultBuffer","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","existingAction","newAction","stopAllAction","nActions","setTime","timeInSeconds","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","setFromCamera","coords","intersectObjects","Spherical","other","setFromCartesianCoords","_vector$7","Box2","_startP","_startEnd","Line3","ImmediateRenderObject","distanceSq","closestPointToPointParameter","clampToLine","startEnd2","_vector$8","SpotLightHelper","cone","coneLength","coneWidth","_vector$9","_boneMatrix","_matrixWorldInv","SkeletonHelper","getBoneList","boneList","PointLightHelper","sphereSize","isSkeletonHelper","_vector$a","_color1","_color2","HemisphereLightHelper","GridHelper","PolarGridHelper","radials","circles","_v1$5","_v2$3","_v3$1","DirectionalLightHelper","lightPlane","targetLine","_vector$b","_camera","CameraHelper","pointMap","colorFrustum","colorCone","colorUp","colorTarget","colorCross","addLine","addPoint","setPoint","_box$3","BoxHelper","Box3Helper","PlaneHelper","_axis","_lineGeometry","_coneGeometry","ArrowHelper","headLength","headWidth","setDirection","AxesHelper","setColor","EXTRA_LOD_SIGMA","TOTAL_LODS","LOD_MAX","_lodPlanes","_sizeLods","_sigmas","lod","sizeLod","sigma","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","coordinates","_createPlanes","Spline","construct","createPointsGeometry","createGeometry","createSpacedPointsGeometry","fromPoints","initFromArray","getControlPointsArray","reparametrizeByArcLength","setColors","extractUrlBase","Handlers","setTexturePath","isIntersectionBox","isIntersectionSphere","setFromMatrix","random16","nearestPowerOfTwo","nextPowerOfTwo","flattenToArrayOffset","multiplyVector3","multiplyVector3Array","applyToBufferAttribute","applyToVector3Array","extractPosition","getPosition","multiplyToArray","multiplyVector4","rotateAxis","crossVector","rotateByAxis","makeFrustum","isIntersectionLine","isIntersectionPlane","barycoordFromPoint","midpoint","extractAllPoints","extrude","makeGeometry","fromAttribute","distanceToManhattan","lengthManhattan","setEulerFromRotationMatrix","setEulerFromQuaternion","getPositionFromMatrix","getScaleFromMatrix","getColumnFromMatrix","applyProjection","computeTangents","applyMatrix","getChildByName","renderDepth","getWorldRotation","eulerOrder","useQuaternion","setDrawMode","drawMode","initBones","setLens","onlyShadow","shadowCameraFov","shadowCameraLeft","shadowCameraRight","shadowCameraTop","shadowCameraBottom","shadowCameraVisible","shadowDarkness","shadowMapWidth","shadowMapHeight","dynamic","setDynamic","copyIndicesArray","setArray","addIndex","addAttribute","addDrawCall","clearDrawCalls","computeOffsets","maxInstancedCount","linePrecision","getArrays","addShapeList","wrapAround","overdraw","wrapRGB","metal","transparency","clearTarget","animate","getCurrentRenderTarget","getPrecision","resetGLState","supportsFloatTextures","supportsHalfFloatTextures","supportsStandardDerivatives","supportsCompressedTextureS3TC","supportsCompressedTexturePVRTC","supportsBlendMinMax","supportsInstancedArrays","enableScissorTest","addPrePlugin","addPostPlugin","updateShadowMap","setFaceCulling","allocTextureUnit","setTexture","getActiveMipMapLevel","shadowMapCullFace","vr","gammaInput","gammaOutput","toneMappingWhitePoint","renderReverseSided","renderSingleSided","getData","updateCubeMap","loadTextureCube","loadCompressedTexture","loadCompressedTextureCube","revision","TO_RADIANS","toRadians","val","AMC_FILES","golf","walk","moderndance","mjackson","martialwalk","ASF_FILES","namespace","STAGE_FILES","testscene","description","CBdragon","CBbunny","CBspheres","dragon","HOLOLIVE_TRANSFORM","THREE.Vector3","THREE.Euler","lfemur","rfemur","HOLOLIVE_BONEMAP","ltibia","lfoot","ltoes","rtibia","rfoot","rtoes","lowerback","upperback","thorax","lowerneck","upperneck","rclavicle","rhumerus","rradius","rwrist","rhand","rfingers","rthumb","lclavicle","lhumerus","lradius","lwrist","lhand","lfingers","lthumb","MMD_FILES","trackerman","name_jp","author","website","bonemap","transforms","supported","korone","okayu","mel","ASFParser","mass","documentation","orientation","lastRotation","THREE.Quaternion","quatRotation","helper","stage","openedBones","currBone","isBaking","mmdView","raw_file","currentKey","tokens","TOKEN_KEYWORD_RGX","words","TOKEN_COMMENT_RGX","TOKEN_BEGIN_RGX","TOKEN_END_RGX","TOKEN_TUPLE_RGX","tuples","TOKEN_WHITESPACE_RGX","timeEnd","token","errors","NaN","prop","SKIP_TYPES","rel","child_name","tree","future","includes","nextBone","axis_order","dof","limits","three","THREE.Bone","newPos","THREE.Skeleton","THREE.SkeletonHelper","THREE.Group","keydata","updateBones","axis_values","axisEuler","inverseAxis","THREE.Matrix4","newQuaternion","newScale","prefinalRotation","finalRotation","mmd","mmdbone","newPosition","newRotation","amcFrames","amcName","TIME_PER_FRAME","baked","animationTracks","frameUpdate","THREE.QuaternionKeyframeTrack","THREE.VectorKeyframeTrack","THREE.AnimationClip","THREE.AnimationMixer","quat","playInterval","selectedASF","tokenize","process","alert","opened","entry","AMCParser","TOKEN_FRAMENUM_RGX","TOKEN_KEYDATA_RGX","frameCount","findex","nextFrame","kdata","selectedAMC","amcObj","setName","entries","bake","setInterval","clearInterval","TGALoader","TGA_TYPE_NO_DATA","TGA_TYPE_INDEXED","TGA_TYPE_RGB","TGA_TYPE_GREY","TGA_TYPE_RLE_INDEXED","TGA_TYPE_RLE_RGB","TGA_TYPE_RLE_GREY","TGA_ORIGIN_MASK","TGA_ORIGIN_SHIFT","TGA_ORIGIN_BL","TGA_ORIGIN_BR","TGA_ORIGIN_UL","TGA_ORIGIN_UR","content","id_length","colormap_type","image_type","colormap_index","colormap_length","colormap_size","pixel_size","flags","tgaCheckHeader","use_rle","use_pal","use_grey","useOffscreen","imageData","createImageData","pixel_data","pixel_total","palettes","pixels","tgaParse","palette","x_start","y_start","x_step","y_step","x_end","y_end","tgaGetImageDataGrey8bits","tgaGetImageDataGrey16bits","colormap","tgaGetImageData8bits","tgaGetImageData16bits","tgaGetImageData24bits","tgaGetImageData32bits","getTgaRGBA","transferToImageBitmap","ColladaLoader","convertUpAxis","getElementsByTagName","xml","parseStrings","parseFloats","parseInts","parseId","parseAssetUnit","hasAttribute","parseAssetUpAxis","textContent","parseLibrary","libraryName","buildLibrary","builder","build","getBuild","parseAnimationSampler","inputs","nodeType","semantic","parseAnimationChannel","sid","arraySyntax","memberSyntax","member","sampler","buildAnimation","channels","samplers","sources","inputId","INPUT","outputId","OUTPUT","createKeyframeTracks","buildAnimationChannel","getAnimation","outputSource","object3D","getNode","defaultMatrix","ascending","transformAnimationData","prepareAnimationData","positionData","quaternionData","scaleData","keyframe","defaultValue","getPrev","getNext","interpolate","createMissingKeyframes","buildAnimationClip","getAnimationClip","parseSkin","bindShapeMatrix","parseSource","parseJoints","vertexWeights","parseVertexWeights","vcount","buildController","skin","BONE_LIMIT","weights","jointOffset","JOINT","weightOffset","WEIGHT","jointSource","inverseSource","INV_BIND_MATRIX","jointCount","vertexSkinData","descending","boneInverse","buildSkin","buildImage","init_from","getImage","parseEffectProfileCOMMON","surfaces","parseEffectNewparam","technique","parseEffectTechnique","extra","parseEffectExtra","parseEffectSurface","parseEffectSampler","parseEffectParameters","parseEffectParameter","parseEffectParameterTexture","parseEffectParameterTextureExtra","parseEffectParameterTextureExtraTechnique","parseEffectExtraTechnique","buildEffect","buildMaterial","effect","effects","profile","textureObject","tgaLoader","textureLoader","getTextureLoader","wrapU","wrapV","offsetU","offsetV","repeatU","repeatV","parameter","float","double_sided","parseCameraOptics","parseCameraTechnique","parseCameraParameters","buildCamera","optics","yfov","aspect_ratio","znear","zfar","ymag","xmag","aspectRatio","parseLightTechnique","parseLightParameters","falloffAngle","buildLight","getLight","accessor","parseGeometryVertices","parseGeometryPrimitive","primitive","hasUV","inputname","checkUVCoordinates","primitives","uvsNeedsFix","buildGeometry","groupedPrimitives","groupPrimitives","primitiveType","buildGeometryType","materialKeys","prevLength","buildGeometryData","pushVector","sourceStride","buildKinematicsModel","parseKinematicsTechniqueCommon","parseKinematicsJoint","links","parseKinematicsLink","parseKinematicsJointParameter","static","zeroPosition","middlePosition","attachments","parseKinematicsAttachment","parseKinematicsTransform","parsePhysicsRigidBody","parsePhysicsTechniqueCommon","inertia","parseKinematicsBindJointAxis","param","tmpJointIndex","jointIndex","buildKinematicsScene","buildTransformList","collada","parseNode","instanceCameras","instanceControllers","instanceLights","instanceGeometries","instanceNodes","parseNodeInstance","hasNode","skeletons","instances","symbol","buildSkeleton","boneData","sortedBoneData","buildBoneHierarchy","visualScenes","processed","buildNode","instanceCamera","newObjects","buildObjects","instanceLight","fallbackMaterial","resolveMaterialBinding","instanceMaterials","buildVisualScene","getVisualScene","parserError","errorText","errorElement","stack","TEXT_NODE","parserErrorToText","asset","upAxis","parseAsset","kinematics","kinematicsModels","physicsModels","kinematicsScenes","hasChildren","prepareNodes","rigidBodies","bindJointAxis","setupAnimations","kinematicsModelId","kinematicsSceneId","visualSceneId","kinematicsModel","kinematicsScene","getKinematicsScene","visualScene","jointMap","targetElement","parentVisualElement","parentElement","m0","getJointValue","jointData","setJointValue","visualElement","visualElementName","setupKinematics","parseScene","GLTFLoader","dracoLoader","ddsLoader","ktx2Loader","pluginCallbacks","register","GLTFMaterialsClearcoatExtension","GLTFTextureBasisUExtension","GLTFMaterialsTransmissionExtension","GLTFRegistry","removeAll","_onError","gltf","setDRACOLoader","setDDSLoader","setKTX2Loader","unregister","plugins","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","GLTFParser","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_LIGHTS_PUNCTUAL","GLTFLightsExtension","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS","GLTFMaterialsPbrSpecularGlossinessExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","MSFT_TEXTURE_DDS","GLTFTextureDDSExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_TRANSMISSION","KHR_TEXTURE_BASISU","lightDefs","loadLight","lightIndex","lightNode","lightDef","innerConeAngle","outerConeAngle","getMaterialType","extendParams","materialParams","materialDef","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","all","extendMaterialParams","clearcoatFactor","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughnessTexture","clearcoatNormalTexture","transmissionFactor","transmissionTexture","textureIndex","textureDef","loadTextureImage","BINARY_EXTENSION_CHUNK_TYPES","body","headerView","magic","getUint32","chunkView","chunkIndex","byteLength","chunkLength","chunkType","contentArray","byteOffset","preload","GLTFMeshStandardSGMaterial","isGLTFSpecularGlossinessMaterial","specularMapParsFragmentChunk","glossinessMapParsFragmentChunk","specularMapFragmentChunk","glossinessMapFragmentChunk","lightPhysicalFragmentChunk","glossiness","glossinessMap","_extraUniforms","uniformName","USE_GLOSSINESSMAP","USE_ROUGHNESSMAP","specularGlossinessParams","pbrSpecularGlossiness","diffuseFactor","diffuseTexture","glossinessFactor","specularFactor","specularGlossinessTexture","specGlossMapDef","createMaterial","GLTFCubicSplineInterpolant","decodePrimitive","bufferViewIndex","bufferView","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","attributeName","threeAttributeName","ATTRIBUTES","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","getDependency","decodeDracoFile","extendTexture","texCoord","stride2","stride3","td","m1","WEBGL_CONSTANTS","5120","5121","5122","5123","5125","5126","WEBGL_FILTERS","9728","9729","9984","9985","9986","9987","WEBGL_WRAPPINGS","33071","33648","10497","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","INTERPOLATION","CUBICSPLINE","LINEAR","STEP","ALPHA_MODES","MIME_TYPE_FORMATS","image/png","image/jpeg","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfExtensions","assignExtrasToUserData","gltfDef","extras","meshDef","targetNames","createAttributesKey","attributesKey","associations","primitiveCache","meshCache","refs","uses","cameraCache","lightCache","navigator","userAgent","addPrimitiveAttributes","primitiveDef","assignAttributeAccessor","accessorIndex","gltfAttributeName","targets","maxDisplacement","computeBounds","hasMorphPosition","hasMorphNormal","pendingPositionAccessors","pendingNormalAccessors","pendingAccessor","morphPositions","addMorphTargets","toTrianglesDrawMode","numberOfTriangles","newIndices","newGeometry","_markDefs","getDependencies","dependencies","scenes","nodeDefs","skinDefs","skins","meshDefs","meshes","skinLength","nodeIndex","nodeLength","nodeDef","_addNodeRef","_getNodeRef","ref","_invokeOne","_invokeAll","dependency","loadScene","loadNode","ext","loadMesh","loadAccessor","loadBufferView","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","uri","bufferViewDef","bufferViews","sparse","pendingBufferViews","TypedArray","elementBytes","itemBytes","byteStride","ibSlice","ibCacheKey","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","textureExtensions","URL","self","webkitURL","sourceURI","isObjectURL","createObjectURL","revokeObjectURL","mapName","mapDef","gltfReference","assignFinalMaterial","useVertexTangents","useVertexColors","useFlatShading","useMorphTargets","useMorphNormals","pointsMaterial","lineMaterial","materialType","materialExtensions","sgExtension","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","alphaMode","alphaCutoff","normalTexture","occlusionTexture","strength","emissiveFactor","emissiveTexture","loadGeometries","createDracoPrimitive","dracoExtension","geometryPromise","meshIndex","cameraIndex","cameraDef","skinDef","skinEntry","inverseBindMatrices","animationIndex","animationDef","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","inputAccessors","outputAccessors","inputAccessor","outputAccessor","targetName","outputArray","scaled","isInterpolantFactoryMethodGLTFCubicSpline","buildNodeHierachy","nodeId","parentObject","pendingJoints","jointNodes","jointNode","sceneIndex","sceneDef","nodeIds","mod","aa","execScript","POSITIVE_INFINITY","bufferSize","resize","A","C","ba","ca","S","U","V","D","M","F","E","fa","G","H","I","J","K","L","da","ea","O","R","ga","Q","W","verify","Y","Z","$","ia","X","ADAPTIVE","BLOCK","Inflate","Zlib","NURBSUtils","findSpan","calcBasisFunctions","span","saved","rv","lv","temp","calcBSplinePoint","Nj","wNj","calcBasisFunctionDerivatives","zeroArr","ders","ndu","rk","pk","j2","calcBSplineDerivatives","nd","du","CK","nders","Pw","calcKoverI","nom","calcRationalCurveDerivatives","Pders","Aders","wders","calcNURBSDerivatives","calcSurfacePoint","uspan","vspan","Nu","Nv","Sw","NURBSCurve","degree","knots","controlPoints","startKnot","endKnot","hpoint","FBXLoader","fbxTree","connections","sceneGraph","FBXTreeParser","GeometryParser","AnimationParser","TextParser","BinaryParser","BinaryReader","littleEndian","dv","FBXTree","getFbxVersion","convertFBXTimeToSeconds","FBXBuffer","CORRECT","convertArrayBufferToString","FBXText","cursor","read","isFbxFormatASCII","parseConnections","deformers","parseDeformers","geometryMap","connectionMap","Connections","rawConnection","fromID","toID","relationship","parents","parentRelationship","ID","childRelationship","blobs","Objects","videoNodes","Video","nodeID","videoNode","RelativeFilename","Filename","arrayBufferContent","Content","base64Content","parseImage","filename","fileName","textureMap","textureNodes","parseTexture","textureNode","attrName","wrapModeU","WrapModeU","wrapModeV","WrapModeV","valueU","valueV","Scaling","FileName","materialMap","materialNodes","parseMaterial","materialNode","ShadingModel","parseParameters","BumpFactor","Diffuse","DiffuseColor","DisplacementFactor","Emissive","EmissiveColor","EmissiveFactor","Opacity","ReflectionFactor","Shininess","Specular","SpecularColor","LayeredTexture","DeformerNodes","Deformer","deformerNode","relationships","attrType","parseSkeleton","geometryID","rawTargets","parseMorphTargets","deformerNodes","rawBones","boneNode","rawBone","transformLink","TransformLink","Indexes","Weights","rawMorphTargets","morphTargetNode","rawMorphTarget","initialWeight","DeformPercent","fullWeights","FullWeights","geoID","modelMap","parseModels","modelNodes","Model","model","modelNode","setLookAtProperties","connection","bindSkeleton","createAmbientLight","setupMorphMaterials","transformData","parentMatrixWorld","generateTransform","createCamera","createLight","createMesh","createCurve","getTransformData","subBone","cameraAttribute","NodeAttribute","CameraProjectionType","nearClippingPlane","NearPlane","farClippingPlane","FarPlane","innerWidth","innerHeight","AspectWidth","AspectHeight","FieldOfView","FocalLength","lightAttribute","LightType","Intensity","CastLightOnObject","FarAttenuationEnd","EnableFarAttenuation","InnerAngle","OuterAngle","CastShadows","FBX_Deformer","reduce","geo","inheritType","InheritType","getEulerOrder","RotationOrder","Lcl_Translation","preRotation","PreRotation","Lcl_Rotation","postRotation","PostRotation","Lcl_Scaling","scalingOffset","ScalingOffset","scalingPivot","ScalingPivot","rotationOffset","RotationOffset","rotationPivot","RotationPivot","lookAtTarget","pos","bindMatrices","parsePoseNodes","geoConnParent","BindPoseNode","Pose","poseNodes","PoseNode","poseNode","Matrix","GlobalSettings","ambientColor","AmbientColor","setupMorphMaterial","matUuid","sharedMat","clonedMat","geoNodes","parseGeometry","geoNode","parseMeshGeometry","parseNurbsGeometry","GeometricTranslation","GeometricRotation","GeometricScaling","genGeometry","preTransform","geoInfo","parseGeoNode","genBuffers","weightsIndices","mappingType","prevMaterialIndex","currentIndex","lastGroup","vertexPositions","Vertices","vertexIndices","PolygonVertexIndex","LayerElementColor","parseVertexColors","LayerElementMaterial","parseMaterialIndices","LayerElementNormal","parseNormals","LayerElementUV","UV","parseUVs","weightTable","polygonIndex","faceLength","displayedWeightsWarning","facePositionIndexes","faceColors","faceUVs","faceWeights","faceWeightIndices","vertexIndex","polygonVertexIndex","endOfFace","weightIndices","wt","wIndex","Weight","weightIndex","comparedWeight","comparedWeightIndex","comparedWeightArray","genFace","parentGeo","parentGeoNode","rawTarget","morphGeoNode","genMorphGeometry","morphPositionsSparse","morphIndex","morphGeoInfo","NormalNode","MappingInformationType","referenceType","ReferenceInformationType","Normals","indexBuffer","NormalIndex","NormalsIndex","dataSize","UVNode","UVIndex","ColorNode","Colors","ColorIndex","MaterialNode","materialIndexBuffer","materialIndices","Order","KnotVector","pointsValues","Form","animationClips","rawClips","parseClips","rawClip","addClip","AnimationCurve","curveNodesMap","parseAnimationCurveNodes","parseAnimationCurves","layersMap","parseAnimationLayers","parseAnimStacks","rawCurveNodes","AnimationCurveNode","rawCurveNode","curveNode","rawCurves","animationCurve","KeyTime","KeyValueFloat","animationCurveID","animationCurveRelationship","rawLayers","AnimationLayer","layerCurveNodes","modelID","rawModel","modelName","initialPosition","initialRotation","initialScale","morph","deformerID","morpherID","morphName","rawStacks","AnimationStack","rawTracks","generateTracks","positionTrack","generateVectorTrack","rotationTrack","generateRotationTrack","scaleTrack","morphTrack","generateMorphTrack","initialValue","getTimesForAllAxes","getKeyframeTrackValues","interpolateRotations","quaternionValues","morphNum","elem","prevValue","xIndex","yIndex","zIndex","xValue","yValue","zValue","valuesSpan","absoluteSpan","numSubIntervals","nextValue","initialTime","interval","nextTime","interpolatedTimes","interpolatedValues","inject","getPrevNode","nodeStack","currentIndent","getCurrentNode","getCurrentProp","currentProp","pushStack","popStack","setCurrentProp","currentPropName","allNodes","matchComment","matchEmpty","matchBeginning","matchProperty","parseNodeBegin","parseNodeProperty","parseNodePropertyContinued","nodeAttrs","attrs","parseNodeAttr","currentNode","contentLine","propName","propValue","connProps","parseNumberArray","parseNodeSpecialProperty","innerPropName","innerPropType1","innerPropType2","innerPropFlag","innerPropValue","type2","flag","reader","skip","endOfContent","getOffset","endOffset","getUint64","numProperties","nameLen","getUint8","getString","propertyList","parseProperty","singleProperty","subNode","parseSubNode","getBoolean","getFloat64","getFloat32","getInt32","getInt64","getInt16","arrayLength","compressedLength","getBooleanArray","getFloat64Array","getFloat32Array","getInt32Array","getInt64Array","reader2","decompress","nullByte","dataArray","infoObject","tempEuler","tempVec","lTranslationM","lPreRotationM","lRotationM","lPostRotationM","lScalingM","lScalingPivotM","lScalingOffsetM","lRotationOffsetM","lRotationPivotM","lParentGX","lGlobalT","lLRM","lParentGRM","lParentGSM","lGlobalRS","lParentLSM_inv","lParentGSM_noLocal","lRotationPivotM_inv","lScalingPivotM_inv","lTransform","lLocalTWithAllPivotAndOffsetInfo","lGlobalTranslation","enums","CharsetEncoder","DataViewEx","encoder","DataCreationHelper","Parser","s2u","uint8Array","s2uTable","3","4","5","6","7","8","9","10","11","12","13","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","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","211","212","213","214","215","216","217","218","219","220","221","222","223","33088","33089","33090","33091","33092","33093","33094","33095","33096","33097","33098","33099","33100","33101","33102","33103","33104","33105","33106","33107","33108","33109","33110","33111","33112","33113","33114","33115","33116","33117","33118","33119","33120","33121","33122","33123","33124","33125","33126","33127","33128","33129","33130","33131","33132","33133","33134","33135","33136","33137","33138","33139","33140","33141","33142","33143","33144","33145","33146","33147","33148","33149","33150","33152","33153","33154","33155","33156","33157","33158","33159","33160","33161","33162","33163","33164","33165","33166","33167","33168","33169","33170","33171","33172","33173","33174","33175","33176","33177","33178","33179","33180","33181","33182","33183","33184","33185","33186","33187","33188","33189","33190","33191","33192","33193","33194","33195","33196","33208","33209","33210","33211","33212","33213","33214","33215","33224","33225","33226","33227","33228","33229","33230","33242","33243","33244","33245","33246","33247","33248","33249","33250","33251","33252","33253","33254","33255","33256","33264","33265","33266","33267","33268","33269","33270","33271","33276","33359","33360","33361","33362","33363","33364","33365","33366","33367","33368","33376","33377","33378","33379","33380","33381","33382","33383","33384","33385","33386","33387","33388","33389","33390","33391","33392","33393","33394","33395","33396","33397","33398","33399","33400","33401","33409","33410","33411","33412","33413","33414","33415","33416","33417","33418","33419","33420","33421","33422","33423","33424","33425","33426","33427","33428","33429","33430","33431","33432","33433","33434","33439","33440","33441","33442","33443","33444","33445","33446","33447","33448","33449","33450","33451","33452","33453","33454","33455","33456","33457","33458","33459","33460","33461","33462","33463","33464","33465","33466","33467","33468","33469","33470","33471","33472","33473","33474","33475","33476","33477","33478","33479","33480","33481","33482","33483","33484","33485","33486","33487","33488","33489","33490","33491","33492","33493","33494","33495","33496","33497","33498","33499","33500","33501","33502","33503","33504","33505","33506","33507","33508","33509","33510","33511","33512","33513","33514","33515","33516","33517","33518","33519","33520","33521","33600","33601","33602","33603","33604","33605","33606","33607","33608","33609","33610","33611","33612","33613","33614","33615","33616","33617","33618","33619","33620","33621","33622","33623","33624","33625","33626","33627","33628","33629","33630","33631","33632","33633","33634","33635","33636","33637","33638","33639","33640","33641","33642","33643","33644","33645","33646","33647","33649","33650","33651","33652","33653","33654","33655","33656","33657","33658","33659","33660","33661","33662","33664","33665","33666","33667","33668","33669","33670","33671","33672","33673","33674","33675","33676","33677","33678","33679","33680","33681","33682","33683","33684","33685","33686","33695","33696","33697","33698","33699","33700","33701","33702","33703","33704","33705","33706","33707","33708","33709","33710","33711","33712","33713","33714","33715","33716","33717","33718","33727","33728","33729","33730","33731","33732","33733","33734","33735","33736","33737","33738","33739","33740","33741","33742","33743","33744","33745","33746","33747","33748","33749","33750","33856","33857","33858","33859","33860","33861","33862","33863","33864","33865","33866","33867","33868","33869","33870","33871","33872","33873","33874","33875","33876","33877","33878","33879","33880","33881","33882","33883","33884","33885","33886","33887","33888","33904","33905","33906","33907","33908","33909","33910","33911","33912","33913","33914","33915","33916","33917","33918","33920","33921","33922","33923","33924","33925","33926","33927","33928","33929","33930","33931","33932","33933","33934","33935","33936","33937","33951","33952","33953","33954","33955","33956","33957","33958","33959","33960","33961","33962","33963","33964","33965","33966","33967","33968","33969","33970","33971","33972","33973","33974","33975","33976","33977","33978","33979","33980","33981","33982","34624","34625","34626","34627","34628","34629","34630","34631","34632","34633","34634","34635","34636","34637","34638","34639","34640","34641","34642","34643","34644","34645","34646","34647","34648","34649","34650","34651","34652","34653","34655","34656","34657","34658","34659","34660","34661","34662","34663","34664","34665","34666","34667","34668","34669","34670","34671","34672","34673","34674","34675","34676","34677","34686","34688","34689","34690","34691","34692","34693","34694","34695","34696","34697","34698","34699","34700","34701","34702","34703","34704","34705","34706","34707","34708","34709","34710","34711","34712","34713","34714","34715","34716","34975","34976","34977","34978","34979","34980","34981","34982","34983","34984","34985","34986","34987","34988","34989","34990","34991","34992","34993","34994","34995","34996","34997","34998","34999","35000","35001","35002","35003","35004","35005","35006","35007","35008","35009","35010","35011","35012","35013","35014","35015","35016","35017","35018","35019","35020","35021","35022","35023","35024","35025","35026","35027","35028","35029","35030","35031","35032","35033","35034","35035","35036","35037","35038","35039","35040","35041","35042","35043","35044","35045","35046","35047","35048","35049","35050","35051","35052","35053","35054","35055","35056","35057","35058","35059","35060","35061","35062","35063","35064","35065","35066","35067","35068","35136","35137","35138","35139","35140","35141","35142","35143","35144","35145","35146","35147","35148","35149","35150","35151","35152","35153","35154","35155","35156","35157","35158","35159","35160","35161","35162","35163","35164","35165","35166","35167","35168","35169","35170","35171","35172","35173","35174","35175","35176","35177","35178","35179","35180","35181","35182","35183","35184","35185","35186","35187","35188","35189","35190","35191","35192","35193","35194","35195","35196","35197","35198","35200","35201","35202","35203","35204","35205","35206","35207","35208","35209","35210","35211","35212","35213","35214","35215","35216","35217","35218","35219","35220","35221","35222","35223","35224","35225","35226","35227","35228","35229","35230","35231","35232","35233","35234","35235","35236","35237","35238","35239","35240","35241","35242","35243","35244","35245","35246","35247","35248","35249","35250","35251","35252","35253","35254","35255","35256","35257","35258","35259","35260","35261","35262","35263","35264","35265","35266","35267","35268","35269","35270","35271","35272","35273","35274","35275","35276","35277","35278","35279","35280","35281","35282","35283","35284","35285","35286","35287","35288","35289","35290","35291","35292","35293","35294","35295","35296","35297","35298","35299","35300","35301","35302","35303","35304","35305","35306","35307","35308","35309","35310","35311","35312","35313","35314","35315","35316","35317","35318","35319","35320","35321","35322","35323","35324","35392","35393","35394","35395","35396","35397","35398","35399","35400","35401","35402","35403","35404","35405","35406","35407","35408","35409","35410","35411","35412","35413","35414","35415","35416","35417","35418","35419","35420","35421","35422","35423","35424","35425","35426","35427","35428","35429","35430","35431","35432","35433","35434","35435","35436","35437","35438","35439","35440","35441","35442","35443","35444","35445","35446","35447","35448","35449","35450","35451","35452","35453","35454","35456","35457","35458","35459","35460","35461","35462","35463","35464","35465","35466","35467","35468","35469","35470","35471","35472","35473","35474","35475","35476","35477","35478","35479","35480","35481","35482","35483","35484","35485","35486","35487","35488","35489","35490","35491","35492","35493","35494","35495","35496","35497","35498","35499","35500","35501","35502","35503","35504","35505","35506","35507","35508","35509","35510","35511","35512","35513","35514","35515","35516","35517","35518","35519","35520","35521","35522","35523","35524","35525","35526","35527","35528","35529","35530","35531","35532","35533","35534","35535","35536","35537","35538","35539","35540","35541","35542","35543","35544","35545","35546","35547","35548","35549","35550","35551","35552","35553","35554","35555","35556","35557","35558","35559","35560","35561","35562","35563","35564","35565","35566","35567","35568","35569","35570","35571","35572","35573","35574","35575","35576","35577","35578","35579","35580","35648","35649","35650","35651","35652","35653","35654","35655","35656","35657","35658","35659","35660","35661","35662","35663","35664","35665","35666","35667","35668","35669","35670","35671","35672","35673","35674","35675","35676","35677","35678","35679","35680","35681","35682","35683","35684","35685","35686","35687","35688","35689","35690","35691","35692","35693","35694","35695","35696","35697","35698","35699","35700","35701","35702","35703","35704","35705","35706","35707","35708","35709","35710","35712","35713","35714","35715","35716","35717","35718","35719","35720","35721","35722","35723","35724","35725","35726","35727","35728","35729","35730","35731","35732","35733","35734","35735","35736","35737","35738","35739","35740","35741","35742","35743","35744","35745","35746","35747","35748","35749","35750","35751","35752","35753","35754","35755","35756","35757","35758","35759","35760","35761","35762","35763","35764","35765","35766","35767","35768","35769","35770","35771","35772","35773","35774","35775","35776","35777","35778","35779","35780","35781","35782","35783","35784","35785","35786","35787","35788","35789","35790","35791","35792","35793","35794","35795","35796","35797","35798","35799","35800","35801","35802","35803","35804","35805","35806","35807","35808","35809","35810","35811","35812","35813","35814","35815","35816","35817","35818","35819","35820","35821","35822","35823","35824","35825","35826","35827","35828","35829","35830","35831","35832","35833","35834","35835","35836","35904","35905","35906","35907","35908","35909","35910","35911","35912","35913","35914","35915","35916","35917","35918","35919","35920","35921","35922","35923","35924","35925","35926","35927","35928","35929","35930","35931","35932","35933","35934","35935","35936","35937","35938","35939","35940","35941","35942","35943","35944","35945","35946","35947","35948","35949","35950","35951","35952","35953","35954","35955","35956","35957","35958","35959","35960","35961","35962","35963","35964","35965","35966","35968","35969","35970","35971","35972","35973","35974","35975","35976","35977","35978","35979","35980","35981","35982","35983","35984","35985","35986","35987","35988","35989","35990","35991","35992","35993","35994","35995","35996","35997","35998","35999","36000","36001","36002","36003","36004","36005","36006","36007","36008","36009","36010","36011","36012","36013","36014","36015","36016","36017","36018","36019","36020","36021","36022","36023","36024","36025","36026","36027","36028","36029","36030","36031","36032","36033","36034","36035","36036","36037","36038","36039","36040","36041","36042","36043","36044","36045","36046","36047","36048","36049","36050","36051","36052","36053","36054","36055","36056","36057","36058","36059","36060","36061","36062","36063","36064","36065","36066","36067","36068","36069","36070","36071","36072","36073","36074","36075","36076","36077","36078","36079","36080","36081","36082","36083","36084","36085","36086","36087","36088","36089","36090","36091","36092","36160","36161","36162","36163","36164","36165","36166","36167","36168","36169","36170","36171","36172","36173","36174","36175","36176","36177","36178","36179","36180","36181","36182","36183","36184","36185","36186","36187","36188","36189","36190","36191","36192","36193","36194","36195","36196","36197","36198","36199","36200","36201","36202","36203","36204","36205","36206","36207","36208","36209","36210","36211","36212","36213","36214","36215","36216","36217","36218","36219","36220","36221","36222","36224","36225","36226","36227","36228","36229","36230","36231","36232","36233","36234","36235","36236","36237","36238","36239","36240","36241","36242","36243","36244","36245","36246","36247","36248","36249","36250","36251","36252","36253","36254","36255","36256","36257","36258","36259","36260","36261","36262","36263","36264","36265","36266","36267","36268","36269","36270","36271","36272","36273","36274","36275","36276","36277","36278","36279","36280","36281","36282","36283","36284","36285","36286","36287","36288","36289","36290","36291","36292","36293","36294","36295","36296","36297","36298","36299","36300","36301","36302","36303","36304","36305","36306","36307","36308","36309","36310","36311","36312","36313","36314","36315","36316","36317","36318","36319","36320","36321","36322","36323","36324","36325","36326","36327","36328","36329","36330","36331","36332","36333","36334","36335","36336","36337","36338","36339","36340","36341","36342","36343","36344","36345","36346","36347","36348","36416","36417","36418","36419","36420","36421","36422","36423","36424","36425","36426","36427","36428","36429","36430","36431","36432","36433","36434","36435","36436","36437","36438","36439","36440","36441","36442","36443","36444","36445","36446","36447","36448","36449","36450","36451","36452","36453","36454","36455","36456","36457","36458","36459","36460","36461","36462","36463","36464","36465","36466","36467","36468","36469","36470","36471","36472","36473","36474","36475","36476","36477","36478","36480","36481","36482","36483","36484","36485","36486","36487","36488","36489","36490","36491","36492","36493","36494","36495","36496","36497","36498","36499","36500","36501","36502","36503","36504","36505","36506","36507","36508","36509","36510","36511","36512","36513","36514","36515","36516","36517","36518","36519","36520","36521","36522","36523","36524","36525","36526","36527","36528","36529","36530","36531","36532","36533","36534","36535","36536","36537","36538","36539","36540","36541","36542","36543","36544","36545","36546","36547","36548","36549","36550","36551","36552","36553","36554","36555","36556","36557","36558","36559","36560","36561","36562","36563","36564","36565","36566","36567","36568","36569","36570","36571","36572","36573","36574","36575","36576","36577","36578","36579","36580","36581","36582","36583","36584","36585","36586","36587","36588","36589","36590","36591","36592","36593","36594","36595","36596","36597","36598","36599","36600","36601","36602","36603","36604","36672","36673","36674","36675","36676","36677","36678","36679","36680","36681","36682","36683","36684","36685","36686","36687","36688","36689","36690","36691","36692","36693","36694","36695","36696","36697","36698","36699","36700","36701","36702","36703","36704","36705","36706","36707","36708","36709","36710","36711","36712","36713","36714","36715","36716","36717","36718","36719","36720","36721","36722","36723","36724","36725","36726","36727","36728","36729","36730","36731","36732","36733","36734","36736","36737","36738","36739","36740","36741","36742","36743","36744","36745","36746","36747","36748","36749","36750","36751","36752","36753","36754","36755","36756","36757","36758","36759","36760","36761","36762","36763","36764","36765","36766","36767","36768","36769","36770","36771","36772","36773","36774","36775","36776","36777","36778","36779","36780","36781","36782","36783","36784","36785","36786","36787","36788","36789","36790","36791","36792","36793","36794","36795","36796","36797","36798","36799","36800","36801","36802","36803","36804","36805","36806","36807","36808","36809","36810","36811","36812","36813","36814","36815","36816","36817","36818","36819","36820","36821","36822","36823","36824","36825","36826","36827","36828","36829","36830","36831","36832","36833","36834","36835","36836","36837","36838","36839","36840","36841","36842","36843","36844","36845","36846","36847","36848","36849","36850","36851","36852","36853","36854","36855","36856","36857","36858","36859","36860","36928","36929","36930","36931","36932","36933","36934","36935","36936","36937","36938","36939","36940","36941","36942","36943","36944","36945","36946","36947","36948","36949","36950","36951","36952","36953","36954","36955","36956","36957","36958","36959","36960","36961","36962","36963","36964","36965","36966","36967","36968","36969","36970","36971","36972","36973","36974","36975","36976","36977","36978","36979","36980","36981","36982","36983","36984","36985","36986","36987","36988","36989","36990","36992","36993","36994","36995","36996","36997","36998","36999","37000","37001","37002","37003","37004","37005","37006","37007","37008","37009","37010","37011","37012","37013","37014","37015","37016","37017","37018","37019","37020","37021","37022","37023","37024","37025","37026","37027","37028","37029","37030","37031","37032","37033","37034","37035","37036","37037","37038","37039","37040","37041","37042","37043","37044","37045","37046","37047","37048","37049","37050","37051","37052","37053","37054","37055","37056","37057","37058","37059","37060","37061","37062","37063","37064","37065","37066","37067","37068","37069","37070","37071","37072","37073","37074","37075","37076","37077","37078","37079","37080","37081","37082","37083","37084","37085","37086","37087","37088","37089","37090","37091","37092","37093","37094","37095","37096","37097","37098","37099","37100","37101","37102","37103","37104","37105","37106","37107","37108","37109","37110","37111","37112","37113","37114","37115","37116","37184","37185","37186","37187","37188","37189","37190","37191","37192","37193","37194","37195","37196","37197","37198","37199","37200","37201","37202","37203","37204","37205","37206","37207","37208","37209","37210","37211","37212","37213","37214","37215","37216","37217","37218","37219","37220","37221","37222","37223","37224","37225","37226","37227","37228","37229","37230","37231","37232","37233","37234","37235","37236","37237","37238","37239","37240","37241","37242","37243","37244","37245","37246","37248","37249","37250","37251","37252","37253","37254","37255","37256","37257","37258","37259","37260","37261","37262","37263","37264","37265","37266","37267","37268","37269","37270","37271","37272","37273","37274","37275","37276","37277","37278","37279","37280","37281","37282","37283","37284","37285","37286","37287","37288","37289","37290","37291","37292","37293","37294","37295","37296","37297","37298","37299","37300","37301","37302","37303","37304","37305","37306","37307","37308","37309","37310","37311","37312","37313","37314","37315","37316","37317","37318","37319","37320","37321","37322","37323","37324","37325","37326","37327","37328","37329","37330","37331","37332","37333","37334","37335","37336","37337","37338","37339","37340","37341","37342","37343","37344","37345","37346","37347","37348","37349","37350","37351","37352","37353","37354","37355","37356","37357","37358","37359","37360","37361","37362","37363","37364","37365","37366","37367","37368","37369","37370","37371","37372","37440","37441","37442","37443","37444","37445","37446","37447","37448","37449","37450","37451","37452","37453","37454","37455","37456","37457","37458","37459","37460","37461","37462","37463","37464","37465","37466","37467","37468","37469","37470","37471","37472","37473","37474","37475","37476","37477","37478","37479","37480","37481","37482","37483","37484","37485","37486","37487","37488","37489","37490","37491","37492","37493","37494","37495","37496","37497","37498","37499","37500","37501","37502","37504","37505","37506","37507","37508","37509","37510","37511","37512","37513","37514","37515","37516","37517","37518","37519","37520","37521","37522","37523","37524","37525","37526","37527","37528","37529","37530","37531","37532","37533","37534","37535","37536","37537","37538","37539","37540","37541","37542","37543","37544","37545","37546","37547","37548","37549","37550","37551","37552","37553","37554","37555","37556","37557","37558","37559","37560","37561","37562","37563","37564","37565","37566","37567","37568","37569","37570","37571","37572","37573","37574","37575","37576","37577","37578","37579","37580","37581","37582","37583","37584","37585","37586","37587","37588","37589","37590","37591","37592","37593","37594","37595","37596","37597","37598","37599","37600","37601","37602","37603","37604","37605","37606","37607","37608","37609","37610","37611","37612","37613","37614","37615","37616","37617","37618","37619","37620","37621","37622","37623","37624","37625","37626","37627","37628","37696","37697","37698","37699","37700","37701","37702","37703","37704","37705","37706","37707","37708","37709","37710","37711","37712","37713","37714","37715","37716","37717","37718","37719","37720","37721","37722","37723","37724","37725","37726","37727","37728","37729","37730","37731","37732","37733","37734","37735","37736","37737","37738","37739","37740","37741","37742","37743","37744","37745","37746","37747","37748","37749","37750","37751","37752","37753","37754","37755","37756","37757","37758","37760","37761","37762","37763","37764","37765","37766","37767","37768","37769","37770","37771","37772","37773","37774","37775","37776","37777","37778","37779","37780","37781","37782","37783","37784","37785","37786","37787","37788","37789","37790","37791","37792","37793","37794","37795","37796","37797","37798","37799","37800","37801","37802","37803","37804","37805","37806","37807","37808","37809","37810","37811","37812","37813","37814","37815","37816","37817","37818","37819","37820","37821","37822","37823","37824","37825","37826","37827","37828","37829","37830","37831","37832","37833","37834","37835","37836","37837","37838","37839","37840","37841","37842","37843","37844","37845","37846","37847","37848","37849","37850","37851","37852","37853","37854","37855","37856","37857","37858","37859","37860","37861","37862","37863","37864","37865","37866","37867","37868","37869","37870","37871","37872","37873","37874","37875","37876","37877","37878","37879","37880","37881","37882","37883","37884","37952","37953","37954","37955","37956","37957","37958","37959","37960","37961","37962","37963","37964","37965","37966","37967","37968","37969","37970","37971","37972","37973","37974","37975","37976","37977","37978","37979","37980","37981","37982","37983","37984","37985","37986","37987","37988","37989","37990","37991","37992","37993","37994","37995","37996","37997","37998","37999","38000","38001","38002","38003","38004","38005","38006","38007","38008","38009","38010","38011","38012","38013","38014","38016","38017","38018","38019","38020","38021","38022","38023","38024","38025","38026","38027","38028","38029","38030","38031","38032","38033","38034","38035","38036","38037","38038","38039","38040","38041","38042","38043","38044","38045","38046","38047","38048","38049","38050","38051","38052","38053","38054","38055","38056","38057","38058","38059","38060","38061","38062","38063","38064","38065","38066","38067","38068","38069","38070","38071","38072","38073","38074","38075","38076","38077","38078","38079","38080","38081","38082","38083","38084","38085","38086","38087","38088","38089","38090","38091","38092","38093","38094","38095","38096","38097","38098","38099","38100","38101","38102","38103","38104","38105","38106","38107","38108","38109","38110","38111","38112","38113","38114","38115","38116","38117","38118","38119","38120","38121","38122","38123","38124","38125","38126","38127","38128","38129","38130","38131","38132","38133","38134","38135","38136","38137","38138","38139","38140","38208","38209","38210","38211","38212","38213","38214","38215","38216","38217","38218","38219","38220","38221","38222","38223","38224","38225","38226","38227","38228","38229","38230","38231","38232","38233","38234","38235","38236","38237","38238","38239","38240","38241","38242","38243","38244","38245","38246","38247","38248","38249","38250","38251","38252","38253","38254","38255","38256","38257","38258","38259","38260","38261","38262","38263","38264","38265","38266","38267","38268","38269","38270","38272","38273","38274","38275","38276","38277","38278","38279","38280","38281","38282","38283","38284","38285","38286","38287","38288","38289","38290","38291","38292","38293","38294","38295","38296","38297","38298","38299","38300","38301","38302","38303","38304","38305","38306","38307","38308","38309","38310","38311","38312","38313","38314","38315","38316","38317","38318","38319","38320","38321","38322","38323","38324","38325","38326","38327","38328","38329","38330","38331","38332","38333","38334","38335","38336","38337","38338","38339","38340","38341","38342","38343","38344","38345","38346","38347","38348","38349","38350","38351","38352","38353","38354","38355","38356","38357","38358","38359","38360","38361","38362","38363","38364","38365","38366","38367","38368","38369","38370","38371","38372","38373","38374","38375","38376","38377","38378","38379","38380","38381","38382","38383","38384","38385","38386","38387","38388","38389","38390","38391","38392","38393","38394","38395","38396","38464","38465","38466","38467","38468","38469","38470","38471","38472","38473","38474","38475","38476","38477","38478","38479","38480","38481","38482","38483","38484","38485","38486","38487","38488","38489","38490","38491","38492","38493","38494","38495","38496","38497","38498","38499","38500","38501","38502","38503","38504","38505","38506","38507","38508","38509","38510","38511","38512","38513","38514","38515","38516","38517","38518","38519","38520","38521","38522","38523","38524","38525","38526","38528","38529","38530","38531","38532","38533","38534","38535","38536","38537","38538","38539","38540","38541","38542","38543","38544","38545","38546","38547","38548","38549","38550","38551","38552","38553","38554","38555","38556","38557","38558","38559","38560","38561","38562","38563","38564","38565","38566","38567","38568","38569","38570","38571","38572","38573","38574","38575","38576","38577","38578","38579","38580","38581","38582","38583","38584","38585","38586","38587","38588","38589","38590","38591","38592","38593","38594","38595","38596","38597","38598","38599","38600","38601","38602","38603","38604","38605","38606","38607","38608","38609","38610","38611","38612","38613","38614","38615","38616","38617","38618","38619","38620","38621","38622","38623","38624","38625","38626","38627","38628","38629","38630","38631","38632","38633","38634","38635","38636","38637","38638","38639","38640","38641","38642","38643","38644","38645","38646","38647","38648","38649","38650","38651","38652","38720","38721","38722","38723","38724","38725","38726","38727","38728","38729","38730","38731","38732","38733","38734","38735","38736","38737","38738","38739","38740","38741","38742","38743","38744","38745","38746","38747","38748","38749","38750","38751","38752","38753","38754","38755","38756","38757","38758","38759","38760","38761","38762","38763","38764","38765","38766","38767","38768","38769","38770","38771","38772","38773","38774","38775","38776","38777","38778","38779","38780","38781","38782","38784","38785","38786","38787","38788","38789","38790","38791","38792","38793","38794","38795","38796","38797","38798","38799","38800","38801","38802","38803","38804","38805","38806","38807","38808","38809","38810","38811","38812","38813","38814","38815","38816","38817","38818","38819","38820","38821","38822","38823","38824","38825","38826","38827","38828","38829","38830","38831","38832","38833","38834","38835","38836","38837","38838","38839","38840","38841","38842","38843","38844","38845","38846","38847","38848","38849","38850","38851","38852","38853","38854","38855","38856","38857","38858","38859","38860","38861","38862","38863","38864","38865","38866","38867","38868","38869","38870","38871","38872","38873","38874","38875","38876","38877","38878","38879","38880","38881","38882","38883","38884","38885","38886","38887","38888","38889","38890","38891","38892","38893","38894","38895","38896","38897","38898","38899","38900","38901","38902","38903","38904","38905","38906","38907","38908","38976","38977","38978","38979","38980","38981","38982","38983","38984","38985","38986","38987","38988","38989","38990","38991","38992","38993","38994","38995","38996","38997","38998","38999","39000","39001","39002","39003","39004","39005","39006","39007","39008","39009","39010","39011","39012","39013","39014","39015","39016","39017","39018","39019","39020","39021","39022","39023","39024","39025","39026","39071","39072","39073","39074","39075","39076","39077","39078","39079","39080","39081","39082","39083","39084","39085","39086","39087","39088","39089","39090","39091","39092","39093","39094","39095","39096","39097","39098","39099","39100","39101","39102","39103","39104","39105","39106","39107","39108","39109","39110","39111","39112","39113","39114","39115","39116","39117","39118","39119","39120","39121","39122","39123","39124","39125","39126","39127","39128","39129","39130","39131","39132","39133","39134","39135","39136","39137","39138","39139","39140","39141","39142","39143","39144","39145","39146","39147","39148","39149","39150","39151","39152","39153","39154","39155","39156","39157","39158","39159","39160","39161","39162","39163","39164","39232","39233","39234","39235","39236","39237","39238","39239","39240","39241","39242","39243","39244","39245","39246","39247","39248","39249","39250","39251","39252","39253","39254","39255","39256","39257","39258","39259","39260","39261","39262","39263","39264","39265","39266","39267","39268","39269","39270","39271","39272","39273","39274","39275","39276","39277","39278","39279","39280","39281","39282","39283","39284","39285","39286","39287","39288","39289","39290","39291","39292","39293","39294","39296","39297","39298","39299","39300","39301","39302","39303","39304","39305","39306","39307","39308","39309","39310","39311","39312","39313","39314","39315","39316","39317","39318","39319","39320","39321","39322","39323","39324","39325","39326","39327","39328","39329","39330","39331","39332","39333","39334","39335","39336","39337","39338","39339","39340","39341","39342","39343","39344","39345","39346","39347","39348","39349","39350","39351","39352","39353","39354","39355","39356","39357","39358","39359","39360","39361","39362","39363","39364","39365","39366","39367","39368","39369","39370","39371","39372","39373","39374","39375","39376","39377","39378","39379","39380","39381","39382","39383","39384","39385","39386","39387","39388","39389","39390","39391","39392","39393","39394","39395","39396","39397","39398","39399","39400","39401","39402","39403","39404","39405","39406","39407","39408","39409","39410","39411","39412","39413","39414","39415","39416","39417","39418","39419","39420","39488","39489","39490","39491","39492","39493","39494","39495","39496","39497","39498","39499","39500","39501","39502","39503","39504","39505","39506","39507","39508","39509","39510","39511","39512","39513","39514","39515","39516","39517","39518","39519","39520","39521","39522","39523","39524","39525","39526","39527","39528","39529","39530","39531","39532","39533","39534","39535","39536","39537","39538","39539","39540","39541","39542","39543","39544","39545","39546","39547","39548","39549","39550","39552","39553","39554","39555","39556","39557","39558","39559","39560","39561","39562","39563","39564","39565","39566","39567","39568","39569","39570","39571","39572","39573","39574","39575","39576","39577","39578","39579","39580","39581","39582","39583","39584","39585","39586","39587","39588","39589","39590","39591","39592","39593","39594","39595","39596","39597","39598","39599","39600","39601","39602","39603","39604","39605","39606","39607","39608","39609","39610","39611","39612","39613","39614","39615","39616","39617","39618","39619","39620","39621","39622","39623","39624","39625","39626","39627","39628","39629","39630","39631","39632","39633","39634","39635","39636","39637","39638","39639","39640","39641","39642","39643","39644","39645","39646","39647","39648","39649","39650","39651","39652","39653","39654","39655","39656","39657","39658","39659","39660","39661","39662","39663","39664","39665","39666","39667","39668","39669","39670","39671","39672","39673","39674","39675","39676","39744","39745","39746","39747","39748","39749","39750","39751","39752","39753","39754","39755","39756","39757","39758","39759","39760","39761","39762","39763","39764","39765","39766","39767","39768","39769","39770","39771","39772","39773","39774","39775","39776","39777","39778","39779","39780","39781","39782","39783","39784","39785","39786","39787","39788","39789","39790","39791","39792","39793","39794","39795","39796","39797","39798","39799","39800","39801","39802","39803","39804","39805","39806","39808","39809","39810","39811","39812","39813","39814","39815","39816","39817","39818","39819","39820","39821","39822","39823","39824","39825","39826","39827","39828","39829","39830","39831","39832","39833","39834","39835","39836","39837","39838","39839","39840","39841","39842","39843","39844","39845","39846","39847","39848","39849","39850","39851","39852","39853","39854","39855","39856","39857","39858","39859","39860","39861","39862","39863","39864","39865","39866","39867","39868","39869","39870","39871","39872","39873","39874","39875","39876","39877","39878","39879","39880","39881","39882","39883","39884","39885","39886","39887","39888","39889","39890","39891","39892","39893","39894","39895","39896","39897","39898","39899","39900","39901","39902","39903","39904","39905","39906","39907","39908","39909","39910","39911","39912","39913","39914","39915","39916","39917","39918","39919","39920","39921","39922","39923","39924","39925","39926","39927","39928","39929","39930","39931","39932","40000","40001","40002","40003","40004","40005","40006","40007","40008","40009","40010","40011","40012","40013","40014","40015","40016","40017","40018","40019","40020","40021","40022","40023","40024","40025","40026","40027","40028","40029","40030","40031","40032","40033","40034","40035","40036","40037","40038","40039","40040","40041","40042","40043","40044","40045","40046","40047","40048","40049","40050","40051","40052","40053","40054","40055","40056","40057","40058","40059","40060","40061","40062","40064","40065","40066","40067","40068","40069","40070","40071","40072","40073","40074","40075","40076","40077","40078","40079","40080","40081","40082","40083","40084","40085","40086","40087","40088","40089","40090","40091","40092","40093","40094","40095","40096","40097","40098","40099","40100","40101","40102","40103","40104","40105","40106","40107","40108","40109","40110","40111","40112","40113","40114","40115","40116","40117","40118","40119","40120","40121","40122","40123","40124","40125","40126","40127","40128","40129","40130","40131","40132","40133","40134","40135","40136","40137","40138","40139","40140","40141","40142","40143","40144","40145","40146","40147","40148","40149","40150","40151","40152","40153","40154","40155","40156","40157","40158","40159","40160","40161","40162","40163","40164","40165","40166","40167","40168","40169","40170","40171","40172","40173","40174","40175","40176","40177","40178","40179","40180","40181","40182","40183","40184","40185","40186","40187","40188","40256","40257","40258","40259","40260","40261","40262","40263","40264","40265","40266","40267","40268","40269","40270","40271","40272","40273","40274","40275","40276","40277","40278","40279","40280","40281","40282","40283","40284","40285","40286","40287","40288","40289","40290","40291","40292","40293","40294","40295","40296","40297","40298","40299","40300","40301","40302","40303","40304","40305","40306","40307","40308","40309","40310","40311","40312","40313","40314","40315","40316","40317","40318","40320","40321","40322","40323","40324","40325","40326","40327","40328","40329","40330","40331","40332","40333","40334","40335","40336","40337","40338","40339","40340","40341","40342","40343","40344","40345","40346","40347","40348","40349","40350","40351","40352","40353","40354","40355","40356","40357","40358","40359","40360","40361","40362","40363","40364","40365","40366","40367","40368","40369","40370","40371","40372","40373","40374","40375","40376","40377","40378","40379","40380","40381","40382","40383","40384","40385","40386","40387","40388","40389","40390","40391","40392","40393","40394","40395","40396","40397","40398","40399","40400","40401","40402","40403","40404","40405","40406","40407","40408","40409","40410","40411","40412","40413","40414","40415","40416","40417","40418","40419","40420","40421","40422","40423","40424","40425","40426","40427","40428","40429","40430","40431","40432","40433","40434","40435","40436","40437","40438","40439","40440","40441","40442","40443","40444","40512","40513","40514","40515","40516","40517","40518","40519","40520","40521","40522","40523","40524","40525","40526","40527","40528","40529","40530","40531","40532","40533","40534","40535","40536","40537","40538","40539","40540","40541","40542","40543","40544","40545","40546","40547","40548","40549","40550","40551","40552","40553","40554","40555","40556","40557","40558","40559","40560","40561","40562","40563","40564","40565","40566","40567","40568","40569","40570","40571","40572","40573","40574","40576","40577","40578","40579","40580","40581","40582","40583","40584","40585","40586","40587","40588","40589","40590","40591","40592","40593","40594","40595","40596","40597","40598","40599","40600","40601","40602","40603","40604","40605","40606","40607","40608","40609","40610","40611","40612","40613","40614","40615","40616","40617","40618","40619","40620","40621","40622","40623","40624","40625","40626","40627","40628","40629","40630","40631","40632","40633","40634","40635","40636","40637","40638","40639","40640","40641","40642","40643","40644","40645","40646","40647","40648","40649","40650","40651","40652","40653","40654","40655","40656","40657","40658","40659","40660","40661","40662","40663","40664","40665","40666","40667","40668","40669","40670","40671","40672","40673","40674","40675","40676","40677","40678","40679","40680","40681","40682","40683","40684","40685","40686","40687","40688","40689","40690","40691","40692","40693","40694","40695","40696","40697","40698","40699","40700","40768","40769","40770","40771","40772","40773","40774","40775","40776","40777","40778","40779","40780","40781","40782","40783","40784","40785","40786","40787","40788","40789","40790","40791","40792","40793","40794","40795","40796","40797","40798","40799","40800","40801","40802","40803","40804","40805","40806","40807","40808","40809","40810","40811","40812","40813","40814","40815","40816","40817","40818","40819","40820","40821","40822","40823","40824","40825","40826","40827","40828","40829","40830","40832","40833","40834","40835","40836","40837","40838","40839","40840","40841","40842","40843","40844","40845","40846","40847","40848","40849","40850","40851","40852","40853","40854","40855","40856","40857","40858","40859","40860","40861","40862","40863","40864","40865","40866","40867","40868","40869","40870","40871","40872","40873","40874","40875","40876","40877","40878","40879","40880","40881","40882","40883","40884","40885","40886","40887","40888","40889","40890","40891","40892","40893","40894","40895","40896","40897","40898","40899","40900","40901","40902","40903","40904","40905","40906","40907","40908","40909","40910","40911","40912","40913","40914","40915","40916","40917","40918","40919","40920","40921","40922","40923","40924","40925","40926","40927","40928","40929","40930","40931","40932","40933","40934","40935","40936","40937","40938","40939","40940","40941","40942","40943","40944","40945","40946","40947","40948","40949","40950","40951","40952","40953","40954","40955","40956","57408","57409","57410","57411","57412","57413","57414","57415","57416","57417","57418","57419","57420","57421","57422","57423","57424","57425","57426","57427","57428","57429","57430","57431","57432","57433","57434","57435","57436","57437","57438","57439","57440","57441","57442","57443","57444","57445","57446","57447","57448","57449","57450","57451","57452","57453","57454","57455","57456","57457","57458","57459","57460","57461","57462","57463","57464","57465","57466","57467","57468","57469","57470","57472","57473","57474","57475","57476","57477","57478","57479","57480","57481","57482","57483","57484","57485","57486","57487","57488","57489","57490","57491","57492","57493","57494","57495","57496","57497","57498","57499","57500","57501","57502","57503","57504","57505","57506","57507","57508","57509","57510","57511","57512","57513","57514","57515","57516","57517","57518","57519","57520","57521","57522","57523","57524","57525","57526","57527","57528","57529","57530","57531","57532","57533","57534","57535","57536","57537","57538","57539","57540","57541","57542","57543","57544","57545","57546","57547","57548","57549","57550","57551","57552","57553","57554","57555","57556","57557","57558","57559","57560","57561","57562","57563","57564","57565","57566","57567","57568","57569","57570","57571","57572","57573","57574","57575","57576","57577","57578","57579","57580","57581","57582","57583","57584","57585","57586","57587","57588","57589","57590","57591","57592","57593","57594","57595","57596","57664","57665","57666","57667","57668","57669","57670","57671","57672","57673","57674","57675","57676","57677","57678","57679","57680","57681","57682","57683","57684","57685","57686","57687","57688","57689","57690","57691","57692","57693","57694","57695","57696","57697","57698","57699","57700","57701","57702","57703","57704","57705","57706","57707","57708","57709","57710","57711","57712","57713","57714","57715","57716","57717","57718","57719","57720","57721","57722","57723","57724","57725","57726","57728","57729","57730","57731","57732","57733","57734","57735","57736","57737","57738","57739","57740","57741","57742","57743","57744","57745","57746","57747","57748","57749","57750","57751","57752","57753","57754","57755","57756","57757","57758","57759","57760","57761","57762","57763","57764","57765","57766","57767","57768","57769","57770","57771","57772","57773","57774","57775","57776","57777","57778","57779","57780","57781","57782","57783","57784","57785","57786","57787","57788","57789","57790","57791","57792","57793","57794","57795","57796","57797","57798","57799","57800","57801","57802","57803","57804","57805","57806","57807","57808","57809","57810","57811","57812","57813","57814","57815","57816","57817","57818","57819","57820","57821","57822","57823","57824","57825","57826","57827","57828","57829","57830","57831","57832","57833","57834","57835","57836","57837","57838","57839","57840","57841","57842","57843","57844","57845","57846","57847","57848","57849","57850","57851","57852","57920","57921","57922","57923","57924","57925","57926","57927","57928","57929","57930","57931","57932","57933","57934","57935","57936","57937","57938","57939","57940","57941","57942","57943","57944","57945","57946","57947","57948","57949","57950","57951","57952","57953","57954","57955","57956","57957","57958","57959","57960","57961","57962","57963","57964","57965","57966","57967","57968","57969","57970","57971","57972","57973","57974","57975","57976","57977","57978","57979","57980","57981","57982","57984","57985","57986","57987","57988","57989","57990","57991","57992","57993","57994","57995","57996","57997","57998","57999","58000","58001","58002","58003","58004","58005","58006","58007","58008","58009","58010","58011","58012","58013","58014","58015","58016","58017","58018","58019","58020","58021","58022","58023","58024","58025","58026","58027","58028","58029","58030","58031","58032","58033","58034","58035","58036","58037","58038","58039","58040","58041","58042","58043","58044","58045","58046","58047","58048","58049","58050","58051","58052","58053","58054","58055","58056","58057","58058","58059","58060","58061","58062","58063","58064","58065","58066","58067","58068","58069","58070","58071","58072","58073","58074","58075","58076","58077","58078","58079","58080","58081","58082","58083","58084","58085","58086","58087","58088","58089","58090","58091","58092","58093","58094","58095","58096","58097","58098","58099","58100","58101","58102","58103","58104","58105","58106","58107","58108","58176","58177","58178","58179","58180","58181","58182","58183","58184","58185","58186","58187","58188","58189","58190","58191","58192","58193","58194","58195","58196","58197","58198","58199","58200","58201","58202","58203","58204","58205","58206","58207","58208","58209","58210","58211","58212","58213","58214","58215","58216","58217","58218","58219","58220","58221","58222","58223","58224","58225","58226","58227","58228","58229","58230","58231","58232","58233","58234","58235","58236","58237","58238","58240","58241","58242","58243","58244","58245","58246","58247","58248","58249","58250","58251","58252","58253","58254","58255","58256","58257","58258","58259","58260","58261","58262","58263","58264","58265","58266","58267","58268","58269","58270","58271","58272","58273","58274","58275","58276","58277","58278","58279","58280","58281","58282","58283","58284","58285","58286","58287","58288","58289","58290","58291","58292","58293","58294","58295","58296","58297","58298","58299","58300","58301","58302","58303","58304","58305","58306","58307","58308","58309","58310","58311","58312","58313","58314","58315","58316","58317","58318","58319","58320","58321","58322","58323","58324","58325","58326","58327","58328","58329","58330","58331","58332","58333","58334","58335","58336","58337","58338","58339","58340","58341","58342","58343","58344","58345","58346","58347","58348","58349","58350","58351","58352","58353","58354","58355","58356","58357","58358","58359","58360","58361","58362","58363","58364","58432","58433","58434","58435","58436","58437","58438","58439","58440","58441","58442","58443","58444","58445","58446","58447","58448","58449","58450","58451","58452","58453","58454","58455","58456","58457","58458","58459","58460","58461","58462","58463","58464","58465","58466","58467","58468","58469","58470","58471","58472","58473","58474","58475","58476","58477","58478","58479","58480","58481","58482","58483","58484","58485","58486","58487","58488","58489","58490","58491","58492","58493","58494","58496","58497","58498","58499","58500","58501","58502","58503","58504","58505","58506","58507","58508","58509","58510","58511","58512","58513","58514","58515","58516","58517","58518","58519","58520","58521","58522","58523","58524","58525","58526","58527","58528","58529","58530","58531","58532","58533","58534","58535","58536","58537","58538","58539","58540","58541","58542","58543","58544","58545","58546","58547","58548","58549","58550","58551","58552","58553","58554","58555","58556","58557","58558","58559","58560","58561","58562","58563","58564","58565","58566","58567","58568","58569","58570","58571","58572","58573","58574","58575","58576","58577","58578","58579","58580","58581","58582","58583","58584","58585","58586","58587","58588","58589","58590","58591","58592","58593","58594","58595","58596","58597","58598","58599","58600","58601","58602","58603","58604","58605","58606","58607","58608","58609","58610","58611","58612","58613","58614","58615","58616","58617","58618","58619","58620","58688","58689","58690","58691","58692","58693","58694","58695","58696","58697","58698","58699","58700","58701","58702","58703","58704","58705","58706","58707","58708","58709","58710","58711","58712","58713","58714","58715","58716","58717","58718","58719","58720","58721","58722","58723","58724","58725","58726","58727","58728","58729","58730","58731","58732","58733","58734","58735","58736","58737","58738","58739","58740","58741","58742","58743","58744","58745","58746","58747","58748","58749","58750","58752","58753","58754","58755","58756","58757","58758","58759","58760","58761","58762","58763","58764","58765","58766","58767","58768","58769","58770","58771","58772","58773","58774","58775","58776","58777","58778","58779","58780","58781","58782","58783","58784","58785","58786","58787","58788","58789","58790","58791","58792","58793","58794","58795","58796","58797","58798","58799","58800","58801","58802","58803","58804","58805","58806","58807","58808","58809","58810","58811","58812","58813","58814","58815","58816","58817","58818","58819","58820","58821","58822","58823","58824","58825","58826","58827","58828","58829","58830","58831","58832","58833","58834","58835","58836","58837","58838","58839","58840","58841","58842","58843","58844","58845","58846","58847","58848","58849","58850","58851","58852","58853","58854","58855","58856","58857","58858","58859","58860","58861","58862","58863","58864","58865","58866","58867","58868","58869","58870","58871","58872","58873","58874","58875","58876","58944","58945","58946","58947","58948","58949","58950","58951","58952","58953","58954","58955","58956","58957","58958","58959","58960","58961","58962","58963","58964","58965","58966","58967","58968","58969","58970","58971","58972","58973","58974","58975","58976","58977","58978","58979","58980","58981","58982","58983","58984","58985","58986","58987","58988","58989","58990","58991","58992","58993","58994","58995","58996","58997","58998","58999","59000","59001","59002","59003","59004","59005","59006","59008","59009","59010","59011","59012","59013","59014","59015","59016","59017","59018","59019","59020","59021","59022","59023","59024","59025","59026","59027","59028","59029","59030","59031","59032","59033","59034","59035","59036","59037","59038","59039","59040","59041","59042","59043","59044","59045","59046","59047","59048","59049","59050","59051","59052","59053","59054","59055","59056","59057","59058","59059","59060","59061","59062","59063","59064","59065","59066","59067","59068","59069","59070","59071","59072","59073","59074","59075","59076","59077","59078","59079","59080","59081","59082","59083","59084","59085","59086","59087","59088","59089","59090","59091","59092","59093","59094","59095","59096","59097","59098","59099","59100","59101","59102","59103","59104","59105","59106","59107","59108","59109","59110","59111","59112","59113","59114","59115","59116","59117","59118","59119","59120","59121","59122","59123","59124","59125","59126","59127","59128","59129","59130","59131","59132","59200","59201","59202","59203","59204","59205","59206","59207","59208","59209","59210","59211","59212","59213","59214","59215","59216","59217","59218","59219","59220","59221","59222","59223","59224","59225","59226","59227","59228","59229","59230","59231","59232","59233","59234","59235","59236","59237","59238","59239","59240","59241","59242","59243","59244","59245","59246","59247","59248","59249","59250","59251","59252","59253","59254","59255","59256","59257","59258","59259","59260","59261","59262","59264","59265","59266","59267","59268","59269","59270","59271","59272","59273","59274","59275","59276","59277","59278","59279","59280","59281","59282","59283","59284","59285","59286","59287","59288","59289","59290","59291","59292","59293","59294","59295","59296","59297","59298","59299","59300","59301","59302","59303","59304","59305","59306","59307","59308","59309","59310","59311","59312","59313","59314","59315","59316","59317","59318","59319","59320","59321","59322","59323","59324","59325","59326","59327","59328","59329","59330","59331","59332","59333","59334","59335","59336","59337","59338","59339","59340","59341","59342","59343","59344","59345","59346","59347","59348","59349","59350","59351","59352","59353","59354","59355","59356","59357","59358","59359","59360","59361","59362","59363","59364","59365","59366","59367","59368","59369","59370","59371","59372","59373","59374","59375","59376","59377","59378","59379","59380","59381","59382","59383","59384","59385","59386","59387","59388","59456","59457","59458","59459","59460","59461","59462","59463","59464","59465","59466","59467","59468","59469","59470","59471","59472","59473","59474","59475","59476","59477","59478","59479","59480","59481","59482","59483","59484","59485","59486","59487","59488","59489","59490","59491","59492","59493","59494","59495","59496","59497","59498","59499","59500","59501","59502","59503","59504","59505","59506","59507","59508","59509","59510","59511","59512","59513","59514","59515","59516","59517","59518","59520","59521","59522","59523","59524","59525","59526","59527","59528","59529","59530","59531","59532","59533","59534","59535","59536","59537","59538","59539","59540","59541","59542","59543","59544","59545","59546","59547","59548","59549","59550","59551","59552","59553","59554","59555","59556","59557","59558","59559","59560","59561","59562","59563","59564","59565","59566","59567","59568","59569","59570","59571","59572","59573","59574","59575","59576","59577","59578","59579","59580","59581","59582","59583","59584","59585","59586","59587","59588","59589","59590","59591","59592","59593","59594","59595","59596","59597","59598","59599","59600","59601","59602","59603","59604","59605","59606","59607","59608","59609","59610","59611","59612","59613","59614","59615","59616","59617","59618","59619","59620","59621","59622","59623","59624","59625","59626","59627","59628","59629","59630","59631","59632","59633","59634","59635","59636","59637","59638","59639","59640","59641","59642","59643","59644","59712","59713","59714","59715","59716","59717","59718","59719","59720","59721","59722","59723","59724","59725","59726","59727","59728","59729","59730","59731","59732","59733","59734","59735","59736","59737","59738","59739","59740","59741","59742","59743","59744","59745","59746","59747","59748","59749","59750","59751","59752","59753","59754","59755","59756","59757","59758","59759","59760","59761","59762","59763","59764","59765","59766","59767","59768","59769","59770","59771","59772","59773","59774","59776","59777","59778","59779","59780","59781","59782","59783","59784","59785","59786","59787","59788","59789","59790","59791","59792","59793","59794","59795","59796","59797","59798","59799","59800","59801","59802","59803","59804","59805","59806","59807","59808","59809","59810","59811","59812","59813","59814","59815","59816","59817","59818","59819","59820","59821","59822","59823","59824","59825","59826","59827","59828","59829","59830","59831","59832","59833","59834","59835","59836","59837","59838","59839","59840","59841","59842","59843","59844","59845","59846","59847","59848","59849","59850","59851","59852","59853","59854","59855","59856","59857","59858","59859","59860","59861","59862","59863","59864","59865","59866","59867","59868","59869","59870","59871","59872","59873","59874","59875","59876","59877","59878","59879","59880","59881","59882","59883","59884","59885","59886","59887","59888","59889","59890","59891","59892","59893","59894","59895","59896","59897","59898","59899","59900","59968","59969","59970","59971","59972","59973","59974","59975","59976","59977","59978","59979","59980","59981","59982","59983","59984","59985","59986","59987","59988","59989","59990","59991","59992","59993","59994","59995","59996","59997","59998","59999","60000","60001","60002","60003","60004","60005","60006","60007","60008","60009","60010","60011","60012","60013","60014","60015","60016","60017","60018","60019","60020","60021","60022","60023","60024","60025","60026","60027","60028","60029","60030","60032","60033","60034","60035","60036","60037","60038","60039","60040","60041","60042","60043","60044","60045","60046","60047","60048","60049","60050","60051","60052","60053","60054","60055","60056","60057","60058","60059","60060","60061","60062","60063","60064","60065","60066","60067","60068","60736","60737","60738","60739","60740","60741","60742","60743","60744","60745","60746","60747","60748","60749","60750","60751","60752","60753","60754","60755","60756","60757","60758","60759","60760","60761","60762","60763","60764","60765","60766","60767","60768","60769","60770","60771","60772","60773","60774","60775","60776","60777","60778","60779","60780","60781","60782","60783","60784","60785","60786","60787","60788","60789","60790","60791","60792","60793","60794","60795","60796","60797","60798","60800","60801","60802","60803","60804","60805","60806","60807","60808","60809","60810","60811","60812","60813","60814","60815","60816","60817","60818","60819","60820","60821","60822","60823","60824","60825","60826","60827","60828","60829","60830","60831","60832","60833","60834","60835","60836","60837","60838","60839","60840","60841","60842","60843","60844","60845","60846","60847","60848","60849","60850","60851","60852","60853","60854","60855","60856","60857","60858","60859","60860","60861","60862","60863","60864","60865","60866","60867","60868","60869","60870","60871","60872","60873","60874","60875","60876","60877","60878","60879","60880","60881","60882","60883","60884","60885","60886","60887","60888","60889","60890","60891","60892","60893","60894","60895","60896","60897","60898","60899","60900","60901","60902","60903","60904","60905","60906","60907","60908","60909","60910","60911","60912","60913","60914","60915","60916","60917","60918","60919","60920","60921","60922","60923","60924","60992","60993","60994","60995","60996","60997","60998","60999","61000","61001","61002","61003","61004","61005","61006","61007","61008","61009","61010","61011","61012","61013","61014","61015","61016","61017","61018","61019","61020","61021","61022","61023","61024","61025","61026","61027","61028","61029","61030","61031","61032","61033","61034","61035","61036","61037","61038","61039","61040","61041","61042","61043","61044","61045","61046","61047","61048","61049","61050","61051","61052","61053","61054","61056","61057","61058","61059","61060","61061","61062","61063","61064","61065","61066","61067","61068","61069","61070","61071","61072","61073","61074","61075","61076","61077","61078","61079","61080","61081","61082","61083","61084","61085","61086","61087","61088","61089","61090","61091","61092","61093","61094","61095","61096","61097","61098","61099","61100","61101","61102","61103","61104","61105","61106","61107","61108","61109","61110","61111","61112","61113","61114","61115","61116","61117","61118","61119","61120","61121","61122","61123","61124","61125","61126","61127","61128","61129","61130","61131","61132","61133","61134","61135","61136","61137","61138","61139","61140","61141","61142","61143","61144","61145","61146","61147","61148","61149","61150","61151","61152","61153","61154","61155","61156","61157","61158","61159","61160","61161","61162","61163","61164","61167","61168","61169","61170","61171","61172","61173","61174","61175","61176","61177","61178","61179","61180","61504","61505","61506","61507","61508","61509","61510","61511","61512","61513","61514","61515","61516","61517","61518","61519","61520","61521","61522","61523","61524","61525","61526","61527","61528","61529","61530","61531","61532","61533","61534","61535","61536","61537","61538","61539","61540","61541","61542","61543","61544","61545","61546","61547","61548","61549","61550","61551","61552","61553","61554","61555","61556","61557","61558","61559","61560","61561","61562","61563","61564","61565","61566","61568","61569","61570","61571","61572","61573","61574","61575","61576","61577","61578","61579","61580","61581","61582","61583","61584","61585","61586","61587","61588","61589","61590","61591","61592","61593","61594","61595","61596","61597","61598","61599","61600","61601","61602","61603","61604","61605","61606","61607","61608","61609","61610","61611","61612","61613","61614","61615","61616","61617","61618","61619","61620","61621","61622","61623","61624","61625","61626","61627","61628","61629","61630","61631","61632","61633","61634","61635","61636","61637","61638","61639","61640","61641","61642","61643","61644","61645","61646","61647","61648","61649","61650","61651","61652","61653","61654","61655","61656","61657","61658","61659","61660","61661","61662","61663","61664","61665","61666","61667","61668","61669","61670","61671","61672","61673","61674","61675","61676","61677","61678","61679","61680","61681","61682","61683","61684","61685","61686","61687","61688","61689","61690","61691","61692","61760","61761","61762","61763","61764","61765","61766","61767","61768","61769","61770","61771","61772","61773","61774","61775","61776","61777","61778","61779","61780","61781","61782","61783","61784","61785","61786","61787","61788","61789","61790","61791","61792","61793","61794","61795","61796","61797","61798","61799","61800","61801","61802","61803","61804","61805","61806","61807","61808","61809","61810","61811","61812","61813","61814","61815","61816","61817","61818","61819","61820","61821","61822","61824","61825","61826","61827","61828","61829","61830","61831","61832","61833","61834","61835","61836","61837","61838","61839","61840","61841","61842","61843","61844","61845","61846","61847","61848","61849","61850","61851","61852","61853","61854","61855","61856","61857","61858","61859","61860","61861","61862","61863","61864","61865","61866","61867","61868","61869","61870","61871","61872","61873","61874","61875","61876","61877","61878","61879","61880","61881","61882","61883","61884","61885","61886","61887","61888","61889","61890","61891","61892","61893","61894","61895","61896","61897","61898","61899","61900","61901","61902","61903","61904","61905","61906","61907","61908","61909","61910","61911","61912","61913","61914","61915","61916","61917","61918","61919","61920","61921","61922","61923","61924","61925","61926","61927","61928","61929","61930","61931","61932","61933","61934","61935","61936","61937","61938","61939","61940","61941","61942","61943","61944","61945","61946","61947","61948","62016","62017","62018","62019","62020","62021","62022","62023","62024","62025","62026","62027","62028","62029","62030","62031","62032","62033","62034","62035","62036","62037","62038","62039","62040","62041","62042","62043","62044","62045","62046","62047","62048","62049","62050","62051","62052","62053","62054","62055","62056","62057","62058","62059","62060","62061","62062","62063","62064","62065","62066","62067","62068","62069","62070","62071","62072","62073","62074","62075","62076","62077","62078","62080","62081","62082","62083","62084","62085","62086","62087","62088","62089","62090","62091","62092","62093","62094","62095","62096","62097","62098","62099","62100","62101","62102","62103","62104","62105","62106","62107","62108","62109","62110","62111","62112","62113","62114","62115","62116","62117","62118","62119","62120","62121","62122","62123","62124","62125","62126","62127","62128","62129","62130","62131","62132","62133","62134","62135","62136","62137","62138","62139","62140","62141","62142","62143","62144","62145","62146","62147","62148","62149","62150","62151","62152","62153","62154","62155","62156","62157","62158","62159","62160","62161","62162","62163","62164","62165","62166","62167","62168","62169","62170","62171","62172","62173","62174","62175","62176","62177","62178","62179","62180","62181","62182","62183","62184","62185","62186","62187","62188","62189","62190","62191","62192","62193","62194","62195","62196","62197","62198","62199","62200","62201","62202","62203","62204","62272","62273","62274","62275","62276","62277","62278","62279","62280","62281","62282","62283","62284","62285","62286","62287","62288","62289","62290","62291","62292","62293","62294","62295","62296","62297","62298","62299","62300","62301","62302","62303","62304","62305","62306","62307","62308","62309","62310","62311","62312","62313","62314","62315","62316","62317","62318","62319","62320","62321","62322","62323","62324","62325","62326","62327","62328","62329","62330","62331","62332","62333","62334","62336","62337","62338","62339","62340","62341","62342","62343","62344","62345","62346","62347","62348","62349","62350","62351","62352","62353","62354","62355","62356","62357","62358","62359","62360","62361","62362","62363","62364","62365","62366","62367","62368","62369","62370","62371","62372","62373","62374","62375","62376","62377","62378","62379","62380","62381","62382","62383","62384","62385","62386","62387","62388","62389","62390","62391","62392","62393","62394","62395","62396","62397","62398","62399","62400","62401","62402","62403","62404","62405","62406","62407","62408","62409","62410","62411","62412","62413","62414","62415","62416","62417","62418","62419","62420","62421","62422","62423","62424","62425","62426","62427","62428","62429","62430","62431","62432","62433","62434","62435","62436","62437","62438","62439","62440","62441","62442","62443","62444","62445","62446","62447","62448","62449","62450","62451","62452","62453","62454","62455","62456","62457","62458","62459","62460","62528","62529","62530","62531","62532","62533","62534","62535","62536","62537","62538","62539","62540","62541","62542","62543","62544","62545","62546","62547","62548","62549","62550","62551","62552","62553","62554","62555","62556","62557","62558","62559","62560","62561","62562","62563","62564","62565","62566","62567","62568","62569","62570","62571","62572","62573","62574","62575","62576","62577","62578","62579","62580","62581","62582","62583","62584","62585","62586","62587","62588","62589","62590","62592","62593","62594","62595","62596","62597","62598","62599","62600","62601","62602","62603","62604","62605","62606","62607","62608","62609","62610","62611","62612","62613","62614","62615","62616","62617","62618","62619","62620","62621","62622","62623","62624","62625","62626","62627","62628","62629","62630","62631","62632","62633","62634","62635","62636","62637","62638","62639","62640","62641","62642","62643","62644","62645","62646","62647","62648","62649","62650","62651","62652","62653","62654","62655","62656","62657","62658","62659","62660","62661","62662","62663","62664","62665","62666","62667","62668","62669","62670","62671","62672","62673","62674","62675","62676","62677","62678","62679","62680","62681","62682","62683","62684","62685","62686","62687","62688","62689","62690","62691","62692","62693","62694","62695","62696","62697","62698","62699","62700","62701","62702","62703","62704","62705","62706","62707","62708","62709","62710","62711","62712","62713","62714","62715","62716","62784","62785","62786","62787","62788","62789","62790","62791","62792","62793","62794","62795","62796","62797","62798","62799","62800","62801","62802","62803","62804","62805","62806","62807","62808","62809","62810","62811","62812","62813","62814","62815","62816","62817","62818","62819","62820","62821","62822","62823","62824","62825","62826","62827","62828","62829","62830","62831","62832","62833","62834","62835","62836","62837","62838","62839","62840","62841","62842","62843","62844","62845","62846","62848","62849","62850","62851","62852","62853","62854","62855","62856","62857","62858","62859","62860","62861","62862","62863","62864","62865","62866","62867","62868","62869","62870","62871","62872","62873","62874","62875","62876","62877","62878","62879","62880","62881","62882","62883","62884","62885","62886","62887","62888","62889","62890","62891","62892","62893","62894","62895","62896","62897","62898","62899","62900","62901","62902","62903","62904","62905","62906","62907","62908","62909","62910","62911","62912","62913","62914","62915","62916","62917","62918","62919","62920","62921","62922","62923","62924","62925","62926","62927","62928","62929","62930","62931","62932","62933","62934","62935","62936","62937","62938","62939","62940","62941","62942","62943","62944","62945","62946","62947","62948","62949","62950","62951","62952","62953","62954","62955","62956","62957","62958","62959","62960","62961","62962","62963","62964","62965","62966","62967","62968","62969","62970","62971","62972","63040","63041","63042","63043","63044","63045","63046","63047","63048","63049","63050","63051","63052","63053","63054","63055","63056","63057","63058","63059","63060","63061","63062","63063","63064","63065","63066","63067","63068","63069","63070","63071","63072","63073","63074","63075","63076","63077","63078","63079","63080","63081","63082","63083","63084","63085","63086","63087","63088","63089","63090","63091","63092","63093","63094","63095","63096","63097","63098","63099","63100","63101","63102","63104","63105","63106","63107","63108","63109","63110","63111","63112","63113","63114","63115","63116","63117","63118","63119","63120","63121","63122","63123","63124","63125","63126","63127","63128","63129","63130","63131","63132","63133","63134","63135","63136","63137","63138","63139","63140","63141","63142","63143","63144","63145","63146","63147","63148","63149","63150","63151","63152","63153","63154","63155","63156","63157","63158","63159","63160","63161","63162","63163","63164","63165","63166","63167","63168","63169","63170","63171","63172","63173","63174","63175","63176","63177","63178","63179","63180","63181","63182","63183","63184","63185","63186","63187","63188","63189","63190","63191","63192","63193","63194","63195","63196","63197","63198","63199","63200","63201","63202","63203","63204","63205","63206","63207","63208","63209","63210","63211","63212","63213","63214","63215","63216","63217","63218","63219","63220","63221","63222","63223","63224","63225","63226","63227","63228","63296","63297","63298","63299","63300","63301","63302","63303","63304","63305","63306","63307","63308","63309","63310","63311","63312","63313","63314","63315","63316","63317","63318","63319","63320","63321","63322","63323","63324","63325","63326","63327","63328","63329","63330","63331","63332","63333","63334","63335","63336","63337","63338","63339","63340","63341","63342","63343","63344","63345","63346","63347","63348","63349","63350","63351","63352","63353","63354","63355","63356","63357","63358","63360","63361","63362","63363","63364","63365","63366","63367","63368","63369","63370","63371","63372","63373","63374","63375","63376","63377","63378","63379","63380","63381","63382","63383","63384","63385","63386","63387","63388","63389","63390","63391","63392","63393","63394","63395","63396","63397","63398","63399","63400","63401","63402","63403","63404","63405","63406","63407","63408","63409","63410","63411","63412","63413","63414","63415","63416","63417","63418","63419","63420","63421","63422","63423","63424","63425","63426","63427","63428","63429","63430","63431","63432","63433","63434","63435","63436","63437","63438","63439","63440","63441","63442","63443","63444","63445","63446","63447","63448","63449","63450","63451","63452","63453","63454","63455","63456","63457","63458","63459","63460","63461","63462","63463","63464","63465","63466","63467","63468","63469","63470","63471","63472","63473","63474","63475","63476","63477","63478","63479","63480","63481","63482","63483","63484","63552","63553","63554","63555","63556","63557","63558","63559","63560","63561","63562","63563","63564","63565","63566","63567","63568","63569","63570","63571","63572","63573","63574","63575","63576","63577","63578","63579","63580","63581","63582","63583","63584","63585","63586","63587","63588","63589","63590","63591","63592","63593","63594","63595","63596","63597","63598","63599","63600","63601","63602","63603","63604","63605","63606","63607","63608","63609","63610","63611","63612","63613","63614","63616","63617","63618","63619","63620","63621","63622","63623","63624","63625","63626","63627","63628","63629","63630","63631","63632","63633","63634","63635","63636","63637","63638","63639","63640","63641","63642","63643","63644","63645","63646","63647","63648","63649","63650","63651","63652","63653","63654","63655","63656","63657","63658","63659","63660","63661","63662","63663","63664","63665","63666","63667","63668","63669","63670","63671","63672","63673","63674","63675","63676","63677","63678","63679","63680","63681","63682","63683","63684","63685","63686","63687","63688","63689","63690","63691","63692","63693","63694","63695","63696","63697","63698","63699","63700","63701","63702","63703","63704","63705","63706","63707","63708","63709","63710","63711","63712","63713","63714","63715","63716","63717","63718","63719","63720","63721","63722","63723","63724","63725","63726","63727","63728","63729","63730","63731","63732","63733","63734","63735","63736","63737","63738","63739","63740","64064","64065","64066","64067","64068","64069","64070","64071","64072","64073","64074","64075","64076","64077","64078","64079","64080","64081","64082","64083","64084","64085","64086","64087","64088","64089","64090","64091","64092","64093","64094","64095","64096","64097","64098","64099","64100","64101","64102","64103","64104","64105","64106","64107","64108","64109","64110","64111","64112","64113","64114","64115","64116","64117","64118","64119","64120","64121","64122","64123","64124","64125","64126","64128","64129","64130","64131","64132","64133","64134","64135","64136","64137","64138","64139","64140","64141","64142","64143","64144","64145","64146","64147","64148","64149","64150","64151","64152","64153","64154","64155","64156","64157","64158","64159","64160","64161","64162","64163","64164","64165","64166","64167","64168","64169","64170","64171","64172","64173","64174","64175","64176","64177","64178","64179","64180","64181","64182","64183","64184","64185","64186","64187","64188","64189","64190","64191","64192","64193","64194","64195","64196","64197","64198","64199","64200","64201","64202","64203","64204","64205","64206","64207","64208","64209","64210","64211","64212","64213","64214","64215","64216","64217","64218","64219","64220","64221","64222","64223","64224","64225","64226","64227","64228","64229","64230","64231","64232","64233","64234","64235","64236","64237","64238","64239","64240","64241","64242","64243","64244","64245","64246","64247","64248","64249","64250","64251","64252","64320","64321","64322","64323","64324","64325","64326","64327","64328","64329","64330","64331","64332","64333","64334","64335","64336","64337","64338","64339","64340","64341","64342","64343","64344","64345","64346","64347","64348","64349","64350","64351","64352","64353","64354","64355","64356","64357","64358","64359","64360","64361","64362","64363","64364","64365","64366","64367","64368","64369","64370","64371","64372","64373","64374","64375","64376","64377","64378","64379","64380","64381","64382","64384","64385","64386","64387","64388","64389","64390","64391","64392","64393","64394","64395","64396","64397","64398","64399","64400","64401","64402","64403","64404","64405","64406","64407","64408","64409","64410","64411","64412","64413","64414","64415","64416","64417","64418","64419","64420","64421","64422","64423","64424","64425","64426","64427","64428","64429","64430","64431","64432","64433","64434","64435","64436","64437","64438","64439","64440","64441","64442","64443","64444","64445","64446","64447","64448","64449","64450","64451","64452","64453","64454","64455","64456","64457","64458","64459","64460","64461","64462","64463","64464","64465","64466","64467","64468","64469","64470","64471","64472","64473","64474","64475","64476","64477","64478","64479","64480","64481","64482","64483","64484","64485","64486","64487","64488","64489","64490","64491","64492","64493","64494","64495","64496","64497","64498","64499","64500","64501","64502","64503","64504","64505","64506","64507","64508","64576","64577","64578","64579","64580","64581","64582","64583","64584","64585","64586","64587","getInt8","getInt8Array","getUint8Array","getInt16Array","getUint16","getUint16Array","getUint32Array","isUnsigned","getIndexArray","getChars","getSjisStringsAsUnicode","getUnicodeStrings","getTextBuffer","leftToRightVector3","leftToRightQuaternion","leftToRightEuler","leftToRightIndexOrder","leftToRightVector3Range","leftToRightEulerRange","r1","r2","tmp1","tmp2","parsePmd","leftToRight","pmd","coordinateSystem","comment","parseHeader","vertexCount","edgeFlag","parseVertices","faceCount","parseFaces","materialCount","toonIndex","boneCount","parentIndex","tailIndex","ikIndex","parseBones","parseIk","effector","linkCount","iteration","maxAngle","link","ikCount","iks","parseIks","parseMorph","elementCount","morphCount","morphs","parseMorphs","morphFrameCount","morphFrames","parseMorphFrames","boneFrameNameCount","boneFrameNames","parseBoneFrameNames","boneFrameCount","boneFrames","frameIndex","parseBoneFrames","englishCompatibility","englishModelName","englishComment","englishBoneNames","parseEnglishBoneNames","englishMorphNames","parseEnglishMorphNames","englishBoneFrameNames","parseEnglishBoneFrameNames","toonTextures","parseToonTextures","rigidBodyCount","groupIndex","groupTarget","shapeType","positionDamping","rotationDamping","restitution","friction","parseRigidBodies","constraintCount","constraints","rigidBodyIndex1","rigidBodyIndex2","translationLimitation1","translationLimitation2","rotationLimitation1","rotationLimitation2","springPosition","springRotation","parseConstraints","leftToRightModel","parsePmx","pmx","headerSize","additionalUvNum","vertexIndexSize","textureIndexSize","materialIndexSize","boneIndexSize","morphIndexSize","rigidBodyIndexSize","parseVertex","auvs","indexSize","skinC","skinR0","skinR1","edgeRatio","textureCount","englishName","edgeColor","edgeSize","envTextureIndex","envFlag","toonFlag","parseBone","transformationClass","connectIndex","offsetPosition","grant","isLocal","affectRotation","affectPosition","ratio","fixAxis","localXVector","localZVector","ik","angleLimitation","lowerLimitationAngle","upperLimitationAngle","panel","textureColor","sphereTextureColor","toonColor","parseFrame","parseFrames","parseVmd","vmd","motionCount","motions","frameNum","parseMotions","cameraCount","perspective","parseCameras","leftToRightVmd","parseVpd","vpd","throwError","parentFile","boneHeaderPattern","boneVectorPattern","boneQuaternionPattern","boneFooterPattern","leftToRightVpd","mergeVmds","vmds","MMDParser","MMDLoader","meshBuilder","MeshBuilder","animationBuilder","AnimationBuilder","setAnimationPath","animationPath","modelExtension","_extractExtension","loadVMD","buildCameraAnimation","loadWithAnimation","modelUrl","vmdUrl","loadPMD","_getParser","loadPMX","vmdNum","loadVPD","isUnicode","DEFAULT_TOON_TEXTURES","geometryBuilder","GeometryBuilder","materialBuilder","MaterialBuilder","CubicBezierInterpolation","interpolationParams","gbone","rotq","scl","grants","boneTypeTable","rigidBodyType","limitation","rotationMin","rotationMax","updateAttributes","morph2","rigidBody","constraint","bodyA","bodyB","MMD","fileNames","_loadTexture","toonFileName","isToonTexture","isDefaultToonTexture","_isDefaultToonTexture","outlineParameters","thickness","isDefaultToon","_checkImageTransparency","checkAlphaMorph","_getTGALoader","filePath","fullPath","_getRotatedImage","readyCallbacks","clearRect","getImageData","getAlphaByUv","centerUV","detectImageTransparency","buildSkeletalAnimation","tracks2","buildMorphAnimation","pushInterpolation","boneNameDictionary","motion","rotations","pInterpolations","rInterpolations","_createTrack","pushVector3","centers","quaternions","fovs","cInterpolations","qInterpolations","fInterpolations","rot","typedKeyframeTrack","interpolations","interpolateStride","aheadIndex","_calculate","sst3","stt3","ttt","math","ft","selectedModel","selectedScene","statusMsg","modelObj","xhr","sceneObj","OrbitControls","quatInverse","lastPosition","lastQuaternion","twoPI","minDistance","minZoom","maxZoom","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","enableDamping","dampingFactor","enableZoom","zoomSpeed","enableRotate","rotateSpeed","enablePan","panSpeed","screenSpacePanning","keyPanSpeed","autoRotate","autoRotateSpeed","enableKeys","LEFT","UP","RIGHT","BOTTOM","mouseButtons","MIDDLE","touches","ONE","TWO","target0","position0","zoom0","getPolarAngle","spherical","getAzimuthalAngle","saveState","changeEvent","STATE","NONE","rotateLeft","sphericalDelta","makeSafe","panOffset","zoomChanged","onContextMenu","onMouseDown","onMouseWheel","onTouchStart","onTouchEnd","onTouchMove","onMouseMove","onMouseUp","onKeyDown","startEvent","endEvent","ROTATE","DOLLY","PAN","TOUCH_ROTATE","TOUCH_PAN","TOUCH_DOLLY_PAN","TOUCH_DOLLY_ROTATE","rotateStart","rotateEnd","rotateDelta","panStart","panEnd","panDelta","dollyStart","dollyEnd","dollyDelta","getZoomScale","rotateUp","panLeft","objectMatrix","panUp","pan","deltaX","deltaY","targetDistance","clientHeight","clientWidth","dollyOut","dollyScale","dollyIn","handleMouseDownRotate","clientX","clientY","handleMouseDownPan","handleTouchStartRotate","pageX","pageY","handleTouchStartPan","handleTouchStartDolly","handleTouchMoveRotate","handleTouchMovePan","handleTouchMoveDolly","mouseAction","button","handleMouseDownDolly","ctrlKey","metaKey","shiftKey","handleMouseMoveRotate","handleMouseMoveDolly","handleMouseMovePan","stopPropagation","handleMouseWheel","keyCode","handleKeyDown","handleTouchStartDollyPan","handleTouchStartDollyRotate","handleTouchMoveDollyPan","handleTouchMoveDollyRotate","tabIndex","MapControls","Stats","addPanel","dom","showPanel","display","cssText","beginTime","fpsPanel","Panel","msPanel","memPanel","REVISION","begin","usedJSHeapSize","jsHeapSizeLimit","controls","clock","hemiLight","dirLight","THREE.PerspectiveCamera","THREE.Scene","THREE.Color","THREE.Clock","THREE.BoxGeometry","THREE.MeshNormalMaterial","THREE.GridHelper","THREE.HemisphereLight","THREE.DirectionalLight","THREE.Mesh","THREE.PlaneBufferGeometry","THREE.MeshPhongMaterial","THREE.WebGLRenderer","fg","bg","PR","devicePixelRatio","WIDTH","HEIGHT","TEXT_X","TEXT_Y","GRAPH_X","GRAPH_Y","GRAPH_WIDTH","GRAPH_HEIGHT","textBaseline","fillStyle","fillRect","fillText","globalAlpha","maxValue"],"mappings":"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G,EACHC,EAAG,EACHC,EAAG,EACHC,EAAG,EACHC,EAAG,EACHC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJ31G,IAAK,IACLC,IAAK,IACLC,IAAK,IACL01G,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLp5G,IAAK,MACLC,IAAK,MACLC,IAAK,MACLK,IAAK,MACLJ,IAAK,MACLK,IAAK,MACLF,IAAK,MACLI,IAAK,MACLL,IAAK,MACLI,IAAK,MACLL,IAAK,MACLi5G,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,IACPC,MAAO,MACPC,MAAO,IACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,IACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,IACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,IACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPvsC,MAAO,MACPwsC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,IACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,IACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,IAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,IAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,KAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,KACPC,MAAO,KACPC,MAAO,KACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MAAO,MACPC,MA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"}