@needle-tools/engine 4.4.0-beta → 4.4.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/CHANGELOG.md +65 -2
  2. package/dist/assets/generateMeshBVH.worker-b7788939.js +25 -0
  3. package/dist/needle-engine.bundle.js +6808 -6645
  4. package/dist/needle-engine.bundle.light.js +7071 -6908
  5. package/dist/needle-engine.bundle.light.min.js +169 -139
  6. package/dist/needle-engine.bundle.light.umd.cjs +173 -143
  7. package/dist/needle-engine.bundle.min.js +169 -139
  8. package/dist/needle-engine.bundle.umd.cjs +172 -142
  9. package/dist/needle-engine.d.ts +0 -9
  10. package/dist/needle-engine.js +468 -467
  11. package/dist/needle-engine.light.d.ts +0 -9
  12. package/dist/needle-engine.light.js +468 -467
  13. package/dist/needle-engine.light.min.js +1 -1
  14. package/dist/needle-engine.light.umd.cjs +1 -1
  15. package/dist/needle-engine.min.js +1 -1
  16. package/dist/needle-engine.umd.cjs +1 -1
  17. package/dist/postprocessing.js +1673 -1527
  18. package/dist/postprocessing.light.js +1673 -1527
  19. package/dist/postprocessing.light.min.js +80 -66
  20. package/dist/postprocessing.light.umd.cjs +83 -69
  21. package/dist/postprocessing.min.js +80 -66
  22. package/dist/postprocessing.umd.cjs +83 -69
  23. package/dist/vendor.js +5109 -5123
  24. package/dist/vendor.light.js +5109 -5123
  25. package/dist/vendor.light.min.js +84 -84
  26. package/dist/vendor.light.umd.cjs +78 -78
  27. package/dist/vendor.min.js +84 -84
  28. package/dist/vendor.umd.cjs +78 -78
  29. package/lib/engine/codegen/register_types.js +2 -0
  30. package/lib/engine/codegen/register_types.js.map +1 -1
  31. package/lib/engine/engine_addressables.js.map +1 -1
  32. package/lib/engine/engine_components.js +3 -1
  33. package/lib/engine/engine_components.js.map +1 -1
  34. package/lib/engine/engine_context.d.ts +10 -1
  35. package/lib/engine/engine_context.js +33 -12
  36. package/lib/engine/engine_context.js.map +1 -1
  37. package/lib/engine/engine_element.js +12 -10
  38. package/lib/engine/engine_element.js.map +1 -1
  39. package/lib/engine/engine_gameobject.js +5 -0
  40. package/lib/engine/engine_gameobject.js.map +1 -1
  41. package/lib/engine/engine_license.d.ts +2 -0
  42. package/lib/engine/engine_license.js +103 -62
  43. package/lib/engine/engine_license.js.map +1 -1
  44. package/lib/engine/engine_networking_blob.js +40 -24
  45. package/lib/engine/engine_networking_blob.js.map +1 -1
  46. package/lib/engine/engine_physics_rapier.js +10 -9
  47. package/lib/engine/engine_physics_rapier.js.map +1 -1
  48. package/lib/engine/engine_serialization_core.js +6 -2
  49. package/lib/engine/engine_serialization_core.js.map +1 -1
  50. package/lib/engine/engine_utils_screenshot.js +1 -1
  51. package/lib/engine/engine_utils_screenshot.js.map +1 -1
  52. package/lib/engine/js-extensions/RGBAColor.d.ts +1 -0
  53. package/lib/engine/js-extensions/RGBAColor.js +48 -0
  54. package/lib/engine/js-extensions/RGBAColor.js.map +1 -1
  55. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +4 -3
  56. package/lib/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js.map +1 -1
  57. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +6 -6
  58. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  59. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +4 -0
  60. package/lib/engine/webcomponents/needle menu/needle-menu.js +13 -2
  61. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  62. package/lib/engine/xr/NeedleXRController.js +2 -3
  63. package/lib/engine/xr/NeedleXRController.js.map +1 -1
  64. package/lib/engine/xr/NeedleXRSession.js +12 -12
  65. package/lib/engine/xr/NeedleXRSession.js.map +1 -1
  66. package/lib/engine-components/AudioSource.js +7 -0
  67. package/lib/engine-components/AudioSource.js.map +1 -1
  68. package/lib/engine-components/Camera.js +18 -12
  69. package/lib/engine-components/Camera.js.map +1 -1
  70. package/lib/engine-components/CameraUtils.js +8 -14
  71. package/lib/engine-components/CameraUtils.js.map +1 -1
  72. package/lib/engine-components/GroundProjection.js +1 -1
  73. package/lib/engine-components/GroundProjection.js.map +1 -1
  74. package/lib/engine-components/NeedleMenu.js +1 -1
  75. package/lib/engine-components/NeedleMenu.js.map +1 -1
  76. package/lib/engine-components/OrbitControls.js +3 -1
  77. package/lib/engine-components/OrbitControls.js.map +1 -1
  78. package/lib/engine-components/ReflectionProbe.d.ts +1 -0
  79. package/lib/engine-components/ReflectionProbe.js +16 -9
  80. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  81. package/lib/engine-components/SceneSwitcher.js +28 -7
  82. package/lib/engine-components/SceneSwitcher.js.map +1 -1
  83. package/lib/engine-components/SyncedTransform.d.ts +6 -0
  84. package/lib/engine-components/SyncedTransform.js +10 -5
  85. package/lib/engine-components/SyncedTransform.js.map +1 -1
  86. package/lib/engine-components/codegen/components.d.ts +1 -0
  87. package/lib/engine-components/codegen/components.js +1 -0
  88. package/lib/engine-components/codegen/components.js.map +1 -1
  89. package/lib/engine-components/export/usdz/extensions/USDZUI.js +2 -1
  90. package/lib/engine-components/export/usdz/extensions/USDZUI.js.map +1 -1
  91. package/lib/engine-components/ui/BaseUIComponent.d.ts +0 -1
  92. package/lib/engine-components/ui/BaseUIComponent.js +1 -1
  93. package/lib/engine-components/ui/BaseUIComponent.js.map +1 -1
  94. package/lib/engine-components/ui/EventSystem.js +1 -1
  95. package/lib/engine-components/ui/EventSystem.js.map +1 -1
  96. package/lib/engine-components/ui/Graphic.js +1 -0
  97. package/lib/engine-components/ui/Graphic.js.map +1 -1
  98. package/lib/engine-components/ui/RaycastUtils.js +1 -1
  99. package/lib/engine-components/ui/RaycastUtils.js.map +1 -1
  100. package/lib/engine-components/ui/RectTransform.d.ts +2 -2
  101. package/lib/engine-components/ui/RectTransform.js +9 -6
  102. package/lib/engine-components/ui/RectTransform.js.map +1 -1
  103. package/lib/engine-components/ui/Symbols.d.ts +1 -0
  104. package/lib/engine-components/ui/Symbols.js +2 -0
  105. package/lib/engine-components/ui/Symbols.js.map +1 -0
  106. package/lib/engine-components/ui/Utils.js +1 -1
  107. package/lib/engine-components/ui/Utils.js.map +1 -1
  108. package/lib/engine-components/utils/EnvironmentScene.d.ts +1 -1
  109. package/lib/engine-components/utils/EnvironmentScene.js +1 -1
  110. package/lib/engine-components/utils/EnvironmentScene.js.map +1 -1
  111. package/package.json +3 -3
  112. package/plugins/common/buildinfo.js +1 -0
  113. package/plugins/common/cloud.js +2 -0
  114. package/plugins/common/license.js +174 -33
  115. package/plugins/types/userconfig.d.ts +5 -0
  116. package/plugins/vite/build-pipeline.js +4 -3
  117. package/plugins/vite/dependencies.js +17 -7
  118. package/plugins/vite/facebook-instant-games.js +7 -4
  119. package/plugins/vite/index.js +1 -1
  120. package/src/engine/codegen/register_types.ts +2 -0
  121. package/src/engine/engine_addressables.ts +3 -2
  122. package/src/engine/engine_components.ts +2 -1
  123. package/src/engine/engine_context.ts +36 -12
  124. package/src/engine/engine_element.ts +10 -9
  125. package/src/engine/engine_gameobject.ts +7 -0
  126. package/src/engine/engine_license.ts +116 -67
  127. package/src/engine/engine_networking_blob.ts +47 -26
  128. package/src/engine/engine_physics_rapier.ts +10 -12
  129. package/src/engine/engine_serialization_core.ts +6 -1
  130. package/src/engine/engine_utils_screenshot.ts +1 -1
  131. package/src/engine/js-extensions/RGBAColor.ts +50 -0
  132. package/src/engine/physics/workers/mesh-bvh/GenerateMeshBVHWorker.js +6 -6
  133. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +6 -6
  134. package/src/engine/webcomponents/needle menu/needle-menu.ts +13 -2
  135. package/src/engine/xr/NeedleXRController.ts +2 -3
  136. package/src/engine/xr/NeedleXRSession.ts +12 -12
  137. package/src/engine-components/AudioSource.ts +8 -3
  138. package/src/engine-components/Camera.ts +34 -22
  139. package/src/engine-components/CameraUtils.ts +8 -16
  140. package/src/engine-components/GroundProjection.ts +1 -1
  141. package/src/engine-components/NeedleMenu.ts +1 -1
  142. package/src/engine-components/OrbitControls.ts +2 -1
  143. package/src/engine-components/ReflectionProbe.ts +15 -8
  144. package/src/engine-components/SceneSwitcher.ts +28 -11
  145. package/src/engine-components/SyncedTransform.ts +11 -6
  146. package/src/engine-components/codegen/components.ts +1 -0
  147. package/src/engine-components/export/usdz/extensions/USDZUI.ts +2 -2
  148. package/src/engine-components/ui/BaseUIComponent.ts +1 -1
  149. package/src/engine-components/ui/EventSystem.ts +1 -1
  150. package/src/engine-components/ui/Graphic.ts +1 -1
  151. package/src/engine-components/ui/RaycastUtils.ts +1 -1
  152. package/src/engine-components/ui/RectTransform.ts +10 -7
  153. package/src/engine-components/ui/Symbols.ts +2 -0
  154. package/src/engine-components/ui/Utils.ts +2 -1
  155. package/src/engine-components/utils/EnvironmentScene.ts +1 -1
@@ -1,86 +1,86 @@
1
- import{PlaneGeometry as Jo,ShaderChunk as Rl,Triangle as we,Vector3 as K,Layers as xn,MeshBasicMaterial as xs,DoubleSide as Ss,AdditiveBlending as Uo,Object3D as fs,InstancedBufferAttribute as Yt,DynamicDrawUsage as Ve,InstancedBufferGeometry as Ll,Uniform$1 as Fe,ShaderMaterial as Ws,BufferGeometry as Ot,BufferAttribute as be,Mesh as Sn,MeshStandardMaterial as xl,MeshPhysicalMaterial as Sl,Vector2 as De,Plane as Po,Line3 as rt,Sphere as wo,Matrix4 as Te,Box3 as fe,REVISION as Fo,BackSide as fl,FrontSide as Qo,Group as Wl,LineBasicMaterial as gl,BatchedMesh as Cl,Ray as zl,DataTexture as gs,NearestFilter as Dt,UnsignedIntType as yi,IntType as fn,FloatType as Gi,UnsignedByteType as Bo,UnsignedShortType as vl,ByteType as Eo,ShortType as Kl,RGBAFormat as Wn,RGBAIntegerFormat as Cs,RGFormat as Ml,RedFormat as Tl,RGIntegerFormat as jo,RedIntegerFormat as Yl,Matrix3 as Hl,Vector4 as zs}from"./three.min.js";const se={Handedness:Object.freeze({NONE:"none",LEFT:"left",RIGHT:"right"}),ComponentState:Object.freeze({DEFAULT:"default",TOUCHED:"touched",PRESSED:"pressed"}),ComponentProperty:Object.freeze({BUTTON:"button",X_AXIS:"xAxis",Y_AXIS:"yAxis",STATE:"state"}),ComponentType:Object.freeze({TRIGGER:"trigger",SQUEEZE:"squeeze",TOUCHPAD:"touchpad",THUMBSTICK:"thumbstick",BUTTON:"button"}),ButtonTouchThreshold:.05,AxisTouchThreshold:.1,VisualResponseProperty:Object.freeze({TRANSFORM:"transform",VISIBILITY:"visibility"})};async function Oo(n){const e=await fetch(n);if(e.ok)return e.json();throw new Error(e.statusText)}async function kl(n){if(!n)throw new Error("No basePath supplied");return await Oo(`${n}/profilesList.json`)}async function Nl(n,e,t=null,i=!0){if(!n)throw new Error("No xrInputSource supplied");if(!e)throw new Error("No basePath supplied");const s=await kl(e);let o;if(n.profiles.some(r=>{const l=s[r];return l&&(o={profileId:r,profilePath:`${e}/${l.path}`,deprecated:!!l.deprecated}),!!o}),!o){if(!t)throw new Error("No matching profile name found");const r=s[t];if(!r)throw new Error(`No matching profile name found and default profile "${t}" missing.`);o={profileId:t,profilePath:`${e}/${r.path}`,deprecated:!!r.deprecated}}const a=await Oo(o.profilePath);let c;if(i){let r;if(n.handedness==="any"?r=a.layouts[Object.keys(a.layouts)[0]]:r=a.layouts[n.handedness],!r)throw new Error(`No matching handedness, ${n.handedness}, in profile ${o.profileId}`);r.assetPath&&(c=o.profilePath.replace("profile.json",r.assetPath))}return{profile:a,assetPath:c}}const Il={xAxis:0,yAxis:0,button:0,state:se.ComponentState.DEFAULT};function Jl(n=0,e=0){let t=n,i=e;if(Math.sqrt(n*n+e*e)>1){const s=Math.atan2(e,n);t=Math.cos(s),i=Math.sin(s)}return{normalizedXAxis:t*.5+.5,normalizedYAxis:i*.5+.5}}class Ul{constructor(e){this.componentProperty=e.componentProperty,this.states=e.states,this.valueNodeName=e.valueNodeName,this.valueNodeProperty=e.valueNodeProperty,this.valueNodeProperty===se.VisualResponseProperty.TRANSFORM&&(this.minNodeName=e.minNodeName,this.maxNodeName=e.maxNodeName),this.value=0,this.updateFromComponent(Il)}updateFromComponent({xAxis:e,yAxis:t,button:i,state:s}){const{normalizedXAxis:o,normalizedYAxis:a}=Jl(e,t);switch(this.componentProperty){case se.ComponentProperty.X_AXIS:this.value=this.states.includes(s)?o:.5;break;case se.ComponentProperty.Y_AXIS:this.value=this.states.includes(s)?a:.5;break;case se.ComponentProperty.BUTTON:this.value=this.states.includes(s)?i:0;break;case se.ComponentProperty.STATE:this.valueNodeProperty===se.VisualResponseProperty.VISIBILITY?this.value=this.states.includes(s):this.value=this.states.includes(s)?1:0;break;default:throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`)}}}class Pl{constructor(e,t){if(!e||!t||!t.visualResponses||!t.gamepadIndices||Object.keys(t.gamepadIndices).length===0)throw new Error("Invalid arguments supplied");this.id=e,this.type=t.type,this.rootNodeName=t.rootNodeName,this.touchPointNodeName=t.touchPointNodeName,this.visualResponses={},Object.keys(t.visualResponses).forEach(i=>{const s=new Ul(t.visualResponses[i]);this.visualResponses[i]=s}),this.gamepadIndices=Object.assign({},t.gamepadIndices),this.values={state:se.ComponentState.DEFAULT,button:this.gamepadIndices.button!==void 0?0:void 0,xAxis:this.gamepadIndices.xAxis!==void 0?0:void 0,yAxis:this.gamepadIndices.yAxis!==void 0?0:void 0}}get data(){return{id:this.id,...this.values}}updateFromGamepad(e){if(this.values.state=se.ComponentState.DEFAULT,this.gamepadIndices.button!==void 0&&e.buttons.length>this.gamepadIndices.button){const t=e.buttons[this.gamepadIndices.button];this.values.button=t.value,this.values.button=this.values.button<0?0:this.values.button,this.values.button=this.values.button>1?1:this.values.button,t.pressed||this.values.button===1?this.values.state=se.ComponentState.PRESSED:(t.touched||this.values.button>se.ButtonTouchThreshold)&&(this.values.state=se.ComponentState.TOUCHED)}this.gamepadIndices.xAxis!==void 0&&e.axes.length>this.gamepadIndices.xAxis&&(this.values.xAxis=e.axes[this.gamepadIndices.xAxis],this.values.xAxis=this.values.xAxis<-1?-1:this.values.xAxis,this.values.xAxis=this.values.xAxis>1?1:this.values.xAxis,this.values.state===se.ComponentState.DEFAULT&&Math.abs(this.values.xAxis)>se.AxisTouchThreshold&&(this.values.state=se.ComponentState.TOUCHED)),this.gamepadIndices.yAxis!==void 0&&e.axes.length>this.gamepadIndices.yAxis&&(this.values.yAxis=e.axes[this.gamepadIndices.yAxis],this.values.yAxis=this.values.yAxis<-1?-1:this.values.yAxis,this.values.yAxis=this.values.yAxis>1?1:this.values.yAxis,this.values.state===se.ComponentState.DEFAULT&&Math.abs(this.values.yAxis)>se.AxisTouchThreshold&&(this.values.state=se.ComponentState.TOUCHED)),Object.values(this.visualResponses).forEach(t=>{t.updateFromComponent(this.values)})}}class wl{constructor(e,t,i){if(!e)throw new Error("No xrInputSource supplied");if(!t)throw new Error("No profile supplied");this.xrInputSource=e,this.assetUrl=i,this.id=t.profileId,this.layoutDescription=t.layouts[e.handedness],this.components={},Object.keys(this.layoutDescription.components).forEach(s=>{const o=this.layoutDescription.components[s];this.components[s]=new Pl(s,o)}),this.updateFromGamepad()}get gripSpace(){return this.xrInputSource.gripSpace}get targetRaySpace(){return this.xrInputSource.targetRaySpace}get data(){const e=[];return Object.values(this.components).forEach(t=>{e.push(t.data)}),e}updateFromGamepad(){Object.values(this.components).forEach(e=>{e.updateFromGamepad(this.xrInputSource.gamepad)})}}const vs=2,_e=4,lt=4,Do=4,bt=new Int32Array(2),_o=new Float32Array(bt.buffer),Ao=new Float64Array(bt.buffer),gn=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;class pt{constructor(e,t){this.low=e|0,this.high=t|0}static create(e,t){return e==0&&t==0?pt.ZERO:new pt(e,t)}toFloat64(){return(this.low>>>0)+this.high*4294967296}equals(e){return this.low==e.low&&this.high==e.high}}pt.ZERO=new pt(0,0);var Ks;(function(n){n[n.UTF8_BYTES=1]="UTF8_BYTES",n[n.UTF16_STRING=2]="UTF16_STRING"})(Ks||(Ks={}));class Bi{constructor(e){this.bytes_=e,this.position_=0}static allocate(e){return new Bi(new Uint8Array(e))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(e){this.position_=e}capacity(){return this.bytes_.length}readInt8(e){return this.readUint8(e)<<24>>24}readUint8(e){return this.bytes_[e]}readInt16(e){return this.readUint16(e)<<16>>16}readUint16(e){return this.bytes_[e]|this.bytes_[e+1]<<8}readInt32(e){return this.bytes_[e]|this.bytes_[e+1]<<8|this.bytes_[e+2]<<16|this.bytes_[e+3]<<24}readUint32(e){return this.readInt32(e)>>>0}readInt64(e){return new pt(this.readInt32(e),this.readInt32(e+4))}readUint64(e){return new pt(this.readUint32(e),this.readUint32(e+4))}readFloat32(e){return bt[0]=this.readInt32(e),_o[0]}readFloat64(e){return bt[gn?0:1]=this.readInt32(e),bt[gn?1:0]=this.readInt32(e+4),Ao[0]}writeInt8(e,t){this.bytes_[e]=t}writeUint8(e,t){this.bytes_[e]=t}writeInt16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeUint16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeInt32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeUint32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeInt64(e,t){this.writeInt32(e,t.low),this.writeInt32(e+4,t.high)}writeUint64(e,t){this.writeUint32(e,t.low),this.writeUint32(e+4,t.high)}writeFloat32(e,t){_o[0]=t,this.writeInt32(e,bt[0])}writeFloat64(e,t){Ao[0]=t,this.writeInt32(e,bt[gn?0:1]),this.writeInt32(e+4,bt[gn?1:0])}getBufferIdentifier(){if(this.bytes_.length<this.position_+_e+lt)throw new Error("FlatBuffers: ByteBuffer is too short to contain an identifier.");let e="";for(let t=0;t<lt;t++)e+=String.fromCharCode(this.readInt8(this.position_+_e+t));return e}__offset(e,t){const i=e-this.readInt32(e);return t<this.readInt16(i)?this.readInt16(i+t):0}__union(e,t){return e.bb_pos=t+this.readInt32(t),e.bb=this,e}__string(e,t){e+=this.readInt32(e);const i=this.readInt32(e);let s="",o=0;if(e+=_e,t===Ks.UTF8_BYTES)return this.bytes_.subarray(e,e+i);for(;o<i;){let a;const c=this.readUint8(e+o++);if(c<192)a=c;else{const r=this.readUint8(e+o++);if(c<224)a=(c&31)<<6|r&63;else{const l=this.readUint8(e+o++);if(c<240)a=(c&15)<<12|(r&63)<<6|l&63;else{const d=this.readUint8(e+o++);a=(c&7)<<18|(r&63)<<12|(l&63)<<6|d&63}}}a<65536?s+=String.fromCharCode(a):(a-=65536,s+=String.fromCharCode((a>>10)+55296,(a&1024-1)+56320))}return s}__union_with_string(e,t){return typeof e=="string"?this.__string(t):this.__union(e,t)}__indirect(e){return e+this.readInt32(e)}__vector(e){return e+this.readInt32(e)+_e}__vector_len(e){return this.readInt32(e+this.readInt32(e))}__has_identifier(e){if(e.length!=lt)throw new Error("FlatBuffers: file identifier must be length "+lt);for(let t=0;t<lt;t++)if(e.charCodeAt(t)!=this.readInt8(this.position()+_e+t))return!1;return!0}createLong(e,t){return pt.create(e,t)}createScalarList(e,t){const i=[];for(let s=0;s<t;++s)e(s)!==null&&i.push(e(s));return i}createObjList(e,t){const i=[];for(let s=0;s<t;++s){const o=e(s);o!==null&&i.push(o.unpack())}return i}}class ko{constructor(e){this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null;let t;e?t=e:t=1024,this.bb=Bi.allocate(t),this.space=t}clear(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null}forceDefaults(e){this.force_defaults=e}dataBuffer(){return this.bb}asUint8Array(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())}prep(e,t){e>this.minalign&&(this.minalign=e);const i=~(this.bb.capacity()-this.space+t)+1&e-1;for(;this.space<i+e+t;){const s=this.bb.capacity();this.bb=ko.growByteBuffer(this.bb),this.space+=this.bb.capacity()-s}this.pad(i)}pad(e){for(let t=0;t<e;t++)this.bb.writeInt8(--this.space,0)}writeInt8(e){this.bb.writeInt8(this.space-=1,e)}writeInt16(e){this.bb.writeInt16(this.space-=2,e)}writeInt32(e){this.bb.writeInt32(this.space-=4,e)}writeInt64(e){this.bb.writeInt64(this.space-=8,e)}writeFloat32(e){this.bb.writeFloat32(this.space-=4,e)}writeFloat64(e){this.bb.writeFloat64(this.space-=8,e)}addInt8(e){this.prep(1,0),this.writeInt8(e)}addInt16(e){this.prep(2,0),this.writeInt16(e)}addInt32(e){this.prep(4,0),this.writeInt32(e)}addInt64(e){this.prep(8,0),this.writeInt64(e)}addFloat32(e){this.prep(4,0),this.writeFloat32(e)}addFloat64(e){this.prep(8,0),this.writeFloat64(e)}addFieldInt8(e,t,i){(this.force_defaults||t!=i)&&(this.addInt8(t),this.slot(e))}addFieldInt16(e,t,i){(this.force_defaults||t!=i)&&(this.addInt16(t),this.slot(e))}addFieldInt32(e,t,i){(this.force_defaults||t!=i)&&(this.addInt32(t),this.slot(e))}addFieldInt64(e,t,i){(this.force_defaults||!t.equals(i))&&(this.addInt64(t),this.slot(e))}addFieldFloat32(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat32(t),this.slot(e))}addFieldFloat64(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat64(t),this.slot(e))}addFieldOffset(e,t,i){(this.force_defaults||t!=i)&&(this.addOffset(t),this.slot(e))}addFieldStruct(e,t,i){t!=i&&(this.nested(t),this.slot(e))}nested(e){if(e!=this.offset())throw new Error("FlatBuffers: struct must be serialized inline.")}notNested(){if(this.isNested)throw new Error("FlatBuffers: object serialization must not be nested.")}slot(e){this.vtable!==null&&(this.vtable[e]=this.offset())}offset(){return this.bb.capacity()-this.space}static growByteBuffer(e){const t=e.capacity();if(t&3221225472)throw new Error("FlatBuffers: cannot grow buffer beyond 2 gigabytes.");const i=t<<1,s=Bi.allocate(i);return s.setPosition(i-t),s.bytes().set(e.bytes(),i-t),s}addOffset(e){this.prep(_e,0),this.writeInt32(this.offset()-e+_e)}startObject(e){this.notNested(),this.vtable==null&&(this.vtable=[]),this.vtable_in_use=e;for(let t=0;t<e;t++)this.vtable[t]=0;this.isNested=!0,this.object_start=this.offset()}endObject(){if(this.vtable==null||!this.isNested)throw new Error("FlatBuffers: endObject called without startObject");this.addInt32(0);const e=this.offset();let t=this.vtable_in_use-1;for(;t>=0&&this.vtable[t]==0;t--);const i=t+1;for(;t>=0;t--)this.addInt16(this.vtable[t]!=0?e-this.vtable[t]:0);const s=2;this.addInt16(e-this.object_start);const o=(i+s)*vs;this.addInt16(o);let a=0;const c=this.space;e:for(t=0;t<this.vtables.length;t++){const r=this.bb.capacity()-this.vtables[t];if(o==this.bb.readInt16(r)){for(let l=vs;l<o;l+=vs)if(this.bb.readInt16(c+l)!=this.bb.readInt16(r+l))continue e;a=this.vtables[t];break}}return a?(this.space=this.bb.capacity()-e,this.bb.writeInt32(this.space,a-e)):(this.vtables.push(this.offset()),this.bb.writeInt32(this.bb.capacity()-e,this.offset()-e)),this.isNested=!1,e}finish(e,t,i){const s=i?Do:0;if(t){const o=t;if(this.prep(this.minalign,_e+lt+s),o.length!=lt)throw new Error("FlatBuffers: file identifier must be length "+lt);for(let a=lt-1;a>=0;a--)this.writeInt8(o.charCodeAt(a))}this.prep(this.minalign,_e+s),this.addOffset(e),s&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(e,t){this.finish(e,t,!0)}requiredField(e,t){const i=this.bb.capacity()-e,s=i-this.bb.readInt32(i);if(this.bb.readInt16(s+t)==0)throw new Error("FlatBuffers: field "+t+" must be set")}startVector(e,t,i){this.notNested(),this.vector_num_elems=t,this.prep(_e,e*t),this.prep(i,e*t)}endVector(){return this.writeInt32(this.vector_num_elems),this.offset()}createSharedString(e){if(!e)return 0;if(this.string_maps||(this.string_maps=new Map),this.string_maps.has(e))return this.string_maps.get(e);const t=this.createString(e);return this.string_maps.set(e,t),t}createString(e){if(!e)return 0;let t;if(e instanceof Uint8Array)t=e;else{t=[];let i=0;for(;i<e.length;){let s;const o=e.charCodeAt(i++);if(o<55296||o>=56320)s=o;else{const a=e.charCodeAt(i++);s=(o<<10)+a+(65536-56623104-56320)}s<128?t.push(s):(s<2048?t.push(s>>6&31|192):(s<65536?t.push(s>>12&15|224):t.push(s>>18&7|240,s>>12&63|128),t.push(s>>6&63|128)),t.push(s&63|128))}}this.addInt8(0),this.startVector(1,t.length,1),this.bb.setPosition(this.space-=t.length);for(let i=0,s=this.space,o=this.bb.bytes();i<t.length;i++)o[s++]=t[i];return this.endVector()}createLong(e,t){return pt.create(e,t)}createObjectOffset(e){return e===null?0:typeof e=="string"?this.createString(e):e.pack(this)}createObjectOffsetList(e){const t=[];for(let i=0;i<e.length;++i){const s=e[i];if(s!==null)t.push(this.createObjectOffset(s));else throw new Error("FlatBuffers: Argument for createObjectOffsetList cannot contain null.")}return t}createStructOffsetList(e,t){return t(this,e.length),this.createObjectOffsetList(e),this.endVector()}}function Cn(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var qo={exports:{}};(function(n){var e={};e.useBlobBuilder=function(){try{return new Blob([]),!1}catch{return!0}}(),e.useArrayBufferView=!e.useBlobBuilder&&function(){try{return new Blob([new Uint8Array([])]).size===0}catch{return!0}}(),n.exports.binaryFeatures=e;var t=n.exports.BlobBuilder;typeof window<"u"&&(t=n.exports.BlobBuilder=window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder||window.BlobBuilder);function i(){this._pieces=[],this._parts=[]}i.prototype.append=function(s){typeof s=="number"?this._pieces.push(s):(this.flush(),this._parts.push(s))},i.prototype.flush=function(){if(this._pieces.length>0){var s=new Uint8Array(this._pieces);e.useArrayBufferView||(s=s.buffer),this._parts.push(s),this._pieces=[]}},i.prototype.getBuffer=function(){if(this.flush(),e.useBlobBuilder){for(var s=new t,o=0,a=this._parts.length;o<a;o++)s.append(this._parts[o]);return s.getBlob()}else return new Blob(this._parts)},n.exports.BufferBuilder=i})(qo);var $o=qo.exports,Fl=$o.BufferBuilder,ea=$o.binaryFeatures,Ql={unpack:function(n){var e=new re(n);return e.unpack()},pack:function(n){var e=new le;e.pack(n);var t=e.getBuffer();return t}},Bl=Ql;function re(n){this.index=0,this.dataBuffer=n,this.dataView=new Uint8Array(this.dataBuffer),this.length=this.dataBuffer.byteLength}re.prototype.unpack=function(){var n=this.unpack_uint8();if(n<128)return n;if((n^224)<32)return(n^224)-32;var e;if((e=n^160)<=15)return this.unpack_raw(e);if((e=n^176)<=15)return this.unpack_string(e);if((e=n^144)<=15)return this.unpack_array(e);if((e=n^128)<=15)return this.unpack_map(e);switch(n){case 192:return null;case 193:return;case 194:return!1;case 195:return!0;case 202:return this.unpack_float();case 203:return this.unpack_double();case 204:return this.unpack_uint8();case 205:return this.unpack_uint16();case 206:return this.unpack_uint32();case 207:return this.unpack_uint64();case 208:return this.unpack_int8();case 209:return this.unpack_int16();case 210:return this.unpack_int32();case 211:return this.unpack_int64();case 212:return;case 213:return;case 214:return;case 215:return;case 216:return e=this.unpack_uint16(),this.unpack_string(e);case 217:return e=this.unpack_uint32(),this.unpack_string(e);case 218:return e=this.unpack_uint16(),this.unpack_raw(e);case 219:return e=this.unpack_uint32(),this.unpack_raw(e);case 220:return e=this.unpack_uint16(),this.unpack_array(e);case 221:return e=this.unpack_uint32(),this.unpack_array(e);case 222:return e=this.unpack_uint16(),this.unpack_map(e);case 223:return e=this.unpack_uint32(),this.unpack_map(e)}},re.prototype.unpack_uint8=function(){var n=this.dataView[this.index]&255;return this.index++,n},re.prototype.unpack_uint16=function(){var n=this.read(2),e=(n[0]&255)*256+(n[1]&255);return this.index+=2,e},re.prototype.unpack_uint32=function(){var n=this.read(4),e=((n[0]*256+n[1])*256+n[2])*256+n[3];return this.index+=4,e},re.prototype.unpack_uint64=function(){var n=this.read(8),e=((((((n[0]*256+n[1])*256+n[2])*256+n[3])*256+n[4])*256+n[5])*256+n[6])*256+n[7];return this.index+=8,e},re.prototype.unpack_int8=function(){var n=this.unpack_uint8();return n<128?n:n-256},re.prototype.unpack_int16=function(){var n=this.unpack_uint16();return n<32768?n:n-65536},re.prototype.unpack_int32=function(){var n=this.unpack_uint32();return n<Math.pow(2,31)?n:n-Math.pow(2,32)},re.prototype.unpack_int64=function(){var n=this.unpack_uint64();return n<Math.pow(2,63)?n:n-Math.pow(2,64)},re.prototype.unpack_raw=function(n){if(this.length<this.index+n)throw new Error("BinaryPackFailure: index is out of range "+this.index+" "+n+" "+this.length);var e=this.dataBuffer.slice(this.index,this.index+n);return this.index+=n,e},re.prototype.unpack_string=function(n){for(var e=this.read(n),t=0,i="",s,o;t<n;)s=e[t],s<128?(i+=String.fromCharCode(s),t++):(s^192)<32?(o=(s^192)<<6|e[t+1]&63,i+=String.fromCharCode(o),t+=2):(o=(s&15)<<12|(e[t+1]&63)<<6|e[t+2]&63,i+=String.fromCharCode(o),t+=3);return this.index+=n,i},re.prototype.unpack_array=function(n){for(var e=new Array(n),t=0;t<n;t++)e[t]=this.unpack();return e},re.prototype.unpack_map=function(n){for(var e={},t=0;t<n;t++){var i=this.unpack(),s=this.unpack();e[i]=s}return e},re.prototype.unpack_float=function(){var n=this.unpack_uint32(),e=n>>31,t=(n>>23&255)-127,i=n&8388607|8388608;return(e===0?1:-1)*i*Math.pow(2,t-23)},re.prototype.unpack_double=function(){var n=this.unpack_uint32(),e=this.unpack_uint32(),t=n>>31,i=(n>>20&2047)-1023,s=n&1048575|1048576,o=s*Math.pow(2,i-20)+e*Math.pow(2,i-52);return(t===0?1:-1)*o},re.prototype.read=function(n){var e=this.index;if(e+n<=this.length)return this.dataView.subarray(e,e+n);throw new Error("BinaryPackFailure: read index out of range")};function le(){this.bufferBuilder=new Fl}le.prototype.getBuffer=function(){return this.bufferBuilder.getBuffer()},le.prototype.pack=function(n){var e=typeof n;if(e==="string")this.pack_string(n);else if(e==="number")Math.floor(n)===n?this.pack_integer(n):this.pack_double(n);else if(e==="boolean")n===!0?this.bufferBuilder.append(195):n===!1&&this.bufferBuilder.append(194);else if(e==="undefined")this.bufferBuilder.append(192);else if(e==="object")if(n===null)this.bufferBuilder.append(192);else{var t=n.constructor;if(t==Array)this.pack_array(n);else if(t==Blob||t==File||n instanceof Blob||n instanceof File)this.pack_bin(n);else if(t==ArrayBuffer)ea.useArrayBufferView?this.pack_bin(new Uint8Array(n)):this.pack_bin(n);else if("BYTES_PER_ELEMENT"in n)ea.useArrayBufferView?this.pack_bin(new Uint8Array(n.buffer)):this.pack_bin(n.buffer);else if(t==Object||t.toString().startsWith("class"))this.pack_object(n);else if(t==Date)this.pack_string(n.toString());else if(typeof n.toBinaryPack=="function")this.bufferBuilder.append(n.toBinaryPack());else throw new Error('Type "'+t.toString()+'" not yet supported')}else throw new Error('Type "'+e+'" not yet supported');this.bufferBuilder.flush()},le.prototype.pack_bin=function(n){var e=n.length||n.byteLength||n.size;if(e<=15)this.pack_uint8(160+e);else if(e<=65535)this.bufferBuilder.append(218),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(219),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},le.prototype.pack_string=function(n){var e=jl(n);if(e<=15)this.pack_uint8(176+e);else if(e<=65535)this.bufferBuilder.append(216),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(217),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},le.prototype.pack_array=function(n){var e=n.length;if(e<=15)this.pack_uint8(144+e);else if(e<=65535)this.bufferBuilder.append(220),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(221),this.pack_uint32(e);else throw new Error("Invalid length");for(var t=0;t<e;t++)this.pack(n[t])},le.prototype.pack_integer=function(n){if(n>=-32&&n<=127)this.bufferBuilder.append(n&255);else if(n>=0&&n<=255)this.bufferBuilder.append(204),this.pack_uint8(n);else if(n>=-128&&n<=127)this.bufferBuilder.append(208),this.pack_int8(n);else if(n>=0&&n<=65535)this.bufferBuilder.append(205),this.pack_uint16(n);else if(n>=-32768&&n<=32767)this.bufferBuilder.append(209),this.pack_int16(n);else if(n>=0&&n<=4294967295)this.bufferBuilder.append(206),this.pack_uint32(n);else if(n>=-2147483648&&n<=2147483647)this.bufferBuilder.append(210),this.pack_int32(n);else if(n>=-9223372036854776e3&&n<=9223372036854776e3)this.bufferBuilder.append(211),this.pack_int64(n);else if(n>=0&&n<=18446744073709552e3)this.bufferBuilder.append(207),this.pack_uint64(n);else throw new Error("Invalid integer")},le.prototype.pack_double=function(n){var e=0;n<0&&(e=1,n=-n);var t=Math.floor(Math.log(n)/Math.LN2),i=n/Math.pow(2,t)-1,s=Math.floor(i*Math.pow(2,52)),o=Math.pow(2,32),a=e<<31|t+1023<<20|s/o&1048575,c=s%o;this.bufferBuilder.append(203),this.pack_int32(a),this.pack_int32(c)},le.prototype.pack_object=function(n){var e=Object.keys(n),t=e.length;if(t<=15)this.pack_uint8(128+t);else if(t<=65535)this.bufferBuilder.append(222),this.pack_uint16(t);else if(t<=4294967295)this.bufferBuilder.append(223),this.pack_uint32(t);else throw new Error("Invalid length");for(var i in n)n.hasOwnProperty(i)&&(this.pack(i),this.pack(n[i]))},le.prototype.pack_uint8=function(n){this.bufferBuilder.append(n)},le.prototype.pack_uint16=function(n){this.bufferBuilder.append(n>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_uint32=function(n){var e=n&4294967295;this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255)},le.prototype.pack_uint64=function(n){var e=n/Math.pow(2,32),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)},le.prototype.pack_int8=function(n){this.bufferBuilder.append(n&255)},le.prototype.pack_int16=function(n){this.bufferBuilder.append((n&65280)>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_int32=function(n){this.bufferBuilder.append(n>>>24&255),this.bufferBuilder.append((n&16711680)>>>16),this.bufferBuilder.append((n&65280)>>>8),this.bufferBuilder.append(n&255)},le.prototype.pack_int64=function(n){var e=Math.floor(n/Math.pow(2,32)),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)};function El(n){var e=n.charCodeAt(0);return e<=2047?"00":e<=65535?"000":e<=2097151?"0000":e<=67108863?"00000":"000000"}function jl(n){return n.length>600?new Blob([n]).size:n.replace(/[^\u0000-\u007F]/g,El).length}const ta=Cn(Bl);let ia=!0,na=!0;function Zi(n,e,t){const i=n.match(e);return i&&i.length>=t&&parseInt(i[t],10)}function _t(n,e,t){if(!n.RTCPeerConnection)return;const i=n.RTCPeerConnection.prototype,s=i.addEventListener;i.addEventListener=function(a,c){if(a!==e)return s.apply(this,arguments);const r=l=>{const d=t(l);d&&(c.handleEvent?c.handleEvent(d):c(d))};return this._eventMap=this._eventMap||{},this._eventMap[e]||(this._eventMap[e]=new Map),this._eventMap[e].set(c,r),s.apply(this,[a,r])};const o=i.removeEventListener;i.removeEventListener=function(a,c){if(a!==e||!this._eventMap||!this._eventMap[e])return o.apply(this,arguments);if(!this._eventMap[e].has(c))return o.apply(this,arguments);const r=this._eventMap[e].get(c);return this._eventMap[e].delete(c),this._eventMap[e].size===0&&delete this._eventMap[e],Object.keys(this._eventMap).length===0&&delete this._eventMap,o.apply(this,[a,r])},Object.defineProperty(i,"on"+e,{get(){return this["_on"+e]},set(a){this["_on"+e]&&(this.removeEventListener(e,this["_on"+e]),delete this["_on"+e]),a&&this.addEventListener(e,this["_on"+e]=a)},enumerable:!0,configurable:!0})}function Ol(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(ia=n,n?"adapter.js logging disabled":"adapter.js logging enabled")}function Dl(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(na=!n,"adapter.js deprecation warnings "+(n?"disabled":"enabled"))}function Ms(){if(typeof window=="object"){if(ia)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function zn(n,e){na&&console.warn(n+" is deprecated, please use "+e+" instead.")}function _l(n){const e={browser:null,version:null};if(typeof n>"u"||!n.navigator)return e.browser="Not a browser.",e;const{navigator:t}=n;if(t.mozGetUserMedia)e.browser="firefox",e.version=Zi(t.userAgent,/Firefox\/(\d+)\./,1);else if(t.webkitGetUserMedia||n.isSecureContext===!1&&n.webkitRTCPeerConnection&&!n.RTCIceGatherer)e.browser="chrome",e.version=Zi(t.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(t.mediaDevices&&t.userAgent.match(/Edge\/(\d+).(\d+)$/))e.browser="edge",e.version=Zi(t.userAgent,/Edge\/(\d+).(\d+)$/,2);else if(n.RTCPeerConnection&&t.userAgent.match(/AppleWebKit\/(\d+)\./))e.browser="safari",e.version=Zi(t.userAgent,/AppleWebKit\/(\d+)\./,1),e.supportsUnifiedPlan=n.RTCRtpTransceiver&&"currentDirection"in n.RTCRtpTransceiver.prototype;else return e.browser="Not a supported browser.",e;return e}function sa(n){return Object.prototype.toString.call(n)==="[object Object]"}function oa(n){return sa(n)?Object.keys(n).reduce(function(e,t){const i=sa(n[t]),s=i?oa(n[t]):n[t],o=i&&!Object.keys(s).length;return s===void 0||o?e:Object.assign(e,{[t]:s})},{}):n}function Ts(n,e,t){!e||t.has(e.id)||(t.set(e.id,e),Object.keys(e).forEach(i=>{i.endsWith("Id")?Ts(n,n.get(e[i]),t):i.endsWith("Ids")&&e[i].forEach(s=>{Ts(n,n.get(s),t)})}))}function aa(n,e,t){const i=t?"outbound-rtp":"inbound-rtp",s=new Map;if(e===null)return s;const o=[];return n.forEach(a=>{a.type==="track"&&a.trackIdentifier===e.id&&o.push(a)}),o.forEach(a=>{n.forEach(c=>{c.type===i&&c.trackId===a.id&&Ts(n,c,s)})}),s}const ra=Ms;function la(n,e){const t=n&&n.navigator;if(!t.mediaDevices)return;const i=function(c){if(typeof c!="object"||c.mandatory||c.optional)return c;const r={};return Object.keys(c).forEach(l=>{if(l==="require"||l==="advanced"||l==="mediaSource")return;const d=typeof c[l]=="object"?c[l]:{ideal:c[l]};d.exact!==void 0&&typeof d.exact=="number"&&(d.min=d.max=d.exact);const h=function(u,p){return u?u+p.charAt(0).toUpperCase()+p.slice(1):p==="deviceId"?"sourceId":p};if(d.ideal!==void 0){r.optional=r.optional||[];let u={};typeof d.ideal=="number"?(u[h("min",l)]=d.ideal,r.optional.push(u),u={},u[h("max",l)]=d.ideal,r.optional.push(u)):(u[h("",l)]=d.ideal,r.optional.push(u))}d.exact!==void 0&&typeof d.exact!="number"?(r.mandatory=r.mandatory||{},r.mandatory[h("",l)]=d.exact):["min","max"].forEach(u=>{d[u]!==void 0&&(r.mandatory=r.mandatory||{},r.mandatory[h(u,l)]=d[u])})}),c.advanced&&(r.optional=(r.optional||[]).concat(c.advanced)),r},s=function(c,r){if(e.version>=61)return r(c);if(c=JSON.parse(JSON.stringify(c)),c&&typeof c.audio=="object"){const l=function(d,h,u){h in d&&!(u in d)&&(d[u]=d[h],delete d[h])};c=JSON.parse(JSON.stringify(c)),l(c.audio,"autoGainControl","googAutoGainControl"),l(c.audio,"noiseSuppression","googNoiseSuppression"),c.audio=i(c.audio)}if(c&&typeof c.video=="object"){let l=c.video.facingMode;l=l&&(typeof l=="object"?l:{ideal:l});const d=e.version<66;if(l&&(l.exact==="user"||l.exact==="environment"||l.ideal==="user"||l.ideal==="environment")&&!(t.mediaDevices.getSupportedConstraints&&t.mediaDevices.getSupportedConstraints().facingMode&&!d)){delete c.video.facingMode;let h;if(l.exact==="environment"||l.ideal==="environment"?h=["back","rear"]:(l.exact==="user"||l.ideal==="user")&&(h=["front"]),h)return t.mediaDevices.enumerateDevices().then(u=>{u=u.filter(m=>m.kind==="videoinput");let p=u.find(m=>h.some(b=>m.label.toLowerCase().includes(b)));return!p&&u.length&&h.includes("back")&&(p=u[u.length-1]),p&&(c.video.deviceId=l.exact?{exact:p.deviceId}:{ideal:p.deviceId}),c.video=i(c.video),ra("chrome: "+JSON.stringify(c)),r(c)})}c.video=i(c.video)}return ra("chrome: "+JSON.stringify(c)),r(c)},o=function(c){return e.version>=64?c:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[c.name]||c.name,message:c.message,constraint:c.constraint||c.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}},a=function(c,r,l){s(c,d=>{t.webkitGetUserMedia(d,r,h=>{l&&l(o(h))})})};if(t.getUserMedia=a.bind(t),t.mediaDevices.getUserMedia){const c=t.mediaDevices.getUserMedia.bind(t.mediaDevices);t.mediaDevices.getUserMedia=function(r){return s(r,l=>c(l).then(d=>{if(l.audio&&!d.getAudioTracks().length||l.video&&!d.getVideoTracks().length)throw d.getTracks().forEach(h=>{h.stop()}),new DOMException("","NotFoundError");return d},d=>Promise.reject(o(d))))}}}function Al(n,e){if(!(n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices)&&n.navigator.mediaDevices){if(typeof e!="function"){console.error("shimGetDisplayMedia: getSourceId argument is not a function");return}n.navigator.mediaDevices.getDisplayMedia=function(t){return e(t).then(i=>{const s=t.video&&t.video.width,o=t.video&&t.video.height,a=t.video&&t.video.frameRate;return t.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:i,maxFrameRate:a||3}},s&&(t.video.mandatory.maxWidth=s),o&&(t.video.mandatory.maxHeight=o),n.navigator.mediaDevices.getUserMedia(t)})}}}function ca(n){n.MediaStream=n.MediaStream||n.webkitMediaStream}function da(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("ontrack"in n.RTCPeerConnection.prototype)){Object.defineProperty(n.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(t){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=t)},enumerable:!0,configurable:!0});const e=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",i=>{let s;n.RTCPeerConnection.prototype.getReceivers?s=this.getReceivers().find(a=>a.track&&a.track.id===i.track.id):s={track:i.track};const o=new Event("track");o.track=i.track,o.receiver=s,o.transceiver={receiver:s},o.streams=[t.stream],this.dispatchEvent(o)}),t.stream.getTracks().forEach(i=>{let s;n.RTCPeerConnection.prototype.getReceivers?s=this.getReceivers().find(a=>a.track&&a.track.id===i.id):s={track:i};const o=new Event("track");o.track=i,o.receiver=s,o.transceiver={receiver:s},o.streams=[t.stream],this.dispatchEvent(o)})},this.addEventListener("addstream",this._ontrackpoly)),e.apply(this,arguments)}}else _t(n,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function ha(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("getSenders"in n.RTCPeerConnection.prototype)&&"createDTMFSender"in n.RTCPeerConnection.prototype){const e=function(s,o){return{track:o,get dtmf(){return this._dtmf===void 0&&(o.kind==="audio"?this._dtmf=s.createDTMFSender(o):this._dtmf=null),this._dtmf},_pc:s}};if(!n.RTCPeerConnection.prototype.getSenders){n.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const s=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(a,c){let r=s.apply(this,arguments);return r||(r=e(this,a),this._senders.push(r)),r};const o=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(a){o.apply(this,arguments);const c=this._senders.indexOf(a);c!==-1&&this._senders.splice(c,1)}}const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(s){this._senders=this._senders||[],t.apply(this,[s]),s.getTracks().forEach(o=>{this._senders.push(e(this,o))})};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(s){this._senders=this._senders||[],i.apply(this,[s]),s.getTracks().forEach(o=>{const a=this._senders.find(c=>c.track===o);a&&this._senders.splice(this._senders.indexOf(a),1)})}}else if(typeof n=="object"&&n.RTCPeerConnection&&"getSenders"in n.RTCPeerConnection.prototype&&"createDTMFSender"in n.RTCPeerConnection.prototype&&n.RTCRtpSender&&!("dtmf"in n.RTCRtpSender.prototype)){const e=n.RTCPeerConnection.prototype.getSenders;n.RTCPeerConnection.prototype.getSenders=function(){const t=e.apply(this,[]);return t.forEach(i=>i._pc=this),t},Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function ua(n){if(!n.RTCPeerConnection)return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){const[t,i,s]=arguments;if(arguments.length>0&&typeof t=="function")return e.apply(this,arguments);if(e.length===0&&(arguments.length===0||typeof t!="function"))return e.apply(this,[]);const o=function(c){const r={};return c.result().forEach(l=>{const d={id:l.id,timestamp:l.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[l.type]||l.type};l.names().forEach(h=>{d[h]=l.stat(h)}),r[d.id]=d}),r},a=function(c){return new Map(Object.keys(c).map(r=>[r,c[r]]))};if(arguments.length>=2){const c=function(r){i(a(o(r)))};return e.apply(this,[c,t])}return new Promise((c,r)=>{e.apply(this,[function(l){c(a(o(l)))},r])}).then(i,s)}}function pa(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender&&n.RTCRtpReceiver))return;if(!("getStats"in n.RTCRtpSender.prototype)){const t=n.RTCPeerConnection.prototype.getSenders;t&&(n.RTCPeerConnection.prototype.getSenders=function(){const s=t.apply(this,[]);return s.forEach(o=>o._pc=this),s});const i=n.RTCPeerConnection.prototype.addTrack;i&&(n.RTCPeerConnection.prototype.addTrack=function(){const s=i.apply(this,arguments);return s._pc=this,s}),n.RTCRtpSender.prototype.getStats=function(){const s=this;return this._pc.getStats().then(o=>aa(o,s.track,!0))}}if(!("getStats"in n.RTCRtpReceiver.prototype)){const t=n.RTCPeerConnection.prototype.getReceivers;t&&(n.RTCPeerConnection.prototype.getReceivers=function(){const i=t.apply(this,[]);return i.forEach(s=>s._pc=this),i}),_t(n,"track",i=>(i.receiver._pc=i.srcElement,i)),n.RTCRtpReceiver.prototype.getStats=function(){const i=this;return this._pc.getStats().then(s=>aa(s,i.track,!1))}}if(!("getStats"in n.RTCRtpSender.prototype&&"getStats"in n.RTCRtpReceiver.prototype))return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof n.MediaStreamTrack){const t=arguments[0];let i,s,o;return this.getSenders().forEach(a=>{a.track===t&&(i?o=!0:i=a)}),this.getReceivers().forEach(a=>(a.track===t&&(s?o=!0:s=a),a.track===t)),o||i&&s?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):i?i.getStats():s?s.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return e.apply(this,arguments)}}function ma(n){n.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(o=>this._shimmedLocalStreams[o][0])};const e=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(o,a){if(!a)return e.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const c=e.apply(this,arguments);return this._shimmedLocalStreams[a.id]?this._shimmedLocalStreams[a.id].indexOf(c)===-1&&this._shimmedLocalStreams[a.id].push(c):this._shimmedLocalStreams[a.id]=[a,c],c};const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(o){this._shimmedLocalStreams=this._shimmedLocalStreams||{},o.getTracks().forEach(r=>{if(this.getSenders().find(l=>l.track===r))throw new DOMException("Track already exists.","InvalidAccessError")});const a=this.getSenders();t.apply(this,arguments);const c=this.getSenders().filter(r=>a.indexOf(r)===-1);this._shimmedLocalStreams[o.id]=[o].concat(c)};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[o.id],i.apply(this,arguments)};const s=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(o){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},o&&Object.keys(this._shimmedLocalStreams).forEach(a=>{const c=this._shimmedLocalStreams[a].indexOf(o);c!==-1&&this._shimmedLocalStreams[a].splice(c,1),this._shimmedLocalStreams[a].length===1&&delete this._shimmedLocalStreams[a]}),s.apply(this,arguments)}}function ba(n,e){if(!n.RTCPeerConnection)return;if(n.RTCPeerConnection.prototype.addTrack&&e.version>=65)return ma(n);const t=n.RTCPeerConnection.prototype.getLocalStreams;n.RTCPeerConnection.prototype.getLocalStreams=function(){const l=t.apply(this);return this._reverseStreams=this._reverseStreams||{},l.map(d=>this._reverseStreams[d.id])};const i=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(l){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},l.getTracks().forEach(d=>{if(this.getSenders().find(h=>h.track===d))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[l.id]){const d=new n.MediaStream(l.getTracks());this._streams[l.id]=d,this._reverseStreams[d.id]=l,l=d}i.apply(this,[l])};const s=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(l){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},s.apply(this,[this._streams[l.id]||l]),delete this._reverseStreams[this._streams[l.id]?this._streams[l.id].id:l.id],delete this._streams[l.id]},n.RTCPeerConnection.prototype.addTrack=function(l,d){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const h=[].slice.call(arguments,1);if(h.length!==1||!h[0].getTracks().find(p=>p===l))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(p=>p.track===l))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const u=this._streams[d.id];if(u)u.addTrack(l),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{const p=new n.MediaStream([l]);this._streams[d.id]=p,this._reverseStreams[p.id]=d,this.addStream(p)}return this.getSenders().find(p=>p.track===l)};function o(l,d){let h=d.sdp;return Object.keys(l._reverseStreams||[]).forEach(u=>{const p=l._reverseStreams[u],m=l._streams[p.id];h=h.replace(new RegExp(m.id,"g"),p.id)}),new RTCSessionDescription({type:d.type,sdp:h})}function a(l,d){let h=d.sdp;return Object.keys(l._reverseStreams||[]).forEach(u=>{const p=l._reverseStreams[u],m=l._streams[p.id];h=h.replace(new RegExp(p.id,"g"),m.id)}),new RTCSessionDescription({type:d.type,sdp:h})}["createOffer","createAnswer"].forEach(function(l){const d=n.RTCPeerConnection.prototype[l],h={[l](){const u=arguments;return arguments.length&&typeof arguments[0]=="function"?d.apply(this,[p=>{const m=o(this,p);u[0].apply(null,[m])},p=>{u[1]&&u[1].apply(null,p)},arguments[2]]):d.apply(this,arguments).then(p=>o(this,p))}};n.RTCPeerConnection.prototype[l]=h[l]});const c=n.RTCPeerConnection.prototype.setLocalDescription;n.RTCPeerConnection.prototype.setLocalDescription=function(){return!arguments.length||!arguments[0].type?c.apply(this,arguments):(arguments[0]=a(this,arguments[0]),c.apply(this,arguments))};const r=Object.getOwnPropertyDescriptor(n.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(n.RTCPeerConnection.prototype,"localDescription",{get(){const l=r.get.apply(this);return l.type===""?l:o(this,l)}}),n.RTCPeerConnection.prototype.removeTrack=function(l){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!l._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(l._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};let d;Object.keys(this._streams).forEach(h=>{this._streams[h].getTracks().find(u=>l.track===u)&&(d=this._streams[h])}),d&&(d.getTracks().length===1?this.removeStream(this._reverseStreams[d.id]):d.removeTrack(l.track),this.dispatchEvent(new Event("negotiationneeded")))}}function Ys(n,e){!n.RTCPeerConnection&&n.webkitRTCPeerConnection&&(n.RTCPeerConnection=n.webkitRTCPeerConnection),n.RTCPeerConnection&&e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){const i=n.RTCPeerConnection.prototype[t],s={[t](){return arguments[0]=new(t==="addIceCandidate"?n.RTCIceCandidate:n.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};n.RTCPeerConnection.prototype[t]=s[t]})}function ya(n,e){_t(n,"negotiationneeded",t=>{const i=t.target;if(!((e.version<72||i.getConfiguration&&i.getConfiguration().sdpSemantics==="plan-b")&&i.signalingState!=="stable"))return t})}const Ga=Object.freeze(Object.defineProperty({__proto__:null,fixNegotiationNeeded:ya,shimAddTrackRemoveTrack:ba,shimAddTrackRemoveTrackWithNative:ma,shimGetDisplayMedia:Al,shimGetSendersWithDtmf:ha,shimGetStats:ua,shimGetUserMedia:la,shimMediaStream:ca,shimOnTrack:da,shimPeerConnection:Ys,shimSenderReceiverGetStats:pa},Symbol.toStringTag,{value:"Module"}));function ql(n,e){let t=!1;return n=JSON.parse(JSON.stringify(n)),n.filter(i=>{if(i&&(i.urls||i.url)){let s=i.urls||i.url;i.url&&!i.urls&&zn("RTCIceServer.url","RTCIceServer.urls");const o=typeof s=="string";return o&&(s=[s]),s=s.filter(a=>{if(a.indexOf("stun:")===0)return!1;const c=a.startsWith("turn")&&!a.startsWith("turn:[")&&a.includes("transport=udp");return c&&!t?(t=!0,!0):c&&!t}),delete i.url,i.urls=o?s[0]:s,!!s.length}})}var Za={exports:{}};(function(n){var e={};e.generateIdentifier=function(){return Math.random().toString(36).substr(2,10)},e.localCName=e.generateIdentifier(),e.splitLines=function(t){return t.trim().split(`
1
+ import{PlaneGeometry as Ds,ShaderChunk as bc,Triangle as je,Vector3 as R,Layers as wn,MeshBasicMaterial as wr,DoubleSide as Mr,AdditiveBlending as Fs,Object3D as Tr,InstancedBufferAttribute as It,DynamicDrawUsage as xe,InstancedBufferGeometry as xc,Uniform$1 as Je,ShaderMaterial as Cr,BufferGeometry as Xt,BufferAttribute as me,Mesh as Mn,MeshStandardMaterial as _c,MeshPhysicalMaterial as Sc,Vector2 as Ye,Plane as Ls,Line3 as at,Sphere as Vs,Matrix4 as Be,Box3 as Te,REVISION as js,BackSide as wc,FrontSide as Js,Group as Mc,LineBasicMaterial as Tc,BatchedMesh as Cc,Ray as Pc,DataTexture as Pr,NearestFilter as Yt,UnsignedIntType as yi,IntType as Tn,FloatType as gi,UnsignedByteType as Gs,UnsignedShortType as Ec,ByteType as qs,ShortType as Ac,RGBAFormat as Cn,RGBAIntegerFormat as Er,RGFormat as kc,RedFormat as Rc,RGIntegerFormat as Hs,RedIntegerFormat as Oc,Matrix3 as Bc,Vector4 as Ar}from"./three.min.js";const re={Handedness:Object.freeze({NONE:"none",LEFT:"left",RIGHT:"right"}),ComponentState:Object.freeze({DEFAULT:"default",TOUCHED:"touched",PRESSED:"pressed"}),ComponentProperty:Object.freeze({BUTTON:"button",X_AXIS:"xAxis",Y_AXIS:"yAxis",STATE:"state"}),ComponentType:Object.freeze({TRIGGER:"trigger",SQUEEZE:"squeeze",TOUCHPAD:"touchpad",THUMBSTICK:"thumbstick",BUTTON:"button"}),ButtonTouchThreshold:.05,AxisTouchThreshold:.1,VisualResponseProperty:Object.freeze({TRANSFORM:"transform",VISIBILITY:"visibility"})};async function Ws(n){const e=await fetch(n);if(e.ok)return e.json();throw new Error(e.statusText)}async function Ic(n){if(!n)throw new Error("No basePath supplied");return await Ws(`${n}/profilesList.json`)}async function zc(n,e,t=null,i=!0){if(!n)throw new Error("No xrInputSource supplied");if(!e)throw new Error("No basePath supplied");const r=await Ic(e);let s;if(n.profiles.some(a=>{const c=r[a];return c&&(s={profileId:a,profilePath:`${e}/${c.path}`,deprecated:!!c.deprecated}),!!s}),!s){if(!t)throw new Error("No matching profile name found");const a=r[t];if(!a)throw new Error(`No matching profile name found and default profile "${t}" missing.`);s={profileId:t,profilePath:`${e}/${a.path}`,deprecated:!!a.deprecated}}const o=await Ws(s.profilePath);let l;if(i){let a;if(n.handedness==="any"?a=o.layouts[Object.keys(o.layouts)[0]]:a=o.layouts[n.handedness],!a)throw new Error(`No matching handedness, ${n.handedness}, in profile ${s.profileId}`);a.assetPath&&(l=s.profilePath.replace("profile.json",a.assetPath))}return{profile:o,assetPath:l}}const Nc={xAxis:0,yAxis:0,button:0,state:re.ComponentState.DEFAULT};function Uc(n=0,e=0){let t=n,i=e;if(Math.sqrt(n*n+e*e)>1){const r=Math.atan2(e,n);t=Math.cos(r),i=Math.sin(r)}return{normalizedXAxis:t*.5+.5,normalizedYAxis:i*.5+.5}}class Dc{constructor(e){this.componentProperty=e.componentProperty,this.states=e.states,this.valueNodeName=e.valueNodeName,this.valueNodeProperty=e.valueNodeProperty,this.valueNodeProperty===re.VisualResponseProperty.TRANSFORM&&(this.minNodeName=e.minNodeName,this.maxNodeName=e.maxNodeName),this.value=0,this.updateFromComponent(Nc)}updateFromComponent({xAxis:e,yAxis:t,button:i,state:r}){const{normalizedXAxis:s,normalizedYAxis:o}=Uc(e,t);switch(this.componentProperty){case re.ComponentProperty.X_AXIS:this.value=this.states.includes(r)?s:.5;break;case re.ComponentProperty.Y_AXIS:this.value=this.states.includes(r)?o:.5;break;case re.ComponentProperty.BUTTON:this.value=this.states.includes(r)?i:0;break;case re.ComponentProperty.STATE:this.valueNodeProperty===re.VisualResponseProperty.VISIBILITY?this.value=this.states.includes(r):this.value=this.states.includes(r)?1:0;break;default:throw new Error(`Unexpected visualResponse componentProperty ${this.componentProperty}`)}}}class Fc{constructor(e,t){if(!e||!t||!t.visualResponses||!t.gamepadIndices||Object.keys(t.gamepadIndices).length===0)throw new Error("Invalid arguments supplied");this.id=e,this.type=t.type,this.rootNodeName=t.rootNodeName,this.touchPointNodeName=t.touchPointNodeName,this.visualResponses={},Object.keys(t.visualResponses).forEach(i=>{const r=new Dc(t.visualResponses[i]);this.visualResponses[i]=r}),this.gamepadIndices=Object.assign({},t.gamepadIndices),this.values={state:re.ComponentState.DEFAULT,button:this.gamepadIndices.button!==void 0?0:void 0,xAxis:this.gamepadIndices.xAxis!==void 0?0:void 0,yAxis:this.gamepadIndices.yAxis!==void 0?0:void 0}}get data(){return{id:this.id,...this.values}}updateFromGamepad(e){if(this.values.state=re.ComponentState.DEFAULT,this.gamepadIndices.button!==void 0&&e.buttons.length>this.gamepadIndices.button){const t=e.buttons[this.gamepadIndices.button];this.values.button=t.value,this.values.button=this.values.button<0?0:this.values.button,this.values.button=this.values.button>1?1:this.values.button,t.pressed||this.values.button===1?this.values.state=re.ComponentState.PRESSED:(t.touched||this.values.button>re.ButtonTouchThreshold)&&(this.values.state=re.ComponentState.TOUCHED)}this.gamepadIndices.xAxis!==void 0&&e.axes.length>this.gamepadIndices.xAxis&&(this.values.xAxis=e.axes[this.gamepadIndices.xAxis],this.values.xAxis=this.values.xAxis<-1?-1:this.values.xAxis,this.values.xAxis=this.values.xAxis>1?1:this.values.xAxis,this.values.state===re.ComponentState.DEFAULT&&Math.abs(this.values.xAxis)>re.AxisTouchThreshold&&(this.values.state=re.ComponentState.TOUCHED)),this.gamepadIndices.yAxis!==void 0&&e.axes.length>this.gamepadIndices.yAxis&&(this.values.yAxis=e.axes[this.gamepadIndices.yAxis],this.values.yAxis=this.values.yAxis<-1?-1:this.values.yAxis,this.values.yAxis=this.values.yAxis>1?1:this.values.yAxis,this.values.state===re.ComponentState.DEFAULT&&Math.abs(this.values.yAxis)>re.AxisTouchThreshold&&(this.values.state=re.ComponentState.TOUCHED)),Object.values(this.visualResponses).forEach(t=>{t.updateFromComponent(this.values)})}}class Lc{constructor(e,t,i){if(!e)throw new Error("No xrInputSource supplied");if(!t)throw new Error("No profile supplied");this.xrInputSource=e,this.assetUrl=i,this.id=t.profileId,this.layoutDescription=t.layouts[e.handedness],this.components={},Object.keys(this.layoutDescription.components).forEach(r=>{const s=this.layoutDescription.components[r];this.components[r]=new Fc(r,s)}),this.updateFromGamepad()}get gripSpace(){return this.xrInputSource.gripSpace}get targetRaySpace(){return this.xrInputSource.targetRaySpace}get data(){const e=[];return Object.values(this.components).forEach(t=>{e.push(t.data)}),e}updateFromGamepad(){Object.values(this.components).forEach(e=>{e.updateFromGamepad(this.xrInputSource.gamepad)})}}const kr=2,Ze=4,ct=4,Xs=4,mt=new Int32Array(2),Ys=new Float32Array(mt.buffer),Zs=new Float64Array(mt.buffer),Pn=new Uint16Array(new Uint8Array([1,0]).buffer)[0]===1;class pt{constructor(e,t){this.low=e|0,this.high=t|0}static create(e,t){return e==0&&t==0?pt.ZERO:new pt(e,t)}toFloat64(){return(this.low>>>0)+this.high*4294967296}equals(e){return this.low==e.low&&this.high==e.high}}pt.ZERO=new pt(0,0);var Rr;(function(n){n[n.UTF8_BYTES=1]="UTF8_BYTES",n[n.UTF16_STRING=2]="UTF16_STRING"})(Rr||(Rr={}));class qi{constructor(e){this.bytes_=e,this.position_=0}static allocate(e){return new qi(new Uint8Array(e))}clear(){this.position_=0}bytes(){return this.bytes_}position(){return this.position_}setPosition(e){this.position_=e}capacity(){return this.bytes_.length}readInt8(e){return this.readUint8(e)<<24>>24}readUint8(e){return this.bytes_[e]}readInt16(e){return this.readUint16(e)<<16>>16}readUint16(e){return this.bytes_[e]|this.bytes_[e+1]<<8}readInt32(e){return this.bytes_[e]|this.bytes_[e+1]<<8|this.bytes_[e+2]<<16|this.bytes_[e+3]<<24}readUint32(e){return this.readInt32(e)>>>0}readInt64(e){return new pt(this.readInt32(e),this.readInt32(e+4))}readUint64(e){return new pt(this.readUint32(e),this.readUint32(e+4))}readFloat32(e){return mt[0]=this.readInt32(e),Ys[0]}readFloat64(e){return mt[Pn?0:1]=this.readInt32(e),mt[Pn?1:0]=this.readInt32(e+4),Zs[0]}writeInt8(e,t){this.bytes_[e]=t}writeUint8(e,t){this.bytes_[e]=t}writeInt16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeUint16(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8}writeInt32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeUint32(e,t){this.bytes_[e]=t,this.bytes_[e+1]=t>>8,this.bytes_[e+2]=t>>16,this.bytes_[e+3]=t>>24}writeInt64(e,t){this.writeInt32(e,t.low),this.writeInt32(e+4,t.high)}writeUint64(e,t){this.writeUint32(e,t.low),this.writeUint32(e+4,t.high)}writeFloat32(e,t){Ys[0]=t,this.writeInt32(e,mt[0])}writeFloat64(e,t){Zs[0]=t,this.writeInt32(e,mt[Pn?0:1]),this.writeInt32(e+4,mt[Pn?1:0])}getBufferIdentifier(){if(this.bytes_.length<this.position_+Ze+ct)throw new Error("FlatBuffers: ByteBuffer is too short to contain an identifier.");let e="";for(let t=0;t<ct;t++)e+=String.fromCharCode(this.readInt8(this.position_+Ze+t));return e}__offset(e,t){const i=e-this.readInt32(e);return t<this.readInt16(i)?this.readInt16(i+t):0}__union(e,t){return e.bb_pos=t+this.readInt32(t),e.bb=this,e}__string(e,t){e+=this.readInt32(e);const i=this.readInt32(e);let r="",s=0;if(e+=Ze,t===Rr.UTF8_BYTES)return this.bytes_.subarray(e,e+i);for(;s<i;){let o;const l=this.readUint8(e+s++);if(l<192)o=l;else{const a=this.readUint8(e+s++);if(l<224)o=(l&31)<<6|a&63;else{const c=this.readUint8(e+s++);if(l<240)o=(l&15)<<12|(a&63)<<6|c&63;else{const h=this.readUint8(e+s++);o=(l&7)<<18|(a&63)<<12|(c&63)<<6|h&63}}}o<65536?r+=String.fromCharCode(o):(o-=65536,r+=String.fromCharCode((o>>10)+55296,(o&1024-1)+56320))}return r}__union_with_string(e,t){return typeof e=="string"?this.__string(t):this.__union(e,t)}__indirect(e){return e+this.readInt32(e)}__vector(e){return e+this.readInt32(e)+Ze}__vector_len(e){return this.readInt32(e+this.readInt32(e))}__has_identifier(e){if(e.length!=ct)throw new Error("FlatBuffers: file identifier must be length "+ct);for(let t=0;t<ct;t++)if(e.charCodeAt(t)!=this.readInt8(this.position()+Ze+t))return!1;return!0}createLong(e,t){return pt.create(e,t)}createScalarList(e,t){const i=[];for(let r=0;r<t;++r)e(r)!==null&&i.push(e(r));return i}createObjList(e,t){const i=[];for(let r=0;r<t;++r){const s=e(r);s!==null&&i.push(s.unpack())}return i}}class zs{constructor(e){this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null;let t;e?t=e:t=1024,this.bb=qi.allocate(t),this.space=t}clear(){this.bb.clear(),this.space=this.bb.capacity(),this.minalign=1,this.vtable=null,this.vtable_in_use=0,this.isNested=!1,this.object_start=0,this.vtables=[],this.vector_num_elems=0,this.force_defaults=!1,this.string_maps=null}forceDefaults(e){this.force_defaults=e}dataBuffer(){return this.bb}asUint8Array(){return this.bb.bytes().subarray(this.bb.position(),this.bb.position()+this.offset())}prep(e,t){e>this.minalign&&(this.minalign=e);const i=~(this.bb.capacity()-this.space+t)+1&e-1;for(;this.space<i+e+t;){const r=this.bb.capacity();this.bb=zs.growByteBuffer(this.bb),this.space+=this.bb.capacity()-r}this.pad(i)}pad(e){for(let t=0;t<e;t++)this.bb.writeInt8(--this.space,0)}writeInt8(e){this.bb.writeInt8(this.space-=1,e)}writeInt16(e){this.bb.writeInt16(this.space-=2,e)}writeInt32(e){this.bb.writeInt32(this.space-=4,e)}writeInt64(e){this.bb.writeInt64(this.space-=8,e)}writeFloat32(e){this.bb.writeFloat32(this.space-=4,e)}writeFloat64(e){this.bb.writeFloat64(this.space-=8,e)}addInt8(e){this.prep(1,0),this.writeInt8(e)}addInt16(e){this.prep(2,0),this.writeInt16(e)}addInt32(e){this.prep(4,0),this.writeInt32(e)}addInt64(e){this.prep(8,0),this.writeInt64(e)}addFloat32(e){this.prep(4,0),this.writeFloat32(e)}addFloat64(e){this.prep(8,0),this.writeFloat64(e)}addFieldInt8(e,t,i){(this.force_defaults||t!=i)&&(this.addInt8(t),this.slot(e))}addFieldInt16(e,t,i){(this.force_defaults||t!=i)&&(this.addInt16(t),this.slot(e))}addFieldInt32(e,t,i){(this.force_defaults||t!=i)&&(this.addInt32(t),this.slot(e))}addFieldInt64(e,t,i){(this.force_defaults||!t.equals(i))&&(this.addInt64(t),this.slot(e))}addFieldFloat32(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat32(t),this.slot(e))}addFieldFloat64(e,t,i){(this.force_defaults||t!=i)&&(this.addFloat64(t),this.slot(e))}addFieldOffset(e,t,i){(this.force_defaults||t!=i)&&(this.addOffset(t),this.slot(e))}addFieldStruct(e,t,i){t!=i&&(this.nested(t),this.slot(e))}nested(e){if(e!=this.offset())throw new Error("FlatBuffers: struct must be serialized inline.")}notNested(){if(this.isNested)throw new Error("FlatBuffers: object serialization must not be nested.")}slot(e){this.vtable!==null&&(this.vtable[e]=this.offset())}offset(){return this.bb.capacity()-this.space}static growByteBuffer(e){const t=e.capacity();if(t&3221225472)throw new Error("FlatBuffers: cannot grow buffer beyond 2 gigabytes.");const i=t<<1,r=qi.allocate(i);return r.setPosition(i-t),r.bytes().set(e.bytes(),i-t),r}addOffset(e){this.prep(Ze,0),this.writeInt32(this.offset()-e+Ze)}startObject(e){this.notNested(),this.vtable==null&&(this.vtable=[]),this.vtable_in_use=e;for(let t=0;t<e;t++)this.vtable[t]=0;this.isNested=!0,this.object_start=this.offset()}endObject(){if(this.vtable==null||!this.isNested)throw new Error("FlatBuffers: endObject called without startObject");this.addInt32(0);const e=this.offset();let t=this.vtable_in_use-1;for(;t>=0&&this.vtable[t]==0;t--);const i=t+1;for(;t>=0;t--)this.addInt16(this.vtable[t]!=0?e-this.vtable[t]:0);const r=2;this.addInt16(e-this.object_start);const s=(i+r)*kr;this.addInt16(s);let o=0;const l=this.space;e:for(t=0;t<this.vtables.length;t++){const a=this.bb.capacity()-this.vtables[t];if(s==this.bb.readInt16(a)){for(let c=kr;c<s;c+=kr)if(this.bb.readInt16(l+c)!=this.bb.readInt16(a+c))continue e;o=this.vtables[t];break}}return o?(this.space=this.bb.capacity()-e,this.bb.writeInt32(this.space,o-e)):(this.vtables.push(this.offset()),this.bb.writeInt32(this.bb.capacity()-e,this.offset()-e)),this.isNested=!1,e}finish(e,t,i){const r=i?Xs:0;if(t){const s=t;if(this.prep(this.minalign,Ze+ct+r),s.length!=ct)throw new Error("FlatBuffers: file identifier must be length "+ct);for(let o=ct-1;o>=0;o--)this.writeInt8(s.charCodeAt(o))}this.prep(this.minalign,Ze+r),this.addOffset(e),r&&this.addInt32(this.bb.capacity()-this.space),this.bb.setPosition(this.space)}finishSizePrefixed(e,t){this.finish(e,t,!0)}requiredField(e,t){const i=this.bb.capacity()-e,r=i-this.bb.readInt32(i);if(this.bb.readInt16(r+t)==0)throw new Error("FlatBuffers: field "+t+" must be set")}startVector(e,t,i){this.notNested(),this.vector_num_elems=t,this.prep(Ze,e*t),this.prep(i,e*t)}endVector(){return this.writeInt32(this.vector_num_elems),this.offset()}createSharedString(e){if(!e)return 0;if(this.string_maps||(this.string_maps=new Map),this.string_maps.has(e))return this.string_maps.get(e);const t=this.createString(e);return this.string_maps.set(e,t),t}createString(e){if(!e)return 0;let t;if(e instanceof Uint8Array)t=e;else{t=[];let i=0;for(;i<e.length;){let r;const s=e.charCodeAt(i++);if(s<55296||s>=56320)r=s;else{const o=e.charCodeAt(i++);r=(s<<10)+o+(65536-56623104-56320)}r<128?t.push(r):(r<2048?t.push(r>>6&31|192):(r<65536?t.push(r>>12&15|224):t.push(r>>18&7|240,r>>12&63|128),t.push(r>>6&63|128)),t.push(r&63|128))}}this.addInt8(0),this.startVector(1,t.length,1),this.bb.setPosition(this.space-=t.length);for(let i=0,r=this.space,s=this.bb.bytes();i<t.length;i++)s[r++]=t[i];return this.endVector()}createLong(e,t){return pt.create(e,t)}createObjectOffset(e){return e===null?0:typeof e=="string"?this.createString(e):e.pack(this)}createObjectOffsetList(e){const t=[];for(let i=0;i<e.length;++i){const r=e[i];if(r!==null)t.push(this.createObjectOffset(r));else throw new Error("FlatBuffers: Argument for createObjectOffsetList cannot contain null.")}return t}createStructOffsetList(e,t){return t(this,e.length),this.createObjectOffsetList(e),this.endVector()}}function En(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Qs={exports:{}};(function(n){var e={};e.useBlobBuilder=function(){try{return new Blob([]),!1}catch{return!0}}(),e.useArrayBufferView=!e.useBlobBuilder&&function(){try{return new Blob([new Uint8Array([])]).size===0}catch{return!0}}(),n.exports.binaryFeatures=e;var t=n.exports.BlobBuilder;typeof window<"u"&&(t=n.exports.BlobBuilder=window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder||window.BlobBuilder);function i(){this._pieces=[],this._parts=[]}i.prototype.append=function(r){typeof r=="number"?this._pieces.push(r):(this.flush(),this._parts.push(r))},i.prototype.flush=function(){if(this._pieces.length>0){var r=new Uint8Array(this._pieces);e.useArrayBufferView||(r=r.buffer),this._parts.push(r),this._pieces=[]}},i.prototype.getBuffer=function(){if(this.flush(),e.useBlobBuilder){for(var r=new t,s=0,o=this._parts.length;s<o;s++)r.append(this._parts[s]);return r.getBlob()}else return new Blob(this._parts)},n.exports.BufferBuilder=i})(Qs);var Ks=Qs.exports,Vc=Ks.BufferBuilder,$s=Ks.binaryFeatures,jc={unpack:function(n){var e=new ae(n);return e.unpack()},pack:function(n){var e=new ce;e.pack(n);var t=e.getBuffer();return t}},Jc=jc;function ae(n){this.index=0,this.dataBuffer=n,this.dataView=new Uint8Array(this.dataBuffer),this.length=this.dataBuffer.byteLength}ae.prototype.unpack=function(){var n=this.unpack_uint8();if(n<128)return n;if((n^224)<32)return(n^224)-32;var e;if((e=n^160)<=15)return this.unpack_raw(e);if((e=n^176)<=15)return this.unpack_string(e);if((e=n^144)<=15)return this.unpack_array(e);if((e=n^128)<=15)return this.unpack_map(e);switch(n){case 192:return null;case 193:return;case 194:return!1;case 195:return!0;case 202:return this.unpack_float();case 203:return this.unpack_double();case 204:return this.unpack_uint8();case 205:return this.unpack_uint16();case 206:return this.unpack_uint32();case 207:return this.unpack_uint64();case 208:return this.unpack_int8();case 209:return this.unpack_int16();case 210:return this.unpack_int32();case 211:return this.unpack_int64();case 212:return;case 213:return;case 214:return;case 215:return;case 216:return e=this.unpack_uint16(),this.unpack_string(e);case 217:return e=this.unpack_uint32(),this.unpack_string(e);case 218:return e=this.unpack_uint16(),this.unpack_raw(e);case 219:return e=this.unpack_uint32(),this.unpack_raw(e);case 220:return e=this.unpack_uint16(),this.unpack_array(e);case 221:return e=this.unpack_uint32(),this.unpack_array(e);case 222:return e=this.unpack_uint16(),this.unpack_map(e);case 223:return e=this.unpack_uint32(),this.unpack_map(e)}},ae.prototype.unpack_uint8=function(){var n=this.dataView[this.index]&255;return this.index++,n},ae.prototype.unpack_uint16=function(){var n=this.read(2),e=(n[0]&255)*256+(n[1]&255);return this.index+=2,e},ae.prototype.unpack_uint32=function(){var n=this.read(4),e=((n[0]*256+n[1])*256+n[2])*256+n[3];return this.index+=4,e},ae.prototype.unpack_uint64=function(){var n=this.read(8),e=((((((n[0]*256+n[1])*256+n[2])*256+n[3])*256+n[4])*256+n[5])*256+n[6])*256+n[7];return this.index+=8,e},ae.prototype.unpack_int8=function(){var n=this.unpack_uint8();return n<128?n:n-256},ae.prototype.unpack_int16=function(){var n=this.unpack_uint16();return n<32768?n:n-65536},ae.prototype.unpack_int32=function(){var n=this.unpack_uint32();return n<Math.pow(2,31)?n:n-Math.pow(2,32)},ae.prototype.unpack_int64=function(){var n=this.unpack_uint64();return n<Math.pow(2,63)?n:n-Math.pow(2,64)},ae.prototype.unpack_raw=function(n){if(this.length<this.index+n)throw new Error("BinaryPackFailure: index is out of range "+this.index+" "+n+" "+this.length);var e=this.dataBuffer.slice(this.index,this.index+n);return this.index+=n,e},ae.prototype.unpack_string=function(n){for(var e=this.read(n),t=0,i="",r,s;t<n;)r=e[t],r<128?(i+=String.fromCharCode(r),t++):(r^192)<32?(s=(r^192)<<6|e[t+1]&63,i+=String.fromCharCode(s),t+=2):(s=(r&15)<<12|(e[t+1]&63)<<6|e[t+2]&63,i+=String.fromCharCode(s),t+=3);return this.index+=n,i},ae.prototype.unpack_array=function(n){for(var e=new Array(n),t=0;t<n;t++)e[t]=this.unpack();return e},ae.prototype.unpack_map=function(n){for(var e={},t=0;t<n;t++){var i=this.unpack(),r=this.unpack();e[i]=r}return e},ae.prototype.unpack_float=function(){var n=this.unpack_uint32(),e=n>>31,t=(n>>23&255)-127,i=n&8388607|8388608;return(e===0?1:-1)*i*Math.pow(2,t-23)},ae.prototype.unpack_double=function(){var n=this.unpack_uint32(),e=this.unpack_uint32(),t=n>>31,i=(n>>20&2047)-1023,r=n&1048575|1048576,s=r*Math.pow(2,i-20)+e*Math.pow(2,i-52);return(t===0?1:-1)*s},ae.prototype.read=function(n){var e=this.index;if(e+n<=this.length)return this.dataView.subarray(e,e+n);throw new Error("BinaryPackFailure: read index out of range")};function ce(){this.bufferBuilder=new Vc}ce.prototype.getBuffer=function(){return this.bufferBuilder.getBuffer()},ce.prototype.pack=function(n){var e=typeof n;if(e==="string")this.pack_string(n);else if(e==="number")Math.floor(n)===n?this.pack_integer(n):this.pack_double(n);else if(e==="boolean")n===!0?this.bufferBuilder.append(195):n===!1&&this.bufferBuilder.append(194);else if(e==="undefined")this.bufferBuilder.append(192);else if(e==="object")if(n===null)this.bufferBuilder.append(192);else{var t=n.constructor;if(t==Array)this.pack_array(n);else if(t==Blob||t==File||n instanceof Blob||n instanceof File)this.pack_bin(n);else if(t==ArrayBuffer)$s.useArrayBufferView?this.pack_bin(new Uint8Array(n)):this.pack_bin(n);else if("BYTES_PER_ELEMENT"in n)$s.useArrayBufferView?this.pack_bin(new Uint8Array(n.buffer)):this.pack_bin(n.buffer);else if(t==Object||t.toString().startsWith("class"))this.pack_object(n);else if(t==Date)this.pack_string(n.toString());else if(typeof n.toBinaryPack=="function")this.bufferBuilder.append(n.toBinaryPack());else throw new Error('Type "'+t.toString()+'" not yet supported')}else throw new Error('Type "'+e+'" not yet supported');this.bufferBuilder.flush()},ce.prototype.pack_bin=function(n){var e=n.length||n.byteLength||n.size;if(e<=15)this.pack_uint8(160+e);else if(e<=65535)this.bufferBuilder.append(218),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(219),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},ce.prototype.pack_string=function(n){var e=qc(n);if(e<=15)this.pack_uint8(176+e);else if(e<=65535)this.bufferBuilder.append(216),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(217),this.pack_uint32(e);else throw new Error("Invalid length");this.bufferBuilder.append(n)},ce.prototype.pack_array=function(n){var e=n.length;if(e<=15)this.pack_uint8(144+e);else if(e<=65535)this.bufferBuilder.append(220),this.pack_uint16(e);else if(e<=4294967295)this.bufferBuilder.append(221),this.pack_uint32(e);else throw new Error("Invalid length");for(var t=0;t<e;t++)this.pack(n[t])},ce.prototype.pack_integer=function(n){if(n>=-32&&n<=127)this.bufferBuilder.append(n&255);else if(n>=0&&n<=255)this.bufferBuilder.append(204),this.pack_uint8(n);else if(n>=-128&&n<=127)this.bufferBuilder.append(208),this.pack_int8(n);else if(n>=0&&n<=65535)this.bufferBuilder.append(205),this.pack_uint16(n);else if(n>=-32768&&n<=32767)this.bufferBuilder.append(209),this.pack_int16(n);else if(n>=0&&n<=4294967295)this.bufferBuilder.append(206),this.pack_uint32(n);else if(n>=-2147483648&&n<=2147483647)this.bufferBuilder.append(210),this.pack_int32(n);else if(n>=-9223372036854776e3&&n<=9223372036854776e3)this.bufferBuilder.append(211),this.pack_int64(n);else if(n>=0&&n<=18446744073709552e3)this.bufferBuilder.append(207),this.pack_uint64(n);else throw new Error("Invalid integer")},ce.prototype.pack_double=function(n){var e=0;n<0&&(e=1,n=-n);var t=Math.floor(Math.log(n)/Math.LN2),i=n/Math.pow(2,t)-1,r=Math.floor(i*Math.pow(2,52)),s=Math.pow(2,32),o=e<<31|t+1023<<20|r/s&1048575,l=r%s;this.bufferBuilder.append(203),this.pack_int32(o),this.pack_int32(l)},ce.prototype.pack_object=function(n){var e=Object.keys(n),t=e.length;if(t<=15)this.pack_uint8(128+t);else if(t<=65535)this.bufferBuilder.append(222),this.pack_uint16(t);else if(t<=4294967295)this.bufferBuilder.append(223),this.pack_uint32(t);else throw new Error("Invalid length");for(var i in n)n.hasOwnProperty(i)&&(this.pack(i),this.pack(n[i]))},ce.prototype.pack_uint8=function(n){this.bufferBuilder.append(n)},ce.prototype.pack_uint16=function(n){this.bufferBuilder.append(n>>8),this.bufferBuilder.append(n&255)},ce.prototype.pack_uint32=function(n){var e=n&4294967295;this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255)},ce.prototype.pack_uint64=function(n){var e=n/Math.pow(2,32),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)},ce.prototype.pack_int8=function(n){this.bufferBuilder.append(n&255)},ce.prototype.pack_int16=function(n){this.bufferBuilder.append((n&65280)>>8),this.bufferBuilder.append(n&255)},ce.prototype.pack_int32=function(n){this.bufferBuilder.append(n>>>24&255),this.bufferBuilder.append((n&16711680)>>>16),this.bufferBuilder.append((n&65280)>>>8),this.bufferBuilder.append(n&255)},ce.prototype.pack_int64=function(n){var e=Math.floor(n/Math.pow(2,32)),t=n%Math.pow(2,32);this.bufferBuilder.append((e&4278190080)>>>24),this.bufferBuilder.append((e&16711680)>>>16),this.bufferBuilder.append((e&65280)>>>8),this.bufferBuilder.append(e&255),this.bufferBuilder.append((t&4278190080)>>>24),this.bufferBuilder.append((t&16711680)>>>16),this.bufferBuilder.append((t&65280)>>>8),this.bufferBuilder.append(t&255)};function Gc(n){var e=n.charCodeAt(0);return e<=2047?"00":e<=65535?"000":e<=2097151?"0000":e<=67108863?"00000":"000000"}function qc(n){return n.length>600?new Blob([n]).size:n.replace(/[^\u0000-\u007F]/g,Gc).length}const eo=En(Jc);let to=!0,io=!0;function vi(n,e,t){const i=n.match(e);return i&&i.length>=t&&parseInt(i[t],10)}function Zt(n,e,t){if(!n.RTCPeerConnection)return;const i=n.RTCPeerConnection.prototype,r=i.addEventListener;i.addEventListener=function(o,l){if(o!==e)return r.apply(this,arguments);const a=c=>{const h=t(c);h&&(l.handleEvent?l.handleEvent(h):l(h))};return this._eventMap=this._eventMap||{},this._eventMap[e]||(this._eventMap[e]=new Map),this._eventMap[e].set(l,a),r.apply(this,[o,a])};const s=i.removeEventListener;i.removeEventListener=function(o,l){if(o!==e||!this._eventMap||!this._eventMap[e])return s.apply(this,arguments);if(!this._eventMap[e].has(l))return s.apply(this,arguments);const a=this._eventMap[e].get(l);return this._eventMap[e].delete(l),this._eventMap[e].size===0&&delete this._eventMap[e],Object.keys(this._eventMap).length===0&&delete this._eventMap,s.apply(this,[o,a])},Object.defineProperty(i,"on"+e,{get(){return this["_on"+e]},set(o){this["_on"+e]&&(this.removeEventListener(e,this["_on"+e]),delete this["_on"+e]),o&&this.addEventListener(e,this["_on"+e]=o)},enumerable:!0,configurable:!0})}function Hc(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(to=n,n?"adapter.js logging disabled":"adapter.js logging enabled")}function Wc(n){return typeof n!="boolean"?new Error("Argument type: "+typeof n+". Please use a boolean."):(io=!n,"adapter.js deprecation warnings "+(n?"disabled":"enabled"))}function Or(){if(typeof window=="object"){if(to)return;typeof console<"u"&&typeof console.log=="function"&&console.log.apply(console,arguments)}}function An(n,e){io&&console.warn(n+" is deprecated, please use "+e+" instead.")}function Xc(n){const e={browser:null,version:null};if(typeof n>"u"||!n.navigator)return e.browser="Not a browser.",e;const{navigator:t}=n;if(t.mozGetUserMedia)e.browser="firefox",e.version=vi(t.userAgent,/Firefox\/(\d+)\./,1);else if(t.webkitGetUserMedia||n.isSecureContext===!1&&n.webkitRTCPeerConnection&&!n.RTCIceGatherer)e.browser="chrome",e.version=vi(t.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(t.mediaDevices&&t.userAgent.match(/Edge\/(\d+).(\d+)$/))e.browser="edge",e.version=vi(t.userAgent,/Edge\/(\d+).(\d+)$/,2);else if(n.RTCPeerConnection&&t.userAgent.match(/AppleWebKit\/(\d+)\./))e.browser="safari",e.version=vi(t.userAgent,/AppleWebKit\/(\d+)\./,1),e.supportsUnifiedPlan=n.RTCRtpTransceiver&&"currentDirection"in n.RTCRtpTransceiver.prototype;else return e.browser="Not a supported browser.",e;return e}function no(n){return Object.prototype.toString.call(n)==="[object Object]"}function ro(n){return no(n)?Object.keys(n).reduce(function(e,t){const i=no(n[t]),r=i?ro(n[t]):n[t],s=i&&!Object.keys(r).length;return r===void 0||s?e:Object.assign(e,{[t]:r})},{}):n}function Br(n,e,t){!e||t.has(e.id)||(t.set(e.id,e),Object.keys(e).forEach(i=>{i.endsWith("Id")?Br(n,n.get(e[i]),t):i.endsWith("Ids")&&e[i].forEach(r=>{Br(n,n.get(r),t)})}))}function so(n,e,t){const i=t?"outbound-rtp":"inbound-rtp",r=new Map;if(e===null)return r;const s=[];return n.forEach(o=>{o.type==="track"&&o.trackIdentifier===e.id&&s.push(o)}),s.forEach(o=>{n.forEach(l=>{l.type===i&&l.trackId===o.id&&Br(n,l,r)})}),r}const oo=Or;function ao(n,e){const t=n&&n.navigator;if(!t.mediaDevices)return;const i=function(l){if(typeof l!="object"||l.mandatory||l.optional)return l;const a={};return Object.keys(l).forEach(c=>{if(c==="require"||c==="advanced"||c==="mediaSource")return;const h=typeof l[c]=="object"?l[c]:{ideal:l[c]};h.exact!==void 0&&typeof h.exact=="number"&&(h.min=h.max=h.exact);const u=function(d,p){return d?d+p.charAt(0).toUpperCase()+p.slice(1):p==="deviceId"?"sourceId":p};if(h.ideal!==void 0){a.optional=a.optional||[];let d={};typeof h.ideal=="number"?(d[u("min",c)]=h.ideal,a.optional.push(d),d={},d[u("max",c)]=h.ideal,a.optional.push(d)):(d[u("",c)]=h.ideal,a.optional.push(d))}h.exact!==void 0&&typeof h.exact!="number"?(a.mandatory=a.mandatory||{},a.mandatory[u("",c)]=h.exact):["min","max"].forEach(d=>{h[d]!==void 0&&(a.mandatory=a.mandatory||{},a.mandatory[u(d,c)]=h[d])})}),l.advanced&&(a.optional=(a.optional||[]).concat(l.advanced)),a},r=function(l,a){if(e.version>=61)return a(l);if(l=JSON.parse(JSON.stringify(l)),l&&typeof l.audio=="object"){const c=function(h,u,d){u in h&&!(d in h)&&(h[d]=h[u],delete h[u])};l=JSON.parse(JSON.stringify(l)),c(l.audio,"autoGainControl","googAutoGainControl"),c(l.audio,"noiseSuppression","googNoiseSuppression"),l.audio=i(l.audio)}if(l&&typeof l.video=="object"){let c=l.video.facingMode;c=c&&(typeof c=="object"?c:{ideal:c});const h=e.version<66;if(c&&(c.exact==="user"||c.exact==="environment"||c.ideal==="user"||c.ideal==="environment")&&!(t.mediaDevices.getSupportedConstraints&&t.mediaDevices.getSupportedConstraints().facingMode&&!h)){delete l.video.facingMode;let u;if(c.exact==="environment"||c.ideal==="environment"?u=["back","rear"]:(c.exact==="user"||c.ideal==="user")&&(u=["front"]),u)return t.mediaDevices.enumerateDevices().then(d=>{d=d.filter(f=>f.kind==="videoinput");let p=d.find(f=>u.some(m=>f.label.toLowerCase().includes(m)));return!p&&d.length&&u.includes("back")&&(p=d[d.length-1]),p&&(l.video.deviceId=c.exact?{exact:p.deviceId}:{ideal:p.deviceId}),l.video=i(l.video),oo("chrome: "+JSON.stringify(l)),a(l)})}l.video=i(l.video)}return oo("chrome: "+JSON.stringify(l)),a(l)},s=function(l){return e.version>=64?l:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[l.name]||l.name,message:l.message,constraint:l.constraint||l.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}},o=function(l,a,c){r(l,h=>{t.webkitGetUserMedia(h,a,u=>{c&&c(s(u))})})};if(t.getUserMedia=o.bind(t),t.mediaDevices.getUserMedia){const l=t.mediaDevices.getUserMedia.bind(t.mediaDevices);t.mediaDevices.getUserMedia=function(a){return r(a,c=>l(c).then(h=>{if(c.audio&&!h.getAudioTracks().length||c.video&&!h.getVideoTracks().length)throw h.getTracks().forEach(u=>{u.stop()}),new DOMException("","NotFoundError");return h},h=>Promise.reject(s(h))))}}}function Yc(n,e){if(!(n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices)&&n.navigator.mediaDevices){if(typeof e!="function"){console.error("shimGetDisplayMedia: getSourceId argument is not a function");return}n.navigator.mediaDevices.getDisplayMedia=function(t){return e(t).then(i=>{const r=t.video&&t.video.width,s=t.video&&t.video.height,o=t.video&&t.video.frameRate;return t.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:i,maxFrameRate:o||3}},r&&(t.video.mandatory.maxWidth=r),s&&(t.video.mandatory.maxHeight=s),n.navigator.mediaDevices.getUserMedia(t)})}}}function co(n){n.MediaStream=n.MediaStream||n.webkitMediaStream}function lo(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("ontrack"in n.RTCPeerConnection.prototype)){Object.defineProperty(n.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(t){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=t)},enumerable:!0,configurable:!0});const e=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",i=>{let r;n.RTCPeerConnection.prototype.getReceivers?r=this.getReceivers().find(o=>o.track&&o.track.id===i.track.id):r={track:i.track};const s=new Event("track");s.track=i.track,s.receiver=r,s.transceiver={receiver:r},s.streams=[t.stream],this.dispatchEvent(s)}),t.stream.getTracks().forEach(i=>{let r;n.RTCPeerConnection.prototype.getReceivers?r=this.getReceivers().find(o=>o.track&&o.track.id===i.id):r={track:i};const s=new Event("track");s.track=i,s.receiver=r,s.transceiver={receiver:r},s.streams=[t.stream],this.dispatchEvent(s)})},this.addEventListener("addstream",this._ontrackpoly)),e.apply(this,arguments)}}else Zt(n,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e))}function ho(n){if(typeof n=="object"&&n.RTCPeerConnection&&!("getSenders"in n.RTCPeerConnection.prototype)&&"createDTMFSender"in n.RTCPeerConnection.prototype){const e=function(r,s){return{track:s,get dtmf(){return this._dtmf===void 0&&(s.kind==="audio"?this._dtmf=r.createDTMFSender(s):this._dtmf=null),this._dtmf},_pc:r}};if(!n.RTCPeerConnection.prototype.getSenders){n.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};const r=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(o,l){let a=r.apply(this,arguments);return a||(a=e(this,o),this._senders.push(a)),a};const s=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(o){s.apply(this,arguments);const l=this._senders.indexOf(o);l!==-1&&this._senders.splice(l,1)}}const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(r){this._senders=this._senders||[],t.apply(this,[r]),r.getTracks().forEach(s=>{this._senders.push(e(this,s))})};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(r){this._senders=this._senders||[],i.apply(this,[r]),r.getTracks().forEach(s=>{const o=this._senders.find(l=>l.track===s);o&&this._senders.splice(this._senders.indexOf(o),1)})}}else if(typeof n=="object"&&n.RTCPeerConnection&&"getSenders"in n.RTCPeerConnection.prototype&&"createDTMFSender"in n.RTCPeerConnection.prototype&&n.RTCRtpSender&&!("dtmf"in n.RTCRtpSender.prototype)){const e=n.RTCPeerConnection.prototype.getSenders;n.RTCPeerConnection.prototype.getSenders=function(){const t=e.apply(this,[]);return t.forEach(i=>i._pc=this),t},Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function uo(n){if(!n.RTCPeerConnection)return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){const[t,i,r]=arguments;if(arguments.length>0&&typeof t=="function")return e.apply(this,arguments);if(e.length===0&&(arguments.length===0||typeof t!="function"))return e.apply(this,[]);const s=function(l){const a={};return l.result().forEach(c=>{const h={id:c.id,timestamp:c.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[c.type]||c.type};c.names().forEach(u=>{h[u]=c.stat(u)}),a[h.id]=h}),a},o=function(l){return new Map(Object.keys(l).map(a=>[a,l[a]]))};if(arguments.length>=2){const l=function(a){i(o(s(a)))};return e.apply(this,[l,t])}return new Promise((l,a)=>{e.apply(this,[function(c){l(o(s(c)))},a])}).then(i,r)}}function po(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender&&n.RTCRtpReceiver))return;if(!("getStats"in n.RTCRtpSender.prototype)){const t=n.RTCPeerConnection.prototype.getSenders;t&&(n.RTCPeerConnection.prototype.getSenders=function(){const r=t.apply(this,[]);return r.forEach(s=>s._pc=this),r});const i=n.RTCPeerConnection.prototype.addTrack;i&&(n.RTCPeerConnection.prototype.addTrack=function(){const r=i.apply(this,arguments);return r._pc=this,r}),n.RTCRtpSender.prototype.getStats=function(){const r=this;return this._pc.getStats().then(s=>so(s,r.track,!0))}}if(!("getStats"in n.RTCRtpReceiver.prototype)){const t=n.RTCPeerConnection.prototype.getReceivers;t&&(n.RTCPeerConnection.prototype.getReceivers=function(){const i=t.apply(this,[]);return i.forEach(r=>r._pc=this),i}),Zt(n,"track",i=>(i.receiver._pc=i.srcElement,i)),n.RTCRtpReceiver.prototype.getStats=function(){const i=this;return this._pc.getStats().then(r=>so(r,i.track,!1))}}if(!("getStats"in n.RTCRtpSender.prototype&&"getStats"in n.RTCRtpReceiver.prototype))return;const e=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof n.MediaStreamTrack){const t=arguments[0];let i,r,s;return this.getSenders().forEach(o=>{o.track===t&&(i?s=!0:i=o)}),this.getReceivers().forEach(o=>(o.track===t&&(r?s=!0:r=o),o.track===t)),s||i&&r?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):i?i.getStats():r?r.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return e.apply(this,arguments)}}function fo(n){n.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(s=>this._shimmedLocalStreams[s][0])};const e=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addTrack=function(s,o){if(!o)return e.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const l=e.apply(this,arguments);return this._shimmedLocalStreams[o.id]?this._shimmedLocalStreams[o.id].indexOf(l)===-1&&this._shimmedLocalStreams[o.id].push(l):this._shimmedLocalStreams[o.id]=[o,l],l};const t=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(s){this._shimmedLocalStreams=this._shimmedLocalStreams||{},s.getTracks().forEach(a=>{if(this.getSenders().find(c=>c.track===a))throw new DOMException("Track already exists.","InvalidAccessError")});const o=this.getSenders();t.apply(this,arguments);const l=this.getSenders().filter(a=>o.indexOf(a)===-1);this._shimmedLocalStreams[s.id]=[s].concat(l)};const i=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(s){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[s.id],i.apply(this,arguments)};const r=n.RTCPeerConnection.prototype.removeTrack;n.RTCPeerConnection.prototype.removeTrack=function(s){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},s&&Object.keys(this._shimmedLocalStreams).forEach(o=>{const l=this._shimmedLocalStreams[o].indexOf(s);l!==-1&&this._shimmedLocalStreams[o].splice(l,1),this._shimmedLocalStreams[o].length===1&&delete this._shimmedLocalStreams[o]}),r.apply(this,arguments)}}function mo(n,e){if(!n.RTCPeerConnection)return;if(n.RTCPeerConnection.prototype.addTrack&&e.version>=65)return fo(n);const t=n.RTCPeerConnection.prototype.getLocalStreams;n.RTCPeerConnection.prototype.getLocalStreams=function(){const c=t.apply(this);return this._reverseStreams=this._reverseStreams||{},c.map(h=>this._reverseStreams[h.id])};const i=n.RTCPeerConnection.prototype.addStream;n.RTCPeerConnection.prototype.addStream=function(c){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},c.getTracks().forEach(h=>{if(this.getSenders().find(u=>u.track===h))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[c.id]){const h=new n.MediaStream(c.getTracks());this._streams[c.id]=h,this._reverseStreams[h.id]=c,c=h}i.apply(this,[c])};const r=n.RTCPeerConnection.prototype.removeStream;n.RTCPeerConnection.prototype.removeStream=function(c){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},r.apply(this,[this._streams[c.id]||c]),delete this._reverseStreams[this._streams[c.id]?this._streams[c.id].id:c.id],delete this._streams[c.id]},n.RTCPeerConnection.prototype.addTrack=function(c,h){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const u=[].slice.call(arguments,1);if(u.length!==1||!u[0].getTracks().find(p=>p===c))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(p=>p.track===c))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};const d=this._streams[h.id];if(d)d.addTrack(c),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{const p=new n.MediaStream([c]);this._streams[h.id]=p,this._reverseStreams[p.id]=h,this.addStream(p)}return this.getSenders().find(p=>p.track===c)};function s(c,h){let u=h.sdp;return Object.keys(c._reverseStreams||[]).forEach(d=>{const p=c._reverseStreams[d],f=c._streams[p.id];u=u.replace(new RegExp(f.id,"g"),p.id)}),new RTCSessionDescription({type:h.type,sdp:u})}function o(c,h){let u=h.sdp;return Object.keys(c._reverseStreams||[]).forEach(d=>{const p=c._reverseStreams[d],f=c._streams[p.id];u=u.replace(new RegExp(p.id,"g"),f.id)}),new RTCSessionDescription({type:h.type,sdp:u})}["createOffer","createAnswer"].forEach(function(c){const h=n.RTCPeerConnection.prototype[c],u={[c](){const d=arguments;return arguments.length&&typeof arguments[0]=="function"?h.apply(this,[p=>{const f=s(this,p);d[0].apply(null,[f])},p=>{d[1]&&d[1].apply(null,p)},arguments[2]]):h.apply(this,arguments).then(p=>s(this,p))}};n.RTCPeerConnection.prototype[c]=u[c]});const l=n.RTCPeerConnection.prototype.setLocalDescription;n.RTCPeerConnection.prototype.setLocalDescription=function(){return!arguments.length||!arguments[0].type?l.apply(this,arguments):(arguments[0]=o(this,arguments[0]),l.apply(this,arguments))};const a=Object.getOwnPropertyDescriptor(n.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(n.RTCPeerConnection.prototype,"localDescription",{get(){const c=a.get.apply(this);return c.type===""?c:s(this,c)}}),n.RTCPeerConnection.prototype.removeTrack=function(c){if(this.signalingState==="closed")throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!c._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(c._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{};let h;Object.keys(this._streams).forEach(u=>{this._streams[u].getTracks().find(d=>c.track===d)&&(h=this._streams[u])}),h&&(h.getTracks().length===1?this.removeStream(this._reverseStreams[h.id]):h.removeTrack(c.track),this.dispatchEvent(new Event("negotiationneeded")))}}function Ir(n,e){!n.RTCPeerConnection&&n.webkitRTCPeerConnection&&(n.RTCPeerConnection=n.webkitRTCPeerConnection),n.RTCPeerConnection&&e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){const i=n.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new(t==="addIceCandidate"?n.RTCIceCandidate:n.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}};n.RTCPeerConnection.prototype[t]=r[t]})}function yo(n,e){Zt(n,"negotiationneeded",t=>{const i=t.target;if(!((e.version<72||i.getConfiguration&&i.getConfiguration().sdpSemantics==="plan-b")&&i.signalingState!=="stable"))return t})}const go=Object.freeze(Object.defineProperty({__proto__:null,fixNegotiationNeeded:yo,shimAddTrackRemoveTrack:mo,shimAddTrackRemoveTrackWithNative:fo,shimGetDisplayMedia:Yc,shimGetSendersWithDtmf:ho,shimGetStats:uo,shimGetUserMedia:ao,shimMediaStream:co,shimOnTrack:lo,shimPeerConnection:Ir,shimSenderReceiverGetStats:po},Symbol.toStringTag,{value:"Module"}));function Zc(n,e){let t=!1;return n=JSON.parse(JSON.stringify(n)),n.filter(i=>{if(i&&(i.urls||i.url)){let r=i.urls||i.url;i.url&&!i.urls&&An("RTCIceServer.url","RTCIceServer.urls");const s=typeof r=="string";return s&&(r=[r]),r=r.filter(o=>{if(o.indexOf("stun:")===0)return!1;const l=o.startsWith("turn")&&!o.startsWith("turn:[")&&o.includes("transport=udp");return l&&!t?(t=!0,!0):l&&!t}),delete i.url,i.urls=s?r[0]:r,!!r.length}})}var vo={exports:{}};(function(n){var e={};e.generateIdentifier=function(){return Math.random().toString(36).substr(2,10)},e.localCName=e.generateIdentifier(),e.splitLines=function(t){return t.trim().split(`
2
2
  `).map(function(i){return i.trim()})},e.splitSections=function(t){var i=t.split(`
3
- m=`);return i.map(function(s,o){return(o>0?"m="+s:s).trim()+`\r
4
- `})},e.getDescription=function(t){var i=e.splitSections(t);return i&&i[0]},e.getMediaSections=function(t){var i=e.splitSections(t);return i.shift(),i},e.matchPrefix=function(t,i){return e.splitLines(t).filter(function(s){return s.indexOf(i)===0})},e.parseCandidate=function(t){var i;t.indexOf("a=candidate:")===0?i=t.substring(12).split(" "):i=t.substring(10).split(" ");for(var s={foundation:i[0],component:parseInt(i[1],10),protocol:i[2].toLowerCase(),priority:parseInt(i[3],10),ip:i[4],address:i[4],port:parseInt(i[5],10),type:i[7]},o=8;o<i.length;o+=2)switch(i[o]){case"raddr":s.relatedAddress=i[o+1];break;case"rport":s.relatedPort=parseInt(i[o+1],10);break;case"tcptype":s.tcpType=i[o+1];break;case"ufrag":s.ufrag=i[o+1],s.usernameFragment=i[o+1];break;default:s[i[o]]=i[o+1];break}return s},e.writeCandidate=function(t){var i=[];i.push(t.foundation),i.push(t.component),i.push(t.protocol.toUpperCase()),i.push(t.priority),i.push(t.address||t.ip),i.push(t.port);var s=t.type;return i.push("typ"),i.push(s),s!=="host"&&t.relatedAddress&&t.relatedPort&&(i.push("raddr"),i.push(t.relatedAddress),i.push("rport"),i.push(t.relatedPort)),t.tcpType&&t.protocol.toLowerCase()==="tcp"&&(i.push("tcptype"),i.push(t.tcpType)),(t.usernameFragment||t.ufrag)&&(i.push("ufrag"),i.push(t.usernameFragment||t.ufrag)),"candidate:"+i.join(" ")},e.parseIceOptions=function(t){return t.substr(14).split(" ")},e.parseRtpMap=function(t){var i=t.substr(9).split(" "),s={payloadType:parseInt(i.shift(),10)};return i=i[0].split("/"),s.name=i[0],s.clockRate=parseInt(i[1],10),s.channels=i.length===3?parseInt(i[2],10):1,s.numChannels=s.channels,s},e.writeRtpMap=function(t){var i=t.payloadType;t.preferredPayloadType!==void 0&&(i=t.preferredPayloadType);var s=t.channels||t.numChannels||1;return"a=rtpmap:"+i+" "+t.name+"/"+t.clockRate+(s!==1?"/"+s:"")+`\r
3
+ m=`);return i.map(function(r,s){return(s>0?"m="+r:r).trim()+`\r
4
+ `})},e.getDescription=function(t){var i=e.splitSections(t);return i&&i[0]},e.getMediaSections=function(t){var i=e.splitSections(t);return i.shift(),i},e.matchPrefix=function(t,i){return e.splitLines(t).filter(function(r){return r.indexOf(i)===0})},e.parseCandidate=function(t){var i;t.indexOf("a=candidate:")===0?i=t.substring(12).split(" "):i=t.substring(10).split(" ");for(var r={foundation:i[0],component:parseInt(i[1],10),protocol:i[2].toLowerCase(),priority:parseInt(i[3],10),ip:i[4],address:i[4],port:parseInt(i[5],10),type:i[7]},s=8;s<i.length;s+=2)switch(i[s]){case"raddr":r.relatedAddress=i[s+1];break;case"rport":r.relatedPort=parseInt(i[s+1],10);break;case"tcptype":r.tcpType=i[s+1];break;case"ufrag":r.ufrag=i[s+1],r.usernameFragment=i[s+1];break;default:r[i[s]]=i[s+1];break}return r},e.writeCandidate=function(t){var i=[];i.push(t.foundation),i.push(t.component),i.push(t.protocol.toUpperCase()),i.push(t.priority),i.push(t.address||t.ip),i.push(t.port);var r=t.type;return i.push("typ"),i.push(r),r!=="host"&&t.relatedAddress&&t.relatedPort&&(i.push("raddr"),i.push(t.relatedAddress),i.push("rport"),i.push(t.relatedPort)),t.tcpType&&t.protocol.toLowerCase()==="tcp"&&(i.push("tcptype"),i.push(t.tcpType)),(t.usernameFragment||t.ufrag)&&(i.push("ufrag"),i.push(t.usernameFragment||t.ufrag)),"candidate:"+i.join(" ")},e.parseIceOptions=function(t){return t.substr(14).split(" ")},e.parseRtpMap=function(t){var i=t.substr(9).split(" "),r={payloadType:parseInt(i.shift(),10)};return i=i[0].split("/"),r.name=i[0],r.clockRate=parseInt(i[1],10),r.channels=i.length===3?parseInt(i[2],10):1,r.numChannels=r.channels,r},e.writeRtpMap=function(t){var i=t.payloadType;t.preferredPayloadType!==void 0&&(i=t.preferredPayloadType);var r=t.channels||t.numChannels||1;return"a=rtpmap:"+i+" "+t.name+"/"+t.clockRate+(r!==1?"/"+r:"")+`\r
5
5
  `},e.parseExtmap=function(t){var i=t.substr(9).split(" ");return{id:parseInt(i[0],10),direction:i[0].indexOf("/")>0?i[0].split("/")[1]:"sendrecv",uri:i[1]}},e.writeExtmap=function(t){return"a=extmap:"+(t.id||t.preferredId)+(t.direction&&t.direction!=="sendrecv"?"/"+t.direction:"")+" "+t.uri+`\r
6
- `},e.parseFmtp=function(t){for(var i={},s,o=t.substr(t.indexOf(" ")+1).split(";"),a=0;a<o.length;a++)s=o[a].trim().split("="),i[s[0].trim()]=s[1];return i},e.writeFmtp=function(t){var i="",s=t.payloadType;if(t.preferredPayloadType!==void 0&&(s=t.preferredPayloadType),t.parameters&&Object.keys(t.parameters).length){var o=[];Object.keys(t.parameters).forEach(function(a){t.parameters[a]?o.push(a+"="+t.parameters[a]):o.push(a)}),i+="a=fmtp:"+s+" "+o.join(";")+`\r
7
- `}return i},e.parseRtcpFb=function(t){var i=t.substr(t.indexOf(" ")+1).split(" ");return{type:i.shift(),parameter:i.join(" ")}},e.writeRtcpFb=function(t){var i="",s=t.payloadType;return t.preferredPayloadType!==void 0&&(s=t.preferredPayloadType),t.rtcpFeedback&&t.rtcpFeedback.length&&t.rtcpFeedback.forEach(function(o){i+="a=rtcp-fb:"+s+" "+o.type+(o.parameter&&o.parameter.length?" "+o.parameter:"")+`\r
8
- `}),i},e.parseSsrcMedia=function(t){var i=t.indexOf(" "),s={ssrc:parseInt(t.substr(7,i-7),10)},o=t.indexOf(":",i);return o>-1?(s.attribute=t.substr(i+1,o-i-1),s.value=t.substr(o+1)):s.attribute=t.substr(i+1),s},e.parseSsrcGroup=function(t){var i=t.substr(13).split(" ");return{semantics:i.shift(),ssrcs:i.map(function(s){return parseInt(s,10)})}},e.getMid=function(t){var i=e.matchPrefix(t,"a=mid:")[0];if(i)return i.substr(6)},e.parseFingerprint=function(t){var i=t.substr(14).split(" ");return{algorithm:i[0].toLowerCase(),value:i[1]}},e.getDtlsParameters=function(t,i){var s=e.matchPrefix(t+i,"a=fingerprint:");return{role:"auto",fingerprints:s.map(e.parseFingerprint)}},e.writeDtlsParameters=function(t,i){var s="a=setup:"+i+`\r
9
- `;return t.fingerprints.forEach(function(o){s+="a=fingerprint:"+o.algorithm+" "+o.value+`\r
10
- `}),s},e.parseCryptoLine=function(t){var i=t.substr(9).split(" ");return{tag:parseInt(i[0],10),cryptoSuite:i[1],keyParams:i[2],sessionParams:i.slice(3)}},e.writeCryptoLine=function(t){return"a=crypto:"+t.tag+" "+t.cryptoSuite+" "+(typeof t.keyParams=="object"?e.writeCryptoKeyParams(t.keyParams):t.keyParams)+(t.sessionParams?" "+t.sessionParams.join(" "):"")+`\r
11
- `},e.parseCryptoKeyParams=function(t){if(t.indexOf("inline:")!==0)return null;var i=t.substr(7).split("|");return{keyMethod:"inline",keySalt:i[0],lifeTime:i[1],mkiValue:i[2]?i[2].split(":")[0]:void 0,mkiLength:i[2]?i[2].split(":")[1]:void 0}},e.writeCryptoKeyParams=function(t){return t.keyMethod+":"+t.keySalt+(t.lifeTime?"|"+t.lifeTime:"")+(t.mkiValue&&t.mkiLength?"|"+t.mkiValue+":"+t.mkiLength:"")},e.getCryptoParameters=function(t,i){var s=e.matchPrefix(t+i,"a=crypto:");return s.map(e.parseCryptoLine)},e.getIceParameters=function(t,i){var s=e.matchPrefix(t+i,"a=ice-ufrag:")[0],o=e.matchPrefix(t+i,"a=ice-pwd:")[0];return s&&o?{usernameFragment:s.substr(12),password:o.substr(10)}:null},e.writeIceParameters=function(t){return"a=ice-ufrag:"+t.usernameFragment+`\r
6
+ `},e.parseFmtp=function(t){for(var i={},r,s=t.substr(t.indexOf(" ")+1).split(";"),o=0;o<s.length;o++)r=s[o].trim().split("="),i[r[0].trim()]=r[1];return i},e.writeFmtp=function(t){var i="",r=t.payloadType;if(t.preferredPayloadType!==void 0&&(r=t.preferredPayloadType),t.parameters&&Object.keys(t.parameters).length){var s=[];Object.keys(t.parameters).forEach(function(o){t.parameters[o]?s.push(o+"="+t.parameters[o]):s.push(o)}),i+="a=fmtp:"+r+" "+s.join(";")+`\r
7
+ `}return i},e.parseRtcpFb=function(t){var i=t.substr(t.indexOf(" ")+1).split(" ");return{type:i.shift(),parameter:i.join(" ")}},e.writeRtcpFb=function(t){var i="",r=t.payloadType;return t.preferredPayloadType!==void 0&&(r=t.preferredPayloadType),t.rtcpFeedback&&t.rtcpFeedback.length&&t.rtcpFeedback.forEach(function(s){i+="a=rtcp-fb:"+r+" "+s.type+(s.parameter&&s.parameter.length?" "+s.parameter:"")+`\r
8
+ `}),i},e.parseSsrcMedia=function(t){var i=t.indexOf(" "),r={ssrc:parseInt(t.substr(7,i-7),10)},s=t.indexOf(":",i);return s>-1?(r.attribute=t.substr(i+1,s-i-1),r.value=t.substr(s+1)):r.attribute=t.substr(i+1),r},e.parseSsrcGroup=function(t){var i=t.substr(13).split(" ");return{semantics:i.shift(),ssrcs:i.map(function(r){return parseInt(r,10)})}},e.getMid=function(t){var i=e.matchPrefix(t,"a=mid:")[0];if(i)return i.substr(6)},e.parseFingerprint=function(t){var i=t.substr(14).split(" ");return{algorithm:i[0].toLowerCase(),value:i[1]}},e.getDtlsParameters=function(t,i){var r=e.matchPrefix(t+i,"a=fingerprint:");return{role:"auto",fingerprints:r.map(e.parseFingerprint)}},e.writeDtlsParameters=function(t,i){var r="a=setup:"+i+`\r
9
+ `;return t.fingerprints.forEach(function(s){r+="a=fingerprint:"+s.algorithm+" "+s.value+`\r
10
+ `}),r},e.parseCryptoLine=function(t){var i=t.substr(9).split(" ");return{tag:parseInt(i[0],10),cryptoSuite:i[1],keyParams:i[2],sessionParams:i.slice(3)}},e.writeCryptoLine=function(t){return"a=crypto:"+t.tag+" "+t.cryptoSuite+" "+(typeof t.keyParams=="object"?e.writeCryptoKeyParams(t.keyParams):t.keyParams)+(t.sessionParams?" "+t.sessionParams.join(" "):"")+`\r
11
+ `},e.parseCryptoKeyParams=function(t){if(t.indexOf("inline:")!==0)return null;var i=t.substr(7).split("|");return{keyMethod:"inline",keySalt:i[0],lifeTime:i[1],mkiValue:i[2]?i[2].split(":")[0]:void 0,mkiLength:i[2]?i[2].split(":")[1]:void 0}},e.writeCryptoKeyParams=function(t){return t.keyMethod+":"+t.keySalt+(t.lifeTime?"|"+t.lifeTime:"")+(t.mkiValue&&t.mkiLength?"|"+t.mkiValue+":"+t.mkiLength:"")},e.getCryptoParameters=function(t,i){var r=e.matchPrefix(t+i,"a=crypto:");return r.map(e.parseCryptoLine)},e.getIceParameters=function(t,i){var r=e.matchPrefix(t+i,"a=ice-ufrag:")[0],s=e.matchPrefix(t+i,"a=ice-pwd:")[0];return r&&s?{usernameFragment:r.substr(12),password:s.substr(10)}:null},e.writeIceParameters=function(t){return"a=ice-ufrag:"+t.usernameFragment+`\r
12
12
  a=ice-pwd:`+t.password+`\r
13
- `},e.parseRtpParameters=function(t){for(var i={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},s=e.splitLines(t),o=s[0].split(" "),a=3;a<o.length;a++){var c=o[a],r=e.matchPrefix(t,"a=rtpmap:"+c+" ")[0];if(r){var l=e.parseRtpMap(r),d=e.matchPrefix(t,"a=fmtp:"+c+" ");switch(l.parameters=d.length?e.parseFmtp(d[0]):{},l.rtcpFeedback=e.matchPrefix(t,"a=rtcp-fb:"+c+" ").map(e.parseRtcpFb),i.codecs.push(l),l.name.toUpperCase()){case"RED":case"ULPFEC":i.fecMechanisms.push(l.name.toUpperCase());break}}}return e.matchPrefix(t,"a=extmap:").forEach(function(h){i.headerExtensions.push(e.parseExtmap(h))}),i},e.writeRtpDescription=function(t,i){var s="";s+="m="+t+" ",s+=i.codecs.length>0?"9":"0",s+=" UDP/TLS/RTP/SAVPF ",s+=i.codecs.map(function(a){return a.preferredPayloadType!==void 0?a.preferredPayloadType:a.payloadType}).join(" ")+`\r
14
- `,s+=`c=IN IP4 0.0.0.0\r
15
- `,s+=`a=rtcp:9 IN IP4 0.0.0.0\r
16
- `,i.codecs.forEach(function(a){s+=e.writeRtpMap(a),s+=e.writeFmtp(a),s+=e.writeRtcpFb(a)});var o=0;return i.codecs.forEach(function(a){a.maxptime>o&&(o=a.maxptime)}),o>0&&(s+="a=maxptime:"+o+`\r
17
- `),s+=`a=rtcp-mux\r
18
- `,i.headerExtensions&&i.headerExtensions.forEach(function(a){s+=e.writeExtmap(a)}),s},e.parseRtpEncodingParameters=function(t){var i=[],s=e.parseRtpParameters(t),o=s.fecMechanisms.indexOf("RED")!==-1,a=s.fecMechanisms.indexOf("ULPFEC")!==-1,c=e.matchPrefix(t,"a=ssrc:").map(function(u){return e.parseSsrcMedia(u)}).filter(function(u){return u.attribute==="cname"}),r=c.length>0&&c[0].ssrc,l,d=e.matchPrefix(t,"a=ssrc-group:FID").map(function(u){var p=u.substr(17).split(" ");return p.map(function(m){return parseInt(m,10)})});d.length>0&&d[0].length>1&&d[0][0]===r&&(l=d[0][1]),s.codecs.forEach(function(u){if(u.name.toUpperCase()==="RTX"&&u.parameters.apt){var p={ssrc:r,codecPayloadType:parseInt(u.parameters.apt,10)};r&&l&&(p.rtx={ssrc:l}),i.push(p),o&&(p=JSON.parse(JSON.stringify(p)),p.fec={ssrc:r,mechanism:a?"red+ulpfec":"red"},i.push(p))}}),i.length===0&&r&&i.push({ssrc:r});var h=e.matchPrefix(t,"b=");return h.length&&(h[0].indexOf("b=TIAS:")===0?h=parseInt(h[0].substr(7),10):h[0].indexOf("b=AS:")===0?h=parseInt(h[0].substr(5),10)*1e3*.95-50*40*8:h=void 0,i.forEach(function(u){u.maxBitrate=h})),i},e.parseRtcpParameters=function(t){var i={},s=e.matchPrefix(t,"a=ssrc:").map(function(c){return e.parseSsrcMedia(c)}).filter(function(c){return c.attribute==="cname"})[0];s&&(i.cname=s.value,i.ssrc=s.ssrc);var o=e.matchPrefix(t,"a=rtcp-rsize");i.reducedSize=o.length>0,i.compound=o.length===0;var a=e.matchPrefix(t,"a=rtcp-mux");return i.mux=a.length>0,i},e.parseMsid=function(t){var i,s=e.matchPrefix(t,"a=msid:");if(s.length===1)return i=s[0].substr(7).split(" "),{stream:i[0],track:i[1]};var o=e.matchPrefix(t,"a=ssrc:").map(function(a){return e.parseSsrcMedia(a)}).filter(function(a){return a.attribute==="msid"});if(o.length>0)return i=o[0].value.split(" "),{stream:i[0],track:i[1]}},e.parseSctpDescription=function(t){var i=e.parseMLine(t),s=e.matchPrefix(t,"a=max-message-size:"),o;s.length>0&&(o=parseInt(s[0].substr(19),10)),isNaN(o)&&(o=65536);var a=e.matchPrefix(t,"a=sctp-port:");if(a.length>0)return{port:parseInt(a[0].substr(12),10),protocol:i.fmt,maxMessageSize:o};var c=e.matchPrefix(t,"a=sctpmap:");if(c.length>0){var r=e.matchPrefix(t,"a=sctpmap:")[0].substr(10).split(" ");return{port:parseInt(r[0],10),protocol:r[1],maxMessageSize:o}}},e.writeSctpDescription=function(t,i){var s=[];return t.protocol!=="DTLS/SCTP"?s=["m="+t.kind+" 9 "+t.protocol+" "+i.protocol+`\r
13
+ `},e.parseRtpParameters=function(t){for(var i={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},r=e.splitLines(t),s=r[0].split(" "),o=3;o<s.length;o++){var l=s[o],a=e.matchPrefix(t,"a=rtpmap:"+l+" ")[0];if(a){var c=e.parseRtpMap(a),h=e.matchPrefix(t,"a=fmtp:"+l+" ");switch(c.parameters=h.length?e.parseFmtp(h[0]):{},c.rtcpFeedback=e.matchPrefix(t,"a=rtcp-fb:"+l+" ").map(e.parseRtcpFb),i.codecs.push(c),c.name.toUpperCase()){case"RED":case"ULPFEC":i.fecMechanisms.push(c.name.toUpperCase());break}}}return e.matchPrefix(t,"a=extmap:").forEach(function(u){i.headerExtensions.push(e.parseExtmap(u))}),i},e.writeRtpDescription=function(t,i){var r="";r+="m="+t+" ",r+=i.codecs.length>0?"9":"0",r+=" UDP/TLS/RTP/SAVPF ",r+=i.codecs.map(function(o){return o.preferredPayloadType!==void 0?o.preferredPayloadType:o.payloadType}).join(" ")+`\r
14
+ `,r+=`c=IN IP4 0.0.0.0\r
15
+ `,r+=`a=rtcp:9 IN IP4 0.0.0.0\r
16
+ `,i.codecs.forEach(function(o){r+=e.writeRtpMap(o),r+=e.writeFmtp(o),r+=e.writeRtcpFb(o)});var s=0;return i.codecs.forEach(function(o){o.maxptime>s&&(s=o.maxptime)}),s>0&&(r+="a=maxptime:"+s+`\r
17
+ `),r+=`a=rtcp-mux\r
18
+ `,i.headerExtensions&&i.headerExtensions.forEach(function(o){r+=e.writeExtmap(o)}),r},e.parseRtpEncodingParameters=function(t){var i=[],r=e.parseRtpParameters(t),s=r.fecMechanisms.indexOf("RED")!==-1,o=r.fecMechanisms.indexOf("ULPFEC")!==-1,l=e.matchPrefix(t,"a=ssrc:").map(function(d){return e.parseSsrcMedia(d)}).filter(function(d){return d.attribute==="cname"}),a=l.length>0&&l[0].ssrc,c,h=e.matchPrefix(t,"a=ssrc-group:FID").map(function(d){var p=d.substr(17).split(" ");return p.map(function(f){return parseInt(f,10)})});h.length>0&&h[0].length>1&&h[0][0]===a&&(c=h[0][1]),r.codecs.forEach(function(d){if(d.name.toUpperCase()==="RTX"&&d.parameters.apt){var p={ssrc:a,codecPayloadType:parseInt(d.parameters.apt,10)};a&&c&&(p.rtx={ssrc:c}),i.push(p),s&&(p=JSON.parse(JSON.stringify(p)),p.fec={ssrc:a,mechanism:o?"red+ulpfec":"red"},i.push(p))}}),i.length===0&&a&&i.push({ssrc:a});var u=e.matchPrefix(t,"b=");return u.length&&(u[0].indexOf("b=TIAS:")===0?u=parseInt(u[0].substr(7),10):u[0].indexOf("b=AS:")===0?u=parseInt(u[0].substr(5),10)*1e3*.95-50*40*8:u=void 0,i.forEach(function(d){d.maxBitrate=u})),i},e.parseRtcpParameters=function(t){var i={},r=e.matchPrefix(t,"a=ssrc:").map(function(l){return e.parseSsrcMedia(l)}).filter(function(l){return l.attribute==="cname"})[0];r&&(i.cname=r.value,i.ssrc=r.ssrc);var s=e.matchPrefix(t,"a=rtcp-rsize");i.reducedSize=s.length>0,i.compound=s.length===0;var o=e.matchPrefix(t,"a=rtcp-mux");return i.mux=o.length>0,i},e.parseMsid=function(t){var i,r=e.matchPrefix(t,"a=msid:");if(r.length===1)return i=r[0].substr(7).split(" "),{stream:i[0],track:i[1]};var s=e.matchPrefix(t,"a=ssrc:").map(function(o){return e.parseSsrcMedia(o)}).filter(function(o){return o.attribute==="msid"});if(s.length>0)return i=s[0].value.split(" "),{stream:i[0],track:i[1]}},e.parseSctpDescription=function(t){var i=e.parseMLine(t),r=e.matchPrefix(t,"a=max-message-size:"),s;r.length>0&&(s=parseInt(r[0].substr(19),10)),isNaN(s)&&(s=65536);var o=e.matchPrefix(t,"a=sctp-port:");if(o.length>0)return{port:parseInt(o[0].substr(12),10),protocol:i.fmt,maxMessageSize:s};var l=e.matchPrefix(t,"a=sctpmap:");if(l.length>0){var a=e.matchPrefix(t,"a=sctpmap:")[0].substr(10).split(" ");return{port:parseInt(a[0],10),protocol:a[1],maxMessageSize:s}}},e.writeSctpDescription=function(t,i){var r=[];return t.protocol!=="DTLS/SCTP"?r=["m="+t.kind+" 9 "+t.protocol+" "+i.protocol+`\r
19
19
  `,`c=IN IP4 0.0.0.0\r
20
20
  `,"a=sctp-port:"+i.port+`\r
21
- `]:s=["m="+t.kind+" 9 "+t.protocol+" "+i.port+`\r
21
+ `]:r=["m="+t.kind+" 9 "+t.protocol+" "+i.port+`\r
22
22
  `,`c=IN IP4 0.0.0.0\r
23
23
  `,"a=sctpmap:"+i.port+" "+i.protocol+` 65535\r
24
- `],i.maxMessageSize!==void 0&&s.push("a=max-message-size:"+i.maxMessageSize+`\r
25
- `),s.join("")},e.generateSessionId=function(){return Math.random().toString().substr(2,21)},e.writeSessionBoilerplate=function(t,i,s){var o,a=i!==void 0?i:2;t?o=t:o=e.generateSessionId();var c=s||"thisisadapterortc";return`v=0\r
26
- o=`+c+" "+o+" "+a+` IN IP4 127.0.0.1\r
24
+ `],i.maxMessageSize!==void 0&&r.push("a=max-message-size:"+i.maxMessageSize+`\r
25
+ `),r.join("")},e.generateSessionId=function(){return Math.random().toString().substr(2,21)},e.writeSessionBoilerplate=function(t,i,r){var s,o=i!==void 0?i:2;t?s=t:s=e.generateSessionId();var l=r||"thisisadapterortc";return`v=0\r
26
+ o=`+l+" "+s+" "+o+` IN IP4 127.0.0.1\r
27
27
  s=-\r
28
28
  t=0 0\r
29
- `},e.writeMediaSection=function(t,i,s,o){var a=e.writeRtpDescription(t.kind,i);if(a+=e.writeIceParameters(t.iceGatherer.getLocalParameters()),a+=e.writeDtlsParameters(t.dtlsTransport.getLocalParameters(),s==="offer"?"actpass":"active"),a+="a=mid:"+t.mid+`\r
30
- `,t.direction?a+="a="+t.direction+`\r
31
- `:t.rtpSender&&t.rtpReceiver?a+=`a=sendrecv\r
32
- `:t.rtpSender?a+=`a=sendonly\r
33
- `:t.rtpReceiver?a+=`a=recvonly\r
34
- `:a+=`a=inactive\r
35
- `,t.rtpSender){var c="msid:"+o.id+" "+t.rtpSender.track.id+`\r
36
- `;a+="a="+c,a+="a=ssrc:"+t.sendEncodingParameters[0].ssrc+" "+c,t.sendEncodingParameters[0].rtx&&(a+="a=ssrc:"+t.sendEncodingParameters[0].rtx.ssrc+" "+c,a+="a=ssrc-group:FID "+t.sendEncodingParameters[0].ssrc+" "+t.sendEncodingParameters[0].rtx.ssrc+`\r
37
- `)}return a+="a=ssrc:"+t.sendEncodingParameters[0].ssrc+" cname:"+e.localCName+`\r
38
- `,t.rtpSender&&t.sendEncodingParameters[0].rtx&&(a+="a=ssrc:"+t.sendEncodingParameters[0].rtx.ssrc+" cname:"+e.localCName+`\r
39
- `),a},e.getDirection=function(t,i){for(var s=e.splitLines(t),o=0;o<s.length;o++)switch(s[o]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return s[o].substr(2)}return i?e.getDirection(i):"sendrecv"},e.getKind=function(t){var i=e.splitLines(t),s=i[0].split(" ");return s[0].substr(2)},e.isRejected=function(t){return t.split(" ",2)[1]==="0"},e.parseMLine=function(t){var i=e.splitLines(t),s=i[0].substr(2).split(" ");return{kind:s[0],port:parseInt(s[1],10),protocol:s[2],fmt:s.slice(3).join(" ")}},e.parseOLine=function(t){var i=e.matchPrefix(t,"o=")[0],s=i.substr(2).split(" ");return{username:s[0],sessionId:s[1],sessionVersion:parseInt(s[2],10),netType:s[3],addressType:s[4],address:s[5]}},e.isValidSDP=function(t){if(typeof t!="string"||t.length===0)return!1;for(var i=e.splitLines(t),s=0;s<i.length;s++)if(i[s].length<2||i[s].charAt(1)!=="=")return!1;return!0},n.exports=e})(Za);var Xa=Za.exports;const vn=Cn(Xa);var H=Xa;function $l(n){return{inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[n.type]||n.type}function Va(n,e,t,i,s){var o=H.writeRtpDescription(n.kind,e);if(o+=H.writeIceParameters(n.iceGatherer.getLocalParameters()),o+=H.writeDtlsParameters(n.dtlsTransport.getLocalParameters(),t==="offer"?"actpass":s||"active"),o+="a=mid:"+n.mid+`\r
40
- `,n.rtpSender&&n.rtpReceiver?o+=`a=sendrecv\r
41
- `:n.rtpSender?o+=`a=sendonly\r
42
- `:n.rtpReceiver?o+=`a=recvonly\r
29
+ `},e.writeMediaSection=function(t,i,r,s){var o=e.writeRtpDescription(t.kind,i);if(o+=e.writeIceParameters(t.iceGatherer.getLocalParameters()),o+=e.writeDtlsParameters(t.dtlsTransport.getLocalParameters(),r==="offer"?"actpass":"active"),o+="a=mid:"+t.mid+`\r
30
+ `,t.direction?o+="a="+t.direction+`\r
31
+ `:t.rtpSender&&t.rtpReceiver?o+=`a=sendrecv\r
32
+ `:t.rtpSender?o+=`a=sendonly\r
33
+ `:t.rtpReceiver?o+=`a=recvonly\r
43
34
  `:o+=`a=inactive\r
44
- `,n.rtpSender){var a=n.rtpSender._initialTrackId||n.rtpSender.track.id;n.rtpSender._initialTrackId=a;var c="msid:"+(i?i.id:"-")+" "+a+`\r
45
- `;o+="a="+c,o+="a=ssrc:"+n.sendEncodingParameters[0].ssrc+" "+c,n.sendEncodingParameters[0].rtx&&(o+="a=ssrc:"+n.sendEncodingParameters[0].rtx.ssrc+" "+c,o+="a=ssrc-group:FID "+n.sendEncodingParameters[0].ssrc+" "+n.sendEncodingParameters[0].rtx.ssrc+`\r
46
- `)}return o+="a=ssrc:"+n.sendEncodingParameters[0].ssrc+" cname:"+H.localCName+`\r
47
- `,n.rtpSender&&n.sendEncodingParameters[0].rtx&&(o+="a=ssrc:"+n.sendEncodingParameters[0].rtx.ssrc+" cname:"+H.localCName+`\r
48
- `),o}function ec(n,e){var t=!1;return n=JSON.parse(JSON.stringify(n)),n.filter(function(i){if(i&&(i.urls||i.url)){var s=i.urls||i.url;i.url&&!i.urls&&console.warn("RTCIceServer.url is deprecated! Use urls instead.");var o=typeof s=="string";return o&&(s=[s]),s=s.filter(function(a){var c=a.indexOf("turn:")===0&&a.indexOf("transport=udp")!==-1&&a.indexOf("turn:[")===-1&&!t;return c?(t=!0,!0):a.indexOf("stun:")===0&&e>=14393&&a.indexOf("?transport=udp")===-1}),delete i.url,i.urls=o?s[0]:s,!!s.length}})}function Kn(n,e){var t={codecs:[],headerExtensions:[],fecMechanisms:[]},i=function(o,a){o=parseInt(o,10);for(var c=0;c<a.length;c++)if(a[c].payloadType===o||a[c].preferredPayloadType===o)return a[c]},s=function(o,a,c,r){var l=i(o.parameters.apt,c),d=i(a.parameters.apt,r);return l&&d&&l.name.toLowerCase()===d.name.toLowerCase()};return n.codecs.forEach(function(o){for(var a=0;a<e.codecs.length;a++){var c=e.codecs[a];if(o.name.toLowerCase()===c.name.toLowerCase()&&o.clockRate===c.clockRate){if(o.name.toLowerCase()==="rtx"&&o.parameters&&c.parameters.apt&&!s(o,c,n.codecs,e.codecs))continue;c=JSON.parse(JSON.stringify(c)),c.numChannels=Math.min(o.numChannels,c.numChannels),t.codecs.push(c),c.rtcpFeedback=c.rtcpFeedback.filter(function(r){for(var l=0;l<o.rtcpFeedback.length;l++)if(o.rtcpFeedback[l].type===r.type&&o.rtcpFeedback[l].parameter===r.parameter)return!0;return!1});break}}}),n.headerExtensions.forEach(function(o){for(var a=0;a<e.headerExtensions.length;a++){var c=e.headerExtensions[a];if(o.uri===c.uri){t.headerExtensions.push(c);break}}}),t}function Ra(n,e,t){return{offer:{setLocalDescription:["stable","have-local-offer"],setRemoteDescription:["stable","have-remote-offer"]},answer:{setLocalDescription:["have-remote-offer","have-local-pranswer"],setRemoteDescription:["have-local-offer","have-remote-pranswer"]}}[e][n].indexOf(t)!==-1}function Hs(n,e){var t=n.getRemoteCandidates().find(function(i){return e.foundation===i.foundation&&e.ip===i.ip&&e.port===i.port&&e.priority===i.priority&&e.protocol===i.protocol&&e.type===i.type});return t||n.addRemoteCandidate(e),!t}function ye(n,e){var t=new Error(e);return t.name=n,t.code={NotSupportedError:9,InvalidStateError:11,InvalidAccessError:15,TypeError:void 0,OperationError:void 0}[n],t}var tc=function(n,e){function t(r,l){l.addTrack(r),l.dispatchEvent(new n.MediaStreamTrackEvent("addtrack",{track:r}))}function i(r,l){l.removeTrack(r),l.dispatchEvent(new n.MediaStreamTrackEvent("removetrack",{track:r}))}function s(r,l,d,h){var u=new Event("track");u.track=l,u.receiver=d,u.transceiver={receiver:d},u.streams=h,n.setTimeout(function(){r._dispatchEvent("track",u)})}var o=function(r){var l=this,d=document.createDocumentFragment();if(["addEventListener","removeEventListener","dispatchEvent"].forEach(function(u){l[u]=d[u].bind(d)}),this.canTrickleIceCandidates=null,this.needNegotiation=!1,this.localStreams=[],this.remoteStreams=[],this._localDescription=null,this._remoteDescription=null,this.signalingState="stable",this.iceConnectionState="new",this.connectionState="new",this.iceGatheringState="new",r=JSON.parse(JSON.stringify(r||{})),this.usingBundle=r.bundlePolicy==="max-bundle",r.rtcpMuxPolicy==="negotiate")throw ye("NotSupportedError","rtcpMuxPolicy 'negotiate' is not supported");switch(r.rtcpMuxPolicy||(r.rtcpMuxPolicy="require"),r.iceTransportPolicy){case"all":case"relay":break;default:r.iceTransportPolicy="all";break}switch(r.bundlePolicy){case"balanced":case"max-compat":case"max-bundle":break;default:r.bundlePolicy="balanced";break}if(r.iceServers=ec(r.iceServers||[],e),this._iceGatherers=[],r.iceCandidatePoolSize)for(var h=r.iceCandidatePoolSize;h>0;h--)this._iceGatherers.push(new n.RTCIceGatherer({iceServers:r.iceServers,gatherPolicy:r.iceTransportPolicy}));else r.iceCandidatePoolSize=0;this._config=r,this.transceivers=[],this._sdpSessionId=H.generateSessionId(),this._sdpSessionVersion=0,this._dtlsRole=void 0,this._isClosed=!1};Object.defineProperty(o.prototype,"localDescription",{configurable:!0,get:function(){return this._localDescription}}),Object.defineProperty(o.prototype,"remoteDescription",{configurable:!0,get:function(){return this._remoteDescription}}),o.prototype.onicecandidate=null,o.prototype.onaddstream=null,o.prototype.ontrack=null,o.prototype.onremovestream=null,o.prototype.onsignalingstatechange=null,o.prototype.oniceconnectionstatechange=null,o.prototype.onconnectionstatechange=null,o.prototype.onicegatheringstatechange=null,o.prototype.onnegotiationneeded=null,o.prototype.ondatachannel=null,o.prototype._dispatchEvent=function(r,l){this._isClosed||(this.dispatchEvent(l),typeof this["on"+r]=="function"&&this["on"+r](l))},o.prototype._emitGatheringStateChange=function(){var r=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",r)},o.prototype.getConfiguration=function(){return this._config},o.prototype.getLocalStreams=function(){return this.localStreams},o.prototype.getRemoteStreams=function(){return this.remoteStreams},o.prototype._createTransceiver=function(r,l){var d=this.transceivers.length>0,h={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:r,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:!0};if(this.usingBundle&&d)h.iceTransport=this.transceivers[0].iceTransport,h.dtlsTransport=this.transceivers[0].dtlsTransport;else{var u=this._createIceAndDtlsTransports();h.iceTransport=u.iceTransport,h.dtlsTransport=u.dtlsTransport}return l||this.transceivers.push(h),h},o.prototype.addTrack=function(r,l){if(this._isClosed)throw ye("InvalidStateError","Attempted to call addTrack on a closed peerconnection.");var d=this.transceivers.find(function(p){return p.track===r});if(d)throw ye("InvalidAccessError","Track already exists.");for(var h,u=0;u<this.transceivers.length;u++)!this.transceivers[u].track&&this.transceivers[u].kind===r.kind&&(h=this.transceivers[u]);return h||(h=this._createTransceiver(r.kind)),this._maybeFireNegotiationNeeded(),this.localStreams.indexOf(l)===-1&&this.localStreams.push(l),h.track=r,h.stream=l,h.rtpSender=new n.RTCRtpSender(r,h.dtlsTransport),h.rtpSender},o.prototype.addStream=function(r){var l=this;if(e>=15025)r.getTracks().forEach(function(h){l.addTrack(h,r)});else{var d=r.clone();r.getTracks().forEach(function(h,u){var p=d.getTracks()[u];h.addEventListener("enabled",function(m){p.enabled=m.enabled})}),d.getTracks().forEach(function(h){l.addTrack(h,d)})}},o.prototype.removeTrack=function(r){if(this._isClosed)throw ye("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.");if(!(r instanceof n.RTCRtpSender))throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.");var l=this.transceivers.find(function(u){return u.rtpSender===r});if(!l)throw ye("InvalidAccessError","Sender was not created by this connection.");var d=l.stream;l.rtpSender.stop(),l.rtpSender=null,l.track=null,l.stream=null;var h=this.transceivers.map(function(u){return u.stream});h.indexOf(d)===-1&&this.localStreams.indexOf(d)>-1&&this.localStreams.splice(this.localStreams.indexOf(d),1),this._maybeFireNegotiationNeeded()},o.prototype.removeStream=function(r){var l=this;r.getTracks().forEach(function(d){var h=l.getSenders().find(function(u){return u.track===d});h&&l.removeTrack(h)})},o.prototype.getSenders=function(){return this.transceivers.filter(function(r){return!!r.rtpSender}).map(function(r){return r.rtpSender})},o.prototype.getReceivers=function(){return this.transceivers.filter(function(r){return!!r.rtpReceiver}).map(function(r){return r.rtpReceiver})},o.prototype._createIceGatherer=function(r,l){var d=this;if(l&&r>0)return this.transceivers[0].iceGatherer;if(this._iceGatherers.length)return this._iceGatherers.shift();var h=new n.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});return Object.defineProperty(h,"state",{value:"new",writable:!0}),this.transceivers[r].bufferedCandidateEvents=[],this.transceivers[r].bufferCandidates=function(u){var p=!u.candidate||Object.keys(u.candidate).length===0;h.state=p?"completed":"gathering",d.transceivers[r].bufferedCandidateEvents!==null&&d.transceivers[r].bufferedCandidateEvents.push(u)},h.addEventListener("localcandidate",this.transceivers[r].bufferCandidates),h},o.prototype._gather=function(r,l){var d=this,h=this.transceivers[l].iceGatherer;if(!h.onlocalcandidate){var u=this.transceivers[l].bufferedCandidateEvents;this.transceivers[l].bufferedCandidateEvents=null,h.removeEventListener("localcandidate",this.transceivers[l].bufferCandidates),h.onlocalcandidate=function(p){if(!(d.usingBundle&&l>0)){var m=new Event("icecandidate");m.candidate={sdpMid:r,sdpMLineIndex:l};var b=p.candidate,G=!b||Object.keys(b).length===0;if(G)(h.state==="new"||h.state==="gathering")&&(h.state="completed");else{h.state==="new"&&(h.state="gathering"),b.component=1,b.ufrag=h.getLocalParameters().usernameFragment;var y=H.writeCandidate(b);m.candidate=Object.assign(m.candidate,H.parseCandidate(y)),m.candidate.candidate=y,m.candidate.toJSON=function(){return{candidate:m.candidate.candidate,sdpMid:m.candidate.sdpMid,sdpMLineIndex:m.candidate.sdpMLineIndex,usernameFragment:m.candidate.usernameFragment}}}var Z=H.getMediaSections(d._localDescription.sdp);G?Z[m.candidate.sdpMLineIndex]+=`a=end-of-candidates\r
49
- `:Z[m.candidate.sdpMLineIndex]+="a="+m.candidate.candidate+`\r
50
- `,d._localDescription.sdp=H.getDescription(d._localDescription.sdp)+Z.join("");var X=d.transceivers.every(function(L){return L.iceGatherer&&L.iceGatherer.state==="completed"});d.iceGatheringState!=="gathering"&&(d.iceGatheringState="gathering",d._emitGatheringStateChange()),G||d._dispatchEvent("icecandidate",m),X&&(d._dispatchEvent("icecandidate",new Event("icecandidate")),d.iceGatheringState="complete",d._emitGatheringStateChange())}},n.setTimeout(function(){u.forEach(function(p){h.onlocalcandidate(p)})},0)}},o.prototype._createIceAndDtlsTransports=function(){var r=this,l=new n.RTCIceTransport(null);l.onicestatechange=function(){r._updateIceConnectionState(),r._updateConnectionState()};var d=new n.RTCDtlsTransport(l);return d.ondtlsstatechange=function(){r._updateConnectionState()},d.onerror=function(){Object.defineProperty(d,"state",{value:"failed",writable:!0}),r._updateConnectionState()},{iceTransport:l,dtlsTransport:d}},o.prototype._disposeIceAndDtlsTransports=function(r){var l=this.transceivers[r].iceGatherer;l&&(delete l.onlocalcandidate,delete this.transceivers[r].iceGatherer);var d=this.transceivers[r].iceTransport;d&&(delete d.onicestatechange,delete this.transceivers[r].iceTransport);var h=this.transceivers[r].dtlsTransport;h&&(delete h.ondtlsstatechange,delete h.onerror,delete this.transceivers[r].dtlsTransport)},o.prototype._transceive=function(r,l,d){var h=Kn(r.localCapabilities,r.remoteCapabilities);l&&r.rtpSender&&(h.encodings=r.sendEncodingParameters,h.rtcp={cname:H.localCName,compound:r.rtcpParameters.compound},r.recvEncodingParameters.length&&(h.rtcp.ssrc=r.recvEncodingParameters[0].ssrc),r.rtpSender.send(h)),d&&r.rtpReceiver&&h.codecs.length>0&&(r.kind==="video"&&r.recvEncodingParameters&&e<15019&&r.recvEncodingParameters.forEach(function(u){delete u.rtx}),r.recvEncodingParameters.length?h.encodings=r.recvEncodingParameters:h.encodings=[{}],h.rtcp={compound:r.rtcpParameters.compound},r.rtcpParameters.cname&&(h.rtcp.cname=r.rtcpParameters.cname),r.sendEncodingParameters.length&&(h.rtcp.ssrc=r.sendEncodingParameters[0].ssrc),r.rtpReceiver.receive(h))},o.prototype.setLocalDescription=function(r){var l=this;if(["offer","answer"].indexOf(r.type)===-1)return Promise.reject(ye("TypeError",'Unsupported type "'+r.type+'"'));if(!Ra("setLocalDescription",r.type,l.signalingState)||l._isClosed)return Promise.reject(ye("InvalidStateError","Can not set local "+r.type+" in state "+l.signalingState));var d,h;if(r.type==="offer")d=H.splitSections(r.sdp),h=d.shift(),d.forEach(function(p,m){var b=H.parseRtpParameters(p);l.transceivers[m].localCapabilities=b}),l.transceivers.forEach(function(p,m){l._gather(p.mid,m)});else if(r.type==="answer"){d=H.splitSections(l._remoteDescription.sdp),h=d.shift();var u=H.matchPrefix(h,"a=ice-lite").length>0;d.forEach(function(p,m){var b=l.transceivers[m],G=b.iceGatherer,y=b.iceTransport,Z=b.dtlsTransport,X=b.localCapabilities,L=b.remoteCapabilities,V=H.isRejected(p)&&H.matchPrefix(p,"a=bundle-only").length===0;if(!V&&!b.rejected){var x=H.getIceParameters(p,h),R=H.getDtlsParameters(p,h);u&&(R.role="server"),(!l.usingBundle||m===0)&&(l._gather(b.mid,m),y.state==="new"&&y.start(G,x,u?"controlling":"controlled"),Z.state==="new"&&Z.start(R));var S=Kn(X,L);l._transceive(b,S.codecs.length>0,!1)}})}return l._localDescription={type:r.type,sdp:r.sdp},r.type==="offer"?l._updateSignalingState("have-local-offer"):l._updateSignalingState("stable"),Promise.resolve()},o.prototype.setRemoteDescription=function(r){var l=this;if(["offer","answer"].indexOf(r.type)===-1)return Promise.reject(ye("TypeError",'Unsupported type "'+r.type+'"'));if(!Ra("setRemoteDescription",r.type,l.signalingState)||l._isClosed)return Promise.reject(ye("InvalidStateError","Can not set remote "+r.type+" in state "+l.signalingState));var d={};l.remoteStreams.forEach(function(y){d[y.id]=y});var h=[],u=H.splitSections(r.sdp),p=u.shift(),m=H.matchPrefix(p,"a=ice-lite").length>0,b=H.matchPrefix(p,"a=group:BUNDLE ").length>0;l.usingBundle=b;var G=H.matchPrefix(p,"a=ice-options:")[0];return G?l.canTrickleIceCandidates=G.substr(14).split(" ").indexOf("trickle")>=0:l.canTrickleIceCandidates=!1,u.forEach(function(y,Z){var X=H.splitLines(y),L=H.getKind(y),V=H.isRejected(y)&&H.matchPrefix(y,"a=bundle-only").length===0,x=X[0].substr(2).split(" ")[2],R=H.getDirection(y,p),S=H.parseMsid(y),W=H.getMid(y)||H.generateIdentifier();if(V||L==="application"&&(x==="DTLS/SCTP"||x==="UDP/DTLS/SCTP")){l.transceivers[Z]={mid:W,kind:L,protocol:x,rejected:!0};return}!V&&l.transceivers[Z]&&l.transceivers[Z].rejected&&(l.transceivers[Z]=l._createTransceiver(L,!0));var f,C,g,z,Y,k,N,Q,P,ae=H.parseRtpParameters(y),ie,ee;V||(ie=H.getIceParameters(y,p),ee=H.getDtlsParameters(y,p),ee.role="client"),N=H.parseRtpEncodingParameters(y);var ze=H.parseRtcpParameters(y),Se=H.matchPrefix(y,"a=end-of-candidates",p).length>0,ne=H.matchPrefix(y,"a=candidate:").map(function(_){return H.parseCandidate(_)}).filter(function(_){return _.component===1});if((r.type==="offer"||r.type==="answer")&&!V&&b&&Z>0&&l.transceivers[Z]&&(l._disposeIceAndDtlsTransports(Z),l.transceivers[Z].iceGatherer=l.transceivers[0].iceGatherer,l.transceivers[Z].iceTransport=l.transceivers[0].iceTransport,l.transceivers[Z].dtlsTransport=l.transceivers[0].dtlsTransport,l.transceivers[Z].rtpSender&&l.transceivers[Z].rtpSender.setTransport(l.transceivers[0].dtlsTransport),l.transceivers[Z].rtpReceiver&&l.transceivers[Z].rtpReceiver.setTransport(l.transceivers[0].dtlsTransport)),r.type==="offer"&&!V){f=l.transceivers[Z]||l._createTransceiver(L),f.mid=W,f.iceGatherer||(f.iceGatherer=l._createIceGatherer(Z,b)),ne.length&&f.iceTransport.state==="new"&&(Se&&(!b||Z===0)?f.iceTransport.setRemoteCandidates(ne):ne.forEach(function(_){Hs(f.iceTransport,_)})),Q=n.RTCRtpReceiver.getCapabilities(L),e<15019&&(Q.codecs=Q.codecs.filter(function(_){return _.name!=="rtx"})),k=f.sendEncodingParameters||[{ssrc:(2*Z+2)*1001}];var me=!1;if(R==="sendrecv"||R==="sendonly"){if(me=!f.rtpReceiver,Y=f.rtpReceiver||new n.RTCRtpReceiver(f.dtlsTransport,L),me){var te;P=Y.track,S&&S.stream==="-"||(S?(d[S.stream]||(d[S.stream]=new n.MediaStream,Object.defineProperty(d[S.stream],"id",{get:function(){return S.stream}})),Object.defineProperty(P,"id",{get:function(){return S.track}}),te=d[S.stream]):(d.default||(d.default=new n.MediaStream),te=d.default)),te&&(t(P,te),f.associatedRemoteMediaStreams.push(te)),h.push([P,Y,te])}}else f.rtpReceiver&&f.rtpReceiver.track&&(f.associatedRemoteMediaStreams.forEach(function(_){var Oe=_.getTracks().find(function(it){return it.id===f.rtpReceiver.track.id});Oe&&i(Oe,_)}),f.associatedRemoteMediaStreams=[]);f.localCapabilities=Q,f.remoteCapabilities=ae,f.rtpReceiver=Y,f.rtcpParameters=ze,f.sendEncodingParameters=k,f.recvEncodingParameters=N,l._transceive(l.transceivers[Z],!1,me)}else if(r.type==="answer"&&!V){f=l.transceivers[Z],C=f.iceGatherer,g=f.iceTransport,z=f.dtlsTransport,Y=f.rtpReceiver,k=f.sendEncodingParameters,Q=f.localCapabilities,l.transceivers[Z].recvEncodingParameters=N,l.transceivers[Z].remoteCapabilities=ae,l.transceivers[Z].rtcpParameters=ze,ne.length&&g.state==="new"&&((m||Se)&&(!b||Z===0)?g.setRemoteCandidates(ne):ne.forEach(function(_){Hs(f.iceTransport,_)})),(!b||Z===0)&&(g.state==="new"&&g.start(C,ie,"controlling"),z.state==="new"&&z.start(ee));var O=Kn(f.localCapabilities,f.remoteCapabilities),mt=O.codecs.filter(function(_){return _.name.toLowerCase()==="rtx"}).length;!mt&&f.sendEncodingParameters[0].rtx&&delete f.sendEncodingParameters[0].rtx,l._transceive(f,R==="sendrecv"||R==="recvonly",R==="sendrecv"||R==="sendonly"),Y&&(R==="sendrecv"||R==="sendonly")?(P=Y.track,S?(d[S.stream]||(d[S.stream]=new n.MediaStream),t(P,d[S.stream]),h.push([P,Y,d[S.stream]])):(d.default||(d.default=new n.MediaStream),t(P,d.default),h.push([P,Y,d.default]))):delete f.rtpReceiver}}),l._dtlsRole===void 0&&(l._dtlsRole=r.type==="offer"?"active":"passive"),l._remoteDescription={type:r.type,sdp:r.sdp},r.type==="offer"?l._updateSignalingState("have-remote-offer"):l._updateSignalingState("stable"),Object.keys(d).forEach(function(y){var Z=d[y];if(Z.getTracks().length){if(l.remoteStreams.indexOf(Z)===-1){l.remoteStreams.push(Z);var X=new Event("addstream");X.stream=Z,n.setTimeout(function(){l._dispatchEvent("addstream",X)})}h.forEach(function(L){var V=L[0],x=L[1];Z.id===L[2].id&&s(l,V,x,[Z])})}}),h.forEach(function(y){y[2]||s(l,y[0],y[1],[])}),n.setTimeout(function(){l&&l.transceivers&&l.transceivers.forEach(function(y){y.iceTransport&&y.iceTransport.state==="new"&&y.iceTransport.getRemoteCandidates().length>0&&(console.warn("Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification"),y.iceTransport.addRemoteCandidate({}))})},4e3),Promise.resolve()},o.prototype.close=function(){this.transceivers.forEach(function(r){r.iceTransport&&r.iceTransport.stop(),r.dtlsTransport&&r.dtlsTransport.stop(),r.rtpSender&&r.rtpSender.stop(),r.rtpReceiver&&r.rtpReceiver.stop()}),this._isClosed=!0,this._updateSignalingState("closed")},o.prototype._updateSignalingState=function(r){this.signalingState=r;var l=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",l)},o.prototype._maybeFireNegotiationNeeded=function(){var r=this;this.signalingState!=="stable"||this.needNegotiation===!0||(this.needNegotiation=!0,n.setTimeout(function(){if(r.needNegotiation){r.needNegotiation=!1;var l=new Event("negotiationneeded");r._dispatchEvent("negotiationneeded",l)}},0))},o.prototype._updateIceConnectionState=function(){var r,l={new:0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(h){h.iceTransport&&!h.rejected&&l[h.iceTransport.state]++}),r="new",l.failed>0?r="failed":l.checking>0?r="checking":l.disconnected>0?r="disconnected":l.new>0?r="new":l.connected>0?r="connected":l.completed>0&&(r="completed"),r!==this.iceConnectionState){this.iceConnectionState=r;var d=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",d)}},o.prototype._updateConnectionState=function(){var r,l={new:0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(h){h.iceTransport&&h.dtlsTransport&&!h.rejected&&(l[h.iceTransport.state]++,l[h.dtlsTransport.state]++)}),l.connected+=l.completed,r="new",l.failed>0?r="failed":l.connecting>0?r="connecting":l.disconnected>0?r="disconnected":l.new>0?r="new":l.connected>0&&(r="connected"),r!==this.connectionState){this.connectionState=r;var d=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",d)}},o.prototype.createOffer=function(){var r=this;if(r._isClosed)return Promise.reject(ye("InvalidStateError","Can not call createOffer after close"));var l=r.transceivers.filter(function(m){return m.kind==="audio"}).length,d=r.transceivers.filter(function(m){return m.kind==="video"}).length,h=arguments[0];if(h){if(h.mandatory||h.optional)throw new TypeError("Legacy mandatory/optional constraints not supported.");h.offerToReceiveAudio!==void 0&&(h.offerToReceiveAudio===!0?l=1:h.offerToReceiveAudio===!1?l=0:l=h.offerToReceiveAudio),h.offerToReceiveVideo!==void 0&&(h.offerToReceiveVideo===!0?d=1:h.offerToReceiveVideo===!1?d=0:d=h.offerToReceiveVideo)}for(r.transceivers.forEach(function(m){m.kind==="audio"?(l--,l<0&&(m.wantReceive=!1)):m.kind==="video"&&(d--,d<0&&(m.wantReceive=!1))});l>0||d>0;)l>0&&(r._createTransceiver("audio"),l--),d>0&&(r._createTransceiver("video"),d--);var u=H.writeSessionBoilerplate(r._sdpSessionId,r._sdpSessionVersion++);r.transceivers.forEach(function(m,b){var G=m.track,y=m.kind,Z=m.mid||H.generateIdentifier();m.mid=Z,m.iceGatherer||(m.iceGatherer=r._createIceGatherer(b,r.usingBundle));var X=n.RTCRtpSender.getCapabilities(y);e<15019&&(X.codecs=X.codecs.filter(function(V){return V.name!=="rtx"})),X.codecs.forEach(function(V){V.name==="H264"&&V.parameters["level-asymmetry-allowed"]===void 0&&(V.parameters["level-asymmetry-allowed"]="1"),m.remoteCapabilities&&m.remoteCapabilities.codecs&&m.remoteCapabilities.codecs.forEach(function(x){V.name.toLowerCase()===x.name.toLowerCase()&&V.clockRate===x.clockRate&&(V.preferredPayloadType=x.payloadType)})}),X.headerExtensions.forEach(function(V){var x=m.remoteCapabilities&&m.remoteCapabilities.headerExtensions||[];x.forEach(function(R){V.uri===R.uri&&(V.id=R.id)})});var L=m.sendEncodingParameters||[{ssrc:(2*b+1)*1001}];G&&e>=15019&&y==="video"&&!L[0].rtx&&(L[0].rtx={ssrc:L[0].ssrc+1}),m.wantReceive&&(m.rtpReceiver=new n.RTCRtpReceiver(m.dtlsTransport,y)),m.localCapabilities=X,m.sendEncodingParameters=L}),r._config.bundlePolicy!=="max-compat"&&(u+="a=group:BUNDLE "+r.transceivers.map(function(m){return m.mid}).join(" ")+`\r
51
- `),u+=`a=ice-options:trickle\r
52
- `,r.transceivers.forEach(function(m,b){u+=Va(m,m.localCapabilities,"offer",m.stream,r._dtlsRole),u+=`a=rtcp-rsize\r
53
- `,m.iceGatherer&&r.iceGatheringState!=="new"&&(b===0||!r.usingBundle)&&(m.iceGatherer.getLocalCandidates().forEach(function(G){G.component=1,u+="a="+H.writeCandidate(G)+`\r
54
- `}),m.iceGatherer.state==="completed"&&(u+=`a=end-of-candidates\r
55
- `))});var p=new n.RTCSessionDescription({type:"offer",sdp:u});return Promise.resolve(p)},o.prototype.createAnswer=function(){var r=this;if(r._isClosed)return Promise.reject(ye("InvalidStateError","Can not call createAnswer after close"));if(!(r.signalingState==="have-remote-offer"||r.signalingState==="have-local-pranswer"))return Promise.reject(ye("InvalidStateError","Can not call createAnswer in signalingState "+r.signalingState));var l=H.writeSessionBoilerplate(r._sdpSessionId,r._sdpSessionVersion++);r.usingBundle&&(l+="a=group:BUNDLE "+r.transceivers.map(function(u){return u.mid}).join(" ")+`\r
56
- `),l+=`a=ice-options:trickle\r
57
- `;var d=H.getMediaSections(r._remoteDescription.sdp).length;r.transceivers.forEach(function(u,p){if(!(p+1>d)){if(u.rejected){u.kind==="application"?u.protocol==="DTLS/SCTP"?l+=`m=application 0 DTLS/SCTP 5000\r
58
- `:l+="m=application 0 "+u.protocol+` webrtc-datachannel\r
59
- `:u.kind==="audio"?l+=`m=audio 0 UDP/TLS/RTP/SAVPF 0\r
35
+ `,t.rtpSender){var l="msid:"+s.id+" "+t.rtpSender.track.id+`\r
36
+ `;o+="a="+l,o+="a=ssrc:"+t.sendEncodingParameters[0].ssrc+" "+l,t.sendEncodingParameters[0].rtx&&(o+="a=ssrc:"+t.sendEncodingParameters[0].rtx.ssrc+" "+l,o+="a=ssrc-group:FID "+t.sendEncodingParameters[0].ssrc+" "+t.sendEncodingParameters[0].rtx.ssrc+`\r
37
+ `)}return o+="a=ssrc:"+t.sendEncodingParameters[0].ssrc+" cname:"+e.localCName+`\r
38
+ `,t.rtpSender&&t.sendEncodingParameters[0].rtx&&(o+="a=ssrc:"+t.sendEncodingParameters[0].rtx.ssrc+" cname:"+e.localCName+`\r
39
+ `),o},e.getDirection=function(t,i){for(var r=e.splitLines(t),s=0;s<r.length;s++)switch(r[s]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return r[s].substr(2)}return i?e.getDirection(i):"sendrecv"},e.getKind=function(t){var i=e.splitLines(t),r=i[0].split(" ");return r[0].substr(2)},e.isRejected=function(t){return t.split(" ",2)[1]==="0"},e.parseMLine=function(t){var i=e.splitLines(t),r=i[0].substr(2).split(" ");return{kind:r[0],port:parseInt(r[1],10),protocol:r[2],fmt:r.slice(3).join(" ")}},e.parseOLine=function(t){var i=e.matchPrefix(t,"o=")[0],r=i.substr(2).split(" ");return{username:r[0],sessionId:r[1],sessionVersion:parseInt(r[2],10),netType:r[3],addressType:r[4],address:r[5]}},e.isValidSDP=function(t){if(typeof t!="string"||t.length===0)return!1;for(var i=e.splitLines(t),r=0;r<i.length;r++)if(i[r].length<2||i[r].charAt(1)!=="=")return!1;return!0},n.exports=e})(vo);var bo=vo.exports;const kn=En(bo);var z=bo;function Qc(n){return{inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[n.type]||n.type}function xo(n,e,t,i,r){var s=z.writeRtpDescription(n.kind,e);if(s+=z.writeIceParameters(n.iceGatherer.getLocalParameters()),s+=z.writeDtlsParameters(n.dtlsTransport.getLocalParameters(),t==="offer"?"actpass":r||"active"),s+="a=mid:"+n.mid+`\r
40
+ `,n.rtpSender&&n.rtpReceiver?s+=`a=sendrecv\r
41
+ `:n.rtpSender?s+=`a=sendonly\r
42
+ `:n.rtpReceiver?s+=`a=recvonly\r
43
+ `:s+=`a=inactive\r
44
+ `,n.rtpSender){var o=n.rtpSender._initialTrackId||n.rtpSender.track.id;n.rtpSender._initialTrackId=o;var l="msid:"+(i?i.id:"-")+" "+o+`\r
45
+ `;s+="a="+l,s+="a=ssrc:"+n.sendEncodingParameters[0].ssrc+" "+l,n.sendEncodingParameters[0].rtx&&(s+="a=ssrc:"+n.sendEncodingParameters[0].rtx.ssrc+" "+l,s+="a=ssrc-group:FID "+n.sendEncodingParameters[0].ssrc+" "+n.sendEncodingParameters[0].rtx.ssrc+`\r
46
+ `)}return s+="a=ssrc:"+n.sendEncodingParameters[0].ssrc+" cname:"+z.localCName+`\r
47
+ `,n.rtpSender&&n.sendEncodingParameters[0].rtx&&(s+="a=ssrc:"+n.sendEncodingParameters[0].rtx.ssrc+" cname:"+z.localCName+`\r
48
+ `),s}function Kc(n,e){var t=!1;return n=JSON.parse(JSON.stringify(n)),n.filter(function(i){if(i&&(i.urls||i.url)){var r=i.urls||i.url;i.url&&!i.urls&&console.warn("RTCIceServer.url is deprecated! Use urls instead.");var s=typeof r=="string";return s&&(r=[r]),r=r.filter(function(o){var l=o.indexOf("turn:")===0&&o.indexOf("transport=udp")!==-1&&o.indexOf("turn:[")===-1&&!t;return l?(t=!0,!0):o.indexOf("stun:")===0&&e>=14393&&o.indexOf("?transport=udp")===-1}),delete i.url,i.urls=s?r[0]:r,!!r.length}})}function Rn(n,e){var t={codecs:[],headerExtensions:[],fecMechanisms:[]},i=function(s,o){s=parseInt(s,10);for(var l=0;l<o.length;l++)if(o[l].payloadType===s||o[l].preferredPayloadType===s)return o[l]},r=function(s,o,l,a){var c=i(s.parameters.apt,l),h=i(o.parameters.apt,a);return c&&h&&c.name.toLowerCase()===h.name.toLowerCase()};return n.codecs.forEach(function(s){for(var o=0;o<e.codecs.length;o++){var l=e.codecs[o];if(s.name.toLowerCase()===l.name.toLowerCase()&&s.clockRate===l.clockRate){if(s.name.toLowerCase()==="rtx"&&s.parameters&&l.parameters.apt&&!r(s,l,n.codecs,e.codecs))continue;l=JSON.parse(JSON.stringify(l)),l.numChannels=Math.min(s.numChannels,l.numChannels),t.codecs.push(l),l.rtcpFeedback=l.rtcpFeedback.filter(function(a){for(var c=0;c<s.rtcpFeedback.length;c++)if(s.rtcpFeedback[c].type===a.type&&s.rtcpFeedback[c].parameter===a.parameter)return!0;return!1});break}}}),n.headerExtensions.forEach(function(s){for(var o=0;o<e.headerExtensions.length;o++){var l=e.headerExtensions[o];if(s.uri===l.uri){t.headerExtensions.push(l);break}}}),t}function _o(n,e,t){return{offer:{setLocalDescription:["stable","have-local-offer"],setRemoteDescription:["stable","have-remote-offer"]},answer:{setLocalDescription:["have-remote-offer","have-local-pranswer"],setRemoteDescription:["have-local-offer","have-remote-pranswer"]}}[e][n].indexOf(t)!==-1}function zr(n,e){var t=n.getRemoteCandidates().find(function(i){return e.foundation===i.foundation&&e.ip===i.ip&&e.port===i.port&&e.priority===i.priority&&e.protocol===i.protocol&&e.type===i.type});return t||n.addRemoteCandidate(e),!t}function ye(n,e){var t=new Error(e);return t.name=n,t.code={NotSupportedError:9,InvalidStateError:11,InvalidAccessError:15,TypeError:void 0,OperationError:void 0}[n],t}var $c=function(n,e){function t(a,c){c.addTrack(a),c.dispatchEvent(new n.MediaStreamTrackEvent("addtrack",{track:a}))}function i(a,c){c.removeTrack(a),c.dispatchEvent(new n.MediaStreamTrackEvent("removetrack",{track:a}))}function r(a,c,h,u){var d=new Event("track");d.track=c,d.receiver=h,d.transceiver={receiver:h},d.streams=u,n.setTimeout(function(){a._dispatchEvent("track",d)})}var s=function(a){var c=this,h=document.createDocumentFragment();if(["addEventListener","removeEventListener","dispatchEvent"].forEach(function(d){c[d]=h[d].bind(h)}),this.canTrickleIceCandidates=null,this.needNegotiation=!1,this.localStreams=[],this.remoteStreams=[],this._localDescription=null,this._remoteDescription=null,this.signalingState="stable",this.iceConnectionState="new",this.connectionState="new",this.iceGatheringState="new",a=JSON.parse(JSON.stringify(a||{})),this.usingBundle=a.bundlePolicy==="max-bundle",a.rtcpMuxPolicy==="negotiate")throw ye("NotSupportedError","rtcpMuxPolicy 'negotiate' is not supported");switch(a.rtcpMuxPolicy||(a.rtcpMuxPolicy="require"),a.iceTransportPolicy){case"all":case"relay":break;default:a.iceTransportPolicy="all";break}switch(a.bundlePolicy){case"balanced":case"max-compat":case"max-bundle":break;default:a.bundlePolicy="balanced";break}if(a.iceServers=Kc(a.iceServers||[],e),this._iceGatherers=[],a.iceCandidatePoolSize)for(var u=a.iceCandidatePoolSize;u>0;u--)this._iceGatherers.push(new n.RTCIceGatherer({iceServers:a.iceServers,gatherPolicy:a.iceTransportPolicy}));else a.iceCandidatePoolSize=0;this._config=a,this.transceivers=[],this._sdpSessionId=z.generateSessionId(),this._sdpSessionVersion=0,this._dtlsRole=void 0,this._isClosed=!1};Object.defineProperty(s.prototype,"localDescription",{configurable:!0,get:function(){return this._localDescription}}),Object.defineProperty(s.prototype,"remoteDescription",{configurable:!0,get:function(){return this._remoteDescription}}),s.prototype.onicecandidate=null,s.prototype.onaddstream=null,s.prototype.ontrack=null,s.prototype.onremovestream=null,s.prototype.onsignalingstatechange=null,s.prototype.oniceconnectionstatechange=null,s.prototype.onconnectionstatechange=null,s.prototype.onicegatheringstatechange=null,s.prototype.onnegotiationneeded=null,s.prototype.ondatachannel=null,s.prototype._dispatchEvent=function(a,c){this._isClosed||(this.dispatchEvent(c),typeof this["on"+a]=="function"&&this["on"+a](c))},s.prototype._emitGatheringStateChange=function(){var a=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",a)},s.prototype.getConfiguration=function(){return this._config},s.prototype.getLocalStreams=function(){return this.localStreams},s.prototype.getRemoteStreams=function(){return this.remoteStreams},s.prototype._createTransceiver=function(a,c){var h=this.transceivers.length>0,u={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:a,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:!0};if(this.usingBundle&&h)u.iceTransport=this.transceivers[0].iceTransport,u.dtlsTransport=this.transceivers[0].dtlsTransport;else{var d=this._createIceAndDtlsTransports();u.iceTransport=d.iceTransport,u.dtlsTransport=d.dtlsTransport}return c||this.transceivers.push(u),u},s.prototype.addTrack=function(a,c){if(this._isClosed)throw ye("InvalidStateError","Attempted to call addTrack on a closed peerconnection.");var h=this.transceivers.find(function(p){return p.track===a});if(h)throw ye("InvalidAccessError","Track already exists.");for(var u,d=0;d<this.transceivers.length;d++)!this.transceivers[d].track&&this.transceivers[d].kind===a.kind&&(u=this.transceivers[d]);return u||(u=this._createTransceiver(a.kind)),this._maybeFireNegotiationNeeded(),this.localStreams.indexOf(c)===-1&&this.localStreams.push(c),u.track=a,u.stream=c,u.rtpSender=new n.RTCRtpSender(a,u.dtlsTransport),u.rtpSender},s.prototype.addStream=function(a){var c=this;if(e>=15025)a.getTracks().forEach(function(u){c.addTrack(u,a)});else{var h=a.clone();a.getTracks().forEach(function(u,d){var p=h.getTracks()[d];u.addEventListener("enabled",function(f){p.enabled=f.enabled})}),h.getTracks().forEach(function(u){c.addTrack(u,h)})}},s.prototype.removeTrack=function(a){if(this._isClosed)throw ye("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.");if(!(a instanceof n.RTCRtpSender))throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.");var c=this.transceivers.find(function(d){return d.rtpSender===a});if(!c)throw ye("InvalidAccessError","Sender was not created by this connection.");var h=c.stream;c.rtpSender.stop(),c.rtpSender=null,c.track=null,c.stream=null;var u=this.transceivers.map(function(d){return d.stream});u.indexOf(h)===-1&&this.localStreams.indexOf(h)>-1&&this.localStreams.splice(this.localStreams.indexOf(h),1),this._maybeFireNegotiationNeeded()},s.prototype.removeStream=function(a){var c=this;a.getTracks().forEach(function(h){var u=c.getSenders().find(function(d){return d.track===h});u&&c.removeTrack(u)})},s.prototype.getSenders=function(){return this.transceivers.filter(function(a){return!!a.rtpSender}).map(function(a){return a.rtpSender})},s.prototype.getReceivers=function(){return this.transceivers.filter(function(a){return!!a.rtpReceiver}).map(function(a){return a.rtpReceiver})},s.prototype._createIceGatherer=function(a,c){var h=this;if(c&&a>0)return this.transceivers[0].iceGatherer;if(this._iceGatherers.length)return this._iceGatherers.shift();var u=new n.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});return Object.defineProperty(u,"state",{value:"new",writable:!0}),this.transceivers[a].bufferedCandidateEvents=[],this.transceivers[a].bufferCandidates=function(d){var p=!d.candidate||Object.keys(d.candidate).length===0;u.state=p?"completed":"gathering",h.transceivers[a].bufferedCandidateEvents!==null&&h.transceivers[a].bufferedCandidateEvents.push(d)},u.addEventListener("localcandidate",this.transceivers[a].bufferCandidates),u},s.prototype._gather=function(a,c){var h=this,u=this.transceivers[c].iceGatherer;if(!u.onlocalcandidate){var d=this.transceivers[c].bufferedCandidateEvents;this.transceivers[c].bufferedCandidateEvents=null,u.removeEventListener("localcandidate",this.transceivers[c].bufferCandidates),u.onlocalcandidate=function(p){if(!(h.usingBundle&&c>0)){var f=new Event("icecandidate");f.candidate={sdpMid:a,sdpMLineIndex:c};var m=p.candidate,g=!m||Object.keys(m).length===0;if(g)(u.state==="new"||u.state==="gathering")&&(u.state="completed");else{u.state==="new"&&(u.state="gathering"),m.component=1,m.ufrag=u.getLocalParameters().usernameFragment;var y=z.writeCandidate(m);f.candidate=Object.assign(f.candidate,z.parseCandidate(y)),f.candidate.candidate=y,f.candidate.toJSON=function(){return{candidate:f.candidate.candidate,sdpMid:f.candidate.sdpMid,sdpMLineIndex:f.candidate.sdpMLineIndex,usernameFragment:f.candidate.usernameFragment}}}var v=z.getMediaSections(h._localDescription.sdp);g?v[f.candidate.sdpMLineIndex]+=`a=end-of-candidates\r
49
+ `:v[f.candidate.sdpMLineIndex]+="a="+f.candidate.candidate+`\r
50
+ `,h._localDescription.sdp=z.getDescription(h._localDescription.sdp)+v.join("");var b=h.transceivers.every(function(S){return S.iceGatherer&&S.iceGatherer.state==="completed"});h.iceGatheringState!=="gathering"&&(h.iceGatheringState="gathering",h._emitGatheringStateChange()),g||h._dispatchEvent("icecandidate",f),b&&(h._dispatchEvent("icecandidate",new Event("icecandidate")),h.iceGatheringState="complete",h._emitGatheringStateChange())}},n.setTimeout(function(){d.forEach(function(p){u.onlocalcandidate(p)})},0)}},s.prototype._createIceAndDtlsTransports=function(){var a=this,c=new n.RTCIceTransport(null);c.onicestatechange=function(){a._updateIceConnectionState(),a._updateConnectionState()};var h=new n.RTCDtlsTransport(c);return h.ondtlsstatechange=function(){a._updateConnectionState()},h.onerror=function(){Object.defineProperty(h,"state",{value:"failed",writable:!0}),a._updateConnectionState()},{iceTransport:c,dtlsTransport:h}},s.prototype._disposeIceAndDtlsTransports=function(a){var c=this.transceivers[a].iceGatherer;c&&(delete c.onlocalcandidate,delete this.transceivers[a].iceGatherer);var h=this.transceivers[a].iceTransport;h&&(delete h.onicestatechange,delete this.transceivers[a].iceTransport);var u=this.transceivers[a].dtlsTransport;u&&(delete u.ondtlsstatechange,delete u.onerror,delete this.transceivers[a].dtlsTransport)},s.prototype._transceive=function(a,c,h){var u=Rn(a.localCapabilities,a.remoteCapabilities);c&&a.rtpSender&&(u.encodings=a.sendEncodingParameters,u.rtcp={cname:z.localCName,compound:a.rtcpParameters.compound},a.recvEncodingParameters.length&&(u.rtcp.ssrc=a.recvEncodingParameters[0].ssrc),a.rtpSender.send(u)),h&&a.rtpReceiver&&u.codecs.length>0&&(a.kind==="video"&&a.recvEncodingParameters&&e<15019&&a.recvEncodingParameters.forEach(function(d){delete d.rtx}),a.recvEncodingParameters.length?u.encodings=a.recvEncodingParameters:u.encodings=[{}],u.rtcp={compound:a.rtcpParameters.compound},a.rtcpParameters.cname&&(u.rtcp.cname=a.rtcpParameters.cname),a.sendEncodingParameters.length&&(u.rtcp.ssrc=a.sendEncodingParameters[0].ssrc),a.rtpReceiver.receive(u))},s.prototype.setLocalDescription=function(a){var c=this;if(["offer","answer"].indexOf(a.type)===-1)return Promise.reject(ye("TypeError",'Unsupported type "'+a.type+'"'));if(!_o("setLocalDescription",a.type,c.signalingState)||c._isClosed)return Promise.reject(ye("InvalidStateError","Can not set local "+a.type+" in state "+c.signalingState));var h,u;if(a.type==="offer")h=z.splitSections(a.sdp),u=h.shift(),h.forEach(function(p,f){var m=z.parseRtpParameters(p);c.transceivers[f].localCapabilities=m}),c.transceivers.forEach(function(p,f){c._gather(p.mid,f)});else if(a.type==="answer"){h=z.splitSections(c._remoteDescription.sdp),u=h.shift();var d=z.matchPrefix(u,"a=ice-lite").length>0;h.forEach(function(p,f){var m=c.transceivers[f],g=m.iceGatherer,y=m.iceTransport,v=m.dtlsTransport,b=m.localCapabilities,S=m.remoteCapabilities,x=z.isRejected(p)&&z.matchPrefix(p,"a=bundle-only").length===0;if(!x&&!m.rejected){var w=z.getIceParameters(p,u),_=z.getDtlsParameters(p,u);d&&(_.role="server"),(!c.usingBundle||f===0)&&(c._gather(m.mid,f),y.state==="new"&&y.start(g,w,d?"controlling":"controlled"),v.state==="new"&&v.start(_));var M=Rn(b,S);c._transceive(m,M.codecs.length>0,!1)}})}return c._localDescription={type:a.type,sdp:a.sdp},a.type==="offer"?c._updateSignalingState("have-local-offer"):c._updateSignalingState("stable"),Promise.resolve()},s.prototype.setRemoteDescription=function(a){var c=this;if(["offer","answer"].indexOf(a.type)===-1)return Promise.reject(ye("TypeError",'Unsupported type "'+a.type+'"'));if(!_o("setRemoteDescription",a.type,c.signalingState)||c._isClosed)return Promise.reject(ye("InvalidStateError","Can not set remote "+a.type+" in state "+c.signalingState));var h={};c.remoteStreams.forEach(function(y){h[y.id]=y});var u=[],d=z.splitSections(a.sdp),p=d.shift(),f=z.matchPrefix(p,"a=ice-lite").length>0,m=z.matchPrefix(p,"a=group:BUNDLE ").length>0;c.usingBundle=m;var g=z.matchPrefix(p,"a=ice-options:")[0];return g?c.canTrickleIceCandidates=g.substr(14).split(" ").indexOf("trickle")>=0:c.canTrickleIceCandidates=!1,d.forEach(function(y,v){var b=z.splitLines(y),S=z.getKind(y),x=z.isRejected(y)&&z.matchPrefix(y,"a=bundle-only").length===0,w=b[0].substr(2).split(" ")[2],_=z.getDirection(y,p),M=z.parseMsid(y),C=z.getMid(y)||z.generateIdentifier();if(x||S==="application"&&(w==="DTLS/SCTP"||w==="UDP/DTLS/SCTP")){c.transceivers[v]={mid:C,kind:S,protocol:w,rejected:!0};return}!x&&c.transceivers[v]&&c.transceivers[v].rejected&&(c.transceivers[v]=c._createTransceiver(S,!0));var T,E,P,A,I,N,U,G,V,oe=z.parseRtpParameters(y),ie,ee;x||(ie=z.getIceParameters(y,p),ee=z.getDtlsParameters(y,p),ee.role="client"),U=z.parseRtpEncodingParameters(y);var Ae=z.parseRtcpParameters(y),Me=z.matchPrefix(y,"a=end-of-candidates",p).length>0,ne=z.matchPrefix(y,"a=candidate:").map(function(Z){return z.parseCandidate(Z)}).filter(function(Z){return Z.component===1});if((a.type==="offer"||a.type==="answer")&&!x&&m&&v>0&&c.transceivers[v]&&(c._disposeIceAndDtlsTransports(v),c.transceivers[v].iceGatherer=c.transceivers[0].iceGatherer,c.transceivers[v].iceTransport=c.transceivers[0].iceTransport,c.transceivers[v].dtlsTransport=c.transceivers[0].dtlsTransport,c.transceivers[v].rtpSender&&c.transceivers[v].rtpSender.setTransport(c.transceivers[0].dtlsTransport),c.transceivers[v].rtpReceiver&&c.transceivers[v].rtpReceiver.setTransport(c.transceivers[0].dtlsTransport)),a.type==="offer"&&!x){T=c.transceivers[v]||c._createTransceiver(S),T.mid=C,T.iceGatherer||(T.iceGatherer=c._createIceGatherer(v,m)),ne.length&&T.iceTransport.state==="new"&&(Me&&(!m||v===0)?T.iceTransport.setRemoteCandidates(ne):ne.forEach(function(Z){zr(T.iceTransport,Z)})),G=n.RTCRtpReceiver.getCapabilities(S),e<15019&&(G.codecs=G.codecs.filter(function(Z){return Z.name!=="rtx"})),N=T.sendEncodingParameters||[{ssrc:(2*v+2)*1001}];var fe=!1;if(_==="sendrecv"||_==="sendonly"){if(fe=!T.rtpReceiver,I=T.rtpReceiver||new n.RTCRtpReceiver(T.dtlsTransport,S),fe){var te;V=I.track,M&&M.stream==="-"||(M?(h[M.stream]||(h[M.stream]=new n.MediaStream,Object.defineProperty(h[M.stream],"id",{get:function(){return M.stream}})),Object.defineProperty(V,"id",{get:function(){return M.track}}),te=h[M.stream]):(h.default||(h.default=new n.MediaStream),te=h.default)),te&&(t(V,te),T.associatedRemoteMediaStreams.push(te)),u.push([V,I,te])}}else T.rtpReceiver&&T.rtpReceiver.track&&(T.associatedRemoteMediaStreams.forEach(function(Z){var Xe=Z.getTracks().find(function(it){return it.id===T.rtpReceiver.track.id});Xe&&i(Xe,Z)}),T.associatedRemoteMediaStreams=[]);T.localCapabilities=G,T.remoteCapabilities=oe,T.rtpReceiver=I,T.rtcpParameters=Ae,T.sendEncodingParameters=N,T.recvEncodingParameters=U,c._transceive(c.transceivers[v],!1,fe)}else if(a.type==="answer"&&!x){T=c.transceivers[v],E=T.iceGatherer,P=T.iceTransport,A=T.dtlsTransport,I=T.rtpReceiver,N=T.sendEncodingParameters,G=T.localCapabilities,c.transceivers[v].recvEncodingParameters=U,c.transceivers[v].remoteCapabilities=oe,c.transceivers[v].rtcpParameters=Ae,ne.length&&P.state==="new"&&((f||Me)&&(!m||v===0)?P.setRemoteCandidates(ne):ne.forEach(function(Z){zr(T.iceTransport,Z)})),(!m||v===0)&&(P.state==="new"&&P.start(E,ie,"controlling"),A.state==="new"&&A.start(ee));var X=Rn(T.localCapabilities,T.remoteCapabilities),ft=X.codecs.filter(function(Z){return Z.name.toLowerCase()==="rtx"}).length;!ft&&T.sendEncodingParameters[0].rtx&&delete T.sendEncodingParameters[0].rtx,c._transceive(T,_==="sendrecv"||_==="recvonly",_==="sendrecv"||_==="sendonly"),I&&(_==="sendrecv"||_==="sendonly")?(V=I.track,M?(h[M.stream]||(h[M.stream]=new n.MediaStream),t(V,h[M.stream]),u.push([V,I,h[M.stream]])):(h.default||(h.default=new n.MediaStream),t(V,h.default),u.push([V,I,h.default]))):delete T.rtpReceiver}}),c._dtlsRole===void 0&&(c._dtlsRole=a.type==="offer"?"active":"passive"),c._remoteDescription={type:a.type,sdp:a.sdp},a.type==="offer"?c._updateSignalingState("have-remote-offer"):c._updateSignalingState("stable"),Object.keys(h).forEach(function(y){var v=h[y];if(v.getTracks().length){if(c.remoteStreams.indexOf(v)===-1){c.remoteStreams.push(v);var b=new Event("addstream");b.stream=v,n.setTimeout(function(){c._dispatchEvent("addstream",b)})}u.forEach(function(S){var x=S[0],w=S[1];v.id===S[2].id&&r(c,x,w,[v])})}}),u.forEach(function(y){y[2]||r(c,y[0],y[1],[])}),n.setTimeout(function(){c&&c.transceivers&&c.transceivers.forEach(function(y){y.iceTransport&&y.iceTransport.state==="new"&&y.iceTransport.getRemoteCandidates().length>0&&(console.warn("Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification"),y.iceTransport.addRemoteCandidate({}))})},4e3),Promise.resolve()},s.prototype.close=function(){this.transceivers.forEach(function(a){a.iceTransport&&a.iceTransport.stop(),a.dtlsTransport&&a.dtlsTransport.stop(),a.rtpSender&&a.rtpSender.stop(),a.rtpReceiver&&a.rtpReceiver.stop()}),this._isClosed=!0,this._updateSignalingState("closed")},s.prototype._updateSignalingState=function(a){this.signalingState=a;var c=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",c)},s.prototype._maybeFireNegotiationNeeded=function(){var a=this;this.signalingState!=="stable"||this.needNegotiation===!0||(this.needNegotiation=!0,n.setTimeout(function(){if(a.needNegotiation){a.needNegotiation=!1;var c=new Event("negotiationneeded");a._dispatchEvent("negotiationneeded",c)}},0))},s.prototype._updateIceConnectionState=function(){var a,c={new:0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(u){u.iceTransport&&!u.rejected&&c[u.iceTransport.state]++}),a="new",c.failed>0?a="failed":c.checking>0?a="checking":c.disconnected>0?a="disconnected":c.new>0?a="new":c.connected>0?a="connected":c.completed>0&&(a="completed"),a!==this.iceConnectionState){this.iceConnectionState=a;var h=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",h)}},s.prototype._updateConnectionState=function(){var a,c={new:0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(u){u.iceTransport&&u.dtlsTransport&&!u.rejected&&(c[u.iceTransport.state]++,c[u.dtlsTransport.state]++)}),c.connected+=c.completed,a="new",c.failed>0?a="failed":c.connecting>0?a="connecting":c.disconnected>0?a="disconnected":c.new>0?a="new":c.connected>0&&(a="connected"),a!==this.connectionState){this.connectionState=a;var h=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",h)}},s.prototype.createOffer=function(){var a=this;if(a._isClosed)return Promise.reject(ye("InvalidStateError","Can not call createOffer after close"));var c=a.transceivers.filter(function(f){return f.kind==="audio"}).length,h=a.transceivers.filter(function(f){return f.kind==="video"}).length,u=arguments[0];if(u){if(u.mandatory||u.optional)throw new TypeError("Legacy mandatory/optional constraints not supported.");u.offerToReceiveAudio!==void 0&&(u.offerToReceiveAudio===!0?c=1:u.offerToReceiveAudio===!1?c=0:c=u.offerToReceiveAudio),u.offerToReceiveVideo!==void 0&&(u.offerToReceiveVideo===!0?h=1:u.offerToReceiveVideo===!1?h=0:h=u.offerToReceiveVideo)}for(a.transceivers.forEach(function(f){f.kind==="audio"?(c--,c<0&&(f.wantReceive=!1)):f.kind==="video"&&(h--,h<0&&(f.wantReceive=!1))});c>0||h>0;)c>0&&(a._createTransceiver("audio"),c--),h>0&&(a._createTransceiver("video"),h--);var d=z.writeSessionBoilerplate(a._sdpSessionId,a._sdpSessionVersion++);a.transceivers.forEach(function(f,m){var g=f.track,y=f.kind,v=f.mid||z.generateIdentifier();f.mid=v,f.iceGatherer||(f.iceGatherer=a._createIceGatherer(m,a.usingBundle));var b=n.RTCRtpSender.getCapabilities(y);e<15019&&(b.codecs=b.codecs.filter(function(x){return x.name!=="rtx"})),b.codecs.forEach(function(x){x.name==="H264"&&x.parameters["level-asymmetry-allowed"]===void 0&&(x.parameters["level-asymmetry-allowed"]="1"),f.remoteCapabilities&&f.remoteCapabilities.codecs&&f.remoteCapabilities.codecs.forEach(function(w){x.name.toLowerCase()===w.name.toLowerCase()&&x.clockRate===w.clockRate&&(x.preferredPayloadType=w.payloadType)})}),b.headerExtensions.forEach(function(x){var w=f.remoteCapabilities&&f.remoteCapabilities.headerExtensions||[];w.forEach(function(_){x.uri===_.uri&&(x.id=_.id)})});var S=f.sendEncodingParameters||[{ssrc:(2*m+1)*1001}];g&&e>=15019&&y==="video"&&!S[0].rtx&&(S[0].rtx={ssrc:S[0].ssrc+1}),f.wantReceive&&(f.rtpReceiver=new n.RTCRtpReceiver(f.dtlsTransport,y)),f.localCapabilities=b,f.sendEncodingParameters=S}),a._config.bundlePolicy!=="max-compat"&&(d+="a=group:BUNDLE "+a.transceivers.map(function(f){return f.mid}).join(" ")+`\r
51
+ `),d+=`a=ice-options:trickle\r
52
+ `,a.transceivers.forEach(function(f,m){d+=xo(f,f.localCapabilities,"offer",f.stream,a._dtlsRole),d+=`a=rtcp-rsize\r
53
+ `,f.iceGatherer&&a.iceGatheringState!=="new"&&(m===0||!a.usingBundle)&&(f.iceGatherer.getLocalCandidates().forEach(function(g){g.component=1,d+="a="+z.writeCandidate(g)+`\r
54
+ `}),f.iceGatherer.state==="completed"&&(d+=`a=end-of-candidates\r
55
+ `))});var p=new n.RTCSessionDescription({type:"offer",sdp:d});return Promise.resolve(p)},s.prototype.createAnswer=function(){var a=this;if(a._isClosed)return Promise.reject(ye("InvalidStateError","Can not call createAnswer after close"));if(!(a.signalingState==="have-remote-offer"||a.signalingState==="have-local-pranswer"))return Promise.reject(ye("InvalidStateError","Can not call createAnswer in signalingState "+a.signalingState));var c=z.writeSessionBoilerplate(a._sdpSessionId,a._sdpSessionVersion++);a.usingBundle&&(c+="a=group:BUNDLE "+a.transceivers.map(function(d){return d.mid}).join(" ")+`\r
56
+ `),c+=`a=ice-options:trickle\r
57
+ `;var h=z.getMediaSections(a._remoteDescription.sdp).length;a.transceivers.forEach(function(d,p){if(!(p+1>h)){if(d.rejected){d.kind==="application"?d.protocol==="DTLS/SCTP"?c+=`m=application 0 DTLS/SCTP 5000\r
58
+ `:c+="m=application 0 "+d.protocol+` webrtc-datachannel\r
59
+ `:d.kind==="audio"?c+=`m=audio 0 UDP/TLS/RTP/SAVPF 0\r
60
60
  a=rtpmap:0 PCMU/8000\r
61
- `:u.kind==="video"&&(l+=`m=video 0 UDP/TLS/RTP/SAVPF 120\r
61
+ `:d.kind==="video"&&(c+=`m=video 0 UDP/TLS/RTP/SAVPF 120\r
62
62
  a=rtpmap:120 VP8/90000\r
63
- `),l+=`c=IN IP4 0.0.0.0\r
63
+ `),c+=`c=IN IP4 0.0.0.0\r
64
64
  a=inactive\r
65
- a=mid:`+u.mid+`\r
66
- `;return}if(u.stream){var m;u.kind==="audio"?m=u.stream.getAudioTracks()[0]:u.kind==="video"&&(m=u.stream.getVideoTracks()[0]),m&&e>=15019&&u.kind==="video"&&!u.sendEncodingParameters[0].rtx&&(u.sendEncodingParameters[0].rtx={ssrc:u.sendEncodingParameters[0].ssrc+1})}var b=Kn(u.localCapabilities,u.remoteCapabilities),G=b.codecs.filter(function(y){return y.name.toLowerCase()==="rtx"}).length;!G&&u.sendEncodingParameters[0].rtx&&delete u.sendEncodingParameters[0].rtx,l+=Va(u,b,"answer",u.stream,r._dtlsRole),u.rtcpParameters&&u.rtcpParameters.reducedSize&&(l+=`a=rtcp-rsize\r
67
- `)}});var h=new n.RTCSessionDescription({type:"answer",sdp:l});return Promise.resolve(h)},o.prototype.addIceCandidate=function(r){var l=this,d;return r&&!(r.sdpMLineIndex!==void 0||r.sdpMid)?Promise.reject(new TypeError("sdpMLineIndex or sdpMid required")):new Promise(function(h,u){if(l._remoteDescription)if(!r||r.candidate==="")for(var p=0;p<l.transceivers.length&&!(!l.transceivers[p].rejected&&(l.transceivers[p].iceTransport.addRemoteCandidate({}),d=H.getMediaSections(l._remoteDescription.sdp),d[p]+=`a=end-of-candidates\r
68
- `,l._remoteDescription.sdp=H.getDescription(l._remoteDescription.sdp)+d.join(""),l.usingBundle));p++);else{var m=r.sdpMLineIndex;if(r.sdpMid){for(var b=0;b<l.transceivers.length;b++)if(l.transceivers[b].mid===r.sdpMid){m=b;break}}var G=l.transceivers[m];if(G){if(G.rejected)return h();var y=Object.keys(r.candidate).length>0?H.parseCandidate(r.candidate):{};if(y.protocol==="tcp"&&(y.port===0||y.port===9)||y.component&&y.component!==1)return h();if((m===0||m>0&&G.iceTransport!==l.transceivers[0].iceTransport)&&!Hs(G.iceTransport,y))return u(ye("OperationError","Can not add ICE candidate"));var Z=r.candidate.trim();Z.indexOf("a=")===0&&(Z=Z.substr(2)),d=H.getMediaSections(l._remoteDescription.sdp),d[m]+="a="+(y.type?Z:"end-of-candidates")+`\r
69
- `,l._remoteDescription.sdp=H.getDescription(l._remoteDescription.sdp)+d.join("")}else return u(ye("OperationError","Can not add ICE candidate"))}else return u(ye("InvalidStateError","Can not add ICE candidate without a remote description"));h()})},o.prototype.getStats=function(r){if(r&&r instanceof n.MediaStreamTrack){var l=null;if(this.transceivers.forEach(function(h){h.rtpSender&&h.rtpSender.track===r?l=h.rtpSender:h.rtpReceiver&&h.rtpReceiver.track===r&&(l=h.rtpReceiver)}),!l)throw ye("InvalidAccessError","Invalid selector.");return l.getStats()}var d=[];return this.transceivers.forEach(function(h){["rtpSender","rtpReceiver","iceGatherer","iceTransport","dtlsTransport"].forEach(function(u){h[u]&&d.push(h[u].getStats())})}),Promise.all(d).then(function(h){var u=new Map;return h.forEach(function(p){p.forEach(function(m){u.set(m.id,m)})}),u})};var a=["RTCRtpSender","RTCRtpReceiver","RTCIceGatherer","RTCIceTransport","RTCDtlsTransport"];a.forEach(function(r){var l=n[r];if(l&&l.prototype&&l.prototype.getStats){var d=l.prototype.getStats;l.prototype.getStats=function(){return d.apply(this).then(function(h){var u=new Map;return Object.keys(h).forEach(function(p){h[p].type=$l(h[p]),u.set(p,h[p])}),u})}}});var c=["createOffer","createAnswer"];return c.forEach(function(r){var l=o.prototype[r];o.prototype[r]=function(){var d=arguments;return typeof d[0]=="function"||typeof d[1]=="function"?l.apply(this,[arguments[2]]).then(function(h){typeof d[0]=="function"&&d[0].apply(null,[h])},function(h){typeof d[1]=="function"&&d[1].apply(null,[h])}):l.apply(this,arguments)}}),c=["setLocalDescription","setRemoteDescription","addIceCandidate"],c.forEach(function(r){var l=o.prototype[r];o.prototype[r]=function(){var d=arguments;return typeof d[1]=="function"||typeof d[2]=="function"?l.apply(this,arguments).then(function(){typeof d[1]=="function"&&d[1].apply(null)},function(h){typeof d[2]=="function"&&d[2].apply(null,[h])}):l.apply(this,arguments)}}),["getStats"].forEach(function(r){var l=o.prototype[r];o.prototype[r]=function(){var d=arguments;return typeof d[1]=="function"?l.apply(this,arguments).then(function(){typeof d[1]=="function"&&d[1].apply(null)}):l.apply(this,arguments)}}),o};const ic=Cn(tc);function La(n){const e=n&&n.navigator,t=function(s){return{name:{PermissionDeniedError:"NotAllowedError"}[s.name]||s.name,message:s.message,constraint:s.constraint,toString(){return this.name}}},i=e.mediaDevices.getUserMedia.bind(e.mediaDevices);e.mediaDevices.getUserMedia=function(s){return i(s).catch(o=>Promise.reject(t(o)))}}function xa(n){"getDisplayMedia"in n.navigator&&n.navigator.mediaDevices&&(n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices||(n.navigator.mediaDevices.getDisplayMedia=n.navigator.getDisplayMedia.bind(n.navigator)))}function ks(n,e){if(n.RTCIceGatherer&&(n.RTCIceCandidate||(n.RTCIceCandidate=function(i){return i}),n.RTCSessionDescription||(n.RTCSessionDescription=function(i){return i}),e.version<15025)){const i=Object.getOwnPropertyDescriptor(n.MediaStreamTrack.prototype,"enabled");Object.defineProperty(n.MediaStreamTrack.prototype,"enabled",{set(s){i.set.call(this,s);const o=new Event("enabled");o.enabled=s,this.dispatchEvent(o)}})}n.RTCRtpSender&&!("dtmf"in n.RTCRtpSender.prototype)&&Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=new n.RTCDtmfSender(this):this.track.kind==="video"&&(this._dtmf=null)),this._dtmf}}),n.RTCDtmfSender&&!n.RTCDTMFSender&&(n.RTCDTMFSender=n.RTCDtmfSender);const t=ic(n,e.version);n.RTCPeerConnection=function(i){return i&&i.iceServers&&(i.iceServers=ql(i.iceServers,e.version),Ms("ICE servers after filtering:",i.iceServers)),new t(i)},n.RTCPeerConnection.prototype=t.prototype}function Sa(n){n.RTCRtpSender&&!("replaceTrack"in n.RTCRtpSender.prototype)&&(n.RTCRtpSender.prototype.replaceTrack=n.RTCRtpSender.prototype.setTrack)}const fa=Object.freeze(Object.defineProperty({__proto__:null,shimGetDisplayMedia:xa,shimGetUserMedia:La,shimPeerConnection:ks,shimReplaceTrack:Sa},Symbol.toStringTag,{value:"Module"}));function Wa(n,e){const t=n&&n.navigator,i=n&&n.MediaStreamTrack;if(t.getUserMedia=function(s,o,a){zn("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),t.mediaDevices.getUserMedia(s).then(o,a)},!(e.version>55&&"autoGainControl"in t.mediaDevices.getSupportedConstraints())){const s=function(a,c,r){c in a&&!(r in a)&&(a[r]=a[c],delete a[c])},o=t.mediaDevices.getUserMedia.bind(t.mediaDevices);if(t.mediaDevices.getUserMedia=function(a){return typeof a=="object"&&typeof a.audio=="object"&&(a=JSON.parse(JSON.stringify(a)),s(a.audio,"autoGainControl","mozAutoGainControl"),s(a.audio,"noiseSuppression","mozNoiseSuppression")),o(a)},i&&i.prototype.getSettings){const a=i.prototype.getSettings;i.prototype.getSettings=function(){const c=a.apply(this,arguments);return s(c,"mozAutoGainControl","autoGainControl"),s(c,"mozNoiseSuppression","noiseSuppression"),c}}if(i&&i.prototype.applyConstraints){const a=i.prototype.applyConstraints;i.prototype.applyConstraints=function(c){return this.kind==="audio"&&typeof c=="object"&&(c=JSON.parse(JSON.stringify(c)),s(c,"autoGainControl","mozAutoGainControl"),s(c,"noiseSuppression","mozNoiseSuppression")),a.apply(this,[c])}}}}function nc(n,e){n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices||n.navigator.mediaDevices&&(n.navigator.mediaDevices.getDisplayMedia=function(t){if(!(t&&t.video)){const i=new DOMException("getDisplayMedia without video constraints is undefined");return i.name="NotFoundError",i.code=8,Promise.reject(i)}return t.video===!0?t.video={mediaSource:e}:t.video.mediaSource=e,n.navigator.mediaDevices.getUserMedia(t)})}function ga(n){typeof n=="object"&&n.RTCTrackEvent&&"receiver"in n.RTCTrackEvent.prototype&&!("transceiver"in n.RTCTrackEvent.prototype)&&Object.defineProperty(n.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Ns(n,e){if(typeof n!="object"||!(n.RTCPeerConnection||n.mozRTCPeerConnection))return;!n.RTCPeerConnection&&n.mozRTCPeerConnection&&(n.RTCPeerConnection=n.mozRTCPeerConnection),e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(s){const o=n.RTCPeerConnection.prototype[s],a={[s](){return arguments[0]=new(s==="addIceCandidate"?n.RTCIceCandidate:n.RTCSessionDescription)(arguments[0]),o.apply(this,arguments)}};n.RTCPeerConnection.prototype[s]=a[s]});const t={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},i=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){const[s,o,a]=arguments;return i.apply(this,[s||null]).then(c=>{if(e.version<53&&!o)try{c.forEach(r=>{r.type=t[r.type]||r.type})}catch(r){if(r.name!=="TypeError")throw r;c.forEach((l,d)=>{c.set(d,Object.assign({},l,{type:t[l.type]||l.type}))})}return c}).then(o,a)}}function Ca(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender)||n.RTCRtpSender&&"getStats"in n.RTCRtpSender.prototype)return;const e=n.RTCPeerConnection.prototype.getSenders;e&&(n.RTCPeerConnection.prototype.getSenders=function(){const i=e.apply(this,[]);return i.forEach(s=>s._pc=this),i});const t=n.RTCPeerConnection.prototype.addTrack;t&&(n.RTCPeerConnection.prototype.addTrack=function(){const i=t.apply(this,arguments);return i._pc=this,i}),n.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function za(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender)||n.RTCRtpSender&&"getStats"in n.RTCRtpReceiver.prototype)return;const e=n.RTCPeerConnection.prototype.getReceivers;e&&(n.RTCPeerConnection.prototype.getReceivers=function(){const t=e.apply(this,[]);return t.forEach(i=>i._pc=this),t}),_t(n,"track",t=>(t.receiver._pc=t.srcElement,t)),n.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function va(n){!n.RTCPeerConnection||"removeStream"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.removeStream=function(e){zn("removeStream","removeTrack"),this.getSenders().forEach(t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)})})}function Ka(n){n.DataChannel&&!n.RTCDataChannel&&(n.RTCDataChannel=n.DataChannel)}function Ma(n){if(!(typeof n=="object"&&n.RTCPeerConnection))return;const e=n.RTCPeerConnection.prototype.addTransceiver;e&&(n.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];const t=arguments[1],i=t&&"sendEncodings"in t;i&&t.sendEncodings.forEach(o=>{if("rid"in o&&!/^[a-z0-9]{0,16}$/i.test(o.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in o&&!(parseFloat(o.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in o&&!(parseFloat(o.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")});const s=e.apply(this,arguments);if(i){const{sender:o}=s,a=o.getParameters();(!("encodings"in a)||a.encodings.length===1&&Object.keys(a.encodings[0]).length===0)&&(a.encodings=t.sendEncodings,o.sendEncodings=t.sendEncodings,this.setParametersPromises.push(o.setParameters(a).then(()=>{delete o.sendEncodings}).catch(()=>{delete o.sendEncodings})))}return s})}function Ta(n){if(!(typeof n=="object"&&n.RTCRtpSender))return;const e=n.RTCRtpSender.prototype.getParameters;e&&(n.RTCRtpSender.prototype.getParameters=function(){const t=e.apply(this,arguments);return"encodings"in t||(t.encodings=[].concat(this.sendEncodings||[{}])),t})}function Ya(n){if(!(typeof n=="object"&&n.RTCPeerConnection))return;const e=n.RTCPeerConnection.prototype.createOffer;n.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>e.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):e.apply(this,arguments)}}function Ha(n){if(!(typeof n=="object"&&n.RTCPeerConnection))return;const e=n.RTCPeerConnection.prototype.createAnswer;n.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>e.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):e.apply(this,arguments)}}const ka=Object.freeze(Object.defineProperty({__proto__:null,shimAddTransceiver:Ma,shimCreateAnswer:Ha,shimCreateOffer:Ya,shimGetDisplayMedia:nc,shimGetParameters:Ta,shimGetUserMedia:Wa,shimOnTrack:ga,shimPeerConnection:Ns,shimRTCDataChannel:Ka,shimReceiverGetStats:za,shimRemoveStream:va,shimSenderGetStats:Ca},Symbol.toStringTag,{value:"Module"}));function Na(n){if(!(typeof n!="object"||!n.RTCPeerConnection)){if("getLocalStreams"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in n.RTCPeerConnection.prototype)){const e=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addStream=function(t){this._localStreams||(this._localStreams=[]),this._localStreams.includes(t)||this._localStreams.push(t),t.getAudioTracks().forEach(i=>e.call(this,i,t)),t.getVideoTracks().forEach(i=>e.call(this,i,t))},n.RTCPeerConnection.prototype.addTrack=function(t,...i){return i&&i.forEach(s=>{this._localStreams?this._localStreams.includes(s)||this._localStreams.push(s):this._localStreams=[s]}),e.apply(this,arguments)}}"removeStream"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(t===-1)return;this._localStreams.splice(t,1);const i=e.getTracks();this.getSenders().forEach(s=>{i.includes(s.track)&&this.removeTrack(s)})})}}function Ia(n){if(!(typeof n!="object"||!n.RTCPeerConnection)&&("getRemoteStreams"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in n.RTCPeerConnection.prototype))){Object.defineProperty(n.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(t){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=t),this.addEventListener("track",this._onaddstreampoly=i=>{i.streams.forEach(s=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(s))return;this._remoteStreams.push(s);const o=new Event("addstream");o.stream=s,this.dispatchEvent(o)})})}});const e=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){const t=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(i){i.streams.forEach(s=>{if(t._remoteStreams||(t._remoteStreams=[]),t._remoteStreams.indexOf(s)>=0)return;t._remoteStreams.push(s);const o=new Event("addstream");o.stream=s,t.dispatchEvent(o)})}),e.apply(t,arguments)}}}function Ja(n){if(typeof n!="object"||!n.RTCPeerConnection)return;const e=n.RTCPeerConnection.prototype,t=e.createOffer,i=e.createAnswer,s=e.setLocalDescription,o=e.setRemoteDescription,a=e.addIceCandidate;e.createOffer=function(r,l){const d=arguments.length>=2?arguments[2]:arguments[0],h=t.apply(this,[d]);return l?(h.then(r,l),Promise.resolve()):h},e.createAnswer=function(r,l){const d=arguments.length>=2?arguments[2]:arguments[0],h=i.apply(this,[d]);return l?(h.then(r,l),Promise.resolve()):h};let c=function(r,l,d){const h=s.apply(this,[r]);return d?(h.then(l,d),Promise.resolve()):h};e.setLocalDescription=c,c=function(r,l,d){const h=o.apply(this,[r]);return d?(h.then(l,d),Promise.resolve()):h},e.setRemoteDescription=c,c=function(r,l,d){const h=a.apply(this,[r]);return d?(h.then(l,d),Promise.resolve()):h},e.addIceCandidate=c}function Ua(n){const e=n&&n.navigator;if(e.mediaDevices&&e.mediaDevices.getUserMedia){const t=e.mediaDevices,i=t.getUserMedia.bind(t);e.mediaDevices.getUserMedia=s=>i(Pa(s))}!e.getUserMedia&&e.mediaDevices&&e.mediaDevices.getUserMedia&&(e.getUserMedia=function(t,i,s){e.mediaDevices.getUserMedia(t).then(i,s)}.bind(e))}function Pa(n){return n&&n.video!==void 0?Object.assign({},n,{video:oa(n.video)}):n}function wa(n){if(!n.RTCPeerConnection)return;const e=n.RTCPeerConnection;n.RTCPeerConnection=function(t,i){if(t&&t.iceServers){const s=[];for(let o=0;o<t.iceServers.length;o++){let a=t.iceServers[o];!a.hasOwnProperty("urls")&&a.hasOwnProperty("url")?(zn("RTCIceServer.url","RTCIceServer.urls"),a=JSON.parse(JSON.stringify(a)),a.urls=a.url,delete a.url,s.push(a)):s.push(t.iceServers[o])}t.iceServers=s}return new e(t,i)},n.RTCPeerConnection.prototype=e.prototype,"generateCertificate"in e&&Object.defineProperty(n.RTCPeerConnection,"generateCertificate",{get(){return e.generateCertificate}})}function Fa(n){typeof n=="object"&&n.RTCTrackEvent&&"receiver"in n.RTCTrackEvent.prototype&&!("transceiver"in n.RTCTrackEvent.prototype)&&Object.defineProperty(n.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Qa(n){const e=n.RTCPeerConnection.prototype.createOffer;n.RTCPeerConnection.prototype.createOffer=function(t){if(t){typeof t.offerToReceiveAudio<"u"&&(t.offerToReceiveAudio=!!t.offerToReceiveAudio);const i=this.getTransceivers().find(o=>o.receiver.track.kind==="audio");t.offerToReceiveAudio===!1&&i?i.direction==="sendrecv"?i.setDirection?i.setDirection("sendonly"):i.direction="sendonly":i.direction==="recvonly"&&(i.setDirection?i.setDirection("inactive"):i.direction="inactive"):t.offerToReceiveAudio===!0&&!i&&this.addTransceiver("audio"),typeof t.offerToReceiveVideo<"u"&&(t.offerToReceiveVideo=!!t.offerToReceiveVideo);const s=this.getTransceivers().find(o=>o.receiver.track.kind==="video");t.offerToReceiveVideo===!1&&s?s.direction==="sendrecv"?s.setDirection?s.setDirection("sendonly"):s.direction="sendonly":s.direction==="recvonly"&&(s.setDirection?s.setDirection("inactive"):s.direction="inactive"):t.offerToReceiveVideo===!0&&!s&&this.addTransceiver("video")}return e.apply(this,arguments)}}function Ba(n){typeof n!="object"||n.AudioContext||(n.AudioContext=n.webkitAudioContext)}const Ea=Object.freeze(Object.defineProperty({__proto__:null,shimAudioContext:Ba,shimCallbacksAPI:Ja,shimConstraints:Pa,shimCreateOfferLegacy:Qa,shimGetUserMedia:Ua,shimLocalStreamsAPI:Na,shimRTCIceServerUrls:wa,shimRemoteStreamsAPI:Ia,shimTrackEventTransceiver:Fa},Symbol.toStringTag,{value:"Module"}));function Mn(n){if(!n.RTCIceCandidate||n.RTCIceCandidate&&"foundation"in n.RTCIceCandidate.prototype)return;const e=n.RTCIceCandidate;n.RTCIceCandidate=function(t){if(typeof t=="object"&&t.candidate&&t.candidate.indexOf("a=")===0&&(t=JSON.parse(JSON.stringify(t)),t.candidate=t.candidate.substr(2)),t.candidate&&t.candidate.length){const i=new e(t),s=vn.parseCandidate(t.candidate),o=Object.assign(i,s);return o.toJSON=function(){return{candidate:o.candidate,sdpMid:o.sdpMid,sdpMLineIndex:o.sdpMLineIndex,usernameFragment:o.usernameFragment}},o}return new e(t)},n.RTCIceCandidate.prototype=e.prototype,_t(n,"icecandidate",t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new n.RTCIceCandidate(t.candidate),writable:"false"}),t))}function Xi(n,e){if(!n.RTCPeerConnection)return;"sctp"in n.RTCPeerConnection.prototype||Object.defineProperty(n.RTCPeerConnection.prototype,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp}});const t=function(c){if(!c||!c.sdp)return!1;const r=vn.splitSections(c.sdp);return r.shift(),r.some(l=>{const d=vn.parseMLine(l);return d&&d.kind==="application"&&d.protocol.indexOf("SCTP")!==-1})},i=function(c){const r=c.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(r===null||r.length<2)return-1;const l=parseInt(r[1],10);return l!==l?-1:l},s=function(c){let r=65536;return e.browser==="firefox"&&(e.version<57?c===-1?r=16384:r=2147483637:e.version<60?r=e.version===57?65535:65536:r=2147483637),r},o=function(c,r){let l=65536;e.browser==="firefox"&&e.version===57&&(l=65535);const d=vn.matchPrefix(c.sdp,"a=max-message-size:");return d.length>0?l=parseInt(d[0].substr(19),10):e.browser==="firefox"&&r!==-1&&(l=2147483637),l},a=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,e.browser==="chrome"&&e.version>=76){const{sdpSemantics:c}=this.getConfiguration();c==="plan-b"&&Object.defineProperty(this,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp},enumerable:!0,configurable:!0})}if(t(arguments[0])){const c=i(arguments[0]),r=s(c),l=o(arguments[0],c);let d;r===0&&l===0?d=Number.POSITIVE_INFINITY:r===0||l===0?d=Math.max(r,l):d=Math.min(r,l);const h={};Object.defineProperty(h,"maxMessageSize",{get(){return d}}),this._sctp=h}return a.apply(this,arguments)}}function Vi(n){if(!(n.RTCPeerConnection&&"createDataChannel"in n.RTCPeerConnection.prototype))return;function e(i,s){const o=i.send;i.send=function(){const a=arguments[0],c=a.length||a.size||a.byteLength;if(i.readyState==="open"&&s.sctp&&c>s.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+s.sctp.maxMessageSize+" bytes)");return o.apply(i,arguments)}}const t=n.RTCPeerConnection.prototype.createDataChannel;n.RTCPeerConnection.prototype.createDataChannel=function(){const i=t.apply(this,arguments);return e(i,this),i},_t(n,"datachannel",i=>(e(i.channel,i.target),i))}function Is(n){if(!n.RTCPeerConnection||"connectionState"in n.RTCPeerConnection.prototype)return;const e=n.RTCPeerConnection.prototype;Object.defineProperty(e,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(e,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(t){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),t&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=t)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(t=>{const i=e[t];e[t]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=s=>{const o=s.target;if(o._lastConnectionState!==o.connectionState){o._lastConnectionState=o.connectionState;const a=new Event("connectionstatechange",s);o.dispatchEvent(a)}return s},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),i.apply(this,arguments)}})}function Js(n,e){if(!n.RTCPeerConnection||e.browser==="chrome"&&e.version>=71||e.browser==="safari"&&e.version>=605)return;const t=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(i){if(i&&i.sdp&&i.sdp.indexOf(`
70
- a=extmap-allow-mixed`)!==-1){const s=i.sdp.split(`
71
- `).filter(o=>o.trim()!=="a=extmap-allow-mixed").join(`
72
- `);n.RTCSessionDescription&&i instanceof n.RTCSessionDescription?arguments[0]=new n.RTCSessionDescription({type:i.type,sdp:s}):i.sdp=s}return t.apply(this,arguments)}}function Tn(n,e){if(!(n.RTCPeerConnection&&n.RTCPeerConnection.prototype))return;const t=n.RTCPeerConnection.prototype.addIceCandidate;!t||t.length===0||(n.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?(e.browser==="chrome"&&e.version<78||e.browser==="firefox"&&e.version<68||e.browser==="safari")&&arguments[0]&&arguments[0].candidate===""?Promise.resolve():t.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}const sc=Object.freeze(Object.defineProperty({__proto__:null,removeExtmapAllowMixed:Js,shimAddIceCandidateNullOrEmpty:Tn,shimConnectionState:Is,shimMaxMessageSize:Xi,shimRTCIceCandidate:Mn,shimSendThrowTypeError:Vi},Symbol.toStringTag,{value:"Module"}));function oc({window:n}={},e={shimChrome:!0,shimFirefox:!0,shimEdge:!0,shimSafari:!0}){const t=Ms,i=_l(n),s={browserDetails:i,commonShim:sc,extractVersion:Zi,disableLog:Ol,disableWarnings:Dl};switch(i.browser){case"chrome":if(!Ga||!Ys||!e.shimChrome)return t("Chrome shim is not included in this adapter release."),s;if(i.version===null)return t("Chrome shim can not determine version, not shimming."),s;t("adapter.js shimming chrome."),s.browserShim=Ga,Tn(n,i),la(n,i),ca(n),Ys(n,i),da(n),ba(n,i),ha(n),ua(n),pa(n),ya(n,i),Mn(n),Is(n),Xi(n,i),Vi(n),Js(n,i);break;case"firefox":if(!ka||!Ns||!e.shimFirefox)return t("Firefox shim is not included in this adapter release."),s;t("adapter.js shimming firefox."),s.browserShim=ka,Tn(n,i),Wa(n,i),Ns(n,i),ga(n),va(n),Ca(n),za(n),Ka(n),Ma(n),Ta(n),Ya(n),Ha(n),Mn(n),Is(n),Xi(n,i),Vi(n);break;case"edge":if(!fa||!ks||!e.shimEdge)return t("MS edge shim is not included in this adapter release."),s;t("adapter.js shimming edge."),s.browserShim=fa,La(n),xa(n),ks(n,i),Sa(n),Xi(n,i),Vi(n);break;case"safari":if(!Ea||!e.shimSafari)return t("Safari shim is not included in this adapter release."),s;t("adapter.js shimming safari."),s.browserShim=Ea,Tn(n,i),wa(n),Qa(n),Ja(n),Na(n),Ia(n),Fa(n),Ua(n),Ba(n),Mn(n),Xi(n,i),Vi(n),Js(n,i);break;default:t("Unsupported browser!");break}return s}const ja=oc({window:typeof window>"u"?void 0:window});function Ae(n,e,t,i){Object.defineProperty(n,e,{get:t,set:i,enumerable:!0,configurable:!0})}var Us=ja.default||ja,Ri=new(function(){function n(){this.isIOS=["iPad","iPhone","iPod"].includes(navigator.platform),this.supportedBrowsers=["firefox","chrome","safari"],this.minFirefoxVersion=59,this.minChromeVersion=72,this.minSafariVersion=605}return n.prototype.isWebRTCSupported=function(){return typeof RTCPeerConnection<"u"},n.prototype.isBrowserSupported=function(){var e=this.getBrowser(),t=this.getVersion(),i=this.supportedBrowsers.includes(e);return i?e==="chrome"?t>=this.minChromeVersion:e==="firefox"?t>=this.minFirefoxVersion:e==="safari"?!this.isIOS&&t>=this.minSafariVersion:!1:!1},n.prototype.getBrowser=function(){return Us.browserDetails.browser},n.prototype.getVersion=function(){return Us.browserDetails.version||0},n.prototype.isUnifiedPlanSupported=function(){var e=this.getBrowser(),t=Us.browserDetails.version||0;if(e==="chrome"&&t<this.minChromeVersion)return!1;if(e==="firefox"&&t>=this.minFirefoxVersion)return!0;if(!window.RTCRtpTransceiver||!("currentDirection"in RTCRtpTransceiver.prototype))return!1;var i,s=!1;try{i=new RTCPeerConnection,i.addTransceiver("audio"),s=!0}catch{}finally{i&&i.close()}return s},n.prototype.toString=function(){return`Supports:
65
+ a=mid:`+d.mid+`\r
66
+ `;return}if(d.stream){var f;d.kind==="audio"?f=d.stream.getAudioTracks()[0]:d.kind==="video"&&(f=d.stream.getVideoTracks()[0]),f&&e>=15019&&d.kind==="video"&&!d.sendEncodingParameters[0].rtx&&(d.sendEncodingParameters[0].rtx={ssrc:d.sendEncodingParameters[0].ssrc+1})}var m=Rn(d.localCapabilities,d.remoteCapabilities),g=m.codecs.filter(function(y){return y.name.toLowerCase()==="rtx"}).length;!g&&d.sendEncodingParameters[0].rtx&&delete d.sendEncodingParameters[0].rtx,c+=xo(d,m,"answer",d.stream,a._dtlsRole),d.rtcpParameters&&d.rtcpParameters.reducedSize&&(c+=`a=rtcp-rsize\r
67
+ `)}});var u=new n.RTCSessionDescription({type:"answer",sdp:c});return Promise.resolve(u)},s.prototype.addIceCandidate=function(a){var c=this,h;return a&&!(a.sdpMLineIndex!==void 0||a.sdpMid)?Promise.reject(new TypeError("sdpMLineIndex or sdpMid required")):new Promise(function(u,d){if(c._remoteDescription)if(!a||a.candidate==="")for(var p=0;p<c.transceivers.length&&!(!c.transceivers[p].rejected&&(c.transceivers[p].iceTransport.addRemoteCandidate({}),h=z.getMediaSections(c._remoteDescription.sdp),h[p]+=`a=end-of-candidates\r
68
+ `,c._remoteDescription.sdp=z.getDescription(c._remoteDescription.sdp)+h.join(""),c.usingBundle));p++);else{var f=a.sdpMLineIndex;if(a.sdpMid){for(var m=0;m<c.transceivers.length;m++)if(c.transceivers[m].mid===a.sdpMid){f=m;break}}var g=c.transceivers[f];if(g){if(g.rejected)return u();var y=Object.keys(a.candidate).length>0?z.parseCandidate(a.candidate):{};if(y.protocol==="tcp"&&(y.port===0||y.port===9)||y.component&&y.component!==1)return u();if((f===0||f>0&&g.iceTransport!==c.transceivers[0].iceTransport)&&!zr(g.iceTransport,y))return d(ye("OperationError","Can not add ICE candidate"));var v=a.candidate.trim();v.indexOf("a=")===0&&(v=v.substr(2)),h=z.getMediaSections(c._remoteDescription.sdp),h[f]+="a="+(y.type?v:"end-of-candidates")+`\r
69
+ `,c._remoteDescription.sdp=z.getDescription(c._remoteDescription.sdp)+h.join("")}else return d(ye("OperationError","Can not add ICE candidate"))}else return d(ye("InvalidStateError","Can not add ICE candidate without a remote description"));u()})},s.prototype.getStats=function(a){if(a&&a instanceof n.MediaStreamTrack){var c=null;if(this.transceivers.forEach(function(u){u.rtpSender&&u.rtpSender.track===a?c=u.rtpSender:u.rtpReceiver&&u.rtpReceiver.track===a&&(c=u.rtpReceiver)}),!c)throw ye("InvalidAccessError","Invalid selector.");return c.getStats()}var h=[];return this.transceivers.forEach(function(u){["rtpSender","rtpReceiver","iceGatherer","iceTransport","dtlsTransport"].forEach(function(d){u[d]&&h.push(u[d].getStats())})}),Promise.all(h).then(function(u){var d=new Map;return u.forEach(function(p){p.forEach(function(f){d.set(f.id,f)})}),d})};var o=["RTCRtpSender","RTCRtpReceiver","RTCIceGatherer","RTCIceTransport","RTCDtlsTransport"];o.forEach(function(a){var c=n[a];if(c&&c.prototype&&c.prototype.getStats){var h=c.prototype.getStats;c.prototype.getStats=function(){return h.apply(this).then(function(u){var d=new Map;return Object.keys(u).forEach(function(p){u[p].type=Qc(u[p]),d.set(p,u[p])}),d})}}});var l=["createOffer","createAnswer"];return l.forEach(function(a){var c=s.prototype[a];s.prototype[a]=function(){var h=arguments;return typeof h[0]=="function"||typeof h[1]=="function"?c.apply(this,[arguments[2]]).then(function(u){typeof h[0]=="function"&&h[0].apply(null,[u])},function(u){typeof h[1]=="function"&&h[1].apply(null,[u])}):c.apply(this,arguments)}}),l=["setLocalDescription","setRemoteDescription","addIceCandidate"],l.forEach(function(a){var c=s.prototype[a];s.prototype[a]=function(){var h=arguments;return typeof h[1]=="function"||typeof h[2]=="function"?c.apply(this,arguments).then(function(){typeof h[1]=="function"&&h[1].apply(null)},function(u){typeof h[2]=="function"&&h[2].apply(null,[u])}):c.apply(this,arguments)}}),["getStats"].forEach(function(a){var c=s.prototype[a];s.prototype[a]=function(){var h=arguments;return typeof h[1]=="function"?c.apply(this,arguments).then(function(){typeof h[1]=="function"&&h[1].apply(null)}):c.apply(this,arguments)}}),s};const el=En($c);function So(n){const e=n&&n.navigator,t=function(r){return{name:{PermissionDeniedError:"NotAllowedError"}[r.name]||r.name,message:r.message,constraint:r.constraint,toString(){return this.name}}},i=e.mediaDevices.getUserMedia.bind(e.mediaDevices);e.mediaDevices.getUserMedia=function(r){return i(r).catch(s=>Promise.reject(t(s)))}}function wo(n){"getDisplayMedia"in n.navigator&&n.navigator.mediaDevices&&(n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices||(n.navigator.mediaDevices.getDisplayMedia=n.navigator.getDisplayMedia.bind(n.navigator)))}function Nr(n,e){if(n.RTCIceGatherer&&(n.RTCIceCandidate||(n.RTCIceCandidate=function(i){return i}),n.RTCSessionDescription||(n.RTCSessionDescription=function(i){return i}),e.version<15025)){const i=Object.getOwnPropertyDescriptor(n.MediaStreamTrack.prototype,"enabled");Object.defineProperty(n.MediaStreamTrack.prototype,"enabled",{set(r){i.set.call(this,r);const s=new Event("enabled");s.enabled=r,this.dispatchEvent(s)}})}n.RTCRtpSender&&!("dtmf"in n.RTCRtpSender.prototype)&&Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get(){return this._dtmf===void 0&&(this.track.kind==="audio"?this._dtmf=new n.RTCDtmfSender(this):this.track.kind==="video"&&(this._dtmf=null)),this._dtmf}}),n.RTCDtmfSender&&!n.RTCDTMFSender&&(n.RTCDTMFSender=n.RTCDtmfSender);const t=el(n,e.version);n.RTCPeerConnection=function(i){return i&&i.iceServers&&(i.iceServers=Zc(i.iceServers,e.version),Or("ICE servers after filtering:",i.iceServers)),new t(i)},n.RTCPeerConnection.prototype=t.prototype}function Mo(n){n.RTCRtpSender&&!("replaceTrack"in n.RTCRtpSender.prototype)&&(n.RTCRtpSender.prototype.replaceTrack=n.RTCRtpSender.prototype.setTrack)}const To=Object.freeze(Object.defineProperty({__proto__:null,shimGetDisplayMedia:wo,shimGetUserMedia:So,shimPeerConnection:Nr,shimReplaceTrack:Mo},Symbol.toStringTag,{value:"Module"}));function Co(n,e){const t=n&&n.navigator,i=n&&n.MediaStreamTrack;if(t.getUserMedia=function(r,s,o){An("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),t.mediaDevices.getUserMedia(r).then(s,o)},!(e.version>55&&"autoGainControl"in t.mediaDevices.getSupportedConstraints())){const r=function(o,l,a){l in o&&!(a in o)&&(o[a]=o[l],delete o[l])},s=t.mediaDevices.getUserMedia.bind(t.mediaDevices);if(t.mediaDevices.getUserMedia=function(o){return typeof o=="object"&&typeof o.audio=="object"&&(o=JSON.parse(JSON.stringify(o)),r(o.audio,"autoGainControl","mozAutoGainControl"),r(o.audio,"noiseSuppression","mozNoiseSuppression")),s(o)},i&&i.prototype.getSettings){const o=i.prototype.getSettings;i.prototype.getSettings=function(){const l=o.apply(this,arguments);return r(l,"mozAutoGainControl","autoGainControl"),r(l,"mozNoiseSuppression","noiseSuppression"),l}}if(i&&i.prototype.applyConstraints){const o=i.prototype.applyConstraints;i.prototype.applyConstraints=function(l){return this.kind==="audio"&&typeof l=="object"&&(l=JSON.parse(JSON.stringify(l)),r(l,"autoGainControl","mozAutoGainControl"),r(l,"noiseSuppression","mozNoiseSuppression")),o.apply(this,[l])}}}}function tl(n,e){n.navigator.mediaDevices&&"getDisplayMedia"in n.navigator.mediaDevices||n.navigator.mediaDevices&&(n.navigator.mediaDevices.getDisplayMedia=function(t){if(!(t&&t.video)){const i=new DOMException("getDisplayMedia without video constraints is undefined");return i.name="NotFoundError",i.code=8,Promise.reject(i)}return t.video===!0?t.video={mediaSource:e}:t.video.mediaSource=e,n.navigator.mediaDevices.getUserMedia(t)})}function Po(n){typeof n=="object"&&n.RTCTrackEvent&&"receiver"in n.RTCTrackEvent.prototype&&!("transceiver"in n.RTCTrackEvent.prototype)&&Object.defineProperty(n.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Ur(n,e){if(typeof n!="object"||!(n.RTCPeerConnection||n.mozRTCPeerConnection))return;!n.RTCPeerConnection&&n.mozRTCPeerConnection&&(n.RTCPeerConnection=n.mozRTCPeerConnection),e.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(r){const s=n.RTCPeerConnection.prototype[r],o={[r](){return arguments[0]=new(r==="addIceCandidate"?n.RTCIceCandidate:n.RTCSessionDescription)(arguments[0]),s.apply(this,arguments)}};n.RTCPeerConnection.prototype[r]=o[r]});const t={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},i=n.RTCPeerConnection.prototype.getStats;n.RTCPeerConnection.prototype.getStats=function(){const[r,s,o]=arguments;return i.apply(this,[r||null]).then(l=>{if(e.version<53&&!s)try{l.forEach(a=>{a.type=t[a.type]||a.type})}catch(a){if(a.name!=="TypeError")throw a;l.forEach((c,h)=>{l.set(h,Object.assign({},c,{type:t[c.type]||c.type}))})}return l}).then(s,o)}}function Eo(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender)||n.RTCRtpSender&&"getStats"in n.RTCRtpSender.prototype)return;const e=n.RTCPeerConnection.prototype.getSenders;e&&(n.RTCPeerConnection.prototype.getSenders=function(){const i=e.apply(this,[]);return i.forEach(r=>r._pc=this),i});const t=n.RTCPeerConnection.prototype.addTrack;t&&(n.RTCPeerConnection.prototype.addTrack=function(){const i=t.apply(this,arguments);return i._pc=this,i}),n.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function Ao(n){if(!(typeof n=="object"&&n.RTCPeerConnection&&n.RTCRtpSender)||n.RTCRtpSender&&"getStats"in n.RTCRtpReceiver.prototype)return;const e=n.RTCPeerConnection.prototype.getReceivers;e&&(n.RTCPeerConnection.prototype.getReceivers=function(){const t=e.apply(this,[]);return t.forEach(i=>i._pc=this),t}),Zt(n,"track",t=>(t.receiver._pc=t.srcElement,t)),n.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function ko(n){!n.RTCPeerConnection||"removeStream"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.removeStream=function(e){An("removeStream","removeTrack"),this.getSenders().forEach(t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)})})}function Ro(n){n.DataChannel&&!n.RTCDataChannel&&(n.RTCDataChannel=n.DataChannel)}function Oo(n){if(!(typeof n=="object"&&n.RTCPeerConnection))return;const e=n.RTCPeerConnection.prototype.addTransceiver;e&&(n.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];const t=arguments[1],i=t&&"sendEncodings"in t;i&&t.sendEncodings.forEach(s=>{if("rid"in s&&!/^[a-z0-9]{0,16}$/i.test(s.rid))throw new TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in s&&!(parseFloat(s.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in s&&!(parseFloat(s.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")});const r=e.apply(this,arguments);if(i){const{sender:s}=r,o=s.getParameters();(!("encodings"in o)||o.encodings.length===1&&Object.keys(o.encodings[0]).length===0)&&(o.encodings=t.sendEncodings,s.sendEncodings=t.sendEncodings,this.setParametersPromises.push(s.setParameters(o).then(()=>{delete s.sendEncodings}).catch(()=>{delete s.sendEncodings})))}return r})}function Bo(n){if(!(typeof n=="object"&&n.RTCRtpSender))return;const e=n.RTCRtpSender.prototype.getParameters;e&&(n.RTCRtpSender.prototype.getParameters=function(){const t=e.apply(this,arguments);return"encodings"in t||(t.encodings=[].concat(this.sendEncodings||[{}])),t})}function Io(n){if(!(typeof n=="object"&&n.RTCPeerConnection))return;const e=n.RTCPeerConnection.prototype.createOffer;n.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>e.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):e.apply(this,arguments)}}function zo(n){if(!(typeof n=="object"&&n.RTCPeerConnection))return;const e=n.RTCPeerConnection.prototype.createAnswer;n.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>e.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):e.apply(this,arguments)}}const No=Object.freeze(Object.defineProperty({__proto__:null,shimAddTransceiver:Oo,shimCreateAnswer:zo,shimCreateOffer:Io,shimGetDisplayMedia:tl,shimGetParameters:Bo,shimGetUserMedia:Co,shimOnTrack:Po,shimPeerConnection:Ur,shimRTCDataChannel:Ro,shimReceiverGetStats:Ao,shimRemoveStream:ko,shimSenderGetStats:Eo},Symbol.toStringTag,{value:"Module"}));function Uo(n){if(!(typeof n!="object"||!n.RTCPeerConnection)){if("getLocalStreams"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in n.RTCPeerConnection.prototype)){const e=n.RTCPeerConnection.prototype.addTrack;n.RTCPeerConnection.prototype.addStream=function(t){this._localStreams||(this._localStreams=[]),this._localStreams.includes(t)||this._localStreams.push(t),t.getAudioTracks().forEach(i=>e.call(this,i,t)),t.getVideoTracks().forEach(i=>e.call(this,i,t))},n.RTCPeerConnection.prototype.addTrack=function(t,...i){return i&&i.forEach(r=>{this._localStreams?this._localStreams.includes(r)||this._localStreams.push(r):this._localStreams=[r]}),e.apply(this,arguments)}}"removeStream"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);const t=this._localStreams.indexOf(e);if(t===-1)return;this._localStreams.splice(t,1);const i=e.getTracks();this.getSenders().forEach(r=>{i.includes(r.track)&&this.removeTrack(r)})})}}function Do(n){if(!(typeof n!="object"||!n.RTCPeerConnection)&&("getRemoteStreams"in n.RTCPeerConnection.prototype||(n.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in n.RTCPeerConnection.prototype))){Object.defineProperty(n.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(t){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=t),this.addEventListener("track",this._onaddstreampoly=i=>{i.streams.forEach(r=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(r))return;this._remoteStreams.push(r);const s=new Event("addstream");s.stream=r,this.dispatchEvent(s)})})}});const e=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){const t=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(i){i.streams.forEach(r=>{if(t._remoteStreams||(t._remoteStreams=[]),t._remoteStreams.indexOf(r)>=0)return;t._remoteStreams.push(r);const s=new Event("addstream");s.stream=r,t.dispatchEvent(s)})}),e.apply(t,arguments)}}}function Fo(n){if(typeof n!="object"||!n.RTCPeerConnection)return;const e=n.RTCPeerConnection.prototype,t=e.createOffer,i=e.createAnswer,r=e.setLocalDescription,s=e.setRemoteDescription,o=e.addIceCandidate;e.createOffer=function(a,c){const h=arguments.length>=2?arguments[2]:arguments[0],u=t.apply(this,[h]);return c?(u.then(a,c),Promise.resolve()):u},e.createAnswer=function(a,c){const h=arguments.length>=2?arguments[2]:arguments[0],u=i.apply(this,[h]);return c?(u.then(a,c),Promise.resolve()):u};let l=function(a,c,h){const u=r.apply(this,[a]);return h?(u.then(c,h),Promise.resolve()):u};e.setLocalDescription=l,l=function(a,c,h){const u=s.apply(this,[a]);return h?(u.then(c,h),Promise.resolve()):u},e.setRemoteDescription=l,l=function(a,c,h){const u=o.apply(this,[a]);return h?(u.then(c,h),Promise.resolve()):u},e.addIceCandidate=l}function Lo(n){const e=n&&n.navigator;if(e.mediaDevices&&e.mediaDevices.getUserMedia){const t=e.mediaDevices,i=t.getUserMedia.bind(t);e.mediaDevices.getUserMedia=r=>i(Vo(r))}!e.getUserMedia&&e.mediaDevices&&e.mediaDevices.getUserMedia&&(e.getUserMedia=function(t,i,r){e.mediaDevices.getUserMedia(t).then(i,r)}.bind(e))}function Vo(n){return n&&n.video!==void 0?Object.assign({},n,{video:ro(n.video)}):n}function jo(n){if(!n.RTCPeerConnection)return;const e=n.RTCPeerConnection;n.RTCPeerConnection=function(t,i){if(t&&t.iceServers){const r=[];for(let s=0;s<t.iceServers.length;s++){let o=t.iceServers[s];!o.hasOwnProperty("urls")&&o.hasOwnProperty("url")?(An("RTCIceServer.url","RTCIceServer.urls"),o=JSON.parse(JSON.stringify(o)),o.urls=o.url,delete o.url,r.push(o)):r.push(t.iceServers[s])}t.iceServers=r}return new e(t,i)},n.RTCPeerConnection.prototype=e.prototype,"generateCertificate"in e&&Object.defineProperty(n.RTCPeerConnection,"generateCertificate",{get(){return e.generateCertificate}})}function Jo(n){typeof n=="object"&&n.RTCTrackEvent&&"receiver"in n.RTCTrackEvent.prototype&&!("transceiver"in n.RTCTrackEvent.prototype)&&Object.defineProperty(n.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function Go(n){const e=n.RTCPeerConnection.prototype.createOffer;n.RTCPeerConnection.prototype.createOffer=function(t){if(t){typeof t.offerToReceiveAudio<"u"&&(t.offerToReceiveAudio=!!t.offerToReceiveAudio);const i=this.getTransceivers().find(s=>s.receiver.track.kind==="audio");t.offerToReceiveAudio===!1&&i?i.direction==="sendrecv"?i.setDirection?i.setDirection("sendonly"):i.direction="sendonly":i.direction==="recvonly"&&(i.setDirection?i.setDirection("inactive"):i.direction="inactive"):t.offerToReceiveAudio===!0&&!i&&this.addTransceiver("audio"),typeof t.offerToReceiveVideo<"u"&&(t.offerToReceiveVideo=!!t.offerToReceiveVideo);const r=this.getTransceivers().find(s=>s.receiver.track.kind==="video");t.offerToReceiveVideo===!1&&r?r.direction==="sendrecv"?r.setDirection?r.setDirection("sendonly"):r.direction="sendonly":r.direction==="recvonly"&&(r.setDirection?r.setDirection("inactive"):r.direction="inactive"):t.offerToReceiveVideo===!0&&!r&&this.addTransceiver("video")}return e.apply(this,arguments)}}function qo(n){typeof n!="object"||n.AudioContext||(n.AudioContext=n.webkitAudioContext)}const Ho=Object.freeze(Object.defineProperty({__proto__:null,shimAudioContext:qo,shimCallbacksAPI:Fo,shimConstraints:Vo,shimCreateOfferLegacy:Go,shimGetUserMedia:Lo,shimLocalStreamsAPI:Uo,shimRTCIceServerUrls:jo,shimRemoteStreamsAPI:Do,shimTrackEventTransceiver:Jo},Symbol.toStringTag,{value:"Module"}));function On(n){if(!n.RTCIceCandidate||n.RTCIceCandidate&&"foundation"in n.RTCIceCandidate.prototype)return;const e=n.RTCIceCandidate;n.RTCIceCandidate=function(t){if(typeof t=="object"&&t.candidate&&t.candidate.indexOf("a=")===0&&(t=JSON.parse(JSON.stringify(t)),t.candidate=t.candidate.substr(2)),t.candidate&&t.candidate.length){const i=new e(t),r=kn.parseCandidate(t.candidate),s=Object.assign(i,r);return s.toJSON=function(){return{candidate:s.candidate,sdpMid:s.sdpMid,sdpMLineIndex:s.sdpMLineIndex,usernameFragment:s.usernameFragment}},s}return new e(t)},n.RTCIceCandidate.prototype=e.prototype,Zt(n,"icecandidate",t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new n.RTCIceCandidate(t.candidate),writable:"false"}),t))}function bi(n,e){if(!n.RTCPeerConnection)return;"sctp"in n.RTCPeerConnection.prototype||Object.defineProperty(n.RTCPeerConnection.prototype,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp}});const t=function(l){if(!l||!l.sdp)return!1;const a=kn.splitSections(l.sdp);return a.shift(),a.some(c=>{const h=kn.parseMLine(c);return h&&h.kind==="application"&&h.protocol.indexOf("SCTP")!==-1})},i=function(l){const a=l.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(a===null||a.length<2)return-1;const c=parseInt(a[1],10);return c!==c?-1:c},r=function(l){let a=65536;return e.browser==="firefox"&&(e.version<57?l===-1?a=16384:a=2147483637:e.version<60?a=e.version===57?65535:65536:a=2147483637),a},s=function(l,a){let c=65536;e.browser==="firefox"&&e.version===57&&(c=65535);const h=kn.matchPrefix(l.sdp,"a=max-message-size:");return h.length>0?c=parseInt(h[0].substr(19),10):e.browser==="firefox"&&a!==-1&&(c=2147483637),c},o=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,e.browser==="chrome"&&e.version>=76){const{sdpSemantics:l}=this.getConfiguration();l==="plan-b"&&Object.defineProperty(this,"sctp",{get(){return typeof this._sctp>"u"?null:this._sctp},enumerable:!0,configurable:!0})}if(t(arguments[0])){const l=i(arguments[0]),a=r(l),c=s(arguments[0],l);let h;a===0&&c===0?h=Number.POSITIVE_INFINITY:a===0||c===0?h=Math.max(a,c):h=Math.min(a,c);const u={};Object.defineProperty(u,"maxMessageSize",{get(){return h}}),this._sctp=u}return o.apply(this,arguments)}}function xi(n){if(!(n.RTCPeerConnection&&"createDataChannel"in n.RTCPeerConnection.prototype))return;function e(i,r){const s=i.send;i.send=function(){const o=arguments[0],l=o.length||o.size||o.byteLength;if(i.readyState==="open"&&r.sctp&&l>r.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+r.sctp.maxMessageSize+" bytes)");return s.apply(i,arguments)}}const t=n.RTCPeerConnection.prototype.createDataChannel;n.RTCPeerConnection.prototype.createDataChannel=function(){const i=t.apply(this,arguments);return e(i,this),i},Zt(n,"datachannel",i=>(e(i.channel,i.target),i))}function Dr(n){if(!n.RTCPeerConnection||"connectionState"in n.RTCPeerConnection.prototype)return;const e=n.RTCPeerConnection.prototype;Object.defineProperty(e,"connectionState",{get(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(e,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(t){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),t&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=t)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(t=>{const i=e[t];e[t]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=r=>{const s=r.target;if(s._lastConnectionState!==s.connectionState){s._lastConnectionState=s.connectionState;const o=new Event("connectionstatechange",r);s.dispatchEvent(o)}return r},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),i.apply(this,arguments)}})}function Fr(n,e){if(!n.RTCPeerConnection||e.browser==="chrome"&&e.version>=71||e.browser==="safari"&&e.version>=605)return;const t=n.RTCPeerConnection.prototype.setRemoteDescription;n.RTCPeerConnection.prototype.setRemoteDescription=function(i){if(i&&i.sdp&&i.sdp.indexOf(`
70
+ a=extmap-allow-mixed`)!==-1){const r=i.sdp.split(`
71
+ `).filter(s=>s.trim()!=="a=extmap-allow-mixed").join(`
72
+ `);n.RTCSessionDescription&&i instanceof n.RTCSessionDescription?arguments[0]=new n.RTCSessionDescription({type:i.type,sdp:r}):i.sdp=r}return t.apply(this,arguments)}}function Bn(n,e){if(!(n.RTCPeerConnection&&n.RTCPeerConnection.prototype))return;const t=n.RTCPeerConnection.prototype.addIceCandidate;!t||t.length===0||(n.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?(e.browser==="chrome"&&e.version<78||e.browser==="firefox"&&e.version<68||e.browser==="safari")&&arguments[0]&&arguments[0].candidate===""?Promise.resolve():t.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}const il=Object.freeze(Object.defineProperty({__proto__:null,removeExtmapAllowMixed:Fr,shimAddIceCandidateNullOrEmpty:Bn,shimConnectionState:Dr,shimMaxMessageSize:bi,shimRTCIceCandidate:On,shimSendThrowTypeError:xi},Symbol.toStringTag,{value:"Module"}));function nl({window:n}={},e={shimChrome:!0,shimFirefox:!0,shimEdge:!0,shimSafari:!0}){const t=Or,i=Xc(n),r={browserDetails:i,commonShim:il,extractVersion:vi,disableLog:Hc,disableWarnings:Wc};switch(i.browser){case"chrome":if(!go||!Ir||!e.shimChrome)return t("Chrome shim is not included in this adapter release."),r;if(i.version===null)return t("Chrome shim can not determine version, not shimming."),r;t("adapter.js shimming chrome."),r.browserShim=go,Bn(n,i),ao(n,i),co(n),Ir(n,i),lo(n),mo(n,i),ho(n),uo(n),po(n),yo(n,i),On(n),Dr(n),bi(n,i),xi(n),Fr(n,i);break;case"firefox":if(!No||!Ur||!e.shimFirefox)return t("Firefox shim is not included in this adapter release."),r;t("adapter.js shimming firefox."),r.browserShim=No,Bn(n,i),Co(n,i),Ur(n,i),Po(n),ko(n),Eo(n),Ao(n),Ro(n),Oo(n),Bo(n),Io(n),zo(n),On(n),Dr(n),bi(n,i),xi(n);break;case"edge":if(!To||!Nr||!e.shimEdge)return t("MS edge shim is not included in this adapter release."),r;t("adapter.js shimming edge."),r.browserShim=To,So(n),wo(n),Nr(n,i),Mo(n),bi(n,i),xi(n);break;case"safari":if(!Ho||!e.shimSafari)return t("Safari shim is not included in this adapter release."),r;t("adapter.js shimming safari."),r.browserShim=Ho,Bn(n,i),jo(n),Go(n),Fo(n),Uo(n),Do(n),Jo(n),Lo(n),qo(n),On(n),bi(n,i),xi(n),Fr(n,i);break;default:t("Unsupported browser!");break}return r}const Wo=nl({window:typeof window>"u"?void 0:window});function Qe(n,e,t,i){Object.defineProperty(n,e,{get:t,set:i,enumerable:!0,configurable:!0})}var Lr=Wo.default||Wo,_i=new(function(){function n(){this.isIOS=["iPad","iPhone","iPod"].includes(navigator.platform),this.supportedBrowsers=["firefox","chrome","safari"],this.minFirefoxVersion=59,this.minChromeVersion=72,this.minSafariVersion=605}return n.prototype.isWebRTCSupported=function(){return typeof RTCPeerConnection<"u"},n.prototype.isBrowserSupported=function(){var e=this.getBrowser(),t=this.getVersion(),i=this.supportedBrowsers.includes(e);return i?e==="chrome"?t>=this.minChromeVersion:e==="firefox"?t>=this.minFirefoxVersion:e==="safari"?!this.isIOS&&t>=this.minSafariVersion:!1:!1},n.prototype.getBrowser=function(){return Lr.browserDetails.browser},n.prototype.getVersion=function(){return Lr.browserDetails.version||0},n.prototype.isUnifiedPlanSupported=function(){var e=this.getBrowser(),t=Lr.browserDetails.version||0;if(e==="chrome"&&t<this.minChromeVersion)return!1;if(e==="firefox"&&t>=this.minFirefoxVersion)return!0;if(!window.RTCRtpTransceiver||!("currentDirection"in RTCRtpTransceiver.prototype))return!1;var i,r=!1;try{i=new RTCPeerConnection,i.addTransceiver("audio"),r=!0}catch{}finally{i&&i.close()}return r},n.prototype.toString=function(){return`Supports:
73
73
  browser:`.concat(this.getBrowser(),`
74
74
  version:`).concat(this.getVersion(),`
75
75
  isIOS:`).concat(this.isIOS,`
76
76
  isWebRTCSupported:`).concat(this.isWebRTCSupported(),`
77
77
  isBrowserSupported:`).concat(this.isBrowserSupported(),`
78
- isUnifiedPlanSupported:`).concat(this.isUnifiedPlanSupported())},n}()),Oa={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:["turn:eu-0.turn.peerjs.com:3478","turn:us-0.turn.peerjs.com:3478"],username:"peerjs",credential:"peerjsp"}],sdpSemantics:"unified-plan"},ac=function(){function n(){this.CLOUD_HOST="0.peerjs.com",this.CLOUD_PORT=443,this.chunkedBrowsers={Chrome:1,chrome:1},this.chunkedMTU=16300,this.defaultConfig=Oa,this.browser=Ri.getBrowser(),this.browserVersion=Ri.getVersion(),this.supports=function(){var e={browser:Ri.isBrowserSupported(),webRTC:Ri.isWebRTCSupported(),audioVideo:!1,data:!1,binaryBlob:!1,reliable:!1};if(!e.webRTC)return e;var t;try{t=new RTCPeerConnection(Oa),e.audioVideo=!0;var i=void 0;try{i=t.createDataChannel("_PEERJSTEST",{ordered:!0}),e.data=!0,e.reliable=!!i.ordered;try{i.binaryType="blob",e.binaryBlob=!Ri.isIOS}catch{}}catch{}finally{i&&i.close()}}catch{}finally{t&&t.close()}return e}(),this.pack=ta.pack,this.unpack=ta.unpack,this._dataCount=1}return n.prototype.noop=function(){},n.prototype.validateId=function(e){return!e||/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(e)},n.prototype.chunk=function(e){for(var t=[],i=e.size,s=Math.ceil(i/J.chunkedMTU),o=0,a=0;a<i;){var c=Math.min(i,a+J.chunkedMTU),r=e.slice(a,c),l={__peerData:this._dataCount,n:o,data:r,total:s};t.push(l),a=c,o++}return this._dataCount++,t},n.prototype.blobToArrayBuffer=function(e,t){var i=new FileReader;return i.onload=function(s){s.target&&t(s.target.result)},i.readAsArrayBuffer(e),i},n.prototype.binaryStringToArrayBuffer=function(e){for(var t=new Uint8Array(e.length),i=0;i<e.length;i++)t[i]=e.charCodeAt(i)&255;return t.buffer},n.prototype.randomToken=function(){return Math.random().toString(36).slice(2)},n.prototype.isSecure=function(){return location.protocol==="https:"},n}(),J=new ac,Da={};Ae(Da,"Peer",()=>Es,n=>Es=n);var Li={},rc=Object.prototype.hasOwnProperty,Re="~";function xi(){}Object.create&&(xi.prototype=Object.create(null),new xi().__proto__||(Re=!1));function lc(n,e,t){this.fn=n,this.context=e,this.once=t||!1}function _a(n,e,t,i,s){if(typeof t!="function")throw new TypeError("The listener must be a function");var o=new lc(t,i||n,s),a=Re?Re+e:e;return n._events[a]?n._events[a].fn?n._events[a]=[n._events[a],o]:n._events[a].push(o):(n._events[a]=o,n._eventsCount++),n}function Yn(n,e){--n._eventsCount===0?n._events=new xi:delete n._events[e]}function Ge(){this._events=new xi,this._eventsCount=0}Ge.prototype.eventNames=function(){var n=[],e,t;if(this._eventsCount===0)return n;for(t in e=this._events)rc.call(e,t)&&n.push(Re?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},Ge.prototype.listeners=function(n){var e=Re?Re+n:n,t=this._events[e];if(!t)return[];if(t.fn)return[t.fn];for(var i=0,s=t.length,o=new Array(s);i<s;i++)o[i]=t[i].fn;return o},Ge.prototype.listenerCount=function(n){var e=Re?Re+n:n,t=this._events[e];return t?t.fn?1:t.length:0},Ge.prototype.emit=function(n,e,t,i,s,o){var a=Re?Re+n:n;if(!this._events[a])return!1;var c=this._events[a],r=arguments.length,l,d;if(c.fn){switch(c.once&&this.removeListener(n,c.fn,void 0,!0),r){case 1:return c.fn.call(c.context),!0;case 2:return c.fn.call(c.context,e),!0;case 3:return c.fn.call(c.context,e,t),!0;case 4:return c.fn.call(c.context,e,t,i),!0;case 5:return c.fn.call(c.context,e,t,i,s),!0;case 6:return c.fn.call(c.context,e,t,i,s,o),!0}for(d=1,l=new Array(r-1);d<r;d++)l[d-1]=arguments[d];c.fn.apply(c.context,l)}else{var h=c.length,u;for(d=0;d<h;d++)switch(c[d].once&&this.removeListener(n,c[d].fn,void 0,!0),r){case 1:c[d].fn.call(c[d].context);break;case 2:c[d].fn.call(c[d].context,e);break;case 3:c[d].fn.call(c[d].context,e,t);break;case 4:c[d].fn.call(c[d].context,e,t,i);break;default:if(!l)for(u=1,l=new Array(r-1);u<r;u++)l[u-1]=arguments[u];c[d].fn.apply(c[d].context,l)}}return!0},Ge.prototype.on=function(n,e,t){return _a(this,n,e,t,!1)},Ge.prototype.once=function(n,e,t){return _a(this,n,e,t,!0)},Ge.prototype.removeListener=function(n,e,t,i){var s=Re?Re+n:n;if(!this._events[s])return this;if(!e)return Yn(this,s),this;var o=this._events[s];if(o.fn)o.fn===e&&(!i||o.once)&&(!t||o.context===t)&&Yn(this,s);else{for(var a=0,c=[],r=o.length;a<r;a++)(o[a].fn!==e||i&&!o[a].once||t&&o[a].context!==t)&&c.push(o[a]);c.length?this._events[s]=c.length===1?c[0]:c:Yn(this,s)}return this},Ge.prototype.removeAllListeners=function(n){var e;return n?(e=Re?Re+n:n,this._events[e]&&Yn(this,e)):(this._events=new xi,this._eventsCount=0),this},Ge.prototype.off=Ge.prototype.removeListener,Ge.prototype.addListener=Ge.prototype.on,Ge.prefixed=Re,Ge.EventEmitter=Ge,Li=Ge;var M={};Ae(M,"LogLevel",()=>We,n=>We=n),Ae(M,"default",()=>Aa,n=>Aa=n);var Ht=function(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),s,o=[],a;try{for(;(e===void 0||e-- >0)&&!(s=i.next()).done;)o.push(s.value)}catch(c){a={error:c}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(a)throw a.error}}return o},kt=function(n,e,t){if(t||arguments.length===2)for(var i=0,s=e.length,o;i<s;i++)(o||!(i in e))&&(o||(o=Array.prototype.slice.call(e,0,i)),o[i]=e[i]);return n.concat(o||Array.prototype.slice.call(e))},cc="PeerJS: ",We;(function(n){n[n.Disabled=0]="Disabled",n[n.Errors=1]="Errors",n[n.Warnings=2]="Warnings",n[n.All=3]="All"})(We||(We={}));var dc=function(){function n(){this._logLevel=We.Disabled}return Object.defineProperty(n.prototype,"logLevel",{get:function(){return this._logLevel},set:function(e){this._logLevel=e},enumerable:!1,configurable:!0}),n.prototype.log=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._logLevel>=We.All&&this._print.apply(this,kt([We.All],Ht(e),!1))},n.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._logLevel>=We.Warnings&&this._print.apply(this,kt([We.Warnings],Ht(e),!1))},n.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._logLevel>=We.Errors&&this._print.apply(this,kt([We.Errors],Ht(e),!1))},n.prototype.setLogFunction=function(e){this._print=e},n.prototype._print=function(e){for(var t=[],i=1;i<arguments.length;i++)t[i-1]=arguments[i];var s=kt([cc],Ht(t),!1);for(var o in s)s[o]instanceof Error&&(s[o]="("+s[o].name+") "+s[o].message);e>=We.All?console.log.apply(console,kt([],Ht(s),!1)):e>=We.Warnings?console.warn.apply(console,kt(["WARNING"],Ht(s),!1)):e>=We.Errors&&console.error.apply(console,kt(["ERROR"],Ht(s),!1))},n}(),Aa=new dc,qa={};Ae(qa,"Socket",()=>$a,n=>$a=n);var Qe;(function(n){n.Data="data",n.Media="media"})(Qe||(Qe={}));var A;(function(n){n.BrowserIncompatible="browser-incompatible",n.Disconnected="disconnected",n.InvalidID="invalid-id",n.InvalidKey="invalid-key",n.Network="network",n.PeerUnavailable="peer-unavailable",n.SslUnavailable="ssl-unavailable",n.ServerError="server-error",n.SocketError="socket-error",n.SocketClosed="socket-closed",n.UnavailableID="unavailable-id",n.WebRTC="webrtc"})(A||(A={}));var ct;(function(n){n.Binary="binary",n.BinaryUTF8="binary-utf8",n.JSON="json"})(ct||(ct={}));var dt;(function(n){n.Message="message",n.Disconnected="disconnected",n.Error="error",n.Close="close"})(dt||(dt={}));var ce;(function(n){n.Heartbeat="HEARTBEAT",n.Candidate="CANDIDATE",n.Offer="OFFER",n.Answer="ANSWER",n.Open="OPEN",n.Error="ERROR",n.IdTaken="ID-TAKEN",n.InvalidKey="INVALID-KEY",n.Leave="LEAVE",n.Expire="EXPIRE"})(ce||(ce={}));var Ps={};Ps=JSON.parse('{"name":"peerjs","version":"1.4.7","keywords":["peerjs","webrtc","p2p","rtc"],"description":"PeerJS client","homepage":"https://peerjs.com","bugs":{"url":"https://github.com/peers/peerjs/issues"},"repository":{"type":"git","url":"https://github.com/peers/peerjs"},"license":"MIT","contributors":["Michelle Bu <michelle@michellebu.com>","afrokick <devbyru@gmail.com>","ericz <really.ez@gmail.com>","Jairo <kidandcat@gmail.com>","Jonas Gloning <34194370+jonasgloning@users.noreply.github.com>","Jairo Caro-Accino Viciana <jairo@galax.be>","Carlos Caballero <carlos.caballero.gonzalez@gmail.com>","hc <hheennrryy@gmail.com>","Muhammad Asif <capripio@gmail.com>","PrashoonB <prashoonbhattacharjee@gmail.com>","Harsh Bardhan Mishra <47351025+HarshCasper@users.noreply.github.com>","akotynski <aleksanderkotbury@gmail.com>","lmb <i@lmb.io>","Jairooo <jairocaro@msn.com>","Moritz St\xFCckler <moritz.stueckler@gmail.com>","Simon <crydotsnakegithub@gmail.com>","Denis Lukov <denismassters@gmail.com>","Philipp Hancke <fippo@andyet.net>","Hans Oksendahl <hansoksendahl@gmail.com>","Jess <jessachandler@gmail.com>","khankuan <khankuan@gmail.com>","DUODVK <kurmanov.work@gmail.com>","XiZhao <kwang1imsa@gmail.com>","Matthias Lohr <matthias@lohr.me>","=frank tree <=frnktrb@googlemail.com>","Andre Eckardt <aeckardt@outlook.com>","Chris Cowan <agentme49@gmail.com>","Alex Chuev <alex@chuev.com>","alxnull <alxnull@e.mail.de>","Yemel Jardi <angel.jardi@gmail.com>","Ben Parnell <benjaminparnell.94@gmail.com>","Benny Lichtner <bennlich@gmail.com>","fresheneesz <bitetrudpublic@gmail.com>","bob.barstead@exaptive.com <bob.barstead@exaptive.com>","chandika <chandika@gmail.com>","emersion <contact@emersion.fr>","Christopher Van <cvan@users.noreply.github.com>","eddieherm <edhermoso@gmail.com>","Eduardo Pinho <enet4mikeenet@gmail.com>","Evandro Zanatta <ezanatta@tray.net.br>","Gardner Bickford <gardner@users.noreply.github.com>","Gian Luca <gianluca.cecchi@cynny.com>","PatrickJS <github@gdi2290.com>","jonnyf <github@jonathanfoss.co.uk>","Hizkia Felix <hizkifw@gmail.com>","Hristo Oskov <hristo.oskov@gmail.com>","Isaac Madwed <i.madwed@gmail.com>","Ilya Konanykhin <ilya.konanykhin@gmail.com>","jasonbarry <jasbarry@me.com>","Jonathan Burke <jonathan.burke.1311@googlemail.com>","Josh Hamit <josh.hamit@gmail.com>","Jordan Austin <jrax86@gmail.com>","Joel Wetzell <jwetzell@yahoo.com>","xizhao <kevin.wang@cloudera.com>","Alberto Torres <kungfoobar@gmail.com>","Jonathan Mayol <mayoljonathan@gmail.com>","Jefferson Felix <me@jsfelix.dev>","Rolf Erik Lekang <me@rolflekang.com>","Kevin Mai-Husan Chia <mhchia@users.noreply.github.com>","Pepijn de Vos <pepijndevos@gmail.com>","JooYoung <qkdlql@naver.com>","Tobias Speicher <rootcommander@gmail.com>","Steve Blaurock <sblaurock@gmail.com>","Kyrylo Shegeda <shegeda@ualberta.ca>","Diwank Singh Tomer <singh@diwank.name>","So\u0308ren Balko <Soeren.Balko@gmail.com>","Arpit Solanki <solankiarpit1997@gmail.com>","Yuki Ito <yuki@gnnk.net>","Artur Zayats <zag2art@gmail.com>"],"funding":{"type":"opencollective","url":"https://opencollective.com/peer"},"collective":{"type":"opencollective","url":"https://opencollective.com/peer"},"files":["dist/*"],"sideEffects":["lib/global.ts","lib/supports.ts"],"main":"dist/bundler.cjs","module":"dist/bundler.mjs","browser-minified":"dist/peerjs.min.js","browser-unminified":"dist/peerjs.js","types":"dist/types.d.ts","engines":{"node":">= 10"},"targets":{"types":{"source":"lib/exports.ts"},"main":{"source":"lib/exports.ts","sourceMap":{"inlineSources":true}},"module":{"source":"lib/exports.ts","includeNodeModules":["eventemitter3"],"sourceMap":{"inlineSources":true}},"browser-minified":{"context":"browser","outputFormat":"global","optimize":true,"engines":{"browsers":"cover 99%, not dead"},"source":"lib/global.ts"},"browser-unminified":{"context":"browser","outputFormat":"global","optimize":false,"engines":{"browsers":"cover 99%, not dead"},"source":"lib/global.ts"}},"scripts":{"contributors":"git-authors-cli --print=false && prettier --write package.json && git add package.json package-lock.json && git commit -m \\"chore(contributors): update and sort contributors list\\"","check":"tsc --noEmit","watch":"parcel watch","build":"rm -rf dist && parcel build","prepublishOnly":"npm run build","test":"mocha -r ts-node/register -r jsdom-global/register test/**/*.ts","format":"prettier --write .","semantic-release":"semantic-release"},"devDependencies":{"@parcel/config-default":"^2.5.0","@parcel/packager-ts":"^2.5.0","@parcel/transformer-typescript-tsc":"^2.5.0","@parcel/transformer-typescript-types":"^2.5.0","@semantic-release/changelog":"^6.0.1","@semantic-release/git":"^10.0.1","@types/chai":"^4.3.0","@types/mocha":"^9.1.0","@types/node":"^17.0.18","chai":"^4.3.6","git-authors-cli":"^1.0.40","jsdom":"^19.0.0","jsdom-global":"^3.0.2","mocha":"^9.2.0","mock-socket":"8.0.5","parcel":"^2.5.0","parcel-transformer-tsc-sourcemaps":"^1.0.2","prettier":"^2.6.2","semantic-release":"^19.0.2","standard":"^16.0.4","ts-node":"^10.5.0","typescript":"^4.5.5"},"dependencies":{"@swc/helpers":"^0.3.13","eventemitter3":"^4.0.7","peerjs-js-binarypack":"1.0.1","webrtc-adapter":"^7.7.1"}}');var hc=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(i[o]=s[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),uc=function(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),s,o=[],a;try{for(;(e===void 0||e-- >0)&&!(s=i.next()).done;)o.push(s.value)}catch(c){a={error:c}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(a)throw a.error}}return o},pc=function(n,e,t){if(t||arguments.length===2)for(var i=0,s=e.length,o;i<s;i++)(o||!(i in e))&&(o||(o=Array.prototype.slice.call(e,0,i)),o[i]=e[i]);return n.concat(o||Array.prototype.slice.call(e))},mc=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},$a=function(n){hc(e,n);function e(t,i,s,o,a,c){c===void 0&&(c=5e3);var r=n.call(this)||this;r.pingInterval=c,r._disconnected=!0,r._messagesQueue=[];var l=t?"wss://":"ws://";return r._baseUrl=l+i+":"+s+o+"peerjs?key="+a,r}return e.prototype.start=function(t,i){var s=this;this._id=t;var o="".concat(this._baseUrl,"&id=").concat(t,"&token=").concat(i);this._socket||!this._disconnected||(this._socket=new WebSocket(o+"&version="+Ps.version),this._disconnected=!1,this._socket.onmessage=function(a){var c;try{c=JSON.parse(a.data),M.default.log("Server message received:",c)}catch{M.default.log("Invalid server message",a.data);return}s.emit(dt.Message,c)},this._socket.onclose=function(a){s._disconnected||(M.default.log("Socket closed.",a),s._cleanup(),s._disconnected=!0,s.emit(dt.Disconnected))},this._socket.onopen=function(){s._disconnected||(s._sendQueuedMessages(),M.default.log("Socket open"),s._scheduleHeartbeat())})},e.prototype._scheduleHeartbeat=function(){var t=this;this._wsPingTimer=setTimeout(function(){t._sendHeartbeat()},this.pingInterval)},e.prototype._sendHeartbeat=function(){if(!this._wsOpen()){M.default.log("Cannot send heartbeat, because socket closed");return}var t=JSON.stringify({type:ce.Heartbeat});this._socket.send(t),this._scheduleHeartbeat()},e.prototype._wsOpen=function(){return!!this._socket&&this._socket.readyState===1},e.prototype._sendQueuedMessages=function(){var t,i,s=pc([],uc(this._messagesQueue),!1);this._messagesQueue=[];try{for(var o=mc(s),a=o.next();!a.done;a=o.next()){var c=a.value;this.send(c)}}catch(r){t={error:r}}finally{try{a&&!a.done&&(i=o.return)&&i.call(o)}finally{if(t)throw t.error}}},e.prototype.send=function(t){if(!this._disconnected){if(!this._id){this._messagesQueue.push(t);return}if(!t.type){this.emit(dt.Error,"Invalid message");return}if(this._wsOpen()){var i=JSON.stringify(t);this._socket.send(i)}}},e.prototype.close=function(){this._disconnected||(this._cleanup(),this._disconnected=!0)},e.prototype._cleanup=function(){this._socket&&(this._socket.onopen=this._socket.onmessage=this._socket.onclose=null,this._socket.close(),this._socket=void 0),clearTimeout(this._wsPingTimer)},e}(Li.EventEmitter),ws={};Ae(ws,"MediaConnection",()=>ir,n=>ir=n);var Fs={};Ae(Fs,"Negotiator",()=>er,n=>er=n);var Hn=function(){return Hn=Object.assign||function(n){for(var e,t=1,i=arguments.length;t<i;t++){e=arguments[t];for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(n[s]=e[s])}return n},Hn.apply(this,arguments)},kn=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(a){a(o)})}return new(t||(t=Promise))(function(o,a){function c(d){try{l(i.next(d))}catch(h){a(h)}}function r(d){try{l(i.throw(d))}catch(h){a(h)}}function l(d){d.done?o(d.value):s(d.value).then(c,r)}l((i=i.apply(n,e||[])).next())})},Nn=function(n,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},i,s,o,a;return a={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function c(l){return function(d){return r([l,d])}}function r(l){if(i)throw new TypeError("Generator is already executing.");for(;t;)try{if(i=1,s&&(o=l[0]&2?s.return:l[0]?s.throw||((o=s.return)&&o.call(s),0):s.next)&&!(o=o.call(s,l[1])).done)return o;switch(s=0,o&&(l=[l[0]&2,o.value]),l[0]){case 0:case 1:o=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,s=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(o=t.trys,!(o=o.length>0&&o[o.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!o||l[1]>o[0]&&l[1]<o[3])){t.label=l[1];break}if(l[0]===6&&t.label<o[1]){t.label=o[1],o=l;break}if(o&&t.label<o[2]){t.label=o[2],t.ops.push(l);break}o[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(n,t)}catch(d){l=[6,d],s=0}finally{i=o=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},er=function(){function n(e){this.connection=e}return n.prototype.startConnection=function(e){var t=this._startPeerConnection();if(this.connection.peerConnection=t,this.connection.type===Qe.Media&&e._stream&&this._addTracksToConnection(e._stream,t),e.originator){if(this.connection.type===Qe.Data){var i=this.connection,s={ordered:!!e.reliable},o=t.createDataChannel(i.label,s);i.initialize(o)}this._makeOffer()}else this.handleSDP("OFFER",e.sdp)},n.prototype._startPeerConnection=function(){M.default.log("Creating RTCPeerConnection.");var e=new RTCPeerConnection(this.connection.provider.options.config);return this._setupListeners(e),e},n.prototype._setupListeners=function(e){var t=this,i=this.connection.peer,s=this.connection.connectionId,o=this.connection.type,a=this.connection.provider;M.default.log("Listening for ICE candidates."),e.onicecandidate=function(c){!c.candidate||!c.candidate.candidate||(M.default.log("Received ICE candidates for ".concat(i,":"),c.candidate),a.socket.send({type:ce.Candidate,payload:{candidate:c.candidate,type:o,connectionId:s},dst:i}))},e.oniceconnectionstatechange=function(){switch(e.iceConnectionState){case"failed":M.default.log("iceConnectionState is failed, closing connections to "+i),t.connection.emit("error",new Error("Negotiation of connection to "+i+" failed.")),t.connection.close();break;case"closed":M.default.log("iceConnectionState is closed, closing connections to "+i),t.connection.emit("error",new Error("Connection to "+i+" closed.")),t.connection.close();break;case"disconnected":M.default.log("iceConnectionState changed to disconnected on the connection with "+i);break;case"completed":e.onicecandidate=J.noop;break}t.connection.emit("iceStateChanged",e.iceConnectionState)},M.default.log("Listening for data channel"),e.ondatachannel=function(c){M.default.log("Received data channel");var r=c.channel,l=a.getConnection(i,s);l.initialize(r)},M.default.log("Listening for remote stream"),e.ontrack=function(c){M.default.log("Received remote stream");var r=c.streams[0],l=a.getConnection(i,s);if(l.type===Qe.Media){var d=l;t._addStreamToMediaConnection(r,d)}}},n.prototype.cleanup=function(){M.default.log("Cleaning up PeerConnection to "+this.connection.peer);var e=this.connection.peerConnection;if(e){this.connection.peerConnection=null,e.onicecandidate=e.oniceconnectionstatechange=e.ondatachannel=e.ontrack=function(){};var t=e.signalingState!=="closed",i=!1;if(this.connection.type===Qe.Data){var s=this.connection,o=s.dataChannel;o&&(i=!!o.readyState&&o.readyState!=="closed")}(t||i)&&e.close()}},n.prototype._makeOffer=function(){return kn(this,void 0,Promise,function(){var e,t,i,s,o,a,c;return Nn(this,function(r){switch(r.label){case 0:e=this.connection.peerConnection,t=this.connection.provider,r.label=1;case 1:return r.trys.push([1,7,,8]),[4,e.createOffer(this.connection.options.constraints)];case 2:i=r.sent(),M.default.log("Created offer."),this.connection.options.sdpTransform&&typeof this.connection.options.sdpTransform=="function"&&(i.sdp=this.connection.options.sdpTransform(i.sdp)||i.sdp),r.label=3;case 3:return r.trys.push([3,5,,6]),[4,e.setLocalDescription(i)];case 4:return r.sent(),M.default.log("Set localDescription:",i,"for:".concat(this.connection.peer)),s={sdp:i,type:this.connection.type,connectionId:this.connection.connectionId,metadata:this.connection.metadata,browser:J.browser},this.connection.type===Qe.Data&&(o=this.connection,s=Hn(Hn({},s),{label:o.label,reliable:o.reliable,serialization:o.serialization})),t.socket.send({type:ce.Offer,payload:s,dst:this.connection.peer}),[3,6];case 5:return a=r.sent(),a!="OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer"&&(t.emitError(A.WebRTC,a),M.default.log("Failed to setLocalDescription, ",a)),[3,6];case 6:return[3,8];case 7:return c=r.sent(),t.emitError(A.WebRTC,c),M.default.log("Failed to createOffer, ",c),[3,8];case 8:return[2]}})})},n.prototype._makeAnswer=function(){return kn(this,void 0,Promise,function(){var e,t,i,s,o;return Nn(this,function(a){switch(a.label){case 0:e=this.connection.peerConnection,t=this.connection.provider,a.label=1;case 1:return a.trys.push([1,7,,8]),[4,e.createAnswer()];case 2:i=a.sent(),M.default.log("Created answer."),this.connection.options.sdpTransform&&typeof this.connection.options.sdpTransform=="function"&&(i.sdp=this.connection.options.sdpTransform(i.sdp)||i.sdp),a.label=3;case 3:return a.trys.push([3,5,,6]),[4,e.setLocalDescription(i)];case 4:return a.sent(),M.default.log("Set localDescription:",i,"for:".concat(this.connection.peer)),t.socket.send({type:ce.Answer,payload:{sdp:i,type:this.connection.type,connectionId:this.connection.connectionId,browser:J.browser},dst:this.connection.peer}),[3,6];case 5:return s=a.sent(),t.emitError(A.WebRTC,s),M.default.log("Failed to setLocalDescription, ",s),[3,6];case 6:return[3,8];case 7:return o=a.sent(),t.emitError(A.WebRTC,o),M.default.log("Failed to create answer, ",o),[3,8];case 8:return[2]}})})},n.prototype.handleSDP=function(e,t){return kn(this,void 0,Promise,function(){var i,s,o,a;return Nn(this,function(c){switch(c.label){case 0:t=new RTCSessionDescription(t),i=this.connection.peerConnection,s=this.connection.provider,M.default.log("Setting remote description",t),o=this,c.label=1;case 1:return c.trys.push([1,5,,6]),[4,i.setRemoteDescription(t)];case 2:return c.sent(),M.default.log("Set remoteDescription:".concat(e," for:").concat(this.connection.peer)),e!=="OFFER"?[3,4]:[4,o._makeAnswer()];case 3:c.sent(),c.label=4;case 4:return[3,6];case 5:return a=c.sent(),s.emitError(A.WebRTC,a),M.default.log("Failed to setRemoteDescription, ",a),[3,6];case 6:return[2]}})})},n.prototype.handleCandidate=function(e){return kn(this,void 0,Promise,function(){var t,i,s,o,a,c;return Nn(this,function(r){switch(r.label){case 0:M.default.log("handleCandidate:",e),t=e.candidate,i=e.sdpMLineIndex,s=e.sdpMid,o=this.connection.peerConnection,a=this.connection.provider,r.label=1;case 1:return r.trys.push([1,3,,4]),[4,o.addIceCandidate(new RTCIceCandidate({sdpMid:s,sdpMLineIndex:i,candidate:t}))];case 2:return r.sent(),M.default.log("Added ICE candidate for:".concat(this.connection.peer)),[3,4];case 3:return c=r.sent(),a.emitError(A.WebRTC,c),M.default.log("Failed to handleCandidate, ",c),[3,4];case 4:return[2]}})})},n.prototype._addTracksToConnection=function(e,t){if(M.default.log("add tracks from stream ".concat(e.id," to peer connection")),!t.addTrack)return M.default.error("Your browser does't support RTCPeerConnection#addTrack. Ignored.");e.getTracks().forEach(function(i){t.addTrack(i,e)})},n.prototype._addStreamToMediaConnection=function(e,t){M.default.log("add stream ".concat(e.id," to media connection ").concat(t.connectionId)),t.addStream(e)},n}(),Qs={};Ae(Qs,"BaseConnection",()=>tr,n=>tr=n);var bc=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(i[o]=s[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),tr=function(n){bc(e,n);function e(t,i,s){var o=n.call(this)||this;return o.peer=t,o.provider=i,o.options=s,o._open=!1,o.metadata=s.metadata,o}return Object.defineProperty(e.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),e}(Li.EventEmitter),yc=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(i[o]=s[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),In=function(){return In=Object.assign||function(n){for(var e,t=1,i=arguments.length;t<i;t++){e=arguments[t];for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(n[s]=e[s])}return n},In.apply(this,arguments)},Gc=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},ir=function(n){yc(e,n);function e(t,i,s){var o=n.call(this,t,i,s)||this;return o._localStream=o.options._stream,o.connectionId=o.options.connectionId||e.ID_PREFIX+J.randomToken(),o._negotiator=new Fs.Negotiator(o),o._localStream&&o._negotiator.startConnection({_stream:o._localStream,originator:!0}),o}return Object.defineProperty(e.prototype,"type",{get:function(){return Qe.Media},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"localStream",{get:function(){return this._localStream},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"remoteStream",{get:function(){return this._remoteStream},enumerable:!1,configurable:!0}),e.prototype.addStream=function(t){M.default.log("Receiving stream",t),this._remoteStream=t,n.prototype.emit.call(this,"stream",t)},e.prototype.handleMessage=function(t){var i=t.type,s=t.payload;switch(t.type){case ce.Answer:this._negotiator.handleSDP(i,s.sdp),this._open=!0;break;case ce.Candidate:this._negotiator.handleCandidate(s.candidate);break;default:M.default.warn("Unrecognized message type:".concat(i," from peer:").concat(this.peer));break}},e.prototype.answer=function(t,i){var s,o;if(i===void 0&&(i={}),this._localStream){M.default.warn("Local stream already exists on this MediaConnection. Are you answering a call twice?");return}this._localStream=t,i&&i.sdpTransform&&(this.options.sdpTransform=i.sdpTransform),this._negotiator.startConnection(In(In({},this.options._payload),{_stream:t}));var a=this.provider._getMessages(this.connectionId);try{for(var c=Gc(a),r=c.next();!r.done;r=c.next()){var l=r.value;this.handleMessage(l)}}catch(d){s={error:d}}finally{try{r&&!r.done&&(o=c.return)&&o.call(c)}finally{if(s)throw s.error}}this._open=!0},e.prototype.close=function(){this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this._localStream=null,this._remoteStream=null,this.provider&&(this.provider._removeConnection(this),this.provider=null),this.options&&this.options._stream&&(this.options._stream=null),this.open&&(this._open=!1,n.prototype.emit.call(this,"close"))},e.ID_PREFIX="mc_",e}(Qs.BaseConnection),Bs={};Ae(Bs,"DataConnection",()=>or,n=>or=n);var nr={};Ae(nr,"EncodingQueue",()=>sr,n=>sr=n);var Zc=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(i[o]=s[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),sr=function(n){Zc(e,n);function e(){var t=n.call(this)||this;return t.fileReader=new FileReader,t._queue=[],t._processing=!1,t.fileReader.onload=function(i){t._processing=!1,i.target&&t.emit("done",i.target.result),t.doNextTask()},t.fileReader.onerror=function(i){M.default.error("EncodingQueue error:",i),t._processing=!1,t.destroy(),t.emit("error",i)},t}return Object.defineProperty(e.prototype,"queue",{get:function(){return this._queue},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this.queue.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"processing",{get:function(){return this._processing},enumerable:!1,configurable:!0}),e.prototype.enque=function(t){this.queue.push(t),!this.processing&&this.doNextTask()},e.prototype.destroy=function(){this.fileReader.abort(),this._queue=[]},e.prototype.doNextTask=function(){this.size!==0&&(this.processing||(this._processing=!0,this.fileReader.readAsArrayBuffer(this.queue.shift())))},e}(Li.EventEmitter),Xc=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(i[o]=s[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),Vc=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},or=function(n){Xc(e,n);function e(t,i,s){var o=n.call(this,t,i,s)||this;return o.stringify=JSON.stringify,o.parse=JSON.parse,o._buffer=[],o._bufferSize=0,o._buffering=!1,o._chunkedData={},o._encodingQueue=new nr.EncodingQueue,o.connectionId=o.options.connectionId||e.ID_PREFIX+J.randomToken(),o.label=o.options.label||o.connectionId,o.serialization=o.options.serialization||ct.Binary,o.reliable=!!o.options.reliable,o._encodingQueue.on("done",function(a){o._bufferedSend(a)}),o._encodingQueue.on("error",function(){M.default.error("DC#".concat(o.connectionId,": Error occured in encoding from blob to arraybuffer, close DC")),o.close()}),o._negotiator=new Fs.Negotiator(o),o._negotiator.startConnection(o.options._payload||{originator:!0}),o}return Object.defineProperty(e.prototype,"type",{get:function(){return Qe.Data},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"dataChannel",{get:function(){return this._dc},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"bufferSize",{get:function(){return this._bufferSize},enumerable:!1,configurable:!0}),e.prototype.initialize=function(t){this._dc=t,this._configureDataChannel()},e.prototype._configureDataChannel=function(){var t=this;(!J.supports.binaryBlob||J.supports.reliable)&&(this.dataChannel.binaryType="arraybuffer"),this.dataChannel.onopen=function(){M.default.log("DC#".concat(t.connectionId," dc connection success")),t._open=!0,t.emit("open")},this.dataChannel.onmessage=function(i){M.default.log("DC#".concat(t.connectionId," dc onmessage:"),i.data),t._handleDataMessage(i)},this.dataChannel.onclose=function(){M.default.log("DC#".concat(t.connectionId," dc closed for:"),t.peer),t.close()}},e.prototype._handleDataMessage=function(t){var i=this,s=t.data,o=s.constructor,a=this.serialization===ct.Binary||this.serialization===ct.BinaryUTF8,c=s;if(a){if(o===Blob){J.blobToArrayBuffer(s,function(l){var d=J.unpack(l);i.emit("data",d)});return}else if(o===ArrayBuffer)c=J.unpack(s);else if(o===String){var r=J.binaryStringToArrayBuffer(s);c=J.unpack(r)}}else this.serialization===ct.JSON&&(c=this.parse(s));if(c.__peerData){this._handleChunk(c);return}n.prototype.emit.call(this,"data",c)},e.prototype._handleChunk=function(t){var i=t.__peerData,s=this._chunkedData[i]||{data:[],count:0,total:t.total};if(s.data[t.n]=t.data,s.count++,this._chunkedData[i]=s,s.total===s.count){delete this._chunkedData[i];var o=new Blob(s.data);this._handleDataMessage({data:o})}},e.prototype.close=function(){this._buffer=[],this._bufferSize=0,this._chunkedData={},this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this.provider&&(this.provider._removeConnection(this),this.provider=null),this.dataChannel&&(this.dataChannel.onopen=null,this.dataChannel.onmessage=null,this.dataChannel.onclose=null,this._dc=null),this._encodingQueue&&(this._encodingQueue.destroy(),this._encodingQueue.removeAllListeners(),this._encodingQueue=null),this.open&&(this._open=!1,n.prototype.emit.call(this,"close"))},e.prototype.send=function(t,i){if(!this.open){n.prototype.emit.call(this,"error",new Error("Connection is not open. You should listen for the `open` event before sending messages."));return}if(this.serialization===ct.JSON)this._bufferedSend(this.stringify(t));else if(this.serialization===ct.Binary||this.serialization===ct.BinaryUTF8){var s=J.pack(t);if(!i&&s.size>J.chunkedMTU){this._sendChunks(s);return}J.supports.binaryBlob?this._bufferedSend(s):this._encodingQueue.enque(s)}else this._bufferedSend(t)},e.prototype._bufferedSend=function(t){(this._buffering||!this._trySend(t))&&(this._buffer.push(t),this._bufferSize=this._buffer.length)},e.prototype._trySend=function(t){var i=this;if(!this.open)return!1;if(this.dataChannel.bufferedAmount>e.MAX_BUFFERED_AMOUNT)return this._buffering=!0,setTimeout(function(){i._buffering=!1,i._tryBuffer()},50),!1;try{this.dataChannel.send(t)}catch(s){return M.default.error("DC#:".concat(this.connectionId," Error when sending:"),s),this._buffering=!0,this.close(),!1}return!0},e.prototype._tryBuffer=function(){if(this.open&&this._buffer.length!==0){var t=this._buffer[0];this._trySend(t)&&(this._buffer.shift(),this._bufferSize=this._buffer.length,this._tryBuffer())}},e.prototype._sendChunks=function(t){var i,s,o=J.chunk(t);M.default.log("DC#".concat(this.connectionId," Try to send ").concat(o.length," chunks..."));try{for(var a=Vc(o),c=a.next();!c.done;c=a.next()){var r=c.value;this.send(r,!0)}}catch(l){i={error:l}}finally{try{c&&!c.done&&(s=a.return)&&s.call(a)}finally{if(i)throw i.error}}},e.prototype.handleMessage=function(t){var i=t.payload;switch(t.type){case ce.Answer:this._negotiator.handleSDP(t.type,i.sdp);break;case ce.Candidate:this._negotiator.handleCandidate(i.candidate);break;default:M.default.warn("Unrecognized message type:",t.type,"from peer:",this.peer);break}},e.ID_PREFIX="dc_",e.MAX_BUFFERED_AMOUNT=8388608,e}(Qs.BaseConnection),ar={};Ae(ar,"API",()=>cr,n=>cr=n);var rr=function(n,e,t,i){function s(o){return o instanceof t?o:new t(function(a){a(o)})}return new(t||(t=Promise))(function(o,a){function c(d){try{l(i.next(d))}catch(h){a(h)}}function r(d){try{l(i.throw(d))}catch(h){a(h)}}function l(d){d.done?o(d.value):s(d.value).then(c,r)}l((i=i.apply(n,e||[])).next())})},lr=function(n,e){var t={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]},i,s,o,a;return a={next:c(0),throw:c(1),return:c(2)},typeof Symbol=="function"&&(a[Symbol.iterator]=function(){return this}),a;function c(l){return function(d){return r([l,d])}}function r(l){if(i)throw new TypeError("Generator is already executing.");for(;t;)try{if(i=1,s&&(o=l[0]&2?s.return:l[0]?s.throw||((o=s.return)&&o.call(s),0):s.next)&&!(o=o.call(s,l[1])).done)return o;switch(s=0,o&&(l=[l[0]&2,o.value]),l[0]){case 0:case 1:o=l;break;case 4:return t.label++,{value:l[1],done:!1};case 5:t.label++,s=l[1],l=[0];continue;case 7:l=t.ops.pop(),t.trys.pop();continue;default:if(o=t.trys,!(o=o.length>0&&o[o.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!o||l[1]>o[0]&&l[1]<o[3])){t.label=l[1];break}if(l[0]===6&&t.label<o[1]){t.label=o[1],o=l;break}if(o&&t.label<o[2]){t.label=o[2],t.ops.push(l);break}o[2]&&t.ops.pop(),t.trys.pop();continue}l=e.call(n,t)}catch(d){l=[6,d],s=0}finally{i=o=0}if(l[0]&5)throw l[1];return{value:l[0]?l[1]:void 0,done:!0}}},cr=function(){function n(e){this._options=e}return n.prototype._buildRequest=function(e){var t=this._options.secure?"https":"http",i=this._options,s=i.host,o=i.port,a=i.path,c=i.key,r=new URL("".concat(t,"://").concat(s,":").concat(o).concat(a).concat(c,"/").concat(e));return r.searchParams.set("ts","".concat(Date.now()).concat(Math.random())),r.searchParams.set("version",Ps.version),fetch(r.href,{referrerPolicy:this._options.referrerPolicy})},n.prototype.retrieveId=function(){return rr(this,void 0,Promise,function(){var e,t,i;return lr(this,function(s){switch(s.label){case 0:return s.trys.push([0,2,,3]),[4,this._buildRequest("id")];case 1:if(e=s.sent(),e.status!==200)throw new Error("Error. Status:".concat(e.status));return[2,e.text()];case 2:throw t=s.sent(),M.default.error("Error retrieving ID",t),i="",this._options.path==="/"&&this._options.host!==J.CLOUD_HOST&&(i=" If you passed in a `path` to your self-hosted PeerServer, you'll also need to pass in that same path when creating a new Peer."),new Error("Could not get an ID from the server."+i);case 3:return[2]}})})},n.prototype.listAllPeers=function(){return rr(this,void 0,Promise,function(){var e,t,i;return lr(this,function(s){switch(s.label){case 0:return s.trys.push([0,2,,3]),[4,this._buildRequest("peers")];case 1:if(e=s.sent(),e.status!==200)throw e.status===401?(t="",this._options.host===J.CLOUD_HOST?t="It looks like you're using the cloud server. You can email team@peerjs.com to enable peer listing for your API key.":t="You need to enable `allow_discovery` on your self-hosted PeerServer to use this feature.",new Error("It doesn't look like you have permission to list peers IDs. "+t)):new Error("Error. Status:".concat(e.status));return[2,e.json()];case 2:throw i=s.sent(),M.default.error("Error retrieving list peers",i),new Error("Could not get list peers from the server."+i);case 3:return[2]}})})},n}(),Rc=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,s){i.__proto__=s}||function(i,s){for(var o in s)Object.prototype.hasOwnProperty.call(s,o)&&(i[o]=s[o])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),Si=function(){return Si=Object.assign||function(n){for(var e,t=1,i=arguments.length;t<i;t++){e=arguments[t];for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&(n[s]=e[s])}return n},Si.apply(this,arguments)},fi=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Lc=function(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),s,o=[],a;try{for(;(e===void 0||e-- >0)&&!(s=i.next()).done;)o.push(s.value)}catch(c){a={error:c}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(a)throw a.error}}return o},Es=function(n){Rc(e,n);function e(t,i){var s=n.call(this)||this;s._id=null,s._lastServerId=null,s._destroyed=!1,s._disconnected=!1,s._open=!1,s._connections=new Map,s._lostMessages=new Map;var o;return t&&t.constructor==Object?i=t:t&&(o=t.toString()),i=Si({debug:0,host:J.CLOUD_HOST,port:J.CLOUD_PORT,path:"/",key:e.DEFAULT_KEY,token:J.randomToken(),config:J.defaultConfig,referrerPolicy:"strict-origin-when-cross-origin"},i),s._options=i,s._options.host==="/"&&(s._options.host=window.location.hostname),s._options.path&&(s._options.path[0]!=="/"&&(s._options.path="/"+s._options.path),s._options.path[s._options.path.length-1]!=="/"&&(s._options.path+="/")),s._options.secure===void 0&&s._options.host!==J.CLOUD_HOST?s._options.secure=J.isSecure():s._options.host==J.CLOUD_HOST&&(s._options.secure=!0),s._options.logFunction&&M.default.setLogFunction(s._options.logFunction),M.default.logLevel=s._options.debug||0,s._api=new ar.API(i),s._socket=s._createServerConnection(),!J.supports.audioVideo&&!J.supports.data?(s._delayedAbort(A.BrowserIncompatible,"The current browser does not support WebRTC"),s):o&&!J.validateId(o)?(s._delayedAbort(A.InvalidID,'ID "'.concat(o,'" is invalid')),s):(o?s._initialize(o):s._api.retrieveId().then(function(a){return s._initialize(a)}).catch(function(a){return s._abort(A.ServerError,a)}),s)}return Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"options",{get:function(){return this._options},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"socket",{get:function(){return this._socket},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"connections",{get:function(){var t,i,s=Object.create(null);try{for(var o=fi(this._connections),a=o.next();!a.done;a=o.next()){var c=Lc(a.value,2),r=c[0],l=c[1];s[r]=l}}catch(d){t={error:d}}finally{try{a&&!a.done&&(i=o.return)&&i.call(o)}finally{if(t)throw t.error}}return s},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"disconnected",{get:function(){return this._disconnected},enumerable:!1,configurable:!0}),e.prototype._createServerConnection=function(){var t=this,i=new qa.Socket(this._options.secure,this._options.host,this._options.port,this._options.path,this._options.key,this._options.pingInterval);return i.on(dt.Message,function(s){t._handleMessage(s)}),i.on(dt.Error,function(s){t._abort(A.SocketError,s)}),i.on(dt.Disconnected,function(){t.disconnected||(t.emitError(A.Network,"Lost connection to server."),t.disconnect())}),i.on(dt.Close,function(){t.disconnected||t._abort(A.SocketClosed,"Underlying socket is already closed.")}),i},e.prototype._initialize=function(t){this._id=t,this.socket.start(t,this._options.token)},e.prototype._handleMessage=function(t){var i,s,o=t.type,a=t.payload,c=t.src;switch(o){case ce.Open:this._lastServerId=this.id,this._open=!0,this.emit("open",this.id);break;case ce.Error:this._abort(A.ServerError,a.msg);break;case ce.IdTaken:this._abort(A.UnavailableID,'ID "'.concat(this.id,'" is taken'));break;case ce.InvalidKey:this._abort(A.InvalidKey,'API KEY "'.concat(this._options.key,'" is invalid'));break;case ce.Leave:M.default.log("Received leave message from ".concat(c)),this._cleanupPeer(c),this._connections.delete(c);break;case ce.Expire:this.emitError(A.PeerUnavailable,"Could not connect to peer ".concat(c));break;case ce.Offer:var m=a.connectionId,b=this.getConnection(c,m);if(b&&(b.close(),M.default.warn("Offer received for existing Connection ID:".concat(m))),a.type===Qe.Media){var r=new ws.MediaConnection(c,this,{connectionId:m,_payload:a,metadata:a.metadata});b=r,this._addConnection(c,b),this.emit("call",r)}else if(a.type===Qe.Data){var l=new Bs.DataConnection(c,this,{connectionId:m,_payload:a,metadata:a.metadata,label:a.label,serialization:a.serialization,reliable:a.reliable});b=l,this._addConnection(c,b),this.emit("connection",l)}else{M.default.warn("Received malformed connection type:".concat(a.type));return}var d=this._getMessages(m);try{for(var h=fi(d),u=h.next();!u.done;u=h.next()){var p=u.value;b.handleMessage(p)}}catch(G){i={error:G}}finally{try{u&&!u.done&&(s=h.return)&&s.call(h)}finally{if(i)throw i.error}}break;default:if(!a){M.default.warn("You received a malformed message from ".concat(c," of type ").concat(o));return}var m=a.connectionId,b=this.getConnection(c,m);b&&b.peerConnection?b.handleMessage(t):m?this._storeMessage(m,t):M.default.warn("You received an unrecognized message:",t);break}},e.prototype._storeMessage=function(t,i){this._lostMessages.has(t)||this._lostMessages.set(t,[]),this._lostMessages.get(t).push(i)},e.prototype._getMessages=function(t){var i=this._lostMessages.get(t);return i?(this._lostMessages.delete(t),i):[]},e.prototype.connect=function(t,i){if(i===void 0&&(i={}),this.disconnected){M.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect, or call reconnect on this peer if you believe its ID to still be available."),this.emitError(A.Disconnected,"Cannot connect to new Peer after disconnecting from server.");return}var s=new Bs.DataConnection(t,this,i);return this._addConnection(t,s),s},e.prototype.call=function(t,i,s){if(s===void 0&&(s={}),this.disconnected){M.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect."),this.emitError(A.Disconnected,"Cannot connect to new Peer after disconnecting from server.");return}if(!i){M.default.error("To call a peer, you must provide a stream from your browser's `getUserMedia`.");return}var o=new ws.MediaConnection(t,this,Si(Si({},s),{_stream:i}));return this._addConnection(t,o),o},e.prototype._addConnection=function(t,i){M.default.log("add connection ".concat(i.type,":").concat(i.connectionId," to peerId:").concat(t)),this._connections.has(t)||this._connections.set(t,[]),this._connections.get(t).push(i)},e.prototype._removeConnection=function(t){var i=this._connections.get(t.peer);if(i){var s=i.indexOf(t);s!==-1&&i.splice(s,1)}this._lostMessages.delete(t.connectionId)},e.prototype.getConnection=function(t,i){var s,o,a=this._connections.get(t);if(!a)return null;try{for(var c=fi(a),r=c.next();!r.done;r=c.next()){var l=r.value;if(l.connectionId===i)return l}}catch(d){s={error:d}}finally{try{r&&!r.done&&(o=c.return)&&o.call(c)}finally{if(s)throw s.error}}return null},e.prototype._delayedAbort=function(t,i){var s=this;setTimeout(function(){s._abort(t,i)},0)},e.prototype._abort=function(t,i){M.default.error("Aborting!"),this.emitError(t,i),this._lastServerId?this.disconnect():this.destroy()},e.prototype.emitError=function(t,i){M.default.error("Error:",i);var s;typeof i=="string"?s=new Error(i):s=i,s.type=t,this.emit("error",s)},e.prototype.destroy=function(){this.destroyed||(M.default.log("Destroy peer with ID:".concat(this.id)),this.disconnect(),this._cleanup(),this._destroyed=!0,this.emit("close"))},e.prototype._cleanup=function(){var t,i;try{for(var s=fi(this._connections.keys()),o=s.next();!o.done;o=s.next()){var a=o.value;this._cleanupPeer(a),this._connections.delete(a)}}catch(c){t={error:c}}finally{try{o&&!o.done&&(i=s.return)&&i.call(s)}finally{if(t)throw t.error}}this.socket.removeAllListeners()},e.prototype._cleanupPeer=function(t){var i,s,o=this._connections.get(t);if(o)try{for(var a=fi(o),c=a.next();!c.done;c=a.next()){var r=c.value;r.close()}}catch(l){i={error:l}}finally{try{c&&!c.done&&(s=a.return)&&s.call(a)}finally{if(i)throw i.error}}},e.prototype.disconnect=function(){if(!this.disconnected){var t=this.id;M.default.log("Disconnect peer with ID:".concat(t)),this._disconnected=!0,this._open=!1,this.socket.close(),this._lastServerId=t,this._id=null,this.emit("disconnected",t)}},e.prototype.reconnect=function(){if(this.disconnected&&!this.destroyed)M.default.log("Attempting reconnection to server with ID ".concat(this._lastServerId)),this._disconnected=!1,this._initialize(this._lastServerId);else{if(this.destroyed)throw new Error("This peer cannot reconnect to the server. It has already been destroyed.");if(!this.disconnected&&!this.open)M.default.error("In a hurry? We're still trying to make the initial connection!");else throw new Error("Peer ".concat(this.id," cannot reconnect because it is not disconnected from the server!"))}},e.prototype.listAllPeers=function(t){var i=this;t===void 0&&(t=function(s){}),this._api.listAllPeers().then(function(s){return t(s)}).catch(function(s){return i._abort(A.ServerError,s)})},e.DEFAULT_KEY="peerjs",e}(Li.EventEmitter),dr=Da.Peer;const xc=Object.freeze(Object.defineProperty({__proto__:null,get Peer(){return Es},default:dr,util:J},Symbol.toStringTag,{value:"Module"})),Sc=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function fc(n){return typeof n=="string"&&Sc.test(n)}const de=[];for(let n=0;n<256;++n)de.push((n+256).toString(16).slice(1));function Wc(n,e=0){return de[n[e+0]]+de[n[e+1]]+de[n[e+2]]+de[n[e+3]]+"-"+de[n[e+4]]+de[n[e+5]]+"-"+de[n[e+6]]+de[n[e+7]]+"-"+de[n[e+8]]+de[n[e+9]]+"-"+de[n[e+10]]+de[n[e+11]]+de[n[e+12]]+de[n[e+13]]+de[n[e+14]]+de[n[e+15]]}function gc(n){if(!fc(n))throw TypeError("Invalid UUID");let e;const t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=e&255,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=e&255,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=e&255,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=e&255,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=e&255,t}function Cc(n){n=unescape(encodeURIComponent(n));const e=[];for(let t=0;t<n.length;++t)e.push(n.charCodeAt(t));return e}const zc="6ba7b810-9dad-11d1-80b4-00c04fd430c8",vc="6ba7b811-9dad-11d1-80b4-00c04fd430c8";function Kc(n,e,t){function i(s,o,a,c){var r;if(typeof s=="string"&&(s=Cc(s)),typeof o=="string"&&(o=gc(o)),((r=o)===null||r===void 0?void 0:r.length)!==16)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let l=new Uint8Array(16+s.length);if(l.set(o),l.set(s,o.length),l=t(l),l[6]=l[6]&15|e,l[8]=l[8]&63|128,a){c=c||0;for(let d=0;d<16;++d)a[c+d]=l[d];return a}return Wc(l)}try{i.name=n}catch{}return i.DNS=zc,i.URL=vc,i}function Mc(n,e,t,i){switch(n){case 0:return e&t^~e&i;case 1:return e^t^i;case 2:return e&t^e&i^t&i;case 3:return e^t^i}}function js(n,e){return n<<e|n>>>32-e}function Tc(n){const e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if(typeof n=="string"){const a=unescape(encodeURIComponent(n));n=[];for(let c=0;c<a.length;++c)n.push(a.charCodeAt(c))}else Array.isArray(n)||(n=Array.prototype.slice.call(n));n.push(128);const i=n.length/4+2,s=Math.ceil(i/16),o=new Array(s);for(let a=0;a<s;++a){const c=new Uint32Array(16);for(let r=0;r<16;++r)c[r]=n[a*64+r*4]<<24|n[a*64+r*4+1]<<16|n[a*64+r*4+2]<<8|n[a*64+r*4+3];o[a]=c}o[s-1][14]=(n.length-1)*8/Math.pow(2,32),o[s-1][14]=Math.floor(o[s-1][14]),o[s-1][15]=(n.length-1)*8&4294967295;for(let a=0;a<s;++a){const c=new Uint32Array(80);for(let p=0;p<16;++p)c[p]=o[a][p];for(let p=16;p<80;++p)c[p]=js(c[p-3]^c[p-8]^c[p-14]^c[p-16],1);let r=t[0],l=t[1],d=t[2],h=t[3],u=t[4];for(let p=0;p<80;++p){const m=Math.floor(p/20),b=js(r,5)+Mc(m,l,d,h)+u+e[m]+c[p]>>>0;u=h,h=d,d=js(l,30)>>>0,l=r,r=b}t[0]=t[0]+r>>>0,t[1]=t[1]+l>>>0,t[2]=t[2]+d>>>0,t[3]=t[3]+h>>>0,t[4]=t[4]+u>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,t[0]&255,t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,t[1]&255,t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,t[2]&255,t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,t[3]&255,t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,t[4]&255]}const Yc=Kc("v5",80,Tc),Hc=Yc;var hr={exports:{}},ur={exports:{}};(function(){var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e={rotl:function(t,i){return t<<i|t>>>32-i},rotr:function(t,i){return t<<32-i|t>>>i},endian:function(t){if(t.constructor==Number)return e.rotl(t,8)&16711935|e.rotl(t,24)&4278255360;for(var i=0;i<t.length;i++)t[i]=e.endian(t[i]);return t},randomBytes:function(t){for(var i=[];t>0;t--)i.push(Math.floor(Math.random()*256));return i},bytesToWords:function(t){for(var i=[],s=0,o=0;s<t.length;s++,o+=8)i[o>>>5]|=t[s]<<24-o%32;return i},wordsToBytes:function(t){for(var i=[],s=0;s<t.length*32;s+=8)i.push(t[s>>>5]>>>24-s%32&255);return i},bytesToHex:function(t){for(var i=[],s=0;s<t.length;s++)i.push((t[s]>>>4).toString(16)),i.push((t[s]&15).toString(16));return i.join("")},hexToBytes:function(t){for(var i=[],s=0;s<t.length;s+=2)i.push(parseInt(t.substr(s,2),16));return i},bytesToBase64:function(t){for(var i=[],s=0;s<t.length;s+=3)for(var o=t[s]<<16|t[s+1]<<8|t[s+2],a=0;a<4;a++)s*8+a*6<=t.length*8?i.push(n.charAt(o>>>6*(3-a)&63)):i.push("=");return i.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/ig,"");for(var i=[],s=0,o=0;s<t.length;o=++s%4)o!=0&&i.push((n.indexOf(t.charAt(s-1))&Math.pow(2,-2*o+8)-1)<<o*2|n.indexOf(t.charAt(s))>>>6-o*2);return i}};ur.exports=e})();var kc=ur.exports,Os={utf8:{stringToBytes:function(n){return Os.bin.stringToBytes(unescape(encodeURIComponent(n)))},bytesToString:function(n){return decodeURIComponent(escape(Os.bin.bytesToString(n)))}},bin:{stringToBytes:function(n){for(var e=[],t=0;t<n.length;t++)e.push(n.charCodeAt(t)&255);return e},bytesToString:function(n){for(var e=[],t=0;t<n.length;t++)e.push(String.fromCharCode(n[t]));return e.join("")}}},pr=Os;/*!
78
+ isUnifiedPlanSupported:`).concat(this.isUnifiedPlanSupported())},n}()),Xo={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:["turn:eu-0.turn.peerjs.com:3478","turn:us-0.turn.peerjs.com:3478"],username:"peerjs",credential:"peerjsp"}],sdpSemantics:"unified-plan"},rl=function(){function n(){this.CLOUD_HOST="0.peerjs.com",this.CLOUD_PORT=443,this.chunkedBrowsers={Chrome:1,chrome:1},this.chunkedMTU=16300,this.defaultConfig=Xo,this.browser=_i.getBrowser(),this.browserVersion=_i.getVersion(),this.supports=function(){var e={browser:_i.isBrowserSupported(),webRTC:_i.isWebRTCSupported(),audioVideo:!1,data:!1,binaryBlob:!1,reliable:!1};if(!e.webRTC)return e;var t;try{t=new RTCPeerConnection(Xo),e.audioVideo=!0;var i=void 0;try{i=t.createDataChannel("_PEERJSTEST",{ordered:!0}),e.data=!0,e.reliable=!!i.ordered;try{i.binaryType="blob",e.binaryBlob=!_i.isIOS}catch{}}catch{}finally{i&&i.close()}}catch{}finally{t&&t.close()}return e}(),this.pack=eo.pack,this.unpack=eo.unpack,this._dataCount=1}return n.prototype.noop=function(){},n.prototype.validateId=function(e){return!e||/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(e)},n.prototype.chunk=function(e){for(var t=[],i=e.size,r=Math.ceil(i/F.chunkedMTU),s=0,o=0;o<i;){var l=Math.min(i,o+F.chunkedMTU),a=e.slice(o,l),c={__peerData:this._dataCount,n:s,data:a,total:r};t.push(c),o=l,s++}return this._dataCount++,t},n.prototype.blobToArrayBuffer=function(e,t){var i=new FileReader;return i.onload=function(r){r.target&&t(r.target.result)},i.readAsArrayBuffer(e),i},n.prototype.binaryStringToArrayBuffer=function(e){for(var t=new Uint8Array(e.length),i=0;i<e.length;i++)t[i]=e.charCodeAt(i)&255;return t.buffer},n.prototype.randomToken=function(){return Math.random().toString(36).slice(2)},n.prototype.isSecure=function(){return location.protocol==="https:"},n}(),F=new rl,Yo={};Qe(Yo,"Peer",()=>Hr,n=>Hr=n);var Si={},sl=Object.prototype.hasOwnProperty,_e="~";function wi(){}Object.create&&(wi.prototype=Object.create(null),new wi().__proto__||(_e=!1));function ol(n,e,t){this.fn=n,this.context=e,this.once=t||!1}function Zo(n,e,t,i,r){if(typeof t!="function")throw new TypeError("The listener must be a function");var s=new ol(t,i||n,r),o=_e?_e+e:e;return n._events[o]?n._events[o].fn?n._events[o]=[n._events[o],s]:n._events[o].push(s):(n._events[o]=s,n._eventsCount++),n}function In(n,e){--n._eventsCount===0?n._events=new wi:delete n._events[e]}function ge(){this._events=new wi,this._eventsCount=0}ge.prototype.eventNames=function(){var n=[],e,t;if(this._eventsCount===0)return n;for(t in e=this._events)sl.call(e,t)&&n.push(_e?t.slice(1):t);return Object.getOwnPropertySymbols?n.concat(Object.getOwnPropertySymbols(e)):n},ge.prototype.listeners=function(n){var e=_e?_e+n:n,t=this._events[e];if(!t)return[];if(t.fn)return[t.fn];for(var i=0,r=t.length,s=new Array(r);i<r;i++)s[i]=t[i].fn;return s},ge.prototype.listenerCount=function(n){var e=_e?_e+n:n,t=this._events[e];return t?t.fn?1:t.length:0},ge.prototype.emit=function(n,e,t,i,r,s){var o=_e?_e+n:n;if(!this._events[o])return!1;var l=this._events[o],a=arguments.length,c,h;if(l.fn){switch(l.once&&this.removeListener(n,l.fn,void 0,!0),a){case 1:return l.fn.call(l.context),!0;case 2:return l.fn.call(l.context,e),!0;case 3:return l.fn.call(l.context,e,t),!0;case 4:return l.fn.call(l.context,e,t,i),!0;case 5:return l.fn.call(l.context,e,t,i,r),!0;case 6:return l.fn.call(l.context,e,t,i,r,s),!0}for(h=1,c=new Array(a-1);h<a;h++)c[h-1]=arguments[h];l.fn.apply(l.context,c)}else{var u=l.length,d;for(h=0;h<u;h++)switch(l[h].once&&this.removeListener(n,l[h].fn,void 0,!0),a){case 1:l[h].fn.call(l[h].context);break;case 2:l[h].fn.call(l[h].context,e);break;case 3:l[h].fn.call(l[h].context,e,t);break;case 4:l[h].fn.call(l[h].context,e,t,i);break;default:if(!c)for(d=1,c=new Array(a-1);d<a;d++)c[d-1]=arguments[d];l[h].fn.apply(l[h].context,c)}}return!0},ge.prototype.on=function(n,e,t){return Zo(this,n,e,t,!1)},ge.prototype.once=function(n,e,t){return Zo(this,n,e,t,!0)},ge.prototype.removeListener=function(n,e,t,i){var r=_e?_e+n:n;if(!this._events[r])return this;if(!e)return In(this,r),this;var s=this._events[r];if(s.fn)s.fn===e&&(!i||s.once)&&(!t||s.context===t)&&In(this,r);else{for(var o=0,l=[],a=s.length;o<a;o++)(s[o].fn!==e||i&&!s[o].once||t&&s[o].context!==t)&&l.push(s[o]);l.length?this._events[r]=l.length===1?l[0]:l:In(this,r)}return this},ge.prototype.removeAllListeners=function(n){var e;return n?(e=_e?_e+n:n,this._events[e]&&In(this,e)):(this._events=new wi,this._eventsCount=0),this},ge.prototype.off=ge.prototype.removeListener,ge.prototype.addListener=ge.prototype.on,ge.prefixed=_e,ge.EventEmitter=ge,Si=ge;var O={};Qe(O,"LogLevel",()=>Ce,n=>Ce=n),Qe(O,"default",()=>Qo,n=>Qo=n);var zt=function(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),r,s=[],o;try{for(;(e===void 0||e-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(l){o={error:l}}finally{try{r&&!r.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return s},Nt=function(n,e,t){if(t||arguments.length===2)for(var i=0,r=e.length,s;i<r;i++)(s||!(i in e))&&(s||(s=Array.prototype.slice.call(e,0,i)),s[i]=e[i]);return n.concat(s||Array.prototype.slice.call(e))},al="PeerJS: ",Ce;(function(n){n[n.Disabled=0]="Disabled",n[n.Errors=1]="Errors",n[n.Warnings=2]="Warnings",n[n.All=3]="All"})(Ce||(Ce={}));var cl=function(){function n(){this._logLevel=Ce.Disabled}return Object.defineProperty(n.prototype,"logLevel",{get:function(){return this._logLevel},set:function(e){this._logLevel=e},enumerable:!1,configurable:!0}),n.prototype.log=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._logLevel>=Ce.All&&this._print.apply(this,Nt([Ce.All],zt(e),!1))},n.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._logLevel>=Ce.Warnings&&this._print.apply(this,Nt([Ce.Warnings],zt(e),!1))},n.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._logLevel>=Ce.Errors&&this._print.apply(this,Nt([Ce.Errors],zt(e),!1))},n.prototype.setLogFunction=function(e){this._print=e},n.prototype._print=function(e){for(var t=[],i=1;i<arguments.length;i++)t[i-1]=arguments[i];var r=Nt([al],zt(t),!1);for(var s in r)r[s]instanceof Error&&(r[s]="("+r[s].name+") "+r[s].message);e>=Ce.All?console.log.apply(console,Nt([],zt(r),!1)):e>=Ce.Warnings?console.warn.apply(console,Nt(["WARNING"],zt(r),!1)):e>=Ce.Errors&&console.error.apply(console,Nt(["ERROR"],zt(r),!1))},n}(),Qo=new cl,Ko={};Qe(Ko,"Socket",()=>$o,n=>$o=n);var Ge;(function(n){n.Data="data",n.Media="media"})(Ge||(Ge={}));var Q;(function(n){n.BrowserIncompatible="browser-incompatible",n.Disconnected="disconnected",n.InvalidID="invalid-id",n.InvalidKey="invalid-key",n.Network="network",n.PeerUnavailable="peer-unavailable",n.SslUnavailable="ssl-unavailable",n.ServerError="server-error",n.SocketError="socket-error",n.SocketClosed="socket-closed",n.UnavailableID="unavailable-id",n.WebRTC="webrtc"})(Q||(Q={}));var lt;(function(n){n.Binary="binary",n.BinaryUTF8="binary-utf8",n.JSON="json"})(lt||(lt={}));var ht;(function(n){n.Message="message",n.Disconnected="disconnected",n.Error="error",n.Close="close"})(ht||(ht={}));var le;(function(n){n.Heartbeat="HEARTBEAT",n.Candidate="CANDIDATE",n.Offer="OFFER",n.Answer="ANSWER",n.Open="OPEN",n.Error="ERROR",n.IdTaken="ID-TAKEN",n.InvalidKey="INVALID-KEY",n.Leave="LEAVE",n.Expire="EXPIRE"})(le||(le={}));var Vr={};Vr=JSON.parse('{"name":"peerjs","version":"1.4.7","keywords":["peerjs","webrtc","p2p","rtc"],"description":"PeerJS client","homepage":"https://peerjs.com","bugs":{"url":"https://github.com/peers/peerjs/issues"},"repository":{"type":"git","url":"https://github.com/peers/peerjs"},"license":"MIT","contributors":["Michelle Bu <michelle@michellebu.com>","afrokick <devbyru@gmail.com>","ericz <really.ez@gmail.com>","Jairo <kidandcat@gmail.com>","Jonas Gloning <34194370+jonasgloning@users.noreply.github.com>","Jairo Caro-Accino Viciana <jairo@galax.be>","Carlos Caballero <carlos.caballero.gonzalez@gmail.com>","hc <hheennrryy@gmail.com>","Muhammad Asif <capripio@gmail.com>","PrashoonB <prashoonbhattacharjee@gmail.com>","Harsh Bardhan Mishra <47351025+HarshCasper@users.noreply.github.com>","akotynski <aleksanderkotbury@gmail.com>","lmb <i@lmb.io>","Jairooo <jairocaro@msn.com>","Moritz St\xFCckler <moritz.stueckler@gmail.com>","Simon <crydotsnakegithub@gmail.com>","Denis Lukov <denismassters@gmail.com>","Philipp Hancke <fippo@andyet.net>","Hans Oksendahl <hansoksendahl@gmail.com>","Jess <jessachandler@gmail.com>","khankuan <khankuan@gmail.com>","DUODVK <kurmanov.work@gmail.com>","XiZhao <kwang1imsa@gmail.com>","Matthias Lohr <matthias@lohr.me>","=frank tree <=frnktrb@googlemail.com>","Andre Eckardt <aeckardt@outlook.com>","Chris Cowan <agentme49@gmail.com>","Alex Chuev <alex@chuev.com>","alxnull <alxnull@e.mail.de>","Yemel Jardi <angel.jardi@gmail.com>","Ben Parnell <benjaminparnell.94@gmail.com>","Benny Lichtner <bennlich@gmail.com>","fresheneesz <bitetrudpublic@gmail.com>","bob.barstead@exaptive.com <bob.barstead@exaptive.com>","chandika <chandika@gmail.com>","emersion <contact@emersion.fr>","Christopher Van <cvan@users.noreply.github.com>","eddieherm <edhermoso@gmail.com>","Eduardo Pinho <enet4mikeenet@gmail.com>","Evandro Zanatta <ezanatta@tray.net.br>","Gardner Bickford <gardner@users.noreply.github.com>","Gian Luca <gianluca.cecchi@cynny.com>","PatrickJS <github@gdi2290.com>","jonnyf <github@jonathanfoss.co.uk>","Hizkia Felix <hizkifw@gmail.com>","Hristo Oskov <hristo.oskov@gmail.com>","Isaac Madwed <i.madwed@gmail.com>","Ilya Konanykhin <ilya.konanykhin@gmail.com>","jasonbarry <jasbarry@me.com>","Jonathan Burke <jonathan.burke.1311@googlemail.com>","Josh Hamit <josh.hamit@gmail.com>","Jordan Austin <jrax86@gmail.com>","Joel Wetzell <jwetzell@yahoo.com>","xizhao <kevin.wang@cloudera.com>","Alberto Torres <kungfoobar@gmail.com>","Jonathan Mayol <mayoljonathan@gmail.com>","Jefferson Felix <me@jsfelix.dev>","Rolf Erik Lekang <me@rolflekang.com>","Kevin Mai-Husan Chia <mhchia@users.noreply.github.com>","Pepijn de Vos <pepijndevos@gmail.com>","JooYoung <qkdlql@naver.com>","Tobias Speicher <rootcommander@gmail.com>","Steve Blaurock <sblaurock@gmail.com>","Kyrylo Shegeda <shegeda@ualberta.ca>","Diwank Singh Tomer <singh@diwank.name>","So\u0308ren Balko <Soeren.Balko@gmail.com>","Arpit Solanki <solankiarpit1997@gmail.com>","Yuki Ito <yuki@gnnk.net>","Artur Zayats <zag2art@gmail.com>"],"funding":{"type":"opencollective","url":"https://opencollective.com/peer"},"collective":{"type":"opencollective","url":"https://opencollective.com/peer"},"files":["dist/*"],"sideEffects":["lib/global.ts","lib/supports.ts"],"main":"dist/bundler.cjs","module":"dist/bundler.mjs","browser-minified":"dist/peerjs.min.js","browser-unminified":"dist/peerjs.js","types":"dist/types.d.ts","engines":{"node":">= 10"},"targets":{"types":{"source":"lib/exports.ts"},"main":{"source":"lib/exports.ts","sourceMap":{"inlineSources":true}},"module":{"source":"lib/exports.ts","includeNodeModules":["eventemitter3"],"sourceMap":{"inlineSources":true}},"browser-minified":{"context":"browser","outputFormat":"global","optimize":true,"engines":{"browsers":"cover 99%, not dead"},"source":"lib/global.ts"},"browser-unminified":{"context":"browser","outputFormat":"global","optimize":false,"engines":{"browsers":"cover 99%, not dead"},"source":"lib/global.ts"}},"scripts":{"contributors":"git-authors-cli --print=false && prettier --write package.json && git add package.json package-lock.json && git commit -m \\"chore(contributors): update and sort contributors list\\"","check":"tsc --noEmit","watch":"parcel watch","build":"rm -rf dist && parcel build","prepublishOnly":"npm run build","test":"mocha -r ts-node/register -r jsdom-global/register test/**/*.ts","format":"prettier --write .","semantic-release":"semantic-release"},"devDependencies":{"@parcel/config-default":"^2.5.0","@parcel/packager-ts":"^2.5.0","@parcel/transformer-typescript-tsc":"^2.5.0","@parcel/transformer-typescript-types":"^2.5.0","@semantic-release/changelog":"^6.0.1","@semantic-release/git":"^10.0.1","@types/chai":"^4.3.0","@types/mocha":"^9.1.0","@types/node":"^17.0.18","chai":"^4.3.6","git-authors-cli":"^1.0.40","jsdom":"^19.0.0","jsdom-global":"^3.0.2","mocha":"^9.2.0","mock-socket":"8.0.5","parcel":"^2.5.0","parcel-transformer-tsc-sourcemaps":"^1.0.2","prettier":"^2.6.2","semantic-release":"^19.0.2","standard":"^16.0.4","ts-node":"^10.5.0","typescript":"^4.5.5"},"dependencies":{"@swc/helpers":"^0.3.13","eventemitter3":"^4.0.7","peerjs-js-binarypack":"1.0.1","webrtc-adapter":"^7.7.1"}}');var ll=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,r){i.__proto__=r}||function(i,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(i[s]=r[s])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),hl=function(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),r,s=[],o;try{for(;(e===void 0||e-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(l){o={error:l}}finally{try{r&&!r.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return s},ul=function(n,e,t){if(t||arguments.length===2)for(var i=0,r=e.length,s;i<r;i++)(s||!(i in e))&&(s||(s=Array.prototype.slice.call(e,0,i)),s[i]=e[i]);return n.concat(s||Array.prototype.slice.call(e))},dl=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},$o=function(n){ll(e,n);function e(t,i,r,s,o,l){l===void 0&&(l=5e3);var a=n.call(this)||this;a.pingInterval=l,a._disconnected=!0,a._messagesQueue=[];var c=t?"wss://":"ws://";return a._baseUrl=c+i+":"+r+s+"peerjs?key="+o,a}return e.prototype.start=function(t,i){var r=this;this._id=t;var s="".concat(this._baseUrl,"&id=").concat(t,"&token=").concat(i);this._socket||!this._disconnected||(this._socket=new WebSocket(s+"&version="+Vr.version),this._disconnected=!1,this._socket.onmessage=function(o){var l;try{l=JSON.parse(o.data),O.default.log("Server message received:",l)}catch{O.default.log("Invalid server message",o.data);return}r.emit(ht.Message,l)},this._socket.onclose=function(o){r._disconnected||(O.default.log("Socket closed.",o),r._cleanup(),r._disconnected=!0,r.emit(ht.Disconnected))},this._socket.onopen=function(){r._disconnected||(r._sendQueuedMessages(),O.default.log("Socket open"),r._scheduleHeartbeat())})},e.prototype._scheduleHeartbeat=function(){var t=this;this._wsPingTimer=setTimeout(function(){t._sendHeartbeat()},this.pingInterval)},e.prototype._sendHeartbeat=function(){if(!this._wsOpen()){O.default.log("Cannot send heartbeat, because socket closed");return}var t=JSON.stringify({type:le.Heartbeat});this._socket.send(t),this._scheduleHeartbeat()},e.prototype._wsOpen=function(){return!!this._socket&&this._socket.readyState===1},e.prototype._sendQueuedMessages=function(){var t,i,r=ul([],hl(this._messagesQueue),!1);this._messagesQueue=[];try{for(var s=dl(r),o=s.next();!o.done;o=s.next()){var l=o.value;this.send(l)}}catch(a){t={error:a}}finally{try{o&&!o.done&&(i=s.return)&&i.call(s)}finally{if(t)throw t.error}}},e.prototype.send=function(t){if(!this._disconnected){if(!this._id){this._messagesQueue.push(t);return}if(!t.type){this.emit(ht.Error,"Invalid message");return}if(this._wsOpen()){var i=JSON.stringify(t);this._socket.send(i)}}},e.prototype.close=function(){this._disconnected||(this._cleanup(),this._disconnected=!0)},e.prototype._cleanup=function(){this._socket&&(this._socket.onopen=this._socket.onmessage=this._socket.onclose=null,this._socket.close(),this._socket=void 0),clearTimeout(this._wsPingTimer)},e}(Si.EventEmitter),jr={};Qe(jr,"MediaConnection",()=>ia,n=>ia=n);var Jr={};Qe(Jr,"Negotiator",()=>ea,n=>ea=n);var zn=function(){return zn=Object.assign||function(n){for(var e,t=1,i=arguments.length;t<i;t++){e=arguments[t];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r])}return n},zn.apply(this,arguments)},Nn=function(n,e,t,i){function r(s){return s instanceof t?s:new t(function(o){o(s)})}return new(t||(t=Promise))(function(s,o){function l(h){try{c(i.next(h))}catch(u){o(u)}}function a(h){try{c(i.throw(h))}catch(u){o(u)}}function c(h){h.done?s(h.value):r(h.value).then(l,a)}c((i=i.apply(n,e||[])).next())})},Un=function(n,e){var t={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},i,r,s,o;return o={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(o[Symbol.iterator]=function(){return this}),o;function l(c){return function(h){return a([c,h])}}function a(c){if(i)throw new TypeError("Generator is already executing.");for(;t;)try{if(i=1,r&&(s=c[0]&2?r.return:c[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,c[1])).done)return s;switch(r=0,s&&(c=[c[0]&2,s.value]),c[0]){case 0:case 1:s=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,r=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(s=t.trys,!(s=s.length>0&&s[s.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!s||c[1]>s[0]&&c[1]<s[3])){t.label=c[1];break}if(c[0]===6&&t.label<s[1]){t.label=s[1],s=c;break}if(s&&t.label<s[2]){t.label=s[2],t.ops.push(c);break}s[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(n,t)}catch(h){c=[6,h],r=0}finally{i=s=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},ea=function(){function n(e){this.connection=e}return n.prototype.startConnection=function(e){var t=this._startPeerConnection();if(this.connection.peerConnection=t,this.connection.type===Ge.Media&&e._stream&&this._addTracksToConnection(e._stream,t),e.originator){if(this.connection.type===Ge.Data){var i=this.connection,r={ordered:!!e.reliable},s=t.createDataChannel(i.label,r);i.initialize(s)}this._makeOffer()}else this.handleSDP("OFFER",e.sdp)},n.prototype._startPeerConnection=function(){O.default.log("Creating RTCPeerConnection.");var e=new RTCPeerConnection(this.connection.provider.options.config);return this._setupListeners(e),e},n.prototype._setupListeners=function(e){var t=this,i=this.connection.peer,r=this.connection.connectionId,s=this.connection.type,o=this.connection.provider;O.default.log("Listening for ICE candidates."),e.onicecandidate=function(l){!l.candidate||!l.candidate.candidate||(O.default.log("Received ICE candidates for ".concat(i,":"),l.candidate),o.socket.send({type:le.Candidate,payload:{candidate:l.candidate,type:s,connectionId:r},dst:i}))},e.oniceconnectionstatechange=function(){switch(e.iceConnectionState){case"failed":O.default.log("iceConnectionState is failed, closing connections to "+i),t.connection.emit("error",new Error("Negotiation of connection to "+i+" failed.")),t.connection.close();break;case"closed":O.default.log("iceConnectionState is closed, closing connections to "+i),t.connection.emit("error",new Error("Connection to "+i+" closed.")),t.connection.close();break;case"disconnected":O.default.log("iceConnectionState changed to disconnected on the connection with "+i);break;case"completed":e.onicecandidate=F.noop;break}t.connection.emit("iceStateChanged",e.iceConnectionState)},O.default.log("Listening for data channel"),e.ondatachannel=function(l){O.default.log("Received data channel");var a=l.channel,c=o.getConnection(i,r);c.initialize(a)},O.default.log("Listening for remote stream"),e.ontrack=function(l){O.default.log("Received remote stream");var a=l.streams[0],c=o.getConnection(i,r);if(c.type===Ge.Media){var h=c;t._addStreamToMediaConnection(a,h)}}},n.prototype.cleanup=function(){O.default.log("Cleaning up PeerConnection to "+this.connection.peer);var e=this.connection.peerConnection;if(e){this.connection.peerConnection=null,e.onicecandidate=e.oniceconnectionstatechange=e.ondatachannel=e.ontrack=function(){};var t=e.signalingState!=="closed",i=!1;if(this.connection.type===Ge.Data){var r=this.connection,s=r.dataChannel;s&&(i=!!s.readyState&&s.readyState!=="closed")}(t||i)&&e.close()}},n.prototype._makeOffer=function(){return Nn(this,void 0,Promise,function(){var e,t,i,r,s,o,l;return Un(this,function(a){switch(a.label){case 0:e=this.connection.peerConnection,t=this.connection.provider,a.label=1;case 1:return a.trys.push([1,7,,8]),[4,e.createOffer(this.connection.options.constraints)];case 2:i=a.sent(),O.default.log("Created offer."),this.connection.options.sdpTransform&&typeof this.connection.options.sdpTransform=="function"&&(i.sdp=this.connection.options.sdpTransform(i.sdp)||i.sdp),a.label=3;case 3:return a.trys.push([3,5,,6]),[4,e.setLocalDescription(i)];case 4:return a.sent(),O.default.log("Set localDescription:",i,"for:".concat(this.connection.peer)),r={sdp:i,type:this.connection.type,connectionId:this.connection.connectionId,metadata:this.connection.metadata,browser:F.browser},this.connection.type===Ge.Data&&(s=this.connection,r=zn(zn({},r),{label:s.label,reliable:s.reliable,serialization:s.serialization})),t.socket.send({type:le.Offer,payload:r,dst:this.connection.peer}),[3,6];case 5:return o=a.sent(),o!="OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer"&&(t.emitError(Q.WebRTC,o),O.default.log("Failed to setLocalDescription, ",o)),[3,6];case 6:return[3,8];case 7:return l=a.sent(),t.emitError(Q.WebRTC,l),O.default.log("Failed to createOffer, ",l),[3,8];case 8:return[2]}})})},n.prototype._makeAnswer=function(){return Nn(this,void 0,Promise,function(){var e,t,i,r,s;return Un(this,function(o){switch(o.label){case 0:e=this.connection.peerConnection,t=this.connection.provider,o.label=1;case 1:return o.trys.push([1,7,,8]),[4,e.createAnswer()];case 2:i=o.sent(),O.default.log("Created answer."),this.connection.options.sdpTransform&&typeof this.connection.options.sdpTransform=="function"&&(i.sdp=this.connection.options.sdpTransform(i.sdp)||i.sdp),o.label=3;case 3:return o.trys.push([3,5,,6]),[4,e.setLocalDescription(i)];case 4:return o.sent(),O.default.log("Set localDescription:",i,"for:".concat(this.connection.peer)),t.socket.send({type:le.Answer,payload:{sdp:i,type:this.connection.type,connectionId:this.connection.connectionId,browser:F.browser},dst:this.connection.peer}),[3,6];case 5:return r=o.sent(),t.emitError(Q.WebRTC,r),O.default.log("Failed to setLocalDescription, ",r),[3,6];case 6:return[3,8];case 7:return s=o.sent(),t.emitError(Q.WebRTC,s),O.default.log("Failed to create answer, ",s),[3,8];case 8:return[2]}})})},n.prototype.handleSDP=function(e,t){return Nn(this,void 0,Promise,function(){var i,r,s,o;return Un(this,function(l){switch(l.label){case 0:t=new RTCSessionDescription(t),i=this.connection.peerConnection,r=this.connection.provider,O.default.log("Setting remote description",t),s=this,l.label=1;case 1:return l.trys.push([1,5,,6]),[4,i.setRemoteDescription(t)];case 2:return l.sent(),O.default.log("Set remoteDescription:".concat(e," for:").concat(this.connection.peer)),e!=="OFFER"?[3,4]:[4,s._makeAnswer()];case 3:l.sent(),l.label=4;case 4:return[3,6];case 5:return o=l.sent(),r.emitError(Q.WebRTC,o),O.default.log("Failed to setRemoteDescription, ",o),[3,6];case 6:return[2]}})})},n.prototype.handleCandidate=function(e){return Nn(this,void 0,Promise,function(){var t,i,r,s,o,l;return Un(this,function(a){switch(a.label){case 0:O.default.log("handleCandidate:",e),t=e.candidate,i=e.sdpMLineIndex,r=e.sdpMid,s=this.connection.peerConnection,o=this.connection.provider,a.label=1;case 1:return a.trys.push([1,3,,4]),[4,s.addIceCandidate(new RTCIceCandidate({sdpMid:r,sdpMLineIndex:i,candidate:t}))];case 2:return a.sent(),O.default.log("Added ICE candidate for:".concat(this.connection.peer)),[3,4];case 3:return l=a.sent(),o.emitError(Q.WebRTC,l),O.default.log("Failed to handleCandidate, ",l),[3,4];case 4:return[2]}})})},n.prototype._addTracksToConnection=function(e,t){if(O.default.log("add tracks from stream ".concat(e.id," to peer connection")),!t.addTrack)return O.default.error("Your browser does't support RTCPeerConnection#addTrack. Ignored.");e.getTracks().forEach(function(i){t.addTrack(i,e)})},n.prototype._addStreamToMediaConnection=function(e,t){O.default.log("add stream ".concat(e.id," to media connection ").concat(t.connectionId)),t.addStream(e)},n}(),Gr={};Qe(Gr,"BaseConnection",()=>ta,n=>ta=n);var pl=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,r){i.__proto__=r}||function(i,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(i[s]=r[s])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),ta=function(n){pl(e,n);function e(t,i,r){var s=n.call(this)||this;return s.peer=t,s.provider=i,s.options=r,s._open=!1,s.metadata=r.metadata,s}return Object.defineProperty(e.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),e}(Si.EventEmitter),fl=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,r){i.__proto__=r}||function(i,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(i[s]=r[s])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),Dn=function(){return Dn=Object.assign||function(n){for(var e,t=1,i=arguments.length;t<i;t++){e=arguments[t];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r])}return n},Dn.apply(this,arguments)},ml=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},ia=function(n){fl(e,n);function e(t,i,r){var s=n.call(this,t,i,r)||this;return s._localStream=s.options._stream,s.connectionId=s.options.connectionId||e.ID_PREFIX+F.randomToken(),s._negotiator=new Jr.Negotiator(s),s._localStream&&s._negotiator.startConnection({_stream:s._localStream,originator:!0}),s}return Object.defineProperty(e.prototype,"type",{get:function(){return Ge.Media},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"localStream",{get:function(){return this._localStream},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"remoteStream",{get:function(){return this._remoteStream},enumerable:!1,configurable:!0}),e.prototype.addStream=function(t){O.default.log("Receiving stream",t),this._remoteStream=t,n.prototype.emit.call(this,"stream",t)},e.prototype.handleMessage=function(t){var i=t.type,r=t.payload;switch(t.type){case le.Answer:this._negotiator.handleSDP(i,r.sdp),this._open=!0;break;case le.Candidate:this._negotiator.handleCandidate(r.candidate);break;default:O.default.warn("Unrecognized message type:".concat(i," from peer:").concat(this.peer));break}},e.prototype.answer=function(t,i){var r,s;if(i===void 0&&(i={}),this._localStream){O.default.warn("Local stream already exists on this MediaConnection. Are you answering a call twice?");return}this._localStream=t,i&&i.sdpTransform&&(this.options.sdpTransform=i.sdpTransform),this._negotiator.startConnection(Dn(Dn({},this.options._payload),{_stream:t}));var o=this.provider._getMessages(this.connectionId);try{for(var l=ml(o),a=l.next();!a.done;a=l.next()){var c=a.value;this.handleMessage(c)}}catch(h){r={error:h}}finally{try{a&&!a.done&&(s=l.return)&&s.call(l)}finally{if(r)throw r.error}}this._open=!0},e.prototype.close=function(){this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this._localStream=null,this._remoteStream=null,this.provider&&(this.provider._removeConnection(this),this.provider=null),this.options&&this.options._stream&&(this.options._stream=null),this.open&&(this._open=!1,n.prototype.emit.call(this,"close"))},e.ID_PREFIX="mc_",e}(Gr.BaseConnection),qr={};Qe(qr,"DataConnection",()=>sa,n=>sa=n);var na={};Qe(na,"EncodingQueue",()=>ra,n=>ra=n);var yl=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,r){i.__proto__=r}||function(i,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(i[s]=r[s])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),ra=function(n){yl(e,n);function e(){var t=n.call(this)||this;return t.fileReader=new FileReader,t._queue=[],t._processing=!1,t.fileReader.onload=function(i){t._processing=!1,i.target&&t.emit("done",i.target.result),t.doNextTask()},t.fileReader.onerror=function(i){O.default.error("EncodingQueue error:",i),t._processing=!1,t.destroy(),t.emit("error",i)},t}return Object.defineProperty(e.prototype,"queue",{get:function(){return this._queue},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"size",{get:function(){return this.queue.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"processing",{get:function(){return this._processing},enumerable:!1,configurable:!0}),e.prototype.enque=function(t){this.queue.push(t),!this.processing&&this.doNextTask()},e.prototype.destroy=function(){this.fileReader.abort(),this._queue=[]},e.prototype.doNextTask=function(){this.size!==0&&(this.processing||(this._processing=!0,this.fileReader.readAsArrayBuffer(this.queue.shift())))},e}(Si.EventEmitter),gl=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,r){i.__proto__=r}||function(i,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(i[s]=r[s])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),vl=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},sa=function(n){gl(e,n);function e(t,i,r){var s=n.call(this,t,i,r)||this;return s.stringify=JSON.stringify,s.parse=JSON.parse,s._buffer=[],s._bufferSize=0,s._buffering=!1,s._chunkedData={},s._encodingQueue=new na.EncodingQueue,s.connectionId=s.options.connectionId||e.ID_PREFIX+F.randomToken(),s.label=s.options.label||s.connectionId,s.serialization=s.options.serialization||lt.Binary,s.reliable=!!s.options.reliable,s._encodingQueue.on("done",function(o){s._bufferedSend(o)}),s._encodingQueue.on("error",function(){O.default.error("DC#".concat(s.connectionId,": Error occured in encoding from blob to arraybuffer, close DC")),s.close()}),s._negotiator=new Jr.Negotiator(s),s._negotiator.startConnection(s.options._payload||{originator:!0}),s}return Object.defineProperty(e.prototype,"type",{get:function(){return Ge.Data},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"dataChannel",{get:function(){return this._dc},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"bufferSize",{get:function(){return this._bufferSize},enumerable:!1,configurable:!0}),e.prototype.initialize=function(t){this._dc=t,this._configureDataChannel()},e.prototype._configureDataChannel=function(){var t=this;(!F.supports.binaryBlob||F.supports.reliable)&&(this.dataChannel.binaryType="arraybuffer"),this.dataChannel.onopen=function(){O.default.log("DC#".concat(t.connectionId," dc connection success")),t._open=!0,t.emit("open")},this.dataChannel.onmessage=function(i){O.default.log("DC#".concat(t.connectionId," dc onmessage:"),i.data),t._handleDataMessage(i)},this.dataChannel.onclose=function(){O.default.log("DC#".concat(t.connectionId," dc closed for:"),t.peer),t.close()}},e.prototype._handleDataMessage=function(t){var i=this,r=t.data,s=r.constructor,o=this.serialization===lt.Binary||this.serialization===lt.BinaryUTF8,l=r;if(o){if(s===Blob){F.blobToArrayBuffer(r,function(c){var h=F.unpack(c);i.emit("data",h)});return}else if(s===ArrayBuffer)l=F.unpack(r);else if(s===String){var a=F.binaryStringToArrayBuffer(r);l=F.unpack(a)}}else this.serialization===lt.JSON&&(l=this.parse(r));if(l.__peerData){this._handleChunk(l);return}n.prototype.emit.call(this,"data",l)},e.prototype._handleChunk=function(t){var i=t.__peerData,r=this._chunkedData[i]||{data:[],count:0,total:t.total};if(r.data[t.n]=t.data,r.count++,this._chunkedData[i]=r,r.total===r.count){delete this._chunkedData[i];var s=new Blob(r.data);this._handleDataMessage({data:s})}},e.prototype.close=function(){this._buffer=[],this._bufferSize=0,this._chunkedData={},this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this.provider&&(this.provider._removeConnection(this),this.provider=null),this.dataChannel&&(this.dataChannel.onopen=null,this.dataChannel.onmessage=null,this.dataChannel.onclose=null,this._dc=null),this._encodingQueue&&(this._encodingQueue.destroy(),this._encodingQueue.removeAllListeners(),this._encodingQueue=null),this.open&&(this._open=!1,n.prototype.emit.call(this,"close"))},e.prototype.send=function(t,i){if(!this.open){n.prototype.emit.call(this,"error",new Error("Connection is not open. You should listen for the `open` event before sending messages."));return}if(this.serialization===lt.JSON)this._bufferedSend(this.stringify(t));else if(this.serialization===lt.Binary||this.serialization===lt.BinaryUTF8){var r=F.pack(t);if(!i&&r.size>F.chunkedMTU){this._sendChunks(r);return}F.supports.binaryBlob?this._bufferedSend(r):this._encodingQueue.enque(r)}else this._bufferedSend(t)},e.prototype._bufferedSend=function(t){(this._buffering||!this._trySend(t))&&(this._buffer.push(t),this._bufferSize=this._buffer.length)},e.prototype._trySend=function(t){var i=this;if(!this.open)return!1;if(this.dataChannel.bufferedAmount>e.MAX_BUFFERED_AMOUNT)return this._buffering=!0,setTimeout(function(){i._buffering=!1,i._tryBuffer()},50),!1;try{this.dataChannel.send(t)}catch(r){return O.default.error("DC#:".concat(this.connectionId," Error when sending:"),r),this._buffering=!0,this.close(),!1}return!0},e.prototype._tryBuffer=function(){if(this.open&&this._buffer.length!==0){var t=this._buffer[0];this._trySend(t)&&(this._buffer.shift(),this._bufferSize=this._buffer.length,this._tryBuffer())}},e.prototype._sendChunks=function(t){var i,r,s=F.chunk(t);O.default.log("DC#".concat(this.connectionId," Try to send ").concat(s.length," chunks..."));try{for(var o=vl(s),l=o.next();!l.done;l=o.next()){var a=l.value;this.send(a,!0)}}catch(c){i={error:c}}finally{try{l&&!l.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}},e.prototype.handleMessage=function(t){var i=t.payload;switch(t.type){case le.Answer:this._negotiator.handleSDP(t.type,i.sdp);break;case le.Candidate:this._negotiator.handleCandidate(i.candidate);break;default:O.default.warn("Unrecognized message type:",t.type,"from peer:",this.peer);break}},e.ID_PREFIX="dc_",e.MAX_BUFFERED_AMOUNT=8388608,e}(Gr.BaseConnection),oa={};Qe(oa,"API",()=>la,n=>la=n);var aa=function(n,e,t,i){function r(s){return s instanceof t?s:new t(function(o){o(s)})}return new(t||(t=Promise))(function(s,o){function l(h){try{c(i.next(h))}catch(u){o(u)}}function a(h){try{c(i.throw(h))}catch(u){o(u)}}function c(h){h.done?s(h.value):r(h.value).then(l,a)}c((i=i.apply(n,e||[])).next())})},ca=function(n,e){var t={label:0,sent:function(){if(s[0]&1)throw s[1];return s[1]},trys:[],ops:[]},i,r,s,o;return o={next:l(0),throw:l(1),return:l(2)},typeof Symbol=="function"&&(o[Symbol.iterator]=function(){return this}),o;function l(c){return function(h){return a([c,h])}}function a(c){if(i)throw new TypeError("Generator is already executing.");for(;t;)try{if(i=1,r&&(s=c[0]&2?r.return:c[0]?r.throw||((s=r.return)&&s.call(r),0):r.next)&&!(s=s.call(r,c[1])).done)return s;switch(r=0,s&&(c=[c[0]&2,s.value]),c[0]){case 0:case 1:s=c;break;case 4:return t.label++,{value:c[1],done:!1};case 5:t.label++,r=c[1],c=[0];continue;case 7:c=t.ops.pop(),t.trys.pop();continue;default:if(s=t.trys,!(s=s.length>0&&s[s.length-1])&&(c[0]===6||c[0]===2)){t=0;continue}if(c[0]===3&&(!s||c[1]>s[0]&&c[1]<s[3])){t.label=c[1];break}if(c[0]===6&&t.label<s[1]){t.label=s[1],s=c;break}if(s&&t.label<s[2]){t.label=s[2],t.ops.push(c);break}s[2]&&t.ops.pop(),t.trys.pop();continue}c=e.call(n,t)}catch(h){c=[6,h],r=0}finally{i=s=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}},la=function(){function n(e){this._options=e}return n.prototype._buildRequest=function(e){var t=this._options.secure?"https":"http",i=this._options,r=i.host,s=i.port,o=i.path,l=i.key,a=new URL("".concat(t,"://").concat(r,":").concat(s).concat(o).concat(l,"/").concat(e));return a.searchParams.set("ts","".concat(Date.now()).concat(Math.random())),a.searchParams.set("version",Vr.version),fetch(a.href,{referrerPolicy:this._options.referrerPolicy})},n.prototype.retrieveId=function(){return aa(this,void 0,Promise,function(){var e,t,i;return ca(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._buildRequest("id")];case 1:if(e=r.sent(),e.status!==200)throw new Error("Error. Status:".concat(e.status));return[2,e.text()];case 2:throw t=r.sent(),O.default.error("Error retrieving ID",t),i="",this._options.path==="/"&&this._options.host!==F.CLOUD_HOST&&(i=" If you passed in a `path` to your self-hosted PeerServer, you'll also need to pass in that same path when creating a new Peer."),new Error("Could not get an ID from the server."+i);case 3:return[2]}})})},n.prototype.listAllPeers=function(){return aa(this,void 0,Promise,function(){var e,t,i;return ca(this,function(r){switch(r.label){case 0:return r.trys.push([0,2,,3]),[4,this._buildRequest("peers")];case 1:if(e=r.sent(),e.status!==200)throw e.status===401?(t="",this._options.host===F.CLOUD_HOST?t="It looks like you're using the cloud server. You can email team@peerjs.com to enable peer listing for your API key.":t="You need to enable `allow_discovery` on your self-hosted PeerServer to use this feature.",new Error("It doesn't look like you have permission to list peers IDs. "+t)):new Error("Error. Status:".concat(e.status));return[2,e.json()];case 2:throw i=r.sent(),O.default.error("Error retrieving list peers",i),new Error("Could not get list peers from the server."+i);case 3:return[2]}})})},n}(),bl=function(){var n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,r){i.__proto__=r}||function(i,r){for(var s in r)Object.prototype.hasOwnProperty.call(r,s)&&(i[s]=r[s])},n(e,t)};return function(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");n(e,t);function i(){this.constructor=e}e.prototype=t===null?Object.create(t):(i.prototype=t.prototype,new i)}}(),Mi=function(){return Mi=Object.assign||function(n){for(var e,t=1,i=arguments.length;t<i;t++){e=arguments[t];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r])}return n},Mi.apply(this,arguments)},Ti=function(n){var e=typeof Symbol=="function"&&Symbol.iterator,t=e&&n[e],i=0;if(t)return t.call(n);if(n&&typeof n.length=="number")return{next:function(){return n&&i>=n.length&&(n=void 0),{value:n&&n[i++],done:!n}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},xl=function(n,e){var t=typeof Symbol=="function"&&n[Symbol.iterator];if(!t)return n;var i=t.call(n),r,s=[],o;try{for(;(e===void 0||e-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(l){o={error:l}}finally{try{r&&!r.done&&(t=i.return)&&t.call(i)}finally{if(o)throw o.error}}return s},Hr=function(n){bl(e,n);function e(t,i){var r=n.call(this)||this;r._id=null,r._lastServerId=null,r._destroyed=!1,r._disconnected=!1,r._open=!1,r._connections=new Map,r._lostMessages=new Map;var s;return t&&t.constructor==Object?i=t:t&&(s=t.toString()),i=Mi({debug:0,host:F.CLOUD_HOST,port:F.CLOUD_PORT,path:"/",key:e.DEFAULT_KEY,token:F.randomToken(),config:F.defaultConfig,referrerPolicy:"strict-origin-when-cross-origin"},i),r._options=i,r._options.host==="/"&&(r._options.host=window.location.hostname),r._options.path&&(r._options.path[0]!=="/"&&(r._options.path="/"+r._options.path),r._options.path[r._options.path.length-1]!=="/"&&(r._options.path+="/")),r._options.secure===void 0&&r._options.host!==F.CLOUD_HOST?r._options.secure=F.isSecure():r._options.host==F.CLOUD_HOST&&(r._options.secure=!0),r._options.logFunction&&O.default.setLogFunction(r._options.logFunction),O.default.logLevel=r._options.debug||0,r._api=new oa.API(i),r._socket=r._createServerConnection(),!F.supports.audioVideo&&!F.supports.data?(r._delayedAbort(Q.BrowserIncompatible,"The current browser does not support WebRTC"),r):s&&!F.validateId(s)?(r._delayedAbort(Q.InvalidID,'ID "'.concat(s,'" is invalid')),r):(s?r._initialize(s):r._api.retrieveId().then(function(o){return r._initialize(o)}).catch(function(o){return r._abort(Q.ServerError,o)}),r)}return Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"options",{get:function(){return this._options},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"socket",{get:function(){return this._socket},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"connections",{get:function(){var t,i,r=Object.create(null);try{for(var s=Ti(this._connections),o=s.next();!o.done;o=s.next()){var l=xl(o.value,2),a=l[0],c=l[1];r[a]=c}}catch(h){t={error:h}}finally{try{o&&!o.done&&(i=s.return)&&i.call(s)}finally{if(t)throw t.error}}return r},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"disconnected",{get:function(){return this._disconnected},enumerable:!1,configurable:!0}),e.prototype._createServerConnection=function(){var t=this,i=new Ko.Socket(this._options.secure,this._options.host,this._options.port,this._options.path,this._options.key,this._options.pingInterval);return i.on(ht.Message,function(r){t._handleMessage(r)}),i.on(ht.Error,function(r){t._abort(Q.SocketError,r)}),i.on(ht.Disconnected,function(){t.disconnected||(t.emitError(Q.Network,"Lost connection to server."),t.disconnect())}),i.on(ht.Close,function(){t.disconnected||t._abort(Q.SocketClosed,"Underlying socket is already closed.")}),i},e.prototype._initialize=function(t){this._id=t,this.socket.start(t,this._options.token)},e.prototype._handleMessage=function(t){var i,r,s=t.type,o=t.payload,l=t.src;switch(s){case le.Open:this._lastServerId=this.id,this._open=!0,this.emit("open",this.id);break;case le.Error:this._abort(Q.ServerError,o.msg);break;case le.IdTaken:this._abort(Q.UnavailableID,'ID "'.concat(this.id,'" is taken'));break;case le.InvalidKey:this._abort(Q.InvalidKey,'API KEY "'.concat(this._options.key,'" is invalid'));break;case le.Leave:O.default.log("Received leave message from ".concat(l)),this._cleanupPeer(l),this._connections.delete(l);break;case le.Expire:this.emitError(Q.PeerUnavailable,"Could not connect to peer ".concat(l));break;case le.Offer:var f=o.connectionId,m=this.getConnection(l,f);if(m&&(m.close(),O.default.warn("Offer received for existing Connection ID:".concat(f))),o.type===Ge.Media){var a=new jr.MediaConnection(l,this,{connectionId:f,_payload:o,metadata:o.metadata});m=a,this._addConnection(l,m),this.emit("call",a)}else if(o.type===Ge.Data){var c=new qr.DataConnection(l,this,{connectionId:f,_payload:o,metadata:o.metadata,label:o.label,serialization:o.serialization,reliable:o.reliable});m=c,this._addConnection(l,m),this.emit("connection",c)}else{O.default.warn("Received malformed connection type:".concat(o.type));return}var h=this._getMessages(f);try{for(var u=Ti(h),d=u.next();!d.done;d=u.next()){var p=d.value;m.handleMessage(p)}}catch(g){i={error:g}}finally{try{d&&!d.done&&(r=u.return)&&r.call(u)}finally{if(i)throw i.error}}break;default:if(!o){O.default.warn("You received a malformed message from ".concat(l," of type ").concat(s));return}var f=o.connectionId,m=this.getConnection(l,f);m&&m.peerConnection?m.handleMessage(t):f?this._storeMessage(f,t):O.default.warn("You received an unrecognized message:",t);break}},e.prototype._storeMessage=function(t,i){this._lostMessages.has(t)||this._lostMessages.set(t,[]),this._lostMessages.get(t).push(i)},e.prototype._getMessages=function(t){var i=this._lostMessages.get(t);return i?(this._lostMessages.delete(t),i):[]},e.prototype.connect=function(t,i){if(i===void 0&&(i={}),this.disconnected){O.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect, or call reconnect on this peer if you believe its ID to still be available."),this.emitError(Q.Disconnected,"Cannot connect to new Peer after disconnecting from server.");return}var r=new qr.DataConnection(t,this,i);return this._addConnection(t,r),r},e.prototype.call=function(t,i,r){if(r===void 0&&(r={}),this.disconnected){O.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect."),this.emitError(Q.Disconnected,"Cannot connect to new Peer after disconnecting from server.");return}if(!i){O.default.error("To call a peer, you must provide a stream from your browser's `getUserMedia`.");return}var s=new jr.MediaConnection(t,this,Mi(Mi({},r),{_stream:i}));return this._addConnection(t,s),s},e.prototype._addConnection=function(t,i){O.default.log("add connection ".concat(i.type,":").concat(i.connectionId," to peerId:").concat(t)),this._connections.has(t)||this._connections.set(t,[]),this._connections.get(t).push(i)},e.prototype._removeConnection=function(t){var i=this._connections.get(t.peer);if(i){var r=i.indexOf(t);r!==-1&&i.splice(r,1)}this._lostMessages.delete(t.connectionId)},e.prototype.getConnection=function(t,i){var r,s,o=this._connections.get(t);if(!o)return null;try{for(var l=Ti(o),a=l.next();!a.done;a=l.next()){var c=a.value;if(c.connectionId===i)return c}}catch(h){r={error:h}}finally{try{a&&!a.done&&(s=l.return)&&s.call(l)}finally{if(r)throw r.error}}return null},e.prototype._delayedAbort=function(t,i){var r=this;setTimeout(function(){r._abort(t,i)},0)},e.prototype._abort=function(t,i){O.default.error("Aborting!"),this.emitError(t,i),this._lastServerId?this.disconnect():this.destroy()},e.prototype.emitError=function(t,i){O.default.error("Error:",i);var r;typeof i=="string"?r=new Error(i):r=i,r.type=t,this.emit("error",r)},e.prototype.destroy=function(){this.destroyed||(O.default.log("Destroy peer with ID:".concat(this.id)),this.disconnect(),this._cleanup(),this._destroyed=!0,this.emit("close"))},e.prototype._cleanup=function(){var t,i;try{for(var r=Ti(this._connections.keys()),s=r.next();!s.done;s=r.next()){var o=s.value;this._cleanupPeer(o),this._connections.delete(o)}}catch(l){t={error:l}}finally{try{s&&!s.done&&(i=r.return)&&i.call(r)}finally{if(t)throw t.error}}this.socket.removeAllListeners()},e.prototype._cleanupPeer=function(t){var i,r,s=this._connections.get(t);if(s)try{for(var o=Ti(s),l=o.next();!l.done;l=o.next()){var a=l.value;a.close()}}catch(c){i={error:c}}finally{try{l&&!l.done&&(r=o.return)&&r.call(o)}finally{if(i)throw i.error}}},e.prototype.disconnect=function(){if(!this.disconnected){var t=this.id;O.default.log("Disconnect peer with ID:".concat(t)),this._disconnected=!0,this._open=!1,this.socket.close(),this._lastServerId=t,this._id=null,this.emit("disconnected",t)}},e.prototype.reconnect=function(){if(this.disconnected&&!this.destroyed)O.default.log("Attempting reconnection to server with ID ".concat(this._lastServerId)),this._disconnected=!1,this._initialize(this._lastServerId);else{if(this.destroyed)throw new Error("This peer cannot reconnect to the server. It has already been destroyed.");if(!this.disconnected&&!this.open)O.default.error("In a hurry? We're still trying to make the initial connection!");else throw new Error("Peer ".concat(this.id," cannot reconnect because it is not disconnected from the server!"))}},e.prototype.listAllPeers=function(t){var i=this;t===void 0&&(t=function(r){}),this._api.listAllPeers().then(function(r){return t(r)}).catch(function(r){return i._abort(Q.ServerError,r)})},e.DEFAULT_KEY="peerjs",e}(Si.EventEmitter),ha=Yo.Peer;const _l=Object.freeze(Object.defineProperty({__proto__:null,get Peer(){return Hr},default:ha,util:F},Symbol.toStringTag,{value:"Module"})),Sl=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function wl(n){return typeof n=="string"&&Sl.test(n)}const he=[];for(let n=0;n<256;++n)he.push((n+256).toString(16).slice(1));function Ml(n,e=0){return he[n[e+0]]+he[n[e+1]]+he[n[e+2]]+he[n[e+3]]+"-"+he[n[e+4]]+he[n[e+5]]+"-"+he[n[e+6]]+he[n[e+7]]+"-"+he[n[e+8]]+he[n[e+9]]+"-"+he[n[e+10]]+he[n[e+11]]+he[n[e+12]]+he[n[e+13]]+he[n[e+14]]+he[n[e+15]]}function Tl(n){if(!wl(n))throw TypeError("Invalid UUID");let e;const t=new Uint8Array(16);return t[0]=(e=parseInt(n.slice(0,8),16))>>>24,t[1]=e>>>16&255,t[2]=e>>>8&255,t[3]=e&255,t[4]=(e=parseInt(n.slice(9,13),16))>>>8,t[5]=e&255,t[6]=(e=parseInt(n.slice(14,18),16))>>>8,t[7]=e&255,t[8]=(e=parseInt(n.slice(19,23),16))>>>8,t[9]=e&255,t[10]=(e=parseInt(n.slice(24,36),16))/1099511627776&255,t[11]=e/4294967296&255,t[12]=e>>>24&255,t[13]=e>>>16&255,t[14]=e>>>8&255,t[15]=e&255,t}function Cl(n){n=unescape(encodeURIComponent(n));const e=[];for(let t=0;t<n.length;++t)e.push(n.charCodeAt(t));return e}const Pl="6ba7b810-9dad-11d1-80b4-00c04fd430c8",El="6ba7b811-9dad-11d1-80b4-00c04fd430c8";function Al(n,e,t){function i(r,s,o,l){var a;if(typeof r=="string"&&(r=Cl(r)),typeof s=="string"&&(s=Tl(s)),((a=s)===null||a===void 0?void 0:a.length)!==16)throw TypeError("Namespace must be array-like (16 iterable integer values, 0-255)");let c=new Uint8Array(16+r.length);if(c.set(s),c.set(r,s.length),c=t(c),c[6]=c[6]&15|e,c[8]=c[8]&63|128,o){l=l||0;for(let h=0;h<16;++h)o[l+h]=c[h];return o}return Ml(c)}try{i.name=n}catch{}return i.DNS=Pl,i.URL=El,i}function kl(n,e,t,i){switch(n){case 0:return e&t^~e&i;case 1:return e^t^i;case 2:return e&t^e&i^t&i;case 3:return e^t^i}}function Wr(n,e){return n<<e|n>>>32-e}function Rl(n){const e=[1518500249,1859775393,2400959708,3395469782],t=[1732584193,4023233417,2562383102,271733878,3285377520];if(typeof n=="string"){const o=unescape(encodeURIComponent(n));n=[];for(let l=0;l<o.length;++l)n.push(o.charCodeAt(l))}else Array.isArray(n)||(n=Array.prototype.slice.call(n));n.push(128);const i=n.length/4+2,r=Math.ceil(i/16),s=new Array(r);for(let o=0;o<r;++o){const l=new Uint32Array(16);for(let a=0;a<16;++a)l[a]=n[o*64+a*4]<<24|n[o*64+a*4+1]<<16|n[o*64+a*4+2]<<8|n[o*64+a*4+3];s[o]=l}s[r-1][14]=(n.length-1)*8/Math.pow(2,32),s[r-1][14]=Math.floor(s[r-1][14]),s[r-1][15]=(n.length-1)*8&4294967295;for(let o=0;o<r;++o){const l=new Uint32Array(80);for(let p=0;p<16;++p)l[p]=s[o][p];for(let p=16;p<80;++p)l[p]=Wr(l[p-3]^l[p-8]^l[p-14]^l[p-16],1);let a=t[0],c=t[1],h=t[2],u=t[3],d=t[4];for(let p=0;p<80;++p){const f=Math.floor(p/20),m=Wr(a,5)+kl(f,c,h,u)+d+e[f]+l[p]>>>0;d=u,u=h,h=Wr(c,30)>>>0,c=a,a=m}t[0]=t[0]+a>>>0,t[1]=t[1]+c>>>0,t[2]=t[2]+h>>>0,t[3]=t[3]+u>>>0,t[4]=t[4]+d>>>0}return[t[0]>>24&255,t[0]>>16&255,t[0]>>8&255,t[0]&255,t[1]>>24&255,t[1]>>16&255,t[1]>>8&255,t[1]&255,t[2]>>24&255,t[2]>>16&255,t[2]>>8&255,t[2]&255,t[3]>>24&255,t[3]>>16&255,t[3]>>8&255,t[3]&255,t[4]>>24&255,t[4]>>16&255,t[4]>>8&255,t[4]&255]}const Ol=Al("v5",80,Rl),Bl=Ol;var ua={exports:{}},da={exports:{}};(function(){var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",e={rotl:function(t,i){return t<<i|t>>>32-i},rotr:function(t,i){return t<<32-i|t>>>i},endian:function(t){if(t.constructor==Number)return e.rotl(t,8)&16711935|e.rotl(t,24)&4278255360;for(var i=0;i<t.length;i++)t[i]=e.endian(t[i]);return t},randomBytes:function(t){for(var i=[];t>0;t--)i.push(Math.floor(Math.random()*256));return i},bytesToWords:function(t){for(var i=[],r=0,s=0;r<t.length;r++,s+=8)i[s>>>5]|=t[r]<<24-s%32;return i},wordsToBytes:function(t){for(var i=[],r=0;r<t.length*32;r+=8)i.push(t[r>>>5]>>>24-r%32&255);return i},bytesToHex:function(t){for(var i=[],r=0;r<t.length;r++)i.push((t[r]>>>4).toString(16)),i.push((t[r]&15).toString(16));return i.join("")},hexToBytes:function(t){for(var i=[],r=0;r<t.length;r+=2)i.push(parseInt(t.substr(r,2),16));return i},bytesToBase64:function(t){for(var i=[],r=0;r<t.length;r+=3)for(var s=t[r]<<16|t[r+1]<<8|t[r+2],o=0;o<4;o++)r*8+o*6<=t.length*8?i.push(n.charAt(s>>>6*(3-o)&63)):i.push("=");return i.join("")},base64ToBytes:function(t){t=t.replace(/[^A-Z0-9+\/]/ig,"");for(var i=[],r=0,s=0;r<t.length;s=++r%4)s!=0&&i.push((n.indexOf(t.charAt(r-1))&Math.pow(2,-2*s+8)-1)<<s*2|n.indexOf(t.charAt(r))>>>6-s*2);return i}};da.exports=e})();var Il=da.exports,Xr={utf8:{stringToBytes:function(n){return Xr.bin.stringToBytes(unescape(encodeURIComponent(n)))},bytesToString:function(n){return decodeURIComponent(escape(Xr.bin.bytesToString(n)))}},bin:{stringToBytes:function(n){for(var e=[],t=0;t<n.length;t++)e.push(n.charCodeAt(t)&255);return e},bytesToString:function(n){for(var e=[],t=0;t<n.length;t++)e.push(String.fromCharCode(n[t]));return e.join("")}}},pa=Xr;/*!
79
79
  * Determine if an object is a Buffer
80
80
  *
81
81
  * @author Feross Aboukhadijeh <https://feross.org>
82
82
  * @license MIT
83
- */var Nc=function(n){return n!=null&&(mr(n)||Ic(n)||!!n._isBuffer)};function mr(n){return!!n.constructor&&typeof n.constructor.isBuffer=="function"&&n.constructor.isBuffer(n)}function Ic(n){return typeof n.readFloatLE=="function"&&typeof n.slice=="function"&&mr(n.slice(0,0))}(function(){var n=kc,e=pr.utf8,t=Nc,i=pr.bin,s=function(o,a){o.constructor==String?a&&a.encoding==="binary"?o=i.stringToBytes(o):o=e.stringToBytes(o):t(o)?o=Array.prototype.slice.call(o,0):!Array.isArray(o)&&o.constructor!==Uint8Array&&(o=o.toString());for(var c=n.bytesToWords(o),r=o.length*8,l=1732584193,d=-271733879,h=-1732584194,u=271733878,p=0;p<c.length;p++)c[p]=(c[p]<<8|c[p]>>>24)&16711935|(c[p]<<24|c[p]>>>8)&4278255360;c[r>>>5]|=128<<r%32,c[(r+64>>>9<<4)+14]=r;for(var m=s._ff,b=s._gg,G=s._hh,y=s._ii,p=0;p<c.length;p+=16){var Z=l,X=d,L=h,V=u;l=m(l,d,h,u,c[p+0],7,-680876936),u=m(u,l,d,h,c[p+1],12,-389564586),h=m(h,u,l,d,c[p+2],17,606105819),d=m(d,h,u,l,c[p+3],22,-1044525330),l=m(l,d,h,u,c[p+4],7,-176418897),u=m(u,l,d,h,c[p+5],12,1200080426),h=m(h,u,l,d,c[p+6],17,-1473231341),d=m(d,h,u,l,c[p+7],22,-45705983),l=m(l,d,h,u,c[p+8],7,1770035416),u=m(u,l,d,h,c[p+9],12,-1958414417),h=m(h,u,l,d,c[p+10],17,-42063),d=m(d,h,u,l,c[p+11],22,-1990404162),l=m(l,d,h,u,c[p+12],7,1804603682),u=m(u,l,d,h,c[p+13],12,-40341101),h=m(h,u,l,d,c[p+14],17,-1502002290),d=m(d,h,u,l,c[p+15],22,1236535329),l=b(l,d,h,u,c[p+1],5,-165796510),u=b(u,l,d,h,c[p+6],9,-1069501632),h=b(h,u,l,d,c[p+11],14,643717713),d=b(d,h,u,l,c[p+0],20,-373897302),l=b(l,d,h,u,c[p+5],5,-701558691),u=b(u,l,d,h,c[p+10],9,38016083),h=b(h,u,l,d,c[p+15],14,-660478335),d=b(d,h,u,l,c[p+4],20,-405537848),l=b(l,d,h,u,c[p+9],5,568446438),u=b(u,l,d,h,c[p+14],9,-1019803690),h=b(h,u,l,d,c[p+3],14,-187363961),d=b(d,h,u,l,c[p+8],20,1163531501),l=b(l,d,h,u,c[p+13],5,-1444681467),u=b(u,l,d,h,c[p+2],9,-51403784),h=b(h,u,l,d,c[p+7],14,1735328473),d=b(d,h,u,l,c[p+12],20,-1926607734),l=G(l,d,h,u,c[p+5],4,-378558),u=G(u,l,d,h,c[p+8],11,-2022574463),h=G(h,u,l,d,c[p+11],16,1839030562),d=G(d,h,u,l,c[p+14],23,-35309556),l=G(l,d,h,u,c[p+1],4,-1530992060),u=G(u,l,d,h,c[p+4],11,1272893353),h=G(h,u,l,d,c[p+7],16,-155497632),d=G(d,h,u,l,c[p+10],23,-1094730640),l=G(l,d,h,u,c[p+13],4,681279174),u=G(u,l,d,h,c[p+0],11,-358537222),h=G(h,u,l,d,c[p+3],16,-722521979),d=G(d,h,u,l,c[p+6],23,76029189),l=G(l,d,h,u,c[p+9],4,-640364487),u=G(u,l,d,h,c[p+12],11,-421815835),h=G(h,u,l,d,c[p+15],16,530742520),d=G(d,h,u,l,c[p+2],23,-995338651),l=y(l,d,h,u,c[p+0],6,-198630844),u=y(u,l,d,h,c[p+7],10,1126891415),h=y(h,u,l,d,c[p+14],15,-1416354905),d=y(d,h,u,l,c[p+5],21,-57434055),l=y(l,d,h,u,c[p+12],6,1700485571),u=y(u,l,d,h,c[p+3],10,-1894986606),h=y(h,u,l,d,c[p+10],15,-1051523),d=y(d,h,u,l,c[p+1],21,-2054922799),l=y(l,d,h,u,c[p+8],6,1873313359),u=y(u,l,d,h,c[p+15],10,-30611744),h=y(h,u,l,d,c[p+6],15,-1560198380),d=y(d,h,u,l,c[p+13],21,1309151649),l=y(l,d,h,u,c[p+4],6,-145523070),u=y(u,l,d,h,c[p+11],10,-1120210379),h=y(h,u,l,d,c[p+2],15,718787259),d=y(d,h,u,l,c[p+9],21,-343485551),l=l+Z>>>0,d=d+X>>>0,h=h+L>>>0,u=u+V>>>0}return n.endian([l,d,h,u])};s._ff=function(o,a,c,r,l,d,h){var u=o+(a&c|~a&r)+(l>>>0)+h;return(u<<d|u>>>32-d)+a},s._gg=function(o,a,c,r,l,d,h){var u=o+(a&r|c&~r)+(l>>>0)+h;return(u<<d|u>>>32-d)+a},s._hh=function(o,a,c,r,l,d,h){var u=o+(a^c^r)+(l>>>0)+h;return(u<<d|u>>>32-d)+a},s._ii=function(o,a,c,r,l,d,h){var u=o+(c^(a|~r))+(l>>>0)+h;return(u<<d|u>>>32-d)+a},s._blocksize=16,s._digestsize=16,hr.exports=function(o,a){if(o==null)throw new Error("Illegal argument "+o);var c=n.wordsToBytes(s(o,a));return a&&a.asBytes?c:a&&a.asString?i.bytesToString(c):n.bytesToHex(c)}})();var Jc=hr.exports;const Uc=Cn(Jc),Ze=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];let br=1234567;const yr=Math.PI/180,Gr=180/Math.PI;function Pc(){const n=Math.random()*4294967295|0,e=Math.random()*4294967295|0,t=Math.random()*4294967295|0,i=Math.random()*4294967295|0;return(Ze[n&255]+Ze[n>>8&255]+Ze[n>>16&255]+Ze[n>>24&255]+"-"+Ze[e&255]+Ze[e>>8&255]+"-"+Ze[e>>16&15|64]+Ze[e>>24&255]+"-"+Ze[t&63|128]+Ze[t>>8&255]+"-"+Ze[t>>16&255]+Ze[t>>24&255]+Ze[i&255]+Ze[i>>8&255]+Ze[i>>16&255]+Ze[i>>24&255]).toLowerCase()}function qe(n,e,t){return Math.max(e,Math.min(t,n))}function Zr(n,e){return(n%e+e)%e}function wc(n,e,t,i,s){return i+(n-e)*(s-i)/(t-e)}function Fc(n,e,t){return n!==e?(t-n)/(e-n):0}function Xr(n,e,t){return(1-t)*n+t*e}function Qc(n,e,t,i){return Xr(n,e,1-Math.exp(-t*i))}function Bc(n,e=1){return e-Math.abs(Zr(n,e*2)-e)}function Ec(n,e,t){return n<=e?0:n>=t?1:(n=(n-e)/(t-e),n*n*(3-2*n))}function jc(n,e,t){return n<=e?0:n>=t?1:(n=(n-e)/(t-e),n*n*n*(n*(n*6-15)+10))}function Oc(n,e){return n+Math.floor(Math.random()*(e-n+1))}function Dc(n,e){return n+Math.random()*(e-n)}function _c(n){return n*(.5-Math.random())}function Ac(n){n!==void 0&&(br=n);let e=br+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function qc(n){return n*yr}function $c(n){return n*Gr}function ed(n){return(n&n-1)===0&&n!==0}function td(n){return Math.pow(2,Math.ceil(Math.log(n)/Math.LN2))}function id(n){return Math.pow(2,Math.floor(Math.log(n)/Math.LN2))}function nd(n,e,t,i,s){const o=Math.cos,a=Math.sin,c=o(t/2),r=a(t/2),l=o((e+i)/2),d=a((e+i)/2),h=o((e-i)/2),u=a((e-i)/2),p=o((i-e)/2),m=a((i-e)/2);switch(s){case"XYX":n.set(c*d,r*h,r*u,c*l);break;case"YZY":n.set(r*u,c*d,r*h,c*l);break;case"ZXZ":n.set(r*h,r*u,c*d,c*l);break;case"XZX":n.set(c*d,r*m,r*p,c*l);break;case"YXY":n.set(r*p,c*d,r*m,c*l);break;case"ZYZ":n.set(r*m,r*p,c*d,c*l);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+s)}}function sd(n,e){switch(e.constructor){case Float32Array:return n;case Uint32Array:return n/4294967295;case Uint16Array:return n/65535;case Uint8Array:return n/255;case Int32Array:return Math.max(n/2147483647,-1);case Int16Array:return Math.max(n/32767,-1);case Int8Array:return Math.max(n/127,-1);default:throw new Error("Invalid component type.")}}function od(n,e){switch(e.constructor){case Float32Array:return n;case Uint32Array:return Math.round(n*4294967295);case Uint16Array:return Math.round(n*65535);case Uint8Array:return Math.round(n*255);case Int32Array:return Math.round(n*2147483647);case Int16Array:return Math.round(n*32767);case Int8Array:return Math.round(n*127);default:throw new Error("Invalid component type.")}}const At={DEG2RAD:yr,RAD2DEG:Gr,generateUUID:Pc,clamp:qe,euclideanModulo:Zr,mapLinear:wc,inverseLerp:Fc,lerp:Xr,damp:Qc,pingpong:Bc,smoothstep:Ec,smootherstep:jc,randInt:Oc,randFloat:Dc,randFloatSpread:_c,seededRandom:Ac,degToRad:qc,radToDeg:$c,isPowerOfTwo:ed,ceilPowerOfTwo:td,floorPowerOfTwo:id,setQuaternionFromProperEuler:nd,normalize:od,denormalize:sd};class F{constructor(e=0,t=0,i=0,s=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=i,this._w=s}static slerpFlat(e,t,i,s,o,a,c){let r=i[s+0],l=i[s+1],d=i[s+2],h=i[s+3];const u=o[a+0],p=o[a+1],m=o[a+2],b=o[a+3];if(c===0){e[t+0]=r,e[t+1]=l,e[t+2]=d,e[t+3]=h;return}if(c===1){e[t+0]=u,e[t+1]=p,e[t+2]=m,e[t+3]=b;return}if(h!==b||r!==u||l!==p||d!==m){let G=1-c;const y=r*u+l*p+d*m+h*b,Z=y>=0?1:-1,X=1-y*y;if(X>Number.EPSILON){const V=Math.sqrt(X),x=Math.atan2(V,y*Z);G=Math.sin(G*x)/V,c=Math.sin(c*x)/V}const L=c*Z;if(r=r*G+u*L,l=l*G+p*L,d=d*G+m*L,h=h*G+b*L,G===1-c){const V=1/Math.sqrt(r*r+l*l+d*d+h*h);r*=V,l*=V,d*=V,h*=V}}e[t]=r,e[t+1]=l,e[t+2]=d,e[t+3]=h}static multiplyQuaternionsFlat(e,t,i,s,o,a){const c=i[s],r=i[s+1],l=i[s+2],d=i[s+3],h=o[a],u=o[a+1],p=o[a+2],m=o[a+3];return e[t]=c*m+d*h+r*p-l*u,e[t+1]=r*m+d*u+l*h-c*p,e[t+2]=l*m+d*p+c*u-r*h,e[t+3]=d*m-c*h-r*u-l*p,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,i,s){return this._x=e,this._y=t,this._z=i,this._w=s,this._onChangeCallback(),this}clone(){return new F(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const i=e._x,s=e._y,o=e._z,a=e._order,c=Math.cos,r=Math.sin,l=c(i/2),d=c(s/2),h=c(o/2),u=r(i/2),p=r(s/2),m=r(o/2);switch(a){case"XYZ":this._x=u*d*h+l*p*m,this._y=l*p*h-u*d*m,this._z=l*d*m+u*p*h,this._w=l*d*h-u*p*m;break;case"YXZ":this._x=u*d*h+l*p*m,this._y=l*p*h-u*d*m,this._z=l*d*m-u*p*h,this._w=l*d*h+u*p*m;break;case"ZXY":this._x=u*d*h-l*p*m,this._y=l*p*h+u*d*m,this._z=l*d*m+u*p*h,this._w=l*d*h-u*p*m;break;case"ZYX":this._x=u*d*h-l*p*m,this._y=l*p*h+u*d*m,this._z=l*d*m-u*p*h,this._w=l*d*h+u*p*m;break;case"YZX":this._x=u*d*h+l*p*m,this._y=l*p*h+u*d*m,this._z=l*d*m-u*p*h,this._w=l*d*h-u*p*m;break;case"XZY":this._x=u*d*h-l*p*m,this._y=l*p*h-u*d*m,this._z=l*d*m+u*p*h,this._w=l*d*h+u*p*m;break;default:console.warn("../math.Quaternion: .setFromEuler() encountered an unknown order: "+a)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const i=t/2,s=Math.sin(i);return this._x=e.x*s,this._y=e.y*s,this._z=e.z*s,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,i=t[0],s=t[4],o=t[8],a=t[1],c=t[5],r=t[9],l=t[2],d=t[6],h=t[10],u=i+c+h;if(u>0){const p=.5/Math.sqrt(u+1);this._w=.25/p,this._x=(d-r)*p,this._y=(o-l)*p,this._z=(a-s)*p}else if(i>c&&i>h){const p=2*Math.sqrt(1+i-c-h);this._w=(d-r)/p,this._x=.25*p,this._y=(s+a)/p,this._z=(o+l)/p}else if(c>h){const p=2*Math.sqrt(1+c-i-h);this._w=(o-l)/p,this._x=(s+a)/p,this._y=.25*p,this._z=(r+d)/p}else{const p=2*Math.sqrt(1+h-i-c);this._w=(a-s)/p,this._x=(o+l)/p,this._y=(r+d)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let i=e.dot(t)+1;return i<Number.EPSILON?(i=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=i):(this._x=0,this._y=-e.z,this._z=e.y,this._w=i)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=i),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(qe(this.dot(e),-1,1)))}rotateTowards(e,t){const i=this.angleTo(e);if(i===0)return this;const s=Math.min(1,t/i);return this.slerp(e,s),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const i=e._x,s=e._y,o=e._z,a=e._w,c=t._x,r=t._y,l=t._z,d=t._w;return this._x=i*d+a*c+s*l-o*r,this._y=s*d+a*r+o*c-i*l,this._z=o*d+a*l+i*r-s*c,this._w=a*d-i*c-s*r-o*l,this._onChangeCallback(),this}slerp(e,t){if(t===0)return this;if(t===1)return this.copy(e);const i=this._x,s=this._y,o=this._z,a=this._w;let c=a*e._w+i*e._x+s*e._y+o*e._z;if(c<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,c=-c):this.copy(e),c>=1)return this._w=a,this._x=i,this._y=s,this._z=o,this;const r=1-c*c;if(r<=Number.EPSILON){const p=1-t;return this._w=p*a+t*this._w,this._x=p*i+t*this._x,this._y=p*s+t*this._y,this._z=p*o+t*this._z,this.normalize(),this}const l=Math.sqrt(r),d=Math.atan2(l,c),h=Math.sin((1-t)*d)/l,u=Math.sin(t*d)/l;return this._w=a*h+this._w*u,this._x=i*h+this._x*u,this._y=s*h+this._y*u,this._z=o*h+this._z*u,this._onChangeCallback(),this}slerpQuaternions(e,t,i){return this.copy(e).slerp(t,i)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),i=Math.random(),s=Math.sqrt(1-i),o=Math.sqrt(i);return this.set(s*Math.sin(e),s*Math.cos(e),o*Math.sin(t),o*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class T{constructor(e=0,t=0,i=0){this.isVector3=!0,T.prototype.isVector3=!0,this.x=e,this.y=t,this.z=i}set(e,t,i){return i===void 0&&(i=this.z),this.x=e,this.y=t,this.z=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new T(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(Vr.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(Vr.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,i=this.y,s=this.z,o=e.elements;return this.x=o[0]*t+o[3]*i+o[6]*s,this.y=o[1]*t+o[4]*i+o[7]*s,this.z=o[2]*t+o[5]*i+o[8]*s,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,i=this.y,s=this.z,o=e.elements,a=1/(o[3]*t+o[7]*i+o[11]*s+o[15]);return this.x=(o[0]*t+o[4]*i+o[8]*s+o[12])*a,this.y=(o[1]*t+o[5]*i+o[9]*s+o[13])*a,this.z=(o[2]*t+o[6]*i+o[10]*s+o[14])*a,this}applyQuaternion(e){const t=this.x,i=this.y,s=this.z,o=e.x,a=e.y,c=e.z,r=e.w,l=2*(a*s-c*i),d=2*(c*t-o*s),h=2*(o*i-a*t);return this.x=t+r*l+a*h-c*d,this.y=i+r*d+c*l-o*h,this.z=s+r*h+o*d-a*l,this}transformDirection(e){const t=this.x,i=this.y,s=this.z,o=e.elements;return this.x=o[0]*t+o[4]*i+o[8]*s,this.y=o[1]*t+o[5]*i+o[9]*s,this.z=o[2]*t+o[6]*i+o[10]*s,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const i=e.x,s=e.y,o=e.z,a=t.x,c=t.y,r=t.z;return this.x=s*r-o*c,this.y=o*a-i*r,this.z=i*c-s*a,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const i=e.dot(this)/t;return this.copy(e).multiplyScalar(i)}projectOnPlane(e){return Ds.copy(this).projectOnVector(e),this.sub(Ds)}reflect(e){return this.sub(Ds.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(qe(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y,s=this.z-e.z;return t*t+i*i+s*s}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSphericalCoords(e,t,i){const s=Math.sin(t)*e;return this.x=s*Math.sin(i),this.y=Math.cos(t)*e,this.z=s*Math.cos(i),this}setFromCylindricalCoords(e,t,i){return this.x=e*Math.sin(t),this.y=i,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),i=this.setFromMatrixColumn(e,1).length(),s=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=i,this.z=s,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=Math.random()*2-1,i=Math.sqrt(1-t*t);return this.x=i*Math.cos(e),this.y=t,this.z=i*Math.sin(e),this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this.z=Math.abs(this.z),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Ds=new T,Vr=new F,Jn=2e3,Rr=2001;class je{constructor(e,t,i,s,o,a,c,r,l,d,h,u,p,m,b,G){this.isMatrix4=!0,je.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,i,s,o,a,c,r,l,d,h,u,p,m,b,G)}extractPosition(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)}multiplyToArray(e,t,i){return console.error("THREE.Matrix4: .multiplyToArray() has been removed."),this}setRotationFromQuaternion(e){return this.makeRotationFromQuaternion(e)}set(e,t,i,s,o,a,c,r,l,d,h,u,p,m,b,G){const y=this.elements;return y[0]=e,y[4]=t,y[8]=i,y[12]=s,y[1]=o,y[5]=a,y[9]=c,y[13]=r,y[2]=l,y[6]=d,y[10]=h,y[14]=u,y[3]=p,y[7]=m,y[11]=b,y[15]=G,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new je().fromArray(this.elements)}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],t[9]=i[9],t[10]=i[10],t[11]=i[11],t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],this}copyPosition(e){const t=this.elements,i=e.elements;return t[12]=i[12],t[13]=i[13],t[14]=i[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,i){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(e,t,i){return this.set(e.x,t.x,i.x,0,e.y,t.y,i.y,0,e.z,t.z,i.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,i=e.elements,s=1/qt.setFromMatrixColumn(e,0).length(),o=1/qt.setFromMatrixColumn(e,1).length(),a=1/qt.setFromMatrixColumn(e,2).length();return t[0]=i[0]*s,t[1]=i[1]*s,t[2]=i[2]*s,t[3]=0,t[4]=i[4]*o,t[5]=i[5]*o,t[6]=i[6]*o,t[7]=0,t[8]=i[8]*a,t[9]=i[9]*a,t[10]=i[10]*a,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,i=e.x,s=e.y,o=e.z,a=Math.cos(i),c=Math.sin(i),r=Math.cos(s),l=Math.sin(s),d=Math.cos(o),h=Math.sin(o);if(e.order==="XYZ"){const u=a*d,p=a*h,m=c*d,b=c*h;t[0]=r*d,t[4]=-r*h,t[8]=l,t[1]=p+m*l,t[5]=u-b*l,t[9]=-c*r,t[2]=b-u*l,t[6]=m+p*l,t[10]=a*r}else if(e.order==="YXZ"){const u=r*d,p=r*h,m=l*d,b=l*h;t[0]=u+b*c,t[4]=m*c-p,t[8]=a*l,t[1]=a*h,t[5]=a*d,t[9]=-c,t[2]=p*c-m,t[6]=b+u*c,t[10]=a*r}else if(e.order==="ZXY"){const u=r*d,p=r*h,m=l*d,b=l*h;t[0]=u-b*c,t[4]=-a*h,t[8]=m+p*c,t[1]=p+m*c,t[5]=a*d,t[9]=b-u*c,t[2]=-a*l,t[6]=c,t[10]=a*r}else if(e.order==="ZYX"){const u=a*d,p=a*h,m=c*d,b=c*h;t[0]=r*d,t[4]=m*l-p,t[8]=u*l+b,t[1]=r*h,t[5]=b*l+u,t[9]=p*l-m,t[2]=-l,t[6]=c*r,t[10]=a*r}else if(e.order==="YZX"){const u=a*r,p=a*l,m=c*r,b=c*l;t[0]=r*d,t[4]=b-u*h,t[8]=m*h+p,t[1]=h,t[5]=a*d,t[9]=-c*d,t[2]=-l*d,t[6]=p*h+m,t[10]=u-b*h}else if(e.order==="XZY"){const u=a*r,p=a*l,m=c*r,b=c*l;t[0]=r*d,t[4]=-h,t[8]=l*d,t[1]=u*h+b,t[5]=a*d,t[9]=p*h-m,t[2]=m*h-p,t[6]=c*d,t[10]=b*h+u}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(ad,e,rd)}lookAt(e,t,i){const s=this.elements;return ve.subVectors(e,t),ve.lengthSq()===0&&(ve.z=1),ve.normalize(),yt.crossVectors(i,ve),yt.lengthSq()===0&&(Math.abs(i.z)===1?ve.x+=1e-4:ve.z+=1e-4,ve.normalize(),yt.crossVectors(i,ve)),yt.normalize(),Un.crossVectors(ve,yt),s[0]=yt.x,s[4]=Un.x,s[8]=ve.x,s[1]=yt.y,s[5]=Un.y,s[9]=ve.y,s[2]=yt.z,s[6]=Un.z,s[10]=ve.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,s=t.elements,o=this.elements,a=i[0],c=i[4],r=i[8],l=i[12],d=i[1],h=i[5],u=i[9],p=i[13],m=i[2],b=i[6],G=i[10],y=i[14],Z=i[3],X=i[7],L=i[11],V=i[15],x=s[0],R=s[4],S=s[8],W=s[12],f=s[1],C=s[5],g=s[9],z=s[13],Y=s[2],k=s[6],N=s[10],Q=s[14],P=s[3],ae=s[7],ie=s[11],ee=s[15];return o[0]=a*x+c*f+r*Y+l*P,o[4]=a*R+c*C+r*k+l*ae,o[8]=a*S+c*g+r*N+l*ie,o[12]=a*W+c*z+r*Q+l*ee,o[1]=d*x+h*f+u*Y+p*P,o[5]=d*R+h*C+u*k+p*ae,o[9]=d*S+h*g+u*N+p*ie,o[13]=d*W+h*z+u*Q+p*ee,o[2]=m*x+b*f+G*Y+y*P,o[6]=m*R+b*C+G*k+y*ae,o[10]=m*S+b*g+G*N+y*ie,o[14]=m*W+b*z+G*Q+y*ee,o[3]=Z*x+X*f+L*Y+V*P,o[7]=Z*R+X*C+L*k+V*ae,o[11]=Z*S+X*g+L*N+V*ie,o[15]=Z*W+X*z+L*Q+V*ee,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[4],s=e[8],o=e[12],a=e[1],c=e[5],r=e[9],l=e[13],d=e[2],h=e[6],u=e[10],p=e[14],m=e[3],b=e[7],G=e[11],y=e[15];return m*(+o*r*h-s*l*h-o*c*u+i*l*u+s*c*p-i*r*p)+b*(+t*r*p-t*l*u+o*a*u-s*a*p+s*l*d-o*r*d)+G*(+t*l*h-t*c*p-o*a*h+i*a*p+o*c*d-i*l*d)+y*(-s*c*d-t*r*h+t*c*u+s*a*h-i*a*u+i*r*d)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,i){const s=this.elements;return e.isVector3?(s[12]=e.x,s[13]=e.y,s[14]=e.z):(s[12]=e,s[13]=t,s[14]=i),this}invert(){const e=this.elements,t=e[0],i=e[1],s=e[2],o=e[3],a=e[4],c=e[5],r=e[6],l=e[7],d=e[8],h=e[9],u=e[10],p=e[11],m=e[12],b=e[13],G=e[14],y=e[15],Z=h*G*l-b*u*l+b*r*p-c*G*p-h*r*y+c*u*y,X=m*u*l-d*G*l-m*r*p+a*G*p+d*r*y-a*u*y,L=d*b*l-m*h*l+m*c*p-a*b*p-d*c*y+a*h*y,V=m*h*r-d*b*r-m*c*u+a*b*u+d*c*G-a*h*G,x=t*Z+i*X+s*L+o*V;if(x===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const R=1/x;return e[0]=Z*R,e[1]=(b*u*o-h*G*o-b*s*p+i*G*p+h*s*y-i*u*y)*R,e[2]=(c*G*o-b*r*o+b*s*l-i*G*l-c*s*y+i*r*y)*R,e[3]=(h*r*o-c*u*o-h*s*l+i*u*l+c*s*p-i*r*p)*R,e[4]=X*R,e[5]=(d*G*o-m*u*o+m*s*p-t*G*p-d*s*y+t*u*y)*R,e[6]=(m*r*o-a*G*o-m*s*l+t*G*l+a*s*y-t*r*y)*R,e[7]=(a*u*o-d*r*o+d*s*l-t*u*l-a*s*p+t*r*p)*R,e[8]=L*R,e[9]=(m*h*o-d*b*o-m*i*p+t*b*p+d*i*y-t*h*y)*R,e[10]=(a*b*o-m*c*o+m*i*l-t*b*l-a*i*y+t*c*y)*R,e[11]=(d*c*o-a*h*o-d*i*l+t*h*l+a*i*p-t*c*p)*R,e[12]=V*R,e[13]=(d*b*s-m*h*s+m*i*u-t*b*u-d*i*G+t*h*G)*R,e[14]=(m*c*s-a*b*s-m*i*r+t*b*r+a*i*G-t*c*G)*R,e[15]=(a*h*s-d*c*s+d*i*r-t*h*r-a*i*u+t*c*u)*R,this}scale(e){const t=this.elements,i=e.x,s=e.y,o=e.z;return t[0]*=i,t[4]*=s,t[8]*=o,t[1]*=i,t[5]*=s,t[9]*=o,t[2]*=i,t[6]*=s,t[10]*=o,t[3]*=i,t[7]*=s,t[11]*=o,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],s=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,s))}makeTranslation(e,t,i){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,i,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),i=Math.sin(e);return this.set(1,0,0,0,0,t,-i,0,0,i,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,0,i,0,0,1,0,0,-i,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,0,i,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const i=Math.cos(t),s=Math.sin(t),o=1-i,a=e.x,c=e.y,r=e.z,l=o*a,d=o*c;return this.set(l*a+i,l*c-s*r,l*r+s*c,0,l*c+s*r,d*c+i,d*r-s*a,0,l*r-s*c,d*r+s*a,o*r*r+i,0,0,0,0,1),this}makeScale(e,t,i){return this.set(e,0,0,0,0,t,0,0,0,0,i,0,0,0,0,1),this}makeShear(e,t,i,s,o,a){return this.set(1,i,o,0,e,1,a,0,t,s,1,0,0,0,0,1),this}compose(e,t,i){const s=this.elements,o=t._x,a=t._y,c=t._z,r=t._w,l=o+o,d=a+a,h=c+c,u=o*l,p=o*d,m=o*h,b=a*d,G=a*h,y=c*h,Z=r*l,X=r*d,L=r*h,V=i.x,x=i.y,R=i.z;return s[0]=(1-(b+y))*V,s[1]=(p+L)*V,s[2]=(m-X)*V,s[3]=0,s[4]=(p-L)*x,s[5]=(1-(u+y))*x,s[6]=(G+Z)*x,s[7]=0,s[8]=(m+X)*R,s[9]=(G-Z)*R,s[10]=(1-(u+b))*R,s[11]=0,s[12]=e.x,s[13]=e.y,s[14]=e.z,s[15]=1,this}decompose(e,t,i){const s=this.elements;let o=qt.set(s[0],s[1],s[2]).length();const a=qt.set(s[4],s[5],s[6]).length(),c=qt.set(s[8],s[9],s[10]).length();this.determinant()<0&&(o=-o),e.x=s[12],e.y=s[13],e.z=s[14],Be.copy(this);const r=1/o,l=1/a,d=1/c;return Be.elements[0]*=r,Be.elements[1]*=r,Be.elements[2]*=r,Be.elements[4]*=l,Be.elements[5]*=l,Be.elements[6]*=l,Be.elements[8]*=d,Be.elements[9]*=d,Be.elements[10]*=d,t.setFromRotationMatrix(Be),i.x=o,i.y=a,i.z=c,this}makePerspective(e,t,i,s,o,a,c=Jn){const r=this.elements,l=2*o/(t-e),d=2*o/(i-s),h=(t+e)/(t-e),u=(i+s)/(i-s);let p,m;if(c===Jn)p=-(a+o)/(a-o),m=-2*a*o/(a-o);else if(c===Rr)p=-a/(a-o),m=-a*o/(a-o);else throw new Error("Matrix4.makePerspective(): Invalid coordinate system: "+c);return r[0]=l,r[4]=0,r[8]=h,r[12]=0,r[1]=0,r[5]=d,r[9]=u,r[13]=0,r[2]=0,r[6]=0,r[10]=p,r[14]=m,r[3]=0,r[7]=0,r[11]=-1,r[15]=0,this}makeOrthographic(e,t,i,s,o,a,c=Jn){const r=this.elements,l=1/(t-e),d=1/(i-s),h=1/(a-o),u=(t+e)*l,p=(i+s)*d;let m,b;if(c===Jn)m=(a+o)*h,b=-2*h;else if(c===Rr)m=o*h,b=-1*h;else throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+c);return r[0]=2*l,r[4]=0,r[8]=0,r[12]=-u,r[1]=0,r[5]=2*d,r[9]=0,r[13]=-p,r[2]=0,r[6]=0,r[10]=b,r[14]=-m,r[3]=0,r[7]=0,r[11]=0,r[15]=1,this}equals(e){const t=this.elements,i=e.elements;for(let s=0;s<16;s++)if(t[s]!==i[s])return!1;return!0}fromArray(e,t=0){for(let i=0;i<16;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e[t+9]=i[9],e[t+10]=i[10],e[t+11]=i[11],e[t+12]=i[12],e[t+13]=i[13],e[t+14]=i[14],e[t+15]=i[15],e}}const qt=new T,Be=new je,ad=new T(0,0,0),rd=new T(1,1,1),yt=new T,Un=new T,ve=new T,Lr=new je,xr=new F;class Ei{constructor(e=0,t=0,i=0,s=Ei.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=i,this._order=s}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,i,s=this._order){return this._x=e,this._y=t,this._z=i,this._order=s,this._onChangeCallback(),this}clone(){return new Ei(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,i=!0){const s=e.elements,o=s[0],a=s[4],c=s[8],r=s[1],l=s[5],d=s[9],h=s[2],u=s[6],p=s[10];switch(t){case"XYZ":this._y=Math.asin(qe(c,-1,1)),Math.abs(c)<.9999999?(this._x=Math.atan2(-d,p),this._z=Math.atan2(-a,o)):(this._x=Math.atan2(u,l),this._z=0);break;case"YXZ":this._x=Math.asin(-qe(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(c,p),this._z=Math.atan2(r,l)):(this._y=Math.atan2(-h,o),this._z=0);break;case"ZXY":this._x=Math.asin(qe(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-h,p),this._z=Math.atan2(-a,l)):(this._y=0,this._z=Math.atan2(r,o));break;case"ZYX":this._y=Math.asin(-qe(h,-1,1)),Math.abs(h)<.9999999?(this._x=Math.atan2(u,p),this._z=Math.atan2(r,o)):(this._x=0,this._z=Math.atan2(-a,l));break;case"YZX":this._z=Math.asin(qe(r,-1,1)),Math.abs(r)<.9999999?(this._x=Math.atan2(-d,l),this._y=Math.atan2(-h,o)):(this._x=0,this._y=Math.atan2(c,p));break;case"XZY":this._z=Math.asin(-qe(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(u,l),this._y=Math.atan2(c,o)):(this._x=Math.atan2(-d,p),this._y=0);break;default:console.warn("../math.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,i===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,i){return Lr.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Lr,t,i)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return xr.setFromEuler(this),this.setFromQuaternion(xr,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(e){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Ei.DEFAULT_ORDER="XYZ";class di{constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new di(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,i=this.y,s=e.elements;return this.x=s[0]*t+s[3]*i+s[6],this.y=s[1]*t+s[4]*i+s[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(qe(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y;return t*t+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}rotateAround(e,t){const i=Math.cos(t),s=Math.sin(t),o=this.x-e.x,a=this.y-e.y;return this.x=o*i-a*s+e.x,this.y=o*s+a*i+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}di.isVector2=!0;class Ce{constructor(e=0,t=0,i=0,s=1){Ce.prototype.isVector4=!0,this.x=e,this.y=t,this.z=i,this.w=s}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,i,s){return this.x=e,this.y=t,this.z=i,this.w=s,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new Ce(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,i=this.y,s=this.z,o=this.w,a=e.elements;return this.x=a[0]*t+a[4]*i+a[8]*s+a[12]*o,this.y=a[1]*t+a[5]*i+a[9]*s+a[13]*o,this.z=a[2]*t+a[6]*i+a[10]*s+a[14]*o,this.w=a[3]*t+a[7]*i+a[11]*s+a[15]*o,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,i,s,o;const a=e.elements,c=a[0],r=a[4],l=a[8],d=a[1],h=a[5],u=a[9],p=a[2],m=a[6],b=a[10];if(Math.abs(r-d)<.01&&Math.abs(l-p)<.01&&Math.abs(u-m)<.01){if(Math.abs(r+d)<.1&&Math.abs(l+p)<.1&&Math.abs(u+m)<.1&&Math.abs(c+h+b-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const y=(c+1)/2,Z=(h+1)/2,X=(b+1)/2,L=(r+d)/4,V=(l+p)/4,x=(u+m)/4;return y>Z&&y>X?y<.01?(i=0,s=.707106781,o=.707106781):(i=Math.sqrt(y),s=L/i,o=V/i):Z>X?Z<.01?(i=.707106781,s=0,o=.707106781):(s=Math.sqrt(Z),i=L/s,o=x/s):X<.01?(i=.707106781,s=.707106781,o=0):(o=Math.sqrt(X),i=V/o,s=x/o),this.set(i,s,o,t),this}let G=Math.sqrt((m-u)*(m-u)+(l-p)*(l-p)+(d-r)*(d-r));return Math.abs(G)<.001&&(G=1),this.x=(m-u)/G,this.y=(l-p)/G,this.z=(d-r)/G,this.w=Math.acos((c+h+b-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this.w=e.w+(t.w-e.w)*i,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class tt{constructor(e,t,i,s,o,a,c,r,l){tt.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,i,s,o,a,c,r,l)}set(e,t,i,s,o,a,c,r,l){const d=this.elements;return d[0]=e,d[1]=s,d[2]=c,d[3]=t,d[4]=o,d[5]=r,d[6]=i,d[7]=a,d[8]=l,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],this}extractBasis(e,t,i){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,s=t.elements,o=this.elements,a=i[0],c=i[3],r=i[6],l=i[1],d=i[4],h=i[7],u=i[2],p=i[5],m=i[8],b=s[0],G=s[3],y=s[6],Z=s[1],X=s[4],L=s[7],V=s[2],x=s[5],R=s[8];return o[0]=a*b+c*Z+r*V,o[3]=a*G+c*X+r*x,o[6]=a*y+c*L+r*R,o[1]=l*b+d*Z+h*V,o[4]=l*G+d*X+h*x,o[7]=l*y+d*L+h*R,o[2]=u*b+p*Z+m*V,o[5]=u*G+p*X+m*x,o[8]=u*y+p*L+m*R,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[1],s=e[2],o=e[3],a=e[4],c=e[5],r=e[6],l=e[7],d=e[8];return t*a*d-t*c*l-i*o*d+i*c*r+s*o*l-s*a*r}invert(){const e=this.elements,t=e[0],i=e[1],s=e[2],o=e[3],a=e[4],c=e[5],r=e[6],l=e[7],d=e[8],h=d*a-c*l,u=c*r-d*o,p=l*o-a*r,m=t*h+i*u+s*p;if(m===0)return this.set(0,0,0,0,0,0,0,0,0);const b=1/m;return e[0]=h*b,e[1]=(s*l-d*i)*b,e[2]=(c*i-s*a)*b,e[3]=u*b,e[4]=(d*t-s*r)*b,e[5]=(s*o-c*t)*b,e[6]=p*b,e[7]=(i*r-l*t)*b,e[8]=(a*t-i*o)*b,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,i,s,o,a,c){const r=Math.cos(o),l=Math.sin(o);return this.set(i*r,i*l,-i*(r*a+l*c)+a+e,-s*l,s*r,-s*(-l*a+r*c)+c+t,0,0,1),this}scale(e,t){return this.premultiply(_s.makeScale(e,t)),this}rotate(e){return this.premultiply(_s.makeRotation(-e)),this}translate(e,t){return this.premultiply(_s.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,i,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,i=e.elements;for(let s=0;s<9;s++)if(t[s]!==i[s])return!1;return!0}fromArray(e,t=0){for(let i=0;i<9;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e}clone(){return new tt().fromArray(this.elements)}}const _s=new tt;var Le;(function(n){n[n.Random=0]="Random",n[n.Loop=1]="Loop",n[n.PingPong=2]="PingPong",n[n.Burst=3]="Burst"})(Le||(Le={}));function Wi(n,e,t,i){let s;switch(Le.Random===n?e=Math.random():Le.Burst===n&&i.isBursting&&(e=i.burstParticleIndex/i.burstParticleCount),t>0?s=Math.floor(e/t)*t:s=e,n){case Le.Loop:s=s%1;break;case Le.PingPong:s=Math.abs(s%2-1);break}return s}class Ft{constructor(e,t,i,s){this.p=[e,t,i,s]}genValue(e){const t=e*e,i=e*e*e,s=1-e,o=s*s,a=o*s;return this.p[0]*a+this.p[1]*o*e*3+this.p[2]*s*t*3+this.p[3]*i}derivativeCoefficients(e){const t=[];for(let i=e,s=i.length-1;s>0;s--){const o=[];for(let a=0;a<s;a++){const c=s*(i[a+1]-i[a]);o.push(c)}t.push(o),i=o}return t}getSlope(e){const t=this.derivativeCoefficients(this.p)[0],i=1-e,s=i*i,o=i*e*2,a=e*e;return s*t[0]+o*t[1]+a*t[2]}controlCurve(e,t){this.p[1]=e/3+this.p[0],this.p[2]=this.p[3]-t/3}hull(e){let t=this.p,i=[],s,o=0,a=0,c=0;const r=[];for(r[o++]=t[0],r[o++]=t[1],r[o++]=t[2],r[o++]=t[3];t.length>1;){for(i=[],a=0,c=t.length-1;a<c;a++)s=e*t[a]+(1-e)*t[a+1],r[o++]=s,i.push(s);t=i}return r}split(e){const t=this.hull(e);return{left:new Ft(t[0],t[4],t[7],t[9]),right:new Ft(t[9],t[8],t[6],t[3]),span:t}}clone(){return new Ft(this.p[0],this.p[1],this.p[2],this.p[3])}toJSON(){return{p0:this.p[0],p1:this.p[1],p2:this.p[2],p3:this.p[3]}}static fromJSON(e){return new Ft(e.p0,e.p1,e.p2,e.p3)}}const gi=n=>({r:n.x,g:n.y,b:n.z,a:n.w}),Ci=n=>new Ce(n.r,n.g,n.b,n.a),ld=(n,e)=>{switch(e){case"Vector3":return new T(n.x,n.y,n.z);case"Vector4":return new Ce(n.x,n.y,n.z,n.w);case"Color":return new T(n.r,n.g,n.b);case"Number":return n;default:return n}},cd=(n,e)=>{switch(e){case"Vector3":return{x:n.x,y:n.y,z:n.z};case"Vector4":return{x:n.x,y:n.y,z:n.z,w:n.w};case"Color":return{r:n.x,g:n.y,b:n.z};case"Number":return n;default:return n}};class Xs{constructor(e,t){this.a=e,this.b=t,this.type="value"}startGen(e){}genColor(e,t){const i=Math.random();return t.copy(this.a).lerp(this.b,i)}toJSON(){return{type:"RandomColor",a:gi(this.a),b:gi(this.b)}}static fromJSON(e){return new Xs(Ci(e.a),Ci(e.b))}clone(){return new Xs(this.a.clone(),this.b.clone())}}class hi{constructor(e,t){this.a=e,this.b=t,this.indexCount=-1,this.type="value"}startGen(e){this.indexCount=e.length,e.push(Math.random())}genColor(e,t){return this.indexCount===-1&&this.startGen(e),t.copy(this.a).lerp(this.b,e[this.indexCount])}toJSON(){return{type:"ColorRange",a:gi(this.a),b:gi(this.b)}}static fromJSON(e){return new hi(Ci(e.a),Ci(e.b))}clone(){return new hi(this.a.clone(),this.b.clone())}}class St{constructor(e,t){this.subType=t,this.type="function",this.keys=e}findKey(e){let t=0,i=0,s=this.keys.length-1;for(;i+1<s;)if(t=Math.floor((i+s)/2),e<this.getStartX(t))s=t-1;else if(e>this.getEndX(t))i=t+1;else return t;for(let o=i;o<=s;o++)if(e>=this.getStartX(o)&&e<=this.getEndX(o))return o;return-1}getStartX(e){return this.keys[e][1]}getEndX(e){return e+1<this.keys.length?this.keys[e+1][1]:1}genValue(e,t){const i=this.findKey(t);return this.subType==="Number"?i===-1?this.keys[0][0]:i+1>=this.keys.length?this.keys[this.keys.length-1][0]:(this.keys[i+1][0]-this.keys[i][0])*((t-this.getStartX(i))/(this.getEndX(i)-this.getStartX(i)))+this.keys[i][0]:i===-1?e.copy(this.keys[0][0]):i+1>=this.keys.length?e.copy(this.keys[this.keys.length-1][0]):e.copy(this.keys[i][0]).lerp(this.keys[i+1][0],(t-this.getStartX(i))/(this.getEndX(i)-this.getStartX(i)))}toJSON(){return this.keys[0][0].constructor.name,{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([e,t])=>({value:cd(e,this.subType),pos:t}))}}static fromJSON(e){return new St(e.keys.map(t=>[ld(t.value,e.subType),t.pos]),e.subType)}clone(){return this.subType==="Number"?new St(this.keys.map(([e,t])=>[e,t]),this.subType):new St(this.keys.map(([e,t])=>[e.clone(),t]),this.subType)}}const Pn=new T;class jt{constructor(e=[[new T(0,0,0),0],[new T(1,1,1),0]],t=[[1,0],[1,1]]){this.type="function",this.color=new St(e,"Color"),this.alpha=new St(t,"Number")}genColor(e,t,i){return this.color.genValue(Pn,i),t.set(Pn.x,Pn.y,Pn.z,this.alpha.genValue(1,i))}toJSON(){return{type:"Gradient",color:this.color.toJSON(),alpha:this.alpha.toJSON()}}static fromJSON(e){if(e.functions){const t=e.functions.map(i=>[hi.fromJSON(i.function).a,i.start]);return e.functions.length>0&&t.push([hi.fromJSON(e.functions[e.functions.length-1].function).b,1]),new jt(t.map(i=>[new T(i[0].x,i[0].y,i[0].z),i[1]]),t.map(i=>[i[0].w,i[1]]))}else{const t=new jt;return t.alpha=St.fromJSON(e.alpha),t.color=St.fromJSON(e.color),t}}clone(){const e=new jt;return e.alpha=this.alpha.clone(),e.color=this.color.clone(),e}startGen(e){}}const As=new Ce;class Vs{constructor(e,t){this.indexCount=0,this.type="function",this.gradient1=e,this.gradient2=t}startGen(e){this.indexCount=e.length,e.push(Math.random())}genColor(e,t,i){return this.gradient1.genColor(e,t,i),this.gradient2.genColor(e,As,i),e&&e[this.indexCount]!==void 0?t.lerp(As,e[this.indexCount]):t.lerp(As,Math.random()),t}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(e){return new Vs(jt.fromJSON(e.gradient1),jt.fromJSON(e.gradient2))}clone(){return new Vs(this.gradient1.clone(),this.gradient2.clone())}}class Qt{constructor(e){this.color=e,this.type="value"}startGen(e){}genColor(e,t){return t.copy(this.color)}toJSON(){return{type:"ConstantColor",color:gi(this.color)}}static fromJSON(e){return new Qt(Ci(e.color))}clone(){return new Qt(this.color.clone())}}function qs(n){switch(n.type){case"ConstantColor":return Qt.fromJSON(n);case"ColorRange":return hi.fromJSON(n);case"RandomColor":return Xs.fromJSON(n);case"Gradient":return jt.fromJSON(n);case"RandomColorBetweenGradient":return Vs.fromJSON(n);default:return new Qt(new Ce(1,1,1,1))}}class U{constructor(e){this.value=e,this.type="value"}startGen(e){}genValue(e){return this.value}toJSON(){return{type:"ConstantValue",value:this.value}}static fromJSON(e){return new U(e.value)}clone(){return new U(this.value)}}class Bt{constructor(e,t){this.a=e,this.b=t,this.indexCount=-1,this.type="value"}startGen(e){this.indexCount=e.length,e.push(Math.random())}genValue(e){return this.indexCount===-1&&this.startGen(e),At.lerp(this.a,this.b,e[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(e){return new Bt(e.a,e.b)}clone(){return new Bt(this.a,this.b)}}class dd{constructor(){this.functions=new Array}findFunction(e){let t=0,i=0,s=this.functions.length-1;for(;i+1<s;)if(t=Math.floor((i+s)/2),e<this.getStartX(t))s=t-1;else if(e>this.getEndX(t))i=t+1;else return t;for(let o=i;o<=s;o++)if(e>=this.functions[o][1]&&e<=this.getEndX(o))return o;return-1}getStartX(e){return this.functions[e][1]}setStartX(e,t){e>0&&(this.functions[e][1]=t)}getEndX(e){return e+1<this.functions.length?this.functions[e+1][1]:1}setEndX(e,t){e+1<this.functions.length&&(this.functions[e+1][1]=t)}insertFunction(e,t){const i=this.findFunction(e);this.functions.splice(i+1,0,[t,e])}removeFunction(e){return this.functions.splice(e,1)[0][0]}getFunction(e){return this.functions[e][0]}setFunction(e,t){this.functions[e][0]=t}get numOfFunctions(){return this.functions.length}}class ji extends dd{constructor(e=[[new Ft(0,1/3,1/3*2,1),0]]){super(),this.type="function",this.functions=e}genValue(e,t=0){const i=this.findFunction(t);return i===-1?0:this.functions[i][0].genValue((t-this.getStartX(i))/(this.getEndX(i)-this.getStartX(i)))}toSVG(e,t){if(t<1)return"";let i=["M",0,this.functions[0][0].p[0]].join(" ");for(let s=1/t;s<=1;s+=1/t)i=[i,"L",s*e,this.genValue(void 0,s)].join(" ");return i}toJSON(){return{type:"PiecewiseBezier",functions:this.functions.map(([e,t])=>({function:e.toJSON(),start:t}))}}static fromJSON(e){return new ji(e.functions.map(t=>[Ft.fromJSON(t.function),t.start]))}clone(){return new ji(this.functions.map(([e,t])=>[e.clone(),t]))}startGen(e){}}function I(n){switch(n.type){case"ConstantValue":return U.fromJSON(n);case"IntervalValue":return Bt.fromJSON(n);case"PiecewiseBezier":return ji.fromJSON(n);default:return new U(0)}}class Oi{constructor(){this.indexCount=0,this.type="rotation"}startGen(e){this.indexCount=e.length,e.push(new F);let t,i,s,o,a,c;do t=Math.random()*2-1,i=Math.random()*2-1,s=t*t+i*i;while(s>1);do o=Math.random()*2-1,a=Math.random()*2-1,c=o*o+a*a;while(c>1);const r=Math.sqrt((1-s)/c);e[this.indexCount].set(t,i,r*o,r*a)}genValue(e,t,i,s){return this.indexCount===-1&&this.startGen(e),t.copy(e[this.indexCount]),t}toJSON(){return{type:"RandomQuat"}}static fromJSON(e){return new Oi}clone(){return new Oi}}class Di{constructor(e,t){this.axis=e,this.angle=t,this.type="rotation"}startGen(e){this.angle.startGen(e)}genValue(e,t,i,s){return t.setFromAxisAngle(this.axis,this.angle.genValue(e,s)*i)}toJSON(){return{type:"AxisAngle",axis:{x:this.axis.x,y:this.axis.y,z:this.axis.z},angle:this.angle.toJSON()}}static fromJSON(e){return new Di(new T(e.axis.x,e.axis.y,e.axis.z),I(e.angle))}clone(){return new Di(this.axis.clone(),this.angle.clone())}}class Rs{constructor(e,t,i,s){this.angleX=e,this.angleY=t,this.angleZ=i,this.type="rotation",this.eular=new Ei(0,0,0,s)}startGen(e){this.angleX.startGen(e),this.angleY.startGen(e),this.angleZ.startGen(e)}genValue(e,t,i,s){return this.eular.set(this.angleX.genValue(e,s)*i,this.angleY.genValue(e,s)*i,this.angleZ.genValue(e,s)*i),t.setFromEuler(this.eular)}toJSON(){return{type:"Euler",angleX:this.angleX.toJSON(),angleY:this.angleY.toJSON(),angleZ:this.angleZ.toJSON(),eulerOrder:this.eular.order}}static fromJSON(e){return new Rs(I(e.angleX),I(e.angleY),I(e.angleZ),e.eulerOrder)}clone(){return new Rs(this.angleX,this.angleY,this.angleZ,this.eular.order)}}function Sr(n){switch(n.type){case"AxisAngle":return Di.fromJSON(n);case"Euler":return Rs.fromJSON(n);case"RandomQuat":return Oi.fromJSON(n);default:return new Oi}}class Et{constructor(e,t,i){this.x=e,this.y=t,this.z=i,this.type="vec3function"}startGen(e){this.x.startGen(e),this.y.startGen(e),this.z.startGen(e)}genValue(e,t,i){return t.set(this.x.genValue(e,i),this.y.genValue(e,i),this.z.genValue(e,i))}toJSON(){return{type:"Vector3Function",x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(e){return new Et(I(e.x),I(e.y),I(e.z))}clone(){return new Et(this.x,this.y,this.z)}}function hd(n){switch(n.type){case"Vector3Function":return Et.fromJSON(n);default:return new Et(new U(0),new U(0),new U(0))}}function wn(n){switch(n.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return I(n);case"AxisAngle":case"RandomQuat":case"Euler":return Sr(n);case"Vector3Function":return hd(n);default:return new U(0)}}class _i{constructor(e={}){var t,i,s,o,a,c,r;this.type="cone",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(s=e.thickness)!==null&&s!==void 0?s:1,this.angle=(o=e.angle)!==null&&o!==void 0?o:Math.PI/6,this.mode=(a=e.mode)!==null&&a!==void 0?a:Le.Random,this.spread=(c=e.spread)!==null&&c!==void 0?c:0,this.speed=(r=e.speed)!==null&&r!==void 0?r:new U(1),this.memory=[]}update(e,t){Le.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Wi(this.mode,this.currentValue,this.spread,t),s=At.lerp(1-this.thickness,1,Math.random()),o=i*this.arc,a=Math.sqrt(s),c=Math.sin(o),r=Math.cos(o);e.position.x=a*r,e.position.y=a*c,e.position.z=0;const l=this.angle*a;e.velocity.set(0,0,Math.cos(l)).addScaledVector(e.position,Math.sin(l)).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius)}toJSON(){return{type:"cone",radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new _i({radius:e.radius,arc:e.arc,thickness:e.thickness,angle:e.angle,mode:e.mode,speed:e.speed?I(e.speed):void 0,spread:e.spread})}clone(){return new _i({radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class Ai{constructor(e={}){var t,i,s,o,a,c;this.type="circle",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(s=e.thickness)!==null&&s!==void 0?s:1,this.mode=(o=e.mode)!==null&&o!==void 0?o:Le.Random,this.spread=(a=e.spread)!==null&&a!==void 0?a:0,this.speed=(c=e.speed)!==null&&c!==void 0?c:new U(1),this.memory=[]}update(e,t){this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t}initialize(e,t){const i=Wi(this.mode,this.currentValue,this.spread,t),s=At.lerp(1-this.thickness,1,Math.random()),o=i*this.arc;e.position.x=Math.cos(o),e.position.y=Math.sin(o),e.position.z=0,e.velocity.copy(e.position).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius*s)}toJSON(){return{type:"circle",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new Ai({radius:e.radius,arc:e.arc,thickness:e.thickness,mode:e.mode,speed:e.speed?I(e.speed):void 0,spread:e.spread})}clone(){return new Ai({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}function Fn(n,e){return Math.floor(Math.random()*(e-n))+n}const Qn=new T(0,1,0),Bn=new T(0,0,0),ud=new T(1,1,1),fr=new T(0,0,1);class qi{constructor(e={}){var t,i,s,o,a,c,r;this.type="donut",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(s=e.thickness)!==null&&s!==void 0?s:1,this.donutRadius=(o=e.donutRadius)!==null&&o!==void 0?o:this.radius*.2,this.mode=(a=e.mode)!==null&&a!==void 0?a:Le.Random,this.spread=(c=e.spread)!==null&&c!==void 0?c:0,this.speed=(r=e.speed)!==null&&r!==void 0?r:new U(1),this.memory=[],this._m1=new je}update(e,t){Le.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Wi(this.mode,this.currentValue,this.spread,t),s=Math.random(),o=At.lerp(1-this.thickness,1,Math.random()),a=i*this.arc,c=s*Math.PI*2,r=Math.sin(a),l=Math.cos(a);e.position.x=this.radius*l,e.position.y=this.radius*r,e.position.z=0,e.velocity.z=this.donutRadius*o*Math.sin(c),e.velocity.x=this.donutRadius*o*Math.cos(c)*l,e.velocity.y=this.donutRadius*o*Math.cos(c)*r,e.position.add(e.velocity),e.velocity.normalize().multiplyScalar(e.startSpeed),e.rotation instanceof F&&(this._m1.lookAt(Bn,e.velocity,Qn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"donut",radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new qi({radius:e.radius,arc:e.arc,thickness:e.thickness,donutRadius:e.donutRadius,mode:e.mode,speed:e.speed?I(e.speed):void 0,spread:e.spread})}clone(){return new qi({radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class $i{constructor(){this.type="point",this._m1=new je}update(e,t){}initialize(e){const t=Math.random(),i=Math.random(),s=t*Math.PI*2,o=Math.acos(2*i-1),a=Math.cbrt(Math.random()),c=Math.sin(s),r=Math.cos(s),l=Math.sin(o),d=Math.cos(o);e.velocity.x=a*l*r,e.velocity.y=a*l*c,e.velocity.z=a*d,e.velocity.multiplyScalar(e.startSpeed),e.position.setScalar(0),e.rotation instanceof F&&(this._m1.lookAt(Bn,e.position,Qn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"point"}}static fromJSON(e){return new $i}clone(){return new $i}}class ui{constructor(e={}){var t,i,s,o,a,c;this.type="sphere",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(s=e.thickness)!==null&&s!==void 0?s:1,this.mode=(o=e.mode)!==null&&o!==void 0?o:Le.Random,this.spread=(a=e.spread)!==null&&a!==void 0?a:0,this.speed=(c=e.speed)!==null&&c!==void 0?c:new U(1),this.memory=[],this._m1=new je}update(e,t){Le.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Wi(this.mode,this.currentValue,this.spread,t),s=Math.random(),o=At.lerp(1-this.thickness,1,Math.random()),a=i*this.arc,c=Math.acos(2*s-1),r=Math.sin(a),l=Math.cos(a),d=Math.sin(c),h=Math.cos(c);e.position.x=d*l,e.position.y=d*r,e.position.z=h,e.velocity.copy(e.position).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius*o),e.rotation instanceof F&&(this._m1.lookAt(Bn,e.position,Qn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"sphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new ui({radius:e.radius,arc:e.arc,thickness:e.thickness,mode:e.mode,speed:e.speed?I(e.speed):void 0,spread:e.spread})}clone(){return new ui({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class en{constructor(e={}){var t,i,s,o,a,c;this.type="sphere",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(s=e.thickness)!==null&&s!==void 0?s:1,this.mode=(o=e.mode)!==null&&o!==void 0?o:Le.Random,this.spread=(a=e.spread)!==null&&a!==void 0?a:0,this.speed=(c=e.speed)!==null&&c!==void 0?c:new U(1),this.memory=[],this._m1=new je}update(e,t){Le.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Wi(this.mode,this.currentValue,this.spread,t),s=Math.random(),o=At.lerp(1-this.thickness,1,Math.random()),a=i*this.arc,c=Math.acos(s),r=Math.sin(a),l=Math.cos(a),d=Math.sin(c),h=Math.cos(c);e.position.x=d*l,e.position.y=d*r,e.position.z=h,e.velocity.copy(e.position).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius*o),e.rotation instanceof F&&(this._m1.lookAt(Bn,e.position,Qn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"hemisphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new en({radius:e.radius,arc:e.arc,thickness:e.thickness,mode:e.mode,speed:e.speed?I(e.speed):void 0,spread:e.spread})}clone(){return new en({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class tn{constructor(e={}){var t,i,s,o;this.type="grid",this.width=(t=e.width)!==null&&t!==void 0?t:1,this.height=(i=e.height)!==null&&i!==void 0?i:1,this.column=(s=e.column)!==null&&s!==void 0?s:10,this.row=(o=e.row)!==null&&o!==void 0?o:10}initialize(e){const t=Math.floor(Math.random()*this.row),i=Math.floor(Math.random()*this.column);e.position.x=i*this.width/this.column-this.width/2,e.position.y=t*this.height/this.row-this.height/2,e.position.z=0,e.velocity.set(0,0,e.startSpeed)}toJSON(){return{type:"grid",width:this.width,height:this.height,column:this.column,row:this.row}}static fromJSON(e){return new tn(e)}clone(){return new tn({width:this.width,height:this.height,column:this.column,row:this.row})}update(e,t){}}const $s={circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:Ai,loadJSON:Ai.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:_i,loadJSON:_i.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:qi,loadJSON:qi.fromJSON},point:{type:"point",params:[],constructor:$i,loadJSON:$i.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:ui,loadJSON:ui.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:en,loadJSON:en.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["rows",["number"]],["column",["number"]]],constructor:tn,loadJSON:tn.fromJSON}};function pd(n,e){return $s[n.type].loadJSON(n,e)}class nn{constructor(e){this.color=e,this.type="ColorOverLife"}initialize(e){this.color.startGen(e.memory)}update(e,t){this.color.genColor(e.memory,e.color,e.age/e.life),e.color.x*=e.startColor.x,e.color.y*=e.startColor.y,e.color.z*=e.startColor.z,e.color.w*=e.startColor.w}frameUpdate(e){}toJSON(){return{type:this.type,color:this.color.toJSON()}}static fromJSON(e){return new nn(qs(e.color))}clone(){return new nn(this.color.clone())}reset(){}}class sn{constructor(e){this.angularVelocity=e,this.type="RotationOverLife"}initialize(e){typeof e.rotation=="number"&&this.angularVelocity.startGen(e.memory)}update(e,t){typeof e.rotation=="number"&&(e.rotation+=t*this.angularVelocity.genValue(e.memory,e.age/e.life))}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(e){return new sn(I(e.angularVelocity))}frameUpdate(e){}clone(){return new sn(this.angularVelocity.clone())}reset(){}}class on{constructor(e){this.angularVelocity=e,this.type="Rotation3DOverLife",this.tempQuat=new F,this.tempQuat2=new F}initialize(e){e.rotation instanceof F&&(e.angularVelocity=new F,this.angularVelocity.startGen(e.memory))}update(e,t){e.rotation instanceof F&&(this.angularVelocity.genValue(e.memory,this.tempQuat,t,e.age/e.life),e.rotation.multiply(this.tempQuat))}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(e){return new on(Sr(e.angularVelocity))}frameUpdate(e){}clone(){return new on(this.angularVelocity.clone())}reset(){}}class an{initialize(e,t){this.ps=t,this.x.startGen(e.memory),this.y.startGen(e.memory),this.z.startGen(e.memory)}constructor(e,t,i){this.x=e,this.y=t,this.z=i,this.type="ForceOverLife",this._temp=new T,this._tempScale=new T,this._tempQ=new F}update(e,t){this._temp.set(this.x.genValue(e.memory,e.age/e.life),this.y.genValue(e.memory,e.age/e.life),this.z.genValue(e.memory,e.age/e.life)),this.ps.worldSpace?e.velocity.addScaledVector(this._temp,t):(this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ),e.velocity.addScaledVector(this._temp,t))}toJSON(){return{type:this.type,x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(e){return new an(I(e.x),I(e.y),I(e.z))}frameUpdate(e){if(this.ps&&!this.ps.worldSpace){const t=this._temp,i=this._tempQ,s=this._tempScale;this.ps.emitter.matrixWorld.decompose(t,i,s),i.invert(),s.set(1/s.x,1/s.y,1/s.z)}}clone(){return new an(this.x.clone(),this.y.clone(),this.z.clone())}reset(){}}class rn{initialize(e){this.size.startGen(e.memory)}constructor(e){this.size=e,this.type="SizeOverLife"}update(e){this.size instanceof Et?this.size.genValue(e.memory,e.size,e.age/e.life).multiply(e.startSize):e.size.copy(e.startSize).multiplyScalar(this.size.genValue(e.memory,e.age/e.life))}toJSON(){return{type:this.type,size:this.size.toJSON()}}static fromJSON(e){return new rn(wn(e.size))}frameUpdate(e){}clone(){return new rn(this.size.clone())}reset(){}}class ln{initialize(e){this.speed.startGen(e.memory)}constructor(e){this.speed=e,this.type="SpeedOverLife"}update(e){e.speedModifier=this.speed.genValue(e.memory,e.age/e.life)}toJSON(){return{type:this.type,speed:this.speed.toJSON()}}static fromJSON(e){return new ln(I(e.speed))}frameUpdate(e){}clone(){return new ln(this.speed.clone())}reset(){}}class cn{constructor(e){this.frame=e,this.type="FrameOverLife"}initialize(e){this.frame.startGen(e.memory)}update(e,t){this.frame instanceof ji&&(e.uvTile=this.frame.genValue(e.memory,e.age/e.life))}frameUpdate(e){}toJSON(){return{type:this.type,frame:this.frame.toJSON()}}static fromJSON(e){return new cn(I(e.frame))}clone(){return new cn(this.frame.clone())}reset(){}}class dn{constructor(e,t=new T(0,1,0)){this.orbitSpeed=e,this.axis=t,this.type="OrbitOverLife",this.temp=new T,this.rotation=new F}initialize(e){this.orbitSpeed.startGen(e.memory)}update(e,t){this.temp.copy(e.position).projectOnVector(this.axis),this.rotation.setFromAxisAngle(this.axis,this.orbitSpeed.genValue(e.memory,e.age/e.life)*t),e.position.sub(this.temp),e.position.applyQuaternion(this.rotation),e.position.add(this.temp)}frameUpdate(e){}toJSON(){return{type:this.type,orbitSpeed:this.orbitSpeed.toJSON(),axis:[this.axis.x,this.axis.y,this.axis.z]}}static fromJSON(e){return new dn(I(e.orbitSpeed),e.axis?new T(e.axis[0],e.axis[1],e.axis[2]):void 0)}clone(){return new dn(this.orbitSpeed.clone())}reset(){}}class eo{constructor(e){this.data=e,this.next=null,this.prev=null}hasPrev(){return this.prev!==null}hasNext(){return this.next!==null}}class md{constructor(){this.length=0,this.head=this.tail=null}isEmpty(){return this.head===null}clear(){this.length=0,this.head=this.tail=null}front(){return this.head===null?null:this.head.data}back(){return this.tail===null?null:this.tail.data}dequeue(){if(this.head){const e=this.head.data;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,e}}pop(){if(this.tail){const e=this.tail.data;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,e}}queue(e){const t=new eo(e);this.tail||(this.tail=t),this.head&&(this.head.prev=t,t.next=this.head),this.head=t,this.length++}push(e){const t=new eo(e);this.head||(this.head=t),this.tail&&(this.tail.next=t,t.prev=this.tail),this.tail=t,this.length++}insertBefore(e,t){const i=new eo(t);i.next=e,i.prev=e.prev,i.prev!==null&&(i.prev.next=i),i.next.prev=i,e==this.head&&(this.head=i),this.length++}remove(e){if(this.head===null||this.tail===null)return;let t=this.head;for(e===this.head.data&&(this.head=this.head.next),e===this.tail.data&&(this.tail=this.tail.prev);t.next!==null&&t.data!==e;)t=t.next;t.data===e&&(t.prev!==null&&(t.prev.next=t.next),t.next!==null&&(t.next.prev=t.prev),this.length--)}*values(){let e=this.head;for(;e!==null;)yield e.data,e=e.next}}class bd{constructor(){this.startSpeed=0,this.startColor=new Ce,this.startSize=new T(1,1,1),this.position=new T,this.velocity=new T,this.age=0,this.life=1,this.size=new T(1,1,1),this.speedModifier=1,this.rotation=0,this.color=new Ce,this.uvTile=0,this.memory=[]}get died(){return this.age>=this.life}reset(){this.memory.length=0}}class yd{constructor(e,t,i){this.position=e,this.size=t,this.color=i}}class En{constructor(){this.startSpeed=0,this.startColor=new Ce,this.startSize=new T(1,1,1),this.position=new T,this.velocity=new T,this.age=0,this.life=1,this.size=new T(1,1,1),this.length=100,this.speedModifier=1,this.color=new Ce,this.previous=new md,this.uvTile=0,this.memory=[]}update(){for(this.age<=this.life?this.previous.push(new yd(this.position.clone(),this.size.x,this.color.clone())):this.previous.length>0&&this.previous.dequeue();this.previous.length>this.length;)this.previous.dequeue()}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.previous.clear()}}class hn{initialize(e){this.width.startGen(e.memory)}constructor(e){this.width=e,this.type="WidthOverLength"}update(e){if(e instanceof En){const t=e.previous.values();for(let i=0;i<e.previous.length;i++){const s=t.next();s.value.size=this.width.genValue(e.memory,(e.previous.length-i)/e.length)}}}frameUpdate(e){}toJSON(){return{type:this.type,width:this.width.toJSON()}}static fromJSON(e){return new hn(I(e.width))}clone(){return new hn(this.width.clone())}reset(){}}class un{constructor(e,t){this.direction=e,this.magnitude=t,this.type="ApplyForce",this.memory={data:[],dataCount:0},this.magnitudeValue=this.magnitude.genValue(this.memory)}initialize(e){}update(e,t){e.velocity.addScaledVector(this.direction,this.magnitudeValue*t)}frameUpdate(e){this.magnitudeValue=this.magnitude.genValue(this.memory)}toJSON(){return{type:this.type,direction:[this.direction.x,this.direction.y,this.direction.z],magnitude:this.magnitude.toJSON()}}static fromJSON(e){var t;return new un(new T(e.direction[0],e.direction[1],e.direction[2]),I((t=e.magnitude)!==null&&t!==void 0?t:e.force))}clone(){return new un(this.direction.clone(),this.magnitude.clone())}reset(){}}class pn{constructor(e,t){this.center=e,this.magnitude=t,this.type="GravityForce",this.temp=new T}initialize(e){}update(e,t){this.temp.copy(this.center).sub(e.position).normalize(),e.velocity.addScaledVector(this.temp,this.magnitude/e.position.distanceToSquared(this.center)*t)}frameUpdate(e){}toJSON(){return{type:this.type,center:[this.center.x,this.center.y,this.center.z],magnitude:this.magnitude}}static fromJSON(e){return new pn(new T(e.center[0],e.center[1],e.center[2]),e.magnitude)}clone(){return new pn(this.center.clone(),this.magnitude)}reset(){}}class mn{constructor(e){this.angle=e,this.type="ChangeEmitDirection",this._temp=new T,this._q=new F,this.memory={data:[],dataCount:0}}initialize(e){const t=e.velocity.length();t!=0&&(e.velocity.normalize(),e.velocity.x===0&&e.velocity.y===0?this._temp.set(0,e.velocity.z,0):this._temp.set(-e.velocity.y,e.velocity.x,0),this.angle.startGen(this.memory),this._q.setFromAxisAngle(this._temp.normalize(),this.angle.genValue(this.memory)),this._temp.copy(e.velocity),e.velocity.applyQuaternion(this._q),this._q.setFromAxisAngle(this._temp,Math.random()*Math.PI*2),e.velocity.applyQuaternion(this._q),e.velocity.setLength(t))}update(e,t){}frameUpdate(e){}toJSON(){return{type:this.type,angle:this.angle.toJSON()}}static fromJSON(e){return new mn(I(e.angle))}clone(){return new mn(this.angle)}reset(){}}var $t;(function(n){n[n.Death=0]="Death",n[n.Birth=1]="Birth",n[n.Frame=2]="Frame"})($t||($t={}));class bn{constructor(e,t,i,s=$t.Frame,o=1){this.particleSystem=e,this.useVelocityAsBasis=t,this.subParticleSystem=i,this.mode=s,this.emitProbability=o,this.type="EmitSubParticleSystem",this.q_=new F,this.v_=new T,this.v2_=new T,this.subEmissions=new Array,this.subParticleSystem&&this.subParticleSystem.system&&(this.subParticleSystem.system.onlyUsedByOther=!0)}initialize(e){}update(e,t){this.mode===$t.Frame?this.emit(e,t):this.mode===$t.Birth&&e.age===0?this.emit(e,t):this.mode===$t.Death&&e.age+t>=e.life&&this.emit(e,t)}emit(e,t){if(!this.subParticleSystem||Math.random()>this.emitProbability)return;const i=new je;this.setMatrixFromParticle(i,e),this.subEmissions.push({burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:i,travelDistance:0,particle:e})}frameUpdate(e){if(this.subParticleSystem)for(let t=0;t<this.subEmissions.length;t++)if(this.subEmissions[t].time>=this.subParticleSystem.system.duration)this.subEmissions[t]=this.subEmissions[this.subEmissions.length-1],this.subEmissions.length=this.subEmissions.length-1,t--;else{const i=this.subEmissions[t];i.particle&&i.particle.age<i.particle.life?this.setMatrixFromParticle(i.matrix,i.particle):i.particle=void 0,this.subParticleSystem.system.emit(e,i,i.matrix)}}toJSON(){return{type:this.type,subParticleSystem:this.subParticleSystem?this.subParticleSystem.uuid:"",useVelocityAsBasis:this.useVelocityAsBasis,mode:this.mode,emitProbability:this.emitProbability}}static fromJSON(e,t){return new bn(t,e.useVelocityAsBasis,e.subParticleSystem,e.mode,e.emitProbability)}clone(){return new bn(this.particleSystem,this.useVelocityAsBasis,this.subParticleSystem,this.mode,this.emitProbability)}reset(){}setMatrixFromParticle(e,t){let i;if(t.rotation===void 0||this.useVelocityAsBasis)if(t.velocity.x===0&&t.velocity.y===0&&(t.velocity.z===1||t.velocity.z===0))e.set(1,0,0,t.position.x,0,1,0,t.position.y,0,0,1,t.position.z,0,0,0,1);else{this.v_.copy(fr).cross(t.velocity),this.v2_.copy(t.velocity).cross(this.v_);const s=this.v_.length(),o=this.v2_.length();e.set(this.v_.x/s,this.v2_.x/o,t.velocity.x,t.position.x,this.v_.y/s,this.v2_.y/o,t.velocity.y,t.position.y,this.v_.z/s,this.v2_.z/o,t.velocity.z,t.position.z,0,0,0,1)}else t.rotation instanceof F?i=t.rotation:(this.q_.setFromAxisAngle(fr,t.rotation),i=this.q_),e.compose(t.position,i,ud);this.particleSystem.worldSpace||e.multiplyMatrices(this.particleSystem.emitter.matrixWorld,e)}}const Gd=.5*(Math.sqrt(3)-1),zi=(3-Math.sqrt(3))/6,Zd=1/3,$e=1/6,Xd=(Math.sqrt(5)-1)/4,he=(5-Math.sqrt(5))/20,oe=new Float32Array([1,1,0,-1,1,0,1,-1,0,-1,-1,0,1,0,1,-1,0,1,1,0,-1,-1,0,-1,0,1,1,0,-1,1,0,1,-1,0,-1,-1]),q=new Float32Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]);class Wr{constructor(e=Math.random){const t=typeof e=="function"?e:Rd(e);this.p=Vd(t),this.perm=new Uint8Array(512),this.permMod12=new Uint8Array(512);for(let i=0;i<512;i++)this.perm[i]=this.p[i&255],this.permMod12[i]=this.perm[i]%12}noise2D(e,t){const i=this.permMod12,s=this.perm;let o=0,a=0,c=0;const r=(e+t)*Gd,l=Math.floor(e+r),d=Math.floor(t+r),h=(l+d)*zi,u=l-h,p=d-h,m=e-u,b=t-p;let G,y;m>b?(G=1,y=0):(G=0,y=1);const Z=m-G+zi,X=b-y+zi,L=m-1+2*zi,V=b-1+2*zi,x=l&255,R=d&255;let S=.5-m*m-b*b;if(S>=0){const C=i[x+s[R]]*3;S*=S,o=S*S*(oe[C]*m+oe[C+1]*b)}let W=.5-Z*Z-X*X;if(W>=0){const C=i[x+G+s[R+y]]*3;W*=W,a=W*W*(oe[C]*Z+oe[C+1]*X)}let f=.5-L*L-V*V;if(f>=0){const C=i[x+1+s[R+1]]*3;f*=f,c=f*f*(oe[C]*L+oe[C+1]*V)}return 70*(o+a+c)}noise3D(e,t,i){const s=this.permMod12,o=this.perm;let a,c,r,l;const d=(e+t+i)*Zd,h=Math.floor(e+d),u=Math.floor(t+d),p=Math.floor(i+d),m=(h+u+p)*$e,b=h-m,G=u-m,y=p-m,Z=e-b,X=t-G,L=i-y;let V,x,R,S,W,f;Z>=X?X>=L?(V=1,x=0,R=0,S=1,W=1,f=0):Z>=L?(V=1,x=0,R=0,S=1,W=0,f=1):(V=0,x=0,R=1,S=1,W=0,f=1):X<L?(V=0,x=0,R=1,S=0,W=1,f=1):Z<L?(V=0,x=1,R=0,S=0,W=1,f=1):(V=0,x=1,R=0,S=1,W=1,f=0);const C=Z-V+$e,g=X-x+$e,z=L-R+$e,Y=Z-S+2*$e,k=X-W+2*$e,N=L-f+2*$e,Q=Z-1+3*$e,P=X-1+3*$e,ae=L-1+3*$e,ie=h&255,ee=u&255,ze=p&255;let Se=.6-Z*Z-X*X-L*L;if(Se<0)a=0;else{const O=s[ie+o[ee+o[ze]]]*3;Se*=Se,a=Se*Se*(oe[O]*Z+oe[O+1]*X+oe[O+2]*L)}let ne=.6-C*C-g*g-z*z;if(ne<0)c=0;else{const O=s[ie+V+o[ee+x+o[ze+R]]]*3;ne*=ne,c=ne*ne*(oe[O]*C+oe[O+1]*g+oe[O+2]*z)}let me=.6-Y*Y-k*k-N*N;if(me<0)r=0;else{const O=s[ie+S+o[ee+W+o[ze+f]]]*3;me*=me,r=me*me*(oe[O]*Y+oe[O+1]*k+oe[O+2]*N)}let te=.6-Q*Q-P*P-ae*ae;if(te<0)l=0;else{const O=s[ie+1+o[ee+1+o[ze+1]]]*3;te*=te,l=te*te*(oe[O]*Q+oe[O+1]*P+oe[O+2]*ae)}return 32*(a+c+r+l)}noise4D(e,t,i,s){const o=this.perm;let a,c,r,l,d;const h=(e+t+i+s)*Xd,u=Math.floor(e+h),p=Math.floor(t+h),m=Math.floor(i+h),b=Math.floor(s+h),G=(u+p+m+b)*he,y=u-G,Z=p-G,X=m-G,L=b-G,V=e-y,x=t-Z,R=i-X,S=s-L;let W=0,f=0,C=0,g=0;V>x?W++:f++,V>R?W++:C++,V>S?W++:g++,x>R?f++:C++,x>S?f++:g++,R>S?C++:g++;const z=W>=3?1:0,Y=f>=3?1:0,k=C>=3?1:0,N=g>=3?1:0,Q=W>=2?1:0,P=f>=2?1:0,ae=C>=2?1:0,ie=g>=2?1:0,ee=W>=1?1:0,ze=f>=1?1:0,Se=C>=1?1:0,ne=g>=1?1:0,me=V-z+he,te=x-Y+he,O=R-k+he,mt=S-N+he,_=V-Q+2*he,Oe=x-P+2*he,it=R-ae+2*he,ft=S-ie+2*he,Wt=V-ee+3*he,gt=x-ze+3*he,Ct=R-Se+3*he,zt=S-ne+3*he,vt=V-1+4*he,Kt=x-1+4*he,Mt=R-1+4*he,Tt=S-1+4*he,nt=u&255,st=p&255,ot=m&255,at=b&255;let Ne=.6-V*V-x*x-R*R-S*S;if(Ne<0)a=0;else{const w=o[nt+o[st+o[ot+o[at]]]]%32*4;Ne*=Ne,a=Ne*Ne*(q[w]*V+q[w+1]*x+q[w+2]*R+q[w+3]*S)}let Ie=.6-me*me-te*te-O*O-mt*mt;if(Ie<0)c=0;else{const w=o[nt+z+o[st+Y+o[ot+k+o[at+N]]]]%32*4;Ie*=Ie,c=Ie*Ie*(q[w]*me+q[w+1]*te+q[w+2]*O+q[w+3]*mt)}let Je=.6-_*_-Oe*Oe-it*it-ft*ft;if(Je<0)r=0;else{const w=o[nt+Q+o[st+P+o[ot+ae+o[at+ie]]]]%32*4;Je*=Je,r=Je*Je*(q[w]*_+q[w+1]*Oe+q[w+2]*it+q[w+3]*ft)}let Ue=.6-Wt*Wt-gt*gt-Ct*Ct-zt*zt;if(Ue<0)l=0;else{const w=o[nt+ee+o[st+ze+o[ot+Se+o[at+ne]]]]%32*4;Ue*=Ue,l=Ue*Ue*(q[w]*Wt+q[w+1]*gt+q[w+2]*Ct+q[w+3]*zt)}let Pe=.6-vt*vt-Kt*Kt-Mt*Mt-Tt*Tt;if(Pe<0)d=0;else{const w=o[nt+1+o[st+1+o[ot+1+o[at+1]]]]%32*4;Pe*=Pe,d=Pe*Pe*(q[w]*vt+q[w+1]*Kt+q[w+2]*Mt+q[w+3]*Tt)}return 27*(a+c+r+l+d)}}function Vd(n){const e=new Uint8Array(256);for(let t=0;t<256;t++)e[t]=t;for(let t=0;t<255;t++){const i=t+~~(n()*(256-t)),s=e[t];e[t]=e[i],e[i]=s}return e}function Rd(n){let e=0,t=0,i=0,s=1;const o=Ld();return e=o(" "),t=o(" "),i=o(" "),e-=o(n),e<0&&(e+=1),t-=o(n),t<0&&(t+=1),i-=o(n),i<0&&(i+=1),function(){const a=2091639*e+s*23283064365386963e-26;return e=t,t=i,i=a-(s=a|0)}}function Ld(){let n=4022871197;return function(e){e=e.toString();for(let t=0;t<e.length;t++){n+=e.charCodeAt(t);let i=.02519603282416938*n;n=i>>>0,i-=n,i*=n,n=i>>>0,i-=n,n+=i*4294967296}return(n>>>0)*23283064365386963e-26}}class yn{constructor(e,t,i,s){this.scale=e,this.octaves=t,this.velocityMultiplier=i,this.timeScale=s,this.type="TurbulenceField",this.generator=new Wr,this.timeOffset=new T,this.temp=new T,this.temp2=new T,this.timeOffset.x=Math.random()/this.scale.x*this.timeScale.x,this.timeOffset.y=Math.random()/this.scale.y*this.timeScale.y,this.timeOffset.z=Math.random()/this.scale.z*this.timeScale.z}initialize(e){}update(e,t){const i=e.position.x/this.scale.x,s=e.position.y/this.scale.y,o=e.position.z/this.scale.z;this.temp.set(0,0,0);let a=1;for(let c=0;c<this.octaves;c++)this.temp2.set(this.generator.noise4D(i*a,s*a,o*a,this.timeOffset.x*a)/a,this.generator.noise4D(i*a,s*a,o*a,this.timeOffset.y*a)/a,this.generator.noise4D(i*a,s*a,o*a,this.timeOffset.z*a)/a),this.temp.add(this.temp2),a*=2;this.temp.multiply(this.velocityMultiplier),e.velocity.addScaledVector(this.temp,t)}toJSON(){return{type:this.type,scale:[this.scale.x,this.scale.y,this.scale.z],octaves:this.octaves,velocityMultiplier:[this.velocityMultiplier.x,this.velocityMultiplier.y,this.velocityMultiplier.z],timeScale:[this.timeScale.x,this.timeScale.y,this.timeScale.z]}}frameUpdate(e){this.timeOffset.x+=e*this.timeScale.x,this.timeOffset.y+=e*this.timeScale.y,this.timeOffset.z+=e*this.timeScale.z}static fromJSON(e){return new yn(new T(e.scale[0],e.scale[1],e.scale[2]),e.octaves,new T(e.velocityMultiplier[0],e.velocityMultiplier[1],e.velocityMultiplier[2]),new T(e.timeScale[0],e.timeScale[1],e.timeScale[2]))}clone(){return new yn(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone())}reset(){}}const et=[],to=new T,io=new F;class Gn{constructor(e,t,i=new U(1),s=new U(0)){if(this.frequency=e,this.power=t,this.positionAmount=i,this.rotationAmount=s,this.type="Noise",this.duration=0,et.length===0)for(let o=0;o<100;o++)et.push(new Wr)}initialize(e){e.lastPosNoise=new T,typeof e.rotation=="number"?e.lastRotNoise=0:e.lastRotNoise=new F,e.generatorIndex=[Fn(0,100),Fn(0,100),Fn(0,100),Fn(0,100)],this.positionAmount.startGen(e.memory),this.rotationAmount.startGen(e.memory),this.frequency.startGen(e.memory),this.power.startGen(e.memory)}update(e,t){let i=this.frequency.genValue(e.memory,e.age/e.life),s=this.power.genValue(e.memory,e.age/e.life),o=this.positionAmount.genValue(e.memory,e.age/e.life),a=this.rotationAmount.genValue(e.memory,e.age/e.life);o>0&&e.lastPosNoise!==void 0&&(e.position.sub(e.lastPosNoise),to.set(et[e.generatorIndex[0]].noise2D(0,e.age*i)*s*o,et[e.generatorIndex[1]].noise2D(0,e.age*i)*s*o,et[e.generatorIndex[2]].noise2D(0,e.age*i)*s*o),e.position.add(to),e.lastPosNoise.copy(to)),a>0&&e.lastRotNoise!==void 0&&(typeof e.rotation=="number"?(e.rotation-=e.lastRotNoise,e.rotation+=et[e.generatorIndex[3]].noise2D(0,e.age*i)*Math.PI*s*a):(e.lastRotNoise.invert(),e.rotation.multiply(e.lastRotNoise),io.set(et[e.generatorIndex[0]].noise2D(0,e.age*i)*s*a,et[e.generatorIndex[1]].noise2D(0,e.age*i)*s*a,et[e.generatorIndex[2]].noise2D(0,e.age*i)*s*a,et[e.generatorIndex[3]].noise2D(0,e.age*i)*s*a).normalize(),e.rotation.multiply(io),e.lastRotNoise.copy(io)))}toJSON(){return{type:this.type,frequency:this.frequency.toJSON(),power:this.power.toJSON(),positionAmount:this.positionAmount.toJSON(),rotationAmount:this.rotationAmount.toJSON()}}frameUpdate(e){this.duration+=e}static fromJSON(e){return new Gn(I(e.frequency),I(e.power),I(e.positionAmount),I(e.rotationAmount))}clone(){return new Gn(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone())}reset(){}}class Zn{constructor(e,t){this.color=e,this.speedRange=t,this.type="ColorBySpeed"}initialize(e){this.color.startGen(e.memory)}update(e,t){const i=(e.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.color.genColor(e.memory,e.color,i),e.color.x*=e.startColor.x,e.color.y*=e.startColor.y,e.color.z*=e.startColor.z,e.color.w*=e.startColor.w}frameUpdate(e){}toJSON(){return{type:this.type,color:this.color.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(e){return new Zn(qs(e.color),Bt.fromJSON(e.speedRange))}clone(){return new Zn(this.color.clone(),this.speedRange.clone())}reset(){}}class Xn{initialize(e){this.size.startGen(e.memory)}constructor(e,t){this.size=e,this.speedRange=t,this.type="SizeBySpeed"}update(e){const t=(e.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.size instanceof Et?this.size.genValue(e.memory,e.size,t).multiply(e.startSize):e.size.copy(e.startSize).multiplyScalar(this.size.genValue(e.memory,t))}toJSON(){return{type:this.type,size:this.size.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(e){return new Xn(wn(e.size),Bt.fromJSON(e.speedRange))}frameUpdate(e){}clone(){return new Xn(this.size.clone(),this.speedRange.clone())}reset(){}}class Vn{constructor(e,t){this.angularVelocity=e,this.speedRange=t,this.type="RotationBySpeed",this.tempQuat=new F}initialize(e){typeof e.rotation=="number"&&this.angularVelocity.startGen(e.memory)}update(e,t){if(typeof e.rotation=="number"){const i=(e.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);e.rotation+=t*this.angularVelocity.genValue(e.memory,i)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(e){return new Vn(I(e.angularVelocity),Bt.fromJSON(e.speedRange))}frameUpdate(e){}clone(){return new Vn(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class Rn{initialize(e){this.speed.startGen(e.memory)}constructor(e,t){this.speed=e,this.dampen=t,this.type="LimitSpeedOverLife"}update(e,t){let i=e.velocity.length(),s=this.speed.genValue(e.memory,e.age/e.life);if(i>s){const o=(i-s)/i;e.velocity.multiplyScalar(1-o*this.dampen*t*20)}}toJSON(){return{type:this.type,speed:this.speed.toJSON(),dampen:this.dampen}}static fromJSON(e){return new Rn(I(e.speed),e.dampen)}frameUpdate(e){}clone(){return new Rn(this.speed.clone(),this.dampen)}reset(){}}const jn={ApplyForce:{type:"ApplyForce",constructor:un,params:[["direction",["vec3"]],["magnitude",["value"]]],loadJSON:un.fromJSON},Noise:{type:"Noise",constructor:Gn,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]]],loadJSON:Gn.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:yn,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]]],loadJSON:yn.fromJSON},GravityForce:{type:"GravityForce",constructor:pn,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:pn.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:nn,params:[["color",["colorFunc"]]],loadJSON:nn.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:sn,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:sn.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:on,params:[["angularVelocity",["rotationFunc"]]],loadJSON:on.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:rn,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:rn.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:Zn,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:Zn.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:Vn,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:Vn.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:Xn,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:Xn.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:ln,params:[["speed",["value","valueFunc"]]],loadJSON:ln.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:cn,params:[["frame",["value","valueFunc"]]],loadJSON:cn.fromJSON},ForceOverLife:{type:"ForceOverLife",constructor:an,params:[["x",["value","valueFunc"]],["y",["value","valueFunc"]],["z",["value","valueFunc"]]],loadJSON:an.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:dn,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]]],loadJSON:dn.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:hn,params:[["width",["value","valueFunc"]]],loadJSON:hn.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:mn,params:[["angle",["value"]]],loadJSON:mn.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:bn,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]]],loadJSON:bn.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:Rn,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:Rn.fromJSON}};function xd(n,e){return jn[n.type]?jn[n.type].loadJSON(n,e):null}const Sd=[];function fd(n){if(!Sd.find(e=>e.id===n.id)){n.initialize();for(const e of n.emitterShapes)$s[e.type]||($s[e.type]=e);for(const e of n.behaviors)jn[e.type]||(jn[e.type]=e)}}var Wd=`
83
+ */var zl=function(n){return n!=null&&(fa(n)||Nl(n)||!!n._isBuffer)};function fa(n){return!!n.constructor&&typeof n.constructor.isBuffer=="function"&&n.constructor.isBuffer(n)}function Nl(n){return typeof n.readFloatLE=="function"&&typeof n.slice=="function"&&fa(n.slice(0,0))}(function(){var n=Il,e=pa.utf8,t=zl,i=pa.bin,r=function(s,o){s.constructor==String?o&&o.encoding==="binary"?s=i.stringToBytes(s):s=e.stringToBytes(s):t(s)?s=Array.prototype.slice.call(s,0):!Array.isArray(s)&&s.constructor!==Uint8Array&&(s=s.toString());for(var l=n.bytesToWords(s),a=s.length*8,c=1732584193,h=-271733879,u=-1732584194,d=271733878,p=0;p<l.length;p++)l[p]=(l[p]<<8|l[p]>>>24)&16711935|(l[p]<<24|l[p]>>>8)&4278255360;l[a>>>5]|=128<<a%32,l[(a+64>>>9<<4)+14]=a;for(var f=r._ff,m=r._gg,g=r._hh,y=r._ii,p=0;p<l.length;p+=16){var v=c,b=h,S=u,x=d;c=f(c,h,u,d,l[p+0],7,-680876936),d=f(d,c,h,u,l[p+1],12,-389564586),u=f(u,d,c,h,l[p+2],17,606105819),h=f(h,u,d,c,l[p+3],22,-1044525330),c=f(c,h,u,d,l[p+4],7,-176418897),d=f(d,c,h,u,l[p+5],12,1200080426),u=f(u,d,c,h,l[p+6],17,-1473231341),h=f(h,u,d,c,l[p+7],22,-45705983),c=f(c,h,u,d,l[p+8],7,1770035416),d=f(d,c,h,u,l[p+9],12,-1958414417),u=f(u,d,c,h,l[p+10],17,-42063),h=f(h,u,d,c,l[p+11],22,-1990404162),c=f(c,h,u,d,l[p+12],7,1804603682),d=f(d,c,h,u,l[p+13],12,-40341101),u=f(u,d,c,h,l[p+14],17,-1502002290),h=f(h,u,d,c,l[p+15],22,1236535329),c=m(c,h,u,d,l[p+1],5,-165796510),d=m(d,c,h,u,l[p+6],9,-1069501632),u=m(u,d,c,h,l[p+11],14,643717713),h=m(h,u,d,c,l[p+0],20,-373897302),c=m(c,h,u,d,l[p+5],5,-701558691),d=m(d,c,h,u,l[p+10],9,38016083),u=m(u,d,c,h,l[p+15],14,-660478335),h=m(h,u,d,c,l[p+4],20,-405537848),c=m(c,h,u,d,l[p+9],5,568446438),d=m(d,c,h,u,l[p+14],9,-1019803690),u=m(u,d,c,h,l[p+3],14,-187363961),h=m(h,u,d,c,l[p+8],20,1163531501),c=m(c,h,u,d,l[p+13],5,-1444681467),d=m(d,c,h,u,l[p+2],9,-51403784),u=m(u,d,c,h,l[p+7],14,1735328473),h=m(h,u,d,c,l[p+12],20,-1926607734),c=g(c,h,u,d,l[p+5],4,-378558),d=g(d,c,h,u,l[p+8],11,-2022574463),u=g(u,d,c,h,l[p+11],16,1839030562),h=g(h,u,d,c,l[p+14],23,-35309556),c=g(c,h,u,d,l[p+1],4,-1530992060),d=g(d,c,h,u,l[p+4],11,1272893353),u=g(u,d,c,h,l[p+7],16,-155497632),h=g(h,u,d,c,l[p+10],23,-1094730640),c=g(c,h,u,d,l[p+13],4,681279174),d=g(d,c,h,u,l[p+0],11,-358537222),u=g(u,d,c,h,l[p+3],16,-722521979),h=g(h,u,d,c,l[p+6],23,76029189),c=g(c,h,u,d,l[p+9],4,-640364487),d=g(d,c,h,u,l[p+12],11,-421815835),u=g(u,d,c,h,l[p+15],16,530742520),h=g(h,u,d,c,l[p+2],23,-995338651),c=y(c,h,u,d,l[p+0],6,-198630844),d=y(d,c,h,u,l[p+7],10,1126891415),u=y(u,d,c,h,l[p+14],15,-1416354905),h=y(h,u,d,c,l[p+5],21,-57434055),c=y(c,h,u,d,l[p+12],6,1700485571),d=y(d,c,h,u,l[p+3],10,-1894986606),u=y(u,d,c,h,l[p+10],15,-1051523),h=y(h,u,d,c,l[p+1],21,-2054922799),c=y(c,h,u,d,l[p+8],6,1873313359),d=y(d,c,h,u,l[p+15],10,-30611744),u=y(u,d,c,h,l[p+6],15,-1560198380),h=y(h,u,d,c,l[p+13],21,1309151649),c=y(c,h,u,d,l[p+4],6,-145523070),d=y(d,c,h,u,l[p+11],10,-1120210379),u=y(u,d,c,h,l[p+2],15,718787259),h=y(h,u,d,c,l[p+9],21,-343485551),c=c+v>>>0,h=h+b>>>0,u=u+S>>>0,d=d+x>>>0}return n.endian([c,h,u,d])};r._ff=function(s,o,l,a,c,h,u){var d=s+(o&l|~o&a)+(c>>>0)+u;return(d<<h|d>>>32-h)+o},r._gg=function(s,o,l,a,c,h,u){var d=s+(o&a|l&~a)+(c>>>0)+u;return(d<<h|d>>>32-h)+o},r._hh=function(s,o,l,a,c,h,u){var d=s+(o^l^a)+(c>>>0)+u;return(d<<h|d>>>32-h)+o},r._ii=function(s,o,l,a,c,h,u){var d=s+(l^(o|~a))+(c>>>0)+u;return(d<<h|d>>>32-h)+o},r._blocksize=16,r._digestsize=16,ua.exports=function(s,o){if(s==null)throw new Error("Illegal argument "+s);var l=n.wordsToBytes(r(s,o));return o&&o.asBytes?l:o&&o.asString?i.bytesToString(l):n.bytesToHex(l)}})();var Ul=ua.exports;const Dl=En(Ul),ve=["00","01","02","03","04","05","06","07","08","09","0a","0b","0c","0d","0e","0f","10","11","12","13","14","15","16","17","18","19","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","27","28","29","2a","2b","2c","2d","2e","2f","30","31","32","33","34","35","36","37","38","39","3a","3b","3c","3d","3e","3f","40","41","42","43","44","45","46","47","48","49","4a","4b","4c","4d","4e","4f","50","51","52","53","54","55","56","57","58","59","5a","5b","5c","5d","5e","5f","60","61","62","63","64","65","66","67","68","69","6a","6b","6c","6d","6e","6f","70","71","72","73","74","75","76","77","78","79","7a","7b","7c","7d","7e","7f","80","81","82","83","84","85","86","87","88","89","8a","8b","8c","8d","8e","8f","90","91","92","93","94","95","96","97","98","99","9a","9b","9c","9d","9e","9f","a0","a1","a2","a3","a4","a5","a6","a7","a8","a9","aa","ab","ac","ad","ae","af","b0","b1","b2","b3","b4","b5","b6","b7","b8","b9","ba","bb","bc","bd","be","bf","c0","c1","c2","c3","c4","c5","c6","c7","c8","c9","ca","cb","cc","cd","ce","cf","d0","d1","d2","d3","d4","d5","d6","d7","d8","d9","da","db","dc","dd","de","df","e0","e1","e2","e3","e4","e5","e6","e7","e8","e9","ea","eb","ec","ed","ee","ef","f0","f1","f2","f3","f4","f5","f6","f7","f8","f9","fa","fb","fc","fd","fe","ff"];let ma=1234567;const ya=Math.PI/180,ga=180/Math.PI;function Fl(){const n=Math.random()*4294967295|0,e=Math.random()*4294967295|0,t=Math.random()*4294967295|0,i=Math.random()*4294967295|0;return(ve[n&255]+ve[n>>8&255]+ve[n>>16&255]+ve[n>>24&255]+"-"+ve[e&255]+ve[e>>8&255]+"-"+ve[e>>16&15|64]+ve[e>>24&255]+"-"+ve[t&63|128]+ve[t>>8&255]+"-"+ve[t>>16&255]+ve[t>>24&255]+ve[i&255]+ve[i>>8&255]+ve[i>>16&255]+ve[i>>24&255]).toLowerCase()}function Ke(n,e,t){return Math.max(e,Math.min(t,n))}function va(n,e){return(n%e+e)%e}function Ll(n,e,t,i,r){return i+(n-e)*(r-i)/(t-e)}function Vl(n,e,t){return n!==e?(t-n)/(e-n):0}function ba(n,e,t){return(1-t)*n+t*e}function jl(n,e,t,i){return ba(n,e,1-Math.exp(-t*i))}function Jl(n,e=1){return e-Math.abs(va(n,e*2)-e)}function Gl(n,e,t){return n<=e?0:n>=t?1:(n=(n-e)/(t-e),n*n*(3-2*n))}function ql(n,e,t){return n<=e?0:n>=t?1:(n=(n-e)/(t-e),n*n*n*(n*(n*6-15)+10))}function Hl(n,e){return n+Math.floor(Math.random()*(e-n+1))}function Wl(n,e){return n+Math.random()*(e-n)}function Xl(n){return n*(.5-Math.random())}function Yl(n){n!==void 0&&(ma=n);let e=ma+=1831565813;return e=Math.imul(e^e>>>15,e|1),e^=e+Math.imul(e^e>>>7,e|61),((e^e>>>14)>>>0)/4294967296}function Zl(n){return n*ya}function Ql(n){return n*ga}function Kl(n){return(n&n-1)===0&&n!==0}function $l(n){return Math.pow(2,Math.ceil(Math.log(n)/Math.LN2))}function eh(n){return Math.pow(2,Math.floor(Math.log(n)/Math.LN2))}function th(n,e,t,i,r){const s=Math.cos,o=Math.sin,l=s(t/2),a=o(t/2),c=s((e+i)/2),h=o((e+i)/2),u=s((e-i)/2),d=o((e-i)/2),p=s((i-e)/2),f=o((i-e)/2);switch(r){case"XYX":n.set(l*h,a*u,a*d,l*c);break;case"YZY":n.set(a*d,l*h,a*u,l*c);break;case"ZXZ":n.set(a*u,a*d,l*h,l*c);break;case"XZX":n.set(l*h,a*f,a*p,l*c);break;case"YXY":n.set(a*p,l*h,a*f,l*c);break;case"ZYZ":n.set(a*f,a*p,l*h,l*c);break;default:console.warn("../math.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}function ih(n,e){switch(e.constructor){case Float32Array:return n;case Uint32Array:return n/4294967295;case Uint16Array:return n/65535;case Uint8Array:return n/255;case Int32Array:return Math.max(n/2147483647,-1);case Int16Array:return Math.max(n/32767,-1);case Int8Array:return Math.max(n/127,-1);default:throw new Error("Invalid component type.")}}function nh(n,e){switch(e.constructor){case Float32Array:return n;case Uint32Array:return Math.round(n*4294967295);case Uint16Array:return Math.round(n*65535);case Uint8Array:return Math.round(n*255);case Int32Array:return Math.round(n*2147483647);case Int16Array:return Math.round(n*32767);case Int8Array:return Math.round(n*127);default:throw new Error("Invalid component type.")}}const Qt={DEG2RAD:ya,RAD2DEG:ga,generateUUID:Fl,clamp:Ke,euclideanModulo:va,mapLinear:Ll,inverseLerp:Vl,lerp:ba,damp:jl,pingpong:Jl,smoothstep:Gl,smootherstep:ql,randInt:Hl,randFloat:Wl,randFloatSpread:Xl,seededRandom:Yl,degToRad:Zl,radToDeg:Ql,isPowerOfTwo:Kl,ceilPowerOfTwo:$l,floorPowerOfTwo:eh,setQuaternionFromProperEuler:th,normalize:nh,denormalize:ih};class J{constructor(e=0,t=0,i=0,r=1){this.isQuaternion=!0,this._x=e,this._y=t,this._z=i,this._w=r}static slerpFlat(e,t,i,r,s,o,l){let a=i[r+0],c=i[r+1],h=i[r+2],u=i[r+3];const d=s[o+0],p=s[o+1],f=s[o+2],m=s[o+3];if(l===0){e[t+0]=a,e[t+1]=c,e[t+2]=h,e[t+3]=u;return}if(l===1){e[t+0]=d,e[t+1]=p,e[t+2]=f,e[t+3]=m;return}if(u!==m||a!==d||c!==p||h!==f){let g=1-l;const y=a*d+c*p+h*f+u*m,v=y>=0?1:-1,b=1-y*y;if(b>Number.EPSILON){const x=Math.sqrt(b),w=Math.atan2(x,y*v);g=Math.sin(g*w)/x,l=Math.sin(l*w)/x}const S=l*v;if(a=a*g+d*S,c=c*g+p*S,h=h*g+f*S,u=u*g+m*S,g===1-l){const x=1/Math.sqrt(a*a+c*c+h*h+u*u);a*=x,c*=x,h*=x,u*=x}}e[t]=a,e[t+1]=c,e[t+2]=h,e[t+3]=u}static multiplyQuaternionsFlat(e,t,i,r,s,o){const l=i[r],a=i[r+1],c=i[r+2],h=i[r+3],u=s[o],d=s[o+1],p=s[o+2],f=s[o+3];return e[t]=l*f+h*u+a*p-c*d,e[t+1]=a*f+h*d+c*u-l*p,e[t+2]=c*f+h*p+l*d-a*u,e[t+3]=h*f-l*u-a*d-c*p,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,i,r){return this._x=e,this._y=t,this._z=i,this._w=r,this._onChangeCallback(),this}clone(){return new J(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t=!0){const i=e._x,r=e._y,s=e._z,o=e._order,l=Math.cos,a=Math.sin,c=l(i/2),h=l(r/2),u=l(s/2),d=a(i/2),p=a(r/2),f=a(s/2);switch(o){case"XYZ":this._x=d*h*u+c*p*f,this._y=c*p*u-d*h*f,this._z=c*h*f+d*p*u,this._w=c*h*u-d*p*f;break;case"YXZ":this._x=d*h*u+c*p*f,this._y=c*p*u-d*h*f,this._z=c*h*f-d*p*u,this._w=c*h*u+d*p*f;break;case"ZXY":this._x=d*h*u-c*p*f,this._y=c*p*u+d*h*f,this._z=c*h*f+d*p*u,this._w=c*h*u-d*p*f;break;case"ZYX":this._x=d*h*u-c*p*f,this._y=c*p*u+d*h*f,this._z=c*h*f-d*p*u,this._w=c*h*u+d*p*f;break;case"YZX":this._x=d*h*u+c*p*f,this._y=c*p*u+d*h*f,this._z=c*h*f-d*p*u,this._w=c*h*u-d*p*f;break;case"XZY":this._x=d*h*u-c*p*f,this._y=c*p*u-d*h*f,this._z=c*h*f+d*p*u,this._w=c*h*u+d*p*f;break;default:console.warn("../math.Quaternion: .setFromEuler() encountered an unknown order: "+o)}return t===!0&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const i=t/2,r=Math.sin(i);return this._x=e.x*r,this._y=e.y*r,this._z=e.z*r,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,i=t[0],r=t[4],s=t[8],o=t[1],l=t[5],a=t[9],c=t[2],h=t[6],u=t[10],d=i+l+u;if(d>0){const p=.5/Math.sqrt(d+1);this._w=.25/p,this._x=(h-a)*p,this._y=(s-c)*p,this._z=(o-r)*p}else if(i>l&&i>u){const p=2*Math.sqrt(1+i-l-u);this._w=(h-a)/p,this._x=.25*p,this._y=(r+o)/p,this._z=(s+c)/p}else if(l>u){const p=2*Math.sqrt(1+l-i-u);this._w=(s-c)/p,this._x=(r+o)/p,this._y=.25*p,this._z=(a+h)/p}else{const p=2*Math.sqrt(1+u-i-l);this._w=(o-r)/p,this._x=(s+c)/p,this._y=(a+h)/p,this._z=.25*p}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let i=e.dot(t)+1;return i<Number.EPSILON?(i=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=i):(this._x=0,this._y=-e.z,this._z=e.y,this._w=i)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=i),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Ke(this.dot(e),-1,1)))}rotateTowards(e,t){const i=this.angleTo(e);if(i===0)return this;const r=Math.min(1,t/i);return this.slerp(e,r),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return e===0?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e){return this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const i=e._x,r=e._y,s=e._z,o=e._w,l=t._x,a=t._y,c=t._z,h=t._w;return this._x=i*h+o*l+r*c-s*a,this._y=r*h+o*a+s*l-i*c,this._z=s*h+o*c+i*a-r*l,this._w=o*h-i*l-r*a-s*c,this._onChangeCallback(),this}slerp(e,t){if(t===0)return this;if(t===1)return this.copy(e);const i=this._x,r=this._y,s=this._z,o=this._w;let l=o*e._w+i*e._x+r*e._y+s*e._z;if(l<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,l=-l):this.copy(e),l>=1)return this._w=o,this._x=i,this._y=r,this._z=s,this;const a=1-l*l;if(a<=Number.EPSILON){const p=1-t;return this._w=p*o+t*this._w,this._x=p*i+t*this._x,this._y=p*r+t*this._y,this._z=p*s+t*this._z,this.normalize(),this}const c=Math.sqrt(a),h=Math.atan2(c,l),u=Math.sin((1-t)*h)/c,d=Math.sin(t*h)/c;return this._w=o*u+this._w*d,this._x=i*u+this._x*d,this._y=r*u+this._y*d,this._z=s*u+this._z*d,this._onChangeCallback(),this}slerpQuaternions(e,t,i){return this.copy(e).slerp(t,i)}random(){const e=2*Math.PI*Math.random(),t=2*Math.PI*Math.random(),i=Math.random(),r=Math.sqrt(1-i),s=Math.sqrt(i);return this.set(r*Math.sin(e),r*Math.cos(e),s*Math.sin(t),s*Math.cos(t))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}toJSON(){return this.toArray()}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._w}}class B{constructor(e=0,t=0,i=0){this.isVector3=!0,B.prototype.isVector3=!0,this.x=e,this.y=t,this.z=i}set(e,t,i){return i===void 0&&(i=this.z),this.x=e,this.y=t,this.z=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new B(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return this.applyQuaternion(xa.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(xa.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,i=this.y,r=this.z,s=e.elements;return this.x=s[0]*t+s[3]*i+s[6]*r,this.y=s[1]*t+s[4]*i+s[7]*r,this.z=s[2]*t+s[5]*i+s[8]*r,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,i=this.y,r=this.z,s=e.elements,o=1/(s[3]*t+s[7]*i+s[11]*r+s[15]);return this.x=(s[0]*t+s[4]*i+s[8]*r+s[12])*o,this.y=(s[1]*t+s[5]*i+s[9]*r+s[13])*o,this.z=(s[2]*t+s[6]*i+s[10]*r+s[14])*o,this}applyQuaternion(e){const t=this.x,i=this.y,r=this.z,s=e.x,o=e.y,l=e.z,a=e.w,c=2*(o*r-l*i),h=2*(l*t-s*r),u=2*(s*i-o*t);return this.x=t+a*c+o*u-l*h,this.y=i+a*h+l*c-s*u,this.z=r+a*u+s*h-o*c,this}transformDirection(e){const t=this.x,i=this.y,r=this.z,s=e.elements;return this.x=s[0]*t+s[4]*i+s[8]*r,this.y=s[1]*t+s[5]*i+s[9]*r,this.z=s[2]*t+s[6]*i+s[10]*r,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this}cross(e){return this.crossVectors(this,e)}crossVectors(e,t){const i=e.x,r=e.y,s=e.z,o=t.x,l=t.y,a=t.z;return this.x=r*a-s*l,this.y=s*o-i*a,this.z=i*l-r*o,this}projectOnVector(e){const t=e.lengthSq();if(t===0)return this.set(0,0,0);const i=e.dot(this)/t;return this.copy(e).multiplyScalar(i)}projectOnPlane(e){return Yr.copy(this).projectOnVector(e),this.sub(Yr)}reflect(e){return this.sub(Yr.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(Ke(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y,r=this.z-e.z;return t*t+i*i+r*r}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSphericalCoords(e,t,i){const r=Math.sin(t)*e;return this.x=r*Math.sin(i),this.y=Math.cos(t)*e,this.z=r*Math.cos(i),this}setFromCylindricalCoords(e,t,i){return this.x=e*Math.sin(t),this.y=i,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),i=this.setFromMatrixColumn(e,1).length(),r=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=i,this.z=r,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,t*4)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,t*3)}setFromEuler(e){return this.x=e._x,this.y=e._y,this.z=e._z,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=Math.random()*Math.PI*2,t=Math.random()*2-1,i=Math.sqrt(1-t*t);return this.x=i*Math.cos(e),this.y=t,this.z=i*Math.sin(e),this}abs(){return this.x=Math.abs(this.x),this.y=Math.abs(this.y),this.z=Math.abs(this.z),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}const Yr=new B,xa=new J,Fn=2e3,_a=2001;class We{constructor(e,t,i,r,s,o,l,a,c,h,u,d,p,f,m,g){this.isMatrix4=!0,We.prototype.isMatrix4=!0,this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],e!==void 0&&this.set(e,t,i,r,s,o,l,a,c,h,u,d,p,f,m,g)}extractPosition(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)}multiplyToArray(e,t,i){return console.error("THREE.Matrix4: .multiplyToArray() has been removed."),this}setRotationFromQuaternion(e){return this.makeRotationFromQuaternion(e)}set(e,t,i,r,s,o,l,a,c,h,u,d,p,f,m,g){const y=this.elements;return y[0]=e,y[4]=t,y[8]=i,y[12]=r,y[1]=s,y[5]=o,y[9]=l,y[13]=a,y[2]=c,y[6]=h,y[10]=u,y[14]=d,y[3]=p,y[7]=f,y[11]=m,y[15]=g,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return new We().fromArray(this.elements)}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],t[9]=i[9],t[10]=i[10],t[11]=i[11],t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],this}copyPosition(e){const t=this.elements,i=e.elements;return t[12]=i[12],t[13]=i[13],t[14]=i[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,i){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(e,t,i){return this.set(e.x,t.x,i.x,0,e.y,t.y,i.y,0,e.z,t.z,i.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,i=e.elements,r=1/Kt.setFromMatrixColumn(e,0).length(),s=1/Kt.setFromMatrixColumn(e,1).length(),o=1/Kt.setFromMatrixColumn(e,2).length();return t[0]=i[0]*r,t[1]=i[1]*r,t[2]=i[2]*r,t[3]=0,t[4]=i[4]*s,t[5]=i[5]*s,t[6]=i[6]*s,t[7]=0,t[8]=i[8]*o,t[9]=i[9]*o,t[10]=i[10]*o,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){const t=this.elements,i=e.x,r=e.y,s=e.z,o=Math.cos(i),l=Math.sin(i),a=Math.cos(r),c=Math.sin(r),h=Math.cos(s),u=Math.sin(s);if(e.order==="XYZ"){const d=o*h,p=o*u,f=l*h,m=l*u;t[0]=a*h,t[4]=-a*u,t[8]=c,t[1]=p+f*c,t[5]=d-m*c,t[9]=-l*a,t[2]=m-d*c,t[6]=f+p*c,t[10]=o*a}else if(e.order==="YXZ"){const d=a*h,p=a*u,f=c*h,m=c*u;t[0]=d+m*l,t[4]=f*l-p,t[8]=o*c,t[1]=o*u,t[5]=o*h,t[9]=-l,t[2]=p*l-f,t[6]=m+d*l,t[10]=o*a}else if(e.order==="ZXY"){const d=a*h,p=a*u,f=c*h,m=c*u;t[0]=d-m*l,t[4]=-o*u,t[8]=f+p*l,t[1]=p+f*l,t[5]=o*h,t[9]=m-d*l,t[2]=-o*c,t[6]=l,t[10]=o*a}else if(e.order==="ZYX"){const d=o*h,p=o*u,f=l*h,m=l*u;t[0]=a*h,t[4]=f*c-p,t[8]=d*c+m,t[1]=a*u,t[5]=m*c+d,t[9]=p*c-f,t[2]=-c,t[6]=l*a,t[10]=o*a}else if(e.order==="YZX"){const d=o*a,p=o*c,f=l*a,m=l*c;t[0]=a*h,t[4]=m-d*u,t[8]=f*u+p,t[1]=u,t[5]=o*h,t[9]=-l*h,t[2]=-c*h,t[6]=p*u+f,t[10]=d-m*u}else if(e.order==="XZY"){const d=o*a,p=o*c,f=l*a,m=l*c;t[0]=a*h,t[4]=-u,t[8]=c*h,t[1]=d*u+m,t[5]=o*h,t[9]=p*u-f,t[2]=f*u-p,t[6]=l*h,t[10]=m*u+d}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(rh,e,sh)}lookAt(e,t,i){const r=this.elements;return ke.subVectors(e,t),ke.lengthSq()===0&&(ke.z=1),ke.normalize(),yt.crossVectors(i,ke),yt.lengthSq()===0&&(Math.abs(i.z)===1?ke.x+=1e-4:ke.z+=1e-4,ke.normalize(),yt.crossVectors(i,ke)),yt.normalize(),Ln.crossVectors(ke,yt),r[0]=yt.x,r[4]=Ln.x,r[8]=ke.x,r[1]=yt.y,r[5]=Ln.y,r[9]=ke.y,r[2]=yt.z,r[6]=Ln.z,r[10]=ke.z,this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,r=t.elements,s=this.elements,o=i[0],l=i[4],a=i[8],c=i[12],h=i[1],u=i[5],d=i[9],p=i[13],f=i[2],m=i[6],g=i[10],y=i[14],v=i[3],b=i[7],S=i[11],x=i[15],w=r[0],_=r[4],M=r[8],C=r[12],T=r[1],E=r[5],P=r[9],A=r[13],I=r[2],N=r[6],U=r[10],G=r[14],V=r[3],oe=r[7],ie=r[11],ee=r[15];return s[0]=o*w+l*T+a*I+c*V,s[4]=o*_+l*E+a*N+c*oe,s[8]=o*M+l*P+a*U+c*ie,s[12]=o*C+l*A+a*G+c*ee,s[1]=h*w+u*T+d*I+p*V,s[5]=h*_+u*E+d*N+p*oe,s[9]=h*M+u*P+d*U+p*ie,s[13]=h*C+u*A+d*G+p*ee,s[2]=f*w+m*T+g*I+y*V,s[6]=f*_+m*E+g*N+y*oe,s[10]=f*M+m*P+g*U+y*ie,s[14]=f*C+m*A+g*G+y*ee,s[3]=v*w+b*T+S*I+x*V,s[7]=v*_+b*E+S*N+x*oe,s[11]=v*M+b*P+S*U+x*ie,s[15]=v*C+b*A+S*G+x*ee,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[4],r=e[8],s=e[12],o=e[1],l=e[5],a=e[9],c=e[13],h=e[2],u=e[6],d=e[10],p=e[14],f=e[3],m=e[7],g=e[11],y=e[15];return f*(+s*a*u-r*c*u-s*l*d+i*c*d+r*l*p-i*a*p)+m*(+t*a*p-t*c*d+s*o*d-r*o*p+r*c*h-s*a*h)+g*(+t*c*u-t*l*p-s*o*u+i*o*p+s*l*h-i*c*h)+y*(-r*l*h-t*a*u+t*l*d+r*o*u-i*o*d+i*a*h)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,i){const r=this.elements;return e.isVector3?(r[12]=e.x,r[13]=e.y,r[14]=e.z):(r[12]=e,r[13]=t,r[14]=i),this}invert(){const e=this.elements,t=e[0],i=e[1],r=e[2],s=e[3],o=e[4],l=e[5],a=e[6],c=e[7],h=e[8],u=e[9],d=e[10],p=e[11],f=e[12],m=e[13],g=e[14],y=e[15],v=u*g*c-m*d*c+m*a*p-l*g*p-u*a*y+l*d*y,b=f*d*c-h*g*c-f*a*p+o*g*p+h*a*y-o*d*y,S=h*m*c-f*u*c+f*l*p-o*m*p-h*l*y+o*u*y,x=f*u*a-h*m*a-f*l*d+o*m*d+h*l*g-o*u*g,w=t*v+i*b+r*S+s*x;if(w===0)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const _=1/w;return e[0]=v*_,e[1]=(m*d*s-u*g*s-m*r*p+i*g*p+u*r*y-i*d*y)*_,e[2]=(l*g*s-m*a*s+m*r*c-i*g*c-l*r*y+i*a*y)*_,e[3]=(u*a*s-l*d*s-u*r*c+i*d*c+l*r*p-i*a*p)*_,e[4]=b*_,e[5]=(h*g*s-f*d*s+f*r*p-t*g*p-h*r*y+t*d*y)*_,e[6]=(f*a*s-o*g*s-f*r*c+t*g*c+o*r*y-t*a*y)*_,e[7]=(o*d*s-h*a*s+h*r*c-t*d*c-o*r*p+t*a*p)*_,e[8]=S*_,e[9]=(f*u*s-h*m*s-f*i*p+t*m*p+h*i*y-t*u*y)*_,e[10]=(o*m*s-f*l*s+f*i*c-t*m*c-o*i*y+t*l*y)*_,e[11]=(h*l*s-o*u*s-h*i*c+t*u*c+o*i*p-t*l*p)*_,e[12]=x*_,e[13]=(h*m*r-f*u*r+f*i*d-t*m*d-h*i*g+t*u*g)*_,e[14]=(f*l*r-o*m*r-f*i*a+t*m*a+o*i*g-t*l*g)*_,e[15]=(o*u*r-h*l*r+h*i*a-t*u*a-o*i*d+t*l*d)*_,this}scale(e){const t=this.elements,i=e.x,r=e.y,s=e.z;return t[0]*=i,t[4]*=r,t[8]*=s,t[1]*=i,t[5]*=r,t[9]*=s,t[2]*=i,t[6]*=r,t[10]*=s,t[3]*=i,t[7]*=r,t[11]*=s,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],r=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,r))}makeTranslation(e,t,i){return e.isVector3?this.set(1,0,0,e.x,0,1,0,e.y,0,0,1,e.z,0,0,0,1):this.set(1,0,0,e,0,1,0,t,0,0,1,i,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),i=Math.sin(e);return this.set(1,0,0,0,0,t,-i,0,0,i,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,0,i,0,0,1,0,0,-i,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,0,i,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const i=Math.cos(t),r=Math.sin(t),s=1-i,o=e.x,l=e.y,a=e.z,c=s*o,h=s*l;return this.set(c*o+i,c*l-r*a,c*a+r*l,0,c*l+r*a,h*l+i,h*a-r*o,0,c*a-r*l,h*a+r*o,s*a*a+i,0,0,0,0,1),this}makeScale(e,t,i){return this.set(e,0,0,0,0,t,0,0,0,0,i,0,0,0,0,1),this}makeShear(e,t,i,r,s,o){return this.set(1,i,s,0,e,1,o,0,t,r,1,0,0,0,0,1),this}compose(e,t,i){const r=this.elements,s=t._x,o=t._y,l=t._z,a=t._w,c=s+s,h=o+o,u=l+l,d=s*c,p=s*h,f=s*u,m=o*h,g=o*u,y=l*u,v=a*c,b=a*h,S=a*u,x=i.x,w=i.y,_=i.z;return r[0]=(1-(m+y))*x,r[1]=(p+S)*x,r[2]=(f-b)*x,r[3]=0,r[4]=(p-S)*w,r[5]=(1-(d+y))*w,r[6]=(g+v)*w,r[7]=0,r[8]=(f+b)*_,r[9]=(g-v)*_,r[10]=(1-(d+m))*_,r[11]=0,r[12]=e.x,r[13]=e.y,r[14]=e.z,r[15]=1,this}decompose(e,t,i){const r=this.elements;let s=Kt.set(r[0],r[1],r[2]).length();const o=Kt.set(r[4],r[5],r[6]).length(),l=Kt.set(r[8],r[9],r[10]).length();this.determinant()<0&&(s=-s),e.x=r[12],e.y=r[13],e.z=r[14],qe.copy(this);const a=1/s,c=1/o,h=1/l;return qe.elements[0]*=a,qe.elements[1]*=a,qe.elements[2]*=a,qe.elements[4]*=c,qe.elements[5]*=c,qe.elements[6]*=c,qe.elements[8]*=h,qe.elements[9]*=h,qe.elements[10]*=h,t.setFromRotationMatrix(qe),i.x=s,i.y=o,i.z=l,this}makePerspective(e,t,i,r,s,o,l=Fn){const a=this.elements,c=2*s/(t-e),h=2*s/(i-r),u=(t+e)/(t-e),d=(i+r)/(i-r);let p,f;if(l===Fn)p=-(o+s)/(o-s),f=-2*o*s/(o-s);else if(l===_a)p=-o/(o-s),f=-o*s/(o-s);else throw new Error("Matrix4.makePerspective(): Invalid coordinate system: "+l);return a[0]=c,a[4]=0,a[8]=u,a[12]=0,a[1]=0,a[5]=h,a[9]=d,a[13]=0,a[2]=0,a[6]=0,a[10]=p,a[14]=f,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(e,t,i,r,s,o,l=Fn){const a=this.elements,c=1/(t-e),h=1/(i-r),u=1/(o-s),d=(t+e)*c,p=(i+r)*h;let f,m;if(l===Fn)f=(o+s)*u,m=-2*u;else if(l===_a)f=s*u,m=-1*u;else throw new Error("../math.Matrix4.makeOrthographic(): Invalid coordinate system: "+l);return a[0]=2*c,a[4]=0,a[8]=0,a[12]=-d,a[1]=0,a[5]=2*h,a[9]=0,a[13]=-p,a[2]=0,a[6]=0,a[10]=m,a[14]=-f,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(e){const t=this.elements,i=e.elements;for(let r=0;r<16;r++)if(t[r]!==i[r])return!1;return!0}fromArray(e,t=0){for(let i=0;i<16;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e[t+9]=i[9],e[t+10]=i[10],e[t+11]=i[11],e[t+12]=i[12],e[t+13]=i[13],e[t+14]=i[14],e[t+15]=i[15],e}}const Kt=new B,qe=new We,rh=new B(0,0,0),sh=new B(1,1,1),yt=new B,Ln=new B,ke=new B,Sa=new We,wa=new J;class Hi{constructor(e=0,t=0,i=0,r=Hi.DEFAULT_ORDER){this.isEuler=!0,this._x=e,this._y=t,this._z=i,this._order=r}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,i,r=this._order){return this._x=e,this._y=t,this._z=i,this._order=r,this._onChangeCallback(),this}clone(){return new Hi(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,i=!0){const r=e.elements,s=r[0],o=r[4],l=r[8],a=r[1],c=r[5],h=r[9],u=r[2],d=r[6],p=r[10];switch(t){case"XYZ":this._y=Math.asin(Ke(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(-h,p),this._z=Math.atan2(-o,s)):(this._x=Math.atan2(d,c),this._z=0);break;case"YXZ":this._x=Math.asin(-Ke(h,-1,1)),Math.abs(h)<.9999999?(this._y=Math.atan2(l,p),this._z=Math.atan2(a,c)):(this._y=Math.atan2(-u,s),this._z=0);break;case"ZXY":this._x=Math.asin(Ke(d,-1,1)),Math.abs(d)<.9999999?(this._y=Math.atan2(-u,p),this._z=Math.atan2(-o,c)):(this._y=0,this._z=Math.atan2(a,s));break;case"ZYX":this._y=Math.asin(-Ke(u,-1,1)),Math.abs(u)<.9999999?(this._x=Math.atan2(d,p),this._z=Math.atan2(a,s)):(this._x=0,this._z=Math.atan2(-o,c));break;case"YZX":this._z=Math.asin(Ke(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-h,c),this._y=Math.atan2(-u,s)):(this._x=0,this._y=Math.atan2(l,p));break;case"XZY":this._z=Math.asin(-Ke(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(d,c),this._y=Math.atan2(l,s)):(this._x=Math.atan2(-h,p),this._y=0);break;default:console.warn("../math.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,i===!0&&this._onChangeCallback(),this}setFromQuaternion(e,t,i){return Sa.makeRotationFromQuaternion(e),this.setFromRotationMatrix(Sa,t,i)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return wa.setFromEuler(this),this.setFromQuaternion(wa,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],e[3]!==void 0&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(e){}*[Symbol.iterator](){yield this._x,yield this._y,yield this._z,yield this._order}}Hi.DEFAULT_ORDER="XYZ";class hi{constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new hi(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e){return this.x+=e.x,this.y+=e.y,this}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,i=this.y,r=e.elements;return this.x=r[0]*t+r[3]*i+r[6],this.y=r[1]*t+r[4]*i+r[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(t===0)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(Ke(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y;return t*t+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}rotateAround(e,t){const i=Math.cos(t),r=Math.sin(t),s=this.x-e.x,o=this.y-e.y;return this.x=s*i-o*r+e.x,this.y=s*r+o*i+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}hi.isVector2=!0;class Ee{constructor(e=0,t=0,i=0,r=1){Ee.prototype.isVector4=!0,this.x=e,this.y=t,this.z=i,this.w=r}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,i,r){return this.x=e,this.y=t,this.z=i,this.w=r,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new Ee(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=e.w,this}add(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e){return this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,i=this.y,r=this.z,s=this.w,o=e.elements;return this.x=o[0]*t+o[4]*i+o[8]*r+o[12]*s,this.y=o[1]*t+o[5]*i+o[9]*r+o[13]*s,this.z=o[2]*t+o[6]*i+o[10]*r+o[14]*s,this.w=o[3]*t+o[7]*i+o[11]*r+o[15]*s,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,i,r,s;const o=e.elements,l=o[0],a=o[4],c=o[8],h=o[1],u=o[5],d=o[9],p=o[2],f=o[6],m=o[10];if(Math.abs(a-h)<.01&&Math.abs(c-p)<.01&&Math.abs(d-f)<.01){if(Math.abs(a+h)<.1&&Math.abs(c+p)<.1&&Math.abs(d+f)<.1&&Math.abs(l+u+m-3)<.1)return this.set(1,0,0,0),this;t=Math.PI;const y=(l+1)/2,v=(u+1)/2,b=(m+1)/2,S=(a+h)/4,x=(c+p)/4,w=(d+f)/4;return y>v&&y>b?y<.01?(i=0,r=.707106781,s=.707106781):(i=Math.sqrt(y),r=S/i,s=x/i):v>b?v<.01?(i=.707106781,r=0,s=.707106781):(r=Math.sqrt(v),i=S/r,s=w/r):b<.01?(i=.707106781,r=.707106781,s=0):(s=Math.sqrt(b),i=x/s,r=w/s),this.set(i,r,s,t),this}let g=Math.sqrt((f-d)*(f-d)+(c-p)*(c-p)+(h-a)*(h-a));return Math.abs(g)<.001&&(g=1),this.x=(f-d)/g,this.y=(c-p)/g,this.z=(h-a)/g,this.w=Math.acos((l+u+m-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=Math.trunc(this.x),this.y=Math.trunc(this.y),this.z=Math.trunc(this.z),this.w=Math.trunc(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this.w=e.w+(t.w-e.w)*i,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}class tt{constructor(e,t,i,r,s,o,l,a,c){tt.prototype.isMatrix3=!0,this.elements=[1,0,0,0,1,0,0,0,1],e!==void 0&&this.set(e,t,i,r,s,o,l,a,c)}set(e,t,i,r,s,o,l,a,c){const h=this.elements;return h[0]=e,h[1]=r,h[2]=l,h[3]=t,h[4]=s,h[5]=a,h[6]=i,h[7]=o,h[8]=c,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],this}extractBasis(e,t,i){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,r=t.elements,s=this.elements,o=i[0],l=i[3],a=i[6],c=i[1],h=i[4],u=i[7],d=i[2],p=i[5],f=i[8],m=r[0],g=r[3],y=r[6],v=r[1],b=r[4],S=r[7],x=r[2],w=r[5],_=r[8];return s[0]=o*m+l*v+a*x,s[3]=o*g+l*b+a*w,s[6]=o*y+l*S+a*_,s[1]=c*m+h*v+u*x,s[4]=c*g+h*b+u*w,s[7]=c*y+h*S+u*_,s[2]=d*m+p*v+f*x,s[5]=d*g+p*b+f*w,s[8]=d*y+p*S+f*_,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[1],r=e[2],s=e[3],o=e[4],l=e[5],a=e[6],c=e[7],h=e[8];return t*o*h-t*l*c-i*s*h+i*l*a+r*s*c-r*o*a}invert(){const e=this.elements,t=e[0],i=e[1],r=e[2],s=e[3],o=e[4],l=e[5],a=e[6],c=e[7],h=e[8],u=h*o-l*c,d=l*a-h*s,p=c*s-o*a,f=t*u+i*d+r*p;if(f===0)return this.set(0,0,0,0,0,0,0,0,0);const m=1/f;return e[0]=u*m,e[1]=(r*c-h*i)*m,e[2]=(l*i-r*o)*m,e[3]=d*m,e[4]=(h*t-r*a)*m,e[5]=(r*s-l*t)*m,e[6]=p*m,e[7]=(i*a-c*t)*m,e[8]=(o*t-i*s)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,i,r,s,o,l){const a=Math.cos(s),c=Math.sin(s);return this.set(i*a,i*c,-i*(a*o+c*l)+o+e,-r*c,r*a,-r*(-c*o+a*l)+l+t,0,0,1),this}scale(e,t){return this.premultiply(Zr.makeScale(e,t)),this}rotate(e){return this.premultiply(Zr.makeRotation(-e)),this}translate(e,t){return this.premultiply(Zr.makeTranslation(e,t)),this}makeTranslation(e,t){return e.isVector2?this.set(1,0,e.x,0,1,e.y,0,0,1):this.set(1,0,e,0,1,t,0,0,1),this}makeRotation(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,i,t,0,0,0,1),this}makeScale(e,t){return this.set(e,0,0,0,t,0,0,0,1),this}equals(e){const t=this.elements,i=e.elements;for(let r=0;r<9;r++)if(t[r]!==i[r])return!1;return!0}fromArray(e,t=0){for(let i=0;i<9;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e}clone(){return new tt().fromArray(this.elements)}}const Zr=new tt;var Se;(function(n){n[n.Random=0]="Random",n[n.Loop=1]="Loop",n[n.PingPong=2]="PingPong",n[n.Burst=3]="Burst"})(Se||(Se={}));function Ci(n,e,t,i){let r;switch(Se.Random===n?e=Math.random():Se.Burst===n&&i.isBursting&&(e=i.burstParticleIndex/i.burstParticleCount),t>0?r=Math.floor(e/t)*t:r=e,n){case Se.Loop:r=r%1;break;case Se.PingPong:r=Math.abs(r%2-1);break}return r}class Jt{constructor(e,t,i,r){this.p=[e,t,i,r]}genValue(e){const t=e*e,i=e*e*e,r=1-e,s=r*r,o=s*r;return this.p[0]*o+this.p[1]*s*e*3+this.p[2]*r*t*3+this.p[3]*i}derivativeCoefficients(e){const t=[];for(let i=e,r=i.length-1;r>0;r--){const s=[];for(let o=0;o<r;o++){const l=r*(i[o+1]-i[o]);s.push(l)}t.push(s),i=s}return t}getSlope(e){const t=this.derivativeCoefficients(this.p)[0],i=1-e,r=i*i,s=i*e*2,o=e*e;return r*t[0]+s*t[1]+o*t[2]}controlCurve(e,t){this.p[1]=e/3+this.p[0],this.p[2]=this.p[3]-t/3}hull(e){let t=this.p,i=[],r,s=0,o=0,l=0;const a=[];for(a[s++]=t[0],a[s++]=t[1],a[s++]=t[2],a[s++]=t[3];t.length>1;){for(i=[],o=0,l=t.length-1;o<l;o++)r=e*t[o]+(1-e)*t[o+1],a[s++]=r,i.push(r);t=i}return a}split(e){const t=this.hull(e);return{left:new Jt(t[0],t[4],t[7],t[9]),right:new Jt(t[9],t[8],t[6],t[3]),span:t}}clone(){return new Jt(this.p[0],this.p[1],this.p[2],this.p[3])}toJSON(){return{p0:this.p[0],p1:this.p[1],p2:this.p[2],p3:this.p[3]}}static fromJSON(e){return new Jt(e.p0,e.p1,e.p2,e.p3)}}const Pi=n=>({r:n.x,g:n.y,b:n.z,a:n.w}),Ei=n=>new Ee(n.r,n.g,n.b,n.a),oh=(n,e)=>{switch(e){case"Vector3":return new B(n.x,n.y,n.z);case"Vector4":return new Ee(n.x,n.y,n.z,n.w);case"Color":return new B(n.r,n.g,n.b);case"Number":return n;default:return n}},ah=(n,e)=>{switch(e){case"Vector3":return{x:n.x,y:n.y,z:n.z};case"Vector4":return{x:n.x,y:n.y,z:n.z,w:n.w};case"Color":return{r:n.x,g:n.y,b:n.z};case"Number":return n;default:return n}};class br{constructor(e,t){this.a=e,this.b=t,this.type="value"}startGen(e){}genColor(e,t){const i=Math.random();return t.copy(this.a).lerp(this.b,i)}toJSON(){return{type:"RandomColor",a:Pi(this.a),b:Pi(this.b)}}static fromJSON(e){return new br(Ei(e.a),Ei(e.b))}clone(){return new br(this.a.clone(),this.b.clone())}}class ui{constructor(e,t){this.a=e,this.b=t,this.indexCount=-1,this.type="value"}startGen(e){this.indexCount=e.length,e.push(Math.random())}genColor(e,t){return this.indexCount===-1&&this.startGen(e),t.copy(this.a).lerp(this.b,e[this.indexCount])}toJSON(){return{type:"ColorRange",a:Pi(this.a),b:Pi(this.b)}}static fromJSON(e){return new ui(Ei(e.a),Ei(e.b))}clone(){return new ui(this.a.clone(),this.b.clone())}}class Mt{constructor(e,t){this.subType=t,this.type="function",this.keys=e}findKey(e){let t=0,i=0,r=this.keys.length-1;for(;i+1<r;)if(t=Math.floor((i+r)/2),e<this.getStartX(t))r=t-1;else if(e>this.getEndX(t))i=t+1;else return t;for(let s=i;s<=r;s++)if(e>=this.getStartX(s)&&e<=this.getEndX(s))return s;return-1}getStartX(e){return this.keys[e][1]}getEndX(e){return e+1<this.keys.length?this.keys[e+1][1]:1}genValue(e,t){const i=this.findKey(t);return this.subType==="Number"?i===-1?this.keys[0][0]:i+1>=this.keys.length?this.keys[this.keys.length-1][0]:(this.keys[i+1][0]-this.keys[i][0])*((t-this.getStartX(i))/(this.getEndX(i)-this.getStartX(i)))+this.keys[i][0]:i===-1?e.copy(this.keys[0][0]):i+1>=this.keys.length?e.copy(this.keys[this.keys.length-1][0]):e.copy(this.keys[i][0]).lerp(this.keys[i+1][0],(t-this.getStartX(i))/(this.getEndX(i)-this.getStartX(i)))}toJSON(){return this.keys[0][0].constructor.name,{type:"CLinearFunction",subType:this.subType,keys:this.keys.map(([e,t])=>({value:ah(e,this.subType),pos:t}))}}static fromJSON(e){return new Mt(e.keys.map(t=>[oh(t.value,e.subType),t.pos]),e.subType)}clone(){return this.subType==="Number"?new Mt(this.keys.map(([e,t])=>[e,t]),this.subType):new Mt(this.keys.map(([e,t])=>[e.clone(),t]),this.subType)}}const Vn=new B;class Wt{constructor(e=[[new B(0,0,0),0],[new B(1,1,1),0]],t=[[1,0],[1,1]]){this.type="function",this.color=new Mt(e,"Color"),this.alpha=new Mt(t,"Number")}genColor(e,t,i){return this.color.genValue(Vn,i),t.set(Vn.x,Vn.y,Vn.z,this.alpha.genValue(1,i))}toJSON(){return{type:"Gradient",color:this.color.toJSON(),alpha:this.alpha.toJSON()}}static fromJSON(e){if(e.functions){const t=e.functions.map(i=>[ui.fromJSON(i.function).a,i.start]);return e.functions.length>0&&t.push([ui.fromJSON(e.functions[e.functions.length-1].function).b,1]),new Wt(t.map(i=>[new B(i[0].x,i[0].y,i[0].z),i[1]]),t.map(i=>[i[0].w,i[1]]))}else{const t=new Wt;return t.alpha=Mt.fromJSON(e.alpha),t.color=Mt.fromJSON(e.color),t}}clone(){const e=new Wt;return e.alpha=this.alpha.clone(),e.color=this.color.clone(),e}startGen(e){}}const Qr=new Ee;class xr{constructor(e,t){this.indexCount=0,this.type="function",this.gradient1=e,this.gradient2=t}startGen(e){this.indexCount=e.length,e.push(Math.random())}genColor(e,t,i){return this.gradient1.genColor(e,t,i),this.gradient2.genColor(e,Qr,i),e&&e[this.indexCount]!==void 0?t.lerp(Qr,e[this.indexCount]):t.lerp(Qr,Math.random()),t}toJSON(){return{type:"RandomColorBetweenGradient",gradient1:this.gradient1.toJSON(),gradient2:this.gradient2.toJSON()}}static fromJSON(e){return new xr(Wt.fromJSON(e.gradient1),Wt.fromJSON(e.gradient2))}clone(){return new xr(this.gradient1.clone(),this.gradient2.clone())}}class Gt{constructor(e){this.color=e,this.type="value"}startGen(e){}genColor(e,t){return t.copy(this.color)}toJSON(){return{type:"ConstantColor",color:Pi(this.color)}}static fromJSON(e){return new Gt(Ei(e.color))}clone(){return new Gt(this.color.clone())}}function Kr(n){switch(n.type){case"ConstantColor":return Gt.fromJSON(n);case"ColorRange":return ui.fromJSON(n);case"RandomColor":return br.fromJSON(n);case"Gradient":return Wt.fromJSON(n);case"RandomColorBetweenGradient":return xr.fromJSON(n);default:return new Gt(new Ee(1,1,1,1))}}class L{constructor(e){this.value=e,this.type="value"}startGen(e){}genValue(e){return this.value}toJSON(){return{type:"ConstantValue",value:this.value}}static fromJSON(e){return new L(e.value)}clone(){return new L(this.value)}}class qt{constructor(e,t){this.a=e,this.b=t,this.indexCount=-1,this.type="value"}startGen(e){this.indexCount=e.length,e.push(Math.random())}genValue(e){return this.indexCount===-1&&this.startGen(e),Qt.lerp(this.a,this.b,e[this.indexCount])}toJSON(){return{type:"IntervalValue",a:this.a,b:this.b}}static fromJSON(e){return new qt(e.a,e.b)}clone(){return new qt(this.a,this.b)}}class ch{constructor(){this.functions=new Array}findFunction(e){let t=0,i=0,r=this.functions.length-1;for(;i+1<r;)if(t=Math.floor((i+r)/2),e<this.getStartX(t))r=t-1;else if(e>this.getEndX(t))i=t+1;else return t;for(let s=i;s<=r;s++)if(e>=this.functions[s][1]&&e<=this.getEndX(s))return s;return-1}getStartX(e){return this.functions[e][1]}setStartX(e,t){e>0&&(this.functions[e][1]=t)}getEndX(e){return e+1<this.functions.length?this.functions[e+1][1]:1}setEndX(e,t){e+1<this.functions.length&&(this.functions[e+1][1]=t)}insertFunction(e,t){const i=this.findFunction(e);this.functions.splice(i+1,0,[t,e])}removeFunction(e){return this.functions.splice(e,1)[0][0]}getFunction(e){return this.functions[e][0]}setFunction(e,t){this.functions[e][0]=t}get numOfFunctions(){return this.functions.length}}class Wi extends ch{constructor(e=[[new Jt(0,1/3,1/3*2,1),0]]){super(),this.type="function",this.functions=e}genValue(e,t=0){const i=this.findFunction(t);return i===-1?0:this.functions[i][0].genValue((t-this.getStartX(i))/(this.getEndX(i)-this.getStartX(i)))}toSVG(e,t){if(t<1)return"";let i=["M",0,this.functions[0][0].p[0]].join(" ");for(let r=1/t;r<=1;r+=1/t)i=[i,"L",r*e,this.genValue(void 0,r)].join(" ");return i}toJSON(){return{type:"PiecewiseBezier",functions:this.functions.map(([e,t])=>({function:e.toJSON(),start:t}))}}static fromJSON(e){return new Wi(e.functions.map(t=>[Jt.fromJSON(t.function),t.start]))}clone(){return new Wi(this.functions.map(([e,t])=>[e.clone(),t]))}startGen(e){}}function D(n){switch(n.type){case"ConstantValue":return L.fromJSON(n);case"IntervalValue":return qt.fromJSON(n);case"PiecewiseBezier":return Wi.fromJSON(n);default:return new L(0)}}class Xi{constructor(){this.indexCount=0,this.type="rotation"}startGen(e){this.indexCount=e.length,e.push(new J);let t,i,r,s,o,l;do t=Math.random()*2-1,i=Math.random()*2-1,r=t*t+i*i;while(r>1);do s=Math.random()*2-1,o=Math.random()*2-1,l=s*s+o*o;while(l>1);const a=Math.sqrt((1-r)/l);e[this.indexCount].set(t,i,a*s,a*o)}genValue(e,t,i,r){return this.indexCount===-1&&this.startGen(e),t.copy(e[this.indexCount]),t}toJSON(){return{type:"RandomQuat"}}static fromJSON(e){return new Xi}clone(){return new Xi}}class Yi{constructor(e,t){this.axis=e,this.angle=t,this.type="rotation"}startGen(e){this.angle.startGen(e)}genValue(e,t,i,r){return t.setFromAxisAngle(this.axis,this.angle.genValue(e,r)*i)}toJSON(){return{type:"AxisAngle",axis:{x:this.axis.x,y:this.axis.y,z:this.axis.z},angle:this.angle.toJSON()}}static fromJSON(e){return new Yi(new B(e.axis.x,e.axis.y,e.axis.z),D(e.angle))}clone(){return new Yi(this.axis.clone(),this.angle.clone())}}class _r{constructor(e,t,i,r){this.angleX=e,this.angleY=t,this.angleZ=i,this.type="rotation",this.eular=new Hi(0,0,0,r)}startGen(e){this.angleX.startGen(e),this.angleY.startGen(e),this.angleZ.startGen(e)}genValue(e,t,i,r){return this.eular.set(this.angleX.genValue(e,r)*i,this.angleY.genValue(e,r)*i,this.angleZ.genValue(e,r)*i),t.setFromEuler(this.eular)}toJSON(){return{type:"Euler",angleX:this.angleX.toJSON(),angleY:this.angleY.toJSON(),angleZ:this.angleZ.toJSON(),eulerOrder:this.eular.order}}static fromJSON(e){return new _r(D(e.angleX),D(e.angleY),D(e.angleZ),e.eulerOrder)}clone(){return new _r(this.angleX,this.angleY,this.angleZ,this.eular.order)}}function Ma(n){switch(n.type){case"AxisAngle":return Yi.fromJSON(n);case"Euler":return _r.fromJSON(n);case"RandomQuat":return Xi.fromJSON(n);default:return new Xi}}class Ht{constructor(e,t,i){this.x=e,this.y=t,this.z=i,this.type="vec3function"}startGen(e){this.x.startGen(e),this.y.startGen(e),this.z.startGen(e)}genValue(e,t,i){return t.set(this.x.genValue(e,i),this.y.genValue(e,i),this.z.genValue(e,i))}toJSON(){return{type:"Vector3Function",x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(e){return new Ht(D(e.x),D(e.y),D(e.z))}clone(){return new Ht(this.x,this.y,this.z)}}function lh(n){switch(n.type){case"Vector3Function":return Ht.fromJSON(n);default:return new Ht(new L(0),new L(0),new L(0))}}function jn(n){switch(n.type){case"ConstantValue":case"IntervalValue":case"PiecewiseBezier":return D(n);case"AxisAngle":case"RandomQuat":case"Euler":return Ma(n);case"Vector3Function":return lh(n);default:return new L(0)}}class Zi{constructor(e={}){var t,i,r,s,o,l,a;this.type="cone",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(r=e.thickness)!==null&&r!==void 0?r:1,this.angle=(s=e.angle)!==null&&s!==void 0?s:Math.PI/6,this.mode=(o=e.mode)!==null&&o!==void 0?o:Se.Random,this.spread=(l=e.spread)!==null&&l!==void 0?l:0,this.speed=(a=e.speed)!==null&&a!==void 0?a:new L(1),this.memory=[]}update(e,t){Se.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Ci(this.mode,this.currentValue,this.spread,t),r=Qt.lerp(1-this.thickness,1,Math.random()),s=i*this.arc,o=Math.sqrt(r),l=Math.sin(s),a=Math.cos(s);e.position.x=o*a,e.position.y=o*l,e.position.z=0;const c=this.angle*o;e.velocity.set(0,0,Math.cos(c)).addScaledVector(e.position,Math.sin(c)).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius)}toJSON(){return{type:"cone",radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new Zi({radius:e.radius,arc:e.arc,thickness:e.thickness,angle:e.angle,mode:e.mode,speed:e.speed?D(e.speed):void 0,spread:e.spread})}clone(){return new Zi({radius:this.radius,arc:this.arc,thickness:this.thickness,angle:this.angle,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class Qi{constructor(e={}){var t,i,r,s,o,l;this.type="circle",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(r=e.thickness)!==null&&r!==void 0?r:1,this.mode=(s=e.mode)!==null&&s!==void 0?s:Se.Random,this.spread=(o=e.spread)!==null&&o!==void 0?o:0,this.speed=(l=e.speed)!==null&&l!==void 0?l:new L(1),this.memory=[]}update(e,t){this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t}initialize(e,t){const i=Ci(this.mode,this.currentValue,this.spread,t),r=Qt.lerp(1-this.thickness,1,Math.random()),s=i*this.arc;e.position.x=Math.cos(s),e.position.y=Math.sin(s),e.position.z=0,e.velocity.copy(e.position).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius*r)}toJSON(){return{type:"circle",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new Qi({radius:e.radius,arc:e.arc,thickness:e.thickness,mode:e.mode,speed:e.speed?D(e.speed):void 0,spread:e.spread})}clone(){return new Qi({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}function Jn(n,e){return Math.floor(Math.random()*(e-n))+n}const Gn=new B(0,1,0),qn=new B(0,0,0),hh=new B(1,1,1),Ta=new B(0,0,1);class Ki{constructor(e={}){var t,i,r,s,o,l,a;this.type="donut",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(r=e.thickness)!==null&&r!==void 0?r:1,this.donutRadius=(s=e.donutRadius)!==null&&s!==void 0?s:this.radius*.2,this.mode=(o=e.mode)!==null&&o!==void 0?o:Se.Random,this.spread=(l=e.spread)!==null&&l!==void 0?l:0,this.speed=(a=e.speed)!==null&&a!==void 0?a:new L(1),this.memory=[],this._m1=new We}update(e,t){Se.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Ci(this.mode,this.currentValue,this.spread,t),r=Math.random(),s=Qt.lerp(1-this.thickness,1,Math.random()),o=i*this.arc,l=r*Math.PI*2,a=Math.sin(o),c=Math.cos(o);e.position.x=this.radius*c,e.position.y=this.radius*a,e.position.z=0,e.velocity.z=this.donutRadius*s*Math.sin(l),e.velocity.x=this.donutRadius*s*Math.cos(l)*c,e.velocity.y=this.donutRadius*s*Math.cos(l)*a,e.position.add(e.velocity),e.velocity.normalize().multiplyScalar(e.startSpeed),e.rotation instanceof J&&(this._m1.lookAt(qn,e.velocity,Gn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"donut",radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new Ki({radius:e.radius,arc:e.arc,thickness:e.thickness,donutRadius:e.donutRadius,mode:e.mode,speed:e.speed?D(e.speed):void 0,spread:e.spread})}clone(){return new Ki({radius:this.radius,arc:this.arc,thickness:this.thickness,donutRadius:this.donutRadius,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class $i{constructor(){this.type="point",this._m1=new We}update(e,t){}initialize(e){const t=Math.random(),i=Math.random(),r=t*Math.PI*2,s=Math.acos(2*i-1),o=Math.cbrt(Math.random()),l=Math.sin(r),a=Math.cos(r),c=Math.sin(s),h=Math.cos(s);e.velocity.x=o*c*a,e.velocity.y=o*c*l,e.velocity.z=o*h,e.velocity.multiplyScalar(e.startSpeed),e.position.setScalar(0),e.rotation instanceof J&&(this._m1.lookAt(qn,e.position,Gn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"point"}}static fromJSON(e){return new $i}clone(){return new $i}}class di{constructor(e={}){var t,i,r,s,o,l;this.type="sphere",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(r=e.thickness)!==null&&r!==void 0?r:1,this.mode=(s=e.mode)!==null&&s!==void 0?s:Se.Random,this.spread=(o=e.spread)!==null&&o!==void 0?o:0,this.speed=(l=e.speed)!==null&&l!==void 0?l:new L(1),this.memory=[],this._m1=new We}update(e,t){Se.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Ci(this.mode,this.currentValue,this.spread,t),r=Math.random(),s=Qt.lerp(1-this.thickness,1,Math.random()),o=i*this.arc,l=Math.acos(2*r-1),a=Math.sin(o),c=Math.cos(o),h=Math.sin(l),u=Math.cos(l);e.position.x=h*c,e.position.y=h*a,e.position.z=u,e.velocity.copy(e.position).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius*s),e.rotation instanceof J&&(this._m1.lookAt(qn,e.position,Gn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"sphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new di({radius:e.radius,arc:e.arc,thickness:e.thickness,mode:e.mode,speed:e.speed?D(e.speed):void 0,spread:e.spread})}clone(){return new di({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class en{constructor(e={}){var t,i,r,s,o,l;this.type="sphere",this.currentValue=0,this.radius=(t=e.radius)!==null&&t!==void 0?t:10,this.arc=(i=e.arc)!==null&&i!==void 0?i:2*Math.PI,this.thickness=(r=e.thickness)!==null&&r!==void 0?r:1,this.mode=(s=e.mode)!==null&&s!==void 0?s:Se.Random,this.spread=(o=e.spread)!==null&&o!==void 0?o:0,this.speed=(l=e.speed)!==null&&l!==void 0?l:new L(1),this.memory=[],this._m1=new We}update(e,t){Se.Random!=this.mode&&(this.currentValue+=this.speed.genValue(this.memory,e.emissionState.time/e.duration)*t)}initialize(e,t){const i=Ci(this.mode,this.currentValue,this.spread,t),r=Math.random(),s=Qt.lerp(1-this.thickness,1,Math.random()),o=i*this.arc,l=Math.acos(r),a=Math.sin(o),c=Math.cos(o),h=Math.sin(l),u=Math.cos(l);e.position.x=h*c,e.position.y=h*a,e.position.z=u,e.velocity.copy(e.position).multiplyScalar(e.startSpeed),e.position.multiplyScalar(this.radius*s),e.rotation instanceof J&&(this._m1.lookAt(qn,e.position,Gn),e.rotation.setFromRotationMatrix(this._m1))}toJSON(){return{type:"hemisphere",radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,spread:this.spread,speed:this.speed.toJSON()}}static fromJSON(e){return new en({radius:e.radius,arc:e.arc,thickness:e.thickness,mode:e.mode,speed:e.speed?D(e.speed):void 0,spread:e.spread})}clone(){return new en({radius:this.radius,arc:this.arc,thickness:this.thickness,mode:this.mode,speed:this.speed.clone(),spread:this.spread})}}class tn{constructor(e={}){var t,i,r,s;this.type="grid",this.width=(t=e.width)!==null&&t!==void 0?t:1,this.height=(i=e.height)!==null&&i!==void 0?i:1,this.column=(r=e.column)!==null&&r!==void 0?r:10,this.row=(s=e.row)!==null&&s!==void 0?s:10}initialize(e){const t=Math.floor(Math.random()*this.row),i=Math.floor(Math.random()*this.column);e.position.x=i*this.width/this.column-this.width/2,e.position.y=t*this.height/this.row-this.height/2,e.position.z=0,e.velocity.set(0,0,e.startSpeed)}toJSON(){return{type:"grid",width:this.width,height:this.height,column:this.column,row:this.row}}static fromJSON(e){return new tn(e)}clone(){return new tn({width:this.width,height:this.height,column:this.column,row:this.row})}update(e,t){}}const $r={circle:{type:"circle",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:Qi,loadJSON:Qi.fromJSON},cone:{type:"cone",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:Zi,loadJSON:Zi.fromJSON},donut:{type:"donut",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["donutRadius",["number"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:Ki,loadJSON:Ki.fromJSON},point:{type:"point",params:[],constructor:$i,loadJSON:$i.fromJSON},sphere:{type:"sphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:di,loadJSON:di.fromJSON},hemisphere:{type:"hemisphere",params:[["radius",["number"]],["arc",["radian"]],["thickness",["number"]],["angle",["radian"]],["mode",["emitterMode"]],["spread",["number"]],["speed",["valueFunc"]]],constructor:en,loadJSON:en.fromJSON},grid:{type:"grid",params:[["width",["number"]],["height",["number"]],["rows",["number"]],["column",["number"]]],constructor:tn,loadJSON:tn.fromJSON}};function uh(n,e){return $r[n.type].loadJSON(n,e)}class nn{constructor(e){this.color=e,this.type="ColorOverLife"}initialize(e){this.color.startGen(e.memory)}update(e,t){this.color.genColor(e.memory,e.color,e.age/e.life),e.color.x*=e.startColor.x,e.color.y*=e.startColor.y,e.color.z*=e.startColor.z,e.color.w*=e.startColor.w}frameUpdate(e){}toJSON(){return{type:this.type,color:this.color.toJSON()}}static fromJSON(e){return new nn(Kr(e.color))}clone(){return new nn(this.color.clone())}reset(){}}class rn{constructor(e){this.angularVelocity=e,this.type="RotationOverLife"}initialize(e){typeof e.rotation=="number"&&this.angularVelocity.startGen(e.memory)}update(e,t){typeof e.rotation=="number"&&(e.rotation+=t*this.angularVelocity.genValue(e.memory,e.age/e.life))}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(e){return new rn(D(e.angularVelocity))}frameUpdate(e){}clone(){return new rn(this.angularVelocity.clone())}reset(){}}class sn{constructor(e){this.angularVelocity=e,this.type="Rotation3DOverLife",this.tempQuat=new J,this.tempQuat2=new J}initialize(e){e.rotation instanceof J&&(e.angularVelocity=new J,this.angularVelocity.startGen(e.memory))}update(e,t){e.rotation instanceof J&&(this.angularVelocity.genValue(e.memory,this.tempQuat,t,e.age/e.life),e.rotation.multiply(this.tempQuat))}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON()}}static fromJSON(e){return new sn(Ma(e.angularVelocity))}frameUpdate(e){}clone(){return new sn(this.angularVelocity.clone())}reset(){}}class on{initialize(e,t){this.ps=t,this.x.startGen(e.memory),this.y.startGen(e.memory),this.z.startGen(e.memory)}constructor(e,t,i){this.x=e,this.y=t,this.z=i,this.type="ForceOverLife",this._temp=new B,this._tempScale=new B,this._tempQ=new J}update(e,t){this._temp.set(this.x.genValue(e.memory,e.age/e.life),this.y.genValue(e.memory,e.age/e.life),this.z.genValue(e.memory,e.age/e.life)),this.ps.worldSpace?e.velocity.addScaledVector(this._temp,t):(this._temp.multiply(this._tempScale).applyQuaternion(this._tempQ),e.velocity.addScaledVector(this._temp,t))}toJSON(){return{type:this.type,x:this.x.toJSON(),y:this.y.toJSON(),z:this.z.toJSON()}}static fromJSON(e){return new on(D(e.x),D(e.y),D(e.z))}frameUpdate(e){if(this.ps&&!this.ps.worldSpace){const t=this._temp,i=this._tempQ,r=this._tempScale;this.ps.emitter.matrixWorld.decompose(t,i,r),i.invert(),r.set(1/r.x,1/r.y,1/r.z)}}clone(){return new on(this.x.clone(),this.y.clone(),this.z.clone())}reset(){}}class an{initialize(e){this.size.startGen(e.memory)}constructor(e){this.size=e,this.type="SizeOverLife"}update(e){this.size instanceof Ht?this.size.genValue(e.memory,e.size,e.age/e.life).multiply(e.startSize):e.size.copy(e.startSize).multiplyScalar(this.size.genValue(e.memory,e.age/e.life))}toJSON(){return{type:this.type,size:this.size.toJSON()}}static fromJSON(e){return new an(jn(e.size))}frameUpdate(e){}clone(){return new an(this.size.clone())}reset(){}}class cn{initialize(e){this.speed.startGen(e.memory)}constructor(e){this.speed=e,this.type="SpeedOverLife"}update(e){e.speedModifier=this.speed.genValue(e.memory,e.age/e.life)}toJSON(){return{type:this.type,speed:this.speed.toJSON()}}static fromJSON(e){return new cn(D(e.speed))}frameUpdate(e){}clone(){return new cn(this.speed.clone())}reset(){}}class ln{constructor(e){this.frame=e,this.type="FrameOverLife"}initialize(e){this.frame.startGen(e.memory)}update(e,t){this.frame instanceof Wi&&(e.uvTile=this.frame.genValue(e.memory,e.age/e.life))}frameUpdate(e){}toJSON(){return{type:this.type,frame:this.frame.toJSON()}}static fromJSON(e){return new ln(D(e.frame))}clone(){return new ln(this.frame.clone())}reset(){}}class hn{constructor(e,t=new B(0,1,0)){this.orbitSpeed=e,this.axis=t,this.type="OrbitOverLife",this.temp=new B,this.rotation=new J}initialize(e){this.orbitSpeed.startGen(e.memory)}update(e,t){this.temp.copy(e.position).projectOnVector(this.axis),this.rotation.setFromAxisAngle(this.axis,this.orbitSpeed.genValue(e.memory,e.age/e.life)*t),e.position.sub(this.temp),e.position.applyQuaternion(this.rotation),e.position.add(this.temp)}frameUpdate(e){}toJSON(){return{type:this.type,orbitSpeed:this.orbitSpeed.toJSON(),axis:[this.axis.x,this.axis.y,this.axis.z]}}static fromJSON(e){return new hn(D(e.orbitSpeed),e.axis?new B(e.axis[0],e.axis[1],e.axis[2]):void 0)}clone(){return new hn(this.orbitSpeed.clone())}reset(){}}class es{constructor(e){this.data=e,this.next=null,this.prev=null}hasPrev(){return this.prev!==null}hasNext(){return this.next!==null}}class dh{constructor(){this.length=0,this.head=this.tail=null}isEmpty(){return this.head===null}clear(){this.length=0,this.head=this.tail=null}front(){return this.head===null?null:this.head.data}back(){return this.tail===null?null:this.tail.data}dequeue(){if(this.head){const e=this.head.data;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,e}}pop(){if(this.tail){const e=this.tail.data;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,e}}queue(e){const t=new es(e);this.tail||(this.tail=t),this.head&&(this.head.prev=t,t.next=this.head),this.head=t,this.length++}push(e){const t=new es(e);this.head||(this.head=t),this.tail&&(this.tail.next=t,t.prev=this.tail),this.tail=t,this.length++}insertBefore(e,t){const i=new es(t);i.next=e,i.prev=e.prev,i.prev!==null&&(i.prev.next=i),i.next.prev=i,e==this.head&&(this.head=i),this.length++}remove(e){if(this.head===null||this.tail===null)return;let t=this.head;for(e===this.head.data&&(this.head=this.head.next),e===this.tail.data&&(this.tail=this.tail.prev);t.next!==null&&t.data!==e;)t=t.next;t.data===e&&(t.prev!==null&&(t.prev.next=t.next),t.next!==null&&(t.next.prev=t.prev),this.length--)}*values(){let e=this.head;for(;e!==null;)yield e.data,e=e.next}}class ph{constructor(){this.startSpeed=0,this.startColor=new Ee,this.startSize=new B(1,1,1),this.position=new B,this.velocity=new B,this.age=0,this.life=1,this.size=new B(1,1,1),this.speedModifier=1,this.rotation=0,this.color=new Ee,this.uvTile=0,this.memory=[]}get died(){return this.age>=this.life}reset(){this.memory.length=0}}class fh{constructor(e,t,i){this.position=e,this.size=t,this.color=i}}class Hn{constructor(){this.startSpeed=0,this.startColor=new Ee,this.startSize=new B(1,1,1),this.position=new B,this.velocity=new B,this.age=0,this.life=1,this.size=new B(1,1,1),this.length=100,this.speedModifier=1,this.color=new Ee,this.previous=new dh,this.uvTile=0,this.memory=[]}update(){for(this.age<=this.life?this.previous.push(new fh(this.position.clone(),this.size.x,this.color.clone())):this.previous.length>0&&this.previous.dequeue();this.previous.length>this.length;)this.previous.dequeue()}get died(){return this.age>=this.life}reset(){this.memory.length=0,this.previous.clear()}}class un{initialize(e){this.width.startGen(e.memory)}constructor(e){this.width=e,this.type="WidthOverLength"}update(e){if(e instanceof Hn){const t=e.previous.values();for(let i=0;i<e.previous.length;i++){const r=t.next();r.value.size=this.width.genValue(e.memory,(e.previous.length-i)/e.length)}}}frameUpdate(e){}toJSON(){return{type:this.type,width:this.width.toJSON()}}static fromJSON(e){return new un(D(e.width))}clone(){return new un(this.width.clone())}reset(){}}class dn{constructor(e,t){this.direction=e,this.magnitude=t,this.type="ApplyForce",this.memory={data:[],dataCount:0},this.magnitudeValue=this.magnitude.genValue(this.memory)}initialize(e){}update(e,t){e.velocity.addScaledVector(this.direction,this.magnitudeValue*t)}frameUpdate(e){this.magnitudeValue=this.magnitude.genValue(this.memory)}toJSON(){return{type:this.type,direction:[this.direction.x,this.direction.y,this.direction.z],magnitude:this.magnitude.toJSON()}}static fromJSON(e){var t;return new dn(new B(e.direction[0],e.direction[1],e.direction[2]),D((t=e.magnitude)!==null&&t!==void 0?t:e.force))}clone(){return new dn(this.direction.clone(),this.magnitude.clone())}reset(){}}class pn{constructor(e,t){this.center=e,this.magnitude=t,this.type="GravityForce",this.temp=new B}initialize(e){}update(e,t){this.temp.copy(this.center).sub(e.position).normalize(),e.velocity.addScaledVector(this.temp,this.magnitude/e.position.distanceToSquared(this.center)*t)}frameUpdate(e){}toJSON(){return{type:this.type,center:[this.center.x,this.center.y,this.center.z],magnitude:this.magnitude}}static fromJSON(e){return new pn(new B(e.center[0],e.center[1],e.center[2]),e.magnitude)}clone(){return new pn(this.center.clone(),this.magnitude)}reset(){}}class fn{constructor(e){this.angle=e,this.type="ChangeEmitDirection",this._temp=new B,this._q=new J,this.memory={data:[],dataCount:0}}initialize(e){const t=e.velocity.length();t!=0&&(e.velocity.normalize(),e.velocity.x===0&&e.velocity.y===0?this._temp.set(0,e.velocity.z,0):this._temp.set(-e.velocity.y,e.velocity.x,0),this.angle.startGen(this.memory),this._q.setFromAxisAngle(this._temp.normalize(),this.angle.genValue(this.memory)),this._temp.copy(e.velocity),e.velocity.applyQuaternion(this._q),this._q.setFromAxisAngle(this._temp,Math.random()*Math.PI*2),e.velocity.applyQuaternion(this._q),e.velocity.setLength(t))}update(e,t){}frameUpdate(e){}toJSON(){return{type:this.type,angle:this.angle.toJSON()}}static fromJSON(e){return new fn(D(e.angle))}clone(){return new fn(this.angle)}reset(){}}var $t;(function(n){n[n.Death=0]="Death",n[n.Birth=1]="Birth",n[n.Frame=2]="Frame"})($t||($t={}));class mn{constructor(e,t,i,r=$t.Frame,s=1){this.particleSystem=e,this.useVelocityAsBasis=t,this.subParticleSystem=i,this.mode=r,this.emitProbability=s,this.type="EmitSubParticleSystem",this.q_=new J,this.v_=new B,this.v2_=new B,this.subEmissions=new Array,this.subParticleSystem&&this.subParticleSystem.system&&(this.subParticleSystem.system.onlyUsedByOther=!0)}initialize(e){}update(e,t){this.mode===$t.Frame?this.emit(e,t):this.mode===$t.Birth&&e.age===0?this.emit(e,t):this.mode===$t.Death&&e.age+t>=e.life&&this.emit(e,t)}emit(e,t){if(!this.subParticleSystem||Math.random()>this.emitProbability)return;const i=new We;this.setMatrixFromParticle(i,e),this.subEmissions.push({burstParticleCount:0,burstParticleIndex:0,isBursting:!1,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,matrix:i,travelDistance:0,particle:e})}frameUpdate(e){if(this.subParticleSystem)for(let t=0;t<this.subEmissions.length;t++)if(this.subEmissions[t].time>=this.subParticleSystem.system.duration)this.subEmissions[t]=this.subEmissions[this.subEmissions.length-1],this.subEmissions.length=this.subEmissions.length-1,t--;else{const i=this.subEmissions[t];i.particle&&i.particle.age<i.particle.life?this.setMatrixFromParticle(i.matrix,i.particle):i.particle=void 0,this.subParticleSystem.system.emit(e,i,i.matrix)}}toJSON(){return{type:this.type,subParticleSystem:this.subParticleSystem?this.subParticleSystem.uuid:"",useVelocityAsBasis:this.useVelocityAsBasis,mode:this.mode,emitProbability:this.emitProbability}}static fromJSON(e,t){return new mn(t,e.useVelocityAsBasis,e.subParticleSystem,e.mode,e.emitProbability)}clone(){return new mn(this.particleSystem,this.useVelocityAsBasis,this.subParticleSystem,this.mode,this.emitProbability)}reset(){}setMatrixFromParticle(e,t){let i;if(t.rotation===void 0||this.useVelocityAsBasis)if(t.velocity.x===0&&t.velocity.y===0&&(t.velocity.z===1||t.velocity.z===0))e.set(1,0,0,t.position.x,0,1,0,t.position.y,0,0,1,t.position.z,0,0,0,1);else{this.v_.copy(Ta).cross(t.velocity),this.v2_.copy(t.velocity).cross(this.v_);const r=this.v_.length(),s=this.v2_.length();e.set(this.v_.x/r,this.v2_.x/s,t.velocity.x,t.position.x,this.v_.y/r,this.v2_.y/s,t.velocity.y,t.position.y,this.v_.z/r,this.v2_.z/s,t.velocity.z,t.position.z,0,0,0,1)}else t.rotation instanceof J?i=t.rotation:(this.q_.setFromAxisAngle(Ta,t.rotation),i=this.q_),e.compose(t.position,i,hh);this.particleSystem.worldSpace||e.multiplyMatrices(this.particleSystem.emitter.matrixWorld,e)}}const mh=.5*(Math.sqrt(3)-1),Ai=(3-Math.sqrt(3))/6,yh=1/3,$e=1/6,gh=(Math.sqrt(5)-1)/4,ue=(5-Math.sqrt(5))/20,se=new Float32Array([1,1,0,-1,1,0,1,-1,0,-1,-1,0,1,0,1,-1,0,1,1,0,-1,-1,0,-1,0,1,1,0,-1,1,0,1,-1,0,-1,-1]),K=new Float32Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]);class Ca{constructor(e=Math.random){const t=typeof e=="function"?e:bh(e);this.p=vh(t),this.perm=new Uint8Array(512),this.permMod12=new Uint8Array(512);for(let i=0;i<512;i++)this.perm[i]=this.p[i&255],this.permMod12[i]=this.perm[i]%12}noise2D(e,t){const i=this.permMod12,r=this.perm;let s=0,o=0,l=0;const a=(e+t)*mh,c=Math.floor(e+a),h=Math.floor(t+a),u=(c+h)*Ai,d=c-u,p=h-u,f=e-d,m=t-p;let g,y;f>m?(g=1,y=0):(g=0,y=1);const v=f-g+Ai,b=m-y+Ai,S=f-1+2*Ai,x=m-1+2*Ai,w=c&255,_=h&255;let M=.5-f*f-m*m;if(M>=0){const E=i[w+r[_]]*3;M*=M,s=M*M*(se[E]*f+se[E+1]*m)}let C=.5-v*v-b*b;if(C>=0){const E=i[w+g+r[_+y]]*3;C*=C,o=C*C*(se[E]*v+se[E+1]*b)}let T=.5-S*S-x*x;if(T>=0){const E=i[w+1+r[_+1]]*3;T*=T,l=T*T*(se[E]*S+se[E+1]*x)}return 70*(s+o+l)}noise3D(e,t,i){const r=this.permMod12,s=this.perm;let o,l,a,c;const h=(e+t+i)*yh,u=Math.floor(e+h),d=Math.floor(t+h),p=Math.floor(i+h),f=(u+d+p)*$e,m=u-f,g=d-f,y=p-f,v=e-m,b=t-g,S=i-y;let x,w,_,M,C,T;v>=b?b>=S?(x=1,w=0,_=0,M=1,C=1,T=0):v>=S?(x=1,w=0,_=0,M=1,C=0,T=1):(x=0,w=0,_=1,M=1,C=0,T=1):b<S?(x=0,w=0,_=1,M=0,C=1,T=1):v<S?(x=0,w=1,_=0,M=0,C=1,T=1):(x=0,w=1,_=0,M=1,C=1,T=0);const E=v-x+$e,P=b-w+$e,A=S-_+$e,I=v-M+2*$e,N=b-C+2*$e,U=S-T+2*$e,G=v-1+3*$e,V=b-1+3*$e,oe=S-1+3*$e,ie=u&255,ee=d&255,Ae=p&255;let Me=.6-v*v-b*b-S*S;if(Me<0)o=0;else{const X=r[ie+s[ee+s[Ae]]]*3;Me*=Me,o=Me*Me*(se[X]*v+se[X+1]*b+se[X+2]*S)}let ne=.6-E*E-P*P-A*A;if(ne<0)l=0;else{const X=r[ie+x+s[ee+w+s[Ae+_]]]*3;ne*=ne,l=ne*ne*(se[X]*E+se[X+1]*P+se[X+2]*A)}let fe=.6-I*I-N*N-U*U;if(fe<0)a=0;else{const X=r[ie+M+s[ee+C+s[Ae+T]]]*3;fe*=fe,a=fe*fe*(se[X]*I+se[X+1]*N+se[X+2]*U)}let te=.6-G*G-V*V-oe*oe;if(te<0)c=0;else{const X=r[ie+1+s[ee+1+s[Ae+1]]]*3;te*=te,c=te*te*(se[X]*G+se[X+1]*V+se[X+2]*oe)}return 32*(o+l+a+c)}noise4D(e,t,i,r){const s=this.perm;let o,l,a,c,h;const u=(e+t+i+r)*gh,d=Math.floor(e+u),p=Math.floor(t+u),f=Math.floor(i+u),m=Math.floor(r+u),g=(d+p+f+m)*ue,y=d-g,v=p-g,b=f-g,S=m-g,x=e-y,w=t-v,_=i-b,M=r-S;let C=0,T=0,E=0,P=0;x>w?C++:T++,x>_?C++:E++,x>M?C++:P++,w>_?T++:E++,w>M?T++:P++,_>M?E++:P++;const A=C>=3?1:0,I=T>=3?1:0,N=E>=3?1:0,U=P>=3?1:0,G=C>=2?1:0,V=T>=2?1:0,oe=E>=2?1:0,ie=P>=2?1:0,ee=C>=1?1:0,Ae=T>=1?1:0,Me=E>=1?1:0,ne=P>=1?1:0,fe=x-A+ue,te=w-I+ue,X=_-N+ue,ft=M-U+ue,Z=x-G+2*ue,Xe=w-V+2*ue,it=_-oe+2*ue,Tt=M-ie+2*ue,Ct=x-ee+3*ue,Pt=w-Ae+3*ue,Et=_-Me+3*ue,At=M-ne+3*ue,kt=x-1+4*ue,Rt=w-1+4*ue,Ot=_-1+4*ue,Bt=M-1+4*ue,nt=d&255,rt=p&255,st=f&255,ot=m&255;let Ue=.6-x*x-w*w-_*_-M*M;if(Ue<0)o=0;else{const j=s[nt+s[rt+s[st+s[ot]]]]%32*4;Ue*=Ue,o=Ue*Ue*(K[j]*x+K[j+1]*w+K[j+2]*_+K[j+3]*M)}let De=.6-fe*fe-te*te-X*X-ft*ft;if(De<0)l=0;else{const j=s[nt+A+s[rt+I+s[st+N+s[ot+U]]]]%32*4;De*=De,l=De*De*(K[j]*fe+K[j+1]*te+K[j+2]*X+K[j+3]*ft)}let Fe=.6-Z*Z-Xe*Xe-it*it-Tt*Tt;if(Fe<0)a=0;else{const j=s[nt+G+s[rt+V+s[st+oe+s[ot+ie]]]]%32*4;Fe*=Fe,a=Fe*Fe*(K[j]*Z+K[j+1]*Xe+K[j+2]*it+K[j+3]*Tt)}let Le=.6-Ct*Ct-Pt*Pt-Et*Et-At*At;if(Le<0)c=0;else{const j=s[nt+ee+s[rt+Ae+s[st+Me+s[ot+ne]]]]%32*4;Le*=Le,c=Le*Le*(K[j]*Ct+K[j+1]*Pt+K[j+2]*Et+K[j+3]*At)}let Ve=.6-kt*kt-Rt*Rt-Ot*Ot-Bt*Bt;if(Ve<0)h=0;else{const j=s[nt+1+s[rt+1+s[st+1+s[ot+1]]]]%32*4;Ve*=Ve,h=Ve*Ve*(K[j]*kt+K[j+1]*Rt+K[j+2]*Ot+K[j+3]*Bt)}return 27*(o+l+a+c+h)}}function vh(n){const e=new Uint8Array(256);for(let t=0;t<256;t++)e[t]=t;for(let t=0;t<255;t++){const i=t+~~(n()*(256-t)),r=e[t];e[t]=e[i],e[i]=r}return e}function bh(n){let e=0,t=0,i=0,r=1;const s=xh();return e=s(" "),t=s(" "),i=s(" "),e-=s(n),e<0&&(e+=1),t-=s(n),t<0&&(t+=1),i-=s(n),i<0&&(i+=1),function(){const o=2091639*e+r*23283064365386963e-26;return e=t,t=i,i=o-(r=o|0)}}function xh(){let n=4022871197;return function(e){e=e.toString();for(let t=0;t<e.length;t++){n+=e.charCodeAt(t);let i=.02519603282416938*n;n=i>>>0,i-=n,i*=n,n=i>>>0,i-=n,n+=i*4294967296}return(n>>>0)*23283064365386963e-26}}class yn{constructor(e,t,i,r){this.scale=e,this.octaves=t,this.velocityMultiplier=i,this.timeScale=r,this.type="TurbulenceField",this.generator=new Ca,this.timeOffset=new B,this.temp=new B,this.temp2=new B,this.timeOffset.x=Math.random()/this.scale.x*this.timeScale.x,this.timeOffset.y=Math.random()/this.scale.y*this.timeScale.y,this.timeOffset.z=Math.random()/this.scale.z*this.timeScale.z}initialize(e){}update(e,t){const i=e.position.x/this.scale.x,r=e.position.y/this.scale.y,s=e.position.z/this.scale.z;this.temp.set(0,0,0);let o=1;for(let l=0;l<this.octaves;l++)this.temp2.set(this.generator.noise4D(i*o,r*o,s*o,this.timeOffset.x*o)/o,this.generator.noise4D(i*o,r*o,s*o,this.timeOffset.y*o)/o,this.generator.noise4D(i*o,r*o,s*o,this.timeOffset.z*o)/o),this.temp.add(this.temp2),o*=2;this.temp.multiply(this.velocityMultiplier),e.velocity.addScaledVector(this.temp,t)}toJSON(){return{type:this.type,scale:[this.scale.x,this.scale.y,this.scale.z],octaves:this.octaves,velocityMultiplier:[this.velocityMultiplier.x,this.velocityMultiplier.y,this.velocityMultiplier.z],timeScale:[this.timeScale.x,this.timeScale.y,this.timeScale.z]}}frameUpdate(e){this.timeOffset.x+=e*this.timeScale.x,this.timeOffset.y+=e*this.timeScale.y,this.timeOffset.z+=e*this.timeScale.z}static fromJSON(e){return new yn(new B(e.scale[0],e.scale[1],e.scale[2]),e.octaves,new B(e.velocityMultiplier[0],e.velocityMultiplier[1],e.velocityMultiplier[2]),new B(e.timeScale[0],e.timeScale[1],e.timeScale[2]))}clone(){return new yn(this.scale.clone(),this.octaves,this.velocityMultiplier.clone(),this.timeScale.clone())}reset(){}}const et=[],ts=new B,is=new J;class gn{constructor(e,t,i=new L(1),r=new L(0)){if(this.frequency=e,this.power=t,this.positionAmount=i,this.rotationAmount=r,this.type="Noise",this.duration=0,et.length===0)for(let s=0;s<100;s++)et.push(new Ca)}initialize(e){e.lastPosNoise=new B,typeof e.rotation=="number"?e.lastRotNoise=0:e.lastRotNoise=new J,e.generatorIndex=[Jn(0,100),Jn(0,100),Jn(0,100),Jn(0,100)],this.positionAmount.startGen(e.memory),this.rotationAmount.startGen(e.memory),this.frequency.startGen(e.memory),this.power.startGen(e.memory)}update(e,t){let i=this.frequency.genValue(e.memory,e.age/e.life),r=this.power.genValue(e.memory,e.age/e.life),s=this.positionAmount.genValue(e.memory,e.age/e.life),o=this.rotationAmount.genValue(e.memory,e.age/e.life);s>0&&e.lastPosNoise!==void 0&&(e.position.sub(e.lastPosNoise),ts.set(et[e.generatorIndex[0]].noise2D(0,e.age*i)*r*s,et[e.generatorIndex[1]].noise2D(0,e.age*i)*r*s,et[e.generatorIndex[2]].noise2D(0,e.age*i)*r*s),e.position.add(ts),e.lastPosNoise.copy(ts)),o>0&&e.lastRotNoise!==void 0&&(typeof e.rotation=="number"?(e.rotation-=e.lastRotNoise,e.rotation+=et[e.generatorIndex[3]].noise2D(0,e.age*i)*Math.PI*r*o):(e.lastRotNoise.invert(),e.rotation.multiply(e.lastRotNoise),is.set(et[e.generatorIndex[0]].noise2D(0,e.age*i)*r*o,et[e.generatorIndex[1]].noise2D(0,e.age*i)*r*o,et[e.generatorIndex[2]].noise2D(0,e.age*i)*r*o,et[e.generatorIndex[3]].noise2D(0,e.age*i)*r*o).normalize(),e.rotation.multiply(is),e.lastRotNoise.copy(is)))}toJSON(){return{type:this.type,frequency:this.frequency.toJSON(),power:this.power.toJSON(),positionAmount:this.positionAmount.toJSON(),rotationAmount:this.rotationAmount.toJSON()}}frameUpdate(e){this.duration+=e}static fromJSON(e){return new gn(D(e.frequency),D(e.power),D(e.positionAmount),D(e.rotationAmount))}clone(){return new gn(this.frequency.clone(),this.power.clone(),this.positionAmount.clone(),this.rotationAmount.clone())}reset(){}}class vn{constructor(e,t){this.color=e,this.speedRange=t,this.type="ColorBySpeed"}initialize(e){this.color.startGen(e.memory)}update(e,t){const i=(e.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.color.genColor(e.memory,e.color,i),e.color.x*=e.startColor.x,e.color.y*=e.startColor.y,e.color.z*=e.startColor.z,e.color.w*=e.startColor.w}frameUpdate(e){}toJSON(){return{type:this.type,color:this.color.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(e){return new vn(Kr(e.color),qt.fromJSON(e.speedRange))}clone(){return new vn(this.color.clone(),this.speedRange.clone())}reset(){}}class bn{initialize(e){this.size.startGen(e.memory)}constructor(e,t){this.size=e,this.speedRange=t,this.type="SizeBySpeed"}update(e){const t=(e.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);this.size instanceof Ht?this.size.genValue(e.memory,e.size,t).multiply(e.startSize):e.size.copy(e.startSize).multiplyScalar(this.size.genValue(e.memory,t))}toJSON(){return{type:this.type,size:this.size.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(e){return new bn(jn(e.size),qt.fromJSON(e.speedRange))}frameUpdate(e){}clone(){return new bn(this.size.clone(),this.speedRange.clone())}reset(){}}class xn{constructor(e,t){this.angularVelocity=e,this.speedRange=t,this.type="RotationBySpeed",this.tempQuat=new J}initialize(e){typeof e.rotation=="number"&&this.angularVelocity.startGen(e.memory)}update(e,t){if(typeof e.rotation=="number"){const i=(e.startSpeed-this.speedRange.a)/(this.speedRange.b-this.speedRange.a);e.rotation+=t*this.angularVelocity.genValue(e.memory,i)}}toJSON(){return{type:this.type,angularVelocity:this.angularVelocity.toJSON(),speedRange:this.speedRange.toJSON()}}static fromJSON(e){return new xn(D(e.angularVelocity),qt.fromJSON(e.speedRange))}frameUpdate(e){}clone(){return new xn(this.angularVelocity.clone(),this.speedRange.clone())}reset(){}}class _n{initialize(e){this.speed.startGen(e.memory)}constructor(e,t){this.speed=e,this.dampen=t,this.type="LimitSpeedOverLife"}update(e,t){let i=e.velocity.length(),r=this.speed.genValue(e.memory,e.age/e.life);if(i>r){const s=(i-r)/i;e.velocity.multiplyScalar(1-s*this.dampen*t*20)}}toJSON(){return{type:this.type,speed:this.speed.toJSON(),dampen:this.dampen}}static fromJSON(e){return new _n(D(e.speed),e.dampen)}frameUpdate(e){}clone(){return new _n(this.speed.clone(),this.dampen)}reset(){}}const Wn={ApplyForce:{type:"ApplyForce",constructor:dn,params:[["direction",["vec3"]],["magnitude",["value"]]],loadJSON:dn.fromJSON},Noise:{type:"Noise",constructor:gn,params:[["frequency",["value"]],["power",["value"]],["positionAmount",["value"]],["rotationAmount",["value"]]],loadJSON:gn.fromJSON},TurbulenceField:{type:"TurbulenceField",constructor:yn,params:[["scale",["vec3"]],["octaves",["number"]],["velocityMultiplier",["vec3"]],["timeScale",["vec3"]]],loadJSON:yn.fromJSON},GravityForce:{type:"GravityForce",constructor:pn,params:[["center",["vec3"]],["magnitude",["number"]]],loadJSON:pn.fromJSON},ColorOverLife:{type:"ColorOverLife",constructor:nn,params:[["color",["colorFunc"]]],loadJSON:nn.fromJSON},RotationOverLife:{type:"RotationOverLife",constructor:rn,params:[["angularVelocity",["value","valueFunc"]]],loadJSON:rn.fromJSON},Rotation3DOverLife:{type:"Rotation3DOverLife",constructor:sn,params:[["angularVelocity",["rotationFunc"]]],loadJSON:sn.fromJSON},SizeOverLife:{type:"SizeOverLife",constructor:an,params:[["size",["value","valueFunc","vec3Func"]]],loadJSON:an.fromJSON},ColorBySpeed:{type:"ColorBySpeed",constructor:vn,params:[["color",["colorFunc"]],["speedRange",["range"]]],loadJSON:vn.fromJSON},RotationBySpeed:{type:"RotationBySpeed",constructor:xn,params:[["angularVelocity",["value","valueFunc"]],["speedRange",["range"]]],loadJSON:xn.fromJSON},SizeBySpeed:{type:"SizeBySpeed",constructor:bn,params:[["size",["value","valueFunc","vec3Func"]],["speedRange",["range"]]],loadJSON:bn.fromJSON},SpeedOverLife:{type:"SpeedOverLife",constructor:cn,params:[["speed",["value","valueFunc"]]],loadJSON:cn.fromJSON},FrameOverLife:{type:"FrameOverLife",constructor:ln,params:[["frame",["value","valueFunc"]]],loadJSON:ln.fromJSON},ForceOverLife:{type:"ForceOverLife",constructor:on,params:[["x",["value","valueFunc"]],["y",["value","valueFunc"]],["z",["value","valueFunc"]]],loadJSON:on.fromJSON},OrbitOverLife:{type:"OrbitOverLife",constructor:hn,params:[["orbitSpeed",["value","valueFunc"]],["axis",["vec3"]]],loadJSON:hn.fromJSON},WidthOverLength:{type:"WidthOverLength",constructor:un,params:[["width",["value","valueFunc"]]],loadJSON:un.fromJSON},ChangeEmitDirection:{type:"ChangeEmitDirection",constructor:fn,params:[["angle",["value"]]],loadJSON:fn.fromJSON},EmitSubParticleSystem:{type:"EmitSubParticleSystem",constructor:mn,params:[["particleSystem",["self"]],["useVelocityAsBasis",["boolean"]],["subParticleSystem",["particleSystem"]],["mode",["number"]],["emitProbability",["number"]]],loadJSON:mn.fromJSON},LimitSpeedOverLife:{type:"LimitSpeedOverLife",constructor:_n,params:[["speed",["value","valueFunc"]],["dampen",["number"]]],loadJSON:_n.fromJSON}};function _h(n,e){return Wn[n.type]?Wn[n.type].loadJSON(n,e):null}const Sh=[];function wh(n){if(!Sh.find(e=>e.id===n.id)){n.initialize();for(const e of n.emitterShapes)$r[e.type]||($r[e.type]=e);for(const e of n.behaviors)Wn[e.type]||(Wn[e.type]=e)}}var Mh=`
84
84
  #ifdef SOFT_PARTICLES
85
85
 
86
86
  /* #ifdef LOGDEPTH
@@ -102,7 +102,7 @@ a=extmap-allow-mixed`)!==-1){const s=i.sdp.split(`
102
102
 
103
103
  //gl_FragColor = vec4(softParticlesFade , 0, 0, 1);
104
104
  #endif
105
- `,gd=`
105
+ `,Th=`
106
106
  #ifdef SOFT_PARTICLES
107
107
 
108
108
  uniform sampler2D depthTexture;
@@ -124,17 +124,17 @@ a=extmap-allow-mixed`)!==-1){const s=i.sdp.split(`
124
124
  }
125
125
 
126
126
  #endif
127
- `,Cd=`
127
+ `,Ch=`
128
128
  #ifdef SOFT_PARTICLES
129
129
  varying vec4 projPosition;
130
130
  varying float linearDepth;
131
131
  #endif
132
- `,zd=`
132
+ `,Ph=`
133
133
  #ifdef SOFT_PARTICLES
134
134
  projPosition = gl_Position;
135
135
  linearDepth = -mvPosition.z;
136
136
  #endif
137
- `,vd=`
137
+ `,Eh=`
138
138
  #ifdef USE_MAP
139
139
  vec4 texelColor = texture2D( map, vUv);
140
140
  #ifdef TILE_BLEND
@@ -142,7 +142,7 @@ a=extmap-allow-mixed`)!==-1){const s=i.sdp.split(`
142
142
  #endif
143
143
  diffuseColor *= texelColor;
144
144
  #endif
145
- `,Kd=`
145
+ `,Ah=`
146
146
  #if defined( USE_UV ) || defined( USE_ANISOTROPY )
147
147
 
148
148
  varying vec2 vUv;
@@ -293,7 +293,7 @@ a=extmap-allow-mixed`)!==-1){const s=i.sdp.split(`
293
293
  varying vec2 vThicknessMapUv;
294
294
 
295
295
  #endif
296
- `,Md=`
296
+ `,kh=`
297
297
  #ifdef UV_TILE
298
298
  attribute float uvTile;
299
299
  uniform vec2 tileCount;
@@ -463,7 +463,7 @@ a=extmap-allow-mixed`)!==-1){const s=i.sdp.split(`
463
463
  varying vec2 vThicknessMapUv;
464
464
 
465
465
  #endif
466
- `,Td=`
466
+ `,Rh=`
467
467
  #ifdef UV_TILE
468
468
  mat3 tileTransform = makeTileTransform(floor(uvTile));
469
469
  #ifdef TILE_BLEND
@@ -601,7 +601,7 @@ vThicknessMapUv = ( tileTransform * thicknessMapTransform * vec3( THICKNESSMAP_U
601
601
 
602
602
  #endif
603
603
 
604
- `;const Gt=Rl;function Yd(){Gt.tile_pars_vertex=Md,Gt.tile_vertex=Td,Gt.tile_pars_fragment=Kd,Gt.tile_fragment=vd,Gt.soft_pars_vertex=Cd,Gt.soft_vertex=zd,Gt.soft_pars_fragment=gd,Gt.soft_fragment=Wd}class Hd extends fs{constructor(e){super(),this.type="ParticleEmitter",this.system=e}clone(){const e=this.system.clone();return e.emitter.copy(this,!0),e.emitter}dispose(){}extractFromCache(e){const t=[];for(const i in e){const s=e[i];delete s.metadata,t.push(s)}return t}toJSON(e,t={}){const i=this.children;this.children=this.children.filter(o=>o.type!=="ParticleSystemPreview");const s=super.toJSON(e);return this.children=i,this.system!==null&&(s.object.ps=this.system.toJSON(e,t)),s}}var v;(function(n){n[n.BillBoard=0]="BillBoard",n[n.StretchedBillBoard=1]="StretchedBillBoard",n[n.Mesh=2]="Mesh",n[n.Trail=3]="Trail",n[n.HorizontalBillBoard=4]="HorizontalBillBoard",n[n.VerticalBillBoard=5]="VerticalBillBoard"})(v||(v={}));class gr extends Sn{constructor(e){super(),this.type="VFXBatch",this.maxParticles=1e3,this.systems=new Set;const t=new xn;t.mask=e.layers.mask;const i=e.material.clone();i.defines={},Object.assign(i.defines,e.material.defines),this.settings={instancingGeometry:e.instancingGeometry,renderMode:e.renderMode,renderOrder:e.renderOrder,material:i,uTileCount:e.uTileCount,vTileCount:e.vTileCount,blendTiles:e.blendTiles,softParticles:e.softParticles,softNearFade:e.softNearFade,softFarFade:e.softFarFade,layers:t},this.frustumCulled=!1,this.renderOrder=this.settings.renderOrder}addSystem(e){this.systems.add(e)}removeSystem(e){this.systems.delete(e)}applyDepthTexture(e){const t=this.material.uniforms.depthTexture;t&&t.value!==e&&(t.value=e,this.material.needsUpdate=!0)}}const kd=new T(0,0,1),no=new F,Nd=new T,Id=new T;new T;const Cr=60,Jd=new Jo(1,1,1,1);class Ls{set time(e){this.emissionState.time=e}get time(){return this.emissionState.time}get layers(){return this.rendererSettings.layers}get texture(){return this.rendererSettings.material.map}set texture(e){this.rendererSettings.material.map=e,this.neededToUpdateRender=!0}get material(){return this.rendererSettings.material}set material(e){this.rendererSettings.material=e,this.neededToUpdateRender=!0}get uTileCount(){return this.rendererSettings.uTileCount}set uTileCount(e){this.rendererSettings.uTileCount=e,this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(e){this.rendererSettings.vTileCount=e,this.neededToUpdateRender=!0}get blendTiles(){return this.rendererSettings.blendTiles}set blendTiles(e){this.rendererSettings.blendTiles=e,this.neededToUpdateRender=!0}get softParticles(){return this.rendererSettings.softParticles}set softParticles(e){this.rendererSettings.softParticles=e,this.neededToUpdateRender=!0}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(e){this.rendererSettings.softNearFade=e,this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(e){this.rendererSettings.softFarFade=e,this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(e){this.restart(),this.particles.length=0,this.rendererSettings.instancingGeometry=e,this.neededToUpdateRender=!0}get renderMode(){return this.rendererSettings.renderMode}set renderMode(e){if((this.rendererSettings.renderMode!=v.Trail&&e===v.Trail||this.rendererSettings.renderMode==v.Trail&&e!==v.Trail)&&(this.restart(),this.particles.length=0),this.rendererSettings.renderMode!==e)switch(e){case v.Trail:this.rendererEmitterSettings={startLength:new U(30),followLocalOrigin:!1};break;case v.Mesh:this.rendererEmitterSettings={geometry:new Jo(1,1)},this.startRotation=new Di(new T(0,1,0),new U(0));break;case v.StretchedBillBoard:this.rendererEmitterSettings={speedFactor:0,lengthFactor:2},this.rendererSettings.renderMode===v.Mesh&&(this.startRotation=new U(0));break;case v.BillBoard:case v.VerticalBillBoard:case v.HorizontalBillBoard:this.rendererEmitterSettings={},this.rendererSettings.renderMode===v.Mesh&&(this.startRotation=new U(0));break}this.rendererSettings.renderMode=e,this.neededToUpdateRender=!0}get renderOrder(){return this.rendererSettings.renderOrder}set renderOrder(e){this.rendererSettings.renderOrder=e,this.neededToUpdateRender=!0}get blending(){return this.rendererSettings.material.blending}set blending(e){this.rendererSettings.material.blending=e,this.neededToUpdateRender=!0}constructor(e){var t,i,s,o,a,c,r,l,d,h,u,p,m,b,G,y,Z,X,L,V,x,R,S,W,f,C;if(this.temp=new T,this.travelDistance=0,this.normalMatrix=new tt,this.memory=[],this.listeners={},this.firstTimeUpdate=!0,this.autoDestroy=e.autoDestroy===void 0?!1:e.autoDestroy,this.duration=(t=e.duration)!==null&&t!==void 0?t:1,this.looping=e.looping===void 0?!0:e.looping,this.prewarm=e.prewarm===void 0?!1:e.prewarm,this.startLife=(i=e.startLife)!==null&&i!==void 0?i:new U(5),this.startSpeed=(s=e.startSpeed)!==null&&s!==void 0?s:new U(0),this.startRotation=(o=e.startRotation)!==null&&o!==void 0?o:new U(0),this.startSize=(a=e.startSize)!==null&&a!==void 0?a:new U(1),this.startColor=(c=e.startColor)!==null&&c!==void 0?c:new Qt(new Ce(1,1,1,1)),this.emissionOverTime=(r=e.emissionOverTime)!==null&&r!==void 0?r:new U(10),this.emissionOverDistance=(l=e.emissionOverDistance)!==null&&l!==void 0?l:new U(0),this.emissionBursts=(d=e.emissionBursts)!==null&&d!==void 0?d:[],this.onlyUsedByOther=(h=e.onlyUsedByOther)!==null&&h!==void 0?h:!1,this.emitterShape=(u=e.shape)!==null&&u!==void 0?u:new ui,this.behaviors=(p=e.behaviors)!==null&&p!==void 0?p:new Array,this.worldSpace=(m=e.worldSpace)!==null&&m!==void 0?m:!1,this.rendererEmitterSettings=(b=e.rendererEmitterSettings)!==null&&b!==void 0?b:{},e.renderMode===v.StretchedBillBoard){const g=this.rendererEmitterSettings;e.speedFactor!==void 0&&(g.speedFactor=e.speedFactor),g.speedFactor=(G=g.speedFactor)!==null&&G!==void 0?G:0,g.lengthFactor=(y=g.lengthFactor)!==null&&y!==void 0?y:0}this.rendererSettings={instancingGeometry:(Z=e.instancingGeometry)!==null&&Z!==void 0?Z:Jd,renderMode:(X=e.renderMode)!==null&&X!==void 0?X:v.BillBoard,renderOrder:(L=e.renderOrder)!==null&&L!==void 0?L:0,material:e.material,uTileCount:(V=e.uTileCount)!==null&&V!==void 0?V:1,vTileCount:(x=e.vTileCount)!==null&&x!==void 0?x:1,blendTiles:(R=e.blendTiles)!==null&&R!==void 0?R:!1,softParticles:(S=e.softParticles)!==null&&S!==void 0?S:!1,softNearFade:(W=e.softNearFade)!==null&&W!==void 0?W:0,softFarFade:(f=e.softFarFade)!==null&&f!==void 0?f:0,layers:(C=e.layers)!==null&&C!==void 0?C:new xn},this.neededToUpdateRender=!0,this.particles=new Array,this.startTileIndex=e.startTileIndex||new U(0),this.emitter=new Hd(this),this.paused=!1,this.particleNum=0,this.emissionState={isBursting:!1,burstParticleIndex:0,burstParticleCount:0,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,travelDistance:0},this.emissionBursts.forEach(g=>g.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory),this.emitEnded=!1,this.markForDestroy=!1,this.prewarmed=!1}pause(){this.paused=!0}play(){this.paused=!1}stop(){this.restart(),this.pause()}spawn(e,t,i){no.setFromRotationMatrix(i);const s=Nd,o=no,a=Id;i.decompose(s,o,a);for(let c=0;c<e;c++){for(t.burstParticleIndex=c,this.particleNum++;this.particles.length<this.particleNum;)this.rendererSettings.renderMode===v.Trail?this.particles.push(new En):this.particles.push(new bd);const r=this.particles[this.particleNum-1];if(r.reset(),r.speedModifier=1,this.startColor.startGen(r.memory),this.startColor.genColor(r.memory,r.startColor,this.emissionState.time),r.color.copy(r.startColor),this.startSpeed.startGen(r.memory),r.startSpeed=this.startSpeed.genValue(r.memory,t.time/this.duration),this.startLife.startGen(r.memory),r.life=this.startLife.genValue(r.memory,t.time/this.duration),r.age=0,this.startSize.startGen(r.memory),this.startSize.type==="vec3function")this.startSize.genValue(r.memory,r.startSize,t.time/this.duration);else{const l=this.startSize.genValue(r.memory,t.time/this.duration);r.startSize.set(l,l,l)}if(this.startTileIndex.startGen(r.memory),r.uvTile=this.startTileIndex.genValue(r.memory),r.size.copy(r.startSize),this.rendererSettings.renderMode===v.Mesh||this.rendererSettings.renderMode===v.BillBoard||this.rendererSettings.renderMode===v.VerticalBillBoard||this.rendererSettings.renderMode===v.HorizontalBillBoard||this.rendererSettings.renderMode===v.StretchedBillBoard){const l=r;this.startRotation.startGen(r.memory),this.rendererSettings.renderMode===v.Mesh?(l.rotation instanceof F||(l.rotation=new F),this.startRotation.type==="rotation"?this.startRotation.genValue(r.memory,l.rotation,1,t.time/this.duration):l.rotation.setFromAxisAngle(kd,this.startRotation.genValue(l.memory,t.time/this.duration))):this.startRotation.type==="rotation"?l.rotation=0:l.rotation=this.startRotation.genValue(l.memory,t.time/this.duration)}else if(this.rendererSettings.renderMode===v.Trail){const l=r;this.rendererEmitterSettings.startLength.startGen(l.memory),l.length=this.rendererEmitterSettings.startLength.genValue(l.memory,t.time/this.duration)}if(this.emitterShape.initialize(r,t),this.rendererSettings.renderMode===v.Trail&&this.rendererEmitterSettings.followLocalOrigin){const l=r;l.localPosition=new T().copy(l.position)}this.worldSpace?(r.position.applyMatrix4(i),r.startSize.multiply(a).abs(),r.size.copy(r.startSize),r.velocity.multiply(a).applyMatrix3(this.normalMatrix),r.rotation&&r.rotation instanceof F&&r.rotation.multiplyQuaternions(no,r.rotation)):this.onlyUsedByOther&&(r.parentMatrix=i);for(let l=0;l<this.behaviors.length;l++)this.behaviors[l].initialize(r,this)}}endEmit(){this.emitEnded=!0,this.autoDestroy&&(this.markForDestroy=!0),this.fire({type:"emitEnd",particleSystem:this})}dispose(){this._renderer&&this._renderer.deleteSystem(this),this.emitter.dispose(),this.emitter.parent&&this.emitter.parent.remove(this.emitter),this.fire({type:"destroy",particleSystem:this})}restart(){this.memory.length=0,this.paused=!1,this.particleNum=0,this.emissionState.isBursting=!1,this.emissionState.burstIndex=0,this.emissionState.burstWaveIndex=0,this.emissionState.time=0,this.emissionState.waitEmiting=0,this.behaviors.forEach(e=>{e.reset()}),this.emitEnded=!1,this.markForDestroy=!1,this.prewarmed=!1,this.emissionBursts.forEach(e=>e.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory)}update(e){if(this.paused)return;let t=this.emitter;for(;t.parent;)t=t.parent;if(t.type!=="Scene"){this.dispose();return}if(this.firstTimeUpdate&&(this.firstTimeUpdate=!1,this.emitter.updateWorldMatrix(!0,!1)),this.emitEnded&&this.particleNum===0){this.markForDestroy&&this.emitter.parent&&this.dispose();return}if(this.looping&&this.prewarm&&!this.prewarmed){this.prewarmed=!0;for(let i=0;i<this.duration*Cr;i++)this.update(1/Cr)}e>.1&&(e=.1),this.neededToUpdateRender&&(this._renderer&&this._renderer.updateSystem(this),this.neededToUpdateRender=!1),this.onlyUsedByOther||this.emit(e,this.emissionState,this.emitter.matrixWorld),this.emitterShape.update(this,e);for(let i=0;i<this.behaviors.length;i++){this.behaviors[i].frameUpdate(e);for(let s=0;s<this.particleNum;s++)this.particles[s].died||this.behaviors[i].update(this.particles[s],e)}for(let i=0;i<this.particleNum;i++)this.rendererEmitterSettings.followLocalOrigin&&this.particles[i].localPosition?(this.particles[i].position.copy(this.particles[i].localPosition),this.particles[i].parentMatrix?this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix):this.particles[i].position.applyMatrix4(this.emitter.matrixWorld)):this.particles[i].position.addScaledVector(this.particles[i].velocity,e*this.particles[i].speedModifier),this.particles[i].age+=e;if(this.rendererSettings.renderMode===v.Trail)for(let i=0;i<this.particleNum;i++)this.particles[i].update();for(let i=0;i<this.particleNum;i++){const s=this.particles[i];s.died&&(!(s instanceof En)||s.previous.length===0)&&(this.particles[i]=this.particles[this.particleNum-1],this.particles[this.particleNum-1]=s,this.particleNum--,i--,this.fire({type:"particleDied",particleSystem:this,particle:s}))}}emit(e,t,i){t.time>this.duration&&(this.looping?(t.time-=this.duration,t.burstIndex=0,this.behaviors.forEach(o=>{o.reset()})):!this.emitEnded&&!this.onlyUsedByOther&&this.endEmit()),this.normalMatrix.getNormalMatrix(i);const s=Math.ceil(t.waitEmiting);for(this.spawn(s,t,i),t.waitEmiting-=s;t.burstIndex<this.emissionBursts.length&&this.emissionBursts[t.burstIndex].time<=t.time;){if(Math.random()<this.emissionBursts[t.burstIndex].probability){const o=this.emissionBursts[t.burstIndex].count.genValue(this.memory,this.time);t.isBursting=!0,t.burstParticleCount=o,this.spawn(o,t,i),t.isBursting=!1}t.burstIndex++}if(!this.emitEnded&&(t.waitEmiting+=e*this.emissionOverTime.genValue(this.memory,t.time/this.duration),t.previousWorldPos!=null)){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),t.travelDistance+=t.previousWorldPos.distanceTo(this.temp);const o=this.emissionOverDistance.genValue(this.memory,t.time/this.duration);if(t.travelDistance*o>0){const a=Math.floor(t.travelDistance*o);t.travelDistance-=a/o,t.waitEmiting+=a}}t.previousWorldPos===void 0&&(t.previousWorldPos=new T),t.previousWorldPos.set(i.elements[12],i.elements[13],i.elements[14]),t.time+=e}toJSON(e,t={}){var i;if((e===void 0||typeof e=="string")&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}),e.materials[this.rendererSettings.material.uuid]=this.rendererSettings.material.toJSON(e),t.useUrlForImage&&((i=this.texture)===null||i===void 0?void 0:i.source)!==void 0){const a=this.texture.source;e.images[a.uuid]={uuid:a.uuid,url:this.texture.image.url}}let s;this.renderMode===v.Trail?s={startLength:this.rendererEmitterSettings.startLength.toJSON(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin}:this.renderMode===v.Mesh?s={}:this.renderMode===v.StretchedBillBoard?s={speedFactor:this.rendererEmitterSettings.speedFactor,lengthFactor:this.rendererEmitterSettings.lengthFactor}:s={};const o=this.rendererSettings.instancingGeometry;return e.geometries&&!e.geometries[o.uuid]&&(e.geometries[o.uuid]=o.toJSON()),{version:"3.0",autoDestroy:this.autoDestroy,looping:this.looping,prewarm:this.prewarm,duration:this.duration,shape:this.emitterShape.toJSON(),startLife:this.startLife.toJSON(),startSpeed:this.startSpeed.toJSON(),startRotation:this.startRotation.toJSON(),startSize:this.startSize.toJSON(),startColor:this.startColor.toJSON(),emissionOverTime:this.emissionOverTime.toJSON(),emissionOverDistance:this.emissionOverDistance.toJSON(),emissionBursts:this.emissionBursts.map(a=>({time:a.time,count:a.count.toJSON(),probability:a.probability,interval:a.interval,cycle:a.cycle})),onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:this.rendererSettings.instancingGeometry.uuid,renderOrder:this.renderOrder,renderMode:this.renderMode,rendererEmitterSettings:s,material:this.rendererSettings.material.uuid,layers:this.layers.mask,startTileIndex:this.startTileIndex.toJSON(),uTileCount:this.uTileCount,vTileCount:this.vTileCount,blendTiles:this.blendTiles,softParticles:this.rendererSettings.softParticles,softFarFade:this.rendererSettings.softFarFade,softNearFade:this.rendererSettings.softNearFade,behaviors:this.behaviors.map(a=>a.toJSON()),worldSpace:this.worldSpace}}static fromJSON(e,t,i){var s,o;const a=pd(e.shape,t);let c;if(e.renderMode===v.Trail){const d=e.rendererEmitterSettings;c={startLength:d.startLength!=null?I(d.startLength):new U(30),followLocalOrigin:d.followLocalOrigin}}else e.renderMode===v.Mesh?c={}:e.renderMode===v.StretchedBillBoard?(c=e.rendererEmitterSettings,e.speedFactor!=null&&(c.speedFactor=e.speedFactor)):c={};const r=new xn;e.layers&&(r.mask=e.layers);const l=new Ls({autoDestroy:e.autoDestroy,looping:e.looping,prewarm:e.prewarm,duration:e.duration,shape:a,startLife:I(e.startLife),startSpeed:I(e.startSpeed),startRotation:wn(e.startRotation),startSize:wn(e.startSize),startColor:qs(e.startColor),emissionOverTime:I(e.emissionOverTime),emissionOverDistance:I(e.emissionOverDistance),emissionBursts:(s=e.emissionBursts)===null||s===void 0?void 0:s.map(d=>{var h,u,p;return{time:d.time,count:typeof d.count=="number"?new U(d.count):I(d.count),probability:(h=d.probability)!==null&&h!==void 0?h:1,interval:(u=d.interval)!==null&&u!==void 0?u:.1,cycle:(p=d.cycle)!==null&&p!==void 0?p:1}}),onlyUsedByOther:e.onlyUsedByOther,instancingGeometry:t.geometries[e.instancingGeometry],renderMode:e.renderMode,rendererEmitterSettings:c,renderOrder:e.renderOrder,layers:r,material:e.material?t.materials[e.material]:e.texture?new xs({map:t.textures[e.texture],transparent:(o=e.transparent)!==null&&o!==void 0?o:!0,blending:e.blending,side:Ss}):new xs({color:16777215,transparent:!0,blending:Uo,side:Ss}),startTileIndex:typeof e.startTileIndex=="number"?new U(e.startTileIndex):I(e.startTileIndex),uTileCount:e.uTileCount,vTileCount:e.vTileCount,blendTiles:e.blendTiles,softParticles:e.softParticles,softFarFade:e.softFarFade,softNearFade:e.softNearFade,behaviors:[],worldSpace:e.worldSpace});return l.behaviors=e.behaviors.map(d=>{const h=xd(d,l);return h.type==="EmitSubParticleSystem"&&(i[d.subParticleSystem]=h),h}),l}addBehavior(e){this.behaviors.push(e)}getRendererSettings(){return this.rendererSettings}addEventListener(e,t){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t)}removeAllEventListeners(e){this.listeners[e]&&(this.listeners[e]=[])}removeEventListener(e,t){if(this.listeners[e]){const i=this.listeners[e].indexOf(t);i!==-1&&this.listeners[e].splice(i,1)}}fire(e){this.listeners[e.type]&&this.listeners[e.type].forEach(t=>t(e))}clone(){const e=[];for(const o of this.emissionBursts){const a={};Object.assign(a,o),e.push(a)}const t=[];for(const o of this.behaviors)t.push(o.clone());let i;this.renderMode===v.Trail?i={startLength:this.rendererEmitterSettings.startLength.clone(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin}:this.renderMode===v.StretchedBillBoard?i={lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:i={};const s=new xn;return s.mask=this.layers.mask,new Ls({autoDestroy:this.autoDestroy,looping:this.looping,duration:this.duration,shape:this.emitterShape.clone(),startLife:this.startLife.clone(),startSpeed:this.startSpeed.clone(),startRotation:this.startRotation.clone(),startSize:this.startSize.clone(),startColor:this.startColor.clone(),emissionOverTime:this.emissionOverTime.clone(),emissionOverDistance:this.emissionOverDistance.clone(),emissionBursts:e,onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:this.rendererSettings.instancingGeometry,renderMode:this.renderMode,renderOrder:this.renderOrder,rendererEmitterSettings:i,material:this.rendererSettings.material,startTileIndex:this.startTileIndex,uTileCount:this.uTileCount,vTileCount:this.vTileCount,blendTiles:this.blendTiles,softParticles:this.softParticles,softFarFade:this.softFarFade,softNearFade:this.softNearFade,behaviors:t,worldSpace:this.worldSpace,layers:s})}}var so=`
604
+ `;const gt=bc;function Oh(){gt.tile_pars_vertex=kh,gt.tile_vertex=Rh,gt.tile_pars_fragment=Ah,gt.tile_fragment=Eh,gt.soft_pars_vertex=Ch,gt.soft_vertex=Ph,gt.soft_pars_fragment=Th,gt.soft_fragment=Mh}class Bh extends Tr{constructor(e){super(),this.type="ParticleEmitter",this.system=e}clone(){const e=this.system.clone();return e.emitter.copy(this,!0),e.emitter}dispose(){}extractFromCache(e){const t=[];for(const i in e){const r=e[i];delete r.metadata,t.push(r)}return t}toJSON(e,t={}){const i=this.children;this.children=this.children.filter(s=>s.type!=="ParticleSystemPreview");const r=super.toJSON(e);return this.children=i,this.system!==null&&(r.object.ps=this.system.toJSON(e,t)),r}}var k;(function(n){n[n.BillBoard=0]="BillBoard",n[n.StretchedBillBoard=1]="StretchedBillBoard",n[n.Mesh=2]="Mesh",n[n.Trail=3]="Trail",n[n.HorizontalBillBoard=4]="HorizontalBillBoard",n[n.VerticalBillBoard=5]="VerticalBillBoard"})(k||(k={}));class Pa extends Mn{constructor(e){super(),this.type="VFXBatch",this.maxParticles=1e3,this.systems=new Set;const t=new wn;t.mask=e.layers.mask;const i=e.material.clone();i.defines={},Object.assign(i.defines,e.material.defines),this.settings={instancingGeometry:e.instancingGeometry,renderMode:e.renderMode,renderOrder:e.renderOrder,material:i,uTileCount:e.uTileCount,vTileCount:e.vTileCount,blendTiles:e.blendTiles,softParticles:e.softParticles,softNearFade:e.softNearFade,softFarFade:e.softFarFade,layers:t},this.frustumCulled=!1,this.renderOrder=this.settings.renderOrder}addSystem(e){this.systems.add(e)}removeSystem(e){this.systems.delete(e)}applyDepthTexture(e){const t=this.material.uniforms.depthTexture;t&&t.value!==e&&(t.value=e,this.material.needsUpdate=!0)}}const Ih=new B(0,0,1),ns=new J,zh=new B,Nh=new B;new B;const Ea=60,Uh=new Ds(1,1,1,1);class Sr{set time(e){this.emissionState.time=e}get time(){return this.emissionState.time}get layers(){return this.rendererSettings.layers}get texture(){return this.rendererSettings.material.map}set texture(e){this.rendererSettings.material.map=e,this.neededToUpdateRender=!0}get material(){return this.rendererSettings.material}set material(e){this.rendererSettings.material=e,this.neededToUpdateRender=!0}get uTileCount(){return this.rendererSettings.uTileCount}set uTileCount(e){this.rendererSettings.uTileCount=e,this.neededToUpdateRender=!0}get vTileCount(){return this.rendererSettings.vTileCount}set vTileCount(e){this.rendererSettings.vTileCount=e,this.neededToUpdateRender=!0}get blendTiles(){return this.rendererSettings.blendTiles}set blendTiles(e){this.rendererSettings.blendTiles=e,this.neededToUpdateRender=!0}get softParticles(){return this.rendererSettings.softParticles}set softParticles(e){this.rendererSettings.softParticles=e,this.neededToUpdateRender=!0}get softNearFade(){return this.rendererSettings.softNearFade}set softNearFade(e){this.rendererSettings.softNearFade=e,this.neededToUpdateRender=!0}get softFarFade(){return this.rendererSettings.softFarFade}set softFarFade(e){this.rendererSettings.softFarFade=e,this.neededToUpdateRender=!0}get instancingGeometry(){return this.rendererSettings.instancingGeometry}set instancingGeometry(e){this.restart(),this.particles.length=0,this.rendererSettings.instancingGeometry=e,this.neededToUpdateRender=!0}get renderMode(){return this.rendererSettings.renderMode}set renderMode(e){if((this.rendererSettings.renderMode!=k.Trail&&e===k.Trail||this.rendererSettings.renderMode==k.Trail&&e!==k.Trail)&&(this.restart(),this.particles.length=0),this.rendererSettings.renderMode!==e)switch(e){case k.Trail:this.rendererEmitterSettings={startLength:new L(30),followLocalOrigin:!1};break;case k.Mesh:this.rendererEmitterSettings={geometry:new Ds(1,1)},this.startRotation=new Yi(new B(0,1,0),new L(0));break;case k.StretchedBillBoard:this.rendererEmitterSettings={speedFactor:0,lengthFactor:2},this.rendererSettings.renderMode===k.Mesh&&(this.startRotation=new L(0));break;case k.BillBoard:case k.VerticalBillBoard:case k.HorizontalBillBoard:this.rendererEmitterSettings={},this.rendererSettings.renderMode===k.Mesh&&(this.startRotation=new L(0));break}this.rendererSettings.renderMode=e,this.neededToUpdateRender=!0}get renderOrder(){return this.rendererSettings.renderOrder}set renderOrder(e){this.rendererSettings.renderOrder=e,this.neededToUpdateRender=!0}get blending(){return this.rendererSettings.material.blending}set blending(e){this.rendererSettings.material.blending=e,this.neededToUpdateRender=!0}constructor(e){var t,i,r,s,o,l,a,c,h,u,d,p,f,m,g,y,v,b,S,x,w,_,M,C,T,E;if(this.temp=new B,this.travelDistance=0,this.normalMatrix=new tt,this.memory=[],this.listeners={},this.firstTimeUpdate=!0,this.autoDestroy=e.autoDestroy===void 0?!1:e.autoDestroy,this.duration=(t=e.duration)!==null&&t!==void 0?t:1,this.looping=e.looping===void 0?!0:e.looping,this.prewarm=e.prewarm===void 0?!1:e.prewarm,this.startLife=(i=e.startLife)!==null&&i!==void 0?i:new L(5),this.startSpeed=(r=e.startSpeed)!==null&&r!==void 0?r:new L(0),this.startRotation=(s=e.startRotation)!==null&&s!==void 0?s:new L(0),this.startSize=(o=e.startSize)!==null&&o!==void 0?o:new L(1),this.startColor=(l=e.startColor)!==null&&l!==void 0?l:new Gt(new Ee(1,1,1,1)),this.emissionOverTime=(a=e.emissionOverTime)!==null&&a!==void 0?a:new L(10),this.emissionOverDistance=(c=e.emissionOverDistance)!==null&&c!==void 0?c:new L(0),this.emissionBursts=(h=e.emissionBursts)!==null&&h!==void 0?h:[],this.onlyUsedByOther=(u=e.onlyUsedByOther)!==null&&u!==void 0?u:!1,this.emitterShape=(d=e.shape)!==null&&d!==void 0?d:new di,this.behaviors=(p=e.behaviors)!==null&&p!==void 0?p:new Array,this.worldSpace=(f=e.worldSpace)!==null&&f!==void 0?f:!1,this.rendererEmitterSettings=(m=e.rendererEmitterSettings)!==null&&m!==void 0?m:{},e.renderMode===k.StretchedBillBoard){const P=this.rendererEmitterSettings;e.speedFactor!==void 0&&(P.speedFactor=e.speedFactor),P.speedFactor=(g=P.speedFactor)!==null&&g!==void 0?g:0,P.lengthFactor=(y=P.lengthFactor)!==null&&y!==void 0?y:0}this.rendererSettings={instancingGeometry:(v=e.instancingGeometry)!==null&&v!==void 0?v:Uh,renderMode:(b=e.renderMode)!==null&&b!==void 0?b:k.BillBoard,renderOrder:(S=e.renderOrder)!==null&&S!==void 0?S:0,material:e.material,uTileCount:(x=e.uTileCount)!==null&&x!==void 0?x:1,vTileCount:(w=e.vTileCount)!==null&&w!==void 0?w:1,blendTiles:(_=e.blendTiles)!==null&&_!==void 0?_:!1,softParticles:(M=e.softParticles)!==null&&M!==void 0?M:!1,softNearFade:(C=e.softNearFade)!==null&&C!==void 0?C:0,softFarFade:(T=e.softFarFade)!==null&&T!==void 0?T:0,layers:(E=e.layers)!==null&&E!==void 0?E:new wn},this.neededToUpdateRender=!0,this.particles=new Array,this.startTileIndex=e.startTileIndex||new L(0),this.emitter=new Bh(this),this.paused=!1,this.particleNum=0,this.emissionState={isBursting:!1,burstParticleIndex:0,burstParticleCount:0,burstIndex:0,burstWaveIndex:0,time:0,waitEmiting:0,travelDistance:0},this.emissionBursts.forEach(P=>P.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory),this.emitEnded=!1,this.markForDestroy=!1,this.prewarmed=!1}pause(){this.paused=!0}play(){this.paused=!1}stop(){this.restart(),this.pause()}spawn(e,t,i){ns.setFromRotationMatrix(i);const r=zh,s=ns,o=Nh;i.decompose(r,s,o);for(let l=0;l<e;l++){for(t.burstParticleIndex=l,this.particleNum++;this.particles.length<this.particleNum;)this.rendererSettings.renderMode===k.Trail?this.particles.push(new Hn):this.particles.push(new ph);const a=this.particles[this.particleNum-1];if(a.reset(),a.speedModifier=1,this.startColor.startGen(a.memory),this.startColor.genColor(a.memory,a.startColor,this.emissionState.time),a.color.copy(a.startColor),this.startSpeed.startGen(a.memory),a.startSpeed=this.startSpeed.genValue(a.memory,t.time/this.duration),this.startLife.startGen(a.memory),a.life=this.startLife.genValue(a.memory,t.time/this.duration),a.age=0,this.startSize.startGen(a.memory),this.startSize.type==="vec3function")this.startSize.genValue(a.memory,a.startSize,t.time/this.duration);else{const c=this.startSize.genValue(a.memory,t.time/this.duration);a.startSize.set(c,c,c)}if(this.startTileIndex.startGen(a.memory),a.uvTile=this.startTileIndex.genValue(a.memory),a.size.copy(a.startSize),this.rendererSettings.renderMode===k.Mesh||this.rendererSettings.renderMode===k.BillBoard||this.rendererSettings.renderMode===k.VerticalBillBoard||this.rendererSettings.renderMode===k.HorizontalBillBoard||this.rendererSettings.renderMode===k.StretchedBillBoard){const c=a;this.startRotation.startGen(a.memory),this.rendererSettings.renderMode===k.Mesh?(c.rotation instanceof J||(c.rotation=new J),this.startRotation.type==="rotation"?this.startRotation.genValue(a.memory,c.rotation,1,t.time/this.duration):c.rotation.setFromAxisAngle(Ih,this.startRotation.genValue(c.memory,t.time/this.duration))):this.startRotation.type==="rotation"?c.rotation=0:c.rotation=this.startRotation.genValue(c.memory,t.time/this.duration)}else if(this.rendererSettings.renderMode===k.Trail){const c=a;this.rendererEmitterSettings.startLength.startGen(c.memory),c.length=this.rendererEmitterSettings.startLength.genValue(c.memory,t.time/this.duration)}if(this.emitterShape.initialize(a,t),this.rendererSettings.renderMode===k.Trail&&this.rendererEmitterSettings.followLocalOrigin){const c=a;c.localPosition=new B().copy(c.position)}this.worldSpace?(a.position.applyMatrix4(i),a.startSize.multiply(o).abs(),a.size.copy(a.startSize),a.velocity.multiply(o).applyMatrix3(this.normalMatrix),a.rotation&&a.rotation instanceof J&&a.rotation.multiplyQuaternions(ns,a.rotation)):this.onlyUsedByOther&&(a.parentMatrix=i);for(let c=0;c<this.behaviors.length;c++)this.behaviors[c].initialize(a,this)}}endEmit(){this.emitEnded=!0,this.autoDestroy&&(this.markForDestroy=!0),this.fire({type:"emitEnd",particleSystem:this})}dispose(){this._renderer&&this._renderer.deleteSystem(this),this.emitter.dispose(),this.emitter.parent&&this.emitter.parent.remove(this.emitter),this.fire({type:"destroy",particleSystem:this})}restart(){this.memory.length=0,this.paused=!1,this.particleNum=0,this.emissionState.isBursting=!1,this.emissionState.burstIndex=0,this.emissionState.burstWaveIndex=0,this.emissionState.time=0,this.emissionState.waitEmiting=0,this.behaviors.forEach(e=>{e.reset()}),this.emitEnded=!1,this.markForDestroy=!1,this.prewarmed=!1,this.emissionBursts.forEach(e=>e.count.startGen(this.memory)),this.emissionOverDistance.startGen(this.memory)}update(e){if(this.paused)return;let t=this.emitter;for(;t.parent;)t=t.parent;if(t.type!=="Scene"){this.dispose();return}if(this.firstTimeUpdate&&(this.firstTimeUpdate=!1,this.emitter.updateWorldMatrix(!0,!1)),this.emitEnded&&this.particleNum===0){this.markForDestroy&&this.emitter.parent&&this.dispose();return}if(this.looping&&this.prewarm&&!this.prewarmed){this.prewarmed=!0;for(let i=0;i<this.duration*Ea;i++)this.update(1/Ea)}e>.1&&(e=.1),this.neededToUpdateRender&&(this._renderer&&this._renderer.updateSystem(this),this.neededToUpdateRender=!1),this.onlyUsedByOther||this.emit(e,this.emissionState,this.emitter.matrixWorld),this.emitterShape.update(this,e);for(let i=0;i<this.behaviors.length;i++){this.behaviors[i].frameUpdate(e);for(let r=0;r<this.particleNum;r++)this.particles[r].died||this.behaviors[i].update(this.particles[r],e)}for(let i=0;i<this.particleNum;i++)this.rendererEmitterSettings.followLocalOrigin&&this.particles[i].localPosition?(this.particles[i].position.copy(this.particles[i].localPosition),this.particles[i].parentMatrix?this.particles[i].position.applyMatrix4(this.particles[i].parentMatrix):this.particles[i].position.applyMatrix4(this.emitter.matrixWorld)):this.particles[i].position.addScaledVector(this.particles[i].velocity,e*this.particles[i].speedModifier),this.particles[i].age+=e;if(this.rendererSettings.renderMode===k.Trail)for(let i=0;i<this.particleNum;i++)this.particles[i].update();for(let i=0;i<this.particleNum;i++){const r=this.particles[i];r.died&&(!(r instanceof Hn)||r.previous.length===0)&&(this.particles[i]=this.particles[this.particleNum-1],this.particles[this.particleNum-1]=r,this.particleNum--,i--,this.fire({type:"particleDied",particleSystem:this,particle:r}))}}emit(e,t,i){t.time>this.duration&&(this.looping?(t.time-=this.duration,t.burstIndex=0,this.behaviors.forEach(s=>{s.reset()})):!this.emitEnded&&!this.onlyUsedByOther&&this.endEmit()),this.normalMatrix.getNormalMatrix(i);const r=Math.ceil(t.waitEmiting);for(this.spawn(r,t,i),t.waitEmiting-=r;t.burstIndex<this.emissionBursts.length&&this.emissionBursts[t.burstIndex].time<=t.time;){if(Math.random()<this.emissionBursts[t.burstIndex].probability){const s=this.emissionBursts[t.burstIndex].count.genValue(this.memory,this.time);t.isBursting=!0,t.burstParticleCount=s,this.spawn(s,t,i),t.isBursting=!1}t.burstIndex++}if(!this.emitEnded&&(t.waitEmiting+=e*this.emissionOverTime.genValue(this.memory,t.time/this.duration),t.previousWorldPos!=null)){this.temp.set(i.elements[12],i.elements[13],i.elements[14]),t.travelDistance+=t.previousWorldPos.distanceTo(this.temp);const s=this.emissionOverDistance.genValue(this.memory,t.time/this.duration);if(t.travelDistance*s>0){const o=Math.floor(t.travelDistance*s);t.travelDistance-=o/s,t.waitEmiting+=o}}t.previousWorldPos===void 0&&(t.previousWorldPos=new B),t.previousWorldPos.set(i.elements[12],i.elements[13],i.elements[14]),t.time+=e}toJSON(e,t={}){var i;if((e===void 0||typeof e=="string")&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{},nodes:{}}),e.materials[this.rendererSettings.material.uuid]=this.rendererSettings.material.toJSON(e),t.useUrlForImage&&((i=this.texture)===null||i===void 0?void 0:i.source)!==void 0){const o=this.texture.source;e.images[o.uuid]={uuid:o.uuid,url:this.texture.image.url}}let r;this.renderMode===k.Trail?r={startLength:this.rendererEmitterSettings.startLength.toJSON(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin}:this.renderMode===k.Mesh?r={}:this.renderMode===k.StretchedBillBoard?r={speedFactor:this.rendererEmitterSettings.speedFactor,lengthFactor:this.rendererEmitterSettings.lengthFactor}:r={};const s=this.rendererSettings.instancingGeometry;return e.geometries&&!e.geometries[s.uuid]&&(e.geometries[s.uuid]=s.toJSON()),{version:"3.0",autoDestroy:this.autoDestroy,looping:this.looping,prewarm:this.prewarm,duration:this.duration,shape:this.emitterShape.toJSON(),startLife:this.startLife.toJSON(),startSpeed:this.startSpeed.toJSON(),startRotation:this.startRotation.toJSON(),startSize:this.startSize.toJSON(),startColor:this.startColor.toJSON(),emissionOverTime:this.emissionOverTime.toJSON(),emissionOverDistance:this.emissionOverDistance.toJSON(),emissionBursts:this.emissionBursts.map(o=>({time:o.time,count:o.count.toJSON(),probability:o.probability,interval:o.interval,cycle:o.cycle})),onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:this.rendererSettings.instancingGeometry.uuid,renderOrder:this.renderOrder,renderMode:this.renderMode,rendererEmitterSettings:r,material:this.rendererSettings.material.uuid,layers:this.layers.mask,startTileIndex:this.startTileIndex.toJSON(),uTileCount:this.uTileCount,vTileCount:this.vTileCount,blendTiles:this.blendTiles,softParticles:this.rendererSettings.softParticles,softFarFade:this.rendererSettings.softFarFade,softNearFade:this.rendererSettings.softNearFade,behaviors:this.behaviors.map(o=>o.toJSON()),worldSpace:this.worldSpace}}static fromJSON(e,t,i){var r,s;const o=uh(e.shape,t);let l;if(e.renderMode===k.Trail){const h=e.rendererEmitterSettings;l={startLength:h.startLength!=null?D(h.startLength):new L(30),followLocalOrigin:h.followLocalOrigin}}else e.renderMode===k.Mesh?l={}:e.renderMode===k.StretchedBillBoard?(l=e.rendererEmitterSettings,e.speedFactor!=null&&(l.speedFactor=e.speedFactor)):l={};const a=new wn;e.layers&&(a.mask=e.layers);const c=new Sr({autoDestroy:e.autoDestroy,looping:e.looping,prewarm:e.prewarm,duration:e.duration,shape:o,startLife:D(e.startLife),startSpeed:D(e.startSpeed),startRotation:jn(e.startRotation),startSize:jn(e.startSize),startColor:Kr(e.startColor),emissionOverTime:D(e.emissionOverTime),emissionOverDistance:D(e.emissionOverDistance),emissionBursts:(r=e.emissionBursts)===null||r===void 0?void 0:r.map(h=>{var u,d,p;return{time:h.time,count:typeof h.count=="number"?new L(h.count):D(h.count),probability:(u=h.probability)!==null&&u!==void 0?u:1,interval:(d=h.interval)!==null&&d!==void 0?d:.1,cycle:(p=h.cycle)!==null&&p!==void 0?p:1}}),onlyUsedByOther:e.onlyUsedByOther,instancingGeometry:t.geometries[e.instancingGeometry],renderMode:e.renderMode,rendererEmitterSettings:l,renderOrder:e.renderOrder,layers:a,material:e.material?t.materials[e.material]:e.texture?new wr({map:t.textures[e.texture],transparent:(s=e.transparent)!==null&&s!==void 0?s:!0,blending:e.blending,side:Mr}):new wr({color:16777215,transparent:!0,blending:Fs,side:Mr}),startTileIndex:typeof e.startTileIndex=="number"?new L(e.startTileIndex):D(e.startTileIndex),uTileCount:e.uTileCount,vTileCount:e.vTileCount,blendTiles:e.blendTiles,softParticles:e.softParticles,softFarFade:e.softFarFade,softNearFade:e.softNearFade,behaviors:[],worldSpace:e.worldSpace});return c.behaviors=e.behaviors.map(h=>{const u=_h(h,c);return u.type==="EmitSubParticleSystem"&&(i[h.subParticleSystem]=u),u}),c}addBehavior(e){this.behaviors.push(e)}getRendererSettings(){return this.rendererSettings}addEventListener(e,t){this.listeners[e]||(this.listeners[e]=[]),this.listeners[e].push(t)}removeAllEventListeners(e){this.listeners[e]&&(this.listeners[e]=[])}removeEventListener(e,t){if(this.listeners[e]){const i=this.listeners[e].indexOf(t);i!==-1&&this.listeners[e].splice(i,1)}}fire(e){this.listeners[e.type]&&this.listeners[e.type].forEach(t=>t(e))}clone(){const e=[];for(const s of this.emissionBursts){const o={};Object.assign(o,s),e.push(o)}const t=[];for(const s of this.behaviors)t.push(s.clone());let i;this.renderMode===k.Trail?i={startLength:this.rendererEmitterSettings.startLength.clone(),followLocalOrigin:this.rendererEmitterSettings.followLocalOrigin}:this.renderMode===k.StretchedBillBoard?i={lengthFactor:this.rendererEmitterSettings.lengthFactor,speedFactor:this.rendererEmitterSettings.speedFactor}:i={};const r=new wn;return r.mask=this.layers.mask,new Sr({autoDestroy:this.autoDestroy,looping:this.looping,duration:this.duration,shape:this.emitterShape.clone(),startLife:this.startLife.clone(),startSpeed:this.startSpeed.clone(),startRotation:this.startRotation.clone(),startSize:this.startSize.clone(),startColor:this.startColor.clone(),emissionOverTime:this.emissionOverTime.clone(),emissionOverDistance:this.emissionOverDistance.clone(),emissionBursts:e,onlyUsedByOther:this.onlyUsedByOther,instancingGeometry:this.rendererSettings.instancingGeometry,renderMode:this.renderMode,renderOrder:this.renderOrder,rendererEmitterSettings:i,material:this.rendererSettings.material,startTileIndex:this.startTileIndex,uTileCount:this.uTileCount,vTileCount:this.vTileCount,blendTiles:this.blendTiles,softParticles:this.softParticles,softFarFade:this.softFarFade,softNearFade:this.softNearFade,behaviors:t,worldSpace:this.worldSpace,layers:r})}}var rs=`
605
605
 
606
606
  #include <common>
607
607
  #include <color_pars_fragment>
@@ -636,7 +636,7 @@ void main() {
636
636
  #include <soft_fragment>
637
637
  #include <tonemapping_fragment>
638
638
  }
639
- `,oo=`
639
+ `,ss=`
640
640
  #define STANDARD
641
641
 
642
642
  #ifdef PHYSICAL
@@ -801,7 +801,7 @@ outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoat
801
801
  #include <fog_fragment>
802
802
  #include <premultiplied_alpha_fragment>
803
803
  #include <dithering_fragment>
804
- }`,Ud=`
804
+ }`,Dh=`
805
805
  #include <common>
806
806
  #include <color_pars_vertex>
807
807
  #include <logdepthbuf_pars_vertex>
@@ -847,7 +847,7 @@ void main() {
847
847
  #include <tile_vertex>
848
848
  #include <soft_vertex>
849
849
  }
850
- `,Pd=`
850
+ `,Fh=`
851
851
  #include <common>
852
852
  #include <color_pars_vertex>
853
853
  #include <logdepthbuf_pars_vertex>
@@ -884,7 +884,7 @@ void main() {
884
884
  #include <tile_vertex>
885
885
  #include <soft_vertex>
886
886
  }
887
- `,ao=`
887
+ `,os=`
888
888
  #define STANDARD
889
889
  varying vec3 vViewPosition;
890
890
  #ifdef USE_TRANSMISSION
@@ -969,7 +969,7 @@ void main() {
969
969
  vWorldPosition = worldPosition.xyz;
970
970
  #endif
971
971
  }
972
- `,wd=`
972
+ `,Lh=`
973
973
  #include <common>
974
974
  #include <color_pars_vertex>
975
975
  #include <logdepthbuf_pars_vertex>
@@ -1010,7 +1010,7 @@ void main() {
1010
1010
  #include <tile_vertex>
1011
1011
  #include <soft_vertex>
1012
1012
  }
1013
- `;function ro(n){return n===0?"uv":`uv${n}`}class Fd extends xl{constructor(e){super(e)}onBeforeCompile(e,t){super.onBeforeCompile(e,t),e.vertexShader=ao,e.fragmentShader=oo}}class Qd extends Sl{constructor(e){super(e)}onBeforeCompile(e,t){super.onBeforeCompile(e,t),e.vertexShader=ao,e.fragmentShader=oo}}class Bd extends gr{constructor(e){super(e),this.vector_=new T,this.vector2_=new T,this.vector3_=new T,this.quaternion_=new F,this.quaternion2_=new F,this.quaternion3_=new F,this.rotationMat_=new tt,this.rotationMat2_=new tt,this.maxParticles=1e3,this.setupBuffers(),this.rebuildMaterial()}buildExpandableBuffers(){this.offsetBuffer=new Yt(new Float32Array(this.maxParticles*3),3),this.offsetBuffer.setUsage(Ve),this.geometry.setAttribute("offset",this.offsetBuffer),this.colorBuffer=new Yt(new Float32Array(this.maxParticles*4),4),this.colorBuffer.setUsage(Ve),this.geometry.setAttribute("color",this.colorBuffer),this.settings.renderMode===v.Mesh?(this.rotationBuffer=new Yt(new Float32Array(this.maxParticles*4),4),this.rotationBuffer.setUsage(Ve),this.geometry.setAttribute("rotation",this.rotationBuffer)):(this.settings.renderMode===v.BillBoard||this.settings.renderMode===v.HorizontalBillBoard||this.settings.renderMode===v.VerticalBillBoard||this.settings.renderMode===v.StretchedBillBoard)&&(this.rotationBuffer=new Yt(new Float32Array(this.maxParticles),1),this.rotationBuffer.setUsage(Ve),this.geometry.setAttribute("rotation",this.rotationBuffer)),this.sizeBuffer=new Yt(new Float32Array(this.maxParticles*3),3),this.sizeBuffer.setUsage(Ve),this.geometry.setAttribute("size",this.sizeBuffer),this.uvTileBuffer=new Yt(new Float32Array(this.maxParticles),1),this.uvTileBuffer.setUsage(Ve),this.geometry.setAttribute("uvTile",this.uvTileBuffer),this.settings.renderMode===v.StretchedBillBoard&&(this.velocityBuffer=new Yt(new Float32Array(this.maxParticles*4),4),this.velocityBuffer.setUsage(Ve),this.geometry.setAttribute("velocity",this.velocityBuffer))}setupBuffers(){this.geometry&&this.geometry.dispose(),this.geometry=new Ll,this.geometry.setIndex(this.settings.instancingGeometry.getIndex()),this.settings.instancingGeometry.hasAttribute("normal")&&this.geometry.setAttribute("normal",this.settings.instancingGeometry.getAttribute("normal")),this.geometry.setAttribute("position",this.settings.instancingGeometry.getAttribute("position")),this.geometry.setAttribute("uv",this.settings.instancingGeometry.getAttribute("uv")),this.buildExpandableBuffers()}expandBuffers(e){for(;e>=this.maxParticles;)this.maxParticles*=2;this.setupBuffers()}rebuildMaterial(){this.layers.mask=this.settings.layers.mask;const e={},t={};this.settings.material.type!=="MeshStandardMaterial"&&this.settings.material.type!=="MeshPhysicalMaterial"&&(e.map=new Fe(this.settings.material.map)),this.settings.material.alphaTest&&(t.USE_ALPHATEST="",e.alphaTest=new Fe(this.settings.material.alphaTest)),t.USE_UV="";const i=this.settings.uTileCount,s=this.settings.vTileCount;(i>1||s>1)&&(t.UV_TILE="",e.tileCount=new Fe(new di(i,s))),this.settings.material.defines&&this.settings.material.defines.USE_COLOR_AS_ALPHA!==void 0&&(t.USE_COLOR_AS_ALPHA=""),this.settings.material.normalMap&&(t.USE_NORMALMAP="",t.NORMALMAP_UV=ro(this.settings.material.normalMap.channel),e.normalMapTransform=new Fe(new tt().copy(this.settings.material.normalMap.matrix))),this.settings.material.map&&(t.USE_MAP="",this.settings.blendTiles&&(t.TILE_BLEND=""),t.MAP_UV=ro(this.settings.material.map.channel),e.mapTransform=new Fe(new tt().copy(this.settings.material.map.matrix))),t.USE_COLOR_ALPHA="";let o;if(this.settings.softParticles){t.SOFT_PARTICLES="";const c=this.settings.softNearFade,r=1/(this.settings.softFarFade-this.settings.softNearFade);e.softParams=new Fe(new di(c,r)),e.depthTexture=new Fe(null);const l=e.projParams=new Fe(new Ce);o=(d,h,u)=>{l.value.set(u.near,u.far,0,0)}}let a=!1;if(this.settings.renderMode===v.BillBoard||this.settings.renderMode===v.VerticalBillBoard||this.settings.renderMode===v.HorizontalBillBoard||this.settings.renderMode===v.Mesh){let c,r;this.settings.renderMode===v.Mesh?this.settings.material.type==="MeshStandardMaterial"||this.settings.material.type==="MeshPhysicalMaterial"?(t.USE_COLOR="",c=ao,r=oo,a=!0):(c=Pd,r=so):(c=Ud,r=so),this.settings.renderMode===v.VerticalBillBoard?t.VERTICAL="":this.settings.renderMode===v.HorizontalBillBoard&&(t.HORIZONTAL="");let l=!1;this.settings.renderMode===v.Mesh&&(this.settings.material.type==="MeshStandardMaterial"?(this.material=new Fd({}),this.material.copy(this.settings.material),this.material.uniforms=e,this.material.defines=t,l=!0):this.settings.material.type==="MeshPhysicalMaterial"&&(this.material=new Qd({}),this.material.copy(this.settings.material),this.material.uniforms=e,this.material.defines=t,l=!0)),l||(this.material=new Ws({uniforms:e,defines:t,vertexShader:c,fragmentShader:r,transparent:this.settings.material.transparent,depthWrite:!this.settings.material.transparent,blending:this.settings.material.blending,blendDst:this.settings.material.blendDst,blendSrc:this.settings.material.blendSrc,blendEquation:this.settings.material.blendEquation,premultipliedAlpha:this.settings.material.premultipliedAlpha,side:this.settings.material.side,alphaTest:this.settings.material.alphaTest,depthTest:this.settings.material.depthTest,lights:a}))}else if(this.settings.renderMode===v.StretchedBillBoard)e.speedFactor=new Fe(1),this.material=new Ws({uniforms:e,defines:t,vertexShader:wd,fragmentShader:so,transparent:this.settings.material.transparent,depthWrite:!this.settings.material.transparent,blending:this.settings.material.blending,blendDst:this.settings.material.blendDst,blendSrc:this.settings.material.blendSrc,blendEquation:this.settings.material.blendEquation,premultipliedAlpha:this.settings.material.premultipliedAlpha,side:this.settings.material.side,alphaTest:this.settings.material.alphaTest,depthTest:this.settings.material.depthTest});else throw new Error("render mode unavailable");this.material&&o&&(this.material.onBeforeRender=o)}update(){let e=0,t=0;this.systems.forEach(i=>{t+=i.particleNum}),t>this.maxParticles&&this.expandBuffers(t),this.systems.forEach(i=>{i.emitter.updateMatrixWorld&&(i.emitter.updateWorldMatrix(!0,!1),i.emitter.updateMatrixWorld(!0));const s=i.particles,o=i.particleNum,a=this.quaternion2_,c=this.vector2_,r=this.vector3_;i.emitter.matrixWorld.decompose(c,a,r),this.rotationMat_.setFromMatrix4(i.emitter.matrixWorld);for(let l=0;l<o;l++,e++){const d=s[l];if(this.settings.renderMode===v.Mesh){let u;if(i.worldSpace)u=d.rotation;else{let p;d.parentMatrix?p=this.quaternion3_.setFromRotationMatrix(d.parentMatrix):p=a,u=this.quaternion_,u.copy(p).multiply(d.rotation)}this.rotationBuffer.setXYZW(e,u.x,u.y,u.z,u.w)}else(this.settings.renderMode===v.StretchedBillBoard||this.settings.renderMode===v.VerticalBillBoard||this.settings.renderMode===v.HorizontalBillBoard||this.settings.renderMode===v.BillBoard)&&this.rotationBuffer.setX(e,d.rotation);let h;if(i.worldSpace?h=d.position:(h=this.vector_,d.parentMatrix?h.copy(d.position).applyMatrix4(d.parentMatrix):h.copy(d.position).applyMatrix4(i.emitter.matrixWorld)),this.offsetBuffer.setXYZ(e,h.x,h.y,h.z),this.colorBuffer.setXYZW(e,d.color.x,d.color.y,d.color.z,d.color.w),i.worldSpace?this.sizeBuffer.setXYZ(e,d.size.x,d.size.y,d.size.z):d.parentMatrix?this.sizeBuffer.setXYZ(e,d.size.x,d.size.y,d.size.z):this.sizeBuffer.setXYZ(e,d.size.x*Math.abs(r.x),d.size.y*Math.abs(r.y),d.size.z*Math.abs(r.z)),this.uvTileBuffer.setX(e,d.uvTile),this.settings.renderMode===v.StretchedBillBoard&&this.velocityBuffer){let u=i.rendererEmitterSettings.speedFactor;u===0&&(u=.001);const p=i.rendererEmitterSettings.lengthFactor;let m;i.worldSpace?m=d.velocity:(m=this.vector_,d.parentMatrix?(this.rotationMat2_.setFromMatrix4(d.parentMatrix),m.copy(d.velocity).applyMatrix3(this.rotationMat2_)):m.copy(d.velocity).applyMatrix3(this.rotationMat_)),this.velocityBuffer.setXYZW(e,m.x*u,m.y*u,m.z*u,p)}}}),this.geometry.instanceCount=e,e>0&&(this.offsetBuffer.clearUpdateRanges(),this.offsetBuffer.addUpdateRange(0,e*3),this.offsetBuffer.needsUpdate=!0,this.sizeBuffer.clearUpdateRanges(),this.sizeBuffer.addUpdateRange(0,e*3),this.sizeBuffer.needsUpdate=!0,this.colorBuffer.clearUpdateRanges(),this.colorBuffer.addUpdateRange(0,e*4),this.colorBuffer.needsUpdate=!0,this.uvTileBuffer.clearUpdateRanges(),this.uvTileBuffer.addUpdateRange(0,e),this.uvTileBuffer.needsUpdate=!0,this.settings.renderMode===v.StretchedBillBoard&&this.velocityBuffer&&(this.velocityBuffer.clearUpdateRanges(),this.velocityBuffer.addUpdateRange(0,e*4),this.velocityBuffer.needsUpdate=!0),this.settings.renderMode===v.Mesh?(this.rotationBuffer.clearUpdateRanges(),this.rotationBuffer.addUpdateRange(0,e*4),this.rotationBuffer.needsUpdate=!0):(this.settings.renderMode===v.StretchedBillBoard||this.settings.renderMode===v.HorizontalBillBoard||this.settings.renderMode===v.VerticalBillBoard||this.settings.renderMode===v.BillBoard)&&(this.rotationBuffer.clearUpdateRanges(),this.rotationBuffer.addUpdateRange(0,e),this.rotationBuffer.needsUpdate=!0))}dispose(){this.geometry.dispose()}}var Ed=`
1013
+ `;function as(n){return n===0?"uv":`uv${n}`}class Vh extends _c{constructor(e){super(e)}onBeforeCompile(e,t){super.onBeforeCompile(e,t),e.vertexShader=os,e.fragmentShader=ss}}class jh extends Sc{constructor(e){super(e)}onBeforeCompile(e,t){super.onBeforeCompile(e,t),e.vertexShader=os,e.fragmentShader=ss}}class Jh extends Pa{constructor(e){super(e),this.vector_=new B,this.vector2_=new B,this.vector3_=new B,this.quaternion_=new J,this.quaternion2_=new J,this.quaternion3_=new J,this.rotationMat_=new tt,this.rotationMat2_=new tt,this.maxParticles=1e3,this.setupBuffers(),this.rebuildMaterial()}buildExpandableBuffers(){this.offsetBuffer=new It(new Float32Array(this.maxParticles*3),3),this.offsetBuffer.setUsage(xe),this.geometry.setAttribute("offset",this.offsetBuffer),this.colorBuffer=new It(new Float32Array(this.maxParticles*4),4),this.colorBuffer.setUsage(xe),this.geometry.setAttribute("color",this.colorBuffer),this.settings.renderMode===k.Mesh?(this.rotationBuffer=new It(new Float32Array(this.maxParticles*4),4),this.rotationBuffer.setUsage(xe),this.geometry.setAttribute("rotation",this.rotationBuffer)):(this.settings.renderMode===k.BillBoard||this.settings.renderMode===k.HorizontalBillBoard||this.settings.renderMode===k.VerticalBillBoard||this.settings.renderMode===k.StretchedBillBoard)&&(this.rotationBuffer=new It(new Float32Array(this.maxParticles),1),this.rotationBuffer.setUsage(xe),this.geometry.setAttribute("rotation",this.rotationBuffer)),this.sizeBuffer=new It(new Float32Array(this.maxParticles*3),3),this.sizeBuffer.setUsage(xe),this.geometry.setAttribute("size",this.sizeBuffer),this.uvTileBuffer=new It(new Float32Array(this.maxParticles),1),this.uvTileBuffer.setUsage(xe),this.geometry.setAttribute("uvTile",this.uvTileBuffer),this.settings.renderMode===k.StretchedBillBoard&&(this.velocityBuffer=new It(new Float32Array(this.maxParticles*4),4),this.velocityBuffer.setUsage(xe),this.geometry.setAttribute("velocity",this.velocityBuffer))}setupBuffers(){this.geometry&&this.geometry.dispose(),this.geometry=new xc,this.geometry.setIndex(this.settings.instancingGeometry.getIndex()),this.settings.instancingGeometry.hasAttribute("normal")&&this.geometry.setAttribute("normal",this.settings.instancingGeometry.getAttribute("normal")),this.geometry.setAttribute("position",this.settings.instancingGeometry.getAttribute("position")),this.geometry.setAttribute("uv",this.settings.instancingGeometry.getAttribute("uv")),this.buildExpandableBuffers()}expandBuffers(e){for(;e>=this.maxParticles;)this.maxParticles*=2;this.setupBuffers()}rebuildMaterial(){this.layers.mask=this.settings.layers.mask;const e={},t={};this.settings.material.type!=="MeshStandardMaterial"&&this.settings.material.type!=="MeshPhysicalMaterial"&&(e.map=new Je(this.settings.material.map)),this.settings.material.alphaTest&&(t.USE_ALPHATEST="",e.alphaTest=new Je(this.settings.material.alphaTest)),t.USE_UV="";const i=this.settings.uTileCount,r=this.settings.vTileCount;(i>1||r>1)&&(t.UV_TILE="",e.tileCount=new Je(new hi(i,r))),this.settings.material.defines&&this.settings.material.defines.USE_COLOR_AS_ALPHA!==void 0&&(t.USE_COLOR_AS_ALPHA=""),this.settings.material.normalMap&&(t.USE_NORMALMAP="",t.NORMALMAP_UV=as(this.settings.material.normalMap.channel),e.normalMapTransform=new Je(new tt().copy(this.settings.material.normalMap.matrix))),this.settings.material.map&&(t.USE_MAP="",this.settings.blendTiles&&(t.TILE_BLEND=""),t.MAP_UV=as(this.settings.material.map.channel),e.mapTransform=new Je(new tt().copy(this.settings.material.map.matrix))),t.USE_COLOR_ALPHA="";let s;if(this.settings.softParticles){t.SOFT_PARTICLES="";const l=this.settings.softNearFade,a=1/(this.settings.softFarFade-this.settings.softNearFade);e.softParams=new Je(new hi(l,a)),e.depthTexture=new Je(null);const c=e.projParams=new Je(new Ee);s=(h,u,d)=>{c.value.set(d.near,d.far,0,0)}}let o=!1;if(this.settings.renderMode===k.BillBoard||this.settings.renderMode===k.VerticalBillBoard||this.settings.renderMode===k.HorizontalBillBoard||this.settings.renderMode===k.Mesh){let l,a;this.settings.renderMode===k.Mesh?this.settings.material.type==="MeshStandardMaterial"||this.settings.material.type==="MeshPhysicalMaterial"?(t.USE_COLOR="",l=os,a=ss,o=!0):(l=Fh,a=rs):(l=Dh,a=rs),this.settings.renderMode===k.VerticalBillBoard?t.VERTICAL="":this.settings.renderMode===k.HorizontalBillBoard&&(t.HORIZONTAL="");let c=!1;this.settings.renderMode===k.Mesh&&(this.settings.material.type==="MeshStandardMaterial"?(this.material=new Vh({}),this.material.copy(this.settings.material),this.material.uniforms=e,this.material.defines=t,c=!0):this.settings.material.type==="MeshPhysicalMaterial"&&(this.material=new jh({}),this.material.copy(this.settings.material),this.material.uniforms=e,this.material.defines=t,c=!0)),c||(this.material=new Cr({uniforms:e,defines:t,vertexShader:l,fragmentShader:a,transparent:this.settings.material.transparent,depthWrite:!this.settings.material.transparent,blending:this.settings.material.blending,blendDst:this.settings.material.blendDst,blendSrc:this.settings.material.blendSrc,blendEquation:this.settings.material.blendEquation,premultipliedAlpha:this.settings.material.premultipliedAlpha,side:this.settings.material.side,alphaTest:this.settings.material.alphaTest,depthTest:this.settings.material.depthTest,lights:o}))}else if(this.settings.renderMode===k.StretchedBillBoard)e.speedFactor=new Je(1),this.material=new Cr({uniforms:e,defines:t,vertexShader:Lh,fragmentShader:rs,transparent:this.settings.material.transparent,depthWrite:!this.settings.material.transparent,blending:this.settings.material.blending,blendDst:this.settings.material.blendDst,blendSrc:this.settings.material.blendSrc,blendEquation:this.settings.material.blendEquation,premultipliedAlpha:this.settings.material.premultipliedAlpha,side:this.settings.material.side,alphaTest:this.settings.material.alphaTest,depthTest:this.settings.material.depthTest});else throw new Error("render mode unavailable");this.material&&s&&(this.material.onBeforeRender=s)}update(){let e=0,t=0;this.systems.forEach(i=>{t+=i.particleNum}),t>this.maxParticles&&this.expandBuffers(t),this.systems.forEach(i=>{i.emitter.updateMatrixWorld&&(i.emitter.updateWorldMatrix(!0,!1),i.emitter.updateMatrixWorld(!0));const r=i.particles,s=i.particleNum,o=this.quaternion2_,l=this.vector2_,a=this.vector3_;i.emitter.matrixWorld.decompose(l,o,a),this.rotationMat_.setFromMatrix4(i.emitter.matrixWorld);for(let c=0;c<s;c++,e++){const h=r[c];if(this.settings.renderMode===k.Mesh){let d;if(i.worldSpace)d=h.rotation;else{let p;h.parentMatrix?p=this.quaternion3_.setFromRotationMatrix(h.parentMatrix):p=o,d=this.quaternion_,d.copy(p).multiply(h.rotation)}this.rotationBuffer.setXYZW(e,d.x,d.y,d.z,d.w)}else(this.settings.renderMode===k.StretchedBillBoard||this.settings.renderMode===k.VerticalBillBoard||this.settings.renderMode===k.HorizontalBillBoard||this.settings.renderMode===k.BillBoard)&&this.rotationBuffer.setX(e,h.rotation);let u;if(i.worldSpace?u=h.position:(u=this.vector_,h.parentMatrix?u.copy(h.position).applyMatrix4(h.parentMatrix):u.copy(h.position).applyMatrix4(i.emitter.matrixWorld)),this.offsetBuffer.setXYZ(e,u.x,u.y,u.z),this.colorBuffer.setXYZW(e,h.color.x,h.color.y,h.color.z,h.color.w),i.worldSpace?this.sizeBuffer.setXYZ(e,h.size.x,h.size.y,h.size.z):h.parentMatrix?this.sizeBuffer.setXYZ(e,h.size.x,h.size.y,h.size.z):this.sizeBuffer.setXYZ(e,h.size.x*Math.abs(a.x),h.size.y*Math.abs(a.y),h.size.z*Math.abs(a.z)),this.uvTileBuffer.setX(e,h.uvTile),this.settings.renderMode===k.StretchedBillBoard&&this.velocityBuffer){let d=i.rendererEmitterSettings.speedFactor;d===0&&(d=.001);const p=i.rendererEmitterSettings.lengthFactor;let f;i.worldSpace?f=h.velocity:(f=this.vector_,h.parentMatrix?(this.rotationMat2_.setFromMatrix4(h.parentMatrix),f.copy(h.velocity).applyMatrix3(this.rotationMat2_)):f.copy(h.velocity).applyMatrix3(this.rotationMat_)),this.velocityBuffer.setXYZW(e,f.x*d,f.y*d,f.z*d,p)}}}),this.geometry.instanceCount=e,e>0&&(this.offsetBuffer.clearUpdateRanges(),this.offsetBuffer.addUpdateRange(0,e*3),this.offsetBuffer.needsUpdate=!0,this.sizeBuffer.clearUpdateRanges(),this.sizeBuffer.addUpdateRange(0,e*3),this.sizeBuffer.needsUpdate=!0,this.colorBuffer.clearUpdateRanges(),this.colorBuffer.addUpdateRange(0,e*4),this.colorBuffer.needsUpdate=!0,this.uvTileBuffer.clearUpdateRanges(),this.uvTileBuffer.addUpdateRange(0,e),this.uvTileBuffer.needsUpdate=!0,this.settings.renderMode===k.StretchedBillBoard&&this.velocityBuffer&&(this.velocityBuffer.clearUpdateRanges(),this.velocityBuffer.addUpdateRange(0,e*4),this.velocityBuffer.needsUpdate=!0),this.settings.renderMode===k.Mesh?(this.rotationBuffer.clearUpdateRanges(),this.rotationBuffer.addUpdateRange(0,e*4),this.rotationBuffer.needsUpdate=!0):(this.settings.renderMode===k.StretchedBillBoard||this.settings.renderMode===k.HorizontalBillBoard||this.settings.renderMode===k.VerticalBillBoard||this.settings.renderMode===k.BillBoard)&&(this.rotationBuffer.clearUpdateRanges(),this.rotationBuffer.addUpdateRange(0,e),this.rotationBuffer.needsUpdate=!0))}dispose(){this.geometry.dispose()}}var Gh=`
1014
1014
 
1015
1015
  #include <common>
1016
1016
  #include <tile_pars_fragment>
@@ -1043,7 +1043,7 @@ void main() {
1043
1043
 
1044
1044
  #include <fog_fragment>
1045
1045
  #include <tonemapping_fragment>
1046
- }`,jd=`
1046
+ }`,qh=`
1047
1047
  #include <common>
1048
1048
  #include <tile_pars_vertex>
1049
1049
  #include <color_pars_vertex>
@@ -1118,7 +1118,7 @@ void main() {
1118
1118
  vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
1119
1119
 
1120
1120
  #include <fog_vertex>
1121
- }`;class Od extends gr{constructor(e){super(e),this.vector_=new T,this.vector2_=new T,this.vector3_=new T,this.quaternion_=new F,this.maxParticles=1e4,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.geometry&&this.geometry.dispose(),this.geometry=new Ot,this.indexBuffer=new be(new Uint32Array(this.maxParticles*6),1),this.indexBuffer.setUsage(Ve),this.geometry.setIndex(this.indexBuffer),this.positionBuffer=new be(new Float32Array(this.maxParticles*6),3),this.positionBuffer.setUsage(Ve),this.geometry.setAttribute("position",this.positionBuffer),this.previousBuffer=new be(new Float32Array(this.maxParticles*6),3),this.previousBuffer.setUsage(Ve),this.geometry.setAttribute("previous",this.previousBuffer),this.nextBuffer=new be(new Float32Array(this.maxParticles*6),3),this.nextBuffer.setUsage(Ve),this.geometry.setAttribute("next",this.nextBuffer),this.widthBuffer=new be(new Float32Array(this.maxParticles*2),1),this.widthBuffer.setUsage(Ve),this.geometry.setAttribute("width",this.widthBuffer),this.sideBuffer=new be(new Float32Array(this.maxParticles*2),1),this.sideBuffer.setUsage(Ve),this.geometry.setAttribute("side",this.sideBuffer),this.uvBuffer=new be(new Float32Array(this.maxParticles*4),2),this.uvBuffer.setUsage(Ve),this.geometry.setAttribute("uv",this.uvBuffer),this.colorBuffer=new be(new Float32Array(this.maxParticles*8),4),this.colorBuffer.setUsage(Ve),this.geometry.setAttribute("color",this.colorBuffer)}expandBuffers(e){for(;e>=this.maxParticles;)this.maxParticles*=2;this.setupBuffers()}rebuildMaterial(){this.layers.mask=this.settings.layers.mask;const e={lineWidth:{value:1},map:{value:null},useMap:{value:0},alphaMap:{value:null},useAlphaMap:{value:0},resolution:{value:new di(1,1)},sizeAttenuation:{value:1},visibility:{value:1},alphaTest:{value:0}},t={};if(t.USE_UV="",t.USE_COLOR_ALPHA="",this.settings.material.map&&(t.USE_MAP="",t.MAP_UV=ro(this.settings.material.map.channel),e.map=new Fe(this.settings.material.map),e.mapTransform=new Fe(new tt().copy(this.settings.material.map.matrix))),this.settings.material.defines&&this.settings.material.defines.USE_COLOR_AS_ALPHA!==void 0&&(t.USE_COLOR_AS_ALPHA=""),this.settings.renderMode===v.Trail)this.material=new Ws({uniforms:e,defines:t,vertexShader:jd,fragmentShader:Ed,transparent:this.settings.material.transparent,depthWrite:!this.settings.material.transparent,side:this.settings.material.side,blending:this.settings.material.blending||Uo,blendDst:this.settings.material.blendDst,blendSrc:this.settings.material.blendSrc,blendEquation:this.settings.material.blendEquation,premultipliedAlpha:this.settings.material.premultipliedAlpha});else throw new Error("render mode unavailable")}update(){let e=0,t=0,i=0;this.systems.forEach(s=>{for(let o=0;o<s.particleNum;o++)i+=s.particles[o].previous.length*2}),i>this.maxParticles&&this.expandBuffers(i),this.systems.forEach(s=>{s.emitter.updateMatrixWorld&&(s.emitter.updateWorldMatrix(!0,!1),s.emitter.updateMatrixWorld(!0));const o=this.quaternion_,a=this.vector2_,c=this.vector3_;s.emitter.matrixWorld.decompose(a,o,c);const r=s.particles,l=s.particleNum,d=this.settings.uTileCount,h=this.settings.vTileCount,u=1/d,p=1/h;for(let m=0;m<l;m++){const b=r[m],G=b.uvTile%h,y=Math.floor(b.uvTile/h+.001),Z=b.previous.values();let X=Z.next(),L=X.value,V=L;X.done||(X=Z.next());let x;X.value!==void 0?x=X.value:x=V;for(let R=0;R<b.previous.length;R++,e+=2){if(this.positionBuffer.setXYZ(e,V.position.x,V.position.y,V.position.z),this.positionBuffer.setXYZ(e+1,V.position.x,V.position.y,V.position.z),s.worldSpace?(this.positionBuffer.setXYZ(e,V.position.x,V.position.y,V.position.z),this.positionBuffer.setXYZ(e+1,V.position.x,V.position.y,V.position.z)):(b.parentMatrix?this.vector_.copy(V.position).applyMatrix4(b.parentMatrix):this.vector_.copy(V.position).applyMatrix4(s.emitter.matrixWorld),this.positionBuffer.setXYZ(e,this.vector_.x,this.vector_.y,this.vector_.z),this.positionBuffer.setXYZ(e+1,this.vector_.x,this.vector_.y,this.vector_.z)),s.worldSpace?(this.previousBuffer.setXYZ(e,L.position.x,L.position.y,L.position.z),this.previousBuffer.setXYZ(e+1,L.position.x,L.position.y,L.position.z)):(b.parentMatrix?this.vector_.copy(L.position).applyMatrix4(b.parentMatrix):this.vector_.copy(L.position).applyMatrix4(s.emitter.matrixWorld),this.previousBuffer.setXYZ(e,this.vector_.x,this.vector_.y,this.vector_.z),this.previousBuffer.setXYZ(e+1,this.vector_.x,this.vector_.y,this.vector_.z)),s.worldSpace?(this.nextBuffer.setXYZ(e,x.position.x,x.position.y,x.position.z),this.nextBuffer.setXYZ(e+1,x.position.x,x.position.y,x.position.z)):(b.parentMatrix?this.vector_.copy(x.position).applyMatrix4(b.parentMatrix):this.vector_.copy(x.position).applyMatrix4(s.emitter.matrixWorld),this.nextBuffer.setXYZ(e,this.vector_.x,this.vector_.y,this.vector_.z),this.nextBuffer.setXYZ(e+1,this.vector_.x,this.vector_.y,this.vector_.z)),this.sideBuffer.setX(e,-1),this.sideBuffer.setX(e+1,1),s.worldSpace)this.widthBuffer.setX(e,V.size),this.widthBuffer.setX(e+1,V.size);else if(b.parentMatrix)this.widthBuffer.setX(e,V.size),this.widthBuffer.setX(e+1,V.size);else{const S=(Math.abs(c.x)+Math.abs(c.y)+Math.abs(c.z))/3;this.widthBuffer.setX(e,V.size*S),this.widthBuffer.setX(e+1,V.size*S)}this.uvBuffer.setXY(e,(R/b.previous.length+G)*u,(h-y-1)*p),this.uvBuffer.setXY(e+1,(R/b.previous.length+G)*u,(h-y)*p),this.colorBuffer.setXYZW(e,V.color.x,V.color.y,V.color.z,V.color.w),this.colorBuffer.setXYZW(e+1,V.color.x,V.color.y,V.color.z,V.color.w),R+1<b.previous.length&&(this.indexBuffer.setX(t*3,e),this.indexBuffer.setX(t*3+1,e+1),this.indexBuffer.setX(t*3+2,e+2),t++,this.indexBuffer.setX(t*3,e+2),this.indexBuffer.setX(t*3+1,e+1),this.indexBuffer.setX(t*3+2,e+3),t++),L=V,V=x,X.done||(X=Z.next(),X.value!==void 0&&(x=X.value))}}}),this.positionBuffer.clearUpdateRanges(),this.positionBuffer.addUpdateRange(0,e*3),this.positionBuffer.needsUpdate=!0,this.previousBuffer.clearUpdateRanges(),this.previousBuffer.addUpdateRange(0,e*3),this.previousBuffer.needsUpdate=!0,this.nextBuffer.clearUpdateRanges(),this.nextBuffer.addUpdateRange(0,e*3),this.nextBuffer.needsUpdate=!0,this.sideBuffer.clearUpdateRanges(),this.sideBuffer.addUpdateRange(0,e),this.sideBuffer.needsUpdate=!0,this.widthBuffer.clearUpdateRanges(),this.widthBuffer.addUpdateRange(0,e),this.widthBuffer.needsUpdate=!0,this.uvBuffer.clearUpdateRanges(),this.uvBuffer.addUpdateRange(0,e*2),this.uvBuffer.needsUpdate=!0,this.colorBuffer.clearUpdateRanges(),this.colorBuffer.addUpdateRange(0,e*4),this.colorBuffer.needsUpdate=!0,this.indexBuffer.clearUpdateRanges(),this.indexBuffer.addUpdateRange(0,t*3),this.indexBuffer.needsUpdate=!0,this.geometry.setDrawRange(0,t*3)}dispose(){this.geometry.dispose()}}class Ln{get geometry(){return this._geometry}set geometry(e){if(this._geometry=e,e===void 0||typeof e=="string")return;const t=new we;this._triangleIndexToArea.length=0;let i=0;if(!e.getIndex())return;const s=e.getIndex().array,o=s.length/3;this._triangleIndexToArea.push(0);for(let a=0;a<o;a++)t.setFromAttributeAndIndices(e.getAttribute("position"),s[a*3],s[a*3+1],s[a*3+2]),i+=t.getArea(),this._triangleIndexToArea.push(i);e.userData.triangleIndexToArea=this._triangleIndexToArea}constructor(e){this.type="mesh_surface",this._triangleIndexToArea=[],this._tempA=new K,this._tempB=new K,this._tempC=new K,e&&(this.geometry=e)}initialize(e){const t=this._geometry;if(!t||t.getIndex()===null){e.position.set(0,0,0),e.velocity.set(0,0,1).multiplyScalar(e.startSpeed);return}const i=this._triangleIndexToArea.length-1;let s=0,o=i;const a=Math.random()*this._triangleIndexToArea[i];for(;s+1<o;){const p=Math.floor((s+o)/2);a<this._triangleIndexToArea[p]?o=p:s=p}let c=Math.random(),r=Math.random();c+r>1&&(c=1-c,r=1-r);const l=t.getIndex().array[s*3],d=t.getIndex().array[s*3+1],h=t.getIndex().array[s*3+2],u=t.getAttribute("position");this._tempA.fromBufferAttribute(u,l),this._tempB.fromBufferAttribute(u,d),this._tempC.fromBufferAttribute(u,h),this._tempB.sub(this._tempA),this._tempC.sub(this._tempA),this._tempA.addScaledVector(this._tempB,c).addScaledVector(this._tempC,r),e.position.copy(this._tempA),this._tempA.copy(this._tempB).cross(this._tempC).normalize(),e.velocity.copy(this._tempA).normalize().multiplyScalar(e.startSpeed)}toJSON(){return{type:"mesh_surface",mesh:this._geometry?this._geometry.uuid:""}}static fromJSON(e,t){return new Ln(t.geometries[e.geometry])}clone(){return new Ln(this._geometry)}update(e,t){}}fd({id:"three.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["geometry",["geometry"]]],constructor:Ln,loadJSON:Ln.fromJSON}],behaviors:[]});class No extends fs{constructor(){super(),this.batches=[],this.systemToBatchIndex=new Map,this.type="BatchedRenderer",this.depthTexture=null}static equals(e,t){return e.material.side===t.material.side&&e.material.blending===t.material.blending&&e.material.blendSrc===t.material.blendSrc&&e.material.blendDst===t.material.blendDst&&e.material.blendEquation===t.material.blendEquation&&e.material.premultipliedAlpha===t.material.premultipliedAlpha&&e.material.transparent===t.material.transparent&&e.material.depthTest===t.material.depthTest&&e.material.type===t.material.type&&e.material.alphaTest===t.material.alphaTest&&e.material.map===t.material.map&&e.renderMode===t.renderMode&&e.blendTiles===t.blendTiles&&e.softParticles===t.softParticles&&e.softFarFade===t.softFarFade&&e.softNearFade===t.softNearFade&&e.uTileCount===t.uTileCount&&e.vTileCount===t.vTileCount&&e.instancingGeometry===t.instancingGeometry&&e.renderOrder===t.renderOrder&&e.layers.mask===t.layers.mask}addSystem(e){e._renderer=this;const t=e.getRendererSettings();for(let s=0;s<this.batches.length;s++)if(No.equals(this.batches[s].settings,t)){this.batches[s].addSystem(e),this.systemToBatchIndex.set(e,s);return}let i;switch(t.renderMode){case v.Trail:i=new Od(t);break;case v.Mesh:case v.BillBoard:case v.VerticalBillBoard:case v.HorizontalBillBoard:case v.StretchedBillBoard:i=new Bd(t);break}this.depthTexture&&i.applyDepthTexture(this.depthTexture),i.addSystem(e),this.batches.push(i),this.systemToBatchIndex.set(e,this.batches.length-1),this.add(i)}deleteSystem(e){const t=this.systemToBatchIndex.get(e);t!=null&&(this.batches[t].removeSystem(e),this.systemToBatchIndex.delete(e))}setDepthTexture(e){this.depthTexture=e;for(const t of this.batches)t.applyDepthTexture(e)}updateSystem(e){this.deleteSystem(e),this.addSystem(e)}update(e){this.systemToBatchIndex.forEach((t,i)=>{i.update(e)});for(let t=0;t<this.batches.length;t++)this.batches[t].update()}}const Dd=No;Yd(),console.log("%c Particle system powered by three.quarks. https://quarks.art/","font-size: 14px; font-weight: bold;");const zr=Math.sqrt(5),_d=(zr-1)/4,ue=(5-zr)/20,On=n=>Math.floor(n)|0,Dn=new Float64Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]);function Ad(n=Math.random){const e=qd(n),t=new Float64Array(e).map(a=>Dn[a%32*4]),i=new Float64Array(e).map(a=>Dn[a%32*4+1]),s=new Float64Array(e).map(a=>Dn[a%32*4+2]),o=new Float64Array(e).map(a=>Dn[a%32*4+3]);return function(a,c,r,l){let d,h,u,p,m;const b=(a+c+r+l)*_d,G=On(a+b),y=On(c+b),Z=On(r+b),X=On(l+b),L=(G+y+Z+X)*ue,V=G-L,x=y-L,R=Z-L,S=X-L,W=a-V,f=c-x,C=r-R,g=l-S;let z=0,Y=0,k=0,N=0;W>f?z++:Y++,W>C?z++:k++,W>g?z++:N++,f>C?Y++:k++,f>g?Y++:N++,C>g?k++:N++;const Q=z>=3?1:0,P=Y>=3?1:0,ae=k>=3?1:0,ie=N>=3?1:0,ee=z>=2?1:0,ze=Y>=2?1:0,Se=k>=2?1:0,ne=N>=2?1:0,me=z>=1?1:0,te=Y>=1?1:0,O=k>=1?1:0,mt=N>=1?1:0,_=W-Q+ue,Oe=f-P+ue,it=C-ae+ue,ft=g-ie+ue,Wt=W-ee+2*ue,gt=f-ze+2*ue,Ct=C-Se+2*ue,zt=g-ne+2*ue,vt=W-me+3*ue,Kt=f-te+3*ue,Mt=C-O+3*ue,Tt=g-mt+3*ue,nt=W-1+4*ue,st=f-1+4*ue,ot=C-1+4*ue,at=g-1+4*ue,Ne=G&255,Ie=y&255,Je=Z&255,Ue=X&255;let Pe=.6-W*W-f*f-C*C-g*g;if(Pe<0)d=0;else{const D=Ne+e[Ie+e[Je+e[Ue]]];Pe*=Pe,d=Pe*Pe*(t[D]*W+i[D]*f+s[D]*C+o[D]*g)}let w=.6-_*_-Oe*Oe-it*it-ft*ft;if(w<0)h=0;else{const D=Ne+Q+e[Ie+P+e[Je+ae+e[Ue+ie]]];w*=w,h=w*w*(t[D]*_+i[D]*Oe+s[D]*it+o[D]*ft)}let pi=.6-Wt*Wt-gt*gt-Ct*Ct-zt*zt;if(pi<0)u=0;else{const D=Ne+ee+e[Ie+ze+e[Je+Se+e[Ue+ne]]];pi*=pi,u=pi*pi*(t[D]*Wt+i[D]*gt+s[D]*Ct+o[D]*zt)}let mi=.6-vt*vt-Kt*Kt-Mt*Mt-Tt*Tt;if(mi<0)p=0;else{const D=Ne+me+e[Ie+te+e[Je+O+e[Ue+mt]]];mi*=mi,p=mi*mi*(t[D]*vt+i[D]*Kt+s[D]*Mt+o[D]*Tt)}let bi=.6-nt*nt-st*st-ot*ot-at*at;if(bi<0)m=0;else{const D=Ne+1+e[Ie+1+e[Je+1+e[Ue+1]]];bi*=bi,m=bi*bi*(t[D]*nt+i[D]*st+s[D]*ot+o[D]*at)}return 27*(d+h+u+p+m)}}function qd(n){const e=new Uint8Array(512);for(let t=0;t<512/2;t++)e[t]=t;for(let t=0;t<512/2-1;t++){const i=t+~~(n()*(256-t)),s=e[t];e[t]=e[i],e[i]=s}for(let t=256;t<512;t++)e[t]=e[t-256];return e}class $d{constructor(e){if(this._retries=0,!Number.isInteger(e)||e<0)throw new Error("Backoff must be a positive integer");this.backoff=e}get retries(){return this._retries}get current(){return this.backoff}next(){return this._retries++,this.backoff}reset(){this._retries=0}}class eh{constructor(e,t){if(this._retries=0,!Number.isInteger(e)||e<0)throw new Error("Base must be a positive integer or zero");if(t!==void 0&&(!Number.isInteger(t)||t<0))throw new Error("ExpMax must be a undefined, a positive integer or zero");this.base=e,this.expMax=t,this.i=0}get retries(){return this._retries}get current(){return this.base*Math.pow(2,this.i)}next(){return this._retries++,this.i=this.expMax===void 0?this.i+1:Math.min(this.i+1,this.expMax),this.current}reset(){this._retries=0,this.i=0}}class th{constructor(e,t,i){if(this.i=0,this._retries=0,e<0)throw new Error("Initial must be a positive number or zero");if(t<0)throw new Error("Increment must be a positive number or zero");if(i!==void 0&&i<0)throw new Error("Max must be undefined, a positive number or zero");if(i!==void 0&&i<e)throw new Error("Max must be undefined or greater than or equal to initial");this.initial=e,this.increment=t,this.max=i}get retries(){return this._retries}get current(){return this.max===void 0?this.initial+this.increment*this.i:Math.min(this.initial+this.increment*this.i,this.max)}next(){return this._retries++,this.i++,this.current}reset(){this._retries=0,this.i=0}}class ih{constructor(){this.elements=[]}add(e){this.elements.push(e)}clear(){this.elements.length=0}forEach(e){this.elements.forEach(e)}length(){return this.elements.length}isEmpty(){return this.elements.length===0}peek(){return this.elements[0]}read(){return this.elements.shift()}}class nh{constructor(e){if(!Number.isInteger(e)||e<=0)throw new Error("Capacity must be a positive integer");this.elements=new Array(e+1),this.head=0,this.tail=0}add(e){this.elements[this.head]=e,this.head=(this.head+1)%this.elements.length,this.head===this.tail&&(this.tail=(this.tail+1)%this.elements.length)}clear(){this.head=0,this.tail=0}forEach(e){for(let t=this.tail;t!==this.head;t=(t+1)%this.elements.length)e(this.elements[t])}length(){return this.tail===this.head?0:this.tail<this.head?this.head-this.tail:this.elements.length-this.tail+this.head}isEmpty(){return this.head===this.tail}peek(){return this.isEmpty()?void 0:this.elements[this.tail]}read(){const e=this.peek();return e!==void 0&&(this.tail=(this.tail+1)%this.elements.length),e}}var B;(function(n){n.open="open",n.close="close",n.error="error",n.message="message",n.retry="retry",n.reconnect="reconnect"})(B||(B={}));class vr{constructor(e,t,i){var s,o,a,c,r,l,d,h,u,p,m,b,G,y,Z;this._closedByUser=!1,this.handleOpenEvent=X=>this.handleEvent(B.open,X),this.handleErrorEvent=X=>this.handleEvent(B.error,X),this.handleCloseEvent=X=>this.handleEvent(B.close,X),this.handleMessageEvent=X=>this.handleEvent(B.message,X),this._url=e,this._protocols=t,this._options={buffer:i?.buffer,retry:{maxRetries:(s=i?.retry)===null||s===void 0?void 0:s.maxRetries,instantReconnect:(o=i?.retry)===null||o===void 0?void 0:o.instantReconnect,backoff:(a=i?.retry)===null||a===void 0?void 0:a.backoff},listeners:{open:[...(r=(c=i?.listeners)===null||c===void 0?void 0:c.open)!==null&&r!==void 0?r:[]],close:[...(d=(l=i?.listeners)===null||l===void 0?void 0:l.close)!==null&&d!==void 0?d:[]],error:[...(u=(h=i?.listeners)===null||h===void 0?void 0:h.error)!==null&&u!==void 0?u:[]],message:[...(m=(p=i?.listeners)===null||p===void 0?void 0:p.message)!==null&&m!==void 0?m:[]],retry:[...(G=(b=i?.listeners)===null||b===void 0?void 0:b.retry)!==null&&G!==void 0?G:[]],reconnect:[...(Z=(y=i?.listeners)===null||y===void 0?void 0:y.reconnect)!==null&&Z!==void 0?Z:[]]}},this._underlyingWebsocket=this.tryConnect()}get url(){return this._url}get protocols(){return this._protocols}get buffer(){return this._options.buffer}get maxRetries(){return this._options.retry.maxRetries}get instantReconnect(){return this._options.retry.instantReconnect}get backoff(){return this._options.retry.backoff}get closedByUser(){return this._closedByUser}get lastConnection(){return this._lastConnection}get underlyingWebsocket(){return this._underlyingWebsocket}get readyState(){return this._underlyingWebsocket.readyState}get bufferedAmount(){return this._underlyingWebsocket.bufferedAmount}get extensions(){return this._underlyingWebsocket.extensions}get binaryType(){return this._underlyingWebsocket.binaryType}set binaryType(e){this._underlyingWebsocket.binaryType=e}send(e){this.closedByUser||(this._underlyingWebsocket.readyState===this._underlyingWebsocket.OPEN?this._underlyingWebsocket.send(e):this.buffer!==void 0&&this.buffer.add(e))}close(e,t){this.cancelScheduledConnectionRetry(),this._closedByUser=!0,this._underlyingWebsocket.close(e,t)}addEventListener(e,t,i){this._options.listeners[e].push({listener:t,options:i})}removeEventListener(e,t,i){const s=o=>o.listener!==t||o.options!==i;this._options.listeners[e]=this._options.listeners[e].filter(s)}tryConnect(){return this._underlyingWebsocket=new WebSocket(this.url,this.protocols),this._underlyingWebsocket.addEventListener(B.open,this.handleOpenEvent),this._underlyingWebsocket.addEventListener(B.close,this.handleCloseEvent),this._underlyingWebsocket.addEventListener(B.error,this.handleErrorEvent),this._underlyingWebsocket.addEventListener(B.message,this.handleMessageEvent),this._underlyingWebsocket}clearWebsocket(){this._underlyingWebsocket.removeEventListener(B.open,this.handleOpenEvent),this._underlyingWebsocket.removeEventListener(B.close,this.handleCloseEvent),this._underlyingWebsocket.removeEventListener(B.error,this.handleErrorEvent),this._underlyingWebsocket.removeEventListener(B.message,this.handleMessageEvent),this._underlyingWebsocket.close()}dispatchEvent(e,t){const i=this._options.listeners[e],s=[];i.forEach(({listener:o,options:a})=>{o(this,t),(a===void 0||a.once===void 0||!a.once)&&s.push({listener:o,options:a})}),this._options.listeners[e]=s}handleEvent(e,t){switch(e){case B.close:this.dispatchEvent(e,t),this.scheduleConnectionRetryIfNeeded();break;case B.open:if(this.backoff!==void 0&&this._lastConnection!==void 0){const i={retries:this.backoff.retries,lastConnection:new Date(this._lastConnection)},s=new CustomEvent(B.reconnect,{detail:i});this.dispatchEvent(B.reconnect,s),this.backoff.reset()}this._lastConnection=new Date,this.dispatchEvent(e,t),this.sendBufferedData();break;case B.retry:this.dispatchEvent(e,t),this.clearWebsocket(),this.tryConnect();break;default:this.dispatchEvent(e,t);break}}sendBufferedData(){if(this.buffer!==void 0)for(let e=this.buffer.read();e!==void 0;e=this.buffer.read())this.send(e)}scheduleConnectionRetryIfNeeded(){if(this.closedByUser||this.backoff===void 0)return;const e=i=>{const s=new CustomEvent(B.retry,{detail:i});this.handleEvent(B.retry,s)},t={backoff:this._options.retry.instantReconnect===!0?0:this.backoff.next(),retries:this._options.retry.instantReconnect===!0?0:this.backoff.retries,lastConnection:this._lastConnection};(this._options.retry.maxRetries===void 0||t.retries<=this._options.retry.maxRetries)&&(this.retryTimeout=globalThis.setTimeout(()=>e(t),t.backoff))}cancelScheduledConnectionRetry(){globalThis.clearTimeout(this.retryTimeout)}}class sh{constructor(e){this._url=e}get url(){return this._url}withProtocols(e){return this._protocols=e,this}get protocols(){return this._protocols}withMaxRetries(e){var t;return this._options=Object.assign(Object.assign({},this._options),{retry:Object.assign(Object.assign({},(t=this._options)===null||t===void 0?void 0:t.retry),{maxRetries:e})}),this}get maxRetries(){var e,t;return(t=(e=this._options)===null||e===void 0?void 0:e.retry)===null||t===void 0?void 0:t.maxRetries}withInstantReconnect(e){var t;return this._options=Object.assign(Object.assign({},this._options),{retry:Object.assign(Object.assign({},(t=this._options)===null||t===void 0?void 0:t.retry),{instantReconnect:e})}),this}get instantReconnect(){var e,t;return(t=(e=this._options)===null||e===void 0?void 0:e.retry)===null||t===void 0?void 0:t.instantReconnect}withBackoff(e){var t;return this._options=Object.assign(Object.assign({},this._options),{retry:Object.assign(Object.assign({},(t=this._options)===null||t===void 0?void 0:t.retry),{backoff:e})}),this}get backoff(){var e,t;return(t=(e=this._options)===null||e===void 0?void 0:e.retry)===null||t===void 0?void 0:t.backoff}withBuffer(e){return this._options=Object.assign(Object.assign({},this._options),{buffer:e}),this}get buffer(){var e;return(e=this._options)===null||e===void 0?void 0:e.buffer}onOpen(e,t){return this.addListener(B.open,e,t),this}onClose(e,t){return this.addListener(B.close,e,t),this}onError(e,t){return this.addListener(B.error,e,t),this}onMessage(e,t){return this.addListener(B.message,e,t),this}onRetry(e,t){return this.addListener(B.retry,e,t),this}onReconnect(e,t){return this.addListener(B.reconnect,e,t),this}build(){return new vr(this._url,this._protocols,this._options)}addListener(e,t,i){var s,o,a,c,r,l,d,h,u,p,m,b,G,y,Z,X,L,V,x,R,S;return this._options=Object.assign(Object.assign({},this._options),{listeners:{open:(a=(o=(s=this._options)===null||s===void 0?void 0:s.listeners)===null||o===void 0?void 0:o.open)!==null&&a!==void 0?a:[],close:(l=(r=(c=this._options)===null||c===void 0?void 0:c.listeners)===null||r===void 0?void 0:r.close)!==null&&l!==void 0?l:[],error:(u=(h=(d=this._options)===null||d===void 0?void 0:d.listeners)===null||h===void 0?void 0:h.error)!==null&&u!==void 0?u:[],message:(b=(m=(p=this._options)===null||p===void 0?void 0:p.listeners)===null||m===void 0?void 0:m.message)!==null&&b!==void 0?b:[],retry:(Z=(y=(G=this._options)===null||G===void 0?void 0:G.listeners)===null||y===void 0?void 0:y.retry)!==null&&Z!==void 0?Z:[],reconnect:(V=(L=(X=this._options)===null||X===void 0?void 0:X.listeners)===null||L===void 0?void 0:L.reconnect)!==null&&V!==void 0?V:[],[e]:[...(S=(R=(x=this._options)===null||x===void 0?void 0:x.listeners)===null||R===void 0?void 0:R[e])!==null&&S!==void 0?S:[],{listener:t,options:i}]}}),this}}const oh=Object.freeze(Object.defineProperty({__proto__:null,ArrayQueue:ih,ConstantBackoff:$d,ExponentialBackoff:eh,LinearBackoff:th,RingQueue:nh,Websocket:vr,WebsocketBuilder:sh,get WebsocketEvent(){return B}},Symbol.toStringTag,{value:"Module"})),lo=0,Kr=1,Mr=2,ah=0,rh=1,co=2,_n=1.25,ho=1,Zt=6*4+4+4,An=65535,lh=Math.pow(2,-24),uo=Symbol("SKIP_GENERATION");function Tr(n){return n.index?n.index.count:n.attributes.position.count}function ei(n){return Tr(n)/3}function Yr(n,e=ArrayBuffer){return n>65535?new Uint32Array(new e(4*n)):new Uint16Array(new e(2*n))}function ch(n,e){if(!n.index){const t=n.attributes.position.count,i=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,s=Yr(t,i);n.setIndex(new be(s,1));for(let o=0;o<t;o++)s[o]=o}}function Hr(n,e){const t=ei(n),i=e||n.drawRange,s=i.start/3,o=(i.start+i.count)/3,a=Math.max(0,s),c=Math.min(t,o)-a;return[{offset:Math.floor(a),count:Math.floor(c)}]}function kr(n,e){if(!n.groups||!n.groups.length)return Hr(n,e);const t=[],i=new Set,s=e||n.drawRange,o=s.start/3,a=(s.start+s.count)/3;for(const r of n.groups){const l=r.start/3,d=(r.start+r.count)/3;i.add(Math.max(o,l)),i.add(Math.min(a,d))}const c=Array.from(i.values()).sort((r,l)=>r-l);for(let r=0;r<c.length-1;r++){const l=c[r],d=c[r+1];t.push({offset:Math.floor(l),count:Math.floor(d-l)})}return t}function dh(n,e){const t=ei(n),i=kr(n,e).sort((a,c)=>a.offset-c.offset),s=i[i.length-1];s.count=Math.min(t-s.offset,s.count);let o=0;return i.forEach(({count:a})=>o+=a),t!==o}function po(n,e,t,i,s){let o=1/0,a=1/0,c=1/0,r=-1/0,l=-1/0,d=-1/0,h=1/0,u=1/0,p=1/0,m=-1/0,b=-1/0,G=-1/0;for(let y=e*6,Z=(e+t)*6;y<Z;y+=6){const X=n[y+0],L=n[y+1],V=X-L,x=X+L;V<o&&(o=V),x>r&&(r=x),X<h&&(h=X),X>m&&(m=X);const R=n[y+2],S=n[y+3],W=R-S,f=R+S;W<a&&(a=W),f>l&&(l=f),R<u&&(u=R),R>b&&(b=R);const C=n[y+4],g=n[y+5],z=C-g,Y=C+g;z<c&&(c=z),Y>d&&(d=Y),C<p&&(p=C),C>G&&(G=C)}i[0]=o,i[1]=a,i[2]=c,i[3]=r,i[4]=l,i[5]=d,s[0]=h,s[1]=u,s[2]=p,s[3]=m,s[4]=b,s[5]=G}function hh(n,e=null,t=null,i=null){const s=n.attributes.position,o=n.index?n.index.array:null,a=ei(n),c=s.normalized;let r;e===null?(r=new Float32Array(a*6),t=0,i=a):(r=e,t=t||0,i=i||a);const l=s.array,d=s.offset||0;let h=3;s.isInterleavedBufferAttribute&&(h=s.data.stride);const u=["getX","getY","getZ"];for(let p=t;p<t+i;p++){const m=p*3,b=p*6;let G=m+0,y=m+1,Z=m+2;o&&(G=o[G],y=o[y],Z=o[Z]),c||(G=G*h+d,y=y*h+d,Z=Z*h+d);for(let X=0;X<3;X++){let L,V,x;c?(L=s[u[X]](G),V=s[u[X]](y),x=s[u[X]](Z)):(L=l[G+X],V=l[y+X],x=l[Z+X]);let R=L;V<R&&(R=V),x<R&&(R=x);let S=L;V>S&&(S=V),x>S&&(S=x);const W=(S-R)/2,f=X*2;r[b+f+0]=R+W,r[b+f+1]=W+(Math.abs(R)+W)*lh}}return r}function E(n,e,t){return t.min.x=e[n],t.min.y=e[n+1],t.min.z=e[n+2],t.max.x=e[n+3],t.max.y=e[n+4],t.max.z=e[n+5],t}function Nr(n){let e=-1,t=-1/0;for(let i=0;i<3;i++){const s=n[i+3]-n[i];s>t&&(t=s,e=i)}return e}function Ir(n,e){e.set(n)}function Jr(n,e,t){let i,s;for(let o=0;o<3;o++){const a=o+3;i=n[o],s=e[o],t[o]=i<s?i:s,i=n[a],s=e[a],t[a]=i>s?i:s}}function qn(n,e,t){for(let i=0;i<3;i++){const s=e[n+2*i],o=e[n+2*i+1],a=s-o,c=s+o;a<t[i]&&(t[i]=a),c>t[i+3]&&(t[i+3]=c)}}function vi(n){const e=n[3]-n[0],t=n[4]-n[1],i=n[5]-n[2];return 2*(e*t+t*i+i*e)}const ht=32,uh=(n,e)=>n.candidate-e.candidate,Xt=new Array(ht).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),$n=new Float32Array(6);function ph(n,e,t,i,s,o){let a=-1,c=0;if(o===lo)a=Nr(e),a!==-1&&(c=(e[a]+e[a+3])/2);else if(o===Kr)a=Nr(n),a!==-1&&(c=mh(t,i,s,a));else if(o===Mr){const r=vi(n);let l=_n*s;const d=i*6,h=(i+s)*6;for(let u=0;u<3;u++){const p=e[u],m=(e[u+3]-p)/ht;if(s<ht/4){const b=[...Xt];b.length=s;let G=0;for(let Z=d;Z<h;Z+=6,G++){const X=b[G];X.candidate=t[Z+2*u],X.count=0;const{bounds:L,leftCacheBounds:V,rightCacheBounds:x}=X;for(let R=0;R<3;R++)x[R]=1/0,x[R+3]=-1/0,V[R]=1/0,V[R+3]=-1/0,L[R]=1/0,L[R+3]=-1/0;qn(Z,t,L)}b.sort(uh);let y=s;for(let Z=0;Z<y;Z++){const X=b[Z];for(;Z+1<y&&b[Z+1].candidate===X.candidate;)b.splice(Z+1,1),y--}for(let Z=d;Z<h;Z+=6){const X=t[Z+2*u];for(let L=0;L<y;L++){const V=b[L];X>=V.candidate?qn(Z,t,V.rightCacheBounds):(qn(Z,t,V.leftCacheBounds),V.count++)}}for(let Z=0;Z<y;Z++){const X=b[Z],L=X.count,V=s-X.count,x=X.leftCacheBounds,R=X.rightCacheBounds;let S=0;L!==0&&(S=vi(x)/r);let W=0;V!==0&&(W=vi(R)/r);const f=ho+_n*(S*L+W*V);f<l&&(a=u,l=f,c=X.candidate)}}else{for(let y=0;y<ht;y++){const Z=Xt[y];Z.count=0,Z.candidate=p+m+y*m;const X=Z.bounds;for(let L=0;L<3;L++)X[L]=1/0,X[L+3]=-1/0}for(let y=d;y<h;y+=6){let Z=~~((t[y+2*u]-p)/m);Z>=ht&&(Z=ht-1);const X=Xt[Z];X.count++,qn(y,t,X.bounds)}const b=Xt[ht-1];Ir(b.bounds,b.rightCacheBounds);for(let y=ht-2;y>=0;y--){const Z=Xt[y],X=Xt[y+1];Jr(Z.bounds,X.rightCacheBounds,Z.rightCacheBounds)}let G=0;for(let y=0;y<ht-1;y++){const Z=Xt[y],X=Z.count,L=Z.bounds,V=Xt[y+1].rightCacheBounds;X!==0&&(G===0?Ir(L,$n):Jr(L,$n,$n)),G+=X;let x=0,R=0;G!==0&&(x=vi($n)/r);const S=s-G;S!==0&&(R=vi(V)/r);const W=ho+_n*(x*G+R*S);W<l&&(a=u,l=W,c=Z.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${o} used.`);return{axis:a,pos:c}}function mh(n,e,t,i){let s=0;for(let o=e,a=e+t;o<a;o++)s+=n[o*6+i*2];return s/t}class mo{constructor(){this.boundingData=new Float32Array(6)}}function bh(n,e,t,i,s,o){let a=i,c=i+s-1;const r=o.pos,l=o.axis*2;for(;;){for(;a<=c&&t[a*6+l]<r;)a++;for(;a<=c&&t[c*6+l]>=r;)c--;if(a<c){for(let d=0;d<3;d++){let h=e[a*3+d];e[a*3+d]=e[c*3+d],e[c*3+d]=h}for(let d=0;d<6;d++){let h=t[a*6+d];t[a*6+d]=t[c*6+d],t[c*6+d]=h}a++,c--}else return a}}function yh(n,e,t,i,s,o){let a=i,c=i+s-1;const r=o.pos,l=o.axis*2;for(;;){for(;a<=c&&t[a*6+l]<r;)a++;for(;a<=c&&t[c*6+l]>=r;)c--;if(a<c){let d=n[a];n[a]=n[c],n[c]=d;for(let h=0;h<6;h++){let u=t[a*6+h];t[a*6+h]=t[c*6+h],t[c*6+h]=u}a++,c--}else return a}}function xe(n,e){return e[n+15]===65535}function ge(n,e){return e[n+6]}function Ke(n,e){return e[n+14]}function Ye(n){return n+8}function Me(n,e){return e[n+6]}function bo(n,e){return e[n+7]}let Ur,Ki,es,Pr;const Gh=Math.pow(2,32);function yo(n){return"count"in n?1:1+yo(n.left)+yo(n.right)}function Zh(n,e,t){return Ur=new Float32Array(t),Ki=new Uint32Array(t),es=new Uint16Array(t),Pr=new Uint8Array(t),Go(n,e)}function Go(n,e){const t=n/4,i=n/2,s="count"in e,o=e.boundingData;for(let a=0;a<6;a++)Ur[t+a]=o[a];if(s)if(e.buffer){const a=e.buffer;Pr.set(new Uint8Array(a),n);for(let c=n,r=n+a.byteLength;c<r;c+=Zt){const l=c/2;xe(l,es)||(Ki[c/4+6]+=t)}return n+a.byteLength}else{const a=e.offset,c=e.count;return Ki[t+6]=a,es[i+14]=c,es[i+15]=An,n+Zt}else{const a=e.left,c=e.right,r=e.splitAxis;let l;if(l=Go(n+Zt,a),l/4>Gh)throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return Ki[t+6]=l/4,l=Go(l,c),Ki[t+7]=r,l}}function Xh(n,e){const t=(n.index?n.index.count:n.attributes.position.count)/3,i=t>2**16,s=i?4:2,o=e?new SharedArrayBuffer(t*s):new ArrayBuffer(t*s),a=i?new Uint32Array(o):new Uint16Array(o);for(let c=0,r=a.length;c<r;c++)a[c]=c;return a}function Vh(n,e,t,i,s){const{maxDepth:o,verbose:a,maxLeafTris:c,strategy:r,onProgress:l,indirect:d}=s,h=n._indirectBuffer,u=n.geometry,p=u.index?u.index.array:null,m=d?yh:bh,b=ei(u),G=new Float32Array(6);let y=!1;const Z=new mo;return po(e,t,i,Z.boundingData,G),L(Z,t,i,G),Z;function X(V){l&&l(V/b)}function L(V,x,R,S=null,W=0){if(!y&&W>=o&&(y=!0,a&&(console.warn(`MeshBVH: Max depth of ${o} reached when generating BVH. Consider increasing maxDepth.`),console.warn(u))),R<=c||W>=o)return X(x+R),V.offset=x,V.count=R,V;const f=ph(V.boundingData,S,e,x,R,r);if(f.axis===-1)return X(x+R),V.offset=x,V.count=R,V;const C=m(h,p,e,x,R,f);if(C===x||C===x+R)X(x+R),V.offset=x,V.count=R;else{V.splitAxis=f.axis;const g=new mo,z=x,Y=C-x;V.left=g,po(e,z,Y,g.boundingData,G),L(g,z,Y,G,W+1);const k=new mo,N=C,Q=R-Y;V.right=k,po(e,N,Q,k.boundingData,G),L(k,N,Q,G,W+1)}return V}}function Rh(n,e){const t=n.geometry;e.indirect&&(n._indirectBuffer=Xh(t,e.useSharedArrayBuffer),dh(t,e.range)&&!e.verbose&&console.warn('MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the "indirect" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),n._indirectBuffer||ch(t,e);const i=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,s=hh(t),o=e.indirect?Hr(t,e.range):kr(t,e.range);n._roots=o.map(a=>{const c=Vh(n,s,a.offset,a.count,e),r=yo(c),l=new i(Zt*r);return Zh(0,c,l),l})}class ut{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let i=1/0,s=-1/0;for(let o=0,a=e.length;o<a;o++){const c=e[o][t];i=c<i?c:i,s=c>s?c:s}this.min=i,this.max=s}setFromPoints(e,t){let i=1/0,s=-1/0;for(let o=0,a=t.length;o<a;o++){const c=t[o],r=e.dot(c);i=r<i?r:i,s=r>s?r:s}this.min=i,this.max=s}isSeparated(e){return this.min>e.max||e.min>this.max}}ut.prototype.setFromBox=function(){const n=new K;return function(e,t){const i=t.min,s=t.max;let o=1/0,a=-1/0;for(let c=0;c<=1;c++)for(let r=0;r<=1;r++)for(let l=0;l<=1;l++){n.x=i.x*c+s.x*(1-c),n.y=i.y*r+s.y*(1-r),n.z=i.z*l+s.z*(1-l);const d=e.dot(n);o=Math.min(d,o),a=Math.max(d,a)}this.min=o,this.max=a}}();const Lh=function(){const n=new K,e=new K,t=new K;return function(i,s,o){const a=i.start,c=n,r=s.start,l=e;t.subVectors(a,r),n.subVectors(i.end,i.start),e.subVectors(s.end,s.start);const d=t.dot(l),h=l.dot(c),u=l.dot(l),p=t.dot(c),m=c.dot(c)*u-h*h;let b,G;m!==0?b=(d*h-p*u)/m:b=0,G=(d+b*h)/u,o.x=b,o.y=G}}(),Zo=function(){const n=new De,e=new K,t=new K;return function(i,s,o,a){Lh(i,s,n);let c=n.x,r=n.y;if(c>=0&&c<=1&&r>=0&&r<=1){i.at(c,o),s.at(r,a);return}else if(c>=0&&c<=1){r<0?s.at(0,a):s.at(1,a),i.closestPointToPoint(a,!0,o);return}else if(r>=0&&r<=1){c<0?i.at(0,o):i.at(1,o),s.closestPointToPoint(o,!0,a);return}else{let l;c<0?l=i.start:l=i.end;let d;r<0?d=s.start:d=s.end;const h=e,u=t;if(i.closestPointToPoint(d,!0,e),s.closestPointToPoint(l,!0,t),h.distanceToSquared(d)<=u.distanceToSquared(l)){o.copy(h),a.copy(d);return}else{o.copy(l),a.copy(u);return}}}}(),xh=function(){const n=new K,e=new K,t=new Po,i=new rt;return function(s,o){const{radius:a,center:c}=s,{a:r,b:l,c:d}=o;if(i.start=r,i.end=l,i.closestPointToPoint(c,!0,n).distanceTo(c)<=a||(i.start=r,i.end=d,i.closestPointToPoint(c,!0,n).distanceTo(c)<=a)||(i.start=l,i.end=d,i.closestPointToPoint(c,!0,n).distanceTo(c)<=a))return!0;const h=o.getPlane(t);if(Math.abs(h.distanceToPoint(c))<=a){const u=h.projectPoint(c,e);if(o.containsPoint(u))return!0}return!1}}(),Sh=1e-15;function Xo(n){return Math.abs(n)<Sh}class He extends we{constructor(...e){super(...e),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new K),this.satBounds=new Array(4).fill().map(()=>new ut),this.points=[this.a,this.b,this.c],this.sphere=new wo,this.plane=new Po,this.needsUpdate=!0}intersectsSphere(e){return xh(e,this)}update(){const e=this.a,t=this.b,i=this.c,s=this.points,o=this.satAxes,a=this.satBounds,c=o[0],r=a[0];this.getNormal(c),r.setFromPoints(c,s);const l=o[1],d=a[1];l.subVectors(e,t),d.setFromPoints(l,s);const h=o[2],u=a[2];h.subVectors(t,i),u.setFromPoints(h,s);const p=o[3],m=a[3];p.subVectors(i,e),m.setFromPoints(p,s),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(c,e),this.needsUpdate=!1}}He.prototype.closestPointToSegment=function(){const n=new K,e=new K,t=new rt;return function(i,s=null,o=null){const{start:a,end:c}=i,r=this.points;let l,d=1/0;for(let h=0;h<3;h++){const u=(h+1)%3;t.start.copy(r[h]),t.end.copy(r[u]),Zo(t,i,n,e),l=n.distanceToSquared(e),l<d&&(d=l,s&&s.copy(n),o&&o.copy(e))}return this.closestPointToPoint(a,n),l=a.distanceToSquared(n),l<d&&(d=l,s&&s.copy(n),o&&o.copy(a)),this.closestPointToPoint(c,n),l=c.distanceToSquared(n),l<d&&(d=l,s&&s.copy(n),o&&o.copy(c)),Math.sqrt(d)}}(),He.prototype.intersectsTriangle=function(){const n=new He,e=new Array(3),t=new Array(3),i=new ut,s=new ut,o=new K,a=new K,c=new K,r=new K,l=new K,d=new rt,h=new rt,u=new rt,p=new K;function m(b,G,y){const Z=b.points;let X=0,L=-1;for(let V=0;V<3;V++){const{start:x,end:R}=d;x.copy(Z[V]),R.copy(Z[(V+1)%3]),d.delta(a);const S=Xo(G.distanceToPoint(x));if(Xo(G.normal.dot(a))&&S){y.copy(d),X=2;break}const W=G.intersectLine(d,p);if(!W&&S&&p.copy(x),(W||S)&&!Xo(p.distanceTo(R))){if(X<=1)(X===1?y.start:y.end).copy(p),S&&(L=X);else if(X>=2){(L===1?y.start:y.end).copy(p),X=2;break}if(X++,X===2&&L===-1)break}}return X}return function(b,G=null,y=!1){this.needsUpdate&&this.update(),b.isExtendedTriangle?b.needsUpdate&&b.update():(n.copy(b),n.update(),b=n);const Z=this.plane,X=b.plane;if(Math.abs(Z.normal.dot(X.normal))>1-1e-10){const L=this.satBounds,V=this.satAxes;t[0]=b.a,t[1]=b.b,t[2]=b.c;for(let S=0;S<4;S++){const W=L[S],f=V[S];if(i.setFromPoints(f,t),W.isSeparated(i))return!1}const x=b.satBounds,R=b.satAxes;e[0]=this.a,e[1]=this.b,e[2]=this.c;for(let S=0;S<4;S++){const W=x[S],f=R[S];if(i.setFromPoints(f,e),W.isSeparated(i))return!1}for(let S=0;S<4;S++){const W=V[S];for(let f=0;f<4;f++){const C=R[f];if(o.crossVectors(W,C),i.setFromPoints(o,e),s.setFromPoints(o,t),i.isSeparated(s))return!1}}return G&&(y||console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),G.start.set(0,0,0),G.end.set(0,0,0)),!0}else{const L=m(this,X,h);if(L===1&&b.containsPoint(h.end))return G&&(G.start.copy(h.end),G.end.copy(h.end)),!0;if(L!==2)return!1;const V=m(b,Z,u);if(V===1&&this.containsPoint(u.end))return G&&(G.start.copy(u.end),G.end.copy(u.end)),!0;if(V!==2)return!1;if(h.delta(c),u.delta(r),c.dot(r)<0){let g=u.start;u.start=u.end,u.end=g}const x=h.start.dot(c),R=h.end.dot(c),S=u.start.dot(c),W=u.end.dot(c),f=R<S,C=x<W;return x!==W&&S!==R&&f===C?!1:(G&&(l.subVectors(h.start,u.start),l.dot(c)>0?G.start.copy(h.start):G.start.copy(u.start),l.subVectors(h.end,u.end),l.dot(c)<0?G.end.copy(h.end):G.end.copy(u.end)),!0)}}}(),He.prototype.distanceToPoint=function(){const n=new K;return function(e){return this.closestPointToPoint(e,n),e.distanceTo(n)}}(),He.prototype.distanceToTriangle=function(){const n=new K,e=new K,t=["a","b","c"],i=new rt,s=new rt;return function(o,a=null,c=null){const r=a||c?i:null;if(this.intersectsTriangle(o,r))return(a||c)&&(a&&r.getCenter(a),c&&r.getCenter(c)),0;let l=1/0;for(let d=0;d<3;d++){let h;const u=t[d],p=o[u];this.closestPointToPoint(p,n),h=p.distanceToSquared(n),h<l&&(l=h,a&&a.copy(n),c&&c.copy(p));const m=this[u];o.closestPointToPoint(m,n),h=m.distanceToSquared(n),h<l&&(l=h,a&&a.copy(m),c&&c.copy(n))}for(let d=0;d<3;d++){const h=t[d],u=t[(d+1)%3];i.set(this[h],this[u]);for(let p=0;p<3;p++){const m=t[p],b=t[(p+1)%3];s.set(o[m],o[b]),Zo(i,s,n,e);const G=n.distanceToSquared(e);G<l&&(l=G,a&&a.copy(n),c&&c.copy(e))}}return Math.sqrt(l)}}();class Xe{constructor(e,t,i){this.isOrientedBox=!0,this.min=new K,this.max=new K,this.matrix=new Te,this.invMatrix=new Te,this.points=new Array(8).fill().map(()=>new K),this.satAxes=new Array(3).fill().map(()=>new K),this.satBounds=new Array(3).fill().map(()=>new ut),this.alignedSatBounds=new Array(3).fill().map(()=>new ut),this.needsUpdate=!1,e&&this.min.copy(e),t&&this.max.copy(t),i&&this.matrix.copy(i)}set(e,t,i){this.min.copy(e),this.max.copy(t),this.matrix.copy(i),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}Xe.prototype.update=function(){return function(){const n=this.matrix,e=this.min,t=this.max,i=this.points;for(let r=0;r<=1;r++)for(let l=0;l<=1;l++)for(let d=0;d<=1;d++){const h=1*r|2*l|4*d,u=i[h];u.x=r?t.x:e.x,u.y=l?t.y:e.y,u.z=d?t.z:e.z,u.applyMatrix4(n)}const s=this.satBounds,o=this.satAxes,a=i[0];for(let r=0;r<3;r++){const l=o[r],d=s[r],h=1<<r,u=i[h];l.subVectors(a,u),d.setFromPoints(l,i)}const c=this.alignedSatBounds;c[0].setFromPointsField(i,"x"),c[1].setFromPointsField(i,"y"),c[2].setFromPointsField(i,"z"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1}}(),Xe.prototype.intersectsBox=function(){const n=new ut;return function(e){this.needsUpdate&&this.update();const t=e.min,i=e.max,s=this.satBounds,o=this.satAxes,a=this.alignedSatBounds;if(n.min=t.x,n.max=i.x,a[0].isSeparated(n)||(n.min=t.y,n.max=i.y,a[1].isSeparated(n))||(n.min=t.z,n.max=i.z,a[2].isSeparated(n)))return!1;for(let c=0;c<3;c++){const r=o[c],l=s[c];if(n.setFromBox(r,e),l.isSeparated(n))return!1}return!0}}(),Xe.prototype.intersectsTriangle=function(){const n=new He,e=new Array(3),t=new ut,i=new ut,s=new K;return function(o){this.needsUpdate&&this.update(),o.isExtendedTriangle?o.needsUpdate&&o.update():(n.copy(o),n.update(),o=n);const a=this.satBounds,c=this.satAxes;e[0]=o.a,e[1]=o.b,e[2]=o.c;for(let h=0;h<3;h++){const u=a[h],p=c[h];if(t.setFromPoints(p,e),u.isSeparated(t))return!1}const r=o.satBounds,l=o.satAxes,d=this.points;for(let h=0;h<3;h++){const u=r[h],p=l[h];if(t.setFromPoints(p,d),u.isSeparated(t))return!1}for(let h=0;h<3;h++){const u=c[h];for(let p=0;p<4;p++){const m=l[p];if(s.crossVectors(u,m),t.setFromPoints(s,e),i.setFromPoints(s,d),t.isSeparated(i))return!1}}return!0}}(),Xe.prototype.closestPointToPoint=function(){return function(n,e){return this.needsUpdate&&this.update(),e.copy(n).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),e}}(),Xe.prototype.distanceToPoint=function(){const n=new K;return function(e){return this.closestPointToPoint(e,n),e.distanceTo(n)}}(),Xe.prototype.distanceToBox=function(){const n=["x","y","z"],e=new Array(12).fill().map(()=>new rt),t=new Array(12).fill().map(()=>new rt),i=new K,s=new K;return function(o,a=0,c=null,r=null){if(this.needsUpdate&&this.update(),this.intersectsBox(o))return(c||r)&&(o.getCenter(s),this.closestPointToPoint(s,i),o.closestPointToPoint(i,s),c&&c.copy(i),r&&r.copy(s)),0;const l=a*a,d=o.min,h=o.max,u=this.points;let p=1/0;for(let b=0;b<8;b++){const G=u[b];s.copy(G).clamp(d,h);const y=G.distanceToSquared(s);if(y<p&&(p=y,c&&c.copy(G),r&&r.copy(s),y<l))return Math.sqrt(y)}let m=0;for(let b=0;b<3;b++)for(let G=0;G<=1;G++)for(let y=0;y<=1;y++){const Z=(b+1)%3,X=(b+2)%3,L=G<<Z|y<<X,V=1<<b|G<<Z|y<<X,x=u[L],R=u[V];e[m].set(x,R);const S=n[b],W=n[Z],f=n[X],C=t[m],g=C.start,z=C.end;g[S]=d[S],g[W]=G?d[W]:h[W],g[f]=y?d[f]:h[W],z[S]=h[S],z[W]=G?d[W]:h[W],z[f]=y?d[f]:h[W],m++}for(let b=0;b<=1;b++)for(let G=0;G<=1;G++)for(let y=0;y<=1;y++){s.x=b?h.x:d.x,s.y=G?h.y:d.y,s.z=y?h.z:d.z,this.closestPointToPoint(s,i);const Z=s.distanceToSquared(i);if(Z<p&&(p=Z,c&&c.copy(i),r&&r.copy(s),Z<l))return Math.sqrt(Z)}for(let b=0;b<12;b++){const G=e[b];for(let y=0;y<12;y++){const Z=t[y];Zo(G,Z,i,s);const X=i.distanceToSquared(s);if(X<p&&(p=X,c&&c.copy(i),r&&r.copy(s),X<l))return Math.sqrt(X)}}return Math.sqrt(p)}}();class Vo{constructor(e){this._getNewPrimitive=e,this._primitives=[]}getPrimitive(){const e=this._primitives;return e.length===0?this._getNewPrimitive():e.pop()}releasePrimitive(e){this._primitives.push(e)}}class fh extends Vo{constructor(){super(()=>new He)}}const ke=new fh;class Wh{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const e=[];let t=null;this.setBuffer=i=>{t&&e.push(t),t=i,this.float32Array=new Float32Array(i),this.uint16Array=new Uint16Array(i),this.uint32Array=new Uint32Array(i)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,e.length!==0&&this.setBuffer(e.pop())}}}const j=new Wh;let Vt,ti;const ii=[],ts=new Vo(()=>new fe);function gh(n,e,t,i,s,o){Vt=ts.getPrimitive(),ti=ts.getPrimitive(),ii.push(Vt,ti),j.setBuffer(n._roots[e]);const a=Ro(0,n.geometry,t,i,s,o);j.clearBuffer(),ts.releasePrimitive(Vt),ts.releasePrimitive(ti),ii.pop(),ii.pop();const c=ii.length;return c>0&&(ti=ii[c-1],Vt=ii[c-2]),a}function Ro(n,e,t,i,s=null,o=0,a=0){const{float32Array:c,uint16Array:r,uint32Array:l}=j;let d=n*2;if(xe(d,r)){const h=ge(n,l),u=Ke(d,r);return E(n,c,Vt),i(h,u,!1,a,o+n,Vt)}else{let h=function(C){const{uint16Array:g,uint32Array:z}=j;let Y=C*2;for(;!xe(Y,g);)C=Ye(C),Y=C*2;return ge(C,z)},u=function(C){const{uint16Array:g,uint32Array:z}=j;let Y=C*2;for(;!xe(Y,g);)C=Me(C,z),Y=C*2;return ge(C,z)+Ke(Y,g)};const p=Ye(n),m=Me(n,l);let b=p,G=m,y,Z,X,L;if(s&&(X=Vt,L=ti,E(b,c,X),E(G,c,L),y=s(X),Z=s(L),Z<y)){b=m,G=p;const C=y;y=Z,Z=C,X=L}X||(X=Vt,E(b,c,X));const V=xe(b*2,r),x=t(X,V,y,a+1,o+b);let R;if(x===co){const C=h(b),g=u(b)-C;R=i(C,g,!0,a+1,o+b,X)}else R=x&&Ro(b,e,t,i,s,o,a+1);if(R)return!0;L=ti,E(G,c,L);const S=xe(G*2,r),W=t(L,S,Z,a+1,o+G);let f;if(W===co){const C=h(G),g=u(G)-C;f=i(C,g,!0,a+1,o+G,L)}else f=W&&Ro(G,e,t,i,s,o,a+1);return!!f}}const Mi=new K,Lo=new K;function Ch(n,e,t={},i=0,s=1/0){const o=i*i,a=s*s;let c=1/0,r=null;if(n.shapecast({boundsTraverseOrder:d=>(Mi.copy(e).clamp(d.min,d.max),Mi.distanceToSquared(e)),intersectsBounds:(d,h,u)=>u<c&&u<a,intersectsTriangle:(d,h)=>{d.closestPointToPoint(e,Mi);const u=e.distanceToSquared(Mi);return u<c&&(Lo.copy(Mi),c=u,r=h),u<o}}),c===1/0)return null;const l=Math.sqrt(c);return t.point?t.point.copy(Lo):t.point=Lo.clone(),t.distance=l,t.faceIndex=r,t}const zh=parseInt(Fo)>=169,Nt=new K,It=new K,Jt=new K,is=new De,ns=new De,ss=new De,wr=new K,Fr=new K,Qr=new K,Ti=new K;function vh(n,e,t,i,s,o,a,c){let r;if(o===fl?r=n.intersectTriangle(i,t,e,!0,s):r=n.intersectTriangle(e,t,i,o!==Ss,s),r===null)return null;const l=n.origin.distanceTo(s);return l<a||l>c?null:{distance:l,point:s.clone()}}function Kh(n,e,t,i,s,o,a,c,r,l,d){Nt.fromBufferAttribute(e,o),It.fromBufferAttribute(e,a),Jt.fromBufferAttribute(e,c);const h=vh(n,Nt,It,Jt,Ti,r,l,d);if(h){const u=new K;we.getBarycoord(Ti,Nt,It,Jt,u),i&&(is.fromBufferAttribute(i,o),ns.fromBufferAttribute(i,a),ss.fromBufferAttribute(i,c),h.uv=we.getInterpolation(Ti,Nt,It,Jt,is,ns,ss,new De)),s&&(is.fromBufferAttribute(s,o),ns.fromBufferAttribute(s,a),ss.fromBufferAttribute(s,c),h.uv1=we.getInterpolation(Ti,Nt,It,Jt,is,ns,ss,new De)),t&&(wr.fromBufferAttribute(t,o),Fr.fromBufferAttribute(t,a),Qr.fromBufferAttribute(t,c),h.normal=we.getInterpolation(Ti,Nt,It,Jt,wr,Fr,Qr,new K),h.normal.dot(n.direction)>0&&h.normal.multiplyScalar(-1));const p={a:o,b:a,c,normal:new K,materialIndex:0};we.getNormal(Nt,It,Jt,p.normal),h.face=p,h.faceIndex=o,zh&&(h.barycoord=u)}return h}function os(n,e,t,i,s,o,a){const c=i*3;let r=c+0,l=c+1,d=c+2;const h=n.index;n.index&&(r=h.getX(r),l=h.getX(l),d=h.getX(d));const{position:u,normal:p,uv:m,uv1:b}=n.attributes,G=Kh(t,u,p,m,b,r,l,d,e,o,a);return G?(G.faceIndex=i,s&&s.push(G),G):null}function $(n,e,t,i){const s=n.a,o=n.b,a=n.c;let c=e,r=e+1,l=e+2;t&&(c=t.getX(c),r=t.getX(r),l=t.getX(l)),s.x=i.getX(c),s.y=i.getY(c),s.z=i.getZ(c),o.x=i.getX(r),o.y=i.getY(r),o.z=i.getZ(r),a.x=i.getX(l),a.y=i.getY(l),a.z=i.getZ(l)}const Yi=new K,Hi=new K,ki=new K,Br=new De,Er=new De,jr=new De;function Mh(n,e,t,i){const s=e.getIndex().array,o=e.getAttribute("position"),a=e.getAttribute("uv"),c=s[t*3],r=s[t*3+1],l=s[t*3+2];Yi.fromBufferAttribute(o,c),Hi.fromBufferAttribute(o,r),ki.fromBufferAttribute(o,l);let d=0;const h=e.groups,u=t*3;for(let b=0,G=h.length;b<G;b++){const y=h[b],{start:Z,count:X}=y;if(u>=Z&&u<Z+X){d=y.materialIndex;break}}const p=i&&i.barycoord?i.barycoord:new K;we.getBarycoord(n,Yi,Hi,ki,p);let m=null;return a&&(Br.fromBufferAttribute(a,c),Er.fromBufferAttribute(a,r),jr.fromBufferAttribute(a,l),i&&i.uv?m=i.uv:m=new De,we.getInterpolation(n,Yi,Hi,ki,Br,Er,jr,m)),i?(i.face||(i.face={}),i.face.a=c,i.face.b=r,i.face.c=l,i.face.materialIndex=d,i.face.normal||(i.face.normal=new K),we.getNormal(Yi,Hi,ki,i.face.normal),m&&(i.uv=m),i.barycoord=p,i):{face:{a:c,b:r,c:l,materialIndex:d,normal:we.getNormal(Yi,Hi,ki,new K)},uv:m,barycoord:p}}function Th(n,e,t,i,s,o,a,c){const{geometry:r,_indirectBuffer:l}=n;for(let d=i,h=i+s;d<h;d++)os(r,e,t,d,o,a,c)}function Yh(n,e,t,i,s,o,a){const{geometry:c,_indirectBuffer:r}=n;let l=1/0,d=null;for(let h=i,u=i+s;h<u;h++){let p;p=os(c,e,t,h,null,o,a),p&&p.distance<l&&(d=p,l=p.distance)}return d}function Hh(n,e,t,i,s,o,a){const{geometry:c}=t,{index:r}=c,l=c.attributes.position;for(let d=n,h=e+n;d<h;d++){let u;if(u=d,$(a,u*3,r,l),a.needsUpdate=!0,i(a,u,s,o))return!0}return!1}function kh(n,e=null){e&&Array.isArray(e)&&(e=new Set(e));const t=n.geometry,i=t.index?t.index.array:null,s=t.attributes.position;let o,a,c,r,l=0;const d=n._roots;for(let u=0,p=d.length;u<p;u++)o=d[u],a=new Uint32Array(o),c=new Uint16Array(o),r=new Float32Array(o),h(0,l),l+=o.byteLength;function h(u,p,m=!1){const b=u*2;if(c[b+15]===An){const G=a[u+6],y=c[b+14];let Z=1/0,X=1/0,L=1/0,V=-1/0,x=-1/0,R=-1/0;for(let S=3*G,W=3*(G+y);S<W;S++){let f=i[S];const C=s.getX(f),g=s.getY(f),z=s.getZ(f);C<Z&&(Z=C),C>V&&(V=C),g<X&&(X=g),g>x&&(x=g),z<L&&(L=z),z>R&&(R=z)}return r[u+0]!==Z||r[u+1]!==X||r[u+2]!==L||r[u+3]!==V||r[u+4]!==x||r[u+5]!==R?(r[u+0]=Z,r[u+1]=X,r[u+2]=L,r[u+3]=V,r[u+4]=x,r[u+5]=R,!0):!1}else{const G=u+8,y=a[u+6],Z=G+p,X=y+p;let L=m,V=!1,x=!1;e?L||(V=e.has(Z),x=e.has(X),L=!V&&!x):(V=!0,x=!0);const R=L||V,S=L||x;let W=!1;R&&(W=h(G,p,L));let f=!1;S&&(f=h(y,p,L));const C=W||f;if(C)for(let g=0;g<3;g++){const z=G+g,Y=y+g,k=r[z],N=r[z+3],Q=r[Y],P=r[Y+3];r[u+g]=k<Q?k:Q,r[u+g+3]=N>P?N:P}return C}}}function Rt(n,e,t,i,s){let o,a,c,r,l,d;const h=1/t.direction.x,u=1/t.direction.y,p=1/t.direction.z,m=t.origin.x,b=t.origin.y,G=t.origin.z;let y=e[n],Z=e[n+3],X=e[n+1],L=e[n+3+1],V=e[n+2],x=e[n+3+2];return h>=0?(o=(y-m)*h,a=(Z-m)*h):(o=(Z-m)*h,a=(y-m)*h),u>=0?(c=(X-b)*u,r=(L-b)*u):(c=(L-b)*u,r=(X-b)*u),o>r||c>a||((c>o||isNaN(o))&&(o=c),(r<a||isNaN(a))&&(a=r),p>=0?(l=(V-G)*p,d=(x-G)*p):(l=(x-G)*p,d=(V-G)*p),o>d||l>a)?!1:((l>o||o!==o)&&(o=l),(d<a||a!==a)&&(a=d),o<=s&&a>=i)}function Nh(n,e,t,i,s,o,a,c){const{geometry:r,_indirectBuffer:l}=n;for(let d=i,h=i+s;d<h;d++){let u=l?l[d]:d;os(r,e,t,u,o,a,c)}}function Ih(n,e,t,i,s,o,a){const{geometry:c,_indirectBuffer:r}=n;let l=1/0,d=null;for(let h=i,u=i+s;h<u;h++){let p;p=os(c,e,t,r?r[h]:h,null,o,a),p&&p.distance<l&&(d=p,l=p.distance)}return d}function Jh(n,e,t,i,s,o,a){const{geometry:c}=t,{index:r}=c,l=c.attributes.position;for(let d=n,h=e+n;d<h;d++){let u;if(u=t.resolveTriangleIndex(d),$(a,u*3,r,l),a.needsUpdate=!0,i(a,u,s,o))return!0}return!1}function Uh(n,e,t,i,s,o,a){j.setBuffer(n._roots[e]),xo(0,n,t,i,s,o,a),j.clearBuffer()}function xo(n,e,t,i,s,o,a){const{float32Array:c,uint16Array:r,uint32Array:l}=j,d=n*2;if(xe(d,r)){const h=ge(n,l),u=Ke(d,r);Th(e,t,i,h,u,s,o,a)}else{const h=Ye(n);Rt(h,c,i,o,a)&&xo(h,e,t,i,s,o,a);const u=Me(n,l);Rt(u,c,i,o,a)&&xo(u,e,t,i,s,o,a)}}const Ph=["x","y","z"];function wh(n,e,t,i,s,o){j.setBuffer(n._roots[e]);const a=So(0,n,t,i,s,o);return j.clearBuffer(),a}function So(n,e,t,i,s,o){const{float32Array:a,uint16Array:c,uint32Array:r}=j;let l=n*2;if(xe(l,c)){const d=ge(n,r),h=Ke(l,c);return Yh(e,t,i,d,h,s,o)}else{const d=bo(n,r),h=Ph[d],u=i.direction[h]>=0;let p,m;u?(p=Ye(n),m=Me(n,r)):(p=Me(n,r),m=Ye(n));const b=Rt(p,a,i,s,o)?So(p,e,t,i,s,o):null;if(b){const y=b.point[h];if(u?y<=a[m+d]:y>=a[m+d+3])return b}const G=Rt(m,a,i,s,o)?So(m,e,t,i,s,o):null;return b&&G?b.distance<=G.distance?b:G:b||G||null}}const as=new fe,ni=new He,si=new He,Ni=new Te,Or=new Xe,rs=new Xe;function Fh(n,e,t,i){j.setBuffer(n._roots[e]);const s=fo(0,n,t,i);return j.clearBuffer(),s}function fo(n,e,t,i,s=null){const{float32Array:o,uint16Array:a,uint32Array:c}=j;let r=n*2;if(s===null&&(t.boundingBox||t.computeBoundingBox(),Or.set(t.boundingBox.min,t.boundingBox.max,i),s=Or),xe(r,a)){const l=e.geometry,d=l.index,h=l.attributes.position,u=t.index,p=t.attributes.position,m=ge(n,c),b=Ke(r,a);if(Ni.copy(i).invert(),t.boundsTree)return E(n,o,rs),rs.matrix.copy(Ni),rs.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:G=>rs.intersectsBox(G),intersectsTriangle:G=>{G.a.applyMatrix4(i),G.b.applyMatrix4(i),G.c.applyMatrix4(i),G.needsUpdate=!0;for(let y=m*3,Z=(b+m)*3;y<Z;y+=3)if($(si,y,d,h),si.needsUpdate=!0,G.intersectsTriangle(si))return!0;return!1}});for(let G=m*3,y=(b+m)*3;G<y;G+=3){$(ni,G,d,h),ni.a.applyMatrix4(Ni),ni.b.applyMatrix4(Ni),ni.c.applyMatrix4(Ni),ni.needsUpdate=!0;for(let Z=0,X=u.count;Z<X;Z+=3)if($(si,Z,u,p),si.needsUpdate=!0,ni.intersectsTriangle(si))return!0}}else{const l=n+8,d=c[n+6];return E(l,o,as),!!(s.intersectsBox(as)&&fo(l,e,t,i,s)||(E(d,o,as),s.intersectsBox(as)&&fo(d,e,t,i,s)))}}const ls=new Te,Wo=new Xe,Ii=new Xe,Qh=new K,Bh=new K,Eh=new K,jh=new K;function Oh(n,e,t,i={},s={},o=0,a=1/0){e.boundingBox||e.computeBoundingBox(),Wo.set(e.boundingBox.min,e.boundingBox.max,t),Wo.needsUpdate=!0;const c=n.geometry,r=c.attributes.position,l=c.index,d=e.attributes.position,h=e.index,u=ke.getPrimitive(),p=ke.getPrimitive();let m=Qh,b=Bh,G=null,y=null;s&&(G=Eh,y=jh);let Z=1/0,X=null,L=null;return ls.copy(t).invert(),Ii.matrix.copy(ls),n.shapecast({boundsTraverseOrder:V=>Wo.distanceToBox(V),intersectsBounds:(V,x,R)=>R<Z&&R<a?(x&&(Ii.min.copy(V.min),Ii.max.copy(V.max),Ii.needsUpdate=!0),!0):!1,intersectsRange:(V,x)=>{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:R=>Ii.distanceToBox(R),intersectsBounds:(R,S,W)=>W<Z&&W<a,intersectsRange:(R,S)=>{for(let W=R,f=R+S;W<f;W++){$(p,3*W,h,d),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let C=V,g=V+x;C<g;C++){$(u,3*C,l,r),u.needsUpdate=!0;const z=u.distanceToTriangle(p,m,G);if(z<Z&&(b.copy(m),y&&y.copy(G),Z=z,X=C,L=W),z<o)return!0}}}});{const R=ei(e);for(let S=0,W=R;S<W;S++){$(p,3*S,h,d),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let f=V,C=V+x;f<C;f++){$(u,3*f,l,r),u.needsUpdate=!0;const g=u.distanceToTriangle(p,m,G);if(g<Z&&(b.copy(m),y&&y.copy(G),Z=g,X=f,L=S),g<o)return!0}}}}}),ke.releasePrimitive(u),ke.releasePrimitive(p),Z===1/0?null:(i.point?i.point.copy(b):i.point=b.clone(),i.distance=Z,i.faceIndex=X,s&&(s.point?s.point.copy(y):s.point=y.clone(),s.point.applyMatrix4(ls),b.applyMatrix4(ls),s.distance=b.sub(s.point).length(),s.faceIndex=L),i)}function Dh(n,e=null){e&&Array.isArray(e)&&(e=new Set(e));const t=n.geometry,i=t.index?t.index.array:null,s=t.attributes.position;let o,a,c,r,l=0;const d=n._roots;for(let u=0,p=d.length;u<p;u++)o=d[u],a=new Uint32Array(o),c=new Uint16Array(o),r=new Float32Array(o),h(0,l),l+=o.byteLength;function h(u,p,m=!1){const b=u*2;if(c[b+15]===An){const G=a[u+6],y=c[b+14];let Z=1/0,X=1/0,L=1/0,V=-1/0,x=-1/0,R=-1/0;for(let S=G,W=G+y;S<W;S++){const f=3*n.resolveTriangleIndex(S);for(let C=0;C<3;C++){let g=f+C;g=i?i[g]:g;const z=s.getX(g),Y=s.getY(g),k=s.getZ(g);z<Z&&(Z=z),z>V&&(V=z),Y<X&&(X=Y),Y>x&&(x=Y),k<L&&(L=k),k>R&&(R=k)}}return r[u+0]!==Z||r[u+1]!==X||r[u+2]!==L||r[u+3]!==V||r[u+4]!==x||r[u+5]!==R?(r[u+0]=Z,r[u+1]=X,r[u+2]=L,r[u+3]=V,r[u+4]=x,r[u+5]=R,!0):!1}else{const G=u+8,y=a[u+6],Z=G+p,X=y+p;let L=m,V=!1,x=!1;e?L||(V=e.has(Z),x=e.has(X),L=!V&&!x):(V=!0,x=!0);const R=L||V,S=L||x;let W=!1;R&&(W=h(G,p,L));let f=!1;S&&(f=h(y,p,L));const C=W||f;if(C)for(let g=0;g<3;g++){const z=G+g,Y=y+g,k=r[z],N=r[z+3],Q=r[Y],P=r[Y+3];r[u+g]=k<Q?k:Q,r[u+g+3]=N>P?N:P}return C}}}function _h(n,e,t,i,s,o,a){j.setBuffer(n._roots[e]),go(0,n,t,i,s,o,a),j.clearBuffer()}function go(n,e,t,i,s,o,a){const{float32Array:c,uint16Array:r,uint32Array:l}=j,d=n*2;if(xe(d,r)){const h=ge(n,l),u=Ke(d,r);Nh(e,t,i,h,u,s,o,a)}else{const h=Ye(n);Rt(h,c,i,o,a)&&go(h,e,t,i,s,o,a);const u=Me(n,l);Rt(u,c,i,o,a)&&go(u,e,t,i,s,o,a)}}const Ah=["x","y","z"];function qh(n,e,t,i,s,o){j.setBuffer(n._roots[e]);const a=Co(0,n,t,i,s,o);return j.clearBuffer(),a}function Co(n,e,t,i,s,o){const{float32Array:a,uint16Array:c,uint32Array:r}=j;let l=n*2;if(xe(l,c)){const d=ge(n,r),h=Ke(l,c);return Ih(e,t,i,d,h,s,o)}else{const d=bo(n,r),h=Ah[d],u=i.direction[h]>=0;let p,m;u?(p=Ye(n),m=Me(n,r)):(p=Me(n,r),m=Ye(n));const b=Rt(p,a,i,s,o)?Co(p,e,t,i,s,o):null;if(b){const y=b.point[h];if(u?y<=a[m+d]:y>=a[m+d+3])return b}const G=Rt(m,a,i,s,o)?Co(m,e,t,i,s,o):null;return b&&G?b.distance<=G.distance?b:G:b||G||null}}const cs=new fe,oi=new He,ai=new He,Ji=new Te,Dr=new Xe,ds=new Xe;function $h(n,e,t,i){j.setBuffer(n._roots[e]);const s=zo(0,n,t,i);return j.clearBuffer(),s}function zo(n,e,t,i,s=null){const{float32Array:o,uint16Array:a,uint32Array:c}=j;let r=n*2;if(s===null&&(t.boundingBox||t.computeBoundingBox(),Dr.set(t.boundingBox.min,t.boundingBox.max,i),s=Dr),xe(r,a)){const l=e.geometry,d=l.index,h=l.attributes.position,u=t.index,p=t.attributes.position,m=ge(n,c),b=Ke(r,a);if(Ji.copy(i).invert(),t.boundsTree)return E(n,o,ds),ds.matrix.copy(Ji),ds.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:G=>ds.intersectsBox(G),intersectsTriangle:G=>{G.a.applyMatrix4(i),G.b.applyMatrix4(i),G.c.applyMatrix4(i),G.needsUpdate=!0;for(let y=m,Z=b+m;y<Z;y++)if($(ai,3*e.resolveTriangleIndex(y),d,h),ai.needsUpdate=!0,G.intersectsTriangle(ai))return!0;return!1}});for(let G=m,y=b+m;G<y;G++){const Z=e.resolveTriangleIndex(G);$(oi,3*Z,d,h),oi.a.applyMatrix4(Ji),oi.b.applyMatrix4(Ji),oi.c.applyMatrix4(Ji),oi.needsUpdate=!0;for(let X=0,L=u.count;X<L;X+=3)if($(ai,X,u,p),ai.needsUpdate=!0,oi.intersectsTriangle(ai))return!0}}else{const l=n+8,d=c[n+6];return E(l,o,cs),!!(s.intersectsBox(cs)&&zo(l,e,t,i,s)||(E(d,o,cs),s.intersectsBox(cs)&&zo(d,e,t,i,s)))}}const hs=new Te,vo=new Xe,Ui=new Xe,eu=new K,tu=new K,iu=new K,nu=new K;function su(n,e,t,i={},s={},o=0,a=1/0){e.boundingBox||e.computeBoundingBox(),vo.set(e.boundingBox.min,e.boundingBox.max,t),vo.needsUpdate=!0;const c=n.geometry,r=c.attributes.position,l=c.index,d=e.attributes.position,h=e.index,u=ke.getPrimitive(),p=ke.getPrimitive();let m=eu,b=tu,G=null,y=null;s&&(G=iu,y=nu);let Z=1/0,X=null,L=null;return hs.copy(t).invert(),Ui.matrix.copy(hs),n.shapecast({boundsTraverseOrder:V=>vo.distanceToBox(V),intersectsBounds:(V,x,R)=>R<Z&&R<a?(x&&(Ui.min.copy(V.min),Ui.max.copy(V.max),Ui.needsUpdate=!0),!0):!1,intersectsRange:(V,x)=>{if(e.boundsTree){const R=e.boundsTree;return R.shapecast({boundsTraverseOrder:S=>Ui.distanceToBox(S),intersectsBounds:(S,W,f)=>f<Z&&f<a,intersectsRange:(S,W)=>{for(let f=S,C=S+W;f<C;f++){const g=R.resolveTriangleIndex(f);$(p,3*g,h,d),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let z=V,Y=V+x;z<Y;z++){const k=n.resolveTriangleIndex(z);$(u,3*k,l,r),u.needsUpdate=!0;const N=u.distanceToTriangle(p,m,G);if(N<Z&&(b.copy(m),y&&y.copy(G),Z=N,X=z,L=f),N<o)return!0}}}})}else{const R=ei(e);for(let S=0,W=R;S<W;S++){$(p,3*S,h,d),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let f=V,C=V+x;f<C;f++){const g=n.resolveTriangleIndex(f);$(u,3*g,l,r),u.needsUpdate=!0;const z=u.distanceToTriangle(p,m,G);if(z<Z&&(b.copy(m),y&&y.copy(G),Z=z,X=f,L=S),z<o)return!0}}}}}),ke.releasePrimitive(u),ke.releasePrimitive(p),Z===1/0?null:(i.point?i.point.copy(b):i.point=b.clone(),i.distance=Z,i.faceIndex=X,s&&(s.point?s.point.copy(y):s.point=y.clone(),s.point.applyMatrix4(hs),b.applyMatrix4(hs),s.distance=b.sub(s.point).length(),s.faceIndex=L),i)}function _r(){return typeof SharedArrayBuffer<"u"}const Pi=new j.constructor,us=new j.constructor,Lt=new Vo(()=>new fe),ri=new fe,li=new fe,Ko=new fe,Mo=new fe;let To=!1;function ou(n,e,t,i){if(To)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");To=!0;const s=n._roots,o=e._roots;let a,c=0,r=0;const l=new Te().copy(t).invert();for(let d=0,h=s.length;d<h;d++){Pi.setBuffer(s[d]),r=0;const u=Lt.getPrimitive();E(0,Pi.float32Array,u),u.applyMatrix4(l);for(let p=0,m=o.length;p<m&&(us.setBuffer(o[p]),a=Ee(0,0,t,l,i,c,r,0,0,u),us.clearBuffer(),r+=o[p].length,!a);p++);if(Lt.releasePrimitive(u),Pi.clearBuffer(),c+=s[d].length,a)break}return To=!1,a}function Ee(n,e,t,i,s,o=0,a=0,c=0,r=0,l=null,d=!1){let h,u;d?(h=us,u=Pi):(h=Pi,u=us);const p=h.float32Array,m=h.uint32Array,b=h.uint16Array,G=u.float32Array,y=u.uint32Array,Z=u.uint16Array,X=n*2,L=e*2,V=xe(X,b),x=xe(L,Z);let R=!1;if(x&&V)d?R=s(ge(e,y),Ke(e*2,Z),ge(n,m),Ke(n*2,b),r,a+e,c,o+n):R=s(ge(n,m),Ke(n*2,b),ge(e,y),Ke(e*2,Z),c,o+n,r,a+e);else if(x){const S=Lt.getPrimitive();E(e,G,S),S.applyMatrix4(t);const W=Ye(n),f=Me(n,m);E(W,p,ri),E(f,p,li);const C=S.intersectsBox(ri),g=S.intersectsBox(li);R=C&&Ee(e,W,i,t,s,a,o,r,c+1,S,!d)||g&&Ee(e,f,i,t,s,a,o,r,c+1,S,!d),Lt.releasePrimitive(S)}else{const S=Ye(e),W=Me(e,y);E(S,G,Ko),E(W,G,Mo);const f=l.intersectsBox(Ko),C=l.intersectsBox(Mo);if(f&&C)R=Ee(n,S,t,i,s,o,a,c,r+1,l,d)||Ee(n,W,t,i,s,o,a,c,r+1,l,d);else if(f)if(V)R=Ee(n,S,t,i,s,o,a,c,r+1,l,d);else{const g=Lt.getPrimitive();g.copy(Ko).applyMatrix4(t);const z=Ye(n),Y=Me(n,m);E(z,p,ri),E(Y,p,li);const k=g.intersectsBox(ri),N=g.intersectsBox(li);R=k&&Ee(S,z,i,t,s,a,o,r,c+1,g,!d)||N&&Ee(S,Y,i,t,s,a,o,r,c+1,g,!d),Lt.releasePrimitive(g)}else if(C)if(V)R=Ee(n,W,t,i,s,o,a,c,r+1,l,d);else{const g=Lt.getPrimitive();g.copy(Mo).applyMatrix4(t);const z=Ye(n),Y=Me(n,m);E(z,p,ri),E(Y,p,li);const k=g.intersectsBox(ri),N=g.intersectsBox(li);R=k&&Ee(W,z,i,t,s,a,o,r,c+1,g,!d)||N&&Ee(W,Y,i,t,s,a,o,r,c+1,g,!d),Lt.releasePrimitive(g)}}return R}const ps=new Xe,Ar=new fe,au={strategy:lo,maxDepth:40,maxLeafTris:10,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,verbose:!0,range:null};class xt{static serialize(e,t={}){t={cloneBuffers:!0,...t};const i=e.geometry,s=e._roots,o=e._indirectBuffer,a=i.getIndex();let c;return t.cloneBuffers?c={roots:s.map(r=>r.slice()),index:a?a.array.slice():null,indirectBuffer:o?o.slice():null}:c={roots:s,index:a?a.array:null,indirectBuffer:o},c}static deserialize(e,t,i={}){i={setIndex:!0,indirect:!!e.indirectBuffer,...i};const{index:s,roots:o,indirectBuffer:a}=e,c=new xt(t,{...i,[uo]:!0});if(c._roots=o,c._indirectBuffer=a||null,i.setIndex){const r=t.getIndex();if(r===null){const l=new be(e.index,1,!1);t.setIndex(l)}else r.array!==s&&(r.array.set(s),r.needsUpdate=!0)}return c}get indirect(){return!!this._indirectBuffer}constructor(e,t={}){if(e.isBufferGeometry){if(e.index&&e.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(t=Object.assign({...au,[uo]:!1},t),t.useSharedArrayBuffer&&!_r())throw new Error("MeshBVH: SharedArrayBuffer is not available.");this.geometry=e,this._roots=null,this._indirectBuffer=null,t[uo]||(Rh(this,t),!e.boundingBox&&t.setBoundingBox&&(e.boundingBox=this.getBoundingBox(new fe))),this.resolveTriangleIndex=t.indirect?i=>this._indirectBuffer[i]:i=>i}refit(e=null){return(this.indirect?Dh:kh)(this,e)}traverse(e,t=0){const i=this._roots[t],s=new Uint32Array(i),o=new Uint16Array(i);a(0);function a(c,r=0){const l=c*2,d=o[l+15]===An;if(d){const h=s[c+6],u=o[l+14];e(r,d,new Float32Array(i,c*4,6),h,u)}else{const h=c+Zt/4,u=s[c+6],p=s[c+7];e(r,d,new Float32Array(i,c*4,6),p)||(a(h,r+1),a(u,r+1))}}}raycast(e,t=Qo,i=0,s=1/0){const o=this._roots,a=this.geometry,c=[],r=t.isMaterial,l=Array.isArray(t),d=a.groups,h=r?t.side:t,u=this.indirect?_h:Uh;for(let p=0,m=o.length;p<m;p++){const b=l?t[d[p].materialIndex].side:h,G=c.length;if(u(this,p,b,e,c,i,s),l){const y=d[p].materialIndex;for(let Z=G,X=c.length;Z<X;Z++)c[Z].face.materialIndex=y}}return c}raycastFirst(e,t=Qo,i=0,s=1/0){const o=this._roots,a=this.geometry,c=t.isMaterial,r=Array.isArray(t);let l=null;const d=a.groups,h=c?t.side:t,u=this.indirect?qh:wh;for(let p=0,m=o.length;p<m;p++){const b=r?t[d[p].materialIndex].side:h,G=u(this,p,b,e,i,s);G!=null&&(l==null||G.distance<l.distance)&&(l=G,r&&(G.face.materialIndex=d[p].materialIndex))}return l}intersectsGeometry(e,t){let i=!1;const s=this._roots,o=this.indirect?$h:Fh;for(let a=0,c=s.length;a<c&&(i=o(this,a,e,t),!i);a++);return i}shapecast(e){const t=ke.getPrimitive(),i=this.indirect?Jh:Hh;let{boundsTraverseOrder:s,intersectsBounds:o,intersectsRange:a,intersectsTriangle:c}=e;if(a&&c){const h=a;a=(u,p,m,b,G)=>h(u,p,m,b,G)?!0:i(u,p,this,c,m,b,t)}else a||(c?a=(h,u,p,m)=>i(h,u,this,c,p,m,t):a=(h,u,p)=>p);let r=!1,l=0;const d=this._roots;for(let h=0,u=d.length;h<u;h++){const p=d[h];if(r=gh(this,h,o,a,s,l),r)break;l+=p.byteLength}return ke.releasePrimitive(t),r}bvhcast(e,t,i){let{intersectsRanges:s,intersectsTriangles:o}=i;const a=ke.getPrimitive(),c=this.geometry.index,r=this.geometry.attributes.position,l=this.indirect?m=>{const b=this.resolveTriangleIndex(m);$(a,b*3,c,r)}:m=>{$(a,m*3,c,r)},d=ke.getPrimitive(),h=e.geometry.index,u=e.geometry.attributes.position,p=e.indirect?m=>{const b=e.resolveTriangleIndex(m);$(d,b*3,h,u)}:m=>{$(d,m*3,h,u)};if(o){const m=(b,G,y,Z,X,L,V,x)=>{for(let R=y,S=y+Z;R<S;R++){p(R),d.a.applyMatrix4(t),d.b.applyMatrix4(t),d.c.applyMatrix4(t),d.needsUpdate=!0;for(let W=b,f=b+G;W<f;W++)if(l(W),a.needsUpdate=!0,o(a,d,W,R,X,L,V,x))return!0}return!1};if(s){const b=s;s=function(G,y,Z,X,L,V,x,R){return b(G,y,Z,X,L,V,x,R)?!0:m(G,y,Z,X,L,V,x,R)}}else s=m}return ou(this,e,t,s)}intersectsBox(e,t){return ps.set(e.min,e.max,t),ps.needsUpdate=!0,this.shapecast({intersectsBounds:i=>ps.intersectsBox(i),intersectsTriangle:i=>ps.intersectsTriangle(i)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t,i={},s={},o=0,a=1/0){return(this.indirect?su:Oh)(this,e,t,i,s,o,a)}closestPointToPoint(e,t={},i=0,s=1/0){return Ch(this,e,t,i,s)}getBoundingBox(e){return e.makeEmpty(),this._roots.forEach(t=>{E(0,new Float32Array(t),Ar),e.union(Ar)}),e}}const qr=new fe,$r=new Te;class ru extends fs{get isMesh(){return!this.displayEdges}get isLineSegments(){return this.displayEdges}get isLine(){return this.displayEdges}getVertexPosition(...e){return Sn.prototype.getVertexPosition.call(this,...e)}constructor(e,t,i=10,s=0){super(),this.material=t,this.geometry=new Ot,this.name="MeshBVHRootHelper",this.depth=i,this.displayParents=!1,this.bvh=e,this.displayEdges=!0,this._group=s}raycast(){}update(){const e=this.geometry,t=this.bvh,i=this._group;if(e.dispose(),this.visible=!1,t){const s=this.depth-1,o=this.displayParents;let a=0;t.traverse((u,p)=>{if(u>=s||p)return a++,!0;o&&a++},i);let c=0;const r=new Float32Array(8*3*a);t.traverse((u,p,m)=>{const b=u>=s||p;if(b||o){E(0,m,qr);const{min:G,max:y}=qr;for(let Z=-1;Z<=1;Z+=2){const X=Z<0?G.x:y.x;for(let L=-1;L<=1;L+=2){const V=L<0?G.y:y.y;for(let x=-1;x<=1;x+=2){const R=x<0?G.z:y.z;r[c+0]=X,r[c+1]=V,r[c+2]=R,c+=3}}}return b}},i);let l,d;this.displayEdges?d=new Uint8Array([0,4,1,5,2,6,3,7,0,2,1,3,4,6,5,7,0,1,2,3,4,5,6,7]):d=new Uint8Array([0,1,2,2,1,3,4,6,5,6,7,5,1,4,5,0,4,1,2,3,6,3,7,6,0,2,4,2,6,4,1,5,3,3,5,7]),r.length>65535?l=new Uint32Array(d.length*a):l=new Uint16Array(d.length*a);const h=d.length;for(let u=0;u<a;u++){const p=u*8,m=u*h;for(let b=0;b<h;b++)l[m+b]=p+d[b]}e.setIndex(new be(l,1,!1)),e.setAttribute("position",new be(r,3,!1)),this.visible=!0}}}class Io extends Wl{get color(){return this.edgeMaterial.color}get opacity(){return this.edgeMaterial.opacity}set opacity(e){this.edgeMaterial.opacity=e,this.meshMaterial.opacity=e}constructor(e=null,t=null,i=10){e instanceof xt&&(i=t||10,t=e,e=null),typeof t=="number"&&(i=t,t=null),super(),this.name="MeshBVHHelper",this.depth=i,this.mesh=e,this.bvh=t,this.displayParents=!1,this.displayEdges=!0,this.objectIndex=0,this._roots=[];const s=new gl({color:65416,transparent:!0,opacity:.3,depthWrite:!1}),o=new xs({color:65416,transparent:!0,opacity:.3,depthWrite:!1});o.color=s.color,this.edgeMaterial=s,this.meshMaterial=o,this.update()}update(){const e=this.mesh;let t=this.bvh||e.geometry.boundsTree||null;if(e.isBatchedMesh&&e.boundsTrees&&!t){const s=e._drawInfo[this.objectIndex];s&&(t=e.boundsTrees[s.geometryIndex]||t)}const i=t?t._roots.length:0;for(;this._roots.length>i;){const s=this._roots.pop();s.geometry.dispose(),this.remove(s)}for(let s=0;s<i;s++){const{depth:o,edgeMaterial:a,meshMaterial:c,displayParents:r,displayEdges:l}=this;if(s>=this._roots.length){const h=new ru(t,a,o,s);this.add(h),this._roots.push(h)}const d=this._roots[s];d.bvh=t,d.depth=o,d.displayParents=r,d.displayEdges=l,d.material=l?a:c,d.update()}}updateMatrixWorld(...e){const t=this.mesh,i=this.parent;t!==null&&(t.updateWorldMatrix(!0,!1),i?this.matrix.copy(i.matrixWorld).invert().multiply(t.matrixWorld):this.matrix.copy(t.matrixWorld),(t.isInstancedMesh||t.isBatchedMesh)&&(t.getMatrixAt(this.objectIndex,$r),this.matrix.multiply($r)),this.matrix.decompose(this.position,this.quaternion,this.scale)),super.updateMatrixWorld(...e)}copy(e){this.depth=e.depth,this.mesh=e.mesh,this.bvh=e.bvh,this.opacity=e.opacity,this.color.copy(e.color)}clone(){return new Io(this.mesh,this.bvh,this.depth)}dispose(){this.edgeMaterial.dispose(),this.meshMaterial.dispose();const e=this.children;for(let t=0,i=e.length;t<i;t++)e[t].geometry.dispose()}}const wi=new fe,el=new fe,ci=new K;function tl(n){switch(typeof n){case"number":return 8;case"string":return n.length*2;case"boolean":return 4;default:return 0}}function lu(n){return/(Uint|Int|Float)(8|16|32)Array/.test(n.constructor.name)}function cu(n,e){const t={nodeCount:0,leafNodeCount:0,depth:{min:1/0,max:-1/0},tris:{min:1/0,max:-1/0},splits:[0,0,0],surfaceAreaScore:0};return n.traverse((i,s,o,a,c)=>{const r=o[3]-o[0],l=o[1+3]-o[1],d=o[2+3]-o[2],h=2*(r*l+l*d+d*r);t.nodeCount++,s?(t.leafNodeCount++,t.depth.min=Math.min(i,t.depth.min),t.depth.max=Math.max(i,t.depth.max),t.tris.min=Math.min(c,t.tris.min),t.tris.max=Math.max(c,t.tris.max),t.surfaceAreaScore+=h*_n*c):(t.splits[a]++,t.surfaceAreaScore+=h*ho)},e),t.tris.min===1/0&&(t.tris.min=0,t.tris.max=0),t.depth.min===1/0&&(t.depth.min=0,t.depth.max=0),t}function du(n){return n._roots.map((e,t)=>cu(n,t))}function hu(n){const e=new Set,t=[n];let i=0;for(;t.length;){const s=t.pop();if(!e.has(s)){e.add(s);for(let o in s){if(!Object.hasOwn(s,o))continue;i+=tl(o);const a=s[o];a&&(typeof a=="object"||typeof a=="function")?lu(a)||_r()&&a instanceof SharedArrayBuffer||a instanceof ArrayBuffer?i+=a.byteLength:t.push(a):i+=tl(a)}}}return i}function uu(n){const e=n.geometry,t=[],i=e.index,s=e.getAttribute("position");let o=!0;return n.traverse((a,c,r,l,d)=>{const h={depth:a,isLeaf:c,boundingData:r,offset:l,count:d};t[a]=h,E(0,r,wi);const u=t[a-1];if(c)for(let p=l,m=l+d;p<m;p++){const b=n.resolveTriangleIndex(p);let G=3*b,y=3*b+1,Z=3*b+2;i&&(G=i.getX(G),y=i.getX(y),Z=i.getX(Z));let X;ci.fromBufferAttribute(s,G),X=wi.containsPoint(ci),ci.fromBufferAttribute(s,y),X=X&&wi.containsPoint(ci),ci.fromBufferAttribute(s,Z),X=X&&wi.containsPoint(ci),console.assert(X,"Leaf bounds does not fully contain triangle."),o=o&&X}if(u){E(0,r,el);const p=el.containsBox(wi);console.assert(p,"Parent bounds does not fully contain child."),o=o&&p}}),o}function pu(n){const e=[];return n.traverse((t,i,s,o,a)=>{const c={bounds:E(0,s,new fe)};i?(c.count=a,c.offset=o):(c.left=null,c.right=null),e[t]=c;const r=e[t-1];r&&(r.left===null?r.left=c:r.right=c)}),e[0]}function il(n,e,t){return n===null?null:(n.point.applyMatrix4(e.matrixWorld),n.distance=n.point.distanceTo(t.ray.origin),n.object=e,n)}const mu=parseInt(Fo)>=166,ms=new zl,nl=new K,sl=new Te,bu=Sn.prototype.raycast,yu=Cl.prototype.raycast,ol=new K,pe=new Sn,bs=[];function Gu(n,e){this.isBatchedMesh?Zu.call(this,n,e):Xu.call(this,n,e)}function Zu(n,e){if(this.boundsTrees){const t=this.boundsTrees,i=this._drawInfo||this._instanceInfo,s=this._drawRanges||this._geometryInfo,o=this.matrixWorld;pe.material=this.material,pe.geometry=this.geometry;const a=pe.geometry.boundsTree,c=pe.geometry.drawRange;pe.geometry.boundingSphere===null&&(pe.geometry.boundingSphere=new wo);for(let r=0,l=i.length;r<l;r++){if(!this.getVisibleAt(r))continue;const d=i[r].geometryIndex;if(pe.geometry.boundsTree=t[d],this.getMatrixAt(r,pe.matrixWorld).premultiply(o),!pe.geometry.boundsTree){this.getBoundingBoxAt(d,pe.geometry.boundingBox),this.getBoundingSphereAt(d,pe.geometry.boundingSphere);const h=s[d];pe.geometry.setDrawRange(h.start,h.count)}pe.raycast(n,bs);for(let h=0,u=bs.length;h<u;h++){const p=bs[h];p.object=this,p.batchId=r,e.push(p)}bs.length=0}pe.geometry.boundsTree=a,pe.geometry.drawRange=c,pe.material=null,pe.geometry=null}else yu.call(this,n,e)}function Xu(n,e){if(this.geometry.boundsTree){if(this.material===void 0)return;sl.copy(this.matrixWorld).invert(),ms.copy(n.ray).applyMatrix4(sl),ol.setFromMatrixScale(this.matrixWorld),nl.copy(ms.direction).multiply(ol);const t=nl.length(),i=n.near/t,s=n.far/t,o=this.geometry.boundsTree;if(n.firstHitOnly===!0){const a=il(o.raycastFirst(ms,this.material,i,s),this,n);a&&e.push(a)}else{const a=o.raycast(ms,this.material,i,s);for(let c=0,r=a.length;c<r;c++){const l=il(a[c],this,n);l&&e.push(l)}}}else bu.call(this,n,e)}function Vu(n={}){return this.boundsTree=new xt(this,n),this.boundsTree}function Ru(){this.boundsTree=null}function Lu(n=-1,e={}){if(!mu)throw new Error("BatchedMesh: Three r166+ is required to compute bounds trees.");e.indirect&&console.warn('"Indirect" is set to false because it is not supported for BatchedMesh.'),e={...e,indirect:!1,range:null};const t=this._drawRanges||this._geometryInfo,i=this._geometryCount;this.boundsTrees||(this.boundsTrees=new Array(i).fill(null));const s=this.boundsTrees;for(;s.length<i;)s.push(null);if(n<0){for(let o=0;o<i;o++)e.range=t[o],s[o]=new xt(this.geometry,e);return s}else return n<t.length&&(e.range=t[n],s[n]=new xt(this.geometry,e)),s[n]||null}function xu(n=-1){n<0?this.boundsTrees.fill(null):n<this.boundsTree.length&&(this.boundsTrees[n]=null)}function Su(n){switch(n){case 1:return"R";case 2:return"RG";case 3:return"RGBA";case 4:return"RGBA"}throw new Error}function fu(n){switch(n){case 1:return Tl;case 2:return Ml;case 3:return Wn;case 4:return Wn}}function al(n){switch(n){case 1:return Yl;case 2:return jo;case 3:return Cs;case 4:return Cs}}class ys extends gs{constructor(){super(),this.minFilter=Dt,this.magFilter=Dt,this.generateMipmaps=!1,this.overrideItemSize=null,this._forcedType=null}updateFrom(e){const t=this.overrideItemSize,i=e.itemSize,s=e.count;if(t!==null){if(i*s%t!==0)throw new Error("VertexAttributeTexture: overrideItemSize must divide evenly into buffer length.");e.itemSize=t,e.count=s*i/t}const o=e.itemSize,a=e.count,c=e.normalized,r=e.array.constructor,l=r.BYTES_PER_ELEMENT;let d=this._forcedType,h=o;if(d===null)switch(r){case Float32Array:d=Gi;break;case Uint8Array:case Uint16Array:case Uint32Array:d=yi;break;case Int8Array:case Int16Array:case Int32Array:d=fn;break}let u,p,m,b,G=Su(o);switch(d){case Gi:m=1,p=fu(o),c&&l===1?(b=r,G+="8",r===Uint8Array?u=Bo:(u=Eo,G+="_SNORM")):(b=Float32Array,G+="32F",u=Gi);break;case fn:G+=l*8+"I",m=c?Math.pow(2,r.BYTES_PER_ELEMENT*8-1):1,p=al(o),l===1?(b=Int8Array,u=Eo):l===2?(b=Int16Array,u=Kl):(b=Int32Array,u=fn);break;case yi:G+=l*8+"UI",m=c?Math.pow(2,r.BYTES_PER_ELEMENT*8-1):1,p=al(o),l===1?(b=Uint8Array,u=Bo):l===2?(b=Uint16Array,u=vl):(b=Uint32Array,u=yi);break}h===3&&(p===Wn||p===Cs)&&(h=4);const y=Math.ceil(Math.sqrt(a))||1,Z=h*y*y,X=new b(Z),L=e.normalized;e.normalized=!1;for(let V=0;V<a;V++){const x=h*V;X[x]=e.getX(V)/m,o>=2&&(X[x+1]=e.getY(V)/m),o>=3&&(X[x+2]=e.getZ(V)/m,h===4&&(X[x+3]=1)),o>=4&&(X[x+3]=e.getW(V)/m)}e.normalized=L,this.internalFormat=G,this.format=p,this.type=u,this.image.width=y,this.image.height=y,this.image.data=X,this.needsUpdate=!0,this.dispose(),e.itemSize=i,e.count=s}}class rl extends ys{constructor(){super(),this._forcedType=yi}}class Wu extends ys{constructor(){super(),this._forcedType=fn}}class ll extends ys{constructor(){super(),this._forcedType=Gi}}class gu{constructor(){this.index=new rl,this.position=new ll,this.bvhBounds=new gs,this.bvhContents=new gs,this._cachedIndexAttr=null,this.index.overrideItemSize=3}updateFrom(e){const{geometry:t}=e;if(zu(e,this.bvhBounds,this.bvhContents),this.position.updateFrom(t.attributes.position),e.indirect){const i=e._indirectBuffer;if(this._cachedIndexAttr===null||this._cachedIndexAttr.count!==i.length)if(t.index)this._cachedIndexAttr=t.index.clone();else{const s=Yr(Tr(t));this._cachedIndexAttr=new be(s,1,!1)}Cu(t,i,this._cachedIndexAttr),this.index.updateFrom(this._cachedIndexAttr)}else this.index.updateFrom(t.index)}dispose(){const{index:e,position:t,bvhBounds:i,bvhContents:s}=this;e&&e.dispose(),t&&t.dispose(),i&&i.dispose(),s&&s.dispose()}}function Cu(n,e,t){const i=t.array,s=n.index?n.index.array:null;for(let o=0,a=e.length;o<a;o++){const c=3*o,r=3*e[o];for(let l=0;l<3;l++)i[c+l]=s?s[r+l]:r+l}}function zu(n,e,t){const i=n._roots;if(i.length!==1)throw new Error("MeshBVHUniformStruct: Multi-root BVHs not supported.");const s=i[0],o=new Uint16Array(s),a=new Uint32Array(s),c=new Float32Array(s),r=s.byteLength/Zt,l=2*Math.ceil(Math.sqrt(r/2)),d=new Float32Array(4*l*l),h=Math.ceil(Math.sqrt(r)),u=new Uint32Array(2*h*h);for(let p=0;p<r;p++){const m=p*Zt/4,b=m*2,G=m;for(let y=0;y<3;y++)d[8*p+0+y]=c[G+0+y],d[8*p+4+y]=c[G+3+y];if(xe(b,o)){const y=Ke(b,o),Z=ge(m,a),X=4294901760|y;u[p*2+0]=X,u[p*2+1]=Z}else{const y=4*Me(m,a)/Zt,Z=bo(m,a);u[p*2+0]=Z,u[p*2+1]=y}}e.image.data=d,e.image.width=l,e.image.height=l,e.format=Wn,e.type=Gi,e.internalFormat="RGBA32F",e.minFilter=Dt,e.magFilter=Dt,e.generateMipmaps=!1,e.needsUpdate=!0,e.dispose(),t.image.data=u,t.image.width=h,t.image.height=h,t.format=jo,t.type=yi,t.internalFormat="RG32UI",t.minFilter=Dt,t.magFilter=Dt,t.generateMipmaps=!1,t.needsUpdate=!0,t.dispose()}const Ut=new K,Pt=new K,wt=new K,cl=new zs,Gs=new K,Yo=new K,dl=new zs,hl=new zs,Zs=new Te,ul=new Te;function Fi(n,e){if(!n&&!e)return;const t=n.count===e.count,i=n.normalized===e.normalized,s=n.array.constructor===e.array.constructor,o=n.itemSize===e.itemSize;if(!t||!i||!s||!o)throw new Error}function Qi(n,e=null){const t=n.array.constructor,i=n.normalized,s=n.itemSize,o=e===null?n.count:e;return new be(new t(s*o),s,i)}function pl(n,e,t=0){if(n.isInterleavedBufferAttribute){const i=n.itemSize;for(let s=0,o=n.count;s<o;s++){const a=s+t;e.setX(a,n.getX(s)),i>=2&&e.setY(a,n.getY(s)),i>=3&&e.setZ(a,n.getZ(s)),i>=4&&e.setW(a,n.getW(s))}}else{const i=e.array,s=i.constructor,o=i.BYTES_PER_ELEMENT*n.itemSize*t;new s(i.buffer,o,n.array.length).set(n.array)}}function vu(n,e,t){const i=n.elements,s=e.elements;for(let o=0,a=s.length;o<a;o++)i[o]+=s[o]*t}function ml(n,e,t){const i=n.skeleton,s=n.geometry,o=i.bones,a=i.boneInverses;dl.fromBufferAttribute(s.attributes.skinIndex,e),hl.fromBufferAttribute(s.attributes.skinWeight,e),Zs.elements.fill(0);for(let c=0;c<4;c++){const r=hl.getComponent(c);if(r!==0){const l=dl.getComponent(c);ul.multiplyMatrices(o[l].matrixWorld,a[l]),vu(Zs,ul,r)}}return Zs.multiply(n.bindMatrix).premultiply(n.bindMatrixInverse),t.transformDirection(Zs),t}function Ho(n,e,t,i,s){Gs.set(0,0,0);for(let o=0,a=n.length;o<a;o++){const c=e[o],r=n[o];c!==0&&(Yo.fromBufferAttribute(r,i),t?Gs.addScaledVector(Yo,c):Gs.addScaledVector(Yo.sub(s),c))}s.add(Gs)}function Ku(n,e={useGroups:!1,updateIndex:!1,skipAttributes:[]},t=new Ot){const i=n[0].index!==null,{useGroups:s=!1,updateIndex:o=!1,skipAttributes:a=[]}=e,c=new Set(Object.keys(n[0].attributes)),r={};let l=0;t.clearGroups();for(let d=0;d<n.length;++d){const h=n[d];let u=0;if(i!==(h.index!==null))throw new Error("StaticGeometryGenerator: All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.");for(const p in h.attributes){if(!c.has(p))throw new Error('StaticGeometryGenerator: All geometries must have compatible attributes; make sure "'+p+'" attribute exists among all geometries, or in none of them.');r[p]===void 0&&(r[p]=[]),r[p].push(h.attributes[p]),u++}if(u!==c.size)throw new Error("StaticGeometryGenerator: Make sure all geometries have the same number of attributes.");if(s){let p;if(i)p=h.index.count;else if(h.attributes.position!==void 0)p=h.attributes.position.count;else throw new Error("StaticGeometryGenerator: The geometry must have either an index or a position attribute");t.addGroup(l,p,d),l+=p}}if(i){let d=!1;if(!t.index){let h=0;for(let u=0;u<n.length;++u)h+=n[u].index.count;t.setIndex(new be(new Uint32Array(h),1,!1)),d=!0}if(o||d){const h=t.index;let u=0,p=0;for(let m=0;m<n.length;++m){const b=n[m],G=b.index;if(a[m]!==!0)for(let y=0;y<G.count;++y)h.setX(u,G.getX(y)+p),u++;p+=b.attributes.position.count}}}for(const d in r){const h=r[d];if(!(d in t.attributes)){let m=0;for(const b in h)m+=h[b].count;t.setAttribute(d,Qi(r[d][0],m))}const u=t.attributes[d];let p=0;for(let m=0,b=h.length;m<b;m++){const G=h[m];a[m]!==!0&&pl(G,u,p),p+=G.count}}return t}function Mu(n,e){if(n===null||e===null)return n===e;if(n.length!==e.length)return!1;for(let t=0,i=n.length;t<i;t++)if(n[t]!==e[t])return!1;return!0}function Tu(n){const{index:e,attributes:t}=n;if(e)for(let i=0,s=e.count;i<s;i+=3){const o=e.getX(i),a=e.getX(i+2);e.setX(i,a),e.setX(i+2,o)}else for(const i in t){const s=t[i],o=s.itemSize;for(let a=0,c=s.count;a<c;a+=3)for(let r=0;r<o;r++){const l=s.getComponent(a,r),d=s.getComponent(a+2,r);s.setComponent(a,r,d),s.setComponent(a+2,r,l)}}return n}class Yu{constructor(e){this.matrixWorld=new Te,this.geometryHash=null,this.boneMatrices=null,this.primitiveCount=-1,this.mesh=e,this.update()}update(){const e=this.mesh,t=e.geometry,i=e.skeleton,s=(t.index?t.index.count:t.attributes.position.count)/3;if(this.matrixWorld.copy(e.matrixWorld),this.geometryHash=t.attributes.position.version,this.primitiveCount=s,i){i.boneTexture||i.computeBoneTexture(),i.update();const o=i.boneMatrices;!this.boneMatrices||this.boneMatrices.length!==o.length?this.boneMatrices=o.slice():this.boneMatrices.set(o)}else this.boneMatrices=null}didChange(){const e=this.mesh,t=e.geometry,i=(t.index?t.index.count:t.attributes.position.count)/3;return!(this.matrixWorld.equals(e.matrixWorld)&&this.geometryHash===t.attributes.position.version&&Mu(e.skeleton&&e.skeleton.boneMatrices||null,this.boneMatrices)&&this.primitiveCount===i)}}class Hu{constructor(e){Array.isArray(e)||(e=[e]);const t=[];e.forEach(i=>{i.traverseVisible(s=>{s.isMesh&&t.push(s)})}),this.meshes=t,this.useGroups=!0,this.applyWorldTransforms=!0,this.attributes=["position","normal","color","tangent","uv","uv2"],this._intermediateGeometry=new Array(t.length).fill().map(()=>new Ot),this._diffMap=new WeakMap}getMaterials(){const e=[];return this.meshes.forEach(t=>{Array.isArray(t.material)?e.push(...t.material):e.push(t.material)}),e}generate(e=new Ot){let t=[];const{meshes:i,useGroups:s,_intermediateGeometry:o,_diffMap:a}=this;for(let c=0,r=i.length;c<r;c++){const l=i[c],d=o[c],h=a.get(l);!h||h.didChange(l)?(this._convertToStaticGeometry(l,d),t.push(!1),h?h.update():a.set(l,new Yu(l))):t.push(!0)}if(o.length===0){e.setIndex(null);const c=e.attributes;for(const r in c)e.deleteAttribute(r);for(const r in this.attributes)e.setAttribute(this.attributes[r],new be(new Float32Array(0),4,!1))}else Ku(o,{useGroups:s,skipAttributes:t},e);for(const c in e.attributes)e.attributes[c].needsUpdate=!0;return e}_convertToStaticGeometry(e,t=new Ot){const i=e.geometry,s=this.applyWorldTransforms,o=this.attributes.includes("normal"),a=this.attributes.includes("tangent"),c=i.attributes,r=t.attributes;!t.index&&i.index&&(t.index=i.index.clone()),r.position||t.setAttribute("position",Qi(c.position)),o&&!r.normal&&c.normal&&t.setAttribute("normal",Qi(c.normal)),a&&!r.tangent&&c.tangent&&t.setAttribute("tangent",Qi(c.tangent)),Fi(i.index,t.index),Fi(c.position,r.position),o&&Fi(c.normal,r.normal),a&&Fi(c.tangent,r.tangent);const l=c.position,d=o?c.normal:null,h=a?c.tangent:null,u=i.morphAttributes.position,p=i.morphAttributes.normal,m=i.morphAttributes.tangent,b=i.morphTargetsRelative,G=e.morphTargetInfluences,y=new Hl;y.getNormalMatrix(e.matrixWorld),i.index&&t.index.array.set(i.index.array);for(let Z=0,X=c.position.count;Z<X;Z++)Ut.fromBufferAttribute(l,Z),d&&Pt.fromBufferAttribute(d,Z),h&&(cl.fromBufferAttribute(h,Z),wt.fromBufferAttribute(h,Z)),G&&(u&&Ho(u,G,b,Z,Ut),p&&Ho(p,G,b,Z,Pt),m&&Ho(m,G,b,Z,wt)),e.isSkinnedMesh&&(e.applyBoneTransform(Z,Ut),d&&ml(e,Z,Pt),h&&ml(e,Z,wt)),s&&Ut.applyMatrix4(e.matrixWorld),r.position.setXYZ(Z,Ut.x,Ut.y,Ut.z),d&&(s&&Pt.applyNormalMatrix(y),r.normal.setXYZ(Z,Pt.x,Pt.y,Pt.z)),h&&(s&&wt.transformDirection(e.matrixWorld),r.tangent.setXYZW(Z,wt.x,wt.y,wt.z,cl.w));for(const Z in this.attributes){const X=this.attributes[Z];X==="position"||X==="tangent"||X==="normal"||!(X in c)||(r[X]||t.setAttribute(X,Qi(c[X])),Fi(c[X],r[X]),pl(c[X],r[X]))}return e.matrixWorld.determinant()<0&&Tu(t),t}}const bl=`
1121
+ }`;class Hh extends Pa{constructor(e){super(e),this.vector_=new B,this.vector2_=new B,this.vector3_=new B,this.quaternion_=new J,this.maxParticles=1e4,this.setupBuffers(),this.rebuildMaterial()}setupBuffers(){this.geometry&&this.geometry.dispose(),this.geometry=new Xt,this.indexBuffer=new me(new Uint32Array(this.maxParticles*6),1),this.indexBuffer.setUsage(xe),this.geometry.setIndex(this.indexBuffer),this.positionBuffer=new me(new Float32Array(this.maxParticles*6),3),this.positionBuffer.setUsage(xe),this.geometry.setAttribute("position",this.positionBuffer),this.previousBuffer=new me(new Float32Array(this.maxParticles*6),3),this.previousBuffer.setUsage(xe),this.geometry.setAttribute("previous",this.previousBuffer),this.nextBuffer=new me(new Float32Array(this.maxParticles*6),3),this.nextBuffer.setUsage(xe),this.geometry.setAttribute("next",this.nextBuffer),this.widthBuffer=new me(new Float32Array(this.maxParticles*2),1),this.widthBuffer.setUsage(xe),this.geometry.setAttribute("width",this.widthBuffer),this.sideBuffer=new me(new Float32Array(this.maxParticles*2),1),this.sideBuffer.setUsage(xe),this.geometry.setAttribute("side",this.sideBuffer),this.uvBuffer=new me(new Float32Array(this.maxParticles*4),2),this.uvBuffer.setUsage(xe),this.geometry.setAttribute("uv",this.uvBuffer),this.colorBuffer=new me(new Float32Array(this.maxParticles*8),4),this.colorBuffer.setUsage(xe),this.geometry.setAttribute("color",this.colorBuffer)}expandBuffers(e){for(;e>=this.maxParticles;)this.maxParticles*=2;this.setupBuffers()}rebuildMaterial(){this.layers.mask=this.settings.layers.mask;const e={lineWidth:{value:1},map:{value:null},useMap:{value:0},alphaMap:{value:null},useAlphaMap:{value:0},resolution:{value:new hi(1,1)},sizeAttenuation:{value:1},visibility:{value:1},alphaTest:{value:0}},t={};if(t.USE_UV="",t.USE_COLOR_ALPHA="",this.settings.material.map&&(t.USE_MAP="",t.MAP_UV=as(this.settings.material.map.channel),e.map=new Je(this.settings.material.map),e.mapTransform=new Je(new tt().copy(this.settings.material.map.matrix))),this.settings.material.defines&&this.settings.material.defines.USE_COLOR_AS_ALPHA!==void 0&&(t.USE_COLOR_AS_ALPHA=""),this.settings.renderMode===k.Trail)this.material=new Cr({uniforms:e,defines:t,vertexShader:qh,fragmentShader:Gh,transparent:this.settings.material.transparent,depthWrite:!this.settings.material.transparent,side:this.settings.material.side,blending:this.settings.material.blending||Fs,blendDst:this.settings.material.blendDst,blendSrc:this.settings.material.blendSrc,blendEquation:this.settings.material.blendEquation,premultipliedAlpha:this.settings.material.premultipliedAlpha});else throw new Error("render mode unavailable")}update(){let e=0,t=0,i=0;this.systems.forEach(r=>{for(let s=0;s<r.particleNum;s++)i+=r.particles[s].previous.length*2}),i>this.maxParticles&&this.expandBuffers(i),this.systems.forEach(r=>{r.emitter.updateMatrixWorld&&(r.emitter.updateWorldMatrix(!0,!1),r.emitter.updateMatrixWorld(!0));const s=this.quaternion_,o=this.vector2_,l=this.vector3_;r.emitter.matrixWorld.decompose(o,s,l);const a=r.particles,c=r.particleNum,h=this.settings.uTileCount,u=this.settings.vTileCount,d=1/h,p=1/u;for(let f=0;f<c;f++){const m=a[f],g=m.uvTile%u,y=Math.floor(m.uvTile/u+.001),v=m.previous.values();let b=v.next(),S=b.value,x=S;b.done||(b=v.next());let w;b.value!==void 0?w=b.value:w=x;for(let _=0;_<m.previous.length;_++,e+=2){if(this.positionBuffer.setXYZ(e,x.position.x,x.position.y,x.position.z),this.positionBuffer.setXYZ(e+1,x.position.x,x.position.y,x.position.z),r.worldSpace?(this.positionBuffer.setXYZ(e,x.position.x,x.position.y,x.position.z),this.positionBuffer.setXYZ(e+1,x.position.x,x.position.y,x.position.z)):(m.parentMatrix?this.vector_.copy(x.position).applyMatrix4(m.parentMatrix):this.vector_.copy(x.position).applyMatrix4(r.emitter.matrixWorld),this.positionBuffer.setXYZ(e,this.vector_.x,this.vector_.y,this.vector_.z),this.positionBuffer.setXYZ(e+1,this.vector_.x,this.vector_.y,this.vector_.z)),r.worldSpace?(this.previousBuffer.setXYZ(e,S.position.x,S.position.y,S.position.z),this.previousBuffer.setXYZ(e+1,S.position.x,S.position.y,S.position.z)):(m.parentMatrix?this.vector_.copy(S.position).applyMatrix4(m.parentMatrix):this.vector_.copy(S.position).applyMatrix4(r.emitter.matrixWorld),this.previousBuffer.setXYZ(e,this.vector_.x,this.vector_.y,this.vector_.z),this.previousBuffer.setXYZ(e+1,this.vector_.x,this.vector_.y,this.vector_.z)),r.worldSpace?(this.nextBuffer.setXYZ(e,w.position.x,w.position.y,w.position.z),this.nextBuffer.setXYZ(e+1,w.position.x,w.position.y,w.position.z)):(m.parentMatrix?this.vector_.copy(w.position).applyMatrix4(m.parentMatrix):this.vector_.copy(w.position).applyMatrix4(r.emitter.matrixWorld),this.nextBuffer.setXYZ(e,this.vector_.x,this.vector_.y,this.vector_.z),this.nextBuffer.setXYZ(e+1,this.vector_.x,this.vector_.y,this.vector_.z)),this.sideBuffer.setX(e,-1),this.sideBuffer.setX(e+1,1),r.worldSpace)this.widthBuffer.setX(e,x.size),this.widthBuffer.setX(e+1,x.size);else if(m.parentMatrix)this.widthBuffer.setX(e,x.size),this.widthBuffer.setX(e+1,x.size);else{const M=(Math.abs(l.x)+Math.abs(l.y)+Math.abs(l.z))/3;this.widthBuffer.setX(e,x.size*M),this.widthBuffer.setX(e+1,x.size*M)}this.uvBuffer.setXY(e,(_/m.previous.length+g)*d,(u-y-1)*p),this.uvBuffer.setXY(e+1,(_/m.previous.length+g)*d,(u-y)*p),this.colorBuffer.setXYZW(e,x.color.x,x.color.y,x.color.z,x.color.w),this.colorBuffer.setXYZW(e+1,x.color.x,x.color.y,x.color.z,x.color.w),_+1<m.previous.length&&(this.indexBuffer.setX(t*3,e),this.indexBuffer.setX(t*3+1,e+1),this.indexBuffer.setX(t*3+2,e+2),t++,this.indexBuffer.setX(t*3,e+2),this.indexBuffer.setX(t*3+1,e+1),this.indexBuffer.setX(t*3+2,e+3),t++),S=x,x=w,b.done||(b=v.next(),b.value!==void 0&&(w=b.value))}}}),this.positionBuffer.clearUpdateRanges(),this.positionBuffer.addUpdateRange(0,e*3),this.positionBuffer.needsUpdate=!0,this.previousBuffer.clearUpdateRanges(),this.previousBuffer.addUpdateRange(0,e*3),this.previousBuffer.needsUpdate=!0,this.nextBuffer.clearUpdateRanges(),this.nextBuffer.addUpdateRange(0,e*3),this.nextBuffer.needsUpdate=!0,this.sideBuffer.clearUpdateRanges(),this.sideBuffer.addUpdateRange(0,e),this.sideBuffer.needsUpdate=!0,this.widthBuffer.clearUpdateRanges(),this.widthBuffer.addUpdateRange(0,e),this.widthBuffer.needsUpdate=!0,this.uvBuffer.clearUpdateRanges(),this.uvBuffer.addUpdateRange(0,e*2),this.uvBuffer.needsUpdate=!0,this.colorBuffer.clearUpdateRanges(),this.colorBuffer.addUpdateRange(0,e*4),this.colorBuffer.needsUpdate=!0,this.indexBuffer.clearUpdateRanges(),this.indexBuffer.addUpdateRange(0,t*3),this.indexBuffer.needsUpdate=!0,this.geometry.setDrawRange(0,t*3)}dispose(){this.geometry.dispose()}}class Sn{get geometry(){return this._geometry}set geometry(e){if(this._geometry=e,e===void 0||typeof e=="string")return;const t=new je;this._triangleIndexToArea.length=0;let i=0;if(!e.getIndex())return;const r=e.getIndex().array,s=r.length/3;this._triangleIndexToArea.push(0);for(let o=0;o<s;o++)t.setFromAttributeAndIndices(e.getAttribute("position"),r[o*3],r[o*3+1],r[o*3+2]),i+=t.getArea(),this._triangleIndexToArea.push(i);e.userData.triangleIndexToArea=this._triangleIndexToArea}constructor(e){this.type="mesh_surface",this._triangleIndexToArea=[],this._tempA=new R,this._tempB=new R,this._tempC=new R,e&&(this.geometry=e)}initialize(e){const t=this._geometry;if(!t||t.getIndex()===null){e.position.set(0,0,0),e.velocity.set(0,0,1).multiplyScalar(e.startSpeed);return}const i=this._triangleIndexToArea.length-1;let r=0,s=i;const o=Math.random()*this._triangleIndexToArea[i];for(;r+1<s;){const p=Math.floor((r+s)/2);o<this._triangleIndexToArea[p]?s=p:r=p}let l=Math.random(),a=Math.random();l+a>1&&(l=1-l,a=1-a);const c=t.getIndex().array[r*3],h=t.getIndex().array[r*3+1],u=t.getIndex().array[r*3+2],d=t.getAttribute("position");this._tempA.fromBufferAttribute(d,c),this._tempB.fromBufferAttribute(d,h),this._tempC.fromBufferAttribute(d,u),this._tempB.sub(this._tempA),this._tempC.sub(this._tempA),this._tempA.addScaledVector(this._tempB,l).addScaledVector(this._tempC,a),e.position.copy(this._tempA),this._tempA.copy(this._tempB).cross(this._tempC).normalize(),e.velocity.copy(this._tempA).normalize().multiplyScalar(e.startSpeed)}toJSON(){return{type:"mesh_surface",mesh:this._geometry?this._geometry.uuid:""}}static fromJSON(e,t){return new Sn(t.geometries[e.geometry])}clone(){return new Sn(this._geometry)}update(e,t){}}wh({id:"three.quarks",initialize:()=>{},emitterShapes:[{type:"mesh_surface",params:[["geometry",["geometry"]]],constructor:Sn,loadJSON:Sn.fromJSON}],behaviors:[]});class Ns extends Tr{constructor(){super(),this.batches=[],this.systemToBatchIndex=new Map,this.type="BatchedRenderer",this.depthTexture=null}static equals(e,t){return e.material.side===t.material.side&&e.material.blending===t.material.blending&&e.material.blendSrc===t.material.blendSrc&&e.material.blendDst===t.material.blendDst&&e.material.blendEquation===t.material.blendEquation&&e.material.premultipliedAlpha===t.material.premultipliedAlpha&&e.material.transparent===t.material.transparent&&e.material.depthTest===t.material.depthTest&&e.material.type===t.material.type&&e.material.alphaTest===t.material.alphaTest&&e.material.map===t.material.map&&e.renderMode===t.renderMode&&e.blendTiles===t.blendTiles&&e.softParticles===t.softParticles&&e.softFarFade===t.softFarFade&&e.softNearFade===t.softNearFade&&e.uTileCount===t.uTileCount&&e.vTileCount===t.vTileCount&&e.instancingGeometry===t.instancingGeometry&&e.renderOrder===t.renderOrder&&e.layers.mask===t.layers.mask}addSystem(e){e._renderer=this;const t=e.getRendererSettings();for(let r=0;r<this.batches.length;r++)if(Ns.equals(this.batches[r].settings,t)){this.batches[r].addSystem(e),this.systemToBatchIndex.set(e,r);return}let i;switch(t.renderMode){case k.Trail:i=new Hh(t);break;case k.Mesh:case k.BillBoard:case k.VerticalBillBoard:case k.HorizontalBillBoard:case k.StretchedBillBoard:i=new Jh(t);break}this.depthTexture&&i.applyDepthTexture(this.depthTexture),i.addSystem(e),this.batches.push(i),this.systemToBatchIndex.set(e,this.batches.length-1),this.add(i)}deleteSystem(e){const t=this.systemToBatchIndex.get(e);t!=null&&(this.batches[t].removeSystem(e),this.systemToBatchIndex.delete(e))}setDepthTexture(e){this.depthTexture=e;for(const t of this.batches)t.applyDepthTexture(e)}updateSystem(e){this.deleteSystem(e),this.addSystem(e)}update(e){this.systemToBatchIndex.forEach((t,i)=>{i.update(e)});for(let t=0;t<this.batches.length;t++)this.batches[t].update()}}const Wh=Ns;Oh(),console.log("%c Particle system powered by three.quarks. https://quarks.art/","font-size: 14px; font-weight: bold;");const Aa=Math.sqrt(5),Xh=(Aa-1)/4,de=(5-Aa)/20,Xn=n=>Math.floor(n)|0,Yn=new Float64Array([0,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,1,0,1,1,1,0,1,-1,1,0,-1,1,1,0,-1,-1,-1,0,1,1,-1,0,1,-1,-1,0,-1,1,-1,0,-1,-1,1,1,0,1,1,1,0,-1,1,-1,0,1,1,-1,0,-1,-1,1,0,1,-1,1,0,-1,-1,-1,0,1,-1,-1,0,-1,1,1,1,0,1,1,-1,0,1,-1,1,0,1,-1,-1,0,-1,1,1,0,-1,1,-1,0,-1,-1,1,0,-1,-1,-1,0]);function Yh(n=Math.random){const e=Zh(n),t=new Float64Array(e).map(o=>Yn[o%32*4]),i=new Float64Array(e).map(o=>Yn[o%32*4+1]),r=new Float64Array(e).map(o=>Yn[o%32*4+2]),s=new Float64Array(e).map(o=>Yn[o%32*4+3]);return function(o,l,a,c){let h,u,d,p,f;const m=(o+l+a+c)*Xh,g=Xn(o+m),y=Xn(l+m),v=Xn(a+m),b=Xn(c+m),S=(g+y+v+b)*de,x=g-S,w=y-S,_=v-S,M=b-S,C=o-x,T=l-w,E=a-_,P=c-M;let A=0,I=0,N=0,U=0;C>T?A++:I++,C>E?A++:N++,C>P?A++:U++,T>E?I++:N++,T>P?I++:U++,E>P?N++:U++;const G=A>=3?1:0,V=I>=3?1:0,oe=N>=3?1:0,ie=U>=3?1:0,ee=A>=2?1:0,Ae=I>=2?1:0,Me=N>=2?1:0,ne=U>=2?1:0,fe=A>=1?1:0,te=I>=1?1:0,X=N>=1?1:0,ft=U>=1?1:0,Z=C-G+de,Xe=T-V+de,it=E-oe+de,Tt=P-ie+de,Ct=C-ee+2*de,Pt=T-Ae+2*de,Et=E-Me+2*de,At=P-ne+2*de,kt=C-fe+3*de,Rt=T-te+3*de,Ot=E-X+3*de,Bt=P-ft+3*de,nt=C-1+4*de,rt=T-1+4*de,st=E-1+4*de,ot=P-1+4*de,Ue=g&255,De=y&255,Fe=v&255,Le=b&255;let Ve=.6-C*C-T*T-E*E-P*P;if(Ve<0)h=0;else{const Y=Ue+e[De+e[Fe+e[Le]]];Ve*=Ve,h=Ve*Ve*(t[Y]*C+i[Y]*T+r[Y]*E+s[Y]*P)}let j=.6-Z*Z-Xe*Xe-it*it-Tt*Tt;if(j<0)u=0;else{const Y=Ue+G+e[De+V+e[Fe+oe+e[Le+ie]]];j*=j,u=j*j*(t[Y]*Z+i[Y]*Xe+r[Y]*it+s[Y]*Tt)}let pi=.6-Ct*Ct-Pt*Pt-Et*Et-At*At;if(pi<0)d=0;else{const Y=Ue+ee+e[De+Ae+e[Fe+Me+e[Le+ne]]];pi*=pi,d=pi*pi*(t[Y]*Ct+i[Y]*Pt+r[Y]*Et+s[Y]*At)}let fi=.6-kt*kt-Rt*Rt-Ot*Ot-Bt*Bt;if(fi<0)p=0;else{const Y=Ue+fe+e[De+te+e[Fe+X+e[Le+ft]]];fi*=fi,p=fi*fi*(t[Y]*kt+i[Y]*Rt+r[Y]*Ot+s[Y]*Bt)}let mi=.6-nt*nt-rt*rt-st*st-ot*ot;if(mi<0)f=0;else{const Y=Ue+1+e[De+1+e[Fe+1+e[Le+1]]];mi*=mi,f=mi*mi*(t[Y]*nt+i[Y]*rt+r[Y]*st+s[Y]*ot)}return 27*(h+u+d+p+f)}}function Zh(n){const e=new Uint8Array(512);for(let t=0;t<512/2;t++)e[t]=t;for(let t=0;t<512/2-1;t++){const i=t+~~(n()*(256-t)),r=e[t];e[t]=e[i],e[i]=r}for(let t=256;t<512;t++)e[t]=e[t-256];return e}class Qh{constructor(e){if(this._retries=0,!Number.isInteger(e)||e<0)throw new Error("Backoff must be a positive integer");this.backoff=e}get retries(){return this._retries}get current(){return this.backoff}next(){return this._retries++,this.backoff}reset(){this._retries=0}}class Kh{constructor(e,t){if(this._retries=0,!Number.isInteger(e)||e<0)throw new Error("Base must be a positive integer or zero");if(t!==void 0&&(!Number.isInteger(t)||t<0))throw new Error("ExpMax must be a undefined, a positive integer or zero");this.base=e,this.expMax=t,this.i=0}get retries(){return this._retries}get current(){return this.base*Math.pow(2,this.i)}next(){return this._retries++,this.i=this.expMax===void 0?this.i+1:Math.min(this.i+1,this.expMax),this.current}reset(){this._retries=0,this.i=0}}class $h{constructor(e,t,i){if(this.i=0,this._retries=0,e<0)throw new Error("Initial must be a positive number or zero");if(t<0)throw new Error("Increment must be a positive number or zero");if(i!==void 0&&i<0)throw new Error("Max must be undefined, a positive number or zero");if(i!==void 0&&i<e)throw new Error("Max must be undefined or greater than or equal to initial");this.initial=e,this.increment=t,this.max=i}get retries(){return this._retries}get current(){return this.max===void 0?this.initial+this.increment*this.i:Math.min(this.initial+this.increment*this.i,this.max)}next(){return this._retries++,this.i++,this.current}reset(){this._retries=0,this.i=0}}class eu{constructor(){this.elements=[]}add(e){this.elements.push(e)}clear(){this.elements.length=0}forEach(e){this.elements.forEach(e)}length(){return this.elements.length}isEmpty(){return this.elements.length===0}peek(){return this.elements[0]}read(){return this.elements.shift()}}class tu{constructor(e){if(!Number.isInteger(e)||e<=0)throw new Error("Capacity must be a positive integer");this.elements=new Array(e+1),this.head=0,this.tail=0}add(e){this.elements[this.head]=e,this.head=(this.head+1)%this.elements.length,this.head===this.tail&&(this.tail=(this.tail+1)%this.elements.length)}clear(){this.head=0,this.tail=0}forEach(e){for(let t=this.tail;t!==this.head;t=(t+1)%this.elements.length)e(this.elements[t])}length(){return this.tail===this.head?0:this.tail<this.head?this.head-this.tail:this.elements.length-this.tail+this.head}isEmpty(){return this.head===this.tail}peek(){return this.isEmpty()?void 0:this.elements[this.tail]}read(){const e=this.peek();return e!==void 0&&(this.tail=(this.tail+1)%this.elements.length),e}}var q;(function(n){n.open="open",n.close="close",n.error="error",n.message="message",n.retry="retry",n.reconnect="reconnect"})(q||(q={}));class ka{constructor(e,t,i){var r,s,o,l,a,c,h,u,d,p,f,m,g,y,v;this._closedByUser=!1,this.handleOpenEvent=b=>this.handleEvent(q.open,b),this.handleErrorEvent=b=>this.handleEvent(q.error,b),this.handleCloseEvent=b=>this.handleEvent(q.close,b),this.handleMessageEvent=b=>this.handleEvent(q.message,b),this._url=e,this._protocols=t,this._options={buffer:i?.buffer,retry:{maxRetries:(r=i?.retry)===null||r===void 0?void 0:r.maxRetries,instantReconnect:(s=i?.retry)===null||s===void 0?void 0:s.instantReconnect,backoff:(o=i?.retry)===null||o===void 0?void 0:o.backoff},listeners:{open:[...(a=(l=i?.listeners)===null||l===void 0?void 0:l.open)!==null&&a!==void 0?a:[]],close:[...(h=(c=i?.listeners)===null||c===void 0?void 0:c.close)!==null&&h!==void 0?h:[]],error:[...(d=(u=i?.listeners)===null||u===void 0?void 0:u.error)!==null&&d!==void 0?d:[]],message:[...(f=(p=i?.listeners)===null||p===void 0?void 0:p.message)!==null&&f!==void 0?f:[]],retry:[...(g=(m=i?.listeners)===null||m===void 0?void 0:m.retry)!==null&&g!==void 0?g:[]],reconnect:[...(v=(y=i?.listeners)===null||y===void 0?void 0:y.reconnect)!==null&&v!==void 0?v:[]]}},this._underlyingWebsocket=this.tryConnect()}get url(){return this._url}get protocols(){return this._protocols}get buffer(){return this._options.buffer}get maxRetries(){return this._options.retry.maxRetries}get instantReconnect(){return this._options.retry.instantReconnect}get backoff(){return this._options.retry.backoff}get closedByUser(){return this._closedByUser}get lastConnection(){return this._lastConnection}get underlyingWebsocket(){return this._underlyingWebsocket}get readyState(){return this._underlyingWebsocket.readyState}get bufferedAmount(){return this._underlyingWebsocket.bufferedAmount}get extensions(){return this._underlyingWebsocket.extensions}get binaryType(){return this._underlyingWebsocket.binaryType}set binaryType(e){this._underlyingWebsocket.binaryType=e}send(e){this.closedByUser||(this._underlyingWebsocket.readyState===this._underlyingWebsocket.OPEN?this._underlyingWebsocket.send(e):this.buffer!==void 0&&this.buffer.add(e))}close(e,t){this.cancelScheduledConnectionRetry(),this._closedByUser=!0,this._underlyingWebsocket.close(e,t)}addEventListener(e,t,i){this._options.listeners[e].push({listener:t,options:i})}removeEventListener(e,t,i){const r=s=>s.listener!==t||s.options!==i;this._options.listeners[e]=this._options.listeners[e].filter(r)}tryConnect(){return this._underlyingWebsocket=new WebSocket(this.url,this.protocols),this._underlyingWebsocket.addEventListener(q.open,this.handleOpenEvent),this._underlyingWebsocket.addEventListener(q.close,this.handleCloseEvent),this._underlyingWebsocket.addEventListener(q.error,this.handleErrorEvent),this._underlyingWebsocket.addEventListener(q.message,this.handleMessageEvent),this._underlyingWebsocket}clearWebsocket(){this._underlyingWebsocket.removeEventListener(q.open,this.handleOpenEvent),this._underlyingWebsocket.removeEventListener(q.close,this.handleCloseEvent),this._underlyingWebsocket.removeEventListener(q.error,this.handleErrorEvent),this._underlyingWebsocket.removeEventListener(q.message,this.handleMessageEvent),this._underlyingWebsocket.close()}dispatchEvent(e,t){const i=this._options.listeners[e],r=[];i.forEach(({listener:s,options:o})=>{s(this,t),(o===void 0||o.once===void 0||!o.once)&&r.push({listener:s,options:o})}),this._options.listeners[e]=r}handleEvent(e,t){switch(e){case q.close:this.dispatchEvent(e,t),this.scheduleConnectionRetryIfNeeded();break;case q.open:if(this.backoff!==void 0&&this._lastConnection!==void 0){const i={retries:this.backoff.retries,lastConnection:new Date(this._lastConnection)},r=new CustomEvent(q.reconnect,{detail:i});this.dispatchEvent(q.reconnect,r),this.backoff.reset()}this._lastConnection=new Date,this.dispatchEvent(e,t),this.sendBufferedData();break;case q.retry:this.dispatchEvent(e,t),this.clearWebsocket(),this.tryConnect();break;default:this.dispatchEvent(e,t);break}}sendBufferedData(){if(this.buffer!==void 0)for(let e=this.buffer.read();e!==void 0;e=this.buffer.read())this.send(e)}scheduleConnectionRetryIfNeeded(){if(this.closedByUser||this.backoff===void 0)return;const e=i=>{const r=new CustomEvent(q.retry,{detail:i});this.handleEvent(q.retry,r)},t={backoff:this._options.retry.instantReconnect===!0?0:this.backoff.next(),retries:this._options.retry.instantReconnect===!0?0:this.backoff.retries,lastConnection:this._lastConnection};(this._options.retry.maxRetries===void 0||t.retries<=this._options.retry.maxRetries)&&(this.retryTimeout=globalThis.setTimeout(()=>e(t),t.backoff))}cancelScheduledConnectionRetry(){globalThis.clearTimeout(this.retryTimeout)}}class iu{constructor(e){this._url=e}get url(){return this._url}withProtocols(e){return this._protocols=e,this}get protocols(){return this._protocols}withMaxRetries(e){var t;return this._options=Object.assign(Object.assign({},this._options),{retry:Object.assign(Object.assign({},(t=this._options)===null||t===void 0?void 0:t.retry),{maxRetries:e})}),this}get maxRetries(){var e,t;return(t=(e=this._options)===null||e===void 0?void 0:e.retry)===null||t===void 0?void 0:t.maxRetries}withInstantReconnect(e){var t;return this._options=Object.assign(Object.assign({},this._options),{retry:Object.assign(Object.assign({},(t=this._options)===null||t===void 0?void 0:t.retry),{instantReconnect:e})}),this}get instantReconnect(){var e,t;return(t=(e=this._options)===null||e===void 0?void 0:e.retry)===null||t===void 0?void 0:t.instantReconnect}withBackoff(e){var t;return this._options=Object.assign(Object.assign({},this._options),{retry:Object.assign(Object.assign({},(t=this._options)===null||t===void 0?void 0:t.retry),{backoff:e})}),this}get backoff(){var e,t;return(t=(e=this._options)===null||e===void 0?void 0:e.retry)===null||t===void 0?void 0:t.backoff}withBuffer(e){return this._options=Object.assign(Object.assign({},this._options),{buffer:e}),this}get buffer(){var e;return(e=this._options)===null||e===void 0?void 0:e.buffer}onOpen(e,t){return this.addListener(q.open,e,t),this}onClose(e,t){return this.addListener(q.close,e,t),this}onError(e,t){return this.addListener(q.error,e,t),this}onMessage(e,t){return this.addListener(q.message,e,t),this}onRetry(e,t){return this.addListener(q.retry,e,t),this}onReconnect(e,t){return this.addListener(q.reconnect,e,t),this}build(){return new ka(this._url,this._protocols,this._options)}addListener(e,t,i){var r,s,o,l,a,c,h,u,d,p,f,m,g,y,v,b,S,x,w,_,M;return this._options=Object.assign(Object.assign({},this._options),{listeners:{open:(o=(s=(r=this._options)===null||r===void 0?void 0:r.listeners)===null||s===void 0?void 0:s.open)!==null&&o!==void 0?o:[],close:(c=(a=(l=this._options)===null||l===void 0?void 0:l.listeners)===null||a===void 0?void 0:a.close)!==null&&c!==void 0?c:[],error:(d=(u=(h=this._options)===null||h===void 0?void 0:h.listeners)===null||u===void 0?void 0:u.error)!==null&&d!==void 0?d:[],message:(m=(f=(p=this._options)===null||p===void 0?void 0:p.listeners)===null||f===void 0?void 0:f.message)!==null&&m!==void 0?m:[],retry:(v=(y=(g=this._options)===null||g===void 0?void 0:g.listeners)===null||y===void 0?void 0:y.retry)!==null&&v!==void 0?v:[],reconnect:(x=(S=(b=this._options)===null||b===void 0?void 0:b.listeners)===null||S===void 0?void 0:S.reconnect)!==null&&x!==void 0?x:[],[e]:[...(M=(_=(w=this._options)===null||w===void 0?void 0:w.listeners)===null||_===void 0?void 0:_[e])!==null&&M!==void 0?M:[],{listener:t,options:i}]}}),this}}const nu=Object.freeze(Object.defineProperty({__proto__:null,ArrayQueue:eu,ConstantBackoff:Qh,ExponentialBackoff:Kh,LinearBackoff:$h,RingQueue:tu,Websocket:ka,WebsocketBuilder:iu,get WebsocketEvent(){return q}},Symbol.toStringTag,{value:"Module"})),cs=0,Ra=1,Oa=2,ru=0,su=1,ls=2,Zn=1.25,hs=1,vt=6*4+4+4,Qn=65535,ou=Math.pow(2,-24),us=Symbol("SKIP_GENERATION");function Ba(n){return n.index?n.index.count:n.attributes.position.count}function ei(n){return Ba(n)/3}function Ia(n,e=ArrayBuffer){return n>65535?new Uint32Array(new e(4*n)):new Uint16Array(new e(2*n))}function au(n,e){if(!n.index){const t=n.attributes.position.count,i=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,r=Ia(t,i);n.setIndex(new me(r,1));for(let s=0;s<t;s++)r[s]=s}}function za(n,e){const t=ei(n),i=e||n.drawRange,r=i.start/3,s=(i.start+i.count)/3,o=Math.max(0,r),l=Math.min(t,s)-o;return[{offset:Math.floor(o),count:Math.floor(l)}]}function Na(n,e){if(!n.groups||!n.groups.length)return za(n,e);const t=[],i=new Set,r=e||n.drawRange,s=r.start/3,o=(r.start+r.count)/3;for(const a of n.groups){const c=a.start/3,h=(a.start+a.count)/3;i.add(Math.max(s,c)),i.add(Math.min(o,h))}const l=Array.from(i.values()).sort((a,c)=>a-c);for(let a=0;a<l.length-1;a++){const c=l[a],h=l[a+1];t.push({offset:Math.floor(c),count:Math.floor(h-c)})}return t}function cu(n,e){const t=ei(n),i=Na(n,e).sort((o,l)=>o.offset-l.offset),r=i[i.length-1];r.count=Math.min(t-r.offset,r.count);let s=0;return i.forEach(({count:o})=>s+=o),t!==s}function ds(n,e,t,i,r){let s=1/0,o=1/0,l=1/0,a=-1/0,c=-1/0,h=-1/0,u=1/0,d=1/0,p=1/0,f=-1/0,m=-1/0,g=-1/0;for(let y=e*6,v=(e+t)*6;y<v;y+=6){const b=n[y+0],S=n[y+1],x=b-S,w=b+S;x<s&&(s=x),w>a&&(a=w),b<u&&(u=b),b>f&&(f=b);const _=n[y+2],M=n[y+3],C=_-M,T=_+M;C<o&&(o=C),T>c&&(c=T),_<d&&(d=_),_>m&&(m=_);const E=n[y+4],P=n[y+5],A=E-P,I=E+P;A<l&&(l=A),I>h&&(h=I),E<p&&(p=E),E>g&&(g=E)}i[0]=s,i[1]=o,i[2]=l,i[3]=a,i[4]=c,i[5]=h,r[0]=u,r[1]=d,r[2]=p,r[3]=f,r[4]=m,r[5]=g}function lu(n,e=null,t=null,i=null){const r=n.attributes.position,s=n.index?n.index.array:null,o=ei(n),l=r.normalized;let a;e===null?(a=new Float32Array(o*6),t=0,i=o):(a=e,t=t||0,i=i||o);const c=r.array,h=r.offset||0;let u=3;r.isInterleavedBufferAttribute&&(u=r.data.stride);const d=["getX","getY","getZ"];for(let p=t;p<t+i;p++){const f=p*3,m=p*6;let g=f+0,y=f+1,v=f+2;s&&(g=s[g],y=s[y],v=s[v]),l||(g=g*u+h,y=y*u+h,v=v*u+h);for(let b=0;b<3;b++){let S,x,w;l?(S=r[d[b]](g),x=r[d[b]](y),w=r[d[b]](v)):(S=c[g+b],x=c[y+b],w=c[v+b]);let _=S;x<_&&(_=x),w<_&&(_=w);let M=S;x>M&&(M=x),w>M&&(M=w);const C=(M-_)/2,T=b*2;a[m+T+0]=_+C,a[m+T+1]=C+(Math.abs(_)+C)*ou}}return a}function H(n,e,t){return t.min.x=e[n],t.min.y=e[n+1],t.min.z=e[n+2],t.max.x=e[n+3],t.max.y=e[n+4],t.max.z=e[n+5],t}function Ua(n){let e=-1,t=-1/0;for(let i=0;i<3;i++){const r=n[i+3]-n[i];r>t&&(t=r,e=i)}return e}function Da(n,e){e.set(n)}function Fa(n,e,t){let i,r;for(let s=0;s<3;s++){const o=s+3;i=n[s],r=e[s],t[s]=i<r?i:r,i=n[o],r=e[o],t[o]=i>r?i:r}}function Kn(n,e,t){for(let i=0;i<3;i++){const r=e[n+2*i],s=e[n+2*i+1],o=r-s,l=r+s;o<t[i]&&(t[i]=o),l>t[i+3]&&(t[i+3]=l)}}function ki(n){const e=n[3]-n[0],t=n[4]-n[1],i=n[5]-n[2];return 2*(e*t+t*i+i*e)}const ut=32,hu=(n,e)=>n.candidate-e.candidate,bt=new Array(ut).fill().map(()=>({count:0,bounds:new Float32Array(6),rightCacheBounds:new Float32Array(6),leftCacheBounds:new Float32Array(6),candidate:0})),$n=new Float32Array(6);function uu(n,e,t,i,r,s){let o=-1,l=0;if(s===cs)o=Ua(e),o!==-1&&(l=(e[o]+e[o+3])/2);else if(s===Ra)o=Ua(n),o!==-1&&(l=du(t,i,r,o));else if(s===Oa){const a=ki(n);let c=Zn*r;const h=i*6,u=(i+r)*6;for(let d=0;d<3;d++){const p=e[d],f=(e[d+3]-p)/ut;if(r<ut/4){const m=[...bt];m.length=r;let g=0;for(let v=h;v<u;v+=6,g++){const b=m[g];b.candidate=t[v+2*d],b.count=0;const{bounds:S,leftCacheBounds:x,rightCacheBounds:w}=b;for(let _=0;_<3;_++)w[_]=1/0,w[_+3]=-1/0,x[_]=1/0,x[_+3]=-1/0,S[_]=1/0,S[_+3]=-1/0;Kn(v,t,S)}m.sort(hu);let y=r;for(let v=0;v<y;v++){const b=m[v];for(;v+1<y&&m[v+1].candidate===b.candidate;)m.splice(v+1,1),y--}for(let v=h;v<u;v+=6){const b=t[v+2*d];for(let S=0;S<y;S++){const x=m[S];b>=x.candidate?Kn(v,t,x.rightCacheBounds):(Kn(v,t,x.leftCacheBounds),x.count++)}}for(let v=0;v<y;v++){const b=m[v],S=b.count,x=r-b.count,w=b.leftCacheBounds,_=b.rightCacheBounds;let M=0;S!==0&&(M=ki(w)/a);let C=0;x!==0&&(C=ki(_)/a);const T=hs+Zn*(M*S+C*x);T<c&&(o=d,c=T,l=b.candidate)}}else{for(let y=0;y<ut;y++){const v=bt[y];v.count=0,v.candidate=p+f+y*f;const b=v.bounds;for(let S=0;S<3;S++)b[S]=1/0,b[S+3]=-1/0}for(let y=h;y<u;y+=6){let v=~~((t[y+2*d]-p)/f);v>=ut&&(v=ut-1);const b=bt[v];b.count++,Kn(y,t,b.bounds)}const m=bt[ut-1];Da(m.bounds,m.rightCacheBounds);for(let y=ut-2;y>=0;y--){const v=bt[y],b=bt[y+1];Fa(v.bounds,b.rightCacheBounds,v.rightCacheBounds)}let g=0;for(let y=0;y<ut-1;y++){const v=bt[y],b=v.count,S=v.bounds,x=bt[y+1].rightCacheBounds;b!==0&&(g===0?Da(S,$n):Fa(S,$n,$n)),g+=b;let w=0,_=0;g!==0&&(w=ki($n)/a);const M=r-g;M!==0&&(_=ki(x)/a);const C=hs+Zn*(w*g+_*M);C<c&&(o=d,c=C,l=v.candidate)}}}}else console.warn(`MeshBVH: Invalid build strategy value ${s} used.`);return{axis:o,pos:l}}function du(n,e,t,i){let r=0;for(let s=e,o=e+t;s<o;s++)r+=n[s*6+i*2];return r/t}class ps{constructor(){this.boundingData=new Float32Array(6)}}function pu(n,e,t,i,r,s){let o=i,l=i+r-1;const a=s.pos,c=s.axis*2;for(;;){for(;o<=l&&t[o*6+c]<a;)o++;for(;o<=l&&t[l*6+c]>=a;)l--;if(o<l){for(let h=0;h<3;h++){let u=e[o*3+h];e[o*3+h]=e[l*3+h],e[l*3+h]=u}for(let h=0;h<6;h++){let u=t[o*6+h];t[o*6+h]=t[l*6+h],t[l*6+h]=u}o++,l--}else return o}}function fu(n,e,t,i,r,s){let o=i,l=i+r-1;const a=s.pos,c=s.axis*2;for(;;){for(;o<=l&&t[o*6+c]<a;)o++;for(;o<=l&&t[l*6+c]>=a;)l--;if(o<l){let h=n[o];n[o]=n[l],n[l]=h;for(let u=0;u<6;u++){let d=t[o*6+u];t[o*6+u]=t[l*6+u],t[l*6+u]=d}o++,l--}else return o}}function we(n,e){return e[n+15]===65535}function Pe(n,e){return e[n+6]}function Re(n,e){return e[n+14]}function Ie(n){return n+8}function Oe(n,e){return e[n+6]}function fs(n,e){return e[n+7]}let La,Ri,er,Va;const mu=Math.pow(2,32);function ms(n){return"count"in n?1:1+ms(n.left)+ms(n.right)}function yu(n,e,t){return La=new Float32Array(t),Ri=new Uint32Array(t),er=new Uint16Array(t),Va=new Uint8Array(t),ys(n,e)}function ys(n,e){const t=n/4,i=n/2,r="count"in e,s=e.boundingData;for(let o=0;o<6;o++)La[t+o]=s[o];if(r)if(e.buffer){const o=e.buffer;Va.set(new Uint8Array(o),n);for(let l=n,a=n+o.byteLength;l<a;l+=vt){const c=l/2;we(c,er)||(Ri[l/4+6]+=t)}return n+o.byteLength}else{const o=e.offset,l=e.count;return Ri[t+6]=o,er[i+14]=l,er[i+15]=Qn,n+vt}else{const o=e.left,l=e.right,a=e.splitAxis;let c;if(c=ys(n+vt,o),c/4>mu)throw new Error("MeshBVH: Cannot store child pointer greater than 32 bits.");return Ri[t+6]=c/4,c=ys(c,l),Ri[t+7]=a,c}}function gu(n,e){const t=(n.index?n.index.count:n.attributes.position.count)/3,i=t>2**16,r=i?4:2,s=e?new SharedArrayBuffer(t*r):new ArrayBuffer(t*r),o=i?new Uint32Array(s):new Uint16Array(s);for(let l=0,a=o.length;l<a;l++)o[l]=l;return o}function vu(n,e,t,i,r){const{maxDepth:s,verbose:o,maxLeafTris:l,strategy:a,onProgress:c,indirect:h}=r,u=n._indirectBuffer,d=n.geometry,p=d.index?d.index.array:null,f=h?fu:pu,m=ei(d),g=new Float32Array(6);let y=!1;const v=new ps;return ds(e,t,i,v.boundingData,g),S(v,t,i,g),v;function b(x){c&&c(x/m)}function S(x,w,_,M=null,C=0){if(!y&&C>=s&&(y=!0,o&&(console.warn(`MeshBVH: Max depth of ${s} reached when generating BVH. Consider increasing maxDepth.`),console.warn(d))),_<=l||C>=s)return b(w+_),x.offset=w,x.count=_,x;const T=uu(x.boundingData,M,e,w,_,a);if(T.axis===-1)return b(w+_),x.offset=w,x.count=_,x;const E=f(u,p,e,w,_,T);if(E===w||E===w+_)b(w+_),x.offset=w,x.count=_;else{x.splitAxis=T.axis;const P=new ps,A=w,I=E-w;x.left=P,ds(e,A,I,P.boundingData,g),S(P,A,I,g,C+1);const N=new ps,U=E,G=_-I;x.right=N,ds(e,U,G,N.boundingData,g),S(N,U,G,g,C+1)}return x}}function bu(n,e){const t=n.geometry;e.indirect&&(n._indirectBuffer=gu(t,e.useSharedArrayBuffer),cu(t,e.range)&&!e.verbose&&console.warn('MeshBVH: Provided geometry contains groups or a range that do not fully span the vertex contents while using the "indirect" option. BVH may incorrectly report intersections on unrendered portions of the geometry.')),n._indirectBuffer||au(t,e);const i=e.useSharedArrayBuffer?SharedArrayBuffer:ArrayBuffer,r=lu(t),s=e.indirect?za(t,e.range):Na(t,e.range);n._roots=s.map(o=>{const l=vu(n,r,o.offset,o.count,e),a=ms(l),c=new i(vt*a);return yu(0,l,c),c})}class dt{constructor(){this.min=1/0,this.max=-1/0}setFromPointsField(e,t){let i=1/0,r=-1/0;for(let s=0,o=e.length;s<o;s++){const l=e[s][t];i=l<i?l:i,r=l>r?l:r}this.min=i,this.max=r}setFromPoints(e,t){let i=1/0,r=-1/0;for(let s=0,o=t.length;s<o;s++){const l=t[s],a=e.dot(l);i=a<i?a:i,r=a>r?a:r}this.min=i,this.max=r}isSeparated(e){return this.min>e.max||e.min>this.max}}dt.prototype.setFromBox=function(){const n=new R;return function(e,t){const i=t.min,r=t.max;let s=1/0,o=-1/0;for(let l=0;l<=1;l++)for(let a=0;a<=1;a++)for(let c=0;c<=1;c++){n.x=i.x*l+r.x*(1-l),n.y=i.y*a+r.y*(1-a),n.z=i.z*c+r.z*(1-c);const h=e.dot(n);s=Math.min(h,s),o=Math.max(h,o)}this.min=s,this.max=o}}();const xu=function(){const n=new R,e=new R,t=new R;return function(i,r,s){const o=i.start,l=n,a=r.start,c=e;t.subVectors(o,a),n.subVectors(i.end,i.start),e.subVectors(r.end,r.start);const h=t.dot(c),u=c.dot(l),d=c.dot(c),p=t.dot(l),f=l.dot(l)*d-u*u;let m,g;f!==0?m=(h*u-p*d)/f:m=0,g=(h+m*u)/d,s.x=m,s.y=g}}(),gs=function(){const n=new Ye,e=new R,t=new R;return function(i,r,s,o){xu(i,r,n);let l=n.x,a=n.y;if(l>=0&&l<=1&&a>=0&&a<=1){i.at(l,s),r.at(a,o);return}else if(l>=0&&l<=1){a<0?r.at(0,o):r.at(1,o),i.closestPointToPoint(o,!0,s);return}else if(a>=0&&a<=1){l<0?i.at(0,s):i.at(1,s),r.closestPointToPoint(s,!0,o);return}else{let c;l<0?c=i.start:c=i.end;let h;a<0?h=r.start:h=r.end;const u=e,d=t;if(i.closestPointToPoint(h,!0,e),r.closestPointToPoint(c,!0,t),u.distanceToSquared(h)<=d.distanceToSquared(c)){s.copy(u),o.copy(h);return}else{s.copy(c),o.copy(d);return}}}}(),_u=function(){const n=new R,e=new R,t=new Ls,i=new at;return function(r,s){const{radius:o,center:l}=r,{a,b:c,c:h}=s;if(i.start=a,i.end=c,i.closestPointToPoint(l,!0,n).distanceTo(l)<=o||(i.start=a,i.end=h,i.closestPointToPoint(l,!0,n).distanceTo(l)<=o)||(i.start=c,i.end=h,i.closestPointToPoint(l,!0,n).distanceTo(l)<=o))return!0;const u=s.getPlane(t);if(Math.abs(u.distanceToPoint(l))<=o){const d=u.projectPoint(l,e);if(s.containsPoint(d))return!0}return!1}}(),Su=1e-15;function vs(n){return Math.abs(n)<Su}class ze extends je{constructor(...e){super(...e),this.isExtendedTriangle=!0,this.satAxes=new Array(4).fill().map(()=>new R),this.satBounds=new Array(4).fill().map(()=>new dt),this.points=[this.a,this.b,this.c],this.sphere=new Vs,this.plane=new Ls,this.needsUpdate=!0}intersectsSphere(e){return _u(e,this)}update(){const e=this.a,t=this.b,i=this.c,r=this.points,s=this.satAxes,o=this.satBounds,l=s[0],a=o[0];this.getNormal(l),a.setFromPoints(l,r);const c=s[1],h=o[1];c.subVectors(e,t),h.setFromPoints(c,r);const u=s[2],d=o[2];u.subVectors(t,i),d.setFromPoints(u,r);const p=s[3],f=o[3];p.subVectors(i,e),f.setFromPoints(p,r),this.sphere.setFromPoints(this.points),this.plane.setFromNormalAndCoplanarPoint(l,e),this.needsUpdate=!1}}ze.prototype.closestPointToSegment=function(){const n=new R,e=new R,t=new at;return function(i,r=null,s=null){const{start:o,end:l}=i,a=this.points;let c,h=1/0;for(let u=0;u<3;u++){const d=(u+1)%3;t.start.copy(a[u]),t.end.copy(a[d]),gs(t,i,n,e),c=n.distanceToSquared(e),c<h&&(h=c,r&&r.copy(n),s&&s.copy(e))}return this.closestPointToPoint(o,n),c=o.distanceToSquared(n),c<h&&(h=c,r&&r.copy(n),s&&s.copy(o)),this.closestPointToPoint(l,n),c=l.distanceToSquared(n),c<h&&(h=c,r&&r.copy(n),s&&s.copy(l)),Math.sqrt(h)}}(),ze.prototype.intersectsTriangle=function(){const n=new ze,e=new Array(3),t=new Array(3),i=new dt,r=new dt,s=new R,o=new R,l=new R,a=new R,c=new R,h=new at,u=new at,d=new at,p=new R;function f(m,g,y){const v=m.points;let b=0,S=-1;for(let x=0;x<3;x++){const{start:w,end:_}=h;w.copy(v[x]),_.copy(v[(x+1)%3]),h.delta(o);const M=vs(g.distanceToPoint(w));if(vs(g.normal.dot(o))&&M){y.copy(h),b=2;break}const C=g.intersectLine(h,p);if(!C&&M&&p.copy(w),(C||M)&&!vs(p.distanceTo(_))){if(b<=1)(b===1?y.start:y.end).copy(p),M&&(S=b);else if(b>=2){(S===1?y.start:y.end).copy(p),b=2;break}if(b++,b===2&&S===-1)break}}return b}return function(m,g=null,y=!1){this.needsUpdate&&this.update(),m.isExtendedTriangle?m.needsUpdate&&m.update():(n.copy(m),n.update(),m=n);const v=this.plane,b=m.plane;if(Math.abs(v.normal.dot(b.normal))>1-1e-10){const S=this.satBounds,x=this.satAxes;t[0]=m.a,t[1]=m.b,t[2]=m.c;for(let M=0;M<4;M++){const C=S[M],T=x[M];if(i.setFromPoints(T,t),C.isSeparated(i))return!1}const w=m.satBounds,_=m.satAxes;e[0]=this.a,e[1]=this.b,e[2]=this.c;for(let M=0;M<4;M++){const C=w[M],T=_[M];if(i.setFromPoints(T,e),C.isSeparated(i))return!1}for(let M=0;M<4;M++){const C=x[M];for(let T=0;T<4;T++){const E=_[T];if(s.crossVectors(C,E),i.setFromPoints(s,e),r.setFromPoints(s,t),i.isSeparated(r))return!1}}return g&&(y||console.warn("ExtendedTriangle.intersectsTriangle: Triangles are coplanar which does not support an output edge. Setting edge to 0, 0, 0."),g.start.set(0,0,0),g.end.set(0,0,0)),!0}else{const S=f(this,b,u);if(S===1&&m.containsPoint(u.end))return g&&(g.start.copy(u.end),g.end.copy(u.end)),!0;if(S!==2)return!1;const x=f(m,v,d);if(x===1&&this.containsPoint(d.end))return g&&(g.start.copy(d.end),g.end.copy(d.end)),!0;if(x!==2)return!1;if(u.delta(l),d.delta(a),l.dot(a)<0){let P=d.start;d.start=d.end,d.end=P}const w=u.start.dot(l),_=u.end.dot(l),M=d.start.dot(l),C=d.end.dot(l),T=_<M,E=w<C;return w!==C&&M!==_&&T===E?!1:(g&&(c.subVectors(u.start,d.start),c.dot(l)>0?g.start.copy(u.start):g.start.copy(d.start),c.subVectors(u.end,d.end),c.dot(l)<0?g.end.copy(u.end):g.end.copy(d.end)),!0)}}}(),ze.prototype.distanceToPoint=function(){const n=new R;return function(e){return this.closestPointToPoint(e,n),e.distanceTo(n)}}(),ze.prototype.distanceToTriangle=function(){const n=new R,e=new R,t=["a","b","c"],i=new at,r=new at;return function(s,o=null,l=null){const a=o||l?i:null;if(this.intersectsTriangle(s,a))return(o||l)&&(o&&a.getCenter(o),l&&a.getCenter(l)),0;let c=1/0;for(let h=0;h<3;h++){let u;const d=t[h],p=s[d];this.closestPointToPoint(p,n),u=p.distanceToSquared(n),u<c&&(c=u,o&&o.copy(n),l&&l.copy(p));const f=this[d];s.closestPointToPoint(f,n),u=f.distanceToSquared(n),u<c&&(c=u,o&&o.copy(f),l&&l.copy(n))}for(let h=0;h<3;h++){const u=t[h],d=t[(h+1)%3];i.set(this[u],this[d]);for(let p=0;p<3;p++){const f=t[p],m=t[(p+1)%3];r.set(s[f],s[m]),gs(i,r,n,e);const g=n.distanceToSquared(e);g<c&&(c=g,o&&o.copy(n),l&&l.copy(e))}}return Math.sqrt(c)}}();class be{constructor(e,t,i){this.isOrientedBox=!0,this.min=new R,this.max=new R,this.matrix=new Be,this.invMatrix=new Be,this.points=new Array(8).fill().map(()=>new R),this.satAxes=new Array(3).fill().map(()=>new R),this.satBounds=new Array(3).fill().map(()=>new dt),this.alignedSatBounds=new Array(3).fill().map(()=>new dt),this.needsUpdate=!1,e&&this.min.copy(e),t&&this.max.copy(t),i&&this.matrix.copy(i)}set(e,t,i){this.min.copy(e),this.max.copy(t),this.matrix.copy(i),this.needsUpdate=!0}copy(e){this.min.copy(e.min),this.max.copy(e.max),this.matrix.copy(e.matrix),this.needsUpdate=!0}}be.prototype.update=function(){return function(){const n=this.matrix,e=this.min,t=this.max,i=this.points;for(let a=0;a<=1;a++)for(let c=0;c<=1;c++)for(let h=0;h<=1;h++){const u=1*a|2*c|4*h,d=i[u];d.x=a?t.x:e.x,d.y=c?t.y:e.y,d.z=h?t.z:e.z,d.applyMatrix4(n)}const r=this.satBounds,s=this.satAxes,o=i[0];for(let a=0;a<3;a++){const c=s[a],h=r[a],u=1<<a,d=i[u];c.subVectors(o,d),h.setFromPoints(c,i)}const l=this.alignedSatBounds;l[0].setFromPointsField(i,"x"),l[1].setFromPointsField(i,"y"),l[2].setFromPointsField(i,"z"),this.invMatrix.copy(this.matrix).invert(),this.needsUpdate=!1}}(),be.prototype.intersectsBox=function(){const n=new dt;return function(e){this.needsUpdate&&this.update();const t=e.min,i=e.max,r=this.satBounds,s=this.satAxes,o=this.alignedSatBounds;if(n.min=t.x,n.max=i.x,o[0].isSeparated(n)||(n.min=t.y,n.max=i.y,o[1].isSeparated(n))||(n.min=t.z,n.max=i.z,o[2].isSeparated(n)))return!1;for(let l=0;l<3;l++){const a=s[l],c=r[l];if(n.setFromBox(a,e),c.isSeparated(n))return!1}return!0}}(),be.prototype.intersectsTriangle=function(){const n=new ze,e=new Array(3),t=new dt,i=new dt,r=new R;return function(s){this.needsUpdate&&this.update(),s.isExtendedTriangle?s.needsUpdate&&s.update():(n.copy(s),n.update(),s=n);const o=this.satBounds,l=this.satAxes;e[0]=s.a,e[1]=s.b,e[2]=s.c;for(let u=0;u<3;u++){const d=o[u],p=l[u];if(t.setFromPoints(p,e),d.isSeparated(t))return!1}const a=s.satBounds,c=s.satAxes,h=this.points;for(let u=0;u<3;u++){const d=a[u],p=c[u];if(t.setFromPoints(p,h),d.isSeparated(t))return!1}for(let u=0;u<3;u++){const d=l[u];for(let p=0;p<4;p++){const f=c[p];if(r.crossVectors(d,f),t.setFromPoints(r,e),i.setFromPoints(r,h),t.isSeparated(i))return!1}}return!0}}(),be.prototype.closestPointToPoint=function(){return function(n,e){return this.needsUpdate&&this.update(),e.copy(n).applyMatrix4(this.invMatrix).clamp(this.min,this.max).applyMatrix4(this.matrix),e}}(),be.prototype.distanceToPoint=function(){const n=new R;return function(e){return this.closestPointToPoint(e,n),e.distanceTo(n)}}(),be.prototype.distanceToBox=function(){const n=["x","y","z"],e=new Array(12).fill().map(()=>new at),t=new Array(12).fill().map(()=>new at),i=new R,r=new R;return function(s,o=0,l=null,a=null){if(this.needsUpdate&&this.update(),this.intersectsBox(s))return(l||a)&&(s.getCenter(r),this.closestPointToPoint(r,i),s.closestPointToPoint(i,r),l&&l.copy(i),a&&a.copy(r)),0;const c=o*o,h=s.min,u=s.max,d=this.points;let p=1/0;for(let m=0;m<8;m++){const g=d[m];r.copy(g).clamp(h,u);const y=g.distanceToSquared(r);if(y<p&&(p=y,l&&l.copy(g),a&&a.copy(r),y<c))return Math.sqrt(y)}let f=0;for(let m=0;m<3;m++)for(let g=0;g<=1;g++)for(let y=0;y<=1;y++){const v=(m+1)%3,b=(m+2)%3,S=g<<v|y<<b,x=1<<m|g<<v|y<<b,w=d[S],_=d[x];e[f].set(w,_);const M=n[m],C=n[v],T=n[b],E=t[f],P=E.start,A=E.end;P[M]=h[M],P[C]=g?h[C]:u[C],P[T]=y?h[T]:u[C],A[M]=u[M],A[C]=g?h[C]:u[C],A[T]=y?h[T]:u[C],f++}for(let m=0;m<=1;m++)for(let g=0;g<=1;g++)for(let y=0;y<=1;y++){r.x=m?u.x:h.x,r.y=g?u.y:h.y,r.z=y?u.z:h.z,this.closestPointToPoint(r,i);const v=r.distanceToSquared(i);if(v<p&&(p=v,l&&l.copy(i),a&&a.copy(r),v<c))return Math.sqrt(v)}for(let m=0;m<12;m++){const g=e[m];for(let y=0;y<12;y++){const v=t[y];gs(g,v,i,r);const b=i.distanceToSquared(r);if(b<p&&(p=b,l&&l.copy(i),a&&a.copy(r),b<c))return Math.sqrt(b)}}return Math.sqrt(p)}}();class bs{constructor(e){this._getNewPrimitive=e,this._primitives=[]}getPrimitive(){const e=this._primitives;return e.length===0?this._getNewPrimitive():e.pop()}releasePrimitive(e){this._primitives.push(e)}}class wu extends bs{constructor(){super(()=>new ze)}}const Ne=new wu;class Mu{constructor(){this.float32Array=null,this.uint16Array=null,this.uint32Array=null;const e=[];let t=null;this.setBuffer=i=>{t&&e.push(t),t=i,this.float32Array=new Float32Array(i),this.uint16Array=new Uint16Array(i),this.uint32Array=new Uint32Array(i)},this.clearBuffer=()=>{t=null,this.float32Array=null,this.uint16Array=null,this.uint32Array=null,e.length!==0&&this.setBuffer(e.pop())}}}const W=new Mu;let xt,ti;const ii=[],tr=new bs(()=>new Te);function Tu(n,e,t,i,r,s){xt=tr.getPrimitive(),ti=tr.getPrimitive(),ii.push(xt,ti),W.setBuffer(n._roots[e]);const o=xs(0,n.geometry,t,i,r,s);W.clearBuffer(),tr.releasePrimitive(xt),tr.releasePrimitive(ti),ii.pop(),ii.pop();const l=ii.length;return l>0&&(ti=ii[l-1],xt=ii[l-2]),o}function xs(n,e,t,i,r=null,s=0,o=0){const{float32Array:l,uint16Array:a,uint32Array:c}=W;let h=n*2;if(we(h,a)){const u=Pe(n,c),d=Re(h,a);return H(n,l,xt),i(u,d,!1,o,s+n,xt)}else{let u=function(E){const{uint16Array:P,uint32Array:A}=W;let I=E*2;for(;!we(I,P);)E=Ie(E),I=E*2;return Pe(E,A)},d=function(E){const{uint16Array:P,uint32Array:A}=W;let I=E*2;for(;!we(I,P);)E=Oe(E,A),I=E*2;return Pe(E,A)+Re(I,P)};const p=Ie(n),f=Oe(n,c);let m=p,g=f,y,v,b,S;if(r&&(b=xt,S=ti,H(m,l,b),H(g,l,S),y=r(b),v=r(S),v<y)){m=f,g=p;const E=y;y=v,v=E,b=S}b||(b=xt,H(m,l,b));const x=we(m*2,a),w=t(b,x,y,o+1,s+m);let _;if(w===ls){const E=u(m),P=d(m)-E;_=i(E,P,!0,o+1,s+m,b)}else _=w&&xs(m,e,t,i,r,s,o+1);if(_)return!0;S=ti,H(g,l,S);const M=we(g*2,a),C=t(S,M,v,o+1,s+g);let T;if(C===ls){const E=u(g),P=d(g)-E;T=i(E,P,!0,o+1,s+g,S)}else T=C&&xs(g,e,t,i,r,s,o+1);return!!T}}const Oi=new R,_s=new R;function Cu(n,e,t={},i=0,r=1/0){const s=i*i,o=r*r;let l=1/0,a=null;if(n.shapecast({boundsTraverseOrder:h=>(Oi.copy(e).clamp(h.min,h.max),Oi.distanceToSquared(e)),intersectsBounds:(h,u,d)=>d<l&&d<o,intersectsTriangle:(h,u)=>{h.closestPointToPoint(e,Oi);const d=e.distanceToSquared(Oi);return d<l&&(_s.copy(Oi),l=d,a=u),d<s}}),l===1/0)return null;const c=Math.sqrt(l);return t.point?t.point.copy(_s):t.point=_s.clone(),t.distance=c,t.faceIndex=a,t}const Pu=parseInt(js)>=169,Ut=new R,Dt=new R,Ft=new R,ir=new Ye,nr=new Ye,rr=new Ye,ja=new R,Ja=new R,Ga=new R,Bi=new R;function Eu(n,e,t,i,r,s,o,l){let a;if(s===wc?a=n.intersectTriangle(i,t,e,!0,r):a=n.intersectTriangle(e,t,i,s!==Mr,r),a===null)return null;const c=n.origin.distanceTo(r);return c<o||c>l?null:{distance:c,point:r.clone()}}function Au(n,e,t,i,r,s,o,l,a,c,h){Ut.fromBufferAttribute(e,s),Dt.fromBufferAttribute(e,o),Ft.fromBufferAttribute(e,l);const u=Eu(n,Ut,Dt,Ft,Bi,a,c,h);if(u){const d=new R;je.getBarycoord(Bi,Ut,Dt,Ft,d),i&&(ir.fromBufferAttribute(i,s),nr.fromBufferAttribute(i,o),rr.fromBufferAttribute(i,l),u.uv=je.getInterpolation(Bi,Ut,Dt,Ft,ir,nr,rr,new Ye)),r&&(ir.fromBufferAttribute(r,s),nr.fromBufferAttribute(r,o),rr.fromBufferAttribute(r,l),u.uv1=je.getInterpolation(Bi,Ut,Dt,Ft,ir,nr,rr,new Ye)),t&&(ja.fromBufferAttribute(t,s),Ja.fromBufferAttribute(t,o),Ga.fromBufferAttribute(t,l),u.normal=je.getInterpolation(Bi,Ut,Dt,Ft,ja,Ja,Ga,new R),u.normal.dot(n.direction)>0&&u.normal.multiplyScalar(-1));const p={a:s,b:o,c:l,normal:new R,materialIndex:0};je.getNormal(Ut,Dt,Ft,p.normal),u.face=p,u.faceIndex=s,Pu&&(u.barycoord=d)}return u}function sr(n,e,t,i,r,s,o){const l=i*3;let a=l+0,c=l+1,h=l+2;const u=n.index;n.index&&(a=u.getX(a),c=u.getX(c),h=u.getX(h));const{position:d,normal:p,uv:f,uv1:m}=n.attributes,g=Au(t,d,p,f,m,a,c,h,e,s,o);return g?(g.faceIndex=i,r&&r.push(g),g):null}function $(n,e,t,i){const r=n.a,s=n.b,o=n.c;let l=e,a=e+1,c=e+2;t&&(l=t.getX(l),a=t.getX(a),c=t.getX(c)),r.x=i.getX(l),r.y=i.getY(l),r.z=i.getZ(l),s.x=i.getX(a),s.y=i.getY(a),s.z=i.getZ(a),o.x=i.getX(c),o.y=i.getY(c),o.z=i.getZ(c)}const Ii=new R,zi=new R,Ni=new R,qa=new Ye,Ha=new Ye,Wa=new Ye;function ku(n,e,t,i){const r=e.getIndex().array,s=e.getAttribute("position"),o=e.getAttribute("uv"),l=r[t*3],a=r[t*3+1],c=r[t*3+2];Ii.fromBufferAttribute(s,l),zi.fromBufferAttribute(s,a),Ni.fromBufferAttribute(s,c);let h=0;const u=e.groups,d=t*3;for(let m=0,g=u.length;m<g;m++){const y=u[m],{start:v,count:b}=y;if(d>=v&&d<v+b){h=y.materialIndex;break}}const p=i&&i.barycoord?i.barycoord:new R;je.getBarycoord(n,Ii,zi,Ni,p);let f=null;return o&&(qa.fromBufferAttribute(o,l),Ha.fromBufferAttribute(o,a),Wa.fromBufferAttribute(o,c),i&&i.uv?f=i.uv:f=new Ye,je.getInterpolation(n,Ii,zi,Ni,qa,Ha,Wa,f)),i?(i.face||(i.face={}),i.face.a=l,i.face.b=a,i.face.c=c,i.face.materialIndex=h,i.face.normal||(i.face.normal=new R),je.getNormal(Ii,zi,Ni,i.face.normal),f&&(i.uv=f),i.barycoord=p,i):{face:{a:l,b:a,c,materialIndex:h,normal:je.getNormal(Ii,zi,Ni,new R)},uv:f,barycoord:p}}function Ru(n,e,t,i,r,s,o,l){const{geometry:a,_indirectBuffer:c}=n;for(let h=i,u=i+r;h<u;h++)sr(a,e,t,h,s,o,l)}function Ou(n,e,t,i,r,s,o){const{geometry:l,_indirectBuffer:a}=n;let c=1/0,h=null;for(let u=i,d=i+r;u<d;u++){let p;p=sr(l,e,t,u,null,s,o),p&&p.distance<c&&(h=p,c=p.distance)}return h}function Bu(n,e,t,i,r,s,o){const{geometry:l}=t,{index:a}=l,c=l.attributes.position;for(let h=n,u=e+n;h<u;h++){let d;if(d=h,$(o,d*3,a,c),o.needsUpdate=!0,i(o,d,r,s))return!0}return!1}function Iu(n,e=null){e&&Array.isArray(e)&&(e=new Set(e));const t=n.geometry,i=t.index?t.index.array:null,r=t.attributes.position;let s,o,l,a,c=0;const h=n._roots;for(let d=0,p=h.length;d<p;d++)s=h[d],o=new Uint32Array(s),l=new Uint16Array(s),a=new Float32Array(s),u(0,c),c+=s.byteLength;function u(d,p,f=!1){const m=d*2;if(l[m+15]===Qn){const g=o[d+6],y=l[m+14];let v=1/0,b=1/0,S=1/0,x=-1/0,w=-1/0,_=-1/0;for(let M=3*g,C=3*(g+y);M<C;M++){let T=i[M];const E=r.getX(T),P=r.getY(T),A=r.getZ(T);E<v&&(v=E),E>x&&(x=E),P<b&&(b=P),P>w&&(w=P),A<S&&(S=A),A>_&&(_=A)}return a[d+0]!==v||a[d+1]!==b||a[d+2]!==S||a[d+3]!==x||a[d+4]!==w||a[d+5]!==_?(a[d+0]=v,a[d+1]=b,a[d+2]=S,a[d+3]=x,a[d+4]=w,a[d+5]=_,!0):!1}else{const g=d+8,y=o[d+6],v=g+p,b=y+p;let S=f,x=!1,w=!1;e?S||(x=e.has(v),w=e.has(b),S=!x&&!w):(x=!0,w=!0);const _=S||x,M=S||w;let C=!1;_&&(C=u(g,p,S));let T=!1;M&&(T=u(y,p,S));const E=C||T;if(E)for(let P=0;P<3;P++){const A=g+P,I=y+P,N=a[A],U=a[A+3],G=a[I],V=a[I+3];a[d+P]=N<G?N:G,a[d+P+3]=U>V?U:V}return E}}}function _t(n,e,t,i,r){let s,o,l,a,c,h;const u=1/t.direction.x,d=1/t.direction.y,p=1/t.direction.z,f=t.origin.x,m=t.origin.y,g=t.origin.z;let y=e[n],v=e[n+3],b=e[n+1],S=e[n+3+1],x=e[n+2],w=e[n+3+2];return u>=0?(s=(y-f)*u,o=(v-f)*u):(s=(v-f)*u,o=(y-f)*u),d>=0?(l=(b-m)*d,a=(S-m)*d):(l=(S-m)*d,a=(b-m)*d),s>a||l>o||((l>s||isNaN(s))&&(s=l),(a<o||isNaN(o))&&(o=a),p>=0?(c=(x-g)*p,h=(w-g)*p):(c=(w-g)*p,h=(x-g)*p),s>h||c>o)?!1:((c>s||s!==s)&&(s=c),(h<o||o!==o)&&(o=h),s<=r&&o>=i)}function zu(n,e,t,i,r,s,o,l){const{geometry:a,_indirectBuffer:c}=n;for(let h=i,u=i+r;h<u;h++){let d=c?c[h]:h;sr(a,e,t,d,s,o,l)}}function Nu(n,e,t,i,r,s,o){const{geometry:l,_indirectBuffer:a}=n;let c=1/0,h=null;for(let u=i,d=i+r;u<d;u++){let p;p=sr(l,e,t,a?a[u]:u,null,s,o),p&&p.distance<c&&(h=p,c=p.distance)}return h}function Uu(n,e,t,i,r,s,o){const{geometry:l}=t,{index:a}=l,c=l.attributes.position;for(let h=n,u=e+n;h<u;h++){let d;if(d=t.resolveTriangleIndex(h),$(o,d*3,a,c),o.needsUpdate=!0,i(o,d,r,s))return!0}return!1}function Du(n,e,t,i,r,s,o){W.setBuffer(n._roots[e]),Ss(0,n,t,i,r,s,o),W.clearBuffer()}function Ss(n,e,t,i,r,s,o){const{float32Array:l,uint16Array:a,uint32Array:c}=W,h=n*2;if(we(h,a)){const u=Pe(n,c),d=Re(h,a);Ru(e,t,i,u,d,r,s,o)}else{const u=Ie(n);_t(u,l,i,s,o)&&Ss(u,e,t,i,r,s,o);const d=Oe(n,c);_t(d,l,i,s,o)&&Ss(d,e,t,i,r,s,o)}}const Fu=["x","y","z"];function Lu(n,e,t,i,r,s){W.setBuffer(n._roots[e]);const o=ws(0,n,t,i,r,s);return W.clearBuffer(),o}function ws(n,e,t,i,r,s){const{float32Array:o,uint16Array:l,uint32Array:a}=W;let c=n*2;if(we(c,l)){const h=Pe(n,a),u=Re(c,l);return Ou(e,t,i,h,u,r,s)}else{const h=fs(n,a),u=Fu[h],d=i.direction[u]>=0;let p,f;d?(p=Ie(n),f=Oe(n,a)):(p=Oe(n,a),f=Ie(n));const m=_t(p,o,i,r,s)?ws(p,e,t,i,r,s):null;if(m){const y=m.point[u];if(d?y<=o[f+h]:y>=o[f+h+3])return m}const g=_t(f,o,i,r,s)?ws(f,e,t,i,r,s):null;return m&&g?m.distance<=g.distance?m:g:m||g||null}}const or=new Te,ni=new ze,ri=new ze,Ui=new Be,Xa=new be,ar=new be;function Vu(n,e,t,i){W.setBuffer(n._roots[e]);const r=Ms(0,n,t,i);return W.clearBuffer(),r}function Ms(n,e,t,i,r=null){const{float32Array:s,uint16Array:o,uint32Array:l}=W;let a=n*2;if(r===null&&(t.boundingBox||t.computeBoundingBox(),Xa.set(t.boundingBox.min,t.boundingBox.max,i),r=Xa),we(a,o)){const c=e.geometry,h=c.index,u=c.attributes.position,d=t.index,p=t.attributes.position,f=Pe(n,l),m=Re(a,o);if(Ui.copy(i).invert(),t.boundsTree)return H(n,s,ar),ar.matrix.copy(Ui),ar.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:g=>ar.intersectsBox(g),intersectsTriangle:g=>{g.a.applyMatrix4(i),g.b.applyMatrix4(i),g.c.applyMatrix4(i),g.needsUpdate=!0;for(let y=f*3,v=(m+f)*3;y<v;y+=3)if($(ri,y,h,u),ri.needsUpdate=!0,g.intersectsTriangle(ri))return!0;return!1}});for(let g=f*3,y=(m+f)*3;g<y;g+=3){$(ni,g,h,u),ni.a.applyMatrix4(Ui),ni.b.applyMatrix4(Ui),ni.c.applyMatrix4(Ui),ni.needsUpdate=!0;for(let v=0,b=d.count;v<b;v+=3)if($(ri,v,d,p),ri.needsUpdate=!0,ni.intersectsTriangle(ri))return!0}}else{const c=n+8,h=l[n+6];return H(c,s,or),!!(r.intersectsBox(or)&&Ms(c,e,t,i,r)||(H(h,s,or),r.intersectsBox(or)&&Ms(h,e,t,i,r)))}}const cr=new Be,Ts=new be,Di=new be,ju=new R,Ju=new R,Gu=new R,qu=new R;function Hu(n,e,t,i={},r={},s=0,o=1/0){e.boundingBox||e.computeBoundingBox(),Ts.set(e.boundingBox.min,e.boundingBox.max,t),Ts.needsUpdate=!0;const l=n.geometry,a=l.attributes.position,c=l.index,h=e.attributes.position,u=e.index,d=Ne.getPrimitive(),p=Ne.getPrimitive();let f=ju,m=Ju,g=null,y=null;r&&(g=Gu,y=qu);let v=1/0,b=null,S=null;return cr.copy(t).invert(),Di.matrix.copy(cr),n.shapecast({boundsTraverseOrder:x=>Ts.distanceToBox(x),intersectsBounds:(x,w,_)=>_<v&&_<o?(w&&(Di.min.copy(x.min),Di.max.copy(x.max),Di.needsUpdate=!0),!0):!1,intersectsRange:(x,w)=>{if(e.boundsTree)return e.boundsTree.shapecast({boundsTraverseOrder:_=>Di.distanceToBox(_),intersectsBounds:(_,M,C)=>C<v&&C<o,intersectsRange:(_,M)=>{for(let C=_,T=_+M;C<T;C++){$(p,3*C,u,h),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let E=x,P=x+w;E<P;E++){$(d,3*E,c,a),d.needsUpdate=!0;const A=d.distanceToTriangle(p,f,g);if(A<v&&(m.copy(f),y&&y.copy(g),v=A,b=E,S=C),A<s)return!0}}}});{const _=ei(e);for(let M=0,C=_;M<C;M++){$(p,3*M,u,h),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let T=x,E=x+w;T<E;T++){$(d,3*T,c,a),d.needsUpdate=!0;const P=d.distanceToTriangle(p,f,g);if(P<v&&(m.copy(f),y&&y.copy(g),v=P,b=T,S=M),P<s)return!0}}}}}),Ne.releasePrimitive(d),Ne.releasePrimitive(p),v===1/0?null:(i.point?i.point.copy(m):i.point=m.clone(),i.distance=v,i.faceIndex=b,r&&(r.point?r.point.copy(y):r.point=y.clone(),r.point.applyMatrix4(cr),m.applyMatrix4(cr),r.distance=m.sub(r.point).length(),r.faceIndex=S),i)}function Wu(n,e=null){e&&Array.isArray(e)&&(e=new Set(e));const t=n.geometry,i=t.index?t.index.array:null,r=t.attributes.position;let s,o,l,a,c=0;const h=n._roots;for(let d=0,p=h.length;d<p;d++)s=h[d],o=new Uint32Array(s),l=new Uint16Array(s),a=new Float32Array(s),u(0,c),c+=s.byteLength;function u(d,p,f=!1){const m=d*2;if(l[m+15]===Qn){const g=o[d+6],y=l[m+14];let v=1/0,b=1/0,S=1/0,x=-1/0,w=-1/0,_=-1/0;for(let M=g,C=g+y;M<C;M++){const T=3*n.resolveTriangleIndex(M);for(let E=0;E<3;E++){let P=T+E;P=i?i[P]:P;const A=r.getX(P),I=r.getY(P),N=r.getZ(P);A<v&&(v=A),A>x&&(x=A),I<b&&(b=I),I>w&&(w=I),N<S&&(S=N),N>_&&(_=N)}}return a[d+0]!==v||a[d+1]!==b||a[d+2]!==S||a[d+3]!==x||a[d+4]!==w||a[d+5]!==_?(a[d+0]=v,a[d+1]=b,a[d+2]=S,a[d+3]=x,a[d+4]=w,a[d+5]=_,!0):!1}else{const g=d+8,y=o[d+6],v=g+p,b=y+p;let S=f,x=!1,w=!1;e?S||(x=e.has(v),w=e.has(b),S=!x&&!w):(x=!0,w=!0);const _=S||x,M=S||w;let C=!1;_&&(C=u(g,p,S));let T=!1;M&&(T=u(y,p,S));const E=C||T;if(E)for(let P=0;P<3;P++){const A=g+P,I=y+P,N=a[A],U=a[A+3],G=a[I],V=a[I+3];a[d+P]=N<G?N:G,a[d+P+3]=U>V?U:V}return E}}}function Xu(n,e,t,i,r,s,o){W.setBuffer(n._roots[e]),Cs(0,n,t,i,r,s,o),W.clearBuffer()}function Cs(n,e,t,i,r,s,o){const{float32Array:l,uint16Array:a,uint32Array:c}=W,h=n*2;if(we(h,a)){const u=Pe(n,c),d=Re(h,a);zu(e,t,i,u,d,r,s,o)}else{const u=Ie(n);_t(u,l,i,s,o)&&Cs(u,e,t,i,r,s,o);const d=Oe(n,c);_t(d,l,i,s,o)&&Cs(d,e,t,i,r,s,o)}}const Yu=["x","y","z"];function Zu(n,e,t,i,r,s){W.setBuffer(n._roots[e]);const o=Ps(0,n,t,i,r,s);return W.clearBuffer(),o}function Ps(n,e,t,i,r,s){const{float32Array:o,uint16Array:l,uint32Array:a}=W;let c=n*2;if(we(c,l)){const h=Pe(n,a),u=Re(c,l);return Nu(e,t,i,h,u,r,s)}else{const h=fs(n,a),u=Yu[h],d=i.direction[u]>=0;let p,f;d?(p=Ie(n),f=Oe(n,a)):(p=Oe(n,a),f=Ie(n));const m=_t(p,o,i,r,s)?Ps(p,e,t,i,r,s):null;if(m){const y=m.point[u];if(d?y<=o[f+h]:y>=o[f+h+3])return m}const g=_t(f,o,i,r,s)?Ps(f,e,t,i,r,s):null;return m&&g?m.distance<=g.distance?m:g:m||g||null}}const lr=new Te,si=new ze,oi=new ze,Fi=new Be,Ya=new be,hr=new be;function Qu(n,e,t,i){W.setBuffer(n._roots[e]);const r=Es(0,n,t,i);return W.clearBuffer(),r}function Es(n,e,t,i,r=null){const{float32Array:s,uint16Array:o,uint32Array:l}=W;let a=n*2;if(r===null&&(t.boundingBox||t.computeBoundingBox(),Ya.set(t.boundingBox.min,t.boundingBox.max,i),r=Ya),we(a,o)){const c=e.geometry,h=c.index,u=c.attributes.position,d=t.index,p=t.attributes.position,f=Pe(n,l),m=Re(a,o);if(Fi.copy(i).invert(),t.boundsTree)return H(n,s,hr),hr.matrix.copy(Fi),hr.needsUpdate=!0,t.boundsTree.shapecast({intersectsBounds:g=>hr.intersectsBox(g),intersectsTriangle:g=>{g.a.applyMatrix4(i),g.b.applyMatrix4(i),g.c.applyMatrix4(i),g.needsUpdate=!0;for(let y=f,v=m+f;y<v;y++)if($(oi,3*e.resolveTriangleIndex(y),h,u),oi.needsUpdate=!0,g.intersectsTriangle(oi))return!0;return!1}});for(let g=f,y=m+f;g<y;g++){const v=e.resolveTriangleIndex(g);$(si,3*v,h,u),si.a.applyMatrix4(Fi),si.b.applyMatrix4(Fi),si.c.applyMatrix4(Fi),si.needsUpdate=!0;for(let b=0,S=d.count;b<S;b+=3)if($(oi,b,d,p),oi.needsUpdate=!0,si.intersectsTriangle(oi))return!0}}else{const c=n+8,h=l[n+6];return H(c,s,lr),!!(r.intersectsBox(lr)&&Es(c,e,t,i,r)||(H(h,s,lr),r.intersectsBox(lr)&&Es(h,e,t,i,r)))}}const ur=new Be,As=new be,Li=new be,Ku=new R,$u=new R,ed=new R,td=new R;function id(n,e,t,i={},r={},s=0,o=1/0){e.boundingBox||e.computeBoundingBox(),As.set(e.boundingBox.min,e.boundingBox.max,t),As.needsUpdate=!0;const l=n.geometry,a=l.attributes.position,c=l.index,h=e.attributes.position,u=e.index,d=Ne.getPrimitive(),p=Ne.getPrimitive();let f=Ku,m=$u,g=null,y=null;r&&(g=ed,y=td);let v=1/0,b=null,S=null;return ur.copy(t).invert(),Li.matrix.copy(ur),n.shapecast({boundsTraverseOrder:x=>As.distanceToBox(x),intersectsBounds:(x,w,_)=>_<v&&_<o?(w&&(Li.min.copy(x.min),Li.max.copy(x.max),Li.needsUpdate=!0),!0):!1,intersectsRange:(x,w)=>{if(e.boundsTree){const _=e.boundsTree;return _.shapecast({boundsTraverseOrder:M=>Li.distanceToBox(M),intersectsBounds:(M,C,T)=>T<v&&T<o,intersectsRange:(M,C)=>{for(let T=M,E=M+C;T<E;T++){const P=_.resolveTriangleIndex(T);$(p,3*P,u,h),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let A=x,I=x+w;A<I;A++){const N=n.resolveTriangleIndex(A);$(d,3*N,c,a),d.needsUpdate=!0;const U=d.distanceToTriangle(p,f,g);if(U<v&&(m.copy(f),y&&y.copy(g),v=U,b=A,S=T),U<s)return!0}}}})}else{const _=ei(e);for(let M=0,C=_;M<C;M++){$(p,3*M,u,h),p.a.applyMatrix4(t),p.b.applyMatrix4(t),p.c.applyMatrix4(t),p.needsUpdate=!0;for(let T=x,E=x+w;T<E;T++){const P=n.resolveTriangleIndex(T);$(d,3*P,c,a),d.needsUpdate=!0;const A=d.distanceToTriangle(p,f,g);if(A<v&&(m.copy(f),y&&y.copy(g),v=A,b=T,S=M),A<s)return!0}}}}}),Ne.releasePrimitive(d),Ne.releasePrimitive(p),v===1/0?null:(i.point?i.point.copy(m):i.point=m.clone(),i.distance=v,i.faceIndex=b,r&&(r.point?r.point.copy(y):r.point=y.clone(),r.point.applyMatrix4(ur),m.applyMatrix4(ur),r.distance=m.sub(r.point).length(),r.faceIndex=S),i)}function Za(){return typeof SharedArrayBuffer<"u"}const Vi=new W.constructor,dr=new W.constructor,St=new bs(()=>new Te),ai=new Te,ci=new Te,ks=new Te,Rs=new Te;let Os=!1;function nd(n,e,t,i){if(Os)throw new Error("MeshBVH: Recursive calls to bvhcast not supported.");Os=!0;const r=n._roots,s=e._roots;let o,l=0,a=0;const c=new Be().copy(t).invert();for(let h=0,u=r.length;h<u;h++){Vi.setBuffer(r[h]),a=0;const d=St.getPrimitive();H(0,Vi.float32Array,d),d.applyMatrix4(c);for(let p=0,f=s.length;p<f&&(dr.setBuffer(s[p]),o=He(0,0,t,c,i,l,a,0,0,d),dr.clearBuffer(),a+=s[p].length,!o);p++);if(St.releasePrimitive(d),Vi.clearBuffer(),l+=r[h].length,o)break}return Os=!1,o}function He(n,e,t,i,r,s=0,o=0,l=0,a=0,c=null,h=!1){let u,d;h?(u=dr,d=Vi):(u=Vi,d=dr);const p=u.float32Array,f=u.uint32Array,m=u.uint16Array,g=d.float32Array,y=d.uint32Array,v=d.uint16Array,b=n*2,S=e*2,x=we(b,m),w=we(S,v);let _=!1;if(w&&x)h?_=r(Pe(e,y),Re(e*2,v),Pe(n,f),Re(n*2,m),a,o+e,l,s+n):_=r(Pe(n,f),Re(n*2,m),Pe(e,y),Re(e*2,v),l,s+n,a,o+e);else if(w){const M=St.getPrimitive();H(e,g,M),M.applyMatrix4(t);const C=Ie(n),T=Oe(n,f);H(C,p,ai),H(T,p,ci);const E=M.intersectsBox(ai),P=M.intersectsBox(ci);_=E&&He(e,C,i,t,r,o,s,a,l+1,M,!h)||P&&He(e,T,i,t,r,o,s,a,l+1,M,!h),St.releasePrimitive(M)}else{const M=Ie(e),C=Oe(e,y);H(M,g,ks),H(C,g,Rs);const T=c.intersectsBox(ks),E=c.intersectsBox(Rs);if(T&&E)_=He(n,M,t,i,r,s,o,l,a+1,c,h)||He(n,C,t,i,r,s,o,l,a+1,c,h);else if(T)if(x)_=He(n,M,t,i,r,s,o,l,a+1,c,h);else{const P=St.getPrimitive();P.copy(ks).applyMatrix4(t);const A=Ie(n),I=Oe(n,f);H(A,p,ai),H(I,p,ci);const N=P.intersectsBox(ai),U=P.intersectsBox(ci);_=N&&He(M,A,i,t,r,o,s,a,l+1,P,!h)||U&&He(M,I,i,t,r,o,s,a,l+1,P,!h),St.releasePrimitive(P)}else if(E)if(x)_=He(n,C,t,i,r,s,o,l,a+1,c,h);else{const P=St.getPrimitive();P.copy(Rs).applyMatrix4(t);const A=Ie(n),I=Oe(n,f);H(A,p,ai),H(I,p,ci);const N=P.intersectsBox(ai),U=P.intersectsBox(ci);_=N&&He(C,A,i,t,r,o,s,a,l+1,P,!h)||U&&He(C,I,i,t,r,o,s,a,l+1,P,!h),St.releasePrimitive(P)}}return _}const pr=new be,Qa=new Te,rd={strategy:cs,maxDepth:40,maxLeafTris:10,useSharedArrayBuffer:!1,setBoundingBox:!0,onProgress:null,indirect:!1,verbose:!0,range:null};class wt{static serialize(e,t={}){t={cloneBuffers:!0,...t};const i=e.geometry,r=e._roots,s=e._indirectBuffer,o=i.getIndex();let l;return t.cloneBuffers?l={roots:r.map(a=>a.slice()),index:o?o.array.slice():null,indirectBuffer:s?s.slice():null}:l={roots:r,index:o?o.array:null,indirectBuffer:s},l}static deserialize(e,t,i={}){i={setIndex:!0,indirect:!!e.indirectBuffer,...i};const{index:r,roots:s,indirectBuffer:o}=e,l=new wt(t,{...i,[us]:!0});if(l._roots=s,l._indirectBuffer=o||null,i.setIndex){const a=t.getIndex();if(a===null){const c=new me(e.index,1,!1);t.setIndex(c)}else a.array!==r&&(a.array.set(r),a.needsUpdate=!0)}return l}get indirect(){return!!this._indirectBuffer}constructor(e,t={}){if(e.isBufferGeometry){if(e.index&&e.index.isInterleavedBufferAttribute)throw new Error("MeshBVH: InterleavedBufferAttribute is not supported for the index attribute.")}else throw new Error("MeshBVH: Only BufferGeometries are supported.");if(t=Object.assign({...rd,[us]:!1},t),t.useSharedArrayBuffer&&!Za())throw new Error("MeshBVH: SharedArrayBuffer is not available.");this.geometry=e,this._roots=null,this._indirectBuffer=null,t[us]||(bu(this,t),!e.boundingBox&&t.setBoundingBox&&(e.boundingBox=this.getBoundingBox(new Te))),this.resolveTriangleIndex=t.indirect?i=>this._indirectBuffer[i]:i=>i}refit(e=null){return(this.indirect?Wu:Iu)(this,e)}traverse(e,t=0){const i=this._roots[t],r=new Uint32Array(i),s=new Uint16Array(i);o(0);function o(l,a=0){const c=l*2,h=s[c+15]===Qn;if(h){const u=r[l+6],d=s[c+14];e(a,h,new Float32Array(i,l*4,6),u,d)}else{const u=l+vt/4,d=r[l+6],p=r[l+7];e(a,h,new Float32Array(i,l*4,6),p)||(o(u,a+1),o(d,a+1))}}}raycast(e,t=Js,i=0,r=1/0){const s=this._roots,o=this.geometry,l=[],a=t.isMaterial,c=Array.isArray(t),h=o.groups,u=a?t.side:t,d=this.indirect?Xu:Du;for(let p=0,f=s.length;p<f;p++){const m=c?t[h[p].materialIndex].side:u,g=l.length;if(d(this,p,m,e,l,i,r),c){const y=h[p].materialIndex;for(let v=g,b=l.length;v<b;v++)l[v].face.materialIndex=y}}return l}raycastFirst(e,t=Js,i=0,r=1/0){const s=this._roots,o=this.geometry,l=t.isMaterial,a=Array.isArray(t);let c=null;const h=o.groups,u=l?t.side:t,d=this.indirect?Zu:Lu;for(let p=0,f=s.length;p<f;p++){const m=a?t[h[p].materialIndex].side:u,g=d(this,p,m,e,i,r);g!=null&&(c==null||g.distance<c.distance)&&(c=g,a&&(g.face.materialIndex=h[p].materialIndex))}return c}intersectsGeometry(e,t){let i=!1;const r=this._roots,s=this.indirect?Qu:Vu;for(let o=0,l=r.length;o<l&&(i=s(this,o,e,t),!i);o++);return i}shapecast(e){const t=Ne.getPrimitive(),i=this.indirect?Uu:Bu;let{boundsTraverseOrder:r,intersectsBounds:s,intersectsRange:o,intersectsTriangle:l}=e;if(o&&l){const u=o;o=(d,p,f,m,g)=>u(d,p,f,m,g)?!0:i(d,p,this,l,f,m,t)}else o||(l?o=(u,d,p,f)=>i(u,d,this,l,p,f,t):o=(u,d,p)=>p);let a=!1,c=0;const h=this._roots;for(let u=0,d=h.length;u<d;u++){const p=h[u];if(a=Tu(this,u,s,o,r,c),a)break;c+=p.byteLength}return Ne.releasePrimitive(t),a}bvhcast(e,t,i){let{intersectsRanges:r,intersectsTriangles:s}=i;const o=Ne.getPrimitive(),l=this.geometry.index,a=this.geometry.attributes.position,c=this.indirect?f=>{const m=this.resolveTriangleIndex(f);$(o,m*3,l,a)}:f=>{$(o,f*3,l,a)},h=Ne.getPrimitive(),u=e.geometry.index,d=e.geometry.attributes.position,p=e.indirect?f=>{const m=e.resolveTriangleIndex(f);$(h,m*3,u,d)}:f=>{$(h,f*3,u,d)};if(s){const f=(m,g,y,v,b,S,x,w)=>{for(let _=y,M=y+v;_<M;_++){p(_),h.a.applyMatrix4(t),h.b.applyMatrix4(t),h.c.applyMatrix4(t),h.needsUpdate=!0;for(let C=m,T=m+g;C<T;C++)if(c(C),o.needsUpdate=!0,s(o,h,C,_,b,S,x,w))return!0}return!1};if(r){const m=r;r=function(g,y,v,b,S,x,w,_){return m(g,y,v,b,S,x,w,_)?!0:f(g,y,v,b,S,x,w,_)}}else r=f}return nd(this,e,t,r)}intersectsBox(e,t){return pr.set(e.min,e.max,t),pr.needsUpdate=!0,this.shapecast({intersectsBounds:i=>pr.intersectsBox(i),intersectsTriangle:i=>pr.intersectsTriangle(i)})}intersectsSphere(e){return this.shapecast({intersectsBounds:t=>e.intersectsBox(t),intersectsTriangle:t=>t.intersectsSphere(e)})}closestPointToGeometry(e,t,i={},r={},s=0,o=1/0){return(this.indirect?id:Hu)(this,e,t,i,r,s,o)}closestPointToPoint(e,t={},i=0,r=1/0){return Cu(this,e,t,i,r)}getBoundingBox(e){return e.makeEmpty(),this._roots.forEach(t=>{H(0,new Float32Array(t),Qa),e.union(Qa)}),e}}const Ka=new Te,$a=new Be;class sd extends Tr{get isMesh(){return!this.displayEdges}get isLineSegments(){return this.displayEdges}get isLine(){return this.displayEdges}getVertexPosition(...e){return Mn.prototype.getVertexPosition.call(this,...e)}constructor(e,t,i=10,r=0){super(),this.material=t,this.geometry=new Xt,this.name="MeshBVHRootHelper",this.depth=i,this.displayParents=!1,this.bvh=e,this.displayEdges=!0,this._group=r}raycast(){}update(){const e=this.geometry,t=this.bvh,i=this._group;if(e.dispose(),this.visible=!1,t){const r=this.depth-1,s=this.displayParents;let o=0;t.traverse((d,p)=>{if(d>=r||p)return o++,!0;s&&o++},i);let l=0;const a=new Float32Array(8*3*o);t.traverse((d,p,f)=>{const m=d>=r||p;if(m||s){H(0,f,Ka);const{min:g,max:y}=Ka;for(let v=-1;v<=1;v+=2){const b=v<0?g.x:y.x;for(let S=-1;S<=1;S+=2){const x=S<0?g.y:y.y;for(let w=-1;w<=1;w+=2){const _=w<0?g.z:y.z;a[l+0]=b,a[l+1]=x,a[l+2]=_,l+=3}}}return m}},i);let c,h;this.displayEdges?h=new Uint8Array([0,4,1,5,2,6,3,7,0,2,1,3,4,6,5,7,0,1,2,3,4,5,6,7]):h=new Uint8Array([0,1,2,2,1,3,4,6,5,6,7,5,1,4,5,0,4,1,2,3,6,3,7,6,0,2,4,2,6,4,1,5,3,3,5,7]),a.length>65535?c=new Uint32Array(h.length*o):c=new Uint16Array(h.length*o);const u=h.length;for(let d=0;d<o;d++){const p=d*8,f=d*u;for(let m=0;m<u;m++)c[f+m]=p+h[m]}e.setIndex(new me(c,1,!1)),e.setAttribute("position",new me(a,3,!1)),this.visible=!0}}}class Us extends Mc{get color(){return this.edgeMaterial.color}get opacity(){return this.edgeMaterial.opacity}set opacity(e){this.edgeMaterial.opacity=e,this.meshMaterial.opacity=e}constructor(e=null,t=null,i=10){e instanceof wt&&(i=t||10,t=e,e=null),typeof t=="number"&&(i=t,t=null),super(),this.name="MeshBVHHelper",this.depth=i,this.mesh=e,this.bvh=t,this.displayParents=!1,this.displayEdges=!0,this.objectIndex=0,this._roots=[];const r=new Tc({color:65416,transparent:!0,opacity:.3,depthWrite:!1}),s=new wr({color:65416,transparent:!0,opacity:.3,depthWrite:!1});s.color=r.color,this.edgeMaterial=r,this.meshMaterial=s,this.update()}update(){const e=this.mesh;let t=this.bvh||e.geometry.boundsTree||null;if(e.isBatchedMesh&&e.boundsTrees&&!t){const r=e._drawInfo[this.objectIndex];r&&(t=e.boundsTrees[r.geometryIndex]||t)}const i=t?t._roots.length:0;for(;this._roots.length>i;){const r=this._roots.pop();r.geometry.dispose(),this.remove(r)}for(let r=0;r<i;r++){const{depth:s,edgeMaterial:o,meshMaterial:l,displayParents:a,displayEdges:c}=this;if(r>=this._roots.length){const u=new sd(t,o,s,r);this.add(u),this._roots.push(u)}const h=this._roots[r];h.bvh=t,h.depth=s,h.displayParents=a,h.displayEdges=c,h.material=c?o:l,h.update()}}updateMatrixWorld(...e){const t=this.mesh,i=this.parent;t!==null&&(t.updateWorldMatrix(!0,!1),i?this.matrix.copy(i.matrixWorld).invert().multiply(t.matrixWorld):this.matrix.copy(t.matrixWorld),(t.isInstancedMesh||t.isBatchedMesh)&&(t.getMatrixAt(this.objectIndex,$a),this.matrix.multiply($a)),this.matrix.decompose(this.position,this.quaternion,this.scale)),super.updateMatrixWorld(...e)}copy(e){this.depth=e.depth,this.mesh=e.mesh,this.bvh=e.bvh,this.opacity=e.opacity,this.color.copy(e.color)}clone(){return new Us(this.mesh,this.bvh,this.depth)}dispose(){this.edgeMaterial.dispose(),this.meshMaterial.dispose();const e=this.children;for(let t=0,i=e.length;t<i;t++)e[t].geometry.dispose()}}const ji=new Te,ec=new Te,li=new R;function tc(n){switch(typeof n){case"number":return 8;case"string":return n.length*2;case"boolean":return 4;default:return 0}}function od(n){return/(Uint|Int|Float)(8|16|32)Array/.test(n.constructor.name)}function ad(n,e){const t={nodeCount:0,leafNodeCount:0,depth:{min:1/0,max:-1/0},tris:{min:1/0,max:-1/0},splits:[0,0,0],surfaceAreaScore:0};return n.traverse((i,r,s,o,l)=>{const a=s[3]-s[0],c=s[1+3]-s[1],h=s[2+3]-s[2],u=2*(a*c+c*h+h*a);t.nodeCount++,r?(t.leafNodeCount++,t.depth.min=Math.min(i,t.depth.min),t.depth.max=Math.max(i,t.depth.max),t.tris.min=Math.min(l,t.tris.min),t.tris.max=Math.max(l,t.tris.max),t.surfaceAreaScore+=u*Zn*l):(t.splits[o]++,t.surfaceAreaScore+=u*hs)},e),t.tris.min===1/0&&(t.tris.min=0,t.tris.max=0),t.depth.min===1/0&&(t.depth.min=0,t.depth.max=0),t}function cd(n){return n._roots.map((e,t)=>ad(n,t))}function ld(n){const e=new Set,t=[n];let i=0;for(;t.length;){const r=t.pop();if(!e.has(r)){e.add(r);for(let s in r){if(!Object.hasOwn(r,s))continue;i+=tc(s);const o=r[s];o&&(typeof o=="object"||typeof o=="function")?od(o)||Za()&&o instanceof SharedArrayBuffer||o instanceof ArrayBuffer?i+=o.byteLength:t.push(o):i+=tc(o)}}}return i}function hd(n){const e=n.geometry,t=[],i=e.index,r=e.getAttribute("position");let s=!0;return n.traverse((o,l,a,c,h)=>{const u={depth:o,isLeaf:l,boundingData:a,offset:c,count:h};t[o]=u,H(0,a,ji);const d=t[o-1];if(l)for(let p=c,f=c+h;p<f;p++){const m=n.resolveTriangleIndex(p);let g=3*m,y=3*m+1,v=3*m+2;i&&(g=i.getX(g),y=i.getX(y),v=i.getX(v));let b;li.fromBufferAttribute(r,g),b=ji.containsPoint(li),li.fromBufferAttribute(r,y),b=b&&ji.containsPoint(li),li.fromBufferAttribute(r,v),b=b&&ji.containsPoint(li),console.assert(b,"Leaf bounds does not fully contain triangle."),s=s&&b}if(d){H(0,a,ec);const p=ec.containsBox(ji);console.assert(p,"Parent bounds does not fully contain child."),s=s&&p}}),s}function ud(n){const e=[];return n.traverse((t,i,r,s,o)=>{const l={bounds:H(0,r,new Te)};i?(l.count=o,l.offset=s):(l.left=null,l.right=null),e[t]=l;const a=e[t-1];a&&(a.left===null?a.left=l:a.right=l)}),e[0]}function ic(n,e,t){return n===null?null:(n.point.applyMatrix4(e.matrixWorld),n.distance=n.point.distanceTo(t.ray.origin),n.object=e,n)}const dd=parseInt(js)>=166,fr=new Pc,nc=new R,rc=new Be,pd=Mn.prototype.raycast,fd=Cc.prototype.raycast,sc=new R,pe=new Mn,mr=[];function md(n,e){this.isBatchedMesh?yd.call(this,n,e):gd.call(this,n,e)}function yd(n,e){if(this.boundsTrees){const t=this.boundsTrees,i=this._drawInfo||this._instanceInfo,r=this._drawRanges||this._geometryInfo,s=this.matrixWorld;pe.material=this.material,pe.geometry=this.geometry;const o=pe.geometry.boundsTree,l=pe.geometry.drawRange;pe.geometry.boundingSphere===null&&(pe.geometry.boundingSphere=new Vs);for(let a=0,c=i.length;a<c;a++){if(!this.getVisibleAt(a))continue;const h=i[a].geometryIndex;if(pe.geometry.boundsTree=t[h],this.getMatrixAt(a,pe.matrixWorld).premultiply(s),!pe.geometry.boundsTree){this.getBoundingBoxAt(h,pe.geometry.boundingBox),this.getBoundingSphereAt(h,pe.geometry.boundingSphere);const u=r[h];pe.geometry.setDrawRange(u.start,u.count)}pe.raycast(n,mr);for(let u=0,d=mr.length;u<d;u++){const p=mr[u];p.object=this,p.batchId=a,e.push(p)}mr.length=0}pe.geometry.boundsTree=o,pe.geometry.drawRange=l,pe.material=null,pe.geometry=null}else fd.call(this,n,e)}function gd(n,e){if(this.geometry.boundsTree){if(this.material===void 0)return;rc.copy(this.matrixWorld).invert(),fr.copy(n.ray).applyMatrix4(rc),sc.setFromMatrixScale(this.matrixWorld),nc.copy(fr.direction).multiply(sc);const t=nc.length(),i=n.near/t,r=n.far/t,s=this.geometry.boundsTree;if(n.firstHitOnly===!0){const o=ic(s.raycastFirst(fr,this.material,i,r),this,n);o&&e.push(o)}else{const o=s.raycast(fr,this.material,i,r);for(let l=0,a=o.length;l<a;l++){const c=ic(o[l],this,n);c&&e.push(c)}}}else pd.call(this,n,e)}function vd(n={}){return this.boundsTree=new wt(this,n),this.boundsTree}function bd(){this.boundsTree=null}function xd(n=-1,e={}){if(!dd)throw new Error("BatchedMesh: Three r166+ is required to compute bounds trees.");e.indirect&&console.warn('"Indirect" is set to false because it is not supported for BatchedMesh.'),e={...e,indirect:!1,range:null};const t=this._drawRanges||this._geometryInfo,i=this._geometryCount;this.boundsTrees||(this.boundsTrees=new Array(i).fill(null));const r=this.boundsTrees;for(;r.length<i;)r.push(null);if(n<0){for(let s=0;s<i;s++)e.range=t[s],r[s]=new wt(this.geometry,e);return r}else return n<t.length&&(e.range=t[n],r[n]=new wt(this.geometry,e)),r[n]||null}function _d(n=-1){n<0?this.boundsTrees.fill(null):n<this.boundsTree.length&&(this.boundsTrees[n]=null)}function Sd(n){switch(n){case 1:return"R";case 2:return"RG";case 3:return"RGBA";case 4:return"RGBA"}throw new Error}function wd(n){switch(n){case 1:return Rc;case 2:return kc;case 3:return Cn;case 4:return Cn}}function oc(n){switch(n){case 1:return Oc;case 2:return Hs;case 3:return Er;case 4:return Er}}class yr extends Pr{constructor(){super(),this.minFilter=Yt,this.magFilter=Yt,this.generateMipmaps=!1,this.overrideItemSize=null,this._forcedType=null}updateFrom(e){const t=this.overrideItemSize,i=e.itemSize,r=e.count;if(t!==null){if(i*r%t!==0)throw new Error("VertexAttributeTexture: overrideItemSize must divide evenly into buffer length.");e.itemSize=t,e.count=r*i/t}const s=e.itemSize,o=e.count,l=e.normalized,a=e.array.constructor,c=a.BYTES_PER_ELEMENT;let h=this._forcedType,u=s;if(h===null)switch(a){case Float32Array:h=gi;break;case Uint8Array:case Uint16Array:case Uint32Array:h=yi;break;case Int8Array:case Int16Array:case Int32Array:h=Tn;break}let d,p,f,m,g=Sd(s);switch(h){case gi:f=1,p=wd(s),l&&c===1?(m=a,g+="8",a===Uint8Array?d=Gs:(d=qs,g+="_SNORM")):(m=Float32Array,g+="32F",d=gi);break;case Tn:g+=c*8+"I",f=l?Math.pow(2,a.BYTES_PER_ELEMENT*8-1):1,p=oc(s),c===1?(m=Int8Array,d=qs):c===2?(m=Int16Array,d=Ac):(m=Int32Array,d=Tn);break;case yi:g+=c*8+"UI",f=l?Math.pow(2,a.BYTES_PER_ELEMENT*8-1):1,p=oc(s),c===1?(m=Uint8Array,d=Gs):c===2?(m=Uint16Array,d=Ec):(m=Uint32Array,d=yi);break}u===3&&(p===Cn||p===Er)&&(u=4);const y=Math.ceil(Math.sqrt(o))||1,v=u*y*y,b=new m(v),S=e.normalized;e.normalized=!1;for(let x=0;x<o;x++){const w=u*x;b[w]=e.getX(x)/f,s>=2&&(b[w+1]=e.getY(x)/f),s>=3&&(b[w+2]=e.getZ(x)/f,u===4&&(b[w+3]=1)),s>=4&&(b[w+3]=e.getW(x)/f)}e.normalized=S,this.internalFormat=g,this.format=p,this.type=d,this.image.width=y,this.image.height=y,this.image.data=b,this.needsUpdate=!0,this.dispose(),e.itemSize=i,e.count=r}}class ac extends yr{constructor(){super(),this._forcedType=yi}}class Md extends yr{constructor(){super(),this._forcedType=Tn}}class cc extends yr{constructor(){super(),this._forcedType=gi}}class Td{constructor(){this.index=new ac,this.position=new cc,this.bvhBounds=new Pr,this.bvhContents=new Pr,this._cachedIndexAttr=null,this.index.overrideItemSize=3}updateFrom(e){const{geometry:t}=e;if(Pd(e,this.bvhBounds,this.bvhContents),this.position.updateFrom(t.attributes.position),e.indirect){const i=e._indirectBuffer;if(this._cachedIndexAttr===null||this._cachedIndexAttr.count!==i.length)if(t.index)this._cachedIndexAttr=t.index.clone();else{const r=Ia(Ba(t));this._cachedIndexAttr=new me(r,1,!1)}Cd(t,i,this._cachedIndexAttr),this.index.updateFrom(this._cachedIndexAttr)}else this.index.updateFrom(t.index)}dispose(){const{index:e,position:t,bvhBounds:i,bvhContents:r}=this;e&&e.dispose(),t&&t.dispose(),i&&i.dispose(),r&&r.dispose()}}function Cd(n,e,t){const i=t.array,r=n.index?n.index.array:null;for(let s=0,o=e.length;s<o;s++){const l=3*s,a=3*e[s];for(let c=0;c<3;c++)i[l+c]=r?r[a+c]:a+c}}function Pd(n,e,t){const i=n._roots;if(i.length!==1)throw new Error("MeshBVHUniformStruct: Multi-root BVHs not supported.");const r=i[0],s=new Uint16Array(r),o=new Uint32Array(r),l=new Float32Array(r),a=r.byteLength/vt,c=2*Math.ceil(Math.sqrt(a/2)),h=new Float32Array(4*c*c),u=Math.ceil(Math.sqrt(a)),d=new Uint32Array(2*u*u);for(let p=0;p<a;p++){const f=p*vt/4,m=f*2,g=f;for(let y=0;y<3;y++)h[8*p+0+y]=l[g+0+y],h[8*p+4+y]=l[g+3+y];if(we(m,s)){const y=Re(m,s),v=Pe(f,o),b=4294901760|y;d[p*2+0]=b,d[p*2+1]=v}else{const y=4*Oe(f,o)/vt,v=fs(f,o);d[p*2+0]=v,d[p*2+1]=y}}e.image.data=h,e.image.width=c,e.image.height=c,e.format=Cn,e.type=gi,e.internalFormat="RGBA32F",e.minFilter=Yt,e.magFilter=Yt,e.generateMipmaps=!1,e.needsUpdate=!0,e.dispose(),t.image.data=d,t.image.width=u,t.image.height=u,t.format=Hs,t.type=yi,t.internalFormat="RG32UI",t.minFilter=Yt,t.magFilter=Yt,t.generateMipmaps=!1,t.needsUpdate=!0,t.dispose()}const Lt=new R,Vt=new R,jt=new R,lc=new Ar,gr=new R,Bs=new R,hc=new Ar,uc=new Ar,vr=new Be,dc=new Be;function Ji(n,e){if(!n&&!e)return;const t=n.count===e.count,i=n.normalized===e.normalized,r=n.array.constructor===e.array.constructor,s=n.itemSize===e.itemSize;if(!t||!i||!r||!s)throw new Error}function Gi(n,e=null){const t=n.array.constructor,i=n.normalized,r=n.itemSize,s=e===null?n.count:e;return new me(new t(r*s),r,i)}function pc(n,e,t=0){if(n.isInterleavedBufferAttribute){const i=n.itemSize;for(let r=0,s=n.count;r<s;r++){const o=r+t;e.setX(o,n.getX(r)),i>=2&&e.setY(o,n.getY(r)),i>=3&&e.setZ(o,n.getZ(r)),i>=4&&e.setW(o,n.getW(r))}}else{const i=e.array,r=i.constructor,s=i.BYTES_PER_ELEMENT*n.itemSize*t;new r(i.buffer,s,n.array.length).set(n.array)}}function Ed(n,e,t){const i=n.elements,r=e.elements;for(let s=0,o=r.length;s<o;s++)i[s]+=r[s]*t}function fc(n,e,t){const i=n.skeleton,r=n.geometry,s=i.bones,o=i.boneInverses;hc.fromBufferAttribute(r.attributes.skinIndex,e),uc.fromBufferAttribute(r.attributes.skinWeight,e),vr.elements.fill(0);for(let l=0;l<4;l++){const a=uc.getComponent(l);if(a!==0){const c=hc.getComponent(l);dc.multiplyMatrices(s[c].matrixWorld,o[c]),Ed(vr,dc,a)}}return vr.multiply(n.bindMatrix).premultiply(n.bindMatrixInverse),t.transformDirection(vr),t}function Is(n,e,t,i,r){gr.set(0,0,0);for(let s=0,o=n.length;s<o;s++){const l=e[s],a=n[s];l!==0&&(Bs.fromBufferAttribute(a,i),t?gr.addScaledVector(Bs,l):gr.addScaledVector(Bs.sub(r),l))}r.add(gr)}function Ad(n,e={useGroups:!1,updateIndex:!1,skipAttributes:[]},t=new Xt){const i=n[0].index!==null,{useGroups:r=!1,updateIndex:s=!1,skipAttributes:o=[]}=e,l=new Set(Object.keys(n[0].attributes)),a={};let c=0;t.clearGroups();for(let h=0;h<n.length;++h){const u=n[h];let d=0;if(i!==(u.index!==null))throw new Error("StaticGeometryGenerator: All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.");for(const p in u.attributes){if(!l.has(p))throw new Error('StaticGeometryGenerator: All geometries must have compatible attributes; make sure "'+p+'" attribute exists among all geometries, or in none of them.');a[p]===void 0&&(a[p]=[]),a[p].push(u.attributes[p]),d++}if(d!==l.size)throw new Error("StaticGeometryGenerator: Make sure all geometries have the same number of attributes.");if(r){let p;if(i)p=u.index.count;else if(u.attributes.position!==void 0)p=u.attributes.position.count;else throw new Error("StaticGeometryGenerator: The geometry must have either an index or a position attribute");t.addGroup(c,p,h),c+=p}}if(i){let h=!1;if(!t.index){let u=0;for(let d=0;d<n.length;++d)u+=n[d].index.count;t.setIndex(new me(new Uint32Array(u),1,!1)),h=!0}if(s||h){const u=t.index;let d=0,p=0;for(let f=0;f<n.length;++f){const m=n[f],g=m.index;if(o[f]!==!0)for(let y=0;y<g.count;++y)u.setX(d,g.getX(y)+p),d++;p+=m.attributes.position.count}}}for(const h in a){const u=a[h];if(!(h in t.attributes)){let f=0;for(const m in u)f+=u[m].count;t.setAttribute(h,Gi(a[h][0],f))}const d=t.attributes[h];let p=0;for(let f=0,m=u.length;f<m;f++){const g=u[f];o[f]!==!0&&pc(g,d,p),p+=g.count}}return t}function kd(n,e){if(n===null||e===null)return n===e;if(n.length!==e.length)return!1;for(let t=0,i=n.length;t<i;t++)if(n[t]!==e[t])return!1;return!0}function Rd(n){const{index:e,attributes:t}=n;if(e)for(let i=0,r=e.count;i<r;i+=3){const s=e.getX(i),o=e.getX(i+2);e.setX(i,o),e.setX(i+2,s)}else for(const i in t){const r=t[i],s=r.itemSize;for(let o=0,l=r.count;o<l;o+=3)for(let a=0;a<s;a++){const c=r.getComponent(o,a),h=r.getComponent(o+2,a);r.setComponent(o,a,h),r.setComponent(o+2,a,c)}}return n}class Od{constructor(e){this.matrixWorld=new Be,this.geometryHash=null,this.boneMatrices=null,this.primitiveCount=-1,this.mesh=e,this.update()}update(){const e=this.mesh,t=e.geometry,i=e.skeleton,r=(t.index?t.index.count:t.attributes.position.count)/3;if(this.matrixWorld.copy(e.matrixWorld),this.geometryHash=t.attributes.position.version,this.primitiveCount=r,i){i.boneTexture||i.computeBoneTexture(),i.update();const s=i.boneMatrices;!this.boneMatrices||this.boneMatrices.length!==s.length?this.boneMatrices=s.slice():this.boneMatrices.set(s)}else this.boneMatrices=null}didChange(){const e=this.mesh,t=e.geometry,i=(t.index?t.index.count:t.attributes.position.count)/3;return!(this.matrixWorld.equals(e.matrixWorld)&&this.geometryHash===t.attributes.position.version&&kd(e.skeleton&&e.skeleton.boneMatrices||null,this.boneMatrices)&&this.primitiveCount===i)}}class Bd{constructor(e){Array.isArray(e)||(e=[e]);const t=[];e.forEach(i=>{i.traverseVisible(r=>{r.isMesh&&t.push(r)})}),this.meshes=t,this.useGroups=!0,this.applyWorldTransforms=!0,this.attributes=["position","normal","color","tangent","uv","uv2"],this._intermediateGeometry=new Array(t.length).fill().map(()=>new Xt),this._diffMap=new WeakMap}getMaterials(){const e=[];return this.meshes.forEach(t=>{Array.isArray(t.material)?e.push(...t.material):e.push(t.material)}),e}generate(e=new Xt){let t=[];const{meshes:i,useGroups:r,_intermediateGeometry:s,_diffMap:o}=this;for(let l=0,a=i.length;l<a;l++){const c=i[l],h=s[l],u=o.get(c);!u||u.didChange(c)?(this._convertToStaticGeometry(c,h),t.push(!1),u?u.update():o.set(c,new Od(c))):t.push(!0)}if(s.length===0){e.setIndex(null);const l=e.attributes;for(const a in l)e.deleteAttribute(a);for(const a in this.attributes)e.setAttribute(this.attributes[a],new me(new Float32Array(0),4,!1))}else Ad(s,{useGroups:r,skipAttributes:t},e);for(const l in e.attributes)e.attributes[l].needsUpdate=!0;return e}_convertToStaticGeometry(e,t=new Xt){const i=e.geometry,r=this.applyWorldTransforms,s=this.attributes.includes("normal"),o=this.attributes.includes("tangent"),l=i.attributes,a=t.attributes;!t.index&&i.index&&(t.index=i.index.clone()),a.position||t.setAttribute("position",Gi(l.position)),s&&!a.normal&&l.normal&&t.setAttribute("normal",Gi(l.normal)),o&&!a.tangent&&l.tangent&&t.setAttribute("tangent",Gi(l.tangent)),Ji(i.index,t.index),Ji(l.position,a.position),s&&Ji(l.normal,a.normal),o&&Ji(l.tangent,a.tangent);const c=l.position,h=s?l.normal:null,u=o?l.tangent:null,d=i.morphAttributes.position,p=i.morphAttributes.normal,f=i.morphAttributes.tangent,m=i.morphTargetsRelative,g=e.morphTargetInfluences,y=new Bc;y.getNormalMatrix(e.matrixWorld),i.index&&t.index.array.set(i.index.array);for(let v=0,b=l.position.count;v<b;v++)Lt.fromBufferAttribute(c,v),h&&Vt.fromBufferAttribute(h,v),u&&(lc.fromBufferAttribute(u,v),jt.fromBufferAttribute(u,v)),g&&(d&&Is(d,g,m,v,Lt),p&&Is(p,g,m,v,Vt),f&&Is(f,g,m,v,jt)),e.isSkinnedMesh&&(e.applyBoneTransform(v,Lt),h&&fc(e,v,Vt),u&&fc(e,v,jt)),r&&Lt.applyMatrix4(e.matrixWorld),a.position.setXYZ(v,Lt.x,Lt.y,Lt.z),h&&(r&&Vt.applyNormalMatrix(y),a.normal.setXYZ(v,Vt.x,Vt.y,Vt.z)),u&&(r&&jt.transformDirection(e.matrixWorld),a.tangent.setXYZW(v,jt.x,jt.y,jt.z,lc.w));for(const v in this.attributes){const b=this.attributes[v];b==="position"||b==="tangent"||b==="normal"||!(b in l)||(a[b]||t.setAttribute(b,Gi(l[b])),Ji(l[b],a[b]),pc(l[b],a[b]))}return e.matrixWorld.determinant()<0&&Rd(t),t}}const mc=`
1122
1122
 
1123
1123
  // A stack of uint32 indices can can store the indices for
1124
1124
  // a perfectly balanced tree with a depth up to 31. Lower stack
@@ -1200,7 +1200,7 @@ void ndcToCameraRay(
1200
1200
  rayDirection = direction.xyz;
1201
1201
 
1202
1202
  }
1203
- `,yl=`
1203
+ `,yc=`
1204
1204
 
1205
1205
  float dot2( vec3 v ) {
1206
1206
 
@@ -1385,7 +1385,7 @@ float _bvhClosestPointToPoint(
1385
1385
  return sqrt( closestDistanceSquared );
1386
1386
 
1387
1387
  }
1388
- `,Gl=`
1388
+ `,gc=`
1389
1389
 
1390
1390
  #ifndef TRI_INTERSECT_EPSILON
1391
1391
  #define TRI_INTERSECT_EPSILON 1e-5
@@ -1589,7 +1589,7 @@ bool _bvhIntersectFirstHit(
1589
1589
  return found;
1590
1590
 
1591
1591
  }
1592
- `,Zl=`
1592
+ `,vc=`
1593
1593
  struct BVH {
1594
1594
 
1595
1595
  usampler2D index;
@@ -1599,7 +1599,7 @@ struct BVH {
1599
1599
  usampler2D bvhContents;
1600
1600
 
1601
1601
  };
1602
- `,ku=Object.freeze(Object.defineProperty({__proto__:null,bvh_distance_functions:yl,bvh_ray_functions:Gl,bvh_struct_definitions:Zl,common_functions:bl},Symbol.toStringTag,{value:"Module"})),Nu=Zl,Iu=yl,Ju=`
1603
- ${bl}
1604
- ${Gl}
1605
- `,Uu=Object.freeze(Object.defineProperty({__proto__:null,AVERAGE:Kr,BVHShaderGLSL:ku,CENTER:lo,CONTAINED:co,ExtendedTriangle:He,FloatVertexAttributeTexture:ll,INTERSECTED:rh,IntVertexAttributeTexture:Wu,MeshBVH:xt,MeshBVHHelper:Io,MeshBVHUniformStruct:gu,NOT_INTERSECTED:ah,OrientedBox:Xe,SAH:Mr,StaticGeometryGenerator:Hu,UIntVertexAttributeTexture:rl,VertexAttributeTexture:ys,acceleratedRaycast:Gu,computeBatchedBoundsTree:Lu,computeBoundsTree:Vu,disposeBatchedBoundsTree:xu,disposeBoundsTree:Ru,estimateMemoryInBytes:hu,getBVHExtremes:du,getJSONStructure:pu,getTriangleHitPointInfo:Mh,shaderDistanceFunction:Iu,shaderIntersectFunction:Ju,shaderStructs:Nu,validateBounds:uu},Symbol.toStringTag,{value:"Module"}));class Pu{constructor(e){this.name="WorkerBase",this.running=!1,this.worker=e,this.worker.onerror=t=>{throw t.message?new Error(`${this.name}: Could not create Web Worker with error "${t.message}"`):new Error(`${this.name}: Could not create Web Worker.`)}}runTask(){}generate(...e){if(this.running)throw new Error("GenerateMeshBVHWorker: Already running job.");if(this.worker===null)throw new Error("GenerateMeshBVHWorker: Worker has been disposed.");this.running=!0;const t=this.runTask(this.worker,...e);return t.finally(()=>{this.running=!1}),t}dispose(){this.worker.terminate(),this.worker=null}}const Xl="KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBBbj10eXBlb2YgZG9jdW1lbnQ8InUiP2RvY3VtZW50LmN1cnJlbnRTY3JpcHQ6bnVsbDsvKioKICogQGxpY2Vuc2UKICogQ29weXJpZ2h0IDIwMTAtMjAyNCBUaHJlZS5qcyBBdXRob3JzCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICovY29uc3QgWGU9IjE2OSIsVmk9MCxVaT0xLEVvPTIsTW49MCxraT0zMDAsQ289MzAxLEZvPTMwMixIaT0xZTMsX3M9MTAwMSxxaT0xMDAyLHpzPTEwMDMsJGk9MTAwNixHaT0xMDA4LFJvPTEwMDksQm89MTAxMyxXaT0xMDE0LElvPTEwMTUsdm89MTAxNixQbz0xMDIwLExvPTEwMjMsU249MTAyNixYaT0xMDI3LFlpPTAsT289MSxicz0iIiwkdD0ic3JnYiIsRXM9InNyZ2ItbGluZWFyIixEbz0iZGlzcGxheS1wMyIsWmk9ImRpc3BsYXktcDMtbGluZWFyIixfbj0ibGluZWFyIixKaT0ic3JnYiIsamk9InJlYzcwOSIsUWk9InAzIixDcz0zNTA0NCxZZT0yZTMsem49MjAwMTtjbGFzcyBaZXthZGRFdmVudExpc3RlbmVyKHQsZSl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBzPXRoaXMuX2xpc3RlbmVycztzW3RdPT09dm9pZCAwJiYoc1t0XT1bXSksc1t0XS5pbmRleE9mKGUpPT09LTEmJnNbdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybiExO2NvbnN0IHM9dGhpcy5fbGlzdGVuZXJzO3JldHVybiBzW3RdIT09dm9pZCAwJiZzW3RdLmluZGV4T2YoZSkhPT0tMX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZihuIT09dm9pZCAwKXtjb25zdCBpPW4uaW5kZXhPZihlKTtpIT09LTEmJm4uc3BsaWNlKGksMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBzPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHMhPT12b2lkIDApe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1zLnNsaWNlKDApO2ZvcihsZXQgaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3Qgb3Q9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBLaT0xMjM0NTY3O2NvbnN0IHRyPU1hdGguUEkvMTgwLGVyPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIEt0KCl7Y29uc3Qgcj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCx0PU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLGU9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAscz1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4ob3RbciYyNTVdK290W3I+PjgmMjU1XStvdFtyPj4xNiYyNTVdK290W3I+PjI0JjI1NV0rIi0iK290W3QmMjU1XStvdFt0Pj44JjI1NV0rIi0iK290W3Q+PjE2JjE1fDY0XStvdFt0Pj4yNCYyNTVdKyItIitvdFtlJjYzfDEyOF0rb3RbZT4+OCYyNTVdKyItIitvdFtlPj4xNiYyNTVdK290W2U+PjI0JjI1NV0rb3RbcyYyNTVdK290W3M+PjgmMjU1XStvdFtzPj4xNiYyNTVdK290W3M+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gYXQocix0LGUpe3JldHVybiBNYXRoLm1heCh0LE1hdGgubWluKGUscikpfWZ1bmN0aW9uIGJuKHIsdCl7cmV0dXJuKHIldCt0KSV0fWZ1bmN0aW9uIFZvKHIsdCxlLHMsbil7cmV0dXJuIHMrKHItdCkqKG4tcykvKGUtdCl9ZnVuY3Rpb24gVW8ocix0LGUpe3JldHVybiByIT09dD8oZS1yKS8odC1yKTowfWZ1bmN0aW9uIEplKHIsdCxlKXtyZXR1cm4oMS1lKSpyK2UqdH1mdW5jdGlvbiBrbyhyLHQsZSxzKXtyZXR1cm4gSmUocix0LDEtTWF0aC5leHAoLWUqcykpfWZ1bmN0aW9uIEhvKHIsdD0xKXtyZXR1cm4gdC1NYXRoLmFicyhibihyLHQqMiktdCl9ZnVuY3Rpb24gcW8ocix0LGUpe3JldHVybiByPD10PzA6cj49ZT8xOihyPShyLXQpLyhlLXQpLHIqciooMy0yKnIpKX1mdW5jdGlvbiAkbyhyLHQsZSl7cmV0dXJuIHI8PXQ/MDpyPj1lPzE6KHI9KHItdCkvKGUtdCkscipyKnIqKHIqKHIqNi0xNSkrMTApKX1mdW5jdGlvbiBHbyhyLHQpe3JldHVybiByK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoodC1yKzEpKX1mdW5jdGlvbiBXbyhyLHQpe3JldHVybiByK01hdGgucmFuZG9tKCkqKHQtcil9ZnVuY3Rpb24gWG8ocil7cmV0dXJuIHIqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFlvKHIpe3IhPT12b2lkIDAmJihLaT1yKTtsZXQgdD1LaSs9MTgzMTU2NTgxMztyZXR1cm4gdD1NYXRoLmltdWwodF50Pj4+MTUsdHwxKSx0Xj10K01hdGguaW11bCh0XnQ+Pj43LHR8NjEpLCgodF50Pj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiBabyhyKXtyZXR1cm4gcip0cn1mdW5jdGlvbiBKbyhyKXtyZXR1cm4gciplcn1mdW5jdGlvbiBqbyhyKXtyZXR1cm4ociZyLTEpPT09MCYmciE9PTB9ZnVuY3Rpb24gUW8ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHIpL01hdGguTE4yKSl9ZnVuY3Rpb24gS28ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMikpfWZ1bmN0aW9uIHRhKHIsdCxlLHMsbil7Y29uc3QgaT1NYXRoLmNvcyxvPU1hdGguc2luLGE9aShlLzIpLGM9byhlLzIpLHU9aSgodCtzKS8yKSxoPW8oKHQrcykvMiksbD1pKCh0LXMpLzIpLGQ9bygodC1zKS8yKSxmPWkoKHMtdCkvMikscD1vKChzLXQpLzIpO3N3aXRjaChuKXtjYXNlIlhZWCI6ci5zZXQoYSpoLGMqbCxjKmQsYSp1KTticmVhaztjYXNlIllaWSI6ci5zZXQoYypkLGEqaCxjKmwsYSp1KTticmVhaztjYXNlIlpYWiI6ci5zZXQoYypsLGMqZCxhKmgsYSp1KTticmVhaztjYXNlIlhaWCI6ci5zZXQoYSpoLGMqcCxjKmYsYSp1KTticmVhaztjYXNlIllYWSI6ci5zZXQoYypmLGEqaCxjKnAsYSp1KTticmVhaztjYXNlIlpZWiI6ci5zZXQoYypwLGMqZixhKmgsYSp1KTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbil9fWZ1bmN0aW9uIEV0KHIsdCl7c3dpdGNoKHQuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiByO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIHIvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiByLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gci8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChyLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoci8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KHIvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gJChyLHQpe3N3aXRjaCh0LmNvbnN0cnVjdG9yKXtjYXNlIEZsb2F0MzJBcnJheTpyZXR1cm4gcjtjYXNlIFVpbnQzMkFycmF5OnJldHVybiBNYXRoLnJvdW5kKHIqNDI5NDk2NzI5NSk7Y2FzZSBVaW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjY1NTM1KTtjYXNlIFVpbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioyNTUpO2Nhc2UgSW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjIxNDc0ODM2NDcpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjMyNzY3KTtjYXNlIEludDhBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjEyNyk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWNvbnN0IGVhPXtERUcyUkFEOnRyLFJBRDJERUc6ZXIsZ2VuZXJhdGVVVUlEOkt0LGNsYW1wOmF0LGV1Y2xpZGVhbk1vZHVsbzpibixtYXBMaW5lYXI6Vm8saW52ZXJzZUxlcnA6VW8sbGVycDpKZSxkYW1wOmtvLHBpbmdwb25nOkhvLHNtb290aHN0ZXA6cW8sc21vb3RoZXJzdGVwOiRvLHJhbmRJbnQ6R28scmFuZEZsb2F0OldvLHJhbmRGbG9hdFNwcmVhZDpYbyxzZWVkZWRSYW5kb206WW8sZGVnVG9SYWQ6Wm8scmFkVG9EZWc6Sm8saXNQb3dlck9mVHdvOmpvLGNlaWxQb3dlck9mVHdvOlFvLGZsb29yUG93ZXJPZlR3bzpLbyxzZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyOnRhLG5vcm1hbGl6ZTokLGRlbm9ybWFsaXplOkV0fTtjbGFzcyBKe2NvbnN0cnVjdG9yKHQ9MCxlPTApe0oucHJvdG90eXBlLmlzVmVjdG9yMj0hMCx0aGlzLng9dCx0aGlzLnk9ZX1nZXQgd2lkdGgoKXtyZXR1cm4gdGhpcy54fXNldCB3aWR0aCh0KXt0aGlzLng9dH1nZXQgaGVpZ2h0KCl7cmV0dXJuIHRoaXMueX1zZXQgaGVpZ2h0KHQpe3RoaXMueT10fXNldCh0LGUpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfWNvcHkodCl7cmV0dXJuIHRoaXMueD10LngsdGhpcy55PXQueSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW5bMF0qZStuWzNdKnMrbls2XSx0aGlzLnk9blsxXSplK25bNF0qcytuWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IHM9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoc3x8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLHMpKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoZT09PTApcmV0dXJuIE1hdGguUEkvMjtjb25zdCBzPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhhdChzLC0xLDEpKX1kaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLnNxcnQodGhpcy5kaXN0YW5jZVRvU3F1YXJlZCh0KSl9ZGlzdGFuY2VUb1NxdWFyZWQodCl7Y29uc3QgZT10aGlzLngtdC54LHM9dGhpcy55LXQueTtyZXR1cm4gZSplK3Mqc31tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnl9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLng9dC5nZXRYKGUpLHRoaXMueT10LmdldFkoZSksdGhpc31yb3RhdGVBcm91bmQodCxlKXtjb25zdCBzPU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSksaT10aGlzLngtdC54LG89dGhpcy55LXQueTtyZXR1cm4gdGhpcy54PWkqcy1vKm4rdC54LHRoaXMueT1pKm4rbypzK3QueSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnl9fWNsYXNzIEN0e2NvbnN0cnVjdG9yKHQsZSxzLG4saSxvLGEsYyx1KXtDdC5wcm90b3R5cGUuaXNNYXRyaXgzPSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUscyxuLGksbyxhLGMsdSl9c2V0KHQsZSxzLG4saSxvLGEsYyx1KXtjb25zdCBoPXRoaXMuZWxlbWVudHM7cmV0dXJuIGhbMF09dCxoWzFdPW4saFsyXT1hLGhbM109ZSxoWzRdPWksaFs1XT1jLGhbNl09cyxoWzddPW8saFs4XT11LHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwxLDAsMCwwLDEpLHRoaXN9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO3JldHVybiBlWzBdPXNbMF0sZVsxXT1zWzFdLGVbMl09c1syXSxlWzNdPXNbM10sZVs0XT1zWzRdLGVbNV09c1s1XSxlWzZdPXNbNl0sZVs3XT1zWzddLGVbOF09c1s4XSx0aGlzfWV4dHJhY3RCYXNpcyh0LGUscyl7cmV0dXJuIHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMSkscy5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDIpLHRoaXN9c2V0RnJvbU1hdHJpeDQodCl7Y29uc3QgZT10LmVsZW1lbnRzO3JldHVybiB0aGlzLnNldChlWzBdLGVbNF0sZVs4XSxlWzFdLGVbNV0sZVs5XSxlWzJdLGVbNl0sZVsxMF0pLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgcz10LmVsZW1lbnRzLG49ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1zWzBdLGE9c1szXSxjPXNbNl0sdT1zWzFdLGg9c1s0XSxsPXNbN10sZD1zWzJdLGY9c1s1XSxwPXNbOF0sbT1uWzBdLGc9blszXSx5PW5bNl0sVD1uWzFdLHc9bls0XSxNPW5bN10sTj1uWzJdLF89bls1XSxTPW5bOF07cmV0dXJuIGlbMF09byptK2EqVCtjKk4saVszXT1vKmcrYSp3K2MqXyxpWzZdPW8qeSthKk0rYypTLGlbMV09dSptK2gqVCtsKk4saVs0XT11KmcraCp3K2wqXyxpWzddPXUqeStoKk0rbCpTLGlbMl09ZCptK2YqVCtwKk4saVs1XT1kKmcrZip3K3AqXyxpWzhdPWQqeStmKk0rcCpTLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbM10qPXQsZVs2XSo9dCxlWzFdKj10LGVbNF0qPXQsZVs3XSo9dCxlWzJdKj10LGVbNV0qPXQsZVs4XSo9dCx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxzPXRbMV0sbj10WzJdLGk9dFszXSxvPXRbNF0sYT10WzVdLGM9dFs2XSx1PXRbN10saD10WzhdO3JldHVybiBlKm8qaC1lKmEqdS1zKmkqaCtzKmEqYytuKmkqdS1uKm8qY31pbnZlcnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFsxXSxuPXRbMl0saT10WzNdLG89dFs0XSxhPXRbNV0sYz10WzZdLHU9dFs3XSxoPXRbOF0sbD1oKm8tYSp1LGQ9YSpjLWgqaSxmPXUqaS1vKmMscD1lKmwrcypkK24qZjtpZihwPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IG09MS9wO3JldHVybiB0WzBdPWwqbSx0WzFdPShuKnUtaCpzKSptLHRbMl09KGEqcy1uKm8pKm0sdFszXT1kKm0sdFs0XT0oaCplLW4qYykqbSx0WzVdPShuKmktYSplKSptLHRbNl09ZiptLHRbN109KHMqYy11KmUpKm0sdFs4XT0obyplLXMqaSkqbSx0aGlzfXRyYW5zcG9zZSgpe2xldCB0O2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdD1lWzFdLGVbMV09ZVszXSxlWzNdPXQsdD1lWzJdLGVbMl09ZVs2XSxlWzZdPXQsdD1lWzVdLGVbNV09ZVs3XSxlWzddPXQsdGhpc31nZXROb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQodCkuaW52ZXJ0KCkudHJhbnNwb3NlKCl9dHJhbnNwb3NlSW50b0FycmF5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF0sdGhpc31zZXRVdlRyYW5zZm9ybSh0LGUscyxuLGksbyxhKXtjb25zdCBjPU1hdGguY29zKGkpLHU9TWF0aC5zaW4oaSk7cmV0dXJuIHRoaXMuc2V0KHMqYyxzKnUsLXMqKGMqbyt1KmEpK28rdCwtbip1LG4qYywtbiooLXUqbytjKmEpK2ErZSwwLDAsMSksdGhpc31zY2FsZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEVuLm1ha2VTY2FsZSh0LGUpKSx0aGlzfXJvdGF0ZSh0KXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShFbi5tYWtlUm90YXRpb24oLXQpKSx0aGlzfXRyYW5zbGF0ZSh0LGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KEVuLm1ha2VUcmFuc2xhdGlvbih0LGUpKSx0aGlzfW1ha2VUcmFuc2xhdGlvbih0LGUpe3JldHVybiB0LmlzVmVjdG9yMj90aGlzLnNldCgxLDAsdC54LDAsMSx0LnksMCwwLDEpOnRoaXMuc2V0KDEsMCx0LDAsMSxlLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbih0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLXMsMCxzLGUsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCxlLDAsMCwwLDEpLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7Zm9yKGxldCBuPTA7bjw5O24rKylpZihlW25dIT09c1tuXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgcz0wO3M8OTtzKyspdGhpcy5lbGVtZW50c1tzXT10W3MrZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPXNbMF0sdFtlKzFdPXNbMV0sdFtlKzJdPXNbMl0sdFtlKzNdPXNbM10sdFtlKzRdPXNbNF0sdFtlKzVdPXNbNV0sdFtlKzZdPXNbNl0sdFtlKzddPXNbN10sdFtlKzhdPXNbOF0sdH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX19Y29uc3QgRW49bmV3IEN0O2Z1bmN0aW9uIHNhKHIpe2ZvcihsZXQgdD1yLmxlbmd0aC0xO3Q+PTA7LS10KWlmKHJbdF0+PTY1NTM1KXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHNyKHIpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHIpfWNvbnN0IG5yPW5ldyBDdCgpLnNldCguODIyNDYyMSwuMTc3NTM4LDAsLjAzMzE5NDEsLjk2NjgwNTgsMCwuMDE3MDgyNywuMDcyMzk3NCwuOTEwNTE5OSksaXI9bmV3IEN0KCkuc2V0KDEuMjI0OTQwMSwtLjIyNDk0MDQsMCwtLjA0MjA1NjksMS4wNDIwNTcxLDAsLS4wMTk2Mzc2LC0uMDc4NjM2MSwxLjA5ODI3MzUpLGplPXtbRXNdOnt0cmFuc2ZlcjpfbixwcmltYXJpZXM6amksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjEyNiwuNzE1MiwuMDcyMl0sdG9SZWZlcmVuY2U6cj0+cixmcm9tUmVmZXJlbmNlOnI9PnJ9LFskdF06e3RyYW5zZmVyOkppLHByaW1hcmllczpqaSxsdW1pbmFuY2VDb2VmZmljaWVudHM6Wy4yMTI2LC43MTUyLC4wNzIyXSx0b1JlZmVyZW5jZTpyPT5yLmNvbnZlcnRTUkdCVG9MaW5lYXIoKSxmcm9tUmVmZXJlbmNlOnI9PnIuY29udmVydExpbmVhclRvU1JHQigpfSxbWmldOnt0cmFuc2ZlcjpfbixwcmltYXJpZXM6UWksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6cj0+ci5hcHBseU1hdHJpeDMoaXIpLGZyb21SZWZlcmVuY2U6cj0+ci5hcHBseU1hdHJpeDMobnIpfSxbRG9dOnt0cmFuc2ZlcjpKaSxwcmltYXJpZXM6UWksbHVtaW5hbmNlQ29lZmZpY2llbnRzOlsuMjI4OSwuNjkxNywuMDc5M10sdG9SZWZlcmVuY2U6cj0+ci5jb252ZXJ0U1JHQlRvTGluZWFyKCkuYXBwbHlNYXRyaXgzKGlyKSxmcm9tUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKG5yKS5jb252ZXJ0TGluZWFyVG9TUkdCKCl9fSxuYT1uZXcgU2V0KFtFcyxaaV0pLG10PXtlbmFibGVkOiEwLF93b3JraW5nQ29sb3JTcGFjZTpFcyxnZXQgd29ya2luZ0NvbG9yU3BhY2UoKXtyZXR1cm4gdGhpcy5fd29ya2luZ0NvbG9yU3BhY2V9LHNldCB3b3JraW5nQ29sb3JTcGFjZShyKXtpZighbmEuaGFzKHIpKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgd29ya2luZyBjb2xvciBzcGFjZSwgIiR7cn0iLmApO3RoaXMuX3dvcmtpbmdDb2xvclNwYWNlPXJ9LGNvbnZlcnQ6ZnVuY3Rpb24ocix0LGUpe2lmKHRoaXMuZW5hYmxlZD09PSExfHx0PT09ZXx8IXR8fCFlKXJldHVybiByO2NvbnN0IHM9amVbdF0udG9SZWZlcmVuY2Usbj1qZVtlXS5mcm9tUmVmZXJlbmNlO3JldHVybiBuKHMocikpfSxmcm9tV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocix0KXtyZXR1cm4gdGhpcy5jb252ZXJ0KHIsdGhpcy5fd29ya2luZ0NvbG9yU3BhY2UsdCl9LHRvV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24ocix0KXtyZXR1cm4gdGhpcy5jb252ZXJ0KHIsdCx0aGlzLl93b3JraW5nQ29sb3JTcGFjZSl9LGdldFByaW1hcmllczpmdW5jdGlvbihyKXtyZXR1cm4gamVbcl0ucHJpbWFyaWVzfSxnZXRUcmFuc2ZlcjpmdW5jdGlvbihyKXtyZXR1cm4gcj09PWJzP19uOmplW3JdLnRyYW5zZmVyfSxnZXRMdW1pbmFuY2VDb2VmZmljaWVudHM6ZnVuY3Rpb24ocix0PXRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gci5mcm9tQXJyYXkoamVbdF0ubHVtaW5hbmNlQ29lZmZpY2llbnRzKX19O2Z1bmN0aW9uIHhlKHIpe3JldHVybiByPC4wNDA0NT9yKi4wNzczOTkzODA4Ok1hdGgucG93KHIqLjk0Nzg2NzI5ODYrLjA1MjEzMjcwMTQsMi40KX1mdW5jdGlvbiBDbihyKXtyZXR1cm4gcjwuMDAzMTMwOD9yKjEyLjkyOjEuMDU1Kk1hdGgucG93KHIsLjQxNjY2KS0uMDU1fWxldCBUZTtjbGFzcyBpYXtzdGF0aWMgZ2V0RGF0YVVSTCh0KXtpZigvXmRhdGE6L2kudGVzdCh0LnNyYyl8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudD4idSIpcmV0dXJuIHQuc3JjO2xldCBlO2lmKHQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCllPXQ7ZWxzZXtUZT09PXZvaWQgMCYmKFRlPXNyKCJjYW52YXMiKSksVGUud2lkdGg9dC53aWR0aCxUZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1UZS5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/cy5wdXRJbWFnZURhdGEodCwwLDApOnMuZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9VGV9cmV0dXJuIGUud2lkdGg+MjA0OHx8ZS5oZWlnaHQ+MjA0OD8oY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmdldERhdGFVUkw6IEltYWdlIGNvbnZlcnRlZCB0byBqcGcgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMiLHQpLGUudG9EYXRhVVJMKCJpbWFnZS9qcGVnIiwuNikpOmUudG9EYXRhVVJMKCJpbWFnZS9wbmciKX1zdGF0aWMgc1JHQlRvTGluZWFyKHQpe2lmKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50PCJ1IiYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudDwidSImJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwPCJ1IiYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBlPXNyKCJjYW52YXMiKTtlLndpZHRoPXQud2lkdGgsZS5oZWlnaHQ9dC5oZWlnaHQ7Y29uc3Qgcz1lLmdldENvbnRleHQoIjJkIik7cy5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCk7Y29uc3Qgbj1zLmdldEltYWdlRGF0YSgwLDAsdC53aWR0aCx0LmhlaWdodCksaT1uLmRhdGE7Zm9yKGxldCBvPTA7bzxpLmxlbmd0aDtvKyspaVtvXT14ZShpW29dLzI1NSkqMjU1O3JldHVybiBzLnB1dEltYWdlRGF0YShuLDAsMCksZX1lbHNlIGlmKHQuZGF0YSl7Y29uc3QgZT10LmRhdGEuc2xpY2UoMCk7Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9lW3NdPU1hdGguZmxvb3IoeGUoZVtzXS8yNTUpKjI1NSk6ZVtzXT14ZShlW3NdKTtyZXR1cm57ZGF0YTplLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fX1lbHNlIHJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuc1JHQlRvTGluZWFyKCk6IFVuc3VwcG9ydGVkIGltYWdlIHR5cGUuIE5vIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gYXBwbGllZC4iKSx0fX1sZXQgcmE9MDtjbGFzcyBycntjb25zdHJ1Y3Rvcih0PW51bGwpe3RoaXMuaXNTb3VyY2U9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6cmErK30pLHRoaXMudXVpZD1LdCgpLHRoaXMuZGF0YT10LHRoaXMuZGF0YVJlYWR5PSEwLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXQ9PT12b2lkIDB8fHR5cGVvZiB0PT0ic3RyaW5nIjtpZighZSYmdC5pbWFnZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBzPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LG49dGhpcy5kYXRhO2lmKG4hPT1udWxsKXtsZXQgaTtpZihBcnJheS5pc0FycmF5KG4pKXtpPVtdO2ZvcihsZXQgbz0wLGE9bi5sZW5ndGg7bzxhO28rKyluW29dLmlzRGF0YVRleHR1cmU/aS5wdXNoKEZuKG5bb10uaW1hZ2UpKTppLnB1c2goRm4obltvXSkpfWVsc2UgaT1GbihuKTtzLnVybD1pfXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1zKSxzfX1mdW5jdGlvbiBGbihyKXtyZXR1cm4gdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQ8InUiJiZyIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50PCJ1IiYmciBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHx0eXBlb2YgSW1hZ2VCaXRtYXA8InUiJiZyIGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA/aWEuZ2V0RGF0YVVSTChyKTpyLmRhdGE/e2RhdGE6QXJyYXkuZnJvbShyLmRhdGEpLHdpZHRoOnIud2lkdGgsaGVpZ2h0OnIuaGVpZ2h0LHR5cGU6ci5kYXRhLmNvbnN0cnVjdG9yLm5hbWV9Oihjb25zb2xlLndhcm4oIlRIUkVFLlRleHR1cmU6IFVuYWJsZSB0byBzZXJpYWxpemUgVGV4dHVyZS4iKSx7fSl9bGV0IG9hPTA7Y2xhc3MgRHQgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0PUR0LkRFRkFVTFRfSU1BR0UsZT1EdC5ERUZBVUxUX01BUFBJTkcscz1fcyxuPV9zLGk9JGksbz1HaSxhPUxvLGM9Um8sdT1EdC5ERUZBVUxUX0FOSVNPVFJPUFksaD1icyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpvYSsrfSksdGhpcy51dWlkPUt0KCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyBycih0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy5jaGFubmVsPTAsdGhpcy53cmFwUz1zLHRoaXMud3JhcFQ9bix0aGlzLm1hZ0ZpbHRlcj1pLHRoaXMubWluRmlsdGVyPW8sdGhpcy5hbmlzb3Ryb3B5PXUsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPWMsdGhpcy5vZmZzZXQ9bmV3IEooMCwwKSx0aGlzLnJlcGVhdD1uZXcgSigxLDEpLHRoaXMuY2VudGVyPW5ldyBKKDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgQ3QsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmNvbG9yU3BhY2U9aCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudmVyc2lvbj0wLHRoaXMub25VcGRhdGU9bnVsbCx0aGlzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMSx0aGlzLnBtcmVtVmVyc2lvbj0wfWdldCBpbWFnZSgpe3JldHVybiB0aGlzLnNvdXJjZS5kYXRhfXNldCBpbWFnZSh0PW51bGwpe3RoaXMuc291cmNlLmRhdGE9dH11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSh0aGlzLm9mZnNldC54LHRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy5jaGFubmVsPXQuY2hhbm5lbCx0aGlzLndyYXBTPXQud3JhcFMsdGhpcy53cmFwVD10LndyYXBULHRoaXMubWFnRmlsdGVyPXQubWFnRmlsdGVyLHRoaXMubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMuYW5pc290cm9weT10LmFuaXNvdHJvcHksdGhpcy5mb3JtYXQ9dC5mb3JtYXQsdGhpcy5pbnRlcm5hbEZvcm1hdD10LmludGVybmFsRm9ybWF0LHRoaXMudHlwZT10LnR5cGUsdGhpcy5vZmZzZXQuY29weSh0Lm9mZnNldCksdGhpcy5yZXBlYXQuY29weSh0LnJlcGVhdCksdGhpcy5jZW50ZXIuY29weSh0LmNlbnRlciksdGhpcy5yb3RhdGlvbj10LnJvdGF0aW9uLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMsdGhpcy5wcmVtdWx0aXBseUFscGhhPXQucHJlbXVsdGlwbHlBbHBoYSx0aGlzLmZsaXBZPXQuZmxpcFksdGhpcy51bnBhY2tBbGlnbm1lbnQ9dC51bnBhY2tBbGlnbm1lbnQsdGhpcy5jb2xvclNwYWNlPXQuY29sb3JTcGFjZSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT10PT09dm9pZCAwfHx0eXBlb2YgdD09InN0cmluZyI7aWYoIWUmJnQudGV4dHVyZXNbdGhpcy51dWlkXSE9PXZvaWQgMClyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IHM9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcsY2hhbm5lbDp0aGlzLmNoYW5uZWwscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCxpbnRlcm5hbEZvcm1hdDp0aGlzLmludGVybmFsRm9ybWF0LHR5cGU6dGhpcy50eXBlLGNvbG9yU3BhY2U6dGhpcy5jb2xvclNwYWNlLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihzLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09cyksc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PWtpKXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgSGk6dC54PXQueC1NYXRoLmZsb29yKHQueCk7YnJlYWs7Y2FzZSBfczp0Lng9dC54PDA/MDoxO2JyZWFrO2Nhc2UgcWk6TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpPT09MT90Lng9TWF0aC5jZWlsKHQueCktdC54OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrfWlmKHQueTwwfHx0Lnk+MSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSBIaTp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIF9zOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSBxaTpNYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik9PT0xP3QueT1NYXRoLmNlaWwodC55KS10Lnk6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWt9cmV0dXJuIHRoaXMuZmxpcFkmJih0Lnk9MS10LnkpLHR9c2V0IG5lZWRzVXBkYXRlKHQpe3Q9PT0hMCYmKHRoaXMudmVyc2lvbisrLHRoaXMuc291cmNlLm5lZWRzVXBkYXRlPSEwKX1zZXQgbmVlZHNQTVJFTVVwZGF0ZSh0KXt0PT09ITAmJnRoaXMucG1yZW1WZXJzaW9uKyt9fUR0LkRFRkFVTFRfSU1BR0U9bnVsbCxEdC5ERUZBVUxUX01BUFBJTkc9a2ksRHQuREVGQVVMVF9BTklTT1RST1BZPTQ7Y2xhc3MgRnR7Y29uc3RydWN0b3IodD0wLGU9MCxzPTAsbj0xKXtGdC5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1zLHRoaXMudz1ufWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxzLG4pe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzLnc9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXQudyE9PXZvaWQgMD90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dGhpcy56LGk9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKnMrb1s4XSpuK29bMTJdKmksdGhpcy55PW9bMV0qZStvWzVdKnMrb1s5XSpuK29bMTNdKmksdGhpcy56PW9bMl0qZStvWzZdKnMrb1sxMF0qbitvWzE0XSppLHRoaXMudz1vWzNdKmUrb1s3XSpzK29bMTFdKm4rb1sxNV0qaSx0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUscyxuLGk7Y29uc3QgYz10LmVsZW1lbnRzLHU9Y1swXSxoPWNbNF0sbD1jWzhdLGQ9Y1sxXSxmPWNbNV0scD1jWzldLG09Y1syXSxnPWNbNl0seT1jWzEwXTtpZihNYXRoLmFicyhoLWQpPC4wMSYmTWF0aC5hYnMobC1tKTwuMDEmJk1hdGguYWJzKHAtZyk8LjAxKXtpZihNYXRoLmFicyhoK2QpPC4xJiZNYXRoLmFicyhsK20pPC4xJiZNYXRoLmFicyhwK2cpPC4xJiZNYXRoLmFicyh1K2YreS0zKTwuMSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpcztlPU1hdGguUEk7Y29uc3Qgdz0odSsxKS8yLE09KGYrMSkvMixOPSh5KzEpLzIsXz0oaCtkKS80LFM9KGwrbSkvNCxFPShwK2cpLzQ7cmV0dXJuIHc+TSYmdz5OP3c8LjAxPyhzPTAsbj0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSk6KHM9TWF0aC5zcXJ0KHcpLG49Xy9zLGk9Uy9zKTpNPk4/TTwuMDE/KHM9LjcwNzEwNjc4MSxuPTAsaT0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoTSkscz1fL24saT1FL24pOk48LjAxPyhzPS43MDcxMDY3ODEsbj0uNzA3MTA2NzgxLGk9MCk6KGk9TWF0aC5zcXJ0KE4pLHM9Uy9pLG49RS9pKSx0aGlzLnNldChzLG4saSxlKSx0aGlzfWxldCBUPU1hdGguc3FydCgoZy1wKSooZy1wKSsobC1tKSoobC1tKSsoZC1oKSooZC1oKSk7cmV0dXJuIE1hdGguYWJzKFQpPC4wMDEmJihUPTEpLHRoaXMueD0oZy1wKS9ULHRoaXMueT0obC1tKS9ULHRoaXMuej0oZC1oKS9ULHRoaXMudz1NYXRoLmFjb3MoKHUrZit5LTEpLzIpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpcy53PWVbMTVdLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5taW4odGhpcy53LHQudyksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpcy56PU1hdGgubWF4KHRoaXMueix0LnopLHRoaXMudz1NYXRoLm1heCh0aGlzLncsdC53KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LncsTWF0aC5taW4oZS53LHRoaXMudykpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpcy53PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLncpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3Qgcz10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihzfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUscykpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpcy56PU1hdGguZmxvb3IodGhpcy56KSx0aGlzLnc9TWF0aC5mbG9vcih0aGlzLncpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzLnc9TWF0aC5jZWlsKHRoaXMudyksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpcy56PU1hdGgucm91bmQodGhpcy56KSx0aGlzLnc9TWF0aC5yb3VuZCh0aGlzLncpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpcy53PU1hdGgudHJ1bmModGhpcy53KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzLnc9LXRoaXMudyx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0LnordGhpcy53KnQud31sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMudyl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzLnorPSh0LnotdGhpcy56KSplLHRoaXMudys9KHQudy10aGlzLncpKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXMudz10LncrKGUudy10LncpKnMsdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnomJnQudz09PXRoaXMud31mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpcy53PXRbZSszXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdFtlKzNdPXRoaXMudyx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMueCx5aWVsZCB0aGlzLnkseWllbGQgdGhpcy56LHlpZWxkIHRoaXMud319Y2xhc3Mgb3IgZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcih0PTEsZT0xLHM9e30pe3N1cGVyKCksdGhpcy5pc1JlbmRlclRhcmdldD0hMCx0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPTEsdGhpcy5zY2lzc29yPW5ldyBGdCgwLDAsdCxlKSx0aGlzLnNjaXNzb3JUZXN0PSExLHRoaXMudmlld3BvcnQ9bmV3IEZ0KDAsMCx0LGUpO2NvbnN0IG49e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6MX07cz1PYmplY3QuYXNzaWduKHtnZW5lcmF0ZU1pcG1hcHM6ITEsaW50ZXJuYWxGb3JtYXQ6bnVsbCxtaW5GaWx0ZXI6JGksZGVwdGhCdWZmZXI6ITAsc3RlbmNpbEJ1ZmZlcjohMSxyZXNvbHZlRGVwdGhCdWZmZXI6ITAscmVzb2x2ZVN0ZW5jaWxCdWZmZXI6ITAsZGVwdGhUZXh0dXJlOm51bGwsc2FtcGxlczowLGNvdW50OjF9LHMpO2NvbnN0IGk9bmV3IER0KG4scy5tYXBwaW5nLHMud3JhcFMscy53cmFwVCxzLm1hZ0ZpbHRlcixzLm1pbkZpbHRlcixzLmZvcm1hdCxzLnR5cGUscy5hbmlzb3Ryb3B5LHMuY29sb3JTcGFjZSk7aS5mbGlwWT0hMSxpLmdlbmVyYXRlTWlwbWFwcz1zLmdlbmVyYXRlTWlwbWFwcyxpLmludGVybmFsRm9ybWF0PXMuaW50ZXJuYWxGb3JtYXQsdGhpcy50ZXh0dXJlcz1bXTtjb25zdCBvPXMuY291bnQ7Zm9yKGxldCBhPTA7YTxvO2ErKyl0aGlzLnRleHR1cmVzW2FdPWkuY2xvbmUoKSx0aGlzLnRleHR1cmVzW2FdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMDt0aGlzLmRlcHRoQnVmZmVyPXMuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXMuc3RlbmNpbEJ1ZmZlcix0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlcj1zLnJlc29sdmVEZXB0aEJ1ZmZlcix0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyPXMucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9cy5kZXB0aFRleHR1cmUsdGhpcy5zYW1wbGVzPXMuc2FtcGxlc31nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLnRleHR1cmVzWzBdfXNldCB0ZXh0dXJlKHQpe3RoaXMudGV4dHVyZXNbMF09dH1zZXRTaXplKHQsZSxzPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1zKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPXM7Zm9yKGxldCBuPTAsaT10aGlzLnRleHR1cmVzLmxlbmd0aDtuPGk7bisrKXRoaXMudGV4dHVyZXNbbl0uaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmVzW25dLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZXNbbl0uaW1hZ2UuZGVwdGg9czt0aGlzLmRpc3Bvc2UoKX10aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzLmRlcHRoPXQuZGVwdGgsdGhpcy5zY2lzc29yLmNvcHkodC5zY2lzc29yKSx0aGlzLnNjaXNzb3JUZXN0PXQuc2Npc3NvclRlc3QsdGhpcy52aWV3cG9ydC5jb3B5KHQudmlld3BvcnQpLHRoaXMudGV4dHVyZXMubGVuZ3RoPTA7Zm9yKGxldCBzPTAsbj10LnRleHR1cmVzLmxlbmd0aDtzPG47cysrKXRoaXMudGV4dHVyZXNbc109dC50ZXh0dXJlc1tzXS5jbG9uZSgpLHRoaXMudGV4dHVyZXNbc10uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwO2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7fSx0LnRleHR1cmUuaW1hZ2UpO3JldHVybiB0aGlzLnRleHR1cmUuc291cmNlPW5ldyBycihlKSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLnJlc29sdmVEZXB0aEJ1ZmZlcj10LnJlc29sdmVEZXB0aEJ1ZmZlcix0aGlzLnJlc29sdmVTdGVuY2lsQnVmZmVyPXQucmVzb2x2ZVN0ZW5jaWxCdWZmZXIsdC5kZXB0aFRleHR1cmUhPT1udWxsJiYodGhpcy5kZXB0aFRleHR1cmU9dC5kZXB0aFRleHR1cmUuY2xvbmUoKSksdGhpcy5zYW1wbGVzPXQuc2FtcGxlcyx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNsYXNzIFFle2NvbnN0cnVjdG9yKHQ9MCxlPTAscz0wLG49MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1ufXN0YXRpYyBzbGVycEZsYXQodCxlLHMsbixpLG8sYSl7bGV0IGM9c1tuKzBdLHU9c1tuKzFdLGg9c1tuKzJdLGw9c1tuKzNdO2NvbnN0IGQ9aVtvKzBdLGY9aVtvKzFdLHA9aVtvKzJdLG09aVtvKzNdO2lmKGE9PT0wKXt0W2UrMF09Yyx0W2UrMV09dSx0W2UrMl09aCx0W2UrM109bDtyZXR1cm59aWYoYT09PTEpe3RbZSswXT1kLHRbZSsxXT1mLHRbZSsyXT1wLHRbZSszXT1tO3JldHVybn1pZihsIT09bXx8YyE9PWR8fHUhPT1mfHxoIT09cCl7bGV0IGc9MS1hO2NvbnN0IHk9YypkK3UqZitoKnArbCptLFQ9eT49MD8xOi0xLHc9MS15Knk7aWYodz5OdW1iZXIuRVBTSUxPTil7Y29uc3QgTj1NYXRoLnNxcnQodyksXz1NYXRoLmF0YW4yKE4seSpUKTtnPU1hdGguc2luKGcqXykvTixhPU1hdGguc2luKGEqXykvTn1jb25zdCBNPWEqVDtpZihjPWMqZytkKk0sdT11KmcrZipNLGg9aCpnK3AqTSxsPWwqZyttKk0sZz09PTEtYSl7Y29uc3QgTj0xL01hdGguc3FydChjKmMrdSp1K2gqaCtsKmwpO2MqPU4sdSo9TixoKj1OLGwqPU59fXRbZV09Yyx0W2UrMV09dSx0W2UrMl09aCx0W2UrM109bH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLHMsbixpLG8pe2NvbnN0IGE9c1tuXSxjPXNbbisxXSx1PXNbbisyXSxoPXNbbiszXSxsPWlbb10sZD1pW28rMV0sZj1pW28rMl0scD1pW28rM107cmV0dXJuIHRbZV09YSpwK2gqbCtjKmYtdSpkLHRbZSsxXT1jKnAraCpkK3UqbC1hKmYsdFtlKzJdPXUqcCtoKmYrYSpkLWMqbCx0W2UrM109aCpwLWEqbC1jKmQtdSpmLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUscyxuKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PXMsdGhpcy5fdz1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGU9ITApe2NvbnN0IHM9dC5feCxuPXQuX3ksaT10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxjPU1hdGguc2luLHU9YShzLzIpLGg9YShuLzIpLGw9YShpLzIpLGQ9YyhzLzIpLGY9YyhuLzIpLHA9YyhpLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1kKmgqbCt1KmYqcCx0aGlzLl95PXUqZipsK2QqaCpwLHRoaXMuX3o9dSpoKnAtZCpmKmwsdGhpcy5fdz11KmgqbC1kKmYqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1kKmgqbC11KmYqcCx0aGlzLl95PXUqZipsLWQqaCpwLHRoaXMuX3o9dSpoKnArZCpmKmwsdGhpcy5fdz11KmgqbCtkKmYqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuIGU9PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZSh0LGUpe2NvbnN0IHM9ZS8yLG49TWF0aC5zaW4ocyk7cmV0dXJuIHRoaXMuX3g9dC54Km4sdGhpcy5feT10Lnkqbix0aGlzLl96PXQueipuLHRoaXMuX3c9TWF0aC5jb3MocyksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpe2NvbnN0IGU9dC5lbGVtZW50cyxzPWVbMF0sbj1lWzRdLGk9ZVs4XSxvPWVbMV0sYT1lWzVdLGM9ZVs5XSx1PWVbMl0saD1lWzZdLGw9ZVsxMF0sZD1zK2ErbDtpZihkPjApe2NvbnN0IGY9LjUvTWF0aC5zcXJ0KGQrMSk7dGhpcy5fdz0uMjUvZix0aGlzLl94PShoLWMpKmYsdGhpcy5feT0oaS11KSpmLHRoaXMuX3o9KG8tbikqZn1lbHNlIGlmKHM+YSYmcz5sKXtjb25zdCBmPTIqTWF0aC5zcXJ0KDErcy1hLWwpO3RoaXMuX3c9KGgtYykvZix0aGlzLl94PS4yNSpmLHRoaXMuX3k9KG4rbykvZix0aGlzLl96PShpK3UpL2Z9ZWxzZSBpZihhPmwpe2NvbnN0IGY9MipNYXRoLnNxcnQoMSthLXMtbCk7dGhpcy5fdz0oaS11KS9mLHRoaXMuX3g9KG4rbykvZix0aGlzLl95PS4yNSpmLHRoaXMuX3o9KGMraCkvZn1lbHNle2NvbnN0IGY9MipNYXRoLnNxcnQoMStsLXMtYSk7dGhpcy5fdz0oby1uKS9mLHRoaXMuX3g9KGkrdSkvZix0aGlzLl95PShjK2gpL2YsdGhpcy5fej0uMjUqZn1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKHQsZSl7bGV0IHM9dC5kb3QoZSkrMTtyZXR1cm4gczxOdW1iZXIuRVBTSUxPTj8ocz0wLE1hdGguYWJzKHQueCk+TWF0aC5hYnModC56KT8odGhpcy5feD0tdC55LHRoaXMuX3k9dC54LHRoaXMuX3o9MCx0aGlzLl93PXMpOih0aGlzLl94PTAsdGhpcy5feT0tdC56LHRoaXMuX3o9dC55LHRoaXMuX3c9cykpOih0aGlzLl94PXQueSplLnotdC56KmUueSx0aGlzLl95PXQueiplLngtdC54KmUueix0aGlzLl96PXQueCplLnktdC55KmUueCx0aGlzLl93PXMpLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyh0KXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoYXQodGhpcy5kb3QodCksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKHQsZSl7Y29uc3Qgcz10aGlzLmFuZ2xlVG8odCk7aWYocz09PTApcmV0dXJuIHRoaXM7Y29uc3Qgbj1NYXRoLm1pbigxLGUvcyk7cmV0dXJuIHRoaXMuc2xlcnAodCxuKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMuX3gqdC5feCt0aGlzLl95KnQuX3krdGhpcy5feip0Ll96K3RoaXMuX3cqdC5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCB0PXRoaXMubGVuZ3RoKCk7cmV0dXJuIHQ9PT0wPyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOih0PTEvdCx0aGlzLl94PXRoaXMuX3gqdCx0aGlzLl95PXRoaXMuX3kqdCx0aGlzLl96PXRoaXMuX3oqdCx0aGlzLl93PXRoaXMuX3cqdCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModCx0aGlzKX1tdWx0aXBseVF1YXRlcm5pb25zKHQsZSl7Y29uc3Qgcz10Ll94LG49dC5feSxpPXQuX3osbz10Ll93LGE9ZS5feCxjPWUuX3ksdT1lLl96LGg9ZS5fdztyZXR1cm4gdGhpcy5feD1zKmgrbyphK24qdS1pKmMsdGhpcy5feT1uKmgrbypjK2kqYS1zKnUsdGhpcy5fej1pKmgrbyp1K3MqYy1uKmEsdGhpcy5fdz1vKmgtcyphLW4qYy1pKnUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnAodCxlKXtpZihlPT09MClyZXR1cm4gdGhpcztpZihlPT09MSlyZXR1cm4gdGhpcy5jb3B5KHQpO2NvbnN0IHM9dGhpcy5feCxuPXRoaXMuX3ksaT10aGlzLl96LG89dGhpcy5fdztsZXQgYT1vKnQuX3crcyp0Ll94K24qdC5feStpKnQuX3o7aWYoYTwwPyh0aGlzLl93PS10Ll93LHRoaXMuX3g9LXQuX3gsdGhpcy5feT0tdC5feSx0aGlzLl96PS10Ll96LGE9LWEpOnRoaXMuY29weSh0KSxhPj0xKXJldHVybiB0aGlzLl93PW8sdGhpcy5feD1zLHRoaXMuX3k9bix0aGlzLl96PWksdGhpcztjb25zdCBjPTEtYSphO2lmKGM8PU51bWJlci5FUFNJTE9OKXtjb25zdCBmPTEtZTtyZXR1cm4gdGhpcy5fdz1mKm8rZSp0aGlzLl93LHRoaXMuX3g9ZipzK2UqdGhpcy5feCx0aGlzLl95PWYqbitlKnRoaXMuX3ksdGhpcy5fej1mKmkrZSp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpc31jb25zdCB1PU1hdGguc3FydChjKSxoPU1hdGguYXRhbjIodSxhKSxsPU1hdGguc2luKCgxLWUpKmgpL3UsZD1NYXRoLnNpbihlKmgpL3U7cmV0dXJuIHRoaXMuX3c9bypsK3RoaXMuX3cqZCx0aGlzLl94PXMqbCt0aGlzLl94KmQsdGhpcy5feT1uKmwrdGhpcy5feSpkLHRoaXMuX3o9aSpsK3RoaXMuX3oqZCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxzKXtyZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUscyl9cmFuZG9tKCl7Y29uc3QgdD0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxlPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpLHM9TWF0aC5yYW5kb20oKSxuPU1hdGguc3FydCgxLXMpLGk9TWF0aC5zcXJ0KHMpO3JldHVybiB0aGlzLnNldChuKk1hdGguc2luKHQpLG4qTWF0aC5jb3ModCksaSpNYXRoLnNpbihlKSxpKk1hdGguY29zKGUpKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBBe2NvbnN0cnVjdG9yKHQ9MCxlPTAscz0wKXtBLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PXN9c2V0KHQsZSxzKXtyZXR1cm4gcz09PXZvaWQgMCYmKHM9dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9cyx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGFyLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oYXIuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbM10qcytpWzZdKm4sdGhpcy55PWlbMV0qZStpWzRdKnMraVs3XSpuLHRoaXMuej1pWzJdKmUraVs1XSpzK2lbOF0qbix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzLG89MS8oaVszXSplK2lbN10qcytpWzExXSpuK2lbMTVdKTtyZXR1cm4gdGhpcy54PShpWzBdKmUraVs0XSpzK2lbOF0qbitpWzEyXSkqbyx0aGlzLnk9KGlbMV0qZStpWzVdKnMraVs5XSpuK2lbMTNdKSpvLHRoaXMuej0oaVsyXSplK2lbNl0qcytpWzEwXSpuK2lbMTRdKSpvLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LHM9dGhpcy55LG49dGhpcy56LGk9dC54LG89dC55LGE9dC56LGM9dC53LHU9MioobypuLWEqcyksaD0yKihhKmUtaSpuKSxsPTIqKGkqcy1vKmUpO3JldHVybiB0aGlzLng9ZStjKnUrbypsLWEqaCx0aGlzLnk9cytjKmgrYSp1LWkqbCx0aGlzLno9bitjKmwraSpoLW8qdSx0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngscz10aGlzLnksbj10aGlzLnosaT10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSplK2lbNF0qcytpWzhdKm4sdGhpcy55PWlbMV0qZStpWzVdKnMraVs5XSpuLHRoaXMuej1pWzJdKmUraVs2XSpzK2lbMTBdKm4sdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBzPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHN8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxzKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUscyl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKnMsdGhpcy55PXQueSsoZS55LXQueSkqcyx0aGlzLno9dC56KyhlLnotdC56KSpzLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3Qgcz10Lngsbj10LnksaT10Lnosbz1lLngsYT1lLnksYz1lLno7cmV0dXJuIHRoaXMueD1uKmMtaSphLHRoaXMueT1pKm8tcypjLHRoaXMuej1zKmEtbipvLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKGU9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgcz10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIocyl9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIFJuLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKFJuKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihSbi5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKGU9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgcz10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoYXQocywtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxzPXRoaXMueS10Lnksbj10aGlzLnotdC56O3JldHVybiBlKmUrcypzK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUscyl7Y29uc3Qgbj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9bipNYXRoLnNpbihzKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9bipNYXRoLmNvcyhzKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUscyl7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1zLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxzPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1zLHRoaXMuej1uLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLGUqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cyxlKjMpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31zZXRGcm9tQ29sb3IodCl7cmV0dXJuIHRoaXMueD10LnIsdGhpcy55PXQuZyx0aGlzLno9dC5iLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpcy56PXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMueCx0W2UrMV09dGhpcy55LHRbZSsyXT10aGlzLnosdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpKk1hdGguUEkqMixlPU1hdGgucmFuZG9tKCkqMi0xLHM9TWF0aC5zcXJ0KDEtZSplKTtyZXR1cm4gdGhpcy54PXMqTWF0aC5jb3ModCksdGhpcy55PWUsdGhpcy56PXMqTWF0aC5zaW4odCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgUm49bmV3IEEsYXI9bmV3IFFlO2NsYXNzIGh0e2NvbnN0cnVjdG9yKHQ9bmV3IEEoMS8wLDEvMCwxLzApLGU9bmV3IEEoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrPTMpdGhpcy5leHBhbmRCeVBvaW50KFJ0LmZyb21BcnJheSh0LGUpKTtyZXR1cm4gdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAscz10LmNvdW50O2U8cztlKyspdGhpcy5leHBhbmRCeVBvaW50KFJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSk7cmV0dXJuIHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLHM9dC5sZW5ndGg7ZTxzO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBzPVJ0LmNvcHkoZSkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLnN1YihzKSx0aGlzLm1heC5jb3B5KHQpLmFkZChzKSx0aGlzfXNldEZyb21PYmplY3QodCxlPSExKXtyZXR1cm4gdGhpcy5tYWtlRW1wdHkoKSx0aGlzLmV4cGFuZEJ5T2JqZWN0KHQsZSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3Qgcz10Lmdlb21ldHJ5O2lmKHMhPT12b2lkIDApe2NvbnN0IGk9cy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZT09PSEwJiZpIT09dm9pZCAwJiZ0LmlzSW5zdGFuY2VkTWVzaCE9PSEwKWZvcihsZXQgbz0wLGE9aS5jb3VudDtvPGE7bysrKXQuaXNNZXNoPT09ITA/dC5nZXRWZXJ0ZXhQb3NpdGlvbihvLFJ0KTpSdC5mcm9tQnVmZmVyQXR0cmlidXRlKGksbyksUnQuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChSdCk7ZWxzZSB0LmJvdW5kaW5nQm94IT09dm9pZCAwPyh0LmJvdW5kaW5nQm94PT09bnVsbCYmdC5jb21wdXRlQm91bmRpbmdCb3goKSxGcy5jb3B5KHQuYm91bmRpbmdCb3gpKToocy5ib3VuZGluZ0JveD09PW51bGwmJnMuY29tcHV0ZUJvdW5kaW5nQm94KCksRnMuY29weShzLmJvdW5kaW5nQm94KSksRnMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oRnMpfWNvbnN0IG49dC5jaGlsZHJlbjtmb3IobGV0IGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspdGhpcy5leHBhbmRCeU9iamVjdChuW2ldLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQueD49dGhpcy5taW4ueCYmdC54PD10aGlzLm1heC54JiZ0Lnk+PXRoaXMubWluLnkmJnQueTw9dGhpcy5tYXgueSYmdC56Pj10aGlzLm1pbi56JiZ0Lno8PXRoaXMubWF4Lnp9Y29udGFpbnNCb3godCl7cmV0dXJuIHRoaXMubWluLng8PXQubWluLngmJnQubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PXQubWluLnkmJnQubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PXQubWluLnomJnQubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKHQsZSl7cmV0dXJuIGUuc2V0KCh0LngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKHQueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwodC56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0Lm1heC54Pj10aGlzLm1pbi54JiZ0Lm1pbi54PD10aGlzLm1heC54JiZ0Lm1heC55Pj10aGlzLm1pbi55JiZ0Lm1pbi55PD10aGlzLm1heC55JiZ0Lm1heC56Pj10aGlzLm1pbi56JiZ0Lm1pbi56PD10aGlzLm1heC56fWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuY2xhbXBQb2ludCh0LmNlbnRlcixSdCksUnQuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUscztyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxzPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LHM9dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxzKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnkscys9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixzKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnoscys9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmcz49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKEtlKSxScy5zdWJWZWN0b3JzKHRoaXMubWF4LEtlKSxOZS5zdWJWZWN0b3JzKHQuYSxLZSksd2Uuc3ViVmVjdG9ycyh0LmIsS2UpLEFlLnN1YlZlY3RvcnModC5jLEtlKSx0ZS5zdWJWZWN0b3JzKHdlLE5lKSxlZS5zdWJWZWN0b3JzKEFlLHdlKSx1ZS5zdWJWZWN0b3JzKE5lLEFlKTtsZXQgZT1bMCwtdGUueix0ZS55LDAsLWVlLnosZWUueSwwLC11ZS56LHVlLnksdGUueiwwLC10ZS54LGVlLnosMCwtZWUueCx1ZS56LDAsLXVlLngsLXRlLnksdGUueCwwLC1lZS55LGVlLngsMCwtdWUueSx1ZS54LDBdO3JldHVybiFCbihlLE5lLHdlLEFlLFJzKXx8KGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhQm4oZSxOZSx3ZSxBZSxScykpPyExOihCcy5jcm9zc1ZlY3RvcnModGUsZWUpLGU9W0JzLngsQnMueSxCcy56XSxCbihlLE5lLHdlLEFlLFJzKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KHQsUnQpLmRpc3RhbmNlVG8odCl9Z2V0Qm91bmRpbmdTcGhlcmUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3QubWFrZUVtcHR5KCk6KHRoaXMuZ2V0Q2VudGVyKHQuY2VudGVyKSx0LnJhZGl1cz10aGlzLmdldFNpemUoUnQpLmxlbmd0aCgpKi41KSx0fWludGVyc2VjdCh0KXtyZXR1cm4gdGhpcy5taW4ubWF4KHQubWluKSx0aGlzLm1heC5taW4odC5tYXgpLHRoaXMuaXNFbXB0eSgpJiZ0aGlzLm1ha2VFbXB0eSgpLHRoaXN9dW5pb24odCl7cmV0dXJuIHRoaXMubWluLm1pbih0Lm1pbiksdGhpcy5tYXgubWF4KHQubWF4KSx0aGlzfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dGhpczooR3RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksR3RbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksR3RbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKEd0KSx0aGlzKX10cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IEd0PVtuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQSxuZXcgQV0sUnQ9bmV3IEEsRnM9bmV3IGh0LE5lPW5ldyBBLHdlPW5ldyBBLEFlPW5ldyBBLHRlPW5ldyBBLGVlPW5ldyBBLHVlPW5ldyBBLEtlPW5ldyBBLFJzPW5ldyBBLEJzPW5ldyBBLGxlPW5ldyBBO2Z1bmN0aW9uIEJuKHIsdCxlLHMsbil7Zm9yKGxldCBpPTAsbz1yLmxlbmd0aC0zO2k8PW87aSs9Myl7bGUuZnJvbUFycmF5KHIsaSk7Y29uc3QgYT1uLngqTWF0aC5hYnMobGUueCkrbi55Kk1hdGguYWJzKGxlLnkpK24ueipNYXRoLmFicyhsZS56KSxjPXQuZG90KGxlKSx1PWUuZG90KGxlKSxoPXMuZG90KGxlKTtpZihNYXRoLm1heCgtTWF0aC5tYXgoYyx1LGgpLE1hdGgubWluKGMsdSxoKSk+YSlyZXR1cm4hMX1yZXR1cm4hMH1jb25zdCBhYT1uZXcgaHQsdHM9bmV3IEEsSW49bmV3IEE7Y2xhc3MgY3J7Y29uc3RydWN0b3IodD1uZXcgQSxlPS0xKXt0aGlzLmlzU3BoZXJlPSEwLHRoaXMuY2VudGVyPXQsdGhpcy5yYWRpdXM9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz1lLHRoaXN9c2V0RnJvbVBvaW50cyh0LGUpe2NvbnN0IHM9dGhpcy5jZW50ZXI7ZSE9PXZvaWQgMD9zLmNvcHkoZSk6YWEuc2V0RnJvbVBvaW50cyh0KS5nZXRDZW50ZXIocyk7bGV0IG49MDtmb3IobGV0IGk9MCxvPXQubGVuZ3RoO2k8bztpKyspbj1NYXRoLm1heChuLHMuZGlzdGFuY2VUb1NxdWFyZWQodFtpXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQobiksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHQuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucmFkaXVzK3QucmFkaXVzO3JldHVybiB0LmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PWUqZX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKHQpe3JldHVybiBNYXRoLmFicyh0LmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KHQsZSl7Y29uc3Qgcz10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0KTtyZXR1cm4gZS5jb3B5KHQpLHM+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihlLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksZS5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksZX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KHQubWFrZUVtcHR5KCksdCk6KHQuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSx0LmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSx0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCh0KSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyp0LmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZCh0KSx0aGlzfWV4cGFuZEJ5UG9pbnQodCl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9MCx0aGlzO3RzLnN1YlZlY3RvcnModCx0aGlzLmNlbnRlcik7Y29uc3QgZT10cy5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHM9TWF0aC5zcXJ0KGUpLG49KHMtdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3Rvcih0cyxuL3MpLHRoaXMucmFkaXVzKz1ufXJldHVybiB0aGlzfXVuaW9uKHQpe3JldHVybiB0LmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkodCksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyh0LmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyx0LnJhZGl1cyk6KEluLnN1YlZlY3RvcnModC5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aCh0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KHRzLmNvcHkodC5jZW50ZXIpLmFkZChJbikpLHRoaXMuZXhwYW5kQnlQb2ludCh0cy5jb3B5KHQuY2VudGVyKS5zdWIoSW4pKSksdGhpcyl9ZXF1YWxzKHQpe3JldHVybiB0LmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZ0LnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgbnR7Y29uc3RydWN0b3IodCxlLHMsbixpLG8sYSxjLHUsaCxsLGQsZixwLG0sZyl7bnQucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx0IT09dm9pZCAwJiZ0aGlzLnNldCh0LGUscyxuLGksbyxhLGMsdSxoLGwsZCxmLHAsbSxnKX1zZXQodCxlLHMsbixpLG8sYSxjLHUsaCxsLGQsZixwLG0sZyl7Y29uc3QgeT10aGlzLmVsZW1lbnRzO3JldHVybiB5WzBdPXQseVs0XT1lLHlbOF09cyx5WzEyXT1uLHlbMV09aSx5WzVdPW8seVs5XT1hLHlbMTNdPWMseVsyXT11LHlbNl09aCx5WzEwXT1sLHlbMTRdPWQseVszXT1mLHlbN109cCx5WzExXT1tLHlbMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBudCgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09c1swXSxlWzFdPXNbMV0sZVsyXT1zWzJdLGVbM109c1szXSxlWzRdPXNbNF0sZVs1XT1zWzVdLGVbNl09c1s2XSxlWzddPXNbN10sZVs4XT1zWzhdLGVbOV09c1s5XSxlWzEwXT1zWzEwXSxlWzExXT1zWzExXSxlWzEyXT1zWzEyXSxlWzEzXT1zWzEzXSxlWzE0XT1zWzE0XSxlWzE1XT1zWzE1XSx0aGlzfWNvcHlQb3NpdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO3JldHVybiBlWzEyXT1zWzEyXSxlWzEzXT1zWzEzXSxlWzE0XT1zWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzNdLGVbNl0sMCxlWzFdLGVbNF0sZVs3XSwwLGVbMl0sZVs1XSxlWzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXModCxlLHMpe3JldHVybiB0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSxlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxzLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyh0LGUscyl7cmV0dXJuIHRoaXMuc2V0KHQueCxlLngscy54LDAsdC55LGUueSxzLnksMCx0LnosZS56LHMueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxzPXQuZWxlbWVudHMsbj0xL01lLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPTEvTWUuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9NZS5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIGVbMF09c1swXSpuLGVbMV09c1sxXSpuLGVbMl09c1syXSpuLGVbM109MCxlWzRdPXNbNF0qaSxlWzVdPXNbNV0qaSxlWzZdPXNbNl0qaSxlWzddPTAsZVs4XT1zWzhdKm8sZVs5XT1zWzldKm8sZVsxMF09c1sxMF0qbyxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LG49dC55LGk9dC56LG89TWF0aC5jb3MocyksYT1NYXRoLnNpbihzKSxjPU1hdGguY29zKG4pLHU9TWF0aC5zaW4obiksaD1NYXRoLmNvcyhpKSxsPU1hdGguc2luKGkpO2lmKHQub3JkZXI9PT0iWFlaIil7Y29uc3QgZD1vKmgsZj1vKmwscD1hKmgsbT1hKmw7ZVswXT1jKmgsZVs0XT0tYypsLGVbOF09dSxlWzFdPWYrcCp1LGVbNV09ZC1tKnUsZVs5XT0tYSpjLGVbMl09bS1kKnUsZVs2XT1wK2YqdSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IllYWiIpe2NvbnN0IGQ9YypoLGY9YypsLHA9dSpoLG09dSpsO2VbMF09ZCttKmEsZVs0XT1wKmEtZixlWzhdPW8qdSxlWzFdPW8qbCxlWzVdPW8qaCxlWzldPS1hLGVbMl09ZiphLXAsZVs2XT1tK2QqYSxlWzEwXT1vKmN9ZWxzZSBpZih0Lm9yZGVyPT09IlpYWSIpe2NvbnN0IGQ9YypoLGY9YypsLHA9dSpoLG09dSpsO2VbMF09ZC1tKmEsZVs0XT0tbypsLGVbOF09cCtmKmEsZVsxXT1mK3AqYSxlWzVdPW8qaCxlWzldPW0tZCphLGVbMl09LW8qdSxlWzZdPWEsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJaWVgiKXtjb25zdCBkPW8qaCxmPW8qbCxwPWEqaCxtPWEqbDtlWzBdPWMqaCxlWzRdPXAqdS1mLGVbOF09ZCp1K20sZVsxXT1jKmwsZVs1XT1tKnUrZCxlWzldPWYqdS1wLGVbMl09LXUsZVs2XT1hKmMsZVsxMF09bypjfWVsc2UgaWYodC5vcmRlcj09PSJZWlgiKXtjb25zdCBkPW8qYyxmPW8qdSxwPWEqYyxtPWEqdTtlWzBdPWMqaCxlWzRdPW0tZCpsLGVbOF09cCpsK2YsZVsxXT1sLGVbNV09bypoLGVbOV09LWEqaCxlWzJdPS11KmgsZVs2XT1mKmwrcCxlWzEwXT1kLW0qbH1lbHNlIGlmKHQub3JkZXI9PT0iWFpZIil7Y29uc3QgZD1vKmMsZj1vKnUscD1hKmMsbT1hKnU7ZVswXT1jKmgsZVs0XT0tbCxlWzhdPXUqaCxlWzFdPWQqbCttLGVbNV09bypoLGVbOV09ZipsLXAsZVsyXT1wKmwtZixlWzZdPWEqaCxlWzEwXT1tKmwrZH1yZXR1cm4gZVszXT0wLGVbN109MCxlWzExXT0wLGVbMTJdPTAsZVsxM109MCxlWzE0XT0wLGVbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5jb21wb3NlKGNhLHQsaGEpfWxvb2tBdCh0LGUscyl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiB5dC5zdWJWZWN0b3JzKHQsZSkseXQubGVuZ3RoU3EoKT09PTAmJih5dC56PTEpLHl0Lm5vcm1hbGl6ZSgpLHNlLmNyb3NzVmVjdG9ycyhzLHl0KSxzZS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKHMueik9PT0xP3l0LngrPTFlLTQ6eXQueis9MWUtNCx5dC5ub3JtYWxpemUoKSxzZS5jcm9zc1ZlY3RvcnMocyx5dCkpLHNlLm5vcm1hbGl6ZSgpLElzLmNyb3NzVmVjdG9ycyh5dCxzZSksblswXT1zZS54LG5bNF09SXMueCxuWzhdPXl0LngsblsxXT1zZS55LG5bNV09SXMueSxuWzldPXl0LnksblsyXT1zZS56LG5bNl09SXMueixuWzEwXT15dC56LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLHQpfXByZW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModCx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKHQsZSl7Y29uc3Qgcz10LmVsZW1lbnRzLG49ZS5lbGVtZW50cyxpPXRoaXMuZWxlbWVudHMsbz1zWzBdLGE9c1s0XSxjPXNbOF0sdT1zWzEyXSxoPXNbMV0sbD1zWzVdLGQ9c1s5XSxmPXNbMTNdLHA9c1syXSxtPXNbNl0sZz1zWzEwXSx5PXNbMTRdLFQ9c1szXSx3PXNbN10sTT1zWzExXSxOPXNbMTVdLF89blswXSxTPW5bNF0sRT1uWzhdLEY9blsxMl0sUj1uWzFdLEk9bls1XSxCPW5bOV0sUD1uWzEzXSxMPW5bMl0sVj1uWzZdLEc9blsxMF0sTnQ9blsxNF0sSHQ9blszXSxxdD1uWzddLE5uPW5bMTFdLHduPW5bMTVdO3JldHVybiBpWzBdPW8qXythKlIrYypMK3UqSHQsaVs0XT1vKlMrYSpJK2MqVit1KnF0LGlbOF09bypFK2EqQitjKkcrdSpObixpWzEyXT1vKkYrYSpQK2MqTnQrdSp3bixpWzFdPWgqXytsKlIrZCpMK2YqSHQsaVs1XT1oKlMrbCpJK2QqVitmKnF0LGlbOV09aCpFK2wqQitkKkcrZipObixpWzEzXT1oKkYrbCpQK2QqTnQrZip3bixpWzJdPXAqXyttKlIrZypMK3kqSHQsaVs2XT1wKlMrbSpJK2cqVit5KnF0LGlbMTBdPXAqRSttKkIrZypHK3kqTm4saVsxNF09cCpGK20qUCtnKk50K3kqd24saVszXT1UKl8rdypSK00qTCtOKkh0LGlbN109VCpTK3cqSStNKlYrTipxdCxpWzExXT1UKkUrdypCK00qRytOKk5uLGlbMTVdPVQqRit3KlArTSpOdCtOKnduLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLHM9dFs0XSxuPXRbOF0saT10WzEyXSxvPXRbMV0sYT10WzVdLGM9dFs5XSx1PXRbMTNdLGg9dFsyXSxsPXRbNl0sZD10WzEwXSxmPXRbMTRdLHA9dFszXSxtPXRbN10sZz10WzExXSx5PXRbMTVdO3JldHVybiBwKigraSpjKmwtbip1KmwtaSphKmQrcyp1KmQrbiphKmYtcypjKmYpK20qKCtlKmMqZi1lKnUqZCtpKm8qZC1uKm8qZituKnUqaC1pKmMqaCkrZyooK2UqdSpsLWUqYSpmLWkqbypsK3MqbypmK2kqYSpoLXMqdSpoKSt5KigtbiphKmgtZSpjKmwrZSphKmQrbipvKmwtcypvKmQrcypjKmgpfXRyYW5zcG9zZSgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztsZXQgZTtyZXR1cm4gZT10WzFdLHRbMV09dFs0XSx0WzRdPWUsZT10WzJdLHRbMl09dFs4XSx0WzhdPWUsZT10WzZdLHRbNl09dFs5XSx0WzldPWUsZT10WzNdLHRbM109dFsxMl0sdFsxMl09ZSxlPXRbN10sdFs3XT10WzEzXSx0WzEzXT1lLGU9dFsxMV0sdFsxMV09dFsxNF0sdFsxNF09ZSx0aGlzfXNldFBvc2l0aW9uKHQsZSxzKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQuaXNWZWN0b3IzPyhuWzEyXT10LngsblsxM109dC55LG5bMTRdPXQueik6KG5bMTJdPXQsblsxM109ZSxuWzE0XT1zKSx0aGlzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0scz10WzFdLG49dFsyXSxpPXRbM10sbz10WzRdLGE9dFs1XSxjPXRbNl0sdT10WzddLGg9dFs4XSxsPXRbOV0sZD10WzEwXSxmPXRbMTFdLHA9dFsxMl0sbT10WzEzXSxnPXRbMTRdLHk9dFsxNV0sVD1sKmcqdS1tKmQqdSttKmMqZi1hKmcqZi1sKmMqeSthKmQqeSx3PXAqZCp1LWgqZyp1LXAqYypmK28qZypmK2gqYyp5LW8qZCp5LE09aCptKnUtcCpsKnUrcCphKmYtbyptKmYtaCphKnkrbypsKnksTj1wKmwqYy1oKm0qYy1wKmEqZCtvKm0qZCtoKmEqZy1vKmwqZyxfPWUqVCtzKncrbipNK2kqTjtpZihfPT09MClyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgUz0xL187cmV0dXJuIHRbMF09VCpTLHRbMV09KG0qZCppLWwqZyppLW0qbipmK3MqZypmK2wqbip5LXMqZCp5KSpTLHRbMl09KGEqZyppLW0qYyppK20qbip1LXMqZyp1LWEqbip5K3MqYyp5KSpTLHRbM109KGwqYyppLWEqZCppLWwqbip1K3MqZCp1K2EqbipmLXMqYypmKSpTLHRbNF09dypTLHRbNV09KGgqZyppLXAqZCppK3AqbipmLWUqZypmLWgqbip5K2UqZCp5KSpTLHRbNl09KHAqYyppLW8qZyppLXAqbip1K2UqZyp1K28qbip5LWUqYyp5KSpTLHRbN109KG8qZCppLWgqYyppK2gqbip1LWUqZCp1LW8qbipmK2UqYypmKSpTLHRbOF09TSpTLHRbOV09KHAqbCppLWgqbSppLXAqcypmK2UqbSpmK2gqcyp5LWUqbCp5KSpTLHRbMTBdPShvKm0qaS1wKmEqaStwKnMqdS1lKm0qdS1vKnMqeStlKmEqeSkqUyx0WzExXT0oaCphKmktbypsKmktaCpzKnUrZSpsKnUrbypzKmYtZSphKmYpKlMsdFsxMl09TipTLHRbMTNdPShoKm0qbi1wKmwqbitwKnMqZC1lKm0qZC1oKnMqZytlKmwqZykqUyx0WzE0XT0ocCphKm4tbyptKm4tcCpzKmMrZSptKmMrbypzKmctZSphKmcpKlMsdFsxNV09KG8qbCpuLWgqYSpuK2gqcypjLWUqbCpjLW8qcypkK2UqYSpkKSpTLHRoaXN9c2NhbGUodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHM9dC54LG49dC55LGk9dC56O3JldHVybiBlWzBdKj1zLGVbNF0qPW4sZVs4XSo9aSxlWzFdKj1zLGVbNV0qPW4sZVs5XSo9aSxlWzJdKj1zLGVbNl0qPW4sZVsxMF0qPWksZVszXSo9cyxlWzddKj1uLGVbMTFdKj1pLHRoaXN9Z2V0TWF4U2NhbGVPbkF4aXMoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSxzPXRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLG49dFs4XSp0WzhdK3RbOV0qdFs5XSt0WzEwXSp0WzEwXTtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KGUscyxuKSl9bWFrZVRyYW5zbGF0aW9uKHQsZSxzKXtyZXR1cm4gdC5pc1ZlY3RvcjM/dGhpcy5zZXQoMSwwLDAsdC54LDAsMSwwLHQueSwwLDAsMSx0LnosMCwwLDAsMSk6dGhpcy5zZXQoMSwwLDAsdCwwLDEsMCxlLDAsMCwxLHMsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25YKHQpe2NvbnN0IGU9TWF0aC5jb3ModCkscz1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLGUsLXMsMCwwLHMsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWSh0KXtjb25zdCBlPU1hdGguY29zKHQpLHM9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsMCxzLDAsMCwxLDAsMCwtcywwLGUsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbloodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxzPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldChlLC1zLDAsMCxzLGUsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25BeGlzKHQsZSl7Y29uc3Qgcz1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLGk9MS1zLG89dC54LGE9dC55LGM9dC56LHU9aSpvLGg9aSphO3JldHVybiB0aGlzLnNldCh1Km8rcyx1KmEtbipjLHUqYytuKmEsMCx1KmErbipjLGgqYStzLGgqYy1uKm8sMCx1KmMtbiphLGgqYytuKm8saSpjKmMrcywwLDAsMCwwLDEpLHRoaXN9bWFrZVNjYWxlKHQsZSxzKXtyZXR1cm4gdGhpcy5zZXQodCwwLDAsMCwwLGUsMCwwLDAsMCxzLDAsMCwwLDAsMSksdGhpc31tYWtlU2hlYXIodCxlLHMsbixpLG8pe3JldHVybiB0aGlzLnNldCgxLHMsaSwwLHQsMSxvLDAsZSxuLDEsMCwwLDAsMCwxKSx0aGlzfWNvbXBvc2UodCxlLHMpe2NvbnN0IG49dGhpcy5lbGVtZW50cyxpPWUuX3gsbz1lLl95LGE9ZS5feixjPWUuX3csdT1pK2ksaD1vK28sbD1hK2EsZD1pKnUsZj1pKmgscD1pKmwsbT1vKmgsZz1vKmwseT1hKmwsVD1jKnUsdz1jKmgsTT1jKmwsTj1zLngsXz1zLnksUz1zLno7cmV0dXJuIG5bMF09KDEtKG0reSkpKk4sblsxXT0oZitNKSpOLG5bMl09KHAtdykqTixuWzNdPTAsbls0XT0oZi1NKSpfLG5bNV09KDEtKGQreSkpKl8sbls2XT0oZytUKSpfLG5bN109MCxuWzhdPShwK3cpKlMsbls5XT0oZy1UKSpTLG5bMTBdPSgxLShkK20pKSpTLG5bMTFdPTAsblsxMl09dC54LG5bMTNdPXQueSxuWzE0XT10LnosblsxNV09MSx0aGlzfWRlY29tcG9zZSh0LGUscyl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO2xldCBpPU1lLnNldChuWzBdLG5bMV0sblsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1NZS5zZXQobls0XSxuWzVdLG5bNl0pLmxlbmd0aCgpLGE9TWUuc2V0KG5bOF0sbls5XSxuWzEwXSkubGVuZ3RoKCk7dGhpcy5kZXRlcm1pbmFudCgpPDAmJihpPS1pKSx0Lng9blsxMl0sdC55PW5bMTNdLHQuej1uWzE0XSxCdC5jb3B5KHRoaXMpO2NvbnN0IHU9MS9pLGg9MS9vLGw9MS9hO3JldHVybiBCdC5lbGVtZW50c1swXSo9dSxCdC5lbGVtZW50c1sxXSo9dSxCdC5lbGVtZW50c1syXSo9dSxCdC5lbGVtZW50c1s0XSo9aCxCdC5lbGVtZW50c1s1XSo9aCxCdC5lbGVtZW50c1s2XSo9aCxCdC5lbGVtZW50c1s4XSo9bCxCdC5lbGVtZW50c1s5XSo9bCxCdC5lbGVtZW50c1sxMF0qPWwsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoQnQpLHMueD1pLHMueT1vLHMuej1hLHRoaXN9bWFrZVBlcnNwZWN0aXZlKHQsZSxzLG4saSxvLGE9WWUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cyx1PTIqaS8oZS10KSxoPTIqaS8ocy1uKSxsPShlK3QpLyhlLXQpLGQ9KHMrbikvKHMtbik7bGV0IGYscDtpZihhPT09WWUpZj0tKG8raSkvKG8taSkscD0tMipvKmkvKG8taSk7ZWxzZSBpZihhPT09em4pZj0tby8oby1pKSxwPS1vKmkvKG8taSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk1hdHJpeDQubWFrZVBlcnNwZWN0aXZlKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrYSk7cmV0dXJuIGNbMF09dSxjWzRdPTAsY1s4XT1sLGNbMTJdPTAsY1sxXT0wLGNbNV09aCxjWzldPWQsY1sxM109MCxjWzJdPTAsY1s2XT0wLGNbMTBdPWYsY1sxNF09cCxjWzNdPTAsY1s3XT0wLGNbMTFdPS0xLGNbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxzLG4saSxvLGE9WWUpe2NvbnN0IGM9dGhpcy5lbGVtZW50cyx1PTEvKGUtdCksaD0xLyhzLW4pLGw9MS8oby1pKSxkPShlK3QpKnUsZj0ocytuKSpoO2xldCBwLG07aWYoYT09PVllKXA9KG8raSkqbCxtPS0yKmw7ZWxzZSBpZihhPT09em4pcD1pKmwsbT0tMSpsO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VPcnRob2dyYXBoaWMoKTogSW52YWxpZCBjb29yZGluYXRlIHN5c3RlbTogIithKTtyZXR1cm4gY1swXT0yKnUsY1s0XT0wLGNbOF09MCxjWzEyXT0tZCxjWzFdPTAsY1s1XT0yKmgsY1s5XT0wLGNbMTNdPS1mLGNbMl09MCxjWzZdPTAsY1sxMF09bSxjWzE0XT0tcCxjWzNdPTAsY1s3XT0wLGNbMTFdPTAsY1sxNV09MSx0aGlzfWVxdWFscyh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMscz10LmVsZW1lbnRzO2ZvcihsZXQgbj0wO248MTY7bisrKWlmKGVbbl0hPT1zW25dKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBzPTA7czwxNjtzKyspdGhpcy5lbGVtZW50c1tzXT10W3MrZV07cmV0dXJuIHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7Y29uc3Qgcz10aGlzLmVsZW1lbnRzO3JldHVybiB0W2VdPXNbMF0sdFtlKzFdPXNbMV0sdFtlKzJdPXNbMl0sdFtlKzNdPXNbM10sdFtlKzRdPXNbNF0sdFtlKzVdPXNbNV0sdFtlKzZdPXNbNl0sdFtlKzddPXNbN10sdFtlKzhdPXNbOF0sdFtlKzldPXNbOV0sdFtlKzEwXT1zWzEwXSx0W2UrMTFdPXNbMTFdLHRbZSsxMl09c1sxMl0sdFtlKzEzXT1zWzEzXSx0W2UrMTRdPXNbMTRdLHRbZSsxNV09c1sxNV0sdH19Y29uc3QgTWU9bmV3IEEsQnQ9bmV3IG50LGNhPW5ldyBBKDAsMCwwKSxoYT1uZXcgQSgxLDEsMSksc2U9bmV3IEEsSXM9bmV3IEEseXQ9bmV3IEEsaHI9bmV3IG50LHVyPW5ldyBRZTtjbGFzcyB2c3tjb25zdHJ1Y3Rvcih0PTAsZT0wLHM9MCxuPXZzLkRFRkFVTFRfT1JERVIpe3RoaXMuaXNFdWxlcj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1ufWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCBvcmRlcigpe3JldHVybiB0aGlzLl9vcmRlcn1zZXQgb3JkZXIodCl7dGhpcy5fb3JkZXI9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9c2V0KHQsZSxzLG49dGhpcy5fb3JkZXIpe3JldHVybiB0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9cyx0aGlzLl9vcmRlcj1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX29yZGVyKX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQuX3gsdGhpcy5feT10Ll95LHRoaXMuX3o9dC5feix0aGlzLl9vcmRlcj10Ll9vcmRlcix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCxlPXRoaXMuX29yZGVyLHM9ITApe2NvbnN0IG49dC5lbGVtZW50cyxpPW5bMF0sbz1uWzRdLGE9bls4XSxjPW5bMV0sdT1uWzVdLGg9bls5XSxsPW5bMl0sZD1uWzZdLGY9blsxMF07c3dpdGNoKGUpe2Nhc2UiWFlaIjp0aGlzLl95PU1hdGguYXNpbihhdChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGYpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihkLHUpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1hdChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKGEsZiksdGhpcy5fej1NYXRoLmF0YW4yKGMsdSkpOih0aGlzLl95PU1hdGguYXRhbjIoLWwsaSksdGhpcy5fej0wKTticmVhaztjYXNlIlpYWSI6dGhpcy5feD1NYXRoLmFzaW4oYXQoZCwtMSwxKSksTWF0aC5hYnMoZCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMigtbCxmKSx0aGlzLl96PU1hdGguYXRhbjIoLW8sdSkpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKGMsaSkpO2JyZWFrO2Nhc2UiWllYIjp0aGlzLl95PU1hdGguYXNpbigtYXQobCwtMSwxKSksTWF0aC5hYnMobCk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihkLGYpLHRoaXMuX3o9TWF0aC5hdGFuMihjLGkpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyx1KSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKGF0KGMsLTEsMSkpLE1hdGguYWJzKGMpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoLWgsdSksdGhpcy5feT1NYXRoLmF0YW4yKC1sLGkpKToodGhpcy5feD0wLHRoaXMuX3k9TWF0aC5hdGFuMihhLGYpKTticmVhaztjYXNlIlhaWSI6dGhpcy5fej1NYXRoLmFzaW4oLWF0KG8sLTEsMSkpLE1hdGguYWJzKG8pPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZCx1KSx0aGlzLl95PU1hdGguYXRhbjIoYSxpKSk6KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxmKSx0aGlzLl95PTApO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrZSl9cmV0dXJuIHRoaXMuX29yZGVyPWUscz09PSEwJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUXVhdGVybmlvbih0LGUscyl7cmV0dXJuIGhyLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KGhyLGUscyl9c2V0RnJvbVZlY3RvcjModCxlPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5zZXQodC54LHQueSx0LnosZSl9cmVvcmRlcih0KXtyZXR1cm4gdXIuc2V0RnJvbUV1bGVyKHRoaXMpLHRoaXMuc2V0RnJvbVF1YXRlcm5pb24odXIsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdFszXSE9PXZvaWQgMCYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9X29uQ2hhbmdlKHQpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPXQsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl9vcmRlcn19dnMuREVGQVVMVF9PUkRFUj0iWFlaIjtjbGFzcyB1YXtjb25zdHJ1Y3Rvcigpe3RoaXMubWFzaz0xfXNldCh0KXt0aGlzLm1hc2s9KDE8PHR8MCk+Pj4wfWVuYWJsZSh0KXt0aGlzLm1hc2t8PTE8PHR8MH1lbmFibGVBbGwoKXt0aGlzLm1hc2s9LTF9dG9nZ2xlKHQpe3RoaXMubWFza149MTw8dHwwfWRpc2FibGUodCl7dGhpcy5tYXNrJj1+KDE8PHR8MCl9ZGlzYWJsZUFsbCgpe3RoaXMubWFzaz0wfXRlc3QodCl7cmV0dXJuKHRoaXMubWFzayZ0Lm1hc2spIT09MH1pc0VuYWJsZWQodCl7cmV0dXJuKHRoaXMubWFzayYoMTw8dHwwKSkhPT0wfX1sZXQgbGE9MDtjb25zdCBscj1uZXcgQSxTZT1uZXcgUWUsV3Q9bmV3IG50LFBzPW5ldyBBLGVzPW5ldyBBLGRhPW5ldyBBLGZhPW5ldyBRZSxkcj1uZXcgQSgxLDAsMCksZnI9bmV3IEEoMCwxLDApLHByPW5ldyBBKDAsMCwxKSxtcj17dHlwZToiYWRkZWQifSxwYT17dHlwZToicmVtb3ZlZCJ9LF9lPXt0eXBlOiJjaGlsZGFkZGVkIixjaGlsZDpudWxsfSx2bj17dHlwZToiY2hpbGRyZW1vdmVkIixjaGlsZDpudWxsfTtjbGFzcyBuZSBleHRlbmRzIFple2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6bGErK30pLHRoaXMudXVpZD1LdCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1uZS5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgdD1uZXcgQSxlPW5ldyB2cyxzPW5ldyBRZSxuPW5ldyBBKDEsMSwxKTtmdW5jdGlvbiBpKCl7cy5zZXRGcm9tRXVsZXIoZSwhMSl9ZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24ocyx2b2lkIDAsITEpfWUuX29uQ2hhbmdlKGkpLHMuX29uQ2hhbmdlKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6c30sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm59LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IG50fSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBDdH19KSx0aGlzLm1hdHJpeD1uZXcgbnQsdGhpcy5tYXRyaXhXb3JsZD1uZXcgbnQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPW5lLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPW5lLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgdWEsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSh0KSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkodCksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUodCxlKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh0LGUpfXNldFJvdGF0aW9uRnJvbUV1bGVyKHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIodCwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KHQpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgodCl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbih0KXt0aGlzLnF1YXRlcm5pb24uY29weSh0KX1yb3RhdGVPbkF4aXModCxlKXtyZXR1cm4gU2Uuc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShTZSksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBTZS5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KFNlKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGRyLHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGZyLHQpfXJvdGF0ZVoodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKHByLHQpfXRyYW5zbGF0ZU9uQXhpcyh0LGUpe3JldHVybiBsci5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKGxyLm11bHRpcGx5U2NhbGFyKGUpKSx0aGlzfXRyYW5zbGF0ZVgodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGRyLHQpfXRyYW5zbGF0ZVkodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGZyLHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKHByLHQpfWxvY2FsVG9Xb3JsZCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NChXdC5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQodCxlLHMpe3QuaXNWZWN0b3IzP1BzLmNvcHkodCk6UHMuc2V0KHQsZSxzKTtjb25zdCBuPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGVzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/V3QubG9va0F0KGVzLFBzLHRoaXMudXApOld0Lmxvb2tBdChQcyxlcyx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KFd0KSxuJiYoV3QuZXh0cmFjdFJvdGF0aW9uKG4ubWF0cml4V29ybGQpLFNlLnNldEZyb21Sb3RhdGlvbk1hdHJpeChXdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KFNlLmludmVydCgpKSl9YWRkKHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCBlPTA7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl0aGlzLmFkZChhcmd1bWVudHNbZV0pO3JldHVybiB0aGlzfXJldHVybiB0PT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIix0KSx0aGlzKToodCYmdC5pc09iamVjdDNEPyh0LnJlbW92ZUZyb21QYXJlbnQoKSx0LnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaCh0KSx0LmRpc3BhdGNoRXZlbnQobXIpLF9lLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KF9lKSxfZS5jaGlsZD1udWxsKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIix0KSx0aGlzKX1yZW1vdmUodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHM9MDtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tzXSk7cmV0dXJuIHRoaXN9Y29uc3QgZT10aGlzLmNoaWxkcmVuLmluZGV4T2YodCk7cmV0dXJuIGUhPT0tMSYmKHQucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UoZSwxKSx0LmRpc3BhdGNoRXZlbnQocGEpLHZuLmNoaWxkPXQsdGhpcy5kaXNwYXRjaEV2ZW50KHZuKSx2bi5jaGlsZD1udWxsKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCB0PXRoaXMucGFyZW50O3JldHVybiB0IT09bnVsbCYmdC5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2godCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFd0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksdC5wYXJlbnQhPT1udWxsJiYodC5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFd0Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoV3QpLHQucmVtb3ZlRnJvbVBhcmVudCgpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHQuZGlzcGF0Y2hFdmVudChtciksX2UuY2hpbGQ9dCx0aGlzLmRpc3BhdGNoRXZlbnQoX2UpLF9lLmNoaWxkPW51bGwsdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgcz0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7czxuO3MrKyl7Y29uc3Qgbz10aGlzLmNoaWxkcmVuW3NdLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZihvIT09dm9pZCAwKXJldHVybiBvfX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUscz1bXSl7dGhpc1t0XT09PWUmJnMucHVzaCh0aGlzKTtjb25zdCBuPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBpPTAsbz1uLmxlbmd0aDtpPG87aSsrKW5baV0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlLHMpO3JldHVybiBzfWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoZXMsdCxkYSksdH1nZXRXb3JsZFNjYWxlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShlcyxmYSx0KSx0fWdldFdvcmxkRGlyZWN0aW9uKHQpe3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IGU9dGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztyZXR1cm4gdC5zZXQoZVs4XSxlWzldLGVbMTBdKS5ub3JtYWxpemUoKX1yYXljYXN0KCl7fXRyYXZlcnNlKHQpe3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG49ZS5sZW5ndGg7czxuO3MrKyllW3NdLnRyYXZlcnNlKHQpfXRyYXZlcnNlVmlzaWJsZSh0KXtpZih0aGlzLnZpc2libGU9PT0hMSlyZXR1cm47dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBzPTAsbj1lLmxlbmd0aDtzPG47cysrKWVbc10udHJhdmVyc2VWaXNpYmxlKHQpfXRyYXZlcnNlQW5jZXN0b3JzKHQpe2NvbnN0IGU9dGhpcy5wYXJlbnQ7ZSE9PW51bGwmJih0KGUpLGUudHJhdmVyc2VBbmNlc3RvcnModCkpfXVwZGF0ZU1hdHJpeCgpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSwodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHx0KSYmKHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITAmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLG49ZS5sZW5ndGg7czxuO3MrKyllW3NdLnVwZGF0ZU1hdHJpeFdvcmxkKHQpfXVwZGF0ZVdvcmxkTWF0cml4KHQsZSl7Y29uc3Qgcz10aGlzLnBhcmVudDtpZih0PT09ITAmJnMhPT1udWxsJiZzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9PT0hMCYmKHRoaXMucGFyZW50PT09bnVsbD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCkpLGU9PT0hMCl7Y29uc3Qgbj10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG89bi5sZW5ndGg7aTxvO2krKyluW2ldLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciLHM9e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LHMubWV0YWRhdGE9e3ZlcnNpb246NC42LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgbj17fTtuLnV1aWQ9dGhpcy51dWlkLG4udHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihuLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNhc3RTaGFkb3c9PT0hMCYmKG4uY2FzdFNoYWRvdz0hMCksdGhpcy5yZWNlaXZlU2hhZG93PT09ITAmJihuLnJlY2VpdmVTaGFkb3c9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLmZydXN0dW1DdWxsZWQ9PT0hMSYmKG4uZnJ1c3R1bUN1bGxlZD0hMSksdGhpcy5yZW5kZXJPcmRlciE9PTAmJihuLnJlbmRlck9yZGVyPXRoaXMucmVuZGVyT3JkZXIpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxuLmxheWVycz10aGlzLmxheWVycy5tYXNrLG4ubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSxuLnVwPXRoaXMudXAudG9BcnJheSgpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT09PSExJiYobi5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKG4udHlwZT0iSW5zdGFuY2VkTWVzaCIsbi5jb3VudD10aGlzLmNvdW50LG4uaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSx0aGlzLmluc3RhbmNlQ29sb3IhPT1udWxsJiYobi5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNCYXRjaGVkTWVzaCYmKG4udHlwZT0iQmF0Y2hlZE1lc2giLG4ucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQsbi5zb3J0T2JqZWN0cz10aGlzLnNvcnRPYmplY3RzLG4uZHJhd1Jhbmdlcz10aGlzLl9kcmF3UmFuZ2VzLG4ucmVzZXJ2ZWRSYW5nZXM9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsbi52aXNpYmlsaXR5PXRoaXMuX3Zpc2liaWxpdHksbi5hY3RpdmU9dGhpcy5fYWN0aXZlLG4uYm91bmRzPXRoaXMuX2JvdW5kcy5tYXAoYT0+KHtib3hJbml0aWFsaXplZDphLmJveEluaXRpYWxpemVkLGJveE1pbjphLmJveC5taW4udG9BcnJheSgpLGJveE1heDphLmJveC5tYXgudG9BcnJheSgpLHNwaGVyZUluaXRpYWxpemVkOmEuc3BoZXJlSW5pdGlhbGl6ZWQsc3BoZXJlUmFkaXVzOmEuc3BoZXJlLnJhZGl1cyxzcGhlcmVDZW50ZXI6YS5zcGhlcmUuY2VudGVyLnRvQXJyYXkoKX0pKSxuLm1heEluc3RhbmNlQ291bnQ9dGhpcy5fbWF4SW5zdGFuY2VDb3VudCxuLm1heFZlcnRleENvdW50PXRoaXMuX21heFZlcnRleENvdW50LG4ubWF4SW5kZXhDb3VudD10aGlzLl9tYXhJbmRleENvdW50LG4uZ2VvbWV0cnlJbml0aWFsaXplZD10aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkLG4uZ2VvbWV0cnlDb3VudD10aGlzLl9nZW9tZXRyeUNvdW50LG4ubWF0cmljZXNUZXh0dXJlPXRoaXMuX21hdHJpY2VzVGV4dHVyZS50b0pTT04odCksdGhpcy5fY29sb3JzVGV4dHVyZSE9PW51bGwmJihuLmNvbG9yc1RleHR1cmU9dGhpcy5fY29sb3JzVGV4dHVyZS50b0pTT04odCkpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYobi5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOm4uYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6bi5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKG4uYm91bmRpbmdCb3g9e21pbjpuLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4Om4uYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKTtmdW5jdGlvbiBpKGEsYyl7cmV0dXJuIGFbYy51dWlkXT09PXZvaWQgMCYmKGFbYy51dWlkXT1jLnRvSlNPTih0KSksYy51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9uLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihuLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihuLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtuLmdlb21ldHJ5PWkodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGE9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKGEhPT12b2lkIDAmJmEuc2hhcGVzIT09dm9pZCAwKXtjb25zdCBjPWEuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGxldCB1PTAsaD1jLmxlbmd0aDt1PGg7dSsrKXtjb25zdCBsPWNbdV07aSh0LnNoYXBlcyxsKX1lbHNlIGkodC5zaGFwZXMsYyl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKG4uYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxuLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYoaSh0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxuLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgYT1bXTtmb3IobGV0IGM9MCx1PXRoaXMubWF0ZXJpYWwubGVuZ3RoO2M8dTtjKyspYS5wdXNoKGkodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtjXSkpO24ubWF0ZXJpYWw9YX1lbHNlIG4ubWF0ZXJpYWw9aSh0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtuLmNoaWxkcmVuPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5jaGlsZHJlbi5sZW5ndGg7YSsrKW4uY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2FdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7bi5hbmltYXRpb25zPVtdO2ZvcihsZXQgYT0wO2E8dGhpcy5hbmltYXRpb25zLmxlbmd0aDthKyspe2NvbnN0IGM9dGhpcy5hbmltYXRpb25zW2FdO24uYW5pbWF0aW9ucy5wdXNoKGkodC5hbmltYXRpb25zLGMpKX19aWYoZSl7Y29uc3QgYT1vKHQuZ2VvbWV0cmllcyksYz1vKHQubWF0ZXJpYWxzKSx1PW8odC50ZXh0dXJlcyksaD1vKHQuaW1hZ2VzKSxsPW8odC5zaGFwZXMpLGQ9byh0LnNrZWxldG9ucyksZj1vKHQuYW5pbWF0aW9ucykscD1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihzLmdlb21ldHJpZXM9YSksYy5sZW5ndGg+MCYmKHMubWF0ZXJpYWxzPWMpLHUubGVuZ3RoPjAmJihzLnRleHR1cmVzPXUpLGgubGVuZ3RoPjAmJihzLmltYWdlcz1oKSxsLmxlbmd0aD4wJiYocy5zaGFwZXM9bCksZC5sZW5ndGg+MCYmKHMuc2tlbGV0b25zPWQpLGYubGVuZ3RoPjAmJihzLmFuaW1hdGlvbnM9ZikscC5sZW5ndGg+MCYmKHMubm9kZXM9cCl9cmV0dXJuIHMub2JqZWN0PW4scztmdW5jdGlvbiBvKGEpe2NvbnN0IGM9W107Zm9yKGNvbnN0IHUgaW4gYSl7Y29uc3QgaD1hW3VdO2RlbGV0ZSBoLm1ldGFkYXRhLGMucHVzaChoKX1yZXR1cm4gY319Y2xvbmUodCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXQubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz10LmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLGU9PT0hMClmb3IobGV0IHM9MDtzPHQuY2hpbGRyZW4ubGVuZ3RoO3MrKyl7Y29uc3Qgbj10LmNoaWxkcmVuW3NdO3RoaXMuYWRkKG4uY2xvbmUoKSl9cmV0dXJuIHRoaXN9fW5lLkRFRkFVTFRfVVA9bmV3IEEoMCwxLDApLG5lLkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLG5lLkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IEl0PW5ldyBBLFh0PW5ldyBBLFBuPW5ldyBBLFl0PW5ldyBBLHplPW5ldyBBLGJlPW5ldyBBLHlyPW5ldyBBLExuPW5ldyBBLE9uPW5ldyBBLERuPW5ldyBBLFZuPW5ldyBGdCxVbj1uZXcgRnQsa249bmV3IEZ0O2NsYXNzIHd0e2NvbnN0cnVjdG9yKHQ9bmV3IEEsZT1uZXcgQSxzPW5ldyBBKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9c31zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxzLG4pe24uc3ViVmVjdG9ycyhzLGUpLEl0LnN1YlZlY3RvcnModCxlKSxuLmNyb3NzKEl0KTtjb25zdCBpPW4ubGVuZ3RoU3EoKTtyZXR1cm4gaT4wP24ubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoaSkpOm4uc2V0KDAsMCwwKX1zdGF0aWMgZ2V0QmFyeWNvb3JkKHQsZSxzLG4saSl7SXQuc3ViVmVjdG9ycyhuLGUpLFh0LnN1YlZlY3RvcnMocyxlKSxQbi5zdWJWZWN0b3JzKHQsZSk7Y29uc3Qgbz1JdC5kb3QoSXQpLGE9SXQuZG90KFh0KSxjPUl0LmRvdChQbiksdT1YdC5kb3QoWHQpLGg9WHQuZG90KFBuKSxsPW8qdS1hKmE7aWYobD09PTApcmV0dXJuIGkuc2V0KDAsMCwwKSxudWxsO2NvbnN0IGQ9MS9sLGY9KHUqYy1hKmgpKmQscD0obypoLWEqYykqZDtyZXR1cm4gaS5zZXQoMS1mLXAscCxmKX1zdGF0aWMgY29udGFpbnNQb2ludCh0LGUscyxuKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLHMsbixZdCk9PT1udWxsPyExOll0Lng+PTAmJll0Lnk+PTAmJll0LngrWXQueTw9MX1zdGF0aWMgZ2V0SW50ZXJwb2xhdGlvbih0LGUscyxuLGksbyxhLGMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUscyxuLFl0KT09PW51bGw/KGMueD0wLGMueT0wLCJ6ImluIGMmJihjLno9MCksInciaW4gYyYmKGMudz0wKSxudWxsKTooYy5zZXRTY2FsYXIoMCksYy5hZGRTY2FsZWRWZWN0b3IoaSxZdC54KSxjLmFkZFNjYWxlZFZlY3RvcihvLFl0LnkpLGMuYWRkU2NhbGVkVmVjdG9yKGEsWXQueiksYyl9c3RhdGljIGdldEludGVycG9sYXRlZEF0dHJpYnV0ZSh0LGUscyxuLGksbyl7cmV0dXJuIFZuLnNldFNjYWxhcigwKSxVbi5zZXRTY2FsYXIoMCksa24uc2V0U2NhbGFyKDApLFZuLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxVbi5mcm9tQnVmZmVyQXR0cmlidXRlKHQscyksa24uZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLG8uc2V0U2NhbGFyKDApLG8uYWRkU2NhbGVkVmVjdG9yKFZuLGkueCksby5hZGRTY2FsZWRWZWN0b3IoVW4saS55KSxvLmFkZFNjYWxlZFZlY3RvcihrbixpLnopLG99c3RhdGljIGlzRnJvbnRGYWNpbmcodCxlLHMsbil7cmV0dXJuIEl0LnN1YlZlY3RvcnMocyxlKSxYdC5zdWJWZWN0b3JzKHQsZSksSXQuY3Jvc3MoWHQpLmRvdChuKTwwfXNldCh0LGUscyl7cmV0dXJuIHRoaXMuYS5jb3B5KHQpLHRoaXMuYi5jb3B5KGUpLHRoaXMuYy5jb3B5KHMpLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXModCxlLHMsbil7cmV0dXJuIHRoaXMuYS5jb3B5KHRbZV0pLHRoaXMuYi5jb3B5KHRbc10pLHRoaXMuYy5jb3B5KHRbbl0pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXModCxlLHMsbil7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxzKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG4pLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBJdC5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLFh0LnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksSXQuY3Jvc3MoWHQpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwodCl7cmV0dXJuIHd0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiB3dC5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRJbnRlcnBvbGF0aW9uKHQsZSxzLG4saSl7cmV0dXJuIHd0LmdldEludGVycG9sYXRpb24odCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlLHMsbixpKX1jb250YWluc1BvaW50KHQpe3JldHVybiB3dC5jb250YWluc1BvaW50KHQsdGhpcy5hLHRoaXMuYix0aGlzLmMpfWlzRnJvbnRGYWNpbmcodCl7cmV0dXJuIHd0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IHM9dGhpcy5hLG49dGhpcy5iLGk9dGhpcy5jO2xldCBvLGE7emUuc3ViVmVjdG9ycyhuLHMpLGJlLnN1YlZlY3RvcnMoaSxzKSxMbi5zdWJWZWN0b3JzKHQscyk7Y29uc3QgYz16ZS5kb3QoTG4pLHU9YmUuZG90KExuKTtpZihjPD0wJiZ1PD0wKXJldHVybiBlLmNvcHkocyk7T24uc3ViVmVjdG9ycyh0LG4pO2NvbnN0IGg9emUuZG90KE9uKSxsPWJlLmRvdChPbik7aWYoaD49MCYmbDw9aClyZXR1cm4gZS5jb3B5KG4pO2NvbnN0IGQ9YypsLWgqdTtpZihkPD0wJiZjPj0wJiZoPD0wKXJldHVybiBvPWMvKGMtaCksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3Rvcih6ZSxvKTtEbi5zdWJWZWN0b3JzKHQsaSk7Y29uc3QgZj16ZS5kb3QoRG4pLHA9YmUuZG90KERuKTtpZihwPj0wJiZmPD1wKXJldHVybiBlLmNvcHkoaSk7Y29uc3QgbT1mKnUtYypwO2lmKG08PTAmJnU+PTAmJnA8PTApcmV0dXJuIGE9dS8odS1wKSxlLmNvcHkocykuYWRkU2NhbGVkVmVjdG9yKGJlLGEpO2NvbnN0IGc9aCpwLWYqbDtpZihnPD0wJiZsLWg+PTAmJmYtcD49MClyZXR1cm4geXIuc3ViVmVjdG9ycyhpLG4pLGE9KGwtaCkvKGwtaCsoZi1wKSksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3Rvcih5cixhKTtjb25zdCB5PTEvKGcrbStkKTtyZXR1cm4gbz1tKnksYT1kKnksZS5jb3B5KHMpLmFkZFNjYWxlZFZlY3Rvcih6ZSxvKS5hZGRTY2FsZWRWZWN0b3IoYmUsYSl9ZXF1YWxzKHQpe3JldHVybiB0LmEuZXF1YWxzKHRoaXMuYSkmJnQuYi5lcXVhbHModGhpcy5iKSYmdC5jLmVxdWFscyh0aGlzLmMpfX1jb25zdCBncj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSxpZT17aDowLHM6MCxsOjB9LExzPXtoOjAsczowLGw6MH07ZnVuY3Rpb24gSG4ocix0LGUpe3JldHVybiBlPDAmJihlKz0xKSxlPjEmJihlLT0xKSxlPDEvNj9yKyh0LXIpKjYqZTplPDEvMj90OmU8Mi8zP3IrKHQtcikqNiooMi8zLWUpOnJ9Y2xhc3MgcW57Y29uc3RydWN0b3IodCxlLHMpe3JldHVybiB0aGlzLmlzQ29sb3I9ITAsdGhpcy5yPTEsdGhpcy5nPTEsdGhpcy5iPTEsdGhpcy5zZXQodCxlLHMpfXNldCh0LGUscyl7aWYoZT09PXZvaWQgMCYmcz09PXZvaWQgMCl7Y29uc3Qgbj10O24mJm4uaXNDb2xvcj90aGlzLmNvcHkobik6dHlwZW9mIG49PSJudW1iZXIiP3RoaXMuc2V0SGV4KG4pOnR5cGVvZiBuPT0ic3RyaW5nIiYmdGhpcy5zZXRTdHlsZShuKX1lbHNlIHRoaXMuc2V0UkdCKHQsZSxzKTtyZXR1cm4gdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQsZT0kdCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSx0aGlzLnI9KHQ+PjE2JjI1NSkvMjU1LHRoaXMuZz0odD4+OCYyNTUpLzI1NSx0aGlzLmI9KHQmMjU1KS8yNTUsbXQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGUpLHRoaXN9c2V0UkdCKHQsZSxzLG49bXQud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9ZSx0aGlzLmI9cyxtdC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsbiksdGhpc31zZXRIU0wodCxlLHMsbj1tdC53b3JraW5nQ29sb3JTcGFjZSl7aWYodD1ibih0LDEpLGU9YXQoZSwwLDEpLHM9YXQocywwLDEpLGU9PT0wKXRoaXMucj10aGlzLmc9dGhpcy5iPXM7ZWxzZXtjb25zdCBpPXM8PS41P3MqKDErZSk6cytlLXMqZSxvPTIqcy1pO3RoaXMucj1IbihvLGksdCsxLzMpLHRoaXMuZz1IbihvLGksdCksdGhpcy5iPUhuKG8saSx0LTEvMyl9cmV0dXJuIG10LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxuKSx0aGlzfXNldFN0eWxlKHQsZT0kdCl7ZnVuY3Rpb24gcyhpKXtpIT09dm9pZCAwJiZwYXJzZUZsb2F0KGkpPDEmJmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAiK3QrIiB3aWxsIGJlIGlnbm9yZWQuIil9bGV0IG47aWYobj0vXihcdyspXCgoW15cKV0qKVwpLy5leGVjKHQpKXtsZXQgaTtjb25zdCBvPW5bMV0sYT1uWzJdO3N3aXRjaChvKXtjYXNlInJnYiI6Y2FzZSJyZ2JhIjppZihpPS9eXHMqKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIHMoaVs0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbMV0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbMl0sMTApKS8yNTUsTWF0aC5taW4oMjU1LHBhcnNlSW50KGlbM10sMTApKS8yNTUsZSk7aWYoaT0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGEpKXJldHVybiBzKGlbNF0pLHRoaXMuc2V0UkdCKE1hdGgubWluKDEwMCxwYXJzZUludChpWzFdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChpWzJdLDEwKSkvMTAwLE1hdGgubWluKDEwMCxwYXJzZUludChpWzNdLDEwKSkvMTAwLGUpO2JyZWFrO2Nhc2UiaHNsIjpjYXNlImhzbGEiOmlmKGk9L15ccyooXGQqXC4/XGQrKVxzKixccyooXGQqXC4/XGQrKVwlXHMqLFxzKihcZCpcLj9cZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMoYSkpcmV0dXJuIHMoaVs0XSksdGhpcy5zZXRIU0wocGFyc2VGbG9hdChpWzFdKS8zNjAscGFyc2VGbG9hdChpWzJdKS8xMDAscGFyc2VGbG9hdChpWzNdKS8xMDAsZSk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yIG1vZGVsICIrdCl9fWVsc2UgaWYobj0vXlwjKFtBLUZhLWZcZF0rKSQvLmV4ZWModCkpe2NvbnN0IGk9blsxXSxvPWkubGVuZ3RoO2lmKG89PT0zKXJldHVybiB0aGlzLnNldFJHQihwYXJzZUludChpLmNoYXJBdCgwKSwxNikvMTUscGFyc2VJbnQoaS5jaGFyQXQoMSksMTYpLzE1LHBhcnNlSW50KGkuY2hhckF0KDIpLDE2KS8xNSxlKTtpZihvPT09NilyZXR1cm4gdGhpcy5zZXRIZXgocGFyc2VJbnQoaSwxNiksZSk7Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogSW52YWxpZCBoZXggY29sb3IgIit0KX1lbHNlIGlmKHQmJnQubGVuZ3RoPjApcmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKHQsZSk7cmV0dXJuIHRoaXN9c2V0Q29sb3JOYW1lKHQsZT0kdCl7Y29uc3Qgcz1nclt0LnRvTG93ZXJDYXNlKCldO3JldHVybiBzIT09dm9pZCAwP3RoaXMuc2V0SGV4KHMsZSk6Y29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK3QpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfWNvcHkodCl7cmV0dXJuIHRoaXMucj10LnIsdGhpcy5nPXQuZyx0aGlzLmI9dC5iLHRoaXN9Y29weVNSR0JUb0xpbmVhcih0KXtyZXR1cm4gdGhpcy5yPXhlKHQuciksdGhpcy5nPXhlKHQuZyksdGhpcy5iPXhlKHQuYiksdGhpc31jb3B5TGluZWFyVG9TUkdCKHQpe3JldHVybiB0aGlzLnI9Q24odC5yKSx0aGlzLmc9Q24odC5nKSx0aGlzLmI9Q24odC5iKSx0aGlzfWNvbnZlcnRTUkdCVG9MaW5lYXIoKXtyZXR1cm4gdGhpcy5jb3B5U1JHQlRvTGluZWFyKHRoaXMpLHRoaXN9Y29udmVydExpbmVhclRvU1JHQigpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyksdGhpc31nZXRIZXgodD0kdCl7cmV0dXJuIG10LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLHQpLE1hdGgucm91bmQoYXQoY3QucioyNTUsMCwyNTUpKSo2NTUzNitNYXRoLnJvdW5kKGF0KGN0LmcqMjU1LDAsMjU1KSkqMjU2K01hdGgucm91bmQoYXQoY3QuYioyNTUsMCwyNTUpKX1nZXRIZXhTdHJpbmcodD0kdCl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9bXQud29ya2luZ0NvbG9yU3BhY2Upe210LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLGUpO2NvbnN0IHM9Y3QucixuPWN0LmcsaT1jdC5iLG89TWF0aC5tYXgocyxuLGkpLGE9TWF0aC5taW4ocyxuLGkpO2xldCBjLHU7Y29uc3QgaD0oYStvKS8yO2lmKGE9PT1vKWM9MCx1PTA7ZWxzZXtjb25zdCBsPW8tYTtzd2l0Y2godT1oPD0uNT9sLyhvK2EpOmwvKDItby1hKSxvKXtjYXNlIHM6Yz0obi1pKS9sKyhuPGk/NjowKTticmVhaztjYXNlIG46Yz0oaS1zKS9sKzI7YnJlYWs7Y2FzZSBpOmM9KHMtbikvbCs0O2JyZWFrfWMvPTZ9cmV0dXJuIHQuaD1jLHQucz11LHQubD1oLHR9Z2V0UkdCKHQsZT1tdC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIG10LmZyb21Xb3JraW5nQ29sb3JTcGFjZShjdC5jb3B5KHRoaXMpLGUpLHQucj1jdC5yLHQuZz1jdC5nLHQuYj1jdC5iLHR9Z2V0U3R5bGUodD0kdCl7bXQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKGN0LmNvcHkodGhpcyksdCk7Y29uc3QgZT1jdC5yLHM9Y3QuZyxuPWN0LmI7cmV0dXJuIHQhPT0kdD9gY29sb3IoJHt0fSAke2UudG9GaXhlZCgzKX0gJHtzLnRvRml4ZWQoMyl9ICR7bi50b0ZpeGVkKDMpfSlgOmByZ2IoJHtNYXRoLnJvdW5kKGUqMjU1KX0sJHtNYXRoLnJvdW5kKHMqMjU1KX0sJHtNYXRoLnJvdW5kKG4qMjU1KX0pYH1vZmZzZXRIU0wodCxlLHMpe3JldHVybiB0aGlzLmdldEhTTChpZSksdGhpcy5zZXRIU0woaWUuaCt0LGllLnMrZSxpZS5sK3MpfWFkZCh0KXtyZXR1cm4gdGhpcy5yKz10LnIsdGhpcy5nKz10LmcsdGhpcy5iKz10LmIsdGhpc31hZGRDb2xvcnModCxlKXtyZXR1cm4gdGhpcy5yPXQucitlLnIsdGhpcy5nPXQuZytlLmcsdGhpcy5iPXQuYitlLmIsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMucis9dCx0aGlzLmcrPXQsdGhpcy5iKz10LHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLnI9TWF0aC5tYXgoMCx0aGlzLnItdC5yKSx0aGlzLmc9TWF0aC5tYXgoMCx0aGlzLmctdC5nKSx0aGlzLmI9TWF0aC5tYXgoMCx0aGlzLmItdC5iKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLnIqPXQucix0aGlzLmcqPXQuZyx0aGlzLmIqPXQuYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLnIqPXQsdGhpcy5nKj10LHRoaXMuYio9dCx0aGlzfWxlcnAodCxlKXtyZXR1cm4gdGhpcy5yKz0odC5yLXRoaXMucikqZSx0aGlzLmcrPSh0LmctdGhpcy5nKSplLHRoaXMuYis9KHQuYi10aGlzLmIpKmUsdGhpc31sZXJwQ29sb3JzKHQsZSxzKXtyZXR1cm4gdGhpcy5yPXQucisoZS5yLXQucikqcyx0aGlzLmc9dC5nKyhlLmctdC5nKSpzLHRoaXMuYj10LmIrKGUuYi10LmIpKnMsdGhpc31sZXJwSFNMKHQsZSl7dGhpcy5nZXRIU0woaWUpLHQuZ2V0SFNMKExzKTtjb25zdCBzPUplKGllLmgsTHMuaCxlKSxuPUplKGllLnMsTHMucyxlKSxpPUplKGllLmwsTHMubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wocyxuLGkpLHRoaXN9c2V0RnJvbVZlY3RvcjModCl7cmV0dXJuIHRoaXMucj10LngsdGhpcy5nPXQueSx0aGlzLmI9dC56LHRoaXN9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy5yLHM9dGhpcy5nLG49dGhpcy5iLGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5yPWlbMF0qZStpWzNdKnMraVs2XSpuLHRoaXMuZz1pWzFdKmUraVs0XSpzK2lbN10qbix0aGlzLmI9aVsyXSplK2lbNV0qcytpWzhdKm4sdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19Y29uc3QgY3Q9bmV3IHFuO3FuLk5BTUVTPWdyO2NvbnN0IGo9bmV3IEEsT3M9bmV3IEo7Y2xhc3MgdnR7Y29uc3RydWN0b3IodCxlLHM9ITEpe2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTt0aGlzLmlzQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dCE9PXZvaWQgMD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPXMsdGhpcy51c2FnZT1Dcyx0aGlzLnVwZGF0ZVJhbmdlcz1bXSx0aGlzLmdwdVR5cGU9SW8sdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuZ3B1VHlwZT10LmdwdVR5cGUsdGhpc31jb3B5QXQodCxlLHMpe3QqPXRoaXMuaXRlbVNpemUscyo9ZS5pdGVtU2l6ZTtmb3IobGV0IG49MCxpPXRoaXMuaXRlbVNpemU7bjxpO24rKyl0aGlzLmFycmF5W3Qrbl09ZS5hcnJheVtzK25dO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31hcHBseU1hdHJpeDModCl7aWYodGhpcy5pdGVtU2l6ZT09PTIpZm9yKGxldCBlPTAscz10aGlzLmNvdW50O2U8cztlKyspT3MuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLE9zLmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZKGUsT3MueCxPcy55KTtlbHNlIGlmKHRoaXMuaXRlbVNpemU9PT0zKWZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKWouZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGouYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsai54LGoueSxqLnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLGoueCxqLnksai56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLmFwcGx5Tm9ybWFsTWF0cml4KHQpLHRoaXMuc2V0WFlaKGUsai54LGoueSxqLnopO3JldHVybiB0aGlzfXRyYW5zZm9ybURpcmVjdGlvbih0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKylqLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxqLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLGoueCxqLnksai56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IHM9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHM9RXQocyx0aGlzLmFycmF5KSksc31zZXRDb21wb25lbnQodCxlLHMpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihzPSQocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrZV09cyx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUV0KGUsdGhpcy5hcnJheSkpLGV9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUV0KGUsdGhpcy5hcnJheSkpLGV9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV09ZSx0aGlzfWdldFoodCl7bGV0IGU9dGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1FdChlLHRoaXMuYXJyYXkpKSxlfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUscyl7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkscz0kKHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1zLHRoaXN9c2V0WFlaKHQsZSxzLG4pe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpLG49JChuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W3QrMF09ZSx0aGlzLmFycmF5W3QrMV09cyx0aGlzLmFycmF5W3QrMl09bix0aGlzfXNldFhZWlcodCxlLHMsbixpKXtyZXR1cm4gdCo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSxzPSQocyx0aGlzLmFycmF5KSxuPSQobix0aGlzLmFycmF5KSxpPSQoaSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPXMsdGhpcy5hcnJheVt0KzJdPW4sdGhpcy5hcnJheVt0KzNdPWksdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4gdGhpcy5uYW1lIT09IiImJih0Lm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09Q3MmJih0LnVzYWdlPXRoaXMudXNhZ2UpLHR9fWNsYXNzIG1hIGV4dGVuZHMgdnR7Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLHMpfX1jbGFzcyB5YSBleHRlbmRzIHZ0e2NvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcihuZXcgVWludDMyQXJyYXkodCksZSxzKX19Y2xhc3MgZ2EgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcih0LGUscyl7c3VwZXIobmV3IEZsb2F0MzJBcnJheSh0KSxlLHMpfX1sZXQgeGE9MDtjb25zdCBBdD1uZXcgbnQsJG49bmV3IG5lLEVlPW5ldyBBLGd0PW5ldyBodCxzcz1uZXcgaHQsaXQ9bmV3IEE7Y2xhc3MgR24gZXh0ZW5kcyBaZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0J1ZmZlckdlb21ldHJ5PSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOnhhKyt9KSx0aGlzLnV1aWQ9S3QoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dGhpcy5pbmRleD1uZXcoc2EodCk/eWE6bWEpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF0hPT12b2lkIDB9YWRkR3JvdXAodCxlLHM9MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6c30pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtlIT09dm9pZCAwJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgcz10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKHMhPT12b2lkIDApe2NvbnN0IGk9bmV3IEN0KCkuZ2V0Tm9ybWFsTWF0cml4KHQpO3MuYXBwbHlOb3JtYWxNYXRyaXgoaSkscy5uZWVkc1VwZGF0ZT0hMH1jb25zdCBuPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiBuIT09dm9pZCAwJiYobi50cmFuc2Zvcm1EaXJlY3Rpb24odCksbi5uZWVkc1VwZGF0ZT0hMCksdGhpcy5ib3VuZGluZ0JveCE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ1NwaGVyZSE9PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIEF0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIEF0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoQXQpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gQXQubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChBdCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBBdC5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfXRyYW5zbGF0ZSh0LGUscyl7cmV0dXJuIEF0Lm1ha2VUcmFuc2xhdGlvbih0LGUscyksdGhpcy5hcHBseU1hdHJpeDQoQXQpLHRoaXN9c2NhbGUodCxlLHMpe3JldHVybiBBdC5tYWtlU2NhbGUodCxlLHMpLHRoaXMuYXBwbHlNYXRyaXg0KEF0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gJG4ubG9va0F0KHQpLCRuLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KCRuLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihFZSkubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoRWUueCxFZS55LEVlLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgcz0wLG49dC5sZW5ndGg7czxuO3MrKyl7Y29uc3QgaT10W3NdO2UucHVzaChpLngsaS55LGkuenx8MCl9cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGdhKGUsMykpLHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7dGhpcy5ib3VuZGluZ0JveD09PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBodCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIix0aGlzKSx0aGlzLmJvdW5kaW5nQm94LnNldChuZXcgQSgtMS8wLC0xLzAsLTEvMCksbmV3IEEoMS8wLDEvMCwxLzApKTtyZXR1cm59aWYodCE9PXZvaWQgMCl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBzPTAsbj1lLmxlbmd0aDtzPG47cysrKXtjb25zdCBpPWVbc107Z3Quc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShpKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhpdC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLGd0Lm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGl0KSxpdC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LGd0Lm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGl0KSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChndC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChndC5tYXgpKX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOyhpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgY3IpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiIsdGhpcyksdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXQobmV3IEEsMS8wKTtyZXR1cm59aWYodCl7Y29uc3Qgcz10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtpZihndC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCBpPTAsbz1lLmxlbmd0aDtpPG87aSsrKXtjb25zdCBhPWVbaV07c3Muc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShhKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhpdC5hZGRWZWN0b3JzKGd0Lm1pbixzcy5taW4pLGd0LmV4cGFuZEJ5UG9pbnQoaXQpLGl0LmFkZFZlY3RvcnMoZ3QubWF4LHNzLm1heCksZ3QuZXhwYW5kQnlQb2ludChpdCkpOihndC5leHBhbmRCeVBvaW50KHNzLm1pbiksZ3QuZXhwYW5kQnlQb2ludChzcy5tYXgpKX1ndC5nZXRDZW50ZXIocyk7bGV0IG49MDtmb3IobGV0IGk9MCxvPXQuY291bnQ7aTxvO2krKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksbj1NYXRoLm1heChuLHMuZGlzdGFuY2VUb1NxdWFyZWQoaXQpKTtpZihlKWZvcihsZXQgaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYT1lW2ldLGM9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtmb3IobGV0IHU9MCxoPWEuY291bnQ7dTxoO3UrKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsdSksYyYmKEVlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCx1KSxpdC5hZGQoRWUpKSxuPU1hdGgubWF4KG4scy5kaXN0YW5jZVRvU3F1YXJlZChpdCkpfXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzPU1hdGguc3FydChuKSxpc05hTih0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cykmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfX1jb21wdXRlVGFuZ2VudHMoKXtjb25zdCB0PXRoaXMuaW5kZXgsZT10aGlzLmF0dHJpYnV0ZXM7aWYodD09PW51bGx8fGUucG9zaXRpb249PT12b2lkIDB8fGUubm9ybWFsPT09dm9pZCAwfHxlLnV2PT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGZhaWxlZC4gTWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzIChpbmRleCwgcG9zaXRpb24sIG5vcm1hbCBvciB1dikiKTtyZXR1cm59Y29uc3Qgcz1lLnBvc2l0aW9uLG49ZS5ub3JtYWwsaT1lLnV2O3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyB2dChuZXcgRmxvYXQzMkFycmF5KDQqcy5jb3VudCksNCkpO2NvbnN0IG89dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKSxhPVtdLGM9W107Zm9yKGxldCBFPTA7RTxzLmNvdW50O0UrKylhW0VdPW5ldyBBLGNbRV09bmV3IEE7Y29uc3QgdT1uZXcgQSxoPW5ldyBBLGw9bmV3IEEsZD1uZXcgSixmPW5ldyBKLHA9bmV3IEosbT1uZXcgQSxnPW5ldyBBO2Z1bmN0aW9uIHkoRSxGLFIpe3UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEUpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLEYpLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLFIpLGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLEUpLGYuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLEYpLHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLFIpLGguc3ViKHUpLGwuc3ViKHUpLGYuc3ViKGQpLHAuc3ViKGQpO2NvbnN0IEk9MS8oZi54KnAueS1wLngqZi55KTtpc0Zpbml0ZShJKSYmKG0uY29weShoKS5tdWx0aXBseVNjYWxhcihwLnkpLmFkZFNjYWxlZFZlY3RvcihsLC1mLnkpLm11bHRpcGx5U2NhbGFyKEkpLGcuY29weShsKS5tdWx0aXBseVNjYWxhcihmLngpLmFkZFNjYWxlZFZlY3RvcihoLC1wLngpLm11bHRpcGx5U2NhbGFyKEkpLGFbRV0uYWRkKG0pLGFbRl0uYWRkKG0pLGFbUl0uYWRkKG0pLGNbRV0uYWRkKGcpLGNbRl0uYWRkKGcpLGNbUl0uYWRkKGcpKX1sZXQgVD10aGlzLmdyb3VwcztULmxlbmd0aD09PTAmJihUPVt7c3RhcnQ6MCxjb3VudDp0LmNvdW50fV0pO2ZvcihsZXQgRT0wLEY9VC5sZW5ndGg7RTxGOysrRSl7Y29uc3QgUj1UW0VdLEk9Ui5zdGFydCxCPVIuY291bnQ7Zm9yKGxldCBQPUksTD1JK0I7UDxMO1ArPTMpeSh0LmdldFgoUCswKSx0LmdldFgoUCsxKSx0LmdldFgoUCsyKSl9Y29uc3Qgdz1uZXcgQSxNPW5ldyBBLE49bmV3IEEsXz1uZXcgQTtmdW5jdGlvbiBTKEUpe04uZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLEUpLF8uY29weShOKTtjb25zdCBGPWFbRV07dy5jb3B5KEYpLHcuc3ViKE4ubXVsdGlwbHlTY2FsYXIoTi5kb3QoRikpKS5ub3JtYWxpemUoKSxNLmNyb3NzVmVjdG9ycyhfLEYpO2NvbnN0IEk9TS5kb3QoY1tFXSk8MD8tMToxO28uc2V0WFlaVyhFLHcueCx3Lnksdy56LEkpfWZvcihsZXQgRT0wLEY9VC5sZW5ndGg7RTxGOysrRSl7Y29uc3QgUj1UW0VdLEk9Ui5zdGFydCxCPVIuY291bnQ7Zm9yKGxldCBQPUksTD1JK0I7UDxMO1ArPTMpUyh0LmdldFgoUCswKSksUyh0LmdldFgoUCsxKSksUyh0LmdldFgoUCsyKSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYoZSE9PXZvaWQgMCl7bGV0IHM9dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKHM9PT12b2lkIDApcz1uZXcgdnQobmV3IEZsb2F0MzJBcnJheShlLmNvdW50KjMpLDMpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLHMpO2Vsc2UgZm9yKGxldCBkPTAsZj1zLmNvdW50O2Q8ZjtkKyspcy5zZXRYWVooZCwwLDAsMCk7Y29uc3Qgbj1uZXcgQSxpPW5ldyBBLG89bmV3IEEsYT1uZXcgQSxjPW5ldyBBLHU9bmV3IEEsaD1uZXcgQSxsPW5ldyBBO2lmKHQpZm9yKGxldCBkPTAsZj10LmNvdW50O2Q8ZjtkKz0zKXtjb25zdCBwPXQuZ2V0WChkKzApLG09dC5nZXRYKGQrMSksZz10LmdldFgoZCsyKTtuLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxpLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxnKSxoLnN1YlZlY3RvcnMobyxpKSxsLnN1YlZlY3RvcnMobixpKSxoLmNyb3NzKGwpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHApLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG0pLHUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGcpLGEuYWRkKGgpLGMuYWRkKGgpLHUuYWRkKGgpLHMuc2V0WFlaKHAsYS54LGEueSxhLnopLHMuc2V0WFlaKG0sYy54LGMueSxjLnopLHMuc2V0WFlaKGcsdS54LHUueSx1LnopfWVsc2UgZm9yKGxldCBkPTAsZj1lLmNvdW50O2Q8ZjtkKz0zKW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGQrMCksaS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsZCsxKSxvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxkKzIpLGguc3ViVmVjdG9ycyhvLGkpLGwuc3ViVmVjdG9ycyhuLGkpLGguY3Jvc3MobCkscy5zZXRYWVooZCswLGgueCxoLnksaC56KSxzLnNldFhZWihkKzEsaC54LGgueSxoLnopLHMuc2V0WFlaKGQrMixoLngsaC55LGgueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCkscy5uZWVkc1VwZGF0ZT0hMH19bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxzPXQuY291bnQ7ZTxzO2UrKylpdC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksaXQubm9ybWFsaXplKCksdC5zZXRYWVooZSxpdC54LGl0LnksaXQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdChhLGMpe2NvbnN0IHU9YS5hcnJheSxoPWEuaXRlbVNpemUsbD1hLm5vcm1hbGl6ZWQsZD1uZXcgdS5jb25zdHJ1Y3RvcihjLmxlbmd0aCpoKTtsZXQgZj0wLHA9MDtmb3IobGV0IG09MCxnPWMubGVuZ3RoO208ZzttKyspe2EuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT9mPWNbbV0qYS5kYXRhLnN0cmlkZSthLm9mZnNldDpmPWNbbV0qaDtmb3IobGV0IHk9MDt5PGg7eSsrKWRbcCsrXT11W2YrK119cmV0dXJuIG5ldyB2dChkLGgsbCl9aWYodGhpcy5pbmRleD09PW51bGwpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuIiksdGhpcztjb25zdCBlPW5ldyBHbixzPXRoaXMuaW5kZXguYXJyYXksbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGEgaW4gbil7Y29uc3QgYz1uW2FdLHU9dChjLHMpO2Uuc2V0QXR0cmlidXRlKGEsdSl9Y29uc3QgaT10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYSBpbiBpKXtjb25zdCBjPVtdLHU9aVthXTtmb3IobGV0IGg9MCxsPXUubGVuZ3RoO2g8bDtoKyspe2NvbnN0IGQ9dVtoXSxmPXQoZCxzKTtjLnB1c2goZil9ZS5tb3JwaEF0dHJpYnV0ZXNbYV09Y31lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgbz10aGlzLmdyb3Vwcztmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspe2NvbnN0IHU9b1thXTtlLmFkZEdyb3VwKHUuc3RhcnQsdS5jb3VudCx1Lm1hdGVyaWFsSW5kZXgpfXJldHVybiBlfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07aWYodC51dWlkPXRoaXMudXVpZCx0LnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYodC5uYW1lPXRoaXMubmFtZSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJih0LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLHRoaXMucGFyYW1ldGVycyE9PXZvaWQgMCl7Y29uc3QgYz10aGlzLnBhcmFtZXRlcnM7Zm9yKGNvbnN0IHUgaW4gYyljW3VdIT09dm9pZCAwJiYodFt1XT1jW3VdKTtyZXR1cm4gdH10LmRhdGE9e2F0dHJpYnV0ZXM6e319O2NvbnN0IGU9dGhpcy5pbmRleDtlIT09bnVsbCYmKHQuZGF0YS5pbmRleD17dHlwZTplLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5hcnJheSl9KTtjb25zdCBzPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBzKXtjb25zdCB1PXNbY107dC5kYXRhLmF0dHJpYnV0ZXNbY109dS50b0pTT04odC5kYXRhKX1jb25zdCBuPXt9O2xldCBpPSExO2Zvcihjb25zdCBjIGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCB1PXRoaXMubW9ycGhBdHRyaWJ1dGVzW2NdLGg9W107Zm9yKGxldCBsPTAsZD11Lmxlbmd0aDtsPGQ7bCsrKXtjb25zdCBmPXVbbF07aC5wdXNoKGYudG9KU09OKHQuZGF0YSkpfWgubGVuZ3RoPjAmJihuW2NdPWgsaT0hMCl9aSYmKHQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9bix0LmRhdGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSk7Y29uc3Qgbz10aGlzLmdyb3VwcztvLmxlbmd0aD4wJiYodC5kYXRhLmdyb3Vwcz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKSk7Y29uc3QgYT10aGlzLmJvdW5kaW5nU3BoZXJlO3JldHVybiBhIT09bnVsbCYmKHQuZGF0YS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmEuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6YS5yYWRpdXN9KSx0fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgcz10LmluZGV4O3MhPT1udWxsJiZ0aGlzLnNldEluZGV4KHMuY2xvbmUoZSkpO2NvbnN0IG49dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB1IGluIG4pe2NvbnN0IGg9blt1XTt0aGlzLnNldEF0dHJpYnV0ZSh1LGguY2xvbmUoZSkpfWNvbnN0IGk9dC5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHUgaW4gaSl7Y29uc3QgaD1bXSxsPWlbdV07Zm9yKGxldCBkPTAsZj1sLmxlbmd0aDtkPGY7ZCsrKWgucHVzaChsW2RdLmNsb25lKGUpKTt0aGlzLm1vcnBoQXR0cmlidXRlc1t1XT1ofXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU9dC5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBvPXQuZ3JvdXBzO2ZvcihsZXQgdT0wLGg9by5sZW5ndGg7dTxoO3UrKyl7Y29uc3QgbD1vW3VdO3RoaXMuYWRkR3JvdXAobC5zdGFydCxsLmNvdW50LGwubWF0ZXJpYWxJbmRleCl9Y29uc3QgYT10LmJvdW5kaW5nQm94O2EhPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1hLmNsb25lKCkpO2NvbnN0IGM9dC5ib3VuZGluZ1NwaGVyZTtyZXR1cm4gYyE9PW51bGwmJih0aGlzLmJvdW5kaW5nU3BoZXJlPWMuY2xvbmUoKSksdGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dC5kcmF3UmFuZ2Uuc3RhcnQsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dC5kcmF3UmFuZ2UuY291bnQsdGhpcy51c2VyRGF0YT10LnVzZXJEYXRhLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y29uc3QgV249bmV3IEEsVGE9bmV3IEEsTmE9bmV3IEN0O2NsYXNzIFhue2NvbnN0cnVjdG9yKHQ9bmV3IEEoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLHMsbil7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUscyksdGhpcy5jb25zdGFudD1uLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLHMpe2NvbnN0IG49V24uc3ViVmVjdG9ycyhzLGUpLmNyb3NzKFRhLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobix0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSl9aW50ZXJzZWN0TGluZSh0LGUpe2NvbnN0IHM9dC5kZWx0YShXbiksbj10aGlzLm5vcm1hbC5kb3Qocyk7aWYobj09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KHQuc3RhcnQpPT09MD9lLmNvcHkodC5zdGFydCk6bnVsbDtjb25zdCBpPS0odC5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL247cmV0dXJuIGk8MHx8aT4xP251bGw6ZS5jb3B5KHQuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihzLGkpfWludGVyc2VjdHNMaW5lKHQpe2NvbnN0IGU9dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCkscz10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LmVuZCk7cmV0dXJuIGU8MCYmcz4wfHxzPDAmJmU+MH1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0LmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KHQpe3JldHVybiB0LmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQodCxlKXtjb25zdCBzPWV8fE5hLmdldE5vcm1hbE1hdHJpeCh0KSxuPXRoaXMuY29wbGFuYXJQb2ludChXbikuYXBwbHlNYXRyaXg0KHQpLGk9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKHMpLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1uLmRvdChpKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jb25zdGFudC09dC5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZ0LmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHhyIGV4dGVuZHMgRHR7Y29uc3RydWN0b3IodCxlLHMsbixpLG8sYSxjLHUsaD1Tbil7aWYoaCE9PVNuJiZoIT09WGkpdGhyb3cgbmV3IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3M9PT12b2lkIDAmJmg9PT1TbiYmKHM9V2kpLHM9PT12b2lkIDAmJmg9PT1YaSYmKHM9UG8pLHN1cGVyKG51bGwsbixpLG8sYSxjLGgscyx1KSx0aGlzLmlzRGVwdGhUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0OmV9LHRoaXMubWFnRmlsdGVyPWEhPT12b2lkIDA/YTp6cyx0aGlzLm1pbkZpbHRlcj1jIT09dm9pZCAwP2M6enMsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmNvbXBhcmVGdW5jdGlvbj1udWxsfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb21wYXJlRnVuY3Rpb249dC5jb21wYXJlRnVuY3Rpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIHRoaXMuY29tcGFyZUZ1bmN0aW9uIT09bnVsbCYmKGUuY29tcGFyZUZ1bmN0aW9uPXRoaXMuY29tcGFyZUZ1bmN0aW9uKSxlfX1jbGFzcyB3YXtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlcj0hMCx0aGlzLmFycmF5PXQsdGhpcy5zdHJpZGU9ZSx0aGlzLmNvdW50PXQhPT12b2lkIDA/dC5sZW5ndGgvZTowLHRoaXMudXNhZ2U9Q3MsdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy51dWlkPUt0KCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9YWRkVXBkYXRlUmFuZ2UodCxlKXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDp0LGNvdW50OmV9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkodCl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IHQuYXJyYXkuY29uc3RydWN0b3IodC5hcnJheSksdGhpcy5jb3VudD10LmNvdW50LHRoaXMuc3RyaWRlPXQuc3RyaWRlLHRoaXMudXNhZ2U9dC51c2FnZSx0aGlzfWNvcHlBdCh0LGUscyl7dCo9dGhpcy5zdHJpZGUscyo9ZS5zdHJpZGU7Zm9yKGxldCBuPTAsaT10aGlzLnN0cmlkZTtuPGk7bisrKXRoaXMuYXJyYXlbdCtuXT1lLmFycmF5W3Mrbl07cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWNsb25lKHQpe3QuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9S3QoKSksdC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCBlPW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSkscz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihlLHRoaXMuc3RyaWRlKTtyZXR1cm4gcy5zZXRVc2FnZSh0aGlzLnVzYWdlKSxzfW9uVXBsb2FkKHQpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9dCx0aGlzfXRvSlNPTih0KXtyZXR1cm4gdC5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJih0LmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1LdCgpKSx0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCB1dD1uZXcgQTtjbGFzcyBZbntjb25zdHJ1Y3Rvcih0LGUscyxuPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLm9mZnNldD1zLHRoaXMubm9ybWFsaXplZD1ufWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUodCl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPXR9YXBwbHlNYXRyaXg0KHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5kYXRhLmNvdW50O2U8cztlKyspdXQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHV0LmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLHV0LngsdXQueSx1dC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxzPXRoaXMuY291bnQ7ZTxzO2UrKyl1dC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksdXQuYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSx1dC54LHV0LnksdXQueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLHM9dGhpcy5jb3VudDtlPHM7ZSsrKXV0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSx1dC50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSx1dC54LHV0LnksdXQueik7cmV0dXJuIHRoaXN9Z2V0Q29tcG9uZW50KHQsZSl7bGV0IHM9dGhpcy5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHM9RXQocyx0aGlzLmFycmF5KSksc31zZXRDb21wb25lbnQodCxlLHMpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihzPSQocyx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCtlXT1zLHRoaXN9c2V0WCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPSQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09ZSx0aGlzfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09ZSx0aGlzfXNldFoodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09ZSx0aGlzfXNldFcodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM109ZSx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRZKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRaKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1nZXRXKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9RXQoZSx0aGlzLmFycmF5KSksZX1zZXRYWSh0LGUscyl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPXMsdGhpc31zZXRYWVoodCxlLHMsbil7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9JChlLHRoaXMuYXJyYXkpLHM9JChzLHRoaXMuYXJyYXkpLG49JChuLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCswXT1lLHRoaXMuZGF0YS5hcnJheVt0KzFdPXMsdGhpcy5kYXRhLmFycmF5W3QrMl09bix0aGlzfXNldFhZWlcodCxlLHMsbixpKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT0kKGUsdGhpcy5hcnJheSkscz0kKHMsdGhpcy5hcnJheSksbj0kKG4sdGhpcy5hcnJheSksaT0kKGksdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09cyx0aGlzLmRhdGEuYXJyYXlbdCsyXT1uLHRoaXMuZGF0YS5hcnJheVt0KzNdPWksdGhpc31jbG9uZSh0KXtpZih0PT09dm9pZCAwKXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCBlPVtdO2ZvcihsZXQgcz0wO3M8dGhpcy5jb3VudDtzKyspe2NvbnN0IG49cyp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgaT0wO2k8dGhpcy5pdGVtU2l6ZTtpKyspZS5wdXNoKHRoaXMuZGF0YS5hcnJheVtuK2ldKX1yZXR1cm4gbmV3IHZ0KG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGUpLHRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkKX1lbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycz09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLmNsb25lKHQpKSxuZXcgWW4odC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdLHRoaXMuaXRlbVNpemUsdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkKX10b0pTT04odCl7aWYodD09PXZvaWQgMCl7Y29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnRvSlNPTigpOiBTZXJpYWxpemluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCBlPVtdO2ZvcihsZXQgcz0wO3M8dGhpcy5jb3VudDtzKyspe2NvbnN0IG49cyp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgaT0wO2k8dGhpcy5pdGVtU2l6ZTtpKyspZS5wdXNoKHRoaXMuZGF0YS5hcnJheVtuK2ldKX1yZXR1cm57aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTplLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfX1lbHNlIHJldHVybiB0LmludGVybGVhdmVkQnVmZmVycz09PXZvaWQgMCYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzPXt9KSx0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09PT12b2lkIDAmJih0LmludGVybGVhdmVkQnVmZmVyc1t0aGlzLmRhdGEudXVpZF09dGhpcy5kYXRhLnRvSlNPTih0KSkse2lzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6ITAsaXRlbVNpemU6dGhpcy5pdGVtU2l6ZSxkYXRhOnRoaXMuZGF0YS51dWlkLG9mZnNldDp0aGlzLm9mZnNldCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fWNsYXNzIEFhIGV4dGVuZHMgRHR7Y29uc3RydWN0b3IodCxlKXtzdXBlcih7d2lkdGg6dCxoZWlnaHQ6ZX0pLHRoaXMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9ITAsdGhpcy5tYWdGaWx0ZXI9enMsdGhpcy5taW5GaWx0ZXI9enMsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y29uc3QgVHI9bmV3IEEsRHM9bmV3IEE7Y2xhc3MgWnR7Y29uc3RydWN0b3IodD1uZXcgQSxlPW5ldyBBKXt0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQpLHRoaXMuZW5kLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksdGhpcy5lbmQuY29weSh0LmVuZCksdGhpc31nZXRDZW50ZXIodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9ZGVsdGEodCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfWRpc3RhbmNlKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyh0aGlzLmVuZCl9YXQodCxlKXtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCl9Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpe1RyLnN1YlZlY3RvcnModCx0aGlzLnN0YXJ0KSxEcy5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IHM9RHMuZG90KERzKTtsZXQgaT1Ecy5kb3QoVHIpL3M7cmV0dXJuIGUmJihpPWF0KGksMCwxKSksaX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxzKXtjb25zdCBuPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKHMpLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1mdW5jdGlvbiBabihyLHQ9MCl7bGV0IGU9MzczNTkyODU1OV50LHM9MTEwMzU0Nzk5MV50O2lmKHIgaW5zdGFuY2VvZiBBcnJheSlmb3IobGV0IG49MCxpO248ci5sZW5ndGg7bisrKWk9cltuXSxlPU1hdGguaW11bChlXmksMjY1NDQzNTc2MSkscz1NYXRoLmltdWwoc15pLDE1OTczMzQ2NzcpO2Vsc2UgZm9yKGxldCBuPTAsaTtuPHIubGVuZ3RoO24rKylpPXIuY2hhckNvZGVBdChuKSxlPU1hdGguaW11bChlXmksMjY1NDQzNTc2MSkscz1NYXRoLmltdWwoc15pLDE1OTczMzQ2NzcpO3JldHVybiBlPU1hdGguaW11bChlXmU+Pj4xNiwyMjQ2ODIyNTA3KSxlXj1NYXRoLmltdWwoc15zPj4+MTMsMzI2NjQ4OTkwOSkscz1NYXRoLmltdWwoc15zPj4+MTYsMjI0NjgyMjUwNyksc149TWF0aC5pbXVsKGVeZT4+PjEzLDMyNjY0ODk5MDkpLDQyOTQ5NjcyOTYqKDIwOTcxNTEmcykrKGU+Pj4wKX1jb25zdCBNYT0oLi4ucik9PlpuKHIpO2Z1bmN0aW9uIFNhKHIsdD0hMSl7Y29uc3QgZT1bXTtyLmlzTm9kZT09PSEwJiYoZS5wdXNoKHIuaWQpLHI9ci5nZXRTZWxmKCkpO2Zvcihjb25zdHtwcm9wZXJ0eTpzLGNoaWxkTm9kZTpufW9mIEpuKHIpKWUucHVzaChlLFpuKHMuc2xpY2UoMCwtNCkpLG4uZ2V0Q2FjaGVLZXkodCkpO3JldHVybiBabihlKX1mdW5jdGlvbipKbihyLHQ9ITEpe2Zvcihjb25zdCBlIGluIHIpe2lmKGUuc3RhcnRzV2l0aCgiXyIpPT09ITApY29udGludWU7Y29uc3Qgcz1yW2VdO2lmKEFycmF5LmlzQXJyYXkocyk9PT0hMClmb3IobGV0IG49MDtuPHMubGVuZ3RoO24rKyl7Y29uc3QgaT1zW25dO2kmJihpLmlzTm9kZT09PSEwfHx0JiZ0eXBlb2YgaS50b0pTT049PSJmdW5jdGlvbiIpJiYoeWllbGR7cHJvcGVydHk6ZSxpbmRleDpuLGNoaWxkTm9kZTppfSl9ZWxzZSBpZihzJiZzLmlzTm9kZT09PSEwKXlpZWxke3Byb3BlcnR5OmUsY2hpbGROb2RlOnN9O2Vsc2UgaWYodHlwZW9mIHM9PSJvYmplY3QiKWZvcihjb25zdCBuIGluIHMpe2NvbnN0IGk9c1tuXTtpJiYoaS5pc05vZGU9PT0hMHx8dCYmdHlwZW9mIGkudG9KU09OPT0iZnVuY3Rpb24iKSYmKHlpZWxke3Byb3BlcnR5OmUsaW5kZXg6bixjaGlsZE5vZGU6aX0pfX19ZnVuY3Rpb24gVnMocil7aWYocj09bnVsbClyZXR1cm4gbnVsbDtjb25zdCB0PXR5cGVvZiByO3JldHVybiByLmlzTm9kZT09PSEwPyJub2RlIjp0PT09Im51bWJlciI/ImZsb2F0Ijp0PT09ImJvb2xlYW4iPyJib29sIjp0PT09InN0cmluZyI/InN0cmluZyI6dD09PSJmdW5jdGlvbiI/InNoYWRlciI6ci5pc1ZlY3RvcjI9PT0hMD8idmVjMiI6ci5pc1ZlY3RvcjM9PT0hMD8idmVjMyI6ci5pc1ZlY3RvcjQ9PT0hMD8idmVjNCI6ci5pc01hdHJpeDM9PT0hMD8ibWF0MyI6ci5pc01hdHJpeDQ9PT0hMD8ibWF0NCI6ci5pc0NvbG9yPT09ITA/ImNvbG9yIjpyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/IkFycmF5QnVmZmVyIjpudWxsfWZ1bmN0aW9uIE5yKHIsLi4udCl7Y29uc3QgZT1yP3Iuc2xpY2UoLTQpOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg9PT0xJiYoZT09PSJ2ZWMyIj90PVt0WzBdLHRbMF1dOmU9PT0idmVjMyI/dD1bdFswXSx0WzBdLHRbMF1dOmU9PT0idmVjNCImJih0PVt0WzBdLHRbMF0sdFswXSx0WzBdXSkpLHI9PT0iY29sb3IiP25ldyBxbiguLi50KTplPT09InZlYzIiP25ldyBKKC4uLnQpOmU9PT0idmVjMyI/bmV3IEEoLi4udCk6ZT09PSJ2ZWM0Ij9uZXcgRnQoLi4udCk6ZT09PSJtYXQzIj9uZXcgQ3QoLi4udCk6ZT09PSJtYXQ0Ij9uZXcgbnQoLi4udCk6cj09PSJib29sIj90WzBdfHwhMTpyPT09ImZsb2F0Inx8cj09PSJpbnQifHxyPT09InVpbnQiP3RbMF18fDA6cj09PSJzdHJpbmciP3RbMF18fCIiOnI9PT0iQXJyYXlCdWZmZXIiP3phKHRbMF0pOm51bGx9ZnVuY3Rpb24gX2Eocil7bGV0IHQ9IiI7Y29uc3QgZT1uZXcgVWludDhBcnJheShyKTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbc10pO3JldHVybiBidG9hKHQpfWZ1bmN0aW9uIHphKHIpe3JldHVybiBVaW50OEFycmF5LmZyb20oYXRvYihyKSx0PT50LmNoYXJDb2RlQXQoMCkpLmJ1ZmZlcn1jb25zdCB3cj17VkVSVEVYOiJ2ZXJ0ZXgiLEZSQUdNRU5UOiJmcmFnbWVudCJ9LFE9e05PTkU6Im5vbmUiLEZSQU1FOiJmcmFtZSIsUkVOREVSOiJyZW5kZXIiLE9CSkVDVDoib2JqZWN0In0sbnM9WyJ4IiwieSIsInoiLCJ3Il07bGV0IGJhPTA7Y2xhc3MgVSBleHRlbmRzIFple3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJOb2RlIn1jb25zdHJ1Y3Rvcih0PW51bGwpe3N1cGVyKCksdGhpcy5ub2RlVHlwZT10LHRoaXMudXBkYXRlVHlwZT1RLk5PTkUsdGhpcy51cGRhdGVCZWZvcmVUeXBlPVEuTk9ORSx0aGlzLnVwZGF0ZUFmdGVyVHlwZT1RLk5PTkUsdGhpcy51dWlkPWVhLmdlbmVyYXRlVVVJRCgpLHRoaXMudmVyc2lvbj0wLHRoaXMuX2NhY2hlS2V5PW51bGwsdGhpcy5fY2FjaGVLZXlWZXJzaW9uPTAsdGhpcy5nbG9iYWw9ITEsdGhpcy5pc05vZGU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6YmErK30pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfWdldCB0eXBlKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudHlwZX1vblVwZGF0ZSh0LGUpe3JldHVybiB0aGlzLnVwZGF0ZVR5cGU9ZSx0aGlzLnVwZGF0ZT10LmJpbmQodGhpcy5nZXRTZWxmKCkpLHRoaXN9b25GcmFtZVVwZGF0ZSh0KXtyZXR1cm4gdGhpcy5vblVwZGF0ZSh0LFEuRlJBTUUpfW9uUmVuZGVyVXBkYXRlKHQpe3JldHVybiB0aGlzLm9uVXBkYXRlKHQsUS5SRU5ERVIpfW9uT2JqZWN0VXBkYXRlKHQpe3JldHVybiB0aGlzLm9uVXBkYXRlKHQsUS5PQkpFQ1QpfW9uUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnVwZGF0ZVJlZmVyZW5jZT10LmJpbmQodGhpcy5nZXRTZWxmKCkpLHRoaXN9Z2V0U2VsZigpe3JldHVybiB0aGlzLnNlbGZ8fHRoaXN9dXBkYXRlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXN9aXNHbG9iYWwoKXtyZXR1cm4gdGhpcy5nbG9iYWx9KmdldENoaWxkcmVuKCl7Zm9yKGNvbnN0e2NoaWxkTm9kZTp0fW9mIEpuKHRoaXMpKXlpZWxkIHR9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmF2ZXJzZSh0KXt0KHRoaXMpO2Zvcihjb25zdCBlIG9mIHRoaXMuZ2V0Q2hpbGRyZW4oKSllLnRyYXZlcnNlKHQpfWdldENhY2hlS2V5KHQ9ITEpe3JldHVybiB0PXR8fHRoaXMudmVyc2lvbiE9PXRoaXMuX2NhY2hlS2V5VmVyc2lvbiwodD09PSEwfHx0aGlzLl9jYWNoZUtleT09PW51bGwpJiYodGhpcy5fY2FjaGVLZXk9U2EodGhpcyx0KSx0aGlzLl9jYWNoZUtleVZlcnNpb249dGhpcy52ZXJzaW9uKSx0aGlzLl9jYWNoZUtleX1nZXRTY29wZSgpe3JldHVybiB0aGlzfWdldEhhc2goKXtyZXR1cm4gdGhpcy51dWlkfWdldFVwZGF0ZVR5cGUoKXtyZXR1cm4gdGhpcy51cGRhdGVUeXBlfWdldFVwZGF0ZUJlZm9yZVR5cGUoKXtyZXR1cm4gdGhpcy51cGRhdGVCZWZvcmVUeXBlfWdldFVwZGF0ZUFmdGVyVHlwZSgpe3JldHVybiB0aGlzLnVwZGF0ZUFmdGVyVHlwZX1nZXRFbGVtZW50VHlwZSh0KXtjb25zdCBlPXRoaXMuZ2V0Tm9kZVR5cGUodCk7cmV0dXJuIHQuZ2V0RWxlbWVudFR5cGUoZSl9Z2V0Tm9kZVR5cGUodCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO3JldHVybiBlLm91dHB1dE5vZGU/ZS5vdXRwdXROb2RlLmdldE5vZGVUeXBlKHQpOnRoaXMubm9kZVR5cGV9Z2V0U2hhcmVkKHQpe2NvbnN0IGU9dGhpcy5nZXRIYXNoKHQpO3JldHVybiB0LmdldE5vZGVGcm9tSGFzaChlKXx8dGhpc31zZXR1cCh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7bGV0IHM9MDtmb3IoY29uc3QgbiBvZiB0aGlzLmdldENoaWxkcmVuKCkpZVsibm9kZSIrcysrXT1uO3JldHVybiBudWxsfWFuYWx5emUodCl7aWYodC5pbmNyZWFzZVVzYWdlKHRoaXMpPT09MSl7Y29uc3Qgcz10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO2Zvcihjb25zdCBuIG9mIE9iamVjdC52YWx1ZXMocykpbiYmbi5pc05vZGU9PT0hMCYmbi5idWlsZCh0KX19Z2VuZXJhdGUodCxlKXtjb25zdHtvdXRwdXROb2RlOnN9PXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7aWYocyYmcy5pc05vZGU9PT0hMClyZXR1cm4gcy5idWlsZCh0LGUpfXVwZGF0ZUJlZm9yZSgpe2NvbnNvbGUud2FybigiQWJzdHJhY3QgZnVuY3Rpb24uIil9dXBkYXRlQWZ0ZXIoKXtjb25zb2xlLndhcm4oIkFic3RyYWN0IGZ1bmN0aW9uLiIpfXVwZGF0ZSgpe2NvbnNvbGUud2FybigiQWJzdHJhY3QgZnVuY3Rpb24uIil9YnVpbGQodCxlPW51bGwpe2NvbnN0IHM9dGhpcy5nZXRTaGFyZWQodCk7aWYodGhpcyE9PXMpcmV0dXJuIHMuYnVpbGQodCxlKTt0LmFkZE5vZGUodGhpcyksdC5hZGRDaGFpbih0aGlzKTtsZXQgbj1udWxsO2NvbnN0IGk9dC5nZXRCdWlsZFN0YWdlKCk7aWYoaT09PSJzZXR1cCIpe3RoaXMudXBkYXRlUmVmZXJlbmNlKHQpO2NvbnN0IG89dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtpZihvLmluaXRpYWxpemVkIT09ITApe2NvbnN0IGE9dC5zdGFjay5ub2Rlcy5sZW5ndGg7by5pbml0aWFsaXplZD0hMCxvLm91dHB1dE5vZGU9dGhpcy5zZXR1cCh0KSxvLm91dHB1dE5vZGUhPT1udWxsJiZ0LnN0YWNrLm5vZGVzLmxlbmd0aDtmb3IoY29uc3QgYyBvZiBPYmplY3QudmFsdWVzKG8pKWMmJmMuaXNOb2RlPT09ITAmJmMuYnVpbGQodCl9fWVsc2UgaWYoaT09PSJhbmFseXplIil0aGlzLmFuYWx5emUodCk7ZWxzZSBpZihpPT09ImdlbmVyYXRlIilpZih0aGlzLmdlbmVyYXRlLmxlbmd0aD09PTEpe2NvbnN0IGE9dGhpcy5nZXROb2RlVHlwZSh0KSxjPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO249Yy5zbmlwcGV0LG49PT12b2lkIDA/KG49dGhpcy5nZW5lcmF0ZSh0KXx8IiIsYy5zbmlwcGV0PW4pOmMuZmxvd0NvZGVzIT09dm9pZCAwJiZ0LmNvbnRleHQubm9kZUJsb2NrIT09dm9pZCAwJiZ0LmFkZEZsb3dDb2RlSGllcmFyY2h5KHRoaXMsdC5jb250ZXh0Lm5vZGVCbG9jayksbj10LmZvcm1hdChuLGEsZSl9ZWxzZSBuPXRoaXMuZ2VuZXJhdGUodCxlKXx8IiI7cmV0dXJuIHQucmVtb3ZlQ2hhaW4odGhpcyksbn1nZXRTZXJpYWxpemVDaGlsZHJlbigpe3JldHVybiBKbih0aGlzKX1zZXJpYWxpemUodCl7Y29uc3QgZT10aGlzLmdldFNlcmlhbGl6ZUNoaWxkcmVuKCkscz17fTtmb3IoY29uc3R7cHJvcGVydHk6bixpbmRleDppLGNoaWxkTm9kZTpvfW9mIGUpaSE9PXZvaWQgMD8oc1tuXT09PXZvaWQgMCYmKHNbbl09TnVtYmVyLmlzSW50ZWdlcihpKT9bXTp7fSksc1tuXVtpXT1vLnRvSlNPTih0Lm1ldGEpLnV1aWQpOnNbbl09by50b0pTT04odC5tZXRhKS51dWlkO09iamVjdC5rZXlzKHMpLmxlbmd0aD4wJiYodC5pbnB1dE5vZGVzPXMpfWRlc2VyaWFsaXplKHQpe2lmKHQuaW5wdXROb2RlcyE9PXZvaWQgMCl7Y29uc3QgZT10Lm1ldGEubm9kZXM7Zm9yKGNvbnN0IHMgaW4gdC5pbnB1dE5vZGVzKWlmKEFycmF5LmlzQXJyYXkodC5pbnB1dE5vZGVzW3NdKSl7Y29uc3Qgbj1bXTtmb3IoY29uc3QgaSBvZiB0LmlucHV0Tm9kZXNbc10pbi5wdXNoKGVbaV0pO3RoaXNbc109bn1lbHNlIGlmKHR5cGVvZiB0LmlucHV0Tm9kZXNbc109PSJvYmplY3QiKXtjb25zdCBuPXt9O2Zvcihjb25zdCBpIGluIHQuaW5wdXROb2Rlc1tzXSl7Y29uc3Qgbz10LmlucHV0Tm9kZXNbc11baV07bltpXT1lW29dfXRoaXNbc109bn1lbHNle2NvbnN0IG49dC5pbnB1dE5vZGVzW3NdO3RoaXNbc109ZVtuXX19fXRvSlNPTih0KXtjb25zdHt1dWlkOmUsdHlwZTpzfT10aGlzLG49dD09PXZvaWQgMHx8dHlwZW9mIHQ9PSJzdHJpbmciO24mJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e30sbm9kZXM6e319KTtsZXQgaT10Lm5vZGVzW2VdO2k9PT12b2lkIDAmJihpPXt1dWlkOmUsdHlwZTpzLG1ldGE6dCxtZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiTm9kZSIsZ2VuZXJhdG9yOiJOb2RlLnRvSlNPTiJ9fSxuIT09ITAmJih0Lm5vZGVzW2kudXVpZF09aSksdGhpcy5zZXJpYWxpemUoaSksZGVsZXRlIGkubWV0YSk7ZnVuY3Rpb24gbyhhKXtjb25zdCBjPVtdO2Zvcihjb25zdCB1IGluIGEpe2NvbnN0IGg9YVt1XTtkZWxldGUgaC5tZXRhZGF0YSxjLnB1c2goaCl9cmV0dXJuIGN9aWYobil7Y29uc3QgYT1vKHQudGV4dHVyZXMpLGM9byh0LmltYWdlcyksdT1vKHQubm9kZXMpO2EubGVuZ3RoPjAmJihpLnRleHR1cmVzPWEpLGMubGVuZ3RoPjAmJihpLmltYWdlcz1jKSx1Lmxlbmd0aD4wJiYoaS5ub2Rlcz11KX1yZXR1cm4gaX19Y2xhc3MgaXMgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBcnJheUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5pbmRleE5vZGU9ZSx0aGlzLmlzQXJyYXlFbGVtZW50Tm9kZT0hMH1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldEVsZW1lbnRUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5ub2RlLmJ1aWxkKHQpLHM9dGhpcy5pbmRleE5vZGUuYnVpbGQodCwidWludCIpO3JldHVybmAke2V9WyAke3N9IF1gfX1jbGFzcyBBciBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkNvbnZlcnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5jb252ZXJ0VG89ZX1nZXROb2RlVHlwZSh0KXtjb25zdCBlPXRoaXMubm9kZS5nZXROb2RlVHlwZSh0KTtsZXQgcz1udWxsO2Zvcihjb25zdCBuIG9mIHRoaXMuY29udmVydFRvLnNwbGl0KCJ8IikpKHM9PT1udWxsfHx0LmdldFR5cGVMZW5ndGgoZSk9PT10LmdldFR5cGVMZW5ndGgobikpJiYocz1uKTtyZXR1cm4gc31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQuY29udmVydFRvPXRoaXMuY29udmVydFRvfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuY29udmVydFRvPXQuY29udmVydFRvfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLm5vZGUsbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9cy5idWlsZCh0LG4pO3JldHVybiB0LmZvcm1hdChpLG4sZSl9fWNsYXNzIGR0IGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVGVtcE5vZGUifWNvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuaXNUZW1wTm9kZT0hMH1oYXNEZXBlbmRlbmNpZXModCl7cmV0dXJuIHQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpLnVzYWdlQ291bnQ+MX1idWlsZCh0LGUpe2lmKHQuZ2V0QnVpbGRTdGFnZSgpPT09ImdlbmVyYXRlIil7Y29uc3Qgbj10LmdldFZlY3RvclR5cGUodGhpcy5nZXROb2RlVHlwZSh0LGUpKSxpPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO2lmKGkucHJvcGVydHlOYW1lIT09dm9pZCAwKXJldHVybiB0LmZvcm1hdChpLnByb3BlcnR5TmFtZSxuLGUpO2lmKG4hPT0idm9pZCImJmUhPT0idm9pZCImJnRoaXMuaGFzRGVwZW5kZW5jaWVzKHQpKXtjb25zdCBvPXN1cGVyLmJ1aWxkKHQsbiksYT10LmdldFZhckZyb21Ob2RlKHRoaXMsbnVsbCxuKSxjPXQuZ2V0UHJvcGVydHlOYW1lKGEpO3JldHVybiB0LmFkZExpbmVGbG93Q29kZShgJHtjfSA9ICR7b31gLHRoaXMpLGkuc25pcHBldD1vLGkucHJvcGVydHlOYW1lPWMsdC5mb3JtYXQoaS5wcm9wZXJ0eU5hbWUsbixlKX19cmV0dXJuIHN1cGVyLmJ1aWxkKHQsZSl9fWNsYXNzIEVhIGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkpvaW5Ob2RlIn1jb25zdHJ1Y3Rvcih0PVtdLGU9bnVsbCl7c3VwZXIoZSksdGhpcy5ub2Rlcz10fWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGVUeXBlIT09bnVsbD90LmdldFZlY3RvclR5cGUodGhpcy5ub2RlVHlwZSk6dC5nZXRUeXBlRnJvbUxlbmd0aCh0aGlzLm5vZGVzLnJlZHVjZSgoZSxzKT0+ZSt0LmdldFR5cGVMZW5ndGgocy5nZXROb2RlVHlwZSh0KSksMCkpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldE5vZGVUeXBlKHQpLG49dGhpcy5ub2RlcyxpPXQuZ2V0Q29tcG9uZW50VHlwZShzKSxvPVtdO2Zvcihjb25zdCBjIG9mIG4pe2xldCB1PWMuYnVpbGQodCk7Y29uc3QgaD10LmdldENvbXBvbmVudFR5cGUoYy5nZXROb2RlVHlwZSh0KSk7aCE9PWkmJih1PXQuZm9ybWF0KHUsaCxpKSksby5wdXNoKHUpfWNvbnN0IGE9YCR7dC5nZXRUeXBlKHMpfSggJHtvLmpvaW4oIiwgIil9IClgO3JldHVybiB0LmZvcm1hdChhLHMsZSl9fWNvbnN0IENhPW5zLmpvaW4oIiIpO2NsYXNzIE1yIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iU3BsaXROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9IngiKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMuY29tcG9uZW50cz1lLHRoaXMuaXNTcGxpdE5vZGU9ITB9Z2V0VmVjdG9yTGVuZ3RoKCl7bGV0IHQ9dGhpcy5jb21wb25lbnRzLmxlbmd0aDtmb3IoY29uc3QgZSBvZiB0aGlzLmNvbXBvbmVudHMpdD1NYXRoLm1heChucy5pbmRleE9mKGUpKzEsdCk7cmV0dXJuIHR9Z2V0Q29tcG9uZW50VHlwZSh0KXtyZXR1cm4gdC5nZXRDb21wb25lbnRUeXBlKHRoaXMubm9kZS5nZXROb2RlVHlwZSh0KSl9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHQuZ2V0VHlwZUZyb21MZW5ndGgodGhpcy5jb21wb25lbnRzLmxlbmd0aCx0aGlzLmdldENvbXBvbmVudFR5cGUodCkpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLm5vZGUsbj10LmdldFR5cGVMZW5ndGgocy5nZXROb2RlVHlwZSh0KSk7bGV0IGk9bnVsbDtpZihuPjEpe2xldCBvPW51bGw7dGhpcy5nZXRWZWN0b3JMZW5ndGgoKT49biYmKG89dC5nZXRUeXBlRnJvbUxlbmd0aCh0aGlzLmdldFZlY3Rvckxlbmd0aCgpLHRoaXMuZ2V0Q29tcG9uZW50VHlwZSh0KSkpO2NvbnN0IGM9cy5idWlsZCh0LG8pO3RoaXMuY29tcG9uZW50cy5sZW5ndGg9PT1uJiZ0aGlzLmNvbXBvbmVudHM9PT1DYS5zbGljZSgwLHRoaXMuY29tcG9uZW50cy5sZW5ndGgpP2k9dC5mb3JtYXQoYyxvLGUpOmk9dC5mb3JtYXQoYCR7Y30uJHt0aGlzLmNvbXBvbmVudHN9YCx0aGlzLmdldE5vZGVUeXBlKHQpLGUpfWVsc2UgaT1zLmJ1aWxkKHQsZSk7cmV0dXJuIGl9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0LmNvbXBvbmVudHM9dGhpcy5jb21wb25lbnRzfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuY29tcG9uZW50cz10LmNvbXBvbmVudHN9fWNsYXNzIEZhIGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlNldE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzKXtzdXBlcigpLHRoaXMuc291cmNlTm9kZT10LHRoaXMuY29tcG9uZW50cz1lLHRoaXMudGFyZ2V0Tm9kZT1zfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3R7c291cmNlTm9kZTplLGNvbXBvbmVudHM6cyx0YXJnZXROb2RlOm59PXRoaXMsaT10aGlzLmdldE5vZGVUeXBlKHQpLG89dC5nZXRUeXBlRnJvbUxlbmd0aChzLmxlbmd0aCxuLmdldE5vZGVUeXBlKHQpKSxhPW4uYnVpbGQodCxvKSxjPWUuYnVpbGQodCxpKSx1PXQuZ2V0VHlwZUxlbmd0aChpKSxoPVtdO2ZvcihsZXQgbD0wO2w8dTtsKyspe2NvbnN0IGQ9bnNbbF07ZD09PXNbMF0/KGgucHVzaChhKSxsKz1zLmxlbmd0aC0xKTpoLnB1c2goYysiLiIrZCl9cmV0dXJuYCR7dC5nZXRUeXBlKGkpfSggJHtoLmpvaW4oIiwgIil9IClgfX1jbGFzcyBSYSBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGbGlwTm9kZSJ9Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuc291cmNlTm9kZT10LHRoaXMuY29tcG9uZW50cz1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNvdXJjZU5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3R7Y29tcG9uZW50czplLHNvdXJjZU5vZGU6c309dGhpcyxuPXRoaXMuZ2V0Tm9kZVR5cGUodCksaT1zLmJ1aWxkKHQpLG89dC5nZXRWYXJGcm9tTm9kZSh0aGlzKSxhPXQuZ2V0UHJvcGVydHlOYW1lKG8pO3QuYWRkTGluZUZsb3dDb2RlKGErIiA9ICIraSx0aGlzKTtjb25zdCBjPXQuZ2V0VHlwZUxlbmd0aChuKSx1PVtdO2xldCBoPTA7Zm9yKGxldCBsPTA7bDxjO2wrKyl7Y29uc3QgZD1uc1tsXTtkPT09ZVtoXT8odS5wdXNoKCIxLjAgLSAiKyhhKyIuIitkKSksaCsrKTp1LnB1c2goYSsiLiIrZCl9cmV0dXJuYCR7dC5nZXRUeXBlKG4pfSggJHt1LmpvaW4oIiwgIil9IClgfX1jbGFzcyBqbiBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIklucHV0Tm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwpe3N1cGVyKGUpLHRoaXMuaXNJbnB1dE5vZGU9ITAsdGhpcy52YWx1ZT10LHRoaXMucHJlY2lzaW9uPW51bGx9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy5ub2RlVHlwZT09PW51bGw/VnModGhpcy52YWx1ZSk6dGhpcy5ub2RlVHlwZX1nZXRJbnB1dFR5cGUodCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZVR5cGUodCl9c2V0UHJlY2lzaW9uKHQpe3JldHVybiB0aGlzLnByZWNpc2lvbj10LHRoaXN9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0LnZhbHVlPXRoaXMudmFsdWUsdGhpcy52YWx1ZSYmdGhpcy52YWx1ZS50b0FycmF5JiYodC52YWx1ZT10aGlzLnZhbHVlLnRvQXJyYXkoKSksdC52YWx1ZVR5cGU9VnModGhpcy52YWx1ZSksdC5ub2RlVHlwZT10aGlzLm5vZGVUeXBlLHQudmFsdWVUeXBlPT09IkFycmF5QnVmZmVyIiYmKHQudmFsdWU9X2EodC52YWx1ZSkpLHQucHJlY2lzaW9uPXRoaXMucHJlY2lzaW9ufWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMubm9kZVR5cGU9dC5ub2RlVHlwZSx0aGlzLnZhbHVlPUFycmF5LmlzQXJyYXkodC52YWx1ZSk/TnIodC52YWx1ZVR5cGUsLi4udC52YWx1ZSk6dC52YWx1ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbnx8bnVsbCx0aGlzLnZhbHVlJiZ0aGlzLnZhbHVlLmZyb21BcnJheSYmKHRoaXMudmFsdWU9dGhpcy52YWx1ZS5mcm9tQXJyYXkodC52YWx1ZSkpfWdlbmVyYXRlKCl7Y29uc29sZS53YXJuKCJBYnN0cmFjdCBmdW5jdGlvbi4iKX19Y2xhc3MgSnQgZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQ29uc3ROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIodCxlKSx0aGlzLmlzQ29uc3ROb2RlPSEwfWdlbmVyYXRlQ29uc3QodCl7cmV0dXJuIHQuZ2VuZXJhdGVDb25zdCh0aGlzLmdldE5vZGVUeXBlKHQpLHRoaXMudmFsdWUpfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldE5vZGVUeXBlKHQpO3JldHVybiB0LmZvcm1hdCh0aGlzLmdlbmVyYXRlQ29uc3QodCkscyxlKX19bGV0IFNyPW51bGw7Y29uc3QgQ2U9bmV3IE1hcDtmdW5jdGlvbiBiKHIsdCl7aWYoQ2UuaGFzKHIpKXtjb25zb2xlLndhcm4oYFJlZGVmaW5pdGlvbiBvZiBtZXRob2QgY2hhaW5pbmcgJHtyfWApO3JldHVybn1pZih0eXBlb2YgdCE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYE5vZGUgZWxlbWVudCAke3J9IGlzIG5vdCBhIGZ1bmN0aW9uYCk7Q2Uuc2V0KHIsdCl9Y29uc3QgX3I9cj0+ci5yZXBsYWNlKC9yfHMvZywieCIpLnJlcGxhY2UoL2d8dC9nLCJ5IikucmVwbGFjZSgvYnxwL2csInoiKS5yZXBsYWNlKC9hfHEvZywidyIpLHpyPXI9Pl9yKHIpLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIiksYnI9e3NldHVwKHIsdCl7Y29uc3QgZT10LnNoaWZ0KCk7cmV0dXJuIHIoSHMoZSksLi4udCl9LGdldChyLHQsZSl7aWYodHlwZW9mIHQ9PSJzdHJpbmciJiZyW3RdPT09dm9pZCAwKXtpZihyLmlzU3RhY2tOb2RlIT09ITAmJnQ9PT0iYXNzaWduIilyZXR1cm4oLi4ucyk9PihTci5hc3NpZ24oZSwuLi5zKSxlKTtpZihDZS5oYXModCkpe2NvbnN0IHM9Q2UuZ2V0KHQpO3JldHVybiByLmlzU3RhY2tOb2RlPyguLi5uKT0+ZS5hZGQocyguLi5uKSk6KC4uLm4pPT5zKGUsLi4ubil9ZWxzZXtpZih0PT09InNlbGYiKXJldHVybiByO2lmKHQuZW5kc1dpdGgoIkFzc2lnbiIpJiZDZS5oYXModC5zbGljZSgwLHQubGVuZ3RoLTYpKSl7Y29uc3Qgcz1DZS5nZXQodC5zbGljZSgwLHQubGVuZ3RoLTYpKTtyZXR1cm4gci5pc1N0YWNrTm9kZT8oLi4ubik9PmUuYXNzaWduKG5bMF0scyguLi5uKSk6KC4uLm4pPT5lLmFzc2lnbihzKGUsLi4ubikpfWVsc2V7aWYoL15beHl6d3JnYmFzdHBxXXsxLDR9JC8udGVzdCh0KT09PSEwKXJldHVybiB0PV9yKHQpLHYobmV3IE1yKGUsdCkpO2lmKC9ec2V0W1hZWldSR0JBU1RQUV17MSw0fSQvLnRlc3QodCk9PT0hMClyZXR1cm4gdD16cih0LnNsaWNlKDMpLnRvTG93ZXJDYXNlKCkpLHM9PnYobmV3IEZhKHIsdCxzKSk7aWYoL15mbGlwW1hZWldSR0JBU1RQUV17MSw0fSQvLnRlc3QodCk9PT0hMClyZXR1cm4gdD16cih0LnNsaWNlKDQpLnRvTG93ZXJDYXNlKCkpLCgpPT52KG5ldyBSYSh2KHIpLHQpKTtpZih0PT09IndpZHRoInx8dD09PSJoZWlnaHQifHx0PT09ImRlcHRoIilyZXR1cm4gdD09PSJ3aWR0aCI/dD0ieCI6dD09PSJoZWlnaHQiP3Q9InkiOnQ9PT0iZGVwdGgiJiYodD0ieiIpLHYobmV3IE1yKHIsdCkpO2lmKC9eXGQrJC8udGVzdCh0KT09PSEwKXJldHVybiB2KG5ldyBpcyhlLG5ldyBKdChOdW1iZXIodCksInVpbnQiKSkpfX19cmV0dXJuIFJlZmxlY3QuZ2V0KHIsdCxlKX0sc2V0KHIsdCxlLHMpe3JldHVybiB0eXBlb2YgdD09InN0cmluZyImJnJbdF09PT12b2lkIDAmJigvXlt4eXp3cmdiYXN0cHFdezEsNH0kLy50ZXN0KHQpPT09ITB8fHQ9PT0id2lkdGgifHx0PT09ImhlaWdodCJ8fHQ9PT0iZGVwdGgifHwvXlxkKyQvLnRlc3QodCk9PT0hMCk/KHNbdF0uYXNzaWduKGUpLCEwKTpSZWZsZWN0LnNldChyLHQsZSxzKX19LFFuPW5ldyBXZWFrTWFwLEVyPW5ldyBXZWFrTWFwLEJhPWZ1bmN0aW9uKHIsdD1udWxsKXtjb25zdCBlPVZzKHIpO2lmKGU9PT0ibm9kZSIpe2xldCBzPVFuLmdldChyKTtyZXR1cm4gcz09PXZvaWQgMCYmKHM9bmV3IFByb3h5KHIsYnIpLFFuLnNldChyLHMpLFFuLnNldChzLHMpKSxzfWVsc2V7aWYodD09PW51bGwmJihlPT09ImZsb2F0Inx8ZT09PSJib29sZWFuIil8fGUmJmUhPT0ic2hhZGVyIiYmZSE9PSJzdHJpbmciKXJldHVybiB2KHNpKHIsdCkpO2lmKGU9PT0ic2hhZGVyIilyZXR1cm4gdHQocil9cmV0dXJuIHJ9LElhPWZ1bmN0aW9uKHIsdD1udWxsKXtmb3IoY29uc3QgZSBpbiByKXJbZV09dihyW2VdLHQpO3JldHVybiByfSx2YT1mdW5jdGlvbihyLHQ9bnVsbCl7Y29uc3QgZT1yLmxlbmd0aDtmb3IobGV0IHM9MDtzPGU7cysrKXJbc109dihyW3NdLHQpO3JldHVybiByfSxQYT1mdW5jdGlvbihyLHQ9bnVsbCxlPW51bGwscz1udWxsKXtjb25zdCBuPWk9PnYocyE9PW51bGw/T2JqZWN0LmFzc2lnbihpLHMpOmkpO3JldHVybiB0PT09bnVsbD8oLi4uaSk9Pm4obmV3IHIoLi4uRmUoaSkpKTplIT09bnVsbD8oZT12KGUpLCguLi5pKT0+bihuZXcgcih0LC4uLkZlKGkpLGUpKSk6KC4uLmkpPT5uKG5ldyByKHQsLi4uRmUoaSkpKX0sTGE9ZnVuY3Rpb24ociwuLi50KXtyZXR1cm4gdihuZXcgciguLi5GZSh0KSkpfTtjbGFzcyBPYSBleHRlbmRzIFV7Y29uc3RydWN0b3IodCxlKXtzdXBlcigpLHRoaXMuc2hhZGVyTm9kZT10LHRoaXMuaW5wdXROb2Rlcz1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnNoYWRlck5vZGUubm9kZVR5cGV8fHRoaXMuZ2V0T3V0cHV0Tm9kZSh0KS5nZXROb2RlVHlwZSh0KX1jYWxsKHQpe2NvbnN0e3NoYWRlck5vZGU6ZSxpbnB1dE5vZGVzOnN9PXRoaXMsbj10LmdldE5vZGVQcm9wZXJ0aWVzKGUpO2lmKG4ub25jZU91dHB1dClyZXR1cm4gbi5vbmNlT3V0cHV0O2xldCBpPW51bGw7aWYoZS5sYXlvdXQpe2xldCBvPUVyLmdldCh0LmNvbnN0cnVjdG9yKTtvPT09dm9pZCAwJiYobz1uZXcgV2Vha01hcCxFci5zZXQodC5jb25zdHJ1Y3RvcixvKSk7bGV0IGE9by5nZXQoZSk7YT09PXZvaWQgMCYmKGE9dih0LmJ1aWxkRnVuY3Rpb25Ob2RlKGUpKSxvLnNldChlLGEpKSx0LmN1cnJlbnRGdW5jdGlvbk5vZGUhPT1udWxsJiZ0LmN1cnJlbnRGdW5jdGlvbk5vZGUuaW5jbHVkZXMucHVzaChhKSxpPXYoYS5jYWxsKHMpKX1lbHNle2NvbnN0IG89ZS5qc0Z1bmMsYT1zIT09bnVsbD9vKHMsdCk6byh0KTtpPXYoYSl9cmV0dXJuIGUub25jZSYmKG4ub25jZU91dHB1dD1pKSxpfWdldE91dHB1dE5vZGUodCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO3JldHVybiBlLm91dHB1dE5vZGU9PT1udWxsJiYoZS5vdXRwdXROb2RlPXRoaXMuc2V0dXBPdXRwdXQodCkpLGUub3V0cHV0Tm9kZX1zZXR1cCh0KXtyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKHQpfXNldHVwT3V0cHV0KHQpe3JldHVybiB0LmFkZFN0YWNrKCksdC5zdGFjay5vdXRwdXROb2RlPXRoaXMuY2FsbCh0KSx0LnJlbW92ZVN0YWNrKCl9Z2VuZXJhdGUodCxlKXtyZXR1cm4gdGhpcy5nZXRPdXRwdXROb2RlKHQpLmJ1aWxkKHQsZSl9fWNsYXNzIERhIGV4dGVuZHMgVXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKGUpLHRoaXMuanNGdW5jPXQsdGhpcy5sYXlvdXQ9bnVsbCx0aGlzLmdsb2JhbD0hMCx0aGlzLm9uY2U9ITF9c2V0TGF5b3V0KHQpe3JldHVybiB0aGlzLmxheW91dD10LHRoaXN9Y2FsbCh0PW51bGwpe3JldHVybiBIcyh0KSx2KG5ldyBPYSh0aGlzLHQpKX1zZXR1cCgpe3JldHVybiB0aGlzLmNhbGwoKX19Y29uc3QgVmE9WyExLCEwXSxVYT1bMCwxLDIsM10sa2E9Wy0xLC0yXSxDcj1bLjUsMS41LDEvMywxZS02LDFlNixNYXRoLlBJLE1hdGguUEkqMiwxL01hdGguUEksMi9NYXRoLlBJLDEvKE1hdGguUEkqMiksTWF0aC5QSS8yXSxLbj1uZXcgTWFwO2Zvcihjb25zdCByIG9mIFZhKUtuLnNldChyLG5ldyBKdChyKSk7Y29uc3QgdGk9bmV3IE1hcDtmb3IoY29uc3QgciBvZiBVYSl0aS5zZXQocixuZXcgSnQociwidWludCIpKTtjb25zdCBlaT1uZXcgTWFwKFsuLi50aV0ubWFwKHI9Pm5ldyBKdChyLnZhbHVlLCJpbnQiKSkpO2Zvcihjb25zdCByIG9mIGthKWVpLnNldChyLG5ldyBKdChyLCJpbnQiKSk7Y29uc3QgVXM9bmV3IE1hcChbLi4uZWldLm1hcChyPT5uZXcgSnQoci52YWx1ZSkpKTtmb3IoY29uc3QgciBvZiBDcilVcy5zZXQocixuZXcgSnQocikpO2Zvcihjb25zdCByIG9mIENyKVVzLnNldCgtcixuZXcgSnQoLXIpKTtjb25zdCBrcz17Ym9vbDpLbix1aW50OnRpLGludHM6ZWksZmxvYXQ6VXN9LEZyPW5ldyBNYXAoWy4uLktuLC4uLlVzXSksc2k9KHIsdCk9PkZyLmhhcyhyKT9Gci5nZXQocik6ci5pc05vZGU9PT0hMD9yOm5ldyBKdChyLHQpLEhhPXI9Pnt0cnl7cmV0dXJuIHIuZ2V0Tm9kZVR5cGUoKX1jYXRjaHtyZXR1cm59fSxLPWZ1bmN0aW9uKHIsdD1udWxsKXtyZXR1cm4oLi4uZSk9PntpZigoZS5sZW5ndGg9PT0wfHwhWyJib29sIiwiZmxvYXQiLCJpbnQiLCJ1aW50Il0uaW5jbHVkZXMocikmJmUuZXZlcnkobj0+dHlwZW9mIG4hPSJvYmplY3QiKSkmJihlPVtOcihyLC4uLmUpXSksZS5sZW5ndGg9PT0xJiZ0IT09bnVsbCYmdC5oYXMoZVswXSkpcmV0dXJuIHYodC5nZXQoZVswXSkpO2lmKGUubGVuZ3RoPT09MSl7Y29uc3Qgbj1zaShlWzBdLHIpO3JldHVybiBIYShuKT09PXI/dihuKTp2KG5ldyBBcihuLHIpKX1jb25zdCBzPWUubWFwKG49PnNpKG4pKTtyZXR1cm4gdihuZXcgRWEocyxyKSl9fSxxYT1yPT5yIT1udWxsP3Iubm9kZVR5cGV8fHIuY29udmVydFRvfHwodHlwZW9mIHI9PSJzdHJpbmciP3I6bnVsbCk6bnVsbDtmdW5jdGlvbiAkYShyLHQpe3JldHVybiBuZXcgUHJveHkobmV3IERhKHIsdCksYnIpfWNvbnN0IHY9KHIsdD1udWxsKT0+QmEocix0KSxIcz0ocix0PW51bGwpPT5uZXcgSWEocix0KSxGZT0ocix0PW51bGwpPT5uZXcgdmEocix0KSxDPSguLi5yKT0+bmV3IFBhKC4uLnIpLE89KC4uLnIpPT5uZXcgTGEoLi4uciksdHQ9KHIsdCk9Pntjb25zdCBlPW5ldyAkYShyLHQpLHM9KC4uLm4pPT57bGV0IGk7cmV0dXJuIEhzKG4pLG5bMF0mJm5bMF0uaXNOb2RlP2k9Wy4uLm5dOmk9blswXSxlLmNhbGwoaSl9O3JldHVybiBzLnNoYWRlck5vZGU9ZSxzLnNldExheW91dD1uPT4oZS5zZXRMYXlvdXQobikscykscy5vbmNlPSgpPT4oZS5vbmNlPSEwLHMpLHN9O2IoInRvR2xvYmFsIixyPT4oci5nbG9iYWw9ITAscikpO2NvbnN0IG5pPSguLi5yKT0+U3IuSWYoLi4ucik7ZnVuY3Rpb24gR2Eocil7cmV0dXJuIHJ9YigiYXBwZW5kIixHYSk7Y29uc3QgV2E9bmV3IEsoImNvbG9yIikscT1uZXcgSygiZmxvYXQiLGtzLmZsb2F0KSxSZT1uZXcgSygiaW50Iixrcy5pbnRzKSxYYT1uZXcgSygidWludCIsa3MudWludCksWWE9bmV3IEsoImJvb2wiLGtzLmJvb2wpLEQ9bmV3IEsoInZlYzIiKSxaYT1uZXcgSygiaXZlYzIiKSxKYT1uZXcgSygidXZlYzIiKSxqYT1uZXcgSygiYnZlYzIiKSxrPW5ldyBLKCJ2ZWMzIiksUWE9bmV3IEsoIml2ZWMzIiksS2E9bmV3IEsoInV2ZWMzIiksdGM9bmV3IEsoImJ2ZWMzIiksQmU9bmV3IEsoInZlYzQiKSxlYz1uZXcgSygiaXZlYzQiKSxzYz1uZXcgSygidXZlYzQiKSxuYz1uZXcgSygiYnZlYzQiKSxScj1uZXcgSygibWF0MiIpLHFzPW5ldyBLKCJtYXQzIiksaWM9bmV3IEsoIm1hdDQiKTtiKCJ0b0NvbG9yIixXYSksYigidG9GbG9hdCIscSksYigidG9JbnQiLFJlKSxiKCJ0b1VpbnQiLFhhKSxiKCJ0b0Jvb2wiLFlhKSxiKCJ0b1ZlYzIiLEQpLGIoInRvSVZlYzIiLFphKSxiKCJ0b1VWZWMyIixKYSksYigidG9CVmVjMiIsamEpLGIoInRvVmVjMyIsayksYigidG9JVmVjMyIsUWEpLGIoInRvVVZlYzMiLEthKSxiKCJ0b0JWZWMzIix0YyksYigidG9WZWM0IixCZSksYigidG9JVmVjNCIsZWMpLGIoInRvVVZlYzQiLHNjKSxiKCJ0b0JWZWM0IixuYyksYigidG9NYXQyIixSciksYigidG9NYXQzIixxcyksYigidG9NYXQ0IixpYyk7Y29uc3QgcmM9Qyhpcyksb2M9KHIsdCk9PnYobmV3IEFyKHYociksdCkpO2IoImVsZW1lbnQiLHJjKSxiKCJjb252ZXJ0IixvYyk7Y2xhc3MgQnIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJVbmlmb3JtR3JvdXBOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9ITEscz0xKXtzdXBlcigic3RyaW5nIiksdGhpcy5uYW1lPXQsdGhpcy52ZXJzaW9uPTAsdGhpcy5zaGFyZWQ9ZSx0aGlzLm9yZGVyPXMsdGhpcy5pc1VuaWZvcm1Hcm91cD0hMH1zZXQgbmVlZHNVcGRhdGUodCl7dD09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQubmFtZT10aGlzLm5hbWUsdC52ZXJzaW9uPXRoaXMudmVyc2lvbix0LnNoYXJlZD10aGlzLnNoYXJlZH1kZXNlcmlhbGl6ZSh0KXtzdXBlci5kZXNlcmlhbGl6ZSh0KSx0aGlzLm5hbWU9dC5uYW1lLHRoaXMudmVyc2lvbj10LnZlcnNpb24sdGhpcy5zaGFyZWQ9dC5zaGFyZWR9fWNvbnN0IGFjPXI9Pm5ldyBCcihyKSxkZT0oKHIsdD0wKT0+bmV3IEJyKHIsITAsdCkpKCJyZW5kZXIiKSxjYz1hYygib2JqZWN0Iik7Y2xhc3MgSWUgZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVW5pZm9ybU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcih0LGUpLHRoaXMuaXNVbmlmb3JtTm9kZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5ncm91cE5vZGU9Y2N9bGFiZWwodCl7cmV0dXJuIHRoaXMubmFtZT10LHRoaXN9c2V0R3JvdXAodCl7cmV0dXJuIHRoaXMuZ3JvdXBOb2RlPXQsdGhpc31nZXRHcm91cCgpe3JldHVybiB0aGlzLmdyb3VwTm9kZX1nZXRVbmlmb3JtSGFzaCh0KXtyZXR1cm4gdGhpcy5nZXRIYXNoKHQpfW9uVXBkYXRlKHQsZSl7Y29uc3Qgcz10aGlzLmdldFNlbGYoKTtyZXR1cm4gdD10LmJpbmQocyksc3VwZXIub25VcGRhdGUobj0+e2NvbnN0IGk9dChuLHMpO2khPT12b2lkIDAmJih0aGlzLnZhbHVlPWkpfSxlKX1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5nZXROb2RlVHlwZSh0KSxuPXRoaXMuZ2V0VW5pZm9ybUhhc2godCk7bGV0IGk9dC5nZXROb2RlRnJvbUhhc2gobik7aT09PXZvaWQgMCYmKHQuc2V0SGFzaE5vZGUodGhpcyxuKSxpPXRoaXMpO2NvbnN0IG89aS5nZXRJbnB1dFR5cGUodCksYT10LmdldFVuaWZvcm1Gcm9tTm9kZShpLG8sdC5zaGFkZXJTdGFnZSx0aGlzLm5hbWV8fHQuY29udGV4dC5sYWJlbCksYz10LmdldFByb3BlcnR5TmFtZShhKTtyZXR1cm4gdC5jb250ZXh0LmxhYmVsIT09dm9pZCAwJiZkZWxldGUgdC5jb250ZXh0LmxhYmVsLHQuZm9ybWF0KGMscyxlKX19Y29uc3QgeHQ9KHIsdCk9Pntjb25zdCBlPXFhKHR8fHIpLHM9ciYmci5pc05vZGU9PT0hMD9yLm5vZGUmJnIubm9kZS52YWx1ZXx8ci52YWx1ZTpyO3JldHVybiB2KG5ldyBJZShzLGUpKX07Y2xhc3MgSXIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQcm9wZXJ0eU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsLHM9ITEpe3N1cGVyKHQpLHRoaXMubmFtZT1lLHRoaXMudmFyeWluZz1zLHRoaXMuaXNQcm9wZXJ0eU5vZGU9ITB9Z2V0SGFzaCh0KXtyZXR1cm4gdGhpcy5uYW1lfHxzdXBlci5nZXRIYXNoKHQpfWlzR2xvYmFsKCl7cmV0dXJuITB9Z2VuZXJhdGUodCl7bGV0IGU7cmV0dXJuIHRoaXMudmFyeWluZz09PSEwPyhlPXQuZ2V0VmFyeWluZ0Zyb21Ob2RlKHRoaXMsdGhpcy5uYW1lKSxlLm5lZWRzSW50ZXJwb2xhdGlvbj0hMCk6ZT10LmdldFZhckZyb21Ob2RlKHRoaXMsdGhpcy5uYW1lKSx0LmdldFByb3BlcnR5TmFtZShlKX19Y29uc3QgdmU9KHIsdCk9PnYobmV3IElyKHIsdCkpLHZyPU8oSXIsInZlYzQiLCJEaWZmdXNlQ29sb3IiKTtjbGFzcyBoYyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBc3NpZ25Ob2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy50YXJnZXROb2RlPXQsdGhpcy5zb3VyY2VOb2RlPWV9aGFzRGVwZW5kZW5jaWVzKCl7cmV0dXJuITF9Z2V0Tm9kZVR5cGUodCxlKXtyZXR1cm4gZSE9PSJ2b2lkIj90aGlzLnRhcmdldE5vZGUuZ2V0Tm9kZVR5cGUodCk6InZvaWQifW5lZWRzU3BsaXRBc3NpZ24odCl7Y29uc3R7dGFyZ2V0Tm9kZTplfT10aGlzO2lmKHQuaXNBdmFpbGFibGUoInN3aXp6bGVBc3NpZ24iKT09PSExJiZlLmlzU3BsaXROb2RlJiZlLmNvbXBvbmVudHMubGVuZ3RoPjEpe2NvbnN0IHM9dC5nZXRUeXBlTGVuZ3RoKGUubm9kZS5nZXROb2RlVHlwZSh0KSk7cmV0dXJuIG5zLmpvaW4oIiIpLnNsaWNlKDAscykhPT1lLmNvbXBvbmVudHN9cmV0dXJuITF9Z2VuZXJhdGUodCxlKXtjb25zdHt0YXJnZXROb2RlOnMsc291cmNlTm9kZTpufT10aGlzLGk9dGhpcy5uZWVkc1NwbGl0QXNzaWduKHQpLG89cy5nZXROb2RlVHlwZSh0KSxhPXMuY29udGV4dCh7YXNzaWduOiEwfSkuYnVpbGQodCksYz1uLmJ1aWxkKHQsbyksdT1uLmdldE5vZGVUeXBlKHQpLGg9dC5nZXREYXRhRnJvbU5vZGUodGhpcyk7bGV0IGw7aWYoaC5pbml0aWFsaXplZD09PSEwKWUhPT0idm9pZCImJihsPWEpO2Vsc2UgaWYoaSl7Y29uc3QgZD10LmdldFZhckZyb21Ob2RlKHRoaXMsbnVsbCxvKSxmPXQuZ2V0UHJvcGVydHlOYW1lKGQpO3QuYWRkTGluZUZsb3dDb2RlKGAke2Z9ID0gJHtjfWAsdGhpcyk7Y29uc3QgcD1zLm5vZGUuY29udGV4dCh7YXNzaWduOiEwfSkuYnVpbGQodCk7Zm9yKGxldCBtPTA7bTxzLmNvbXBvbmVudHMubGVuZ3RoO20rKyl7Y29uc3QgZz1zLmNvbXBvbmVudHNbbV07dC5hZGRMaW5lRmxvd0NvZGUoYCR7cH0uJHtnfSA9ICR7Zn1bICR7bX0gXWAsdGhpcyl9ZSE9PSJ2b2lkIiYmKGw9YSl9ZWxzZSBsPWAke2F9ID0gJHtjfWAsKGU9PT0idm9pZCJ8fHU9PT0idm9pZCIpJiYodC5hZGRMaW5lRmxvd0NvZGUobCx0aGlzKSxlIT09InZvaWQiJiYobD1hKSk7cmV0dXJuIGguaW5pdGlhbGl6ZWQ9ITAsdC5mb3JtYXQobCxvLGUpfX1iKCJhc3NpZ24iLEMoaGMpKTtjbGFzcyB1YyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGdW5jdGlvbkNhbGxOb2RlIn1jb25zdHJ1Y3Rvcih0PW51bGwsZT17fSl7c3VwZXIoKSx0aGlzLmZ1bmN0aW9uTm9kZT10LHRoaXMucGFyYW1ldGVycz1lfXNldFBhcmFtZXRlcnModCl7cmV0dXJuIHRoaXMucGFyYW1ldGVycz10LHRoaXN9Z2V0UGFyYW1ldGVycygpe3JldHVybiB0aGlzLnBhcmFtZXRlcnN9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMuZnVuY3Rpb25Ob2RlLmdldE5vZGVUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0IGU9W10scz10aGlzLmZ1bmN0aW9uTm9kZSxuPXMuZ2V0SW5wdXRzKHQpLGk9dGhpcy5wYXJhbWV0ZXJzO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBhPTA7YTxpLmxlbmd0aDthKyspe2NvbnN0IGM9blthXSx1PWlbYV07ZS5wdXNoKHUuYnVpbGQodCxjLnR5cGUpKX1lbHNlIGZvcihjb25zdCBhIG9mIG4pe2NvbnN0IGM9aVthLm5hbWVdO2lmKGMhPT12b2lkIDApZS5wdXNoKGMuYnVpbGQodCxhLnR5cGUpKTtlbHNlIHRocm93IG5ldyBFcnJvcihgRnVuY3Rpb25DYWxsTm9kZTogSW5wdXQgJyR7YS5uYW1lfScgbm90IGZvdW5kIGluIEZ1bmN0aW9uTm9kZS5gKX1yZXR1cm5gJHtzLmJ1aWxkKHQsInByb3BlcnR5Iil9KCAke2Uuam9pbigiLCAiKX0gKWB9fWIoImNhbGwiLChyLC4uLnQpPT4odD10Lmxlbmd0aD4xfHx0WzBdJiZ0WzBdLmlzTm9kZT09PSEwP0ZlKHQpOkhzKHRbMF0pLHYobmV3IHVjKHYociksdCkpKSk7Y2xhc3MgWSBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJPcGVyYXRvck5vZGUifWNvbnN0cnVjdG9yKHQsZSxzLC4uLm4pe2lmKHN1cGVyKCksbi5sZW5ndGg+MCl7bGV0IGk9bmV3IFkodCxlLHMpO2ZvcihsZXQgbz0wO288bi5sZW5ndGgtMTtvKyspaT1uZXcgWSh0LGksbltvXSk7ZT1pLHM9bltuLmxlbmd0aC0xXX10aGlzLm9wPXQsdGhpcy5hTm9kZT1lLHRoaXMuYk5vZGU9c31nZXROb2RlVHlwZSh0LGUpe2NvbnN0IHM9dGhpcy5vcCxuPXRoaXMuYU5vZGUsaT10aGlzLmJOb2RlLG89bi5nZXROb2RlVHlwZSh0KSxhPXR5cGVvZiBpPCJ1Ij9pLmdldE5vZGVUeXBlKHQpOm51bGw7aWYobz09PSJ2b2lkInx8YT09PSJ2b2lkIilyZXR1cm4idm9pZCI7aWYocz09PSIlIilyZXR1cm4gbztpZihzPT09In4ifHxzPT09IiYifHxzPT09InwifHxzPT09Il4ifHxzPT09Ij4+Inx8cz09PSI8PCIpcmV0dXJuIHQuZ2V0SW50ZWdlclR5cGUobyk7aWYocz09PSIhInx8cz09PSI9PSJ8fHM9PT0iJiYifHxzPT09Inx8Inx8cz09PSJeXiIpcmV0dXJuImJvb2wiO2lmKHM9PT0iPCJ8fHM9PT0iPiJ8fHM9PT0iPD0ifHxzPT09Ij49Iil7Y29uc3QgYz1lP3QuZ2V0VHlwZUxlbmd0aChlKTpNYXRoLm1heCh0LmdldFR5cGVMZW5ndGgobyksdC5nZXRUeXBlTGVuZ3RoKGEpKTtyZXR1cm4gYz4xP2BidmVjJHtjfWA6ImJvb2wifWVsc2UgcmV0dXJuIG89PT0iZmxvYXQiJiZ0LmlzTWF0cml4KGEpP2E6dC5pc01hdHJpeChvKSYmdC5pc1ZlY3RvcihhKT90LmdldFZlY3RvckZyb21NYXRyaXgobyk6dC5pc1ZlY3RvcihvKSYmdC5pc01hdHJpeChhKT90LmdldFZlY3RvckZyb21NYXRyaXgoYSk6dC5nZXRUeXBlTGVuZ3RoKGEpPnQuZ2V0VHlwZUxlbmd0aChvKT9hOm99Z2VuZXJhdGUodCxlKXtjb25zdCBzPXRoaXMub3Asbj10aGlzLmFOb2RlLGk9dGhpcy5iTm9kZSxvPXRoaXMuZ2V0Tm9kZVR5cGUodCxlKTtsZXQgYT1udWxsLGM9bnVsbDtvIT09InZvaWQiPyhhPW4uZ2V0Tm9kZVR5cGUodCksYz10eXBlb2YgaTwidSI/aS5nZXROb2RlVHlwZSh0KTpudWxsLHM9PT0iPCJ8fHM9PT0iPiJ8fHM9PT0iPD0ifHxzPT09Ij49Inx8cz09PSI9PSI/dC5pc1ZlY3RvcihhKT9jPWE6YSE9PWMmJihhPWM9ImZsb2F0Iik6cz09PSI+PiJ8fHM9PT0iPDwiPyhhPW8sYz10LmNoYW5nZUNvbXBvbmVudFR5cGUoYywidWludCIpKTp0LmlzTWF0cml4KGEpJiZ0LmlzVmVjdG9yKGMpP2M9dC5nZXRWZWN0b3JGcm9tTWF0cml4KGEpOnQuaXNWZWN0b3IoYSkmJnQuaXNNYXRyaXgoYyk/YT10LmdldFZlY3RvckZyb21NYXRyaXgoYyk6YT1jPW8pOmE9Yz1vO2NvbnN0IHU9bi5idWlsZCh0LGEpLGg9dHlwZW9mIGk8InUiP2kuYnVpbGQodCxjKTpudWxsLGw9dC5nZXRUeXBlTGVuZ3RoKGUpLGQ9dC5nZXRGdW5jdGlvbk9wZXJhdG9yKHMpO2lmKGUhPT0idm9pZCIpcmV0dXJuIHM9PT0iPCImJmw+MT90LnVzZUNvbXBhcmlzb25NZXRob2Q/dC5mb3JtYXQoYCR7dC5nZXRNZXRob2QoImxlc3NUaGFuIixlKX0oICR7dX0sICR7aH0gKWAsbyxlKTp0LmZvcm1hdChgKCAke3V9IDwgJHtofSApYCxvLGUpOnM9PT0iPD0iJiZsPjE/dC51c2VDb21wYXJpc29uTWV0aG9kP3QuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKCJsZXNzVGhhbkVxdWFsIixlKX0oICR7dX0sICR7aH0gKWAsbyxlKTp0LmZvcm1hdChgKCAke3V9IDw9ICR7aH0gKWAsbyxlKTpzPT09Ij4iJiZsPjE/dC51c2VDb21wYXJpc29uTWV0aG9kP3QuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKCJncmVhdGVyVGhhbiIsZSl9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSA+ICR7aH0gKWAsbyxlKTpzPT09Ij49IiYmbD4xP3QudXNlQ29tcGFyaXNvbk1ldGhvZD90LmZvcm1hdChgJHt0LmdldE1ldGhvZCgiZ3JlYXRlclRoYW5FcXVhbCIsZSl9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSA+PSAke2h9IClgLG8sZSk6cz09PSIhInx8cz09PSJ+Ij90LmZvcm1hdChgKCR7c30ke3V9KWAsYSxlKTpkP3QuZm9ybWF0KGAke2R9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCggJHt1fSAke3N9ICR7aH0gKWAsbyxlKTtpZihhIT09InZvaWQiKXJldHVybiBkP3QuZm9ybWF0KGAke2R9KCAke3V9LCAke2h9IClgLG8sZSk6dC5mb3JtYXQoYCR7dX0gJHtzfSAke2h9YCxvLGUpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5vcD10aGlzLm9wfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMub3A9dC5vcH19Y29uc3QgZmU9QyhZLCIrIiksJHM9QyhZLCItIiksR3M9QyhZLCIqIiksUHI9QyhZLCIvIiksTHI9QyhZLCIlIiksbGM9QyhZLCI9PSIpLGRjPUMoWSwiIT0iKSxmYz1DKFksIjwiKSxwYz1DKFksIj4iKSxtYz1DKFksIjw9IikseWM9QyhZLCI+PSIpLGdjPUMoWSwiJiYiKSx4Yz1DKFksInx8IiksVGM9QyhZLCIhIiksTmM9QyhZLCJeXiIpLHdjPUMoWSwiJiIpLEFjPUMoWSwifiIpLE1jPUMoWSwifCIpLFNjPUMoWSwiXiIpLF9jPUMoWSwiPDwiKSx6Yz1DKFksIj4+Iik7YigiYWRkIixmZSksYigic3ViIiwkcyksYigibXVsIixHcyksYigiZGl2IixQciksYigibW9kSW50IixMciksYigiZXF1YWwiLGxjKSxiKCJub3RFcXVhbCIsZGMpLGIoImxlc3NUaGFuIixmYyksYigiZ3JlYXRlclRoYW4iLHBjKSxiKCJsZXNzVGhhbkVxdWFsIixtYyksYigiZ3JlYXRlclRoYW5FcXVhbCIseWMpLGIoImFuZCIsZ2MpLGIoIm9yIix4YyksYigibm90IixUYyksYigieG9yIixOYyksYigiYml0QW5kIix3YyksYigiYml0Tm90IixBYyksYigiYml0T3IiLE1jKSxiKCJiaXRYb3IiLFNjKSxiKCJzaGlmdExlZnQiLF9jKSxiKCJzaGlmdFJpZ2h0Iix6YyksYigicmVtYWluZGVyIiwoLi4ucik9Pihjb25zb2xlLndhcm4oIlRTTC5PcGVyYXRvck5vZGU6IC5yZW1haW5kZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tb2RJbnQoKS4iKSxMciguLi5yKSkpO2NsYXNzIHggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF0aE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwsbj1udWxsKXtzdXBlcigpLHRoaXMubWV0aG9kPXQsdGhpcy5hTm9kZT1lLHRoaXMuYk5vZGU9cyx0aGlzLmNOb2RlPW59Z2V0SW5wdXRUeXBlKHQpe2NvbnN0IGU9dGhpcy5hTm9kZS5nZXROb2RlVHlwZSh0KSxzPXRoaXMuYk5vZGU/dGhpcy5iTm9kZS5nZXROb2RlVHlwZSh0KTpudWxsLG49dGhpcy5jTm9kZT90aGlzLmNOb2RlLmdldE5vZGVUeXBlKHQpOm51bGwsaT10LmlzTWF0cml4KGUpPzA6dC5nZXRUeXBlTGVuZ3RoKGUpLG89dC5pc01hdHJpeChzKT8wOnQuZ2V0VHlwZUxlbmd0aChzKSxhPXQuaXNNYXRyaXgobik/MDp0LmdldFR5cGVMZW5ndGgobik7cmV0dXJuIGk+byYmaT5hP2U6bz5hP3M6YT5pP246ZX1nZXROb2RlVHlwZSh0KXtjb25zdCBlPXRoaXMubWV0aG9kO3JldHVybiBlPT09eC5MRU5HVEh8fGU9PT14LkRJU1RBTkNFfHxlPT09eC5ET1Q/ImZsb2F0IjplPT09eC5DUk9TUz8idmVjMyI6ZT09PXguQUxMPyJib29sIjplPT09eC5FUVVBTFM/dC5jaGFuZ2VDb21wb25lbnRUeXBlKHRoaXMuYU5vZGUuZ2V0Tm9kZVR5cGUodCksImJvb2wiKTplPT09eC5NT0Q/dGhpcy5hTm9kZS5nZXROb2RlVHlwZSh0KTp0aGlzLmdldElucHV0VHlwZSh0KX1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5tZXRob2Qsbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9dGhpcy5nZXRJbnB1dFR5cGUodCksbz10aGlzLmFOb2RlLGE9dGhpcy5iTm9kZSxjPXRoaXMuY05vZGUsdT10LnJlbmRlcmVyLmlzV2ViR0xSZW5kZXJlcj09PSEwO2lmKHM9PT14LlRSQU5TRk9STV9ESVJFQ1RJT04pe2xldCBoPW8sbD1hO3QuaXNNYXRyaXgoaC5nZXROb2RlVHlwZSh0KSk/bD1CZShrKGwpLDApOmg9QmUoayhoKSwwKTtjb25zdCBkPUdzKGgsbCkueHl6O3JldHVybiBPcihkKS5idWlsZCh0LGUpfWVsc2V7aWYocz09PXguTkVHQVRFKXJldHVybiB0LmZvcm1hdCgiKCAtICIrby5idWlsZCh0LGkpKyIgKSIsbixlKTtpZihzPT09eC5PTkVfTUlOVVMpcmV0dXJuICRzKDEsbykuYnVpbGQodCxlKTtpZihzPT09eC5SRUNJUFJPQ0FMKXJldHVybiBQcigxLG8pLmJ1aWxkKHQsZSk7aWYocz09PXguRElGRkVSRU5DRSlyZXR1cm4gb2koJHMobyxhKSkuYnVpbGQodCxlKTt7Y29uc3QgaD1bXTtyZXR1cm4gcz09PXguQ1JPU1N8fHM9PT14Lk1PRD9oLnB1c2goby5idWlsZCh0LG4pLGEuYnVpbGQodCxuKSk6dSYmcz09PXguU1RFUD9oLnB1c2goby5idWlsZCh0LHQuZ2V0VHlwZUxlbmd0aChvLmdldE5vZGVUeXBlKHQpKT09PTE/ImZsb2F0IjppKSxhLmJ1aWxkKHQsaSkpOnUmJihzPT09eC5NSU58fHM9PT14Lk1BWCl8fHM9PT14Lk1PRD9oLnB1c2goby5idWlsZCh0LGkpLGEuYnVpbGQodCx0LmdldFR5cGVMZW5ndGgoYS5nZXROb2RlVHlwZSh0KSk9PT0xPyJmbG9hdCI6aSkpOnM9PT14LlJFRlJBQ1Q/aC5wdXNoKG8uYnVpbGQodCxpKSxhLmJ1aWxkKHQsaSksYy5idWlsZCh0LCJmbG9hdCIpKTpzPT09eC5NSVg/aC5wdXNoKG8uYnVpbGQodCxpKSxhLmJ1aWxkKHQsaSksYy5idWlsZCh0LHQuZ2V0VHlwZUxlbmd0aChjLmdldE5vZGVUeXBlKHQpKT09PTE/ImZsb2F0IjppKSk6KGgucHVzaChvLmJ1aWxkKHQsaSkpLGEhPT1udWxsJiZoLnB1c2goYS5idWlsZCh0LGkpKSxjIT09bnVsbCYmaC5wdXNoKGMuYnVpbGQodCxpKSkpLHQuZm9ybWF0KGAke3QuZ2V0TWV0aG9kKHMsbil9KCAke2guam9pbigiLCAiKX0gKWAsbixlKX19fXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5tZXRob2Q9dGhpcy5tZXRob2R9ZGVzZXJpYWxpemUodCl7c3VwZXIuZGVzZXJpYWxpemUodCksdGhpcy5tZXRob2Q9dC5tZXRob2R9fXguQUxMPSJhbGwiLHguQU5ZPSJhbnkiLHguRVFVQUxTPSJlcXVhbHMiLHguUkFESUFOUz0icmFkaWFucyIseC5ERUdSRUVTPSJkZWdyZWVzIix4LkVYUD0iZXhwIix4LkVYUDI9ImV4cDIiLHguTE9HPSJsb2ciLHguTE9HMj0ibG9nMiIseC5TUVJUPSJzcXJ0Iix4LklOVkVSU0VfU1FSVD0iaW52ZXJzZXNxcnQiLHguRkxPT1I9ImZsb29yIix4LkNFSUw9ImNlaWwiLHguTk9STUFMSVpFPSJub3JtYWxpemUiLHguRlJBQ1Q9ImZyYWN0Iix4LlNJTj0ic2luIix4LkNPUz0iY29zIix4LlRBTj0idGFuIix4LkFTSU49ImFzaW4iLHguQUNPUz0iYWNvcyIseC5BVEFOPSJhdGFuIix4LkFCUz0iYWJzIix4LlNJR049InNpZ24iLHguTEVOR1RIPSJsZW5ndGgiLHguTkVHQVRFPSJuZWdhdGUiLHguT05FX01JTlVTPSJvbmVNaW51cyIseC5ERkRYPSJkRmR4Iix4LkRGRFk9ImRGZHkiLHguUk9VTkQ9InJvdW5kIix4LlJFQ0lQUk9DQUw9InJlY2lwcm9jYWwiLHguVFJVTkM9InRydW5jIix4LkZXSURUSD0iZndpZHRoIix4LkJJVENBU1Q9ImJpdGNhc3QiLHguVFJBTlNQT1NFPSJ0cmFuc3Bvc2UiLHguQVRBTjI9ImF0YW4yIix4Lk1JTj0ibWluIix4Lk1BWD0ibWF4Iix4Lk1PRD0ibW9kIix4LlNURVA9InN0ZXAiLHguUkVGTEVDVD0icmVmbGVjdCIseC5ESVNUQU5DRT0iZGlzdGFuY2UiLHguRElGRkVSRU5DRT0iZGlmZmVyZW5jZSIseC5ET1Q9ImRvdCIseC5DUk9TUz0iY3Jvc3MiLHguUE9XPSJwb3ciLHguVFJBTlNGT1JNX0RJUkVDVElPTj0idHJhbnNmb3JtRGlyZWN0aW9uIix4Lk1JWD0ibWl4Iix4LkNMQU1QPSJjbGFtcCIseC5SRUZSQUNUPSJyZWZyYWN0Iix4LlNNT09USFNURVA9InNtb290aHN0ZXAiLHguRkFDRUZPUldBUkQ9ImZhY2Vmb3J3YXJkIjtjb25zdCBiYz1xKE1hdGguUEkpLEVjPUMoeCx4LkFMTCksQ2M9Qyh4LHguQU5ZKSxGYz1DKHgseC5FUVVBTFMpLFJjPUMoeCx4LlJBRElBTlMpLEJjPUMoeCx4LkRFR1JFRVMpLEljPUMoeCx4LkVYUCksdmM9Qyh4LHguRVhQMiksUGM9Qyh4LHguTE9HKSxMYz1DKHgseC5MT0cyKSxpaT1DKHgseC5TUVJUKSxPYz1DKHgseC5JTlZFUlNFX1NRUlQpLERjPUMoeCx4LkZMT09SKSxWYz1DKHgseC5DRUlMKSxPcj1DKHgseC5OT1JNQUxJWkUpLHJpPUMoeCx4LkZSQUNUKSxEcj1DKHgseC5TSU4pLFVjPUMoeCx4LkNPUyksa2M9Qyh4LHguVEFOKSxIYz1DKHgseC5BU0lOKSxxYz1DKHgseC5BQ09TKSwkYz1DKHgseC5BVEFOKSxvaT1DKHgseC5BQlMpLFZyPUMoeCx4LlNJR04pLEdjPUMoeCx4LkxFTkdUSCksV2M9Qyh4LHguTkVHQVRFKSxYYz1DKHgseC5PTkVfTUlOVVMpLFljPUMoeCx4LkRGRFgpLFpjPUMoeCx4LkRGRFkpLEpjPUMoeCx4LlJPVU5EKSxqYz1DKHgseC5SRUNJUFJPQ0FMKSxRYz1DKHgseC5UUlVOQyksS2M9Qyh4LHguRldJRFRIKTt4LkJJVENBU1Q7Y29uc3QgdGg9Qyh4LHguVFJBTlNQT1NFKSxlaD1DKHgseC5BVEFOMiksc2g9Qyh4LHguTUlOKSxhaT1DKHgseC5NQVgpLFVyPUMoeCx4Lk1PRCksa3I9Qyh4LHguU1RFUCksbmg9Qyh4LHguUkVGTEVDVCksaWg9Qyh4LHguRElTVEFOQ0UpLHJoPUMoeCx4LkRJRkZFUkVOQ0UpLGNpPUMoeCx4LkRPVCksb2g9Qyh4LHguQ1JPU1MpLEhyPUMoeCx4LlBPVyksYWg9Qyh4LHguUE9XLDIpLGNoPUMoeCx4LlBPVywzKSxoaD1DKHgseC5QT1csNCksdWg9Qyh4LHguVFJBTlNGT1JNX0RJUkVDVElPTiksbGg9cj0+R3MoVnIociksSHIob2kociksMS8zKSksZGg9cj0+Y2kocixyKSxyZT1DKHgseC5NSVgpLFdzPShyLHQ9MCxlPTEpPT52KG5ldyB4KHguQ0xBTVAsdihyKSx2KHQpLHYoZSkpKSxmaD1yPT5XcyhyKSxwaD1DKHgseC5SRUZSQUNUKSxoaT1DKHgseC5TTU9PVEhTVEVQKSxtaD1DKHgseC5GQUNFRk9SV0FSRCkseWg9dHQoKFtyXSk9Pntjb25zdCBzPTQzNzU4LjU0NTMsbj1jaShyLnh5LEQoMTIuOTg5OCw3OC4yMzMpKSxpPVVyKG4sYmMpO3JldHVybiByaShEcihpKS5tdWwocykpfSksZ2g9KHIsdCxlKT0+cmUodCxlLHIpLHhoPShyLHQsZSk9PmhpKHQsZSxyKTtiKCJhbGwiLEVjKSxiKCJhbnkiLENjKSxiKCJlcXVhbHMiLEZjKSxiKCJyYWRpYW5zIixSYyksYigiZGVncmVlcyIsQmMpLGIoImV4cCIsSWMpLGIoImV4cDIiLHZjKSxiKCJsb2ciLFBjKSxiKCJsb2cyIixMYyksYigic3FydCIsaWkpLGIoImludmVyc2VTcXJ0IixPYyksYigiZmxvb3IiLERjKSxiKCJjZWlsIixWYyksYigibm9ybWFsaXplIixPciksYigiZnJhY3QiLHJpKSxiKCJzaW4iLERyKSxiKCJjb3MiLFVjKSxiKCJ0YW4iLGtjKSxiKCJhc2luIixIYyksYigiYWNvcyIscWMpLGIoImF0YW4iLCRjKSxiKCJhYnMiLG9pKSxiKCJzaWduIixWciksYigibGVuZ3RoIixHYyksYigibGVuZ3RoU3EiLGRoKSxiKCJuZWdhdGUiLFdjKSxiKCJvbmVNaW51cyIsWGMpLGIoImRGZHgiLFljKSxiKCJkRmR5IixaYyksYigicm91bmQiLEpjKSxiKCJyZWNpcHJvY2FsIixqYyksYigidHJ1bmMiLFFjKSxiKCJmd2lkdGgiLEtjKSxiKCJhdGFuMiIsZWgpLGIoIm1pbiIsc2gpLGIoIm1heCIsYWkpLGIoIm1vZCIsVXIpLGIoInN0ZXAiLGtyKSxiKCJyZWZsZWN0IixuaCksYigiZGlzdGFuY2UiLGloKSxiKCJkb3QiLGNpKSxiKCJjcm9zcyIsb2gpLGIoInBvdyIsSHIpLGIoInBvdzIiLGFoKSxiKCJwb3czIixjaCksYigicG93NCIsaGgpLGIoInRyYW5zZm9ybURpcmVjdGlvbiIsdWgpLGIoIm1peCIsZ2gpLGIoImNsYW1wIixXcyksYigicmVmcmFjdCIscGgpLGIoInNtb290aHN0ZXAiLHhoKSxiKCJmYWNlRm9yd2FyZCIsbWgpLGIoImRpZmZlcmVuY2UiLHJoKSxiKCJzYXR1cmF0ZSIsZmgpLGIoImNicnQiLGxoKSxiKCJ0cmFuc3Bvc2UiLHRoKSxiKCJyYW5kIix5aCk7Y2xhc3MgVGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb25kaXRpb25hbE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwpe3N1cGVyKCksdGhpcy5jb25kTm9kZT10LHRoaXMuaWZOb2RlPWUsdGhpcy5lbHNlTm9kZT1zfWdldE5vZGVUeXBlKHQpe2NvbnN0IGU9dGhpcy5pZk5vZGUuZ2V0Tm9kZVR5cGUodCk7aWYodGhpcy5lbHNlTm9kZSE9PW51bGwpe2NvbnN0IHM9dGhpcy5lbHNlTm9kZS5nZXROb2RlVHlwZSh0KTtpZih0LmdldFR5cGVMZW5ndGgocyk+dC5nZXRUeXBlTGVuZ3RoKGUpKXJldHVybiBzfXJldHVybiBlfXNldHVwKHQpe2NvbnN0IGU9dGhpcy5jb25kTm9kZS5jYWNoZSgpLHM9dGhpcy5pZk5vZGUuY2FjaGUoKSxuPXRoaXMuZWxzZU5vZGU/dGhpcy5lbHNlTm9kZS5jYWNoZSgpOm51bGwsaT10LmNvbnRleHQubm9kZUJsb2NrO3QuZ2V0RGF0YUZyb21Ob2RlKHMpLnBhcmVudE5vZGVCbG9jaz1pLG4hPT1udWxsJiYodC5nZXREYXRhRnJvbU5vZGUobikucGFyZW50Tm9kZUJsb2NrPWkpO2NvbnN0IG89dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtvLmNvbmROb2RlPWUsby5pZk5vZGU9cy5jb250ZXh0KHtub2RlQmxvY2s6c30pLG8uZWxzZU5vZGU9bj9uLmNvbnRleHQoe25vZGVCbG9jazpufSk6bnVsbH1nZW5lcmF0ZSh0LGUpe2NvbnN0IHM9dGhpcy5nZXROb2RlVHlwZSh0KSxuPXQuZ2V0RGF0YUZyb21Ob2RlKHRoaXMpO2lmKG4ubm9kZVByb3BlcnR5IT09dm9pZCAwKXJldHVybiBuLm5vZGVQcm9wZXJ0eTtjb25zdHtjb25kTm9kZTppLGlmTm9kZTpvLGVsc2VOb2RlOmF9PXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyksYz1lIT09InZvaWQiLHU9Yz92ZShzKS5idWlsZCh0KToiIjtuLm5vZGVQcm9wZXJ0eT11O2NvbnN0IGg9aS5idWlsZCh0LCJib29sIik7dC5hZGRGbG93Q29kZShgCiR7dC50YWJ9aWYgKCAke2h9ICkgewoKYCkuYWRkRmxvd1RhYigpO2xldCBsPW8uYnVpbGQodCxzKTtpZihsJiYoYz9sPXUrIiA9ICIrbCsiOyI6bD0icmV0dXJuICIrbCsiOyIpLHQucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKHQudGFiKyIJIitsK2AKCmArdC50YWIrIn0iKSxhIT09bnVsbCl7dC5hZGRGbG93Q29kZShgIGVsc2UgewoKYCkuYWRkRmxvd1RhYigpO2xldCBkPWEuYnVpbGQodCxzKTtkJiYoYz9kPXUrIiA9ICIrZCsiOyI6ZD0icmV0dXJuICIrZCsiOyIpLHQucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKHQudGFiKyIJIitkK2AKCmArdC50YWIrYH0KCmApfWVsc2UgdC5hZGRGbG93Q29kZShgCgpgKTtyZXR1cm4gdC5mb3JtYXQodSxzLGUpfX1jb25zdCB1aT1DKFRoKTtiKCJzZWxlY3QiLHVpKSxiKCJjb25kIiwoLi4ucik9Pihjb25zb2xlLndhcm4oIlRTTC5Db25kaXRpb25hbE5vZGU6IGNvbmQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIHNlbGVjdCgpLiIpLHVpKC4uLnIpKSk7Y2xhc3MgTmggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb250ZXh0Tm9kZSJ9Y29uc3RydWN0b3IodCxlPXt9KXtzdXBlcigpLHRoaXMuaXNDb250ZXh0Tm9kZT0hMCx0aGlzLm5vZGU9dCx0aGlzLnZhbHVlPWV9Z2V0U2NvcGUoKXtyZXR1cm4gdGhpcy5ub2RlLmdldFNjb3BlKCl9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMubm9kZS5nZXROb2RlVHlwZSh0KX1hbmFseXplKHQpe3RoaXMubm9kZS5idWlsZCh0KX1zZXR1cCh0KXtjb25zdCBlPXQuZ2V0Q29udGV4dCgpO3Quc2V0Q29udGV4dCh7Li4udC5jb250ZXh0LC4uLnRoaXMudmFsdWV9KTtjb25zdCBzPXRoaXMubm9kZS5idWlsZCh0KTtyZXR1cm4gdC5zZXRDb250ZXh0KGUpLHN9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXQuZ2V0Q29udGV4dCgpO3Quc2V0Q29udGV4dCh7Li4udC5jb250ZXh0LC4uLnRoaXMudmFsdWV9KTtjb25zdCBuPXRoaXMubm9kZS5idWlsZCh0LGUpO3JldHVybiB0LnNldENvbnRleHQocyksbn19Y29uc3QgcXI9QyhOaCksd2g9KHIsdCk9PnFyKHIse2xhYmVsOnR9KTtiKCJjb250ZXh0IixxciksYigibGFiZWwiLHdoKTtjbGFzcyBBaCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlZhck5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMubmFtZT1lLHRoaXMuZ2xvYmFsPSEwLHRoaXMuaXNWYXJOb2RlPSEwfWdldEhhc2godCl7cmV0dXJuIHRoaXMubmFtZXx8c3VwZXIuZ2V0SGFzaCh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfWdlbmVyYXRlKHQpe2NvbnN0e25vZGU6ZSxuYW1lOnN9PXRoaXMsbj10LmdldFZhckZyb21Ob2RlKHRoaXMscyx0LmdldFZlY3RvclR5cGUodGhpcy5nZXROb2RlVHlwZSh0KSkpLGk9dC5nZXRQcm9wZXJ0eU5hbWUobiksbz1lLmJ1aWxkKHQsbi50eXBlKTtyZXR1cm4gdC5hZGRMaW5lRmxvd0NvZGUoYCR7aX0gPSAke299YCx0aGlzKSxpfX1jb25zdCAkcj1DKEFoKTtiKCJ0ZW1wIiwkciksYigidG9WYXIiLCguLi5yKT0+JHIoLi4ucikuYXBwZW5kKCkpO2NsYXNzIE1oIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVmFyeWluZ05vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigpLHRoaXMubm9kZT10LHRoaXMubmFtZT1lLHRoaXMuaXNWYXJ5aW5nTm9kZT0hMH1pc0dsb2JhbCgpe3JldHVybiEwfWdldEhhc2godCl7cmV0dXJuIHRoaXMubmFtZXx8c3VwZXIuZ2V0SGFzaCh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfXNldHVwVmFyeWluZyh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyk7bGV0IHM9ZS52YXJ5aW5nO2lmKHM9PT12b2lkIDApe2NvbnN0IG49dGhpcy5uYW1lLGk9dGhpcy5nZXROb2RlVHlwZSh0KTtlLnZhcnlpbmc9cz10LmdldFZhcnlpbmdGcm9tTm9kZSh0aGlzLG4saSksZS5ub2RlPXRoaXMubm9kZX1yZXR1cm4gcy5uZWVkc0ludGVycG9sYXRpb258fChzLm5lZWRzSW50ZXJwb2xhdGlvbj10LnNoYWRlclN0YWdlPT09ImZyYWdtZW50Iiksc31zZXR1cCh0KXt0aGlzLnNldHVwVmFyeWluZyh0KX1hbmFseXplKHQpe3JldHVybiB0aGlzLnNldHVwVmFyeWluZyh0KSx0aGlzLm5vZGUuYW5hbHl6ZSh0KX1nZW5lcmF0ZSh0KXtjb25zdCBlPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcykscz10aGlzLnNldHVwVmFyeWluZyh0KTtpZihlLnByb3BlcnR5TmFtZT09PXZvaWQgMCl7Y29uc3Qgbj10aGlzLmdldE5vZGVUeXBlKHQpLGk9dC5nZXRQcm9wZXJ0eU5hbWUocyx3ci5WRVJURVgpO3QuZmxvd05vZGVGcm9tU2hhZGVyU3RhZ2Uod3IuVkVSVEVYLHRoaXMubm9kZSxuLGkpLGUucHJvcGVydHlOYW1lPWl9cmV0dXJuIHQuZ2V0UHJvcGVydHlOYW1lKHMpfX1jb25zdCBQZT1DKE1oKTtiKCJ2YXJ5aW5nIixQZSk7Y29uc3QgcnM9IldvcmtpbmdDb2xvclNwYWNlIixsaT0iT3V0cHV0Q29sb3JTcGFjZSI7ZnVuY3Rpb24gR3Iocil7bGV0IHQ9bnVsbDtyZXR1cm4gcj09PUVzP3Q9IkxpbmVhciI6cj09PSR0JiYodD0ic1JHQiIpLHR9ZnVuY3Rpb24gU2gocix0KXtyZXR1cm4gR3IocikrIlRvIitHcih0KX1jbGFzcyBYcyBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDb2xvclNwYWNlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKCJ2ZWM0IiksdGhpcy5jb2xvck5vZGU9dCx0aGlzLnNvdXJjZT1lLHRoaXMudGFyZ2V0PXN9Z2V0Q29sb3JTcGFjZSh0LGUpe3JldHVybiBlPT09cnM/bXQud29ya2luZ0NvbG9yU3BhY2U6ZT09PWxpP3QuY29udGV4dC5vdXRwdXRDb2xvclNwYWNlfHx0LnJlbmRlcmVyLm91dHB1dENvbG9yU3BhY2U6ZX1zZXR1cCh0KXtjb25zdHtyZW5kZXJlcjplfT10LHtjb2xvck5vZGU6c309dGhpcyxuPXRoaXMuZ2V0Q29sb3JTcGFjZSh0LHRoaXMuc291cmNlKSxpPXRoaXMuZ2V0Q29sb3JTcGFjZSh0LHRoaXMudGFyZ2V0KTtpZihuPT09aSlyZXR1cm4gcztjb25zdCBvPVNoKG4saSk7bGV0IGE9bnVsbDtjb25zdCBjPWUubm9kZXMubGlicmFyeS5nZXRDb2xvclNwYWNlRnVuY3Rpb24obyk7cmV0dXJuIGMhPT1udWxsP2E9QmUoYyhzLnJnYikscy5hKTooY29uc29sZS5lcnJvcigiQ29sb3JTcGFjZU5vZGU6IFVuc3VwcG9ydGVkIENvbG9yIFNwYWNlIGNvbmZpZ3VyYXRpb24uIixvKSxhPXMpLGF9fWNvbnN0IF9oPXI9PnYobmV3IFhzKHYocikscnMsbGkpKSx6aD1yPT52KG5ldyBYcyh2KHIpLGxpLHJzKSksYmg9KHIsdCk9PnYobmV3IFhzKHYocikscnMsdCkpLFdyPShyLHQpPT52KG5ldyBYcyh2KHIpLHQscnMpKTtiKCJ0b091dHB1dENvbG9yU3BhY2UiLF9oKSxiKCJ0b1dvcmtpbmdDb2xvclNwYWNlIix6aCksYigid29ya2luZ1RvQ29sb3JTcGFjZSIsYmgpLGIoImNvbG9yU3BhY2VUb1dvcmtpbmciLFdyKTtsZXQgRWg9Y2xhc3MgZXh0ZW5kcyBpc3tzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iUmVmZXJlbmNlRWxlbWVudE5vZGUifWNvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLnJlZmVyZW5jZU5vZGU9dCx0aGlzLmlzUmVmZXJlbmNlRWxlbWVudE5vZGU9ITB9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlLnVuaWZvcm1UeXBlfWdlbmVyYXRlKHQpe2NvbnN0IGU9c3VwZXIuZ2VuZXJhdGUodCkscz10aGlzLnJlZmVyZW5jZU5vZGUuZ2V0Tm9kZVR5cGUoKSxuPXRoaXMuZ2V0Tm9kZVR5cGUoKTtyZXR1cm4gdC5mb3JtYXQoZSxzLG4pfX07Y2xhc3MgQ2ggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZWZlcmVuY2VCYXNlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHM9bnVsbCxuPW51bGwpe3N1cGVyKCksdGhpcy5wcm9wZXJ0eT10LHRoaXMudW5pZm9ybVR5cGU9ZSx0aGlzLm9iamVjdD1zLHRoaXMuY291bnQ9bix0aGlzLnByb3BlcnRpZXM9dC5zcGxpdCgiLiIpLHRoaXMucmVmZXJlbmNlPXMsdGhpcy5ub2RlPW51bGwsdGhpcy5ncm91cD1udWxsLHRoaXMudXBkYXRlVHlwZT1RLk9CSkVDVH1zZXRHcm91cCh0KXtyZXR1cm4gdGhpcy5ncm91cD10LHRoaXN9ZWxlbWVudCh0KXtyZXR1cm4gdihuZXcgRWgodGhpcyx2KHQpKSl9c2V0Tm9kZVR5cGUodCl7Y29uc3QgZT14dChudWxsLHQpLmdldFNlbGYoKTt0aGlzLmdyb3VwIT09bnVsbCYmZS5zZXRHcm91cCh0aGlzLmdyb3VwKSx0aGlzLm5vZGU9ZX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5ub2RlPT09bnVsbCYmKHRoaXMudXBkYXRlUmVmZXJlbmNlKHQpLHRoaXMudXBkYXRlVmFsdWUoKSksdGhpcy5ub2RlLmdldE5vZGVUeXBlKHQpfWdldFZhbHVlRnJvbVJlZmVyZW5jZSh0PXRoaXMucmVmZXJlbmNlKXtjb25zdHtwcm9wZXJ0aWVzOmV9PXRoaXM7bGV0IHM9dFtlWzBdXTtmb3IobGV0IG49MTtuPGUubGVuZ3RoO24rKylzPXNbZVtuXV07cmV0dXJuIHN9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLm9iamVjdCE9PW51bGw/dGhpcy5vYmplY3Q6dC5vYmplY3QsdGhpcy5yZWZlcmVuY2V9c2V0dXAoKXtyZXR1cm4gdGhpcy51cGRhdGVWYWx1ZSgpLHRoaXMubm9kZX11cGRhdGUoKXt0aGlzLnVwZGF0ZVZhbHVlKCl9dXBkYXRlVmFsdWUoKXt0aGlzLm5vZGU9PT1udWxsJiZ0aGlzLnNldE5vZGVUeXBlKHRoaXMudW5pZm9ybVR5cGUpO2NvbnN0IHQ9dGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKTtBcnJheS5pc0FycmF5KHQpP3RoaXMubm9kZS5hcnJheT10OnRoaXMubm9kZS52YWx1ZT10fX1jbGFzcyBGaCBleHRlbmRzIENoe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZW5kZXJlclJlZmVyZW5jZU5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPW51bGwpe3N1cGVyKHQsZSxzKSx0aGlzLnJlbmRlcmVyPXMsdGhpcy5zZXRHcm91cChkZSl9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLnJlbmRlcmVyIT09bnVsbD90aGlzLnJlbmRlcmVyOnQucmVuZGVyZXIsdGhpcy5yZWZlcmVuY2V9fWNvbnN0IFJoPShyLHQsZSk9PnYobmV3IEZoKHIsdCxlKSk7Y2xhc3MgQmggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVG9uZU1hcHBpbmdOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9dmgscz1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMudG9uZU1hcHBpbmc9dCx0aGlzLmV4cG9zdXJlTm9kZT1lLHRoaXMuY29sb3JOb2RlPXN9Z2V0Q2FjaGVLZXkoKXtyZXR1cm4gTWEoc3VwZXIuZ2V0Q2FjaGVLZXkoKSx0aGlzLnRvbmVNYXBwaW5nKX1zZXR1cCh0KXtjb25zdCBlPXRoaXMuY29sb3JOb2RlfHx0LmNvbnRleHQuY29sb3Iscz10aGlzLnRvbmVNYXBwaW5nO2lmKHM9PT1NbilyZXR1cm4gZTtsZXQgbj1udWxsO2NvbnN0IGk9dC5yZW5kZXJlci5ub2Rlcy5saWJyYXJ5LmdldFRvbmVNYXBwaW5nRnVuY3Rpb24ocyk7cmV0dXJuIGkhPT1udWxsP249QmUoaShlLnJnYix0aGlzLmV4cG9zdXJlTm9kZSksZS5hKTooY29uc29sZS5lcnJvcigiVG9uZU1hcHBpbmdOb2RlOiBVbnN1cHBvcnRlZCBUb25lIE1hcHBpbmcgY29uZmlndXJhdGlvbi4iLHMpLG49ZSksbn19Y29uc3QgSWg9KHIsdCxlKT0+dihuZXcgQmgocix2KHQpLHYoZSkpKSx2aD1SaCgidG9uZU1hcHBpbmdFeHBvc3VyZSIsImZsb2F0Iik7YigidG9uZU1hcHBpbmciLChyLHQsZSk9PkloKHQsZSxyKSk7Y2xhc3MgUGggZXh0ZW5kcyBqbntzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQnVmZmVyQXR0cmlidXRlTm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwscz0wLG49MCl7c3VwZXIodCxlKSx0aGlzLmlzQnVmZmVyTm9kZT0hMCx0aGlzLmJ1ZmZlclR5cGU9ZSx0aGlzLmJ1ZmZlclN0cmlkZT1zLHRoaXMuYnVmZmVyT2Zmc2V0PW4sdGhpcy51c2FnZT1Dcyx0aGlzLmluc3RhbmNlZD0hMSx0aGlzLmF0dHJpYnV0ZT1udWxsLHRoaXMuZ2xvYmFsPSEwLHQmJnQuaXNCdWZmZXJBdHRyaWJ1dGU9PT0hMCYmKHRoaXMuYXR0cmlidXRlPXQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXMuaW5zdGFuY2VkPXQuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpfWdldEhhc2godCl7aWYodGhpcy5idWZmZXJTdHJpZGU9PT0wJiZ0aGlzLmJ1ZmZlck9mZnNldD09PTApe2xldCBlPXQuZ2xvYmFsQ2FjaGUuZ2V0RGF0YSh0aGlzLnZhbHVlKTtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e25vZGU6dGhpc30sdC5nbG9iYWxDYWNoZS5zZXREYXRhKHRoaXMudmFsdWUsZSkpLGUubm9kZS51dWlkfXJldHVybiB0aGlzLnV1aWR9Z2V0Tm9kZVR5cGUodCl7cmV0dXJuIHRoaXMuYnVmZmVyVHlwZT09PW51bGwmJih0aGlzLmJ1ZmZlclR5cGU9dC5nZXRUeXBlRnJvbUF0dHJpYnV0ZSh0aGlzLmF0dHJpYnV0ZSkpLHRoaXMuYnVmZmVyVHlwZX1zZXR1cCh0KXtpZih0aGlzLmF0dHJpYnV0ZSE9PW51bGwpcmV0dXJuO2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXRoaXMudmFsdWUsbj10LmdldFR5cGVMZW5ndGgoZSksaT10aGlzLmJ1ZmZlclN0cmlkZXx8bixvPXRoaXMuYnVmZmVyT2Zmc2V0LGE9cy5pc0ludGVybGVhdmVkQnVmZmVyPT09ITA/czpuZXcgd2EocyxpKSxjPW5ldyBZbihhLG4sbyk7YS5zZXRVc2FnZSh0aGlzLnVzYWdlKSx0aGlzLmF0dHJpYnV0ZT1jLHRoaXMuYXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPXRoaXMuaW5zdGFuY2VkfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXQuZ2V0QnVmZmVyQXR0cmlidXRlRnJvbU5vZGUodGhpcyxlKSxuPXQuZ2V0UHJvcGVydHlOYW1lKHMpO2xldCBpPW51bGw7cmV0dXJuIHQuc2hhZGVyU3RhZ2U9PT0idmVydGV4Inx8dC5zaGFkZXJTdGFnZT09PSJjb21wdXRlIj8odGhpcy5uYW1lPW4saT1uKTppPVBlKHRoaXMpLmJ1aWxkKHQsZSksaX1nZXRJbnB1dFR5cGUoKXtyZXR1cm4iYnVmZmVyQXR0cmlidXRlIn1zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXMuYXR0cmlidXRlJiZ0aGlzLmF0dHJpYnV0ZS5pc0J1ZmZlckF0dHJpYnV0ZT09PSEwJiYodGhpcy5hdHRyaWJ1dGUudXNhZ2U9dCksdGhpc31zZXRJbnN0YW5jZWQodCl7cmV0dXJuIHRoaXMuaW5zdGFuY2VkPXQsdGhpc319Y29uc3QgTGg9KHIsdCxlLHMpPT52KG5ldyBQaChyLHQsZSxzKSk7YigidG9BdHRyaWJ1dGUiLHI9PkxoKHIudmFsdWUpKTtjbGFzcyBPaCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkNvbXB1dGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1bNjRdKXtzdXBlcigidm9pZCIpLHRoaXMuaXNDb21wdXRlTm9kZT0hMCx0aGlzLmNvbXB1dGVOb2RlPXQsdGhpcy5jb3VudD1lLHRoaXMud29ya2dyb3VwU2l6ZT1zLHRoaXMuZGlzcGF0Y2hDb3VudD0wLHRoaXMudmVyc2lvbj0xLHRoaXMudXBkYXRlQmVmb3JlVHlwZT1RLk9CSkVDVCx0aGlzLnVwZGF0ZURpc3BhdGNoQ291bnQoKX1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXt0PT09ITAmJnRoaXMudmVyc2lvbisrfXVwZGF0ZURpc3BhdGNoQ291bnQoKXtjb25zdHtjb3VudDp0LHdvcmtncm91cFNpemU6ZX09dGhpcztsZXQgcz1lWzBdO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXMqPWVbbl07dGhpcy5kaXNwYXRjaENvdW50PU1hdGguY2VpbCh0L3MpfW9uSW5pdCgpe311cGRhdGVCZWZvcmUoe3JlbmRlcmVyOnR9KXt0LmNvbXB1dGUodGhpcyl9Z2VuZXJhdGUodCl7Y29uc3R7c2hhZGVyU3RhZ2U6ZX09dDtpZihlPT09ImNvbXB1dGUiKXtjb25zdCBzPXRoaXMuY29tcHV0ZU5vZGUuYnVpbGQodCwidm9pZCIpO3MhPT0iIiYmdC5hZGRMaW5lRmxvd0NvZGUocyx0aGlzKX19fWIoImNvbXB1dGUiLChyLHQsZSk9PnYobmV3IE9oKHYociksdCxlKSkpO2NsYXNzIERoIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQ2FjaGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9ITApe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5wYXJlbnQ9ZSx0aGlzLmlzQ2FjaGVOb2RlPSEwfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUodCl9YnVpbGQodCwuLi5lKXtjb25zdCBzPXQuZ2V0Q2FjaGUoKSxuPXQuZ2V0Q2FjaGVGcm9tTm9kZSh0aGlzLHRoaXMucGFyZW50KTt0LnNldENhY2hlKG4pO2NvbnN0IGk9dGhpcy5ub2RlLmJ1aWxkKHQsLi4uZSk7cmV0dXJuIHQuc2V0Q2FjaGUocyksaX19YigiY2FjaGUiLChyLC4uLnQpPT52KG5ldyBEaCh2KHIpLC4uLnQpKSk7Y2xhc3MgVmggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJCeXBhc3NOb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCksdGhpcy5pc0J5cGFzc05vZGU9ITAsdGhpcy5vdXRwdXROb2RlPXQsdGhpcy5jYWxsTm9kZT1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm91dHB1dE5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLmNhbGxOb2RlLmJ1aWxkKHQsInZvaWQiKTtyZXR1cm4gZSE9PSIiJiZ0LmFkZExpbmVGbG93Q29kZShlLHRoaXMpLHRoaXMub3V0cHV0Tm9kZS5idWlsZCh0KX19YigiYnlwYXNzIixDKFZoKSk7Y2xhc3MgWHIgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZW1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZSxzLG49cSgwKSxpPXEoMSkpe3N1cGVyKCksdGhpcy5ub2RlPXQsdGhpcy5pbkxvd05vZGU9ZSx0aGlzLmluSGlnaE5vZGU9cyx0aGlzLm91dExvd05vZGU9bix0aGlzLm91dEhpZ2hOb2RlPWksdGhpcy5kb0NsYW1wPSEwfXNldHVwKCl7Y29uc3R7bm9kZTp0LGluTG93Tm9kZTplLGluSGlnaE5vZGU6cyxvdXRMb3dOb2RlOm4sb3V0SGlnaE5vZGU6aSxkb0NsYW1wOm99PXRoaXM7bGV0IGE9dC5zdWIoZSkuZGl2KHMuc3ViKGUpKTtyZXR1cm4gbz09PSEwJiYoYT1hLmNsYW1wKCkpLGEubXVsKGkuc3ViKG4pKS5hZGQobil9fWNvbnN0IFVoPUMoWHIsbnVsbCxudWxsLHtkb0NsYW1wOiExfSksa2g9QyhYcik7YigicmVtYXAiLFVoKSxiKCJyZW1hcENsYW1wIixraCk7Y2xhc3MgSGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJFeHByZXNzaW9uTm9kZSJ9Y29uc3RydWN0b3IodD0iIixlPSJ2b2lkIil7c3VwZXIoZSksdGhpcy5zbmlwcGV0PXR9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXRoaXMuZ2V0Tm9kZVR5cGUodCksbj10aGlzLnNuaXBwZXQ7aWYocz09PSJ2b2lkIil0LmFkZExpbmVGbG93Q29kZShuLHRoaXMpO2Vsc2UgcmV0dXJuIHQuZm9ybWF0KGAoICR7bn0gKWAscyxlKX19Y29uc3QgWXM9QyhIaCk7YigiZGlzY2FyZCIscj0+KHI/dWkocixZcygiZGlzY2FyZCIpKTpZcygiZGlzY2FyZCIpKS5hcHBlbmQoKSk7Y2xhc3MgcWggZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iUmVuZGVyT3V0cHV0Tm9kZSJ9Y29uc3RydWN0b3IodCxlLHMpe3N1cGVyKCJ2ZWM0IiksdGhpcy5jb2xvck5vZGU9dCx0aGlzLnRvbmVNYXBwaW5nPWUsdGhpcy5vdXRwdXRDb2xvclNwYWNlPXMsdGhpcy5pc1JlbmRlck91dHB1dD0hMH1zZXR1cCh7Y29udGV4dDp0fSl7bGV0IGU9dGhpcy5jb2xvck5vZGV8fHQuY29sb3I7Y29uc3Qgcz0odGhpcy50b25lTWFwcGluZyE9PW51bGw/dGhpcy50b25lTWFwcGluZzp0LnRvbmVNYXBwaW5nKXx8TW4sbj0odGhpcy5vdXRwdXRDb2xvclNwYWNlIT09bnVsbD90aGlzLm91dHB1dENvbG9yU3BhY2U6dC5vdXRwdXRDb2xvclNwYWNlKXx8YnM7cmV0dXJuIHMhPT1NbiYmKGU9ZS50b25lTWFwcGluZyhzKSksbiE9PWJzJiZuIT09bXQud29ya2luZ0NvbG9yU3BhY2UmJihlPWUud29ya2luZ1RvQ29sb3JTcGFjZShuKSksZX19YigicmVuZGVyT3V0cHV0Iiwocix0PW51bGwsZT1udWxsKT0+dihuZXcgcWgodihyKSx0LGUpKSk7Y2xhc3MgJGggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJBdHRyaWJ1dGVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoZSksdGhpcy5nbG9iYWw9ITAsdGhpcy5fYXR0cmlidXRlTmFtZT10fWdldEhhc2godCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTmFtZSh0KX1nZXROb2RlVHlwZSh0KXtsZXQgZT10aGlzLm5vZGVUeXBlO2lmKGU9PT1udWxsKXtjb25zdCBzPXRoaXMuZ2V0QXR0cmlidXRlTmFtZSh0KTtpZih0Lmhhc0dlb21ldHJ5QXR0cmlidXRlKHMpKXtjb25zdCBuPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKHMpO2U9dC5nZXRUeXBlRnJvbUF0dHJpYnV0ZShuKX1lbHNlIGU9ImZsb2F0In1yZXR1cm4gZX1zZXRBdHRyaWJ1dGVOYW1lKHQpe3JldHVybiB0aGlzLl9hdHRyaWJ1dGVOYW1lPXQsdGhpc31nZXRBdHRyaWJ1dGVOYW1lKCl7cmV0dXJuIHRoaXMuX2F0dHJpYnV0ZU5hbWV9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZU5hbWUodCkscz10aGlzLmdldE5vZGVUeXBlKHQpO2lmKHQuaGFzR2VvbWV0cnlBdHRyaWJ1dGUoZSk9PT0hMCl7Y29uc3QgaT10Lmdlb21ldHJ5LmdldEF0dHJpYnV0ZShlKSxvPXQuZ2V0VHlwZUZyb21BdHRyaWJ1dGUoaSksYT10LmdldEF0dHJpYnV0ZShlLG8pO3JldHVybiB0LnNoYWRlclN0YWdlPT09InZlcnRleCI/dC5mb3JtYXQoYS5uYW1lLG8scyk6UGUodGhpcykuYnVpbGQodCxzKX1lbHNlIHJldHVybiBjb25zb2xlLndhcm4oYEF0dHJpYnV0ZU5vZGU6IFZlcnRleCBhdHRyaWJ1dGUgIiR7ZX0iIG5vdCBmb3VuZCBvbiBnZW9tZXRyeS5gKSx0LmdlbmVyYXRlQ29uc3Qocyl9c2VyaWFsaXplKHQpe3N1cGVyLnNlcmlhbGl6ZSh0KSx0Lmdsb2JhbD10aGlzLmdsb2JhbCx0Ll9hdHRyaWJ1dGVOYW1lPXRoaXMuX2F0dHJpYnV0ZU5hbWV9ZGVzZXJpYWxpemUodCl7c3VwZXIuZGVzZXJpYWxpemUodCksdGhpcy5nbG9iYWw9dC5nbG9iYWwsdGhpcy5fYXR0cmlidXRlTmFtZT10Ll9hdHRyaWJ1dGVOYW1lfX1jb25zdCBvcz0ocix0KT0+dihuZXcgJGgocix0KSksWnM9cj0+b3MoInV2Iisocj4wP3I6IiIpLCJ2ZWMyIik7Y2xhc3MgR2ggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJUZXh0dXJlU2l6ZU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidXZlYzIiKSx0aGlzLmlzVGV4dHVyZVNpemVOb2RlPSEwLHRoaXMudGV4dHVyZU5vZGU9dCx0aGlzLmxldmVsTm9kZT1lfWdlbmVyYXRlKHQsZSl7Y29uc3Qgcz10aGlzLnRleHR1cmVOb2RlLmJ1aWxkKHQsInByb3BlcnR5Iiksbj10aGlzLmxldmVsTm9kZT09PW51bGw/IjAiOnRoaXMubGV2ZWxOb2RlLmJ1aWxkKHQsImludCIpO3JldHVybiB0LmZvcm1hdChgJHt0LmdldE1ldGhvZCgidGV4dHVyZURpbWVuc2lvbnMiKX0oICR7c30sICR7bn0gKWAsdGhpcy5nZXROb2RlVHlwZSh0KSxlKX19Y29uc3QgWXI9QyhHaCk7Y2xhc3MgV2ggZXh0ZW5kcyBJZXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF4TWlwTGV2ZWxOb2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigwKSx0aGlzLl90ZXh0dXJlTm9kZT10LHRoaXMudXBkYXRlVHlwZT1RLkZSQU1FfWdldCB0ZXh0dXJlTm9kZSgpe3JldHVybiB0aGlzLl90ZXh0dXJlTm9kZX1nZXQgdGV4dHVyZSgpe3JldHVybiB0aGlzLl90ZXh0dXJlTm9kZS52YWx1ZX11cGRhdGUoKXtjb25zdCB0PXRoaXMudGV4dHVyZSxlPXQuaW1hZ2VzLHM9ZSYmZS5sZW5ndGg+MD9lWzBdJiZlWzBdLmltYWdlfHxlWzBdOnQuaW1hZ2U7aWYocyYmcy53aWR0aCE9PXZvaWQgMCl7Y29uc3R7d2lkdGg6bixoZWlnaHQ6aX09czt0aGlzLnZhbHVlPU1hdGgubG9nMihNYXRoLm1heChuLGkpKX19fWNvbnN0IFhoPUMoV2gpO2NsYXNzIEpzIGV4dGVuZHMgSWV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCxzPW51bGwsbj1udWxsKXtzdXBlcih0KSx0aGlzLmlzVGV4dHVyZU5vZGU9ITAsdGhpcy51dk5vZGU9ZSx0aGlzLmxldmVsTm9kZT1zLHRoaXMuYmlhc05vZGU9bix0aGlzLmNvbXBhcmVOb2RlPW51bGwsdGhpcy5kZXB0aE5vZGU9bnVsbCx0aGlzLmdyYWROb2RlPW51bGwsdGhpcy5zYW1wbGVyPSEwLHRoaXMudXBkYXRlTWF0cml4PSExLHRoaXMudXBkYXRlVHlwZT1RLk5PTkUsdGhpcy5yZWZlcmVuY2VOb2RlPW51bGwsdGhpcy5fdmFsdWU9dCx0aGlzLl9tYXRyaXhVbmlmb3JtPW51bGwsdGhpcy5zZXRVcGRhdGVNYXRyaXgoZT09PW51bGwpfXNldCB2YWx1ZSh0KXt0aGlzLnJlZmVyZW5jZU5vZGU/dGhpcy5yZWZlcmVuY2VOb2RlLnZhbHVlPXQ6dGhpcy5fdmFsdWU9dH1nZXQgdmFsdWUoKXtyZXR1cm4gdGhpcy5yZWZlcmVuY2VOb2RlP3RoaXMucmVmZXJlbmNlTm9kZS52YWx1ZTp0aGlzLl92YWx1ZX1nZXRVbmlmb3JtSGFzaCgpe3JldHVybiB0aGlzLnZhbHVlLnV1aWR9Z2V0Tm9kZVR5cGUoKXtyZXR1cm4gdGhpcy52YWx1ZS5pc0RlcHRoVGV4dHVyZT09PSEwPyJmbG9hdCI6dGhpcy52YWx1ZS50eXBlPT09V2k/InV2ZWM0Ijp0aGlzLnZhbHVlLnR5cGU9PT1Cbz8iaXZlYzQiOiJ2ZWM0In1nZXRJbnB1dFR5cGUoKXtyZXR1cm4idGV4dHVyZSJ9Z2V0RGVmYXVsdFVWKCl7cmV0dXJuIFpzKHRoaXMudmFsdWUuY2hhbm5lbCl9dXBkYXRlUmVmZXJlbmNlKCl7cmV0dXJuIHRoaXMudmFsdWV9Z2V0VHJhbnNmb3JtZWRVVih0KXtyZXR1cm4gdGhpcy5fbWF0cml4VW5pZm9ybT09PW51bGwmJih0aGlzLl9tYXRyaXhVbmlmb3JtPXh0KHRoaXMudmFsdWUubWF0cml4KSksdGhpcy5fbWF0cml4VW5pZm9ybS5tdWwoayh0LDEpKS54eX1zZXRVcGRhdGVNYXRyaXgodCl7cmV0dXJuIHRoaXMudXBkYXRlTWF0cml4PXQsdGhpcy51cGRhdGVUeXBlPXQ/US5GUkFNRTpRLk5PTkUsdGhpc31zZXR1cFVWKHQsZSl7Y29uc3Qgcz10aGlzLnZhbHVlO3JldHVybiB0LmlzRmxpcFkoKSYmKHMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITB8fHMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9PT0hMHx8cy5pc0RlcHRoVGV4dHVyZT09PSEwKSYmKHRoaXMuc2FtcGxlcj9lPWUuZmxpcFkoKTplPWUuc2V0WShSZShZcih0aGlzLHRoaXMubGV2ZWxOb2RlKS55KS5zdWIoZS55KS5zdWIoMSkpKSxlfXNldHVwKHQpe2NvbnN0IGU9dC5nZXROb2RlUHJvcGVydGllcyh0aGlzKTtlLnJlZmVyZW5jZU5vZGU9dGhpcy5yZWZlcmVuY2VOb2RlO2xldCBzPXRoaXMudXZOb2RlOyhzPT09bnVsbHx8dC5jb250ZXh0LmZvcmNlVVZDb250ZXh0PT09ITApJiZ0LmNvbnRleHQuZ2V0VVYmJihzPXQuY29udGV4dC5nZXRVVih0aGlzKSksc3x8KHM9dGhpcy5nZXREZWZhdWx0VVYoKSksdGhpcy51cGRhdGVNYXRyaXg9PT0hMCYmKHM9dGhpcy5nZXRUcmFuc2Zvcm1lZFVWKHMpKSxzPXRoaXMuc2V0dXBVVih0LHMpO2xldCBuPXRoaXMubGV2ZWxOb2RlO249PT1udWxsJiZ0LmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsJiYobj10LmNvbnRleHQuZ2V0VGV4dHVyZUxldmVsKHRoaXMpKSxlLnV2Tm9kZT1zLGUubGV2ZWxOb2RlPW4sZS5iaWFzTm9kZT10aGlzLmJpYXNOb2RlLGUuY29tcGFyZU5vZGU9dGhpcy5jb21wYXJlTm9kZSxlLmdyYWROb2RlPXRoaXMuZ3JhZE5vZGUsZS5kZXB0aE5vZGU9dGhpcy5kZXB0aE5vZGV9Z2VuZXJhdGVVVih0LGUpe3JldHVybiBlLmJ1aWxkKHQsdGhpcy5zYW1wbGVyPT09ITA/InZlYzIiOiJpdmVjMiIpfWdlbmVyYXRlU25pcHBldCh0LGUscyxuLGksbyxhLGMpe2NvbnN0IHU9dGhpcy52YWx1ZTtsZXQgaDtyZXR1cm4gbj9oPXQuZ2VuZXJhdGVUZXh0dXJlTGV2ZWwodSxlLHMsbixvKTppP2g9dC5nZW5lcmF0ZVRleHR1cmVCaWFzKHUsZSxzLGksbyk6Yz9oPXQuZ2VuZXJhdGVUZXh0dXJlR3JhZCh1LGUscyxjLG8pOmE/aD10LmdlbmVyYXRlVGV4dHVyZUNvbXBhcmUodSxlLHMsYSxvKTp0aGlzLnNhbXBsZXI9PT0hMT9oPXQuZ2VuZXJhdGVUZXh0dXJlTG9hZCh1LGUscyxvKTpoPXQuZ2VuZXJhdGVUZXh0dXJlKHUsZSxzLG8pLGh9Z2VuZXJhdGUodCxlKXtjb25zdCBzPXQuZ2V0Tm9kZVByb3BlcnRpZXModGhpcyksbj10aGlzLnZhbHVlO2lmKCFufHxuLmlzVGV4dHVyZSE9PSEwKXRocm93IG5ldyBFcnJvcigiVGV4dHVyZU5vZGU6IE5lZWQgYSB0aHJlZS5qcyB0ZXh0dXJlLiIpO2NvbnN0IGk9c3VwZXIuZ2VuZXJhdGUodCwicHJvcGVydHkiKTtpZihlPT09InNhbXBsZXIiKXJldHVybiBpKyJfc2FtcGxlciI7aWYodC5pc1JlZmVyZW5jZShlKSlyZXR1cm4gaTt7Y29uc3Qgbz10LmdldERhdGFGcm9tTm9kZSh0aGlzKTtsZXQgYT1vLnByb3BlcnR5TmFtZTtpZihhPT09dm9pZCAwKXtjb25zdHt1dk5vZGU6aCxsZXZlbE5vZGU6bCxiaWFzTm9kZTpkLGNvbXBhcmVOb2RlOmYsZGVwdGhOb2RlOnAsZ3JhZE5vZGU6bX09cyxnPXRoaXMuZ2VuZXJhdGVVVih0LGgpLHk9bD9sLmJ1aWxkKHQsImZsb2F0Iik6bnVsbCxUPWQ/ZC5idWlsZCh0LCJmbG9hdCIpOm51bGwsdz1wP3AuYnVpbGQodCwiaW50Iik6bnVsbCxNPWY/Zi5idWlsZCh0LCJmbG9hdCIpOm51bGwsTj1tP1ttWzBdLmJ1aWxkKHQsInZlYzIiKSxtWzFdLmJ1aWxkKHQsInZlYzIiKV06bnVsbCxfPXQuZ2V0VmFyRnJvbU5vZGUodGhpcyk7YT10LmdldFByb3BlcnR5TmFtZShfKTtjb25zdCBTPXRoaXMuZ2VuZXJhdGVTbmlwcGV0KHQsaSxnLHksVCx3LE0sTik7dC5hZGRMaW5lRmxvd0NvZGUoYCR7YX0gPSAke1N9YCx0aGlzKSxvLnNuaXBwZXQ9UyxvLnByb3BlcnR5TmFtZT1hfWxldCBjPWE7Y29uc3QgdT10aGlzLmdldE5vZGVUeXBlKHQpO3JldHVybiB0Lm5lZWRzVG9Xb3JraW5nQ29sb3JTcGFjZShuKSYmKGM9V3IoWXMoYyx1KSxuLmNvbG9yU3BhY2UpLnNldHVwKHQpLmJ1aWxkKHQsdSkpLHQuZm9ybWF0KGMsdSxlKX19c2V0U2FtcGxlcih0KXtyZXR1cm4gdGhpcy5zYW1wbGVyPXQsdGhpc31nZXRTYW1wbGVyKCl7cmV0dXJuIHRoaXMuc2FtcGxlcn11dih0KXtjb25zdCBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS51dk5vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1ibHVyKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmJpYXNOb2RlPXYodCkubXVsKFhoKGUpKSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1sZXZlbCh0KXtjb25zdCBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5sZXZlbE5vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1zaXplKHQpe3JldHVybiBZcih0aGlzLHQpfWJpYXModCl7Y29uc3QgZT10aGlzLmNsb25lKCk7cmV0dXJuIGUuYmlhc05vZGU9dih0KSxlLnJlZmVyZW5jZU5vZGU9dGhpcy5nZXRTZWxmKCksdihlKX1jb21wYXJlKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmNvbXBhcmVOb2RlPXYodCksZS5yZWZlcmVuY2VOb2RlPXRoaXMuZ2V0U2VsZigpLHYoZSl9Z3JhZCh0LGUpe2NvbnN0IHM9dGhpcy5jbG9uZSgpO3JldHVybiBzLmdyYWROb2RlPVt2KHQpLHYoZSldLHMucmVmZXJlbmNlTm9kZT10aGlzLmdldFNlbGYoKSx2KHMpfWRlcHRoKHQpe2NvbnN0IGU9dGhpcy5jbG9uZSgpO3JldHVybiBlLmRlcHRoTm9kZT12KHQpLGUucmVmZXJlbmNlTm9kZT10aGlzLmdldFNlbGYoKSx2KGUpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC52YWx1ZT10aGlzLnZhbHVlLnRvSlNPTih0Lm1ldGEpLnV1aWQsdC5zYW1wbGVyPXRoaXMuc2FtcGxlcix0LnVwZGF0ZU1hdHJpeD10aGlzLnVwZGF0ZU1hdHJpeCx0LnVwZGF0ZVR5cGU9dGhpcy51cGRhdGVUeXBlfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMudmFsdWU9dC5tZXRhLnRleHR1cmVzW3QudmFsdWVdLHRoaXMuc2FtcGxlcj10LnNhbXBsZXIsdGhpcy51cGRhdGVNYXRyaXg9dC51cGRhdGVNYXRyaXgsdGhpcy51cGRhdGVUeXBlPXQudXBkYXRlVHlwZX11cGRhdGUoKXtjb25zdCB0PXRoaXMudmFsdWUsZT10aGlzLl9tYXRyaXhVbmlmb3JtO2UhPT1udWxsJiYoZS52YWx1ZT10Lm1hdHJpeCksdC5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJnQudXBkYXRlTWF0cml4KCl9Y2xvbmUoKXtjb25zdCB0PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMudmFsdWUsdGhpcy51dk5vZGUsdGhpcy5sZXZlbE5vZGUsdGhpcy5iaWFzTm9kZSk7cmV0dXJuIHQuc2FtcGxlcj10aGlzLnNhbXBsZXIsdH19Y29uc3QgYXM9QyhKcyksY3M9eHQoImZsb2F0IikubGFiZWwoImNhbWVyYU5lYXIiKS5zZXRHcm91cChkZSkub25SZW5kZXJVcGRhdGUoKHtjYW1lcmE6cn0pPT5yLm5lYXIpLGhzPXh0KCJmbG9hdCIpLmxhYmVsKCJjYW1lcmFGYXIiKS5zZXRHcm91cChkZSkub25SZW5kZXJVcGRhdGUoKHtjYW1lcmE6cn0pPT5yLmZhciksanM9eHQoIm1hdDQiKS5sYWJlbCgiY2FtZXJhVmlld01hdHJpeCIpLnNldEdyb3VwKGRlKS5vblJlbmRlclVwZGF0ZSgoe2NhbWVyYTpyfSk9PnIubWF0cml4V29ybGRJbnZlcnNlKTtjbGFzcyBIIGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iT2JqZWN0M0ROb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoKSx0aGlzLnNjb3BlPXQsdGhpcy5vYmplY3QzZD1lLHRoaXMudXBkYXRlVHlwZT1RLk9CSkVDVCx0aGlzLl91bmlmb3JtTm9kZT1uZXcgSWUobnVsbCl9Z2V0Tm9kZVR5cGUoKXtjb25zdCB0PXRoaXMuc2NvcGU7aWYodD09PUguV09STERfTUFUUklYKXJldHVybiJtYXQ0IjtpZih0PT09SC5QT1NJVElPTnx8dD09PUguVklFV19QT1NJVElPTnx8dD09PUguRElSRUNUSU9OfHx0PT09SC5TQ0FMRSlyZXR1cm4idmVjMyJ9dXBkYXRlKHQpe2NvbnN0IGU9dGhpcy5vYmplY3QzZCxzPXRoaXMuX3VuaWZvcm1Ob2RlLG49dGhpcy5zY29wZTtpZihuPT09SC5XT1JMRF9NQVRSSVgpcy52YWx1ZT1lLm1hdHJpeFdvcmxkO2Vsc2UgaWYobj09PUguUE9TSVRJT04pcy52YWx1ZT1zLnZhbHVlfHxuZXcgQSxzLnZhbHVlLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKTtlbHNlIGlmKG49PT1ILlNDQUxFKXMudmFsdWU9cy52YWx1ZXx8bmV3IEEscy52YWx1ZS5zZXRGcm9tTWF0cml4U2NhbGUoZS5tYXRyaXhXb3JsZCk7ZWxzZSBpZihuPT09SC5ESVJFQ1RJT04pcy52YWx1ZT1zLnZhbHVlfHxuZXcgQSxlLmdldFdvcmxkRGlyZWN0aW9uKHMudmFsdWUpO2Vsc2UgaWYobj09PUguVklFV19QT1NJVElPTil7Y29uc3QgaT10LmNhbWVyYTtzLnZhbHVlPXMudmFsdWV8fG5ldyBBLHMudmFsdWUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLHMudmFsdWUuYXBwbHlNYXRyaXg0KGkubWF0cml4V29ybGRJbnZlcnNlKX19Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLnNjb3BlO3JldHVybiBlPT09SC5XT1JMRF9NQVRSSVg/dGhpcy5fdW5pZm9ybU5vZGUubm9kZVR5cGU9Im1hdDQiOihlPT09SC5QT1NJVElPTnx8ZT09PUguVklFV19QT1NJVElPTnx8ZT09PUguRElSRUNUSU9OfHxlPT09SC5TQ0FMRSkmJih0aGlzLl91bmlmb3JtTm9kZS5ub2RlVHlwZT0idmVjMyIpLHRoaXMuX3VuaWZvcm1Ob2RlLmJ1aWxkKHQpfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5zY29wZT10aGlzLnNjb3BlfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMuc2NvcGU9dC5zY29wZX19SC5XT1JMRF9NQVRSSVg9IndvcmxkTWF0cml4IixILlBPU0lUSU9OPSJwb3NpdGlvbiIsSC5TQ0FMRT0ic2NhbGUiLEguVklFV19QT1NJVElPTj0idmlld1Bvc2l0aW9uIixILkRJUkVDVElPTj0iZGlyZWN0aW9uIixILkRJUkVDVElPTixILldPUkxEX01BVFJJWCxILlBPU0lUSU9OLEguU0NBTEUsSC5WSUVXX1BPU0lUSU9OO2NsYXNzIFZ0IGV4dGVuZHMgSHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTW9kZWxOb2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX11cGRhdGUodCl7dGhpcy5vYmplY3QzZD10Lm9iamVjdCxzdXBlci51cGRhdGUodCl9fVZ0LkRJUkVDVElPTjtjb25zdCBZaD1PKFZ0LFZ0LldPUkxEX01BVFJJWCk7VnQuUE9TSVRJT04sVnQuU0NBTEUsVnQuVklFV19QT1NJVElPTjtjb25zdCBaaD14dChuZXcgQ3QpLm9uT2JqZWN0VXBkYXRlKCh7b2JqZWN0OnJ9LHQpPT50LnZhbHVlLmdldE5vcm1hbE1hdHJpeChyLm1hdHJpeFdvcmxkKSksWnI9anMubXVsKFloKS50b1ZhcigibW9kZWxWaWV3TWF0cml4XzIiKSxKaD1vcygicG9zaXRpb24iLCJ2ZWMzIikudmFyeWluZygicG9zaXRpb25Mb2NhbCIpLE10PVpyLm11bChKaCkueHl6LnZhcnlpbmcoInZfcG9zaXRpb25WaWV3IiksSnI9TXQubmVnYXRlKCkudmFyeWluZygidl9wb3NpdGlvblZpZXdEaXJlY3Rpb24iKS5ub3JtYWxpemUoKS50b1ZhcigicG9zaXRpb25WaWV3RGlyZWN0aW9uIik7Y2xhc3MgamggZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJGcm9udEZhY2luZ05vZGUifWNvbnN0cnVjdG9yKCl7c3VwZXIoImJvb2wiKSx0aGlzLmlzRnJvbnRGYWNpbmdOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0e3JlbmRlcmVyOmUsbWF0ZXJpYWw6c309dDtyZXR1cm4gZS5jb29yZGluYXRlU3lzdGVtPT09WWUmJnMuc2lkZT09PVVpPyJmYWxzZSI6dC5nZXRGcm9udEZhY2luZygpfX1jb25zdCBkaT1xKE8oamgpKS5tdWwoMikuc3ViKDEpLFFoPW9zKCJub3JtYWwiLCJ2ZWMzIiksS2g9dHQocj0+ci5nZW9tZXRyeS5oYXNBdHRyaWJ1dGUoIm5vcm1hbCIpPT09ITE/KGNvbnNvbGUud2FybignVFNMLk5vcm1hbE5vZGU6IFZlcnRleCBhdHRyaWJ1dGUgIm5vcm1hbCIgbm90IGZvdW5kIG9uIGdlb21ldHJ5LicpLGsoMCwxLDApKTpRaCwidmVjMyIpLm9uY2UoKSgpLnRvVmFyKCJub3JtYWxMb2NhbCIpLHR1PU10LmRGZHgoKS5jcm9zcyhNdC5kRmR5KCkpLm5vcm1hbGl6ZSgpLnRvVmFyKCJub3JtYWxGbGF0IiksTGU9dHQocj0+e2xldCB0O3JldHVybiByLm1hdGVyaWFsLmZsYXRTaGFkaW5nPT09ITA/dD10dTp0PVBlKFFyKEtoKSwidl9ub3JtYWxWaWV3Iikubm9ybWFsaXplKCksdH0sInZlYzMiKS5vbmNlKCkoKS50b1Zhcigibm9ybWFsVmlldyIpLGpyPXR0KHI9PnIuY29udGV4dC5zZXR1cE5vcm1hbCgpLCJ2ZWMzIikub25jZSgpKCkubXVsKGRpKS50b1ZhcigidHJhbnNmb3JtZWROb3JtYWxWaWV3IiksUXI9dHQoKFtyXSx0KT0+e2NvbnN0IGU9dC5yZW5kZXJlci5ub2Rlcy5tb2RlbE5vcm1hbFZpZXdNYXRyaXg7aWYoZSE9PW51bGwpcmV0dXJuIGUudHJhbnNmb3JtRGlyZWN0aW9uKHIpO2NvbnN0IHM9WmgubXVsKHIpO3JldHVybiBqcy50cmFuc2Zvcm1EaXJlY3Rpb24ocyl9KSxldT14dCgwKS5vblJlZmVyZW5jZSgoe21hdGVyaWFsOnJ9KT0+cikub25SZW5kZXJVcGRhdGUoKHttYXRlcmlhbDpyfSk9PnIucmVmcmFjdGlvblJhdGlvKSxzdT1Kci5uZWdhdGUoKS5yZWZsZWN0KGpyKSxudT1Kci5uZWdhdGUoKS5yZWZyYWN0KGpyLGV1KSxpdT1zdS50cmFuc2Zvcm1EaXJlY3Rpb24oanMpLnRvVmFyKCJyZWZsZWN0VmVjdG9yIikscnU9bnUudHJhbnNmb3JtRGlyZWN0aW9uKGpzKS50b1ZhcigicmVmbGVjdFZlY3RvciIpO2NsYXNzIG91IGV4dGVuZHMgSnN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkN1YmVUZXh0dXJlTm9kZSJ9Y29uc3RydWN0b3IodCxlPW51bGwscz1udWxsLG49bnVsbCl7c3VwZXIodCxlLHMsbiksdGhpcy5pc0N1YmVUZXh0dXJlTm9kZT0hMH1nZXRJbnB1dFR5cGUoKXtyZXR1cm4iY3ViZVRleHR1cmUifWdldERlZmF1bHRVVigpe2NvbnN0IHQ9dGhpcy52YWx1ZTtyZXR1cm4gdC5tYXBwaW5nPT09Q28/aXU6dC5tYXBwaW5nPT09Rm8/cnU6KGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkN1YmVUZXh0dXJlTm9kZTogTWFwcGluZyAiJXMiIG5vdCBzdXBwb3J0ZWQuJyx0Lm1hcHBpbmcpLGsoMCwwLDApKX1zZXRVcGRhdGVNYXRyaXgoKXt9c2V0dXBVVih0LGUpe2NvbnN0IHM9dGhpcy52YWx1ZTtyZXR1cm4gdC5yZW5kZXJlci5jb29yZGluYXRlU3lzdGVtPT09em58fCFzLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT9rKGUueC5uZWdhdGUoKSxlLnl6KTplfWdlbmVyYXRlVVYodCxlKXtyZXR1cm4gZS5idWlsZCh0LCJ2ZWMzIil9fWNvbnN0IGF1PUMob3UpO2NsYXNzIEtyIGV4dGVuZHMgSWV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkJ1ZmZlck5vZGUifWNvbnN0cnVjdG9yKHQsZSxzPTApe3N1cGVyKHQsZSksdGhpcy5pc0J1ZmZlck5vZGU9ITAsdGhpcy5idWZmZXJUeXBlPWUsdGhpcy5idWZmZXJDb3VudD1zfWdldEVsZW1lbnRUeXBlKHQpe3JldHVybiB0aGlzLmdldE5vZGVUeXBlKHQpfWdldElucHV0VHlwZSgpe3JldHVybiJidWZmZXIifX1jb25zdCBjdT0ocix0LGUpPT52KG5ldyBLcihyLHQsZSkpO2NsYXNzIGh1IGV4dGVuZHMgaXN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlVuaWZvcm1BcnJheUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0FycmF5QnVmZmVyRWxlbWVudE5vZGU9ITB9Z2VuZXJhdGUodCl7Y29uc3QgZT1zdXBlci5nZW5lcmF0ZSh0KSxzPXRoaXMuZ2V0Tm9kZVR5cGUoKTtyZXR1cm4gdC5mb3JtYXQoZSwidmVjNCIscyl9fWNsYXNzIHV1IGV4dGVuZHMgS3J7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlVuaWZvcm1BcnJheU5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcihudWxsLCJ2ZWM0IiksdGhpcy5hcnJheT10LHRoaXMuZWxlbWVudFR5cGU9ZSx0aGlzLl9lbGVtZW50VHlwZT1udWxsLHRoaXMuX2VsZW1lbnRMZW5ndGg9MCx0aGlzLnVwZGF0ZVR5cGU9US5SRU5ERVIsdGhpcy5pc0FycmF5QnVmZmVyTm9kZT0hMH1nZXRFbGVtZW50VHlwZSgpe3JldHVybiB0aGlzLmVsZW1lbnRUeXBlfHx0aGlzLl9lbGVtZW50VHlwZX1nZXRFbGVtZW50TGVuZ3RoKCl7cmV0dXJuIHRoaXMuX2VsZW1lbnRMZW5ndGh9dXBkYXRlKCl7Y29uc3R7YXJyYXk6dCx2YWx1ZTplfT10aGlzLHM9dGhpcy5nZXRFbGVtZW50TGVuZ3RoKCksbj10aGlzLmdldEVsZW1lbnRUeXBlKCk7aWYocz09PTEpZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89aSo0O2Vbb109dFtpXX1lbHNlIGlmKG49PT0iY29sb3IiKWZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBvPWkqNCxhPXRbaV07ZVtvXT1hLnIsZVtvKzFdPWEuZyxlW28rMl09YS5ifHwwfWVsc2UgZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG89aSo0LGE9dFtpXTtlW29dPWEueCxlW28rMV09YS55LGVbbysyXT1hLnp8fDAsZVtvKzNdPWEud3x8MH19c2V0dXAodCl7Y29uc3QgZT10aGlzLmFycmF5Lmxlbmd0aDt0aGlzLl9lbGVtZW50VHlwZT10aGlzLmVsZW1lbnRUeXBlPT09bnVsbD9Wcyh0aGlzLmFycmF5WzBdKTp0aGlzLmVsZW1lbnRUeXBlLHRoaXMuX2VsZW1lbnRMZW5ndGg9dC5nZXRUeXBlTGVuZ3RoKHRoaXMuX2VsZW1lbnRUeXBlKTtsZXQgcz1GbG9hdDMyQXJyYXk7cmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlLmNoYXJBdCgwKT09PSJpIj9zPUludDMyQXJyYXk6dGhpcy5fZWxlbWVudFR5cGUuY2hhckF0KDApPT09InUiJiYocz1VaW50MzJBcnJheSksdGhpcy52YWx1ZT1uZXcgcyhlKjQpLHRoaXMuYnVmZmVyQ291bnQ9ZSx0aGlzLmJ1ZmZlclR5cGU9dC5jaGFuZ2VDb21wb25lbnRUeXBlKCJ2ZWM0Iix0LmdldENvbXBvbmVudFR5cGUodGhpcy5fZWxlbWVudFR5cGUpKSxzdXBlci5zZXR1cCh0KX1lbGVtZW50KHQpe3JldHVybiB2KG5ldyBodSh0aGlzLHYodCkpKX19Y29uc3QgZmk9KHIsdCk9PnYobmV3IHV1KHIsdCkpO2NsYXNzIGx1IGV4dGVuZHMgaXN7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlJlZmVyZW5jZUVsZW1lbnROb2RlIn1jb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5yZWZlcmVuY2VOb2RlPXQsdGhpcy5pc1JlZmVyZW5jZUVsZW1lbnROb2RlPSEwfWdldE5vZGVUeXBlKCl7cmV0dXJuIHRoaXMucmVmZXJlbmNlTm9kZS51bmlmb3JtVHlwZX1nZW5lcmF0ZSh0KXtjb25zdCBlPXN1cGVyLmdlbmVyYXRlKHQpLHM9dGhpcy5yZWZlcmVuY2VOb2RlLmdldE5vZGVUeXBlKCksbj10aGlzLmdldE5vZGVUeXBlKCk7cmV0dXJuIHQuZm9ybWF0KGUscyxuKX19Y2xhc3MgdG8gZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJSZWZlcmVuY2VOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1udWxsLG49bnVsbCl7c3VwZXIoKSx0aGlzLnByb3BlcnR5PXQsdGhpcy51bmlmb3JtVHlwZT1lLHRoaXMub2JqZWN0PXMsdGhpcy5jb3VudD1uLHRoaXMucHJvcGVydGllcz10LnNwbGl0KCIuIiksdGhpcy5yZWZlcmVuY2U9cyx0aGlzLm5vZGU9bnVsbCx0aGlzLmdyb3VwPW51bGwsdGhpcy5uYW1lPW51bGwsdGhpcy51cGRhdGVUeXBlPVEuT0JKRUNUfWVsZW1lbnQodCl7cmV0dXJuIHYobmV3IGx1KHRoaXMsdih0KSkpfXNldEdyb3VwKHQpe3JldHVybiB0aGlzLmdyb3VwPXQsdGhpc31sYWJlbCh0KXtyZXR1cm4gdGhpcy5uYW1lPXQsdGhpc31zZXROb2RlVHlwZSh0KXtsZXQgZT1udWxsO3RoaXMuY291bnQhPT1udWxsP2U9Y3UobnVsbCx0LHRoaXMuY291bnQpOkFycmF5LmlzQXJyYXkodGhpcy5nZXRWYWx1ZUZyb21SZWZlcmVuY2UoKSk/ZT1maShudWxsLHQpOnQ9PT0idGV4dHVyZSI/ZT1hcyhudWxsKTp0PT09ImN1YmVUZXh0dXJlIj9lPWF1KG51bGwpOmU9eHQobnVsbCx0KSx0aGlzLmdyb3VwIT09bnVsbCYmZS5zZXRHcm91cCh0aGlzLmdyb3VwKSx0aGlzLm5hbWUhPT1udWxsJiZlLmxhYmVsKHRoaXMubmFtZSksdGhpcy5ub2RlPWUuZ2V0U2VsZigpfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLm5vZGU9PT1udWxsJiYodGhpcy51cGRhdGVSZWZlcmVuY2UodCksdGhpcy51cGRhdGVWYWx1ZSgpKSx0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUodCl9Z2V0VmFsdWVGcm9tUmVmZXJlbmNlKHQ9dGhpcy5yZWZlcmVuY2Upe2NvbnN0e3Byb3BlcnRpZXM6ZX09dGhpcztsZXQgcz10W2VbMF1dO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXM9c1tlW25dXTtyZXR1cm4gc311cGRhdGVSZWZlcmVuY2UodCl7cmV0dXJuIHRoaXMucmVmZXJlbmNlPXRoaXMub2JqZWN0IT09bnVsbD90aGlzLm9iamVjdDp0Lm9iamVjdCx0aGlzLnJlZmVyZW5jZX1zZXR1cCgpe3JldHVybiB0aGlzLnVwZGF0ZVZhbHVlKCksdGhpcy5ub2RlfXVwZGF0ZSgpe3RoaXMudXBkYXRlVmFsdWUoKX11cGRhdGVWYWx1ZSgpe3RoaXMubm9kZT09PW51bGwmJnRoaXMuc2V0Tm9kZVR5cGUodGhpcy51bmlmb3JtVHlwZSk7Y29uc3QgdD10aGlzLmdldFZhbHVlRnJvbVJlZmVyZW5jZSgpO0FycmF5LmlzQXJyYXkodCk/dGhpcy5ub2RlLmFycmF5PXQ6dGhpcy5ub2RlLnZhbHVlPXR9fWNvbnN0IHBlPShyLHQsZSk9PnYobmV3IHRvKHIsdCxlKSk7Y2xhc3MgZHUgZXh0ZW5kcyB0b3tzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iTWF0ZXJpYWxSZWZlcmVuY2VOb2RlIn1jb25zdHJ1Y3Rvcih0LGUscz1udWxsKXtzdXBlcih0LGUscyksdGhpcy5tYXRlcmlhbD1zLHRoaXMuaXNNYXRlcmlhbFJlZmVyZW5jZU5vZGU9ITB9dXBkYXRlUmVmZXJlbmNlKHQpe3JldHVybiB0aGlzLnJlZmVyZW5jZT10aGlzLm1hdGVyaWFsIT09bnVsbD90aGlzLm1hdGVyaWFsOnQubWF0ZXJpYWwsdGhpcy5yZWZlcmVuY2V9fWNvbnN0IGZ1PShyLHQsZSk9PnYobmV3IGR1KHIsdCxlKSksZW89dHQocj0+KHIuZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmci5nZW9tZXRyeS5jb21wdXRlVGFuZ2VudHMoKSxvcygidGFuZ2VudCIsInZlYzQiKSkpKCkscHU9ZW8ueHl6LnRvVmFyKCJ0YW5nZW50TG9jYWwiKSxzbz1aci5tdWwoQmUocHUsMCkpLnh5ei52YXJ5aW5nKCJ2X3RhbmdlbnRWaWV3Iikubm9ybWFsaXplKCkudG9WYXIoInRhbmdlbnRWaWV3IiksbXU9cXMoc28sUGUoKHI9PnIubXVsKGVvLncpLnh5eikoTGUuY3Jvc3Moc28pKSwidl9iaXRhbmdlbnRWaWV3Iikubm9ybWFsaXplKCkudG9WYXIoImJpdGFuZ2VudFZpZXciKSxMZSkseXU9dHQocj0+e2NvbnN0e2V5ZV9wb3M6dCxzdXJmX25vcm06ZSxtYXBOOnMsdXY6bn09cixpPXQuZEZkeCgpLG89dC5kRmR5KCksYT1uLmRGZHgoKSxjPW4uZEZkeSgpLHU9ZSxoPW8uY3Jvc3ModSksbD11LmNyb3NzKGkpLGQ9aC5tdWwoYS54KS5hZGQobC5tdWwoYy54KSksZj1oLm11bChhLnkpLmFkZChsLm11bChjLnkpKSxwPWQuZG90KGQpLm1heChmLmRvdChmKSksbT1kaS5tdWwocC5pbnZlcnNlU3FydCgpKTtyZXR1cm4gZmUoZC5tdWwocy54LG0pLGYubXVsKHMueSxtKSx1Lm11bChzLnopKS5ub3JtYWxpemUoKX0pO2NsYXNzIGd1IGV4dGVuZHMgZHR7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIk5vcm1hbE1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMubm9kZT10LHRoaXMuc2NhbGVOb2RlPWUsdGhpcy5ub3JtYWxNYXBUeXBlPVlpfXNldHVwKHQpe2NvbnN0e25vcm1hbE1hcFR5cGU6ZSxzY2FsZU5vZGU6c309dGhpcztsZXQgbj10aGlzLm5vZGUubXVsKDIpLnN1YigxKTtzIT09bnVsbCYmKG49ayhuLnh5Lm11bChzKSxuLnopKTtsZXQgaT1udWxsO3JldHVybiBlPT09T28/aT1RcihuKTplPT09WWkmJih0Lmhhc0dlb21ldHJ5QXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMD9pPW11Lm11bChuKS5ub3JtYWxpemUoKTppPXl1KHtleWVfcG9zOk10LHN1cmZfbm9ybTpMZSxtYXBOOm4sdXY6WnMoKX0pKSxpfX1jb25zdCBubz1DKGd1KSx4dT10dCgoe3RleHR1cmVOb2RlOnIsYnVtcFNjYWxlOnR9KT0+e2NvbnN0IGU9bj0+ci5jYWNoZSgpLmNvbnRleHQoe2dldFVWOmk9Pm4oaS51dk5vZGV8fFpzKCkpLGZvcmNlVVZDb250ZXh0OiEwfSkscz1xKGUobj0+bikpO3JldHVybiBEKHEoZShuPT5uLmFkZChuLmRGZHgoKSkpKS5zdWIocykscShlKG49Pm4uYWRkKG4uZEZkeSgpKSkpLnN1YihzKSkubXVsKHQpfSksVHU9dHQocj0+e2NvbnN0e3N1cmZfcG9zOnQsc3VyZl9ub3JtOmUsZEhkeHk6c309cixuPXQuZEZkeCgpLm5vcm1hbGl6ZSgpLGk9dC5kRmR5KCkubm9ybWFsaXplKCksbz1lLGE9aS5jcm9zcyhvKSxjPW8uY3Jvc3MobiksdT1uLmRvdChhKS5tdWwoZGkpLGg9dS5zaWduKCkubXVsKHMueC5tdWwoYSkuYWRkKHMueS5tdWwoYykpKTtyZXR1cm4gdS5hYnMoKS5tdWwoZSkuc3ViKGgpLm5vcm1hbGl6ZSgpfSk7Y2xhc3MgTnUgZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQnVtcE1hcE5vZGUifWNvbnN0cnVjdG9yKHQsZT1udWxsKXtzdXBlcigidmVjMyIpLHRoaXMudGV4dHVyZU5vZGU9dCx0aGlzLnNjYWxlTm9kZT1lfXNldHVwKCl7Y29uc3QgdD10aGlzLnNjYWxlTm9kZSE9PW51bGw/dGhpcy5zY2FsZU5vZGU6MSxlPXh1KHt0ZXh0dXJlTm9kZTp0aGlzLnRleHR1cmVOb2RlLGJ1bXBTY2FsZTp0fSk7cmV0dXJuIFR1KHtzdXJmX3BvczpNdCxzdXJmX25vcm06TGUsZEhkeHk6ZX0pfX1jb25zdCB3dT1DKE51KSxpbz1uZXcgTWFwO2NsYXNzIHogZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJNYXRlcmlhbE5vZGUifWNvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5zY29wZT10fWdldENhY2hlKHQsZSl7bGV0IHM9aW8uZ2V0KHQpO3JldHVybiBzPT09dm9pZCAwJiYocz1mdSh0LGUpLGlvLnNldCh0LHMpKSxzfWdldEZsb2F0KHQpe3JldHVybiB0aGlzLmdldENhY2hlKHQsImZsb2F0Iil9Z2V0Q29sb3IodCl7cmV0dXJuIHRoaXMuZ2V0Q2FjaGUodCwiY29sb3IiKX1nZXRUZXh0dXJlKHQpe3JldHVybiB0aGlzLmdldENhY2hlKHQ9PT0ibWFwIj8ibWFwIjp0KyJNYXAiLCJ0ZXh0dXJlIil9c2V0dXAodCl7Y29uc3QgZT10LmNvbnRleHQubWF0ZXJpYWwscz10aGlzLnNjb3BlO2xldCBuPW51bGw7aWYocz09PXouQ09MT1Ipe2NvbnN0IGk9ZS5jb2xvciE9PXZvaWQgMD90aGlzLmdldENvbG9yKHMpOmsoKTtlLm1hcCYmZS5tYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUoIm1hcCIpKTpuPWl9ZWxzZSBpZihzPT09ei5PUEFDSVRZKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5hbHBoYU1hcCYmZS5hbHBoYU1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZSgiYWxwaGEiKSk6bj1pfWVsc2UgaWYocz09PXouU1BFQ1VMQVJfU1RSRU5HVEgpZS5zcGVjdWxhck1hcCYmZS5zcGVjdWxhck1hcC5pc1RleHR1cmU9PT0hMD9uPXRoaXMuZ2V0VGV4dHVyZSgic3BlY3VsYXIiKS5yOm49cSgxKTtlbHNlIGlmKHM9PT16LlNQRUNVTEFSX0lOVEVOU0lUWSl7Y29uc3QgaT10aGlzLmdldEZsb2F0KHMpO2Uuc3BlY3VsYXJNYXA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykuYSk6bj1pfWVsc2UgaWYocz09PXouU1BFQ1VMQVJfQ09MT1Ipe2NvbnN0IGk9dGhpcy5nZXRDb2xvcihzKTtlLnNwZWN1bGFyQ29sb3JNYXAmJmUuc3BlY3VsYXJDb2xvck1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5yZ2IpOm49aX1lbHNlIGlmKHM9PT16LlJPVUdITkVTUyl7Y29uc3QgaT10aGlzLmdldEZsb2F0KHMpO2Uucm91Z2huZXNzTWFwJiZlLnJvdWdobmVzc01hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKTpuPWl9ZWxzZSBpZihzPT09ei5NRVRBTE5FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLm1ldGFsbmVzc01hcCYmZS5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykuYik6bj1pfWVsc2UgaWYocz09PXouRU1JU1NJVkUpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdCgiZW1pc3NpdmVJbnRlbnNpdHkiKSxvPXRoaXMuZ2V0Q29sb3IocykubXVsKGkpO2UuZW1pc3NpdmVNYXAmJmUuZW1pc3NpdmVNYXAuaXNUZXh0dXJlPT09ITA/bj1vLm11bCh0aGlzLmdldFRleHR1cmUocykpOm49b31lbHNlIGlmKHM9PT16Lk5PUk1BTCllLm5vcm1hbE1hcD8obj1ubyh0aGlzLmdldFRleHR1cmUoIm5vcm1hbCIpLHRoaXMuZ2V0Q2FjaGUoIm5vcm1hbFNjYWxlIiwidmVjMiIpKSxuLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlKTplLmJ1bXBNYXA/bj13dSh0aGlzLmdldFRleHR1cmUoImJ1bXAiKS5yLHRoaXMuZ2V0RmxvYXQoImJ1bXBTY2FsZSIpKTpuPUxlO2Vsc2UgaWYocz09PXouQ0xFQVJDT0FUKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5jbGVhcmNvYXRNYXAmJmUuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZT09PSEwP249aS5tdWwodGhpcy5nZXRUZXh0dXJlKHMpLnIpOm49aX1lbHNlIGlmKHM9PT16LkNMRUFSQ09BVF9ST1VHSE5FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLmNsZWFyY29hdFJvdWdobmVzc01hcCYmZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlPT09ITA/bj1pLm11bCh0aGlzLmdldFRleHR1cmUocykucik6bj1pfWVsc2UgaWYocz09PXouQ0xFQVJDT0FUX05PUk1BTCllLmNsZWFyY29hdE5vcm1hbE1hcD9uPW5vKHRoaXMuZ2V0VGV4dHVyZShzKSx0aGlzLmdldENhY2hlKHMrIlNjYWxlIiwidmVjMiIpKTpuPUxlO2Vsc2UgaWYocz09PXouU0hFRU4pe2NvbnN0IGk9dGhpcy5nZXRDb2xvcigic2hlZW5Db2xvciIpLm11bCh0aGlzLmdldEZsb2F0KCJzaGVlbiIpKTtlLnNoZWVuQ29sb3JNYXAmJmUuc2hlZW5Db2xvck1hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZSgic2hlZW5Db2xvciIpLnJnYik6bj1pfWVsc2UgaWYocz09PXouU0hFRU5fUk9VR0hORVNTKXtjb25zdCBpPXRoaXMuZ2V0RmxvYXQocyk7ZS5zaGVlblJvdWdobmVzc01hcCYmZS5zaGVlblJvdWdobmVzc01hcC5pc1RleHR1cmU9PT0hMD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5hKTpuPWksbj1uLmNsYW1wKC4wNywxKX1lbHNlIGlmKHM9PT16LkFOSVNPVFJPUFkpaWYoZS5hbmlzb3Ryb3B5TWFwJiZlLmFuaXNvdHJvcHlNYXAuaXNUZXh0dXJlPT09ITApe2NvbnN0IGk9dGhpcy5nZXRUZXh0dXJlKHMpO249UnIodXMueCx1cy55LHVzLnkubmVnYXRlKCksdXMueCkubXVsKGkucmcubXVsKDIpLnN1YihEKDEpKS5ub3JtYWxpemUoKS5tdWwoaS5iKSl9ZWxzZSBuPXVzO2Vsc2UgaWYocz09PXouSVJJREVTQ0VOQ0VfVEhJQ0tORVNTKXtjb25zdCBpPXBlKCIxIiwiZmxvYXQiLGUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSk7aWYoZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCl7Y29uc3Qgbz1wZSgiMCIsImZsb2F0IixlLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UpO249aS5zdWIobykubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKS5hZGQobyl9ZWxzZSBuPWl9ZWxzZSBpZihzPT09ei5UUkFOU01JU1NJT04pe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLnRyYW5zbWlzc2lvbk1hcD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5yKTpuPWl9ZWxzZSBpZihzPT09ei5USElDS05FU1Mpe2NvbnN0IGk9dGhpcy5nZXRGbG9hdChzKTtlLnRoaWNrbmVzc01hcD9uPWkubXVsKHRoaXMuZ2V0VGV4dHVyZShzKS5nKTpuPWl9ZWxzZSBpZihzPT09ei5JT1Ipbj10aGlzLmdldEZsb2F0KHMpO2Vsc2UgaWYocz09PXouTElHSFRfTUFQKW49dGhpcy5nZXRUZXh0dXJlKHMpLnJnYi5tdWwodGhpcy5nZXRGbG9hdCgibGlnaHRNYXBJbnRlbnNpdHkiKSk7ZWxzZSBpZihzPT09ei5BT19NQVApbj10aGlzLmdldFRleHR1cmUocykuci5zdWIoMSkubXVsKHRoaXMuZ2V0RmxvYXQoImFvTWFwSW50ZW5zaXR5IikpLmFkZCgxKTtlbHNle2NvbnN0IGk9dGhpcy5nZXROb2RlVHlwZSh0KTtuPXRoaXMuZ2V0Q2FjaGUocyxpKX1yZXR1cm4gbn19ei5BTFBIQV9URVNUPSJhbHBoYVRlc3QiLHouQ09MT1I9ImNvbG9yIix6Lk9QQUNJVFk9Im9wYWNpdHkiLHouU0hJTklORVNTPSJzaGluaW5lc3MiLHouU1BFQ1VMQVI9InNwZWN1bGFyIix6LlNQRUNVTEFSX1NUUkVOR1RIPSJzcGVjdWxhclN0cmVuZ3RoIix6LlNQRUNVTEFSX0lOVEVOU0lUWT0ic3BlY3VsYXJJbnRlbnNpdHkiLHouU1BFQ1VMQVJfQ09MT1I9InNwZWN1bGFyQ29sb3IiLHouUkVGTEVDVElWSVRZPSJyZWZsZWN0aXZpdHkiLHouUk9VR0hORVNTPSJyb3VnaG5lc3MiLHouTUVUQUxORVNTPSJtZXRhbG5lc3MiLHouTk9STUFMPSJub3JtYWwiLHouQ0xFQVJDT0FUPSJjbGVhcmNvYXQiLHouQ0xFQVJDT0FUX1JPVUdITkVTUz0iY2xlYXJjb2F0Um91Z2huZXNzIix6LkNMRUFSQ09BVF9OT1JNQUw9ImNsZWFyY29hdE5vcm1hbCIsei5FTUlTU0lWRT0iZW1pc3NpdmUiLHouUk9UQVRJT049InJvdGF0aW9uIix6LlNIRUVOPSJzaGVlbiIsei5TSEVFTl9ST1VHSE5FU1M9InNoZWVuUm91Z2huZXNzIix6LkFOSVNPVFJPUFk9ImFuaXNvdHJvcHkiLHouSVJJREVTQ0VOQ0U9ImlyaWRlc2NlbmNlIix6LklSSURFU0NFTkNFX0lPUj0iaXJpZGVzY2VuY2VJT1IiLHouSVJJREVTQ0VOQ0VfVEhJQ0tORVNTPSJpcmlkZXNjZW5jZVRoaWNrbmVzcyIsei5JT1I9ImlvciIsei5UUkFOU01JU1NJT049InRyYW5zbWlzc2lvbiIsei5USElDS05FU1M9InRoaWNrbmVzcyIsei5BVFRFTlVBVElPTl9ESVNUQU5DRT0iYXR0ZW51YXRpb25EaXN0YW5jZSIsei5BVFRFTlVBVElPTl9DT0xPUj0iYXR0ZW51YXRpb25Db2xvciIsei5MSU5FX1NDQUxFPSJzY2FsZSIsei5MSU5FX0RBU0hfU0laRT0iZGFzaFNpemUiLHouTElORV9HQVBfU0laRT0iZ2FwU2l6ZSIsei5MSU5FX1dJRFRIPSJsaW5ld2lkdGgiLHouTElORV9EQVNIX09GRlNFVD0iZGFzaE9mZnNldCIsei5QT0lOVF9XSURUSD0icG9pbnRXaWR0aCIsei5ESVNQRVJTSU9OPSJkaXNwZXJzaW9uIix6LkxJR0hUX01BUD0ibGlnaHQiLHouQU9fTUFQPSJhbyIsei5BTFBIQV9URVNULHouQ09MT1Isei5TSElOSU5FU1Msei5FTUlTU0lWRSx6Lk9QQUNJVFksei5TUEVDVUxBUix6LlNQRUNVTEFSX0lOVEVOU0lUWSx6LlNQRUNVTEFSX0NPTE9SLHouU1BFQ1VMQVJfU1RSRU5HVEgsei5SRUZMRUNUSVZJVFksei5ST1VHSE5FU1Msei5NRVRBTE5FU1Msei5DTEVBUkNPQVQsei5DTEVBUkNPQVRfUk9VR0hORVNTLHouUk9UQVRJT04sei5TSEVFTix6LlNIRUVOX1JPVUdITkVTUyx6LkFOSVNPVFJPUFksei5JUklERVNDRU5DRSx6LklSSURFU0NFTkNFX0lPUix6LklSSURFU0NFTkNFX1RISUNLTkVTUyx6LlRSQU5TTUlTU0lPTix6LlRISUNLTkVTUyx6LklPUix6LkFUVEVOVUFUSU9OX0RJU1RBTkNFLHouQVRURU5VQVRJT05fQ09MT1Isei5MSU5FX1NDQUxFLHouTElORV9EQVNIX1NJWkUsei5MSU5FX0dBUF9TSVpFLHouTElORV9XSURUSCx6LkxJTkVfREFTSF9PRkZTRVQsei5QT0lOVF9XSURUSCx6LkRJU1BFUlNJT04sei5MSUdIVF9NQVAsei5BT19NQVA7Y29uc3QgdXM9eHQobmV3IEopLm9uUmVmZXJlbmNlKGZ1bmN0aW9uKHIpe3JldHVybiByLm1hdGVyaWFsfSkub25SZW5kZXJVcGRhdGUoZnVuY3Rpb24oe21hdGVyaWFsOnJ9KXt0aGlzLnZhbHVlLnNldChyLmFuaXNvdHJvcHkqTWF0aC5jb3Moci5hbmlzb3Ryb3B5Um90YXRpb24pLHIuYW5pc290cm9weSpNYXRoLnNpbihyLmFuaXNvdHJvcHlSb3RhdGlvbikpfSk7Y2xhc3MgVyBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkluZGV4Tm9kZSJ9Y29uc3RydWN0b3IodCl7c3VwZXIoInVpbnQiKSx0aGlzLnNjb3BlPXQsdGhpcy5pc0luc3RhbmNlSW5kZXhOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0IGU9dGhpcy5nZXROb2RlVHlwZSh0KSxzPXRoaXMuc2NvcGU7bGV0IG47aWYocz09PVcuVkVSVEVYKW49dC5nZXRWZXJ0ZXhJbmRleCgpO2Vsc2UgaWYocz09PVcuSU5TVEFOQ0Upbj10LmdldEluc3RhbmNlSW5kZXgoKTtlbHNlIGlmKHM9PT1XLkRSQVcpbj10LmdldERyYXdJbmRleCgpO2Vsc2UgaWYocz09PVcuSU5WT0NBVElPTl9MT0NBTCluPXQuZ2V0SW52b2NhdGlvbkxvY2FsSW5kZXgoKTtlbHNlIGlmKHM9PT1XLklOVk9DQVRJT05fU1VCR1JPVVApbj10LmdldEludm9jYXRpb25TdWJncm91cEluZGV4KCk7ZWxzZSBpZihzPT09Vy5TVUJHUk9VUCluPXQuZ2V0U3ViZ3JvdXBJbmRleCgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5JbmRleE5vZGU6IFVua25vd24gc2NvcGU6ICIrcyk7bGV0IGk7cmV0dXJuIHQuc2hhZGVyU3RhZ2U9PT0idmVydGV4Inx8dC5zaGFkZXJTdGFnZT09PSJjb21wdXRlIj9pPW46aT1QZSh0aGlzKS5idWlsZCh0LGUpLGl9fVcuVkVSVEVYPSJ2ZXJ0ZXgiLFcuSU5TVEFOQ0U9Imluc3RhbmNlIixXLlNVQkdST1VQPSJzdWJncm91cCIsVy5JTlZPQ0FUSU9OX0xPQ0FMPSJpbnZvY2F0aW9uTG9jYWwiLFcuSU5WT0NBVElPTl9TVUJHUk9VUD0iaW52b2NhdGlvblN1Ymdyb3VwIixXLkRSQVc9ImRyYXciLFcuVkVSVEVYLFcuSU5TVEFOQ0UsVy5TVUJHUk9VUCxXLklOVk9DQVRJT05fU1VCR1JPVVAsVy5JTlZPQ0FUSU9OX0xPQ0FMLFcuRFJBVztjbGFzcyBBdSBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIkxvb3BOb2RlIn1jb25zdHJ1Y3Rvcih0PVtdKXtzdXBlcigpLHRoaXMucGFyYW1zPXR9Z2V0VmFyTmFtZSh0KXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgiaSIuY2hhckNvZGVBdCgpK3QpfWdldFByb3BlcnRpZXModCl7Y29uc3QgZT10LmdldE5vZGVQcm9wZXJ0aWVzKHRoaXMpO2lmKGUuc3RhY2tOb2RlIT09dm9pZCAwKXJldHVybiBlO2NvbnN0IHM9e307Zm9yKGxldCBpPTAsbz10aGlzLnBhcmFtcy5sZW5ndGgtMTtpPG87aSsrKXtjb25zdCBhPXRoaXMucGFyYW1zW2ldLGM9YS5pc05vZGUhPT0hMCYmYS5uYW1lfHx0aGlzLmdldFZhck5hbWUoaSksdT1hLmlzTm9kZSE9PSEwJiZhLnR5cGV8fCJpbnQiO3NbY109WXMoYyx1KX1jb25zdCBuPXQuYWRkU3RhY2soKTtyZXR1cm4gZS5yZXR1cm5zTm9kZT10aGlzLnBhcmFtc1t0aGlzLnBhcmFtcy5sZW5ndGgtMV0ocyxuLHQpLGUuc3RhY2tOb2RlPW4sdC5yZW1vdmVTdGFjaygpLGV9Z2V0Tm9kZVR5cGUodCl7Y29uc3R7cmV0dXJuc05vZGU6ZX09dGhpcy5nZXRQcm9wZXJ0aWVzKHQpO3JldHVybiBlP2UuZ2V0Tm9kZVR5cGUodCk6InZvaWQifXNldHVwKHQpe3RoaXMuZ2V0UHJvcGVydGllcyh0KX1nZW5lcmF0ZSh0KXtjb25zdCBlPXRoaXMuZ2V0UHJvcGVydGllcyh0KSxzPXRoaXMucGFyYW1zLG49ZS5zdGFja05vZGU7Zm9yKGxldCBhPTAsYz1zLmxlbmd0aC0xO2E8YzthKyspe2NvbnN0IHU9c1thXTtsZXQgaD1udWxsLGw9bnVsbCxkPW51bGwsZj1udWxsLHA9bnVsbCxtPW51bGw7dS5pc05vZGU/KGY9ImludCIsZD10aGlzLmdldFZhck5hbWUoYSksaD0iMCIsbD11LmJ1aWxkKHQsZikscD0iPCIpOihmPXUudHlwZXx8ImludCIsZD11Lm5hbWV8fHRoaXMuZ2V0VmFyTmFtZShhKSxoPXUuc3RhcnQsbD11LmVuZCxwPXUuY29uZGl0aW9uLG09dS51cGRhdGUsdHlwZW9mIGg9PSJudW1iZXIiP2g9aC50b1N0cmluZygpOmgmJmguaXNOb2RlJiYoaD1oLmJ1aWxkKHQsZikpLHR5cGVvZiBsPT0ibnVtYmVyIj9sPWwudG9TdHJpbmcoKTpsJiZsLmlzTm9kZSYmKGw9bC5idWlsZCh0LGYpKSxoIT09dm9pZCAwJiZsPT09dm9pZCAwPyhoPWgrIiAtIDEiLGw9IjAiLHA9Ij49Iik6bCE9PXZvaWQgMCYmaD09PXZvaWQgMCYmKGg9IjAiLHA9IjwiKSxwPT09dm9pZCAwJiYoTnVtYmVyKGgpPk51bWJlcihsKT9wPSI+PSI6cD0iPCIpKTtjb25zdCBnPXtzdGFydDpoLGVuZDpsLGNvbmRpdGlvbjpwfSx5PWcuc3RhcnQsVD1nLmVuZDtsZXQgdz0iIixNPSIiLE49IiI7bXx8KGY9PT0iaW50Inx8Zj09PSJ1aW50Ij9wLmluY2x1ZGVzKCI8Iik/bT0iKysiOm09Ii0tIjpwLmluY2x1ZGVzKCI8Iik/bT0iKz0gMS4iOm09Ii09IDEuIiksdys9dC5nZXRWYXIoZixkKSsiID0gIit5LE0rPWQrIiAiK3ArIiAiK1QsTis9ZCsiICIrbTtjb25zdCBfPWBmb3IgKCAke3d9OyAke019OyAke059IClgO3QuYWRkRmxvd0NvZGUoKGE9PT0wP2AKYDoiIikrdC50YWIrXytgIHsKCmApLmFkZEZsb3dUYWIoKX1jb25zdCBpPW4uYnVpbGQodCwidm9pZCIpLG89ZS5yZXR1cm5zTm9kZT9lLnJldHVybnNOb2RlLmJ1aWxkKHQpOiIiO3QucmVtb3ZlRmxvd1RhYigpLmFkZEZsb3dDb2RlKGAKYCt0LnRhYitpKTtmb3IobGV0IGE9MCxjPXRoaXMucGFyYW1zLmxlbmd0aC0xO2E8YzthKyspdC5hZGRGbG93Q29kZSgoYT09PTA/IiI6dC50YWIpK2B9CgpgKS5yZW1vdmVGbG93VGFiKCk7cmV0dXJuIHQuYWRkRmxvd1RhYigpLG99fWNvbnN0IE9lPSguLi5yKT0+dihuZXcgQXUoRmUociwiaW50IikpKS5hcHBlbmQoKTtsZXQgbHMsZHM7Y2xhc3MgZXQgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJTY3JlZW5Ob2RlIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuc2NvcGU9dCx0aGlzLmlzVmlld3BvcnROb2RlPSEwfWdldE5vZGVUeXBlKCl7cmV0dXJuIHRoaXMuc2NvcGU9PT1ldC5WSUVXUE9SVD8idmVjNCI6InZlYzIifWdldFVwZGF0ZVR5cGUoKXtsZXQgdD1RLk5PTkU7cmV0dXJuKHRoaXMuc2NvcGU9PT1ldC5TSVpFfHx0aGlzLnNjb3BlPT09ZXQuVklFV1BPUlQpJiYodD1RLlJFTkRFUiksdGhpcy51cGRhdGVUeXBlPXQsdH11cGRhdGUoe3JlbmRlcmVyOnR9KXtjb25zdCBlPXQuZ2V0UmVuZGVyVGFyZ2V0KCk7dGhpcy5zY29wZT09PWV0LlZJRVdQT1JUP2UhPT1udWxsP2RzLmNvcHkoZS52aWV3cG9ydCk6KHQuZ2V0Vmlld3BvcnQoZHMpLGRzLm11bHRpcGx5U2NhbGFyKHQuZ2V0UGl4ZWxSYXRpbygpKSk6ZSE9PW51bGw/KGxzLndpZHRoPWUud2lkdGgsbHMuaGVpZ2h0PWUuaGVpZ2h0KTp0LmdldERyYXdpbmdCdWZmZXJTaXplKGxzKX1zZXR1cCgpe2NvbnN0IHQ9dGhpcy5zY29wZTtsZXQgZT1udWxsO3JldHVybiB0PT09ZXQuU0laRT9lPXh0KGxzfHwobHM9bmV3IEopKTp0PT09ZXQuVklFV1BPUlQ/ZT14dChkc3x8KGRzPW5ldyBGdCkpOmU9RChRcy5kaXYocm8pKSxlfWdlbmVyYXRlKHQpe2lmKHRoaXMuc2NvcGU9PT1ldC5DT09SRElOQVRFKXtsZXQgZT10LmdldEZyYWdDb29yZCgpO2lmKHQuaXNGbGlwWSgpKXtjb25zdCBzPXQuZ2V0Tm9kZVByb3BlcnRpZXMocm8pLm91dHB1dE5vZGUuYnVpbGQodCk7ZT1gJHt0LmdldFR5cGUoInZlYzIiKX0oICR7ZX0ueCwgJHtzfS55IC0gJHtlfS55IClgfXJldHVybiBlfXJldHVybiBzdXBlci5nZW5lcmF0ZSh0KX19ZXQuQ09PUkRJTkFURT0iY29vcmRpbmF0ZSIsZXQuVklFV1BPUlQ9InZpZXdwb3J0IixldC5TSVpFPSJzaXplIixldC5VVj0idXYiO2NvbnN0IHBpPU8oZXQsZXQuVVYpLHJvPU8oZXQsZXQuU0laRSksUXM9TyhldCxldC5DT09SRElOQVRFKSxvbz1PKGV0LGV0LlZJRVdQT1JUKTtvby56dyxvby54eTtjb25zdCBmcz1uZXcgSjtjbGFzcyBNdSBleHRlbmRzIEpze3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJWaWV3cG9ydFRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0PXBpLGU9bnVsbCxzPW51bGwpe3M9PT1udWxsJiYocz1uZXcgQWEscy5taW5GaWx0ZXI9R2kpLHN1cGVyKHMsdCxlKSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmlzT3V0cHV0VGV4dHVyZU5vZGU9ITAsdGhpcy51cGRhdGVCZWZvcmVUeXBlPVEuRlJBTUV9dXBkYXRlQmVmb3JlKHQpe2NvbnN0IGU9dC5yZW5kZXJlcjtlLmdldERyYXdpbmdCdWZmZXJTaXplKGZzKTtjb25zdCBzPXRoaXMudmFsdWU7KHMuaW1hZ2Uud2lkdGghPT1mcy53aWR0aHx8cy5pbWFnZS5oZWlnaHQhPT1mcy5oZWlnaHQpJiYocy5pbWFnZS53aWR0aD1mcy53aWR0aCxzLmltYWdlLmhlaWdodD1mcy5oZWlnaHQscy5uZWVkc1VwZGF0ZT0hMCk7Y29uc3Qgbj1zLmdlbmVyYXRlTWlwbWFwcztzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmdlbmVyYXRlTWlwbWFwcyxlLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZShzKSxzLmdlbmVyYXRlTWlwbWFwcz1ufWNsb25lKCl7Y29uc3QgdD1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnV2Tm9kZSx0aGlzLmxldmVsTm9kZSx0aGlzLnZhbHVlKTtyZXR1cm4gdC5nZW5lcmF0ZU1pcG1hcHM9dGhpcy5nZW5lcmF0ZU1pcG1hcHMsdH19bGV0IG1pPW51bGw7Y2xhc3MgU3UgZXh0ZW5kcyBNdXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iVmlld3BvcnREZXB0aFRleHR1cmVOb2RlIn1jb25zdHJ1Y3Rvcih0PXBpLGU9bnVsbCl7bWk9PT1udWxsJiYobWk9bmV3IHhyKSxzdXBlcih0LGUsbWkpfX1jb25zdCBfdT1DKFN1KTtjbGFzcyBmdCBleHRlbmRzIFV7c3RhdGljIGdldCB0eXBlKCl7cmV0dXJuIlZpZXdwb3J0RGVwdGhOb2RlIn1jb25zdHJ1Y3Rvcih0LGU9bnVsbCl7c3VwZXIoImZsb2F0IiksdGhpcy5zY29wZT10LHRoaXMudmFsdWVOb2RlPWUsdGhpcy5pc1ZpZXdwb3J0RGVwdGhOb2RlPSEwfWdlbmVyYXRlKHQpe2NvbnN0e3Njb3BlOmV9PXRoaXM7cmV0dXJuIGU9PT1mdC5ERVBUSF9CQVNFP3QuZ2V0RnJhZ0RlcHRoKCk6c3VwZXIuZ2VuZXJhdGUodCl9c2V0dXAoe2NhbWVyYTp0fSl7Y29uc3R7c2NvcGU6ZX09dGhpcyxzPXRoaXMudmFsdWVOb2RlO2xldCBuPW51bGw7aWYoZT09PWZ0LkRFUFRIX0JBU0UpcyE9PW51bGwmJihuPWNvKCkuYXNzaWduKHMpKTtlbHNlIGlmKGU9PT1mdC5ERVBUSCl0LmlzUGVyc3BlY3RpdmVDYW1lcmE/bj16dShNdC56LGNzLGhzKTpuPUtzKE10LnosY3MsaHMpO2Vsc2UgaWYoZT09PWZ0LkxJTkVBUl9ERVBUSClpZihzIT09bnVsbClpZih0LmlzUGVyc3BlY3RpdmVDYW1lcmEpe2NvbnN0IGk9YW8ocyxjcyxocyk7bj1LcyhpLGNzLGhzKX1lbHNlIG49cztlbHNlIG49S3MoTXQueixjcyxocyk7cmV0dXJuIG59fWZ0LkRFUFRIX0JBU0U9ImRlcHRoQmFzZSIsZnQuREVQVEg9ImRlcHRoIixmdC5MSU5FQVJfREVQVEg9ImxpbmVhckRlcHRoIjtjb25zdCBLcz0ocix0LGUpPT5yLmFkZCh0KS5kaXYodC5zdWIoZSkpLHp1PShyLHQsZSk9PnQuYWRkKHIpLm11bChlKS5kaXYoZS5zdWIodCkubXVsKHIpKSxhbz0ocix0LGUpPT50Lm11bChlKS5kaXYoZS5zdWIodCkubXVsKHIpLnN1YihlKSksY289QyhmdCxmdC5ERVBUSF9CQVNFKSxidT1PKGZ0LGZ0LkRFUFRIKSxFdT1DKGZ0LGZ0LkxJTkVBUl9ERVBUSCk7X3UoKSxidS5hc3NpZ249cj0+Y28ocik7Y2xhc3MgcHMgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJDbGlwcGluZ05vZGUifWNvbnN0cnVjdG9yKHQ9cHMuREVGQVVMVCl7c3VwZXIoKSx0aGlzLnNjb3BlPXR9c2V0dXAodCl7c3VwZXIuc2V0dXAodCk7Y29uc3QgZT10LmNsaXBwaW5nQ29udGV4dCx7bG9jYWxDbGlwSW50ZXJzZWN0aW9uOnMsbG9jYWxDbGlwcGluZ0NvdW50Om4sZ2xvYmFsQ2xpcHBpbmdDb3VudDppfT1lLG89aStuLGE9cz9vLW46bztyZXR1cm4gdGhpcy5zY29wZT09PXBzLkFMUEhBX1RPX0NPVkVSQUdFP3RoaXMuc2V0dXBBbHBoYVRvQ292ZXJhZ2UoZS5wbGFuZXMsbyxhKTp0aGlzLnNldHVwRGVmYXVsdChlLnBsYW5lcyxvLGEpfXNldHVwQWxwaGFUb0NvdmVyYWdlKHQsZSxzKXtyZXR1cm4gdHQoKCk9Pntjb25zdCBuPWZpKHQpLGk9dmUoImZsb2F0IiwiZGlzdGFuY2VUb1BsYW5lIiksbz12ZSgiZmxvYXQiLCJkaXN0YW5jZVRvR3JhZGllbnQiKSxhPXZlKCJmbG9hdCIsImNsaXBPcGFjaXR5Iik7YS5hc3NpZ24oMSk7bGV0IGM7aWYoT2Uocywoe2k6dX0pPT57Yz1uLmVsZW1lbnQodSksaS5hc3NpZ24oTXQuZG90KGMueHl6KS5uZWdhdGUoKS5hZGQoYy53KSksby5hc3NpZ24oaS5md2lkdGgoKS5kaXYoMikpLGEubXVsQXNzaWduKGhpKG8ubmVnYXRlKCksbyxpKSksYS5lcXVhbCgwKS5kaXNjYXJkKCl9KSxzPGUpe2NvbnN0IHU9dmUoImZsb2F0IiwidW5pb25jbGlwT3BhY2l0eSIpO3UuYXNzaWduKDEpLE9lKHtzdGFydDpzLGVuZDplfSwoe2k6aH0pPT57Yz1uLmVsZW1lbnQoaCksaS5hc3NpZ24oTXQuZG90KGMueHl6KS5uZWdhdGUoKS5hZGQoYy53KSksby5hc3NpZ24oaS5md2lkdGgoKS5kaXYoMikpLHUubXVsQXNzaWduKGhpKG8ubmVnYXRlKCksbyxpKS5vbmVNaW51cygpKX0pLGEubXVsQXNzaWduKHUub25lTWludXMoKSl9dnIuYS5tdWxBc3NpZ24oYSksdnIuYS5lcXVhbCgwKS5kaXNjYXJkKCl9KSgpfXNldHVwRGVmYXVsdCh0LGUscyl7cmV0dXJuIHR0KCgpPT57Y29uc3Qgbj1maSh0KTtsZXQgaTtpZihPZShzLCh7aTpvfSk9PntpPW4uZWxlbWVudChvKSxNdC5kb3QoaS54eXopLmdyZWF0ZXJUaGFuKGkudykuZGlzY2FyZCgpfSksczxlKXtjb25zdCBvPXZlKCJib29sIiwiY2xpcHBlZCIpO28uYXNzaWduKCEwKSxPZSh7c3RhcnQ6cyxlbmQ6ZX0sKHtpOmF9KT0+e2k9bi5lbGVtZW50KGEpLG8uYXNzaWduKE10LmRvdChpLnh5eikuZ3JlYXRlclRoYW4oaS53KS5hbmQobykpfSksby5kaXNjYXJkKCl9fSkoKX19cHMuQUxQSEFfVE9fQ09WRVJBR0U9ImFscGhhVG9Db3ZlcmFnZSIscHMuREVGQVVMVD0iZGVmYXVsdCIsayguMDQpLHEoMSk7Y29uc3QgQ3U9dHQoKFtyLHRdKT0+e2NvbnN0IGU9ci50b1ZhcigpO2UuYXNzaWduKEdzKDIsZSkuc3ViKDEpKTtjb25zdCBzPWsoZSwxKS50b1ZhcigpO3JldHVybiBuaSh0LmVxdWFsKDApLCgpPT57cy5hc3NpZ24ocy56eXgpfSkuRWxzZUlmKHQuZXF1YWwoMSksKCk9PntzLmFzc2lnbihzLnh6eSkscy54ei5tdWxBc3NpZ24oLTEpfSkuRWxzZUlmKHQuZXF1YWwoMiksKCk9PntzLngubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDMpLCgpPT57cy5hc3NpZ24ocy56eXgpLHMueHoubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDQpLCgpPT57cy5hc3NpZ24ocy54enkpLHMueHkubXVsQXNzaWduKC0xKX0pLkVsc2VJZih0LmVxdWFsKDUpLCgpPT57cy56Lm11bEFzc2lnbigtMSl9KSxzfSkuc2V0TGF5b3V0KHtuYW1lOiJnZXREaXJlY3Rpb24iLHR5cGU6InZlYzMiLGlucHV0czpbe25hbWU6InV2Iix0eXBlOiJ2ZWMyIn0se25hbWU6ImZhY2UiLHR5cGU6ImZsb2F0In1dfSk7dHQoKHt0ZXh0dXJlOnIsdXY6dH0pPT57Y29uc3Qgcz1rKCkudG9WYXIoKTtyZXR1cm4gbmkodC54Lmxlc3NUaGFuKDFlLTQpLCgpPT57cy5hc3NpZ24oaygxLDAsMCkpfSkuRWxzZUlmKHQueS5sZXNzVGhhbigxZS00KSwoKT0+e3MuYXNzaWduKGsoMCwxLDApKX0pLkVsc2VJZih0LnoubGVzc1RoYW4oMWUtNCksKCk9PntzLmFzc2lnbihrKDAsMCwxKSl9KS5FbHNlSWYodC54LmdyZWF0ZXJUaGFuKDEtMWUtNCksKCk9PntzLmFzc2lnbihrKC0xLDAsMCkpfSkuRWxzZUlmKHQueS5ncmVhdGVyVGhhbigxLTFlLTQpLCgpPT57cy5hc3NpZ24oaygwLC0xLDApKX0pLkVsc2VJZih0LnouZ3JlYXRlclRoYW4oMS0xZS00KSwoKT0+e3MuYXNzaWduKGsoMCwwLC0xKSl9KS5FbHNlKCgpPT57Y29uc3QgaT1yLnV2KHQuYWRkKGsoLS4wMSwwLDApKSkuci5zdWIoci51dih0LmFkZChrKC4wMSwwLDApKSkuciksbz1yLnV2KHQuYWRkKGsoMCwtLjAxLDApKSkuci5zdWIoci51dih0LmFkZChrKDAsLjAxLDApKSkuciksYT1yLnV2KHQuYWRkKGsoMCwwLC0uMDEpKSkuci5zdWIoci51dih0LmFkZChrKDAsMCwuMDEpKSkucik7cy5hc3NpZ24oayhpLG8sYSkpfSkscy5ub3JtYWxpemUoKX0pO2NvbnN0IHlpPUN1KFpzKCksb3MoImZhY2VJbmRleCIpKS5ub3JtYWxpemUoKTtrKHlpLngseWkueS5uZWdhdGUoKSx5aS56KTtjbGFzcyBQdCBleHRlbmRzIElle3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJUaW1lck5vZGUifWNvbnN0cnVjdG9yKHQ9UHQuTE9DQUwsZT0xLHM9MCl7c3VwZXIocyksdGhpcy5zY29wZT10LHRoaXMuc2NhbGU9ZSx0aGlzLnVwZGF0ZVR5cGU9US5GUkFNRX11cGRhdGUodCl7Y29uc3QgZT10aGlzLnNjb3BlLHM9dGhpcy5zY2FsZTtlPT09UHQuTE9DQUw/dGhpcy52YWx1ZSs9dC5kZWx0YVRpbWUqczplPT09UHQuREVMVEE/dGhpcy52YWx1ZT10LmRlbHRhVGltZSpzOmU9PT1QdC5GUkFNRT90aGlzLnZhbHVlPXQuZnJhbWVJZDp0aGlzLnZhbHVlPXQudGltZSpzfXNlcmlhbGl6ZSh0KXtzdXBlci5zZXJpYWxpemUodCksdC5zY29wZT10aGlzLnNjb3BlLHQuc2NhbGU9dGhpcy5zY2FsZX1kZXNlcmlhbGl6ZSh0KXtzdXBlci5kZXNlcmlhbGl6ZSh0KSx0aGlzLnNjb3BlPXQuc2NvcGUsdGhpcy5zY2FsZT10LnNjYWxlfX1QdC5MT0NBTD0ibG9jYWwiLFB0LkdMT0JBTD0iZ2xvYmFsIixQdC5ERUxUQT0iZGVsdGEiLFB0LkZSQU1FPSJmcmFtZSI7Y29uc3QgRnU9KHIsdD0wKT0+dihuZXcgUHQoUHQuTE9DQUwscix0KSk7Y2xhc3MgcnQgZXh0ZW5kcyBVe3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJPc2NOb2RlIn1jb25zdHJ1Y3Rvcih0PXJ0LlNJTkUsZT1GdSgpKXtzdXBlcigpLHRoaXMubWV0aG9kPXQsdGhpcy50aW1lTm9kZT1lfWdldE5vZGVUeXBlKHQpe3JldHVybiB0aGlzLnRpbWVOb2RlLmdldE5vZGVUeXBlKHQpfXNldHVwKCl7Y29uc3QgdD10aGlzLm1ldGhvZCxlPXYodGhpcy50aW1lTm9kZSk7bGV0IHM9bnVsbDtyZXR1cm4gdD09PXJ0LlNJTkU/cz1lLmFkZCguNzUpLm11bChNYXRoLlBJKjIpLnNpbigpLm11bCguNSkuYWRkKC41KTp0PT09cnQuU1FVQVJFP3M9ZS5mcmFjdCgpLnJvdW5kKCk6dD09PXJ0LlRSSUFOR0xFP3M9ZS5hZGQoLjUpLmZyYWN0KCkubXVsKDIpLnN1YigxKS5hYnMoKTp0PT09cnQuU0FXVE9PVEgmJihzPWUuZnJhY3QoKSksc31zZXJpYWxpemUodCl7c3VwZXIuc2VyaWFsaXplKHQpLHQubWV0aG9kPXRoaXMubWV0aG9kfWRlc2VyaWFsaXplKHQpe3N1cGVyLmRlc2VyaWFsaXplKHQpLHRoaXMubWV0aG9kPXQubWV0aG9kfX1ydC5TSU5FPSJzaW5lIixydC5TUVVBUkU9InNxdWFyZSIscnQuVFJJQU5HTEU9InRyaWFuZ2xlIixydC5TQVdUT09USD0ic2F3dG9vdGgiLHJ0LlNJTkUscnQuU1FVQVJFLHJ0LlRSSUFOR0xFLHJ0LlNBV1RPT1RILG5ldyBYbixuZXcgQSxuZXcgQSxuZXcgQSxuZXcgbnQsbmV3IEEoMCwwLC0xKSxuZXcgRnQsbmV3IEEsbmV3IEEsbmV3IEZ0LG5ldyBKLG5ldyBvcixwaS5mbGlwWCgpO2NsYXNzIFV0IGV4dGVuZHMgVXtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iU2NlbmVOb2RlIn1jb25zdHJ1Y3Rvcih0PVV0LkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyxlPW51bGwpe3N1cGVyKCksdGhpcy5zY29wZT10LHRoaXMuc2NlbmU9ZX1zZXR1cCh0KXtjb25zdCBlPXRoaXMuc2NvcGUscz10aGlzLnNjZW5lIT09bnVsbD90aGlzLnNjZW5lOnQuc2NlbmU7bGV0IG47cmV0dXJuIGU9PT1VdC5CQUNLR1JPVU5EX0JMVVJSSU5FU1M/bj1wZSgiYmFja2dyb3VuZEJsdXJyaW5lc3MiLCJmbG9hdCIscyk6ZT09PVV0LkJBQ0tHUk9VTkRfSU5URU5TSVRZP249cGUoImJhY2tncm91bmRJbnRlbnNpdHkiLCJmbG9hdCIscyk6Y29uc29sZS5lcnJvcigiVEhSRUUuU2NlbmVOb2RlOiBVbmtub3duIHNjb3BlOiIsZSksbn19VXQuQkFDS0dST1VORF9CTFVSUklORVNTPSJiYWNrZ3JvdW5kQmx1cnJpbmVzcyIsVXQuQkFDS0dST1VORF9JTlRFTlNJVFk9ImJhY2tncm91bmRJbnRlbnNpdHkiLFV0LkJBQ0tHUk9VTkRfQkxVUlJJTkVTUyxVdC5CQUNLR1JPVU5EX0lOVEVOU0lUWTtjb25zdCBSdT1uZXcgSjtjbGFzcyBCdSBleHRlbmRzIEpze3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzVGV4dHVyZU5vZGUifWNvbnN0cnVjdG9yKHQsZSl7c3VwZXIoZSksdGhpcy5wYXNzTm9kZT10LHRoaXMuc2V0VXBkYXRlTWF0cml4KCExKX1zZXR1cCh0KXtyZXR1cm4gdC5vYmplY3QuaXNRdWFkTWVzaCYmdGhpcy5wYXNzTm9kZS5idWlsZCh0KSxzdXBlci5zZXR1cCh0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhc3NOb2RlLHRoaXMudmFsdWUpfX1jbGFzcyBobyBleHRlbmRzIEJ1e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzTXVsdGlwbGVUZXh0dXJlTm9kZSJ9Y29uc3RydWN0b3IodCxlLHM9ITEpe3N1cGVyKHQsbnVsbCksdGhpcy50ZXh0dXJlTmFtZT1lLHRoaXMucHJldmlvdXNUZXh0dXJlPXN9dXBkYXRlVGV4dHVyZSgpe3RoaXMudmFsdWU9dGhpcy5wcmV2aW91c1RleHR1cmU/dGhpcy5wYXNzTm9kZS5nZXRQcmV2aW91c1RleHR1cmUodGhpcy50ZXh0dXJlTmFtZSk6dGhpcy5wYXNzTm9kZS5nZXRUZXh0dXJlKHRoaXMudGV4dHVyZU5hbWUpfXNldHVwKHQpe3JldHVybiB0aGlzLnVwZGF0ZVRleHR1cmUoKSxzdXBlci5zZXR1cCh0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhc3NOb2RlLHRoaXMudGV4dHVyZU5hbWUsdGhpcy5wcmV2aW91c1RleHR1cmUpfX1jbGFzcyB0biBleHRlbmRzIGR0e3N0YXRpYyBnZXQgdHlwZSgpe3JldHVybiJQYXNzTm9kZSJ9Y29uc3RydWN0b3IodCxlLHMsbj17fSl7c3VwZXIoInZlYzQiKSx0aGlzLnNjb3BlPXQsdGhpcy5zY2VuZT1lLHRoaXMuY2FtZXJhPXMsdGhpcy5vcHRpb25zPW4sdGhpcy5fcGl4ZWxSYXRpbz0xLHRoaXMuX3dpZHRoPTEsdGhpcy5faGVpZ2h0PTE7Y29uc3QgaT1uZXcgeHI7aS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsaS5uYW1lPSJkZXB0aCI7Y29uc3Qgbz1uZXcgb3IodGhpcy5fd2lkdGgqdGhpcy5fcGl4ZWxSYXRpbyx0aGlzLl9oZWlnaHQqdGhpcy5fcGl4ZWxSYXRpbyx7dHlwZTp2bywuLi5ufSk7by50ZXh0dXJlLm5hbWU9Im91dHB1dCIsby5kZXB0aFRleHR1cmU9aSx0aGlzLnJlbmRlclRhcmdldD1vLHRoaXMudXBkYXRlQmVmb3JlVHlwZT1RLkZSQU1FLHRoaXMuX3RleHR1cmVzPXtvdXRwdXQ6by50ZXh0dXJlLGRlcHRoOml9LHRoaXMuX3RleHR1cmVOb2Rlcz17fSx0aGlzLl9saW5lYXJEZXB0aE5vZGVzPXt9LHRoaXMuX3ZpZXdaTm9kZXM9e30sdGhpcy5fcHJldmlvdXNUZXh0dXJlcz17fSx0aGlzLl9wcmV2aW91c1RleHR1cmVOb2Rlcz17fSx0aGlzLl9jYW1lcmFOZWFyPXh0KDApLHRoaXMuX2NhbWVyYUZhcj14dCgwKSx0aGlzLl9tcnQ9bnVsbCx0aGlzLmlzUGFzc05vZGU9ITB9c2V0TVJUKHQpe3JldHVybiB0aGlzLl9tcnQ9dCx0aGlzfWdldE1SVCgpe3JldHVybiB0aGlzLl9tcnR9aXNHbG9iYWwoKXtyZXR1cm4hMH1nZXRUZXh0dXJlKHQpe2xldCBlPXRoaXMuX3RleHR1cmVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYoZT10aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmNsb25lKCksZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsZS5uYW1lPXQsdGhpcy5fdGV4dHVyZXNbdF09ZSx0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlcy5wdXNoKGUpKSxlfWdldFByZXZpb3VzVGV4dHVyZSh0KXtsZXQgZT10aGlzLl9wcmV2aW91c1RleHR1cmVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYoZT10aGlzLmdldFRleHR1cmUodCkuY2xvbmUoKSxlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMCx0aGlzLl9wcmV2aW91c1RleHR1cmVzW3RdPWUpLGV9dG9nZ2xlVGV4dHVyZSh0KXtjb25zdCBlPXRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbdF07aWYoZSE9PXZvaWQgMCl7Y29uc3Qgcz10aGlzLl90ZXh0dXJlc1t0XSxuPXRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmVzLmluZGV4T2Yocyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZXNbbl09ZSx0aGlzLl90ZXh0dXJlc1t0XT1lLHRoaXMuX3ByZXZpb3VzVGV4dHVyZXNbdF09cyx0aGlzLl90ZXh0dXJlTm9kZXNbdF0udXBkYXRlVGV4dHVyZSgpLHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdLnVwZGF0ZVRleHR1cmUoKX19Z2V0VGV4dHVyZU5vZGUodD0ib3V0cHV0Iil7bGV0IGU9dGhpcy5fdGV4dHVyZU5vZGVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYodGhpcy5fdGV4dHVyZU5vZGVzW3RdPWU9dihuZXcgaG8odGhpcyx0KSksdGhpcy5fdGV4dHVyZU5vZGVzW3RdLnVwZGF0ZVRleHR1cmUoKSksZX1nZXRQcmV2aW91c1RleHR1cmVOb2RlKHQ9Im91dHB1dCIpe2xldCBlPXRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdO3JldHVybiBlPT09dm9pZCAwJiYodGhpcy5fdGV4dHVyZU5vZGVzW3RdPT09dm9pZCAwJiZ0aGlzLmdldFRleHR1cmVOb2RlKHQpLHRoaXMuX3ByZXZpb3VzVGV4dHVyZU5vZGVzW3RdPWU9dihuZXcgaG8odGhpcyx0LCEwKSksdGhpcy5fcHJldmlvdXNUZXh0dXJlTm9kZXNbdF0udXBkYXRlVGV4dHVyZSgpKSxlfWdldFZpZXdaTm9kZSh0PSJkZXB0aCIpe2xldCBlPXRoaXMuX3ZpZXdaTm9kZXNbdF07aWYoZT09PXZvaWQgMCl7Y29uc3Qgcz10aGlzLl9jYW1lcmFOZWFyLG49dGhpcy5fY2FtZXJhRmFyO3RoaXMuX3ZpZXdaTm9kZXNbdF09ZT1hbyh0aGlzLmdldFRleHR1cmVOb2RlKHQpLHMsbil9cmV0dXJuIGV9Z2V0TGluZWFyRGVwdGhOb2RlKHQ9ImRlcHRoIil7bGV0IGU9dGhpcy5fbGluZWFyRGVwdGhOb2Rlc1t0XTtpZihlPT09dm9pZCAwKXtjb25zdCBzPXRoaXMuX2NhbWVyYU5lYXIsbj10aGlzLl9jYW1lcmFGYXIsaT10aGlzLmdldFZpZXdaTm9kZSh0KTt0aGlzLl9saW5lYXJEZXB0aE5vZGVzW3RdPWU9S3MoaSxzLG4pfXJldHVybiBlfXNldHVwKHtyZW5kZXJlcjp0fSl7cmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0LnNhbXBsZXM9dGhpcy5vcHRpb25zLnNhbXBsZXM9PT12b2lkIDA/dC5zYW1wbGVzOnRoaXMub3B0aW9ucy5zYW1wbGVzLHQuYmFja2VuZC5pc1dlYkdMQmFja2VuZD09PSEwJiYodGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcz0wKSx0aGlzLnJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNNdWx0aXNhbXBsZVJlbmRlclRhcmdldFRleHR1cmU9dGhpcy5yZW5kZXJUYXJnZXQuc2FtcGxlcz4xLHRoaXMuc2NvcGU9PT10bi5DT0xPUj90aGlzLmdldFRleHR1cmVOb2RlKCk6dGhpcy5nZXRMaW5lYXJEZXB0aE5vZGUoKX11cGRhdGVCZWZvcmUodCl7Y29uc3R7cmVuZGVyZXI6ZX09dCx7c2NlbmU6cyxjYW1lcmE6bn09dGhpczt0aGlzLl9waXhlbFJhdGlvPWUuZ2V0UGl4ZWxSYXRpbygpO2NvbnN0IGk9ZS5nZXRTaXplKFJ1KTt0aGlzLnNldFNpemUoaS53aWR0aCxpLmhlaWdodCk7Y29uc3Qgbz1lLmdldFJlbmRlclRhcmdldCgpLGE9ZS5nZXRNUlQoKTt0aGlzLl9jYW1lcmFOZWFyLnZhbHVlPW4ubmVhcix0aGlzLl9jYW1lcmFGYXIudmFsdWU9bi5mYXI7Zm9yKGNvbnN0IGMgaW4gdGhpcy5fcHJldmlvdXNUZXh0dXJlcyl0aGlzLnRvZ2dsZVRleHR1cmUoYyk7ZS5zZXRSZW5kZXJUYXJnZXQodGhpcy5yZW5kZXJUYXJnZXQpLGUuc2V0TVJUKHRoaXMuX21ydCksZS5yZW5kZXIocyxuKSxlLnNldFJlbmRlclRhcmdldChvKSxlLnNldE1SVChhKX1zZXRTaXplKHQsZSl7dGhpcy5fd2lkdGg9dCx0aGlzLl9oZWlnaHQ9ZTtjb25zdCBzPXRoaXMuX3dpZHRoKnRoaXMuX3BpeGVsUmF0aW8sbj10aGlzLl9oZWlnaHQqdGhpcy5fcGl4ZWxSYXRpbzt0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHMsbil9c2V0UGl4ZWxSYXRpbyh0KXt0aGlzLl9waXhlbFJhdGlvPXQsdGhpcy5zZXRTaXplKHRoaXMuX3dpZHRoLHRoaXMuX2hlaWdodCl9ZGlzcG9zZSgpe3RoaXMucmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKX19dG4uQ09MT1I9ImNvbG9yIix0bi5ERVBUSD0iZGVwdGgiLHR0KCh7ZGVwdGhUZXh0dXJlOnIsc2hhZG93Q29vcmQ6dH0pPT5hcyhyLHQueHkpLmNvbXBhcmUodC56KSksdHQoKHtkZXB0aFRleHR1cmU6cixzaGFkb3dDb29yZDp0LHNoYWRvdzplfSk9Pntjb25zdCBzPShtLGcpPT5hcyhyLG0pLmNvbXBhcmUoZyksbj1wZSgibWFwU2l6ZSIsInZlYzIiLGUpLnNldEdyb3VwKGRlKSxpPXBlKCJyYWRpdXMiLCJmbG9hdCIsZSkuc2V0R3JvdXAoZGUpLG89RCgxKS5kaXYobiksYT1vLngubmVnYXRlKCkubXVsKGkpLGM9by55Lm5lZ2F0ZSgpLm11bChpKSx1PW8ueC5tdWwoaSksaD1vLnkubXVsKGkpLGw9YS5kaXYoMiksZD1jLmRpdigyKSxmPXUuZGl2KDIpLHA9aC5kaXYoMik7cmV0dXJuIGZlKHModC54eS5hZGQoRChhLGMpKSx0LnopLHModC54eS5hZGQoRCgwLGMpKSx0LnopLHModC54eS5hZGQoRCh1LGMpKSx0LnopLHModC54eS5hZGQoRChsLGQpKSx0LnopLHModC54eS5hZGQoRCgwLGQpKSx0LnopLHModC54eS5hZGQoRChmLGQpKSx0LnopLHModC54eS5hZGQoRChhLDApKSx0LnopLHModC54eS5hZGQoRChsLDApKSx0LnopLHModC54eSx0LnopLHModC54eS5hZGQoRChmLDApKSx0LnopLHModC54eS5hZGQoRCh1LDApKSx0LnopLHModC54eS5hZGQoRChsLHApKSx0LnopLHModC54eS5hZGQoRCgwLHApKSx0LnopLHModC54eS5hZGQoRChmLHApKSx0LnopLHModC54eS5hZGQoRChhLGgpKSx0LnopLHModC54eS5hZGQoRCgwLGgpKSx0LnopLHModC54eS5hZGQoRCh1LGgpKSx0LnopKS5tdWwoMS8xNyl9KSx0dCgoe2RlcHRoVGV4dHVyZTpyLHNoYWRvd0Nvb3JkOnQsc2hhZG93OmV9KT0+e2NvbnN0IHM9KGgsbCk9PmFzKHIsaCkuY29tcGFyZShsKSxuPXBlKCJtYXBTaXplIiwidmVjMiIsZSkuc2V0R3JvdXAoZGUpLGk9RCgxKS5kaXYobiksbz1pLngsYT1pLnksYz10Lnh5LHU9cmkoYy5tdWwobikuYWRkKC41KSk7cmV0dXJuIGMuc3ViQXNzaWduKHUubXVsKGkpKSxmZShzKGMsdC56KSxzKGMuYWRkKEQobywwKSksdC56KSxzKGMuYWRkKEQoMCxhKSksdC56KSxzKGMuYWRkKGkpLHQueikscmUocyhjLmFkZChEKG8ubmVnYXRlKCksMCkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLDApKSx0LnopLHUueCkscmUocyhjLmFkZChEKG8ubmVnYXRlKCksYSkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLGEpKSx0LnopLHUueCkscmUocyhjLmFkZChEKDAsYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKDAsYS5tdWwoMikpKSx0LnopLHUueSkscmUocyhjLmFkZChEKG8sYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKG8sYS5tdWwoMikpKSx0LnopLHUueSkscmUocmUocyhjLmFkZChEKG8ubmVnYXRlKCksYS5uZWdhdGUoKSkpLHQueikscyhjLmFkZChEKG8ubXVsKDIpLGEubmVnYXRlKCkpKSx0LnopLHUueCkscmUocyhjLmFkZChEKG8ubmVnYXRlKCksYS5tdWwoMikpKSx0LnopLHMoYy5hZGQoRChvLm11bCgyKSxhLm11bCgyKSkpLHQueiksdS54KSx1LnkpKS5tdWwoMS85KX0pLHR0KCh7ZGVwdGhUZXh0dXJlOnIsc2hhZG93Q29vcmQ6dH0pPT57Y29uc3QgZT1xKDEpLnRvVmFyKCkscz1hcyhyKS51dih0Lnh5KS5yZyxuPWtyKHQueixzLngpO3JldHVybiBuaShuLm5vdEVxdWFsKHEoMSkpLCgpPT57Y29uc3QgaT10Lnouc3ViKHMueCksbz1haSgwLHMueS5tdWwocy55KSk7bGV0IGE9by5kaXYoby5hZGQoaS5tdWwoaSkpKTthPVdzKCRzKGEsLjMpLmRpdiguOTUtLjMpKSxlLmFzc2lnbihXcyhhaShuLGEpKSl9KSxlfSksdHQoKHtzYW1wbGVzOnIscmFkaXVzOnQsc2l6ZTplLHNoYWRvd1Bhc3M6c30pPT57Y29uc3Qgbj1xKDApLnRvVmFyKCksaT1xKDApLnRvVmFyKCksbz1yLmxlc3NUaGFuRXF1YWwocSgxKSkuc2VsZWN0KHEoMCkscSgyKS5kaXYoci5zdWIoMSkpKSxhPXIubGVzc1RoYW5FcXVhbChxKDEpKS5zZWxlY3QocSgwKSxxKC0xKSk7T2Uoe3N0YXJ0OlJlKDApLGVuZDpSZShyKSx0eXBlOiJpbnQiLGNvbmRpdGlvbjoiPCJ9LCh7aTp1fSk9Pntjb25zdCBoPWEuYWRkKHEodSkubXVsKG8pKSxsPXMudXYoZmUoUXMueHksRCgwLGgpLm11bCh0KSkuZGl2KGUpKS54O24uYWRkQXNzaWduKGwpLGkuYWRkQXNzaWduKGwubXVsKGwpKX0pLG4uZGl2QXNzaWduKHIpLGkuZGl2QXNzaWduKHIpO2NvbnN0IGM9aWkoaS5zdWIobi5tdWwobikpKTtyZXR1cm4gRChuLGMpfSksdHQoKHtzYW1wbGVzOnIscmFkaXVzOnQsc2l6ZTplLHNoYWRvd1Bhc3M6c30pPT57Y29uc3Qgbj1xKDApLnRvVmFyKCksaT1xKDApLnRvVmFyKCksbz1yLmxlc3NUaGFuRXF1YWwocSgxKSkuc2VsZWN0KHEoMCkscSgyKS5kaXYoci5zdWIoMSkpKSxhPXIubGVzc1RoYW5FcXVhbChxKDEpKS5zZWxlY3QocSgwKSxxKC0xKSk7T2Uoe3N0YXJ0OlJlKDApLGVuZDpSZShyKSx0eXBlOiJpbnQiLGNvbmRpdGlvbjoiPCJ9LCh7aTp1fSk9Pntjb25zdCBoPWEuYWRkKHEodSkubXVsKG8pKSxsPXMudXYoZmUoUXMueHksRChoLDApLm11bCh0KSkuZGl2KGUpKTtuLmFkZEFzc2lnbihsLngpLGkuYWRkQXNzaWduKGZlKGwueS5tdWwobC55KSxsLngubXVsKGwueCkpKX0pLG4uZGl2QXNzaWduKHIpLGkuZGl2QXNzaWduKHIpO2NvbnN0IGM9aWkoaS5zdWIobi5tdWwobikpKTtyZXR1cm4gRChuLGMpfSksaygxLjY2MDUsLS4xMjQ2LC0uMDE4MiksaygtLjU4NzYsMS4xMzI5LC0uMTAwNiksaygtLjA3MjgsLS4wMDgzLDEuMTE4NyksayguNjI3NCwuMDY5MSwuMDE2NCksayguMzI5MywuOTE5NSwuMDg4KSxrKC4wNDMzLC4wMTEzLC44OTU2KTtjbGFzcyBJdSBleHRlbmRzIFV7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnNjb3BlPXR9Z2VuZXJhdGUodCl7Y29uc3R7c2NvcGU6ZX09dGhpcyx7cmVuZGVyZXI6c309dDtzLmJhY2tlbmQuaXNXZWJHTEJhY2tlbmQ9PT0hMD90LmFkZEZsb3dDb2RlKGAJLy8gJHtlfUJhcnJpZXIgCmApOnQuYWRkTGluZUZsb3dDb2RlKGAke2V9QmFycmllcigpYCx0aGlzKX19QyhJdSk7Y2xhc3Mga3QgZXh0ZW5kcyBkdHtzdGF0aWMgZ2V0IHR5cGUoKXtyZXR1cm4iQXRvbWljRnVuY3Rpb25Ob2RlIn1jb25zdHJ1Y3Rvcih0LGUscyxuPW51bGwpe3N1cGVyKCJ1aW50IiksdGhpcy5tZXRob2Q9dCx0aGlzLnBvaW50ZXJOb2RlPWUsdGhpcy52YWx1ZU5vZGU9cyx0aGlzLnN0b3JlTm9kZT1ufWdldElucHV0VHlwZSh0KXtyZXR1cm4gdGhpcy5wb2ludGVyTm9kZS5nZXROb2RlVHlwZSh0KX1nZXROb2RlVHlwZSh0KXtyZXR1cm4gdGhpcy5nZXRJbnB1dFR5cGUodCl9Z2VuZXJhdGUodCl7Y29uc3QgZT10aGlzLm1ldGhvZCxzPXRoaXMuZ2V0Tm9kZVR5cGUodCksbj10aGlzLmdldElucHV0VHlwZSh0KSxpPXRoaXMucG9pbnRlck5vZGUsbz10aGlzLnZhbHVlTm9kZSxhPVtdO2EucHVzaChgJiR7aS5idWlsZCh0LG4pfWApLGEucHVzaChvLmJ1aWxkKHQsbikpO2NvbnN0IGM9YCR7dC5nZXRNZXRob2QoZSxzKX0oICR7YS5qb2luKCIsICIpfSApYDtpZih0aGlzLnN0b3JlTm9kZSE9PW51bGwpe2NvbnN0IHU9dGhpcy5zdG9yZU5vZGUuYnVpbGQodCxuKTt0LmFkZExpbmVGbG93Q29kZShgJHt1fSA9ICR7Y31gLHRoaXMpfWVsc2UgdC5hZGRMaW5lRmxvd0NvZGUoYyx0aGlzKX19aWYoa3QuQVRPTUlDX0xPQUQ9ImF0b21pY0xvYWQiLGt0LkFUT01JQ19TVE9SRT0iYXRvbWljU3RvcmUiLGt0LkFUT01JQ19BREQ9ImF0b21pY0FkZCIsa3QuQVRPTUlDX1NVQj0iYXRvbWljU3ViIixrdC5BVE9NSUNfTUFYPSJhdG9taWNNYXgiLGt0LkFUT01JQ19NSU49ImF0b21pY01pbiIsa3QuQVRPTUlDX0FORD0iYXRvbWljQW5kIixrdC5BVE9NSUNfT1I9ImF0b21pY09yIixrdC5BVE9NSUNfWE9SPSJhdG9taWNYb3IiLEMoa3QpLHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX188InUiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoInJlZ2lzdGVyIix7ZGV0YWlsOntyZXZpc2lvbjpYZX19KSksdHlwZW9mIHdpbmRvdzwidSIpe3RyeXtBbiYmQW4udGFnTmFtZS50b1VwcGVyQ2FzZSgpPT09IlNDUklQVCImJkFuLnNyY3x8bmV3IFVSTCgiYXNzZXRzL2dlbmVyYXRlTWVzaEJWSC53b3JrZXItYjc3ODg5MzkuanMiLGRvY3VtZW50LmJhc2VVUkkpLmhyZWYsd2luZG93Ll9fVEhSRUVfX0lNUE9SVFNfX3x8KHdpbmRvdy5fX1RIUkVFX19JTVBPUlRTX189W10pLHdpbmRvdy5fX1RIUkVFX19JTVBPUlRTX18ucHVzaCh7dXJsOnNlbGYubG9jYXRpb24uaHJlZixyZXZpc2lvbjpYZX0pfWNhdGNoe313aW5kb3cuX19USFJFRV9fPyhjb25zb2xlLndhcm4oIldBUk5JTkc6IE11bHRpcGxlIGluc3RhbmNlcyBvZiBUaHJlZS5qcyBiZWluZyBpbXBvcnRlZC4gRXhpc3Rpbmc6ICIrd2luZG93Ll9fVEhSRUVfXysiLCBuZXc6ICIrWGUpLGNvbnNvbGUud2Fybih3aW5kb3cuX19USFJFRV9fSU1QT1JUU19fKSk6d2luZG93Ll9fVEhSRUVfXz1YZX1jb25zdCB1bz0wLHZ1PTEsUHU9Mixsbz0yLGdpPTEuMjUsZm89MSxtcz02KjQrNCs0LGVuPTY1NTM1LEx1PU1hdGgucG93KDIsLTI0KSx4aT1TeW1ib2woIlNLSVBfR0VORVJBVElPTiIpO2Z1bmN0aW9uIE91KHIpe3JldHVybiByLmluZGV4P3IuaW5kZXguY291bnQ6ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWZ1bmN0aW9uIERlKHIpe3JldHVybiBPdShyKS8zfWZ1bmN0aW9uIER1KHIsdD1BcnJheUJ1ZmZlcil7cmV0dXJuIHI+NjU1MzU/bmV3IFVpbnQzMkFycmF5KG5ldyB0KDQqcikpOm5ldyBVaW50MTZBcnJheShuZXcgdCgyKnIpKX1mdW5jdGlvbiBWdShyLHQpe2lmKCFyLmluZGV4KXtjb25zdCBlPXIuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCxzPXQudXNlU2hhcmVkQXJyYXlCdWZmZXI/U2hhcmVkQXJyYXlCdWZmZXI6QXJyYXlCdWZmZXIsbj1EdShlLHMpO3Iuc2V0SW5kZXgobmV3IHZ0KG4sMSkpO2ZvcihsZXQgaT0wO2k8ZTtpKyspbltpXT1pfX1mdW5jdGlvbiBwbyhyLHQpe2NvbnN0IGU9RGUocikscz10fHxyLmRyYXdSYW5nZSxuPXMuc3RhcnQvMyxpPShzLnN0YXJ0K3MuY291bnQpLzMsbz1NYXRoLm1heCgwLG4pLGE9TWF0aC5taW4oZSxpKS1vO3JldHVyblt7b2Zmc2V0Ok1hdGguZmxvb3IobyksY291bnQ6TWF0aC5mbG9vcihhKX1dfWZ1bmN0aW9uIG1vKHIsdCl7aWYoIXIuZ3JvdXBzfHwhci5ncm91cHMubGVuZ3RoKXJldHVybiBwbyhyLHQpO2NvbnN0IGU9W10scz1uZXcgU2V0LG49dHx8ci5kcmF3UmFuZ2UsaT1uLnN0YXJ0LzMsbz0obi5zdGFydCtuLmNvdW50KS8zO2Zvcihjb25zdCBjIG9mIHIuZ3JvdXBzKXtjb25zdCB1PWMuc3RhcnQvMyxoPShjLnN0YXJ0K2MuY291bnQpLzM7cy5hZGQoTWF0aC5tYXgoaSx1KSkscy5hZGQoTWF0aC5taW4obyxoKSl9Y29uc3QgYT1BcnJheS5mcm9tKHMudmFsdWVzKCkpLnNvcnQoKGMsdSk9PmMtdSk7Zm9yKGxldCBjPTA7YzxhLmxlbmd0aC0xO2MrKyl7Y29uc3QgdT1hW2NdLGg9YVtjKzFdO2UucHVzaCh7b2Zmc2V0Ok1hdGguZmxvb3IodSksY291bnQ6TWF0aC5mbG9vcihoLXUpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gVXUocix0KXtjb25zdCBlPURlKHIpLHM9bW8ocix0KS5zb3J0KChvLGEpPT5vLm9mZnNldC1hLm9mZnNldCksbj1zW3MubGVuZ3RoLTFdO24uY291bnQ9TWF0aC5taW4oZS1uLm9mZnNldCxuLmNvdW50KTtsZXQgaT0wO3JldHVybiBzLmZvckVhY2goKHtjb3VudDpvfSk9PmkrPW8pLGUhPT1pfWZ1bmN0aW9uIFRpKHIsdCxlLHMsbil7bGV0IGk9MS8wLG89MS8wLGE9MS8wLGM9LTEvMCx1PS0xLzAsaD0tMS8wLGw9MS8wLGQ9MS8wLGY9MS8wLHA9LTEvMCxtPS0xLzAsZz0tMS8wO2ZvcihsZXQgeT10KjYsVD0odCtlKSo2O3k8VDt5Kz02KXtjb25zdCB3PXJbeSswXSxNPXJbeSsxXSxOPXctTSxfPXcrTTtOPGkmJihpPU4pLF8+YyYmKGM9XyksdzxsJiYobD13KSx3PnAmJihwPXcpO2NvbnN0IFM9clt5KzJdLEU9clt5KzNdLEY9Uy1FLFI9UytFO0Y8byYmKG89RiksUj51JiYodT1SKSxTPGQmJihkPVMpLFM+bSYmKG09Uyk7Y29uc3QgST1yW3krNF0sQj1yW3krNV0sUD1JLUIsTD1JK0I7UDxhJiYoYT1QKSxMPmgmJihoPUwpLEk8ZiYmKGY9SSksST5nJiYoZz1JKX1zWzBdPWksc1sxXT1vLHNbMl09YSxzWzNdPWMsc1s0XT11LHNbNV09aCxuWzBdPWwsblsxXT1kLG5bMl09ZixuWzNdPXAsbls0XT1tLG5bNV09Z31mdW5jdGlvbiBrdShyLHQ9bnVsbCxlPW51bGwscz1udWxsKXtjb25zdCBuPXIuYXR0cmlidXRlcy5wb3NpdGlvbixpPXIuaW5kZXg/ci5pbmRleC5hcnJheTpudWxsLG89RGUociksYT1uLm5vcm1hbGl6ZWQ7bGV0IGM7dD09PW51bGw/KGM9bmV3IEZsb2F0MzJBcnJheShvKjYpLGU9MCxzPW8pOihjPXQsZT1lfHwwLHM9c3x8byk7Y29uc3QgdT1uLmFycmF5LGg9bi5vZmZzZXR8fDA7bGV0IGw9MztuLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihsPW4uZGF0YS5zdHJpZGUpO2NvbnN0IGQ9WyJnZXRYIiwiZ2V0WSIsImdldFoiXTtmb3IobGV0IGY9ZTtmPGUrcztmKyspe2NvbnN0IHA9ZiozLG09Zio2O2xldCBnPXArMCx5PXArMSxUPXArMjtpJiYoZz1pW2ddLHk9aVt5XSxUPWlbVF0pLGF8fChnPWcqbCtoLHk9eSpsK2gsVD1UKmwraCk7Zm9yKGxldCB3PTA7dzwzO3crKyl7bGV0IE0sTixfO2E/KE09bltkW3ddXShnKSxOPW5bZFt3XV0oeSksXz1uW2Rbd11dKFQpKTooTT11W2crd10sTj11W3krd10sXz11W1Qrd10pO2xldCBTPU07TjxTJiYoUz1OKSxfPFMmJihTPV8pO2xldCBFPU07Tj5FJiYoRT1OKSxfPkUmJihFPV8pO2NvbnN0IEY9KEUtUykvMixSPXcqMjtjW20rUiswXT1TK0YsY1ttK1IrMV09RisoTWF0aC5hYnMoUykrRikqTHV9fXJldHVybiBjfWZ1bmN0aW9uIFoocix0LGUpe3JldHVybiBlLm1pbi54PXRbcl0sZS5taW4ueT10W3IrMV0sZS5taW4uej10W3IrMl0sZS5tYXgueD10W3IrM10sZS5tYXgueT10W3IrNF0sZS5tYXguej10W3IrNV0sZX1mdW5jdGlvbiB5byhyKXtsZXQgdD0tMSxlPS0xLzA7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbj1yW3MrM10tcltzXTtuPmUmJihlPW4sdD1zKX1yZXR1cm4gdH1mdW5jdGlvbiBnbyhyLHQpe3Quc2V0KHIpfWZ1bmN0aW9uIHhvKHIsdCxlKXtsZXQgcyxuO2ZvcihsZXQgaT0wO2k8MztpKyspe2NvbnN0IG89aSszO3M9cltpXSxuPXRbaV0sZVtpXT1zPG4/czpuLHM9cltvXSxuPXRbb10sZVtvXT1zPm4/czpufX1mdW5jdGlvbiBzbihyLHQsZSl7Zm9yKGxldCBzPTA7czwzO3MrKyl7Y29uc3Qgbj10W3IrMipzXSxpPXRbcisyKnMrMV0sbz1uLWksYT1uK2k7bzxlW3NdJiYoZVtzXT1vKSxhPmVbcyszXSYmKGVbcyszXT1hKX19ZnVuY3Rpb24geXMocil7Y29uc3QgdD1yWzNdLXJbMF0sZT1yWzRdLXJbMV0scz1yWzVdLXJbMl07cmV0dXJuIDIqKHQqZStlKnMrcyp0KX1jb25zdCBqdD0zMixIdT0ocix0KT0+ci5jYW5kaWRhdGUtdC5jYW5kaWRhdGUsb2U9bmV3IEFycmF5KGp0KS5maWxsKCkubWFwKCgpPT4oe2NvdW50OjAsYm91bmRzOm5ldyBGbG9hdDMyQXJyYXkoNikscmlnaHRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGxlZnRDYWNoZUJvdW5kczpuZXcgRmxvYXQzMkFycmF5KDYpLGNhbmRpZGF0ZTowfSkpLG5uPW5ldyBGbG9hdDMyQXJyYXkoNik7ZnVuY3Rpb24gcXUocix0LGUscyxuLGkpe2xldCBvPS0xLGE9MDtpZihpPT09dW8pbz15byh0KSxvIT09LTEmJihhPSh0W29dK3RbbyszXSkvMik7ZWxzZSBpZihpPT09dnUpbz15byhyKSxvIT09LTEmJihhPSR1KGUscyxuLG8pKTtlbHNlIGlmKGk9PT1QdSl7Y29uc3QgYz15cyhyKTtsZXQgdT1naSpuO2NvbnN0IGg9cyo2LGw9KHMrbikqNjtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPXRbZF0sZz0odFtkKzNdLWYpL2p0O2lmKG48anQvNCl7Y29uc3QgeT1bLi4ub2VdO3kubGVuZ3RoPW47bGV0IFQ9MDtmb3IobGV0IE09aDtNPGw7TSs9NixUKyspe2NvbnN0IE49eVtUXTtOLmNhbmRpZGF0ZT1lW00rMipkXSxOLmNvdW50PTA7Y29uc3R7Ym91bmRzOl8sbGVmdENhY2hlQm91bmRzOlMscmlnaHRDYWNoZUJvdW5kczpFfT1OO2ZvcihsZXQgRj0wO0Y8MztGKyspRVtGXT0xLzAsRVtGKzNdPS0xLzAsU1tGXT0xLzAsU1tGKzNdPS0xLzAsX1tGXT0xLzAsX1tGKzNdPS0xLzA7c24oTSxlLF8pfXkuc29ydChIdSk7bGV0IHc9bjtmb3IobGV0IE09MDtNPHc7TSsrKXtjb25zdCBOPXlbTV07Zm9yKDtNKzE8dyYmeVtNKzFdLmNhbmRpZGF0ZT09PU4uY2FuZGlkYXRlOyl5LnNwbGljZShNKzEsMSksdy0tfWZvcihsZXQgTT1oO008bDtNKz02KXtjb25zdCBOPWVbTSsyKmRdO2ZvcihsZXQgXz0wO188dztfKyspe2NvbnN0IFM9eVtfXTtOPj1TLmNhbmRpZGF0ZT9zbihNLGUsUy5yaWdodENhY2hlQm91bmRzKTooc24oTSxlLFMubGVmdENhY2hlQm91bmRzKSxTLmNvdW50KyspfX1mb3IobGV0IE09MDtNPHc7TSsrKXtjb25zdCBOPXlbTV0sXz1OLmNvdW50LFM9bi1OLmNvdW50LEU9Ti5sZWZ0Q2FjaGVCb3VuZHMsRj1OLnJpZ2h0Q2FjaGVCb3VuZHM7bGV0IFI9MDtfIT09MCYmKFI9eXMoRSkvYyk7bGV0IEk9MDtTIT09MCYmKEk9eXMoRikvYyk7Y29uc3QgQj1mbytnaSooUipfK0kqUyk7Qjx1JiYobz1kLHU9QixhPU4uY2FuZGlkYXRlKX19ZWxzZXtmb3IobGV0IHc9MDt3PGp0O3crKyl7Y29uc3QgTT1vZVt3XTtNLmNvdW50PTAsTS5jYW5kaWRhdGU9ZitnK3cqZztjb25zdCBOPU0uYm91bmRzO2ZvcihsZXQgXz0wO188MztfKyspTltfXT0xLzAsTltfKzNdPS0xLzB9Zm9yKGxldCB3PWg7dzxsO3crPTYpe2xldCBfPX5+KChlW3crMipkXS1mKS9nKTtfPj1qdCYmKF89anQtMSk7Y29uc3QgUz1vZVtfXTtTLmNvdW50Kyssc24odyxlLFMuYm91bmRzKX1jb25zdCB5PW9lW2p0LTFdO2dvKHkuYm91bmRzLHkucmlnaHRDYWNoZUJvdW5kcyk7Zm9yKGxldCB3PWp0LTI7dz49MDt3LS0pe2NvbnN0IE09b2Vbd10sTj1vZVt3KzFdO3hvKE0uYm91bmRzLE4ucmlnaHRDYWNoZUJvdW5kcyxNLnJpZ2h0Q2FjaGVCb3VuZHMpfWxldCBUPTA7Zm9yKGxldCB3PTA7dzxqdC0xO3crKyl7Y29uc3QgTT1vZVt3XSxOPU0uY291bnQsXz1NLmJvdW5kcyxFPW9lW3crMV0ucmlnaHRDYWNoZUJvdW5kcztOIT09MCYmKFQ9PT0wP2dvKF8sbm4pOnhvKF8sbm4sbm4pKSxUKz1OO2xldCBGPTAsUj0wO1QhPT0wJiYoRj15cyhubikvYyk7Y29uc3QgST1uLVQ7SSE9PTAmJihSPXlzKEUpL2MpO2NvbnN0IEI9Zm8rZ2kqKEYqVCtSKkkpO0I8dSYmKG89ZCx1PUIsYT1NLmNhbmRpZGF0ZSl9fX19ZWxzZSBjb25zb2xlLndhcm4oYE1lc2hCVkg6IEludmFsaWQgYnVpbGQgc3RyYXRlZ3kgdmFsdWUgJHtpfSB1c2VkLmApO3JldHVybntheGlzOm8scG9zOmF9fWZ1bmN0aW9uICR1KHIsdCxlLHMpe2xldCBuPTA7Zm9yKGxldCBpPXQsbz10K2U7aTxvO2krKyluKz1yW2kqNitzKjJdO3JldHVybiBuL2V9Y2xhc3MgTml7Y29uc3RydWN0b3IoKXt0aGlzLmJvdW5kaW5nRGF0YT1uZXcgRmxvYXQzMkFycmF5KDYpfX1mdW5jdGlvbiBHdShyLHQsZSxzLG4saSl7bGV0IG89cyxhPXMrbi0xO2NvbnN0IGM9aS5wb3MsdT1pLmF4aXMqMjtmb3IoOzspe2Zvcig7bzw9YSYmZVtvKjYrdV08YzspbysrO2Zvcig7bzw9YSYmZVthKjYrdV0+PWM7KWEtLTtpZihvPGEpe2ZvcihsZXQgaD0wO2g8MztoKyspe2xldCBsPXRbbyozK2hdO3RbbyozK2hdPXRbYSozK2hdLHRbYSozK2hdPWx9Zm9yKGxldCBoPTA7aDw2O2grKyl7bGV0IGw9ZVtvKjYraF07ZVtvKjYraF09ZVthKjYraF0sZVthKjYraF09bH1vKyssYS0tfWVsc2UgcmV0dXJuIG99fWZ1bmN0aW9uIFd1KHIsdCxlLHMsbixpKXtsZXQgbz1zLGE9cytuLTE7Y29uc3QgYz1pLnBvcyx1PWkuYXhpcyoyO2Zvcig7Oyl7Zm9yKDtvPD1hJiZlW28qNit1XTxjOylvKys7Zm9yKDtvPD1hJiZlW2EqNit1XT49YzspYS0tO2lmKG88YSl7bGV0IGg9cltvXTtyW29dPXJbYV0sclthXT1oO2ZvcihsZXQgbD0wO2w8NjtsKyspe2xldCBkPWVbbyo2K2xdO2Vbbyo2K2xdPWVbYSo2K2xdLGVbYSo2K2xdPWR9bysrLGEtLX1lbHNlIHJldHVybiBvfX1mdW5jdGlvbiBwdChyLHQpe3JldHVybiB0W3IrMTVdPT09NjU1MzV9ZnVuY3Rpb24gVHQocix0KXtyZXR1cm4gdFtyKzZdfWZ1bmN0aW9uIFN0KHIsdCl7cmV0dXJuIHRbcisxNF19ZnVuY3Rpb24gX3Qocil7cmV0dXJuIHIrOH1mdW5jdGlvbiB6dChyLHQpe3JldHVybiB0W3IrNl19ZnVuY3Rpb24gVG8ocix0KXtyZXR1cm4gdFtyKzddfWZ1bmN0aW9uIGpsKHIpe3JldHVybiByfWxldCBObyxncyxybix3bztjb25zdCBYdT1NYXRoLnBvdygyLDMyKTtmdW5jdGlvbiB3aShyKXtyZXR1cm4iY291bnQiaW4gcj8xOjErd2koci5sZWZ0KSt3aShyLnJpZ2h0KX1mdW5jdGlvbiBZdShyLHQsZSl7cmV0dXJuIE5vPW5ldyBGbG9hdDMyQXJyYXkoZSksZ3M9bmV3IFVpbnQzMkFycmF5KGUpLHJuPW5ldyBVaW50MTZBcnJheShlKSx3bz1uZXcgVWludDhBcnJheShlKSxBaShyLHQpfWZ1bmN0aW9uIEFpKHIsdCl7Y29uc3QgZT1yLzQscz1yLzIsbj0iY291bnQiaW4gdCxpPXQuYm91bmRpbmdEYXRhO2ZvcihsZXQgbz0wO288NjtvKyspTm9bZStvXT1pW29dO2lmKG4paWYodC5idWZmZXIpe2NvbnN0IG89dC5idWZmZXI7d28uc2V0KG5ldyBVaW50OEFycmF5KG8pLHIpO2ZvcihsZXQgYT1yLGM9citvLmJ5dGVMZW5ndGg7YTxjO2ErPW1zKXtjb25zdCB1PWEvMjtwdCh1LHJuKXx8KGdzW2EvNCs2XSs9ZSl9cmV0dXJuIHIrby5ieXRlTGVuZ3RofWVsc2V7Y29uc3Qgbz10Lm9mZnNldCxhPXQuY291bnQ7cmV0dXJuIGdzW2UrNl09byxybltzKzE0XT1hLHJuW3MrMTVdPWVuLHIrbXN9ZWxzZXtjb25zdCBvPXQubGVmdCxhPXQucmlnaHQsYz10LnNwbGl0QXhpcztsZXQgdTtpZih1PUFpKHIrbXMsbyksdS80Plh1KXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogQ2Fubm90IHN0b3JlIGNoaWxkIHBvaW50ZXIgZ3JlYXRlciB0aGFuIDMyIGJpdHMuIik7cmV0dXJuIGdzW2UrNl09dS80LHU9QWkodSxhKSxnc1tlKzddPWMsdX19ZnVuY3Rpb24gWnUocix0KXtjb25zdCBlPShyLmluZGV4P3IuaW5kZXguY291bnQ6ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50KS8zLHM9ZT4yKioxNixuPXM/NDoyLGk9dD9uZXcgU2hhcmVkQXJyYXlCdWZmZXIoZSpuKTpuZXcgQXJyYXlCdWZmZXIoZSpuKSxvPXM/bmV3IFVpbnQzMkFycmF5KGkpOm5ldyBVaW50MTZBcnJheShpKTtmb3IobGV0IGE9MCxjPW8ubGVuZ3RoO2E8YzthKyspb1thXT1hO3JldHVybiBvfWZ1bmN0aW9uIEp1KHIsdCxlLHMsbil7Y29uc3R7bWF4RGVwdGg6aSx2ZXJib3NlOm8sbWF4TGVhZlRyaXM6YSxzdHJhdGVneTpjLG9uUHJvZ3Jlc3M6dSxpbmRpcmVjdDpofT1uLGw9ci5faW5kaXJlY3RCdWZmZXIsZD1yLmdlb21ldHJ5LGY9ZC5pbmRleD9kLmluZGV4LmFycmF5Om51bGwscD1oP1d1Okd1LG09RGUoZCksZz1uZXcgRmxvYXQzMkFycmF5KDYpO2xldCB5PSExO2NvbnN0IFQ9bmV3IE5pO3JldHVybiBUaSh0LGUscyxULmJvdW5kaW5nRGF0YSxnKSxNKFQsZSxzLGcpLFQ7ZnVuY3Rpb24gdyhOKXt1JiZ1KE4vbSl9ZnVuY3Rpb24gTShOLF8sUyxFPW51bGwsRj0wKXtpZigheSYmRj49aSYmKHk9ITAsbyYmKGNvbnNvbGUud2FybihgTWVzaEJWSDogTWF4IGRlcHRoIG9mICR7aX0gcmVhY2hlZCB3aGVuIGdlbmVyYXRpbmcgQlZILiBDb25zaWRlciBpbmNyZWFzaW5nIG1heERlcHRoLmApLGNvbnNvbGUud2FybihkKSkpLFM8PWF8fEY+PWkpcmV0dXJuIHcoXytTKSxOLm9mZnNldD1fLE4uY291bnQ9UyxOO2NvbnN0IFI9cXUoTi5ib3VuZGluZ0RhdGEsRSx0LF8sUyxjKTtpZihSLmF4aXM9PT0tMSlyZXR1cm4gdyhfK1MpLE4ub2Zmc2V0PV8sTi5jb3VudD1TLE47Y29uc3QgST1wKGwsZix0LF8sUyxSKTtpZihJPT09X3x8ST09PV8rUyl3KF8rUyksTi5vZmZzZXQ9XyxOLmNvdW50PVM7ZWxzZXtOLnNwbGl0QXhpcz1SLmF4aXM7Y29uc3QgQj1uZXcgTmksUD1fLEw9SS1fO04ubGVmdD1CLFRpKHQsUCxMLEIuYm91bmRpbmdEYXRhLGcpLE0oQixQLEwsZyxGKzEpO2NvbnN0IFY9bmV3IE5pLEc9SSxOdD1TLUw7Ti5yaWdodD1WLFRpKHQsRyxOdCxWLmJvdW5kaW5nRGF0YSxnKSxNKFYsRyxOdCxnLEYrMSl9cmV0dXJuIE59fWZ1bmN0aW9uIGp1KHIsdCl7Y29uc3QgZT1yLmdlb21ldHJ5O3QuaW5kaXJlY3QmJihyLl9pbmRpcmVjdEJ1ZmZlcj1adShlLHQudXNlU2hhcmVkQXJyYXlCdWZmZXIpLFV1KGUsdC5yYW5nZSkmJiF0LnZlcmJvc2UmJmNvbnNvbGUud2FybignTWVzaEJWSDogUHJvdmlkZWQgZ2VvbWV0cnkgY29udGFpbnMgZ3JvdXBzIG9yIGEgcmFuZ2UgdGhhdCBkbyBub3QgZnVsbHkgc3BhbiB0aGUgdmVydGV4IGNvbnRlbnRzIHdoaWxlIHVzaW5nIHRoZSAiaW5kaXJlY3QiIG9wdGlvbi4gQlZIIG1heSBpbmNvcnJlY3RseSByZXBvcnQgaW50ZXJzZWN0aW9ucyBvbiB1bnJlbmRlcmVkIHBvcnRpb25zIG9mIHRoZSBnZW9tZXRyeS4nKSksci5faW5kaXJlY3RCdWZmZXJ8fFZ1KGUsdCk7Y29uc3Qgcz10LnVzZVNoYXJlZEFycmF5QnVmZmVyP1NoYXJlZEFycmF5QnVmZmVyOkFycmF5QnVmZmVyLG49a3UoZSksaT10LmluZGlyZWN0P3BvKGUsdC5yYW5nZSk6bW8oZSx0LnJhbmdlKTtyLl9yb290cz1pLm1hcChvPT57Y29uc3QgYT1KdShyLG4sby5vZmZzZXQsby5jb3VudCx0KSxjPXdpKGEpLHU9bmV3IHMobXMqYyk7cmV0dXJuIFl1KDAsYSx1KSx1fSl9Y2xhc3MgUXR7Y29uc3RydWN0b3IoKXt0aGlzLm1pbj0xLzAsdGhpcy5tYXg9LTEvMH1zZXRGcm9tUG9pbnRzRmllbGQodCxlKXtsZXQgcz0xLzAsbj0tMS8wO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYz10W2ldW2VdO3M9YzxzP2M6cyxuPWM+bj9jOm59dGhpcy5taW49cyx0aGlzLm1heD1ufXNldEZyb21Qb2ludHModCxlKXtsZXQgcz0xLzAsbj0tMS8wO2ZvcihsZXQgaT0wLG89ZS5sZW5ndGg7aTxvO2krKyl7Y29uc3QgYT1lW2ldLGM9dC5kb3QoYSk7cz1jPHM/YzpzLG49Yz5uP2M6bn10aGlzLm1pbj1zLHRoaXMubWF4PW59aXNTZXBhcmF0ZWQodCl7cmV0dXJuIHRoaXMubWluPnQubWF4fHx0Lm1pbj50aGlzLm1heH19UXQucHJvdG90eXBlLnNldEZyb21Cb3g9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBBO3JldHVybiBmdW5jdGlvbihlLHMpe2NvbnN0IG49cy5taW4saT1zLm1heDtsZXQgbz0xLzAsYT0tMS8wO2ZvcihsZXQgYz0wO2M8PTE7YysrKWZvcihsZXQgdT0wO3U8PTE7dSsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKXtyLng9bi54KmMraS54KigxLWMpLHIueT1uLnkqdStpLnkqKDEtdSksci56PW4ueipoK2kueiooMS1oKTtjb25zdCBsPWUuZG90KHIpO289TWF0aC5taW4obCxvKSxhPU1hdGgubWF4KGwsYSl9dGhpcy5taW49byx0aGlzLm1heD1hfX0oKTtjb25zdCBRdT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEEsdD1uZXcgQSxlPW5ldyBBO3JldHVybiBmdW5jdGlvbihuLGksbyl7Y29uc3QgYT1uLnN0YXJ0LGM9cix1PWkuc3RhcnQsaD10O2Uuc3ViVmVjdG9ycyhhLHUpLHIuc3ViVmVjdG9ycyhuLmVuZCxuLnN0YXJ0KSx0LnN1YlZlY3RvcnMoaS5lbmQsaS5zdGFydCk7Y29uc3QgbD1lLmRvdChoKSxkPWguZG90KGMpLGY9aC5kb3QoaCkscD1lLmRvdChjKSxnPWMuZG90KGMpKmYtZCpkO2xldCB5LFQ7ZyE9PTA/eT0obCpkLXAqZikvZzp5PTAsVD0obCt5KmQpL2Ysby54PXksby55PVR9fSgpLE1pPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgSix0PW5ldyBBLGU9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKG4saSxvLGEpe1F1KG4saSxyKTtsZXQgYz1yLngsdT1yLnk7aWYoYz49MCYmYzw9MSYmdT49MCYmdTw9MSl7bi5hdChjLG8pLGkuYXQodSxhKTtyZXR1cm59ZWxzZSBpZihjPj0wJiZjPD0xKXt1PDA/aS5hdCgwLGEpOmkuYXQoMSxhKSxuLmNsb3Nlc3RQb2ludFRvUG9pbnQoYSwhMCxvKTtyZXR1cm59ZWxzZSBpZih1Pj0wJiZ1PD0xKXtjPDA/bi5hdCgwLG8pOm4uYXQoMSxvKSxpLmNsb3Nlc3RQb2ludFRvUG9pbnQobywhMCxhKTtyZXR1cm59ZWxzZXtsZXQgaDtjPDA/aD1uLnN0YXJ0Omg9bi5lbmQ7bGV0IGw7dTwwP2w9aS5zdGFydDpsPWkuZW5kO2NvbnN0IGQ9dCxmPWU7aWYobi5jbG9zZXN0UG9pbnRUb1BvaW50KGwsITAsdCksaS5jbG9zZXN0UG9pbnRUb1BvaW50KGgsITAsZSksZC5kaXN0YW5jZVRvU3F1YXJlZChsKTw9Zi5kaXN0YW5jZVRvU3F1YXJlZChoKSl7by5jb3B5KGQpLGEuY29weShsKTtyZXR1cm59ZWxzZXtvLmNvcHkoaCksYS5jb3B5KGYpO3JldHVybn19fX0oKSxLdT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEEsdD1uZXcgQSxlPW5ldyBYbixzPW5ldyBadDtyZXR1cm4gZnVuY3Rpb24oaSxvKXtjb25zdHtyYWRpdXM6YSxjZW50ZXI6Y309aSx7YTp1LGI6aCxjOmx9PW87aWYocy5zdGFydD11LHMuZW5kPWgscy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YXx8KHMuc3RhcnQ9dSxzLmVuZD1sLHMuY2xvc2VzdFBvaW50VG9Qb2ludChjLCEwLHIpLmRpc3RhbmNlVG8oYyk8PWEpfHwocy5zdGFydD1oLHMuZW5kPWwscy5jbG9zZXN0UG9pbnRUb1BvaW50KGMsITAscikuZGlzdGFuY2VUbyhjKTw9YSkpcmV0dXJuITA7Y29uc3QgbT1vLmdldFBsYW5lKGUpO2lmKE1hdGguYWJzKG0uZGlzdGFuY2VUb1BvaW50KGMpKTw9YSl7Y29uc3QgeT1tLnByb2plY3RQb2ludChjLHQpO2lmKG8uY29udGFpbnNQb2ludCh5KSlyZXR1cm4hMH1yZXR1cm4hMX19KCksdGw9MWUtMTU7ZnVuY3Rpb24gU2kocil7cmV0dXJuIE1hdGguYWJzKHIpPHRsfWNsYXNzIEx0IGV4dGVuZHMgd3R7Y29uc3RydWN0b3IoLi4udCl7c3VwZXIoLi4udCksdGhpcy5pc0V4dGVuZGVkVHJpYW5nbGU9ITAsdGhpcy5zYXRBeGVzPW5ldyBBcnJheSg0KS5maWxsKCkubWFwKCgpPT5uZXcgQSksdGhpcy5zYXRCb3VuZHM9bmV3IEFycmF5KDQpLmZpbGwoKS5tYXAoKCk9Pm5ldyBRdCksdGhpcy5wb2ludHM9W3RoaXMuYSx0aGlzLmIsdGhpcy5jXSx0aGlzLnNwaGVyZT1uZXcgY3IsdGhpcy5wbGFuZT1uZXcgWG4sdGhpcy5uZWVkc1VwZGF0ZT0hMH1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiBLdSh0LHRoaXMpfXVwZGF0ZSgpe2NvbnN0IHQ9dGhpcy5hLGU9dGhpcy5iLHM9dGhpcy5jLG49dGhpcy5wb2ludHMsaT10aGlzLnNhdEF4ZXMsbz10aGlzLnNhdEJvdW5kcyxhPWlbMF0sYz1vWzBdO3RoaXMuZ2V0Tm9ybWFsKGEpLGMuc2V0RnJvbVBvaW50cyhhLG4pO2NvbnN0IHU9aVsxXSxoPW9bMV07dS5zdWJWZWN0b3JzKHQsZSksaC5zZXRGcm9tUG9pbnRzKHUsbik7Y29uc3QgbD1pWzJdLGQ9b1syXTtsLnN1YlZlY3RvcnMoZSxzKSxkLnNldEZyb21Qb2ludHMobCxuKTtjb25zdCBmPWlbM10scD1vWzNdO2Yuc3ViVmVjdG9ycyhzLHQpLHAuc2V0RnJvbVBvaW50cyhmLG4pLHRoaXMuc3BoZXJlLnNldEZyb21Qb2ludHModGhpcy5wb2ludHMpLHRoaXMucGxhbmUuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoYSx0KSx0aGlzLm5lZWRzVXBkYXRlPSExfX1MdC5wcm90b3R5cGUuY2xvc2VzdFBvaW50VG9TZWdtZW50PWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgQSx0PW5ldyBBLGU9bmV3IFp0O3JldHVybiBmdW5jdGlvbihuLGk9bnVsbCxvPW51bGwpe2NvbnN0e3N0YXJ0OmEsZW5kOmN9PW4sdT10aGlzLnBvaW50cztsZXQgaCxsPTEvMDtmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPShkKzEpJTM7ZS5zdGFydC5jb3B5KHVbZF0pLGUuZW5kLmNvcHkodVtmXSksTWkoZSxuLHIsdCksaD1yLmRpc3RhbmNlVG9TcXVhcmVkKHQpLGg8bCYmKGw9aCxpJiZpLmNvcHkociksbyYmby5jb3B5KHQpKX1yZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGEsciksaD1hLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGg8bCYmKGw9aCxpJiZpLmNvcHkociksbyYmby5jb3B5KGEpKSx0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoYyxyKSxoPWMuZGlzdGFuY2VUb1NxdWFyZWQociksaDxsJiYobD1oLGkmJmkuY29weShyKSxvJiZvLmNvcHkoYykpLE1hdGguc3FydChsKX19KCksTHQucHJvdG90eXBlLmludGVyc2VjdHNUcmlhbmdsZT1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEx0LHQ9bmV3IEFycmF5KDMpLGU9bmV3IEFycmF5KDMpLHM9bmV3IFF0LG49bmV3IFF0LGk9bmV3IEEsbz1uZXcgQSxhPW5ldyBBLGM9bmV3IEEsdT1uZXcgQSxoPW5ldyBadCxsPW5ldyBadCxkPW5ldyBadCxmPW5ldyBBO2Z1bmN0aW9uIHAobSxnLHkpe2NvbnN0IFQ9bS5wb2ludHM7bGV0IHc9MCxNPS0xO2ZvcihsZXQgTj0wO048MztOKyspe2NvbnN0e3N0YXJ0Ol8sZW5kOlN9PWg7Xy5jb3B5KFRbTl0pLFMuY29weShUWyhOKzEpJTNdKSxoLmRlbHRhKG8pO2NvbnN0IEU9U2koZy5kaXN0YW5jZVRvUG9pbnQoXykpO2lmKFNpKGcubm9ybWFsLmRvdChvKSkmJkUpe3kuY29weShoKSx3PTI7YnJlYWt9Y29uc3QgRj1nLmludGVyc2VjdExpbmUoaCxmKTtpZighRiYmRSYmZi5jb3B5KF8pLChGfHxFKSYmIVNpKGYuZGlzdGFuY2VUbyhTKSkpe2lmKHc8PTEpKHc9PT0xP3kuc3RhcnQ6eS5lbmQpLmNvcHkoZiksRSYmKE09dyk7ZWxzZSBpZih3Pj0yKXsoTT09PTE/eS5zdGFydDp5LmVuZCkuY29weShmKSx3PTI7YnJlYWt9aWYodysrLHc9PT0yJiZNPT09LTEpYnJlYWt9fXJldHVybiB3fXJldHVybiBmdW5jdGlvbihnLHk9bnVsbCxUPSExKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLGcuaXNFeHRlbmRlZFRyaWFuZ2xlP2cubmVlZHNVcGRhdGUmJmcudXBkYXRlKCk6KHIuY29weShnKSxyLnVwZGF0ZSgpLGc9cik7Y29uc3Qgdz10aGlzLnBsYW5lLE09Zy5wbGFuZTtpZihNYXRoLmFicyh3Lm5vcm1hbC5kb3QoTS5ub3JtYWwpKT4xLTFlLTEwKXtjb25zdCBOPXRoaXMuc2F0Qm91bmRzLF89dGhpcy5zYXRBeGVzO2VbMF09Zy5hLGVbMV09Zy5iLGVbMl09Zy5jO2ZvcihsZXQgRj0wO0Y8NDtGKyspe2NvbnN0IFI9TltGXSxJPV9bRl07aWYocy5zZXRGcm9tUG9pbnRzKEksZSksUi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1jb25zdCBTPWcuc2F0Qm91bmRzLEU9Zy5zYXRBeGVzO3RbMF09dGhpcy5hLHRbMV09dGhpcy5iLHRbMl09dGhpcy5jO2ZvcihsZXQgRj0wO0Y8NDtGKyspe2NvbnN0IFI9U1tGXSxJPUVbRl07aWYocy5zZXRGcm9tUG9pbnRzKEksdCksUi5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX1mb3IobGV0IEY9MDtGPDQ7RisrKXtjb25zdCBSPV9bRl07Zm9yKGxldCBJPTA7STw0O0krKyl7Y29uc3QgQj1FW0ldO2lmKGkuY3Jvc3NWZWN0b3JzKFIsQikscy5zZXRGcm9tUG9pbnRzKGksdCksbi5zZXRGcm9tUG9pbnRzKGksZSkscy5pc1NlcGFyYXRlZChuKSlyZXR1cm4hMX19cmV0dXJuIHkmJihUfHxjb25zb2xlLndhcm4oIkV4dGVuZGVkVHJpYW5nbGUuaW50ZXJzZWN0c1RyaWFuZ2xlOiBUcmlhbmdsZXMgYXJlIGNvcGxhbmFyIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgYW4gb3V0cHV0IGVkZ2UuIFNldHRpbmcgZWRnZSB0byAwLCAwLCAwLiIpLHkuc3RhcnQuc2V0KDAsMCwwKSx5LmVuZC5zZXQoMCwwLDApKSwhMH1lbHNle2NvbnN0IE49cCh0aGlzLE0sbCk7aWYoTj09PTEmJmcuY29udGFpbnNQb2ludChsLmVuZCkpcmV0dXJuIHkmJih5LnN0YXJ0LmNvcHkobC5lbmQpLHkuZW5kLmNvcHkobC5lbmQpKSwhMDtpZihOIT09MilyZXR1cm4hMTtjb25zdCBfPXAoZyx3LGQpO2lmKF89PT0xJiZ0aGlzLmNvbnRhaW5zUG9pbnQoZC5lbmQpKXJldHVybiB5JiYoeS5zdGFydC5jb3B5KGQuZW5kKSx5LmVuZC5jb3B5KGQuZW5kKSksITA7aWYoXyE9PTIpcmV0dXJuITE7aWYobC5kZWx0YShhKSxkLmRlbHRhKGMpLGEuZG90KGMpPDApe2xldCBQPWQuc3RhcnQ7ZC5zdGFydD1kLmVuZCxkLmVuZD1QfWNvbnN0IFM9bC5zdGFydC5kb3QoYSksRT1sLmVuZC5kb3QoYSksRj1kLnN0YXJ0LmRvdChhKSxSPWQuZW5kLmRvdChhKSxJPUU8RixCPVM8UjtyZXR1cm4gUyE9PVImJkYhPT1FJiZJPT09Qj8hMTooeSYmKHUuc3ViVmVjdG9ycyhsLnN0YXJ0LGQuc3RhcnQpLHUuZG90KGEpPjA/eS5zdGFydC5jb3B5KGwuc3RhcnQpOnkuc3RhcnQuY29weShkLnN0YXJ0KSx1LnN1YlZlY3RvcnMobC5lbmQsZC5lbmQpLHUuZG90KGEpPDA/eS5lbmQuY29weShsLmVuZCk6eS5lbmQuY29weShkLmVuZCkpLCEwKX19fSgpLEx0LnByb3RvdHlwZS5kaXN0YW5jZVRvUG9pbnQ9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBBO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KGUsciksZS5kaXN0YW5jZVRvKHIpfX0oKSxMdC5wcm90b3R5cGUuZGlzdGFuY2VUb1RyaWFuZ2xlPWZ1bmN0aW9uKCl7Y29uc3Qgcj1uZXcgQSx0PW5ldyBBLGU9WyJhIiwiYiIsImMiXSxzPW5ldyBadCxuPW5ldyBadDtyZXR1cm4gZnVuY3Rpb24obyxhPW51bGwsYz1udWxsKXtjb25zdCB1PWF8fGM/czpudWxsO2lmKHRoaXMuaW50ZXJzZWN0c1RyaWFuZ2xlKG8sdSkpcmV0dXJuKGF8fGMpJiYoYSYmdS5nZXRDZW50ZXIoYSksYyYmdS5nZXRDZW50ZXIoYykpLDA7bGV0IGg9MS8wO2ZvcihsZXQgbD0wO2w8MztsKyspe2xldCBkO2NvbnN0IGY9ZVtsXSxwPW9bZl07dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KHAsciksZD1wLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGQ8aCYmKGg9ZCxhJiZhLmNvcHkociksYyYmYy5jb3B5KHApKTtjb25zdCBtPXRoaXNbZl07by5jbG9zZXN0UG9pbnRUb1BvaW50KG0sciksZD1tLmRpc3RhbmNlVG9TcXVhcmVkKHIpLGQ8aCYmKGg9ZCxhJiZhLmNvcHkobSksYyYmYy5jb3B5KHIpKX1mb3IobGV0IGw9MDtsPDM7bCsrKXtjb25zdCBkPWVbbF0sZj1lWyhsKzEpJTNdO3Muc2V0KHRoaXNbZF0sdGhpc1tmXSk7Zm9yKGxldCBwPTA7cDwzO3ArKyl7Y29uc3QgbT1lW3BdLGc9ZVsocCsxKSUzXTtuLnNldChvW21dLG9bZ10pLE1pKHMsbixyLHQpO2NvbnN0IHk9ci5kaXN0YW5jZVRvU3F1YXJlZCh0KTt5PGgmJihoPXksYSYmYS5jb3B5KHIpLGMmJmMuY29weSh0KSl9fXJldHVybiBNYXRoLnNxcnQoaCl9fSgpO2NsYXNzIGx0e2NvbnN0cnVjdG9yKHQsZSxzKXt0aGlzLmlzT3JpZW50ZWRCb3g9ITAsdGhpcy5taW49bmV3IEEsdGhpcy5tYXg9bmV3IEEsdGhpcy5tYXRyaXg9bmV3IG50LHRoaXMuaW52TWF0cml4PW5ldyBudCx0aGlzLnBvaW50cz1uZXcgQXJyYXkoOCkuZmlsbCgpLm1hcCgoKT0+bmV3IEEpLHRoaXMuc2F0QXhlcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IEEpLHRoaXMuc2F0Qm91bmRzPW5ldyBBcnJheSgzKS5maWxsKCkubWFwKCgpPT5uZXcgUXQpLHRoaXMuYWxpZ25lZFNhdEJvdW5kcz1uZXcgQXJyYXkoMykuZmlsbCgpLm1hcCgoKT0+bmV3IFF0KSx0aGlzLm5lZWRzVXBkYXRlPSExLHQmJnRoaXMubWluLmNvcHkodCksZSYmdGhpcy5tYXguY29weShlKSxzJiZ0aGlzLm1hdHJpeC5jb3B5KHMpfXNldCh0LGUscyl7dGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXMubWF0cml4LmNvcHkocyksdGhpcy5uZWVkc1VwZGF0ZT0hMH1jb3B5KHQpe3RoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubmVlZHNVcGRhdGU9ITB9fWx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCB0PXRoaXMubWF0cml4LGU9dGhpcy5taW4scz10aGlzLm1heCxuPXRoaXMucG9pbnRzO2ZvcihsZXQgdT0wO3U8PTE7dSsrKWZvcihsZXQgaD0wO2g8PTE7aCsrKWZvcihsZXQgbD0wO2w8PTE7bCsrKXtjb25zdCBkPTEqdXwyKmh8NCpsLGY9bltkXTtmLng9dT9zLng6ZS54LGYueT1oP3MueTplLnksZi56PWw/cy56OmUueixmLmFwcGx5TWF0cml4NCh0KX1jb25zdCBpPXRoaXMuc2F0Qm91bmRzLG89dGhpcy5zYXRBeGVzLGE9blswXTtmb3IobGV0IHU9MDt1PDM7dSsrKXtjb25zdCBoPW9bdV0sbD1pW3VdLGQ9MTw8dSxmPW5bZF07aC5zdWJWZWN0b3JzKGEsZiksbC5zZXRGcm9tUG9pbnRzKGgsbil9Y29uc3QgYz10aGlzLmFsaWduZWRTYXRCb3VuZHM7Y1swXS5zZXRGcm9tUG9pbnRzRmllbGQobiwieCIpLGNbMV0uc2V0RnJvbVBvaW50c0ZpZWxkKG4sInkiKSxjWzJdLnNldEZyb21Qb2ludHNGaWVsZChuLCJ6IiksdGhpcy5pbnZNYXRyaXguY29weSh0aGlzLm1hdHJpeCkuaW52ZXJ0KCksdGhpcy5uZWVkc1VwZGF0ZT0hMX19KCksbHQucHJvdG90eXBlLmludGVyc2VjdHNCb3g9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBRdDtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKTtjb25zdCBzPWUubWluLG49ZS5tYXgsaT10aGlzLnNhdEJvdW5kcyxvPXRoaXMuc2F0QXhlcyxhPXRoaXMuYWxpZ25lZFNhdEJvdW5kcztpZihyLm1pbj1zLngsci5tYXg9bi54LGFbMF0uaXNTZXBhcmF0ZWQocil8fChyLm1pbj1zLnksci5tYXg9bi55LGFbMV0uaXNTZXBhcmF0ZWQocikpfHwoci5taW49cy56LHIubWF4PW4ueixhWzJdLmlzU2VwYXJhdGVkKHIpKSlyZXR1cm4hMTtmb3IobGV0IGM9MDtjPDM7YysrKXtjb25zdCB1PW9bY10saD1pW2NdO2lmKHIuc2V0RnJvbUJveCh1LGUpLGguaXNTZXBhcmF0ZWQocikpcmV0dXJuITF9cmV0dXJuITB9fSgpLGx0LnByb3RvdHlwZS5pbnRlcnNlY3RzVHJpYW5nbGU9ZnVuY3Rpb24oKXtjb25zdCByPW5ldyBMdCx0PW5ldyBBcnJheSgzKSxlPW5ldyBRdCxzPW5ldyBRdCxuPW5ldyBBO3JldHVybiBmdW5jdGlvbihvKXt0aGlzLm5lZWRzVXBkYXRlJiZ0aGlzLnVwZGF0ZSgpLG8uaXNFeHRlbmRlZFRyaWFuZ2xlP28ubmVlZHNVcGRhdGUmJm8udXBkYXRlKCk6KHIuY29weShvKSxyLnVwZGF0ZSgpLG89cik7Y29uc3QgYT10aGlzLnNhdEJvdW5kcyxjPXRoaXMuc2F0QXhlczt0WzBdPW8uYSx0WzFdPW8uYix0WzJdPW8uYztmb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPWFbZF0scD1jW2RdO2lmKGUuc2V0RnJvbVBvaW50cyhwLHQpLGYuaXNTZXBhcmF0ZWQoZSkpcmV0dXJuITF9Y29uc3QgdT1vLnNhdEJvdW5kcyxoPW8uc2F0QXhlcyxsPXRoaXMucG9pbnRzO2ZvcihsZXQgZD0wO2Q8MztkKyspe2NvbnN0IGY9dVtkXSxwPWhbZF07aWYoZS5zZXRGcm9tUG9pbnRzKHAsbCksZi5pc1NlcGFyYXRlZChlKSlyZXR1cm4hMX1mb3IobGV0IGQ9MDtkPDM7ZCsrKXtjb25zdCBmPWNbZF07Zm9yKGxldCBwPTA7cDw0O3ArKyl7Y29uc3QgbT1oW3BdO2lmKG4uY3Jvc3NWZWN0b3JzKGYsbSksZS5zZXRGcm9tUG9pbnRzKG4sdCkscy5zZXRGcm9tUG9pbnRzKG4sbCksZS5pc1NlcGFyYXRlZChzKSlyZXR1cm4hMX19cmV0dXJuITB9fSgpLGx0LnByb3RvdHlwZS5jbG9zZXN0UG9pbnRUb1BvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubmVlZHNVcGRhdGUmJnRoaXMudXBkYXRlKCksZS5jb3B5KHQpLmFwcGx5TWF0cml4NCh0aGlzLmludk1hdHJpeCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeCksZX19KCksbHQucHJvdG90eXBlLmRpc3RhbmNlVG9Qb2ludD1mdW5jdGlvbigpe2NvbnN0IHI9bmV3IEE7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQoZSxyKSxlLmRpc3RhbmNlVG8ocil9fSgpLGx0LnByb3RvdHlwZS5kaXN0YW5jZVRvQm94PWZ1bmN0aW9uKCl7Y29uc3Qgcj1bIngiLCJ5IiwieiJdLHQ9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgWnQpLGU9bmV3IEFycmF5KDEyKS5maWxsKCkubWFwKCgpPT5uZXcgWnQpLHM9bmV3IEEsbj1uZXcgQTtyZXR1cm4gZnVuY3Rpb24obyxhPTAsYz1udWxsLHU9bnVsbCl7aWYodGhpcy5uZWVkc1VwZGF0ZSYmdGhpcy51cGRhdGUoKSx0aGlzLmludGVyc2VjdHNCb3gobykpcmV0dXJuKGN8fHUpJiYoby5nZXRDZW50ZXIobiksdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50KG4scyksby5jbG9zZXN0UG9pbnRUb1BvaW50KHMsbiksYyYmYy5jb3B5KHMpLHUmJnUuY29weShuKSksMDtjb25zdCBoPWEqYSxsPW8ubWluLGQ9by5tYXgsZj10aGlzLnBvaW50cztsZXQgcD0xLzA7Zm9yKGxldCBnPTA7Zzw4O2crKyl7Y29uc3QgeT1mW2ddO24uY29weSh5KS5jbGFtcChsLGQpO2NvbnN0IFQ9eS5kaXN0YW5jZVRvU3F1YXJlZChuKTtpZihUPHAmJihwPVQsYyYmYy5jb3B5KHkpLHUmJnUuY29weShuKSxUPGgpKXJldHVybiBNYXRoLnNxcnQoVCl9bGV0IG09MDtmb3IobGV0IGc9MDtnPDM7ZysrKWZvcihsZXQgeT0wO3k8PTE7eSsrKWZvcihsZXQgVD0wO1Q8PTE7VCsrKXtjb25zdCB3PShnKzEpJTMsTT0oZysyKSUzLE49eTw8d3xUPDxNLF89MTw8Z3x5PDx3fFQ8PE0sUz1mW05dLEU9ZltfXTt0W21dLnNldChTLEUpO2NvbnN0IFI9cltnXSxJPXJbd10sQj1yW01dLFA9ZVttXSxMPVAuc3RhcnQsVj1QLmVuZDtMW1JdPWxbUl0sTFtJXT15P2xbSV06ZFtJXSxMW0JdPVQ/bFtCXTpkW0ldLFZbUl09ZFtSXSxWW0ldPXk/bFtJXTpkW0ldLFZbQl09VD9sW0JdOmRbSV0sbSsrfWZvcihsZXQgZz0wO2c8PTE7ZysrKWZvcihsZXQgeT0wO3k8PTE7eSsrKWZvcihsZXQgVD0wO1Q8PTE7VCsrKXtuLng9Zz9kLng6bC54LG4ueT15P2QueTpsLnksbi56PVQ/ZC56Omwueix0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnQobixzKTtjb25zdCB3PW4uZGlzdGFuY2VUb1NxdWFyZWQocyk7aWYodzxwJiYocD13LGMmJmMuY29weShzKSx1JiZ1LmNvcHkobiksdzxoKSlyZXR1cm4gTWF0aC5zcXJ0KHcpfWZvcihsZXQgZz0wO2c8MTI7ZysrKXtjb25zdCB5PXRbZ107Zm9yKGxldCBUPTA7VDwxMjtUKyspe2NvbnN0IHc9ZVtUXTtNaSh5LHcscyxuKTtjb25zdCBNPXMuZGlzdGFuY2VUb1NxdWFyZWQobik7aWYoTTxwJiYocD1NLGMmJmMuY29weShzKSx1JiZ1LmNvcHkobiksTTxoKSlyZXR1cm4gTWF0aC5zcXJ0KE0pfX1yZXR1cm4gTWF0aC5zcXJ0KHApfX0oKTtjbGFzcyBfaXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9nZXROZXdQcmltaXRpdmU9dCx0aGlzLl9wcmltaXRpdmVzPVtdfWdldFByaW1pdGl2ZSgpe2NvbnN0IHQ9dGhpcy5fcHJpbWl0aXZlcztyZXR1cm4gdC5sZW5ndGg9PT0wP3RoaXMuX2dldE5ld1ByaW1pdGl2ZSgpOnQucG9wKCl9cmVsZWFzZVByaW1pdGl2ZSh0KXt0aGlzLl9wcmltaXRpdmVzLnB1c2godCl9fWNsYXNzIGVsIGV4dGVuZHMgX2l7Y29uc3RydWN0b3IoKXtzdXBlcigoKT0+bmV3IEx0KX19Y29uc3QgYnQ9bmV3IGVsO2NsYXNzIHNse2NvbnN0cnVjdG9yKCl7dGhpcy5mbG9hdDMyQXJyYXk9bnVsbCx0aGlzLnVpbnQxNkFycmF5PW51bGwsdGhpcy51aW50MzJBcnJheT1udWxsO2NvbnN0IHQ9W107bGV0IGU9bnVsbDt0aGlzLnNldEJ1ZmZlcj1zPT57ZSYmdC5wdXNoKGUpLGU9cyx0aGlzLmZsb2F0MzJBcnJheT1uZXcgRmxvYXQzMkFycmF5KHMpLHRoaXMudWludDE2QXJyYXk9bmV3IFVpbnQxNkFycmF5KHMpLHRoaXMudWludDMyQXJyYXk9bmV3IFVpbnQzMkFycmF5KHMpfSx0aGlzLmNsZWFyQnVmZmVyPSgpPT57ZT1udWxsLHRoaXMuZmxvYXQzMkFycmF5PW51bGwsdGhpcy51aW50MTZBcnJheT1udWxsLHRoaXMudWludDMyQXJyYXk9bnVsbCx0Lmxlbmd0aCE9PTAmJnRoaXMuc2V0QnVmZmVyKHQucG9wKCkpfX19Y29uc3QgWD1uZXcgc2w7bGV0IGFlLFZlO2NvbnN0IFVlPVtdLG9uPW5ldyBfaSgoKT0+bmV3IGh0KTtmdW5jdGlvbiBubChyLHQsZSxzLG4saSl7YWU9b24uZ2V0UHJpbWl0aXZlKCksVmU9b24uZ2V0UHJpbWl0aXZlKCksVWUucHVzaChhZSxWZSksWC5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IG89emkoMCxyLmdlb21ldHJ5LGUscyxuLGkpO1guY2xlYXJCdWZmZXIoKSxvbi5yZWxlYXNlUHJpbWl0aXZlKGFlKSxvbi5yZWxlYXNlUHJpbWl0aXZlKFZlKSxVZS5wb3AoKSxVZS5wb3AoKTtjb25zdCBhPVVlLmxlbmd0aDtyZXR1cm4gYT4wJiYoVmU9VWVbYS0xXSxhZT1VZVthLTJdKSxvfWZ1bmN0aW9uIHppKHIsdCxlLHMsbj1udWxsLGk9MCxvPTApe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6dX09WDtsZXQgaD1yKjI7aWYocHQoaCxjKSl7Y29uc3QgZD1UdChyLHUpLGY9U3QoaCxjKTtyZXR1cm4gWihyLGEsYWUpLHMoZCxmLCExLG8saStyLGFlKX1lbHNle2xldCBSPWZ1bmN0aW9uKEIpe2NvbnN0e3VpbnQxNkFycmF5OlAsdWludDMyQXJyYXk6TH09WDtsZXQgVj1CKjI7Zm9yKDshcHQoVixQKTspQj1fdChCKSxWPUIqMjtyZXR1cm4gVHQoQixMKX0sST1mdW5jdGlvbihCKXtjb25zdHt1aW50MTZBcnJheTpQLHVpbnQzMkFycmF5Okx9PVg7bGV0IFY9QioyO2Zvcig7IXB0KFYsUCk7KUI9enQoQixMKSxWPUIqMjtyZXR1cm4gVHQoQixMKStTdChWLFApfTtjb25zdCBkPV90KHIpLGY9enQocix1KTtsZXQgcD1kLG09ZixnLHksVCx3O2lmKG4mJihUPWFlLHc9VmUsWihwLGEsVCksWihtLGEsdyksZz1uKFQpLHk9bih3KSx5PGcpKXtwPWYsbT1kO2NvbnN0IEI9ZztnPXkseT1CLFQ9d31UfHwoVD1hZSxaKHAsYSxUKSk7Y29uc3QgTT1wdChwKjIsYyksTj1lKFQsTSxnLG8rMSxpK3ApO2xldCBfO2lmKE49PT1sbyl7Y29uc3QgQj1SKHApLEw9SShwKS1CO189cyhCLEwsITAsbysxLGkrcCxUKX1lbHNlIF89TiYmemkocCx0LGUscyxuLGksbysxKTtpZihfKXJldHVybiEwO3c9VmUsWihtLGEsdyk7Y29uc3QgUz1wdChtKjIsYyksRT1lKHcsUyx5LG8rMSxpK20pO2xldCBGO2lmKEU9PT1sbyl7Y29uc3QgQj1SKG0pLEw9SShtKS1CO0Y9cyhCLEwsITAsbysxLGkrbSx3KX1lbHNlIEY9RSYmemkobSx0LGUscyxuLGksbysxKTtyZXR1cm4hIUZ9fWNvbnN0IHhzPW5ldyBBLGJpPW5ldyBBO2Z1bmN0aW9uIGlsKHIsdCxlPXt9LHM9MCxuPTEvMCl7Y29uc3QgaT1zKnMsbz1uKm47bGV0IGE9MS8wLGM9bnVsbDtpZihyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpoPT4oeHMuY29weSh0KS5jbGFtcChoLm1pbixoLm1heCkseHMuZGlzdGFuY2VUb1NxdWFyZWQodCkpLGludGVyc2VjdHNCb3VuZHM6KGgsbCxkKT0+ZDxhJiZkPG8saW50ZXJzZWN0c1RyaWFuZ2xlOihoLGwpPT57aC5jbG9zZXN0UG9pbnRUb1BvaW50KHQseHMpO2NvbnN0IGQ9dC5kaXN0YW5jZVRvU3F1YXJlZCh4cyk7cmV0dXJuIGQ8YSYmKGJpLmNvcHkoeHMpLGE9ZCxjPWwpLGQ8aX19KSxhPT09MS8wKXJldHVybiBudWxsO2NvbnN0IHU9TWF0aC5zcXJ0KGEpO3JldHVybiBlLnBvaW50P2UucG9pbnQuY29weShiaSk6ZS5wb2ludD1iaS5jbG9uZSgpLGUuZGlzdGFuY2U9dSxlLmZhY2VJbmRleD1jLGV9Y29uc3Qgcmw9cGFyc2VJbnQoWGUpPj0xNjksbWU9bmV3IEEseWU9bmV3IEEsZ2U9bmV3IEEsYW49bmV3IEosY249bmV3IEosaG49bmV3IEosQW89bmV3IEEsTW89bmV3IEEsU289bmV3IEEsVHM9bmV3IEE7ZnVuY3Rpb24gb2wocix0LGUscyxuLGksbyxhKXtsZXQgYztpZihpPT09VWk/Yz1yLmludGVyc2VjdFRyaWFuZ2xlKHMsZSx0LCEwLG4pOmM9ci5pbnRlcnNlY3RUcmlhbmdsZSh0LGUscyxpIT09RW8sbiksYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgdT1yLm9yaWdpbi5kaXN0YW5jZVRvKG4pO3JldHVybiB1PG98fHU+YT9udWxsOntkaXN0YW5jZTp1LHBvaW50Om4uY2xvbmUoKX19ZnVuY3Rpb24gYWwocix0LGUscyxuLGksbyxhLGMsdSxoKXttZS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSkseWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LG8pLGdlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxhKTtjb25zdCBsPW9sKHIsbWUseWUsZ2UsVHMsYyx1LGgpO2lmKGwpe2NvbnN0IGQ9bmV3IEE7d3QuZ2V0QmFyeWNvb3JkKFRzLG1lLHllLGdlLGQpLHMmJihhbi5mcm9tQnVmZmVyQXR0cmlidXRlKHMsaSksY24uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLG8pLGhuLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxhKSxsLnV2PXd0LmdldEludGVycG9sYXRpb24oVHMsbWUseWUsZ2UsYW4sY24saG4sbmV3IEopKSxuJiYoYW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLGkpLGNuLmZyb21CdWZmZXJBdHRyaWJ1dGUobixvKSxobi5mcm9tQnVmZmVyQXR0cmlidXRlKG4sYSksbC51djE9d3QuZ2V0SW50ZXJwb2xhdGlvbihUcyxtZSx5ZSxnZSxhbixjbixobixuZXcgSikpLGUmJihBby5mcm9tQnVmZmVyQXR0cmlidXRlKGUsaSksTW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLG8pLFNvLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxhKSxsLm5vcm1hbD13dC5nZXRJbnRlcnBvbGF0aW9uKFRzLG1lLHllLGdlLEFvLE1vLFNvLG5ldyBBKSxsLm5vcm1hbC5kb3Qoci5kaXJlY3Rpb24pPjAmJmwubm9ybWFsLm11bHRpcGx5U2NhbGFyKC0xKSk7Y29uc3QgZj17YTppLGI6byxjOmEsbm9ybWFsOm5ldyBBLG1hdGVyaWFsSW5kZXg6MH07d3QuZ2V0Tm9ybWFsKG1lLHllLGdlLGYubm9ybWFsKSxsLmZhY2U9ZixsLmZhY2VJbmRleD1pLHJsJiYobC5iYXJ5Y29vcmQ9ZCl9cmV0dXJuIGx9ZnVuY3Rpb24gdW4ocix0LGUscyxuLGksbyl7Y29uc3QgYT1zKjM7bGV0IGM9YSswLHU9YSsxLGg9YSsyO2NvbnN0IGw9ci5pbmRleDtyLmluZGV4JiYoYz1sLmdldFgoYyksdT1sLmdldFgodSksaD1sLmdldFgoaCkpO2NvbnN0e3Bvc2l0aW9uOmQsbm9ybWFsOmYsdXY6cCx1djE6bX09ci5hdHRyaWJ1dGVzLGc9YWwoZSxkLGYscCxtLGMsdSxoLHQsaSxvKTtyZXR1cm4gZz8oZy5mYWNlSW5kZXg9cyxuJiZuLnB1c2goZyksZyk6bnVsbH1mdW5jdGlvbiBzdChyLHQsZSxzKXtjb25zdCBuPXIuYSxpPXIuYixvPXIuYztsZXQgYT10LGM9dCsxLHU9dCsyO2UmJihhPWUuZ2V0WChhKSxjPWUuZ2V0WChjKSx1PWUuZ2V0WCh1KSksbi54PXMuZ2V0WChhKSxuLnk9cy5nZXRZKGEpLG4uej1zLmdldFooYSksaS54PXMuZ2V0WChjKSxpLnk9cy5nZXRZKGMpLGkuej1zLmdldFooYyksby54PXMuZ2V0WCh1KSxvLnk9cy5nZXRZKHUpLG8uej1zLmdldFoodSl9ZnVuY3Rpb24gY2wocix0LGUscyxuLGksbyxhKXtjb25zdHtnZW9tZXRyeTpjLF9pbmRpcmVjdEJ1ZmZlcjp1fT1yO2ZvcihsZXQgaD1zLGw9cytuO2g8bDtoKyspdW4oYyx0LGUsaCxpLG8sYSl9ZnVuY3Rpb24gaGwocix0LGUscyxuLGksbyl7Y29uc3R7Z2VvbWV0cnk6YSxfaW5kaXJlY3RCdWZmZXI6Y309cjtsZXQgdT0xLzAsaD1udWxsO2ZvcihsZXQgbD1zLGQ9cytuO2w8ZDtsKyspe2xldCBmO2Y9dW4oYSx0LGUsbCxudWxsLGksbyksZiYmZi5kaXN0YW5jZTx1JiYoaD1mLHU9Zi5kaXN0YW5jZSl9cmV0dXJuIGh9ZnVuY3Rpb24gdWwocix0LGUscyxuLGksbyl7Y29uc3R7Z2VvbWV0cnk6YX09ZSx7aW5kZXg6Y309YSx1PWEuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IGg9cixsPXQrcjtoPGw7aCsrKXtsZXQgZDtpZihkPWgsc3QobyxkKjMsYyx1KSxvLm5lZWRzVXBkYXRlPSEwLHMobyxkLG4saSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gbGwocix0PW51bGwpe3QmJkFycmF5LmlzQXJyYXkodCkmJih0PW5ldyBTZXQodCkpO2NvbnN0IGU9ci5nZW9tZXRyeSxzPWUuaW5kZXg/ZS5pbmRleC5hcnJheTpudWxsLG49ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBpLG8sYSxjLHU9MDtjb25zdCBoPXIuX3Jvb3RzO2ZvcihsZXQgZD0wLGY9aC5sZW5ndGg7ZDxmO2QrKylpPWhbZF0sbz1uZXcgVWludDMyQXJyYXkoaSksYT1uZXcgVWludDE2QXJyYXkoaSksYz1uZXcgRmxvYXQzMkFycmF5KGkpLGwoMCx1KSx1Kz1pLmJ5dGVMZW5ndGg7ZnVuY3Rpb24gbChkLGYscD0hMSl7Y29uc3QgbT1kKjI7aWYoYVttKzE1XT09PWVuKXtjb25zdCB5PW9bZCs2XSxUPWFbbSsxNF07bGV0IHc9MS8wLE09MS8wLE49MS8wLF89LTEvMCxTPS0xLzAsRT0tMS8wO2ZvcihsZXQgRj0zKnksUj0zKih5K1QpO0Y8UjtGKyspe2xldCBJPXNbRl07Y29uc3QgQj1uLmdldFgoSSksUD1uLmdldFkoSSksTD1uLmdldFooSSk7Qjx3JiYodz1CKSxCPl8mJihfPUIpLFA8TSYmKE09UCksUD5TJiYoUz1QKSxMPE4mJihOPUwpLEw+RSYmKEU9TCl9cmV0dXJuIGNbZCswXSE9PXd8fGNbZCsxXSE9PU18fGNbZCsyXSE9PU58fGNbZCszXSE9PV98fGNbZCs0XSE9PVN8fGNbZCs1XSE9PUU/KGNbZCswXT13LGNbZCsxXT1NLGNbZCsyXT1OLGNbZCszXT1fLGNbZCs0XT1TLGNbZCs1XT1FLCEwKTohMX1lbHNle2NvbnN0IHk9ZCs4LFQ9b1tkKzZdLHc9eStmLE09VCtmO2xldCBOPXAsXz0hMSxTPSExO3Q/Tnx8KF89dC5oYXModyksUz10LmhhcyhNKSxOPSFfJiYhUyk6KF89ITAsUz0hMCk7Y29uc3QgRT1OfHxfLEY9Tnx8UztsZXQgUj0hMTtFJiYoUj1sKHksZixOKSk7bGV0IEk9ITE7RiYmKEk9bChULGYsTikpO2NvbnN0IEI9Unx8STtpZihCKWZvcihsZXQgUD0wO1A8MztQKyspe2NvbnN0IEw9eStQLFY9VCtQLEc9Y1tMXSxOdD1jW0wrM10sSHQ9Y1tWXSxxdD1jW1YrM107Y1tkK1BdPUc8SHQ/RzpIdCxjW2QrUCszXT1OdD5xdD9OdDpxdH1yZXR1cm4gQn19fWZ1bmN0aW9uIGNlKHIsdCxlLHMsbil7bGV0IGksbyxhLGMsdSxoO2NvbnN0IGw9MS9lLmRpcmVjdGlvbi54LGQ9MS9lLmRpcmVjdGlvbi55LGY9MS9lLmRpcmVjdGlvbi56LHA9ZS5vcmlnaW4ueCxtPWUub3JpZ2luLnksZz1lLm9yaWdpbi56O2xldCB5PXRbcl0sVD10W3IrM10sdz10W3IrMV0sTT10W3IrMysxXSxOPXRbcisyXSxfPXRbciszKzJdO3JldHVybiBsPj0wPyhpPSh5LXApKmwsbz0oVC1wKSpsKTooaT0oVC1wKSpsLG89KHktcCkqbCksZD49MD8oYT0ody1tKSpkLGM9KE0tbSkqZCk6KGE9KE0tbSkqZCxjPSh3LW0pKmQpLGk+Y3x8YT5vfHwoKGE+aXx8aXNOYU4oaSkpJiYoaT1hKSwoYzxvfHxpc05hTihvKSkmJihvPWMpLGY+PTA/KHU9KE4tZykqZixoPShfLWcpKmYpOih1PShfLWcpKmYsaD0oTi1nKSpmKSxpPmh8fHU+byk/ITE6KCh1Pml8fGkhPT1pKSYmKGk9dSksKGg8b3x8byE9PW8pJiYobz1oKSxpPD1uJiZvPj1zKX1mdW5jdGlvbiBkbChyLHQsZSxzLG4saSxvLGEpe2NvbnN0e2dlb21ldHJ5OmMsX2luZGlyZWN0QnVmZmVyOnV9PXI7Zm9yKGxldCBoPXMsbD1zK247aDxsO2grKyl7bGV0IGQ9dT91W2hdOmg7dW4oYyx0LGUsZCxpLG8sYSl9fWZ1bmN0aW9uIGZsKHIsdCxlLHMsbixpLG8pe2NvbnN0e2dlb21ldHJ5OmEsX2luZGlyZWN0QnVmZmVyOmN9PXI7bGV0IHU9MS8wLGg9bnVsbDtmb3IobGV0IGw9cyxkPXMrbjtsPGQ7bCsrKXtsZXQgZjtmPXVuKGEsdCxlLGM/Y1tsXTpsLG51bGwsaSxvKSxmJiZmLmRpc3RhbmNlPHUmJihoPWYsdT1mLmRpc3RhbmNlKX1yZXR1cm4gaH1mdW5jdGlvbiBwbChyLHQsZSxzLG4saSxvKXtjb25zdHtnZW9tZXRyeTphfT1lLHtpbmRleDpjfT1hLHU9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaD1yLGw9dCtyO2g8bDtoKyspe2xldCBkO2lmKGQ9ZS5yZXNvbHZlVHJpYW5nbGVJbmRleChoKSxzdChvLGQqMyxjLHUpLG8ubmVlZHNVcGRhdGU9ITAscyhvLGQsbixpKSlyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBtbChyLHQsZSxzLG4saSxvKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSksRWkoMCxyLGUscyxuLGksbyksWC5jbGVhckJ1ZmZlcigpfWZ1bmN0aW9uIEVpKHIsdCxlLHMsbixpLG8pe2NvbnN0e2Zsb2F0MzJBcnJheTphLHVpbnQxNkFycmF5OmMsdWludDMyQXJyYXk6dX09WCxoPXIqMjtpZihwdChoLGMpKXtjb25zdCBkPVR0KHIsdSksZj1TdChoLGMpO2NsKHQsZSxzLGQsZixuLGksbyl9ZWxzZXtjb25zdCBkPV90KHIpO2NlKGQsYSxzLGksbykmJkVpKGQsdCxlLHMsbixpLG8pO2NvbnN0IGY9enQocix1KTtjZShmLGEscyxpLG8pJiZFaShmLHQsZSxzLG4saSxvKX19Y29uc3QgeWw9WyJ4IiwieSIsInoiXTtmdW5jdGlvbiBnbChyLHQsZSxzLG4saSl7WC5zZXRCdWZmZXIoci5fcm9vdHNbdF0pO2NvbnN0IG89Q2koMCxyLGUscyxuLGkpO3JldHVybiBYLmNsZWFyQnVmZmVyKCksb31mdW5jdGlvbiBDaShyLHQsZSxzLG4saSl7Y29uc3R7ZmxvYXQzMkFycmF5Om8sdWludDE2QXJyYXk6YSx1aW50MzJBcnJheTpjfT1YO2xldCB1PXIqMjtpZihwdCh1LGEpKXtjb25zdCBsPVR0KHIsYyksZD1TdCh1LGEpO3JldHVybiBobCh0LGUscyxsLGQsbixpKX1lbHNle2NvbnN0IGw9VG8ocixjKSxkPXlsW2xdLHA9cy5kaXJlY3Rpb25bZF0+PTA7bGV0IG0sZztwPyhtPV90KHIpLGc9enQocixjKSk6KG09enQocixjKSxnPV90KHIpKTtjb25zdCBUPWNlKG0sbyxzLG4saSk/Q2kobSx0LGUscyxuLGkpOm51bGw7aWYoVCl7Y29uc3QgTj1ULnBvaW50W2RdO2lmKHA/Tjw9b1tnK2xdOk4+PW9bZytsKzNdKXJldHVybiBUfWNvbnN0IE09Y2UoZyxvLHMsbixpKT9DaShnLHQsZSxzLG4saSk6bnVsbDtyZXR1cm4gVCYmTT9ULmRpc3RhbmNlPD1NLmRpc3RhbmNlP1Q6TTpUfHxNfHxudWxsfX1jb25zdCBsbj1uZXcgaHQsa2U9bmV3IEx0LEhlPW5ldyBMdCxOcz1uZXcgbnQsX289bmV3IGx0LGRuPW5ldyBsdDtmdW5jdGlvbiB4bChyLHQsZSxzKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbj1GaSgwLHIsZSxzKTtyZXR1cm4gWC5jbGVhckJ1ZmZlcigpLG59ZnVuY3Rpb24gRmkocix0LGUscyxuPW51bGwpe2NvbnN0e2Zsb2F0MzJBcnJheTppLHVpbnQxNkFycmF5Om8sdWludDMyQXJyYXk6YX09WDtsZXQgYz1yKjI7aWYobj09PW51bGwmJihlLmJvdW5kaW5nQm94fHxlLmNvbXB1dGVCb3VuZGluZ0JveCgpLF9vLnNldChlLmJvdW5kaW5nQm94Lm1pbixlLmJvdW5kaW5nQm94Lm1heCxzKSxuPV9vKSxwdChjLG8pKXtjb25zdCBoPXQuZ2VvbWV0cnksbD1oLmluZGV4LGQ9aC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGY9ZS5pbmRleCxwPWUuYXR0cmlidXRlcy5wb3NpdGlvbixtPVR0KHIsYSksZz1TdChjLG8pO2lmKE5zLmNvcHkocykuaW52ZXJ0KCksZS5ib3VuZHNUcmVlKXJldHVybiBaKHIsaSxkbiksZG4ubWF0cml4LmNvcHkoTnMpLGRuLm5lZWRzVXBkYXRlPSEwLGUuYm91bmRzVHJlZS5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6VD0+ZG4uaW50ZXJzZWN0c0JveChUKSxpbnRlcnNlY3RzVHJpYW5nbGU6VD0+e1QuYS5hcHBseU1hdHJpeDQocyksVC5iLmFwcGx5TWF0cml4NChzKSxULmMuYXBwbHlNYXRyaXg0KHMpLFQubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCB3PW0qMyxNPShnK20pKjM7dzxNO3crPTMpaWYoc3QoSGUsdyxsLGQpLEhlLm5lZWRzVXBkYXRlPSEwLFQuaW50ZXJzZWN0c1RyaWFuZ2xlKEhlKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IHk9bSozLFQ9KGcrbSkqMzt5PFQ7eSs9Myl7c3Qoa2UseSxsLGQpLGtlLmEuYXBwbHlNYXRyaXg0KE5zKSxrZS5iLmFwcGx5TWF0cml4NChOcyksa2UuYy5hcHBseU1hdHJpeDQoTnMpLGtlLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgdz0wLE09Zi5jb3VudDt3PE07dys9MylpZihzdChIZSx3LGYscCksSGUubmVlZHNVcGRhdGU9ITAsa2UuaW50ZXJzZWN0c1RyaWFuZ2xlKEhlKSlyZXR1cm4hMH19ZWxzZXtjb25zdCBoPXIrOCxsPWFbcis2XTtyZXR1cm4gWihoLGksbG4pLCEhKG4uaW50ZXJzZWN0c0JveChsbikmJkZpKGgsdCxlLHMsbil8fChaKGwsaSxsbiksbi5pbnRlcnNlY3RzQm94KGxuKSYmRmkobCx0LGUscyxuKSkpfX1jb25zdCBmbj1uZXcgbnQsUmk9bmV3IGx0LHdzPW5ldyBsdCxUbD1uZXcgQSxObD1uZXcgQSx3bD1uZXcgQSxBbD1uZXcgQTtmdW5jdGlvbiBNbChyLHQsZSxzPXt9LG49e30saT0wLG89MS8wKXt0LmJvdW5kaW5nQm94fHx0LmNvbXB1dGVCb3VuZGluZ0JveCgpLFJpLnNldCh0LmJvdW5kaW5nQm94Lm1pbix0LmJvdW5kaW5nQm94Lm1heCxlKSxSaS5uZWVkc1VwZGF0ZT0hMDtjb25zdCBhPXIuZ2VvbWV0cnksYz1hLmF0dHJpYnV0ZXMucG9zaXRpb24sdT1hLmluZGV4LGg9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9dC5pbmRleCxkPWJ0LmdldFByaW1pdGl2ZSgpLGY9YnQuZ2V0UHJpbWl0aXZlKCk7bGV0IHA9VGwsbT1ObCxnPW51bGwseT1udWxsO24mJihnPXdsLHk9QWwpO2xldCBUPTEvMCx3PW51bGwsTT1udWxsO3JldHVybiBmbi5jb3B5KGUpLmludmVydCgpLHdzLm1hdHJpeC5jb3B5KGZuKSxyLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpOPT5SaS5kaXN0YW5jZVRvQm94KE4pLGludGVyc2VjdHNCb3VuZHM6KE4sXyxTKT0+UzxUJiZTPG8/KF8mJih3cy5taW4uY29weShOLm1pbiksd3MubWF4LmNvcHkoTi5tYXgpLHdzLm5lZWRzVXBkYXRlPSEwKSwhMCk6ITEsaW50ZXJzZWN0c1JhbmdlOihOLF8pPT57aWYodC5ib3VuZHNUcmVlKXJldHVybiB0LmJvdW5kc1RyZWUuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOkU9PndzLmRpc3RhbmNlVG9Cb3goRSksaW50ZXJzZWN0c0JvdW5kczooRSxGLFIpPT5SPFQmJlI8byxpbnRlcnNlY3RzUmFuZ2U6KEUsRik9Pntmb3IobGV0IFI9RSxJPUUrRjtSPEk7UisrKXtzdChmLDMqUixsLGgpLGYuYS5hcHBseU1hdHJpeDQoZSksZi5iLmFwcGx5TWF0cml4NChlKSxmLmMuYXBwbHlNYXRyaXg0KGUpLGYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBCPU4sUD1OK187QjxQO0IrKyl7c3QoZCwzKkIsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEw9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEw8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1MLHc9QixNPVIpLEw8aSlyZXR1cm4hMH19fX0pO3tjb25zdCBTPURlKHQpO2ZvcihsZXQgRT0wLEY9UztFPEY7RSsrKXtzdChmLDMqRSxsLGgpLGYuYS5hcHBseU1hdHJpeDQoZSksZi5iLmFwcGx5TWF0cml4NChlKSxmLmMuYXBwbHlNYXRyaXg0KGUpLGYubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBSPU4sST1OK187UjxJO1IrKyl7c3QoZCwzKlIsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEI9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEI8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1CLHc9UixNPUUpLEI8aSlyZXR1cm4hMH19fX19KSxidC5yZWxlYXNlUHJpbWl0aXZlKGQpLGJ0LnJlbGVhc2VQcmltaXRpdmUoZiksVD09PTEvMD9udWxsOihzLnBvaW50P3MucG9pbnQuY29weShtKTpzLnBvaW50PW0uY2xvbmUoKSxzLmRpc3RhbmNlPVQscy5mYWNlSW5kZXg9dyxuJiYobi5wb2ludD9uLnBvaW50LmNvcHkoeSk6bi5wb2ludD15LmNsb25lKCksbi5wb2ludC5hcHBseU1hdHJpeDQoZm4pLG0uYXBwbHlNYXRyaXg0KGZuKSxuLmRpc3RhbmNlPW0uc3ViKG4ucG9pbnQpLmxlbmd0aCgpLG4uZmFjZUluZGV4PU0pLHMpfWZ1bmN0aW9uIFNsKHIsdD1udWxsKXt0JiZBcnJheS5pc0FycmF5KHQpJiYodD1uZXcgU2V0KHQpKTtjb25zdCBlPXIuZ2VvbWV0cnkscz1lLmluZGV4P2UuaW5kZXguYXJyYXk6bnVsbCxuPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgaSxvLGEsYyx1PTA7Y29uc3QgaD1yLl9yb290cztmb3IobGV0IGQ9MCxmPWgubGVuZ3RoO2Q8ZjtkKyspaT1oW2RdLG89bmV3IFVpbnQzMkFycmF5KGkpLGE9bmV3IFVpbnQxNkFycmF5KGkpLGM9bmV3IEZsb2F0MzJBcnJheShpKSxsKDAsdSksdSs9aS5ieXRlTGVuZ3RoO2Z1bmN0aW9uIGwoZCxmLHA9ITEpe2NvbnN0IG09ZCoyO2lmKGFbbSsxNV09PT1lbil7Y29uc3QgeT1vW2QrNl0sVD1hW20rMTRdO2xldCB3PTEvMCxNPTEvMCxOPTEvMCxfPS0xLzAsUz0tMS8wLEU9LTEvMDtmb3IobGV0IEY9eSxSPXkrVDtGPFI7RisrKXtjb25zdCBJPTMqci5yZXNvbHZlVHJpYW5nbGVJbmRleChGKTtmb3IobGV0IEI9MDtCPDM7QisrKXtsZXQgUD1JK0I7UD1zP3NbUF06UDtjb25zdCBMPW4uZ2V0WChQKSxWPW4uZ2V0WShQKSxHPW4uZ2V0WihQKTtMPHcmJih3PUwpLEw+XyYmKF89TCksVjxNJiYoTT1WKSxWPlMmJihTPVYpLEc8TiYmKE49RyksRz5FJiYoRT1HKX19cmV0dXJuIGNbZCswXSE9PXd8fGNbZCsxXSE9PU18fGNbZCsyXSE9PU58fGNbZCszXSE9PV98fGNbZCs0XSE9PVN8fGNbZCs1XSE9PUU/KGNbZCswXT13LGNbZCsxXT1NLGNbZCsyXT1OLGNbZCszXT1fLGNbZCs0XT1TLGNbZCs1XT1FLCEwKTohMX1lbHNle2NvbnN0IHk9ZCs4LFQ9b1tkKzZdLHc9eStmLE09VCtmO2xldCBOPXAsXz0hMSxTPSExO3Q/Tnx8KF89dC5oYXModyksUz10LmhhcyhNKSxOPSFfJiYhUyk6KF89ITAsUz0hMCk7Y29uc3QgRT1OfHxfLEY9Tnx8UztsZXQgUj0hMTtFJiYoUj1sKHksZixOKSk7bGV0IEk9ITE7RiYmKEk9bChULGYsTikpO2NvbnN0IEI9Unx8STtpZihCKWZvcihsZXQgUD0wO1A8MztQKyspe2NvbnN0IEw9eStQLFY9VCtQLEc9Y1tMXSxOdD1jW0wrM10sSHQ9Y1tWXSxxdD1jW1YrM107Y1tkK1BdPUc8SHQ/RzpIdCxjW2QrUCszXT1OdD5xdD9OdDpxdH1yZXR1cm4gQn19fWZ1bmN0aW9uIF9sKHIsdCxlLHMsbixpLG8pe1guc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKSxCaSgwLHIsZSxzLG4saSxvKSxYLmNsZWFyQnVmZmVyKCl9ZnVuY3Rpb24gQmkocix0LGUscyxuLGksbyl7Y29uc3R7ZmxvYXQzMkFycmF5OmEsdWludDE2QXJyYXk6Yyx1aW50MzJBcnJheTp1fT1YLGg9cioyO2lmKHB0KGgsYykpe2NvbnN0IGQ9VHQocix1KSxmPVN0KGgsYyk7ZGwodCxlLHMsZCxmLG4saSxvKX1lbHNle2NvbnN0IGQ9X3Qocik7Y2UoZCxhLHMsaSxvKSYmQmkoZCx0LGUscyxuLGksbyk7Y29uc3QgZj16dChyLHUpO2NlKGYsYSxzLGksbykmJkJpKGYsdCxlLHMsbixpLG8pfX1jb25zdCB6bD1bIngiLCJ5IiwieiJdO2Z1bmN0aW9uIGJsKHIsdCxlLHMsbixpKXtYLnNldEJ1ZmZlcihyLl9yb290c1t0XSk7Y29uc3Qgbz1JaSgwLHIsZSxzLG4saSk7cmV0dXJuIFguY2xlYXJCdWZmZXIoKSxvfWZ1bmN0aW9uIElpKHIsdCxlLHMsbixpKXtjb25zdHtmbG9hdDMyQXJyYXk6byx1aW50MTZBcnJheTphLHVpbnQzMkFycmF5OmN9PVg7bGV0IHU9cioyO2lmKHB0KHUsYSkpe2NvbnN0IGw9VHQocixjKSxkPVN0KHUsYSk7cmV0dXJuIGZsKHQsZSxzLGwsZCxuLGkpfWVsc2V7Y29uc3QgbD1UbyhyLGMpLGQ9emxbbF0scD1zLmRpcmVjdGlvbltkXT49MDtsZXQgbSxnO3A/KG09X3QociksZz16dChyLGMpKToobT16dChyLGMpLGc9X3QocikpO2NvbnN0IFQ9Y2UobSxvLHMsbixpKT9JaShtLHQsZSxzLG4saSk6bnVsbDtpZihUKXtjb25zdCBOPVQucG9pbnRbZF07aWYocD9OPD1vW2crbF06Tj49b1tnK2wrM10pcmV0dXJuIFR9Y29uc3QgTT1jZShnLG8scyxuLGkpP0lpKGcsdCxlLHMsbixpKTpudWxsO3JldHVybiBUJiZNP1QuZGlzdGFuY2U8PU0uZGlzdGFuY2U/VDpNOlR8fE18fG51bGx9fWNvbnN0IHBuPW5ldyBodCxxZT1uZXcgTHQsJGU9bmV3IEx0LEFzPW5ldyBudCx6bz1uZXcgbHQsbW49bmV3IGx0O2Z1bmN0aW9uIEVsKHIsdCxlLHMpe1guc2V0QnVmZmVyKHIuX3Jvb3RzW3RdKTtjb25zdCBuPXZpKDAscixlLHMpO3JldHVybiBYLmNsZWFyQnVmZmVyKCksbn1mdW5jdGlvbiB2aShyLHQsZSxzLG49bnVsbCl7Y29uc3R7ZmxvYXQzMkFycmF5OmksdWludDE2QXJyYXk6byx1aW50MzJBcnJheTphfT1YO2xldCBjPXIqMjtpZihuPT09bnVsbCYmKGUuYm91bmRpbmdCb3h8fGUuY29tcHV0ZUJvdW5kaW5nQm94KCksem8uc2V0KGUuYm91bmRpbmdCb3gubWluLGUuYm91bmRpbmdCb3gubWF4LHMpLG49em8pLHB0KGMsbykpe2NvbnN0IGg9dC5nZW9tZXRyeSxsPWguaW5kZXgsZD1oLmF0dHJpYnV0ZXMucG9zaXRpb24sZj1lLmluZGV4LHA9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLG09VHQocixhKSxnPVN0KGMsbyk7aWYoQXMuY29weShzKS5pbnZlcnQoKSxlLmJvdW5kc1RyZWUpcmV0dXJuIFoocixpLG1uKSxtbi5tYXRyaXguY29weShBcyksbW4ubmVlZHNVcGRhdGU9ITAsZS5ib3VuZHNUcmVlLnNoYXBlY2FzdCh7aW50ZXJzZWN0c0JvdW5kczpUPT5tbi5pbnRlcnNlY3RzQm94KFQpLGludGVyc2VjdHNUcmlhbmdsZTpUPT57VC5hLmFwcGx5TWF0cml4NChzKSxULmIuYXBwbHlNYXRyaXg0KHMpLFQuYy5hcHBseU1hdHJpeDQocyksVC5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IHc9bSxNPWcrbTt3PE07dysrKWlmKHN0KCRlLDMqdC5yZXNvbHZlVHJpYW5nbGVJbmRleCh3KSxsLGQpLCRlLm5lZWRzVXBkYXRlPSEwLFQuaW50ZXJzZWN0c1RyaWFuZ2xlKCRlKSlyZXR1cm4hMDtyZXR1cm4hMX19KTtmb3IobGV0IHk9bSxUPWcrbTt5PFQ7eSsrKXtjb25zdCB3PXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoeSk7c3QocWUsMyp3LGwsZCkscWUuYS5hcHBseU1hdHJpeDQoQXMpLHFlLmIuYXBwbHlNYXRyaXg0KEFzKSxxZS5jLmFwcGx5TWF0cml4NChBcykscWUubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBNPTAsTj1mLmNvdW50O008TjtNKz0zKWlmKHN0KCRlLE0sZixwKSwkZS5uZWVkc1VwZGF0ZT0hMCxxZS5pbnRlcnNlY3RzVHJpYW5nbGUoJGUpKXJldHVybiEwfX1lbHNle2NvbnN0IGg9cis4LGw9YVtyKzZdO3JldHVybiBaKGgsaSxwbiksISEobi5pbnRlcnNlY3RzQm94KHBuKSYmdmkoaCx0LGUscyxuKXx8KFoobCxpLHBuKSxuLmludGVyc2VjdHNCb3gocG4pJiZ2aShsLHQsZSxzLG4pKSl9fWNvbnN0IHluPW5ldyBudCxQaT1uZXcgbHQsTXM9bmV3IGx0LENsPW5ldyBBLEZsPW5ldyBBLFJsPW5ldyBBLEJsPW5ldyBBO2Z1bmN0aW9uIElsKHIsdCxlLHM9e30sbj17fSxpPTAsbz0xLzApe3QuYm91bmRpbmdCb3h8fHQuY29tcHV0ZUJvdW5kaW5nQm94KCksUGkuc2V0KHQuYm91bmRpbmdCb3gubWluLHQuYm91bmRpbmdCb3gubWF4LGUpLFBpLm5lZWRzVXBkYXRlPSEwO2NvbnN0IGE9ci5nZW9tZXRyeSxjPWEuYXR0cmlidXRlcy5wb3NpdGlvbix1PWEuaW5kZXgsaD10LmF0dHJpYnV0ZXMucG9zaXRpb24sbD10LmluZGV4LGQ9YnQuZ2V0UHJpbWl0aXZlKCksZj1idC5nZXRQcmltaXRpdmUoKTtsZXQgcD1DbCxtPUZsLGc9bnVsbCx5PW51bGw7biYmKGc9UmwseT1CbCk7bGV0IFQ9MS8wLHc9bnVsbCxNPW51bGw7cmV0dXJuIHluLmNvcHkoZSkuaW52ZXJ0KCksTXMubWF0cml4LmNvcHkoeW4pLHIuc2hhcGVjYXN0KHtib3VuZHNUcmF2ZXJzZU9yZGVyOk49PlBpLmRpc3RhbmNlVG9Cb3goTiksaW50ZXJzZWN0c0JvdW5kczooTixfLFMpPT5TPFQmJlM8bz8oXyYmKE1zLm1pbi5jb3B5KE4ubWluKSxNcy5tYXguY29weShOLm1heCksTXMubmVlZHNVcGRhdGU9ITApLCEwKTohMSxpbnRlcnNlY3RzUmFuZ2U6KE4sXyk9PntpZih0LmJvdW5kc1RyZWUpe2NvbnN0IFM9dC5ib3VuZHNUcmVlO3JldHVybiBTLnNoYXBlY2FzdCh7Ym91bmRzVHJhdmVyc2VPcmRlcjpFPT5Ncy5kaXN0YW5jZVRvQm94KEUpLGludGVyc2VjdHNCb3VuZHM6KEUsRixSKT0+UjxUJiZSPG8saW50ZXJzZWN0c1JhbmdlOihFLEYpPT57Zm9yKGxldCBSPUUsST1FK0Y7UjxJO1IrKyl7Y29uc3QgQj1TLnJlc29sdmVUcmlhbmdsZUluZGV4KFIpO3N0KGYsMypCLGwsaCksZi5hLmFwcGx5TWF0cml4NChlKSxmLmIuYXBwbHlNYXRyaXg0KGUpLGYuYy5hcHBseU1hdHJpeDQoZSksZi5uZWVkc1VwZGF0ZT0hMDtmb3IobGV0IFA9TixMPU4rXztQPEw7UCsrKXtjb25zdCBWPXIucmVzb2x2ZVRyaWFuZ2xlSW5kZXgoUCk7c3QoZCwzKlYsdSxjKSxkLm5lZWRzVXBkYXRlPSEwO2NvbnN0IEc9ZC5kaXN0YW5jZVRvVHJpYW5nbGUoZixwLGcpO2lmKEc8VCYmKG0uY29weShwKSx5JiZ5LmNvcHkoZyksVD1HLHc9UCxNPVIpLEc8aSlyZXR1cm4hMH19fX0pfWVsc2V7Y29uc3QgUz1EZSh0KTtmb3IobGV0IEU9MCxGPVM7RTxGO0UrKyl7c3QoZiwzKkUsbCxoKSxmLmEuYXBwbHlNYXRyaXg0KGUpLGYuYi5hcHBseU1hdHJpeDQoZSksZi5jLmFwcGx5TWF0cml4NChlKSxmLm5lZWRzVXBkYXRlPSEwO2ZvcihsZXQgUj1OLEk9TitfO1I8STtSKyspe2NvbnN0IEI9ci5yZXNvbHZlVHJpYW5nbGVJbmRleChSKTtzdChkLDMqQix1LGMpLGQubmVlZHNVcGRhdGU9ITA7Y29uc3QgUD1kLmRpc3RhbmNlVG9UcmlhbmdsZShmLHAsZyk7aWYoUDxUJiYobS5jb3B5KHApLHkmJnkuY29weShnKSxUPVAsdz1SLE09RSksUDxpKXJldHVybiEwfX19fX0pLGJ0LnJlbGVhc2VQcmltaXRpdmUoZCksYnQucmVsZWFzZVByaW1pdGl2ZShmKSxUPT09MS8wP251bGw6KHMucG9pbnQ/cy5wb2ludC5jb3B5KG0pOnMucG9pbnQ9bS5jbG9uZSgpLHMuZGlzdGFuY2U9VCxzLmZhY2VJbmRleD13LG4mJihuLnBvaW50P24ucG9pbnQuY29weSh5KTpuLnBvaW50PXkuY2xvbmUoKSxuLnBvaW50LmFwcGx5TWF0cml4NCh5biksbS5hcHBseU1hdHJpeDQoeW4pLG4uZGlzdGFuY2U9bS5zdWIobi5wb2ludCkubGVuZ3RoKCksbi5mYWNlSW5kZXg9TSkscyl9ZnVuY3Rpb24gdmwoKXtyZXR1cm4gdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPCJ1In1jb25zdCBTcz1uZXcgWC5jb25zdHJ1Y3Rvcixnbj1uZXcgWC5jb25zdHJ1Y3RvcixoZT1uZXcgX2koKCk9Pm5ldyBodCksR2U9bmV3IGh0LFdlPW5ldyBodCxMaT1uZXcgaHQsT2k9bmV3IGh0O2xldCBEaT0hMTtmdW5jdGlvbiBQbChyLHQsZSxzKXtpZihEaSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFJlY3Vyc2l2ZSBjYWxscyB0byBidmhjYXN0IG5vdCBzdXBwb3J0ZWQuIik7RGk9ITA7Y29uc3Qgbj1yLl9yb290cyxpPXQuX3Jvb3RzO2xldCBvLGE9MCxjPTA7Y29uc3QgdT1uZXcgbnQoKS5jb3B5KGUpLmludmVydCgpO2ZvcihsZXQgaD0wLGw9bi5sZW5ndGg7aDxsO2grKyl7U3Muc2V0QnVmZmVyKG5baF0pLGM9MDtjb25zdCBkPWhlLmdldFByaW1pdGl2ZSgpO1ooMCxTcy5mbG9hdDMyQXJyYXksZCksZC5hcHBseU1hdHJpeDQodSk7Zm9yKGxldCBmPTAscD1pLmxlbmd0aDtmPHAmJihnbi5zZXRCdWZmZXIoaVtmXSksbz1PdCgwLDAsZSx1LHMsYSxjLDAsMCxkKSxnbi5jbGVhckJ1ZmZlcigpLGMrPWlbZl0ubGVuZ3RoLCFvKTtmKyspO2lmKGhlLnJlbGVhc2VQcmltaXRpdmUoZCksU3MuY2xlYXJCdWZmZXIoKSxhKz1uW2hdLmxlbmd0aCxvKWJyZWFrfXJldHVybiBEaT0hMSxvfWZ1bmN0aW9uIE90KHIsdCxlLHMsbixpPTAsbz0wLGE9MCxjPTAsdT1udWxsLGg9ITEpe2xldCBsLGQ7aD8obD1nbixkPVNzKToobD1TcyxkPWduKTtjb25zdCBmPWwuZmxvYXQzMkFycmF5LHA9bC51aW50MzJBcnJheSxtPWwudWludDE2QXJyYXksZz1kLmZsb2F0MzJBcnJheSx5PWQudWludDMyQXJyYXksVD1kLnVpbnQxNkFycmF5LHc9cioyLE09dCoyLE49cHQodyxtKSxfPXB0KE0sVCk7bGV0IFM9ITE7aWYoXyYmTiloP1M9bihUdCh0LHkpLFN0KHQqMixUKSxUdChyLHApLFN0KHIqMixtKSxjLG8rdCxhLGkrcik6Uz1uKFR0KHIscCksU3QocioyLG0pLFR0KHQseSksU3QodCoyLFQpLGEsaStyLGMsbyt0KTtlbHNlIGlmKF8pe2NvbnN0IEU9aGUuZ2V0UHJpbWl0aXZlKCk7Wih0LGcsRSksRS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgRj1fdChyKSxSPXp0KHIscCk7WihGLGYsR2UpLFooUixmLFdlKTtjb25zdCBJPUUuaW50ZXJzZWN0c0JveChHZSksQj1FLmludGVyc2VjdHNCb3goV2UpO1M9SSYmT3QodCxGLHMsZSxuLG8saSxjLGErMSxFLCFoKXx8QiYmT3QodCxSLHMsZSxuLG8saSxjLGErMSxFLCFoKSxoZS5yZWxlYXNlUHJpbWl0aXZlKEUpfWVsc2V7Y29uc3QgRT1fdCh0KSxGPXp0KHQseSk7WihFLGcsTGkpLFooRixnLE9pKTtjb25zdCBSPXUuaW50ZXJzZWN0c0JveChMaSksST11LmludGVyc2VjdHNCb3goT2kpO2lmKFImJkkpUz1PdChyLEUsZSxzLG4saSxvLGEsYysxLHUsaCl8fE90KHIsRixlLHMsbixpLG8sYSxjKzEsdSxoKTtlbHNlIGlmKFIpaWYoTilTPU90KHIsRSxlLHMsbixpLG8sYSxjKzEsdSxoKTtlbHNle2NvbnN0IEI9aGUuZ2V0UHJpbWl0aXZlKCk7Qi5jb3B5KExpKS5hcHBseU1hdHJpeDQoZSk7Y29uc3QgUD1fdChyKSxMPXp0KHIscCk7WihQLGYsR2UpLFooTCxmLFdlKTtjb25zdCBWPUIuaW50ZXJzZWN0c0JveChHZSksRz1CLmludGVyc2VjdHNCb3goV2UpO1M9ViYmT3QoRSxQLHMsZSxuLG8saSxjLGErMSxCLCFoKXx8RyYmT3QoRSxMLHMsZSxuLG8saSxjLGErMSxCLCFoKSxoZS5yZWxlYXNlUHJpbWl0aXZlKEIpfWVsc2UgaWYoSSlpZihOKVM9T3QocixGLGUscyxuLGksbyxhLGMrMSx1LGgpO2Vsc2V7Y29uc3QgQj1oZS5nZXRQcmltaXRpdmUoKTtCLmNvcHkoT2kpLmFwcGx5TWF0cml4NChlKTtjb25zdCBQPV90KHIpLEw9enQocixwKTtaKFAsZixHZSksWihMLGYsV2UpO2NvbnN0IFY9Qi5pbnRlcnNlY3RzQm94KEdlKSxHPUIuaW50ZXJzZWN0c0JveChXZSk7Uz1WJiZPdChGLFAscyxlLG4sbyxpLGMsYSsxLEIsIWgpfHxHJiZPdChGLEwscyxlLG4sbyxpLGMsYSsxLEIsIWgpLGhlLnJlbGVhc2VQcmltaXRpdmUoQil9fXJldHVybiBTfWNvbnN0IHhuPW5ldyBsdCxibz1uZXcgaHQsTGw9e3N0cmF0ZWd5OnVvLG1heERlcHRoOjQwLG1heExlYWZUcmlzOjEwLHVzZVNoYXJlZEFycmF5QnVmZmVyOiExLHNldEJvdW5kaW5nQm94OiEwLG9uUHJvZ3Jlc3M6bnVsbCxpbmRpcmVjdDohMSx2ZXJib3NlOiEwLHJhbmdlOm51bGx9O2NsYXNzIFRue3N0YXRpYyBzZXJpYWxpemUodCxlPXt9KXtlPXtjbG9uZUJ1ZmZlcnM6ITAsLi4uZX07Y29uc3Qgcz10Lmdlb21ldHJ5LG49dC5fcm9vdHMsaT10Ll9pbmRpcmVjdEJ1ZmZlcixvPXMuZ2V0SW5kZXgoKTtsZXQgYTtyZXR1cm4gZS5jbG9uZUJ1ZmZlcnM/YT17cm9vdHM6bi5tYXAoYz0+Yy5zbGljZSgpKSxpbmRleDpvP28uYXJyYXkuc2xpY2UoKTpudWxsLGluZGlyZWN0QnVmZmVyOmk/aS5zbGljZSgpOm51bGx9OmE9e3Jvb3RzOm4saW5kZXg6bz9vLmFycmF5Om51bGwsaW5kaXJlY3RCdWZmZXI6aX0sYX1zdGF0aWMgZGVzZXJpYWxpemUodCxlLHM9e30pe3M9e3NldEluZGV4OiEwLGluZGlyZWN0OiEhdC5pbmRpcmVjdEJ1ZmZlciwuLi5zfTtjb25zdHtpbmRleDpuLHJvb3RzOmksaW5kaXJlY3RCdWZmZXI6b309dCxhPW5ldyBUbihlLHsuLi5zLFt4aV06ITB9KTtpZihhLl9yb290cz1pLGEuX2luZGlyZWN0QnVmZmVyPW98fG51bGwscy5zZXRJbmRleCl7Y29uc3QgYz1lLmdldEluZGV4KCk7aWYoYz09PW51bGwpe2NvbnN0IHU9bmV3IHZ0KHQuaW5kZXgsMSwhMSk7ZS5zZXRJbmRleCh1KX1lbHNlIGMuYXJyYXkhPT1uJiYoYy5hcnJheS5zZXQobiksYy5uZWVkc1VwZGF0ZT0hMCl9cmV0dXJuIGF9Z2V0IGluZGlyZWN0KCl7cmV0dXJuISF0aGlzLl9pbmRpcmVjdEJ1ZmZlcn1jb25zdHJ1Y3Rvcih0LGU9e30pe2lmKHQuaXNCdWZmZXJHZW9tZXRyeSl7aWYodC5pbmRleCYmdC5pbmRleC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhlIGluZGV4IGF0dHJpYnV0ZS4iKX1lbHNlIHRocm93IG5ldyBFcnJvcigiTWVzaEJWSDogT25seSBCdWZmZXJHZW9tZXRyaWVzIGFyZSBzdXBwb3J0ZWQuIik7aWYoZT1PYmplY3QuYXNzaWduKHsuLi5MbCxbeGldOiExfSxlKSxlLnVzZVNoYXJlZEFycmF5QnVmZmVyJiYhdmwoKSl0aHJvdyBuZXcgRXJyb3IoIk1lc2hCVkg6IFNoYXJlZEFycmF5QnVmZmVyIGlzIG5vdCBhdmFpbGFibGUuIik7dGhpcy5nZW9tZXRyeT10LHRoaXMuX3Jvb3RzPW51bGwsdGhpcy5faW5kaXJlY3RCdWZmZXI9bnVsbCxlW3hpXXx8KGp1KHRoaXMsZSksIXQuYm91bmRpbmdCb3gmJmUuc2V0Qm91bmRpbmdCb3gmJih0LmJvdW5kaW5nQm94PXRoaXMuZ2V0Qm91bmRpbmdCb3gobmV3IGh0KSkpLHRoaXMucmVzb2x2ZVRyaWFuZ2xlSW5kZXg9ZS5pbmRpcmVjdD9zPT50aGlzLl9pbmRpcmVjdEJ1ZmZlcltzXTpzPT5zfXJlZml0KHQ9bnVsbCl7cmV0dXJuKHRoaXMuaW5kaXJlY3Q/U2w6bGwpKHRoaXMsdCl9dHJhdmVyc2UodCxlPTApe2NvbnN0IHM9dGhpcy5fcm9vdHNbZV0sbj1uZXcgVWludDMyQXJyYXkocyksaT1uZXcgVWludDE2QXJyYXkocyk7bygwKTtmdW5jdGlvbiBvKGEsYz0wKXtjb25zdCB1PWEqMixoPWlbdSsxNV09PT1lbjtpZihoKXtjb25zdCBsPW5bYSs2XSxkPWlbdSsxNF07dChjLGgsbmV3IEZsb2F0MzJBcnJheShzLGEqNCw2KSxsLGQpfWVsc2V7Y29uc3QgbD1hK21zLzQsZD1uW2ErNl0sZj1uW2ErN107dChjLGgsbmV3IEZsb2F0MzJBcnJheShzLGEqNCw2KSxmKXx8KG8obCxjKzEpLG8oZCxjKzEpKX19fXJheWNhc3QodCxlPVZpLHM9MCxuPTEvMCl7Y29uc3QgaT10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1bXSxjPWUuaXNNYXRlcmlhbCx1PUFycmF5LmlzQXJyYXkoZSksaD1vLmdyb3VwcyxsPWM/ZS5zaWRlOmUsZD10aGlzLmluZGlyZWN0P19sOm1sO2ZvcihsZXQgZj0wLHA9aS5sZW5ndGg7ZjxwO2YrKyl7Y29uc3QgbT11P2VbaFtmXS5tYXRlcmlhbEluZGV4XS5zaWRlOmwsZz1hLmxlbmd0aDtpZihkKHRoaXMsZixtLHQsYSxzLG4pLHUpe2NvbnN0IHk9aFtmXS5tYXRlcmlhbEluZGV4O2ZvcihsZXQgVD1nLHc9YS5sZW5ndGg7VDx3O1QrKylhW1RdLmZhY2UubWF0ZXJpYWxJbmRleD15fX1yZXR1cm4gYX1yYXljYXN0Rmlyc3QodCxlPVZpLHM9MCxuPTEvMCl7Y29uc3QgaT10aGlzLl9yb290cyxvPXRoaXMuZ2VvbWV0cnksYT1lLmlzTWF0ZXJpYWwsYz1BcnJheS5pc0FycmF5KGUpO2xldCB1PW51bGw7Y29uc3QgaD1vLmdyb3VwcyxsPWE/ZS5zaWRlOmUsZD10aGlzLmluZGlyZWN0P2JsOmdsO2ZvcihsZXQgZj0wLHA9aS5sZW5ndGg7ZjxwO2YrKyl7Y29uc3QgbT1jP2VbaFtmXS5tYXRlcmlhbEluZGV4XS5zaWRlOmwsZz1kKHRoaXMsZixtLHQscyxuKTtnIT1udWxsJiYodT09bnVsbHx8Zy5kaXN0YW5jZTx1LmRpc3RhbmNlKSYmKHU9ZyxjJiYoZy5mYWNlLm1hdGVyaWFsSW5kZXg9aFtmXS5tYXRlcmlhbEluZGV4KSl9cmV0dXJuIHV9aW50ZXJzZWN0c0dlb21ldHJ5KHQsZSl7bGV0IHM9ITE7Y29uc3Qgbj10aGlzLl9yb290cyxpPXRoaXMuaW5kaXJlY3Q/RWw6eGw7Zm9yKGxldCBvPTAsYT1uLmxlbmd0aDtvPGEmJihzPWkodGhpcyxvLHQsZSksIXMpO28rKyk7cmV0dXJuIHN9c2hhcGVjYXN0KHQpe2NvbnN0IGU9YnQuZ2V0UHJpbWl0aXZlKCkscz10aGlzLmluZGlyZWN0P3BsOnVsO2xldHtib3VuZHNUcmF2ZXJzZU9yZGVyOm4saW50ZXJzZWN0c0JvdW5kczppLGludGVyc2VjdHNSYW5nZTpvLGludGVyc2VjdHNUcmlhbmdsZTphfT10O2lmKG8mJmEpe2NvbnN0IGw9bztvPShkLGYscCxtLGcpPT5sKGQsZixwLG0sZyk/ITA6cyhkLGYsdGhpcyxhLHAsbSxlKX1lbHNlIG98fChhP289KGwsZCxmLHApPT5zKGwsZCx0aGlzLGEsZixwLGUpOm89KGwsZCxmKT0+Zik7bGV0IGM9ITEsdT0wO2NvbnN0IGg9dGhpcy5fcm9vdHM7Zm9yKGxldCBsPTAsZD1oLmxlbmd0aDtsPGQ7bCsrKXtjb25zdCBmPWhbbF07aWYoYz1ubCh0aGlzLGwsaSxvLG4sdSksYylicmVhazt1Kz1mLmJ5dGVMZW5ndGh9cmV0dXJuIGJ0LnJlbGVhc2VQcmltaXRpdmUoZSksY31idmhjYXN0KHQsZSxzKXtsZXR7aW50ZXJzZWN0c1JhbmdlczpuLGludGVyc2VjdHNUcmlhbmdsZXM6aX09cztjb25zdCBvPWJ0LmdldFByaW1pdGl2ZSgpLGE9dGhpcy5nZW9tZXRyeS5pbmRleCxjPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbix1PXRoaXMuaW5kaXJlY3Q/cD0+e2NvbnN0IG09dGhpcy5yZXNvbHZlVHJpYW5nbGVJbmRleChwKTtzdChvLG0qMyxhLGMpfTpwPT57c3QobyxwKjMsYSxjKX0saD1idC5nZXRQcmltaXRpdmUoKSxsPXQuZ2VvbWV0cnkuaW5kZXgsZD10Lmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZj10LmluZGlyZWN0P3A9Pntjb25zdCBtPXQucmVzb2x2ZVRyaWFuZ2xlSW5kZXgocCk7c3QoaCxtKjMsbCxkKX06cD0+e3N0KGgscCozLGwsZCl9O2lmKGkpe2NvbnN0IHA9KG0sZyx5LFQsdyxNLE4sXyk9Pntmb3IobGV0IFM9eSxFPXkrVDtTPEU7UysrKXtmKFMpLGguYS5hcHBseU1hdHJpeDQoZSksaC5iLmFwcGx5TWF0cml4NChlKSxoLmMuYXBwbHlNYXRyaXg0KGUpLGgubmVlZHNVcGRhdGU9ITA7Zm9yKGxldCBGPW0sUj1tK2c7RjxSO0YrKylpZih1KEYpLG8ubmVlZHNVcGRhdGU9ITAsaShvLGgsRixTLHcsTSxOLF8pKXJldHVybiEwfXJldHVybiExfTtpZihuKXtjb25zdCBtPW47bj1mdW5jdGlvbihnLHksVCx3LE0sTixfLFMpe3JldHVybiBtKGcseSxULHcsTSxOLF8sUyk/ITA6cChnLHksVCx3LE0sTixfLFMpfX1lbHNlIG49cH1yZXR1cm4gUGwodGhpcyx0LGUsbil9aW50ZXJzZWN0c0JveCh0LGUpe3JldHVybiB4bi5zZXQodC5taW4sdC5tYXgsZSkseG4ubmVlZHNVcGRhdGU9ITAsdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6cz0+eG4uaW50ZXJzZWN0c0JveChzKSxpbnRlcnNlY3RzVHJpYW5nbGU6cz0+eG4uaW50ZXJzZWN0c1RyaWFuZ2xlKHMpfSl9aW50ZXJzZWN0c1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5zaGFwZWNhc3Qoe2ludGVyc2VjdHNCb3VuZHM6ZT0+dC5pbnRlcnNlY3RzQm94KGUpLGludGVyc2VjdHNUcmlhbmdsZTplPT5lLmludGVyc2VjdHNTcGhlcmUodCl9KX1jbG9zZXN0UG9pbnRUb0dlb21ldHJ5KHQsZSxzPXt9LG49e30saT0wLG89MS8wKXtyZXR1cm4odGhpcy5pbmRpcmVjdD9JbDpNbCkodGhpcyx0LGUscyxuLGksbyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGU9e30scz0wLG49MS8wKXtyZXR1cm4gaWwodGhpcyx0LGUscyxuKX1nZXRCb3VuZGluZ0JveCh0KXtyZXR1cm4gdC5tYWtlRW1wdHkoKSx0aGlzLl9yb290cy5mb3JFYWNoKHM9PntaKDAsbmV3IEZsb2F0MzJBcnJheShzKSxibyksdC51bmlvbihibyl9KSx0fX1vbm1lc3NhZ2U9KHtkYXRhOnJ9KT0+e2xldCB0PXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIGUobyl7bz1NYXRoLm1pbihvLDEpO2NvbnN0IGE9cGVyZm9ybWFuY2Uubm93KCk7YS10Pj0xMCYmbyE9PTEmJihwb3N0TWVzc2FnZSh7ZXJyb3I6bnVsbCxzZXJpYWxpemVkOm51bGwscG9zaXRpb246bnVsbCxwcm9ncmVzczpvfSksdD1hKX1jb25zdHtpbmRleDpzLHBvc2l0aW9uOm4sb3B0aW9uczppfT1yO3RyeXtjb25zdCBvPW5ldyBHbjtpZihvLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyB2dChuLDMsITEpKSxzJiZvLnNldEluZGV4KG5ldyB2dChzLDEsITEpKSxpLmluY2x1ZGVkUHJvZ3Jlc3NDYWxsYmFjayYmKGkub25Qcm9ncmVzcz1lKSxpLmdyb3Vwcyl7Y29uc3QgaD1pLmdyb3Vwcztmb3IoY29uc3QgbCBpbiBoKXtjb25zdCBkPWhbbF07by5hZGRHcm91cChkLnN0YXJ0LGQuY291bnQsZC5tYXRlcmlhbEluZGV4KX19Y29uc3QgYT1uZXcgVG4obyxpKSxjPVRuLnNlcmlhbGl6ZShhLHtjb3B5SW5kZXhCdWZmZXI6ITF9KTtsZXQgdT1bbi5idWZmZXIsLi4uYy5yb290c107Yy5pbmRleCYmdS5wdXNoKGMuaW5kZXguYnVmZmVyKSx1PXUuZmlsdGVyKGg9PnR5cGVvZiBTaGFyZWRBcnJheUJ1ZmZlcj4idSJ8fCEoaCBpbnN0YW5jZW9mIFNoYXJlZEFycmF5QnVmZmVyKSksYS5faW5kaXJlY3RCdWZmZXImJnUucHVzaChjLmluZGlyZWN0QnVmZmVyLmJ1ZmZlcikscG9zdE1lc3NhZ2Uoe2Vycm9yOm51bGwsc2VyaWFsaXplZDpjLHBvc2l0aW9uOm4scHJvZ3Jlc3M6MX0sdSl9Y2F0Y2gobyl7cG9zdE1lc3NhZ2Uoe2Vycm9yOm8sc2VyaWFsaXplZDpudWxsLHBvc2l0aW9uOm51bGwscHJvZ3Jlc3M6MX0pfX19KSgpOwo=",Vl=typeof window<"u"&&window.Blob&&new Blob([atob(Xl)],{type:"text/javascript;charset=utf-8"});function wu(){let n;try{if(n=Vl&&(window.URL||window.webkitURL).createObjectURL(Vl),!n)throw"";return new Worker(n)}catch{return new Worker("data:application/javascript;base64,"+Xl)}finally{n&&(window.URL||window.webkitURL).revokeObjectURL(n)}}export{dr as $70d766613f57b014$export$2e2bcd8739ae039,Dd as BatchedParticleRenderer,ko as Builder,Bi as ByteBuffer,Qt as ConstantColor,U as ConstantValue,je as Matrix4,xt as MeshBVH,wl as MotionController,Ls as ParticleSystem,v as RenderMode,Do as SIZE_PREFIX_LENGTH,En as TrailParticle,Ce as Vector4,Pu as WorkerBase,wu as WorkerWrapper,xc as bundler,Ad as createNoise4D,Nl as fetchProfile,oh as index,Uu as index$1,Uc as md5,Hc as v5};
1602
+ `,Id=Object.freeze(Object.defineProperty({__proto__:null,bvh_distance_functions:yc,bvh_ray_functions:gc,bvh_struct_definitions:vc,common_functions:mc},Symbol.toStringTag,{value:"Module"})),zd=vc,Nd=yc,Ud=`
1603
+ ${mc}
1604
+ ${gc}
1605
+ `,Dd=Object.freeze(Object.defineProperty({__proto__:null,AVERAGE:Ra,BVHShaderGLSL:Id,CENTER:cs,CONTAINED:ls,ExtendedTriangle:ze,FloatVertexAttributeTexture:cc,INTERSECTED:su,IntVertexAttributeTexture:Md,MeshBVH:wt,MeshBVHHelper:Us,MeshBVHUniformStruct:Td,NOT_INTERSECTED:ru,OrientedBox:be,SAH:Oa,StaticGeometryGenerator:Bd,UIntVertexAttributeTexture:ac,VertexAttributeTexture:yr,acceleratedRaycast:md,computeBatchedBoundsTree:xd,computeBoundsTree:vd,disposeBatchedBoundsTree:_d,disposeBoundsTree:bd,estimateMemoryInBytes:ld,getBVHExtremes:cd,getJSONStructure:ud,getTriangleHitPointInfo:ku,shaderDistanceFunction:Nd,shaderIntersectFunction:Ud,shaderStructs:zd,validateBounds:hd},Symbol.toStringTag,{value:"Module"}));class Fd{constructor(e){this.name="WorkerBase",this.running=!1,this.worker=e,this.worker.onerror=t=>{throw t.message?new Error(`${this.name}: Could not create Web Worker with error "${t.message}"`):new Error(`${this.name}: Could not create Web Worker.`)}}runTask(){}generate(...e){if(this.running)throw new Error("GenerateMeshBVHWorker: Already running job.");if(this.worker===null)throw new Error("GenerateMeshBVHWorker: Worker has been disposed.");this.running=!0;const t=this.runTask(this.worker,...e);return t.finally(()=>{this.running=!1}),t}dispose(){this.worker.terminate(),this.worker=null}}export{ha as $70d766613f57b014$export$2e2bcd8739ae039,Wh as BatchedParticleRenderer,zs as Builder,qi as ByteBuffer,Gt as ConstantColor,L as ConstantValue,We as Matrix4,wt as MeshBVH,Lc as MotionController,Sr as ParticleSystem,k as RenderMode,Xs as SIZE_PREFIX_LENGTH,Hn as TrailParticle,Ee as Vector4,Fd as WorkerBase,_l as bundler,Yh as createNoise4D,zc as fetchProfile,nu as index,Dd as index$1,Dl as md5,Bl as v5};