//云游戏解码
//了解当前模块请搜索关键字 》》》TDDE《《《 了解注意注释
(function(root, factory) {
	if(typeof define === 'function' && define.amd) {
		define([], factory);
	} else if(typeof exports === 'object') {
		module.exports = factory();
	} else {
		root.Decoder = factory();
	}
}(this, function() {

	var global;

	function initglobal() {
		global = this;
		if(!global) {
			if(typeof window != "undefined") {
				global = window;
			} else if(typeof self != "undefined") {
				global = self;
			};
		};
	};
	initglobal();

	function error(message) {
		console.error(message);
		console.trace();
	};

	function assert(condition, message) {
		if(!condition) {
			error(message);
		};
	};

	var getModule = function(par_broadwayOnHeadersDecoded, par_broadwayOnPictureDecoded) {

		/*var ModuleX = {
		  'print': function(text) { console.log('stdout: ' + text); },
		  'printErr': function(text) { console.log('stderr: ' + text); }
		};*/

		/*
    
		  所有这些都打包到一个文件中的原因是，该文件也可以作为辅助文件使用。

您可以将该文件集成到构建系统中，并提供要加载到辅助进程中的原始文件。
    
		*/

		//var Module = (function(){

		var Module = typeof Module !== "undefined" ? Module : {};
		var moduleOverrides = {};
		var key;
		for(key in Module) {
			if(Module.hasOwnProperty(key)) {
				moduleOverrides[key] = Module[key]
			}
		}
		Module["arguments"] = [];
		Module["thisProgram"] = "./this.program";
		Module["quit"] = (function(status, toThrow) {
			throw toThrow
		});
		Module["preRun"] = [];
		Module["postRun"] = [];
		var ENVIRONMENT_IS_WEB = false;
		var ENVIRONMENT_IS_WORKER = false;
		var ENVIRONMENT_IS_NODE = false;
		var ENVIRONMENT_IS_SHELL = false;
		if(Module["ENVIRONMENT"]) {
			if(Module["ENVIRONMENT"] === "WEB") {
				ENVIRONMENT_IS_WEB = true
			} else if(Module["ENVIRONMENT"] === "WORKER") {
				ENVIRONMENT_IS_WORKER = true
			} else if(Module["ENVIRONMENT"] === "NODE") {
				ENVIRONMENT_IS_NODE = true
			} else if(Module["ENVIRONMENT"] === "SHELL") {
				ENVIRONMENT_IS_SHELL = true
			} else {
				throw new Error("Module['ENVIRONMENT'] value is not valid. must be one of: WEB|WORKER|NODE|SHELL.")
			}
		} else {
			ENVIRONMENT_IS_WEB = typeof window === "object";
			ENVIRONMENT_IS_WORKER = typeof importScripts === "function";
			ENVIRONMENT_IS_NODE = typeof process === "object" && typeof null === "function" && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER;
			ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
		}
		if(ENVIRONMENT_IS_NODE) {
			var nodeFS;
			var nodePath;
			Module["read"] = function shell_read(filename, binary) {
				var ret;
				if(!nodeFS) nodeFS = (null)("fs");
				if(!nodePath) nodePath = (null)("path");
				filename = nodePath["normalize"](filename);
				ret = nodeFS["readFileSync"](filename);
				return binary ? ret : ret.toString()
			};
			Module["readBinary"] = function readBinary(filename) {
				var ret = Module["read"](filename, true);
				if(!ret.buffer) {
					ret = new Uint8Array(ret)
				}
				assert(ret.buffer);
				return ret
			};
			if(process["argv"].length > 1) {
				Module["thisProgram"] = process["argv"][1].replace(/\\/g, "/")
			}
			Module["arguments"] = process["argv"].slice(2);
			if(typeof module !== "undefined") {
				module["exports"] = Module
			}
			process["on"]("uncaughtException", (function(ex) {
				if(!(ex instanceof ExitStatus)) {
					throw ex
				}
			}));
			process["on"]("unhandledRejection", (function(reason, p) {
				process["exit"](1)
			}));
			Module["inspect"] = (function() {
				return "[Emscripten Module object]"
			})
		} else if(ENVIRONMENT_IS_SHELL) {
			if(typeof read != "undefined") {
				Module["read"] = function shell_read(f) {
					return read(f)
				}
			}
			Module["readBinary"] = function readBinary(f) {
				var data;
				if(typeof readbuffer === "function") {
					return new Uint8Array(readbuffer(f))
				}
				data = read(f, "binary");
				assert(typeof data === "object");
				return data
			};
			if(typeof scriptArgs != "undefined") {
				Module["arguments"] = scriptArgs
			} else if(typeof arguments != "undefined") {
				Module["arguments"] = arguments
			}
			if(typeof quit === "function") {
				Module["quit"] = (function(status, toThrow) {
					quit(status)
				})
			}
		} else if(ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
			Module["read"] = function shell_read(url) {
				var xhr = new XMLHttpRequest;
				xhr.open("GET", url, false);
				xhr.send(null);
				return xhr.responseText
			};
			if(ENVIRONMENT_IS_WORKER) {
				Module["readBinary"] = function readBinary(url) {
					var xhr = new XMLHttpRequest;
					xhr.open("GET", url, false);
					xhr.responseType = "arraybuffer";
					xhr.send(null);
					return new Uint8Array(xhr.response)
				}
			}
			Module["readAsync"] = function readAsync(url, onload, onerror) {
				var xhr = new XMLHttpRequest;
				xhr.open("GET", url, true);
				xhr.responseType = "arraybuffer";
				xhr.onload = function xhr_onload() {
					if(xhr.status == 200 || xhr.status == 0 && xhr.response) {
						onload(xhr.response);
						return
					}
					onerror()
				};
				xhr.onerror = onerror;
				xhr.send(null)
			};
			Module["setWindowTitle"] = (function(title) {
				document.title = title
			})
		} else {
			throw new Error("not compiled for this environment")
		}
		Module["print"] = typeof console !== "undefined" ? console.log.bind(console) : typeof print !== "undefined" ? print : null;
		Module["printErr"] = typeof printErr !== "undefined" ? printErr : typeof console !== "undefined" && console.warn.bind(console) || Module["print"];
		Module.print = Module["print"];
		Module.printErr = Module["printErr"];
		for(key in moduleOverrides) {
			if(moduleOverrides.hasOwnProperty(key)) {
				Module[key] = moduleOverrides[key]
			}
		}
		moduleOverrides = undefined;
		var STACK_ALIGN = 16;

		function staticAlloc(size) {
			assert(!staticSealed);
			var ret = STATICTOP;
			STATICTOP = STATICTOP + size + 15 & -16;
			return ret
		}

		function alignMemory(size, factor) {
			if(!factor) factor = STACK_ALIGN;
			var ret = size = Math.ceil(size / factor) * factor;
			return ret
		}
		var asm2wasmImports = {
			"f64-rem": (function(x, y) {
				return x % y
			}),
			"debugger": (function() {
				debugger
			})
		};
		var functionPointers = new Array(0);
		var GLOBAL_BASE = 1024;
		var ABORT = 0;
		var EXITSTATUS = 0;

		function assert(condition, text) {
			if(!condition) {
				abort("Assertion failed: " + text)
			}
		}

		function Pointer_stringify(ptr, length) {
			if(length === 0 || !ptr) return "";
			var hasUtf = 0;
			var t;
			var i = 0;
			while(1) {
				t = HEAPU8[ptr + i >> 0];
				hasUtf |= t;
				if(t == 0 && !length) break;
				i++;
				if(length && i == length) break
			}
			if(!length) length = i;
			var ret = "";
			if(hasUtf < 128) {
				var MAX_CHUNK = 1024;
				var curr;
				while(length > 0) {
					curr = String.fromCharCode.apply(String, HEAPU8.subarray(ptr, ptr + Math.min(length, MAX_CHUNK)));
					ret = ret ? ret + curr : curr;
					ptr += MAX_CHUNK;
					length -= MAX_CHUNK
				}
				return ret
			}
			return UTF8ToString(ptr)
		}
		var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined;
//      头部协议UTF-8 0001 === 224  TDDE  UTF8阵列字符串
		function UTF8ArrayToString(u8Array, idx) {
			var endPtr = idx;
			while(u8Array[endPtr]) ++endPtr;
			if(endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
				return UTF8Decoder.decode(u8Array.subarray(idx, endPtr))
			} else {
				var u0, u1, u2, u3, u4, u5;
				var str = "";
				//UTF8阵列字符串 请了解 UTF8的排序 计算  huangfei 
				while(1) {
					u0 = u8Array[idx++];
					if(!u0) return str;
					if(!(u0 & 128)) {
						str += String.fromCharCode(u0);//来自char code，
						continue
					}
					u1 = u8Array[idx++] & 63;
					if((u0 & 224) == 192) {
						str += String.fromCharCode((u0 & 31) << 6 | u1);
						continue
					}
					u2 = u8Array[idx++] & 63;
					if((u0 & 240) == 224) {
						u0 = (u0 & 15) << 12 | u1 << 6 | u2
					} else {
						u3 = u8Array[idx++] & 63;
						if((u0 & 248) == 240) {
							u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | u3
						} else {
							u4 = u8Array[idx++] & 63;
							if((u0 & 252) == 248) {
								u0 = (u0 & 3) << 24 | u1 << 18 | u2 << 12 | u3 << 6 | u4
							} else {
								u5 = u8Array[idx++] & 63;
								u0 = (u0 & 1) << 30 | u1 << 24 | u2 << 18 | u3 << 12 | u4 << 6 | u5
							}
						}
					}
					if(u0 < 65536) {
						str += String.fromCharCode(u0)
					} else {
						var ch = u0 - 65536;
						str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023)
					}
				}
			}
		}

		function UTF8ToString(ptr) {
			return UTF8ArrayToString(HEAPU8, ptr)
		}
		var UTF16Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf-16le") : undefined;
		var WASM_PAGE_SIZE = 65536;
		var ASMJS_PAGE_SIZE = 16777216;

		function alignUp(x, multiple) {
			if(x % multiple > 0) {
				x += multiple - x % multiple
			}
			return x
		}
		var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64;

		function updateGlobalBuffer(buf) {
			Module["buffer"] = buffer = buf
		}
//      每一帧if 最小堆 最大堆 TDDE STM32堆（stack）和栈（heap）的理解 TDDE
		function updateGlobalBufferViews() {
			Module["HEAP8"] = HEAP8 = new Int8Array(buffer);
			Module["HEAP16"] = HEAP16 = new Int16Array(buffer);
			Module["HEAP32"] = HEAP32 = new Int32Array(buffer);
			Module["HEAPU8"] = HEAPU8 = new Uint8Array(buffer);
			Module["HEAPU16"] = HEAPU16 = new Uint16Array(buffer);
			Module["HEAPU32"] = HEAPU32 = new Uint32Array(buffer);
			Module["HEAPF32"] = HEAPF32 = new Float32Array(buffer);
			Module["HEAPF64"] = HEAPF64 = new Float64Array(buffer)
		}
		var STATIC_BASE, STATICTOP, staticSealed;
		var STACK_BASE, STACKTOP, STACK_MAX;
		var DYNAMIC_BASE, DYNAMICTOP_PTR;
		STATIC_BASE = STATICTOP = STACK_BASE = STACKTOP = STACK_MAX = DYNAMIC_BASE = DYNAMICTOP_PTR = 0;
		staticSealed = false;

		function abortOnCannotGrowMemory() {
			abort("Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value " + TOTAL_MEMORY + ", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 ")
		}
//    abortOn无法增长内存
		function enlargeMemory() {
			abortOnCannotGrowMemory()
		}
		var TOTAL_STACK = Module["TOTAL_STACK"] || 5242880;
		var TOTAL_MEMORY = Module["TOTAL_MEMORY"] || 52428800;
		if(TOTAL_MEMORY < TOTAL_STACK) Module.printErr("TOTAL_MEMORY should be larger than TOTAL_STACK, was " + TOTAL_MEMORY + "! (TOTAL_STACK=" + TOTAL_STACK + ")");
		if(Module["buffer"]) {
			buffer = Module["buffer"]
		} else {
			if(typeof WebAssembly === "object" && typeof WebAssembly.Memory === "function") {
				Module["wasmMemory"] = new WebAssembly.Memory({
					"initial": TOTAL_MEMORY / WASM_PAGE_SIZE,
					"maximum": TOTAL_MEMORY / WASM_PAGE_SIZE
				});
				buffer = Module["wasmMemory"].buffer
			} else {
				buffer = new ArrayBuffer(TOTAL_MEMORY)
			}
			Module["buffer"] = buffer
		}
		updateGlobalBufferViews();

		function getTotalMemory() {
			return TOTAL_MEMORY
		}
		HEAP32[0] = 1668509029;
		HEAP16[1] = 25459;
		if(HEAPU8[2] !== 115 || HEAPU8[3] !== 99) throw "Runtime error: expected the system to be little-endian!";

		function callRuntimeCallbacks(callbacks) {
			while(callbacks.length > 0) {
				var callback = callbacks.shift();
				if(typeof callback == "function") {
					callback();
					continue
				}
				var func = callback.func;
				if(typeof func === "number") {
					if(callback.arg === undefined) {
						Module["dynCall_v"](func)
					} else {
						Module["dynCall_vi"](func, callback.arg)
					}
				} else {
					func(callback.arg === undefined ? null : callback.arg)
				}
			}
		}
		var __ATPRERUN__ = [];
		var __ATINIT__ = [];
		var __ATMAIN__ = [];
		var __ATEXIT__ = [];
		var __ATPOSTRUN__ = [];
		var runtimeInitialized = false;
		var runtimeExited = false;

		function preRun() {
			if(Module["preRun"]) {
				if(typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]];
				while(Module["preRun"].length) {
					addOnPreRun(Module["preRun"].shift())
				}
			}
			callRuntimeCallbacks(__ATPRERUN__)
		}

		function ensureInitRuntime() {
			if(runtimeInitialized) return;
			runtimeInitialized = true;
			callRuntimeCallbacks(__ATINIT__)
		}
//      主要前
		function preMain() {
			callRuntimeCallbacks(__ATMAIN__)
		}
//退出运行时的处理
		function exitRuntime() {
			callRuntimeCallbacks(__ATEXIT__);
			runtimeExited = true
		}
//运行后的回调
		function postRun() {
			if(Module["postRun"]) {
				if(typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]];
				while(Module["postRun"].length) {
					addOnPostRun(Module["postRun"].shift())
				}
			}
			callRuntimeCallbacks(__ATPOSTRUN__)
		}
//加载项预运行帧
		function addOnPreRun(cb) {
			__ATPRERUN__.unshift(cb)
		}
//加载项运行后
		function addOnPostRun(cb) {
			__ATPOSTRUN__.unshift(cb)
		}
		//对应的赋值
		var Math_abs = Math.abs;
		var Math_cos = Math.cos;
		var Math_sin = Math.sin;
		var Math_tan = Math.tan;
		var Math_acos = Math.acos;
		var Math_asin = Math.asin;
		var Math_atan = Math.atan;
		var Math_atan2 = Math.atan2;
		var Math_exp = Math.exp;
		var Math_log = Math.log;
		var Math_sqrt = Math.sqrt;
		var Math_ceil = Math.ceil;
		var Math_floor = Math.floor;
		var Math_pow = Math.pow;
		var Math_imul = Math.imul;
		var Math_fround = Math.fround;
		var Math_round = Math.round;
		var Math_min = Math.min;
		var Math_max = Math.max;
		var Math_clz32 = Math.clz32;
		var Math_trunc = Math.trunc;
		var runDependencies = 0;
		var runDependencyWatcher = null;
		var dependenciesFulfilled = null;
//添加运行依赖项
		function addRunDependency(id) {
			runDependencies++;
			if(Module["monitorRunDependencies"]) {
				Module["monitorRunDependencies"](runDependencies)
			}
		}
//删除运行依赖项
		function removeRunDependency(id) {
			runDependencies--;
			if(Module["monitorRunDependencies"]) {
				Module["monitorRunDependencies"](runDependencies)
			}
			if(runDependencies == 0) {
				if(runDependencyWatcher !== null) {
					clearInterval(runDependencyWatcher);
					runDependencyWatcher = null
				}
				if(dependenciesFulfilled) {
					var callback = dependenciesFulfilled;
					dependenciesFulfilled = null;
					callback()
				}
			}
		}
		Module["preloadedImages"] = {};
		Module["preloadedAudios"] = {};
		var dataURIPrefix = "data:application/octet-stream;base64,";
//     return 数据URI
		function isDataURI(filename) {
			return String.prototype.startsWith ? filename.startsWith(dataURIPrefix) : filename.indexOf(dataURIPrefix) === 0
		}
//整合WasmJS 可用wasm依赖 不然会导致卡 TDDE
		function integrateWasmJS() {
			var wasmTextFile = "avc.wast";
			var wasmBinaryFile ="../static/avc.wasm";
			var asmjsCodeFile = "avc.temp.asm.js";
			if(typeof Module["locateFile"] === "function") {
				if(!isDataURI(wasmTextFile)) {
					wasmTextFile = Module["locateFile"](wasmTextFile)
				}
				if(!isDataURI(wasmBinaryFile)) {
					wasmBinaryFile = Module["locateFile"](wasmBinaryFile)
				}
				if(!isDataURI(asmjsCodeFile)) {
					asmjsCodeFile = Module["locateFile"](asmjsCodeFile)
				}
			}
			var wasmPageSize = 64 * 1024;
			var info = {
				"global": null,
				"env": null,
				"asm2wasm": asm2wasmImports,
				"parent": Module
			};
			var exports = null;

			function mergeMemory(newBuffer) {
				var oldBuffer = Module["buffer"];
				if(newBuffer.byteLength < oldBuffer.byteLength) {
					Module["printErr"]("the new buffer in mergeMemory is smaller than the previous one. in native wasm, we should grow memory here")
				}
				var oldView = new Int8Array(oldBuffer);
				var newView = new Int8Array(newBuffer);
				newView.set(oldView);
				updateGlobalBuffer(newBuffer);
				updateGlobalBufferViews()
			}

			function fixImports(imports) {
				return imports
			}

			function getBinary() {
				try {
					if(Module["wasmBinary"]) {
						return new Uint8Array(Module["wasmBinary"])
					}
					if(Module["readBinary"]) {
						return Module["readBinary"](wasmBinaryFile)
					} else {
						throw "on the web, we need the wasm binary to be preloaded and set on Module['wasmBinary']. emcc.py will do that for you when generating HTML (but not JS)"
					}
				} catch(err) {
					abort(err)
				}
			}

			function getBinaryPromise() {
				if(!Module["wasmBinary"] && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === "function") {
					return fetch(wasmBinaryFile, {
						credentials: "same-origin"
					}).then((function(response) {
						if(!response["ok"]) {
							throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
						}
						return response["arrayBuffer"]()
					})).catch((function() {
						return getBinary()
					}))
				}
				return new Promise((function(resolve, reject) {
					resolve(getBinary())
				}))
			}

			function doNativeWasm(global, env, providedBuffer) {
				if(typeof WebAssembly !== "object") {
					Module["printErr"]("no native wasm support detected");
					return false
				}
				if(!(Module["wasmMemory"] instanceof WebAssembly.Memory)) {
					Module["printErr"]("no native wasm Memory in use");
					return false
				}
				env["memory"] = Module["wasmMemory"];
				info["global"] = {
					"NaN": NaN,
					"Infinity": Infinity
				};
				info["global.Math"] = Math;
				info["env"] = env;

				function receiveInstance(instance, module) {
					exports = instance.exports;
					if(exports.memory) mergeMemory(exports.memory);
					Module["asm"] = exports;
					Module["usingWasm"] = true;
					removeRunDependency("wasm-instantiate")
				}
				addRunDependency("wasm-instantiate");
				if(Module["instantiateWasm"]) {
					try {
						return Module["instantiateWasm"](info, receiveInstance)
					} catch(e) {
						Module["printErr"]("Module.instantiateWasm callback failed with error: " + e);
						return false
					}
				}

				function receiveInstantiatedSource(output) {
					receiveInstance(output["instance"], output["module"])
				}

				function instantiateArrayBuffer(receiver) {
					getBinaryPromise().then((function(binary) {
						return WebAssembly.instantiate(binary, info)
					})).then(receiver).catch((function(reason) {
						Module["printErr"]("failed to asynchronously prepare wasm: " + reason);
						abort(reason)
					}))
				}
				if(!Module["wasmBinary"] && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && typeof fetch === "function") {
					WebAssembly.instantiateStreaming(fetch(wasmBinaryFile, {
						credentials: "same-origin"
					}), info).then(receiveInstantiatedSource).catch((function(reason) {
						Module["printErr"]("wasm streaming compile failed: " + reason);
						Module["printErr"]("falling back to ArrayBuffer instantiation");
						instantiateArrayBuffer(receiveInstantiatedSource)
					}))
				} else {
					instantiateArrayBuffer(receiveInstantiatedSource)
				}
				return {}
			}
			Module["asmPreload"] = Module["asm"];
			var asmjsReallocBuffer = Module["reallocBuffer"];
			var wasmReallocBuffer = (function(size) {
				var PAGE_MULTIPLE = Module["usingWasm"] ? WASM_PAGE_SIZE : ASMJS_PAGE_SIZE;
				size = alignUp(size, PAGE_MULTIPLE);
				var old = Module["buffer"];
				var oldSize = old.byteLength;
				if(Module["usingWasm"]) {
					try {
						var result = Module["wasmMemory"].grow((size - oldSize) / wasmPageSize);
						if(result !== (-1 | 0)) {
							return Module["buffer"] = Module["wasmMemory"].buffer
						} else {
							return null
						}
					} catch(e) {
						return null
					}
				}
			});
			Module["reallocBuffer"] = (function(size) {
				if(finalMethod === "asmjs") {
					return asmjsReallocBuffer(size)
				} else {
					return wasmReallocBuffer(size)
				}
			});
			var finalMethod = "";
			Module["asm"] = (function(global, env, providedBuffer) {
				env = fixImports(env);
				if(!env["table"]) {
					var TABLE_SIZE = Module["wasmTableSize"];
					if(TABLE_SIZE === undefined) TABLE_SIZE = 1024;
					var MAX_TABLE_SIZE = Module["wasmMaxTableSize"];
					if(typeof WebAssembly === "object" && typeof WebAssembly.Table === "function") {
						if(MAX_TABLE_SIZE !== undefined) {
							env["table"] = new WebAssembly.Table({
								"initial": TABLE_SIZE,
								"maximum": MAX_TABLE_SIZE,
								"element": "anyfunc"
							})
						} else {
							env["table"] = new WebAssembly.Table({
								"initial": TABLE_SIZE,
								element: "anyfunc"
							})
						}
					} else {
						env["table"] = new Array(TABLE_SIZE)
					}
					Module["wasmTable"] = env["table"]
				}
				if(!env["memoryBase"]) {
					env["memoryBase"] = Module["STATIC_BASE"]
				}
				if(!env["tableBase"]) {
					env["tableBase"] = 0
				}
				var exports;
				exports = doNativeWasm(global, env, providedBuffer);
				assert(exports, "no binaryen method succeeded.");
				return exports
			})
		}
		integrateWasmJS();
		STATIC_BASE = GLOBAL_BASE;
		STATICTOP = STATIC_BASE + 9888;
		__ATINIT__.push();
		var STATIC_BUMP = 9888;
		Module["STATIC_BASE"] = STATIC_BASE;
		Module["STATIC_BUMP"] = STATIC_BUMP;
		STATICTOP += 16;
		var SYSCALLS = {
			varargs: 0,
			get: (function(varargs) {
				SYSCALLS.varargs += 4;
				var ret = HEAP32[SYSCALLS.varargs - 4 >> 2];
				return ret
			}),
			getStr: (function() {
				var ret = Pointer_stringify(SYSCALLS.get());
				return ret
			}),
			get64: (function() {
				var low = SYSCALLS.get(),
					high = SYSCALLS.get();
				if(low >= 0) assert(high === 0);
				else assert(high === -1);
				return low
			}),
			getZero: (function() {
				assert(SYSCALLS.get() === 0)
			})
		};
//      系统调用140
		function ___syscall140(which, varargs) {
			SYSCALLS.varargs = varargs;
			try {
				var stream = SYSCALLS.getStreamFromFD(),
					offset_high = SYSCALLS.get(),
					offset_low = SYSCALLS.get(),
					result = SYSCALLS.get(),
					whence = SYSCALLS.get();
				var offset = offset_low;
				FS.llseek(stream, offset, whence);
				HEAP32[result >> 2] = stream.position;
				if(stream.getdents && offset === 0 && whence === 0) stream.getdents = null;
				return 0
			} catch(e) {
				if(typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
				return -e.errno
			}
		}
//        STM32堆（stack）和栈（heap）的理解 TDDE   HUANGFEI
		function ___syscall146(which, varargs) {
			SYSCALLS.varargs = varargs;
			try {
				var stream = SYSCALLS.get(),
					iov = SYSCALLS.get(),
					iovcnt = SYSCALLS.get();
				var ret = 0;
				if(!___syscall146.buffers) {
					___syscall146.buffers = [null, [],
						[]
					];
					___syscall146.printChar = (function(stream, curr) {
						var buffer = ___syscall146.buffers[stream];
						assert(buffer);
						if(curr === 0 || curr === 10) {
							(stream === 1 ? Module["print"] : Module["printErr"])(UTF8ArrayToString(buffer, 0));
							buffer.length = 0
						} else {
							buffer.push(curr)
						}
					})
				}
				for(var i = 0; i < iovcnt; i++) {
					var ptr = HEAP32[iov + i * 8 >> 2];
					var len = HEAP32[iov + (i * 8 + 4) >> 2];
					for(var j = 0; j < len; j++) {
						___syscall146.printChar(stream, HEAPU8[ptr + j])
					}
					ret += len
				}
				return ret
			} catch(e) {
				if(typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
				return -e.errno
			}
		}

		function ___syscall54(which, varargs) {
			SYSCALLS.varargs = varargs;
			try {
				return 0
			} catch(e) {
				if(typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
				return -e.errno
			}
		}

		function ___syscall6(which, varargs) {
			SYSCALLS.varargs = varargs;
			try {
				var stream = SYSCALLS.getStreamFromFD();
				FS.close(stream);
				return 0
			} catch(e) {
				if(typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e);
				return -e.errno
			}
		}
//       头条解码 TDDE
		function _broadwayOnHeadersDecoded() {
			par_broadwayOnHeadersDecoded()
		}
		Module["_broadwayOnHeadersDecoded"] = _broadwayOnHeadersDecoded;
//           解码根据 回调那到当前的画质的 $buffer = width ，height
		function _broadwayOnPictureDecoded($buffer, width, height) {
			par_broadwayOnPictureDecoded($buffer, width, height)
		}
		Module["_broadwayOnPictureDecoded"] = _broadwayOnPictureDecoded;
           //喂入 最大块的  可以理解成为帧
		function _emscripten_memcpy_big(dest, src, num) {
			HEAPU8.set(HEAPU8.subarray(src, src + num), dest);
			return dest
		}
//       输出设置错误
		function ___setErrNo(value) {
			if(Module["___errno_location"]) HEAP32[Module["___errno_location"]() >> 2] = value;
			return value
		}
		DYNAMICTOP_PTR = staticAlloc(4);//PTR
		STACK_BASE = STACKTOP = alignMemory(STATICTOP);//STACK_BASE
		STACK_MAX = STACK_BASE + TOTAL_STACK; //堆栈最大值
		DYNAMIC_BASE = alignMemory(STACK_MAX);//动态库
		HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE;
		staticSealed = true;
		Module["wasmTableSize"] = 10;
		Module["wasmMaxTableSize"] = 10;
		Module.asmGlobalArg = {};
		Module.asmLibraryArg = {
			"abort": abort,
			"enlargeMemory": enlargeMemory,
			"getTotalMemory": getTotalMemory,
			"abortOnCannotGrowMemory": abortOnCannotGrowMemory,
			"___setErrNo": ___setErrNo,
			"___syscall140": ___syscall140,
			"___syscall146": ___syscall146,
			"___syscall54": ___syscall54,
			"___syscall6": ___syscall6,
			"_broadwayOnHeadersDecoded": _broadwayOnHeadersDecoded,
			"_broadwayOnPictureDecoded": _broadwayOnPictureDecoded,
			"_emscripten_memcpy_big": _emscripten_memcpy_big,
			"DYNAMICTOP_PTR": DYNAMICTOP_PTR,
			"STACKTOP": STACKTOP
		};
		var asm = Module["asm"](Module.asmGlobalArg, Module.asmLibraryArg, buffer);
		Module["asm"] = asm;
		var _broadwayCreateStream = Module["_broadwayCreateStream"] = (function() {
			return Module["asm"]["_broadwayCreateStream"].apply(null, arguments)
		});
		var _broadwayExit = Module["_broadwayExit"] = (function() {
			return Module["asm"]["_broadwayExit"].apply(null, arguments)
		});
		var _broadwayGetMajorVersion = Module["_broadwayGetMajorVersion"] = (function() {
			return Module["asm"]["_broadwayGetMajorVersion"].apply(null, arguments)
		});
		var _broadwayGetMinorVersion = Module["_broadwayGetMinorVersion"] = (function() {
			return Module["asm"]["_broadwayGetMinorVersion"].apply(null, arguments)
		});
		var _broadwayInit = Module["_broadwayInit"] = (function() {
			return Module["asm"]["_broadwayInit"].apply(null, arguments)
		});
		var _broadwayPlayStream = Module["_broadwayPlayStream"] = (function() {
			return Module["asm"]["_broadwayPlayStream"].apply(null, arguments)
		});
		Module["asm"] = asm;
//退出状态
		function ExitStatus(status) {
			this.name = "ExitStatus";
			this.message = "Program terminated with exit(" + status + ")";
			this.status = status
		}
		ExitStatus.prototype = new Error;
		ExitStatus.prototype.constructor = ExitStatus;
		var initialStackTop;
		dependenciesFulfilled = function runCaller() {
			if(!Module["calledRun"]) run();
			if(!Module["calledRun"]) dependenciesFulfilled = runCaller
		};

		function run(args) {
			args = args || Module["arguments"];
			if(runDependencies > 0) {
				return
			}
			preRun();
			if(runDependencies > 0) return;
			if(Module["calledRun"]) return;

			function doRun() {
				if(Module["calledRun"]) return;
				Module["calledRun"] = true;
				if(ABORT) return;
				ensureInitRuntime();
				preMain();
				if(Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"]();
				postRun()
			}
			if(Module["setStatus"]) {
				Module["setStatus"]("Running...");
				setTimeout((function() {
					setTimeout((function() {
						Module["setStatus"]("")
					}), 1);
					doRun()
				}), 1)
			} else {
				doRun()
			}
		}
		Module["run"] = run;
//       通道
		function exit(status, implicit) {
			if(implicit && Module["noExitRuntime"] && status === 0) {
				return
			}
			if(Module["noExitRuntime"]) {} else {
				ABORT = true;
				EXITSTATUS = status;
				STACKTOP = initialStackTop;
				exitRuntime();
				if(Module["onExit"]) Module["onExit"](status)
			}
			if(ENVIRONMENT_IS_NODE) {
				process["exit"](status)
			}
			Module["quit"](status, new ExitStatus(status))
		}
		Module["exit"] = exit;
//中止
		function abort(what) {
			if(Module["onAbort"]) {
				Module["onAbort"](what)
			}
			if(what !== undefined) {
				Module.print(what);
				Module.printErr(what);
				what = JSON.stringify(what)
			} else {
				what = ""
			}
			ABORT = true;
			EXITSTATUS = 1;
			throw "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."
		}
		Module["abort"] = abort;
		if(Module["preInit"]) {
			if(typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]];
			while(Module["preInit"].length > 0) {
				Module["preInit"].pop()()
			}
		}
		Module["noExitRuntime"] = true;
		run()

		//   return Module;
		//})();

		var resultModule;
		if(typeof global !== "undefined") {
			if(global.Module) {
				resultModule = global.Module;
			};
		};
		if(typeof Module != "undefined") {
			resultModule = Module;
		};

		resultModule._broadwayOnHeadersDecoded = par_broadwayOnHeadersDecoded;
		resultModule._broadwayOnPictureDecoded = par_broadwayOnPictureDecoded;

		var moduleIsReady = false;
		var cbFun;
//		模块就绪 加载
		var moduleReady = function() {
			moduleIsReady = true;
			if(cbFun) {
				cbFun(resultModule);
			}
		};
//运行时初始化
		resultModule.onRuntimeInitialized = function() {
			moduleReady(resultModule);
		};
		return function(callback) {
			if(moduleIsReady) {
				callback(resultModule);
			} else {
				cbFun = callback;
			};
		};
	};

	return(function() {
		"use strict";

		var nowValue = function() {
			return(new Date()).getTime();
		};

		if(typeof performance != "undefined") {
			if(performance.now) {
				nowValue = function() {
					return performance.now();
				};
			};
		};
        //请注意重点 Decoder 这个进行解码函数 TDDE
		var Decoder = function(parOptions) {
			this.options = parOptions || {};

			this.now = nowValue;

			var asmInstance;

			var fakeWindow = {};

			var toU8Array;
			var toU32Array;
//关于Pic Fun
			var onPicFun = function($buffer, width, height) {
				var buffer = this.pictureBuffers[$buffer];
				if(!buffer) {
					buffer = this.pictureBuffers[$buffer] = toU8Array($buffer, (width * height * 3) / 2);
				};

				var infos;
				var doInfo = false;
				if(this.infoAr.length) {
					doInfo = true;
					infos = this.infoAr;
				};
				this.infoAr = [];

				if(this.options.rgb) {
					if(!asmInstance) {
						asmInstance = getAsm(width, height);
					};
					asmInstance.inp.set(buffer);
					asmInstance.doit();

					var copyU8 = new Uint8Array(asmInstance.outSize);
					copyU8.set(asmInstance.out);

					if(doInfo) {
						infos[0].finishDecoding = nowValue();
					};

					this.onPictureDecoded(copyU8, width, height, infos);
					return;

				};

				if(doInfo) {
					infos[0].finishDecoding = nowValue();
				};
				this.onPictureDecoded(buffer, width, height, infos);
			}.bind(this);

			var ignore = false;

			if(this.options.sliceMode) {
				onPicFun = function($buffer, width, height, $sliceInfo) {
					if(ignore) {
						return;
					};
					var buffer = this.pictureBuffers[$buffer];
					if(!buffer) {
						buffer = this.pictureBuffers[$buffer] = toU8Array($buffer, (width * height * 3) / 2);
					};
					var sliceInfo = this.pictureBuffers[$sliceInfo];
					if(!sliceInfo) {
						sliceInfo = this.pictureBuffers[$sliceInfo] = toU32Array($sliceInfo, 18);
					};

					var infos;
					var doInfo = false;
					if(this.infoAr.length) {
						doInfo = true;
						infos = this.infoAr;
					};
					this.infoAr = [];

					/*if (this.options.rgb){
        
					no rgb in slice mode

					};*/

					infos[0].finishDecoding = nowValue();
					var sliceInfoAr = [];
					for(var i = 0; i < 20; ++i) {
						sliceInfoAr.push(sliceInfo[i]);
					};
					infos[0].sliceInfoAr = sliceInfoAr;

					this.onPictureDecoded(buffer, width, height, infos);
				}.bind(this);
			};

			var ModuleCallback = getModule.apply(fakeWindow, [function() {}, onPicFun]);

			var MAX_STREAM_BUFFER_LENGTH = 1024 * 1024;

			var instance = this;
//			图片解码
			this.onPictureDecoded = function(buffer, width, height, infos) {

			};

			this.onDecoderReady = function() {};

			var bufferedCalls = [];
			this.decode = function decode(typedAr, parInfo, copyDoneFun) {
				bufferedCalls.push([typedAr, parInfo, copyDoneFun]);
			};
//        模块回调
			ModuleCallback(function(Module) {
				var HEAP8 = Module.HEAP8;
				var HEAPU8 = Module.HEAPU8;
				var HEAP16 = Module.HEAP16;
				var HEAP32 = Module.HEAP32;
				// 来自旧构造函数
				Module._broadwayInit();

				/**
				 * 从HEAP8指针创建类型化数组。
				 */
				toU8Array = function(ptr, length) {
					return HEAPU8.subarray(ptr, ptr + length);
				};
				toU32Array = function(ptr, length) {
					//var tmp = HEAPU8.subarray(ptr, ptr + (length * 4));
					return new Uint32Array(HEAPU8.buffer, ptr, length);
				};
				instance.streamBuffer = toU8Array(Module._broadwayCreateStream(MAX_STREAM_BUFFER_LENGTH), MAX_STREAM_BUFFER_LENGTH);
				instance.pictureBuffers = {};
				// 收集nal单位提供的额外信息
				instance.infoAr = [];

//				解码流缓冲区。这可能是一个没有
//
//*起始码，或具有帧起始码前缀的NAL单元序列。这个 TDDE
//
//*函数用提供的缓冲区覆盖编解码器分配的流缓冲区

				var sliceNum = 0;
				if(instance.options.sliceMode) {
					sliceNum = instance.options.sliceNum;

					instance.decode = function decode(typedAr, parInfo, copyDoneFun) {
						instance.infoAr.push(parInfo);
						parInfo.startDecoding = nowValue();
						var nals = parInfo.nals;
						var i;
						if(!nals) {
							nals = [];
							parInfo.nals = nals;
							var l = typedAr.length;
							var foundSomething = false;
							var lastFound = 0;
							var lastStart = 0;
							for(i = 0; i < l; ++i) {
								if(typedAr[i] === 1) {
									if(
										typedAr[i - 1] === 0 &&
										typedAr[i - 2] === 0
									) {
										var startPos = i - 2;
										if(typedAr[i - 3] === 0) {
											startPos = i - 3;
										};
										// its a nal;
										if(foundSomething) {
											nals.push({
												offset: lastFound,
												end: startPos,
												type: typedAr[lastStart] & 31
											});
										};
										lastFound = startPos;
										lastStart = startPos + 3;
										if(typedAr[i - 3] === 0) {
											lastStart = startPos + 4;
										};
										foundSomething = true;
									};
								};
							};
							if(foundSomething) {
								nals.push({
									offset: lastFound,
									end: i,
									type: typedAr[lastStart] & 31
								});
							};
						};

						var currentSlice = 0;
						var playAr;
						var offset = 0;
						for(i = 0; i < nals.length; ++i) {
							if(nals[i].type === 1 || nals[i].type === 5) {
								if(currentSlice === sliceNum) {
									playAr = typedAr.subarray(nals[i].offset, nals[i].end);
									instance.streamBuffer[offset] = 0;
									offset += 1;
									instance.streamBuffer.set(playAr, offset);
									offset += playAr.length;
								};
								currentSlice += 1;
							} else {
								playAr = typedAr.subarray(nals[i].offset, nals[i].end);
								instance.streamBuffer[offset] = 0;
								offset += 1;
								instance.streamBuffer.set(playAr, offset);
								offset += playAr.length;
								Module._broadwayPlayStream(offset);
								offset = 0;
							};
						};
						copyDoneFun();
						Module._broadwayPlayStream(offset);
					};

				} else {
					instance.decode = function decode(typedAr, parInfo) {
						// console.info("Decoding: " + buffer.length);
						// 收集信息 infos
						if(parInfo) {
							instance.infoAr.push(parInfo);
							parInfo.startDecoding = nowValue();
						};

						instance.streamBuffer.set(typedAr);
						Module._broadwayPlayStream(typedAr.length);
					};
				};

				if(bufferedCalls.length) {
					var bi = 0;
					for(bi = 0; bi < bufferedCalls.length; ++bi) {
						instance.decode(bufferedCalls[bi][0], bufferedCalls[bi][1], bufferedCalls[bi][2]);
					};
					bufferedCalls = [];
				};

				instance.onDecoderReady(instance);

			});

		};

		Decoder.prototype = {

		};


		// 要创建的工厂asm.js给定分辨率的yuv->rgb转换器
		var asmInstances = {};
		var getAsm = function(parWidth, parHeight) {
			var idStr = "" + parWidth + "x" + parHeight;
			if(asmInstances[idStr]) {
				return asmInstances[idStr];
			};

			var lumaSize = parWidth * parHeight;
			var chromaSize = (lumaSize | 0) >> 2;

			var inpSize = lumaSize + chromaSize + chromaSize;
			var outSize = parWidth * parHeight * 4;
			var cacheSize = Math.pow(2, 24) * 4;
			var size = inpSize + outSize + cacheSize;

			var chunkSize = Math.pow(2, 24);
			var heapSize = chunkSize;
			while(heapSize < size) {
				heapSize += chunkSize;
			};
			var heap = new ArrayBuffer(heapSize);

			var res = asmFactory(global, {}, heap);
			res.init(parWidth, parHeight);
			asmInstances[idStr] = res;

			res.heap = heap;
			res.out = new Uint8Array(heap, 0, outSize);
			res.inp = new Uint8Array(heap, outSize, inpSize);
			res.outSize = outSize;

			return res;
		};

		function asmFactory(stdlib, foreign, heap) {
			"use asm";

			var imul = stdlib.Math.imul;
			var min = stdlib.Math.min;
			var max = stdlib.Math.max;
			var pow = stdlib.Math.pow;
			var out = new stdlib.Uint8Array(heap);
			var out32 = new stdlib.Uint32Array(heap);
			var inp = new stdlib.Uint8Array(heap);
			var mem = new stdlib.Uint8Array(heap);
			var mem32 = new stdlib.Uint32Array(heap);

			// 对于双算法 TDDE
			/*var vt = 1.370705;
			var gt = 0.698001;
			var gt2 = 0.337633;
			var bt = 1.732446;*/

			var width = 0;
			var height = 0;
			var lumaSize = 0;
			var chromaSize = 0;
			var inpSize = 0;
			var outSize = 0;

			var inpStart = 0;
			var outStart = 0;

			var widthFour = 0;

			var cacheStart = 0;
//           初始化HUANGFEI 解码
			function init(parWidth, parHeight) {
				parWidth = parWidth | 0;
				parHeight = parHeight | 0;

				var i = 0;
				var s = 0;

				width = parWidth;
				widthFour = imul(parWidth, 4) | 0;
				height = parHeight;
				lumaSize = imul(width | 0, height | 0) | 0;
				chromaSize = (lumaSize | 0) >> 2;
				outSize = imul(imul(width, height) | 0, 4) | 0;
				inpSize = ((lumaSize + chromaSize) | 0 + chromaSize) | 0;

				outStart = 0;
				inpStart = (outStart + outSize) | 0;
				cacheStart = (inpStart + inpSize) | 0;

				// 初始化内存（为了安全起见）
				s = ~~(+pow(+2, +24));
				s = imul(s, 4) | 0;

				for(i = 0 | 0;
					((i | 0) < (s | 0)) | 0; i = (i + 4) | 0) {
					mem32[((cacheStart + i) | 0) >> 2] = 0;
				};
			};
//           真正的解码计算HUANGFEI TDDT
			function doit() {
				var ystart = 0;
				var ustart = 0;
				var vstart = 0;

				var y = 0;
				var yn = 0;
				var u = 0;
				var v = 0;

				var o = 0;

				var line = 0;
				var col = 0;

				var usave = 0;
				var vsave = 0;

				var ostart = 0;
				var cacheAdr = 0;

				ostart = outStart | 0;

				ystart = inpStart | 0;
				ustart = (ystart + lumaSize | 0) | 0;
				vstart = (ustart + chromaSize) | 0;
//                对应的帧 喂入   TDDT
				for(line = 0;
					(line | 0) < (height | 0); line = (line + 2) | 0) {
					usave = ustart;
					vsave = vstart;
					for(col = 0;
						(col | 0) < (width | 0); col = (col + 2) | 0) {
						y = inp[ystart >> 0] | 0;
						yn = inp[((ystart + width) | 0) >> 0] | 0;

						u = inp[ustart >> 0] | 0;
						v = inp[vstart >> 0] | 0;

						cacheAdr = (((((y << 16) | 0) + ((u << 8) | 0)) | 0) + v) | 0;
						o = mem32[((cacheStart + cacheAdr) | 0) >> 2] | 0;
						if(o) {} else {
							o = yuv2rgbcalc(y, u, v) | 0;
							mem32[((cacheStart + cacheAdr) | 0) >> 2] = o | 0;
						};
						mem32[ostart >> 2] = o;

						cacheAdr = (((((yn << 16) | 0) + ((u << 8) | 0)) | 0) + v) | 0;
						o = mem32[((cacheStart + cacheAdr) | 0) >> 2] | 0;
						if(o) {} else {
							o = yuv2rgbcalc(yn, u, v) | 0;
							mem32[((cacheStart + cacheAdr) | 0) >> 2] = o | 0;
						};
						mem32[((ostart + widthFour) | 0) >> 2] = o;

						//yuv2rgb5(y, u, v, ostart);
						//yuv2rgb5(yn, u, v, (ostart + widthFour)|0);
						ostart = (ostart + 4) | 0;

						// 下一步只对 Y 和v保持不变
						ystart = (ystart + 1) | 0;
						y = inp[ystart >> 0] | 0;
						yn = inp[((ystart + width) | 0) >> 0] | 0;

						//yuv2rgb5(y, u, v, ostart);
						cacheAdr = (((((y << 16) | 0) + ((u << 8) | 0)) | 0) + v) | 0;
						o = mem32[((cacheStart + cacheAdr) | 0) >> 2] | 0;
						if(o) {} else {
							o = yuv2rgbcalc(y, u, v) | 0;
							mem32[((cacheStart + cacheAdr) | 0) >> 2] = o | 0;
						};
						mem32[ostart >> 2] = o;

						//yuv2rgb5(yn, u, v, (ostart + widthFour)|0);
						cacheAdr = (((((yn << 16) | 0) + ((u << 8) | 0)) | 0) + v) | 0;
						o = mem32[((cacheStart + cacheAdr) | 0) >> 2] | 0;
						if(o) {} else {
							o = yuv2rgbcalc(yn, u, v) | 0;
							mem32[((cacheStart + cacheAdr) | 0) >> 2] = o | 0;
						};
						mem32[((ostart + widthFour) | 0) >> 2] = o;
						ostart = (ostart + 4) | 0;

						//所有positions加1 

						ystart = (ystart + 1) | 0;
						ustart = (ustart + 1) | 0;
						vstart = (vstart + 1) | 0;
					};
					ostart = (ostart + widthFour) | 0;
					ystart = (ystart + width) | 0;

				};

			};
            //渲染图布
			function yuv2rgbcalc(y, u, v) {
				y = y | 0;
				u = u | 0;
				v = v | 0;

				var r = 0;
				var g = 0;
				var b = 0;

				var o = 0;

				var a0 = 0;
				var a1 = 0;
				var a2 = 0;
				var a3 = 0;
				var a4 = 0;

				a0 = imul(1192, (y - 16) | 0) | 0;
				a1 = imul(1634, (v - 128) | 0) | 0;
				a2 = imul(832, (v - 128) | 0) | 0;
				a3 = imul(400, (u - 128) | 0) | 0;
				a4 = imul(2066, (u - 128) | 0) | 0;

				r = (((a0 + a1) | 0) >> 10) | 0;
				g = (((((a0 - a2) | 0) - a3) | 0) >> 10) | 0;
				b = (((a0 + a4) | 0) >> 10) | 0;

				if((((r & 255) | 0) != (r | 0)) | 0) {
					r = min(255, max(0, r | 0) | 0) | 0;
				};
				if((((g & 255) | 0) != (g | 0)) | 0) {
					g = min(255, max(0, g | 0) | 0) | 0;
				};
				if((((b & 255) | 0) != (b | 0)) | 0) {
					b = min(255, max(0, b | 0) | 0) | 0;
				};

				o = 255;
				o = (o << 8) | 0;
				o = (o + b) | 0;
				o = (o << 8) | 0;
				o = (o + g) | 0;
				o = (o << 8) | 0;
				o = (o + r) | 0;

				return o | 0;

			};

			return {
				init: init,
				doit: doit
			};
		};

		/*
		 潜在的工作机初始化 HUANGFEI
  
		*/

		if(typeof self != "undefined") {
			var isWorker = false;
			var decoder;
			var reuseMemory = false;
			var sliceMode = false;
			var sliceNum = 0;
			var sliceCnt = 0;
			var lastSliceNum = 0;
			var sliceInfoAr;
			var lastBuf;
			var awaiting = 0;
			var pile = [];
			var startDecoding;
			var finishDecoding;
			var timeDecoding;

			var memAr = [];
			var getMem = function(length) {
				if(memAr.length) {
					var u = memAr.shift();
					while(u && u.byteLength !== length) {
						u = memAr.shift();
					};
					if(u) {
						return u;
					};
				};
				return new ArrayBuffer(length);
			};

			var copySlice = function(source, target, infoAr, width, height) {

				var length = width * height;
				var length4 = length / 4
				var plane2 = length;
				var plane3 = length + length4;

				var copy16 = function(parBegin, parEnd) {
					var i = 0;
					for(i = 0; i < 16; ++i) {
						var begin = parBegin + (width * i);
						var end = parEnd + (width * i)
						target.set(source.subarray(begin, end), begin);
					};
				};
				var copy8 = function(parBegin, parEnd) {
					var i = 0;
					for(i = 0; i < 8; ++i) {
						var begin = parBegin + ((width / 2) * i);
						var end = parEnd + ((width / 2) * i)
						target.set(source.subarray(begin, end), begin);
					};
				};
				var copyChunk = function(begin, end) {
					target.set(source.subarray(begin, end), begin);
				};

				var begin = infoAr[0];
				var end = infoAr[1];
				if(end > 0) {
					copy16(begin, end);
					copy8(infoAr[2], infoAr[3]);
					copy8(infoAr[4], infoAr[5]);
				};
				begin = infoAr[6];
				end = infoAr[7];
				if(end > 0) {
					copy16(begin, end);
					copy8(infoAr[8], infoAr[9]);
					copy8(infoAr[10], infoAr[11]);
				};

				begin = infoAr[12];
				end = infoAr[15];
				if(end > 0) {
					copyChunk(begin, end);
					copyChunk(infoAr[13], infoAr[16]);
					copyChunk(infoAr[14], infoAr[17]);
				};

			};

			var sliceMsgFun = function() {};

			var setSliceCnt = function(parSliceCnt) {
				sliceCnt = parSliceCnt;
				lastSliceNum = sliceCnt - 1;
			};
//          实时更新
			self.addEventListener('message', function(e) {

				if(isWorker) {
					if(reuseMemory) {
						if(e.data.reuse) {
							memAr.push(e.data.reuse);
						};
					};
					if(e.data.buf) {
						if(sliceMode && awaiting !== 0) {
							pile.push(e.data);
						} else {
							decoder.decode(
								new Uint8Array(e.data.buf, e.data.offset || 0, e.data.length),
								e.data.info,
								function() {
									if(sliceMode && sliceNum !== lastSliceNum) {
										postMessage(e.data, [e.data.buf]);
									};
								}
							);
						};
						return;
					};

					if(e.data.slice) {
						// 更新参考图片
						var copyStart = nowValue();
						copySlice(new Uint8Array(e.data.slice), lastBuf, e.data.infos[0].sliceInfoAr, e.data.width, e.data.height);
						// 需要更新它
						if(e.data.theOne) {
							copySlice(lastBuf, new Uint8Array(e.data.slice), sliceInfoAr, e.data.width, e.data.height);
							if(timeDecoding > e.data.infos[0].timeDecoding) {
								e.data.infos[0].timeDecoding = timeDecoding;
							};
							e.data.infos[0].timeCopy += (nowValue() - copyStart);
						};
						// 继续前进
						postMessage(e.data, [e.data.slice]);

						// 管道中的下一个框架
						awaiting -= 1;
						if(awaiting === 0 && pile.length) {
							var data = pile.shift();
							decoder.decode(
								new Uint8Array(data.buf, data.offset || 0, data.length),
								data.info,
								function() {
									if(sliceMode && sliceNum !== lastSliceNum) {
										postMessage(data, [data.buf]);
									};
								}
							);
						};
						return;
					};

					if(e.data.setSliceCnt) {
						setSliceCnt(e.data.sliceCnt);
						return;
					};

				} else {
					if(e.data && e.data.type === "Broadway.js - Worker init") {
						isWorker = true;
						decoder = new Decoder(e.data.options);

						if(e.data.options.sliceMode) {
							reuseMemory = true;
							sliceMode = true;
							sliceNum = e.data.options.sliceNum;
							setSliceCnt(e.data.options.sliceCnt);

							decoder.onPictureDecoded = function(buffer, width, height, infos) {

								// 缓冲区需要复制
								var copyU8 = new Uint8Array(getMem(buffer.length));
								copySlice(buffer, copyU8, infos[0].sliceInfoAr, width, height);

								startDecoding = infos[0].startDecoding;
								finishDecoding = infos[0].finishDecoding;
								timeDecoding = finishDecoding - startDecoding;
								infos[0].timeDecoding = timeDecoding;
								infos[0].timeCopy = 0;

								postMessage({
									slice: copyU8.buffer,
									sliceNum: sliceNum,
									width: width,
									height: height,
									infos: infos
								}, [copyU8.buffer]); // 第二个参数用于指示所有权的转移

								awaiting = sliceCnt - 1;

								lastBuf = buffer;
								sliceInfoAr = infos[0].sliceInfoAr;

							};

						} else if(e.data.options.reuseMemory) {
							reuseMemory = true;
							decoder.onPictureDecoded = function(buffer, width, height, infos) {

								// buffer 需要复制因为我们放弃了所有权
								var copyU8 = new Uint8Array(getMem(buffer.length));
								copyU8.set(buffer, 0, buffer.length);

								postMessage({
									buf: copyU8.buffer,
									length: buffer.length,
									width: width,
									height: height,
									infos: infos
								}, [copyU8.buffer]); // 第二个参数用于指示所有权的转移

							};

						} else {
							decoder.onPictureDecoded = function(buffer, width, height, infos) {
								if(buffer) {
									buffer = new Uint8Array(buffer);
								};
								var copyU8 = new Uint8Array(buffer.length);
								copyU8.set(buffer, 0, buffer.length);

								postMessage({
									buf: copyU8.buffer,
									length: buffer.length,
									width: width,
									height: height,
									infos: infos
								}, [copyU8.buffer]); 

							};
						};
						postMessage({
							consoleLog: "broadway worker initialized"
						});
					};
				};

			}, false);
		};

		Decoder.nowValue = nowValue;

		return Decoder;

	})();

}));