├── .gitignore ├── CharacterMovement.cs ├── README.md ├── webgl ├── Build │ ├── UnityLoader.js │ ├── webgl.data.unityweb │ ├── webgl.json │ ├── webgl.wasm.code.unityweb │ └── webgl.wasm.framework.unityweb ├── TemplateData │ ├── UnityProgress.js │ ├── favicon.ico │ ├── fullscreen.png │ ├── progressEmpty.Dark.png │ ├── progressEmpty.Light.png │ ├── progressFull.Dark.png │ ├── progressFull.Light.png │ ├── progressLogo.Dark.png │ ├── progressLogo.Light.png │ ├── style.css │ ├── webgl-logo.png │ └── webrtc.js └── index.html └── webrtc.unitypackage /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # This .gitignore file should be placed at the root of your Unity project directory 4 | # 5 | # Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore 6 | # 7 | /[Ll]ibrary/ 8 | /[Tt]emp/ 9 | /[Oo]bj/ 10 | /[Bb]uild/ 11 | /[Bb]uilds/ 12 | /[Ll]ogs/ 13 | /[Mm]emoryCaptures/ 14 | 15 | # Asset meta data should only be ignored when the corresponding asset is also ignored 16 | !/[Aa]ssets/**/*.meta 17 | 18 | # Uncomment this line if you wish to ignore the asset store tools plugin 19 | # /[Aa]ssets/AssetStoreTools* 20 | 21 | # Autogenerated Jetbrains Rider plugin 22 | [Aa]ssets/Plugins/Editor/JetBrains* 23 | 24 | # Visual Studio cache directory 25 | .vs/ 26 | 27 | # Gradle cache directory 28 | .gradle/ 29 | 30 | # Autogenerated VS/MD/Consulo solution and project files 31 | ExportedObj/ 32 | .consulo/ 33 | *.csproj 34 | *.unityproj 35 | *.sln 36 | *.suo 37 | *.tmp 38 | *.user 39 | *.userprefs 40 | *.pidb 41 | *.booproj 42 | *.svd 43 | *.pdb 44 | *.mdb 45 | *.opendb 46 | *.VC.db 47 | 48 | # Unity3D generated meta files 49 | *.pidb.meta 50 | *.pdb.meta 51 | *.mdb.meta 52 | 53 | # Unity3D generated file on crash reports 54 | sysinfo.txt 55 | 56 | # Builds 57 | *.apk 58 | *.unitypackage 59 | 60 | # Crashlytics generated file 61 | crashlytics-build.properties 62 | 63 | -------------------------------------------------------------------------------- /CharacterMovement.cs: -------------------------------------------------------------------------------- 1 | using System.Collections; 2 | using System.Collections.Generic; 3 | using UnityEngine; 4 | 5 | public class CharacterMovement : MonoBehaviour 6 | { 7 | [SerializeField] 8 | private float speed = 0.1f; 9 | 10 | void Update() 11 | { 12 | float xDirection = Input.GetAxis("Horizontal"); 13 | float zDirection = Input.GetAxis("Vertical"); 14 | Vector3 moveDirection = new Vector3(xDirection, 0f, zDirection); 15 | transform.position += moveDirection * speed; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # unity-webrtc 2 | 3 | ## Demo 4 | 5 | https://underscoredlabs.github.io/unity-webrtc 6 | 7 | ## Video Tutorial 8 | 9 | [![](https://user-images.githubusercontent.com/19412160/109174586-f8cadc80-7752-11eb-9c00-8b28ccdd7fb3.png)](https://www.youtube.com/watch?v=be9VtUymNPs) 10 | 11 | 12 | ## Note: Make sure to save the project as `webgl` 13 | 14 | ![](https://user-images.githubusercontent.com/19412160/109174322-bc977c00-7752-11eb-99b1-8f7e1d5eea2d.png) 15 | -------------------------------------------------------------------------------- /webgl/Build/UnityLoader.js: -------------------------------------------------------------------------------- 1 | var UnityLoader=UnityLoader||{Compression:{identity:{require:function(){return{}},decompress:function(e){return e}},gzip:{require:function(e){var t={"inflate.js":function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=s.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0===(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new c,this.strm.avail_out=0;var r=a.inflateInit2(this.strm,t.windowBits);if(r!==l.Z_OK)throw new Error(u[r]);this.header=new f,a.inflateGetHeader(this.strm,this.header)}function o(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg||u[r.err];return r.result}function i(e,t){return t=t||{},t.raw=!0,o(e,t)}var a=e("./zlib/inflate"),s=e("./utils/common"),d=e("./utils/strings"),l=e("./zlib/constants"),u=e("./zlib/messages"),c=e("./zlib/zstream"),f=e("./zlib/gzheader"),h=Object.prototype.toString;n.prototype.push=function(e,t){var r,n,o,i,u,c,f=this.strm,p=this.options.chunkSize,m=this.options.dictionary,w=!1;if(this.ended)return!1;n=t===~~t?t:t===!0?l.Z_FINISH:l.Z_NO_FLUSH,"string"==typeof e?f.input=d.binstring2buf(e):"[object ArrayBuffer]"===h.call(e)?f.input=new Uint8Array(e):f.input=e,f.next_in=0,f.avail_in=f.input.length;do{if(0===f.avail_out&&(f.output=new s.Buf8(p),f.next_out=0,f.avail_out=p),r=a.inflate(f,l.Z_NO_FLUSH),r===l.Z_NEED_DICT&&m&&(c="string"==typeof m?d.string2buf(m):"[object ArrayBuffer]"===h.call(m)?new Uint8Array(m):m,r=a.inflateSetDictionary(this.strm,c)),r===l.Z_BUF_ERROR&&w===!0&&(r=l.Z_OK,w=!1),r!==l.Z_STREAM_END&&r!==l.Z_OK)return this.onEnd(r),this.ended=!0,!1;f.next_out&&(0!==f.avail_out&&r!==l.Z_STREAM_END&&(0!==f.avail_in||n!==l.Z_FINISH&&n!==l.Z_SYNC_FLUSH)||("string"===this.options.to?(o=d.utf8border(f.output,f.next_out),i=f.next_out-o,u=d.buf2string(f.output,o),f.next_out=i,f.avail_out=p-i,i&&s.arraySet(f.output,f.output,o,i,0),this.onData(u)):this.onData(s.shrinkBuf(f.output,f.next_out)))),0===f.avail_in&&0===f.avail_out&&(w=!0)}while((f.avail_in>0||0===f.avail_out)&&r!==l.Z_STREAM_END);return r===l.Z_STREAM_END&&(n=l.Z_FINISH),n===l.Z_FINISH?(r=a.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l.Z_OK):n!==l.Z_SYNC_FLUSH||(this.onEnd(l.Z_OK),f.avail_out=0,!0)},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===l.Z_OK&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=s.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=n,r.inflate=o,r.inflateRaw=i,r.ungzip=o},"utils/common.js":function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var o={arraySet:function(e,t,r,n,o){if(t.subarray&&e.subarray)return void e.set(t.subarray(r,r+n),o);for(var i=0;i=252?6:d>=248?5:d>=240?4:d>=224?3:d>=192?2:1;s[254]=s[254]=1,r.string2buf=function(e){var t,r,n,i,a,s=e.length,d=0;for(i=0;i>>6,t[a++]=128|63&r):r<65536?(t[a++]=224|r>>>12,t[a++]=128|r>>>6&63,t[a++]=128|63&r):(t[a++]=240|r>>>18,t[a++]=128|r>>>12&63,t[a++]=128|r>>>6&63,t[a++]=128|63&r);return t},r.buf2binstring=function(e){return n(e,e.length)},r.binstring2buf=function(e){for(var t=new o.Buf8(e.length),r=0,n=t.length;r4)l[o++]=65533,r+=a-1;else{for(i&=2===a?31:3===a?15:7;a>1&&r1?l[o++]=65533:i<65536?l[o++]=i:(i-=65536,l[o++]=55296|i>>10&1023,l[o++]=56320|1023&i)}return n(l,o)},r.utf8border=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return r<0?t:0===r?t:r+s[e[r]]>t?r:t}},"zlib/inflate.js":function(e,t,r){"use strict";function n(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function o(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new y.Buf16(320),this.work=new y.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function i(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=P,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new y.Buf32(me),t.distcode=t.distdyn=new y.Buf32(we),t.sane=1,t.back=-1,M):R}function a(e){var t;return e&&e.state?(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,i(e)):R}function s(e,t){var r,n;return e&&e.state?(n=e.state,t<0?(r=0,t=-t):(r=(t>>4)+1,t<48&&(t&=15)),t&&(t<8||t>15)?R:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,a(e))):R}function d(e,t){var r,n;return e?(n=new o,e.state=n,n.window=null,r=s(e,t),r!==M&&(e.state=null),r):R}function l(e){return d(e,ye)}function u(e){if(ge){var t;for(w=new y.Buf32(512),b=new y.Buf32(32),t=0;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(U(E,e.lens,0,288,w,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;U(k,e.lens,0,32,b,0,e.work,{bits:5}),ge=!1}e.lencode=w,e.lenbits=9,e.distcode=b,e.distbits=5}function c(e,t,r,n){var o,i=e.state;return null===i.window&&(i.wsize=1<=i.wsize?(y.arraySet(i.window,t,r-i.wsize,i.wsize,0),i.wnext=0,i.whave=i.wsize):(o=i.wsize-i.wnext,o>n&&(o=n),y.arraySet(i.window,t,r-n,o,i.wnext),n-=o,n?(y.arraySet(i.window,t,r-n,n,0),i.wnext=n,i.whave=i.wsize):(i.wnext+=o,i.wnext===i.wsize&&(i.wnext=0),i.whave>>8&255,r.check=v(r.check,Le,2,0),f=0,h=0,r.mode=T;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&f)<<8)+(f>>8))%31){e.msg="incorrect header check",r.mode=fe;break}if((15&f)!==S){e.msg="unknown compression method",r.mode=fe;break}if(f>>>=4,h-=4,Ue=(15&f)+8,0===r.wbits)r.wbits=Ue;else if(Ue>r.wbits){e.msg="invalid window size",r.mode=fe;break}r.dmax=1<>8&1),512&r.flags&&(Le[0]=255&f,Le[1]=f>>>8&255,r.check=v(r.check,Le,2,0)),f=0,h=0,r.mode=D;case D:for(;h<32;){if(0===d)break e;d--,f+=o[a++]<>>8&255,Le[2]=f>>>16&255,Le[3]=f>>>24&255,r.check=v(r.check,Le,4,0)),f=0,h=0,r.mode=F;case F:for(;h<16;){if(0===d)break e;d--,f+=o[a++]<>8),512&r.flags&&(Le[0]=255&f,Le[1]=f>>>8&255,r.check=v(r.check,Le,2,0)),f=0,h=0,r.mode=z;case z:if(1024&r.flags){for(;h<16;){if(0===d)break e;d--,f+=o[a++]<>>8&255,r.check=v(r.check,Le,2,0)),f=0,h=0}else r.head&&(r.head.extra=null);r.mode=V;case V:if(1024&r.flags&&(w=r.length,w>d&&(w=d),w&&(r.head&&(Ue=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),y.arraySet(r.head.extra,o,a,w,Ue)),512&r.flags&&(r.check=v(r.check,o,w,a)),d-=w,a+=w,r.length-=w),r.length))break e;r.length=0,r.mode=q;case q:if(2048&r.flags){if(0===d)break e;w=0;do Ue=o[a+w++],r.head&&Ue&&r.length<65536&&(r.head.name+=String.fromCharCode(Ue));while(Ue&&w>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=j;break;case G:for(;h<32;){if(0===d)break e;d--,f+=o[a++]<>>=7&h,h-=7&h,r.mode=le;break}for(;h<3;){if(0===d)break e;d--,f+=o[a++]<>>=1,h-=1,3&f){case 0:r.mode=K;break;case 1:if(u(r),r.mode=re,t===W){f>>>=2,h-=2;break e}break;case 2:r.mode=$;break;case 3:e.msg="invalid block type",r.mode=fe}f>>>=2,h-=2;break;case K:for(f>>>=7&h,h-=7&h;h<32;){if(0===d)break e;d--,f+=o[a++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=fe;break}if(r.length=65535&f,f=0,h=0,r.mode=Q,t===W)break e;case Q:r.mode=_;case _:if(w=r.length){if(w>d&&(w=d),w>l&&(w=l),0===w)break e;y.arraySet(i,o,a,w,s),d-=w,a+=w,l-=w,s+=w,r.length-=w;break}r.mode=j;break;case $:for(;h<14;){if(0===d)break e;d--,f+=o[a++]<>>=5,h-=5,r.ndist=(31&f)+1,f>>>=5,h-=5,r.ncode=(15&f)+4,f>>>=4,h-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=fe;break}r.have=0,r.mode=ee;case ee:for(;r.have>>=3,h-=3}for(;r.have<19;)r.lens[We[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,Ee={bits:r.lenbits},xe=U(x,r.lens,0,19,r.lencode,0,r.work,Ee),r.lenbits=Ee.bits,xe){e.msg="invalid code lengths set",r.mode=fe;break}r.have=0,r.mode=te;case te:for(;r.have>>24,be=Be>>>16&255,ye=65535&Be,!(we<=h);){if(0===d)break e;d--,f+=o[a++]<>>=we,h-=we,r.lens[r.have++]=ye;else{if(16===ye){for(ke=we+2;h>>=we,h-=we,0===r.have){e.msg="invalid bit length repeat",r.mode=fe;break}Ue=r.lens[r.have-1],w=3+(3&f),f>>>=2,h-=2}else if(17===ye){for(ke=we+3;h>>=we,h-=we,Ue=0,w=3+(7&f),f>>>=3,h-=3}else{for(ke=we+7;h>>=we,h-=we,Ue=0,w=11+(127&f),f>>>=7,h-=7}if(r.have+w>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=fe;break}for(;w--;)r.lens[r.have++]=Ue}}if(r.mode===fe)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=fe;break}if(r.lenbits=9,Ee={bits:r.lenbits},xe=U(E,r.lens,0,r.nlen,r.lencode,0,r.work,Ee),r.lenbits=Ee.bits,xe){e.msg="invalid literal/lengths set",r.mode=fe;break}if(r.distbits=6,r.distcode=r.distdyn,Ee={bits:r.distbits},xe=U(k,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,Ee),r.distbits=Ee.bits,xe){e.msg="invalid distances set",r.mode=fe;break}if(r.mode=re,t===W)break e;case re:r.mode=ne;case ne:if(d>=6&&l>=258){e.next_out=s,e.avail_out=l,e.next_in=a,e.avail_in=d,r.hold=f,r.bits=h,A(e,m),s=e.next_out,i=e.output,l=e.avail_out,a=e.next_in,o=e.input,d=e.avail_in,f=r.hold,h=r.bits,r.mode===j&&(r.back=-1);break}for(r.back=0;Be=r.lencode[f&(1<>>24,be=Be>>>16&255,ye=65535&Be,!(we<=h);){if(0===d)break e;d--,f+=o[a++]<>ge)],we=Be>>>24,be=Be>>>16&255,ye=65535&Be,!(ge+we<=h);){if(0===d)break e;d--,f+=o[a++]<>>=ge,h-=ge,r.back+=ge}if(f>>>=we,h-=we,r.back+=we,r.length=ye,0===be){r.mode=de;break}if(32&be){r.back=-1,r.mode=j;break}if(64&be){e.msg="invalid literal/length code",r.mode=fe;break}r.extra=15&be,r.mode=oe;case oe:if(r.extra){for(ke=r.extra;h>>=r.extra,h-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=ie;case ie:for(;Be=r.distcode[f&(1<>>24,be=Be>>>16&255,ye=65535&Be,!(we<=h);){if(0===d)break e;d--,f+=o[a++]<>ge)],we=Be>>>24,be=Be>>>16&255,ye=65535&Be,!(ge+we<=h);){if(0===d)break e;d--,f+=o[a++]<>>=ge,h-=ge,r.back+=ge}if(f>>>=we,h-=we,r.back+=we,64&be){e.msg="invalid distance code",r.mode=fe;break}r.offset=ye,r.extra=15&be,r.mode=ae;case ae:if(r.extra){for(ke=r.extra;h>>=r.extra,h-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=fe;break}r.mode=se;case se:if(0===l)break e;if(w=m-l,r.offset>w){if(w=r.offset-w,w>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=fe;break}w>r.wnext?(w-=r.wnext,b=r.wsize-w):b=r.wnext-w,w>r.length&&(w=r.length),me=r.window}else me=i,b=s-r.offset,w=r.length;w>l&&(w=l),l-=w,r.length-=w;do i[s++]=me[b++];while(--w);0===r.length&&(r.mode=ne);break;case de:if(0===l)break e;i[s++]=r.length,l--,r.mode=ne;break;case le:if(r.wrap){for(;h<32;){if(0===d)break e;d--,f|=o[a++]<>>16&65535|0,a=0;0!==r;){a=r>2e3?2e3:r,r-=a;do o=o+t[n++]|0,i=i+o|0;while(--a);o%=65521,i%=65521}return o|i<<16|0}t.exports=n},"zlib/crc32.js":function(e,t,r){"use strict";function n(){for(var e,t=[],r=0;r<256;r++){e=r;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function o(e,t,r,n){var o=i,a=n+r;e^=-1;for(var s=n;s>>8^o[255&(e^t[s])];return e^-1}var i=n();t.exports=o},"zlib/inffast.js":function(e,t,r){"use strict";var n=30,o=12;t.exports=function(e,t){var r,i,a,s,d,l,u,c,f,h,p,m,w,b,y,g,v,A,U,x,E,k,B,L,W;r=e.state,i=e.next_in,L=e.input,a=i+(e.avail_in-5),s=e.next_out,W=e.output,d=s-(t-e.avail_out),l=s+(e.avail_out-257),u=r.dmax,c=r.wsize,f=r.whave,h=r.wnext,p=r.window,m=r.hold,w=r.bits,b=r.lencode,y=r.distcode,g=(1<>>24,m>>>=U,w-=U,U=A>>>16&255,0===U)W[s++]=65535&A;else{if(!(16&U)){if(0===(64&U)){A=b[(65535&A)+(m&(1<>>=U,w-=U),w<15&&(m+=L[i++]<>>24,m>>>=U,w-=U,U=A>>>16&255,!(16&U)){if(0===(64&U)){A=y[(65535&A)+(m&(1<u){e.msg="invalid distance too far back",r.mode=n;break e}if(m>>>=U,w-=U,U=s-d,E>U){if(U=E-U,U>f&&r.sane){e.msg="invalid distance too far back",r.mode=n;break e}if(k=0,B=p,0===h){if(k+=c-U,U2;)W[s++]=B[k++],W[s++]=B[k++],W[s++]=B[k++],x-=3;x&&(W[s++]=B[k++],x>1&&(W[s++]=B[k++]))}else{k=s-E;do W[s++]=W[k++],W[s++]=W[k++],W[s++]=W[k++],x-=3;while(x>2);x&&(W[s++]=W[k++],x>1&&(W[s++]=W[k++]))}break}}break}}while(i>3,i-=x,w-=x<<3,m&=(1<=1&&0===z[R];R--);if(C>R&&(C=R),0===R)return m[w++]=20971520,m[w++]=20971520,y.bits=1,0;for(N=1;N0&&(e===s||1!==R))return-1;for(V[1]=0,M=1;Mi||e===l&&P>a)return 1;for(;;){k=M-I,b[O]E?(B=q[Z+b[O]],L=D[F+b[O]]):(B=96,L=0),g=1<>I)+v]=k<<24|B<<16|L|0;while(0!==v);for(g=1<>=1;if(0!==g?(T&=g-1,T+=g):T=0,O++,0===--z[M]){if(M===R)break;M=t[r+b[O]]}if(M>C&&(T&U)!==A){for(0===I&&(I=C),x+=N,H=M-I,S=1<i||e===l&&P>a)return 1;A=T&U,m[A]=C<<24|H<<16|x-w|0}}return 0!==T&&(m[x+T]=M-I<<24|64<<16|0),y.bits=C,0}}};for(var r in t)t[r].folder=r.substring(0,r.lastIndexOf("/")+1);var n=function(e){var r=[];return e=e.split("/").every(function(e){return".."==e?r.pop():"."==e||""==e||r.push(e)})?r.join("/"):null,e?t[e]||t[e+".js"]||t[e+"/index.js"]:null},o=function(e,t){return e?n(e.folder+"node_modules/"+t)||o(e.parent,t):null},i=function(e,t){var r=t.match(/^\//)?null:e?t.match(/^\.\.?\//)?n(e.folder+t):o(e,t):n(t);if(!r)throw"module not found: "+t;return r.exports||(r.parent=e,r(i.bind(null,r),r,r.exports={})),r.exports};return i(null,e)},decompress:function(e){this.exports||(this.exports=this.require("inflate.js"));try{return this.exports.inflate(e)}catch(e){}},hasUnityMarker:function(e){var t=10,r="UnityWeb Compressed Content (gzip)";if(t>e.length||31!=e[0]||139!=e[1])return!1;var n=e[3];if(4&n){if(t+2>e.length)return!1;if(t+=2+e[t]+(e[t+1]<<8),t>e.length)return!1}if(8&n){for(;te.length)return!1;t++}return 16&n&&String.fromCharCode.apply(null,e.subarray(t,t+r.length+1))==r+"\0"}},brotli:{require:function(e){var t={"decompress.js":function(e,t,r){t.exports=e("./dec/decode").BrotliDecompressBuffer},"dec/bit_reader.js":function(e,t,r){function n(e){this.buf_=new Uint8Array(i),this.input_=e,this.reset()}const o=4096,i=8224,a=8191,s=new Uint32Array([0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535,131071,262143,524287,1048575,2097151,4194303,8388607,16777215]);n.READ_SIZE=o,n.IBUF_MASK=a,n.prototype.reset=function(){this.buf_ptr_=0,this.val_=0,this.pos_=0,this.bit_pos_=0,this.bit_end_pos_=0,this.eos_=0,this.readMoreInput();for(var e=0;e<4;e++)this.val_|=this.buf_[this.pos_]<<8*e,++this.pos_;return this.bit_end_pos_>0},n.prototype.readMoreInput=function(){if(!(this.bit_end_pos_>256))if(this.eos_){if(this.bit_pos_>this.bit_end_pos_)throw new Error("Unexpected end of input "+this.bit_pos_+" "+this.bit_end_pos_)}else{var e=this.buf_ptr_,t=this.input_.read(this.buf_,e,o);if(t<0)throw new Error("Unexpected end of input");if(t=8;)this.val_>>>=8,this.val_|=this.buf_[this.pos_&a]<<24,++this.pos_,this.bit_pos_=this.bit_pos_-8>>>0,this.bit_end_pos_=this.bit_end_pos_-8>>>0},n.prototype.readBits=function(e){32-this.bit_pos_>>this.bit_pos_&s[e];return this.bit_pos_+=e,t},t.exports=n},"dec/context.js":function(e,t,r){r.lookup=new Uint8Array([0,0,0,0,0,0,0,0,0,4,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,12,16,12,12,20,12,16,24,28,12,12,32,12,36,12,44,44,44,44,44,44,44,44,44,44,32,32,24,40,28,12,12,48,52,52,52,48,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,48,52,52,52,52,52,24,12,28,12,12,12,56,60,60,60,56,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,56,60,60,60,60,60,24,12,28,12,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,56,0,1,2,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,0,1,2,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,0,1,2,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,0,1,2,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,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,22,22,22,22,23,23,23,23,24,24,24,24,25,25,25,25,26,26,26,26,27,27,27,27,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,32,32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,39,40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43,44,44,44,44,45,45,45,45,46,46,46,46,47,47,47,47,48,48,48,48,49,49,49,49,50,50,50,50,51,51,51,51,52,52,52,52,53,53,53,53,54,54,54,54,55,55,55,55,56,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,61,61,61,61,62,62,62,62,63,63,63,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),r.lookupOffsets=new Uint16Array([1024,1536,1280,1536,0,256,768,512])},"dec/decode.js":function(e,t,r){function n(e){var t;return 0===e.readBits(1)?16:(t=e.readBits(3),t>0?17+t:(t=e.readBits(3),t>0?8+t:17))}function o(e){if(e.readBits(1)){var t=e.readBits(3);return 0===t?1:e.readBits(t)+(1<1&&0===a)throw new Error("Invalid size byte");o.meta_block_length|=a<<8*n}}else for(n=0;n4&&0===s)throw new Error("Invalid size nibble");o.meta_block_length|=s<<4*n}return++o.meta_block_length,o.input_end||o.is_metadata||(o.is_uncompressed=e.readBits(1)),o}function s(e,t,r){var n;return r.fillBitWindow(),t+=r.val_>>>r.bit_pos_&D,n=e[t].bits-T,n>0&&(r.bit_pos_+=T,t+=e[t].value,t+=r.val_>>>r.bit_pos_&(1<0;){var c,f=0;if(n.readMoreInput(),n.fillBitWindow(),f+=n.val_>>>n.bit_pos_&31,n.bit_pos_+=l[f].bits,c=255&l[f].value,c>c);else{var h,p,m=c-14,w=0;if(c===R&&(w=i),s!==w&&(a=0,s=w),h=a,a>0&&(a-=2,a<<=m),a+=n.readBits(m)+3,p=a-h,o+p>t)throw new Error("[ReadHuffmanCodeLengths] symbol + repeat_delta > num_symbols");for(var b=0;b0;++s){var b,y=V[s],g=0;n.fillBitWindow(),g+=n.val_>>>n.bit_pos_&15, 2 | n.bit_pos_+=w[g].bits,b=w[g].value,h[y]=b,0!==b&&(p-=32>>b,++m)}if(1!==m&&0!==p)throw new Error("[ReadHuffmanCode] invalid num_codes or space");d(h,e,a,n)}if(i=L(t,r,T,a,e),0===i)throw new Error("[ReadHuffmanCode] BuildHuffmanTable failed: ");return i}function u(e,t,r){var n,o;return n=s(e,t,r),o=M.kBlockLengthPrefixCode[n].nbits,M.kBlockLengthPrefixCode[n].offset+r.readBits(o)}function c(e,t,r){var n;return e>>5]),this.htrees=new Uint32Array(t)}function m(e,t){var r,n,i,a={num_htrees:null,context_map:null},d=0;t.readMoreInput();var u=a.num_htrees=o(t)+1,c=a.context_map=new Uint8Array(e);if(u<=1)return a;for(r=t.readBits(1),r&&(d=t.readBits(4)+1),n=[],i=0;i=e)throw new Error("[DecodeContextMap] i >= context_map_size");c[i]=0,++i}else c[i]=f-d,++i}return t.readBits(1)&&h(c,e),a}function w(e,t,r,n,o,i,a){var d,l=2*r,u=r,c=s(t,r*F,a);d=0===c?o[l+(1&i[u])]:1===c?o[l+(i[u]-1&1)]+1:c-2,d>=e&&(d-=e),n[r]=d,o[l+(1&i[u])]=d,++i[u]}function b(e,t,r,n,o,i){var a,s=o+1,d=r&o,l=i.pos_&E.IBUF_MASK;if(t<8||i.bit_pos_+(t<<3)0;)i.readMoreInput(),n[d++]=i.readBits(8),d===s&&(e.write(n,s),d=0);else{if(i.bit_end_pos_<32)throw new Error("[CopyUncompressedBlockToOutput] br.bit_end_pos_ < 32");for(;i.bit_pos_<32;)n[d]=i.val_>>>i.bit_pos_,i.bit_pos_+=8,++d,--t;if(a=i.bit_end_pos_-i.bit_pos_>>3,l+a>E.IBUF_MASK){for(var u=E.IBUF_MASK+1-l,c=0;c=s){e.write(n,s),d-=s;for(var c=0;c=s;){if(a=s-d,i.input_.read(n,d,a)t.buffer.length){var ve=new Uint8Array(x+re);ve.set(t.buffer),t.buffer=ve}if(L=ge.input_end,J=ge.is_uncompressed,ge.is_metadata)for(y(U);re>0;--re)U.readMoreInput(),U.readBits(8);else if(0!==re)if(J)U.bit_pos_=U.bit_pos_+7&-8,b(t,re,x,h,f,U),x+=re;else{for(r=0;r<3;++r)ie[r]=o(U)+1,ie[r]>=2&&(l(ie[r]+2,v,r*F,U),l(I,A,r*F,U),ne[r]=u(A,r*F,U),se[r]=1);for(U.readMoreInput(),j=U.readBits(2),X=q+(U.readBits(4)<0;){var xe,Ee,ke,Be,Le,We,Me,Oe,Ne,Re,Ce;for(U.readMoreInput(),0===ne[1]&&(w(ie[1],v,1,oe,ae,se,U),ne[1]=u(A,F,U),te=Z[1].htrees[oe[1]]),--ne[1],xe=s(Z[1].codes,te,U),Ee=xe>>6,Ee>=2?(Ee-=2,Me=-1):Me=0,ke=M.kInsertRangeLut[Ee]+(xe>>3&7),Be=M.kCopyRangeLut[Ee]+(7&xe),Le=M.kInsertLengthPrefixCode[ke].offset+U.readBits(M.kInsertLengthPrefixCode[ke].nbits),We=M.kCopyLengthPrefixCode[Be].offset+U.readBits(M.kCopyLengthPrefixCode[Be].nbits),z=h[x-1&f],V=h[x-2&f],Re=0;Re4?3:We-2),we=ue[me+Ne],Me=s(Z[2].codes,Z[2].htrees[we],U),Me>=X){var He,Ie,Se;Me-=X,Ie=Me&K,Me>>=j,He=(Me>>1)+1,Se=(2+(1&Me)<R){if(!(We>=k.minDictionaryWordLength&&We<=k.maxDictionaryWordLength))throw new Error("Invalid backward reference. pos: "+x+" distance: "+Oe+" len: "+We+" bytes left: "+re);var Se=k.offsetsByLength[We],Pe=Oe-R-1,Te=k.sizeBitsByLength[We],De=(1<>Te;if(Se+=Fe*We,!(ze=g){t.write(h,d);for(var qe=0;qe0&&(T[3&D]=Oe,++D),We>re)throw new Error("Invalid backward reference. pos: "+x+" distance: "+Oe+" len: "+We+" bytes left: "+re);for(Re=0;Re>=1;return(e&r-1)+r}function i(e,t,r,o,i){do o-=r,e[t+o]=new n(i.bits,i.value);while(o>0)}function a(e,t,r){for(var n=1<0;--U[c])u=new n(255&c,65535&v[f++]),i(e,t+h,p,y,u),h=o(h,c);for(w=g-1,m=-1,c=r+1,p=2;c<=s;++c,p<<=1)for(;U[c]>0;--U[c])(h&w)!==m&&(t+=y,b=a(U,c,r),y=1<>r),p,y,u),h=o(h,c);return g}},"dec/prefix.js":function(e,t,r){function n(e,t){this.offset=e,this.nbits=t}r.kBlockLengthPrefixCode=[new n(1,2),new n(5,2),new n(9,2),new n(13,2),new n(17,3),new n(25,3),new n(33,3),new n(41,3),new n(49,4),new n(65,4),new n(81,4),new n(97,4),new n(113,5),new n(145,5),new n(177,5),new n(209,5),new n(241,6),new n(305,6),new n(369,7),new n(497,8),new n(753,9),new n(1265,10),new n(2289,11),new n(4337,12),new n(8433,13),new n(16625,24)],r.kInsertLengthPrefixCode=[new n(0,0),new n(1,0),new n(2,0),new n(3,0),new n(4,0),new n(5,0),new n(6,1),new n(8,1),new n(10,2),new n(14,2),new n(18,3),new n(26,3),new n(34,4),new n(50,4),new n(66,5),new n(98,5),new n(130,6),new n(194,7),new n(322,8),new n(578,9),new n(1090,10),new n(2114,12),new n(6210,14),new n(22594,24)],r.kCopyLengthPrefixCode=[new n(2,0),new n(3,0),new n(4,0),new n(5,0),new n(6,0),new n(7,0),new n(8,0),new n(9,0),new n(10,1),new n(12,1),new n(14,2),new n(18,2),new n(22,3),new n(30,3),new n(38,4),new n(54,4),new n(70,5),new n(102,5),new n(134,6),new n(198,7),new n(326,8),new n(582,9),new n(1094,10),new n(2118,24)],r.kInsertRangeLut=[0,0,8,8,0,16,8,16,16],r.kCopyRangeLut=[0,8,0,8,16,0,16,8,16]},"dec/streams.js":function(e,t,r){function n(e){this.buffer=e,this.pos=0}function o(e){this.buffer=e,this.pos=0}n.prototype.read=function(e,t,r){this.pos+r>this.buffer.length&&(r=this.buffer.length-this.pos);for(var n=0;nthis.buffer.length)throw new Error("Output buffer is not large enough");return this.buffer.set(e.subarray(0,t),this.pos),this.pos+=t,t},r.BrotliOutput=o},"dec/transform.js":function(e,t,r){function n(e,t,r){this.prefix=new Uint8Array(e.length),this.transform=t,this.suffix=new Uint8Array(r.length);for(var n=0;n=97&&e[t]<=122&&(e[t]^=32),1):e[t]<224?(e[t+1]^=32,2):(e[t+2]^=5,3)}var i=e("./dictionary");const a=0,s=1,d=2,l=3,u=4,c=5,f=6,h=7,p=8,m=9,w=10,b=11,y=12,g=13,v=14,A=15,U=16,x=17,E=18,k=20;var B=[new n("",a,""),new n("",a," "),new n(" ",a," "),new n("",y,""),new n("",w," "),new n("",a," the "),new n(" ",a,""),new n("s ",a," "),new n("",a," of "),new n("",w,""),new n("",a," and "),new n("",g,""),new n("",s,""),new n(", ",a," "),new n("",a,", "),new n(" ",w," "),new n("",a," in "),new n("",a," to "),new n("e ",a," "),new n("",a,'"'),new n("",a,"."),new n("",a,'">'),new n("",a,"\n"),new n("",l,""),new n("",a,"]"),new n("",a," for "),new n("",v,""),new n("",d,""),new n("",a," a "),new n("",a," that "),new n(" ",w,""),new n("",a,". "),new n(".",a,""),new n(" ",a,", "),new n("",A,""),new n("",a," with "),new n("",a,"'"),new n("",a," from "),new n("",a," by "),new n("",U,""),new n("",x,""),new n(" the ",a,""),new n("",u,""),new n("",a,". The "),new n("",b,""),new n("",a," on "),new n("",a," as "),new n("",a," is "),new n("",h,""),new n("",s,"ing "),new n("",a,"\n\t"),new n("",a,":"),new n(" ",a,". "),new n("",a,"ed "),new n("",k,""),new n("",E,""),new n("",f,""),new n("",a,"("),new n("",w,", "),new n("",p,""),new n("",a," at "),new n("",a,"ly "),new n(" the ",a," of "),new n("",c,""),new n("",m,""),new n(" ",w,", "),new n("",w,'"'),new n(".",a,"("),new n("",b," "),new n("",w,'">'),new n("",a,'="'),new n(" ",a,"."),new n(".com/",a,""),new n(" the ",a," of the "),new n("",w,"'"),new n("",a,". This "),new n("",a,","),new n(".",a," "),new n("",w,"("),new n("",w,"."),new n("",a," not "),new n(" ",a,'="'),new n("",a,"er "),new n(" ",b," "),new n("",a,"al "),new n(" ",b,""),new n("",a,"='"),new n("",b,'"'),new n("",w,". "),new n(" ",a,"("),new n("",a,"ful "),new n(" ",w,". "),new n("",a,"ive "),new n("",a,"less "),new n("",b,"'"),new n("",a,"est "),new n(" ",w,"."),new n("",b,'">'),new n(" ",a,"='"),new n("",w,","),new n("",a,"ize "),new n("",b,"."),new n("\xc2\xa0",a,""),new n(" ",a,","),new n("",w,'="'),new n("",b,'="'),new n("",a,"ous "),new n("",b,", "),new n("",w,"='"),new n(" ",w,","),new n(" ",b,'="'),new n(" ",b,", "),new n("",b,","),new n("",b,"("),new n("",b,". "),new n(" ",b,"."),new n("",b,"='"),new n(" ",b,". "),new n(" ",w,'="'),new n(" ",b,"='"),new n(" ",w,"='")];r.kTransforms=B,r.kNumTransforms=B.length,r.transformDictionaryWord=function(e,t,r,n,a){var s,d=B[a].prefix,l=B[a].suffix,u=B[a].transform,c=un&&(c=n);for(var p=0;p0;){var g=o(e,s);s+=g,n-=g}for(var v=0;v0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function o(e){return 3*e.length/4-n(e)}function i(e){var t,r,o,i,a,s,d=e.length;a=n(e),s=new c(3*d/4-a),o=a>0?d-4:d;var l=0;for(t=0,r=0;t>16&255,s[l++]=i>>8&255,s[l++]=255&i;return 2===a?(i=u[e.charCodeAt(t)]<<2|u[e.charCodeAt(t+1)]>>4,s[l++]=255&i):1===a&&(i=u[e.charCodeAt(t)]<<10|u[e.charCodeAt(t+1)]<<4|u[e.charCodeAt(t+2)]>>2,s[l++]=i>>8&255,s[l++]=255&i),s}function a(e){return l[e>>18&63]+l[e>>12&63]+l[e>>6&63]+l[63&e]}function s(e,t,r){for(var n,o=[],i=t;iu?u:d+a));return 1===n?(t=e[r-1],o+=l[t>>2],o+=l[t<<4&63],o+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],o+=l[t>>10],o+=l[t>>4&63],o+=l[t<<2&63],o+="="),i.push(o),i.join("")}r.byteLength=o,r.toByteArray=i,r.fromByteArray=d;for(var l=[],u=[],c="undefined"!=typeof Uint8Array?Uint8Array:Array,f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",h=0,p=f.length;h>3);if(commentOffset=r+1+2+1+2+(o<<3)+7>>3,17==n||commentOffset>e.length)return!1;for(var i=n+(6+(o<<4)+(t.length-1<<6)<>>=8)if(e[a]!=(255&i))return!1;return String.fromCharCode.apply(null,e.subarray(commentOffset,commentOffset+t.length))==t}},decompress:function(e,t){var r=this.gzip.hasUnityMarker(e)?this.gzip:this.brotli.hasUnityMarker(e)?this.brotli:this.identity;if(this.serverSetupWarningEnabled&&r!=this.identity&&(console.log("You can reduce your startup time if you configure your web server to host .unityweb files using "+(r==this.gzip?"gzip":"brotli")+" compression."),this.serverSetupWarningEnabled=!1),"function"!=typeof t)return r.decompress(e);if(!r.worker){var n=URL.createObjectURL(new Blob(["this.require = ",r.require.toString(),"; this.decompress = ",r.decompress.toString(),"; this.onmessage = ",function(e){var t={id:e.data.id,decompressed:this.decompress(e.data.compressed)};postMessage(t,t.decompressed?[t.decompressed.buffer]:[])}.toString(),"; postMessage({ ready: true });"],{type:"text/javascript"}));r.worker=new Worker(n),r.worker.onmessage=function(e){return e.data.ready?void URL.revokeObjectURL(n):(this.callbacks[e.data.id](e.data.decompressed),void delete this.callbacks[e.data.id])},r.worker.callbacks={},r.worker.nextCallbackId=0}var o=r.worker.nextCallbackId++;r.worker.callbacks[o]=t,r.worker.postMessage({id:o,compressed:e},[e.buffer])},serverSetupWarningEnabled:!0},Cryptography:{crc32:function(e){var t=UnityLoader.Cryptography.crc32.module;if(!t){var r=new ArrayBuffer(16777216),n=function(e,t,r){"use asm";var n=new e.Uint8Array(r);var o=new e.Uint32Array(r);function i(e,t){e=e|0;t=t|0;var r=0;for(r=o[1024>>2]|0;t;e=e+1|0,t=t-1|0)r=o[(r&255^n[e])<<2>>2]^r>>>8^4278190080;o[1024>>2]=r}return{process:i}}({Uint8Array:Uint8Array,Uint32Array:Uint32Array},null,r);t=UnityLoader.Cryptography.crc32.module={buffer:r,HEAPU8:new Uint8Array(r),HEAPU32:new Uint32Array(r),process:n.process,crc32:1024,data:1028};for(var o=0;o<256;o++){for(var i=255^o,a=0;a<8;a++)i=i>>>1^(1&i?3988292384:0);t.HEAPU32[o]=i}}t.HEAPU32[t.crc32>>2]=0;for(var s=0;s>2];return new Uint8Array([l>>24,l>>16,l>>8,l])},md5:function(e){var t=UnityLoader.Cryptography.md5.module;if(!t){var r=new ArrayBuffer(16777216),n=function(e,t,r){"use asm";var n=new e.Uint32Array(r);function o(e,t){e=e|0;t=t|0;var r=0,o=0,i=0,a=0,s=0,d=0,l=0,u=0,c=0,f=0,h=0,p=0;r=n[128]|0,o=n[129]|0,i=n[130]|0,a=n[131]|0;for(;t;e=e+64|0,t=t-1|0){s=r;d=o;l=i;u=a;for(f=0;(f|0)<512;f=f+8|0){p=n[f>>2]|0;r=r+(n[f+4>>2]|0)+(n[e+(p>>>14)>>2]|0)+((f|0)<128?a^o&(i^a):(f|0)<256?i^a&(o^i):(f|0)<384?o^i^a:i^(o|~a))|0;h=(r<<(p&31)|r>>>32-(p&31))+o|0;r=a;a=i;i=o;o=h}r=r+s|0;o=o+d|0;i=i+l|0;a=a+u|0}n[128]=r;n[129]=o;n[130]=i;n[131]=a}return{process:o}}({Uint32Array:Uint32Array},null,r);t=UnityLoader.Cryptography.md5.module={buffer:r,HEAPU8:new Uint8Array(r),HEAPU32:new Uint32Array(r),process:n.process,md5:512,data:576},t.HEAPU32.set(new Uint32Array([7,3614090360,65548,3905402710,131089,606105819,196630,3250441966,262151,4118548399,327692,1200080426,393233,2821735955,458774,4249261313,524295,1770035416,589836,2336552879,655377,4294925233,720918,2304563134,786439,1804603682,851980,4254626195,917521,2792965006,983062,1236535329,65541,4129170786,393225,3225465664,720910,643717713,20,3921069994,327685,3593408605,655369,38016083,983054,3634488961,262164,3889429448,589829,568446438,917513,3275163606,196622,4107603335,524308,1163531501,851973,2850285829,131081,4243563512,458766,1735328473,786452,2368359562,327684,4294588738,524299,2272392833,720912,1839030562,917527,4259657740,65540,2763975236,262155,1272893353,458768,4139469664,655383,3200236656,851972,681279174,11,3936430074,196624,3572445317,393239,76029189,589828,3654602809,786443,3873151461,983056,530742520,131095,3299628645,6,4096336452,458762,1126891415,917519,2878612391,327701,4237533241,786438,1700485571,196618,2399980690,655375,4293915773,65557,2240044497,524294,1873313359,983050,4264355552,393231,2734768916,851989,1309151649,262150,4149444226,720906,3174756917,131087,718787259,589845,3951481745]))}t.HEAPU32.set(new Uint32Array([1732584193,4023233417,2562383102,271733878]),t.md5>>2);for(var o=0;o>6),e.length-o<64){if(i=e.length-o,t.HEAPU8.set(e.subarray(e.length-i,e.length),t.data),o+=i,t.HEAPU8[t.data+i++]=128,i>56){for(var a=i;a<64;a++)t.HEAPU8[t.data+a]=0;t.process(t.data,1),i=0}for(var a=i;a<64;a++)t.HEAPU8[t.data+a]=0;for(var s=e.length,d=0,a=56;a<64;a++,d=(224&s)>>5,s/=256)t.HEAPU8[t.data+a]=((31&s)<<3)+d;t.process(t.data,1)}}return new Uint8Array(t.HEAPU8.subarray(t.md5,t.md5+16))},sha1:function(e){var t=UnityLoader.Cryptography.sha1.module;if(!t){var r=new ArrayBuffer(16777216),n=function(e,t,r){"use asm";var n=new e.Uint32Array(r);function o(e,t){e=e|0;t=t|0;var r=0,o=0,i=0,a=0,s=0,d=0,l=0,u=0,c=0,f=0,h=0,p=0;r=n[80]|0,o=n[81]|0,i=n[82]|0,a=n[83]|0,s=n[84]|0;for(;t;e=e+64|0,t=t-1|0){d=r;l=o;u=i;c=a;f=s;for(p=0;(p|0)<320;p=p+4|0,s=a,a=i,i=o<<30|o>>>2,o=r,r=h){if((p|0)<64){h=n[e+p>>2]|0;h=h<<24&4278190080|h<<8&16711680|h>>>8&65280|h>>>24&255}else{h=n[p-12>>2]^n[p-32>>2]^n[p-56>>2]^n[p-64>>2];h=h<<1|h>>>31}n[p>>2]=h;h=h+((r<<5|r>>>27)+s)+((p|0)<80?(o&i|~o&a|0)+1518500249|0:(p|0)<160?(o^i^a)+1859775393|0:(p|0)<240?(o&i|o&a|i&a)+2400959708|0:(o^i^a)+3395469782|0)|0}r=r+d|0;o=o+l|0;i=i+u|0;a=a+c|0;s=s+f|0}n[80]=r;n[81]=o;n[82]=i;n[83]=a;n[84]=s}return{process:o}}({Uint32Array:Uint32Array},null,r);t=UnityLoader.Cryptography.sha1.module={buffer:r,HEAPU8:new Uint8Array(r),HEAPU32:new Uint32Array(r),process:n.process,sha1:320,data:384}}t.HEAPU32.set(new Uint32Array([1732584193,4023233417,2562383102,271733878,3285377520]),t.sha1>>2);for(var o=0;o>6),e.length-o<64){if(i=e.length-o,t.HEAPU8.set(e.subarray(e.length-i,e.length),t.data),o+=i,t.HEAPU8[t.data+i++]=128,i>56){for(var a=i;a<64;a++)t.HEAPU8[t.data+a]=0;t.process(t.data,1),i=0}for(var a=i;a<64;a++)t.HEAPU8[t.data+a]=0;for(var s=e.length,d=0,a=63;a>=56;a--,d=(224&s)>>5,s/=256)t.HEAPU8[t.data+a]=((31&s)<<3)+d;t.process(t.data,1)}}for(var l=new Uint8Array(20),a=0;a\\[(\\d+)\\]\\+\\d+\\))()":"((\\s*)wasm-function\\[(\\d+)\\])@(blob:.*)",blobParseRegExp:new RegExp("^(blob:.*)(:\\d+:\\d+)$"),getModule:function(e){var t=e.message.match(new RegExp(this.stackTraceFormat,"g"));for(var r in t){var n=t[r].match(new RegExp("^"+this.stackTraceFormat+"$")),o=n[7].match(this.blobParseRegExp);if(o&&UnityLoader.Blobs[o[1]]&&UnityLoader.Blobs[o[1]].Module)return UnityLoader.Blobs[o[1]].Module}},demangle:function(e,t){var r=e.message;return t?(r=r.replace(new RegExp(this.stackTraceFormat,"g"),function(e){var r=e.match(new RegExp("^"+this.stackTraceFormat+"$")),n=r[7].match(this.blobParseRegExp),o=t.demangleSymbol?t.demangleSymbol(r[4]):r[4],i=n&&UnityLoader.Blobs[n[1]]&&UnityLoader.Blobs[n[1]].url?UnityLoader.Blobs[n[1]].url:"blob";return r[1]+o+(r[2]!=o?" ["+r[2]+"]":"")+" ("+(n?i.substr(i.lastIndexOf("/")+1)+n[2]:r[7])+")"}.bind(this)),t.useWasm&&(r=r.replace(new RegExp(this.stackTraceFormatWasm,"g"),function(e){var r=e.match(new RegExp("^"+this.stackTraceFormatWasm+"$")),n=t.demangleSymbol?t.demangleSymbol(r[3]):r[3],o=r[4].match(this.blobParseRegExp),i=o&&UnityLoader.Blobs[o[1]]&&UnityLoader.Blobs[o[1]].url?UnityLoader.Blobs[o[1]].url:"blob";return(n==r[3]?r[1]:r[2]+n+" [wasm:"+r[3]+"]")+(r[4]?" ("+(o?i.substr(i.lastIndexOf("/")+1)+o[2]:r[4])+")":"")}.bind(this))),r):r},handler:function(e,t){var r=t?this.demangle(e,t):e.message;if(!(t&&t.errorhandler&&t.errorhandler(r,e.filename,e.lineno)||(console.log("Invoking error handler due to\n"+r),"function"==typeof dump&&dump("Invoking error handler due to\n"+r),r.indexOf("UnknownError")!=-1||r.indexOf("Program terminated with exit(0)")!=-1||this.didShowErrorMessage))){var r="An error occurred running the Unity content on this page. See your browser JavaScript console for more info. The error was:\n"+r;r.indexOf("DISABLE_EXCEPTION_CATCHING")!=-1?r="An exception has occurred, but exception handling has been disabled in this build. If you are the developer of this content, enable exceptions in your project WebGL player settings to be able to catch the exception or see the stack trace.":r.indexOf("Cannot enlarge memory arrays")!=-1?r="Out of memory. If you are the developer of this content, try allocating more memory to your WebGL build in the WebGL player settings.":r.indexOf("Invalid array buffer length")==-1&&r.indexOf("Invalid typed array length")==-1&&r.indexOf("out of memory")==-1&&r.indexOf("could not allocate memory")==-1||(r="The browser could not allocate enough memory for the WebGL content. If you are the developer of this content, try allocating less memory to your WebGL build in the WebGL player settings."),alert(r),this.didShowErrorMessage=!0}},popup:function(e,t,r){r=r||[{text:"OK"}];var n=document.createElement("div");n.style.cssText="position: absolute; top: 50%; left: 50%; -webkit-transform: translate(-50%, -50%); transform: translate(-50%, -50%); text-align: center; border: 1px solid black; padding: 5px; background: #E8E8E8";var o=document.createElement("span");o.textContent=t,n.appendChild(o),n.appendChild(document.createElement("br"));for(var i=0;i=10.1)?1:0}(),hasThreads:"undefined"!=typeof SharedArrayBuffer,hasWasm:"object"==typeof WebAssembly&&"function"==typeof WebAssembly.validate&&"function"==typeof WebAssembly.compile,hasWasmThreads:function(){if("object"!=typeof WebAssembly)return!1;if("undefined"==typeof SharedArrayBuffer)return!1;var e=new WebAssembly.Memory({initial:1,maximum:1,shared:!0}),t=e.buffer instanceof SharedArrayBuffer;return delete e,t}()}}(),compatibilityCheck:function(e,t,r){UnityLoader.SystemInfo.hasWebGL?UnityLoader.SystemInfo.mobile?e.popup("Please note that Unity WebGL is not currently supported on mobiles. Press OK if you wish to continue anyway.",[{text:"OK",callback:t}]):["Edge","Firefox","Chrome","Safari"].indexOf(UnityLoader.SystemInfo.browser)==-1?e.popup("Please note that your browser is not currently supported for this Unity WebGL content. Press OK if you wish to continue anyway.",[{text:"OK",callback:t}]):t():e.popup("Your browser does not support WebGL",[{text:"OK",callback:r}])},buildCompatibilityCheck:function(e,t,r){function n(){if("undefined"==typeof e.graphicsAPI)return!0;for(var t=0;t=1)return!0;e.print("Warning: Unsupported graphics API "+r)}return!1}n()?!UnityLoader.SystemInfo.hasThreads&&e.multithreading?r("Your browser does not support multithreading."):t():r("Your browser does not support any of the required graphics API for this content.")},Blobs:{},loadCode:function(e,t,r,n){var o=[].slice.call(UnityLoader.Cryptography.md5(t)).map(function(e){return("0"+e.toString(16)).substr(-2)}).join(""),i=document.createElement("script"),a=(n.isModularized?function(e){return new Blob([e],{type:"application/javascript"})}:function(e,t){return new Blob(['UnityLoader["'+t+'"]=',e],{type:"text/javascript"})})(t,o),s=URL.createObjectURL(a);UnityLoader.Blobs[s]=n,e.deinitializers.push(function(){delete UnityLoader.Blobs[s],delete UnityLoader[o],document.body.removeChild(document.getElementById(o))}),i.src=s,i.id=o,i.onload=function(){e.developmentBuild||URL.revokeObjectURL(s),r(o,a),delete i.onload},document.body.appendChild(i)},setupIndexedDBJob:function(e,t){function r(n){r.called||(r.called=!0,e.indexedDB=n,t.complete())}try{var n=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB,o=n.open("/idbfs-test");o.onerror=function(e){e.preventDefault(),r()},o.onsuccess=function(){o.result.close(),r(n)}}catch(e){r()}},processWasmCodeJob:function(e,t){e.wasmBinary=UnityLoader.Job.result(e,"downloadWasmCode"),t.complete()},processWasmFrameworkJob:function(e,t){var r=UnityLoader.Job.result(e,"downloadWasmFramework");UnityLoader.loadCode(e,r,function(r,n){e.mainScriptUrlOrBlob=n,e.isModularized&&(UnityLoader[r]=UnityModule),UnityLoader[r](e),t.complete()},{Module:e,url:e.wasmFrameworkUrl,isModularized:e.isModularized})},processAsmCodeJob:function(e,t){var r=UnityLoader.Job.result(e,"downloadAsmCode");UnityLoader.loadCode(e,Math.fround?r:UnityLoader.Utils.optimizeMathFround(r),function(r,n){e.isModularized?e.asmJsUrlOrBlob=n:e.asm=UnityLoader[r],t.complete()},{Module:e,url:e.asmCodeUrl,isModularized:e.isModularized})},processAsmFrameworkJob:function(e,t){var r=UnityLoader.Job.result(e,"downloadAsmFramework");UnityLoader.loadCode(e,r,function(r,n){e.isModularized&&(e.mainScriptUrlOrBlob=n,UnityLoader[r]=UnityModule),UnityLoader[r](e),t.complete()},{Module:e,url:e.asmFrameworkUrl,isModularized:e.isModularized})},processMemoryInitializerJob:function(e,t){e.memoryInitializerRequest.status=200,e.memoryInitializerRequest.response=UnityLoader.Job.result(e,"downloadMemoryInitializer"),e.memoryInitializerRequest.callback&&e.memoryInitializerRequest.callback(),t.complete()},processDataJob:function(e,t){var r=UnityLoader.Job.result(e,"downloadData"),n=new DataView(r.buffer,r.byteOffset,r.byteLength),o=0,i="UnityWebData1.0\0";if(!String.fromCharCode.apply(null,r.subarray(o,o+i.length))==i)throw"unknown data format";o+=i.length;var a=n.getUint32(o,!0);for(o+=4;o0;c=f,f=u.indexOf("/",c)+1)e.FS_createPath(u.substring(0,c),u.substring(c,f-1),!0,!0);e.FS_createDataFile(u,null,r.subarray(s,s+d),!0,!0,!0)}e.removeRunDependency("processDataJob"),t.complete()},downloadJob:function(e,t){var r=t.parameters.objParameters?new UnityLoader.UnityCache.XMLHttpRequest(t.parameters.objParameters):new XMLHttpRequest;r.open("GET",t.parameters.url),r.responseType="arraybuffer",r.onload=function(){UnityLoader.Compression.decompress(new Uint8Array(r.response),function(e){t.complete(e)})},t.parameters.onprogress&&r.addEventListener("progress",t.parameters.onprogress),t.parameters.onload&&r.addEventListener("load",t.parameters.onload),r.send()},scheduleBuildDownloadJob:function(e,t,r){UnityLoader.Progress.update(e,t);var n=e.resolveBuildUrl(e[r]),o="function"==typeof e.cacheControl?e.cacheControl(n):e.cacheControl?e.cacheControl[r]||e.cacheControl.default:"no-cache";UnityLoader.Job.schedule(e,t,[],UnityLoader.downloadJob,{url:n,onprogress:function(r){UnityLoader.Progress.update(e,t,r)},onload:function(r){UnityLoader.Progress.update(e,t,r)},objParameters:e.companyName&&e.productName&&o&&"no-cache"!=o?{companyName:e.companyName,productName:e.productName,cacheControl:o}:null})},loadModule:function(e,t){if(e.useWasm=e.wasmCodeUrl&&UnityLoader.SystemInfo.hasWasm,e.useWasm){if(e.multithreading&&!UnityLoader.SystemInfo.hasWasmThreads)return void t("Your browser does not support WebAssembly Threads.");var r=["downloadWasmFramework","setupIndexedDB"];e.wasmCodeUrl.endsWith(".unityweb")&&(UnityLoader.scheduleBuildDownloadJob(e,"downloadWasmCode","wasmCodeUrl"),UnityLoader.Job.schedule(e,"processWasmCode",["downloadWasmCode"],UnityLoader.processWasmCodeJob),r.push("processWasmCode")),e.wasmMemoryUrl&&(UnityLoader.scheduleBuildDownloadJob(e,"downloadMemoryInitializer","wasmMemoryUrl"),UnityLoader.Job.schedule(e,"processMemoryInitializer",["downloadMemoryInitializer"],UnityLoader.processMemoryInitializerJob),e.memoryInitializerRequest={addEventListener:function(t,r){e.memoryInitializerRequest.callback=r}}),UnityLoader.scheduleBuildDownloadJob(e,"downloadWasmFramework","wasmFrameworkUrl"),UnityLoader.Job.schedule(e,"processWasmFramework",r,UnityLoader.processWasmFrameworkJob)}else{if(!e.asmCodeUrl)return void t("Your browser does not support WebAssembly.");UnityLoader.scheduleBuildDownloadJob(e,"downloadAsmCode","asmCodeUrl"),UnityLoader.Job.schedule(e,"processAsmCode",["downloadAsmCode"],UnityLoader.processAsmCodeJob),UnityLoader.scheduleBuildDownloadJob(e,"downloadMemoryInitializer","asmMemoryUrl"),UnityLoader.Job.schedule(e,"processMemoryInitializer",["downloadMemoryInitializer"],UnityLoader.processMemoryInitializerJob),e.memoryInitializerRequest={addEventListener:function(t,r){e.memoryInitializerRequest.callback=r}},e.asmLibraryUrl&&(e.dynamicLibraries=[e.asmLibraryUrl].map(e.resolveBuildUrl)),UnityLoader.scheduleBuildDownloadJob(e,"downloadAsmFramework","asmFrameworkUrl"),UnityLoader.Job.schedule(e,"processAsmFramework",["downloadAsmFramework","processAsmCode","setupIndexedDB"],UnityLoader.processAsmFrameworkJob)}UnityLoader.scheduleBuildDownloadJob(e,"downloadData","dataUrl"),UnityLoader.Job.schedule(e,"setupIndexedDB",[],UnityLoader.setupIndexedDBJob),e.preRun.push(function(){e.addRunDependency("processDataJob"),UnityLoader.Job.schedule(e,"processData",["downloadData"],UnityLoader.processDataJob)})},instantiate:function(e,t,r){function n(e,n){if("string"==typeof e&&!(e=document.getElementById(e)))return!1;e.innerHTML="",e.style.border=e.style.margin=e.style.padding=0,"static"==getComputedStyle(e).getPropertyValue("position")&&(e.style.position="relative"),e.style.width=n.width||e.style.width,e.style.height=n.height||e.style.height,n.container=e;var o=n.Module;o.canvas=document.createElement("canvas"),o.canvas.style.width="100%",o.canvas.style.height="100%",o.canvas.addEventListener("contextmenu",function(e){e.preventDefault()}),o.canvas.addEventListener("dragstart",function(e){e.preventDefault()}),o.canvas.id="#canvas",e.appendChild(o.canvas),o.deinitializers.push(function(){e.removeChild(o.canvas)});var i=!0;return n.compatibilityCheck(n,function(){var t=new XMLHttpRequest;t.open("GET",n.url,!0),t.responseType="text",t.onerror=function(){o.print("Could not download "+n.url),0==document.URL.indexOf("file:")&&alert("It seems your browser does not support running Unity WebGL content from file:// urls. Please upload it to an http server, or try a different browser.")},t.onload=function(){var a=JSON.parse(t.responseText);for(var s in a)"undefined"==typeof o[s]&&(o[s]=a[s]);if(o.unityVersion){var d=o.unityVersion.match(/(\d+)\.(\d+)\.(\d+)(.+)/);d&&(o.unityVersion={string:o.unityVersion,version:parseInt(d[0]),major:parseInt(d[1]),minor:parseInt(d[2]),suffix:d[3]})}o.isModularized=o.unityVersion&&o.unityVersion.version>=2019,UnityLoader.buildCompatibilityCheck(o,function(){e.style.background=o.backgroundUrl?"center/cover url('"+o.resolveBuildUrl(o.backgroundUrl)+"')":o.backgroundColor?" "+o.backgroundColor:"",n.onProgress(n,0),i=UnityLoader.loadModule(o,r.onerror)},r.onerror)},t.send()},function(){var e="Instantiation of '"+t+"' terminated due to the failed compatibility check.";"object"==typeof r&&"function"==typeof r.onerror?r.onerror(e):o.printErr(e)}),i}function o(e){return o.link=o.link||document.createElement("a"),o.link.href=e,o.link.href}"undefined"==typeof r&&(r={}),"undefined"==typeof r.onerror&&(r.onerror=function(e){i.popup(e,[{text:"OK"}])});var i={url:t,onProgress:UnityLoader.Progress.handler,compatibilityCheck:UnityLoader.compatibilityCheck,Module:{deinitializers:[],intervals:{},setInterval:function(e,t){var r=window.setInterval(e,t);return this.intervals[r]=!0,r},clearInterval:function(e){delete this.intervals[e],window.clearInterval(e)},onAbort:function(e){throw void 0!==e?(this.print(e),this.printErr(e),e=JSON.stringify(e)):e="","abort("+e+") at "+this.stackTrace()},preRun:[],postRun:[],print:function(e){console.log(e)},printErr:function(e){console.error(e)},Jobs:{},buildDownloadProgress:{},resolveBuildUrl:function(e){return e.match(/(http|https|ftp|file):\/\//)?e:t.substring(0,t.lastIndexOf("/")+1)+e},streamingAssetsUrl:function(){return o(this.resolveBuildUrl("../StreamingAssets"))},locateFile:function(e){return"Build/".concat("build.wasm"==e?this.wasmCodeUrl:e)}},SetFullscreen:function(){if(i.Module.SetFullscreen)return i.Module.SetFullscreen.apply(i.Module,arguments)},SendMessage:function(){if(i.Module.SendMessage)return i.Module.SendMessage.apply(i.Module,arguments)},Quit:function(e){"function"==typeof e&&(i.Module.onQuit=e),i.Module.shouldQuit=!0}};i.Module.unityInstance=i,i.popup=function(e,t){return UnityLoader.Error.popup(i,e,t)},i.Module.postRun.push(function(){i.onProgress(i,1),"object"==typeof r&&"function"==typeof r.onsuccess&&r.onsuccess(i.Module)});for(var a in r)if("Module"==a)for(var s in r[a])i.Module[s]=r[a][s];else i[a]=r[a];return n(e,i)||document.addEventListener("DOMContentLoaded",function(){n(e,i)}),i},instantiateAsync:function(e,t,r){return new Promise(function(n,o){const i=Object.assign({onsuccess:function(e){n(e)},onerror:function(e){o(e)}},r);UnityLoader.instantiate(e,t,i)})},Utils:{assert:function(e,t){e||abort("Assertion failed: "+t)},optimizeMathFround:function(e,t){console.log("optimizing out Math.fround calls");for(var r={LOOKING_FOR_MODULE:0,SCANNING_MODULE_VARIABLES:1,SCANNING_MODULE_FUNCTIONS:2},n=["EMSCRIPTEN_START_ASM","EMSCRIPTEN_START_FUNCS","EMSCRIPTEN_END_FUNCS"],o="var",i="global.Math.fround;",a=0,s=t?r.LOOKING_FOR_MODULE:r.SCANNING_MODULE_VARIABLES,d=0,l=0;s<=r.SCANNING_MODULE_FUNCTIONS&&a { 30 | // if no data then start local connection 31 | if (!doc.data() || doc.data().answer) { 32 | initLocalConnection(); 33 | } else { 34 | initRemoteConnection(); 35 | } 36 | }); 37 | } else { 38 | // reload page with channel 39 | window.location.search += `?${Math.floor(Math.random() * 9999)}`; 40 | } 41 | 42 | function initLocalConnection() { 43 | console.log("initializing local connection"); 44 | playerInfo.isLocal = true; 45 | const lc = new RTCPeerConnection(); 46 | const dc = lc.createDataChannel(channel); 47 | 48 | // local channel events 49 | dc.onopen = (e) => { 50 | // used in sendLocalPlayerInfo() 51 | localToRemote = dc; 52 | console.log("local is connected"); 53 | playerInfo.isConnected = true; 54 | firebase.firestore().collection("channels").doc(channel).delete(); 55 | }; 56 | dc.onmessage = (msg) => { 57 | console.log("recieving from remote to local: " + msg.data); 58 | playerInfo.remote = msg.data; 59 | }; 60 | dc.onclose = () => { 61 | playerInfo.isConnected = false; 62 | firebase.firestore().collection("channels").doc(channel).delete(); 63 | }; 64 | 65 | // create offer then set local 66 | lc.createOffer().then((offer) => lc.setLocalDescription(offer)); 67 | 68 | // save offer to firebase 69 | lc.onicecandidate = (e) => 70 | firebase 71 | .firestore() 72 | .collection("channels") 73 | .doc(channel) 74 | .set({ offer: JSON.stringify(lc.localDescription) }); 75 | 76 | // listen for remote to save answer 77 | firebase 78 | .firestore() 79 | .collection("channels") 80 | .doc(channel) 81 | .onSnapshot((doc) => { 82 | // if answer is empty, set answer 83 | if (doc.data() && doc.data().answer) { 84 | lc.setRemoteDescription(JSON.parse(doc.data().answer)); 85 | } 86 | }); 87 | } 88 | 89 | function initRemoteConnection() { 90 | console.log("initializing remote connection"); 91 | playerInfo.isLocal = false; 92 | const rc = new RTCPeerConnection(); 93 | 94 | // remote channel events 95 | rc.ondatachannel = (e) => { 96 | remoteToLocal = e.channel; 97 | e.channel.onopen = () => { 98 | playerInfo.isConnected = true; 99 | console.log("remote is connected"); 100 | }; 101 | e.channel.onmessage = (msg) => { 102 | console.log("recieving from local to remote: " + msg.data); 103 | playerInfo.local = msg.data; 104 | }; 105 | e.channel.onclose = () => { 106 | playerInfo.isConnected = false; 107 | firebase.firestore().collection("channels").doc(channel).delete(); 108 | }; 109 | }; 110 | 111 | // get saved offer from firebase 112 | firebase 113 | .firestore() 114 | .collection("channels") 115 | .doc(channel) 116 | .get() 117 | .then((doc) => JSON.parse(doc.data().offer)) 118 | .then((offer) => { 119 | // set remote 120 | rc.setRemoteDescription(offer); 121 | // create answer 122 | rc.createAnswer().then((answer) => { 123 | // set answer 124 | rc.setLocalDescription(answer); 125 | // save answer 126 | firebase 127 | .firestore() 128 | .collection("channels") 129 | .doc(channel) 130 | .update({ answer: JSON.stringify(answer) }); 131 | }); 132 | }); 133 | } 134 | 135 | // from unity jslib 136 | function isPlayerConnected() { 137 | return playerInfo.isConnected; 138 | } 139 | 140 | // from unity jslib 141 | function isPlayerLocal() { 142 | return playerInfo.isLocal; 143 | } 144 | 145 | // from unity jslib 146 | function getLocalPlayerInfo() { 147 | return playerInfo.local; 148 | } 149 | 150 | // from unity jslib 151 | function getRemotePlayerInfo() { 152 | return playerInfo.remote; 153 | } 154 | 155 | // from unity jslib 156 | function sendLocalToRemote(playerInfo) { 157 | if (isPlayerConnected()) { 158 | console.log("sending from local to remote: " + playerInfo); 159 | localToRemote.send(playerInfo); 160 | } 161 | } 162 | 163 | // from unity jslib 164 | function sendRemoteToLocal(playerInfo) { 165 | if (isPlayerConnected()) { 166 | console.log("sending from remote to local: " + playerInfo); 167 | remoteToLocal.send(playerInfo); 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /webgl/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 17 | 18 | 19 |
20 |
21 | 26 |
27 | 28 | 29 | -------------------------------------------------------------------------------- /webrtc.unitypackage: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/underscoredLabs/unity-webrtc/75ab2a356628fccd0dbc4f446943240324e2f454/webrtc.unitypackage --------------------------------------------------------------------------------