diff --git a/dist/ARnftThreejs.js b/dist/ARnftThreejs.js index c6d51e7..67d06fc 100644 --- a/dist/ARnftThreejs.js +++ b/dist/ARnftThreejs.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("three")):"function"==typeof define&&define.amd?define(["three"],t):"object"==typeof exports?exports.ARnftThreejs=t(require("three")):e.ARnftThreejs=t(e.THREE)}(this,(function(e){return(()=>{"use strict";var t={381:t=>{t.exports=e}},s={};function n(e){var r=s[e];if(void 0!==r)return r.exports;var i=s[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.d=(e,t)=>{for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var r={};return(()=>{function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var s=0;sY});var i=n(381),a=function(){function t(){e(this,t)}return s(t,null,[{key:"interpolate",value:function(e){for(var t=0;t<16;t++)this.trackedMatrix.delta[t]=e[t]-this.trackedMatrix.interpolated[t],this.trackedMatrix.interpolated[t]=this.trackedMatrix.interpolated[t]+this.trackedMatrix.delta[t]/24;return this.trackedMatrix.interpolated}},{key:"isMobile",value:function(){return/Android|mobile|iPad|iPhone/i.test(navigator.userAgent)}},{key:"setMatrix",value:function(e,t){var s=[];for(var n in t)s[n]=t[n];"function"==typeof e.elements.set?e.elements.set(s):e.elements=[].slice.call(s)}}]),t}();a.trackedMatrix={delta:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],interpolated:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]};var o=function(){function t(s,r,a,o){e(this,t),this.configData=s,this.uuid=a,this.target=window||n.g,this.renderer=new i.WebGLRenderer({canvas:r,context:s.renderer.context,alpha:s.renderer.alpha,premultipliedAlpha:s.renderer.premultipliedAlpha,antialias:s.renderer.antialias,stencil:s.renderer.stencil,precision:s.renderer.precision,depth:s.renderer.depth,logarithmicDepthBuffer:s.renderer.logarithmicDepthBuffer}),this.renderer.setPixelRatio(window.devicePixelRatio),this.scene=new i.Scene,t.globalScene=this.scene,this.camera=!0===o?new i.PerspectiveCamera(s.camera.fov,s.camera.ratio,s.camera.near,s.camera.far):new i.Camera,this.version="0.4.0",console.log("ARnftThreejs version: ",this.version)}return s(t,[{key:"initRenderer",value:function(){var e=this;this.camera.matrixAutoUpdate=!1,this.target.addEventListener("getProjectionMatrix",(function(t){a.setMatrix(e.camera.projectionMatrix,t.detail.proj)})),this.scene.add(this.camera);var t=new i.AmbientLight(16777215);this.scene.add(t),this.target.addEventListener("getWindowSize",(function(t){e.renderer.setSize(t.detail.sw,t.detail.sh)}));var s=new CustomEvent("onInitThreejsRendering",{detail:{renderer:this.renderer,scene:this.scene,camera:this.camera}});this.target.dispatchEvent(s)}},{key:"draw",value:function(){this.renderer.render(this.scene,this.camera)}},{key:"getRenderer",value:function(){return this.renderer}},{key:"getScene",value:function(){return this.scene}},{key:"getCamera",value:function(){return this.camera}},{key:"setRenderer",value:function(e){this.renderer=e}},{key:"setScene",value:function(e){this.scene=e}},{key:"setCamera",value:function(e){this.camera=e}}],[{key:"getGlobalScene",value:function(){return t.globalScene}}]),t}();class l extends i.Loader{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register((function(e){return new p(e)})),this.register((function(e){return new x(e)})),this.register((function(e){return new T(e)})),this.register((function(e){return new m(e)})),this.register((function(e){return new f(e)})),this.register((function(e){return new g(e)})),this.register((function(e){return new v(e)})),this.register((function(e){return new h(e)})),this.register((function(e){return new M(e)}))}load(e,t,s,n){const r=this;let a;a=""!==this.resourcePath?this.resourcePath:""!==this.path?this.path:i.LoaderUtils.extractUrlBase(e),this.manager.itemStart(e);const o=function(t){n?n(t):console.error(t),r.manager.itemError(e),r.manager.itemEnd(e)},l=new i.FileLoader(this.manager);l.setPath(this.path),l.setResponseType("arraybuffer"),l.setRequestHeader(this.requestHeader),l.setWithCredentials(this.withCredentials),l.load(e,(function(s){try{r.parse(s,a,(function(s){t(s),r.manager.itemEnd(e)}),o)}catch(e){o(e)}}),s,o)}setDRACOLoader(e){return this.dracoLoader=e,this}setDDSLoader(){throw new Error('THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".')}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,s,n){let r;const a={},o={};if("string"==typeof e)r=e;else if(i.LoaderUtils.decodeText(new Uint8Array(e,0,4))===R){try{a[u.KHR_BINARY_GLTF]=new y(e)}catch(e){return void(n&&n(e))}r=a[u.KHR_BINARY_GLTF].content}else r=i.LoaderUtils.decodeText(new Uint8Array(e));const l=JSON.parse(r);if(void 0===l.asset||l.asset.version[0]<2)return void(n&&n(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")));const c=new X(l,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e=0&&void 0===o[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}c.setExtensions(a),c.setPlugins(o),c.parse(s,n)}}function c(){let e={};return{get:function(t){return e[t]},add:function(t,s){e[t]=s},remove:function(t){delete e[t]},removeAll:function(){e={}}}}const u={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:"KHR_materials_pbrSpecularGlossiness",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression"};class h{constructor(e){this.parser=e,this.name=u.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let s=0,n=t.length;s=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,i,a)}}class T{constructor(e){this.parser=e,this.name=u.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){const t=this.name,s=this.parser,n=s.json,r=n.textures[e];if(!r.extensions||!r.extensions[t])return null;const i=r.extensions[t],a=n.images[i.source];let o=s.textureLoader;if(a.uri){const e=s.options.manager.getHandler(a.uri);null!==e&&(o=e)}return this.detectSupport().then((function(r){if(r)return s.loadTextureImage(e,a,o);if(n.extensionsRequired&&n.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return s.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class M{constructor(e){this.name=u.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,s=t.bufferViews[e];if(s.extensions&&s.extensions[this.name]){const e=s.extensions[this.name],n=this.parser.getDependency("buffer",e.buffer),r=this.parser.options.meshoptDecoder;if(!r||!r.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return Promise.all([n,r.ready]).then((function(t){const s=e.byteOffset||0,n=e.byteLength||0,i=e.count,a=e.byteStride,o=new ArrayBuffer(i*a),l=new Uint8Array(t[0],s,n);return r.decodeGltfBuffer(new Uint8Array(o),i,a,l,e.mode,e.filter),o}))}return null}}const R="glTF";class y{constructor(e){this.name=u.KHR_BINARY_GLTF,this.content=null,this.body=null;const t=new DataView(e,0,12);if(this.header={magic:i.LoaderUtils.decodeText(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==R)throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header.");if(this.header.version<2)throw new Error("THREE.GLTFLoader: Legacy binary file detected.");const s=this.header.length-12,n=new DataView(e,12);let r=0;for(;r",t).replace("#include ",s).replace("#include ",n).replace("#include ",r).replace("#include ",a)},Object.defineProperties(this,{specular:{get:function(){return o.specular.value},set:function(e){o.specular.value=e}},specularMap:{get:function(){return o.specularMap.value},set:function(e){o.specularMap.value=e,e?this.defines.USE_SPECULARMAP="":delete this.defines.USE_SPECULARMAP}},glossiness:{get:function(){return o.glossiness.value},set:function(e){o.glossiness.value=e}},glossinessMap:{get:function(){return o.glossinessMap.value},set:function(e){o.glossinessMap.value=e,e?(this.defines.USE_GLOSSINESSMAP="",this.defines.USE_UV=""):(delete this.defines.USE_GLOSSINESSMAP,delete this.defines.USE_UV)}}}),delete this.metalness,delete this.roughness,delete this.metalnessMap,delete this.roughnessMap,this.setValues(e)}copy(e){return super.copy(e),this.specularMap=e.specularMap,this.specular.copy(e.specular),this.glossinessMap=e.glossinessMap,this.glossiness=e.glossiness,delete this.metalness,delete this.roughness,delete this.metalnessMap,delete this.roughnessMap,this}}class E{constructor(){this.name=u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,this.specularGlossinessParams=["color","map","lightMap","lightMapIntensity","aoMap","aoMapIntensity","emissive","emissiveIntensity","emissiveMap","bumpMap","bumpScale","normalMap","normalMapType","displacementMap","displacementScale","displacementBias","specularMap","specular","glossinessMap","glossiness","alphaMap","envMap","envMapIntensity","refractionRatio"]}getMaterialType(){return S}extendParams(e,t,s){const n=t.extensions[this.name];e.color=new i.Color(1,1,1),e.opacity=1;const r=[];if(Array.isArray(n.diffuseFactor)){const t=n.diffuseFactor;e.color.fromArray(t),e.opacity=t[3]}if(void 0!==n.diffuseTexture&&r.push(s.assignTexture(e,"map",n.diffuseTexture)),e.emissive=new i.Color(0,0,0),e.glossiness=void 0!==n.glossinessFactor?n.glossinessFactor:1,e.specular=new i.Color(1,1,1),Array.isArray(n.specularFactor)&&e.specular.fromArray(n.specularFactor),void 0!==n.specularGlossinessTexture){const t=n.specularGlossinessTexture;r.push(s.assignTexture(e,"glossinessMap",t)),r.push(s.assignTexture(e,"specularMap",t))}return Promise.all(r)}createMaterial(e){const t=new S(e);return t.fog=!0,t.color=e.color,t.map=void 0===e.map?null:e.map,t.lightMap=null,t.lightMapIntensity=1,t.aoMap=void 0===e.aoMap?null:e.aoMap,t.aoMapIntensity=1,t.emissive=e.emissive,t.emissiveIntensity=1,t.emissiveMap=void 0===e.emissiveMap?null:e.emissiveMap,t.bumpMap=void 0===e.bumpMap?null:e.bumpMap,t.bumpScale=1,t.normalMap=void 0===e.normalMap?null:e.normalMap,t.normalMapType=i.TangentSpaceNormalMap,e.normalScale&&(t.normalScale=e.normalScale),t.displacementMap=null,t.displacementScale=1,t.displacementBias=0,t.specularMap=void 0===e.specularMap?null:e.specularMap,t.specular=e.specular,t.glossinessMap=void 0===e.glossinessMap?null:e.glossinessMap,t.glossiness=e.glossiness,t.alphaMap=null,t.envMap=void 0===e.envMap?null:e.envMap,t.envMapIntensity=1,t.refractionRatio=.98,t}}class A{constructor(){this.name=u.KHR_MESH_QUANTIZATION}}class b extends i.Interpolant{constructor(e,t,s,n){super(e,t,s,n)}copySampleValue_(e){const t=this.resultBuffer,s=this.sampleValues,n=this.valueSize,r=e*n*3+n;for(let e=0;e!==n;e++)t[e]=s[r+e];return t}}b.prototype.beforeStart_=b.prototype.copySampleValue_,b.prototype.afterEnd_=b.prototype.copySampleValue_,b.prototype.interpolate_=function(e,t,s,n){const r=this.resultBuffer,i=this.sampleValues,a=this.valueSize,o=2*a,l=3*a,c=n-t,u=(s-t)/c,h=u*u,d=h*u,p=e*l,m=p-l,f=-2*d+3*h,g=d-h,v=1-f,x=g-h+u;for(let e=0;e!==a;e++){const t=i[m+e+a],s=i[m+e+o]*c,n=i[p+e+a],l=i[p+e]*c;r[e]=v*t+x*s+f*n+g*l}return r};const _=new i.Quaternion;class P extends b{interpolate_(e,t,s,n){const r=super.interpolate_(e,t,s,n);return _.fromArray(r).normalize().toArray(r),r}}const I={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},C={9728:i.NearestFilter,9729:i.LinearFilter,9984:i.NearestMipmapNearestFilter,9985:i.LinearMipmapNearestFilter,9986:i.NearestMipmapLinearFilter,9987:i.LinearMipmapLinearFilter},O={33071:i.ClampToEdgeWrapping,33648:i.MirroredRepeatWrapping,10497:i.RepeatWrapping},N={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},H={POSITION:"position",NORMAL:"normal",TANGENT:"tangent",TEXCOORD_0:"uv",TEXCOORD_1:"uv2",COLOR_0:"color",WEIGHTS_0:"skinWeight",JOINTS_0:"skinIndex"},F={scale:"scale",translation:"position",rotation:"quaternion",weights:"morphTargetInfluences"},k={CUBICSPLINE:void 0,LINEAR:i.InterpolateLinear,STEP:i.InterpolateDiscrete};function U(e,t){return"string"!=typeof e||""===e?"":(/^https?:\/\//i.test(t)&&/^\//.test(e)&&(t=t.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(e)||/^data:.*,.*$/i.test(e)||/^blob:.*$/i.test(e)?e:t+e)}function D(e,t,s){for(const n in s.extensions)void 0===e[n]&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[n]=s.extensions[n])}function G(e,t){void 0!==t.extras&&("object"==typeof t.extras?Object.assign(e.userData,t.extras):console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, "+t.extras))}function j(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let s=0,n=t.weights.length;s{const s=this.associations.get(e);null!=s&&this.associations.set(t,s);for(const[s,n]of e.children.entries())r(n,t.children[s])};return r(s,n),n.name+="_instance_"+e.uses[t]++,n}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let s=0;s=2&&m.setY(t,h[e*a+1]),a>=3&&m.setZ(t,h[e*a+2]),a>=4&&m.setW(t,h[e*a+3]),a>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return m}))}loadTexture(e){const t=this.json,s=this.options,n=t.textures[e],r=t.images[n.source];let i=this.textureLoader;if(r.uri){const e=s.manager.getHandler(r.uri);null!==e&&(i=e)}return this.loadTextureImage(e,r,i)}loadTextureImage(e,t,s){const n=this,r=this.json,a=this.options,o=r.textures[e],l=(t.uri||t.bufferView)+":"+o.sampler;if(this.textureCache[l])return this.textureCache[l];const c=self.URL||self.webkitURL;let u=t.uri||"",h=!1;if(void 0!==t.bufferView)u=n.getDependency("bufferView",t.bufferView).then((function(e){h=!0;const s=new Blob([e],{type:t.mimeType});return u=c.createObjectURL(s),u}));else if(void 0===t.uri)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const d=Promise.resolve(u).then((function(e){return new Promise((function(t,n){let r=t;!0===s.isImageBitmapLoader&&(r=function(e){const s=new i.Texture(e);s.needsUpdate=!0,t(s)}),s.load(U(e,a.path),r,void 0,n)}))})).then((function(t){!0===h&&c.revokeObjectURL(u),t.flipY=!1,o.name&&(t.name=o.name);const s=(r.samplers||{})[o.sampler]||{};return t.magFilter=C[s.magFilter]||i.LinearFilter,t.minFilter=C[s.minFilter]||i.LinearMipmapLinearFilter,t.wrapS=O[s.wrapS]||i.RepeatWrapping,t.wrapT=O[s.wrapT]||i.RepeatWrapping,n.associations.set(t,{textures:e}),t})).catch((function(){return console.error("THREE.GLTFLoader: Couldn't load texture",u),null}));return this.textureCache[l]=d,d}assignTexture(e,t,s){const n=this;return this.getDependency("texture",s.index).then((function(r){if(void 0===s.texCoord||0==s.texCoord||"aoMap"===t&&1==s.texCoord||console.warn("THREE.GLTFLoader: Custom UV set "+s.texCoord+" for texture "+t+" not yet supported."),n.extensions[u.KHR_TEXTURE_TRANSFORM]){const e=void 0!==s.extensions?s.extensions[u.KHR_TEXTURE_TRANSFORM]:void 0;if(e){const t=n.associations.get(r);r=n.extensions[u.KHR_TEXTURE_TRANSFORM].extendTexture(r,e),n.associations.set(r,t)}}return e[t]=r,r}))}assignFinalMaterial(e){const t=e.geometry;let s=e.material;const n=void 0===t.attributes.tangent,r=void 0!==t.attributes.color,a=void 0===t.attributes.normal;if(e.isPoints){const e="PointsMaterial:"+s.uuid;let t=this.cache.get(e);t||(t=new i.PointsMaterial,i.Material.prototype.copy.call(t,s),t.color.copy(s.color),t.map=s.map,t.sizeAttenuation=!1,this.cache.add(e,t)),s=t}else if(e.isLine){const e="LineBasicMaterial:"+s.uuid;let t=this.cache.get(e);t||(t=new i.LineBasicMaterial,i.Material.prototype.copy.call(t,s),t.color.copy(s.color),this.cache.add(e,t)),s=t}if(n||r||a){let e="ClonedMaterial:"+s.uuid+":";s.isGLTFSpecularGlossinessMaterial&&(e+="specular-glossiness:"),n&&(e+="derivative-tangents:"),r&&(e+="vertex-colors:"),a&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=s.clone(),r&&(t.vertexColors=!0),a&&(t.flatShading=!0),n&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(s))),s=t}s.aoMap&&void 0===t.attributes.uv2&&void 0!==t.attributes.uv&&t.setAttribute("uv2",t.attributes.uv),e.material=s}getMaterialType(){return i.MeshStandardMaterial}loadMaterial(e){const t=this,s=this.json,n=this.extensions,r=s.materials[e];let a;const o={},l=r.extensions||{},c=[];if(l[u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]){const e=n[u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS];a=e.getMaterialType(),c.push(e.extendParams(o,r,t))}else if(l[u.KHR_MATERIALS_UNLIT]){const e=n[u.KHR_MATERIALS_UNLIT];a=e.getMaterialType(),c.push(e.extendParams(o,r,t))}else{const s=r.pbrMetallicRoughness||{};if(o.color=new i.Color(1,1,1),o.opacity=1,Array.isArray(s.baseColorFactor)){const e=s.baseColorFactor;o.color.fromArray(e),o.opacity=e[3]}void 0!==s.baseColorTexture&&c.push(t.assignTexture(o,"map",s.baseColorTexture)),o.metalness=void 0!==s.metallicFactor?s.metallicFactor:1,o.roughness=void 0!==s.roughnessFactor?s.roughnessFactor:1,void 0!==s.metallicRoughnessTexture&&(c.push(t.assignTexture(o,"metalnessMap",s.metallicRoughnessTexture)),c.push(t.assignTexture(o,"roughnessMap",s.metallicRoughnessTexture))),a=this._invokeOne((function(t){return t.getMaterialType&&t.getMaterialType(e)})),c.push(Promise.all(this._invokeAll((function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,o)}))))}!0===r.doubleSided&&(o.side=i.DoubleSide);const h=r.alphaMode||"OPAQUE";if("BLEND"===h?(o.transparent=!0,o.depthWrite=!1):(o.format=i.RGBFormat,o.transparent=!1,"MASK"===h&&(o.alphaTest=void 0!==r.alphaCutoff?r.alphaCutoff:.5)),void 0!==r.normalTexture&&a!==i.MeshBasicMaterial&&(c.push(t.assignTexture(o,"normalMap",r.normalTexture)),o.normalScale=new i.Vector2(1,1),void 0!==r.normalTexture.scale)){const e=r.normalTexture.scale;o.normalScale.set(e,e)}return void 0!==r.occlusionTexture&&a!==i.MeshBasicMaterial&&(c.push(t.assignTexture(o,"aoMap",r.occlusionTexture)),void 0!==r.occlusionTexture.strength&&(o.aoMapIntensity=r.occlusionTexture.strength)),void 0!==r.emissiveFactor&&a!==i.MeshBasicMaterial&&(o.emissive=(new i.Color).fromArray(r.emissiveFactor)),void 0!==r.emissiveTexture&&a!==i.MeshBasicMaterial&&c.push(t.assignTexture(o,"emissiveMap",r.emissiveTexture)),Promise.all(c).then((function(){let s;return s=a===S?n[u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(o):new a(o),r.name&&(s.name=r.name),s.map&&(s.map.encoding=i.sRGBEncoding),s.emissiveMap&&(s.emissiveMap.encoding=i.sRGBEncoding),G(s,r),t.associations.set(s,{materials:e}),r.extensions&&D(n,s,r),s}))}createUniqueName(e){const t=i.PropertyBinding.sanitizeNodeName(e||"");let s=t;for(let e=1;this.nodeNamesUsed[s];++e)s=t+"_"+e;return this.nodeNamesUsed[s]=!0,s}loadGeometries(e){const t=this,s=this.extensions,n=this.primitiveCache;function r(e){return s[u.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(e,t).then((function(s){return z(s,e,t)}))}const a=[];for(let s=0,o=e.length;s0&&j(d,r),d.name=t.createUniqueName(r.name||"mesh_"+e),G(d,r),h.extensions&&D(n,d,h),t.assignFinalMaterial(d),c.push(d)}for(let s=0,n=c.length;s1?new i.Group:1===t.length?t[0]:new i.Object3D,o!==t[0])for(let e=0,s=t.length;e{const t=new Map;for(const[e,s]of r.associations)(e instanceof i.Material||e instanceof i.Texture)&&t.set(e,s);return e.traverse((e=>{const s=r.associations.get(e);null!=s&&t.set(e,s)})),t})(a),a}))}}function q(e,t,s,n){const r=s.nodes[e];return n.getDependency("node",e).then((function(e){if(void 0===r.skin)return e;let t;return n.getDependency("skin",r.skin).then((function(e){t=e;const s=[];for(let e=0,r=t.joints.length;e{"use strict";var t={381:t=>{t.exports=e}},s={};function n(e){var r=s[e];if(void 0!==r)return r.exports;var i=s[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.d=(e,t)=>{for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var r={};return(()=>{function e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function t(e,t){for(var s=0;ste});var i=n(381),a=function(){function t(){e(this,t)}return s(t,null,[{key:"interpolate",value:function(e){for(var t=0;t<16;t++)this.trackedMatrix.delta[t]=e[t]-this.trackedMatrix.interpolated[t],this.trackedMatrix.interpolated[t]=this.trackedMatrix.interpolated[t]+this.trackedMatrix.delta[t]/24;return this.trackedMatrix.interpolated}},{key:"isMobile",value:function(){return/Android|mobile|iPad|iPhone/i.test(navigator.userAgent)}},{key:"setMatrix",value:function(e,t){var s=[];for(var n in t)s[n]=t[n];"function"==typeof e.elements.set?e.elements.set(s):e.elements=[].slice.call(s)}}]),t}();a.trackedMatrix={delta:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],interpolated:[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]};var o=function(){function t(s,r,a,o){e(this,t),this.configData=s,this.uuid=a,this.target=window||n.g,this.renderer=new i.WebGLRenderer({canvas:r,context:s.renderer.context,alpha:s.renderer.alpha,premultipliedAlpha:s.renderer.premultipliedAlpha,antialias:s.renderer.antialias,stencil:s.renderer.stencil,precision:s.renderer.precision,depth:s.renderer.depth,logarithmicDepthBuffer:s.renderer.logarithmicDepthBuffer}),this.renderer.setPixelRatio(window.devicePixelRatio),this.scene=new i.Scene,t.globalScene=this.scene,this.camera=!0===o?new i.PerspectiveCamera(s.camera.fov,s.camera.ratio,s.camera.near,s.camera.far):new i.Camera,this.version="0.4.5",console.log("ARnftThreejs version: ",this.version)}return s(t,[{key:"initRenderer",value:function(){var e=this;this.camera.matrixAutoUpdate=!1,this.target.addEventListener("getProjectionMatrix",(function(t){a.setMatrix(e.camera.projectionMatrix,t.detail.proj)})),this.scene.add(this.camera);var t=new i.AmbientLight(16777215);this.scene.add(t),this.target.addEventListener("getWindowSize",(function(t){e.renderer.setSize(t.detail.sw,t.detail.sh)}));var s=new CustomEvent("onInitThreejsRendering",{detail:{renderer:this.renderer,scene:this.scene,camera:this.camera}});this.target.dispatchEvent(s)}},{key:"draw",value:function(){this.renderer.render(this.scene,this.camera)}},{key:"getRenderer",value:function(){return this.renderer}},{key:"getScene",value:function(){return this.scene}},{key:"getCamera",value:function(){return this.camera}},{key:"setRenderer",value:function(e){this.renderer=e}},{key:"setScene",value:function(e){this.scene=e}},{key:"setCamera",value:function(e){this.camera=e}}],[{key:"getGlobalScene",value:function(){return t.globalScene}}]),t}();class l extends i.Loader{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register((function(e){return new p(e)})),this.register((function(e){return new T(e)})),this.register((function(e){return new M(e)})),this.register((function(e){return new f(e)})),this.register((function(e){return new m(e)})),this.register((function(e){return new g(e)})),this.register((function(e){return new v(e)})),this.register((function(e){return new x(e)})),this.register((function(e){return new h(e)})),this.register((function(e){return new y(e)}))}load(e,t,s,n){const r=this;let a;a=""!==this.resourcePath?this.resourcePath:""!==this.path?this.path:i.LoaderUtils.extractUrlBase(e),this.manager.itemStart(e);const o=function(t){n?n(t):console.error(t),r.manager.itemError(e),r.manager.itemEnd(e)},l=new i.FileLoader(this.manager);l.setPath(this.path),l.setResponseType("arraybuffer"),l.setRequestHeader(this.requestHeader),l.setWithCredentials(this.withCredentials),l.load(e,(function(s){try{r.parse(s,a,(function(s){t(s),r.manager.itemEnd(e)}),o)}catch(e){o(e)}}),s,o)}setDRACOLoader(e){return this.dracoLoader=e,this}setDDSLoader(){throw new Error('THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".')}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,s,n){let r;const a={},o={};if("string"==typeof e)r=e;else if(i.LoaderUtils.decodeText(new Uint8Array(e,0,4))===_){try{a[u.KHR_BINARY_GLTF]=new w(e)}catch(e){return void(n&&n(e))}r=a[u.KHR_BINARY_GLTF].content}else r=i.LoaderUtils.decodeText(new Uint8Array(e));const l=JSON.parse(r);if(void 0===l.asset||l.asset.version[0]<2)return void(n&&n(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")));const c=new X(l,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});c.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e=0&&void 0===o[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}c.setExtensions(a),c.setPlugins(o),c.parse(s,n)}}function c(){let e={};return{get:function(t){return e[t]},add:function(t,s){e[t]=s},remove:function(t){delete e[t]},removeAll:function(){e={}}}}const u={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS:"KHR_materials_pbrSpecularGlossiness",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression"};class h{constructor(e){this.parser=e,this.name=u.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let s=0,n=t.length;s=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,i,a)}}class M{constructor(e){this.parser=e,this.name=u.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){const t=this.name,s=this.parser,n=s.json,r=n.textures[e];if(!r.extensions||!r.extensions[t])return null;const i=r.extensions[t],a=n.images[i.source];let o=s.textureLoader;if(a.uri){const e=s.options.manager.getHandler(a.uri);null!==e&&(o=e)}return this.detectSupport().then((function(r){if(r)return s.loadTextureImage(e,a,o);if(n.extensionsRequired&&n.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return s.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class y{constructor(e){this.name=u.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,s=t.bufferViews[e];if(s.extensions&&s.extensions[this.name]){const e=s.extensions[this.name],n=this.parser.getDependency("buffer",e.buffer),r=this.parser.options.meshoptDecoder;if(!r||!r.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return Promise.all([n,r.ready]).then((function(t){const s=e.byteOffset||0,n=e.byteLength||0,i=e.count,a=e.byteStride,o=new ArrayBuffer(i*a),l=new Uint8Array(t[0],s,n);return r.decodeGltfBuffer(new Uint8Array(o),i,a,l,e.mode,e.filter),o}))}return null}}const _="glTF";class w{constructor(e){this.name=u.KHR_BINARY_GLTF,this.content=null,this.body=null;const t=new DataView(e,0,12);if(this.header={magic:i.LoaderUtils.decodeText(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==_)throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header.");if(this.header.version<2)throw new Error("THREE.GLTFLoader: Legacy binary file detected.");const s=this.header.length-12,n=new DataView(e,12);let r=0;for(;r",t).replace("#include ",s).replace("#include ",n).replace("#include ",r).replace("#include ",a)},Object.defineProperties(this,{specular:{get:function(){return o.specular.value},set:function(e){o.specular.value=e}},specularMap:{get:function(){return o.specularMap.value},set:function(e){o.specularMap.value=e,e?this.defines.USE_SPECULARMAP="":delete this.defines.USE_SPECULARMAP}},glossiness:{get:function(){return o.glossiness.value},set:function(e){o.glossiness.value=e}},glossinessMap:{get:function(){return o.glossinessMap.value},set:function(e){o.glossinessMap.value=e,e?(this.defines.USE_GLOSSINESSMAP="",this.defines.USE_UV=""):(delete this.defines.USE_GLOSSINESSMAP,delete this.defines.USE_UV)}}}),delete this.metalness,delete this.roughness,delete this.metalnessMap,delete this.roughnessMap,this.setValues(e)}copy(e){return super.copy(e),this.specularMap=e.specularMap,this.specular.copy(e.specular),this.glossinessMap=e.glossinessMap,this.glossiness=e.glossiness,delete this.metalness,delete this.roughness,delete this.metalnessMap,delete this.roughnessMap,this}}class L{constructor(){this.name=u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS,this.specularGlossinessParams=["color","map","lightMap","lightMapIntensity","aoMap","aoMapIntensity","emissive","emissiveIntensity","emissiveMap","bumpMap","bumpScale","normalMap","normalMapType","displacementMap","displacementScale","displacementBias","specularMap","specular","glossinessMap","glossiness","alphaMap","envMap","envMapIntensity","refractionRatio"]}getMaterialType(){return A}extendParams(e,t,s){const n=t.extensions[this.name];e.color=new i.Color(1,1,1),e.opacity=1;const r=[];if(Array.isArray(n.diffuseFactor)){const t=n.diffuseFactor;e.color.fromArray(t),e.opacity=t[3]}if(void 0!==n.diffuseTexture&&r.push(s.assignTexture(e,"map",n.diffuseTexture)),e.emissive=new i.Color(0,0,0),e.glossiness=void 0!==n.glossinessFactor?n.glossinessFactor:1,e.specular=new i.Color(1,1,1),Array.isArray(n.specularFactor)&&e.specular.fromArray(n.specularFactor),void 0!==n.specularGlossinessTexture){const t=n.specularGlossinessTexture;r.push(s.assignTexture(e,"glossinessMap",t)),r.push(s.assignTexture(e,"specularMap",t))}return Promise.all(r)}createMaterial(e){const t=new A(e);return t.fog=!0,t.color=e.color,t.map=void 0===e.map?null:e.map,t.lightMap=null,t.lightMapIntensity=1,t.aoMap=void 0===e.aoMap?null:e.aoMap,t.aoMapIntensity=1,t.emissive=e.emissive,t.emissiveIntensity=1,t.emissiveMap=void 0===e.emissiveMap?null:e.emissiveMap,t.bumpMap=void 0===e.bumpMap?null:e.bumpMap,t.bumpScale=1,t.normalMap=void 0===e.normalMap?null:e.normalMap,t.normalMapType=i.TangentSpaceNormalMap,e.normalScale&&(t.normalScale=e.normalScale),t.displacementMap=null,t.displacementScale=1,t.displacementBias=0,t.specularMap=void 0===e.specularMap?null:e.specularMap,t.specular=e.specular,t.glossinessMap=void 0===e.glossinessMap?null:e.glossinessMap,t.glossiness=e.glossiness,t.alphaMap=null,t.envMap=void 0===e.envMap?null:e.envMap,t.envMapIntensity=1,t.refractionRatio=.98,t}}class S{constructor(){this.name=u.KHR_MESH_QUANTIZATION}}class b extends i.Interpolant{constructor(e,t,s,n){super(e,t,s,n)}copySampleValue_(e){const t=this.resultBuffer,s=this.sampleValues,n=this.valueSize,r=e*n*3+n;for(let e=0;e!==n;e++)t[e]=s[r+e];return t}}b.prototype.beforeStart_=b.prototype.copySampleValue_,b.prototype.afterEnd_=b.prototype.copySampleValue_,b.prototype.interpolate_=function(e,t,s,n){const r=this.resultBuffer,i=this.sampleValues,a=this.valueSize,o=2*a,l=3*a,c=n-t,u=(s-t)/c,h=u*u,d=h*u,p=e*l,f=p-l,m=-2*d+3*h,g=d-h,v=1-m,x=g-h+u;for(let e=0;e!==a;e++){const t=i[f+e+a],s=i[f+e+o]*c,n=i[p+e+a],l=i[p+e]*c;r[e]=v*t+x*s+m*n+g*l}return r};const P=new i.Quaternion;class C extends b{interpolate_(e,t,s,n){const r=super.interpolate_(e,t,s,n);return P.fromArray(r).normalize().toArray(r),r}}const F={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},I={9728:i.NearestFilter,9729:i.LinearFilter,9984:i.NearestMipmapNearestFilter,9985:i.LinearMipmapNearestFilter,9986:i.NearestMipmapLinearFilter,9987:i.LinearMipmapLinearFilter},O={33071:i.ClampToEdgeWrapping,33648:i.MirroredRepeatWrapping,10497:i.RepeatWrapping},k={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},H={POSITION:"position",NORMAL:"normal",TANGENT:"tangent",TEXCOORD_0:"uv",TEXCOORD_1:"uv2",COLOR_0:"color",WEIGHTS_0:"skinWeight",JOINTS_0:"skinIndex"},N={scale:"scale",translation:"position",rotation:"quaternion",weights:"morphTargetInfluences"},U={CUBICSPLINE:void 0,LINEAR:i.InterpolateLinear,STEP:i.InterpolateDiscrete};function D(e,t,s){for(const n in s.extensions)void 0===e[n]&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[n]=s.extensions[n])}function V(e,t){void 0!==t.extras&&("object"==typeof t.extras?Object.assign(e.userData,t.extras):console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, "+t.extras))}function G(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let s=0,n=t.weights.length;s{const s=this.associations.get(e);null!=s&&this.associations.set(t,s);for(const[s,n]of e.children.entries())r(n,t.children[s])};return r(s,n),n.name+="_instance_"+e.uses[t]++,n}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let s=0;s=2&&f.setY(t,h[e*a+1]),a>=3&&f.setZ(t,h[e*a+2]),a>=4&&f.setW(t,h[e*a+3]),a>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return f}))}loadTexture(e){const t=this.json,s=this.options,n=t.textures[e],r=t.images[n.source];let i=this.textureLoader;if(r.uri){const e=s.manager.getHandler(r.uri);null!==e&&(i=e)}return this.loadTextureImage(e,r,i)}loadTextureImage(e,t,s){const n=this,r=this.json,a=this.options,o=r.textures[e],l=(t.uri||t.bufferView)+":"+o.sampler;if(this.textureCache[l])return this.textureCache[l];const c=self.URL||self.webkitURL;let u=t.uri||"",h=!1;if(void 0!==t.bufferView)u=n.getDependency("bufferView",t.bufferView).then((function(e){h=!0;const s=new Blob([e],{type:t.mimeType});return u=c.createObjectURL(s),u}));else if(void 0===t.uri)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const d=Promise.resolve(u).then((function(e){return new Promise((function(t,n){let r=t;!0===s.isImageBitmapLoader&&(r=function(e){const s=new i.Texture(e);s.needsUpdate=!0,t(s)}),s.load(i.LoaderUtils.resolveURL(e,a.path),r,void 0,n)}))})).then((function(t){!0===h&&c.revokeObjectURL(u),t.flipY=!1,o.name&&(t.name=o.name);const s=(r.samplers||{})[o.sampler]||{};return t.magFilter=I[s.magFilter]||i.LinearFilter,t.minFilter=I[s.minFilter]||i.LinearMipmapLinearFilter,t.wrapS=O[s.wrapS]||i.RepeatWrapping,t.wrapT=O[s.wrapT]||i.RepeatWrapping,n.associations.set(t,{textures:e}),t})).catch((function(){return console.error("THREE.GLTFLoader: Couldn't load texture",u),null}));return this.textureCache[l]=d,d}assignTexture(e,t,s){const n=this;return this.getDependency("texture",s.index).then((function(r){if(void 0===s.texCoord||0==s.texCoord||"aoMap"===t&&1==s.texCoord||console.warn("THREE.GLTFLoader: Custom UV set "+s.texCoord+" for texture "+t+" not yet supported."),n.extensions[u.KHR_TEXTURE_TRANSFORM]){const e=void 0!==s.extensions?s.extensions[u.KHR_TEXTURE_TRANSFORM]:void 0;if(e){const t=n.associations.get(r);r=n.extensions[u.KHR_TEXTURE_TRANSFORM].extendTexture(r,e),n.associations.set(r,t)}}return e[t]=r,r}))}assignFinalMaterial(e){const t=e.geometry;let s=e.material;const n=void 0===t.attributes.tangent,r=void 0!==t.attributes.color,a=void 0===t.attributes.normal;if(e.isPoints){const e="PointsMaterial:"+s.uuid;let t=this.cache.get(e);t||(t=new i.PointsMaterial,i.Material.prototype.copy.call(t,s),t.color.copy(s.color),t.map=s.map,t.sizeAttenuation=!1,this.cache.add(e,t)),s=t}else if(e.isLine){const e="LineBasicMaterial:"+s.uuid;let t=this.cache.get(e);t||(t=new i.LineBasicMaterial,i.Material.prototype.copy.call(t,s),t.color.copy(s.color),this.cache.add(e,t)),s=t}if(n||r||a){let e="ClonedMaterial:"+s.uuid+":";s.isGLTFSpecularGlossinessMaterial&&(e+="specular-glossiness:"),n&&(e+="derivative-tangents:"),r&&(e+="vertex-colors:"),a&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=s.clone(),r&&(t.vertexColors=!0),a&&(t.flatShading=!0),n&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(s))),s=t}s.aoMap&&void 0===t.attributes.uv2&&void 0!==t.attributes.uv&&t.setAttribute("uv2",t.attributes.uv),e.material=s}getMaterialType(){return i.MeshStandardMaterial}loadMaterial(e){const t=this,s=this.json,n=this.extensions,r=s.materials[e];let a;const o={},l=r.extensions||{},c=[];if(l[u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS]){const e=n[u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS];a=e.getMaterialType(),c.push(e.extendParams(o,r,t))}else if(l[u.KHR_MATERIALS_UNLIT]){const e=n[u.KHR_MATERIALS_UNLIT];a=e.getMaterialType(),c.push(e.extendParams(o,r,t))}else{const s=r.pbrMetallicRoughness||{};if(o.color=new i.Color(1,1,1),o.opacity=1,Array.isArray(s.baseColorFactor)){const e=s.baseColorFactor;o.color.fromArray(e),o.opacity=e[3]}void 0!==s.baseColorTexture&&c.push(t.assignTexture(o,"map",s.baseColorTexture)),o.metalness=void 0!==s.metallicFactor?s.metallicFactor:1,o.roughness=void 0!==s.roughnessFactor?s.roughnessFactor:1,void 0!==s.metallicRoughnessTexture&&(c.push(t.assignTexture(o,"metalnessMap",s.metallicRoughnessTexture)),c.push(t.assignTexture(o,"roughnessMap",s.metallicRoughnessTexture))),a=this._invokeOne((function(t){return t.getMaterialType&&t.getMaterialType(e)})),c.push(Promise.all(this._invokeAll((function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,o)}))))}!0===r.doubleSided&&(o.side=i.DoubleSide);const h=r.alphaMode||"OPAQUE";if("BLEND"===h?(o.transparent=!0,o.depthWrite=!1):(o.format=i.RGBFormat,o.transparent=!1,"MASK"===h&&(o.alphaTest=void 0!==r.alphaCutoff?r.alphaCutoff:.5)),void 0!==r.normalTexture&&a!==i.MeshBasicMaterial&&(c.push(t.assignTexture(o,"normalMap",r.normalTexture)),o.normalScale=new i.Vector2(1,1),void 0!==r.normalTexture.scale)){const e=r.normalTexture.scale;o.normalScale.set(e,e)}return void 0!==r.occlusionTexture&&a!==i.MeshBasicMaterial&&(c.push(t.assignTexture(o,"aoMap",r.occlusionTexture)),void 0!==r.occlusionTexture.strength&&(o.aoMapIntensity=r.occlusionTexture.strength)),void 0!==r.emissiveFactor&&a!==i.MeshBasicMaterial&&(o.emissive=(new i.Color).fromArray(r.emissiveFactor)),void 0!==r.emissiveTexture&&a!==i.MeshBasicMaterial&&c.push(t.assignTexture(o,"emissiveMap",r.emissiveTexture)),Promise.all(c).then((function(){let s;return s=a===A?n[u.KHR_MATERIALS_PBR_SPECULAR_GLOSSINESS].createMaterial(o):new a(o),r.name&&(s.name=r.name),s.map&&(s.map.encoding=i.sRGBEncoding),s.emissiveMap&&(s.emissiveMap.encoding=i.sRGBEncoding),V(s,r),t.associations.set(s,{materials:e}),r.extensions&&D(n,s,r),s}))}createUniqueName(e){const t=i.PropertyBinding.sanitizeNodeName(e||"");let s=t;for(let e=1;this.nodeNamesUsed[s];++e)s=t+"_"+e;return this.nodeNamesUsed[s]=!0,s}loadGeometries(e){const t=this,s=this.extensions,n=this.primitiveCache;function r(e){return s[u.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(e,t).then((function(s){return z(s,e,t)}))}const a=[];for(let s=0,o=e.length;s0&&G(d,r),d.name=t.createUniqueName(r.name||"mesh_"+e),V(d,r),h.extensions&&D(n,d,h),t.assignFinalMaterial(d),c.push(d)}for(let s=0,n=c.length;s1?new i.Group:1===t.length?t[0]:new i.Object3D,o!==t[0])for(let e=0,s=t.length;e{const t=new Map;for(const[e,s]of r.associations)(e instanceof i.Material||e instanceof i.Texture)&&t.set(e,s);return e.traverse((e=>{const s=r.associations.get(e);null!=s&&t.set(e,s)})),t})(a),a}))}}function q(e,t,s,n){const r=s.nodes[e];return n.getDependency("node",e).then((function(e){if(void 0===r.skin)return e;let t;return n.getDependency("skin",r.skin).then((function(e){t=e;const s=[];for(let e=0,r=t.joints.length;e1)throw new Error;this.alpha=e}},{key:"filter",value:function(e,t,s){var n;return s&&this.setAlpha(s),n=this.y?this.alpha*e+(1-this.alpha)*this.s:e,this.y=e,this.s=n,n}},{key:"lastValue",value:function(){return this.y}}]),t}(),Z=function(){function t(s){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;if(e(this,t),s<=0||n<=0||i<=0)throw new Error;this.freq=s,this.minCutOff=n,this.beta=r,this.dCutOff=i,this.x=new Y(this.alpha(this.minCutOff)),this.dx=new Y(this.alpha(this.dCutOff)),this.lasttime=null,this.currValue=0,this.prevValue=this.currValue}return s(t,[{key:"alpha",value:function(e){var t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}},{key:"UpdateParams",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;this.freq=e,this.minCutOff=t,this.beta=s,this.dCutOff=n,this.x.setAlpha(this.alpha(this.minCutOff)),this.dx.setAlpha(this.alpha(this.dCutOff))}},{key:"Filter",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.prevValue=this.currValue,this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;var s=this.x.lastValue(),n=s?(e-s)*this.freq:0,r=this.dx.filter(n,t,this.alpha(this.dCutOff)),i=this.minCutOff+this.beta*Math.abs(r);return this.currValue=this.x.filter(e,t,this.alpha(i))}}]),t}(),Q=function(){function t(s){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;e(this,t),this.currValue=new i.Vector3,this.prevValue=new i.Vector3,this._freq=s,this._mincutoff=n,this._beta=r,this._dcutoff=a,this.oneEuroFilters=[],this.oneEuroFilters.push(new Z(s,n,r,a)),this.oneEuroFilters.push(new Z(s,n,r,a)),this.oneEuroFilters.push(new Z(s,n,r,a))}return s(t,[{key:"freq",get:function(){return this._freq}},{key:"beta",get:function(){return this._beta}},{key:"dcutoff",get:function(){return this._dcutoff}},{key:"mincutoff_1",get:function(){return this._mincutoff}},{key:"UpdateParams",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;this._freq=e,this._mincutoff=t,this._beta=s,this._dcutoff=n;for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:-1;this.prevValue=this.currValue;var s=new i.Vector3,n=s.toArray(),r=e.toArray();this.oneEuroFilters.forEach((function(e,s){n[s]=e.Filter(r[s],t)}));var a=new i.Vector3;return this.currValue=a.fromArray(n)}}]),t}(),J=function(){function t(s){e(this,t),this._timeOut=s,this._inDelay=!1}return s(t,[{key:"Update",value:function(e){var t=Math.floor(Date.now()/1e3);return this._inDelay||(this._prevTime=t,this._totalTime=0),this._totalTime+=t-this._prevTime,this._inDelay&&this._totalTime>this._timeOut?(this._inDelay=!1,!0):e?(this._inDelay=!0,!1):(this._inDelay=!1,!1)}}]),t}(),$=function(){function t(){e(this,t),this._hasFound=!1,this._frameDrops=0,this._deltaAccuracy=10,this.filterFrequency=30,this.filterMinCutoff=1,this.filterBeta=0,this.filterDcutoff=1,this.delayEnterCheck=new J(2),this.delayExitCheck=new J(0),this._positionFilter=new Q(this.filterFrequency),this._rotationFilter=new Q(2*this.filterFrequency)}return s(t,[{key:"update",value:function(e){var t=new i.Vector3,s=new i.Vector3,n=new i.Vector3;if(e){var r=(new i.Matrix4).fromArray(this.getArrayMatrix(e));if(this._hasFound){var a=(new i.Vector3).setFromMatrixPosition(r);if(Math.abs(a.distanceTo(this._lastTranslation))>this._deltaAccuracy)return this._frameDrops+=1,this._frameDrops>3&&(this._lastTranslation=a),[t,s,n];this._frameDrops=0,this._lastTranslation=a}else{this._hasFound=!0;var o=new i.Vector3;this._lastTranslation=o.setFromMatrixPosition(r)}this._positionFilter.UpdateParams(this.filterFrequency,this.filterMinCutoff,this.filterBeta,this.filterDcutoff),this._rotationFilter.UpdateParams(2*this.filterFrequency,this.filterMinCutoff,this.filterBeta,this.filterDcutoff),new i.Matrix4;var l=new i.Quaternion,c=new i.Euler,u=new i.Vector3(0,0,0);r.decompose(u,l,n);var h=c.setFromQuaternion(l);s=this._rotationFilter.Filter(h.toVector3()),t=this._positionFilter.Filter(u)}else this._hasFound=!1,this._frameDrops=0;return[t,s,n]}},{key:"getArrayMatrix",value:function(e){var t=[];for(var s in e)t[s]=e[s];return t}}]),t}(),ee=function(){function t(s){e(this,t),this.entities=[],this.scene=o.getGlobalScene(),this.target=window||n.g,this.uuid=s,this.names=[],this._filter=new $,this._oef=!1}return s(t,[{key:"add",value:function(e,t,s){var n=this;this.target.addEventListener("getNFTData-"+this.uuid+"-"+t,(function(t){var s=t.detail;e.position.y=s.height/s.dpi*2.54*10/2,e.position.x=s.width/s.dpi*2.54*10/2}));var r=new i.Object3D;r.name="root-"+t,this.scene.add(r),r.add(e),this.target.addEventListener("getMatrixGL_RH-"+this.uuid+"-"+t,(function(t){if(r.visible=!0,e.visible=!0,!0===n._oef){var s=(new i.Vector3(0,0,0),new i.Vector3(0,0,0),new i.Vector3(0,0,0));s=n._filter.update(t.detail.matrixGL_RH),r.position.setX(s[0].x),r.position.setY(s[0].y),r.position.setZ(s[0].z),r.rotation.setFromVector3(s[1]),r.scale.setX(s[2].x),r.scale.setY(s[2].y),r.scale.setZ(s[2].z)}else{r.matrixAutoUpdate=!1;var o=a.interpolate(t.detail.matrixGL_RH);a.setMatrix(r.matrix,o)}})),this.target.addEventListener("nftTrackingLost-"+this.uuid+"-"+t,(function(t){r.visible=s,e.visible=s})),this.names.push(t),this.entities.push({name:t})}},{key:"addModel",value:function(e,t,s,n){var r,o=this,c=new i.Object3D;c.name="root-"+t,this.scene.add(c),(new l).load(e,(function(e){(r=e.scene).scale.set(s,s,s),r.rotation.x=Math.PI/2,o.target.addEventListener("getNFTData-"+o.uuid+"-"+t,(function(e){var t=e.detail;r.position.y=t.height/t.dpi*2.54*10/2,r.position.x=t.width/t.dpi*2.54*10/2})),c.add(r)})),this.target.addEventListener("getMatrixGL_RH-"+this.uuid+"-"+t,(function(e){if(c.visible=!0,r.visible=!0,!0===o._oef){var t=(new i.Vector3(0,0,0),new i.Vector3(0,0,0),new i.Vector3(0,0,0));t=o._filter.update(e.detail.matrixGL_RH),c.position.setX(t[0].x),c.position.setY(t[0].y),c.position.setZ(t[0].z),c.rotation.setFromVector3(t[1]),c.scale.setX(t[2].x),c.scale.setY(t[2].y),c.scale.setZ(t[2].z)}else{c.matrixAutoUpdate=!1;var s=a.interpolate(e.detail.matrixGL_RH);a.setMatrix(c.matrix,s)}})),this.target.addEventListener("nftTrackingLost-"+this.uuid+"-"+t,(function(e){c.visible=n,r.visible=n})),this.names.push(t)}},{key:"addModelWithCallback",value:function(e,t,s,n){var r,o=this,c=new i.Object3D;c.name="root-"+t,this.scene.add(c),(new l).load(e,(function(e){r=e.scene,o.target.addEventListener("getNFTData-"+o.uuid+"-"+t,(function(e){var t=e.detail;r.position.y=t.height/t.dpi*2.54*10/2,r.position.x=t.width/t.dpi*2.54*10/2})),s(e),c.add(r)})),this.target.addEventListener("getMatrixGL_RH-"+this.uuid+"-"+t,(function(e){if(c.visible=!0,r.visible=!0,!0===o._oef){var t=(new i.Vector3(0,0,0),new i.Vector3(0,0,0),new i.Vector3(0,0,0));t=o._filter.update(e.detail.matrixGL_RH),c.position.setX(t[0].x),c.position.setY(t[0].y),c.position.setZ(t[0].z),c.rotation.setFromVector3(t[1]),c.scale.setX(t[2].x),c.scale.setY(t[2].y),c.scale.setZ(t[2].z)}else{c.matrixAutoUpdate=!1;var s=a.interpolate(e.detail.matrixGL_RH);a.setMatrix(c.matrix,s)}})),this.target.addEventListener("nftTrackingLost-"+this.uuid+"-"+t,(function(e){c.visible=n,r.visible=n})),this.names.push(t)}},{key:"addImage",value:function(e,t,s,n,r,o){var l=this,c=new i.Object3D;c.name="root-"+t,this.scene.add(c);var u=new i.PlaneGeometry(r.w,r.h,r.ws,r.hs),h=(new i.TextureLoader).load(e),d=new i.MeshStandardMaterial({color:s,map:h}),p=new i.Mesh(u,d);p.scale.set(n,n,n),this.target.addEventListener("getNFTData-"+this.uuid+"-"+t,(function(e){var t=e.detail;p.position.y=t.height/t.dpi*2.54*10/2,p.position.x=t.width/t.dpi*2.54*10/2})),c.add(p),this.target.addEventListener("getMatrixGL_RH-"+this.uuid+"-"+t,(function(e){if(c.visible=!0,p.visible=!0,!0===l._oef){var t=(new i.Vector3(0,0,0),new i.Vector3(0,0,0),new i.Vector3(0,0,0));t=l._filter.update(e.detail.matrixGL_RH),c.position.setX(t[0].x),c.position.setY(t[0].y),c.position.setZ(t[0].z),c.rotation.setFromVector3(t[1]),c.scale.setX(t[2].x),c.scale.setY(t[2].y),c.scale.setZ(t[2].z)}else{c.matrixAutoUpdate=!1;var s=a.interpolate(e.detail.matrixGL_RH);a.setMatrix(c.matrix,s)}})),this.target.addEventListener("nftTrackingLost-"+this.uuid+"-"+t,(function(e){c.visible=o,p.visible=o})),this.names.push(t)}},{key:"addVideo",value:function(e,t,s,n,r){var o=this,l=new i.Object3D;l.name="root-"+t,this.scene.add(l);var c=document.getElementById(e),u=new i.VideoTexture(c),h=new i.MeshStandardMaterial({color:12303359,map:u});c.play();var d=new i.PlaneGeometry(n.w,n.h,n.ws,n.hs),p=new i.Mesh(d,h);p.scale.set(s,s,s),this.target.addEventListener("getNFTData-"+this.uuid+"-"+t,(function(e){var t=e.detail;p.position.y=t.height/t.dpi*2.54*10/2,p.position.x=t.width/t.dpi*2.54*10/2})),l.add(p),this.target.addEventListener("getMatrixGL_RH-"+this.uuid+"-"+t,(function(e){if(l.visible=!0,p.visible=!0,!0===o._oef){var t=(new i.Vector3(0,0,0),new i.Vector3(0,0,0),new i.Vector3(0,0,0));t=o._filter.update(e.detail.matrixGL_RH),l.position.setX(t[0].x),l.position.setY(t[0].y),l.position.setZ(t[0].z),l.rotation.setFromVector3(t[1]),l.scale.setX(t[2].x),l.scale.setY(t[2].y),l.scale.setZ(t[2].z)}else{l.matrixAutoUpdate=!1;var s=a.interpolate(e.detail.matrixGL_RH);a.setMatrix(l.matrix,s)}})),this.target.addEventListener("nftTrackingLost-"+this.uuid+"-"+t,(function(e){l.visible=r,p.visible=r})),this.names.push(t)}},{key:"getNames",value:function(){return this.names}},{key:"oef",get:function(){return this._oef},set:function(e){this._oef=e}}]),t}();const te={SceneRendererTJS:o,NFTaddTJS:ee}})(),r.default})()})); +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QXdkLFFBQVEsRUFBRyxFQUFHLEdBQUksSUFBSSxFQUFBQSxRQUFRLEVBQUcsRUFBRyxHQUFJLElBQUksRUFBQUEsUUFBUSxFQUFHLEVBQUcsSUFDNUV4ZCxFQUFTLEVBQUtna0IsUUFBUU8sT0FBT3YwQixFQUFHRSxPQUFPczBCLGFBQ3ZDbjZCLEVBQUt1TyxTQUFTaVosS0FBSzdSLEVBQU8sR0FBR2lnQixHQUM3QjUxQixFQUFLdU8sU0FBU2taLEtBQUs5UixFQUFPLEdBQUd5VSxHQUM3QnBxQixFQUFLdU8sU0FBU21aLEtBQUsvUixFQUFPLEdBQUd5a0IsR0FDN0JwNkIsRUFBS2lZLFNBQVNvaUIsZUFBZTFrQixFQUFPLElBQ3BDM1YsRUFBS3NSLE1BQU1rVyxLQUFLN1IsRUFBTyxHQUFHaWdCLEdBQzFCNTFCLEVBQUtzUixNQUFNbVcsS0FBSzlSLEVBQU8sR0FBR3lVLEdBQzFCcHFCLEVBQUtzUixNQUFNb1csS0FBSy9SLEVBQU8sR0FBR3lrQixPQUN2QixDQUNIcDZCLEVBQUt5RixrQkFBbUIsRUFDeEIsSUFBTWpDLEVBQVNSLEVBQU1zM0IsWUFBWTMwQixFQUFHRSxPQUFPczBCLGFBQzNDbjNCLEVBQUEsVUFBZ0JoRCxFQUFLd0QsT0FBUUEsT0FHckNqRCxLQUFLK0IsT0FBT29ELGlCQUFpQixtQkFBcUJuRixLQUFLMEQsS0FBTyxJQUFNK0csR0FBTSxTQUFDckYsR0FDdkUzRixFQUFLaTZCLFFBQVVKLEVBQ2ZtQixFQUFNZixRQUFVSixLQUVwQnQ1QixLQUFLbTVCLE1BQU01dkIsS0FBS2tCLEssc0JBT2IsV0FDSCxPQUFPekssS0FBS201QixRLGVBY2hCLFdBQ0ksT0FBT241QixLQUFLcTVCLE0sSUFUaEIsU0FBZTBCLEdBQ1gvNkIsS0FBS3E1QixLQUFPMEIsTSxFQS9SQyxHQzdDckIsVUFBaUJ4M0IsaUJBQUFBLEVBQWtCeTFCLFVBQUFBLEsiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0FSbmZ0VGhyZWVqcy9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInRocmVlXCIsXCJjb21tb25qczJcIjpcInRocmVlXCIsXCJhbWRcIjpcInRocmVlXCIsXCJyb290XCI6XCJUSFJFRVwifSIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQVJuZnRUaHJlZWpzL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY2xhc3NDYWxsQ2hlY2suanMiLCJ3ZWJwYWNrOi8vQVJuZnRUaHJlZWpzLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2NyZWF0ZUNsYXNzLmpzIiwid2VicGFjazovL0FSbmZ0VGhyZWVqcy8uL3NyYy91dGlscy9VdGlscy50cyIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvLi9zcmMvU2NlbmVSZW5kZXJlclRKUy50cyIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvLi9ub2RlX21vZHVsZXMvdGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvR0xURkxvYWRlci5qcyIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvLi9zcmMvZmlsdGVycy9PbmVFdXJvRmlsdGVyLnRzIiwid2VicGFjazovL0FSbmZ0VGhyZWVqcy8uL3NyYy9maWx0ZXJzL0RlbGF5YWJsZVNpZ25hbEZpbHRlci50cyIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvLi9zcmMvZmlsdGVycy9BUm5mdEZpbHRlci50cyIsIndlYnBhY2s6Ly9BUm5mdFRocmVlanMvLi9zcmMvbWFya2VybWVkaWEvTkZUYWRkVEpTLnRzIiwid2VicGFjazovL0FSbmZ0VGhyZWVqcy8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJ0aHJlZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJ0aHJlZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJBUm5mdFRocmVlanNcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJ0aHJlZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiQVJuZnRUaHJlZWpzXCJdID0gZmFjdG9yeShyb290W1wiVEhSRUVcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMzgxX18pIHtcbnJldHVybiAiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzM4MV9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufSIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn0iLCJleHBvcnQgZnVuY3Rpb24gZ2V0VGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKTtcbn1cbmV4cG9ydCBjbGFzcyBVdGlscyB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgdHJhY2tlZE1hdHJpeDogYW55ID0ge1xuICAgICAgICAvLyBmb3IgaW50ZXJwb2xhdGlvblxuICAgICAgICBkZWx0YTogWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdLFxuICAgICAgICBpbnRlcnBvbGF0ZWQ6IFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSxcbiAgICB9O1xuICAgIC8vcHJpdmF0ZSBzdGF0aWMgaW50ZXJwb2xhdGlvbkZhY3RvcjogbnVtYmVyID0gMjRcbiAgICBzdGF0aWMgaW50ZXJwb2xhdGUod29ybGQ6IGFueSkge1xuICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uRmFjdG9yID0gMjQ7XG5cbiAgICAgICAgLy8gaW50ZXJwb2xhdGUgbWF0cml4XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgdGhpcy50cmFja2VkTWF0cml4LmRlbHRhW2ldID0gd29ybGRbaV0gLSB0aGlzLnRyYWNrZWRNYXRyaXguaW50ZXJwb2xhdGVkW2ldO1xuICAgICAgICAgICAgdGhpcy50cmFja2VkTWF0cml4LmludGVycG9sYXRlZFtpXSA9XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja2VkTWF0cml4LmludGVycG9sYXRlZFtpXSArIHRoaXMudHJhY2tlZE1hdHJpeC5kZWx0YVtpXSAvIGludGVycG9sYXRpb25GYWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tlZE1hdHJpeC5pbnRlcnBvbGF0ZWQ7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzTW9iaWxlKCkge1xuICAgICAgICByZXR1cm4gL0FuZHJvaWR8bW9iaWxlfGlQYWR8aVBob25lL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0TWF0cml4KG1hdHJpeDogYW55LCB2YWx1ZTogYW55KSB7XG4gICAgICAgIGNvbnN0IGFycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGFycmF5W2tleV0gPSB2YWx1ZVtrZXldO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWF0cml4LmVsZW1lbnRzLnNldCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBtYXRyaXguZWxlbWVudHMuc2V0KGFycmF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1hdHJpeC5lbGVtZW50cyA9IFtdLnNsaWNlLmNhbGwoYXJyYXkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSBcInRocmVlXCI7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gXCIuL3V0aWxzL1V0aWxzXCI7XG5cbmludGVyZmFjZSBDb25maWdEYXRhIHtcbiAgICBjYW1lcmE6IHtcbiAgICAgICAgZmFyOiBudW1iZXI7XG4gICAgICAgIGZvdjogbnVtYmVyO1xuICAgICAgICBtYXRyaXhBdXRvVXBkYXRlOiBib29sZWFuO1xuICAgICAgICBuZWFyOiBudW1iZXI7XG4gICAgICAgIHJhdGlvOiBudW1iZXI7XG4gICAgfTtcbiAgICByZW5kZXJlcjoge1xuICAgICAgICBhbHBoYTogYm9vbGVhbjtcbiAgICAgICAgYW50aWFsaWFzOiBib29sZWFuO1xuICAgICAgICBjb250ZXh0OiBhbnk7XG4gICAgICAgIGRlcHRoOiBib29sZWFuO1xuICAgICAgICBsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBib29sZWFuO1xuICAgICAgICBwcmVjaXNpb246IHN0cmluZztcbiAgICAgICAgc3RlbmNpbDogYm9vbGVhbjtcbiAgICAgICAgcHJlbXVsdGlwbGllZEFscGhhOiBib29sZWFuO1xuICAgICAgICBvYmpWaXNpYmlsaXR5OiBib29sZWFuO1xuICAgIH07XG59XG5cbmludGVyZmFjZSBSb290IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Qge1xuICAgIC8vbWF0cml4OiBvYmplY3Rcbn1cblxuaW50ZXJmYWNlIFJlbmRlcmVyIHtcbiAgICByZW5kZXI6IChzY2VuZTogVEhSRUUuU2NlbmUsIGNhbWVyYTogVEhSRUUuQ2FtZXJhKSA9PiB2b2lkO1xuICAgIHNldFBpeGVsUmF0aW86IChwaXhlbFJhdGlvOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgc2V0U2l6ZTogKHc6IG51bWJlciwgaDogbnVtYmVyKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQ2FtZXJhIGV4dGVuZHMgVEhSRUUuQ2FtZXJhIHtcbiAgICBtYXRyaXhBdXRvVXBkYXRlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgU2NlbmUgZXh0ZW5kcyBUSFJFRS5TY2VuZSB7XG4gICAgYWRkOiAobm9kZTogVEhSRUUuT2JqZWN0M0QpID0+IHRoaXM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjZW5lUmVuZGVyZXJUSlMge1xuICAgIHB1YmxpYyBjYW52YXNfZHJhdzogSFRNTENhbnZhc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSBjYW1lcmE6IENhbWVyYTtcbiAgICBwcml2YXRlIGNvbmZpZ0RhdGE6IENvbmZpZ0RhdGE7XG4gICAgcHVibGljIHJlbmRlcmVyOiBSZW5kZXJlcjtcbiAgICBwcml2YXRlIHV1aWQ6IHN0cmluZztcbiAgICBwcml2YXRlIHJvb3Q6IFJvb3Q7XG4gICAgcHJpdmF0ZSB0YXJnZXQ6IEV2ZW50VGFyZ2V0O1xuICAgIHByaXZhdGUgc2NlbmU6IFNjZW5lO1xuICAgIHByaXZhdGUgc3RhdGljIGdsb2JhbFNjZW5lOiBTY2VuZTtcbiAgICBwcml2YXRlIHZlcnNpb246IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZ0RhdGE6IENvbmZpZ0RhdGEsIGNhbnZhc0RyYXc6IEhUTUxDYW52YXNFbGVtZW50LCB1dWlkOiBzdHJpbmcsIGNhbWVyYUJvb2w6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jb25maWdEYXRhID0gY29uZmlnRGF0YTtcbiAgICAgICAgdGhpcy51dWlkID0gdXVpZDtcbiAgICAgICAgdGhpcy50YXJnZXQgPSB3aW5kb3cgfHwgZ2xvYmFsO1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe1xuICAgICAgICAgICAgY2FudmFzOiBjYW52YXNEcmF3LFxuICAgICAgICAgICAgY29udGV4dDogY29uZmlnRGF0YS5yZW5kZXJlci5jb250ZXh0LFxuICAgICAgICAgICAgYWxwaGE6IGNvbmZpZ0RhdGEucmVuZGVyZXIuYWxwaGEsXG4gICAgICAgICAgICBwcmVtdWx0aXBsaWVkQWxwaGE6IGNvbmZpZ0RhdGEucmVuZGVyZXIucHJlbXVsdGlwbGllZEFscGhhLFxuICAgICAgICAgICAgYW50aWFsaWFzOiBjb25maWdEYXRhLnJlbmRlcmVyLmFudGlhbGlhcyxcbiAgICAgICAgICAgIHN0ZW5jaWw6IGNvbmZpZ0RhdGEucmVuZGVyZXIuc3RlbmNpbCxcbiAgICAgICAgICAgIHByZWNpc2lvbjogY29uZmlnRGF0YS5yZW5kZXJlci5wcmVjaXNpb24sXG4gICAgICAgICAgICBkZXB0aDogY29uZmlnRGF0YS5yZW5kZXJlci5kZXB0aCxcbiAgICAgICAgICAgIGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGNvbmZpZ0RhdGEucmVuZGVyZXIubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyk7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBuZXcgVEhSRUUuU2NlbmUoKTtcbiAgICAgICAgU2NlbmVSZW5kZXJlclRKUy5nbG9iYWxTY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICAgIGlmIChjYW1lcmFCb29sID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYShcbiAgICAgICAgICAgICAgICBjb25maWdEYXRhLmNhbWVyYS5mb3YsXG4gICAgICAgICAgICAgICAgY29uZmlnRGF0YS5jYW1lcmEucmF0aW8sXG4gICAgICAgICAgICAgICAgY29uZmlnRGF0YS5jYW1lcmEubmVhcixcbiAgICAgICAgICAgICAgICBjb25maWdEYXRhLmNhbWVyYS5mYXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhbWVyYSA9IG5ldyBUSFJFRS5DYW1lcmEoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcnNpb24gPSBcIjAuNC41XCI7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiQVJuZnRUaHJlZWpzIHZlcnNpb246IFwiLCB0aGlzLnZlcnNpb24pO1xuICAgIH1cblxuICAgIGluaXRSZW5kZXJlcigpIHtcbiAgICAgICAgdGhpcy5jYW1lcmEubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwiZ2V0UHJvamVjdGlvbk1hdHJpeFwiLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgVXRpbHMuc2V0TWF0cml4KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGV2LmRldGFpbC5wcm9qKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMuY2FtZXJhKTtcblxuICAgICAgICBjb25zdCBsaWdodCA9IG5ldyBUSFJFRS5BbWJpZW50TGlnaHQoMHhmZmZmZmYpO1xuICAgICAgICB0aGlzLnNjZW5lLmFkZChsaWdodCk7XG5cbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcImdldFdpbmRvd1NpemVcIiwgKF9ldjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUoX2V2LmRldGFpbC5zdywgX2V2LmRldGFpbC5zaCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHNldEluaXRSZW5kZXJlckV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KFwib25Jbml0VGhyZWVqc1JlbmRlcmluZ1wiLCB7XG4gICAgICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAgICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlcixcbiAgICAgICAgICAgICAgICBzY2VuZTogdGhpcy5zY2VuZSxcbiAgICAgICAgICAgICAgICBjYW1lcmE6IHRoaXMuY2FtZXJhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmRpc3BhdGNoRXZlbnQoc2V0SW5pdFJlbmRlcmVyRXZlbnQpO1xuICAgIH1cblxuICAgIGRyYXcoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcbiAgICB9XG5cbiAgICAvLyBnZXR0ZXJzXG5cbiAgICBnZXRSZW5kZXJlcigpOiBSZW5kZXJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbmRlcmVyO1xuICAgIH1cblxuICAgIGdldFNjZW5lKCk6IFNjZW5lIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NlbmU7XG4gICAgfVxuXG4gICAgZ2V0Q2FtZXJhKCk6IENhbWVyYSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbWVyYTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0R2xvYmFsU2NlbmUoKTogU2NlbmUge1xuICAgICAgICByZXR1cm4gU2NlbmVSZW5kZXJlclRKUy5nbG9iYWxTY2VuZTtcbiAgICB9XG5cbiAgICAvLyBzZXR0ZXJzXG5cbiAgICBzZXRSZW5kZXJlcihyZW5kZXJlcjogUmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgIH1cblxuICAgIHNldFNjZW5lKHNjZW5lOiBTY2VuZSkge1xuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgfVxuXG4gICAgc2V0Q2FtZXJhKGNhbWVyYTogQ2FtZXJhKSB7XG4gICAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuICAgIH1cblxuICAgIC8vIHRpY2sgdG8gYmUgaW1wbGVtZW50ZWRcbiAgICAvKiB0aWNrICgpIHtcbiAgICB0aGlzLmRyYXcoKVxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy50aWNrKVxuICB9Ki9cbn1cbiIsImltcG9ydCB7XG5cdEFuaW1hdGlvbkNsaXAsXG5cdEJvbmUsXG5cdEJveDMsXG5cdEJ1ZmZlckF0dHJpYnV0ZSxcblx0QnVmZmVyR2VvbWV0cnksXG5cdENsYW1wVG9FZGdlV3JhcHBpbmcsXG5cdENvbG9yLFxuXHREaXJlY3Rpb25hbExpZ2h0LFxuXHREb3VibGVTaWRlLFxuXHRGaWxlTG9hZGVyLFxuXHRGcm9udFNpZGUsXG5cdEdyb3VwLFxuXHRJbWFnZUJpdG1hcExvYWRlcixcblx0SW50ZXJsZWF2ZWRCdWZmZXIsXG5cdEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLFxuXHRJbnRlcnBvbGFudCxcblx0SW50ZXJwb2xhdGVEaXNjcmV0ZSxcblx0SW50ZXJwb2xhdGVMaW5lYXIsXG5cdExpbmUsXG5cdExpbmVCYXNpY01hdGVyaWFsLFxuXHRMaW5lTG9vcCxcblx0TGluZVNlZ21lbnRzLFxuXHRMaW5lYXJGaWx0ZXIsXG5cdExpbmVhck1pcG1hcExpbmVhckZpbHRlcixcblx0TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcixcblx0TG9hZGVyLFxuXHRMb2FkZXJVdGlscyxcblx0TWF0ZXJpYWwsXG5cdE1hdGhVdGlscyxcblx0TWF0cml4NCxcblx0TWVzaCxcblx0TWVzaEJhc2ljTWF0ZXJpYWwsXG5cdE1lc2hQaHlzaWNhbE1hdGVyaWFsLFxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0TWlycm9yZWRSZXBlYXRXcmFwcGluZyxcblx0TmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcixcblx0TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsXG5cdE51bWJlcktleWZyYW1lVHJhY2ssXG5cdE9iamVjdDNELFxuXHRPcnRob2dyYXBoaWNDYW1lcmEsXG5cdFBlcnNwZWN0aXZlQ2FtZXJhLFxuXHRQb2ludExpZ2h0LFxuXHRQb2ludHMsXG5cdFBvaW50c01hdGVyaWFsLFxuXHRQcm9wZXJ0eUJpbmRpbmcsXG5cdFF1YXRlcm5pb24sXG5cdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLFxuXHRSR0JGb3JtYXQsXG5cdFJlcGVhdFdyYXBwaW5nLFxuXHRTa2VsZXRvbixcblx0U2tpbm5lZE1lc2gsXG5cdFNwaGVyZSxcblx0U3BvdExpZ2h0LFxuXHRUYW5nZW50U3BhY2VOb3JtYWxNYXAsXG5cdFRleHR1cmUsXG5cdFRleHR1cmVMb2FkZXIsXG5cdFRyaWFuZ2xlRmFuRHJhd01vZGUsXG5cdFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSxcblx0VmVjdG9yMixcblx0VmVjdG9yMyxcblx0VmVjdG9yS2V5ZnJhbWVUcmFjayxcblx0c1JHQkVuY29kaW5nXG59IGZyb20gJ3RocmVlJztcblxuY2xhc3MgR0xURkxvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdFx0dGhpcy5kcmFjb0xvYWRlciA9IG51bGw7XG5cdFx0dGhpcy5rdHgyTG9hZGVyID0gbnVsbDtcblx0XHR0aGlzLm1lc2hvcHREZWNvZGVyID0gbnVsbDtcblxuXHRcdHRoaXMucGx1Z2luQ2FsbGJhY2tzID0gW107XG5cblx0XHR0aGlzLnJlZ2lzdGVyKCBmdW5jdGlvbiAoIHBhcnNlciApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBHTFRGTWF0ZXJpYWxzQ2xlYXJjb2F0RXh0ZW5zaW9uKCBwYXJzZXIgKTtcblxuXHRcdH0gKTtcblxuXHRcdHRoaXMucmVnaXN0ZXIoIGZ1bmN0aW9uICggcGFyc2VyICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IEdMVEZUZXh0dXJlQmFzaXNVRXh0ZW5zaW9uKCBwYXJzZXIgKTtcblxuXHRcdH0gKTtcblxuXHRcdHRoaXMucmVnaXN0ZXIoIGZ1bmN0aW9uICggcGFyc2VyICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IEdMVEZUZXh0dXJlV2ViUEV4dGVuc2lvbiggcGFyc2VyICk7XG5cblx0XHR9ICk7XG5cblx0XHR0aGlzLnJlZ2lzdGVyKCBmdW5jdGlvbiAoIHBhcnNlciApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBHTFRGTWF0ZXJpYWxzU2hlZW5FeHRlbnNpb24oIHBhcnNlciApO1xuXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5yZWdpc3RlciggZnVuY3Rpb24gKCBwYXJzZXIgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgR0xURk1hdGVyaWFsc1RyYW5zbWlzc2lvbkV4dGVuc2lvbiggcGFyc2VyICk7XG5cblx0XHR9ICk7XG5cblx0XHR0aGlzLnJlZ2lzdGVyKCBmdW5jdGlvbiAoIHBhcnNlciApIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBHTFRGTWF0ZXJpYWxzVm9sdW1lRXh0ZW5zaW9uKCBwYXJzZXIgKTtcblxuXHRcdH0gKTtcblxuXHRcdHRoaXMucmVnaXN0ZXIoIGZ1bmN0aW9uICggcGFyc2VyICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IEdMVEZNYXRlcmlhbHNJb3JFeHRlbnNpb24oIHBhcnNlciApO1xuXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5yZWdpc3RlciggZnVuY3Rpb24gKCBwYXJzZXIgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgR0xURk1hdGVyaWFsc1NwZWN1bGFyRXh0ZW5zaW9uKCBwYXJzZXIgKTtcblxuXHRcdH0gKTtcblxuXHRcdHRoaXMucmVnaXN0ZXIoIGZ1bmN0aW9uICggcGFyc2VyICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IEdMVEZMaWdodHNFeHRlbnNpb24oIHBhcnNlciApO1xuXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5yZWdpc3RlciggZnVuY3Rpb24gKCBwYXJzZXIgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgR0xURk1lc2hvcHRDb21wcmVzc2lvbiggcGFyc2VyICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdGxvYWQoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0bGV0IHJlc291cmNlUGF0aDtcblxuXHRcdGlmICggdGhpcy5yZXNvdXJjZVBhdGggIT09ICcnICkge1xuXG5cdFx0XHRyZXNvdXJjZVBhdGggPSB0aGlzLnJlc291cmNlUGF0aDtcblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMucGF0aCAhPT0gJycgKSB7XG5cblx0XHRcdHJlc291cmNlUGF0aCA9IHRoaXMucGF0aDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlc291cmNlUGF0aCA9IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdC8vIFRlbGxzIHRoZSBMb2FkaW5nTWFuYWdlciB0byB0cmFjayBhbiBleHRyYSBpdGVtLCB3aGljaCByZXNvbHZlcyBhZnRlclxuXHRcdC8vIHRoZSBtb2RlbCBpcyBmdWxseSBsb2FkZWQuIFRoaXMgbWVhbnMgdGhlIGNvdW50IG9mIGl0ZW1zIGxvYWRlZCB3aWxsXG5cdFx0Ly8gYmUgaW5jb3JyZWN0LCBidXQgZW5zdXJlcyBtYW5hZ2VyLm9uTG9hZCgpIGRvZXMgbm90IGZpcmUgZWFybHkuXG5cdFx0dGhpcy5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRjb25zdCBfb25FcnJvciA9IGZ1bmN0aW9uICggZSApIHtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkge1xuXG5cdFx0XHRcdG9uRXJyb3IoIGUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH07XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHNjb3BlLnBhcnNlKCBkYXRhLCByZXNvdXJjZVBhdGgsIGZ1bmN0aW9uICggZ2x0ZiApIHtcblxuXHRcdFx0XHRcdG9uTG9hZCggZ2x0ZiApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCBfb25FcnJvciApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRfb25FcnJvciggZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBfb25FcnJvciApO1xuXG5cdH1cblxuXHRzZXREUkFDT0xvYWRlciggZHJhY29Mb2FkZXIgKSB7XG5cblx0XHR0aGlzLmRyYWNvTG9hZGVyID0gZHJhY29Mb2FkZXI7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEREU0xvYWRlcigpIHtcblxuXHRcdHRocm93IG5ldyBFcnJvcihcblxuXHRcdFx0J1RIUkVFLkdMVEZMb2FkZXI6IFwiTVNGVF90ZXh0dXJlX2Rkc1wiIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFBsZWFzZSB1cGRhdGUgdG8gXCJLSFJfdGV4dHVyZV9iYXNpc3VcIi4nXG5cblx0XHQpO1xuXG5cdH1cblxuXHRzZXRLVFgyTG9hZGVyKCBrdHgyTG9hZGVyICkge1xuXG5cdFx0dGhpcy5rdHgyTG9hZGVyID0ga3R4MkxvYWRlcjtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0TWVzaG9wdERlY29kZXIoIG1lc2hvcHREZWNvZGVyICkge1xuXG5cdFx0dGhpcy5tZXNob3B0RGVjb2RlciA9IG1lc2hvcHREZWNvZGVyO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyZWdpc3RlciggY2FsbGJhY2sgKSB7XG5cblx0XHRpZiAoIHRoaXMucGx1Z2luQ2FsbGJhY2tzLmluZGV4T2YoIGNhbGxiYWNrICkgPT09IC0gMSApIHtcblxuXHRcdFx0dGhpcy5wbHVnaW5DYWxsYmFja3MucHVzaCggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR1bnJlZ2lzdGVyKCBjYWxsYmFjayApIHtcblxuXHRcdGlmICggdGhpcy5wbHVnaW5DYWxsYmFja3MuaW5kZXhPZiggY2FsbGJhY2sgKSAhPT0gLSAxICkge1xuXG5cdFx0XHR0aGlzLnBsdWdpbkNhbGxiYWNrcy5zcGxpY2UoIHRoaXMucGx1Z2luQ2FsbGJhY2tzLmluZGV4T2YoIGNhbGxiYWNrICksIDEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRwYXJzZSggZGF0YSwgcGF0aCwgb25Mb2FkLCBvbkVycm9yICkge1xuXG5cdFx0bGV0IGNvbnRlbnQ7XG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IHt9O1xuXHRcdGNvbnN0IHBsdWdpbnMgPSB7fTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0XHRjb250ZW50ID0gZGF0YTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IG1hZ2ljID0gTG9hZGVyVXRpbHMuZGVjb2RlVGV4dCggbmV3IFVpbnQ4QXJyYXkoIGRhdGEsIDAsIDQgKSApO1xuXG5cdFx0XHRpZiAoIG1hZ2ljID09PSBCSU5BUllfRVhURU5TSU9OX0hFQURFUl9NQUdJQyApIHtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0ZXh0ZW5zaW9uc1sgRVhURU5TSU9OUy5LSFJfQklOQVJZX0dMVEYgXSA9IG5ldyBHTFRGQmluYXJ5RXh0ZW5zaW9uKCBkYXRhICk7XG5cblx0XHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnRlbnQgPSBleHRlbnNpb25zWyBFWFRFTlNJT05TLktIUl9CSU5BUllfR0xURiBdLmNvbnRlbnQ7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29udGVudCA9IExvYWRlclV0aWxzLmRlY29kZVRleHQoIG5ldyBVaW50OEFycmF5KCBkYXRhICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QganNvbiA9IEpTT04ucGFyc2UoIGNvbnRlbnQgKTtcblxuXHRcdGlmICgganNvbi5hc3NldCA9PT0gdW5kZWZpbmVkIHx8IGpzb24uYXNzZXQudmVyc2lvblsgMCBdIDwgMiApIHtcblxuXHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggbmV3IEVycm9yKCAnVEhSRUUuR0xURkxvYWRlcjogVW5zdXBwb3J0ZWQgYXNzZXQuIGdsVEYgdmVyc2lvbnMgPj0yLjAgYXJlIHN1cHBvcnRlZC4nICkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHBhcnNlciA9IG5ldyBHTFRGUGFyc2VyKCBqc29uLCB7XG5cblx0XHRcdHBhdGg6IHBhdGggfHwgdGhpcy5yZXNvdXJjZVBhdGggfHwgJycsXG5cdFx0XHRjcm9zc09yaWdpbjogdGhpcy5jcm9zc09yaWdpbixcblx0XHRcdHJlcXVlc3RIZWFkZXI6IHRoaXMucmVxdWVzdEhlYWRlcixcblx0XHRcdG1hbmFnZXI6IHRoaXMubWFuYWdlcixcblx0XHRcdGt0eDJMb2FkZXI6IHRoaXMua3R4MkxvYWRlcixcblx0XHRcdG1lc2hvcHREZWNvZGVyOiB0aGlzLm1lc2hvcHREZWNvZGVyXG5cblx0XHR9ICk7XG5cblx0XHRwYXJzZXIuZmlsZUxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMucGx1Z2luQ2FsbGJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgcGx1Z2luID0gdGhpcy5wbHVnaW5DYWxsYmFja3NbIGkgXSggcGFyc2VyICk7XG5cdFx0XHRwbHVnaW5zWyBwbHVnaW4ubmFtZSBdID0gcGx1Z2luO1xuXG5cdFx0XHQvLyBXb3JrYXJvdW5kIHRvIGF2b2lkIGRldGVybWluaW5nIGFzIHVua25vd24gZXh0ZW5zaW9uXG5cdFx0XHQvLyBpbiBhZGRVbmtub3duRXh0ZW5zaW9uc1RvVXNlckRhdGEoKS5cblx0XHRcdC8vIFJlbW92ZSB0aGlzIHdvcmthcm91bmQgaWYgd2UgbW92ZSBhbGwgdGhlIGV4aXN0aW5nXG5cdFx0XHQvLyBleHRlbnNpb24gaGFuZGxlcnMgdG8gcGx1Z2luIHN5c3RlbVxuXHRcdFx0ZXh0ZW5zaW9uc1sgcGx1Z2luLm5hbWUgXSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uZXh0ZW5zaW9uc1VzZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGpzb24uZXh0ZW5zaW9uc1VzZWQubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRcdGNvbnN0IGV4dGVuc2lvbk5hbWUgPSBqc29uLmV4dGVuc2lvbnNVc2VkWyBpIF07XG5cdFx0XHRcdGNvbnN0IGV4dGVuc2lvbnNSZXF1aXJlZCA9IGpzb24uZXh0ZW5zaW9uc1JlcXVpcmVkIHx8IFtdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIGV4dGVuc2lvbk5hbWUgKSB7XG5cblx0XHRcdFx0XHRjYXNlIEVYVEVOU0lPTlMuS0hSX01BVEVSSUFMU19VTkxJVDpcblx0XHRcdFx0XHRcdGV4dGVuc2lvbnNbIGV4dGVuc2lvbk5hbWUgXSA9IG5ldyBHTFRGTWF0ZXJpYWxzVW5saXRFeHRlbnNpb24oKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfUEJSX1NQRUNVTEFSX0dMT1NTSU5FU1M6XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zWyBleHRlbnNpb25OYW1lIF0gPSBuZXcgR0xURk1hdGVyaWFsc1BiclNwZWN1bGFyR2xvc3NpbmVzc0V4dGVuc2lvbigpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIEVYVEVOU0lPTlMuS0hSX0RSQUNPX01FU0hfQ09NUFJFU1NJT046XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zWyBleHRlbnNpb25OYW1lIF0gPSBuZXcgR0xURkRyYWNvTWVzaENvbXByZXNzaW9uRXh0ZW5zaW9uKCBqc29uLCB0aGlzLmRyYWNvTG9hZGVyICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgRVhURU5TSU9OUy5LSFJfVEVYVFVSRV9UUkFOU0ZPUk06XG5cdFx0XHRcdFx0XHRleHRlbnNpb25zWyBleHRlbnNpb25OYW1lIF0gPSBuZXcgR0xURlRleHR1cmVUcmFuc2Zvcm1FeHRlbnNpb24oKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBFWFRFTlNJT05TLktIUl9NRVNIX1FVQU5USVpBVElPTjpcblx0XHRcdFx0XHRcdGV4dGVuc2lvbnNbIGV4dGVuc2lvbk5hbWUgXSA9IG5ldyBHTFRGTWVzaFF1YW50aXphdGlvbkV4dGVuc2lvbigpO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRpZiAoIGV4dGVuc2lvbnNSZXF1aXJlZC5pbmRleE9mKCBleHRlbnNpb25OYW1lICkgPj0gMCAmJiBwbHVnaW5zWyBleHRlbnNpb25OYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HTFRGTG9hZGVyOiBVbmtub3duIGV4dGVuc2lvbiBcIicgKyBleHRlbnNpb25OYW1lICsgJ1wiLicgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cGFyc2VyLnNldEV4dGVuc2lvbnMoIGV4dGVuc2lvbnMgKTtcblx0XHRwYXJzZXIuc2V0UGx1Z2lucyggcGx1Z2lucyApO1xuXHRcdHBhcnNlci5wYXJzZSggb25Mb2FkLCBvbkVycm9yICk7XG5cblx0fVxuXG59XG5cbi8qIEdMVEZSRUdJU1RSWSAqL1xuXG5mdW5jdGlvbiBHTFRGUmVnaXN0cnkoKSB7XG5cblx0bGV0IG9iamVjdHMgPSB7fTtcblxuXHRyZXR1cm5cdHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBrZXkgKSB7XG5cblx0XHRcdHJldHVybiBvYmplY3RzWyBrZXkgXTtcblxuXHRcdH0sXG5cblx0XHRhZGQ6IGZ1bmN0aW9uICgga2V5LCBvYmplY3QgKSB7XG5cblx0XHRcdG9iamVjdHNbIGtleSBdID0gb2JqZWN0O1xuXG5cdFx0fSxcblxuXHRcdHJlbW92ZTogZnVuY3Rpb24gKCBrZXkgKSB7XG5cblx0XHRcdGRlbGV0ZSBvYmplY3RzWyBrZXkgXTtcblxuXHRcdH0sXG5cblx0XHRyZW1vdmVBbGw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0b2JqZWN0cyA9IHt9O1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKioqKioqIEVYVEVOU0lPTlMgKioqKioqKioqKiovXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5jb25zdCBFWFRFTlNJT05TID0ge1xuXHRLSFJfQklOQVJZX0dMVEY6ICdLSFJfYmluYXJ5X2dsVEYnLFxuXHRLSFJfRFJBQ09fTUVTSF9DT01QUkVTU0lPTjogJ0tIUl9kcmFjb19tZXNoX2NvbXByZXNzaW9uJyxcblx0S0hSX0xJR0hUU19QVU5DVFVBTDogJ0tIUl9saWdodHNfcHVuY3R1YWwnLFxuXHRLSFJfTUFURVJJQUxTX0NMRUFSQ09BVDogJ0tIUl9tYXRlcmlhbHNfY2xlYXJjb2F0Jyxcblx0S0hSX01BVEVSSUFMU19JT1I6ICdLSFJfbWF0ZXJpYWxzX2lvcicsXG5cdEtIUl9NQVRFUklBTFNfUEJSX1NQRUNVTEFSX0dMT1NTSU5FU1M6ICdLSFJfbWF0ZXJpYWxzX3BiclNwZWN1bGFyR2xvc3NpbmVzcycsXG5cdEtIUl9NQVRFUklBTFNfU0hFRU46ICdLSFJfbWF0ZXJpYWxzX3NoZWVuJyxcblx0S0hSX01BVEVSSUFMU19TUEVDVUxBUjogJ0tIUl9tYXRlcmlhbHNfc3BlY3VsYXInLFxuXHRLSFJfTUFURVJJQUxTX1RSQU5TTUlTU0lPTjogJ0tIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uJyxcblx0S0hSX01BVEVSSUFMU19VTkxJVDogJ0tIUl9tYXRlcmlhbHNfdW5saXQnLFxuXHRLSFJfTUFURVJJQUxTX1ZPTFVNRTogJ0tIUl9tYXRlcmlhbHNfdm9sdW1lJyxcblx0S0hSX1RFWFRVUkVfQkFTSVNVOiAnS0hSX3RleHR1cmVfYmFzaXN1Jyxcblx0S0hSX1RFWFRVUkVfVFJBTlNGT1JNOiAnS0hSX3RleHR1cmVfdHJhbnNmb3JtJyxcblx0S0hSX01FU0hfUVVBTlRJWkFUSU9OOiAnS0hSX21lc2hfcXVhbnRpemF0aW9uJyxcblx0RVhUX1RFWFRVUkVfV0VCUDogJ0VYVF90ZXh0dXJlX3dlYnAnLFxuXHRFWFRfTUVTSE9QVF9DT01QUkVTU0lPTjogJ0VYVF9tZXNob3B0X2NvbXByZXNzaW9uJ1xufTtcblxuLyoqXG4gKiBQdW5jdHVhbCBMaWdodHMgRXh0ZW5zaW9uXG4gKlxuICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2xpZ2h0c19wdW5jdHVhbFxuICovXG5jbGFzcyBHTFRGTGlnaHRzRXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyc2VyICkge1xuXG5cdFx0dGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cdFx0dGhpcy5uYW1lID0gRVhURU5TSU9OUy5LSFJfTElHSFRTX1BVTkNUVUFMO1xuXG5cdFx0Ly8gT2JqZWN0M0QgaW5zdGFuY2UgY2FjaGVzXG5cdFx0dGhpcy5jYWNoZSA9IHsgcmVmczoge30sIHVzZXM6IHt9IH07XG5cblx0fVxuXG5cdF9tYXJrRGVmcygpIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyO1xuXHRcdGNvbnN0IG5vZGVEZWZzID0gdGhpcy5wYXJzZXIuanNvbi5ub2RlcyB8fCBbXTtcblxuXHRcdGZvciAoIGxldCBub2RlSW5kZXggPSAwLCBub2RlTGVuZ3RoID0gbm9kZURlZnMubGVuZ3RoOyBub2RlSW5kZXggPCBub2RlTGVuZ3RoOyBub2RlSW5kZXggKysgKSB7XG5cblx0XHRcdGNvbnN0IG5vZGVEZWYgPSBub2RlRGVmc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdGlmICggbm9kZURlZi5leHRlbnNpb25zXG5cdFx0XHRcdFx0JiYgbm9kZURlZi5leHRlbnNpb25zWyB0aGlzLm5hbWUgXVxuXHRcdFx0XHRcdCYmIG5vZGVEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0ubGlnaHQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRwYXJzZXIuX2FkZE5vZGVSZWYoIHRoaXMuY2FjaGUsIG5vZGVEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0ubGlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRfbG9hZExpZ2h0KCBsaWdodEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgY2FjaGVLZXkgPSAnbGlnaHQ6JyArIGxpZ2h0SW5kZXg7XG5cdFx0bGV0IGRlcGVuZGVuY3kgPSBwYXJzZXIuY2FjaGUuZ2V0KCBjYWNoZUtleSApO1xuXG5cdFx0aWYgKCBkZXBlbmRlbmN5ICkgcmV0dXJuIGRlcGVuZGVuY3k7XG5cblx0XHRjb25zdCBqc29uID0gcGFyc2VyLmpzb247XG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9ICgganNvbi5leHRlbnNpb25zICYmIGpzb24uZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB8fCB7fTtcblx0XHRjb25zdCBsaWdodERlZnMgPSBleHRlbnNpb25zLmxpZ2h0cyB8fCBbXTtcblx0XHRjb25zdCBsaWdodERlZiA9IGxpZ2h0RGVmc1sgbGlnaHRJbmRleCBdO1xuXHRcdGxldCBsaWdodE5vZGU7XG5cblx0XHRjb25zdCBjb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdGlmICggbGlnaHREZWYuY29sb3IgIT09IHVuZGVmaW5lZCApIGNvbG9yLmZyb21BcnJheSggbGlnaHREZWYuY29sb3IgKTtcblxuXHRcdGNvbnN0IHJhbmdlID0gbGlnaHREZWYucmFuZ2UgIT09IHVuZGVmaW5lZCA/IGxpZ2h0RGVmLnJhbmdlIDogMDtcblxuXHRcdHN3aXRjaCAoIGxpZ2h0RGVmLnR5cGUgKSB7XG5cblx0XHRcdGNhc2UgJ2RpcmVjdGlvbmFsJzpcblx0XHRcdFx0bGlnaHROb2RlID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yICk7XG5cdFx0XHRcdGxpZ2h0Tm9kZS50YXJnZXQucG9zaXRpb24uc2V0KCAwLCAwLCAtIDEgKTtcblx0XHRcdFx0bGlnaHROb2RlLmFkZCggbGlnaHROb2RlLnRhcmdldCApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAncG9pbnQnOlxuXHRcdFx0XHRsaWdodE5vZGUgPSBuZXcgUG9pbnRMaWdodCggY29sb3IgKTtcblx0XHRcdFx0bGlnaHROb2RlLmRpc3RhbmNlID0gcmFuZ2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdzcG90Jzpcblx0XHRcdFx0bGlnaHROb2RlID0gbmV3IFNwb3RMaWdodCggY29sb3IgKTtcblx0XHRcdFx0bGlnaHROb2RlLmRpc3RhbmNlID0gcmFuZ2U7XG5cdFx0XHRcdC8vIEhhbmRsZSBzcG90bGlnaHQgcHJvcGVydGllcy5cblx0XHRcdFx0bGlnaHREZWYuc3BvdCA9IGxpZ2h0RGVmLnNwb3QgfHwge307XG5cdFx0XHRcdGxpZ2h0RGVmLnNwb3QuaW5uZXJDb25lQW5nbGUgPSBsaWdodERlZi5zcG90LmlubmVyQ29uZUFuZ2xlICE9PSB1bmRlZmluZWQgPyBsaWdodERlZi5zcG90LmlubmVyQ29uZUFuZ2xlIDogMDtcblx0XHRcdFx0bGlnaHREZWYuc3BvdC5vdXRlckNvbmVBbmdsZSA9IGxpZ2h0RGVmLnNwb3Qub3V0ZXJDb25lQW5nbGUgIT09IHVuZGVmaW5lZCA/IGxpZ2h0RGVmLnNwb3Qub3V0ZXJDb25lQW5nbGUgOiBNYXRoLlBJIC8gNC4wO1xuXHRcdFx0XHRsaWdodE5vZGUuYW5nbGUgPSBsaWdodERlZi5zcG90Lm91dGVyQ29uZUFuZ2xlO1xuXHRcdFx0XHRsaWdodE5vZGUucGVudW1icmEgPSAxLjAgLSBsaWdodERlZi5zcG90LmlubmVyQ29uZUFuZ2xlIC8gbGlnaHREZWYuc3BvdC5vdXRlckNvbmVBbmdsZTtcblx0XHRcdFx0bGlnaHROb2RlLnRhcmdldC5wb3NpdGlvbi5zZXQoIDAsIDAsIC0gMSApO1xuXHRcdFx0XHRsaWdodE5vZGUuYWRkKCBsaWdodE5vZGUudGFyZ2V0ICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBVbmV4cGVjdGVkIGxpZ2h0IHR5cGU6ICcgKyBsaWdodERlZi50eXBlICk7XG5cblx0XHR9XG5cblx0XHQvLyBTb21lIGxpZ2h0cyAoZS5nLiBzcG90KSBkZWZhdWx0IHRvIGEgcG9zaXRpb24gb3RoZXIgdGhhbiB0aGUgb3JpZ2luLiBSZXNldCB0aGUgcG9zaXRpb25cblx0XHQvLyBoZXJlLCBiZWNhdXNlIG5vZGUtbGV2ZWwgcGFyc2luZyB3aWxsIG9ubHkgb3ZlcnJpZGUgcG9zaXRpb24gaWYgZXhwbGljaXRseSBzcGVjaWZpZWQuXG5cdFx0bGlnaHROb2RlLnBvc2l0aW9uLnNldCggMCwgMCwgMCApO1xuXG5cdFx0bGlnaHROb2RlLmRlY2F5ID0gMjtcblxuXHRcdGlmICggbGlnaHREZWYuaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBsaWdodE5vZGUuaW50ZW5zaXR5ID0gbGlnaHREZWYuaW50ZW5zaXR5O1xuXG5cdFx0bGlnaHROb2RlLm5hbWUgPSBwYXJzZXIuY3JlYXRlVW5pcXVlTmFtZSggbGlnaHREZWYubmFtZSB8fCAoICdsaWdodF8nICsgbGlnaHRJbmRleCApICk7XG5cblx0XHRkZXBlbmRlbmN5ID0gUHJvbWlzZS5yZXNvbHZlKCBsaWdodE5vZGUgKTtcblxuXHRcdHBhcnNlci5jYWNoZS5hZGQoIGNhY2hlS2V5LCBkZXBlbmRlbmN5ICk7XG5cblx0XHRyZXR1cm4gZGVwZW5kZW5jeTtcblxuXHR9XG5cblx0Y3JlYXRlTm9kZUF0dGFjaG1lbnQoIG5vZGVJbmRleCApIHtcblxuXHRcdGNvbnN0IHNlbGYgPSB0aGlzO1xuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyO1xuXHRcdGNvbnN0IGpzb24gPSBwYXJzZXIuanNvbjtcblx0XHRjb25zdCBub2RlRGVmID0ganNvbi5ub2Rlc1sgbm9kZUluZGV4IF07XG5cdFx0Y29uc3QgbGlnaHREZWYgPSAoIG5vZGVEZWYuZXh0ZW5zaW9ucyAmJiBub2RlRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdICkgfHwge307XG5cdFx0Y29uc3QgbGlnaHRJbmRleCA9IGxpZ2h0RGVmLmxpZ2h0O1xuXG5cdFx0aWYgKCBsaWdodEluZGV4ID09PSB1bmRlZmluZWQgKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLl9sb2FkTGlnaHQoIGxpZ2h0SW5kZXggKS50aGVuKCBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0XHRyZXR1cm4gcGFyc2VyLl9nZXROb2RlUmVmKCBzZWxmLmNhY2hlLCBsaWdodEluZGV4LCBsaWdodCApO1xuXG5cdFx0fSApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIFVubGl0IE1hdGVyaWFscyBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3VubGl0XG4gKi9cbmNsYXNzIEdMVEZNYXRlcmlhbHNVbmxpdEV4dGVuc2lvbiB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfVU5MSVQ7XG5cblx0fVxuXG5cdGdldE1hdGVyaWFsVHlwZSgpIHtcblxuXHRcdHJldHVybiBNZXNoQmFzaWNNYXRlcmlhbDtcblxuXHR9XG5cblx0ZXh0ZW5kUGFyYW1zKCBtYXRlcmlhbFBhcmFtcywgbWF0ZXJpYWxEZWYsIHBhcnNlciApIHtcblxuXHRcdGNvbnN0IHBlbmRpbmcgPSBbXTtcblxuXHRcdG1hdGVyaWFsUGFyYW1zLmNvbG9yID0gbmV3IENvbG9yKCAxLjAsIDEuMCwgMS4wICk7XG5cdFx0bWF0ZXJpYWxQYXJhbXMub3BhY2l0eSA9IDEuMDtcblxuXHRcdGNvbnN0IG1ldGFsbGljUm91Z2huZXNzID0gbWF0ZXJpYWxEZWYucGJyTWV0YWxsaWNSb3VnaG5lc3M7XG5cblx0XHRpZiAoIG1ldGFsbGljUm91Z2huZXNzICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1ldGFsbGljUm91Z2huZXNzLmJhc2VDb2xvckZhY3RvciApICkge1xuXG5cdFx0XHRcdGNvbnN0IGFycmF5ID0gbWV0YWxsaWNSb3VnaG5lc3MuYmFzZUNvbG9yRmFjdG9yO1xuXG5cdFx0XHRcdG1hdGVyaWFsUGFyYW1zLmNvbG9yLmZyb21BcnJheSggYXJyYXkgKTtcblx0XHRcdFx0bWF0ZXJpYWxQYXJhbXMub3BhY2l0eSA9IGFycmF5WyAzIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtZXRhbGxpY1JvdWdobmVzcy5iYXNlQ29sb3JUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIuYXNzaWduVGV4dHVyZSggbWF0ZXJpYWxQYXJhbXMsICdtYXAnLCBtZXRhbGxpY1JvdWdobmVzcy5iYXNlQ29sb3JUZXh0dXJlICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKCBwZW5kaW5nICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQ2xlYXJjb2F0IE1hdGVyaWFscyBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2NsZWFyY29hdFxuICovXG5jbGFzcyBHTFRGTWF0ZXJpYWxzQ2xlYXJjb2F0RXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyc2VyICkge1xuXG5cdFx0dGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cdFx0dGhpcy5uYW1lID0gRVhURU5TSU9OUy5LSFJfTUFURVJJQUxTX0NMRUFSQ09BVDtcblxuXHR9XG5cblx0Z2V0TWF0ZXJpYWxUeXBlKCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuXHR9XG5cblx0ZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoIG1hdGVyaWFsSW5kZXgsIG1hdGVyaWFsUGFyYW1zICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHBlbmRpbmcgPSBbXTtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdO1xuXG5cdFx0aWYgKCBleHRlbnNpb24uY2xlYXJjb2F0RmFjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLmNsZWFyY29hdCA9IGV4dGVuc2lvbi5jbGVhcmNvYXRGYWN0b3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIGV4dGVuc2lvbi5jbGVhcmNvYXRUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAnY2xlYXJjb2F0TWFwJywgZXh0ZW5zaW9uLmNsZWFyY29hdFRleHR1cmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBleHRlbnNpb24uY2xlYXJjb2F0Um91Z2huZXNzRmFjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLmNsZWFyY29hdFJvdWdobmVzcyA9IGV4dGVuc2lvbi5jbGVhcmNvYXRSb3VnaG5lc3NGYWN0b3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIGV4dGVuc2lvbi5jbGVhcmNvYXRSb3VnaG5lc3NUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAnY2xlYXJjb2F0Um91Z2huZXNzTWFwJywgZXh0ZW5zaW9uLmNsZWFyY29hdFJvdWdobmVzc1RleHR1cmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBleHRlbnNpb24uY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ2NsZWFyY29hdE5vcm1hbE1hcCcsIGV4dGVuc2lvbi5jbGVhcmNvYXROb3JtYWxUZXh0dXJlICkgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24uY2xlYXJjb2F0Tm9ybWFsVGV4dHVyZS5zY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnN0IHNjYWxlID0gZXh0ZW5zaW9uLmNsZWFyY29hdE5vcm1hbFRleHR1cmUuc2NhbGU7XG5cblx0XHRcdFx0bWF0ZXJpYWxQYXJhbXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggc2NhbGUsIHNjYWxlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbCggcGVuZGluZyApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIFNoZWVuIE1hdGVyaWFscyBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYWluL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19zaGVlblxuICovXG5jbGFzcyBHTFRGTWF0ZXJpYWxzU2hlZW5FeHRlbnNpb24ge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJzZXIgKSB7XG5cblx0XHR0aGlzLnBhcnNlciA9IHBhcnNlcjtcblx0XHR0aGlzLm5hbWUgPSBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfU0hFRU47XG5cblx0fVxuXG5cdGdldE1hdGVyaWFsVHlwZSggbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyO1xuXHRcdGNvbnN0IG1hdGVyaWFsRGVmID0gcGFyc2VyLmpzb24ubWF0ZXJpYWxzWyBtYXRlcmlhbEluZGV4IF07XG5cblx0XHRpZiAoICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9ucyB8fCAhIG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7XG5cblx0fVxuXG5cdGV4dGVuZE1hdGVyaWFsUGFyYW1zKCBtYXRlcmlhbEluZGV4LCBtYXRlcmlhbFBhcmFtcyApIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyO1xuXHRcdGNvbnN0IG1hdGVyaWFsRGVmID0gcGFyc2VyLmpzb24ubWF0ZXJpYWxzWyBtYXRlcmlhbEluZGV4IF07XG5cblx0XHRpZiAoICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9ucyB8fCAhIG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdICkge1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRtYXRlcmlhbFBhcmFtcy5zaGVlbkNvbG9yID0gbmV3IENvbG9yKCAwLCAwLCAwICk7XG5cdFx0bWF0ZXJpYWxQYXJhbXMuc2hlZW5Sb3VnaG5lc3MgPSAwO1xuXHRcdG1hdGVyaWFsUGFyYW1zLnNoZWVuID0gMTtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdO1xuXG5cdFx0aWYgKCBleHRlbnNpb24uc2hlZW5Db2xvckZhY3RvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbFBhcmFtcy5zaGVlbkNvbG9yLmZyb21BcnJheSggZXh0ZW5zaW9uLnNoZWVuQ29sb3JGYWN0b3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZXh0ZW5zaW9uLnNoZWVuUm91Z2huZXNzRmFjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLnNoZWVuUm91Z2huZXNzID0gZXh0ZW5zaW9uLnNoZWVuUm91Z2huZXNzRmFjdG9yO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBleHRlbnNpb24uc2hlZW5Db2xvclRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIuYXNzaWduVGV4dHVyZSggbWF0ZXJpYWxQYXJhbXMsICdzaGVlbkNvbG9yTWFwJywgZXh0ZW5zaW9uLnNoZWVuQ29sb3JUZXh0dXJlICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZXh0ZW5zaW9uLnNoZWVuUm91Z2huZXNzVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ3NoZWVuUm91Z2huZXNzTWFwJywgZXh0ZW5zaW9uLnNoZWVuUm91Z2huZXNzVGV4dHVyZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoIHBlbmRpbmcgKTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBUcmFuc21pc3Npb24gTWF0ZXJpYWxzIEV4dGVuc2lvblxuICpcbiAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl9tYXRlcmlhbHNfdHJhbnNtaXNzaW9uXG4gKiBEcmFmdDogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3B1bGwvMTY5OFxuICovXG5jbGFzcyBHTFRGTWF0ZXJpYWxzVHJhbnNtaXNzaW9uRXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyc2VyICkge1xuXG5cdFx0dGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cdFx0dGhpcy5uYW1lID0gRVhURU5TSU9OUy5LSFJfTUFURVJJQUxTX1RSQU5TTUlTU0lPTjtcblxuXHR9XG5cblx0Z2V0TWF0ZXJpYWxUeXBlKCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuXHR9XG5cblx0ZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoIG1hdGVyaWFsSW5kZXgsIG1hdGVyaWFsUGFyYW1zICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHBlbmRpbmcgPSBbXTtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdO1xuXG5cdFx0aWYgKCBleHRlbnNpb24udHJhbnNtaXNzaW9uRmFjdG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLnRyYW5zbWlzc2lvbiA9IGV4dGVuc2lvbi50cmFuc21pc3Npb25GYWN0b3I7XG5cblx0XHR9XG5cblx0XHRpZiAoIGV4dGVuc2lvbi50cmFuc21pc3Npb25UZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAndHJhbnNtaXNzaW9uTWFwJywgZXh0ZW5zaW9uLnRyYW5zbWlzc2lvblRleHR1cmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKCBwZW5kaW5nICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogTWF0ZXJpYWxzIFZvbHVtZSBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3ZvbHVtZVxuICovXG5jbGFzcyBHTFRGTWF0ZXJpYWxzVm9sdW1lRXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyc2VyICkge1xuXG5cdFx0dGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cdFx0dGhpcy5uYW1lID0gRVhURU5TSU9OUy5LSFJfTUFURVJJQUxTX1ZPTFVNRTtcblxuXHR9XG5cblx0Z2V0TWF0ZXJpYWxUeXBlKCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuXHR9XG5cblx0ZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoIG1hdGVyaWFsSW5kZXgsIG1hdGVyaWFsUGFyYW1zICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHBlbmRpbmcgPSBbXTtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdO1xuXG5cdFx0bWF0ZXJpYWxQYXJhbXMudGhpY2tuZXNzID0gZXh0ZW5zaW9uLnRoaWNrbmVzc0ZhY3RvciAhPT0gdW5kZWZpbmVkID8gZXh0ZW5zaW9uLnRoaWNrbmVzc0ZhY3RvciA6IDA7XG5cblx0XHRpZiAoIGV4dGVuc2lvbi50aGlja25lc3NUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAndGhpY2tuZXNzTWFwJywgZXh0ZW5zaW9uLnRoaWNrbmVzc1RleHR1cmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0bWF0ZXJpYWxQYXJhbXMuYXR0ZW51YXRpb25EaXN0YW5jZSA9IGV4dGVuc2lvbi5hdHRlbnVhdGlvbkRpc3RhbmNlIHx8IDA7XG5cblx0XHRjb25zdCBjb2xvckFycmF5ID0gZXh0ZW5zaW9uLmF0dGVudWF0aW9uQ29sb3IgfHwgWyAxLCAxLCAxIF07XG5cdFx0bWF0ZXJpYWxQYXJhbXMuYXR0ZW51YXRpb25Db2xvciA9IG5ldyBDb2xvciggY29sb3JBcnJheVsgMCBdLCBjb2xvckFycmF5WyAxIF0sIGNvbG9yQXJyYXlbIDIgXSApO1xuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKCBwZW5kaW5nICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogTWF0ZXJpYWxzIGlvciBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX2lvclxuICovXG5jbGFzcyBHTFRGTWF0ZXJpYWxzSW9yRXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyc2VyICkge1xuXG5cdFx0dGhpcy5wYXJzZXIgPSBwYXJzZXI7XG5cdFx0dGhpcy5uYW1lID0gRVhURU5TSU9OUy5LSFJfTUFURVJJQUxTX0lPUjtcblxuXHR9XG5cblx0Z2V0TWF0ZXJpYWxUeXBlKCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuXHR9XG5cblx0ZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoIG1hdGVyaWFsSW5kZXgsIG1hdGVyaWFsUGFyYW1zICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBwYXJzZXIuanNvbi5tYXRlcmlhbHNbIG1hdGVyaWFsSW5kZXggXTtcblxuXHRcdGlmICggISBtYXRlcmlhbERlZi5leHRlbnNpb25zIHx8ICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdO1xuXG5cdFx0bWF0ZXJpYWxQYXJhbXMuaW9yID0gZXh0ZW5zaW9uLmlvciAhPT0gdW5kZWZpbmVkID8gZXh0ZW5zaW9uLmlvciA6IDEuNTtcblxuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBNYXRlcmlhbHMgc3BlY3VsYXIgRXh0ZW5zaW9uXG4gKlxuICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21hdGVyaWFsc19zcGVjdWxhclxuICovXG5jbGFzcyBHTFRGTWF0ZXJpYWxzU3BlY3VsYXJFeHRlbnNpb24ge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJzZXIgKSB7XG5cblx0XHR0aGlzLnBhcnNlciA9IHBhcnNlcjtcblx0XHR0aGlzLm5hbWUgPSBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfU1BFQ1VMQVI7XG5cblx0fVxuXG5cdGdldE1hdGVyaWFsVHlwZSggbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyO1xuXHRcdGNvbnN0IG1hdGVyaWFsRGVmID0gcGFyc2VyLmpzb24ubWF0ZXJpYWxzWyBtYXRlcmlhbEluZGV4IF07XG5cblx0XHRpZiAoICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9ucyB8fCAhIG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gTWVzaFBoeXNpY2FsTWF0ZXJpYWw7XG5cblx0fVxuXG5cdGV4dGVuZE1hdGVyaWFsUGFyYW1zKCBtYXRlcmlhbEluZGV4LCBtYXRlcmlhbFBhcmFtcyApIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyO1xuXHRcdGNvbnN0IG1hdGVyaWFsRGVmID0gcGFyc2VyLmpzb24ubWF0ZXJpYWxzWyBtYXRlcmlhbEluZGV4IF07XG5cblx0XHRpZiAoICEgbWF0ZXJpYWxEZWYuZXh0ZW5zaW9ucyB8fCAhIG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdICkge1xuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRjb25zdCBleHRlbnNpb24gPSBtYXRlcmlhbERlZi5leHRlbnNpb25zWyB0aGlzLm5hbWUgXTtcblxuXHRcdG1hdGVyaWFsUGFyYW1zLnNwZWN1bGFySW50ZW5zaXR5ID0gZXh0ZW5zaW9uLnNwZWN1bGFyRmFjdG9yICE9PSB1bmRlZmluZWQgPyBleHRlbnNpb24uc3BlY3VsYXJGYWN0b3IgOiAxLjA7XG5cblx0XHRpZiAoIGV4dGVuc2lvbi5zcGVjdWxhclRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIuYXNzaWduVGV4dHVyZSggbWF0ZXJpYWxQYXJhbXMsICdzcGVjdWxhckludGVuc2l0eU1hcCcsIGV4dGVuc2lvbi5zcGVjdWxhclRleHR1cmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sb3JBcnJheSA9IGV4dGVuc2lvbi5zcGVjdWxhckNvbG9yRmFjdG9yIHx8IFsgMSwgMSwgMSBdO1xuXHRcdG1hdGVyaWFsUGFyYW1zLnNwZWN1bGFyQ29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yQXJyYXlbIDAgXSwgY29sb3JBcnJheVsgMSBdLCBjb2xvckFycmF5WyAyIF0gKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uLnNwZWN1bGFyQ29sb3JUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAnc3BlY3VsYXJDb2xvck1hcCcsIGV4dGVuc2lvbi5zcGVjdWxhckNvbG9yVGV4dHVyZSApLnRoZW4oIGZ1bmN0aW9uICggdGV4dHVyZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmVuY29kaW5nID0gc1JHQkVuY29kaW5nO1xuXG5cdFx0XHR9ICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbCggcGVuZGluZyApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEJhc2lzVSBUZXh0dXJlIEV4dGVuc2lvblxuICpcbiAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9leHRlbnNpb25zLzIuMC9LaHJvbm9zL0tIUl90ZXh0dXJlX2Jhc2lzdVxuICovXG5jbGFzcyBHTFRGVGV4dHVyZUJhc2lzVUV4dGVuc2lvbiB7XG5cblx0Y29uc3RydWN0b3IoIHBhcnNlciApIHtcblxuXHRcdHRoaXMucGFyc2VyID0gcGFyc2VyO1xuXHRcdHRoaXMubmFtZSA9IEVYVEVOU0lPTlMuS0hSX1RFWFRVUkVfQkFTSVNVO1xuXG5cdH1cblxuXHRsb2FkVGV4dHVyZSggdGV4dHVyZUluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QganNvbiA9IHBhcnNlci5qc29uO1xuXG5cdFx0Y29uc3QgdGV4dHVyZURlZiA9IGpzb24udGV4dHVyZXNbIHRleHR1cmVJbmRleCBdO1xuXG5cdFx0aWYgKCAhIHRleHR1cmVEZWYuZXh0ZW5zaW9ucyB8fCAhIHRleHR1cmVEZWYuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gdGV4dHVyZURlZi5leHRlbnNpb25zWyB0aGlzLm5hbWUgXTtcblx0XHRjb25zdCBzb3VyY2UgPSBqc29uLmltYWdlc1sgZXh0ZW5zaW9uLnNvdXJjZSBdO1xuXHRcdGNvbnN0IGxvYWRlciA9IHBhcnNlci5vcHRpb25zLmt0eDJMb2FkZXI7XG5cblx0XHRpZiAoICEgbG9hZGVyICkge1xuXG5cdFx0XHRpZiAoIGpzb24uZXh0ZW5zaW9uc1JlcXVpcmVkICYmIGpzb24uZXh0ZW5zaW9uc1JlcXVpcmVkLmluZGV4T2YoIHRoaXMubmFtZSApID49IDAgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuR0xURkxvYWRlcjogc2V0S1RYMkxvYWRlciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9hZGluZyBLVFgyIHRleHR1cmVzJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEFzc3VtZXMgdGhhdCB0aGUgZXh0ZW5zaW9uIGlzIG9wdGlvbmFsIGFuZCB0aGF0IGEgZmFsbGJhY2sgdGV4dHVyZSBpcyBwcmVzZW50XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VyLmxvYWRUZXh0dXJlSW1hZ2UoIHRleHR1cmVJbmRleCwgc291cmNlLCBsb2FkZXIgKTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBXZWJQIFRleHR1cmUgRXh0ZW5zaW9uXG4gKlxuICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL1ZlbmRvci9FWFRfdGV4dHVyZV93ZWJwXG4gKi9cbmNsYXNzIEdMVEZUZXh0dXJlV2ViUEV4dGVuc2lvbiB7XG5cblx0Y29uc3RydWN0b3IoIHBhcnNlciApIHtcblxuXHRcdHRoaXMucGFyc2VyID0gcGFyc2VyO1xuXHRcdHRoaXMubmFtZSA9IEVYVEVOU0lPTlMuRVhUX1RFWFRVUkVfV0VCUDtcblx0XHR0aGlzLmlzU3VwcG9ydGVkID0gbnVsbDtcblxuXHR9XG5cblx0bG9hZFRleHR1cmUoIHRleHR1cmVJbmRleCApIHtcblxuXHRcdGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcy5wYXJzZXI7XG5cdFx0Y29uc3QganNvbiA9IHBhcnNlci5qc29uO1xuXG5cdFx0Y29uc3QgdGV4dHVyZURlZiA9IGpzb24udGV4dHVyZXNbIHRleHR1cmVJbmRleCBdO1xuXG5cdFx0aWYgKCAhIHRleHR1cmVEZWYuZXh0ZW5zaW9ucyB8fCAhIHRleHR1cmVEZWYuZXh0ZW5zaW9uc1sgbmFtZSBdICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IHRleHR1cmVEZWYuZXh0ZW5zaW9uc1sgbmFtZSBdO1xuXHRcdGNvbnN0IHNvdXJjZSA9IGpzb24uaW1hZ2VzWyBleHRlbnNpb24uc291cmNlIF07XG5cblx0XHRsZXQgbG9hZGVyID0gcGFyc2VyLnRleHR1cmVMb2FkZXI7XG5cdFx0aWYgKCBzb3VyY2UudXJpICkge1xuXG5cdFx0XHRjb25zdCBoYW5kbGVyID0gcGFyc2VyLm9wdGlvbnMubWFuYWdlci5nZXRIYW5kbGVyKCBzb3VyY2UudXJpICk7XG5cdFx0XHRpZiAoIGhhbmRsZXIgIT09IG51bGwgKSBsb2FkZXIgPSBoYW5kbGVyO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGV0ZWN0U3VwcG9ydCgpLnRoZW4oIGZ1bmN0aW9uICggaXNTdXBwb3J0ZWQgKSB7XG5cblx0XHRcdGlmICggaXNTdXBwb3J0ZWQgKSByZXR1cm4gcGFyc2VyLmxvYWRUZXh0dXJlSW1hZ2UoIHRleHR1cmVJbmRleCwgc291cmNlLCBsb2FkZXIgKTtcblxuXHRcdFx0aWYgKCBqc29uLmV4dGVuc2lvbnNSZXF1aXJlZCAmJiBqc29uLmV4dGVuc2lvbnNSZXF1aXJlZC5pbmRleE9mKCBuYW1lICkgPj0gMCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBXZWJQIHJlcXVpcmVkIGJ5IGFzc2V0IGJ1dCB1bnN1cHBvcnRlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gRmFsbCBiYWNrIHRvIFBORyBvciBKUEVHLlxuXHRcdFx0cmV0dXJuIHBhcnNlci5sb2FkVGV4dHVyZSggdGV4dHVyZUluZGV4ICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdGRldGVjdFN1cHBvcnQoKSB7XG5cblx0XHRpZiAoICEgdGhpcy5pc1N1cHBvcnRlZCApIHtcblxuXHRcdFx0dGhpcy5pc1N1cHBvcnRlZCA9IG5ldyBQcm9taXNlKCBmdW5jdGlvbiAoIHJlc29sdmUgKSB7XG5cblx0XHRcdFx0Y29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcblxuXHRcdFx0XHQvLyBMb3NzeSB0ZXN0IGltYWdlLiBTdXBwb3J0IGZvciBsb3NzeSBpbWFnZXMgZG9lc24ndCBndWFyYW50ZWUgc3VwcG9ydCBmb3IgYWxsXG5cdFx0XHRcdC8vIFdlYlAgaW1hZ2VzLCB1bmZvcnR1bmF0ZWx5LlxuXHRcdFx0XHRpbWFnZS5zcmMgPSAnZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmlJQUFBQlhSVUpRVmxBNElCWUFBQUF3QVFDZEFTb0JBQUVBRHNEK0phUUFBM0FBQUFBQSc7XG5cblx0XHRcdFx0aW1hZ2Uub25sb2FkID0gaW1hZ2Uub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdHJlc29sdmUoIGltYWdlLmhlaWdodCA9PT0gMSApO1xuXG5cdFx0XHRcdH07XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzU3VwcG9ydGVkO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIG1lc2hvcHQgQnVmZmVyVmlldyBDb21wcmVzc2lvbiBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvVmVuZG9yL0VYVF9tZXNob3B0X2NvbXByZXNzaW9uXG4gKi9cbmNsYXNzIEdMVEZNZXNob3B0Q29tcHJlc3Npb24ge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJzZXIgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBFWFRFTlNJT05TLkVYVF9NRVNIT1BUX0NPTVBSRVNTSU9OO1xuXHRcdHRoaXMucGFyc2VyID0gcGFyc2VyO1xuXG5cdH1cblxuXHRsb2FkQnVmZmVyVmlldyggaW5kZXggKSB7XG5cblx0XHRjb25zdCBqc29uID0gdGhpcy5wYXJzZXIuanNvbjtcblx0XHRjb25zdCBidWZmZXJWaWV3ID0ganNvbi5idWZmZXJWaWV3c1sgaW5kZXggXTtcblxuXHRcdGlmICggYnVmZmVyVmlldy5leHRlbnNpb25zICYmIGJ1ZmZlclZpZXcuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0gKSB7XG5cblx0XHRcdGNvbnN0IGV4dGVuc2lvbkRlZiA9IGJ1ZmZlclZpZXcuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF07XG5cblx0XHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMucGFyc2VyLmdldERlcGVuZGVuY3koICdidWZmZXInLCBleHRlbnNpb25EZWYuYnVmZmVyICk7XG5cdFx0XHRjb25zdCBkZWNvZGVyID0gdGhpcy5wYXJzZXIub3B0aW9ucy5tZXNob3B0RGVjb2RlcjtcblxuXHRcdFx0aWYgKCAhIGRlY29kZXIgfHwgISBkZWNvZGVyLnN1cHBvcnRlZCApIHtcblxuXHRcdFx0XHRpZiAoIGpzb24uZXh0ZW5zaW9uc1JlcXVpcmVkICYmIGpzb24uZXh0ZW5zaW9uc1JlcXVpcmVkLmluZGV4T2YoIHRoaXMubmFtZSApID49IDAgKSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBzZXRNZXNob3B0RGVjb2RlciBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgbG9hZGluZyBjb21wcmVzc2VkIGZpbGVzJyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBBc3N1bWVzIHRoYXQgdGhlIGV4dGVuc2lvbiBpcyBvcHRpb25hbCBhbmQgdGhhdCBmYWxsYmFjayBidWZmZXIgZGF0YSBpcyBwcmVzZW50XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbCggWyBidWZmZXIsIGRlY29kZXIucmVhZHkgXSApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xuXG5cdFx0XHRcdGNvbnN0IGJ5dGVPZmZzZXQgPSBleHRlbnNpb25EZWYuYnl0ZU9mZnNldCB8fCAwO1xuXHRcdFx0XHRjb25zdCBieXRlTGVuZ3RoID0gZXh0ZW5zaW9uRGVmLmJ5dGVMZW5ndGggfHwgMDtcblxuXHRcdFx0XHRjb25zdCBjb3VudCA9IGV4dGVuc2lvbkRlZi5jb3VudDtcblx0XHRcdFx0Y29uc3Qgc3RyaWRlID0gZXh0ZW5zaW9uRGVmLmJ5dGVTdHJpZGU7XG5cblx0XHRcdFx0Y29uc3QgcmVzdWx0ID0gbmV3IEFycmF5QnVmZmVyKCBjb3VudCAqIHN0cmlkZSApO1xuXHRcdFx0XHRjb25zdCBzb3VyY2UgPSBuZXcgVWludDhBcnJheSggcmVzWyAwIF0sIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGggKTtcblxuXHRcdFx0XHRkZWNvZGVyLmRlY29kZUdsdGZCdWZmZXIoIG5ldyBVaW50OEFycmF5KCByZXN1bHQgKSwgY291bnQsIHN0cmlkZSwgc291cmNlLCBleHRlbnNpb25EZWYubW9kZSwgZXh0ZW5zaW9uRGVmLmZpbHRlciApO1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyogQklOQVJZIEVYVEVOU0lPTiAqL1xuY29uc3QgQklOQVJZX0VYVEVOU0lPTl9IRUFERVJfTUFHSUMgPSAnZ2xURic7XG5jb25zdCBCSU5BUllfRVhURU5TSU9OX0hFQURFUl9MRU5HVEggPSAxMjtcbmNvbnN0IEJJTkFSWV9FWFRFTlNJT05fQ0hVTktfVFlQRVMgPSB7IEpTT046IDB4NEU0RjUzNEEsIEJJTjogMHgwMDRFNDk0MiB9O1xuXG5jbGFzcyBHTFRGQmluYXJ5RXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvciggZGF0YSApIHtcblxuXHRcdHRoaXMubmFtZSA9IEVYVEVOU0lPTlMuS0hSX0JJTkFSWV9HTFRGO1xuXHRcdHRoaXMuY29udGVudCA9IG51bGw7XG5cdFx0dGhpcy5ib2R5ID0gbnVsbDtcblxuXHRcdGNvbnN0IGhlYWRlclZpZXcgPSBuZXcgRGF0YVZpZXcoIGRhdGEsIDAsIEJJTkFSWV9FWFRFTlNJT05fSEVBREVSX0xFTkdUSCApO1xuXG5cdFx0dGhpcy5oZWFkZXIgPSB7XG5cdFx0XHRtYWdpYzogTG9hZGVyVXRpbHMuZGVjb2RlVGV4dCggbmV3IFVpbnQ4QXJyYXkoIGRhdGEuc2xpY2UoIDAsIDQgKSApICksXG5cdFx0XHR2ZXJzaW9uOiBoZWFkZXJWaWV3LmdldFVpbnQzMiggNCwgdHJ1ZSApLFxuXHRcdFx0bGVuZ3RoOiBoZWFkZXJWaWV3LmdldFVpbnQzMiggOCwgdHJ1ZSApXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5oZWFkZXIubWFnaWMgIT09IEJJTkFSWV9FWFRFTlNJT05fSEVBREVSX01BR0lDICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBVbnN1cHBvcnRlZCBnbFRGLUJpbmFyeSBoZWFkZXIuJyApO1xuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5oZWFkZXIudmVyc2lvbiA8IDIuMCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuR0xURkxvYWRlcjogTGVnYWN5IGJpbmFyeSBmaWxlIGRldGVjdGVkLicgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNodW5rQ29udGVudHNMZW5ndGggPSB0aGlzLmhlYWRlci5sZW5ndGggLSBCSU5BUllfRVhURU5TSU9OX0hFQURFUl9MRU5HVEg7XG5cdFx0Y29uc3QgY2h1bmtWaWV3ID0gbmV3IERhdGFWaWV3KCBkYXRhLCBCSU5BUllfRVhURU5TSU9OX0hFQURFUl9MRU5HVEggKTtcblx0XHRsZXQgY2h1bmtJbmRleCA9IDA7XG5cblx0XHR3aGlsZSAoIGNodW5rSW5kZXggPCBjaHVua0NvbnRlbnRzTGVuZ3RoICkge1xuXG5cdFx0XHRjb25zdCBjaHVua0xlbmd0aCA9IGNodW5rVmlldy5nZXRVaW50MzIoIGNodW5rSW5kZXgsIHRydWUgKTtcblx0XHRcdGNodW5rSW5kZXggKz0gNDtcblxuXHRcdFx0Y29uc3QgY2h1bmtUeXBlID0gY2h1bmtWaWV3LmdldFVpbnQzMiggY2h1bmtJbmRleCwgdHJ1ZSApO1xuXHRcdFx0Y2h1bmtJbmRleCArPSA0O1xuXG5cdFx0XHRpZiAoIGNodW5rVHlwZSA9PT0gQklOQVJZX0VYVEVOU0lPTl9DSFVOS19UWVBFUy5KU09OICkge1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRlbnRBcnJheSA9IG5ldyBVaW50OEFycmF5KCBkYXRhLCBCSU5BUllfRVhURU5TSU9OX0hFQURFUl9MRU5HVEggKyBjaHVua0luZGV4LCBjaHVua0xlbmd0aCApO1xuXHRcdFx0XHR0aGlzLmNvbnRlbnQgPSBMb2FkZXJVdGlscy5kZWNvZGVUZXh0KCBjb250ZW50QXJyYXkgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggY2h1bmtUeXBlID09PSBCSU5BUllfRVhURU5TSU9OX0NIVU5LX1RZUEVTLkJJTiApIHtcblxuXHRcdFx0XHRjb25zdCBieXRlT2Zmc2V0ID0gQklOQVJZX0VYVEVOU0lPTl9IRUFERVJfTEVOR1RIICsgY2h1bmtJbmRleDtcblx0XHRcdFx0dGhpcy5ib2R5ID0gZGF0YS5zbGljZSggYnl0ZU9mZnNldCwgYnl0ZU9mZnNldCArIGNodW5rTGVuZ3RoICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xpZW50cyBtdXN0IGlnbm9yZSBjaHVua3Mgd2l0aCB1bmtub3duIHR5cGVzLlxuXG5cdFx0XHRjaHVua0luZGV4ICs9IGNodW5rTGVuZ3RoO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmNvbnRlbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkdMVEZMb2FkZXI6IEpTT04gY29udGVudCBub3QgZm91bmQuJyApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIERSQUNPIE1lc2ggQ29tcHJlc3Npb24gRXh0ZW5zaW9uXG4gKlxuICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX2RyYWNvX21lc2hfY29tcHJlc3Npb25cbiAqL1xuY2xhc3MgR0xURkRyYWNvTWVzaENvbXByZXNzaW9uRXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvcigganNvbiwgZHJhY29Mb2FkZXIgKSB7XG5cblx0XHRpZiAoICEgZHJhY29Mb2FkZXIgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkdMVEZMb2FkZXI6IE5vIERSQUNPTG9hZGVyIGluc3RhbmNlIHByb3ZpZGVkLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMubmFtZSA9IEVYVEVOU0lPTlMuS0hSX0RSQUNPX01FU0hfQ09NUFJFU1NJT047XG5cdFx0dGhpcy5qc29uID0ganNvbjtcblx0XHR0aGlzLmRyYWNvTG9hZGVyID0gZHJhY29Mb2FkZXI7XG5cdFx0dGhpcy5kcmFjb0xvYWRlci5wcmVsb2FkKCk7XG5cblx0fVxuXG5cdGRlY29kZVByaW1pdGl2ZSggcHJpbWl0aXZlLCBwYXJzZXIgKSB7XG5cblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IGRyYWNvTG9hZGVyID0gdGhpcy5kcmFjb0xvYWRlcjtcblx0XHRjb25zdCBidWZmZXJWaWV3SW5kZXggPSBwcmltaXRpdmUuZXh0ZW5zaW9uc1sgdGhpcy5uYW1lIF0uYnVmZmVyVmlldztcblx0XHRjb25zdCBnbHRmQXR0cmlidXRlTWFwID0gcHJpbWl0aXZlLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdLmF0dHJpYnV0ZXM7XG5cdFx0Y29uc3QgdGhyZWVBdHRyaWJ1dGVNYXAgPSB7fTtcblx0XHRjb25zdCBhdHRyaWJ1dGVOb3JtYWxpemVkTWFwID0ge307XG5cdFx0Y29uc3QgYXR0cmlidXRlVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yICggY29uc3QgYXR0cmlidXRlTmFtZSBpbiBnbHRmQXR0cmlidXRlTWFwICkge1xuXG5cdFx0XHRjb25zdCB0aHJlZUF0dHJpYnV0ZU5hbWUgPSBBVFRSSUJVVEVTWyBhdHRyaWJ1dGVOYW1lIF0gfHwgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHR0aHJlZUF0dHJpYnV0ZU1hcFsgdGhyZWVBdHRyaWJ1dGVOYW1lIF0gPSBnbHRmQXR0cmlidXRlTWFwWyBhdHRyaWJ1dGVOYW1lIF07XG5cblx0XHR9XG5cblx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGVOYW1lIGluIHByaW1pdGl2ZS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRjb25zdCB0aHJlZUF0dHJpYnV0ZU5hbWUgPSBBVFRSSUJVVEVTWyBhdHRyaWJ1dGVOYW1lIF0gfHwgYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIGdsdGZBdHRyaWJ1dGVNYXBbIGF0dHJpYnV0ZU5hbWUgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnN0IGFjY2Vzc29yRGVmID0ganNvbi5hY2Nlc3NvcnNbIHByaW1pdGl2ZS5hdHRyaWJ1dGVzWyBhdHRyaWJ1dGVOYW1lIF0gXTtcblx0XHRcdFx0Y29uc3QgY29tcG9uZW50VHlwZSA9IFdFQkdMX0NPTVBPTkVOVF9UWVBFU1sgYWNjZXNzb3JEZWYuY29tcG9uZW50VHlwZSBdO1xuXG5cdFx0XHRcdGF0dHJpYnV0ZVR5cGVNYXBbIHRocmVlQXR0cmlidXRlTmFtZSBdID0gY29tcG9uZW50VHlwZTtcblx0XHRcdFx0YXR0cmlidXRlTm9ybWFsaXplZE1hcFsgdGhyZWVBdHRyaWJ1dGVOYW1lIF0gPSBhY2Nlc3NvckRlZi5ub3JtYWxpemVkID09PSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyc2VyLmdldERlcGVuZGVuY3koICdidWZmZXJWaWV3JywgYnVmZmVyVmlld0luZGV4ICkudGhlbiggZnVuY3Rpb24gKCBidWZmZXJWaWV3ICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSApIHtcblxuXHRcdFx0XHRkcmFjb0xvYWRlci5kZWNvZGVEcmFjb0ZpbGUoIGJ1ZmZlclZpZXcsIGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCBjb25zdCBhdHRyaWJ1dGVOYW1lIGluIGdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXNbIGF0dHJpYnV0ZU5hbWUgXTtcblx0XHRcdFx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBhdHRyaWJ1dGVOb3JtYWxpemVkTWFwWyBhdHRyaWJ1dGVOYW1lIF07XG5cblx0XHRcdFx0XHRcdGlmICggbm9ybWFsaXplZCAhPT0gdW5kZWZpbmVkICkgYXR0cmlidXRlLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVzb2x2ZSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0XHR9LCB0aHJlZUF0dHJpYnV0ZU1hcCwgYXR0cmlidXRlVHlwZU1hcCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogVGV4dHVyZSBUcmFuc2Zvcm0gRXh0ZW5zaW9uXG4gKlxuICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX3RleHR1cmVfdHJhbnNmb3JtXG4gKi9cbmNsYXNzIEdMVEZUZXh0dXJlVHJhbnNmb3JtRXh0ZW5zaW9uIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblxuXHRcdHRoaXMubmFtZSA9IEVYVEVOU0lPTlMuS0hSX1RFWFRVUkVfVFJBTlNGT1JNO1xuXG5cdH1cblxuXHRleHRlbmRUZXh0dXJlKCB0ZXh0dXJlLCB0cmFuc2Zvcm0gKSB7XG5cblx0XHRpZiAoIHRyYW5zZm9ybS50ZXhDb29yZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HTFRGTG9hZGVyOiBDdXN0b20gVVYgc2V0cyBpbiBcIicgKyB0aGlzLm5hbWUgKyAnXCIgZXh0ZW5zaW9uIG5vdCB5ZXQgc3VwcG9ydGVkLicgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHJhbnNmb3JtLm9mZnNldCA9PT0gdW5kZWZpbmVkICYmIHRyYW5zZm9ybS5yb3RhdGlvbiA9PT0gdW5kZWZpbmVkICYmIHRyYW5zZm9ybS5zY2FsZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9pc3N1ZXMvMjE4MTkuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmUgPSB0ZXh0dXJlLmNsb25lKCk7XG5cblx0XHRpZiAoIHRyYW5zZm9ybS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCB0cmFuc2Zvcm0ub2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRyYW5zZm9ybS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlLnJvdGF0aW9uID0gdHJhbnNmb3JtLnJvdGF0aW9uO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0cmFuc2Zvcm0uc2NhbGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCB0cmFuc2Zvcm0uc2NhbGUgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59XG5cbi8qKlxuICogU3BlY3VsYXItR2xvc3NpbmVzcyBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWF0ZXJpYWxzX3BiclNwZWN1bGFyR2xvc3NpbmVzc1xuICovXG5cbi8qKlxuICogQSBzdWIgY2xhc3Mgb2YgU3RhbmRhcmRNYXRlcmlhbCB3aXRoIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHlcbiAqIGNoYW5nZWQgdmlhIHRoZSBgb25CZWZvcmVDb21waWxlYCBjYWxsYmFja1xuICogQHBhaWxoZWFkXG4gKi9cbmNsYXNzIEdMVEZNZXNoU3RhbmRhcmRTR01hdGVyaWFsIGV4dGVuZHMgTWVzaFN0YW5kYXJkTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbXMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5pc0dMVEZTcGVjdWxhckdsb3NzaW5lc3NNYXRlcmlhbCA9IHRydWU7XG5cblx0XHQvL3ZhcmlvdXMgY2h1bmtzIHRoYXQgbmVlZCByZXBsYWNpbmdcblx0XHRjb25zdCBzcGVjdWxhck1hcFBhcnNGcmFnbWVudENodW5rID0gW1xuXHRcdFx0JyNpZmRlZiBVU0VfU1BFQ1VMQVJNQVAnLFxuXHRcdFx0J1x0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7Jyxcblx0XHRcdCcjZW5kaWYnXG5cdFx0XS5qb2luKCAnXFxuJyApO1xuXG5cdFx0Y29uc3QgZ2xvc3NpbmVzc01hcFBhcnNGcmFnbWVudENodW5rID0gW1xuXHRcdFx0JyNpZmRlZiBVU0VfR0xPU1NJTkVTU01BUCcsXG5cdFx0XHQnXHR1bmlmb3JtIHNhbXBsZXIyRCBnbG9zc2luZXNzTWFwOycsXG5cdFx0XHQnI2VuZGlmJ1xuXHRcdF0uam9pbiggJ1xcbicgKTtcblxuXHRcdGNvbnN0IHNwZWN1bGFyTWFwRnJhZ21lbnRDaHVuayA9IFtcblx0XHRcdCd2ZWMzIHNwZWN1bGFyRmFjdG9yID0gc3BlY3VsYXI7Jyxcblx0XHRcdCcjaWZkZWYgVVNFX1NQRUNVTEFSTUFQJyxcblx0XHRcdCdcdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApOycsXG5cdFx0XHQnXHR0ZXhlbFNwZWN1bGFyID0gc1JHQlRvTGluZWFyKCB0ZXhlbFNwZWN1bGFyICk7Jyxcblx0XHRcdCdcdC8vIHJlYWRzIGNoYW5uZWwgUkdCLCBjb21wYXRpYmxlIHdpdGggYSBnbFRGIFNwZWN1bGFyLUdsb3NzaW5lc3MgKFJHQkEpIHRleHR1cmUnLFxuXHRcdFx0J1x0c3BlY3VsYXJGYWN0b3IgKj0gdGV4ZWxTcGVjdWxhci5yZ2I7Jyxcblx0XHRcdCcjZW5kaWYnXG5cdFx0XS5qb2luKCAnXFxuJyApO1xuXG5cdFx0Y29uc3QgZ2xvc3NpbmVzc01hcEZyYWdtZW50Q2h1bmsgPSBbXG5cdFx0XHQnZmxvYXQgZ2xvc3NpbmVzc0ZhY3RvciA9IGdsb3NzaW5lc3M7Jyxcblx0XHRcdCcjaWZkZWYgVVNFX0dMT1NTSU5FU1NNQVAnLFxuXHRcdFx0J1x0dmVjNCB0ZXhlbEdsb3NzaW5lc3MgPSB0ZXh0dXJlMkQoIGdsb3NzaW5lc3NNYXAsIHZVdiApOycsXG5cdFx0XHQnXHQvLyByZWFkcyBjaGFubmVsIEEsIGNvbXBhdGlibGUgd2l0aCBhIGdsVEYgU3BlY3VsYXItR2xvc3NpbmVzcyAoUkdCQSkgdGV4dHVyZScsXG5cdFx0XHQnXHRnbG9zc2luZXNzRmFjdG9yICo9IHRleGVsR2xvc3NpbmVzcy5hOycsXG5cdFx0XHQnI2VuZGlmJ1xuXHRcdF0uam9pbiggJ1xcbicgKTtcblxuXHRcdGNvbnN0IGxpZ2h0UGh5c2ljYWxGcmFnbWVudENodW5rID0gW1xuXHRcdFx0J1BoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7Jyxcblx0XHRcdCdtYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLiAtIG1heCggc3BlY3VsYXJGYWN0b3IuciwgbWF4KCBzcGVjdWxhckZhY3Rvci5nLCBzcGVjdWxhckZhY3Rvci5iICkgKSApOycsXG5cdFx0XHQndmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggZ2VvbWV0cnlOb3JtYWwgKSApLCBhYnMoIGRGZHkoIGdlb21ldHJ5Tm9ybWFsICkgKSApOycsXG5cdFx0XHQnZmxvYXQgZ2VvbWV0cnlSb3VnaG5lc3MgPSBtYXgoIG1heCggZHh5LngsIGR4eS55ICksIGR4eS56ICk7Jyxcblx0XHRcdCdtYXRlcmlhbC5yb3VnaG5lc3MgPSBtYXgoIDEuMCAtIGdsb3NzaW5lc3NGYWN0b3IsIDAuMDUyNSApOyAvLyAwLjA1MjUgY29ycmVzcG9uZHMgdG8gdGhlIGJhc2UgbWlwIG9mIGEgMjU2IGN1YmVtYXAuJyxcblx0XHRcdCdtYXRlcmlhbC5yb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7Jyxcblx0XHRcdCdtYXRlcmlhbC5yb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnJvdWdobmVzcywgMS4wICk7Jyxcblx0XHRcdCdtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gc3BlY3VsYXJGYWN0b3I7Jyxcblx0XHRdLmpvaW4oICdcXG4nICk7XG5cblx0XHRjb25zdCB1bmlmb3JtcyA9IHtcblx0XHRcdHNwZWN1bGFyOiB7IHZhbHVlOiBuZXcgQ29sb3IoKS5zZXRIZXgoIDB4ZmZmZmZmICkgfSxcblx0XHRcdGdsb3NzaW5lc3M6IHsgdmFsdWU6IDEgfSxcblx0XHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRnbG9zc2luZXNzTWFwOiB7IHZhbHVlOiBudWxsIH1cblx0XHR9O1xuXG5cdFx0dGhpcy5fZXh0cmFVbmlmb3JtcyA9IHVuaWZvcm1zO1xuXG5cdFx0dGhpcy5vbkJlZm9yZUNvbXBpbGUgPSBmdW5jdGlvbiAoIHNoYWRlciApIHtcblxuXHRcdFx0Zm9yICggY29uc3QgdW5pZm9ybU5hbWUgaW4gdW5pZm9ybXMgKSB7XG5cblx0XHRcdFx0c2hhZGVyLnVuaWZvcm1zWyB1bmlmb3JtTmFtZSBdID0gdW5pZm9ybXNbIHVuaWZvcm1OYW1lIF07XG5cblx0XHRcdH1cblxuXHRcdFx0c2hhZGVyLmZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyXG5cdFx0XHRcdC5yZXBsYWNlKCAndW5pZm9ybSBmbG9hdCByb3VnaG5lc3M7JywgJ3VuaWZvcm0gdmVjMyBzcGVjdWxhcjsnIClcblx0XHRcdFx0LnJlcGxhY2UoICd1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsnLCAndW5pZm9ybSBmbG9hdCBnbG9zc2luZXNzOycgKVxuXHRcdFx0XHQucmVwbGFjZSggJyNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD4nLCBzcGVjdWxhck1hcFBhcnNGcmFnbWVudENodW5rIClcblx0XHRcdFx0LnJlcGxhY2UoICcjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+JywgZ2xvc3NpbmVzc01hcFBhcnNGcmFnbWVudENodW5rIClcblx0XHRcdFx0LnJlcGxhY2UoICcjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PicsIHNwZWN1bGFyTWFwRnJhZ21lbnRDaHVuayApXG5cdFx0XHRcdC5yZXBsYWNlKCAnI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD4nLCBnbG9zc2luZXNzTWFwRnJhZ21lbnRDaHVuayApXG5cdFx0XHRcdC5yZXBsYWNlKCAnI2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD4nLCBsaWdodFBoeXNpY2FsRnJhZ21lbnRDaHVuayApO1xuXG5cdFx0fTtcblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cblx0XHRcdHNwZWN1bGFyOiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm1zLnNwZWN1bGFyLnZhbHVlO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc3BlY3VsYXIudmFsdWUgPSB2O1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdHNwZWN1bGFyTWFwOiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm1zLnNwZWN1bGFyTWFwLnZhbHVlO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNldDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc3BlY3VsYXJNYXAudmFsdWUgPSB2O1xuXG5cdFx0XHRcdFx0aWYgKCB2ICkge1xuXG5cdFx0XHRcdFx0XHR0aGlzLmRlZmluZXMuVVNFX1NQRUNVTEFSTUFQID0gJyc7IC8vIFVTRV9VViBpcyBzZXQgYnkgdGhlIHJlbmRlcmVyIGZvciBzcGVjdWxhciBtYXBzXG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlVTRV9TUEVDVUxBUk1BUDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRnbG9zc2luZXNzOiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm1zLmdsb3NzaW5lc3MudmFsdWU7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5nbG9zc2luZXNzLnZhbHVlID0gdjtcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRnbG9zc2luZXNzTWFwOiB7XG5cdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHVuaWZvcm1zLmdsb3NzaW5lc3NNYXAudmFsdWU7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5nbG9zc2luZXNzTWFwLnZhbHVlID0gdjtcblxuXHRcdFx0XHRcdGlmICggdiApIHtcblxuXHRcdFx0XHRcdFx0dGhpcy5kZWZpbmVzLlVTRV9HTE9TU0lORVNTTUFQID0gJyc7XG5cdFx0XHRcdFx0XHR0aGlzLmRlZmluZXMuVVNFX1VWID0gJyc7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5kZWZpbmVzLlVTRV9HTE9TU0lORVNTTUFQO1xuXHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuZGVmaW5lcy5VU0VfVVY7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdFx0ZGVsZXRlIHRoaXMubWV0YWxuZXNzO1xuXHRcdGRlbGV0ZSB0aGlzLnJvdWdobmVzcztcblx0XHRkZWxldGUgdGhpcy5tZXRhbG5lc3NNYXA7XG5cdFx0ZGVsZXRlIHRoaXMucm91Z2huZXNzTWFwO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtcyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cdFx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0XHR0aGlzLmdsb3NzaW5lc3NNYXAgPSBzb3VyY2UuZ2xvc3NpbmVzc01hcDtcblx0XHR0aGlzLmdsb3NzaW5lc3MgPSBzb3VyY2UuZ2xvc3NpbmVzcztcblx0XHRkZWxldGUgdGhpcy5tZXRhbG5lc3M7XG5cdFx0ZGVsZXRlIHRoaXMucm91Z2huZXNzO1xuXHRcdGRlbGV0ZSB0aGlzLm1ldGFsbmVzc01hcDtcblx0XHRkZWxldGUgdGhpcy5yb3VnaG5lc3NNYXA7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblxuY2xhc3MgR0xURk1hdGVyaWFsc1BiclNwZWN1bGFyR2xvc3NpbmVzc0V4dGVuc2lvbiB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfUEJSX1NQRUNVTEFSX0dMT1NTSU5FU1M7XG5cblx0XHR0aGlzLnNwZWN1bGFyR2xvc3NpbmVzc1BhcmFtcyA9IFtcblx0XHRcdCdjb2xvcicsXG5cdFx0XHQnbWFwJyxcblx0XHRcdCdsaWdodE1hcCcsXG5cdFx0XHQnbGlnaHRNYXBJbnRlbnNpdHknLFxuXHRcdFx0J2FvTWFwJyxcblx0XHRcdCdhb01hcEludGVuc2l0eScsXG5cdFx0XHQnZW1pc3NpdmUnLFxuXHRcdFx0J2VtaXNzaXZlSW50ZW5zaXR5Jyxcblx0XHRcdCdlbWlzc2l2ZU1hcCcsXG5cdFx0XHQnYnVtcE1hcCcsXG5cdFx0XHQnYnVtcFNjYWxlJyxcblx0XHRcdCdub3JtYWxNYXAnLFxuXHRcdFx0J25vcm1hbE1hcFR5cGUnLFxuXHRcdFx0J2Rpc3BsYWNlbWVudE1hcCcsXG5cdFx0XHQnZGlzcGxhY2VtZW50U2NhbGUnLFxuXHRcdFx0J2Rpc3BsYWNlbWVudEJpYXMnLFxuXHRcdFx0J3NwZWN1bGFyTWFwJyxcblx0XHRcdCdzcGVjdWxhcicsXG5cdFx0XHQnZ2xvc3NpbmVzc01hcCcsXG5cdFx0XHQnZ2xvc3NpbmVzcycsXG5cdFx0XHQnYWxwaGFNYXAnLFxuXHRcdFx0J2Vudk1hcCcsXG5cdFx0XHQnZW52TWFwSW50ZW5zaXR5Jyxcblx0XHRcdCdyZWZyYWN0aW9uUmF0aW8nLFxuXHRcdF07XG5cblx0fVxuXG5cdGdldE1hdGVyaWFsVHlwZSgpIHtcblxuXHRcdHJldHVybiBHTFRGTWVzaFN0YW5kYXJkU0dNYXRlcmlhbDtcblxuXHR9XG5cblx0ZXh0ZW5kUGFyYW1zKCBtYXRlcmlhbFBhcmFtcywgbWF0ZXJpYWxEZWYsIHBhcnNlciApIHtcblxuXHRcdGNvbnN0IHBiclNwZWN1bGFyR2xvc3NpbmVzcyA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnNbIHRoaXMubmFtZSBdO1xuXG5cdFx0bWF0ZXJpYWxQYXJhbXMuY29sb3IgPSBuZXcgQ29sb3IoIDEuMCwgMS4wLCAxLjAgKTtcblx0XHRtYXRlcmlhbFBhcmFtcy5vcGFjaXR5ID0gMS4wO1xuXG5cdFx0Y29uc3QgcGVuZGluZyA9IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBwYnJTcGVjdWxhckdsb3NzaW5lc3MuZGlmZnVzZUZhY3RvciApICkge1xuXG5cdFx0XHRjb25zdCBhcnJheSA9IHBiclNwZWN1bGFyR2xvc3NpbmVzcy5kaWZmdXNlRmFjdG9yO1xuXG5cdFx0XHRtYXRlcmlhbFBhcmFtcy5jb2xvci5mcm9tQXJyYXkoIGFycmF5ICk7XG5cdFx0XHRtYXRlcmlhbFBhcmFtcy5vcGFjaXR5ID0gYXJyYXlbIDMgXTtcblxuXHRcdH1cblxuXHRcdGlmICggcGJyU3BlY3VsYXJHbG9zc2luZXNzLmRpZmZ1c2VUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAnbWFwJywgcGJyU3BlY3VsYXJHbG9zc2luZXNzLmRpZmZ1c2VUZXh0dXJlICkgKTtcblxuXHRcdH1cblxuXHRcdG1hdGVyaWFsUGFyYW1zLmVtaXNzaXZlID0gbmV3IENvbG9yKCAwLjAsIDAuMCwgMC4wICk7XG5cdFx0bWF0ZXJpYWxQYXJhbXMuZ2xvc3NpbmVzcyA9IHBiclNwZWN1bGFyR2xvc3NpbmVzcy5nbG9zc2luZXNzRmFjdG9yICE9PSB1bmRlZmluZWQgPyBwYnJTcGVjdWxhckdsb3NzaW5lc3MuZ2xvc3NpbmVzc0ZhY3RvciA6IDEuMDtcblx0XHRtYXRlcmlhbFBhcmFtcy5zcGVjdWxhciA9IG5ldyBDb2xvciggMS4wLCAxLjAsIDEuMCApO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBwYnJTcGVjdWxhckdsb3NzaW5lc3Muc3BlY3VsYXJGYWN0b3IgKSApIHtcblxuXHRcdFx0bWF0ZXJpYWxQYXJhbXMuc3BlY3VsYXIuZnJvbUFycmF5KCBwYnJTcGVjdWxhckdsb3NzaW5lc3Muc3BlY3VsYXJGYWN0b3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcGJyU3BlY3VsYXJHbG9zc2luZXNzLnNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3Qgc3BlY0dsb3NzTWFwRGVmID0gcGJyU3BlY3VsYXJHbG9zc2luZXNzLnNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmU7XG5cdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ2dsb3NzaW5lc3NNYXAnLCBzcGVjR2xvc3NNYXBEZWYgKSApO1xuXHRcdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIuYXNzaWduVGV4dHVyZSggbWF0ZXJpYWxQYXJhbXMsICdzcGVjdWxhck1hcCcsIHNwZWNHbG9zc01hcERlZiApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoIHBlbmRpbmcgKTtcblxuXHR9XG5cblx0Y3JlYXRlTWF0ZXJpYWwoIG1hdGVyaWFsUGFyYW1zICkge1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgR0xURk1lc2hTdGFuZGFyZFNHTWF0ZXJpYWwoIG1hdGVyaWFsUGFyYW1zICk7XG5cdFx0bWF0ZXJpYWwuZm9nID0gdHJ1ZTtcblxuXHRcdG1hdGVyaWFsLmNvbG9yID0gbWF0ZXJpYWxQYXJhbXMuY29sb3I7XG5cblx0XHRtYXRlcmlhbC5tYXAgPSBtYXRlcmlhbFBhcmFtcy5tYXAgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtYXRlcmlhbFBhcmFtcy5tYXA7XG5cblx0XHRtYXRlcmlhbC5saWdodE1hcCA9IG51bGw7XG5cdFx0bWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHRtYXRlcmlhbC5hb01hcCA9IG1hdGVyaWFsUGFyYW1zLmFvTWFwID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0ZXJpYWxQYXJhbXMuYW9NYXA7XG5cdFx0bWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHRtYXRlcmlhbC5lbWlzc2l2ZSA9IG1hdGVyaWFsUGFyYW1zLmVtaXNzaXZlO1xuXHRcdG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdG1hdGVyaWFsLmVtaXNzaXZlTWFwID0gbWF0ZXJpYWxQYXJhbXMuZW1pc3NpdmVNYXAgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtYXRlcmlhbFBhcmFtcy5lbWlzc2l2ZU1hcDtcblxuXHRcdG1hdGVyaWFsLmJ1bXBNYXAgPSBtYXRlcmlhbFBhcmFtcy5idW1wTWFwID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0ZXJpYWxQYXJhbXMuYnVtcE1hcDtcblx0XHRtYXRlcmlhbC5idW1wU2NhbGUgPSAxO1xuXG5cdFx0bWF0ZXJpYWwubm9ybWFsTWFwID0gbWF0ZXJpYWxQYXJhbXMubm9ybWFsTWFwID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0ZXJpYWxQYXJhbXMubm9ybWFsTWFwO1xuXHRcdG1hdGVyaWFsLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsUGFyYW1zLm5vcm1hbFNjYWxlICkgbWF0ZXJpYWwubm9ybWFsU2NhbGUgPSBtYXRlcmlhbFBhcmFtcy5ub3JtYWxTY2FsZTtcblxuXHRcdG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdFx0bWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdFx0bWF0ZXJpYWwuc3BlY3VsYXJNYXAgPSBtYXRlcmlhbFBhcmFtcy5zcGVjdWxhck1hcCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG1hdGVyaWFsUGFyYW1zLnNwZWN1bGFyTWFwO1xuXHRcdG1hdGVyaWFsLnNwZWN1bGFyID0gbWF0ZXJpYWxQYXJhbXMuc3BlY3VsYXI7XG5cblx0XHRtYXRlcmlhbC5nbG9zc2luZXNzTWFwID0gbWF0ZXJpYWxQYXJhbXMuZ2xvc3NpbmVzc01hcCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG1hdGVyaWFsUGFyYW1zLmdsb3NzaW5lc3NNYXA7XG5cdFx0bWF0ZXJpYWwuZ2xvc3NpbmVzcyA9IG1hdGVyaWFsUGFyYW1zLmdsb3NzaW5lc3M7XG5cblx0XHRtYXRlcmlhbC5hbHBoYU1hcCA9IG51bGw7XG5cblx0XHRtYXRlcmlhbC5lbnZNYXAgPSBtYXRlcmlhbFBhcmFtcy5lbnZNYXAgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBtYXRlcmlhbFBhcmFtcy5lbnZNYXA7XG5cdFx0bWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0bWF0ZXJpYWwucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBNZXNoIFF1YW50aXphdGlvbiBFeHRlbnNpb25cbiAqXG4gKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvdHJlZS9tYXN0ZXIvZXh0ZW5zaW9ucy8yLjAvS2hyb25vcy9LSFJfbWVzaF9xdWFudGl6YXRpb25cbiAqL1xuY2xhc3MgR0xURk1lc2hRdWFudGl6YXRpb25FeHRlbnNpb24ge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy5uYW1lID0gRVhURU5TSU9OUy5LSFJfTUVTSF9RVUFOVElaQVRJT047XG5cblx0fVxuXG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKiBJTlRFUlBPTEFUSU9OICoqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gU3BsaW5lIEludGVycG9sYXRpb25cbi8vIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMC9SRUFETUUubWQjYXBwZW5kaXgtYy1zcGxpbmUtaW50ZXJwb2xhdGlvblxuY2xhc3MgR0xURkN1YmljU3BsaW5lSW50ZXJwb2xhbnQgZXh0ZW5kcyBJbnRlcnBvbGFudCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0XHRzdXBlciggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdH1cblxuXHRjb3B5U2FtcGxlVmFsdWVfKCBpbmRleCApIHtcblxuXHRcdC8vIENvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlci4gU2VlIGRlc2NyaXB0aW9uIG9mIGdsVEZcblx0XHQvLyBDVUJJQ1NQTElORSB2YWx1ZXMgbGF5b3V0IGluIGludGVycG9sYXRlXygpIGZ1bmN0aW9uIGJlbG93LlxuXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHZhbHVlU2l6ZSA9IHRoaXMudmFsdWVTaXplLFxuXHRcdFx0b2Zmc2V0ID0gaW5kZXggKiB2YWx1ZVNpemUgKiAzICsgdmFsdWVTaXplO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSB2YWx1ZVNpemU7IGkgKysgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufVxuXG5HTFRGQ3ViaWNTcGxpbmVJbnRlcnBvbGFudC5wcm90b3R5cGUuYmVmb3JlU3RhcnRfID0gR0xURkN1YmljU3BsaW5lSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV87XG5cbkdMVEZDdWJpY1NwbGluZUludGVycG9sYW50LnByb3RvdHlwZS5hZnRlckVuZF8gPSBHTFRGQ3ViaWNTcGxpbmVJbnRlcnBvbGFudC5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXztcblxuR0xURkN1YmljU3BsaW5lSW50ZXJwb2xhbnQucHJvdG90eXBlLmludGVycG9sYXRlXyA9IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcjtcblx0Y29uc3QgdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXM7XG5cdGNvbnN0IHN0cmlkZSA9IHRoaXMudmFsdWVTaXplO1xuXG5cdGNvbnN0IHN0cmlkZTIgPSBzdHJpZGUgKiAyO1xuXHRjb25zdCBzdHJpZGUzID0gc3RyaWRlICogMztcblxuXHRjb25zdCB0ZCA9IHQxIC0gdDA7XG5cblx0Y29uc3QgcCA9ICggdCAtIHQwICkgLyB0ZDtcblx0Y29uc3QgcHAgPSBwICogcDtcblx0Y29uc3QgcHBwID0gcHAgKiBwO1xuXG5cdGNvbnN0IG9mZnNldDEgPSBpMSAqIHN0cmlkZTM7XG5cdGNvbnN0IG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlMztcblxuXHRjb25zdCBzMiA9IC0gMiAqIHBwcCArIDMgKiBwcDtcblx0Y29uc3QgczMgPSBwcHAgLSBwcDtcblx0Y29uc3QgczAgPSAxIC0gczI7XG5cdGNvbnN0IHMxID0gczMgLSBwcCArIHA7XG5cblx0Ly8gTGF5b3V0IG9mIGtleWZyYW1lIG91dHB1dCB2YWx1ZXMgZm9yIENVQklDU1BMSU5FIGFuaW1hdGlvbnM6XG5cdC8vICAgWyBpblRhbmdlbnRfMSwgc3BsaW5lVmVydGV4XzEsIG91dFRhbmdlbnRfMSwgaW5UYW5nZW50XzIsIHNwbGluZVZlcnRleF8yLCAuLi4gXVxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IHN0cmlkZTsgaSArKyApIHtcblxuXHRcdGNvbnN0IHAwID0gdmFsdWVzWyBvZmZzZXQwICsgaSArIHN0cmlkZSBdOyAvLyBzcGxpbmVWZXJ0ZXhfa1xuXHRcdGNvbnN0IG0wID0gdmFsdWVzWyBvZmZzZXQwICsgaSArIHN0cmlkZTIgXSAqIHRkOyAvLyBvdXRUYW5nZW50X2sgKiAodF9rKzEgLSB0X2spXG5cdFx0Y29uc3QgcDEgPSB2YWx1ZXNbIG9mZnNldDEgKyBpICsgc3RyaWRlIF07IC8vIHNwbGluZVZlcnRleF9rKzFcblx0XHRjb25zdCBtMSA9IHZhbHVlc1sgb2Zmc2V0MSArIGkgXSAqIHRkOyAvLyBpblRhbmdlbnRfaysxICogKHRfaysxIC0gdF9rKVxuXG5cdFx0cmVzdWx0WyBpIF0gPSBzMCAqIHAwICsgczEgKiBtMCArIHMyICogcDEgKyBzMyAqIG0xO1xuXG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xuXG59O1xuXG5jb25zdCBfcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmNsYXNzIEdMVEZDdWJpY1NwbGluZVF1YXRlcm5pb25JbnRlcnBvbGFudCBleHRlbmRzIEdMVEZDdWJpY1NwbGluZUludGVycG9sYW50IHtcblxuXHRpbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHRjb25zdCByZXN1bHQgPSBzdXBlci5pbnRlcnBvbGF0ZV8oIGkxLCB0MCwgdCwgdDEgKTtcblxuXHRcdF9xLmZyb21BcnJheSggcmVzdWx0ICkubm9ybWFsaXplKCkudG9BcnJheSggcmVzdWx0ICk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufVxuXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4vKioqKioqKioqKiBJTlRFUk5BTFMgKioqKioqKioqKioqL1xuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyogQ09OU1RBTlRTICovXG5cbmNvbnN0IFdFQkdMX0NPTlNUQU5UUyA9IHtcblx0RkxPQVQ6IDUxMjYsXG5cdC8vRkxPQVRfTUFUMjogMzU2NzQsXG5cdEZMT0FUX01BVDM6IDM1Njc1LFxuXHRGTE9BVF9NQVQ0OiAzNTY3Nixcblx0RkxPQVRfVkVDMjogMzU2NjQsXG5cdEZMT0FUX1ZFQzM6IDM1NjY1LFxuXHRGTE9BVF9WRUM0OiAzNTY2Nixcblx0TElORUFSOiA5NzI5LFxuXHRSRVBFQVQ6IDEwNDk3LFxuXHRTQU1QTEVSXzJEOiAzNTY3OCxcblx0UE9JTlRTOiAwLFxuXHRMSU5FUzogMSxcblx0TElORV9MT09QOiAyLFxuXHRMSU5FX1NUUklQOiAzLFxuXHRUUklBTkdMRVM6IDQsXG5cdFRSSUFOR0xFX1NUUklQOiA1LFxuXHRUUklBTkdMRV9GQU46IDYsXG5cdFVOU0lHTkVEX0JZVEU6IDUxMjEsXG5cdFVOU0lHTkVEX1NIT1JUOiA1MTIzXG59O1xuXG5jb25zdCBXRUJHTF9DT01QT05FTlRfVFlQRVMgPSB7XG5cdDUxMjA6IEludDhBcnJheSxcblx0NTEyMTogVWludDhBcnJheSxcblx0NTEyMjogSW50MTZBcnJheSxcblx0NTEyMzogVWludDE2QXJyYXksXG5cdDUxMjU6IFVpbnQzMkFycmF5LFxuXHQ1MTI2OiBGbG9hdDMyQXJyYXlcbn07XG5cbmNvbnN0IFdFQkdMX0ZJTFRFUlMgPSB7XG5cdDk3Mjg6IE5lYXJlc3RGaWx0ZXIsXG5cdDk3Mjk6IExpbmVhckZpbHRlcixcblx0OTk4NDogTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIsXG5cdDk5ODU6IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsXG5cdDk5ODY6IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsXG5cdDk5ODc6IExpbmVhck1pcG1hcExpbmVhckZpbHRlclxufTtcblxuY29uc3QgV0VCR0xfV1JBUFBJTkdTID0ge1xuXHQzMzA3MTogQ2xhbXBUb0VkZ2VXcmFwcGluZyxcblx0MzM2NDg6IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsXG5cdDEwNDk3OiBSZXBlYXRXcmFwcGluZ1xufTtcblxuY29uc3QgV0VCR0xfVFlQRV9TSVpFUyA9IHtcblx0J1NDQUxBUic6IDEsXG5cdCdWRUMyJzogMixcblx0J1ZFQzMnOiAzLFxuXHQnVkVDNCc6IDQsXG5cdCdNQVQyJzogNCxcblx0J01BVDMnOiA5LFxuXHQnTUFUNCc6IDE2XG59O1xuXG5jb25zdCBBVFRSSUJVVEVTID0ge1xuXHRQT1NJVElPTjogJ3Bvc2l0aW9uJyxcblx0Tk9STUFMOiAnbm9ybWFsJyxcblx0VEFOR0VOVDogJ3RhbmdlbnQnLFxuXHRURVhDT09SRF8wOiAndXYnLFxuXHRURVhDT09SRF8xOiAndXYyJyxcblx0Q09MT1JfMDogJ2NvbG9yJyxcblx0V0VJR0hUU18wOiAnc2tpbldlaWdodCcsXG5cdEpPSU5UU18wOiAnc2tpbkluZGV4Jyxcbn07XG5cbmNvbnN0IFBBVEhfUFJPUEVSVElFUyA9IHtcblx0c2NhbGU6ICdzY2FsZScsXG5cdHRyYW5zbGF0aW9uOiAncG9zaXRpb24nLFxuXHRyb3RhdGlvbjogJ3F1YXRlcm5pb24nLFxuXHR3ZWlnaHRzOiAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJ1xufTtcblxuY29uc3QgSU5URVJQT0xBVElPTiA9IHtcblx0Q1VCSUNTUExJTkU6IHVuZGVmaW5lZCwgLy8gV2UgdXNlIGEgY3VzdG9tIGludGVycG9sYW50IChHTFRGQ3ViaWNTcGxpbmVJbnRlcnBvbGF0aW9uKSBmb3IgQ1VCSUNTUExJTkUgdHJhY2tzLiBFYWNoXG5cdFx0ICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2V5ZnJhbWUgdHJhY2sgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIGEgZGVmYXVsdCBpbnRlcnBvbGF0aW9uIHR5cGUsIHRoZW4gbW9kaWZpZWQuXG5cdExJTkVBUjogSW50ZXJwb2xhdGVMaW5lYXIsXG5cdFNURVA6IEludGVycG9sYXRlRGlzY3JldGVcbn07XG5cbmNvbnN0IEFMUEhBX01PREVTID0ge1xuXHRPUEFRVUU6ICdPUEFRVUUnLFxuXHRNQVNLOiAnTUFTSycsXG5cdEJMRU5EOiAnQkxFTkQnXG59O1xuXG4vKipcbiAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMC9SRUFETUUubWQjZGVmYXVsdC1tYXRlcmlhbFxuICovXG5mdW5jdGlvbiBjcmVhdGVEZWZhdWx0TWF0ZXJpYWwoIGNhY2hlICkge1xuXG5cdGlmICggY2FjaGVbICdEZWZhdWx0TWF0ZXJpYWwnIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGNhY2hlWyAnRGVmYXVsdE1hdGVyaWFsJyBdID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKCB7XG5cdFx0XHRjb2xvcjogMHhGRkZGRkYsXG5cdFx0XHRlbWlzc2l2ZTogMHgwMDAwMDAsXG5cdFx0XHRtZXRhbG5lc3M6IDEsXG5cdFx0XHRyb3VnaG5lc3M6IDEsXG5cdFx0XHR0cmFuc3BhcmVudDogZmFsc2UsXG5cdFx0XHRkZXB0aFRlc3Q6IHRydWUsXG5cdFx0XHRzaWRlOiBGcm9udFNpZGVcblx0XHR9ICk7XG5cblx0fVxuXG5cdHJldHVybiBjYWNoZVsgJ0RlZmF1bHRNYXRlcmlhbCcgXTtcblxufVxuXG5mdW5jdGlvbiBhZGRVbmtub3duRXh0ZW5zaW9uc1RvVXNlckRhdGEoIGtub3duRXh0ZW5zaW9ucywgb2JqZWN0LCBvYmplY3REZWYgKSB7XG5cblx0Ly8gQWRkIHVua25vd24gZ2xURiBleHRlbnNpb25zIHRvIGFuIG9iamVjdCdzIHVzZXJEYXRhLlxuXG5cdGZvciAoIGNvbnN0IG5hbWUgaW4gb2JqZWN0RGVmLmV4dGVuc2lvbnMgKSB7XG5cblx0XHRpZiAoIGtub3duRXh0ZW5zaW9uc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG9iamVjdC51c2VyRGF0YS5nbHRmRXh0ZW5zaW9ucyA9IG9iamVjdC51c2VyRGF0YS5nbHRmRXh0ZW5zaW9ucyB8fCB7fTtcblx0XHRcdG9iamVjdC51c2VyRGF0YS5nbHRmRXh0ZW5zaW9uc1sgbmFtZSBdID0gb2JqZWN0RGVmLmV4dGVuc2lvbnNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdDNEfE1hdGVyaWFsfEJ1ZmZlckdlb21ldHJ5fSBvYmplY3RcbiAqIEBwYXJhbSB7R0xURi5kZWZpbml0aW9ufSBnbHRmRGVmXG4gKi9cbmZ1bmN0aW9uIGFzc2lnbkV4dHJhc1RvVXNlckRhdGEoIG9iamVjdCwgZ2x0ZkRlZiApIHtcblxuXHRpZiAoIGdsdGZEZWYuZXh0cmFzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBnbHRmRGVmLmV4dHJhcyA9PT0gJ29iamVjdCcgKSB7XG5cblx0XHRcdE9iamVjdC5hc3NpZ24oIG9iamVjdC51c2VyRGF0YSwgZ2x0ZkRlZi5leHRyYXMgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdMVEZMb2FkZXI6IElnbm9yaW5nIHByaW1pdGl2ZSB0eXBlIC5leHRyYXMsICcgKyBnbHRmRGVmLmV4dHJhcyApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMC9SRUFETUUubWQjbW9ycGgtdGFyZ2V0c1xuICpcbiAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5XG4gKiBAcGFyYW0ge0FycmF5PEdMVEYuVGFyZ2V0Pn0gdGFyZ2V0c1xuICogQHBhcmFtIHtHTFRGUGFyc2VyfSBwYXJzZXJcbiAqIEByZXR1cm4ge1Byb21pc2U8QnVmZmVyR2VvbWV0cnk+fVxuICovXG5mdW5jdGlvbiBhZGRNb3JwaFRhcmdldHMoIGdlb21ldHJ5LCB0YXJnZXRzLCBwYXJzZXIgKSB7XG5cblx0bGV0IGhhc01vcnBoUG9zaXRpb24gPSBmYWxzZTtcblx0bGV0IGhhc01vcnBoTm9ybWFsID0gZmFsc2U7XG5cblx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRjb25zdCB0YXJnZXQgPSB0YXJnZXRzWyBpIF07XG5cblx0XHRpZiAoIHRhcmdldC5QT1NJVElPTiAhPT0gdW5kZWZpbmVkICkgaGFzTW9ycGhQb3NpdGlvbiA9IHRydWU7XG5cdFx0aWYgKCB0YXJnZXQuTk9STUFMICE9PSB1bmRlZmluZWQgKSBoYXNNb3JwaE5vcm1hbCA9IHRydWU7XG5cblx0XHRpZiAoIGhhc01vcnBoUG9zaXRpb24gJiYgaGFzTW9ycGhOb3JtYWwgKSBicmVhaztcblxuXHR9XG5cblx0aWYgKCAhIGhhc01vcnBoUG9zaXRpb24gJiYgISBoYXNNb3JwaE5vcm1hbCApIHJldHVybiBQcm9taXNlLnJlc29sdmUoIGdlb21ldHJ5ICk7XG5cblx0Y29uc3QgcGVuZGluZ1Bvc2l0aW9uQWNjZXNzb3JzID0gW107XG5cdGNvbnN0IHBlbmRpbmdOb3JtYWxBY2Nlc3NvcnMgPSBbXTtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdGNvbnN0IHRhcmdldCA9IHRhcmdldHNbIGkgXTtcblxuXHRcdGlmICggaGFzTW9ycGhQb3NpdGlvbiApIHtcblxuXHRcdFx0Y29uc3QgcGVuZGluZ0FjY2Vzc29yID0gdGFyZ2V0LlBPU0lUSU9OICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBwYXJzZXIuZ2V0RGVwZW5kZW5jeSggJ2FjY2Vzc29yJywgdGFyZ2V0LlBPU0lUSU9OIClcblx0XHRcdFx0OiBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRwZW5kaW5nUG9zaXRpb25BY2Nlc3NvcnMucHVzaCggcGVuZGluZ0FjY2Vzc29yICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGhhc01vcnBoTm9ybWFsICkge1xuXG5cdFx0XHRjb25zdCBwZW5kaW5nQWNjZXNzb3IgPSB0YXJnZXQuTk9STUFMICE9PSB1bmRlZmluZWRcblx0XHRcdFx0PyBwYXJzZXIuZ2V0RGVwZW5kZW5jeSggJ2FjY2Vzc29yJywgdGFyZ2V0Lk5PUk1BTCApXG5cdFx0XHRcdDogZ2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdHBlbmRpbmdOb3JtYWxBY2Nlc3NvcnMucHVzaCggcGVuZGluZ0FjY2Vzc29yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBQcm9taXNlLmFsbCggW1xuXHRcdFByb21pc2UuYWxsKCBwZW5kaW5nUG9zaXRpb25BY2Nlc3NvcnMgKSxcblx0XHRQcm9taXNlLmFsbCggcGVuZGluZ05vcm1hbEFjY2Vzc29ycyApXG5cdF0gKS50aGVuKCBmdW5jdGlvbiAoIGFjY2Vzc29ycyApIHtcblxuXHRcdGNvbnN0IG1vcnBoUG9zaXRpb25zID0gYWNjZXNzb3JzWyAwIF07XG5cdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gYWNjZXNzb3JzWyAxIF07XG5cblx0XHRpZiAoIGhhc01vcnBoUG9zaXRpb24gKSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gPSBtb3JwaFBvc2l0aW9ucztcblx0XHRpZiAoIGhhc01vcnBoTm9ybWFsICkgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCA9IG1vcnBoTm9ybWFscztcblx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRydWU7XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fSApO1xuXG59XG5cbi8qKlxuICogQHBhcmFtIHtNZXNofSBtZXNoXG4gKiBAcGFyYW0ge0dMVEYuTWVzaH0gbWVzaERlZlxuICovXG5mdW5jdGlvbiB1cGRhdGVNb3JwaFRhcmdldHMoIG1lc2gsIG1lc2hEZWYgKSB7XG5cblx0bWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKTtcblxuXHRpZiAoIG1lc2hEZWYud2VpZ2h0cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1lc2hEZWYud2VpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0bWVzaC5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSA9IG1lc2hEZWYud2VpZ2h0c1sgaSBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyAuZXh0cmFzIGhhcyB1c2VyLWRlZmluZWQgZGF0YSwgc28gY2hlY2sgdGhhdCAuZXh0cmFzLnRhcmdldE5hbWVzIGlzIGFuIGFycmF5LlxuXHRpZiAoIG1lc2hEZWYuZXh0cmFzICYmIEFycmF5LmlzQXJyYXkoIG1lc2hEZWYuZXh0cmFzLnRhcmdldE5hbWVzICkgKSB7XG5cblx0XHRjb25zdCB0YXJnZXROYW1lcyA9IG1lc2hEZWYuZXh0cmFzLnRhcmdldE5hbWVzO1xuXG5cdFx0aWYgKCBtZXNoLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5sZW5ndGggPT09IHRhcmdldE5hbWVzLmxlbmd0aCApIHtcblxuXHRcdFx0bWVzaC5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRhcmdldE5hbWVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1lc2gubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyB0YXJnZXROYW1lc1sgaSBdIF0gPSBpO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HTFRGTG9hZGVyOiBJbnZhbGlkIGV4dHJhcy50YXJnZXROYW1lcyBsZW5ndGguIElnbm9yaW5nIG5hbWVzLicgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlS2V5KCBwcmltaXRpdmVEZWYgKSB7XG5cblx0Y29uc3QgZHJhY29FeHRlbnNpb24gPSBwcmltaXRpdmVEZWYuZXh0ZW5zaW9ucyAmJiBwcmltaXRpdmVEZWYuZXh0ZW5zaW9uc1sgRVhURU5TSU9OUy5LSFJfRFJBQ09fTUVTSF9DT01QUkVTU0lPTiBdO1xuXHRsZXQgZ2VvbWV0cnlLZXk7XG5cblx0aWYgKCBkcmFjb0V4dGVuc2lvbiApIHtcblxuXHRcdGdlb21ldHJ5S2V5ID0gJ2RyYWNvOicgKyBkcmFjb0V4dGVuc2lvbi5idWZmZXJWaWV3XG5cdFx0XHRcdCsgJzonICsgZHJhY29FeHRlbnNpb24uaW5kaWNlc1xuXHRcdFx0XHQrICc6JyArIGNyZWF0ZUF0dHJpYnV0ZXNLZXkoIGRyYWNvRXh0ZW5zaW9uLmF0dHJpYnV0ZXMgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Z2VvbWV0cnlLZXkgPSBwcmltaXRpdmVEZWYuaW5kaWNlcyArICc6JyArIGNyZWF0ZUF0dHJpYnV0ZXNLZXkoIHByaW1pdGl2ZURlZi5hdHRyaWJ1dGVzICkgKyAnOicgKyBwcmltaXRpdmVEZWYubW9kZTtcblxuXHR9XG5cblx0cmV0dXJuIGdlb21ldHJ5S2V5O1xuXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUF0dHJpYnV0ZXNLZXkoIGF0dHJpYnV0ZXMgKSB7XG5cblx0bGV0IGF0dHJpYnV0ZXNLZXkgPSAnJztcblxuXHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoIGF0dHJpYnV0ZXMgKS5zb3J0KCk7XG5cblx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGtleXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRhdHRyaWJ1dGVzS2V5ICs9IGtleXNbIGkgXSArICc6JyArIGF0dHJpYnV0ZXNbIGtleXNbIGkgXSBdICsgJzsnO1xuXG5cdH1cblxuXHRyZXR1cm4gYXR0cmlidXRlc0tleTtcblxufVxuXG5mdW5jdGlvbiBnZXROb3JtYWxpemVkQ29tcG9uZW50U2NhbGUoIGNvbnN0cnVjdG9yICkge1xuXG5cdC8vIFJlZmVyZW5jZTpcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL2V4dGVuc2lvbnMvMi4wL0tocm9ub3MvS0hSX21lc2hfcXVhbnRpemF0aW9uI2VuY29kaW5nLXF1YW50aXplZC1kYXRhXG5cblx0c3dpdGNoICggY29uc3RydWN0b3IgKSB7XG5cblx0XHRjYXNlIEludDhBcnJheTpcblx0XHRcdHJldHVybiAxIC8gMTI3O1xuXG5cdFx0Y2FzZSBVaW50OEFycmF5OlxuXHRcdFx0cmV0dXJuIDEgLyAyNTU7XG5cblx0XHRjYXNlIEludDE2QXJyYXk6XG5cdFx0XHRyZXR1cm4gMSAvIDMyNzY3O1xuXG5cdFx0Y2FzZSBVaW50MTZBcnJheTpcblx0XHRcdHJldHVybiAxIC8gNjU1MzU7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuR0xURkxvYWRlcjogVW5zdXBwb3J0ZWQgbm9ybWFsaXplZCBhY2Nlc3NvciBjb21wb25lbnQgdHlwZS4nICk7XG5cblx0fVxuXG59XG5cbi8qIEdMVEYgUEFSU0VSICovXG5cbmNsYXNzIEdMVEZQYXJzZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBqc29uID0ge30sIG9wdGlvbnMgPSB7fSApIHtcblxuXHRcdHRoaXMuanNvbiA9IGpzb247XG5cdFx0dGhpcy5leHRlbnNpb25zID0ge307XG5cdFx0dGhpcy5wbHVnaW5zID0ge307XG5cdFx0dGhpcy5vcHRpb25zID0gb3B0aW9ucztcblxuXHRcdC8vIGxvYWRlciBvYmplY3QgY2FjaGVcblx0XHR0aGlzLmNhY2hlID0gbmV3IEdMVEZSZWdpc3RyeSgpO1xuXG5cdFx0Ly8gYXNzb2NpYXRpb25zIGJldHdlZW4gVGhyZWUuanMgb2JqZWN0cyBhbmQgZ2xURiBlbGVtZW50c1xuXHRcdHRoaXMuYXNzb2NpYXRpb25zID0gbmV3IE1hcCgpO1xuXG5cdFx0Ly8gQnVmZmVyR2VvbWV0cnkgY2FjaGluZ1xuXHRcdHRoaXMucHJpbWl0aXZlQ2FjaGUgPSB7fTtcblxuXHRcdC8vIE9iamVjdDNEIGluc3RhbmNlIGNhY2hlc1xuXHRcdHRoaXMubWVzaENhY2hlID0geyByZWZzOiB7fSwgdXNlczoge30gfTtcblx0XHR0aGlzLmNhbWVyYUNhY2hlID0geyByZWZzOiB7fSwgdXNlczoge30gfTtcblx0XHR0aGlzLmxpZ2h0Q2FjaGUgPSB7IHJlZnM6IHt9LCB1c2VzOiB7fSB9O1xuXG5cdFx0dGhpcy50ZXh0dXJlQ2FjaGUgPSB7fTtcblxuXHRcdC8vIFRyYWNrIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBubyBkdXBsaWNhdGVzXG5cdFx0dGhpcy5ub2RlTmFtZXNVc2VkID0ge307XG5cblx0XHQvLyBVc2UgYW4gSW1hZ2VCaXRtYXBMb2FkZXIgaWYgaW1hZ2VCaXRtYXBzIGFyZSBzdXBwb3J0ZWQuIE1vdmVzIG11Y2ggb2YgdGhlXG5cdFx0Ly8gZXhwZW5zaXZlIHdvcmsgb2YgdXBsb2FkaW5nIGEgdGV4dHVyZSB0byB0aGUgR1BVIG9mZiB0aGUgbWFpbiB0aHJlYWQuXG5cdFx0aWYgKCB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgIT09ICd1bmRlZmluZWQnICYmIC9GaXJlZm94Ly50ZXN0KCBuYXZpZ2F0b3IudXNlckFnZW50ICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHR0aGlzLnRleHR1cmVMb2FkZXIgPSBuZXcgSW1hZ2VCaXRtYXBMb2FkZXIoIHRoaXMub3B0aW9ucy5tYW5hZ2VyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRleHR1cmVMb2FkZXIgPSBuZXcgVGV4dHVyZUxvYWRlciggdGhpcy5vcHRpb25zLm1hbmFnZXIgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGV4dHVyZUxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5vcHRpb25zLmNyb3NzT3JpZ2luICk7XG5cdFx0dGhpcy50ZXh0dXJlTG9hZGVyLnNldFJlcXVlc3RIZWFkZXIoIHRoaXMub3B0aW9ucy5yZXF1ZXN0SGVhZGVyICk7XG5cblx0XHR0aGlzLmZpbGVMb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5vcHRpb25zLm1hbmFnZXIgKTtcblx0XHR0aGlzLmZpbGVMb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5jcm9zc09yaWdpbiA9PT0gJ3VzZS1jcmVkZW50aWFscycgKSB7XG5cblx0XHRcdHRoaXMuZmlsZUxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRydWUgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0RXh0ZW5zaW9ucyggZXh0ZW5zaW9ucyApIHtcblxuXHRcdHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cblx0fVxuXG5cdHNldFBsdWdpbnMoIHBsdWdpbnMgKSB7XG5cblx0XHR0aGlzLnBsdWdpbnMgPSBwbHVnaW5zO1xuXG5cdH1cblxuXHRwYXJzZSggb25Mb2FkLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcztcblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG5cblx0XHQvLyBDbGVhciB0aGUgbG9hZGVyIGNhY2hlXG5cdFx0dGhpcy5jYWNoZS5yZW1vdmVBbGwoKTtcblxuXHRcdC8vIE1hcmsgdGhlIHNwZWNpYWwgbm9kZXMvbWVzaGVzIGluIGpzb24gZm9yIGVmZmljaWVudCBwYXJzZVxuXHRcdHRoaXMuX2ludm9rZUFsbCggZnVuY3Rpb24gKCBleHQgKSB7XG5cblx0XHRcdHJldHVybiBleHQuX21hcmtEZWZzICYmIGV4dC5fbWFya0RlZnMoKTtcblxuXHRcdH0gKTtcblxuXHRcdFByb21pc2UuYWxsKCB0aGlzLl9pbnZva2VBbGwoIGZ1bmN0aW9uICggZXh0ICkge1xuXG5cdFx0XHRyZXR1cm4gZXh0LmJlZm9yZVJvb3QgJiYgZXh0LmJlZm9yZVJvb3QoKTtcblxuXHRcdH0gKSApLnRoZW4oIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UuYWxsKCBbXG5cblx0XHRcdFx0cGFyc2VyLmdldERlcGVuZGVuY2llcyggJ3NjZW5lJyApLFxuXHRcdFx0XHRwYXJzZXIuZ2V0RGVwZW5kZW5jaWVzKCAnYW5pbWF0aW9uJyApLFxuXHRcdFx0XHRwYXJzZXIuZ2V0RGVwZW5kZW5jaWVzKCAnY2FtZXJhJyApLFxuXG5cdFx0XHRdICk7XG5cblx0XHR9ICkudGhlbiggZnVuY3Rpb24gKCBkZXBlbmRlbmNpZXMgKSB7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IHtcblx0XHRcdFx0c2NlbmU6IGRlcGVuZGVuY2llc1sgMCBdWyBqc29uLnNjZW5lIHx8IDAgXSxcblx0XHRcdFx0c2NlbmVzOiBkZXBlbmRlbmNpZXNbIDAgXSxcblx0XHRcdFx0YW5pbWF0aW9uczogZGVwZW5kZW5jaWVzWyAxIF0sXG5cdFx0XHRcdGNhbWVyYXM6IGRlcGVuZGVuY2llc1sgMiBdLFxuXHRcdFx0XHRhc3NldDoganNvbi5hc3NldCxcblx0XHRcdFx0cGFyc2VyOiBwYXJzZXIsXG5cdFx0XHRcdHVzZXJEYXRhOiB7fVxuXHRcdFx0fTtcblxuXHRcdFx0YWRkVW5rbm93bkV4dGVuc2lvbnNUb1VzZXJEYXRhKCBleHRlbnNpb25zLCByZXN1bHQsIGpzb24gKTtcblxuXHRcdFx0YXNzaWduRXh0cmFzVG9Vc2VyRGF0YSggcmVzdWx0LCBqc29uICk7XG5cblx0XHRcdFByb21pc2UuYWxsKCBwYXJzZXIuX2ludm9rZUFsbCggZnVuY3Rpb24gKCBleHQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dC5hZnRlclJvb3QgJiYgZXh0LmFmdGVyUm9vdCggcmVzdWx0ICk7XG5cblx0XHRcdH0gKSApLnRoZW4oIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRvbkxvYWQoIHJlc3VsdCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9ICkuY2F0Y2goIG9uRXJyb3IgKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIE1hcmtzIHRoZSBzcGVjaWFsIG5vZGVzL21lc2hlcyBpbiBqc29uIGZvciBlZmZpY2llbnQgcGFyc2UuXG5cdCAqL1xuXHRfbWFya0RlZnMoKSB7XG5cblx0XHRjb25zdCBub2RlRGVmcyA9IHRoaXMuanNvbi5ub2RlcyB8fCBbXTtcblx0XHRjb25zdCBza2luRGVmcyA9IHRoaXMuanNvbi5za2lucyB8fCBbXTtcblx0XHRjb25zdCBtZXNoRGVmcyA9IHRoaXMuanNvbi5tZXNoZXMgfHwgW107XG5cblx0XHQvLyBOb3RoaW5nIGluIHRoZSBub2RlIGRlZmluaXRpb24gaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgYSBCb25lIG9yIGFuXG5cdFx0Ly8gT2JqZWN0M0QuIFVzZSB0aGUgc2tpbnMnIGpvaW50IHJlZmVyZW5jZXMgdG8gbWFyayBib25lcy5cblx0XHRmb3IgKCBsZXQgc2tpbkluZGV4ID0gMCwgc2tpbkxlbmd0aCA9IHNraW5EZWZzLmxlbmd0aDsgc2tpbkluZGV4IDwgc2tpbkxlbmd0aDsgc2tpbkluZGV4ICsrICkge1xuXG5cdFx0XHRjb25zdCBqb2ludHMgPSBza2luRGVmc1sgc2tpbkluZGV4IF0uam9pbnRzO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gam9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG5vZGVEZWZzWyBqb2ludHNbIGkgXSBdLmlzQm9uZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEl0ZXJhdGUgb3ZlciBhbGwgbm9kZXMsIG1hcmtpbmcgcmVmZXJlbmNlcyB0byBzaGFyZWQgcmVzb3VyY2VzLFxuXHRcdC8vIGFzIHdlbGwgYXMgc2tlbGV0b24gam9pbnRzLlxuXHRcdGZvciAoIGxldCBub2RlSW5kZXggPSAwLCBub2RlTGVuZ3RoID0gbm9kZURlZnMubGVuZ3RoOyBub2RlSW5kZXggPCBub2RlTGVuZ3RoOyBub2RlSW5kZXggKysgKSB7XG5cblx0XHRcdGNvbnN0IG5vZGVEZWYgPSBub2RlRGVmc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdGlmICggbm9kZURlZi5tZXNoICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5fYWRkTm9kZVJlZiggdGhpcy5tZXNoQ2FjaGUsIG5vZGVEZWYubWVzaCApO1xuXG5cdFx0XHRcdC8vIE5vdGhpbmcgaW4gdGhlIG1lc2ggZGVmaW5pdGlvbiBpbmRpY2F0ZXMgd2hldGhlciBpdCBpc1xuXHRcdFx0XHQvLyBhIFNraW5uZWRNZXNoIG9yIE1lc2guIFVzZSB0aGUgbm9kZSdzIG1lc2ggcmVmZXJlbmNlXG5cdFx0XHRcdC8vIHRvIG1hcmsgU2tpbm5lZE1lc2ggaWYgbm9kZSBoYXMgc2tpbi5cblx0XHRcdFx0aWYgKCBub2RlRGVmLnNraW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG1lc2hEZWZzWyBub2RlRGVmLm1lc2ggXS5pc1NraW5uZWRNZXNoID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBub2RlRGVmLmNhbWVyYSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuX2FkZE5vZGVSZWYoIHRoaXMuY2FtZXJhQ2FjaGUsIG5vZGVEZWYuY2FtZXJhICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0LyoqXG5cdCAqIENvdW50cyByZWZlcmVuY2VzIHRvIHNoYXJlZCBub2RlIC8gT2JqZWN0M0QgcmVzb3VyY2VzLiBUaGVzZSByZXNvdXJjZXNcblx0ICogY2FuIGJlIHJldXNlZCwgb3IgXCJpbnN0YW50aWF0ZWRcIiwgYXQgbXVsdGlwbGUgbm9kZXMgaW4gdGhlIHNjZW5lXG5cdCAqIGhpZXJhcmNoeS4gTWVzaCwgQ2FtZXJhLCBhbmQgTGlnaHQgaW5zdGFuY2VzIGFyZSBpbnN0YW50aWF0ZWQgYW5kIG11c3Rcblx0ICogYmUgbWFya2VkLiBOb24tc2NlbmVncmFwaCByZXNvdXJjZXMgKGxpa2UgTWF0ZXJpYWxzLCBHZW9tZXRyaWVzLCBhbmRcblx0ICogVGV4dHVyZXMpIGNhbiBiZSByZXVzZWQgZGlyZWN0bHkgYW5kIGFyZSBub3QgbWFya2VkIGhlcmUuXG5cdCAqXG5cdCAqIEV4YW1wbGU6IENlc2l1bU1pbGtUcnVjayBzYW1wbGUgbW9kZWwgcmV1c2VzIFwiV2hlZWxcIiBtZXNoZXMuXG5cdCAqL1xuXHRfYWRkTm9kZVJlZiggY2FjaGUsIGluZGV4ICkge1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBjYWNoZS5yZWZzWyBpbmRleCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlLnJlZnNbIGluZGV4IF0gPSBjYWNoZS51c2VzWyBpbmRleCBdID0gMDtcblxuXHRcdH1cblxuXHRcdGNhY2hlLnJlZnNbIGluZGV4IF0gKys7XG5cblx0fVxuXG5cdC8qKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIHJlc291cmNlLCBjbG9uaW5nIGl0IGlmIG5lY2Vzc2FyeS4gKi9cblx0X2dldE5vZGVSZWYoIGNhY2hlLCBpbmRleCwgb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBjYWNoZS5yZWZzWyBpbmRleCBdIDw9IDEgKSByZXR1cm4gb2JqZWN0O1xuXG5cdFx0Y29uc3QgcmVmID0gb2JqZWN0LmNsb25lKCk7XG5cblx0XHQvLyBQcm9wYWdhdGVzIG1hcHBpbmdzIHRvIHRoZSBjbG9uZWQgb2JqZWN0LCBwcmV2ZW50cyBtYXBwaW5ncyBvbiB0aGVcblx0XHQvLyBvcmlnaW5hbCBvYmplY3QgZnJvbSBiZWluZyBsb3N0LlxuXHRcdGNvbnN0IHVwZGF0ZU1hcHBpbmdzID0gKCBvcmlnaW5hbCwgY2xvbmUgKSA9PiB7XG5cblx0XHRcdGNvbnN0IG1hcHBpbmdzID0gdGhpcy5hc3NvY2lhdGlvbnMuZ2V0KCBvcmlnaW5hbCApO1xuXHRcdFx0aWYgKCBtYXBwaW5ncyAhPSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYXNzb2NpYXRpb25zLnNldCggY2xvbmUsIG1hcHBpbmdzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggY29uc3QgWyBpLCBjaGlsZCBdIG9mIG9yaWdpbmFsLmNoaWxkcmVuLmVudHJpZXMoKSApIHtcblxuXHRcdFx0XHR1cGRhdGVNYXBwaW5ncyggY2hpbGQsIGNsb25lLmNoaWxkcmVuWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHRcdHVwZGF0ZU1hcHBpbmdzKCBvYmplY3QsIHJlZiApO1xuXG5cdFx0cmVmLm5hbWUgKz0gJ19pbnN0YW5jZV8nICsgKCBjYWNoZS51c2VzWyBpbmRleCBdICsrICk7XG5cblx0XHRyZXR1cm4gcmVmO1xuXG5cdH1cblxuXHRfaW52b2tlT25lKCBmdW5jICkge1xuXG5cdFx0Y29uc3QgZXh0ZW5zaW9ucyA9IE9iamVjdC52YWx1ZXMoIHRoaXMucGx1Z2lucyApO1xuXHRcdGV4dGVuc2lvbnMucHVzaCggdGhpcyApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHJlc3VsdCA9IGZ1bmMoIGV4dGVuc2lvbnNbIGkgXSApO1xuXG5cdFx0XHRpZiAoIHJlc3VsdCApIHJldHVybiByZXN1bHQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cblx0X2ludm9rZUFsbCggZnVuYyApIHtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSBPYmplY3QudmFsdWVzKCB0aGlzLnBsdWdpbnMgKTtcblx0XHRleHRlbnNpb25zLnVuc2hpZnQoIHRoaXMgKTtcblxuXHRcdGNvbnN0IHBlbmRpbmcgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCByZXN1bHQgPSBmdW5jKCBleHRlbnNpb25zWyBpIF0gKTtcblxuXHRcdFx0aWYgKCByZXN1bHQgKSBwZW5kaW5nLnB1c2goIHJlc3VsdCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBlbmRpbmc7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyB0aGUgc3BlY2lmaWVkIGRlcGVuZGVuY3kgYXN5bmNocm9ub3VzbHksIHdpdGggY2FjaGluZy5cblx0ICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcblx0ICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0M0R8TWF0ZXJpYWx8VEhSRUUuVGV4dHVyZXxBbmltYXRpb25DbGlwfEFycmF5QnVmZmVyfE9iamVjdD59XG5cdCAqL1xuXHRnZXREZXBlbmRlbmN5KCB0eXBlLCBpbmRleCApIHtcblxuXHRcdGNvbnN0IGNhY2hlS2V5ID0gdHlwZSArICc6JyArIGluZGV4O1xuXHRcdGxldCBkZXBlbmRlbmN5ID0gdGhpcy5jYWNoZS5nZXQoIGNhY2hlS2V5ICk7XG5cblx0XHRpZiAoICEgZGVwZW5kZW5jeSApIHtcblxuXHRcdFx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdzY2VuZSc6XG5cdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IHRoaXMubG9hZFNjZW5lKCBpbmRleCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ25vZGUnOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLmxvYWROb2RlKCBpbmRleCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ21lc2gnOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLl9pbnZva2VPbmUoIGZ1bmN0aW9uICggZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXh0LmxvYWRNZXNoICYmIGV4dC5sb2FkTWVzaCggaW5kZXggKTtcblxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdhY2Nlc3Nvcic6XG5cdFx0XHRcdFx0ZGVwZW5kZW5jeSA9IHRoaXMubG9hZEFjY2Vzc29yKCBpbmRleCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2J1ZmZlclZpZXcnOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLl9pbnZva2VPbmUoIGZ1bmN0aW9uICggZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXh0LmxvYWRCdWZmZXJWaWV3ICYmIGV4dC5sb2FkQnVmZmVyVmlldyggaW5kZXggKTtcblxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdidWZmZXInOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLmxvYWRCdWZmZXIoIGluZGV4ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnbWF0ZXJpYWwnOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLl9pbnZva2VPbmUoIGZ1bmN0aW9uICggZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXh0LmxvYWRNYXRlcmlhbCAmJiBleHQubG9hZE1hdGVyaWFsKCBpbmRleCApO1xuXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ3RleHR1cmUnOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLl9pbnZva2VPbmUoIGZ1bmN0aW9uICggZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gZXh0LmxvYWRUZXh0dXJlICYmIGV4dC5sb2FkVGV4dHVyZSggaW5kZXggKTtcblxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdza2luJzpcblx0XHRcdFx0XHRkZXBlbmRlbmN5ID0gdGhpcy5sb2FkU2tpbiggaW5kZXggKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdhbmltYXRpb24nOlxuXHRcdFx0XHRcdGRlcGVuZGVuY3kgPSB0aGlzLmxvYWRBbmltYXRpb24oIGluZGV4ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnY2FtZXJhJzpcblx0XHRcdFx0XHRkZXBlbmRlbmN5ID0gdGhpcy5sb2FkQ2FtZXJhKCBpbmRleCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVW5rbm93biB0eXBlOiAnICsgdHlwZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuY2FjaGUuYWRkKCBjYWNoZUtleSwgZGVwZW5kZW5jeSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlcGVuZGVuY3k7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXF1ZXN0cyBhbGwgZGVwZW5kZW5jaWVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhc3luY2hyb25vdXNseSwgd2l0aCBjYWNoaW5nLlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PE9iamVjdD4+fVxuXHQgKi9cblx0Z2V0RGVwZW5kZW5jaWVzKCB0eXBlICkge1xuXG5cdFx0bGV0IGRlcGVuZGVuY2llcyA9IHRoaXMuY2FjaGUuZ2V0KCB0eXBlICk7XG5cblx0XHRpZiAoICEgZGVwZW5kZW5jaWVzICkge1xuXG5cdFx0XHRjb25zdCBwYXJzZXIgPSB0aGlzO1xuXHRcdFx0Y29uc3QgZGVmcyA9IHRoaXMuanNvblsgdHlwZSArICggdHlwZSA9PT0gJ21lc2gnID8gJ2VzJyA6ICdzJyApIF0gfHwgW107XG5cblx0XHRcdGRlcGVuZGVuY2llcyA9IFByb21pc2UuYWxsKCBkZWZzLm1hcCggZnVuY3Rpb24gKCBkZWYsIGluZGV4ICkge1xuXG5cdFx0XHRcdHJldHVybiBwYXJzZXIuZ2V0RGVwZW5kZW5jeSggdHlwZSwgaW5kZXggKTtcblxuXHRcdFx0fSApICk7XG5cblx0XHRcdHRoaXMuY2FjaGUuYWRkKCB0eXBlLCBkZXBlbmRlbmNpZXMgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkZXBlbmRlbmNpZXM7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi8yLjAvUkVBRE1FLm1kI2J1ZmZlcnMtYW5kLWJ1ZmZlci12aWV3c1xuXHQgKiBAcGFyYW0ge251bWJlcn0gYnVmZmVySW5kZXhcblx0ICogQHJldHVybiB7UHJvbWlzZTxBcnJheUJ1ZmZlcj59XG5cdCAqL1xuXHRsb2FkQnVmZmVyKCBidWZmZXJJbmRleCApIHtcblxuXHRcdGNvbnN0IGJ1ZmZlckRlZiA9IHRoaXMuanNvbi5idWZmZXJzWyBidWZmZXJJbmRleCBdO1xuXHRcdGNvbnN0IGxvYWRlciA9IHRoaXMuZmlsZUxvYWRlcjtcblxuXHRcdGlmICggYnVmZmVyRGVmLnR5cGUgJiYgYnVmZmVyRGVmLnR5cGUgIT09ICdhcnJheWJ1ZmZlcicgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLkdMVEZMb2FkZXI6ICcgKyBidWZmZXJEZWYudHlwZSArICcgYnVmZmVyIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4nICk7XG5cblx0XHR9XG5cblx0XHQvLyBJZiBwcmVzZW50LCBHTEIgY29udGFpbmVyIGlzIHJlcXVpcmVkIHRvIGJlIHRoZSBmaXJzdCBidWZmZXIuXG5cdFx0aWYgKCBidWZmZXJEZWYudXJpID09PSB1bmRlZmluZWQgJiYgYnVmZmVySW5kZXggPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoIHRoaXMuZXh0ZW5zaW9uc1sgRVhURU5TSU9OUy5LSFJfQklOQVJZX0dMVEYgXS5ib2R5ICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKCBmdW5jdGlvbiAoIHJlc29sdmUsIHJlamVjdCApIHtcblxuXHRcdFx0bG9hZGVyLmxvYWQoIExvYWRlclV0aWxzLnJlc29sdmVVUkwoIGJ1ZmZlckRlZi51cmksIG9wdGlvbnMucGF0aCApLCByZXNvbHZlLCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRyZWplY3QoIG5ldyBFcnJvciggJ1RIUkVFLkdMVEZMb2FkZXI6IEZhaWxlZCB0byBsb2FkIGJ1ZmZlciBcIicgKyBidWZmZXJEZWYudXJpICsgJ1wiLicgKSApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi8yLjAvUkVBRE1FLm1kI2J1ZmZlcnMtYW5kLWJ1ZmZlci12aWV3c1xuXHQgKiBAcGFyYW0ge251bWJlcn0gYnVmZmVyVmlld0luZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXlCdWZmZXI+fVxuXHQgKi9cblx0bG9hZEJ1ZmZlclZpZXcoIGJ1ZmZlclZpZXdJbmRleCApIHtcblxuXHRcdGNvbnN0IGJ1ZmZlclZpZXdEZWYgPSB0aGlzLmpzb24uYnVmZmVyVmlld3NbIGJ1ZmZlclZpZXdJbmRleCBdO1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGVwZW5kZW5jeSggJ2J1ZmZlcicsIGJ1ZmZlclZpZXdEZWYuYnVmZmVyICkudGhlbiggZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdGNvbnN0IGJ5dGVMZW5ndGggPSBidWZmZXJWaWV3RGVmLmJ5dGVMZW5ndGggfHwgMDtcblx0XHRcdGNvbnN0IGJ5dGVPZmZzZXQgPSBidWZmZXJWaWV3RGVmLmJ5dGVPZmZzZXQgfHwgMDtcblx0XHRcdHJldHVybiBidWZmZXIuc2xpY2UoIGJ5dGVPZmZzZXQsIGJ5dGVPZmZzZXQgKyBieXRlTGVuZ3RoICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi8yLjAvUkVBRE1FLm1kI2FjY2Vzc29yc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gYWNjZXNzb3JJbmRleFxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPEJ1ZmZlckF0dHJpYnV0ZXxJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT59XG5cdCAqL1xuXHRsb2FkQWNjZXNzb3IoIGFjY2Vzc29ySW5kZXggKSB7XG5cblx0XHRjb25zdCBwYXJzZXIgPSB0aGlzO1xuXHRcdGNvbnN0IGpzb24gPSB0aGlzLmpzb247XG5cblx0XHRjb25zdCBhY2Nlc3NvckRlZiA9IHRoaXMuanNvbi5hY2Nlc3NvcnNbIGFjY2Vzc29ySW5kZXggXTtcblxuXHRcdGlmICggYWNjZXNzb3JEZWYuYnVmZmVyVmlldyA9PT0gdW5kZWZpbmVkICYmIGFjY2Vzc29yRGVmLnNwYXJzZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBJZ25vcmUgZW1wdHkgYWNjZXNzb3JzLCB3aGljaCBtYXkgYmUgdXNlZCB0byBkZWNsYXJlIHJ1bnRpbWVcblx0XHRcdC8vIGluZm9ybWF0aW9uIGFib3V0IGF0dHJpYnV0ZXMgY29taW5nIGZyb20gYW5vdGhlciBzb3VyY2UgKGUuZy4gRHJhY29cblx0XHRcdC8vIGNvbXByZXNzaW9uIGV4dGVuc2lvbikuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCBudWxsICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwZW5kaW5nQnVmZmVyVmlld3MgPSBbXTtcblxuXHRcdGlmICggYWNjZXNzb3JEZWYuYnVmZmVyVmlldyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwZW5kaW5nQnVmZmVyVmlld3MucHVzaCggdGhpcy5nZXREZXBlbmRlbmN5KCAnYnVmZmVyVmlldycsIGFjY2Vzc29yRGVmLmJ1ZmZlclZpZXcgKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cGVuZGluZ0J1ZmZlclZpZXdzLnB1c2goIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYWNjZXNzb3JEZWYuc3BhcnNlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBlbmRpbmdCdWZmZXJWaWV3cy5wdXNoKCB0aGlzLmdldERlcGVuZGVuY3koICdidWZmZXJWaWV3JywgYWNjZXNzb3JEZWYuc3BhcnNlLmluZGljZXMuYnVmZmVyVmlldyApICk7XG5cdFx0XHRwZW5kaW5nQnVmZmVyVmlld3MucHVzaCggdGhpcy5nZXREZXBlbmRlbmN5KCAnYnVmZmVyVmlldycsIGFjY2Vzc29yRGVmLnNwYXJzZS52YWx1ZXMuYnVmZmVyVmlldyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoIHBlbmRpbmdCdWZmZXJWaWV3cyApLnRoZW4oIGZ1bmN0aW9uICggYnVmZmVyVmlld3MgKSB7XG5cblx0XHRcdGNvbnN0IGJ1ZmZlclZpZXcgPSBidWZmZXJWaWV3c1sgMCBdO1xuXG5cdFx0XHRjb25zdCBpdGVtU2l6ZSA9IFdFQkdMX1RZUEVfU0laRVNbIGFjY2Vzc29yRGVmLnR5cGUgXTtcblx0XHRcdGNvbnN0IFR5cGVkQXJyYXkgPSBXRUJHTF9DT01QT05FTlRfVFlQRVNbIGFjY2Vzc29yRGVmLmNvbXBvbmVudFR5cGUgXTtcblxuXHRcdFx0Ly8gRm9yIFZFQzM6IGl0ZW1TaXplIGlzIDMsIGVsZW1lbnRCeXRlcyBpcyA0LCBpdGVtQnl0ZXMgaXMgMTIuXG5cdFx0XHRjb25zdCBlbGVtZW50Qnl0ZXMgPSBUeXBlZEFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuXHRcdFx0Y29uc3QgaXRlbUJ5dGVzID0gZWxlbWVudEJ5dGVzICogaXRlbVNpemU7XG5cdFx0XHRjb25zdCBieXRlT2Zmc2V0ID0gYWNjZXNzb3JEZWYuYnl0ZU9mZnNldCB8fCAwO1xuXHRcdFx0Y29uc3QgYnl0ZVN0cmlkZSA9IGFjY2Vzc29yRGVmLmJ1ZmZlclZpZXcgIT09IHVuZGVmaW5lZCA/IGpzb24uYnVmZmVyVmlld3NbIGFjY2Vzc29yRGVmLmJ1ZmZlclZpZXcgXS5ieXRlU3RyaWRlIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgbm9ybWFsaXplZCA9IGFjY2Vzc29yRGVmLm5vcm1hbGl6ZWQgPT09IHRydWU7XG5cdFx0XHRsZXQgYXJyYXksIGJ1ZmZlckF0dHJpYnV0ZTtcblxuXHRcdFx0Ly8gVGhlIGJ1ZmZlciBpcyBub3QgaW50ZXJsZWF2ZWQgaWYgdGhlIHN0cmlkZSBpcyB0aGUgaXRlbSBzaXplIGluIGJ5dGVzLlxuXHRcdFx0aWYgKCBieXRlU3RyaWRlICYmIGJ5dGVTdHJpZGUgIT09IGl0ZW1CeXRlcyApIHtcblxuXHRcdFx0XHQvLyBFYWNoIFwic2xpY2VcIiBvZiB0aGUgYnVmZmVyLCBhcyBkZWZpbmVkIGJ5ICdjb3VudCcgZWxlbWVudHMgb2YgJ2J5dGVTdHJpZGUnIGJ5dGVzLCBnZXRzIGl0cyBvd24gSW50ZXJsZWF2ZWRCdWZmZXJcblx0XHRcdFx0Ly8gVGhpcyBtYWtlcyBzdXJlIHRoYXQgSUJBLmNvdW50IHJlZmxlY3RzIGFjY2Vzc29yLmNvdW50IHByb3Blcmx5XG5cdFx0XHRcdGNvbnN0IGliU2xpY2UgPSBNYXRoLmZsb29yKCBieXRlT2Zmc2V0IC8gYnl0ZVN0cmlkZSApO1xuXHRcdFx0XHRjb25zdCBpYkNhY2hlS2V5ID0gJ0ludGVybGVhdmVkQnVmZmVyOicgKyBhY2Nlc3NvckRlZi5idWZmZXJWaWV3ICsgJzonICsgYWNjZXNzb3JEZWYuY29tcG9uZW50VHlwZSArICc6JyArIGliU2xpY2UgKyAnOicgKyBhY2Nlc3NvckRlZi5jb3VudDtcblx0XHRcdFx0bGV0IGliID0gcGFyc2VyLmNhY2hlLmdldCggaWJDYWNoZUtleSApO1xuXG5cdFx0XHRcdGlmICggISBpYiApIHtcblxuXHRcdFx0XHRcdGFycmF5ID0gbmV3IFR5cGVkQXJyYXkoIGJ1ZmZlclZpZXcsIGliU2xpY2UgKiBieXRlU3RyaWRlLCBhY2Nlc3NvckRlZi5jb3VudCAqIGJ5dGVTdHJpZGUgLyBlbGVtZW50Qnl0ZXMgKTtcblxuXHRcdFx0XHRcdC8vIEludGVnZXIgcGFyYW1ldGVycyB0byBJQi9JQkEgYXJlIGluIGFycmF5IGVsZW1lbnRzLCBub3QgYnl0ZXMuXG5cdFx0XHRcdFx0aWIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBieXRlU3RyaWRlIC8gZWxlbWVudEJ5dGVzICk7XG5cblx0XHRcdFx0XHRwYXJzZXIuY2FjaGUuYWRkKCBpYkNhY2hlS2V5LCBpYiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGliLCBpdGVtU2l6ZSwgKCBieXRlT2Zmc2V0ICUgYnl0ZVN0cmlkZSApIC8gZWxlbWVudEJ5dGVzLCBub3JtYWxpemVkICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBidWZmZXJWaWV3ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0YXJyYXkgPSBuZXcgVHlwZWRBcnJheSggYWNjZXNzb3JEZWYuY291bnQgKiBpdGVtU2l6ZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRhcnJheSA9IG5ldyBUeXBlZEFycmF5KCBidWZmZXJWaWV3LCBieXRlT2Zmc2V0LCBhY2Nlc3NvckRlZi5jb3VudCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMC9SRUFETUUubWQjc3BhcnNlLWFjY2Vzc29yc1xuXHRcdFx0aWYgKCBhY2Nlc3NvckRlZi5zcGFyc2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zdCBpdGVtU2l6ZUluZGljZXMgPSBXRUJHTF9UWVBFX1NJWkVTLlNDQUxBUjtcblx0XHRcdFx0Y29uc3QgVHlwZWRBcnJheUluZGljZXMgPSBXRUJHTF9DT01QT05FTlRfVFlQRVNbIGFjY2Vzc29yRGVmLnNwYXJzZS5pbmRpY2VzLmNvbXBvbmVudFR5cGUgXTtcblxuXHRcdFx0XHRjb25zdCBieXRlT2Zmc2V0SW5kaWNlcyA9IGFjY2Vzc29yRGVmLnNwYXJzZS5pbmRpY2VzLmJ5dGVPZmZzZXQgfHwgMDtcblx0XHRcdFx0Y29uc3QgYnl0ZU9mZnNldFZhbHVlcyA9IGFjY2Vzc29yRGVmLnNwYXJzZS52YWx1ZXMuYnl0ZU9mZnNldCB8fCAwO1xuXG5cdFx0XHRcdGNvbnN0IHNwYXJzZUluZGljZXMgPSBuZXcgVHlwZWRBcnJheUluZGljZXMoIGJ1ZmZlclZpZXdzWyAxIF0sIGJ5dGVPZmZzZXRJbmRpY2VzLCBhY2Nlc3NvckRlZi5zcGFyc2UuY291bnQgKiBpdGVtU2l6ZUluZGljZXMgKTtcblx0XHRcdFx0Y29uc3Qgc3BhcnNlVmFsdWVzID0gbmV3IFR5cGVkQXJyYXkoIGJ1ZmZlclZpZXdzWyAyIF0sIGJ5dGVPZmZzZXRWYWx1ZXMsIGFjY2Vzc29yRGVmLnNwYXJzZS5jb3VudCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdFx0aWYgKCBidWZmZXJWaWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0Ly8gQXZvaWQgbW9kaWZ5aW5nIHRoZSBvcmlnaW5hbCBBcnJheUJ1ZmZlciwgaWYgdGhlIGJ1ZmZlclZpZXcgd2Fzbid0IGluaXRpYWxpemVkIHdpdGggemVyb2VzLlxuXHRcdFx0XHRcdGJ1ZmZlckF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlckF0dHJpYnV0ZS5hcnJheS5zbGljZSgpLCBidWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUsIGJ1ZmZlckF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBzcGFyc2VJbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBzcGFyc2VJbmRpY2VzWyBpIF07XG5cblx0XHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUuc2V0WCggaW5kZXgsIHNwYXJzZVZhbHVlc1sgaSAqIGl0ZW1TaXplIF0gKTtcblx0XHRcdFx0XHRpZiAoIGl0ZW1TaXplID49IDIgKSBidWZmZXJBdHRyaWJ1dGUuc2V0WSggaW5kZXgsIHNwYXJzZVZhbHVlc1sgaSAqIGl0ZW1TaXplICsgMSBdICk7XG5cdFx0XHRcdFx0aWYgKCBpdGVtU2l6ZSA+PSAzICkgYnVmZmVyQXR0cmlidXRlLnNldFooIGluZGV4LCBzcGFyc2VWYWx1ZXNbIGkgKiBpdGVtU2l6ZSArIDIgXSApO1xuXHRcdFx0XHRcdGlmICggaXRlbVNpemUgPj0gNCApIGJ1ZmZlckF0dHJpYnV0ZS5zZXRXKCBpbmRleCwgc3BhcnNlVmFsdWVzWyBpICogaXRlbVNpemUgKyAzIF0gKTtcblx0XHRcdFx0XHRpZiAoIGl0ZW1TaXplID49IDUgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBVbnN1cHBvcnRlZCBpdGVtU2l6ZSBpbiBzcGFyc2UgQnVmZmVyQXR0cmlidXRlLicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGJ1ZmZlckF0dHJpYnV0ZTtcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMCN0ZXh0dXJlc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gdGV4dHVyZUluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8VEhSRUUuVGV4dHVyZT59XG5cdCAqL1xuXHRsb2FkVGV4dHVyZSggdGV4dHVyZUluZGV4ICkge1xuXG5cdFx0Y29uc3QganNvbiA9IHRoaXMuanNvbjtcblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXHRcdGNvbnN0IHRleHR1cmVEZWYgPSBqc29uLnRleHR1cmVzWyB0ZXh0dXJlSW5kZXggXTtcblx0XHRjb25zdCBzb3VyY2UgPSBqc29uLmltYWdlc1sgdGV4dHVyZURlZi5zb3VyY2UgXTtcblxuXHRcdGxldCBsb2FkZXIgPSB0aGlzLnRleHR1cmVMb2FkZXI7XG5cblx0XHRpZiAoIHNvdXJjZS51cmkgKSB7XG5cblx0XHRcdGNvbnN0IGhhbmRsZXIgPSBvcHRpb25zLm1hbmFnZXIuZ2V0SGFuZGxlciggc291cmNlLnVyaSApO1xuXHRcdFx0aWYgKCBoYW5kbGVyICE9PSBudWxsICkgbG9hZGVyID0gaGFuZGxlcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvYWRUZXh0dXJlSW1hZ2UoIHRleHR1cmVJbmRleCwgc291cmNlLCBsb2FkZXIgKTtcblxuXHR9XG5cblx0bG9hZFRleHR1cmVJbWFnZSggdGV4dHVyZUluZGV4LCBzb3VyY2UsIGxvYWRlciApIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXM7XG5cdFx0Y29uc3QganNvbiA9IHRoaXMuanNvbjtcblx0XHRjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG5cdFx0Y29uc3QgdGV4dHVyZURlZiA9IGpzb24udGV4dHVyZXNbIHRleHR1cmVJbmRleCBdO1xuXG5cdFx0Y29uc3QgY2FjaGVLZXkgPSAoIHNvdXJjZS51cmkgfHwgc291cmNlLmJ1ZmZlclZpZXcgKSArICc6JyArIHRleHR1cmVEZWYuc2FtcGxlcjtcblxuXHRcdGlmICggdGhpcy50ZXh0dXJlQ2FjaGVbIGNhY2hlS2V5IF0gKSB7XG5cblx0XHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8yMTU1OS5cblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmVDYWNoZVsgY2FjaGVLZXkgXTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IFVSTCA9IHNlbGYuVVJMIHx8IHNlbGYud2Via2l0VVJMO1xuXG5cdFx0bGV0IHNvdXJjZVVSSSA9IHNvdXJjZS51cmkgfHwgJyc7XG5cdFx0bGV0IGlzT2JqZWN0VVJMID0gZmFsc2U7XG5cblx0XHRpZiAoIHNvdXJjZS5idWZmZXJWaWV3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIExvYWQgYmluYXJ5IGltYWdlIGRhdGEgZnJvbSBidWZmZXJWaWV3LCBpZiBwcm92aWRlZC5cblxuXHRcdFx0c291cmNlVVJJID0gcGFyc2VyLmdldERlcGVuZGVuY3koICdidWZmZXJWaWV3Jywgc291cmNlLmJ1ZmZlclZpZXcgKS50aGVuKCBmdW5jdGlvbiAoIGJ1ZmZlclZpZXcgKSB7XG5cblx0XHRcdFx0aXNPYmplY3RVUkwgPSB0cnVlO1xuXHRcdFx0XHRjb25zdCBibG9iID0gbmV3IEJsb2IoIFsgYnVmZmVyVmlldyBdLCB7IHR5cGU6IHNvdXJjZS5taW1lVHlwZSB9ICk7XG5cdFx0XHRcdHNvdXJjZVVSSSA9IFVSTC5jcmVhdGVPYmplY3RVUkwoIGJsb2IgKTtcblx0XHRcdFx0cmV0dXJuIHNvdXJjZVVSSTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSBlbHNlIGlmICggc291cmNlLnVyaSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBJbWFnZSAnICsgdGV4dHVyZUluZGV4ICsgJyBpcyBtaXNzaW5nIFVSSSBhbmQgYnVmZmVyVmlldycgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoIHNvdXJjZVVSSSApLnRoZW4oIGZ1bmN0aW9uICggc291cmNlVVJJICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSwgcmVqZWN0ICkge1xuXG5cdFx0XHRcdGxldCBvbkxvYWQgPSByZXNvbHZlO1xuXG5cdFx0XHRcdGlmICggbG9hZGVyLmlzSW1hZ2VCaXRtYXBMb2FkZXIgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRvbkxvYWQgPSBmdW5jdGlvbiAoIGltYWdlQml0bWFwICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGltYWdlQml0bWFwICk7XG5cdFx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0cmVzb2x2ZSggdGV4dHVyZSApO1xuXG5cdFx0XHRcdFx0fTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bG9hZGVyLmxvYWQoIExvYWRlclV0aWxzLnJlc29sdmVVUkwoIHNvdXJjZVVSSSwgb3B0aW9ucy5wYXRoICksIG9uTG9hZCwgdW5kZWZpbmVkLCByZWplY3QgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggdGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgcmVzb3VyY2VzIGFuZCBjb25maWd1cmUgVGV4dHVyZS5cblxuXHRcdFx0aWYgKCBpc09iamVjdFVSTCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRVUkwucmV2b2tlT2JqZWN0VVJMKCBzb3VyY2VVUkkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLmZsaXBZID0gZmFsc2U7XG5cblx0XHRcdGlmICggdGV4dHVyZURlZi5uYW1lICkgdGV4dHVyZS5uYW1lID0gdGV4dHVyZURlZi5uYW1lO1xuXG5cdFx0XHRjb25zdCBzYW1wbGVycyA9IGpzb24uc2FtcGxlcnMgfHwge307XG5cdFx0XHRjb25zdCBzYW1wbGVyID0gc2FtcGxlcnNbIHRleHR1cmVEZWYuc2FtcGxlciBdIHx8IHt9O1xuXG5cdFx0XHR0ZXh0dXJlLm1hZ0ZpbHRlciA9IFdFQkdMX0ZJTFRFUlNbIHNhbXBsZXIubWFnRmlsdGVyIF0gfHwgTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBXRUJHTF9GSUxURVJTWyBzYW1wbGVyLm1pbkZpbHRlciBdIHx8IExpbmVhck1pcG1hcExpbmVhckZpbHRlcjtcblx0XHRcdHRleHR1cmUud3JhcFMgPSBXRUJHTF9XUkFQUElOR1NbIHNhbXBsZXIud3JhcFMgXSB8fCBSZXBlYXRXcmFwcGluZztcblx0XHRcdHRleHR1cmUud3JhcFQgPSBXRUJHTF9XUkFQUElOR1NbIHNhbXBsZXIud3JhcFQgXSB8fCBSZXBlYXRXcmFwcGluZztcblxuXHRcdFx0cGFyc2VyLmFzc29jaWF0aW9ucy5zZXQoIHRleHR1cmUsIHsgdGV4dHVyZXM6IHRleHR1cmVJbmRleCB9ICk7XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdFx0fSApLmNhdGNoKCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBDb3VsZG5cXCd0IGxvYWQgdGV4dHVyZScsIHNvdXJjZVVSSSApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9ICk7XG5cblx0XHR0aGlzLnRleHR1cmVDYWNoZVsgY2FjaGVLZXkgXSA9IHByb21pc2U7XG5cblx0XHRyZXR1cm4gcHJvbWlzZTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEFzeW5jaHJvbm91c2x5IGFzc2lnbnMgYSB0ZXh0dXJlIHRvIHRoZSBnaXZlbiBtYXRlcmlhbCBwYXJhbWV0ZXJzLlxuXHQgKiBAcGFyYW0ge09iamVjdH0gbWF0ZXJpYWxQYXJhbXNcblx0ICogQHBhcmFtIHtzdHJpbmd9IG1hcE5hbWVcblx0ICogQHBhcmFtIHtPYmplY3R9IG1hcERlZlxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPFRleHR1cmU+fVxuXHQgKi9cblx0YXNzaWduVGV4dHVyZSggbWF0ZXJpYWxQYXJhbXMsIG1hcE5hbWUsIG1hcERlZiApIHtcblxuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXM7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5KCAndGV4dHVyZScsIG1hcERlZi5pbmRleCApLnRoZW4oIGZ1bmN0aW9uICggdGV4dHVyZSApIHtcblxuXHRcdFx0Ly8gTWF0ZXJpYWxzIHNhbXBsZSBhb01hcCBmcm9tIFVWIHNldCAxIGFuZCBvdGhlciBtYXBzIGZyb20gVVYgc2V0IDAgLSB0aGlzIGNhbid0IGJlIGNvbmZpZ3VyZWRcblx0XHRcdC8vIEhvd2V2ZXIsIHdlIHdpbGwgY29weSBVViBzZXQgMCB0byBVViBzZXQgMSBvbiBkZW1hbmQgZm9yIGFvTWFwXG5cdFx0XHRpZiAoIG1hcERlZi50ZXhDb29yZCAhPT0gdW5kZWZpbmVkICYmIG1hcERlZi50ZXhDb29yZCAhPSAwICYmICEgKCBtYXBOYW1lID09PSAnYW9NYXAnICYmIG1hcERlZi50ZXhDb29yZCA9PSAxICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR0xURkxvYWRlcjogQ3VzdG9tIFVWIHNldCAnICsgbWFwRGVmLnRleENvb3JkICsgJyBmb3IgdGV4dHVyZSAnICsgbWFwTmFtZSArICcgbm90IHlldCBzdXBwb3J0ZWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGFyc2VyLmV4dGVuc2lvbnNbIEVYVEVOU0lPTlMuS0hSX1RFWFRVUkVfVFJBTlNGT1JNIF0gKSB7XG5cblx0XHRcdFx0Y29uc3QgdHJhbnNmb3JtID0gbWFwRGVmLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCA/IG1hcERlZi5leHRlbnNpb25zWyBFWFRFTlNJT05TLktIUl9URVhUVVJFX1RSQU5TRk9STSBdIDogdW5kZWZpbmVkO1xuXG5cdFx0XHRcdGlmICggdHJhbnNmb3JtICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZ2x0ZlJlZmVyZW5jZSA9IHBhcnNlci5hc3NvY2lhdGlvbnMuZ2V0KCB0ZXh0dXJlICk7XG5cdFx0XHRcdFx0dGV4dHVyZSA9IHBhcnNlci5leHRlbnNpb25zWyBFWFRFTlNJT05TLktIUl9URVhUVVJFX1RSQU5TRk9STSBdLmV4dGVuZFRleHR1cmUoIHRleHR1cmUsIHRyYW5zZm9ybSApO1xuXHRcdFx0XHRcdHBhcnNlci5hc3NvY2lhdGlvbnMuc2V0KCB0ZXh0dXJlLCBnbHRmUmVmZXJlbmNlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zWyBtYXBOYW1lIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEFzc2lnbnMgZmluYWwgbWF0ZXJpYWwgdG8gYSBNZXNoLCBMaW5lLCBvciBQb2ludHMgaW5zdGFuY2UuIFRoZSBpbnN0YW5jZVxuXHQgKiBhbHJlYWR5IGhhcyBhIG1hdGVyaWFsIChnZW5lcmF0ZWQgZnJvbSB0aGUgZ2xURiBtYXRlcmlhbCBvcHRpb25zIGFsb25lKVxuXHQgKiBidXQgcmV1c2Ugb2YgdGhlIHNhbWUgZ2xURiBtYXRlcmlhbCBtYXkgcmVxdWlyZSBtdWx0aXBsZSB0aHJlZWpzIG1hdGVyaWFsc1xuXHQgKiB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgcHJpbWl0aXZlIHR5cGVzLCBkZWZpbmVzLCBldGMuIE5ldyBtYXRlcmlhbHMgd2lsbFxuXHQgKiBiZSBjcmVhdGVkIGlmIG5lY2Vzc2FyeSwgYW5kIHJldXNlZCBmcm9tIGEgY2FjaGUuXG5cdCAqIEBwYXJhbSAge09iamVjdDNEfSBtZXNoIE1lc2gsIExpbmUsIG9yIFBvaW50cyBpbnN0YW5jZS5cblx0ICovXG5cdGFzc2lnbkZpbmFsTWF0ZXJpYWwoIG1lc2ggKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG1lc2guZ2VvbWV0cnk7XG5cdFx0bGV0IG1hdGVyaWFsID0gbWVzaC5tYXRlcmlhbDtcblxuXHRcdGNvbnN0IHVzZURlcml2YXRpdmVUYW5nZW50cyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudGFuZ2VudCA9PT0gdW5kZWZpbmVkO1xuXHRcdGNvbnN0IHVzZVZlcnRleENvbG9ycyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZDtcblx0XHRjb25zdCB1c2VGbGF0U2hhZGluZyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMubm9ybWFsID09PSB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIG1lc2guaXNQb2ludHMgKSB7XG5cblx0XHRcdGNvbnN0IGNhY2hlS2V5ID0gJ1BvaW50c01hdGVyaWFsOicgKyBtYXRlcmlhbC51dWlkO1xuXG5cdFx0XHRsZXQgcG9pbnRzTWF0ZXJpYWwgPSB0aGlzLmNhY2hlLmdldCggY2FjaGVLZXkgKTtcblxuXHRcdFx0aWYgKCAhIHBvaW50c01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHBvaW50c01hdGVyaWFsID0gbmV3IFBvaW50c01hdGVyaWFsKCk7XG5cdFx0XHRcdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHBvaW50c01hdGVyaWFsLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRwb2ludHNNYXRlcmlhbC5jb2xvci5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0XHRwb2ludHNNYXRlcmlhbC5tYXAgPSBtYXRlcmlhbC5tYXA7XG5cdFx0XHRcdHBvaW50c01hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGZhbHNlOyAvLyBnbFRGIHNwZWMgc2F5cyBwb2ludHMgc2hvdWxkIGJlIDFweFxuXG5cdFx0XHRcdHRoaXMuY2FjaGUuYWRkKCBjYWNoZUtleSwgcG9pbnRzTWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbCA9IHBvaW50c01hdGVyaWFsO1xuXG5cdFx0fSBlbHNlIGlmICggbWVzaC5pc0xpbmUgKSB7XG5cblx0XHRcdGNvbnN0IGNhY2hlS2V5ID0gJ0xpbmVCYXNpY01hdGVyaWFsOicgKyBtYXRlcmlhbC51dWlkO1xuXG5cdFx0XHRsZXQgbGluZU1hdGVyaWFsID0gdGhpcy5jYWNoZS5nZXQoIGNhY2hlS2V5ICk7XG5cblx0XHRcdGlmICggISBsaW5lTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bGluZU1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCk7XG5cdFx0XHRcdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIGxpbmVNYXRlcmlhbCwgbWF0ZXJpYWwgKTtcblx0XHRcdFx0bGluZU1hdGVyaWFsLmNvbG9yLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cblx0XHRcdFx0dGhpcy5jYWNoZS5hZGQoIGNhY2hlS2V5LCBsaW5lTWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbCA9IGxpbmVNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdC8vIENsb25lIHRoZSBtYXRlcmlhbCBpZiBpdCB3aWxsIGJlIG1vZGlmaWVkXG5cdFx0aWYgKCB1c2VEZXJpdmF0aXZlVGFuZ2VudHMgfHwgdXNlVmVydGV4Q29sb3JzIHx8IHVzZUZsYXRTaGFkaW5nICkge1xuXG5cdFx0XHRsZXQgY2FjaGVLZXkgPSAnQ2xvbmVkTWF0ZXJpYWw6JyArIG1hdGVyaWFsLnV1aWQgKyAnOic7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNHTFRGU3BlY3VsYXJHbG9zc2luZXNzTWF0ZXJpYWwgKSBjYWNoZUtleSArPSAnc3BlY3VsYXItZ2xvc3NpbmVzczonO1xuXHRcdFx0aWYgKCB1c2VEZXJpdmF0aXZlVGFuZ2VudHMgKSBjYWNoZUtleSArPSAnZGVyaXZhdGl2ZS10YW5nZW50czonO1xuXHRcdFx0aWYgKCB1c2VWZXJ0ZXhDb2xvcnMgKSBjYWNoZUtleSArPSAndmVydGV4LWNvbG9yczonO1xuXHRcdFx0aWYgKCB1c2VGbGF0U2hhZGluZyApIGNhY2hlS2V5ICs9ICdmbGF0LXNoYWRpbmc6JztcblxuXHRcdFx0bGV0IGNhY2hlZE1hdGVyaWFsID0gdGhpcy5jYWNoZS5nZXQoIGNhY2hlS2V5ICk7XG5cblx0XHRcdGlmICggISBjYWNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHRcdFx0aWYgKCB1c2VWZXJ0ZXhDb2xvcnMgKSBjYWNoZWRNYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSB0cnVlO1xuXHRcdFx0XHRpZiAoIHVzZUZsYXRTaGFkaW5nICkgY2FjaGVkTWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggdXNlRGVyaXZhdGl2ZVRhbmdlbnRzICkge1xuXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi90aHJlZS5qcy9pc3N1ZXMvMTE0MzgjaXNzdWVjb21tZW50LTUwNzAwMzk5NVxuXHRcdFx0XHRcdGlmICggY2FjaGVkTWF0ZXJpYWwubm9ybWFsU2NhbGUgKSBjYWNoZWRNYXRlcmlhbC5ub3JtYWxTY2FsZS55ICo9IC0gMTtcblx0XHRcdFx0XHRpZiAoIGNhY2hlZE1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbFNjYWxlICkgY2FjaGVkTWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsU2NhbGUueSAqPSAtIDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuY2FjaGUuYWRkKCBjYWNoZUtleSwgY2FjaGVkTWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR0aGlzLmFzc29jaWF0aW9ucy5zZXQoIGNhY2hlZE1hdGVyaWFsLCB0aGlzLmFzc29jaWF0aW9ucy5nZXQoIG1hdGVyaWFsICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gd29ya2Fyb3VuZHMgZm9yIG1lc2ggYW5kIGdlb21ldHJ5XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFvTWFwICYmIGdlb21ldHJ5LmF0dHJpYnV0ZXMudXYyID09PSB1bmRlZmluZWQgJiYgZ2VvbWV0cnkuYXR0cmlidXRlcy51diAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICd1djInLCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnV2ICk7XG5cblx0XHR9XG5cblx0XHRtZXNoLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cblx0fVxuXG5cdGdldE1hdGVyaWFsVHlwZSggLyogbWF0ZXJpYWxJbmRleCAqLyApIHtcblxuXHRcdHJldHVybiBNZXNoU3RhbmRhcmRNYXRlcmlhbDtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi9ibG9iL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMC9SRUFETUUubWQjbWF0ZXJpYWxzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBtYXRlcmlhbEluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8TWF0ZXJpYWw+fVxuXHQgKi9cblx0bG9hZE1hdGVyaWFsKCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcztcblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWYgPSBqc29uLm1hdGVyaWFsc1sgbWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0bGV0IG1hdGVyaWFsVHlwZTtcblx0XHRjb25zdCBtYXRlcmlhbFBhcmFtcyA9IHt9O1xuXHRcdGNvbnN0IG1hdGVyaWFsRXh0ZW5zaW9ucyA9IG1hdGVyaWFsRGVmLmV4dGVuc2lvbnMgfHwge307XG5cblx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRpZiAoIG1hdGVyaWFsRXh0ZW5zaW9uc1sgRVhURU5TSU9OUy5LSFJfTUFURVJJQUxTX1BCUl9TUEVDVUxBUl9HTE9TU0lORVNTIF0gKSB7XG5cblx0XHRcdGNvbnN0IHNnRXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1sgRVhURU5TSU9OUy5LSFJfTUFURVJJQUxTX1BCUl9TUEVDVUxBUl9HTE9TU0lORVNTIF07XG5cdFx0XHRtYXRlcmlhbFR5cGUgPSBzZ0V4dGVuc2lvbi5nZXRNYXRlcmlhbFR5cGUoKTtcblx0XHRcdHBlbmRpbmcucHVzaCggc2dFeHRlbnNpb24uZXh0ZW5kUGFyYW1zKCBtYXRlcmlhbFBhcmFtcywgbWF0ZXJpYWxEZWYsIHBhcnNlciApICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbEV4dGVuc2lvbnNbIEVYVEVOU0lPTlMuS0hSX01BVEVSSUFMU19VTkxJVCBdICkge1xuXG5cdFx0XHRjb25zdCBrbXVFeHRlbnNpb24gPSBleHRlbnNpb25zWyBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfVU5MSVQgXTtcblx0XHRcdG1hdGVyaWFsVHlwZSA9IGttdUV4dGVuc2lvbi5nZXRNYXRlcmlhbFR5cGUoKTtcblx0XHRcdHBlbmRpbmcucHVzaCgga211RXh0ZW5zaW9uLmV4dGVuZFBhcmFtcyggbWF0ZXJpYWxQYXJhbXMsIG1hdGVyaWFsRGVmLCBwYXJzZXIgKSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gU3BlY2lmaWNhdGlvbjpcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMCNtZXRhbGxpYy1yb3VnaG5lc3MtbWF0ZXJpYWxcblxuXHRcdFx0Y29uc3QgbWV0YWxsaWNSb3VnaG5lc3MgPSBtYXRlcmlhbERlZi5wYnJNZXRhbGxpY1JvdWdobmVzcyB8fCB7fTtcblxuXHRcdFx0bWF0ZXJpYWxQYXJhbXMuY29sb3IgPSBuZXcgQ29sb3IoIDEuMCwgMS4wLCAxLjAgKTtcblx0XHRcdG1hdGVyaWFsUGFyYW1zLm9wYWNpdHkgPSAxLjA7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWV0YWxsaWNSb3VnaG5lc3MuYmFzZUNvbG9yRmFjdG9yICkgKSB7XG5cblx0XHRcdFx0Y29uc3QgYXJyYXkgPSBtZXRhbGxpY1JvdWdobmVzcy5iYXNlQ29sb3JGYWN0b3I7XG5cblx0XHRcdFx0bWF0ZXJpYWxQYXJhbXMuY29sb3IuZnJvbUFycmF5KCBhcnJheSApO1xuXHRcdFx0XHRtYXRlcmlhbFBhcmFtcy5vcGFjaXR5ID0gYXJyYXlbIDMgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1ldGFsbGljUm91Z2huZXNzLmJhc2VDb2xvclRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ21hcCcsIG1ldGFsbGljUm91Z2huZXNzLmJhc2VDb2xvclRleHR1cmUgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLm1ldGFsbmVzcyA9IG1ldGFsbGljUm91Z2huZXNzLm1ldGFsbGljRmFjdG9yICE9PSB1bmRlZmluZWQgPyBtZXRhbGxpY1JvdWdobmVzcy5tZXRhbGxpY0ZhY3RvciA6IDEuMDtcblx0XHRcdG1hdGVyaWFsUGFyYW1zLnJvdWdobmVzcyA9IG1ldGFsbGljUm91Z2huZXNzLnJvdWdobmVzc0ZhY3RvciAhPT0gdW5kZWZpbmVkID8gbWV0YWxsaWNSb3VnaG5lc3Mucm91Z2huZXNzRmFjdG9yIDogMS4wO1xuXG5cdFx0XHRpZiAoIG1ldGFsbGljUm91Z2huZXNzLm1ldGFsbGljUm91Z2huZXNzVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBlbmRpbmcucHVzaCggcGFyc2VyLmFzc2lnblRleHR1cmUoIG1hdGVyaWFsUGFyYW1zLCAnbWV0YWxuZXNzTWFwJywgbWV0YWxsaWNSb3VnaG5lc3MubWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlICkgKTtcblx0XHRcdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIuYXNzaWduVGV4dHVyZSggbWF0ZXJpYWxQYXJhbXMsICdyb3VnaG5lc3NNYXAnLCBtZXRhbGxpY1JvdWdobmVzcy5tZXRhbGxpY1JvdWdobmVzc1RleHR1cmUgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsVHlwZSA9IHRoaXMuX2ludm9rZU9uZSggZnVuY3Rpb24gKCBleHQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dC5nZXRNYXRlcmlhbFR5cGUgJiYgZXh0LmdldE1hdGVyaWFsVHlwZSggbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHBlbmRpbmcucHVzaCggUHJvbWlzZS5hbGwoIHRoaXMuX2ludm9rZUFsbCggZnVuY3Rpb24gKCBleHQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dC5leHRlbmRNYXRlcmlhbFBhcmFtcyAmJiBleHQuZXh0ZW5kTWF0ZXJpYWxQYXJhbXMoIG1hdGVyaWFsSW5kZXgsIG1hdGVyaWFsUGFyYW1zICk7XG5cblx0XHRcdH0gKSApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsRGVmLmRvdWJsZVNpZGVkID09PSB0cnVlICkge1xuXG5cdFx0XHRtYXRlcmlhbFBhcmFtcy5zaWRlID0gRG91YmxlU2lkZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGFscGhhTW9kZSA9IG1hdGVyaWFsRGVmLmFscGhhTW9kZSB8fCBBTFBIQV9NT0RFUy5PUEFRVUU7XG5cblx0XHRpZiAoIGFscGhhTW9kZSA9PT0gQUxQSEFfTU9ERVMuQkxFTkQgKSB7XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdFx0Ly8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xNzcwNlxuXHRcdFx0bWF0ZXJpYWxQYXJhbXMuZGVwdGhXcml0ZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWF0ZXJpYWxQYXJhbXMuZm9ybWF0ID0gUkdCRm9ybWF0O1xuXHRcdFx0bWF0ZXJpYWxQYXJhbXMudHJhbnNwYXJlbnQgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBhbHBoYU1vZGUgPT09IEFMUEhBX01PREVTLk1BU0sgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxQYXJhbXMuYWxwaGFUZXN0ID0gbWF0ZXJpYWxEZWYuYWxwaGFDdXRvZmYgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsRGVmLmFscGhhQ3V0b2ZmIDogMC41O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsRGVmLm5vcm1hbFRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbFR5cGUgIT09IE1lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ25vcm1hbE1hcCcsIG1hdGVyaWFsRGVmLm5vcm1hbFRleHR1cmUgKSApO1xuXG5cdFx0XHRtYXRlcmlhbFBhcmFtcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0XHRcdGlmICggbWF0ZXJpYWxEZWYubm9ybWFsVGV4dHVyZS5zY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnN0IHNjYWxlID0gbWF0ZXJpYWxEZWYubm9ybWFsVGV4dHVyZS5zY2FsZTtcblxuXHRcdFx0XHRtYXRlcmlhbFBhcmFtcy5ub3JtYWxTY2FsZS5zZXQoIHNjYWxlLCBzY2FsZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsRGVmLm9jY2x1c2lvblRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbFR5cGUgIT09IE1lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ2FvTWFwJywgbWF0ZXJpYWxEZWYub2NjbHVzaW9uVGV4dHVyZSApICk7XG5cblx0XHRcdGlmICggbWF0ZXJpYWxEZWYub2NjbHVzaW9uVGV4dHVyZS5zdHJlbmd0aCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsUGFyYW1zLmFvTWFwSW50ZW5zaXR5ID0gbWF0ZXJpYWxEZWYub2NjbHVzaW9uVGV4dHVyZS5zdHJlbmd0aDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbERlZi5lbWlzc2l2ZUZhY3RvciAhPT0gdW5kZWZpbmVkICYmIG1hdGVyaWFsVHlwZSAhPT0gTWVzaEJhc2ljTWF0ZXJpYWwgKSB7XG5cblx0XHRcdG1hdGVyaWFsUGFyYW1zLmVtaXNzaXZlID0gbmV3IENvbG9yKCkuZnJvbUFycmF5KCBtYXRlcmlhbERlZi5lbWlzc2l2ZUZhY3RvciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbERlZi5lbWlzc2l2ZVRleHR1cmUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbFR5cGUgIT09IE1lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRwZW5kaW5nLnB1c2goIHBhcnNlci5hc3NpZ25UZXh0dXJlKCBtYXRlcmlhbFBhcmFtcywgJ2VtaXNzaXZlTWFwJywgbWF0ZXJpYWxEZWYuZW1pc3NpdmVUZXh0dXJlICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbCggcGVuZGluZyApLnRoZW4oIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0bGV0IG1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsVHlwZSA9PT0gR0xURk1lc2hTdGFuZGFyZFNHTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwgPSBleHRlbnNpb25zWyBFWFRFTlNJT05TLktIUl9NQVRFUklBTFNfUEJSX1NQRUNVTEFSX0dMT1NTSU5FU1MgXS5jcmVhdGVNYXRlcmlhbCggbWF0ZXJpYWxQYXJhbXMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtYXRlcmlhbCA9IG5ldyBtYXRlcmlhbFR5cGUoIG1hdGVyaWFsUGFyYW1zICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbERlZi5uYW1lICkgbWF0ZXJpYWwubmFtZSA9IG1hdGVyaWFsRGVmLm5hbWU7XG5cblx0XHRcdC8vIGJhc2VDb2xvclRleHR1cmUsIGVtaXNzaXZlVGV4dHVyZSwgYW5kIHNwZWN1bGFyR2xvc3NpbmVzc1RleHR1cmUgdXNlIHNSR0IgZW5jb2RpbmcuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIG1hdGVyaWFsLm1hcC5lbmNvZGluZyA9IHNSR0JFbmNvZGluZztcblx0XHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSBtYXRlcmlhbC5lbWlzc2l2ZU1hcC5lbmNvZGluZyA9IHNSR0JFbmNvZGluZztcblxuXHRcdFx0YXNzaWduRXh0cmFzVG9Vc2VyRGF0YSggbWF0ZXJpYWwsIG1hdGVyaWFsRGVmICk7XG5cblx0XHRcdHBhcnNlci5hc3NvY2lhdGlvbnMuc2V0KCBtYXRlcmlhbCwgeyBtYXRlcmlhbHM6IG1hdGVyaWFsSW5kZXggfSApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsRGVmLmV4dGVuc2lvbnMgKSBhZGRVbmtub3duRXh0ZW5zaW9uc1RvVXNlckRhdGEoIGV4dGVuc2lvbnMsIG1hdGVyaWFsLCBtYXRlcmlhbERlZiApO1xuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdC8qKiBXaGVuIE9iamVjdDNEIGluc3RhbmNlcyBhcmUgdGFyZ2V0ZWQgYnkgYW5pbWF0aW9uLCB0aGV5IG5lZWQgdW5pcXVlIG5hbWVzLiAqL1xuXHRjcmVhdGVVbmlxdWVOYW1lKCBvcmlnaW5hbE5hbWUgKSB7XG5cblx0XHRjb25zdCBzYW5pdGl6ZWROYW1lID0gUHJvcGVydHlCaW5kaW5nLnNhbml0aXplTm9kZU5hbWUoIG9yaWdpbmFsTmFtZSB8fCAnJyApO1xuXG5cdFx0bGV0IG5hbWUgPSBzYW5pdGl6ZWROYW1lO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAxOyB0aGlzLm5vZGVOYW1lc1VzZWRbIG5hbWUgXTsgKysgaSApIHtcblxuXHRcdFx0bmFtZSA9IHNhbml0aXplZE5hbWUgKyAnXycgKyBpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ub2RlTmFtZXNVc2VkWyBuYW1lIF0gPSB0cnVlO1xuXG5cdFx0cmV0dXJuIG5hbWU7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi8yLjAvUkVBRE1FLm1kI2dlb21ldHJ5XG5cdCAqXG5cdCAqIENyZWF0ZXMgQnVmZmVyR2VvbWV0cmllcyBmcm9tIHByaW1pdGl2ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7QXJyYXk8R0xURi5QcmltaXRpdmU+fSBwcmltaXRpdmVzXG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8QnVmZmVyR2VvbWV0cnk+Pn1cblx0ICovXG5cdGxvYWRHZW9tZXRyaWVzKCBwcmltaXRpdmVzICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcztcblx0XHRjb25zdCBleHRlbnNpb25zID0gdGhpcy5leHRlbnNpb25zO1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5wcmltaXRpdmVDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGNyZWF0ZURyYWNvUHJpbWl0aXZlKCBwcmltaXRpdmUgKSB7XG5cblx0XHRcdHJldHVybiBleHRlbnNpb25zWyBFWFRFTlNJT05TLktIUl9EUkFDT19NRVNIX0NPTVBSRVNTSU9OIF1cblx0XHRcdFx0LmRlY29kZVByaW1pdGl2ZSggcHJpbWl0aXZlLCBwYXJzZXIgKVxuXHRcdFx0XHQudGhlbiggZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHJldHVybiBhZGRQcmltaXRpdmVBdHRyaWJ1dGVzKCBnZW9tZXRyeSwgcHJpbWl0aXZlLCBwYXJzZXIgKTtcblxuXHRcdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcHJpbWl0aXZlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgcHJpbWl0aXZlID0gcHJpbWl0aXZlc1sgaSBdO1xuXHRcdFx0Y29uc3QgY2FjaGVLZXkgPSBjcmVhdGVQcmltaXRpdmVLZXkoIHByaW1pdGl2ZSApO1xuXG5cdFx0XHQvLyBTZWUgaWYgd2UndmUgYWxyZWFkeSBjcmVhdGVkIHRoaXMgZ2VvbWV0cnlcblx0XHRcdGNvbnN0IGNhY2hlZCA9IGNhY2hlWyBjYWNoZUtleSBdO1xuXG5cdFx0XHRpZiAoIGNhY2hlZCApIHtcblxuXHRcdFx0XHQvLyBVc2UgdGhlIGNhY2hlZCBnZW9tZXRyeSBpZiBpdCBleGlzdHNcblx0XHRcdFx0cGVuZGluZy5wdXNoKCBjYWNoZWQucHJvbWlzZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGxldCBnZW9tZXRyeVByb21pc2U7XG5cblx0XHRcdFx0aWYgKCBwcmltaXRpdmUuZXh0ZW5zaW9ucyAmJiBwcmltaXRpdmUuZXh0ZW5zaW9uc1sgRVhURU5TSU9OUy5LSFJfRFJBQ09fTUVTSF9DT01QUkVTU0lPTiBdICkge1xuXG5cdFx0XHRcdFx0Ly8gVXNlIERSQUNPIGdlb21ldHJ5IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdGdlb21ldHJ5UHJvbWlzZSA9IGNyZWF0ZURyYWNvUHJpbWl0aXZlKCBwcmltaXRpdmUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyBnZW9tZXRyeVxuXHRcdFx0XHRcdGdlb21ldHJ5UHJvbWlzZSA9IGFkZFByaW1pdGl2ZUF0dHJpYnV0ZXMoIG5ldyBCdWZmZXJHZW9tZXRyeSgpLCBwcmltaXRpdmUsIHBhcnNlciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDYWNoZSB0aGlzIGdlb21ldHJ5XG5cdFx0XHRcdGNhY2hlWyBjYWNoZUtleSBdID0geyBwcmltaXRpdmU6IHByaW1pdGl2ZSwgcHJvbWlzZTogZ2VvbWV0cnlQcm9taXNlIH07XG5cblx0XHRcdFx0cGVuZGluZy5wdXNoKCBnZW9tZXRyeVByb21pc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKCBwZW5kaW5nICk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2dpdGh1Yi5jb20vS2hyb25vc0dyb3VwL2dsVEYvYmxvYi9tYXN0ZXIvc3BlY2lmaWNhdGlvbi8yLjAvUkVBRE1FLm1kI21lc2hlc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gbWVzaEluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8R3JvdXB8TWVzaHxTa2lubmVkTWVzaD59XG5cdCAqL1xuXHRsb2FkTWVzaCggbWVzaEluZGV4ICkge1xuXG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcztcblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG5cblx0XHRjb25zdCBtZXNoRGVmID0ganNvbi5tZXNoZXNbIG1lc2hJbmRleCBdO1xuXHRcdGNvbnN0IHByaW1pdGl2ZXMgPSBtZXNoRGVmLnByaW1pdGl2ZXM7XG5cblx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcHJpbWl0aXZlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBwcmltaXRpdmVzWyBpIF0ubWF0ZXJpYWwgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHQ/IGNyZWF0ZURlZmF1bHRNYXRlcmlhbCggdGhpcy5jYWNoZSApXG5cdFx0XHRcdDogdGhpcy5nZXREZXBlbmRlbmN5KCAnbWF0ZXJpYWwnLCBwcmltaXRpdmVzWyBpIF0ubWF0ZXJpYWwgKTtcblxuXHRcdFx0cGVuZGluZy5wdXNoKCBtYXRlcmlhbCApO1xuXG5cdFx0fVxuXG5cdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIubG9hZEdlb21ldHJpZXMoIHByaW1pdGl2ZXMgKSApO1xuXG5cdFx0cmV0dXJuIFByb21pc2UuYWxsKCBwZW5kaW5nICkudGhlbiggZnVuY3Rpb24gKCByZXN1bHRzICkge1xuXG5cdFx0XHRjb25zdCBtYXRlcmlhbHMgPSByZXN1bHRzLnNsaWNlKCAwLCByZXN1bHRzLmxlbmd0aCAtIDEgKTtcblx0XHRcdGNvbnN0IGdlb21ldHJpZXMgPSByZXN1bHRzWyByZXN1bHRzLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0Y29uc3QgbWVzaGVzID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBnZW9tZXRyaWVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gZ2VvbWV0cmllc1sgaSBdO1xuXHRcdFx0XHRjb25zdCBwcmltaXRpdmUgPSBwcmltaXRpdmVzWyBpIF07XG5cblx0XHRcdFx0Ly8gMS4gY3JlYXRlIE1lc2hcblxuXHRcdFx0XHRsZXQgbWVzaDtcblxuXHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG1hdGVyaWFsc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggcHJpbWl0aXZlLm1vZGUgPT09IFdFQkdMX0NPTlNUQU5UUy5UUklBTkdMRVMgfHxcblx0XHRcdFx0XHRcdHByaW1pdGl2ZS5tb2RlID09PSBXRUJHTF9DT05TVEFOVFMuVFJJQU5HTEVfU1RSSVAgfHxcblx0XHRcdFx0XHRcdHByaW1pdGl2ZS5tb2RlID09PSBXRUJHTF9DT05TVEFOVFMuVFJJQU5HTEVfRkFOIHx8XG5cdFx0XHRcdFx0XHRwcmltaXRpdmUubW9kZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gLmlzU2tpbm5lZE1lc2ggaXNuJ3QgaW4gZ2xURiBzcGVjLiBTZWUgLl9tYXJrRGVmcygpXG5cdFx0XHRcdFx0bWVzaCA9IG1lc2hEZWYuaXNTa2lubmVkTWVzaCA9PT0gdHJ1ZVxuXHRcdFx0XHRcdFx0PyBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApXG5cdFx0XHRcdFx0XHQ6IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRcdGlmICggbWVzaC5pc1NraW5uZWRNZXNoID09PSB0cnVlICYmICEgbWVzaC5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQubm9ybWFsaXplZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gd2Ugbm9ybWFsaXplIGZsb2F0aW5nIHBvaW50IHNraW4gd2VpZ2h0IGFycmF5IHRvIGZpeCBtYWxmb3JtZWQgYXNzZXRzIChzZWUgIzE1MzE5KVxuXHRcdFx0XHRcdFx0Ly8gaXQncyBpbXBvcnRhbnQgdG8gc2tpcCB0aGlzIGZvciBub24tZmxvYXQzMiBkYXRhIHNpbmNlIG5vcm1hbGl6ZVNraW5XZWlnaHRzIGFzc3VtZXMgbm9uLW5vcm1hbGl6ZWQgaW5wdXRzXG5cdFx0XHRcdFx0XHRtZXNoLm5vcm1hbGl6ZVNraW5XZWlnaHRzKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIHByaW1pdGl2ZS5tb2RlID09PSBXRUJHTF9DT05TVEFOVFMuVFJJQU5HTEVfU1RSSVAgKSB7XG5cblx0XHRcdFx0XHRcdG1lc2guZ2VvbWV0cnkgPSB0b1RyaWFuZ2xlc0RyYXdNb2RlKCBtZXNoLmdlb21ldHJ5LCBUcmlhbmdsZVN0cmlwRHJhd01vZGUgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIHByaW1pdGl2ZS5tb2RlID09PSBXRUJHTF9DT05TVEFOVFMuVFJJQU5HTEVfRkFOICkge1xuXG5cdFx0XHRcdFx0XHRtZXNoLmdlb21ldHJ5ID0gdG9UcmlhbmdsZXNEcmF3TW9kZSggbWVzaC5nZW9tZXRyeSwgVHJpYW5nbGVGYW5EcmF3TW9kZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHByaW1pdGl2ZS5tb2RlID09PSBXRUJHTF9DT05TVEFOVFMuTElORVMgKSB7XG5cblx0XHRcdFx0XHRtZXNoID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggcHJpbWl0aXZlLm1vZGUgPT09IFdFQkdMX0NPTlNUQU5UUy5MSU5FX1NUUklQICkge1xuXG5cdFx0XHRcdFx0bWVzaCA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBwcmltaXRpdmUubW9kZSA9PT0gV0VCR0xfQ09OU1RBTlRTLkxJTkVfTE9PUCApIHtcblxuXHRcdFx0XHRcdG1lc2ggPSBuZXcgTGluZUxvb3AoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHByaW1pdGl2ZS5tb2RlID09PSBXRUJHTF9DT05TVEFOVFMuUE9JTlRTICkge1xuXG5cdFx0XHRcdFx0bWVzaCA9IG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5HTFRGTG9hZGVyOiBQcmltaXRpdmUgbW9kZSB1bnN1cHBvcnRlZDogJyArIHByaW1pdGl2ZS5tb2RlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggT2JqZWN0LmtleXMoIG1lc2guZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRcdHVwZGF0ZU1vcnBoVGFyZ2V0cyggbWVzaCwgbWVzaERlZiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtZXNoLm5hbWUgPSBwYXJzZXIuY3JlYXRlVW5pcXVlTmFtZSggbWVzaERlZi5uYW1lIHx8ICggJ21lc2hfJyArIG1lc2hJbmRleCApICk7XG5cblx0XHRcdFx0YXNzaWduRXh0cmFzVG9Vc2VyRGF0YSggbWVzaCwgbWVzaERlZiApO1xuXG5cdFx0XHRcdGlmICggcHJpbWl0aXZlLmV4dGVuc2lvbnMgKSBhZGRVbmtub3duRXh0ZW5zaW9uc1RvVXNlckRhdGEoIGV4dGVuc2lvbnMsIG1lc2gsIHByaW1pdGl2ZSApO1xuXG5cdFx0XHRcdHBhcnNlci5hc3NpZ25GaW5hbE1hdGVyaWFsKCBtZXNoICk7XG5cblx0XHRcdFx0bWVzaGVzLnB1c2goIG1lc2ggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbWVzaGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHBhcnNlci5hc3NvY2lhdGlvbnMuc2V0KCBtZXNoZXNbIGkgXSwge1xuXHRcdFx0XHRcdG1lc2hlczogbWVzaEluZGV4LFxuXHRcdFx0XHRcdHByaW1pdGl2ZXM6IGlcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWVzaGVzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0XHRyZXR1cm4gbWVzaGVzWyAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoKTtcblxuXHRcdFx0cGFyc2VyLmFzc29jaWF0aW9ucy5zZXQoIGdyb3VwLCB7IG1lc2hlczogbWVzaEluZGV4IH0gKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1lc2hlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRncm91cC5hZGQoIG1lc2hlc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGdyb3VwO1xuXG5cdFx0fSApO1xuXG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL3NwZWNpZmljYXRpb24vMi4wI2NhbWVyYXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IGNhbWVyYUluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8VEhSRUUuQ2FtZXJhPn1cblx0ICovXG5cdGxvYWRDYW1lcmEoIGNhbWVyYUluZGV4ICkge1xuXG5cdFx0bGV0IGNhbWVyYTtcblx0XHRjb25zdCBjYW1lcmFEZWYgPSB0aGlzLmpzb24uY2FtZXJhc1sgY2FtZXJhSW5kZXggXTtcblx0XHRjb25zdCBwYXJhbXMgPSBjYW1lcmFEZWZbIGNhbWVyYURlZi50eXBlIF07XG5cblx0XHRpZiAoICEgcGFyYW1zICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HTFRGTG9hZGVyOiBNaXNzaW5nIGNhbWVyYSBwYXJhbWV0ZXJzLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggY2FtZXJhRGVmLnR5cGUgPT09ICdwZXJzcGVjdGl2ZScgKSB7XG5cblx0XHRcdGNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggTWF0aFV0aWxzLnJhZFRvRGVnKCBwYXJhbXMueWZvdiApLCBwYXJhbXMuYXNwZWN0UmF0aW8gfHwgMSwgcGFyYW1zLnpuZWFyIHx8IDEsIHBhcmFtcy56ZmFyIHx8IDJlNiApO1xuXG5cdFx0fSBlbHNlIGlmICggY2FtZXJhRGVmLnR5cGUgPT09ICdvcnRob2dyYXBoaWMnICkge1xuXG5cdFx0XHRjYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIHBhcmFtcy54bWFnLCBwYXJhbXMueG1hZywgcGFyYW1zLnltYWcsIC0gcGFyYW1zLnltYWcsIHBhcmFtcy56bmVhciwgcGFyYW1zLnpmYXIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggY2FtZXJhRGVmLm5hbWUgKSBjYW1lcmEubmFtZSA9IHRoaXMuY3JlYXRlVW5pcXVlTmFtZSggY2FtZXJhRGVmLm5hbWUgKTtcblxuXHRcdGFzc2lnbkV4dHJhc1RvVXNlckRhdGEoIGNhbWVyYSwgY2FtZXJhRGVmICk7XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCBjYW1lcmEgKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMCNza2luc1xuXHQgKiBAcGFyYW0ge251bWJlcn0gc2tpbkluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8T2JqZWN0Pn1cblx0ICovXG5cdGxvYWRTa2luKCBza2luSW5kZXggKSB7XG5cblx0XHRjb25zdCBza2luRGVmID0gdGhpcy5qc29uLnNraW5zWyBza2luSW5kZXggXTtcblxuXHRcdGNvbnN0IHNraW5FbnRyeSA9IHsgam9pbnRzOiBza2luRGVmLmpvaW50cyB9O1xuXG5cdFx0aWYgKCBza2luRGVmLmludmVyc2VCaW5kTWF0cmljZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSggc2tpbkVudHJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXREZXBlbmRlbmN5KCAnYWNjZXNzb3InLCBza2luRGVmLmludmVyc2VCaW5kTWF0cmljZXMgKS50aGVuKCBmdW5jdGlvbiAoIGFjY2Vzc29yICkge1xuXG5cdFx0XHRza2luRW50cnkuaW52ZXJzZUJpbmRNYXRyaWNlcyA9IGFjY2Vzc29yO1xuXG5cdFx0XHRyZXR1cm4gc2tpbkVudHJ5O1xuXG5cdFx0fSApO1xuXG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL3NwZWNpZmljYXRpb24vMi4wI2FuaW1hdGlvbnNcblx0ICogQHBhcmFtIHtudW1iZXJ9IGFuaW1hdGlvbkluZGV4XG5cdCAqIEByZXR1cm4ge1Byb21pc2U8QW5pbWF0aW9uQ2xpcD59XG5cdCAqL1xuXHRsb2FkQW5pbWF0aW9uKCBhbmltYXRpb25JbmRleCApIHtcblxuXHRcdGNvbnN0IGpzb24gPSB0aGlzLmpzb247XG5cblx0XHRjb25zdCBhbmltYXRpb25EZWYgPSBqc29uLmFuaW1hdGlvbnNbIGFuaW1hdGlvbkluZGV4IF07XG5cblx0XHRjb25zdCBwZW5kaW5nTm9kZXMgPSBbXTtcblx0XHRjb25zdCBwZW5kaW5nSW5wdXRBY2Nlc3NvcnMgPSBbXTtcblx0XHRjb25zdCBwZW5kaW5nT3V0cHV0QWNjZXNzb3JzID0gW107XG5cdFx0Y29uc3QgcGVuZGluZ1NhbXBsZXJzID0gW107XG5cdFx0Y29uc3QgcGVuZGluZ1RhcmdldHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhbmltYXRpb25EZWYuY2hhbm5lbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGNoYW5uZWwgPSBhbmltYXRpb25EZWYuY2hhbm5lbHNbIGkgXTtcblx0XHRcdGNvbnN0IHNhbXBsZXIgPSBhbmltYXRpb25EZWYuc2FtcGxlcnNbIGNoYW5uZWwuc2FtcGxlciBdO1xuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gY2hhbm5lbC50YXJnZXQ7XG5cdFx0XHRjb25zdCBuYW1lID0gdGFyZ2V0Lm5vZGUgIT09IHVuZGVmaW5lZCA/IHRhcmdldC5ub2RlIDogdGFyZ2V0LmlkOyAvLyBOT1RFOiB0YXJnZXQuaWQgaXMgZGVwcmVjYXRlZC5cblx0XHRcdGNvbnN0IGlucHV0ID0gYW5pbWF0aW9uRGVmLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCA/IGFuaW1hdGlvbkRlZi5wYXJhbWV0ZXJzWyBzYW1wbGVyLmlucHV0IF0gOiBzYW1wbGVyLmlucHV0O1xuXHRcdFx0Y29uc3Qgb3V0cHV0ID0gYW5pbWF0aW9uRGVmLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCA/IGFuaW1hdGlvbkRlZi5wYXJhbWV0ZXJzWyBzYW1wbGVyLm91dHB1dCBdIDogc2FtcGxlci5vdXRwdXQ7XG5cblx0XHRcdHBlbmRpbmdOb2Rlcy5wdXNoKCB0aGlzLmdldERlcGVuZGVuY3koICdub2RlJywgbmFtZSApICk7XG5cdFx0XHRwZW5kaW5nSW5wdXRBY2Nlc3NvcnMucHVzaCggdGhpcy5nZXREZXBlbmRlbmN5KCAnYWNjZXNzb3InLCBpbnB1dCApICk7XG5cdFx0XHRwZW5kaW5nT3V0cHV0QWNjZXNzb3JzLnB1c2goIHRoaXMuZ2V0RGVwZW5kZW5jeSggJ2FjY2Vzc29yJywgb3V0cHV0ICkgKTtcblx0XHRcdHBlbmRpbmdTYW1wbGVycy5wdXNoKCBzYW1wbGVyICk7XG5cdFx0XHRwZW5kaW5nVGFyZ2V0cy5wdXNoKCB0YXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbCggW1xuXG5cdFx0XHRQcm9taXNlLmFsbCggcGVuZGluZ05vZGVzICksXG5cdFx0XHRQcm9taXNlLmFsbCggcGVuZGluZ0lucHV0QWNjZXNzb3JzICksXG5cdFx0XHRQcm9taXNlLmFsbCggcGVuZGluZ091dHB1dEFjY2Vzc29ycyApLFxuXHRcdFx0UHJvbWlzZS5hbGwoIHBlbmRpbmdTYW1wbGVycyApLFxuXHRcdFx0UHJvbWlzZS5hbGwoIHBlbmRpbmdUYXJnZXRzIClcblxuXHRcdF0gKS50aGVuKCBmdW5jdGlvbiAoIGRlcGVuZGVuY2llcyApIHtcblxuXHRcdFx0Y29uc3Qgbm9kZXMgPSBkZXBlbmRlbmNpZXNbIDAgXTtcblx0XHRcdGNvbnN0IGlucHV0QWNjZXNzb3JzID0gZGVwZW5kZW5jaWVzWyAxIF07XG5cdFx0XHRjb25zdCBvdXRwdXRBY2Nlc3NvcnMgPSBkZXBlbmRlbmNpZXNbIDIgXTtcblx0XHRcdGNvbnN0IHNhbXBsZXJzID0gZGVwZW5kZW5jaWVzWyAzIF07XG5cdFx0XHRjb25zdCB0YXJnZXRzID0gZGVwZW5kZW5jaWVzWyA0IF07XG5cblx0XHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbm9kZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgbm9kZSA9IG5vZGVzWyBpIF07XG5cdFx0XHRcdGNvbnN0IGlucHV0QWNjZXNzb3IgPSBpbnB1dEFjY2Vzc29yc1sgaSBdO1xuXHRcdFx0XHRjb25zdCBvdXRwdXRBY2Nlc3NvciA9IG91dHB1dEFjY2Vzc29yc1sgaSBdO1xuXHRcdFx0XHRjb25zdCBzYW1wbGVyID0gc2FtcGxlcnNbIGkgXTtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRcdGlmICggbm9kZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0bm9kZS51cGRhdGVNYXRyaXgoKTtcblx0XHRcdFx0bm9kZS5tYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRsZXQgVHlwZWRLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRcdHN3aXRjaCAoIFBBVEhfUFJPUEVSVElFU1sgdGFyZ2V0LnBhdGggXSApIHtcblxuXHRcdFx0XHRcdGNhc2UgUEFUSF9QUk9QRVJUSUVTLndlaWdodHM6XG5cblx0XHRcdFx0XHRcdFR5cGVkS2V5ZnJhbWVUcmFjayA9IE51bWJlcktleWZyYW1lVHJhY2s7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgUEFUSF9QUk9QRVJUSUVTLnJvdGF0aW9uOlxuXG5cdFx0XHRcdFx0XHRUeXBlZEtleWZyYW1lVHJhY2sgPSBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBQQVRIX1BST1BFUlRJRVMucG9zaXRpb246XG5cdFx0XHRcdFx0Y2FzZSBQQVRIX1BST1BFUlRJRVMuc2NhbGU6XG5cdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0VHlwZWRLZXlmcmFtZVRyYWNrID0gVmVjdG9yS2V5ZnJhbWVUcmFjaztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCB0YXJnZXROYW1lID0gbm9kZS5uYW1lID8gbm9kZS5uYW1lIDogbm9kZS51dWlkO1xuXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYXRpb24gPSBzYW1wbGVyLmludGVycG9sYXRpb24gIT09IHVuZGVmaW5lZCA/IElOVEVSUE9MQVRJT05bIHNhbXBsZXIuaW50ZXJwb2xhdGlvbiBdIDogSW50ZXJwb2xhdGVMaW5lYXI7XG5cblx0XHRcdFx0Y29uc3QgdGFyZ2V0TmFtZXMgPSBbXTtcblxuXHRcdFx0XHRpZiAoIFBBVEhfUFJPUEVSVElFU1sgdGFyZ2V0LnBhdGggXSA9PT0gUEFUSF9QUk9QRVJUSUVTLndlaWdodHMgKSB7XG5cblx0XHRcdFx0XHQvLyBOb2RlIG1heSBiZSBhIEdyb3VwIChnbFRGIG1lc2ggd2l0aCBzZXZlcmFsIHByaW1pdGl2ZXMpIG9yIGEgTWVzaC5cblx0XHRcdFx0XHRub2RlLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBvYmplY3QuaXNNZXNoID09PSB0cnVlICYmIG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMgKSB7XG5cblx0XHRcdFx0XHRcdFx0dGFyZ2V0TmFtZXMucHVzaCggb2JqZWN0Lm5hbWUgPyBvYmplY3QubmFtZSA6IG9iamVjdC51dWlkICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGFyZ2V0TmFtZXMucHVzaCggdGFyZ2V0TmFtZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRsZXQgb3V0cHV0QXJyYXkgPSBvdXRwdXRBY2Nlc3Nvci5hcnJheTtcblxuXHRcdFx0XHRpZiAoIG91dHB1dEFjY2Vzc29yLm5vcm1hbGl6ZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBzY2FsZSA9IGdldE5vcm1hbGl6ZWRDb21wb25lbnRTY2FsZSggb3V0cHV0QXJyYXkuY29uc3RydWN0b3IgKTtcblx0XHRcdFx0XHRjb25zdCBzY2FsZWQgPSBuZXcgRmxvYXQzMkFycmF5KCBvdXRwdXRBcnJheS5sZW5ndGggKTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBvdXRwdXRBcnJheS5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0c2NhbGVkWyBqIF0gPSBvdXRwdXRBcnJheVsgaiBdICogc2NhbGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRvdXRwdXRBcnJheSA9IHNjYWxlZDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IHRhcmdldE5hbWVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdHJhY2sgPSBuZXcgVHlwZWRLZXlmcmFtZVRyYWNrKFxuXHRcdFx0XHRcdFx0dGFyZ2V0TmFtZXNbIGogXSArICcuJyArIFBBVEhfUFJPUEVSVElFU1sgdGFyZ2V0LnBhdGggXSxcblx0XHRcdFx0XHRcdGlucHV0QWNjZXNzb3IuYXJyYXksXG5cdFx0XHRcdFx0XHRvdXRwdXRBcnJheSxcblx0XHRcdFx0XHRcdGludGVycG9sYXRpb25cblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Ly8gT3ZlcnJpZGUgaW50ZXJwb2xhdGlvbiB3aXRoIGN1c3RvbSBmYWN0b3J5IG1ldGhvZC5cblx0XHRcdFx0XHRpZiAoIHNhbXBsZXIuaW50ZXJwb2xhdGlvbiA9PT0gJ0NVQklDU1BMSU5FJyApIHtcblxuXHRcdFx0XHRcdFx0dHJhY2suY3JlYXRlSW50ZXJwb2xhbnQgPSBmdW5jdGlvbiBJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUoIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIENVQklDU1BMSU5FIGtleWZyYW1lIGluIGdsVEYgaGFzIHRocmVlIG91dHB1dCB2YWx1ZXMgZm9yIGVhY2ggaW5wdXQgdmFsdWUsXG5cdFx0XHRcdFx0XHRcdC8vIHJlcHJlc2VudGluZyBpblRhbmdlbnQsIHNwbGluZVZlcnRleCwgYW5kIG91dFRhbmdlbnQuIEFzIGEgcmVzdWx0LCB0cmFjay5nZXRWYWx1ZVNpemUoKVxuXHRcdFx0XHRcdFx0XHQvLyBtdXN0IGJlIGRpdmlkZWQgYnkgdGhyZWUgdG8gZ2V0IHRoZSBpbnRlcnBvbGFudCdzIHNhbXBsZVNpemUgYXJndW1lbnQuXG5cblx0XHRcdFx0XHRcdFx0Y29uc3QgaW50ZXJwb2xhbnRUeXBlID0gKCB0aGlzIGluc3RhbmNlb2YgUXVhdGVybmlvbktleWZyYW1lVHJhY2sgKSA/IEdMVEZDdWJpY1NwbGluZVF1YXRlcm5pb25JbnRlcnBvbGFudCA6IEdMVEZDdWJpY1NwbGluZUludGVycG9sYW50O1xuXG5cdFx0XHRcdFx0XHRcdHJldHVybiBuZXcgaW50ZXJwb2xhbnRUeXBlKCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSAvIDMsIHJlc3VsdCApO1xuXG5cdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHQvLyBNYXJrIGFzIENVQklDU1BMSU5FLiBgdHJhY2suZ2V0SW50ZXJwb2xhdGlvbigpYCBkb2Vzbid0IHN1cHBvcnQgY3VzdG9tIGludGVycG9sYW50cy5cblx0XHRcdFx0XHRcdHRyYWNrLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCB0cmFjayApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBuYW1lID0gYW5pbWF0aW9uRGVmLm5hbWUgPyBhbmltYXRpb25EZWYubmFtZSA6ICdhbmltYXRpb25fJyArIGFuaW1hdGlvbkluZGV4O1xuXG5cdFx0XHRyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIG5hbWUsIHVuZGVmaW5lZCwgdHJhY2tzICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdGNyZWF0ZU5vZGVNZXNoKCBub2RlSW5kZXggKSB7XG5cblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IHBhcnNlciA9IHRoaXM7XG5cdFx0Y29uc3Qgbm9kZURlZiA9IGpzb24ubm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0aWYgKCBub2RlRGVmLm1lc2ggPT09IHVuZGVmaW5lZCApIHJldHVybiBudWxsO1xuXG5cdFx0cmV0dXJuIHBhcnNlci5nZXREZXBlbmRlbmN5KCAnbWVzaCcsIG5vZGVEZWYubWVzaCApLnRoZW4oIGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdFx0Y29uc3Qgbm9kZSA9IHBhcnNlci5fZ2V0Tm9kZVJlZiggcGFyc2VyLm1lc2hDYWNoZSwgbm9kZURlZi5tZXNoLCBtZXNoICk7XG5cblx0XHRcdC8vIGlmIHdlaWdodHMgYXJlIHByb3ZpZGVkIG9uIHRoZSBub2RlLCBvdmVycmlkZSB3ZWlnaHRzIG9uIHRoZSBtZXNoLlxuXHRcdFx0aWYgKCBub2RlRGVmLndlaWdodHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRub2RlLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG8gKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgby5pc01lc2ggKSByZXR1cm47XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbm9kZURlZi53ZWlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRvLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdID0gbm9kZURlZi53ZWlnaHRzWyBpIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBub2RlO1xuXG5cdFx0fSApO1xuXG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL0tocm9ub3NHcm91cC9nbFRGL3RyZWUvbWFzdGVyL3NwZWNpZmljYXRpb24vMi4wI25vZGVzLWFuZC1oaWVyYXJjaHlcblx0ICogQHBhcmFtIHtudW1iZXJ9IG5vZGVJbmRleFxuXHQgKiBAcmV0dXJuIHtQcm9taXNlPE9iamVjdDNEPn1cblx0ICovXG5cdGxvYWROb2RlKCBub2RlSW5kZXggKSB7XG5cblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcztcblxuXHRcdGNvbnN0IG5vZGVEZWYgPSBqc29uLm5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdC8vIHJlc2VydmUgbm9kZSdzIG5hbWUgYmVmb3JlIGl0cyBkZXBlbmRlbmNpZXMsIHNvIHRoZSByb290IGhhcyB0aGUgaW50ZW5kZWQgbmFtZS5cblx0XHRjb25zdCBub2RlTmFtZSA9IG5vZGVEZWYubmFtZSA/IHBhcnNlci5jcmVhdGVVbmlxdWVOYW1lKCBub2RlRGVmLm5hbWUgKSA6ICcnO1xuXG5cdFx0cmV0dXJuICggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRcdGNvbnN0IG1lc2hQcm9taXNlID0gcGFyc2VyLl9pbnZva2VPbmUoIGZ1bmN0aW9uICggZXh0ICkge1xuXG5cdFx0XHRcdHJldHVybiBleHQuY3JlYXRlTm9kZU1lc2ggJiYgZXh0LmNyZWF0ZU5vZGVNZXNoKCBub2RlSW5kZXggKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIG1lc2hQcm9taXNlICkge1xuXG5cdFx0XHRcdHBlbmRpbmcucHVzaCggbWVzaFByb21pc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG5vZGVEZWYuY2FtZXJhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cGVuZGluZy5wdXNoKCBwYXJzZXIuZ2V0RGVwZW5kZW5jeSggJ2NhbWVyYScsIG5vZGVEZWYuY2FtZXJhICkudGhlbiggZnVuY3Rpb24gKCBjYW1lcmEgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VyLl9nZXROb2RlUmVmKCBwYXJzZXIuY2FtZXJhQ2FjaGUsIG5vZGVEZWYuY2FtZXJhLCBjYW1lcmEgKTtcblxuXHRcdFx0XHR9ICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwYXJzZXIuX2ludm9rZUFsbCggZnVuY3Rpb24gKCBleHQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dC5jcmVhdGVOb2RlQXR0YWNobWVudCAmJiBleHQuY3JlYXRlTm9kZUF0dGFjaG1lbnQoIG5vZGVJbmRleCApO1xuXG5cdFx0XHR9ICkuZm9yRWFjaCggZnVuY3Rpb24gKCBwcm9taXNlICkge1xuXG5cdFx0XHRcdHBlbmRpbmcucHVzaCggcHJvbWlzZSApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiBQcm9taXNlLmFsbCggcGVuZGluZyApO1xuXG5cdFx0fSgpICkudGhlbiggZnVuY3Rpb24gKCBvYmplY3RzICkge1xuXG5cdFx0XHRsZXQgbm9kZTtcblxuXHRcdFx0Ly8gLmlzQm9uZSBpc24ndCBpbiBnbFRGIHNwZWMuIFNlZSAuX21hcmtEZWZzXG5cdFx0XHRpZiAoIG5vZGVEZWYuaXNCb25lID09PSB0cnVlICkge1xuXG5cdFx0XHRcdG5vZGUgPSBuZXcgQm9uZSgpO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdFx0bm9kZSA9IG5ldyBHcm91cCgpO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0XHRub2RlID0gb2JqZWN0c1sgMCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG5vZGUgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG5vZGUgIT09IG9iamVjdHNbIDAgXSApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG5vZGUuYWRkKCBvYmplY3RzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBub2RlRGVmLm5hbWUgKSB7XG5cblx0XHRcdFx0bm9kZS51c2VyRGF0YS5uYW1lID0gbm9kZURlZi5uYW1lO1xuXHRcdFx0XHRub2RlLm5hbWUgPSBub2RlTmFtZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhc3NpZ25FeHRyYXNUb1VzZXJEYXRhKCBub2RlLCBub2RlRGVmICk7XG5cblx0XHRcdGlmICggbm9kZURlZi5leHRlbnNpb25zICkgYWRkVW5rbm93bkV4dGVuc2lvbnNUb1VzZXJEYXRhKCBleHRlbnNpb25zLCBub2RlLCBub2RlRGVmICk7XG5cblx0XHRcdGlmICggbm9kZURlZi5tYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zdCBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdFx0XHRtYXRyaXguZnJvbUFycmF5KCBub2RlRGVmLm1hdHJpeCApO1xuXHRcdFx0XHRub2RlLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBub2RlRGVmLnRyYW5zbGF0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRub2RlLnBvc2l0aW9uLmZyb21BcnJheSggbm9kZURlZi50cmFuc2xhdGlvbiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5vZGVEZWYucm90YXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdG5vZGUucXVhdGVybmlvbi5mcm9tQXJyYXkoIG5vZGVEZWYucm90YXRpb24gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBub2RlRGVmLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRub2RlLnNjYWxlLmZyb21BcnJheSggbm9kZURlZi5zY2FsZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICEgcGFyc2VyLmFzc29jaWF0aW9ucy5oYXMoIG5vZGUgKSApIHtcblxuXHRcdFx0XHRwYXJzZXIuYXNzb2NpYXRpb25zLnNldCggbm9kZSwge30gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwYXJzZXIuYXNzb2NpYXRpb25zLmdldCggbm9kZSApLm5vZGVzID0gbm9kZUluZGV4O1xuXG5cdFx0XHRyZXR1cm4gbm9kZTtcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmljYXRpb246IGh0dHBzOi8vZ2l0aHViLmNvbS9LaHJvbm9zR3JvdXAvZ2xURi90cmVlL21hc3Rlci9zcGVjaWZpY2F0aW9uLzIuMCNzY2VuZXNcblx0ICogQHBhcmFtIHtudW1iZXJ9IHNjZW5lSW5kZXhcblx0ICogQHJldHVybiB7UHJvbWlzZTxHcm91cD59XG5cdCAqL1xuXHRsb2FkU2NlbmUoIHNjZW5lSW5kZXggKSB7XG5cblx0XHRjb25zdCBqc29uID0gdGhpcy5qc29uO1xuXHRcdGNvbnN0IGV4dGVuc2lvbnMgPSB0aGlzLmV4dGVuc2lvbnM7XG5cdFx0Y29uc3Qgc2NlbmVEZWYgPSB0aGlzLmpzb24uc2NlbmVzWyBzY2VuZUluZGV4IF07XG5cdFx0Y29uc3QgcGFyc2VyID0gdGhpcztcblxuXHRcdC8vIExvYWRlciByZXR1cm5zIEdyb3VwLCBub3QgU2NlbmUuXG5cdFx0Ly8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL3RocmVlLmpzL2lzc3Vlcy8xODM0MiNpc3N1ZWNvbW1lbnQtNTc4OTgxMTcyXG5cdFx0Y29uc3Qgc2NlbmUgPSBuZXcgR3JvdXAoKTtcblx0XHRpZiAoIHNjZW5lRGVmLm5hbWUgKSBzY2VuZS5uYW1lID0gcGFyc2VyLmNyZWF0ZVVuaXF1ZU5hbWUoIHNjZW5lRGVmLm5hbWUgKTtcblxuXHRcdGFzc2lnbkV4dHJhc1RvVXNlckRhdGEoIHNjZW5lLCBzY2VuZURlZiApO1xuXG5cdFx0aWYgKCBzY2VuZURlZi5leHRlbnNpb25zICkgYWRkVW5rbm93bkV4dGVuc2lvbnNUb1VzZXJEYXRhKCBleHRlbnNpb25zLCBzY2VuZSwgc2NlbmVEZWYgKTtcblxuXHRcdGNvbnN0IG5vZGVJZHMgPSBzY2VuZURlZi5ub2RlcyB8fCBbXTtcblxuXHRcdGNvbnN0IHBlbmRpbmcgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBub2RlSWRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRwZW5kaW5nLnB1c2goIGJ1aWxkTm9kZUhpZXJhcmNoeSggbm9kZUlkc1sgaSBdLCBzY2VuZSwganNvbiwgcGFyc2VyICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBQcm9taXNlLmFsbCggcGVuZGluZyApLnRoZW4oIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Ly8gUmVtb3ZlcyBkYW5nbGluZyBhc3NvY2lhdGlvbnMsIGFzc29jaWF0aW9ucyB0aGF0IHJlZmVyZW5jZSBhIG5vZGUgdGhhdFxuXHRcdFx0Ly8gZGlkbid0IG1ha2UgaXQgaW50byB0aGUgc2NlbmUuXG5cdFx0XHRjb25zdCByZWR1Y2VBc3NvY2lhdGlvbnMgPSAoIG5vZGUgKSA9PiB7XG5cblx0XHRcdFx0Y29uc3QgcmVkdWNlZEFzc29jaWF0aW9ucyA9IG5ldyBNYXAoKTtcblxuXHRcdFx0XHRmb3IgKCBjb25zdCBbIGtleSwgdmFsdWUgXSBvZiBwYXJzZXIuYXNzb2NpYXRpb25zICkge1xuXG5cdFx0XHRcdFx0aWYgKCBrZXkgaW5zdGFuY2VvZiBNYXRlcmlhbCB8fCBrZXkgaW5zdGFuY2VvZiBUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRyZWR1Y2VkQXNzb2NpYXRpb25zLnNldCgga2V5LCB2YWx1ZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRub2RlLnRyYXZlcnNlKCAoIG5vZGUgKSA9PiB7XG5cblx0XHRcdFx0XHRjb25zdCBtYXBwaW5ncyA9IHBhcnNlci5hc3NvY2lhdGlvbnMuZ2V0KCBub2RlICk7XG5cblx0XHRcdFx0XHRpZiAoIG1hcHBpbmdzICE9IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdHJlZHVjZWRBc3NvY2lhdGlvbnMuc2V0KCBub2RlLCBtYXBwaW5ncyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRyZXR1cm4gcmVkdWNlZEFzc29jaWF0aW9ucztcblxuXHRcdFx0fTtcblxuXHRcdFx0cGFyc2VyLmFzc29jaWF0aW9ucyA9IHJlZHVjZUFzc29jaWF0aW9ucyggc2NlbmUgKTtcblxuXHRcdFx0cmV0dXJuIHNjZW5lO1xuXG5cdFx0fSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBidWlsZE5vZGVIaWVyYXJjaHkoIG5vZGVJZCwgcGFyZW50T2JqZWN0LCBqc29uLCBwYXJzZXIgKSB7XG5cblx0Y29uc3Qgbm9kZURlZiA9IGpzb24ubm9kZXNbIG5vZGVJZCBdO1xuXG5cdHJldHVybiBwYXJzZXIuZ2V0RGVwZW5kZW5jeSggJ25vZGUnLCBub2RlSWQgKS50aGVuKCBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cblx0XHRpZiAoIG5vZGVEZWYuc2tpbiA9PT0gdW5kZWZpbmVkICkgcmV0dXJuIG5vZGU7XG5cblx0XHQvLyBidWlsZCBza2VsZXRvbiBoZXJlIGFzIHdlbGxcblxuXHRcdGxldCBza2luRW50cnk7XG5cblx0XHRyZXR1cm4gcGFyc2VyLmdldERlcGVuZGVuY3koICdza2luJywgbm9kZURlZi5za2luICkudGhlbiggZnVuY3Rpb24gKCBza2luICkge1xuXG5cdFx0XHRza2luRW50cnkgPSBza2luO1xuXG5cdFx0XHRjb25zdCBwZW5kaW5nSm9pbnRzID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBza2luRW50cnkuam9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdHBlbmRpbmdKb2ludHMucHVzaCggcGFyc2VyLmdldERlcGVuZGVuY3koICdub2RlJywgc2tpbkVudHJ5LmpvaW50c1sgaSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoIHBlbmRpbmdKb2ludHMgKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGpvaW50Tm9kZXMgKSB7XG5cblx0XHRcdG5vZGUudHJhdmVyc2UoIGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdFx0XHRpZiAoICEgbWVzaC5pc01lc2ggKSByZXR1cm47XG5cblx0XHRcdFx0Y29uc3QgYm9uZXMgPSBbXTtcblx0XHRcdFx0Y29uc3QgYm9uZUludmVyc2VzID0gW107XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBqbCA9IGpvaW50Tm9kZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBqb2ludE5vZGUgPSBqb2ludE5vZGVzWyBqIF07XG5cblx0XHRcdFx0XHRpZiAoIGpvaW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdFx0Ym9uZXMucHVzaCggam9pbnROb2RlICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG1hdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpbkVudHJ5LmludmVyc2VCaW5kTWF0cmljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRtYXQuZnJvbUFycmF5KCBza2luRW50cnkuaW52ZXJzZUJpbmRNYXRyaWNlcy5hcnJheSwgaiAqIDE2ICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ym9uZUludmVyc2VzLnB1c2goIG1hdCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuR0xURkxvYWRlcjogSm9pbnQgXCIlc1wiIGNvdWxkIG5vdCBiZSBmb3VuZC4nLCBza2luRW50cnkuam9pbnRzWyBqIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bWVzaC5iaW5kKCBuZXcgU2tlbGV0b24oIGJvbmVzLCBib25lSW52ZXJzZXMgKSwgbWVzaC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiBub2RlO1xuXG5cdFx0fSApO1xuXG5cdH0gKS50aGVuKCBmdW5jdGlvbiAoIG5vZGUgKSB7XG5cblx0XHQvLyBidWlsZCBub2RlIGhpZXJhY2h5XG5cblx0XHRwYXJlbnRPYmplY3QuYWRkKCBub2RlICk7XG5cblx0XHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0XHRpZiAoIG5vZGVEZWYuY2hpbGRyZW4gKSB7XG5cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gbm9kZURlZi5jaGlsZHJlbjtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bIGkgXTtcblx0XHRcdFx0cGVuZGluZy5wdXNoKCBidWlsZE5vZGVIaWVyYXJjaHkoIGNoaWxkLCBub2RlLCBqc29uLCBwYXJzZXIgKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoIHBlbmRpbmcgKTtcblxuXHR9ICk7XG5cbn1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlckdlb21ldHJ5fSBnZW9tZXRyeVxuICogQHBhcmFtIHtHTFRGLlByaW1pdGl2ZX0gcHJpbWl0aXZlRGVmXG4gKiBAcGFyYW0ge0dMVEZQYXJzZXJ9IHBhcnNlclxuICovXG5mdW5jdGlvbiBjb21wdXRlQm91bmRzKCBnZW9tZXRyeSwgcHJpbWl0aXZlRGVmLCBwYXJzZXIgKSB7XG5cblx0Y29uc3QgYXR0cmlidXRlcyA9IHByaW1pdGl2ZURlZi5hdHRyaWJ1dGVzO1xuXG5cdGNvbnN0IGJveCA9IG5ldyBCb3gzKCk7XG5cblx0aWYgKCBhdHRyaWJ1dGVzLlBPU0lUSU9OICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRjb25zdCBhY2Nlc3NvciA9IHBhcnNlci5qc29uLmFjY2Vzc29yc1sgYXR0cmlidXRlcy5QT1NJVElPTiBdO1xuXG5cdFx0Y29uc3QgbWluID0gYWNjZXNzb3IubWluO1xuXHRcdGNvbnN0IG1heCA9IGFjY2Vzc29yLm1heDtcblxuXHRcdC8vIGdsVEYgcmVxdWlyZXMgJ21pbicgYW5kICdtYXgnLCBidXQgVlJNICh3aGljaCBleHRlbmRzIGdsVEYpIGN1cnJlbnRseSBpZ25vcmVzIHRoYXQgcmVxdWlyZW1lbnQuXG5cblx0XHRpZiAoIG1pbiAhPT0gdW5kZWZpbmVkICYmIG1heCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3guc2V0KFxuXHRcdFx0XHRuZXcgVmVjdG9yMyggbWluWyAwIF0sIG1pblsgMSBdLCBtaW5bIDIgXSApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMyggbWF4WyAwIF0sIG1heFsgMSBdLCBtYXhbIDIgXSApXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoIGFjY2Vzc29yLm5vcm1hbGl6ZWQgKSB7XG5cblx0XHRcdFx0Y29uc3QgYm94U2NhbGUgPSBnZXROb3JtYWxpemVkQ29tcG9uZW50U2NhbGUoIFdFQkdMX0NPTVBPTkVOVF9UWVBFU1sgYWNjZXNzb3IuY29tcG9uZW50VHlwZSBdICk7XG5cdFx0XHRcdGJveC5taW4ubXVsdGlwbHlTY2FsYXIoIGJveFNjYWxlICk7XG5cdFx0XHRcdGJveC5tYXgubXVsdGlwbHlTY2FsYXIoIGJveFNjYWxlICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdMVEZMb2FkZXI6IE1pc3NpbmcgbWluL21heCBwcm9wZXJ0aWVzIGZvciBhY2Nlc3NvciBQT1NJVElPTi4nICk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0cmV0dXJuO1xuXG5cdH1cblxuXHRjb25zdCB0YXJnZXRzID0gcHJpbWl0aXZlRGVmLnRhcmdldHM7XG5cblx0aWYgKCB0YXJnZXRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRjb25zdCBtYXhEaXNwbGFjZW1lbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGFyZ2V0c1sgaSBdO1xuXG5cdFx0XHRpZiAoIHRhcmdldC5QT1NJVElPTiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnN0IGFjY2Vzc29yID0gcGFyc2VyLmpzb24uYWNjZXNzb3JzWyB0YXJnZXQuUE9TSVRJT04gXTtcblx0XHRcdFx0Y29uc3QgbWluID0gYWNjZXNzb3IubWluO1xuXHRcdFx0XHRjb25zdCBtYXggPSBhY2Nlc3Nvci5tYXg7XG5cblx0XHRcdFx0Ly8gZ2xURiByZXF1aXJlcyAnbWluJyBhbmQgJ21heCcsIGJ1dCBWUk0gKHdoaWNoIGV4dGVuZHMgZ2xURikgY3VycmVudGx5IGlnbm9yZXMgdGhhdCByZXF1aXJlbWVudC5cblxuXHRcdFx0XHRpZiAoIG1pbiAhPT0gdW5kZWZpbmVkICYmIG1heCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gd2UgbmVlZCB0byBnZXQgbWF4IG9mIGFic29sdXRlIGNvbXBvbmVudHMgYmVjYXVzZSB0YXJnZXQgd2VpZ2h0IGlzIFstMSwxXVxuXHRcdFx0XHRcdHZlY3Rvci5zZXRYKCBNYXRoLm1heCggTWF0aC5hYnMoIG1pblsgMCBdICksIE1hdGguYWJzKCBtYXhbIDAgXSApICkgKTtcblx0XHRcdFx0XHR2ZWN0b3Iuc2V0WSggTWF0aC5tYXgoIE1hdGguYWJzKCBtaW5bIDEgXSApLCBNYXRoLmFicyggbWF4WyAxIF0gKSApICk7XG5cdFx0XHRcdFx0dmVjdG9yLnNldFooIE1hdGgubWF4KCBNYXRoLmFicyggbWluWyAyIF0gKSwgTWF0aC5hYnMoIG1heFsgMiBdICkgKSApO1xuXG5cblx0XHRcdFx0XHRpZiAoIGFjY2Vzc29yLm5vcm1hbGl6ZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJveFNjYWxlID0gZ2V0Tm9ybWFsaXplZENvbXBvbmVudFNjYWxlKCBXRUJHTF9DT01QT05FTlRfVFlQRVNbIGFjY2Vzc29yLmNvbXBvbmVudFR5cGUgXSApO1xuXHRcdFx0XHRcdFx0dmVjdG9yLm11bHRpcGx5U2NhbGFyKCBib3hTY2FsZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTm90ZTogdGhpcyBhc3N1bWVzIHRoYXQgdGhlIHN1bSBvZiBhbGwgd2VpZ2h0cyBpcyBhdCBtb3N0IDEuIFRoaXMgaXNuJ3QgcXVpdGUgY29ycmVjdCAtIGl0J3MgbW9yZSBjb25zZXJ2YXRpdmVcblx0XHRcdFx0XHQvLyB0byBhc3N1bWUgdGhhdCBlYWNoIHRhcmdldCBjYW4gaGF2ZSBhIG1heCB3ZWlnaHQgb2YgMS4gSG93ZXZlciwgZm9yIHNvbWUgdXNlIGNhc2VzIC0gbm90YWJseSwgd2hlbiBtb3JwaCB0YXJnZXRzXG5cdFx0XHRcdFx0Ly8gYXJlIHVzZWQgdG8gaW1wbGVtZW50IGtleS1mcmFtZSBhbmltYXRpb25zIGFuZCBhcyBzdWNoIG9ubHkgdHdvIGFyZSBhY3RpdmUgYXQgYSB0aW1lIC0gdGhpcyByZXN1bHRzIGluIHZlcnkgbGFyZ2Vcblx0XHRcdFx0XHQvLyBib3hlcy4gU28gZm9yIG5vdyB3ZSBtYWtlIGEgYm94IHRoYXQncyBzb21ldGltZXMgYSB0b3VjaCB0b28gc21hbGwgYnV0IGlzIGhvcGVmdWxseSBtb3N0bHkgb2YgcmVhc29uYWJsZSBzaXplLlxuXHRcdFx0XHRcdG1heERpc3BsYWNlbWVudC5tYXgoIHZlY3RvciApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HTFRGTG9hZGVyOiBNaXNzaW5nIG1pbi9tYXggcHJvcGVydGllcyBmb3IgYWNjZXNzb3IgUE9TSVRJT04uJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gQXMgcGVyIGNvbW1lbnQgYWJvdmUgdGhpcyBib3ggaXNuJ3QgY29uc2VydmF0aXZlLCBidXQgaGFzIGEgcmVhc29uYWJsZSBzaXplIGZvciBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIG1vcnBoIHRhcmdldHMuXG5cdFx0Ym94LmV4cGFuZEJ5VmVjdG9yKCBtYXhEaXNwbGFjZW1lbnQgKTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYm91bmRpbmdCb3ggPSBib3g7XG5cblx0Y29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdGJveC5nZXRDZW50ZXIoIHNwaGVyZS5jZW50ZXIgKTtcblx0c3BoZXJlLnJhZGl1cyA9IGJveC5taW4uZGlzdGFuY2VUbyggYm94Lm1heCApIC8gMjtcblxuXHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IHNwaGVyZTtcblxufVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyR2VvbWV0cnl9IGdlb21ldHJ5XG4gKiBAcGFyYW0ge0dMVEYuUHJpbWl0aXZlfSBwcmltaXRpdmVEZWZcbiAqIEBwYXJhbSB7R0xURlBhcnNlcn0gcGFyc2VyXG4gKiBAcmV0dXJuIHtQcm9taXNlPEJ1ZmZlckdlb21ldHJ5Pn1cbiAqL1xuZnVuY3Rpb24gYWRkUHJpbWl0aXZlQXR0cmlidXRlcyggZ2VvbWV0cnksIHByaW1pdGl2ZURlZiwgcGFyc2VyICkge1xuXG5cdGNvbnN0IGF0dHJpYnV0ZXMgPSBwcmltaXRpdmVEZWYuYXR0cmlidXRlcztcblxuXHRjb25zdCBwZW5kaW5nID0gW107XG5cblx0ZnVuY3Rpb24gYXNzaWduQXR0cmlidXRlQWNjZXNzb3IoIGFjY2Vzc29ySW5kZXgsIGF0dHJpYnV0ZU5hbWUgKSB7XG5cblx0XHRyZXR1cm4gcGFyc2VyLmdldERlcGVuZGVuY3koICdhY2Nlc3NvcicsIGFjY2Vzc29ySW5kZXggKVxuXHRcdFx0LnRoZW4oIGZ1bmN0aW9uICggYWNjZXNzb3IgKSB7XG5cblx0XHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCBhdHRyaWJ1dGVOYW1lLCBhY2Nlc3NvciApO1xuXG5cdFx0XHR9ICk7XG5cblx0fVxuXG5cdGZvciAoIGNvbnN0IGdsdGZBdHRyaWJ1dGVOYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRjb25zdCB0aHJlZUF0dHJpYnV0ZU5hbWUgPSBBVFRSSUJVVEVTWyBnbHRmQXR0cmlidXRlTmFtZSBdIHx8IGdsdGZBdHRyaWJ1dGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHQvLyBTa2lwIGF0dHJpYnV0ZXMgYWxyZWFkeSBwcm92aWRlZCBieSBlLmcuIERyYWNvIGV4dGVuc2lvbi5cblx0XHRpZiAoIHRocmVlQXR0cmlidXRlTmFtZSBpbiBnZW9tZXRyeS5hdHRyaWJ1dGVzICkgY29udGludWU7XG5cblx0XHRwZW5kaW5nLnB1c2goIGFzc2lnbkF0dHJpYnV0ZUFjY2Vzc29yKCBhdHRyaWJ1dGVzWyBnbHRmQXR0cmlidXRlTmFtZSBdLCB0aHJlZUF0dHJpYnV0ZU5hbWUgKSApO1xuXG5cdH1cblxuXHRpZiAoIHByaW1pdGl2ZURlZi5pbmRpY2VzICE9PSB1bmRlZmluZWQgJiYgISBnZW9tZXRyeS5pbmRleCApIHtcblxuXHRcdGNvbnN0IGFjY2Vzc29yID0gcGFyc2VyLmdldERlcGVuZGVuY3koICdhY2Nlc3NvcicsIHByaW1pdGl2ZURlZi5pbmRpY2VzICkudGhlbiggZnVuY3Rpb24gKCBhY2Nlc3NvciApIHtcblxuXHRcdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIGFjY2Vzc29yICk7XG5cblx0XHR9ICk7XG5cblx0XHRwZW5kaW5nLnB1c2goIGFjY2Vzc29yICk7XG5cblx0fVxuXG5cdGFzc2lnbkV4dHJhc1RvVXNlckRhdGEoIGdlb21ldHJ5LCBwcmltaXRpdmVEZWYgKTtcblxuXHRjb21wdXRlQm91bmRzKCBnZW9tZXRyeSwgcHJpbWl0aXZlRGVmLCBwYXJzZXIgKTtcblxuXHRyZXR1cm4gUHJvbWlzZS5hbGwoIHBlbmRpbmcgKS50aGVuKCBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gcHJpbWl0aXZlRGVmLnRhcmdldHMgIT09IHVuZGVmaW5lZFxuXHRcdFx0PyBhZGRNb3JwaFRhcmdldHMoIGdlb21ldHJ5LCBwcmltaXRpdmVEZWYudGFyZ2V0cywgcGFyc2VyIClcblx0XHRcdDogZ2VvbWV0cnk7XG5cblx0fSApO1xuXG59XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJHZW9tZXRyeX0gZ2VvbWV0cnlcbiAqIEBwYXJhbSB7TnVtYmVyfSBkcmF3TW9kZVxuICogQHJldHVybiB7QnVmZmVyR2VvbWV0cnl9XG4gKi9cbmZ1bmN0aW9uIHRvVHJpYW5nbGVzRHJhd01vZGUoIGdlb21ldHJ5LCBkcmF3TW9kZSApIHtcblxuXHRsZXQgaW5kZXggPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xuXG5cdC8vIGdlbmVyYXRlIGluZGV4IGlmIG5vdCBwcmVzZW50XG5cblx0aWYgKCBpbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblxuXHRcdGNvbnN0IHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBvc2l0aW9uLmNvdW50OyBpICsrICkge1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0XHRpbmRleCA9IGdlb21ldHJ5LmdldEluZGV4KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR0xURkxvYWRlci50b1RyaWFuZ2xlc0RyYXdNb2RlKCk6IFVuZGVmaW5lZCBwb3NpdGlvbiBhdHRyaWJ1dGUuIFByb2Nlc3Npbmcgbm90IHBvc3NpYmxlLicgKTtcblx0XHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRjb25zdCBudW1iZXJPZlRyaWFuZ2xlcyA9IGluZGV4LmNvdW50IC0gMjtcblx0Y29uc3QgbmV3SW5kaWNlcyA9IFtdO1xuXG5cdGlmICggZHJhd01vZGUgPT09IFRyaWFuZ2xlRmFuRHJhd01vZGUgKSB7XG5cblx0XHQvLyBnbC5UUklBTkdMRV9GQU5cblxuXHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSBudW1iZXJPZlRyaWFuZ2xlczsgaSArKyApIHtcblxuXHRcdFx0bmV3SW5kaWNlcy5wdXNoKCBpbmRleC5nZXRYKCAwICkgKTtcblx0XHRcdG5ld0luZGljZXMucHVzaCggaW5kZXguZ2V0WCggaSApICk7XG5cdFx0XHRuZXdJbmRpY2VzLnB1c2goIGluZGV4LmdldFgoIGkgKyAxICkgKTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZ2wuVFJJQU5HTEVfU1RSSVBcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG51bWJlck9mVHJpYW5nbGVzOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGkgJSAyID09PSAwICkge1xuXG5cdFx0XHRcdG5ld0luZGljZXMucHVzaCggaW5kZXguZ2V0WCggaSApICk7XG5cdFx0XHRcdG5ld0luZGljZXMucHVzaCggaW5kZXguZ2V0WCggaSArIDEgKSApO1xuXHRcdFx0XHRuZXdJbmRpY2VzLnB1c2goIGluZGV4LmdldFgoIGkgKyAyICkgKTtcblxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG5ld0luZGljZXMucHVzaCggaW5kZXguZ2V0WCggaSArIDIgKSApO1xuXHRcdFx0XHRuZXdJbmRpY2VzLnB1c2goIGluZGV4LmdldFgoIGkgKyAxICkgKTtcblx0XHRcdFx0bmV3SW5kaWNlcy5wdXNoKCBpbmRleC5nZXRYKCBpICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRpZiAoICggbmV3SW5kaWNlcy5sZW5ndGggLyAzICkgIT09IG51bWJlck9mVHJpYW5nbGVzICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdMVEZMb2FkZXIudG9UcmlhbmdsZXNEcmF3TW9kZSgpOiBVbmFibGUgdG8gZ2VuZXJhdGUgY29ycmVjdCBhbW91bnQgb2YgdHJpYW5nbGVzLicgKTtcblxuXHR9XG5cblx0Ly8gYnVpbGQgZmluYWwgZ2VvbWV0cnlcblxuXHRjb25zdCBuZXdHZW9tZXRyeSA9IGdlb21ldHJ5LmNsb25lKCk7XG5cdG5ld0dlb21ldHJ5LnNldEluZGV4KCBuZXdJbmRpY2VzICk7XG5cblx0cmV0dXJuIG5ld0dlb21ldHJ5O1xuXG59XG5cbmV4cG9ydCB7IEdMVEZMb2FkZXIgfTtcbiIsImltcG9ydCB7IFZlY3RvcjMgfSBmcm9tIFwidGhyZWVcIjtcblxuLy9odHRwczovL2dpdGh1Yi5jb20vRGFyaW9NYXp6YW50aS9PbmVFdXJvRmlsdGVyVW5pdHkvYmxvYi9tYXN0ZXIvQXNzZXRzL1NjcmlwdHMvT25lRXVyb0ZpbHRlci5jc1xuLy9odHRwczovL2dpdGh1Yi5jb20vRGFyaW9NYXp6YW50aS9PbmVFdXJvRmlsdGVyVW5pdHkvYmxvYi9tYXN0ZXIvQXNzZXRzL1NjcmlwdHMvRmlsdGVyVGVzdFZlY3RvcjMuY3Ncbi8vaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vVGhvcnN0ZW5CdXgvMzIzMTgzYmIwYmMyY2NiOTJmZjIzZWJkZjNkZTY0MDhcblxuLyogZXNsaW50LWRpc2FibGUgbWF4LWNsYXNzZXMtcGVyLWZpbGUgKi9cbmNsYXNzIExvd1Bhc3NGaWx0ZXIge1xuICAgIHk6IG51bWJlciB8IG51bGw7XG5cbiAgICBzOiBudW1iZXIgfCBudWxsO1xuXG4gICAgYWxwaGEgPSAwO1xuXG4gICAgY29uc3RydWN0b3IoYWxwaGE6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldEFscGhhKGFscGhhKTtcbiAgICAgICAgdGhpcy55ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRBbHBoYShhbHBoYTogbnVtYmVyKSB7XG4gICAgICAgIGlmIChhbHBoYSA8PSAwIHx8IGFscGhhID4gMS4wKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFscGhhID0gYWxwaGE7XG4gICAgfVxuXG4gICAgZmlsdGVyKHZhbHVlOiBudW1iZXIsIHRpbWVzdGFtcDogbnVtYmVyLCBhbHBoYTogbnVtYmVyKSB7XG4gICAgICAgIGlmIChhbHBoYSkge1xuICAgICAgICAgICAgdGhpcy5zZXRBbHBoYShhbHBoYSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHM7XG4gICAgICAgIGlmICghdGhpcy55KSB7XG4gICAgICAgICAgICBzID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzID0gdGhpcy5hbHBoYSAqIHZhbHVlICsgKDEuMCAtIHRoaXMuYWxwaGEpICogdGhpcy5zITtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnkgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zID0gcztcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgbGFzdFZhbHVlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy55O1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT25lRXVyb0ZpbHRlciB7XG4gICAgZnJlcTogbnVtYmVyO1xuXG4gICAgbWluQ3V0T2ZmOiBudW1iZXI7XG5cbiAgICBiZXRhOiBudW1iZXI7XG5cbiAgICBkQ3V0T2ZmOiBudW1iZXI7XG5cbiAgICB4OiBMb3dQYXNzRmlsdGVyO1xuXG4gICAgZHg6IExvd1Bhc3NGaWx0ZXI7XG5cbiAgICBsYXN0dGltZTogbnVtYmVyIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjdXJyVmFsdWU6IG51bWJlcjtcbiAgICBwdWJsaWMgcHJldlZhbHVlOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihmcmVxOiBudW1iZXIsIG1pbkN1dE9mZiA9IDEuMCwgYmV0YSA9IDAuMCwgZEN1dE9mZiA9IDEuMCkge1xuICAgICAgICBpZiAoZnJlcSA8PSAwIHx8IG1pbkN1dE9mZiA8PSAwIHx8IGRDdXRPZmYgPD0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mcmVxID0gZnJlcTtcbiAgICAgICAgdGhpcy5taW5DdXRPZmYgPSBtaW5DdXRPZmY7XG4gICAgICAgIHRoaXMuYmV0YSA9IGJldGE7XG4gICAgICAgIHRoaXMuZEN1dE9mZiA9IGRDdXRPZmY7XG4gICAgICAgIHRoaXMueCA9IG5ldyBMb3dQYXNzRmlsdGVyKHRoaXMuYWxwaGEodGhpcy5taW5DdXRPZmYpKTtcbiAgICAgICAgdGhpcy5keCA9IG5ldyBMb3dQYXNzRmlsdGVyKHRoaXMuYWxwaGEodGhpcy5kQ3V0T2ZmKSk7XG4gICAgICAgIHRoaXMubGFzdHRpbWUgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3VyclZhbHVlID0gMC4wO1xuICAgICAgICB0aGlzLnByZXZWYWx1ZSA9IHRoaXMuY3VyclZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBhbHBoYShjdXRPZmY6IG51bWJlcikge1xuICAgICAgICBjb25zdCB0ZSA9IDEuMCAvIHRoaXMuZnJlcTtcbiAgICAgICAgY29uc3QgdGF1ID0gMS4wIC8gKDIgKiBNYXRoLlBJICogY3V0T2ZmKTtcbiAgICAgICAgcmV0dXJuIDEuMCAvICgxLjAgKyB0YXUgLyB0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIFVwZGF0ZVBhcmFtcyhfZnJlcTogbnVtYmVyLCBfbWluY3V0b2ZmOiBudW1iZXIgPSAxLjAsIF9iZXRhOiBudW1iZXIgPSAwLCBfZGN1dG9mZjogbnVtYmVyID0gMSk6IHZvaWQge1xuICAgICAgICB0aGlzLmZyZXEgPSBfZnJlcTtcbiAgICAgICAgdGhpcy5taW5DdXRPZmYgPSBfbWluY3V0b2ZmO1xuICAgICAgICB0aGlzLmJldGEgPSBfYmV0YTtcbiAgICAgICAgdGhpcy5kQ3V0T2ZmID0gX2RjdXRvZmY7XG4gICAgICAgIHRoaXMueC5zZXRBbHBoYSh0aGlzLmFscGhhKHRoaXMubWluQ3V0T2ZmKSk7XG4gICAgICAgIHRoaXMuZHguc2V0QWxwaGEodGhpcy5hbHBoYSh0aGlzLmRDdXRPZmYpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgRmlsdGVyKHg6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIgfCBudWxsID0gbnVsbCk6IG51bWJlciB7XG4gICAgICAgIHRoaXMucHJldlZhbHVlID0gdGhpcy5jdXJyVmFsdWU7XG4gICAgICAgIGlmICh0aGlzLmxhc3R0aW1lICYmIHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgdGhpcy5mcmVxID0gMS4wIC8gKHRpbWVzdGFtcCAtIHRoaXMubGFzdHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdHRpbWUgPSB0aW1lc3RhbXA7XG4gICAgICAgIGNvbnN0IHByZXZYID0gdGhpcy54Lmxhc3RWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkeCA9ICFwcmV2WCA/IDAuMCA6ICh4IC0gcHJldlgpICogdGhpcy5mcmVxO1xuICAgICAgICBjb25zdCBlZHggPSB0aGlzLmR4LmZpbHRlcihkeCwgdGltZXN0YW1wISwgdGhpcy5hbHBoYSh0aGlzLmRDdXRPZmYpKTtcbiAgICAgICAgY29uc3QgY3V0T2ZmID0gdGhpcy5taW5DdXRPZmYgKyB0aGlzLmJldGEgKiBNYXRoLmFicyhlZHgpO1xuICAgICAgICByZXR1cm4gKHRoaXMuY3VyclZhbHVlID0gdGhpcy54LmZpbHRlcih4LCB0aW1lc3RhbXAhLCB0aGlzLmFscGhhKGN1dE9mZikpKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPbmVFdXJvRmlsdGVyVmVjdG9yMyB7XG4gICAgLy8gY29udGFpbnN0IHRoZSB0eXBlIG9mIFRcbiAgICAvLyB0aGUgYXJyYXkgb2YgZmlsdGVyc1xuICAgIHByaXZhdGUgb25lRXVyb0ZpbHRlcnM6IEFycmF5PE9uZUV1cm9GaWx0ZXI+O1xuXG4gICAgcHJpdmF0ZSBfZnJlcTogbnVtYmVyO1xuICAgIHB1YmxpYyBnZXQgZnJlcSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZnJlcTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9iZXRhOiBudW1iZXI7XG4gICAgcHVibGljIGdldCBiZXRhKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9iZXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2RjdXRvZmY6IG51bWJlcjtcbiAgICBwdWJsaWMgZ2V0IGRjdXRvZmYoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RjdXRvZmY7XG4gICAgfVxuICAgIHByaXZhdGUgX21pbmN1dG9mZjogbnVtYmVyO1xuICAgIHB1YmxpYyBnZXQgbWluY3V0b2ZmXzEoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbmN1dG9mZjtcbiAgICB9XG5cbiAgICAvLyBjdXJyVmFsdWUgY29udGFpbnMgdGhlIGxhdGVzdCB2YWx1ZSB3aGljaCBoYXZlIGJlZW4gc3VjY2VzZnVsbHkgZmlsdGVyZWRcbiAgICAvLyBwcmV2VmFsdWUgY29udGFpbnMgdGhlIHByZXZpb3VzIGZpbHRlcmVkIHZhbHVlXG5cbiAgICBwcml2YXRlIGN1cnJWYWx1ZTogVmVjdG9yMztcbiAgICBwcml2YXRlIHByZXZWYWx1ZTogVmVjdG9yMztcblxuICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIG91ciBmaWx0ZXIocylcbiAgICBjb25zdHJ1Y3RvcihfZnJlcTogbnVtYmVyLCBfbWluY3V0b2ZmOiBudW1iZXIgPSAxLCBfYmV0YTogbnVtYmVyID0gMCwgX2RjdXRvZmY6IG51bWJlciA9IDEpIHtcbiAgICAgICAgdGhpcy5jdXJyVmFsdWUgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICB0aGlzLnByZXZWYWx1ZSA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgICAgdGhpcy5fZnJlcSA9IF9mcmVxO1xuICAgICAgICB0aGlzLl9taW5jdXRvZmYgPSBfbWluY3V0b2ZmO1xuICAgICAgICB0aGlzLl9iZXRhID0gX2JldGE7XG4gICAgICAgIHRoaXMuX2RjdXRvZmYgPSBfZGN1dG9mZjtcblxuICAgICAgICB0aGlzLm9uZUV1cm9GaWx0ZXJzID0gW107XG4gICAgICAgIHRoaXMub25lRXVyb0ZpbHRlcnMucHVzaChuZXcgT25lRXVyb0ZpbHRlcihfZnJlcSwgX21pbmN1dG9mZiwgX2JldGEsIF9kY3V0b2ZmKSk7XG4gICAgICAgIHRoaXMub25lRXVyb0ZpbHRlcnMucHVzaChuZXcgT25lRXVyb0ZpbHRlcihfZnJlcSwgX21pbmN1dG9mZiwgX2JldGEsIF9kY3V0b2ZmKSk7XG4gICAgICAgIHRoaXMub25lRXVyb0ZpbHRlcnMucHVzaChuZXcgT25lRXVyb0ZpbHRlcihfZnJlcSwgX21pbmN1dG9mZiwgX2JldGEsIF9kY3V0b2ZmKSk7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlcyB0aGUgZmlsdGVyIHBhcmFtZXRlcnNcbiAgICBwdWJsaWMgVXBkYXRlUGFyYW1zKF9mcmVxOiBudW1iZXIsIF9taW5jdXRvZmY6IG51bWJlciA9IDEuMCwgX2JldGE6IG51bWJlciA9IDAsIF9kY3V0b2ZmOiBudW1iZXIgPSAxKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZyZXEgPSBfZnJlcTtcbiAgICAgICAgdGhpcy5fbWluY3V0b2ZmID0gX21pbmN1dG9mZjtcbiAgICAgICAgdGhpcy5fYmV0YSA9IF9iZXRhO1xuICAgICAgICB0aGlzLl9kY3V0b2ZmID0gX2RjdXRvZmY7XG5cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IHRoaXMub25lRXVyb0ZpbHRlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB0aGlzLm9uZUV1cm9GaWx0ZXJzW2ldLlVwZGF0ZVBhcmFtcyh0aGlzLl9mcmVxLCB0aGlzLl9taW5jdXRvZmYsIHRoaXMuX2JldGEsIHRoaXMuX2RjdXRvZmYpO1xuICAgIH1cblxuICAgIC8vIGZpbHRlcnMgdGhlIHByb3ZpZGVkIF92YWx1ZSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LlxuICAgIC8vIE5vdGU6IGEgdGltZXN0YW1wIGNhbiBhbHNvIGJlIHByb3ZpZGVkIC0gd2lsbCBvdmVycmlkZSBmaWx0ZXIgZnJlcXVlbmN5LlxuICAgIHB1YmxpYyBGaWx0ZXIoX3ZhbHVlOiBWZWN0b3IzLCB0aW1lc3RhbXA6IG51bWJlciA9IC0xLjApOiBWZWN0b3IzIHtcbiAgICAgICAgdGhpcy5wcmV2VmFsdWUgPSB0aGlzLmN1cnJWYWx1ZTtcblxuICAgICAgICAvL2xldCBvdXRwdXQ6IG51bWJlcltdID0gVmVjdG9yMy5aZXJvUmVhZE9ubHkuYXNBcnJheSgpOyAvLyBCYWJ5bG9uIGNvZGUuLi5cbiAgICAgICAgbGV0IG91dDogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgIGxldCBvdXRwdXQ6IG51bWJlcltdID0gb3V0LnRvQXJyYXkoKTtcblxuICAgICAgICAvL2xldCBpbnB1dDogbnVtYmVyW10gPSBfdmFsdWUuYXNBcnJheSgpOyAvLyBCYWJ5bG9uIGNvZGVcbiAgICAgICAgbGV0IGlucHV0OiBudW1iZXJbXSA9IF92YWx1ZS50b0FycmF5KCk7XG5cbiAgICAgICAgdGhpcy5vbmVFdXJvRmlsdGVycy5mb3JFYWNoKChmaWx0ZXJzLCBpZHgpID0+IHtcbiAgICAgICAgICAgIG91dHB1dFtpZHhdID0gZmlsdGVycy5GaWx0ZXIoaW5wdXRbaWR4XSwgdGltZXN0YW1wKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IGFycjogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLmN1cnJWYWx1ZSA9IGFyci5mcm9tQXJyYXkob3V0cHV0KSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgZ2V0VGltZSB9IGZyb20gXCIuLi91dGlscy9VdGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgRGVsYXlhYmxlU2lnbmFsRmlsdGVyIHtcbiAgICBwcml2YXRlIF9pbkRlbGF5OiBib29sZWFuO1xuICAgIHByaXZhdGUgX3RvdGFsVGltZTogbnVtYmVyO1xuICAgIHByaXZhdGUgX3ByZXZUaW1lOiBudW1iZXI7XG5cbiAgICBwcml2YXRlIF90aW1lT3V0OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3Rvcih0aW1lT3V0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fdGltZU91dCA9IHRpbWVPdXQ7XG4gICAgICAgIHRoaXMuX2luRGVsYXkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgVXBkYXRlKHRpY2s6IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHRpbWU6IG51bWJlciA9IGdldFRpbWUoKTtcblxuICAgICAgICBpZiAoIXRoaXMuX2luRGVsYXkpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZUaW1lID0gdGltZTtcbiAgICAgICAgICAgIHRoaXMuX3RvdGFsVGltZSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90b3RhbFRpbWUgKz0gdGltZSAtIHRoaXMuX3ByZXZUaW1lO1xuXG4gICAgICAgIGlmICh0aGlzLl9pbkRlbGF5ICYmIHRoaXMuX3RvdGFsVGltZSA+IHRoaXMuX3RpbWVPdXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2luRGVsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRpY2spIHtcbiAgICAgICAgICAgIHRoaXMuX2luRGVsYXkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2luRGVsYXkgPSBmYWxzZTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgT25lRXVyb0ZpbHRlclZlY3RvcjMgfSBmcm9tIFwiLi9PbmVFdXJvRmlsdGVyXCI7XG5pbXBvcnQgeyBEZWxheWFibGVTaWduYWxGaWx0ZXIgfSBmcm9tIFwiLi9EZWxheWFibGVTaWduYWxGaWx0ZXJcIjtcbmltcG9ydCB7IEV1bGVyLCBNYXRyaXg0LCBRdWF0ZXJuaW9uLCBWZWN0b3IzIH0gZnJvbSBcInRocmVlXCI7XG5cbmV4cG9ydCBjbGFzcyBBUm5mdEZpbHRlciB7XG4gICAgcHJpdmF0ZSBkZWxheUV4aXRDaGVjazogRGVsYXlhYmxlU2lnbmFsRmlsdGVyO1xuXG4gICAgcHJpdmF0ZSBkZWxheUVudGVyQ2hlY2s6IERlbGF5YWJsZVNpZ25hbEZpbHRlcjtcblxuICAgIHByaXZhdGUgX2hhc0ZvdW5kOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvLyBwcml2YXRlIF9pbnRlcnBvbGF0aW9uRmFjdG9yOiBudW1iZXIgPSAxNTtcblxuICAgIHByaXZhdGUgX2xhc3RUcmFuc2xhdGlvbjogVmVjdG9yMztcblxuICAgIHByaXZhdGUgX2ZyYW1lRHJvcHM6IG51bWJlciA9IDA7XG5cbiAgICBwcml2YXRlIF9kZWx0YUFjY3VyYWN5OiBudW1iZXIgPSAxMDtcblxuICAgIHByaXZhdGUgX3Bvc2l0aW9uRmlsdGVyOiBPbmVFdXJvRmlsdGVyVmVjdG9yMztcblxuICAgIHByaXZhdGUgX3JvdGF0aW9uRmlsdGVyOiBPbmVFdXJvRmlsdGVyVmVjdG9yMztcblxuICAgIHB1YmxpYyBmaWx0ZXJGcmVxdWVuY3k6IG51bWJlciA9IDMwLjA7XG4gICAgcHVibGljIGZpbHRlck1pbkN1dG9mZjogbnVtYmVyID0gMS4wO1xuICAgIHB1YmxpYyBmaWx0ZXJCZXRhOiBudW1iZXIgPSAwLjA7XG4gICAgcHVibGljIGZpbHRlckRjdXRvZmY6IG51bWJlciA9IDEuMDtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRlbGF5RW50ZXJDaGVjayA9IG5ldyBEZWxheWFibGVTaWduYWxGaWx0ZXIoMik7XG4gICAgICAgIHRoaXMuZGVsYXlFeGl0Q2hlY2sgPSBuZXcgRGVsYXlhYmxlU2lnbmFsRmlsdGVyKDApO1xuXG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uRmlsdGVyID0gbmV3IE9uZUV1cm9GaWx0ZXJWZWN0b3IzKHRoaXMuZmlsdGVyRnJlcXVlbmN5KTtcbiAgICAgICAgdGhpcy5fcm90YXRpb25GaWx0ZXIgPSBuZXcgT25lRXVyb0ZpbHRlclZlY3RvcjModGhpcy5maWx0ZXJGcmVxdWVuY3kgKiAyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKHdvcmxkOiBhbnkpOiBWZWN0b3IzW10ge1xuICAgICAgICBsZXQgcG9zOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgbGV0IHJvdGF0aW9uVmVjOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgbGV0IHNjYWxlOiBWZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgICAgaWYgKCF3b3JsZCkge1xuICAgICAgICAgICAgdGhpcy5faGFzRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuX2ZyYW1lRHJvcHMgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1hdHJpeFc6IE1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuICAgICAgICAgICAgbGV0IHdvcmxkTWF0cml4OiBNYXRyaXg0ID0gbWF0cml4Vy5mcm9tQXJyYXkodGhpcy5nZXRBcnJheU1hdHJpeCh3b3JsZCkpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9oYXNGb3VuZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc0ZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsZXQgdmVjVHJhbnM6IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RUcmFuc2xhdGlvbiA9IHZlY1RyYW5zLnNldEZyb21NYXRyaXhQb3NpdGlvbih3b3JsZE1hdHJpeCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCB2ZWNUcmFuczogVmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICAgICAgICAgICAgbGV0IF9jdXJyZW50VHJhbnNsYXRpb246IFZlY3RvcjMgPSB2ZWNUcmFucy5zZXRGcm9tTWF0cml4UG9zaXRpb24od29ybGRNYXRyaXgpO1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhfY3VycmVudFRyYW5zbGF0aW9uLmRpc3RhbmNlVG8odGhpcy5fbGFzdFRyYW5zbGF0aW9uKSkgPiB0aGlzLl9kZWx0YUFjY3VyYWN5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZyYW1lRHJvcHMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZyYW1lRHJvcHMgPiAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VHJhbnNsYXRpb24gPSBfY3VycmVudFRyYW5zbGF0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbcG9zLCByb3RhdGlvblZlYywgc2NhbGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9mcmFtZURyb3BzID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VHJhbnNsYXRpb24gPSBfY3VycmVudFRyYW5zbGF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25GaWx0ZXIuVXBkYXRlUGFyYW1zKFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyRnJlcXVlbmN5LFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTWluQ3V0b2ZmLFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQmV0YSxcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRjdXRvZmZcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLl9yb3RhdGlvbkZpbHRlci5VcGRhdGVQYXJhbXMoXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJGcmVxdWVuY3kgKiAyLFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTWluQ3V0b2ZmLFxuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyQmV0YSxcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlckRjdXRvZmZcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbWF0cml4OiBNYXRyaXg0ID0gbmV3IE1hdHJpeDQoKTtcblxuICAgICAgICAgICAgbWF0cml4ID0gd29ybGRNYXRyaXg7XG5cbiAgICAgICAgICAgIGxldCByb3RhdGlvbjogUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG4gICAgICAgICAgICBsZXQgZXVsZXJSb3Q6IEV1bGVyID0gbmV3IEV1bGVyKCk7XG4gICAgICAgICAgICBsZXQgcG9zaXRpb246IFZlY3RvcjMgPSBuZXcgVmVjdG9yMygwLCAwLCAwKTtcblxuICAgICAgICAgICAgLy8gb3IgZXZlbiBzaW1wbGUgZGVjb21wb3NlIHRoZSB3b3JsZE1hdHJpeCBpbnRvIHBvc2l0aW9uLCBxdWF0ZXJuaW9uIGFuZCBzY2FsZSB3aXRoIGRlY29tcG9zZVxuICAgICAgICAgICAgd29ybGRNYXRyaXguZGVjb21wb3NlKHBvc2l0aW9uLCByb3RhdGlvbiwgc2NhbGUpO1xuICAgICAgICAgICAgbGV0IGVSb3QgPSBldWxlclJvdC5zZXRGcm9tUXVhdGVybmlvbihyb3RhdGlvbik7XG4gICAgICAgICAgICByb3RhdGlvblZlYyA9IHRoaXMuX3JvdGF0aW9uRmlsdGVyLkZpbHRlcihlUm90LnRvVmVjdG9yMygpKTtcblxuICAgICAgICAgICAgcG9zID0gdGhpcy5fcG9zaXRpb25GaWx0ZXIuRmlsdGVyKHBvc2l0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3Bvcywgcm90YXRpb25WZWMsIHNjYWxlXTtcbiAgICB9XG4gICAgcHJvdGVjdGVkIGdldEFycmF5TWF0cml4KHZhbHVlOiBhbnkpOiBhbnkge1xuICAgICAgICB2YXIgYXJyYXk6IGFueSA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGFycmF5W2tleV0gPSB2YWx1ZVtrZXldOyAvLy50b0ZpeGVkKDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG59XG4iLCJpbXBvcnQge1xuICAgIE9iamVjdDNELFxuICAgIFBsYW5lR2VvbWV0cnksXG4gICAgU2NlbmUsXG4gICAgVGV4dHVyZUxvYWRlcixcbiAgICBWaWRlb1RleHR1cmUsXG4gICAgTWVzaCxcbiAgICBNZXNoU3RhbmRhcmRNYXRlcmlhbCxcbiAgICBWZWN0b3IzLFxufSBmcm9tIFwidGhyZWVcIjtcbmltcG9ydCB7IEdMVEZMb2FkZXIgfSBmcm9tIFwidGhyZWUvZXhhbXBsZXMvanNtL2xvYWRlcnMvR0xURkxvYWRlclwiO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi4vdXRpbHMvVXRpbHNcIjtcbmltcG9ydCB7IEFSbmZ0RmlsdGVyIH0gZnJvbSBcIi4uL2ZpbHRlcnMvQVJuZnRGaWx0ZXJcIjtcbmltcG9ydCBTY2VuZVJlbmRlcmVyVEpTIGZyb20gXCIuLi9TY2VuZVJlbmRlcmVyVEpTXCI7XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSB0aGUgQVJWaWRlbyBvYmplY3QgdXNlZCBpbiBhZGRWaWRlby5cbiAqIEBwYXJhbSBwbGF5IHBsYXkgYSB2aWRlby5cbiAqL1xuaW50ZXJmYWNlIEFSdmlkZW8ge1xuICAgIHBsYXk6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIGRlZmluZSBhbiBFbnRpdHkuXG4gKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgRW50aXR5XG4gKi9cbmludGVyZmFjZSBFbnRpdHkge1xuICAgIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgdG8gZGVmaW5lIHRoZSBQbGFuZUdlb21ldHJ5IHVzZWQgaW4gdGhlIGFkZEltYWdlIGFuZCBhZGRWaWRlbyBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gdyAgd2lkdGggb2YgdGhlIFBsYW5lR2VvbWV0cnkuXG4gKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIFBsYW5lR2VvbWV0cnkuXG4gKiBAcGFyYW0gd3Mgd2lkdGggbnVtYmVyIG9mIHNlZ21lbnRzIG9mIHRoZSBQbGFuZUdlb21ldHJ5LlxuICogQHBhcmFtIGhzIGhlaWdodCBudW1iZXIgb2Ygc2VnbWVudHMgb2YgdGhlIFBsYW5lR2VvbWV0cnkuXG4gKi9cbmludGVyZmFjZSBJUGxhbmVDb25maWcge1xuICAgIHc6IG51bWJlcjtcbiAgICBoOiBudW1iZXI7XG4gICAgd3M6IG51bWJlcjtcbiAgICBoczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2FibGUgdG8gYXR0YWNoIFRocmVlanMgb2JqZWN0IHRvIHRoZSByZW5kZXJpbmcgcm9vdCBhbmQgcGFzcyBtYXRyaXggZGF0YSB0byBpdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkZUYWRkVEpTIHtcbiAgICBwcml2YXRlIGVudGl0aWVzOiBFbnRpdHlbXSA9IFtdO1xuICAgIHByaXZhdGUgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgcHJpdmF0ZSBzY2VuZTogU2NlbmU7XG4gICAgcHJpdmF0ZSB0YXJnZXQ6IEV2ZW50VGFyZ2V0O1xuICAgIHByaXZhdGUgdXVpZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2ZpbHRlcjogQVJuZnRGaWx0ZXI7XG4gICAgcHJpdmF0ZSBfb2VmOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogVGhlIE5GVGFkZFRKUyBjb25zdHVjdG9yLCB5b3UgbmVlZCB0byBwYXNzIHRoZSB1dWlkIGZyb20gdGhlIEFSbmZ0IGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB1dWlkIHRoZSB1dWlkLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHV1aWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNjZW5lID0gU2NlbmVSZW5kZXJlclRKUy5nZXRHbG9iYWxTY2VuZSgpO1xuICAgICAgICB0aGlzLnRhcmdldCA9IHdpbmRvdyB8fCBnbG9iYWw7XG4gICAgICAgIHRoaXMudXVpZCA9IHV1aWQ7XG4gICAgICAgIHRoaXMubmFtZXMgPSBbXTtcbiAgICAgICAgdGhpcy5fZmlsdGVyID0gbmV3IEFSbmZ0RmlsdGVyKCk7XG4gICAgICAgIHRoaXMuX29lZiA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhZGQgZnVuY3Rpb24gd2lsbCBhZGQgYSBtZXNoIHRvIHRoZSBSZW5kZXJlciByb290LiBZb3UgbmVlZCB0byBhc3NvY2lhdGUgYSBuYW1lIG9mIHRoZSBFbnRpdHkuXG4gICAgICogQHBhcmFtIG1lc2ggVGhlIG1lc2ggdG8gYWRkXG4gICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIEVudGl0eSBhc3NvY2lhdGVkLlxuICAgICAqIEBwYXJhbSBvYmpWaXNpYmlsaXR5IHNldCB0cnVlIG9yIGZhbHNlIGlmIHRoZSBtZXNoIHdsbCBzdGF5IHZpc2libGUgb3Igbm90IGFmdGVyIHRyYWNraW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGQobWVzaDogT2JqZWN0M0QsIG5hbWU6IHN0cmluZywgb2JqVmlzaWJpbGl0eTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwiZ2V0TkZURGF0YS1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHZhciBtc2cgPSBldi5kZXRhaWw7XG4gICAgICAgICAgICBtZXNoLnBvc2l0aW9uLnkgPSAoKG1zZy5oZWlnaHQgLyBtc2cuZHBpKSAqIDIuNTQgKiAxMCkgLyAyLjA7XG4gICAgICAgICAgICBtZXNoLnBvc2l0aW9uLnggPSAoKG1zZy53aWR0aCAvIG1zZy5kcGkpICogMi41NCAqIDEwKSAvIDIuMDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgT2JqZWN0M0QoKTtcbiAgICAgICAgcm9vdC5uYW1lID0gXCJyb290LVwiICsgbmFtZTtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQocm9vdCk7XG4gICAgICAgIHJvb3QuYWRkKG1lc2gpO1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwiZ2V0TWF0cml4R0xfUkgtXCIgKyB0aGlzLnV1aWQgKyBcIi1cIiArIG5hbWUsIChldjogYW55KSA9PiB7XG4gICAgICAgICAgICByb290LnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgbWVzaC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vZWYgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyID0gW25ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMCwgMCwgMCldO1xuICAgICAgICAgICAgICAgIGZpbHRlciA9IHRoaXMuX2ZpbHRlci51cGRhdGUoZXYuZGV0YWlsLm1hdHJpeEdMX1JIKTtcbiAgICAgICAgICAgICAgICByb290LnBvc2l0aW9uLnNldFgoZmlsdGVyWzBdLngpO1xuICAgICAgICAgICAgICAgIHJvb3QucG9zaXRpb24uc2V0WShmaWx0ZXJbMF0ueSk7XG4gICAgICAgICAgICAgICAgcm9vdC5wb3NpdGlvbi5zZXRaKGZpbHRlclswXS56KTtcbiAgICAgICAgICAgICAgICByb290LnJvdGF0aW9uLnNldEZyb21WZWN0b3IzKGZpbHRlclsxXSk7XG4gICAgICAgICAgICAgICAgcm9vdC5zY2FsZS5zZXRYKGZpbHRlclsyXS54KTtcbiAgICAgICAgICAgICAgICByb290LnNjYWxlLnNldFkoZmlsdGVyWzJdLnkpO1xuICAgICAgICAgICAgICAgIHJvb3Quc2NhbGUuc2V0WihmaWx0ZXJbMl0ueik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvb3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IFV0aWxzLmludGVycG9sYXRlKGV2LmRldGFpbC5tYXRyaXhHTF9SSCk7XG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0TWF0cml4KHJvb3QubWF0cml4LCBtYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm5mdFRyYWNraW5nTG9zdC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IG9ialZpc2liaWxpdHk7XG4gICAgICAgICAgICBtZXNoLnZpc2libGUgPSBvYmpWaXNpYmlsaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICB0aGlzLmVudGl0aWVzLnB1c2goeyBuYW1lIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhZGRNb2RlbCBmdW5jdGlvbiB3aWxsIGFkZCBhIG1vZGVsIHRvIHRoZSBSZW5kZXJlciByb290LiBZb3UgbmVlZCB0byBhc3NvY2lhdGUgYSBuYW1lIG9mIHRoZSBFbnRpdHkuXG4gICAgICogQHBhcmFtIHVybCB1cmwgb2YgdGhlIG1vZGVsLlxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBFbnRpdHkgYXNzb2NpYXRlZC5cbiAgICAgKiBAcGFyYW0gc2NhbGUgc2NhbGUgb2YgdGhlIG1vZGVsLlxuICAgICAqIEBwYXJhbSBvYmpWaXNpYmlsaXR5IHNldCB0cnVlIG9yIGZhbHNlIGlmIHRoZSBtZXNoIHdsbCBzdGF5IHZpc2libGUgb3Igbm90IGFmdGVyIHRyYWNraW5nLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRNb2RlbCh1cmw6IHN0cmluZywgbmFtZTogc3RyaW5nLCBzY2FsZTogbnVtYmVyLCBvYmpWaXNpYmlsaXR5OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgT2JqZWN0M0QoKTtcbiAgICAgICAgcm9vdC5uYW1lID0gXCJyb290LVwiICsgbmFtZTtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQocm9vdCk7XG4gICAgICAgIGxldCBtb2RlbDogYW55O1xuICAgICAgICAvKiBMb2FkIE1vZGVsICovXG4gICAgICAgIGNvbnN0IHRocmVlR0xURkxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XG4gICAgICAgIHRocmVlR0xURkxvYWRlci5sb2FkKHVybCwgKGdsdGYpID0+IHtcbiAgICAgICAgICAgIG1vZGVsID0gZ2x0Zi5zY2VuZTtcbiAgICAgICAgICAgIG1vZGVsLnNjYWxlLnNldChzY2FsZSwgc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgICAgIG1vZGVsLnJvdGF0aW9uLnggPSBNYXRoLlBJIC8gMjtcbiAgICAgICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJnZXRORlREYXRhLVwiICsgdGhpcy51dWlkICsgXCItXCIgKyBuYW1lLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBtc2cgPSBldi5kZXRhaWw7XG4gICAgICAgICAgICAgICAgbW9kZWwucG9zaXRpb24ueSA9ICgobXNnLmhlaWdodCAvIG1zZy5kcGkpICogMi41NCAqIDEwKSAvIDIuMDtcbiAgICAgICAgICAgICAgICBtb2RlbC5wb3NpdGlvbi54ID0gKChtc2cud2lkdGggLyBtc2cuZHBpKSAqIDIuNTQgKiAxMCkgLyAyLjA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJvb3QuYWRkKG1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJnZXRNYXRyaXhHTF9SSC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBtb2RlbC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vZWYgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyID0gW25ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMCwgMCwgMCldO1xuICAgICAgICAgICAgICAgIGZpbHRlciA9IHRoaXMuX2ZpbHRlci51cGRhdGUoZXYuZGV0YWlsLm1hdHJpeEdMX1JIKTtcbiAgICAgICAgICAgICAgICByb290LnBvc2l0aW9uLnNldFgoZmlsdGVyWzBdLngpO1xuICAgICAgICAgICAgICAgIHJvb3QucG9zaXRpb24uc2V0WShmaWx0ZXJbMF0ueSk7XG4gICAgICAgICAgICAgICAgcm9vdC5wb3NpdGlvbi5zZXRaKGZpbHRlclswXS56KTtcbiAgICAgICAgICAgICAgICByb290LnJvdGF0aW9uLnNldEZyb21WZWN0b3IzKGZpbHRlclsxXSk7XG4gICAgICAgICAgICAgICAgcm9vdC5zY2FsZS5zZXRYKGZpbHRlclsyXS54KTtcbiAgICAgICAgICAgICAgICByb290LnNjYWxlLnNldFkoZmlsdGVyWzJdLnkpO1xuICAgICAgICAgICAgICAgIHJvb3Quc2NhbGUuc2V0WihmaWx0ZXJbMl0ueik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvb3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IFV0aWxzLmludGVycG9sYXRlKGV2LmRldGFpbC5tYXRyaXhHTF9SSCk7XG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0TWF0cml4KHJvb3QubWF0cml4LCBtYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm5mdFRyYWNraW5nTG9zdC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IG9ialZpc2liaWxpdHk7XG4gICAgICAgICAgICBtb2RlbC52aXNpYmxlID0gb2JqVmlzaWJpbGl0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmFtZXMucHVzaChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWRkTW9kZWxXaXRoQ2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBhZGQgYSBtb2RlbCB0byB0aGUgUmVuZGVyZXIgcm9vdC4gWW91IG5lZWQgdG8gYXNzb2NpYXRlIGEgbmFtZSBvZiB0aGUgRW50aXR5LlxuICAgICAqIFlvdSBjYW4gbW9kaWZ5IHRoZSBtb2RlbCByb3RhdGlvbiwgc2NhbGUgYW5kIG90aGVyIHByb3BlcnRpZXMgd2l0aCB0aGUgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIHVybCB1cmwgb2YgdGhlIG1vZGVsLlxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBFbnRpdHkgYXNzb2NpYXRlZC5cbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgbW9kaWZ5IHRoZSBtb2RlbCBpbiB0aGUgY2FsbGJhY2suXG4gICAgICogQHBhcmFtIG9ialZpc2liaWxpdHkgc2V0IHRydWUgb3IgZmFsc2UgaWYgdGhlIG1lc2ggd2xsIHN0YXkgdmlzaWJsZSBvciBub3QgYWZ0ZXIgdHJhY2tpbmcuXG4gICAgICovXG4gICAgcHVibGljIGFkZE1vZGVsV2l0aENhbGxiYWNrKHVybDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoZ2x0ZjogYW55KSA9PiB7fSwgb2JqVmlzaWJpbGl0eTogYm9vbGVhbikge1xuICAgICAgICBjb25zdCByb290ID0gbmV3IE9iamVjdDNEKCk7XG4gICAgICAgIHJvb3QubmFtZSA9IFwicm9vdC1cIiArIG5hbWU7XG4gICAgICAgIHRoaXMuc2NlbmUuYWRkKHJvb3QpO1xuICAgICAgICBsZXQgbW9kZWw6IGFueTtcbiAgICAgICAgLyogTG9hZCBNb2RlbCAqL1xuICAgICAgICBjb25zdCB0aHJlZUdMVEZMb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xuICAgICAgICB0aHJlZUdMVEZMb2FkZXIubG9hZCh1cmwsIChnbHRmKSA9PiB7XG4gICAgICAgICAgICBtb2RlbCA9IGdsdGYuc2NlbmU7XG4gICAgICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwiZ2V0TkZURGF0YS1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gZXYuZGV0YWlsO1xuICAgICAgICAgICAgICAgIG1vZGVsLnBvc2l0aW9uLnkgPSAoKG1zZy5oZWlnaHQgLyBtc2cuZHBpKSAqIDIuNTQgKiAxMCkgLyAyLjA7XG4gICAgICAgICAgICAgICAgbW9kZWwucG9zaXRpb24ueCA9ICgobXNnLndpZHRoIC8gbXNnLmRwaSkgKiAyLjU0ICogMTApIC8gMi4wO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYWxsYmFjayhnbHRmKTtcbiAgICAgICAgICAgIHJvb3QuYWRkKG1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJnZXRNYXRyaXhHTF9SSC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBtb2RlbC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vZWYgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyID0gW25ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMCwgMCwgMCldO1xuICAgICAgICAgICAgICAgIGZpbHRlciA9IHRoaXMuX2ZpbHRlci51cGRhdGUoZXYuZGV0YWlsLm1hdHJpeEdMX1JIKTtcbiAgICAgICAgICAgICAgICByb290LnBvc2l0aW9uLnNldFgoZmlsdGVyWzBdLngpO1xuICAgICAgICAgICAgICAgIHJvb3QucG9zaXRpb24uc2V0WShmaWx0ZXJbMF0ueSk7XG4gICAgICAgICAgICAgICAgcm9vdC5wb3NpdGlvbi5zZXRaKGZpbHRlclswXS56KTtcbiAgICAgICAgICAgICAgICByb290LnJvdGF0aW9uLnNldEZyb21WZWN0b3IzKGZpbHRlclsxXSk7XG4gICAgICAgICAgICAgICAgcm9vdC5zY2FsZS5zZXRYKGZpbHRlclsyXS54KTtcbiAgICAgICAgICAgICAgICByb290LnNjYWxlLnNldFkoZmlsdGVyWzJdLnkpO1xuICAgICAgICAgICAgICAgIHJvb3Quc2NhbGUuc2V0WihmaWx0ZXJbMl0ueik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvb3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IFV0aWxzLmludGVycG9sYXRlKGV2LmRldGFpbC5tYXRyaXhHTF9SSCk7XG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0TWF0cml4KHJvb3QubWF0cml4LCBtYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm5mdFRyYWNraW5nTG9zdC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IG9ialZpc2liaWxpdHk7XG4gICAgICAgICAgICBtb2RlbC52aXNpYmxlID0gb2JqVmlzaWJpbGl0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmFtZXMucHVzaChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYWRkSW1hZ2UgZnVuY3Rpb24gd2lsbCBhZGQgYW4gaW1hZ2UgdG8gdGhlIFJlbmRlcmVyIHJvb3QuIFlvdSBuZWVkIHRvIGFzc29jaWF0ZSBhIG5hbWUgb2YgdGhlIEVudGl0eS5cbiAgICAgKiBAcGFyYW0gaW1hZ2VVcmwgdXJsIG9mIHRoZSBpbWFnZS5cbiAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgRW50aXR5IGFzc29jaWF0ZWQuXG4gICAgICogQHBhcmFtIGNvbG9yIGNvbG9yIG9mIHRoZSBiYWNrZ3JvdW5kIHBsYW5lLlxuICAgICAqIEBwYXJhbSBzY2FsZSBzY2FsZSBvZiB0aGUgcGxhbmUuXG4gICAgICogQHBhcmFtIGNvbmZpZ3Mgc2VlIElQbGFuZUNvbmZpZy5cbiAgICAgKiBAcGFyYW0gb2JqVmlzaWJpbGl0eSBzZXQgdHJ1ZSBvciBmYWxzZSBpZiB0aGUgbWVzaCB3bGwgc3RheSB2aXNpYmxlIG9yIG5vdCBhZnRlciB0cmFja2luZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkSW1hZ2UoXG4gICAgICAgIGltYWdlVXJsOiBzdHJpbmcsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgY29sb3I6IHN0cmluZyxcbiAgICAgICAgc2NhbGU6IG51bWJlcixcbiAgICAgICAgY29uZmlnczogSVBsYW5lQ29uZmlnLFxuICAgICAgICBvYmpWaXNpYmlsaXR5OiBib29sZWFuXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgT2JqZWN0M0QoKTtcbiAgICAgICAgcm9vdC5uYW1lID0gXCJyb290LVwiICsgbmFtZTtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQocm9vdCk7XG4gICAgICAgIGNvbnN0IHBsYW5lR2VvbSA9IG5ldyBQbGFuZUdlb21ldHJ5KGNvbmZpZ3MudywgY29uZmlncy5oLCBjb25maWdzLndzLCBjb25maWdzLmhzKTtcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IG5ldyBUZXh0dXJlTG9hZGVyKCkubG9hZChpbWFnZVVybCk7XG4gICAgICAgIGNvbnN0IG1hdGVyaWFsID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IGNvbG9yLCBtYXA6IHRleHR1cmUgfSk7XG4gICAgICAgIGNvbnN0IHBsYW5lID0gbmV3IE1lc2gocGxhbmVHZW9tLCBtYXRlcmlhbCk7XG4gICAgICAgIHBsYW5lLnNjYWxlLnNldChzY2FsZSwgc2NhbGUsIHNjYWxlKTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcImdldE5GVERhdGEtXCIgKyB0aGlzLnV1aWQgKyBcIi1cIiArIG5hbWUsIChldjogYW55KSA9PiB7XG4gICAgICAgICAgICB2YXIgbXNnID0gZXYuZGV0YWlsO1xuICAgICAgICAgICAgcGxhbmUucG9zaXRpb24ueSA9ICgobXNnLmhlaWdodCAvIG1zZy5kcGkpICogMi41NCAqIDEwKSAvIDIuMDtcbiAgICAgICAgICAgIHBsYW5lLnBvc2l0aW9uLnggPSAoKG1zZy53aWR0aCAvIG1zZy5kcGkpICogMi41NCAqIDEwKSAvIDIuMDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJvb3QuYWRkKHBsYW5lKTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcImdldE1hdHJpeEdMX1JILVwiICsgdGhpcy51dWlkICsgXCItXCIgKyBuYW1lLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgcm9vdC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHBsYW5lLnZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29lZiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBmaWx0ZXIgPSBbbmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAwKV07XG4gICAgICAgICAgICAgICAgZmlsdGVyID0gdGhpcy5fZmlsdGVyLnVwZGF0ZShldi5kZXRhaWwubWF0cml4R0xfUkgpO1xuICAgICAgICAgICAgICAgIHJvb3QucG9zaXRpb24uc2V0WChmaWx0ZXJbMF0ueCk7XG4gICAgICAgICAgICAgICAgcm9vdC5wb3NpdGlvbi5zZXRZKGZpbHRlclswXS55KTtcbiAgICAgICAgICAgICAgICByb290LnBvc2l0aW9uLnNldFooZmlsdGVyWzBdLnopO1xuICAgICAgICAgICAgICAgIHJvb3Qucm90YXRpb24uc2V0RnJvbVZlY3RvcjMoZmlsdGVyWzFdKTtcbiAgICAgICAgICAgICAgICByb290LnNjYWxlLnNldFgoZmlsdGVyWzJdLngpO1xuICAgICAgICAgICAgICAgIHJvb3Quc2NhbGUuc2V0WShmaWx0ZXJbMl0ueSk7XG4gICAgICAgICAgICAgICAgcm9vdC5zY2FsZS5zZXRaKGZpbHRlclsyXS56KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcm9vdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0cml4ID0gVXRpbHMuaW50ZXJwb2xhdGUoZXYuZGV0YWlsLm1hdHJpeEdMX1JIKTtcbiAgICAgICAgICAgICAgICBVdGlscy5zZXRNYXRyaXgocm9vdC5tYXRyaXgsIG1hdHJpeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwibmZ0VHJhY2tpbmdMb3N0LVwiICsgdGhpcy51dWlkICsgXCItXCIgKyBuYW1lLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgcm9vdC52aXNpYmxlID0gb2JqVmlzaWJpbGl0eTtcbiAgICAgICAgICAgIHBsYW5lLnZpc2libGUgPSBvYmpWaXNpYmlsaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5uYW1lcy5wdXNoKG5hbWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBhZGRWaWRlbyBmdW5jdGlvbiB3aWxsIGFkZCBhIHZpZGVvIHRvIHRoZSBSZW5kZXJlciByb290LiBZb3UgbmVlZCB0byBhc3NvY2lhdGUgYSBuYW1lIG9mIHRoZSBFbnRpdHkuXG4gICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGUgaHRtbCB2aWRlbyBlbGVtZW50LlxuICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBFbnRpdHkgYXNzb2NpYXRlZC5cbiAgICAgKiBAcGFyYW0gc2NhbGUgc2NhbGUgb2YgdGhlIHBsYW5lLlxuICAgICAqIEBwYXJhbSBjb25maWdzIHNlZSBJUGxhbmVDb25maWcuXG4gICAgICogQHBhcmFtIG9ialZpc2liaWxpdHkgc2V0IHRydWUgb3IgZmFsc2UgaWYgdGhlIG1lc2ggd2xsIHN0YXkgdmlzaWJsZSBvciBub3QgYWZ0ZXIgdHJhY2tpbmcuXG4gICAgICovXG4gICAgcHVibGljIGFkZFZpZGVvKGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgc2NhbGU6IG51bWJlciwgY29uZmlnczogSVBsYW5lQ29uZmlnLCBvYmpWaXNpYmlsaXR5OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgT2JqZWN0M0QoKTtcbiAgICAgICAgcm9vdC5uYW1lID0gXCJyb290LVwiICsgbmFtZTtcbiAgICAgICAgdGhpcy5zY2VuZS5hZGQocm9vdCk7XG4gICAgICAgIGNvbnN0IEFSVmlkZW86IEhUTUxWaWRlb0VsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkgYXMgSFRNTFZpZGVvRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGV4dHVyZSA9IG5ldyBWaWRlb1RleHR1cmUoQVJWaWRlbyBhcyBIVE1MVmlkZW9FbGVtZW50KTtcbiAgICAgICAgY29uc3QgbWF0ID0gbmV3IE1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IDB4YmJiYmZmLCBtYXA6IHRleHR1cmUgfSk7XG4gICAgICAgIEFSVmlkZW8ucGxheSgpO1xuICAgICAgICBjb25zdCBwbGFuZUdlb20gPSBuZXcgUGxhbmVHZW9tZXRyeShjb25maWdzLncsIGNvbmZpZ3MuaCwgY29uZmlncy53cywgY29uZmlncy5ocyk7XG4gICAgICAgIGNvbnN0IHBsYW5lID0gbmV3IE1lc2gocGxhbmVHZW9tLCBtYXQpO1xuICAgICAgICBwbGFuZS5zY2FsZS5zZXQoc2NhbGUsIHNjYWxlLCBzY2FsZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJnZXRORlREYXRhLVwiICsgdGhpcy51dWlkICsgXCItXCIgKyBuYW1lLCAoZXY6IGFueSkgPT4ge1xuICAgICAgICAgICAgdmFyIG1zZyA9IGV2LmRldGFpbDtcbiAgICAgICAgICAgIHBsYW5lLnBvc2l0aW9uLnkgPSAoKG1zZy5oZWlnaHQgLyBtc2cuZHBpKSAqIDIuNTQgKiAxMCkgLyAyLjA7XG4gICAgICAgICAgICBwbGFuZS5wb3NpdGlvbi54ID0gKChtc2cud2lkdGggLyBtc2cuZHBpKSAqIDIuNTQgKiAxMCkgLyAyLjA7XG4gICAgICAgIH0pO1xuICAgICAgICByb290LmFkZChwbGFuZSk7XG4gICAgICAgIHRoaXMudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJnZXRNYXRyaXhHTF9SSC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICBwbGFuZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9vZWYgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlsdGVyID0gW25ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMCwgMCwgMCldO1xuICAgICAgICAgICAgICAgIGZpbHRlciA9IHRoaXMuX2ZpbHRlci51cGRhdGUoZXYuZGV0YWlsLm1hdHJpeEdMX1JIKTtcbiAgICAgICAgICAgICAgICByb290LnBvc2l0aW9uLnNldFgoZmlsdGVyWzBdLngpO1xuICAgICAgICAgICAgICAgIHJvb3QucG9zaXRpb24uc2V0WShmaWx0ZXJbMF0ueSk7XG4gICAgICAgICAgICAgICAgcm9vdC5wb3NpdGlvbi5zZXRaKGZpbHRlclswXS56KTtcbiAgICAgICAgICAgICAgICByb290LnJvdGF0aW9uLnNldEZyb21WZWN0b3IzKGZpbHRlclsxXSk7XG4gICAgICAgICAgICAgICAgcm9vdC5zY2FsZS5zZXRYKGZpbHRlclsyXS54KTtcbiAgICAgICAgICAgICAgICByb290LnNjYWxlLnNldFkoZmlsdGVyWzJdLnkpO1xuICAgICAgICAgICAgICAgIHJvb3Quc2NhbGUuc2V0WihmaWx0ZXJbMl0ueik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJvb3QubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdHJpeCA9IFV0aWxzLmludGVycG9sYXRlKGV2LmRldGFpbC5tYXRyaXhHTF9SSCk7XG4gICAgICAgICAgICAgICAgVXRpbHMuc2V0TWF0cml4KHJvb3QubWF0cml4LCBtYXRyaXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm5mdFRyYWNraW5nTG9zdC1cIiArIHRoaXMudXVpZCArIFwiLVwiICsgbmFtZSwgKGV2OiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJvb3QudmlzaWJsZSA9IG9ialZpc2liaWxpdHk7XG4gICAgICAgICAgICBwbGFuZS52aXNpYmxlID0gb2JqVmlzaWJpbGl0eTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubmFtZXMucHVzaChuYW1lKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBZb3UgY2FuIGdldCB0aGUgbmFtZXMgb2YgdGhlIGVudGl0aWVzIHVzZWQgaW4geW91ciBwcm9qZWN0LlxuICAgICAqIEByZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgZW50aXRpZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBvciBub3QgdGhlIE9uZUV1cm9GaWx0ZXIgcm91dGluZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IG9lZihlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fb2VmID0gZW5hYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIE9uZUV1cm9GaWx0ZXIgaXMgZW5hYmxlZCBvciBub3QuXG4gICAgICogQHJldHVybnMgKGJvb2xlYW4pIHRydWUgb3IgZmFsc2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG9lZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29lZjtcbiAgICB9XG59XG4iLCJpbXBvcnQgU2NlbmVSZW5kZXJlclRKUyBmcm9tIFwiLi9TY2VuZVJlbmRlcmVyVEpTXCI7XG5pbXBvcnQgTkZUYWRkVEpTIGZyb20gXCIuL21hcmtlcm1lZGlhL05GVGFkZFRKU1wiO1xuXG5leHBvcnQgZGVmYXVsdCB7IFNjZW5lUmVuZGVyZXJUSlMsIE5GVGFkZFRKUyB9O1xuIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlcXVpcmUiLCJkZWZpbmUiLCJhbWQiLCJ0aGlzIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMzgxX18iLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZCIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiZyIsImdsb2JhbFRoaXMiLCJGdW5jdGlvbiIsImUiLCJ3aW5kb3ciLCJvYmoiLCJwcm9wIiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiX2NsYXNzQ2FsbENoZWNrIiwiaW5zdGFuY2UiLCJDb25zdHJ1Y3RvciIsIlR5cGVFcnJvciIsIl9kZWZpbmVQcm9wZXJ0aWVzIiwidGFyZ2V0IiwicHJvcHMiLCJpIiwibGVuZ3RoIiwiZGVzY3JpcHRvciIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX2NyZWF0ZUNsYXNzIiwicHJvdG9Qcm9wcyIsInN0YXRpY1Byb3BzIiwiVXRpbHMiLCJ3b3JsZCIsInRyYWNrZWRNYXRyaXgiLCJkZWx0YSIsImludGVycG9sYXRlZCIsInRlc3QiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJtYXRyaXgiLCJ2YWx1ZSIsImFycmF5IiwiZWxlbWVudHMiLCJzZXQiLCJzbGljZSIsIlNjZW5lUmVuZGVyZXJUSlMiLCJjb25maWdEYXRhIiwiY2FudmFzRHJhdyIsInV1aWQiLCJjYW1lcmFCb29sIiwicmVuZGVyZXIiLCJjYW52YXMiLCJjb250ZXh0IiwiYWxwaGEiLCJwcmVtdWx0aXBsaWVkQWxwaGEiLCJhbnRpYWxpYXMiLCJzdGVuY2lsIiwicHJlY2lzaW9uIiwiZGVwdGgiLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwic2V0UGl4ZWxSYXRpbyIsImRldmljZVBpeGVsUmF0aW8iLCJzY2VuZSIsImdsb2JhbFNjZW5lIiwiY2FtZXJhIiwiZm92IiwicmF0aW8iLCJuZWFyIiwiZmFyIiwidmVyc2lvbiIsImNvbnNvbGUiLCJsb2ciLCJtYXRyaXhBdXRvVXBkYXRlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2IiwicHJvamVjdGlvbk1hdHJpeCIsImRldGFpbCIsInByb2oiLCJhZGQiLCJsaWdodCIsIl9ldiIsInNldFNpemUiLCJzdyIsInNoIiwic2V0SW5pdFJlbmRlcmVyRXZlbnQiLCJDdXN0b21FdmVudCIsImRpc3BhdGNoRXZlbnQiLCJyZW5kZXIiLCJHTFRGTG9hZGVyIiwiTG9hZGVyIiwiY29uc3RydWN0b3IiLCJtYW5hZ2VyIiwic3VwZXIiLCJkcmFjb0xvYWRlciIsImt0eDJMb2FkZXIiLCJtZXNob3B0RGVjb2RlciIsInBsdWdpbkNhbGxiYWNrcyIsInJlZ2lzdGVyIiwicGFyc2VyIiwiR0xURk1hdGVyaWFsc0NsZWFyY29hdEV4dGVuc2lvbiIsIkdMVEZUZXh0dXJlQmFzaXNVRXh0ZW5zaW9uIiwiR0xURlRleHR1cmVXZWJQRXh0ZW5zaW9uIiwiR0xURk1hdGVyaWFsc1NoZWVuRXh0ZW5zaW9uIiwiR0xURk1hdGVyaWFsc1RyYW5zbWlzc2lvbkV4dGVuc2lvbiIsIkdMVEZNYXRlcmlhbHNWb2x1bWVFeHRlbnNpb24iLCJHTFRGTWF0ZXJpYWxzSW9yRXh0ZW5zaW9uIiwiR0xURk1hdGVyaWFsc1NwZWN1bGFyRXh0ZW5zaW9uIiwiR0xURkxpZ2h0c0V4dGVuc2lvbiIsIkdMVEZNZXNob3B0Q29tcHJlc3Npb24iLCJsb2FkIiwidXJsIiwib25Mb2FkIiwib25Qcm9ncmVzcyIsIm9uRXJyb3IiLCJzY29wZSIsInJlc291cmNlUGF0aCIsInBhdGgiLCJMb2FkZXJVdGlscyIsIml0ZW1TdGFydCIsIl9vbkVycm9yIiwiZXJyb3IiLCJpdGVtRXJyb3IiLCJpdGVtRW5kIiwibG9hZGVyIiwiRmlsZUxvYWRlciIsInNldFBhdGgiLCJzZXRSZXNwb25zZVR5cGUiLCJzZXRSZXF1ZXN0SGVhZGVyIiwicmVxdWVzdEhlYWRlciIsInNldFdpdGhDcmVkZW50aWFscyIsIndpdGhDcmVkZW50aWFscyIsImRhdGEiLCJwYXJzZSIsImdsdGYiLCJzZXREUkFDT0xvYWRlciIsInNldEREU0xvYWRlciIsIkVycm9yIiwic2V0S1RYMkxvYWRlciIsInNldE1lc2hvcHREZWNvZGVyIiwiY2FsbGJhY2siLCJpbmRleE9mIiwicHVzaCIsInVucmVnaXN0ZXIiLCJzcGxpY2UiLCJjb250ZW50IiwiZXh0ZW5zaW9ucyIsInBsdWdpbnMiLCJVaW50OEFycmF5IiwiQklOQVJZX0VYVEVOU0lPTl9IRUFERVJfTUFHSUMiLCJFWFRFTlNJT05TIiwiS0hSX0JJTkFSWV9HTFRGIiwiR0xURkJpbmFyeUV4dGVuc2lvbiIsImpzb24iLCJKU09OIiwiYXNzZXQiLCJHTFRGUGFyc2VyIiwiY3Jvc3NPcmlnaW4iLCJmaWxlTG9hZGVyIiwicGx1Z2luIiwibmFtZSIsImV4dGVuc2lvbnNVc2VkIiwiZXh0ZW5zaW9uTmFtZSIsImV4dGVuc2lvbnNSZXF1aXJlZCIsIktIUl9NQVRFUklBTFNfVU5MSVQiLCJHTFRGTWF0ZXJpYWxzVW5saXRFeHRlbnNpb24iLCJLSFJfTUFURVJJQUxTX1BCUl9TUEVDVUxBUl9HTE9TU0lORVNTIiwiR0xURk1hdGVyaWFsc1BiclNwZWN1bGFyR2xvc3NpbmVzc0V4dGVuc2lvbiIsIktIUl9EUkFDT19NRVNIX0NPTVBSRVNTSU9OIiwiR0xURkRyYWNvTWVzaENvbXByZXNzaW9uRXh0ZW5zaW9uIiwiS0hSX1RFWFRVUkVfVFJBTlNGT1JNIiwiR0xURlRleHR1cmVUcmFuc2Zvcm1FeHRlbnNpb24iLCJLSFJfTUVTSF9RVUFOVElaQVRJT04iLCJHTFRGTWVzaFF1YW50aXphdGlvbkV4dGVuc2lvbiIsIndhcm4iLCJzZXRFeHRlbnNpb25zIiwic2V0UGx1Z2lucyIsIkdMVEZSZWdpc3RyeSIsIm9iamVjdHMiLCJvYmplY3QiLCJyZW1vdmUiLCJyZW1vdmVBbGwiLCJLSFJfTElHSFRTX1BVTkNUVUFMIiwiS0hSX01BVEVSSUFMU19DTEVBUkNPQVQiLCJLSFJfTUFURVJJQUxTX0lPUiIsIktIUl9NQVRFUklBTFNfU0hFRU4iLCJLSFJfTUFURVJJQUxTX1NQRUNVTEFSIiwiS0hSX01BVEVSSUFMU19UUkFOU01JU1NJT04iLCJLSFJfTUFURVJJQUxTX1ZPTFVNRSIsIktIUl9URVhUVVJFX0JBU0lTVSIsIkVYVF9URVhUVVJFX1dFQlAiLCJFWFRfTUVTSE9QVF9DT01QUkVTU0lPTiIsImNhY2hlIiwicmVmcyIsInVzZXMiLCJfbWFya0RlZnMiLCJub2RlRGVmcyIsIm5vZGVzIiwibm9kZUluZGV4Iiwibm9kZUxlbmd0aCIsIm5vZGVEZWYiLCJfYWRkTm9kZVJlZiIsIl9sb2FkTGlnaHQiLCJsaWdodEluZGV4IiwiY2FjaGVLZXkiLCJkZXBlbmRlbmN5IiwibGlnaHREZWYiLCJsaWdodHMiLCJsaWdodE5vZGUiLCJjb2xvciIsIkNvbG9yIiwiZnJvbUFycmF5IiwicmFuZ2UiLCJ0eXBlIiwiRGlyZWN0aW9uYWxMaWdodCIsInBvc2l0aW9uIiwiUG9pbnRMaWdodCIsImRpc3RhbmNlIiwiU3BvdExpZ2h0Iiwic3BvdCIsImlubmVyQ29uZUFuZ2xlIiwib3V0ZXJDb25lQW5nbGUiLCJNYXRoIiwiUEkiLCJhbmdsZSIsInBlbnVtYnJhIiwiZGVjYXkiLCJpbnRlbnNpdHkiLCJjcmVhdGVVbmlxdWVOYW1lIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjcmVhdGVOb2RlQXR0YWNobWVudCIsInNlbGYiLCJ0aGVuIiwiX2dldE5vZGVSZWYiLCJnZXRNYXRlcmlhbFR5cGUiLCJNZXNoQmFzaWNNYXRlcmlhbCIsImV4dGVuZFBhcmFtcyIsIm1hdGVyaWFsUGFyYW1zIiwibWF0ZXJpYWxEZWYiLCJwZW5kaW5nIiwib3BhY2l0eSIsIm1ldGFsbGljUm91Z2huZXNzIiwicGJyTWV0YWxsaWNSb3VnaG5lc3MiLCJBcnJheSIsImlzQXJyYXkiLCJiYXNlQ29sb3JGYWN0b3IiLCJiYXNlQ29sb3JUZXh0dXJlIiwiYXNzaWduVGV4dHVyZSIsImFsbCIsIm1hdGVyaWFsSW5kZXgiLCJtYXRlcmlhbHMiLCJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsImV4dGVuZE1hdGVyaWFsUGFyYW1zIiwiZXh0ZW5zaW9uIiwiY2xlYXJjb2F0RmFjdG9yIiwiY2xlYXJjb2F0IiwiY2xlYXJjb2F0VGV4dHVyZSIsImNsZWFyY29hdFJvdWdobmVzc0ZhY3RvciIsImNsZWFyY29hdFJvdWdobmVzcyIsImNsZWFyY29hdFJvdWdobmVzc1RleHR1cmUiLCJjbGVhcmNvYXROb3JtYWxUZXh0dXJlIiwic2NhbGUiLCJjbGVhcmNvYXROb3JtYWxTY2FsZSIsIlZlY3RvcjIiLCJzaGVlbkNvbG9yIiwic2hlZW5Sb3VnaG5lc3MiLCJzaGVlbiIsInNoZWVuQ29sb3JGYWN0b3IiLCJzaGVlblJvdWdobmVzc0ZhY3RvciIsInNoZWVuQ29sb3JUZXh0dXJlIiwic2hlZW5Sb3VnaG5lc3NUZXh0dXJlIiwidHJhbnNtaXNzaW9uRmFjdG9yIiwidHJhbnNtaXNzaW9uIiwidHJhbnNtaXNzaW9uVGV4dHVyZSIsInRoaWNrbmVzcyIsInRoaWNrbmVzc0ZhY3RvciIsInRoaWNrbmVzc1RleHR1cmUiLCJhdHRlbnVhdGlvbkRpc3RhbmNlIiwiY29sb3JBcnJheSIsImF0dGVudWF0aW9uQ29sb3IiLCJpb3IiLCJzcGVjdWxhckludGVuc2l0eSIsInNwZWN1bGFyRmFjdG9yIiwic3BlY3VsYXJUZXh0dXJlIiwic3BlY3VsYXJDb2xvckZhY3RvciIsInNwZWN1bGFyQ29sb3IiLCJzcGVjdWxhckNvbG9yVGV4dHVyZSIsInRleHR1cmUiLCJlbmNvZGluZyIsInNSR0JFbmNvZGluZyIsImxvYWRUZXh0dXJlIiwidGV4dHVyZUluZGV4IiwidGV4dHVyZURlZiIsInRleHR1cmVzIiwic291cmNlIiwiaW1hZ2VzIiwib3B0aW9ucyIsImxvYWRUZXh0dXJlSW1hZ2UiLCJpc1N1cHBvcnRlZCIsInRleHR1cmVMb2FkZXIiLCJ1cmkiLCJoYW5kbGVyIiwiZ2V0SGFuZGxlciIsImRldGVjdFN1cHBvcnQiLCJpbWFnZSIsIkltYWdlIiwic3JjIiwib25sb2FkIiwib25lcnJvciIsImhlaWdodCIsImxvYWRCdWZmZXJWaWV3IiwiaW5kZXgiLCJidWZmZXJWaWV3IiwiYnVmZmVyVmlld3MiLCJleHRlbnNpb25EZWYiLCJidWZmZXIiLCJnZXREZXBlbmRlbmN5IiwiZGVjb2RlciIsInN1cHBvcnRlZCIsInJlYWR5IiwicmVzIiwiYnl0ZU9mZnNldCIsImJ5dGVMZW5ndGgiLCJjb3VudCIsInN0cmlkZSIsImJ5dGVTdHJpZGUiLCJyZXN1bHQiLCJBcnJheUJ1ZmZlciIsImRlY29kZUdsdGZCdWZmZXIiLCJtb2RlIiwiZmlsdGVyIiwiYm9keSIsImhlYWRlclZpZXciLCJEYXRhVmlldyIsImhlYWRlciIsIm1hZ2ljIiwiZ2V0VWludDMyIiwiY2h1bmtDb250ZW50c0xlbmd0aCIsImNodW5rVmlldyIsImNodW5rSW5kZXgiLCJjaHVua0xlbmd0aCIsImNodW5rVHlwZSIsImNvbnRlbnRBcnJheSIsInByZWxvYWQiLCJkZWNvZGVQcmltaXRpdmUiLCJwcmltaXRpdmUiLCJidWZmZXJWaWV3SW5kZXgiLCJnbHRmQXR0cmlidXRlTWFwIiwiYXR0cmlidXRlcyIsInRocmVlQXR0cmlidXRlTWFwIiwiYXR0cmlidXRlTm9ybWFsaXplZE1hcCIsImF0dHJpYnV0ZVR5cGVNYXAiLCJhdHRyaWJ1dGVOYW1lIiwidGhyZWVBdHRyaWJ1dGVOYW1lIiwiQVRUUklCVVRFUyIsInRvTG93ZXJDYXNlIiwiYWNjZXNzb3JEZWYiLCJhY2Nlc3NvcnMiLCJjb21wb25lbnRUeXBlIiwiV0VCR0xfQ09NUE9ORU5UX1RZUEVTIiwibm9ybWFsaXplZCIsImRlY29kZURyYWNvRmlsZSIsImdlb21ldHJ5IiwiYXR0cmlidXRlIiwiZXh0ZW5kVGV4dHVyZSIsInRyYW5zZm9ybSIsInRleENvb3JkIiwib2Zmc2V0Iiwicm90YXRpb24iLCJjbG9uZSIsInJlcGVhdCIsIm5lZWRzVXBkYXRlIiwiR0xURk1lc2hTdGFuZGFyZFNHTWF0ZXJpYWwiLCJNZXNoU3RhbmRhcmRNYXRlcmlhbCIsInBhcmFtcyIsImlzR0xURlNwZWN1bGFyR2xvc3NpbmVzc01hdGVyaWFsIiwic3BlY3VsYXJNYXBQYXJzRnJhZ21lbnRDaHVuayIsImpvaW4iLCJnbG9zc2luZXNzTWFwUGFyc0ZyYWdtZW50Q2h1bmsiLCJzcGVjdWxhck1hcEZyYWdtZW50Q2h1bmsiLCJnbG9zc2luZXNzTWFwRnJhZ21lbnRDaHVuayIsImxpZ2h0UGh5c2ljYWxGcmFnbWVudENodW5rIiwidW5pZm9ybXMiLCJzcGVjdWxhciIsInNldEhleCIsImdsb3NzaW5lc3MiLCJzcGVjdWxhck1hcCIsImdsb3NzaW5lc3NNYXAiLCJfZXh0cmFVbmlmb3JtcyIsIm9uQmVmb3JlQ29tcGlsZSIsInNoYWRlciIsInVuaWZvcm1OYW1lIiwiZnJhZ21lbnRTaGFkZXIiLCJyZXBsYWNlIiwiZGVmaW5lUHJvcGVydGllcyIsInYiLCJkZWZpbmVzIiwiVVNFX1NQRUNVTEFSTUFQIiwiVVNFX0dMT1NTSU5FU1NNQVAiLCJVU0VfVVYiLCJtZXRhbG5lc3MiLCJyb3VnaG5lc3MiLCJtZXRhbG5lc3NNYXAiLCJyb3VnaG5lc3NNYXAiLCJzZXRWYWx1ZXMiLCJjb3B5Iiwic3BlY3VsYXJHbG9zc2luZXNzUGFyYW1zIiwicGJyU3BlY3VsYXJHbG9zc2luZXNzIiwiZGlmZnVzZUZhY3RvciIsImRpZmZ1c2VUZXh0dXJlIiwiZW1pc3NpdmUiLCJnbG9zc2luZXNzRmFjdG9yIiwic3BlY3VsYXJHbG9zc2luZXNzVGV4dHVyZSIsInNwZWNHbG9zc01hcERlZiIsImNyZWF0ZU1hdGVyaWFsIiwibWF0ZXJpYWwiLCJmb2ciLCJtYXAiLCJsaWdodE1hcCIsImxpZ2h0TWFwSW50ZW5zaXR5IiwiYW9NYXAiLCJhb01hcEludGVuc2l0eSIsImVtaXNzaXZlSW50ZW5zaXR5IiwiZW1pc3NpdmVNYXAiLCJidW1wTWFwIiwiYnVtcFNjYWxlIiwibm9ybWFsTWFwIiwibm9ybWFsTWFwVHlwZSIsIlRhbmdlbnRTcGFjZU5vcm1hbE1hcCIsIm5vcm1hbFNjYWxlIiwiZGlzcGxhY2VtZW50TWFwIiwiZGlzcGxhY2VtZW50U2NhbGUiLCJkaXNwbGFjZW1lbnRCaWFzIiwiYWxwaGFNYXAiLCJlbnZNYXAiLCJlbnZNYXBJbnRlbnNpdHkiLCJyZWZyYWN0aW9uUmF0aW8iLCJHTFRGQ3ViaWNTcGxpbmVJbnRlcnBvbGFudCIsIkludGVycG9sYW50IiwicGFyYW1ldGVyUG9zaXRpb25zIiwic2FtcGxlVmFsdWVzIiwic2FtcGxlU2l6ZSIsInJlc3VsdEJ1ZmZlciIsImNvcHlTYW1wbGVWYWx1ZV8iLCJ2YWx1ZXMiLCJ2YWx1ZVNpemUiLCJiZWZvcmVTdGFydF8iLCJhZnRlckVuZF8iLCJpbnRlcnBvbGF0ZV8iLCJpMSIsInQwIiwidCIsInQxIiwic3RyaWRlMiIsInN0cmlkZTMiLCJ0ZCIsInAiLCJwcCIsInBwcCIsIm9mZnNldDEiLCJvZmZzZXQwIiwiczIiLCJzMyIsInMwIiwiczEiLCJwMCIsIm0wIiwicDEiLCJtMSIsIl9xIiwiUXVhdGVybmlvbiIsIkdMVEZDdWJpY1NwbGluZVF1YXRlcm5pb25JbnRlcnBvbGFudCIsIm5vcm1hbGl6ZSIsInRvQXJyYXkiLCJJbnQ4QXJyYXkiLCJJbnQxNkFycmF5IiwiVWludDE2QXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0MzJBcnJheSIsIldFQkdMX0ZJTFRFUlMiLCJOZWFyZXN0RmlsdGVyIiwiTGluZWFyRmlsdGVyIiwiTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIiLCJMaW5lYXJNaXBtYXBOZWFyZXN0RmlsdGVyIiwiTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciIsIkxpbmVhck1pcG1hcExpbmVhckZpbHRlciIsIldFQkdMX1dSQVBQSU5HUyIsIkNsYW1wVG9FZGdlV3JhcHBpbmciLCJNaXJyb3JlZFJlcGVhdFdyYXBwaW5nIiwiUmVwZWF0V3JhcHBpbmciLCJXRUJHTF9UWVBFX1NJWkVTIiwiUE9TSVRJT04iLCJOT1JNQUwiLCJUQU5HRU5UIiwiVEVYQ09PUkRfMCIsIlRFWENPT1JEXzEiLCJDT0xPUl8wIiwiV0VJR0hUU18wIiwiSk9JTlRTXzAiLCJQQVRIX1BST1BFUlRJRVMiLCJ0cmFuc2xhdGlvbiIsIndlaWdodHMiLCJJTlRFUlBPTEFUSU9OIiwiQ1VCSUNTUExJTkUiLCJMSU5FQVIiLCJJbnRlcnBvbGF0ZUxpbmVhciIsIlNURVAiLCJJbnRlcnBvbGF0ZURpc2NyZXRlIiwiYWRkVW5rbm93bkV4dGVuc2lvbnNUb1VzZXJEYXRhIiwia25vd25FeHRlbnNpb25zIiwib2JqZWN0RGVmIiwidXNlckRhdGEiLCJnbHRmRXh0ZW5zaW9ucyIsImFzc2lnbkV4dHJhc1RvVXNlckRhdGEiLCJnbHRmRGVmIiwiZXh0cmFzIiwiYXNzaWduIiwidXBkYXRlTW9ycGhUYXJnZXRzIiwibWVzaCIsIm1lc2hEZWYiLCJpbCIsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsInRhcmdldE5hbWVzIiwibW9ycGhUYXJnZXREaWN0aW9uYXJ5IiwiY3JlYXRlUHJpbWl0aXZlS2V5IiwicHJpbWl0aXZlRGVmIiwiZHJhY29FeHRlbnNpb24iLCJnZW9tZXRyeUtleSIsImluZGljZXMiLCJjcmVhdGVBdHRyaWJ1dGVzS2V5IiwiYXR0cmlidXRlc0tleSIsImtleXMiLCJzb3J0IiwiZ2V0Tm9ybWFsaXplZENvbXBvbmVudFNjYWxlIiwiYXNzb2NpYXRpb25zIiwiTWFwIiwicHJpbWl0aXZlQ2FjaGUiLCJtZXNoQ2FjaGUiLCJjYW1lcmFDYWNoZSIsImxpZ2h0Q2FjaGUiLCJ0ZXh0dXJlQ2FjaGUiLCJub2RlTmFtZXNVc2VkIiwiY3JlYXRlSW1hZ2VCaXRtYXAiLCJJbWFnZUJpdG1hcExvYWRlciIsIlRleHR1cmVMb2FkZXIiLCJzZXRDcm9zc09yaWdpbiIsIl9pbnZva2VBbGwiLCJleHQiLCJiZWZvcmVSb290IiwiZ2V0RGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jaWVzIiwic2NlbmVzIiwiYW5pbWF0aW9ucyIsImNhbWVyYXMiLCJhZnRlclJvb3QiLCJjYXRjaCIsInNraW5EZWZzIiwic2tpbnMiLCJtZXNoRGVmcyIsIm1lc2hlcyIsInNraW5JbmRleCIsInNraW5MZW5ndGgiLCJqb2ludHMiLCJpc0JvbmUiLCJza2luIiwiaXNTa2lubmVkTWVzaCIsInJlZiIsInVwZGF0ZU1hcHBpbmdzIiwib3JpZ2luYWwiLCJtYXBwaW5ncyIsImNoaWxkIiwiY2hpbGRyZW4iLCJlbnRyaWVzIiwiX2ludm9rZU9uZSIsImZ1bmMiLCJ1bnNoaWZ0IiwibG9hZFNjZW5lIiwibG9hZE5vZGUiLCJsb2FkTWVzaCIsImxvYWRBY2Nlc3NvciIsImxvYWRCdWZmZXIiLCJsb2FkTWF0ZXJpYWwiLCJsb2FkU2tpbiIsImxvYWRBbmltYXRpb24iLCJsb2FkQ2FtZXJhIiwiZGVmcyIsImRlZiIsImJ1ZmZlckluZGV4IiwiYnVmZmVyRGVmIiwiYnVmZmVycyIsInJlamVjdCIsImJ1ZmZlclZpZXdEZWYiLCJhY2Nlc3NvckluZGV4Iiwic3BhcnNlIiwicGVuZGluZ0J1ZmZlclZpZXdzIiwiaXRlbVNpemUiLCJUeXBlZEFycmF5IiwiZWxlbWVudEJ5dGVzIiwiQllURVNfUEVSX0VMRU1FTlQiLCJpdGVtQnl0ZXMiLCJidWZmZXJBdHRyaWJ1dGUiLCJpYlNsaWNlIiwiZmxvb3IiLCJpYkNhY2hlS2V5IiwiaWIiLCJJbnRlcmxlYXZlZEJ1ZmZlciIsIkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlIiwiQnVmZmVyQXR0cmlidXRlIiwiaXRlbVNpemVJbmRpY2VzIiwiU0NBTEFSIiwiVHlwZWRBcnJheUluZGljZXMiLCJieXRlT2Zmc2V0SW5kaWNlcyIsImJ5dGVPZmZzZXRWYWx1ZXMiLCJzcGFyc2VJbmRpY2VzIiwic3BhcnNlVmFsdWVzIiwic2V0WCIsInNldFkiLCJzZXRaIiwic2V0VyIsInNhbXBsZXIiLCJVUkwiLCJ3ZWJraXRVUkwiLCJzb3VyY2VVUkkiLCJpc09iamVjdFVSTCIsImJsb2IiLCJCbG9iIiwibWltZVR5cGUiLCJjcmVhdGVPYmplY3RVUkwiLCJwcm9taXNlIiwiaXNJbWFnZUJpdG1hcExvYWRlciIsImltYWdlQml0bWFwIiwiVGV4dHVyZSIsInJldm9rZU9iamVjdFVSTCIsImZsaXBZIiwic2FtcGxlcnMiLCJtYWdGaWx0ZXIiLCJtaW5GaWx0ZXIiLCJ3cmFwUyIsIndyYXBUIiwibWFwTmFtZSIsIm1hcERlZiIsImdsdGZSZWZlcmVuY2UiLCJhc3NpZ25GaW5hbE1hdGVyaWFsIiwidXNlRGVyaXZhdGl2ZVRhbmdlbnRzIiwidGFuZ2VudCIsInVzZVZlcnRleENvbG9ycyIsInVzZUZsYXRTaGFkaW5nIiwibm9ybWFsIiwiaXNQb2ludHMiLCJwb2ludHNNYXRlcmlhbCIsIlBvaW50c01hdGVyaWFsIiwiTWF0ZXJpYWwiLCJzaXplQXR0ZW51YXRpb24iLCJpc0xpbmUiLCJsaW5lTWF0ZXJpYWwiLCJMaW5lQmFzaWNNYXRlcmlhbCIsImNhY2hlZE1hdGVyaWFsIiwidmVydGV4Q29sb3JzIiwiZmxhdFNoYWRpbmciLCJ5IiwidXYyIiwidXYiLCJzZXRBdHRyaWJ1dGUiLCJtYXRlcmlhbFR5cGUiLCJtYXRlcmlhbEV4dGVuc2lvbnMiLCJzZ0V4dGVuc2lvbiIsImttdUV4dGVuc2lvbiIsIm1ldGFsbGljRmFjdG9yIiwicm91Z2huZXNzRmFjdG9yIiwibWV0YWxsaWNSb3VnaG5lc3NUZXh0dXJlIiwiZG91YmxlU2lkZWQiLCJzaWRlIiwiRG91YmxlU2lkZSIsImFscGhhTW9kZSIsInRyYW5zcGFyZW50IiwiZGVwdGhXcml0ZSIsImZvcm1hdCIsIlJHQkZvcm1hdCIsImFscGhhVGVzdCIsImFscGhhQ3V0b2ZmIiwibm9ybWFsVGV4dHVyZSIsIm9jY2x1c2lvblRleHR1cmUiLCJzdHJlbmd0aCIsImVtaXNzaXZlRmFjdG9yIiwiZW1pc3NpdmVUZXh0dXJlIiwib3JpZ2luYWxOYW1lIiwic2FuaXRpemVkTmFtZSIsIlByb3BlcnR5QmluZGluZyIsImxvYWRHZW9tZXRyaWVzIiwicHJpbWl0aXZlcyIsImNyZWF0ZURyYWNvUHJpbWl0aXZlIiwiYWRkUHJpbWl0aXZlQXR0cmlidXRlcyIsImNhY2hlZCIsImdlb21ldHJ5UHJvbWlzZSIsIkJ1ZmZlckdlb21ldHJ5IiwibWVzaEluZGV4IiwiZGVwdGhUZXN0IiwiRnJvbnRTaWRlIiwicmVzdWx0cyIsImdlb21ldHJpZXMiLCJTa2lubmVkTWVzaCIsIk1lc2giLCJza2luV2VpZ2h0Iiwibm9ybWFsaXplU2tpbldlaWdodHMiLCJ0b1RyaWFuZ2xlc0RyYXdNb2RlIiwiVHJpYW5nbGVTdHJpcERyYXdNb2RlIiwiVHJpYW5nbGVGYW5EcmF3TW9kZSIsIkxpbmVTZWdtZW50cyIsIkxpbmUiLCJMaW5lTG9vcCIsIlBvaW50cyIsIm1vcnBoQXR0cmlidXRlcyIsImdyb3VwIiwiR3JvdXAiLCJjYW1lcmFJbmRleCIsImNhbWVyYURlZiIsIlBlcnNwZWN0aXZlQ2FtZXJhIiwiTWF0aFV0aWxzIiwieWZvdiIsImFzcGVjdFJhdGlvIiwiem5lYXIiLCJ6ZmFyIiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwieG1hZyIsInltYWciLCJza2luRGVmIiwic2tpbkVudHJ5IiwiaW52ZXJzZUJpbmRNYXRyaWNlcyIsImFjY2Vzc29yIiwiYW5pbWF0aW9uSW5kZXgiLCJhbmltYXRpb25EZWYiLCJwZW5kaW5nTm9kZXMiLCJwZW5kaW5nSW5wdXRBY2Nlc3NvcnMiLCJwZW5kaW5nT3V0cHV0QWNjZXNzb3JzIiwicGVuZGluZ1NhbXBsZXJzIiwicGVuZGluZ1RhcmdldHMiLCJjaGFubmVscyIsImNoYW5uZWwiLCJub2RlIiwiaWQiLCJpbnB1dCIsInBhcmFtZXRlcnMiLCJvdXRwdXQiLCJpbnB1dEFjY2Vzc29ycyIsIm91dHB1dEFjY2Vzc29ycyIsInRhcmdldHMiLCJ0cmFja3MiLCJpbnB1dEFjY2Vzc29yIiwib3V0cHV0QWNjZXNzb3IiLCJUeXBlZEtleWZyYW1lVHJhY2siLCJ1cGRhdGVNYXRyaXgiLCJOdW1iZXJLZXlmcmFtZVRyYWNrIiwiUXVhdGVybmlvbktleWZyYW1lVHJhY2siLCJWZWN0b3JLZXlmcmFtZVRyYWNrIiwidGFyZ2V0TmFtZSIsImludGVycG9sYXRpb24iLCJ0cmF2ZXJzZSIsImlzTWVzaCIsIm91dHB1dEFycmF5Iiwic2NhbGVkIiwiaiIsImpsIiwidHJhY2siLCJjcmVhdGVJbnRlcnBvbGFudCIsInRpbWVzIiwiZ2V0VmFsdWVTaXplIiwiaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUiLCJBbmltYXRpb25DbGlwIiwiY3JlYXRlTm9kZU1lc2giLCJub2RlTmFtZSIsIm1lc2hQcm9taXNlIiwiZm9yRWFjaCIsIkJvbmUiLCJPYmplY3QzRCIsIk1hdHJpeDQiLCJhcHBseU1hdHJpeDQiLCJxdWF0ZXJuaW9uIiwiaGFzIiwic2NlbmVJbmRleCIsInNjZW5lRGVmIiwibm9kZUlkcyIsImJ1aWxkTm9kZUhpZXJhcmNoeSIsInJlZHVjZWRBc3NvY2lhdGlvbnMiLCJyZWR1Y2VBc3NvY2lhdGlvbnMiLCJub2RlSWQiLCJwYXJlbnRPYmplY3QiLCJwZW5kaW5nSm9pbnRzIiwiam9pbnROb2RlcyIsImJvbmVzIiwiYm9uZUludmVyc2VzIiwiam9pbnROb2RlIiwibWF0IiwiYmluZCIsIlNrZWxldG9uIiwibWF0cml4V29ybGQiLCJhc3NpZ25BdHRyaWJ1dGVBY2Nlc3NvciIsImdsdGZBdHRyaWJ1dGVOYW1lIiwic2V0SW5kZXgiLCJib3giLCJCb3gzIiwibWluIiwibWF4IiwiVmVjdG9yMyIsImJveFNjYWxlIiwibXVsdGlwbHlTY2FsYXIiLCJtYXhEaXNwbGFjZW1lbnQiLCJ2ZWN0b3IiLCJhYnMiLCJleHBhbmRCeVZlY3RvciIsImJvdW5kaW5nQm94Iiwic3BoZXJlIiwiU3BoZXJlIiwiZ2V0Q2VudGVyIiwiY2VudGVyIiwicmFkaXVzIiwiZGlzdGFuY2VUbyIsImJvdW5kaW5nU3BoZXJlIiwiY29tcHV0ZUJvdW5kcyIsImhhc01vcnBoUG9zaXRpb24iLCJoYXNNb3JwaE5vcm1hbCIsInBlbmRpbmdQb3NpdGlvbkFjY2Vzc29ycyIsInBlbmRpbmdOb3JtYWxBY2Nlc3NvcnMiLCJwZW5kaW5nQWNjZXNzb3IiLCJtb3JwaFBvc2l0aW9ucyIsIm1vcnBoTm9ybWFscyIsIm1vcnBoVGFyZ2V0c1JlbGF0aXZlIiwiYWRkTW9ycGhUYXJnZXRzIiwiZHJhd01vZGUiLCJnZXRJbmRleCIsImdldEF0dHJpYnV0ZSIsIm51bWJlck9mVHJpYW5nbGVzIiwibmV3SW5kaWNlcyIsImdldFgiLCJuZXdHZW9tZXRyeSIsIkxvd1Bhc3NGaWx0ZXIiLCJzZXRBbHBoYSIsInMiLCJ0aW1lc3RhbXAiLCJPbmVFdXJvRmlsdGVyIiwiZnJlcSIsIm1pbkN1dE9mZiIsImJldGEiLCJkQ3V0T2ZmIiwieCIsImR4IiwibGFzdHRpbWUiLCJjdXJyVmFsdWUiLCJwcmV2VmFsdWUiLCJjdXRPZmYiLCJ0ZSIsIl9mcmVxIiwiX21pbmN1dG9mZiIsIl9iZXRhIiwiX2RjdXRvZmYiLCJwcmV2WCIsImxhc3RWYWx1ZSIsImVkeCIsIk9uZUV1cm9GaWx0ZXJWZWN0b3IzIiwib25lRXVyb0ZpbHRlcnMiLCJVcGRhdGVQYXJhbXMiLCJfdmFsdWUiLCJvdXQiLCJmaWx0ZXJzIiwiaWR4IiwiRmlsdGVyIiwiYXJyIiwiRGVsYXlhYmxlU2lnbmFsRmlsdGVyIiwidGltZU91dCIsIl90aW1lT3V0IiwiX2luRGVsYXkiLCJ0aWNrIiwidGltZSIsIkRhdGUiLCJub3ciLCJfcHJldlRpbWUiLCJfdG90YWxUaW1lIiwiQVJuZnRGaWx0ZXIiLCJfaGFzRm91bmQiLCJfZnJhbWVEcm9wcyIsIl9kZWx0YUFjY3VyYWN5IiwiZmlsdGVyRnJlcXVlbmN5IiwiZmlsdGVyTWluQ3V0b2ZmIiwiZmlsdGVyQmV0YSIsImZpbHRlckRjdXRvZmYiLCJkZWxheUVudGVyQ2hlY2siLCJkZWxheUV4aXRDaGVjayIsIl9wb3NpdGlvbkZpbHRlciIsIl9yb3RhdGlvbkZpbHRlciIsInBvcyIsInJvdGF0aW9uVmVjIiwid29ybGRNYXRyaXgiLCJnZXRBcnJheU1hdHJpeCIsIl9jdXJyZW50VHJhbnNsYXRpb24iLCJzZXRGcm9tTWF0cml4UG9zaXRpb24iLCJfbGFzdFRyYW5zbGF0aW9uIiwidmVjVHJhbnMiLCJldWxlclJvdCIsIkV1bGVyIiwiZGVjb21wb3NlIiwiZVJvdCIsInNldEZyb21RdWF0ZXJuaW9uIiwidG9WZWN0b3IzIiwiTkZUYWRkVEpTIiwiZW50aXRpZXMiLCJnZXRHbG9iYWxTY2VuZSIsIm5hbWVzIiwiX2ZpbHRlciIsIl9vZWYiLCJvYmpWaXNpYmlsaXR5IiwibXNnIiwiZHBpIiwid2lkdGgiLCJ2aXNpYmxlIiwidXBkYXRlIiwibWF0cml4R0xfUkgiLCJ6Iiwic2V0RnJvbVZlY3RvcjMiLCJpbnRlcnBvbGF0ZSIsIm1vZGVsIiwiaW1hZ2VVcmwiLCJjb25maWdzIiwicGxhbmVHZW9tIiwiUGxhbmVHZW9tZXRyeSIsInciLCJoIiwid3MiLCJocyIsInBsYW5lIiwiQVJWaWRlbyIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJWaWRlb1RleHR1cmUiLCJwbGF5IiwiZW5hYmxlIl0sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file diff --git a/package.json b/package.json index a791b6a..7f6dc89 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@webarkit/arnft-threejs", - "version": "0.4.0", + "version": "0.4.5", "description": "The ARnft rendering engine, based on Three.js", "main": "dist/ARnftThreejs.js", "types": "types/index.d.ts", @@ -32,21 +32,21 @@ }, "homepage": "https://github.com/webarkit/ARnft-threejs#readme", "devDependencies": { - "@babel/core": "^7.15.8", - "@babel/plugin-transform-runtime": "^7.15.8", - "@babel/preset-env": "^7.15.8", + "@babel/core": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", "@types/node": "^15.6.0", - "@types/three": "^0.133.0", + "@types/three": "^0.134.0", "babel-loader": "^8.2.2", "prettier": "^2.4.1", "ts-loader": "^9.2.6", - "typedoc": "^0.22.5", + "typedoc": "^0.22.9", "typescript": "^4.2.4", - "webpack": "^5.58.1", - "webpack-cli": "^4.9.0" + "webpack": "^5.64.1", + "webpack-cli": "^4.9.1" }, "dependencies": { - "@babel/runtime": "^7.15.4", - "three": "^0.133.0" + "@babel/runtime": "^7.16.3", + "three": "^0.134.0" } } diff --git a/src/SceneRendererTJS.ts b/src/SceneRendererTJS.ts index 7172d32..77fe471 100644 --- a/src/SceneRendererTJS.ts +++ b/src/SceneRendererTJS.ts @@ -80,7 +80,7 @@ export default class SceneRendererTJS { } else { this.camera = new THREE.Camera(); } - this.version = "0.4.0"; + this.version = "0.4.5"; console.log("ARnftThreejs version: ", this.version); } diff --git a/src/filters/ARnftFilter.ts b/src/filters/ARnftFilter.ts new file mode 100644 index 0000000..a4a3b08 --- /dev/null +++ b/src/filters/ARnftFilter.ts @@ -0,0 +1,100 @@ +import { OneEuroFilterVector3 } from "./OneEuroFilter"; +import { DelayableSignalFilter } from "./DelayableSignalFilter"; +import { Euler, Matrix4, Quaternion, Vector3 } from "three"; + +export class ARnftFilter { + private delayExitCheck: DelayableSignalFilter; + + private delayEnterCheck: DelayableSignalFilter; + + private _hasFound: boolean = false; + + // private _interpolationFactor: number = 15; + + private _lastTranslation: Vector3; + + private _frameDrops: number = 0; + + private _deltaAccuracy: number = 10; + + private _positionFilter: OneEuroFilterVector3; + + private _rotationFilter: OneEuroFilterVector3; + + public filterFrequency: number = 30.0; + public filterMinCutoff: number = 1.0; + public filterBeta: number = 0.0; + public filterDcutoff: number = 1.0; + + constructor() { + this.delayEnterCheck = new DelayableSignalFilter(2); + this.delayExitCheck = new DelayableSignalFilter(0); + + this._positionFilter = new OneEuroFilterVector3(this.filterFrequency); + this._rotationFilter = new OneEuroFilterVector3(this.filterFrequency * 2); + } + + public update(world: any): Vector3[] { + let pos: Vector3 = new Vector3(); + let rotationVec: Vector3 = new Vector3(); + let scale: Vector3 = new Vector3(); + if (!world) { + this._hasFound = false; + this._frameDrops = 0; + } else { + let matrixW: Matrix4 = new Matrix4(); + let worldMatrix: Matrix4 = matrixW.fromArray(this.getArrayMatrix(world)); + if (!this._hasFound) { + this._hasFound = true; + let vecTrans: Vector3 = new Vector3(); + this._lastTranslation = vecTrans.setFromMatrixPosition(worldMatrix); + } else { + let vecTrans: Vector3 = new Vector3(); + let _currentTranslation: Vector3 = vecTrans.setFromMatrixPosition(worldMatrix); + if (Math.abs(_currentTranslation.distanceTo(this._lastTranslation)) > this._deltaAccuracy) { + this._frameDrops += 1; + if (this._frameDrops > 3) { + this._lastTranslation = _currentTranslation; + } + return [pos, rotationVec, scale]; + } + this._frameDrops = 0; + this._lastTranslation = _currentTranslation; + } + this._positionFilter.UpdateParams( + this.filterFrequency, + this.filterMinCutoff, + this.filterBeta, + this.filterDcutoff + ); + this._rotationFilter.UpdateParams( + this.filterFrequency * 2, + this.filterMinCutoff, + this.filterBeta, + this.filterDcutoff + ); + let matrix: Matrix4 = new Matrix4(); + + matrix = worldMatrix; + + let rotation: Quaternion = new Quaternion(); + let eulerRot: Euler = new Euler(); + let position: Vector3 = new Vector3(0, 0, 0); + + // or even simple decompose the worldMatrix into position, quaternion and scale with decompose + worldMatrix.decompose(position, rotation, scale); + let eRot = eulerRot.setFromQuaternion(rotation); + rotationVec = this._rotationFilter.Filter(eRot.toVector3()); + + pos = this._positionFilter.Filter(position); + } + return [pos, rotationVec, scale]; + } + protected getArrayMatrix(value: any): any { + var array: any = []; + for (var key in value) { + array[key] = value[key]; //.toFixed(4); + } + return array; + } +} diff --git a/src/filters/DelayableSignalFilter.ts b/src/filters/DelayableSignalFilter.ts new file mode 100644 index 0000000..fdffa42 --- /dev/null +++ b/src/filters/DelayableSignalFilter.ts @@ -0,0 +1,38 @@ +import { getTime } from "../utils/Utils"; + +export class DelayableSignalFilter { + private _inDelay: boolean; + private _totalTime: number; + private _prevTime: number; + + private _timeOut: number; + + constructor(timeOut: number) { + this._timeOut = timeOut; + this._inDelay = false; + } + + public Update(tick: boolean): boolean { + let time: number = getTime(); + + if (!this._inDelay) { + this._prevTime = time; + this._totalTime = 0; + } + + this._totalTime += time - this._prevTime; + + if (this._inDelay && this._totalTime > this._timeOut) { + this._inDelay = false; + return true; + } + + if (tick) { + this._inDelay = true; + return false; + } + this._inDelay = false; + + return false; + } +} diff --git a/src/filters/OneEuroFilter.ts b/src/filters/OneEuroFilter.ts new file mode 100644 index 0000000..388ebe9 --- /dev/null +++ b/src/filters/OneEuroFilter.ts @@ -0,0 +1,188 @@ +import { Vector3 } from "three"; + +//https://github.com/DarioMazzanti/OneEuroFilterUnity/blob/master/Assets/Scripts/OneEuroFilter.cs +//https://github.com/DarioMazzanti/OneEuroFilterUnity/blob/master/Assets/Scripts/FilterTestVector3.cs +//https://gist.github.com/ThorstenBux/323183bb0bc2ccb92ff23ebdf3de6408 + +/* eslint-disable max-classes-per-file */ +class LowPassFilter { + y: number | null; + + s: number | null; + + alpha = 0; + + constructor(alpha: number) { + this.setAlpha(alpha); + this.y = null; + this.s = null; + } + + setAlpha(alpha: number) { + if (alpha <= 0 || alpha > 1.0) { + throw new Error(); + } + this.alpha = alpha; + } + + filter(value: number, timestamp: number, alpha: number) { + if (alpha) { + this.setAlpha(alpha); + } + let s; + if (!this.y) { + s = value; + } else { + s = this.alpha * value + (1.0 - this.alpha) * this.s!; + } + this.y = value; + this.s = s; + return s; + } + + lastValue() { + return this.y; + } +} + +export default class OneEuroFilter { + freq: number; + + minCutOff: number; + + beta: number; + + dCutOff: number; + + x: LowPassFilter; + + dx: LowPassFilter; + + lasttime: number | null; + + public currValue: number; + public prevValue: number; + + constructor(freq: number, minCutOff = 1.0, beta = 0.0, dCutOff = 1.0) { + if (freq <= 0 || minCutOff <= 0 || dCutOff <= 0) { + throw new Error(); + } + this.freq = freq; + this.minCutOff = minCutOff; + this.beta = beta; + this.dCutOff = dCutOff; + this.x = new LowPassFilter(this.alpha(this.minCutOff)); + this.dx = new LowPassFilter(this.alpha(this.dCutOff)); + this.lasttime = null; + + this.currValue = 0.0; + this.prevValue = this.currValue; + } + + public alpha(cutOff: number) { + const te = 1.0 / this.freq; + const tau = 1.0 / (2 * Math.PI * cutOff); + return 1.0 / (1.0 + tau / te); + } + + public UpdateParams(_freq: number, _mincutoff: number = 1.0, _beta: number = 0, _dcutoff: number = 1): void { + this.freq = _freq; + this.minCutOff = _mincutoff; + this.beta = _beta; + this.dCutOff = _dcutoff; + this.x.setAlpha(this.alpha(this.minCutOff)); + this.dx.setAlpha(this.alpha(this.dCutOff)); + } + + public Filter(x: number, timestamp: number | null = null): number { + this.prevValue = this.currValue; + if (this.lasttime && timestamp) { + this.freq = 1.0 / (timestamp - this.lasttime); + } + this.lasttime = timestamp; + const prevX = this.x.lastValue(); + const dx = !prevX ? 0.0 : (x - prevX) * this.freq; + const edx = this.dx.filter(dx, timestamp!, this.alpha(this.dCutOff)); + const cutOff = this.minCutOff + this.beta * Math.abs(edx); + return (this.currValue = this.x.filter(x, timestamp!, this.alpha(cutOff))); + } +} + +export class OneEuroFilterVector3 { + // containst the type of T + // the array of filters + private oneEuroFilters: Array; + + private _freq: number; + public get freq(): number { + return this._freq; + } + + private _beta: number; + public get beta(): number { + return this._beta; + } + + private _dcutoff: number; + public get dcutoff(): number { + return this._dcutoff; + } + private _mincutoff: number; + public get mincutoff_1(): number { + return this._mincutoff; + } + + // currValue contains the latest value which have been succesfully filtered + // prevValue contains the previous filtered value + + private currValue: Vector3; + private prevValue: Vector3; + + // initialization of our filter(s) + constructor(_freq: number, _mincutoff: number = 1, _beta: number = 0, _dcutoff: number = 1) { + this.currValue = new Vector3(); + this.prevValue = new Vector3(); + + this._freq = _freq; + this._mincutoff = _mincutoff; + this._beta = _beta; + this._dcutoff = _dcutoff; + + this.oneEuroFilters = []; + this.oneEuroFilters.push(new OneEuroFilter(_freq, _mincutoff, _beta, _dcutoff)); + this.oneEuroFilters.push(new OneEuroFilter(_freq, _mincutoff, _beta, _dcutoff)); + this.oneEuroFilters.push(new OneEuroFilter(_freq, _mincutoff, _beta, _dcutoff)); + } + + // updates the filter parameters + public UpdateParams(_freq: number, _mincutoff: number = 1.0, _beta: number = 0, _dcutoff: number = 1): void { + this._freq = _freq; + this._mincutoff = _mincutoff; + this._beta = _beta; + this._dcutoff = _dcutoff; + + for (let i: number = 0; i < this.oneEuroFilters.length; i++) + this.oneEuroFilters[i].UpdateParams(this._freq, this._mincutoff, this._beta, this._dcutoff); + } + + // filters the provided _value and returns the result. + // Note: a timestamp can also be provided - will override filter frequency. + public Filter(_value: Vector3, timestamp: number = -1.0): Vector3 { + this.prevValue = this.currValue; + + //let output: number[] = Vector3.ZeroReadOnly.asArray(); // Babylon code... + let out: Vector3 = new Vector3(); + let output: number[] = out.toArray(); + + //let input: number[] = _value.asArray(); // Babylon code + let input: number[] = _value.toArray(); + + this.oneEuroFilters.forEach((filters, idx) => { + output[idx] = filters.Filter(input[idx], timestamp); + }); + + let arr: Vector3 = new Vector3(); + + return (this.currValue = arr.fromArray(output)); + } +} diff --git a/src/markermedia/NFTaddTJS.ts b/src/markermedia/NFTaddTJS.ts index 51c677e..7ff4214 100644 --- a/src/markermedia/NFTaddTJS.ts +++ b/src/markermedia/NFTaddTJS.ts @@ -1,6 +1,16 @@ -import { Object3D, PlaneGeometry, Scene, TextureLoader, VideoTexture, Mesh, MeshStandardMaterial } from "three"; +import { + Object3D, + PlaneGeometry, + Scene, + TextureLoader, + VideoTexture, + Mesh, + MeshStandardMaterial, + Vector3, +} from "three"; import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader"; import { Utils } from "../utils/Utils"; +import { ARnftFilter } from "../filters/ARnftFilter"; import SceneRendererTJS from "../SceneRendererTJS"; /** @@ -42,6 +52,8 @@ export default class NFTaddTJS { private scene: Scene; private target: EventTarget; private uuid: string; + private _filter: ARnftFilter; + private _oef: boolean; /** * The NFTaddTJS constuctor, you need to pass the uuid from the ARnft instance. @@ -52,6 +64,8 @@ export default class NFTaddTJS { this.target = window || global; this.uuid = uuid; this.names = []; + this._filter = new ARnftFilter(); + this._oef = false; } /** @@ -68,14 +82,26 @@ export default class NFTaddTJS { }); const root = new Object3D(); root.name = "root-" + name; - root.matrixAutoUpdate = false; this.scene.add(root); root.add(mesh); this.target.addEventListener("getMatrixGL_RH-" + this.uuid + "-" + name, (ev: any) => { root.visible = true; mesh.visible = true; - const matrix = Utils.interpolate(ev.detail.matrixGL_RH); - Utils.setMatrix(root.matrix, matrix); + if (this._oef === true) { + let filter = [new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)]; + filter = this._filter.update(ev.detail.matrixGL_RH); + root.position.setX(filter[0].x); + root.position.setY(filter[0].y); + root.position.setZ(filter[0].z); + root.rotation.setFromVector3(filter[1]); + root.scale.setX(filter[2].x); + root.scale.setY(filter[2].y); + root.scale.setZ(filter[2].z); + } else { + root.matrixAutoUpdate = false; + const matrix = Utils.interpolate(ev.detail.matrixGL_RH); + Utils.setMatrix(root.matrix, matrix); + } }); this.target.addEventListener("nftTrackingLost-" + this.uuid + "-" + name, (ev: any) => { root.visible = objVisibility; @@ -95,7 +121,6 @@ export default class NFTaddTJS { public addModel(url: string, name: string, scale: number, objVisibility: boolean) { const root = new Object3D(); root.name = "root-" + name; - root.matrixAutoUpdate = false; this.scene.add(root); let model: any; /* Load Model */ @@ -114,8 +139,21 @@ export default class NFTaddTJS { this.target.addEventListener("getMatrixGL_RH-" + this.uuid + "-" + name, (ev: any) => { root.visible = true; model.visible = true; - const matrix = Utils.interpolate(ev.detail.matrixGL_RH); - Utils.setMatrix(root.matrix, matrix); + if (this._oef === true) { + let filter = [new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)]; + filter = this._filter.update(ev.detail.matrixGL_RH); + root.position.setX(filter[0].x); + root.position.setY(filter[0].y); + root.position.setZ(filter[0].z); + root.rotation.setFromVector3(filter[1]); + root.scale.setX(filter[2].x); + root.scale.setY(filter[2].y); + root.scale.setZ(filter[2].z); + } else { + root.matrixAutoUpdate = false; + const matrix = Utils.interpolate(ev.detail.matrixGL_RH); + Utils.setMatrix(root.matrix, matrix); + } }); this.target.addEventListener("nftTrackingLost-" + this.uuid + "-" + name, (ev: any) => { root.visible = objVisibility; @@ -132,10 +170,9 @@ export default class NFTaddTJS { * @param callback modify the model in the callback. * @param objVisibility set true or false if the mesh wll stay visible or not after tracking. */ - public addModelWithCallback(url: string, name: string, callback: (gltf: any) =>{} , objVisibility: boolean) { + public addModelWithCallback(url: string, name: string, callback: (gltf: any) => {}, objVisibility: boolean) { const root = new Object3D(); root.name = "root-" + name; - root.matrixAutoUpdate = false; this.scene.add(root); let model: any; /* Load Model */ @@ -153,8 +190,21 @@ export default class NFTaddTJS { this.target.addEventListener("getMatrixGL_RH-" + this.uuid + "-" + name, (ev: any) => { root.visible = true; model.visible = true; - const matrix = Utils.interpolate(ev.detail.matrixGL_RH); - Utils.setMatrix(root.matrix, matrix); + if (this._oef === true) { + let filter = [new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)]; + filter = this._filter.update(ev.detail.matrixGL_RH); + root.position.setX(filter[0].x); + root.position.setY(filter[0].y); + root.position.setZ(filter[0].z); + root.rotation.setFromVector3(filter[1]); + root.scale.setX(filter[2].x); + root.scale.setY(filter[2].y); + root.scale.setZ(filter[2].z); + } else { + root.matrixAutoUpdate = false; + const matrix = Utils.interpolate(ev.detail.matrixGL_RH); + Utils.setMatrix(root.matrix, matrix); + } }); this.target.addEventListener("nftTrackingLost-" + this.uuid + "-" + name, (ev: any) => { root.visible = objVisibility; @@ -182,7 +232,6 @@ export default class NFTaddTJS { ) { const root = new Object3D(); root.name = "root-" + name; - root.matrixAutoUpdate = false; this.scene.add(root); const planeGeom = new PlaneGeometry(configs.w, configs.h, configs.ws, configs.hs); const texture = new TextureLoader().load(imageUrl); @@ -198,8 +247,21 @@ export default class NFTaddTJS { this.target.addEventListener("getMatrixGL_RH-" + this.uuid + "-" + name, (ev: any) => { root.visible = true; plane.visible = true; - const matrix = Utils.interpolate(ev.detail.matrixGL_RH); - Utils.setMatrix(root.matrix, matrix); + if (this._oef === true) { + let filter = [new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)]; + filter = this._filter.update(ev.detail.matrixGL_RH); + root.position.setX(filter[0].x); + root.position.setY(filter[0].y); + root.position.setZ(filter[0].z); + root.rotation.setFromVector3(filter[1]); + root.scale.setX(filter[2].x); + root.scale.setY(filter[2].y); + root.scale.setZ(filter[2].z); + } else { + root.matrixAutoUpdate = false; + const matrix = Utils.interpolate(ev.detail.matrixGL_RH); + Utils.setMatrix(root.matrix, matrix); + } }); this.target.addEventListener("nftTrackingLost-" + this.uuid + "-" + name, (ev: any) => { root.visible = objVisibility; @@ -219,7 +281,6 @@ export default class NFTaddTJS { public addVideo(id: string, name: string, scale: number, configs: IPlaneConfig, objVisibility: boolean) { const root = new Object3D(); root.name = "root-" + name; - root.matrixAutoUpdate = false; this.scene.add(root); const ARVideo: HTMLVideoElement = document.getElementById(id) as HTMLVideoElement; const texture = new VideoTexture(ARVideo as HTMLVideoElement); @@ -237,8 +298,21 @@ export default class NFTaddTJS { this.target.addEventListener("getMatrixGL_RH-" + this.uuid + "-" + name, (ev: any) => { root.visible = true; plane.visible = true; - const matrix = Utils.interpolate(ev.detail.matrixGL_RH); - Utils.setMatrix(root.matrix, matrix); + if (this._oef === true) { + let filter = [new Vector3(0, 0, 0), new Vector3(0, 0, 0), new Vector3(0, 0, 0)]; + filter = this._filter.update(ev.detail.matrixGL_RH); + root.position.setX(filter[0].x); + root.position.setY(filter[0].y); + root.position.setZ(filter[0].z); + root.rotation.setFromVector3(filter[1]); + root.scale.setX(filter[2].x); + root.scale.setY(filter[2].y); + root.scale.setZ(filter[2].z); + } else { + root.matrixAutoUpdate = false; + const matrix = Utils.interpolate(ev.detail.matrixGL_RH); + Utils.setMatrix(root.matrix, matrix); + } }); this.target.addEventListener("nftTrackingLost-" + this.uuid + "-" + name, (ev: any) => { root.visible = objVisibility; @@ -247,7 +321,26 @@ export default class NFTaddTJS { this.names.push(name); } + /** + * You can get the names of the entities used in your project. + * @returns the names of the entities + */ public getNames() { return this.names; } + + /** + * Enable or not the OneEuroFilter routine. + */ + public set oef(enable: boolean) { + this._oef = enable; + } + + /** + * Check if OneEuroFilter is enabled or not. + * @returns (boolean) true or false + */ + public get oef() { + return this._oef; + } } diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 45511f9..6678a29 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,3 +1,6 @@ +export function getTime(): number { + return Math.floor(Date.now() / 1000); +} export class Utils { private static trackedMatrix: any = { // for interpolation diff --git a/types/filters/ARnftFilter.d.ts b/types/filters/ARnftFilter.d.ts new file mode 100644 index 0000000..fd4b590 --- /dev/null +++ b/types/filters/ARnftFilter.d.ts @@ -0,0 +1,18 @@ +import { Vector3 } from "three"; +export declare class ARnftFilter { + private delayExitCheck; + private delayEnterCheck; + private _hasFound; + private _lastTranslation; + private _frameDrops; + private _deltaAccuracy; + private _positionFilter; + private _rotationFilter; + filterFrequency: number; + filterMinCutoff: number; + filterBeta: number; + filterDcutoff: number; + constructor(); + update(world: any): Vector3[]; + protected getArrayMatrix(value: any): any; +} diff --git a/types/filters/DelayableSignalFilter.d.ts b/types/filters/DelayableSignalFilter.d.ts new file mode 100644 index 0000000..d33eb15 --- /dev/null +++ b/types/filters/DelayableSignalFilter.d.ts @@ -0,0 +1,8 @@ +export declare class DelayableSignalFilter { + private _inDelay; + private _totalTime; + private _prevTime; + private _timeOut; + constructor(timeOut: number); + Update(tick: boolean): boolean; +} diff --git a/types/filters/OneEuroFilter.d.ts b/types/filters/OneEuroFilter.d.ts new file mode 100644 index 0000000..139fa50 --- /dev/null +++ b/types/filters/OneEuroFilter.d.ts @@ -0,0 +1,42 @@ +import { Vector3 } from "three"; +declare class LowPassFilter { + y: number | null; + s: number | null; + alpha: number; + constructor(alpha: number); + setAlpha(alpha: number): void; + filter(value: number, timestamp: number, alpha: number): number; + lastValue(): number; +} +export default class OneEuroFilter { + freq: number; + minCutOff: number; + beta: number; + dCutOff: number; + x: LowPassFilter; + dx: LowPassFilter; + lasttime: number | null; + currValue: number; + prevValue: number; + constructor(freq: number, minCutOff?: number, beta?: number, dCutOff?: number); + alpha(cutOff: number): number; + UpdateParams(_freq: number, _mincutoff?: number, _beta?: number, _dcutoff?: number): void; + Filter(x: number, timestamp?: number | null): number; +} +export declare class OneEuroFilterVector3 { + private oneEuroFilters; + private _freq; + get freq(): number; + private _beta; + get beta(): number; + private _dcutoff; + get dcutoff(): number; + private _mincutoff; + get mincutoff_1(): number; + private currValue; + private prevValue; + constructor(_freq: number, _mincutoff?: number, _beta?: number, _dcutoff?: number); + UpdateParams(_freq: number, _mincutoff?: number, _beta?: number, _dcutoff?: number): void; + Filter(_value: Vector3, timestamp?: number): Vector3; +} +export {}; diff --git a/types/markermedia/NFTaddTJS.d.ts b/types/markermedia/NFTaddTJS.d.ts index bf2b2f9..409b616 100644 --- a/types/markermedia/NFTaddTJS.d.ts +++ b/types/markermedia/NFTaddTJS.d.ts @@ -11,6 +11,8 @@ export default class NFTaddTJS { private scene; private target; private uuid; + private _filter; + private _oef; constructor(uuid: string); add(mesh: Object3D, name: string, objVisibility: boolean): void; addModel(url: string, name: string, scale: number, objVisibility: boolean): void; @@ -18,5 +20,7 @@ export default class NFTaddTJS { addImage(imageUrl: string, name: string, color: string, scale: number, configs: IPlaneConfig, objVisibility: boolean): void; addVideo(id: string, name: string, scale: number, configs: IPlaneConfig, objVisibility: boolean): void; getNames(): string[]; + set oef(enable: boolean); + get oef(): boolean; } export {}; diff --git a/types/utils/Utils.d.ts b/types/utils/Utils.d.ts index c6cd46a..fd5f9cf 100644 --- a/types/utils/Utils.d.ts +++ b/types/utils/Utils.d.ts @@ -1,3 +1,4 @@ +export declare function getTime(): number; export declare class Utils { private static trackedMatrix; static interpolate(world: any): any; diff --git a/yarn.lock b/yarn.lock index ec1214b..831a9cd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,42 +4,42 @@ "@babel/code-frame@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz" integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: "@babel/highlight" "^7.12.13" -"@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" - integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== +"@babel/code-frame@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" + integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== dependencies: - "@babel/highlight" "^7.14.5" + "@babel/highlight" "^7.16.0" "@babel/compat-data@^7.13.11", "@babel/compat-data@^7.13.15": version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz" integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== -"@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/core@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" - integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== - dependencies: - "@babel/code-frame" "^7.15.8" - "@babel/generator" "^7.15.8" - "@babel/helper-compilation-targets" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.8" - "@babel/helpers" "^7.15.4" - "@babel/parser" "^7.15.8" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" +"@babel/compat-data@^7.16.0", "@babel/compat-data@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e" + integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q== + +"@babel/core@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" + integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" + "@babel/helpers" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -49,47 +49,47 @@ "@babel/generator@^7.14.2": version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz" integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: "@babel/types" "^7.14.2" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/generator@^7.15.4", "@babel/generator@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" - integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== +"@babel/generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" + integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== dependencies: - "@babel/types" "^7.15.6" + "@babel/types" "^7.16.0" jsesc "^2.5.1" source-map "^0.5.0" "@babel/helper-annotate-as-pure@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz" integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== dependencies: "@babel/types" "^7.12.13" -"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" - integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" - integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" + integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ== dependencies: - "@babel/helper-explode-assignable-expression" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-explode-assignable-expression" "^7.16.0" + "@babel/types" "^7.16.0" "@babel/helper-compilation-targets@^7.13.0": version "7.13.16" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz" integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== dependencies: "@babel/compat-data" "^7.13.15" @@ -97,48 +97,48 @@ browserslist "^4.14.5" semver "^6.3.0" -"@babel/helper-compilation-targets@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" - integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== +"@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0" + integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA== dependencies: - "@babel/compat-data" "^7.15.0" + "@babel/compat-data" "^7.16.0" "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" + browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" - integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" "@babel/helper-create-regexp-features-plugin@^7.12.13": version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz#149aa6d78c016e318c43e2409a0ae9c136a86688" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.3.tgz" integrity sha512-JIB2+XJrb7v3zceV2XzDhGIB902CmKGSpSl4q2C6agU9SNLG/2V1RtFRGPG1Ajh9STj3+q6zJMOC+N/pp2P9DA== dependencies: "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-create-regexp-features-plugin@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" - integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== +"@babel/helper-create-regexp-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff" + integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA== dependencies: - "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-annotate-as-pure" "^7.16.0" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" - integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== +"@babel/helper-define-polyfill-provider@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971" + integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -149,358 +149,365 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" - integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== +"@babel/helper-explode-assignable-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778" + integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" "@babel/helper-function-name@^7.14.2": version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz" integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== dependencies: "@babel/helper-get-function-arity" "^7.12.13" "@babel/template" "^7.12.13" "@babel/types" "^7.14.2" -"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" - integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== +"@babel/helper-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481" + integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog== dependencies: - "@babel/helper-get-function-arity" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-get-function-arity" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/types" "^7.16.0" "@babel/helper-get-function-arity@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz" integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== dependencies: "@babel/types" "^7.12.13" -"@babel/helper-get-function-arity@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" - integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== +"@babel/helper-get-function-arity@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa" + integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-hoist-variables@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" - integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== +"@babel/helper-hoist-variables@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a" + integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-member-expression-to-functions@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" - integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== +"@babel/helper-member-expression-to-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4" + integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" "@babel/helper-module-imports@^7.12.13": version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz" integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" - integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== +"@babel/helper-module-imports@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3" + integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" - integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== +"@babel/helper-module-transforms@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" + integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== dependencies: - "@babel/helper-module-imports" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-simple-access" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-simple-access" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.6" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-optimise-call-expression@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" - integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== +"@babel/helper-optimise-call-expression@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338" + integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== "@babel/helper-plugin-utils@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== -"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" - integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== +"@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz#5d7902f61349ff6b963e07f06a389ce139fbfe6e" + integrity sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-wrap-function" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-wrap-function" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" - integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== +"@babel/helper-replace-supers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17" + integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA== dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helper-simple-access@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" - integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== +"@babel/helper-simple-access@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517" + integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" -"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" - integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== +"@babel/helper-skip-transparent-expression-wrappers@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09" + integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz" integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== dependencies: "@babel/types" "^7.12.13" -"@babel/helper-split-export-declaration@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" - integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== +"@babel/helper-split-export-declaration@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438" + integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw== dependencies: - "@babel/types" "^7.15.4" + "@babel/types" "^7.16.0" "@babel/helper-validator-identifier@^7.14.0": version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz" integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== -"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": +"@babel/helper-validator-identifier@^7.15.7": version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== "@babel/helper-validator-option@^7.12.17": version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== "@babel/helper-validator-option@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz" integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== -"@babel/helper-wrap-function@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" - integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== +"@babel/helper-wrap-function@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c" + integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g== dependencies: - "@babel/helper-function-name" "^7.15.4" - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/helper-function-name" "^7.16.0" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.0" + "@babel/types" "^7.16.0" -"@babel/helpers@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" - integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== +"@babel/helpers@^7.16.0": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" + integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== dependencies: - "@babel/template" "^7.15.4" - "@babel/traverse" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/template" "^7.16.0" + "@babel/traverse" "^7.16.3" + "@babel/types" "^7.16.0" "@babel/highlight@^7.12.13": version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz" integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== +"@babel/highlight@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" + integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== dependencies: - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/helper-validator-identifier" "^7.15.7" chalk "^2.0.0" js-tokens "^4.0.0" "@babel/parser@^7.12.13", "@babel/parser@^7.14.2": version "7.14.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.3.tgz#9b530eecb071fd0c93519df25c5ff9f14759f298" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.14.3.tgz" integrity sha512-7MpZDIfI7sUC5zWo2+foJ50CSI5lcqDehZ0lVgIhSi4bFEk94fLAKlF3Q0nzSQQ+ca0lm+O6G9ztKVBeu8PMRQ== -"@babel/parser@^7.15.4", "@babel/parser@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" - integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== +"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": + version "7.16.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183" + integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" - integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2" + integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" -"@babel/plugin-proposal-async-generator-functions@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz#a3100f785fab4357987c4223ab1b02b599048403" - integrity sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA== +"@babel/plugin-proposal-async-generator-functions@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz#e606eb6015fec6fa5978c940f315eae4e300b081" + integrity sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.15.4" + "@babel/helper-remap-async-to-generator" "^7.16.4" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a" + integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-class-static-block@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" - integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== +"@babel/plugin-proposal-class-static-block@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7" + integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-proposal-dynamic-import@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" - integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== +"@babel/plugin-proposal-dynamic-import@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1" + integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" - integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== +"@babel/plugin-proposal-export-namespace-from@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222" + integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" - integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== +"@babel/plugin-proposal-json-strings@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25" + integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" - integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== +"@babel/plugin-proposal-logical-assignment-operators@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd" + integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" - integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596" + integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" - integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734" + integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.15.6": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" - integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== +"@babel/plugin-proposal-object-rest-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6" + integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" + "@babel/compat-data" "^7.16.0" + "@babel/helper-compilation-targets" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-parameters" "^7.16.0" -"@babel/plugin-proposal-optional-catch-binding@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" - integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== +"@babel/plugin-proposal-optional-catch-binding@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16" + integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" - integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0" + integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" - integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6" + integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-private-property-in-object@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" - integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== +"@babel/plugin-proposal-private-property-in-object@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f" + integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" - integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== +"@babel/plugin-proposal-unicode-property-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612" + integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-proposal-unicode-property-regex@^7.4.4": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz" integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.13" @@ -508,395 +515,396 @@ "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" - integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== +"@babel/plugin-transform-arrow-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e" + integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" - integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== +"@babel/plugin-transform-async-to-generator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604" + integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw== dependencies: - "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-module-imports" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-remap-async-to-generator" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.16.0" -"@babel/plugin-transform-block-scoped-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" - integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== +"@babel/plugin-transform-block-scoped-functions@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d" + integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.15.3": - version "7.15.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" - integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== +"@babel/plugin-transform-block-scoping@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16" + integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" - integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== +"@babel/plugin-transform-classes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5" + integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" - integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== +"@babel/plugin-transform-computed-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7" + integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.14.7": - version "7.14.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" - integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== +"@babel/plugin-transform-destructuring@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c" + integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" - integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== +"@babel/plugin-transform-dotall-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f" + integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-dotall-regex@^7.4.4": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz" integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.12.13" "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" - integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== +"@babel/plugin-transform-duplicate-keys@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176" + integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" - integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== +"@babel/plugin-transform-exponentiation-operator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4" + integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-for-of@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" - integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== +"@babel/plugin-transform-for-of@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2" + integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" - integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== +"@babel/plugin-transform-function-name@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e" + integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg== dependencies: - "@babel/helper-function-name" "^7.14.5" + "@babel/helper-function-name" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" - integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== +"@babel/plugin-transform-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac" + integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" - integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== +"@babel/plugin-transform-member-expression-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b" + integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" - integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== +"@babel/plugin-transform-modules-amd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e" + integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw== dependencies: - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" - integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== +"@babel/plugin-transform-modules-commonjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922" + integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ== dependencies: - "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-simple-access" "^7.16.0" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" - integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== +"@babel/plugin-transform-modules-systemjs@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4" + integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg== dependencies: - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-validator-identifier" "^7.15.7" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" - integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== +"@babel/plugin-transform-modules-umd@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7" + integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg== dependencies: - "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-module-transforms" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9": - version "7.14.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" - integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca" + integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" -"@babel/plugin-transform-new-target@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" - integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== +"@babel/plugin-transform-new-target@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35" + integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" - integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== +"@babel/plugin-transform-object-super@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b" + integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" + "@babel/helper-replace-supers" "^7.16.0" -"@babel/plugin-transform-parameters@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" - integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== +"@babel/plugin-transform-parameters@^7.16.0", "@babel/plugin-transform-parameters@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15" + integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" - integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== +"@babel/plugin-transform-property-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1" + integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" - integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== +"@babel/plugin-transform-regenerator@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4" + integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" - integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== +"@babel/plugin-transform-reserved-words@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c" + integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-runtime@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz#9d15b1e94e1c7f6344f65a8d573597d93c6cd886" - integrity sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw== +"@babel/plugin-transform-runtime@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz#f9ba3c7034d429c581e1bd41b4952f3db3c2c7e8" + integrity sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A== dependencies: - "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-module-imports" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.5" - babel-plugin-polyfill-regenerator "^0.2.2" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" semver "^6.3.0" -"@babel/plugin-transform-shorthand-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" - integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== +"@babel/plugin-transform-shorthand-properties@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d" + integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz#79d5aa27f68d700449b2da07691dfa32d2f6d468" - integrity sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ== +"@babel/plugin-transform-spread@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb" + integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0" -"@babel/plugin-transform-sticky-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" - integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== +"@babel/plugin-transform-sticky-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd" + integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" - integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== +"@babel/plugin-transform-template-literals@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302" + integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" - integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== +"@babel/plugin-transform-typeof-symbol@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2" + integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" - integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== +"@babel/plugin-transform-unicode-escapes@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3" + integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A== dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.14.5": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" - integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== +"@babel/plugin-transform-unicode-regex@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402" + integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-create-regexp-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" -"@babel/preset-env@^7.15.8": - version "7.15.8" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.8.tgz#f527ce5bcb121cd199f6b502bf23e420b3ff8dba" - integrity sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA== +"@babel/preset-env@^7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.4.tgz#4f6ec33b2a3fe72d6bfdcdf3859500232563a2e3" + integrity sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA== dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.4" + "@babel/compat-data" "^7.16.4" + "@babel/helper-compilation-targets" "^7.16.3" "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" - "@babel/plugin-proposal-async-generator-functions" "^7.15.8" - "@babel/plugin-proposal-class-properties" "^7.14.5" - "@babel/plugin-proposal-class-static-block" "^7.15.4" - "@babel/plugin-proposal-dynamic-import" "^7.14.5" - "@babel/plugin-proposal-export-namespace-from" "^7.14.5" - "@babel/plugin-proposal-json-strings" "^7.14.5" - "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" - "@babel/plugin-proposal-numeric-separator" "^7.14.5" - "@babel/plugin-proposal-object-rest-spread" "^7.15.6" - "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" - "@babel/plugin-proposal-optional-chaining" "^7.14.5" - "@babel/plugin-proposal-private-methods" "^7.14.5" - "@babel/plugin-proposal-private-property-in-object" "^7.15.4" - "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.2" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-async-generator-functions" "^7.16.4" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-class-static-block" "^7.16.0" + "@babel/plugin-proposal-dynamic-import" "^7.16.0" + "@babel/plugin-proposal-export-namespace-from" "^7.16.0" + "@babel/plugin-proposal-json-strings" "^7.16.0" + "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-object-rest-spread" "^7.16.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-proposal-private-property-in-object" "^7.16.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.16.0" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" @@ -911,50 +919,50 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.14.5" - "@babel/plugin-transform-async-to-generator" "^7.14.5" - "@babel/plugin-transform-block-scoped-functions" "^7.14.5" - "@babel/plugin-transform-block-scoping" "^7.15.3" - "@babel/plugin-transform-classes" "^7.15.4" - "@babel/plugin-transform-computed-properties" "^7.14.5" - "@babel/plugin-transform-destructuring" "^7.14.7" - "@babel/plugin-transform-dotall-regex" "^7.14.5" - "@babel/plugin-transform-duplicate-keys" "^7.14.5" - "@babel/plugin-transform-exponentiation-operator" "^7.14.5" - "@babel/plugin-transform-for-of" "^7.15.4" - "@babel/plugin-transform-function-name" "^7.14.5" - "@babel/plugin-transform-literals" "^7.14.5" - "@babel/plugin-transform-member-expression-literals" "^7.14.5" - "@babel/plugin-transform-modules-amd" "^7.14.5" - "@babel/plugin-transform-modules-commonjs" "^7.15.4" - "@babel/plugin-transform-modules-systemjs" "^7.15.4" - "@babel/plugin-transform-modules-umd" "^7.14.5" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" - "@babel/plugin-transform-new-target" "^7.14.5" - "@babel/plugin-transform-object-super" "^7.14.5" - "@babel/plugin-transform-parameters" "^7.15.4" - "@babel/plugin-transform-property-literals" "^7.14.5" - "@babel/plugin-transform-regenerator" "^7.14.5" - "@babel/plugin-transform-reserved-words" "^7.14.5" - "@babel/plugin-transform-shorthand-properties" "^7.14.5" - "@babel/plugin-transform-spread" "^7.15.8" - "@babel/plugin-transform-sticky-regex" "^7.14.5" - "@babel/plugin-transform-template-literals" "^7.14.5" - "@babel/plugin-transform-typeof-symbol" "^7.14.5" - "@babel/plugin-transform-unicode-escapes" "^7.14.5" - "@babel/plugin-transform-unicode-regex" "^7.14.5" - "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.15.6" - babel-plugin-polyfill-corejs2 "^0.2.2" - babel-plugin-polyfill-corejs3 "^0.2.5" - babel-plugin-polyfill-regenerator "^0.2.2" - core-js-compat "^3.16.0" + "@babel/plugin-transform-arrow-functions" "^7.16.0" + "@babel/plugin-transform-async-to-generator" "^7.16.0" + "@babel/plugin-transform-block-scoped-functions" "^7.16.0" + "@babel/plugin-transform-block-scoping" "^7.16.0" + "@babel/plugin-transform-classes" "^7.16.0" + "@babel/plugin-transform-computed-properties" "^7.16.0" + "@babel/plugin-transform-destructuring" "^7.16.0" + "@babel/plugin-transform-dotall-regex" "^7.16.0" + "@babel/plugin-transform-duplicate-keys" "^7.16.0" + "@babel/plugin-transform-exponentiation-operator" "^7.16.0" + "@babel/plugin-transform-for-of" "^7.16.0" + "@babel/plugin-transform-function-name" "^7.16.0" + "@babel/plugin-transform-literals" "^7.16.0" + "@babel/plugin-transform-member-expression-literals" "^7.16.0" + "@babel/plugin-transform-modules-amd" "^7.16.0" + "@babel/plugin-transform-modules-commonjs" "^7.16.0" + "@babel/plugin-transform-modules-systemjs" "^7.16.0" + "@babel/plugin-transform-modules-umd" "^7.16.0" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0" + "@babel/plugin-transform-new-target" "^7.16.0" + "@babel/plugin-transform-object-super" "^7.16.0" + "@babel/plugin-transform-parameters" "^7.16.3" + "@babel/plugin-transform-property-literals" "^7.16.0" + "@babel/plugin-transform-regenerator" "^7.16.0" + "@babel/plugin-transform-reserved-words" "^7.16.0" + "@babel/plugin-transform-shorthand-properties" "^7.16.0" + "@babel/plugin-transform-spread" "^7.16.0" + "@babel/plugin-transform-sticky-regex" "^7.16.0" + "@babel/plugin-transform-template-literals" "^7.16.0" + "@babel/plugin-transform-typeof-symbol" "^7.16.0" + "@babel/plugin-transform-unicode-escapes" "^7.16.0" + "@babel/plugin-transform-unicode-regex" "^7.16.0" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.16.0" + babel-plugin-polyfill-corejs2 "^0.3.0" + babel-plugin-polyfill-corejs3 "^0.4.0" + babel-plugin-polyfill-regenerator "^0.3.0" + core-js-compat "^3.19.1" semver "^6.3.0" -"@babel/preset-modules@^0.1.4": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e" - integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg== +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" @@ -962,41 +970,41 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/runtime@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" - integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== +"@babel/runtime@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" + integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== dependencies: regenerator-runtime "^0.13.4" "@babel/runtime@^7.8.4": version "7.14.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz" integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" "@babel/template@^7.12.13": version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz" integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== dependencies: "@babel/code-frame" "^7.12.13" "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/template@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" - integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== +"@babel/template@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" + integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" + "@babel/code-frame" "^7.16.0" + "@babel/parser" "^7.16.0" + "@babel/types" "^7.16.0" "@babel/traverse@^7.13.0": version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz" integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== dependencies: "@babel/code-frame" "^7.12.13" @@ -1008,45 +1016,45 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/traverse@^7.15.4": - version "7.15.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" - integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-hoist-variables" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - "@babel/parser" "^7.15.4" - "@babel/types" "^7.15.4" +"@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": + version "7.16.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" + integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.3" + "@babel/types" "^7.16.0" debug "^4.1.0" globals "^11.1.0" "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.2", "@babel/types@^7.4.4": version "7.14.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.2.tgz#4208ae003107ef8a057ea8333e56eb64d2f6a2c3" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.14.2.tgz" integrity sha512-SdjAG/3DikRHpUOjxZgnkbR11xUlyDMUFJdvnIgZEE16mqmY0BINMmc4//JMJglEmn6i7sq6p+mGrFWyZ98EEw== dependencies: "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" -"@babel/types@^7.15.4", "@babel/types@^7.15.6": - version "7.15.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" - integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== +"@babel/types@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" + integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== dependencies: - "@babel/helper-validator-identifier" "^7.14.9" + "@babel/helper-validator-identifier" "^7.15.7" to-fast-properties "^2.0.0" "@discoveryjs/json-ext@^0.5.0": version "0.5.3" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz" integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g== "@types/eslint-scope@^3.7.0": version "3.7.0" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz" integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw== dependencies: "@types/eslint" "*" @@ -1054,7 +1062,7 @@ "@types/eslint@*": version "7.2.11" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.11.tgz#180b58f5bb7d7376e39d22496e2b08901aa52fd2" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.11.tgz" integrity sha512-WYhv//5K8kQtsSc9F1Kn2vHzhYor6KpwPbARH7hwYe3C3ETD0EVx/3P5qQybUoaBEuUa9f/02JjBiXFWalYUmw== dependencies: "@types/estree" "*" @@ -1062,37 +1070,37 @@ "@types/estree@*": version "0.0.47" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.47.tgz" integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== "@types/estree@^0.0.50": version "0.0.50" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz" integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== "@types/json-schema@*", "@types/json-schema@^7.0.5": version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== "@types/json-schema@^7.0.8": version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz" integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/node@*", "@types/node@^15.6.0": version "15.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-15.6.0.tgz#f0ddca5a61e52627c9dcb771a6039d44694597bc" + resolved "https://registry.npmjs.org/@types/node/-/node-15.6.0.tgz" integrity sha512-gCYSfQpy+LYhOFTKAeE8BkyGqaxmlFxe+n4DKM6DR0wzw/HISUE/hAmkC/KT8Sw5PCJblqg062b3z9gucv3k0A== -"@types/three@^0.133.0": - version "0.133.0" - resolved "https://registry.yarnpkg.com/@types/three/-/three-0.133.0.tgz#2e344ce10bc81dc89295b79a98c09932b3f0c294" - integrity sha512-neDN9L64GK1fhT2raWXYIFvIr6ktM6XYgssfTh4zZp+XRgowD1qJ4/w79hLrLQ0w87u1E91ZfvHB0198wBsuHg== +"@types/three@^0.134.0": + version "0.134.0" + resolved "https://registry.yarnpkg.com/@types/three/-/three-0.134.0.tgz#22ae9892f4490faaf35f0ccea127df18407b8ab3" + integrity sha512-4YB+99Rgqq27EjiYTItEoZtdjLnTh8W9LxowgpC9eWsjaQJIL4Kn/ZcUKAnW3gB/jS4hqGN8iqmid+RcUZDzpA== "@webassemblyjs/ast@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== dependencies: "@webassemblyjs/helper-numbers" "1.11.1" @@ -1100,22 +1108,22 @@ "@webassemblyjs/floating-point-hex-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== "@webassemblyjs/helper-api-error@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== "@webassemblyjs/helper-buffer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== "@webassemblyjs/helper-numbers@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.1" @@ -1124,12 +1132,12 @@ "@webassemblyjs/helper-wasm-bytecode@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== "@webassemblyjs/helper-wasm-section@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1139,26 +1147,26 @@ "@webassemblyjs/ieee754@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== "@webassemblyjs/wasm-edit@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1172,7 +1180,7 @@ "@webassemblyjs/wasm-gen@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1183,7 +1191,7 @@ "@webassemblyjs/wasm-opt@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1193,7 +1201,7 @@ "@webassemblyjs/wasm-parser@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1205,7 +1213,7 @@ "@webassemblyjs/wast-printer@1.11.1": version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== dependencies: "@webassemblyjs/ast" "1.11.1" @@ -1213,49 +1221,49 @@ "@webpack-cli/configtest@^1.1.0": version "1.1.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz" integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== "@webpack-cli/info@^1.4.0": version "1.4.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz" integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== dependencies: envinfo "^7.7.3" "@webpack-cli/serve@^1.6.0": version "1.6.0" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz" integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== "@xtuc/ieee754@^1.2.0": version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== acorn-import-assertions@^1.7.6: version "1.8.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== acorn@^8.4.1: version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz" integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== ajv-keywords@^3.5.2: version "3.5.2" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -1265,21 +1273,21 @@ ajv@^6.12.4, ajv@^6.12.5: ansi-styles@^3.2.1: version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" babel-loader@^8.2.2: version "8.2.2" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz" integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== dependencies: find-cache-dir "^3.3.1" @@ -1289,48 +1297,48 @@ babel-loader@^8.2.2: babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" -babel-plugin-polyfill-corejs2@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" - integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== +babel-plugin-polyfill-corejs2@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd" + integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA== dependencies: "@babel/compat-data" "^7.13.11" - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.3.0" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" - integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== +babel-plugin-polyfill-corejs3@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087" + integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" - core-js-compat "^3.16.2" + "@babel/helper-define-polyfill-provider" "^0.3.0" + core-js-compat "^3.18.0" -babel-plugin-polyfill-regenerator@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" - integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== +babel-plugin-polyfill-regenerator@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be" + integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.2.2" + "@babel/helper-define-polyfill-provider" "^0.3.0" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== big.js@^5.2.2: version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -1338,14 +1346,14 @@ brace-expansion@^1.1.7: braces@^3.0.1: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.16.6: +browserslist@^4.14.5: version "4.16.6" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz" integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: caniuse-lite "^1.0.30001219" @@ -1354,43 +1362,38 @@ browserslist@^4.14.5, browserslist@^4.16.6: escalade "^3.1.1" node-releases "^1.1.71" -browserslist@^4.17.3: - version "4.17.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" - integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== +browserslist@^4.17.5, browserslist@^4.17.6: + version "4.18.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" + integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== dependencies: - caniuse-lite "^1.0.30001264" - electron-to-chromium "^1.3.857" + caniuse-lite "^1.0.30001280" + electron-to-chromium "^1.3.896" escalade "^3.1.1" - node-releases "^1.1.77" - picocolors "^0.2.1" + node-releases "^2.0.1" + picocolors "^1.0.0" buffer-from@^1.0.0: version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== call-bind@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== dependencies: function-bind "^1.1.1" get-intrinsic "^1.0.2" -caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001264: - version "1.0.30001279" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz" - integrity sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ== - -caniuse-lite@^1.0.30001264: - version "1.0.30001265" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" - integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== +caniuse-lite@^1.0.30001219, caniuse-lite@^1.0.30001280: + version "1.0.30001282" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz#38c781ee0a90ccfe1fe7fefd00e43f5ffdcb96fd" + integrity sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg== chalk@^2.0.0: version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" @@ -1399,7 +1402,7 @@ chalk@^2.0.0: chalk@^4.1.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== dependencies: ansi-styles "^4.1.0" @@ -1407,12 +1410,12 @@ chalk@^4.1.0: chrome-trace-event@^1.0.2: version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== clone-deep@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: is-plain-object "^2.0.4" @@ -1421,76 +1424,76 @@ clone-deep@^4.0.1: color-convert@^1.9.0: version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= color-name@~1.1.4: version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colorette@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== colorette@^2.0.14: version "2.0.16" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== commander@^2.20.0: version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== commander@^7.0.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== commondir@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= convert-source-map@^1.7.0: version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz" integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== dependencies: safe-buffer "~5.1.1" -core-js-compat@^3.16.0, core-js-compat@^3.16.2: - version "3.18.2" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.2.tgz#e40c266fbd613948dd8d2d2156345da8ac03c142" - integrity sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ== +core-js-compat@^3.18.0, core-js-compat@^3.19.1: + version "3.19.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476" + integrity sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g== dependencies: - browserslist "^4.17.3" + browserslist "^4.17.6" semver "7.0.0" cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -1499,36 +1502,36 @@ cross-spawn@^7.0.3: debug@^4.1.0, debug@^4.1.1: version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: ms "2.1.2" define-properties@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: object-keys "^1.0.12" electron-to-chromium@^1.3.723: version "1.3.736" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz" integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig== -electron-to-chromium@^1.3.857: - version "1.3.864" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz#6a993bcc196a2b8b3df84d28d5d4dd912393885f" - integrity sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw== +electron-to-chromium@^1.3.896: + version "1.3.900" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.900.tgz#5be2c5818a2a012c511b4b43e87b6ab7a296d4f5" + integrity sha512-SuXbQD8D4EjsaBaJJxySHbC+zq8JrFfxtb4GIr4E9n1BcROyMcRrJCYQNpJ9N+Wjf5mFp7Wp0OHykd14JNEzzQ== emojis-list@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== enhanced-resolve@^5.0.0: version "5.8.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz" integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== dependencies: graceful-fs "^4.2.4" @@ -1536,7 +1539,7 @@ enhanced-resolve@^5.0.0: enhanced-resolve@^5.8.3: version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz" integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== dependencies: graceful-fs "^4.2.4" @@ -1544,27 +1547,27 @@ enhanced-resolve@^5.8.3: envinfo@^7.7.3: version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== es-module-lexer@^0.9.0: version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== escape-string-regexp@^1.0.5: version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= eslint-scope@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: esrecurse "^4.3.0" @@ -1572,34 +1575,34 @@ eslint-scope@5.1.1: esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^4.1.1: version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== esutils@^2.0.2: version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== events@^3.2.0: version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== execa@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz" integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== dependencies: cross-spawn "^7.0.3" @@ -1614,29 +1617,29 @@ execa@^5.0.0: fast-deep-equal@^3.1.1: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fastest-levenshtein@^1.0.12: version "1.0.12" - resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz" integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-cache-dir@^3.3.1: version "3.3.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== dependencies: commondir "^1.0.1" @@ -1645,7 +1648,7 @@ find-cache-dir@^3.3.1: find-up@^4.0.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" @@ -1653,22 +1656,22 @@ find-up@^4.0.0: fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-intrinsic@^1.0.2: version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz" integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== dependencies: function-bind "^1.1.1" @@ -1677,17 +1680,17 @@ get-intrinsic@^1.0.2: get-stream@^6.0.0: version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@^7.2.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" @@ -1699,44 +1702,44 @@ glob@^7.2.0: globals@^11.1.0: version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.1.2, graceful-fs@^4.2.4: version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== has-flag@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-symbols@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== import-local@^3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz" integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== dependencies: pkg-dir "^4.2.0" @@ -1744,7 +1747,7 @@ import-local@^3.0.2: inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" @@ -1752,51 +1755,51 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== interpret@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== is-core-module@^2.2.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz" integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-object@^2.0.4: version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= jest-worker@^27.0.6: version "27.2.5" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.2.5.tgz#ed42865661959488aa020e8a325df010597c36d4" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.2.5.tgz" integrity sha512-HTjEPZtcNKZ4LnhSp02NEH4vE+5OpJ0EsOWYvGQpHgUMLngydESAAMH5Wd/asPf29+XUDQZszxpLg1BkIIA2aw== dependencies: "@types/node" "*" @@ -1805,61 +1808,61 @@ jest-worker@^27.0.6: js-tokens@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== jsesc@^2.5.1: version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@~0.5.0: version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= json-parse-better-errors@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json5@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== dependencies: minimist "^1.2.0" json5@^2.1.2: version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz" integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" jsonc-parser@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== kind-of@^6.0.2: version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== loader-runner@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz" integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== loader-utils@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== dependencies: big.js "^5.2.2" @@ -1868,55 +1871,55 @@ loader-utils@^1.4.0: locate-path@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" lodash.debounce@^4.0.8: version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lru-cache@^5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" lunr@^2.3.9: version "2.3.9" - resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== make-dir@^3.0.2, make-dir@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" -marked@^3.0.4: - version "3.0.7" - resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.7.tgz#343aad9e91b96249b495c99c512ea09cfe06de1e" - integrity sha512-ctKqbnLuNbsHbI26cfMyOlKgXGfl1orOv1AvWWDX7AkgfMOwCWvmuYc+mVLeWhQ9W6hdWVBynOs96VkcscKo0Q== +marked@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/marked/-/marked-3.0.8.tgz#2785f0dc79cbdc6034be4bb4f0f0a396bd3f8aeb" + integrity sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.0: version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz" integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" @@ -1924,68 +1927,68 @@ micromatch@^4.0.0: mime-db@1.47.0: version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz" integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.27: version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz" integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: mime-db "1.47.0" mimic-fn@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== minimatch@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== neo-async@^2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-releases@^1.1.71: version "1.1.72" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz" integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== -node-releases@^1.1.77: - version "1.1.77" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" - integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== +node-releases@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" + integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== npm-run-path@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.0: version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: call-bind "^1.0.0" @@ -1995,139 +1998,139 @@ object.assign@^4.1.0: once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" onigasm@^2.2.5: version "2.2.5" - resolved "https://registry.yarnpkg.com/onigasm/-/onigasm-2.2.5.tgz#cc4d2a79a0fa0b64caec1f4c7ea367585a676892" + resolved "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz" integrity sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA== dependencies: lru-cache "^5.1.1" p-limit@^2.2.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^4.1.0: version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-try@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.2.3: version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" prettier@^2.4.1: version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz" integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== punycode@^2.1.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" rechoir@^0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz" integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== dependencies: resolve "^1.9.0" regenerate-unicode-properties@^8.2.0: version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz" integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== dependencies: regenerate "^1.4.0" regenerate@^1.4.0: version "1.4.2" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.13.4: version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== regenerator-transform@^0.14.2: version "0.14.5" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz" integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw== dependencies: "@babel/runtime" "^7.8.4" regexpu-core@^4.7.1: version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz" integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== dependencies: regenerate "^1.4.0" @@ -2139,31 +2142,31 @@ regexpu-core@^4.7.1: regjsgen@^0.5.1: version "0.5.2" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" + resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: version "0.6.9" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz" integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ== dependencies: jsesc "~0.5.0" resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^5.0.0: version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.14.2, resolve@^1.9.0: version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: is-core-module "^2.2.0" @@ -2171,17 +2174,17 @@ resolve@^1.14.2, resolve@^1.9.0: safe-buffer@^5.1.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.1: version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== schema-utils@^2.6.5: version "2.7.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== dependencies: "@types/json-schema" "^7.0.5" @@ -2190,7 +2193,7 @@ schema-utils@^2.6.5: schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: "@types/json-schema" "^7.0.8" @@ -2199,51 +2202,51 @@ schema-utils@^3.1.0, schema-utils@^3.1.1: semver@7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" + resolved "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.3.4: version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" serialize-javascript@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== dependencies: randombytes "^2.1.0" shallow-clone@^3.0.0: version "3.0.1" - resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: kind-of "^6.0.2" shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shiki@^0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.9.11.tgz#07d75dab2abb6dc12a01f79a397cb1c391fa22d8" - integrity sha512-tjruNTLFhU0hruCPoJP0y+B9LKOmcqUhTpxn7pcJB3fa+04gFChuEmxmrUfOJ7ZO6Jd+HwMnDHgY3lv3Tqonuw== +shiki@^0.9.12: + version "0.9.12" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.9.12.tgz#70cbc8c1bb78ff7b356f84a7eecdb040efddd247" + integrity sha512-VXcROdldv0/Qu0w2XvzU4IrvTeBNs/Kj/FCmtcEXGz7Tic/veQzliJj6tEiAgoKianhQstpYmbPDStHU5Opqcw== dependencies: jsonc-parser "^3.0.0" onigasm "^2.2.5" @@ -2251,12 +2254,12 @@ shiki@^0.9.11: signal-exit@^3.0.3: version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== source-map-support@~0.5.20: version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz" integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== dependencies: buffer-from "^1.0.0" @@ -2264,53 +2267,53 @@ source-map-support@~0.5.20: source-map@^0.5.0: version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.7.2: version "0.7.3" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== supports-color@^5.3.0: version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" tapable@^2.1.1, tapable@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== terser-webpack-plugin@^5.1.3: version "5.2.4" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz#ad1be7639b1cbe3ea49fab995cbe7224b31747a1" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz" integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA== dependencies: jest-worker "^27.0.6" @@ -2322,33 +2325,33 @@ terser-webpack-plugin@^5.1.3: terser@^5.7.2: version "5.9.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.9.0.tgz#47d6e629a522963240f2b55fcaa3c99083d2c351" + resolved "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz" integrity sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ== dependencies: commander "^2.20.0" source-map "~0.7.2" source-map-support "~0.5.20" -three@^0.133.0: - version "0.133.1" - resolved "https://registry.yarnpkg.com/three/-/three-0.133.1.tgz#5606f4817d67a09d9212d4ccbd6826564774f8f4" - integrity sha512-WydohO8ll949B0FTD6MGz59Yv2Lwj8hvObg/0Heh2r42S6+tQC1WByfCNRdmG4D7+odfGod+n8JPV1I2xrboWw== +three@^0.134.0: + version "0.134.0" + resolved "https://registry.npmjs.org/three/-/three-0.134.0.tgz" + integrity sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg== to-fast-properties@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" ts-loader@^9.2.6: version "9.2.6" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.6.tgz#9937c4dd0a1e3dbbb5e433f8102a6601c6615d74" + resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.6.tgz" integrity sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw== dependencies: chalk "^4.1.0" @@ -2356,30 +2359,30 @@ ts-loader@^9.2.6: micromatch "^4.0.0" semver "^7.3.4" -typedoc@^0.22.5: - version "0.22.5" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.5.tgz#c1a7c33fcdc808f57c766584a6afb47762944229" - integrity sha512-KFrWGU1iKiTGw0RcyjLNYDmhd7uICU14HgBNPmFKY/sT4Pm/fraaLyWyisst9vGTUAKxqibqoDITR7+ZcAkhHg== +typedoc@^0.22.9: + version "0.22.9" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.9.tgz#7e3f4f72586bbef4c2382f0afcea8e0f9270b712" + integrity sha512-84PjudoXVcap6bwdZFbYIUWlgdz/iLV09ZHwrCzhtHWXaDQG6mlosJ8te6DSThuRkRvQjp46HO+qY/P7Gpm78g== dependencies: glob "^7.2.0" lunr "^2.3.9" - marked "^3.0.4" + marked "^3.0.8" minimatch "^3.0.4" - shiki "^0.9.11" + shiki "^0.9.12" typescript@^4.2.4: version "4.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz" integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz" integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== unicode-match-property-ecmascript@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz" integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== dependencies: unicode-canonical-property-names-ecmascript "^1.0.4" @@ -2387,43 +2390,38 @@ unicode-match-property-ecmascript@^1.0.4: unicode-match-property-value-ecmascript@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz" integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== unicode-property-aliases-ecmascript@^1.0.4: version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz" integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" -v8-compile-cache@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - vscode-textmate@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/vscode-textmate/-/vscode-textmate-5.2.0.tgz#01f01760a391e8222fe4f33fbccbd1ad71aed74e" + resolved "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz" integrity sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ== watchpack@^2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz" integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -webpack-cli@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.0.tgz#dc43e6e0f80dd52e89cbf73d5294bcd7ad6eb343" - integrity sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw== +webpack-cli@^4.9.1: + version "4.9.1" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz" + integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ== dependencies: "@discoveryjs/json-ext" "^0.5.0" "@webpack-cli/configtest" "^1.1.0" @@ -2436,26 +2434,25 @@ webpack-cli@^4.9.0: import-local "^3.0.2" interpret "^2.2.0" rechoir "^0.7.0" - v8-compile-cache "^2.2.0" webpack-merge "^5.7.3" webpack-merge@^5.7.3: version "5.7.3" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz" integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== dependencies: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.1.tgz#251a7d9720d75ada1469ca07dbb62f3641a05b6d" - integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA== +webpack-sources@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz" + integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== -webpack@^5.58.1: - version "5.58.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.58.1.tgz#df8aad72b617a9d0db8c89d4f410784ee93320d7" - integrity sha512-4Z/dmbTU+VmkCb2XNgW7wkE5TfEcSooclprn/UEuVeAkwHhn07OcgUsyaKHGtCY/VobjnsYBlyhKeMLiSoOqPg== +webpack@^5.64.1: + version "5.64.1" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.64.1.tgz" + integrity sha512-b4FHmRgaaAjP+aVOVz41a9Qa5SmkUPQ+u8FntTQ1roPHahSComB6rXnLwc976VhUY4CqTaLu5mCswuHiNhOfVw== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.50" @@ -2480,36 +2477,36 @@ webpack@^5.58.1: tapable "^2.1.1" terser-webpack-plugin "^5.1.3" watchpack "^2.2.0" - webpack-sources "^3.2.0" + webpack-sources "^3.2.2" which@^2.0.1: version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" wildcard@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= yallist@^3.0.2: version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==