@kittycad/lib 4.0.0 → 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.cjs +1 -1
- package/dist/mjs/index.js +1 -1
- package/dist/types/src/api/projects/download_project.d.ts +4 -2
- package/dist/types/src/api/projects/download_project.d.ts.map +1 -1
- package/dist/types/src/api/projects/download_public_project.d.ts +22 -0
- package/dist/types/src/api/projects/download_public_project.d.ts.map +1 -0
- package/dist/types/src/api/projects/get_public_project.d.ts +22 -0
- package/dist/types/src/api/projects/get_public_project.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +5 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/models.d.ts +2 -0
- package/dist/types/src/models.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/mjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
try{if("undefined"==typeof fetch&&"undefined"!=typeof process&&process.versions?.node){new Function("m","return import(m)")("cross-fetch/polyfill").catch((()=>{}))}}catch{}class t{constructor(t){const e="undefined"!=typeof process?process.env:void 0,n=e?.KITTYCAD_TOKEN||e?.KITTYCAD_API_TOKEN||e?.ZOO_AI_TOKEN,i=e?.ZOO_HOST;"string"==typeof t?this.token=t:t&&"object"==typeof t&&(this.token=t.token,this.baseUrl=t.baseUrl,this.fetch=t.fetch),this.token??=n,this.baseUrl??=i}}function e(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));const n=e.toString();return n?`?${n}`:""}function n(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t||{}))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));return e}try{if("undefined"!=typeof process&&process.versions?.node&&"win32"===process.platform){new Function("m","return import(m)")("win-ca")}}catch{}class i extends Error{constructor(t,e,n){super(n||e?.message||`HTTP ${t}`),this.name="ApiError",this.status=t,this.error_code=e?.error_code,this.request_id=e?.request_id,this.body=e}}async function o(t){if(t.ok)return;let e;try{e=await t.json()}catch{try{const n=await t.text();e=n?{message:n}:void 0}catch{e=void 0}}throw new i(t.status,e)}class l{started=!1;constructor(t,e,n="page_token"){this.fetchPage=t,this.baseParams={...e},this.tokenField=n}hasNext(){return!this.started||!!this.nextToken}reset(){this.started=!1,this.nextToken=void 0}async next(){if(this.started&&!this.nextToken)return[];const t={...this.baseParams};this.started&&this.nextToken&&(t[this.tokenField]=this.nextToken);const e=await this.fetchPage(t);return this.started=!0,this.nextToken=e?.next_page??null,e?.items??[]}}function a(t,e,n="page_token"){return new l(t,e,n)}async function s({client:t,limit:n,page_token:i,sort_by:l}){const a="/api-calls"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function c({client:t,id:n,limit:i,page_token:l,sort_by:a}){const s=`/users/${n}/api-calls`+e({limit:i,page_token:l,sort_by:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function r({client:t,limit:n,page_token:i,sort_by:l,status:a}){const s="/async/operations"+e({limit:n,page_token:i,sort_by:l,status:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function d({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/api-calls"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function u({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/api-calls"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function b({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/api-tokens"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}const m=(()=>{const t=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype),Symbol.toStringTag).get;return e=>t.call(e)})();function Z(t){return"Uint8Array"===m(t)}function h(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&("ArrayBuffer"===t[Symbol.toStringTag]||"SharedArrayBuffer"===t[Symbol.toStringTag])}function p(t){return t instanceof RegExp||"[object RegExp]"===Object.prototype.toString.call(t)}function y(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&"Map"===t[Symbol.toStringTag]}function G(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function V(t,e){return JSON.stringify(t,((t,e)=>"bigint"==typeof e?{$numberLong:`${e}`}:y(e)?Object.fromEntries(e):e))}const X=7,f=Symbol.for("@@mdb.bson.version"),g=2147483647,W=-2147483648,S=Math.pow(2,63)-1,I=-Math.pow(2,63),T=Math.pow(2,53),U=-Math.pow(2,53),K=1,w=2,R=3,J=4,N=5,Y=6,L=7,z=8,x=9,C=10,k=11,B=12,P=13,H=14,v=15,M=16,j=17,Q=18,E=19,O=255,_=127,F=0,D=4,A=Object.freeze({double:1,string:2,object:3,array:4,binData:5,undefined:6,objectId:7,bool:8,date:9,null:10,regex:11,dbPointer:12,javascript:13,symbol:14,javascriptWithScope:15,int:16,timestamp:17,long:18,decimal:19,minKey:-1,maxKey:127});class $ extends Error{get bsonError(){return!0}get name(){return"BSONError"}constructor(t,e){super(t,e)}static isBSONError(t){return null!=t&&"object"==typeof t&&"bsonError"in t&&!0===t.bsonError&&"name"in t&&"message"in t&&"stack"in t}}class q extends ${get name(){return"BSONVersionError"}constructor(){super(`Unsupported BSON version, bson types must be from bson ${X}.x.x`)}}class tt extends ${get name(){return"BSONRuntimeError"}constructor(t){super(t)}}class et extends ${get name(){return"BSONOffsetError"}offset;constructor(t,e,n){super(`${t}. offset: ${e}`,n),this.offset=e}}let nt,it;function ot(t,e,n,i){if(i){nt??=new TextDecoder("utf8",{fatal:!0});try{return nt.decode(t.subarray(e,n))}catch(t){throw new $("Invalid UTF-8 string in BSON document",{cause:t})}}return it??=new TextDecoder("utf8",{fatal:!1}),it.decode(t.subarray(e,n))}function lt(t,e,n){if(0===t.length)return"";const i=n-e;if(0===i)return"";if(i>20)return null;if(1===i&&t[e]<128)return String.fromCharCode(t[e]);if(2===i&&t[e]<128&&t[e+1]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1]);if(3===i&&t[e]<128&&t[e+1]<128&&t[e+2]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1])+String.fromCharCode(t[e+2]);const o=[];for(let i=e;i<n;i++){const e=t[i];if(e>127)return null;o.push(e)}return String.fromCharCode(...o)}function at(t){return rt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}function st(t){return crypto.getRandomValues(rt.allocate(t))}const ct=(()=>{const{crypto:t}=globalThis;return null!=t&&"function"==typeof t.getRandomValues?st:at})(),rt={isUint8Array:Z,toLocalBufferType(t){if(Buffer.isBuffer(t))return t;if(ArrayBuffer.isView(t))return Buffer.from(t.buffer,t.byteOffset,t.byteLength);const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return Buffer.from(t);throw new $("Cannot create Buffer from the passed potentialBuffer.")},allocate:t=>Buffer.alloc(t),allocateUnsafe:t=>Buffer.allocUnsafe(t),compare:(t,e)=>rt.toLocalBufferType(t).compare(e),concat:t=>Buffer.concat(t),copy:(t,e,n,i,o)=>rt.toLocalBufferType(t).copy(e,n??0,i??0,o??t.length),equals:(t,e)=>rt.toLocalBufferType(t).equals(e),fromNumberArray:t=>Buffer.from(t),fromBase64:t=>Buffer.from(t,"base64"),fromUTF8:t=>Buffer.from(t,"utf8"),toBase64:t=>rt.toLocalBufferType(t).toString("base64"),fromISO88591:t=>Buffer.from(t,"binary"),toISO88591:t=>rt.toLocalBufferType(t).toString("binary"),fromHex:t=>Buffer.from(t,"hex"),toHex:t=>rt.toLocalBufferType(t).toString("hex"),toUTF8(t,e,n,i){const o=n-e<=20?lt(t,e,n):null;if(null!=o)return o;const l=rt.toLocalBufferType(t).toString("utf8",e,n);if(i)for(let i=0;i<l.length;i++)if(65533===l.charCodeAt(i)){ot(t,e,n,!0);break}return l},utf8ByteLength:t=>Buffer.byteLength(t,"utf8"),encodeUTF8Into(t,e,n){const i=function(t,e,n){if(0===e.length)return 0;if(e.length>25)return null;if(t.length-n<e.length)return null;for(let i=0,o=n;i<e.length;i++,o++){const n=e.charCodeAt(i);if(n>127)return null;t[o]=n}return e.length}(t,e,n);return null!=i?i:rt.toLocalBufferType(t).write(e,n,void 0,"utf8")},randomBytes:ct,swap32:t=>rt.toLocalBufferType(t).swap32()};function dt(t){if(t<0)throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);return mt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}const ut=(()=>{const{crypto:t}=globalThis;if(null!=t&&"function"==typeof t.getRandomValues)return e=>t.getRandomValues(mt.allocate(e));if(function(){const{navigator:t}=globalThis;return"object"==typeof t&&"ReactNative"===t.product}()){const{console:t}=globalThis;t?.warn?.("BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.")}return dt})(),bt=/(\d|[a-f])/i,mt={isUint8Array:Z,toLocalBufferType(t){const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("Uint8Array"===e)return t;if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength));if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return new Uint8Array(t);throw new $("Cannot make a Uint8Array from passed potentialBuffer.")},allocate(t){if("number"!=typeof t)throw new TypeError(`The "size" argument must be of type number. Received ${String(t)}`);return new Uint8Array(t)},allocateUnsafe:t=>mt.allocate(t),compare(t,e){if(t===e)return 0;const n=Math.min(t.length,e.length);for(let i=0;i<n;i++){if(t[i]<e[i])return-1;if(t[i]>e[i])return 1}return t.length<e.length?-1:t.length>e.length?1:0},concat(t){if(0===t.length)return mt.allocate(0);let e=0;for(const n of t)e+=n.length;const n=mt.allocate(e);let i=0;for(const e of t)n.set(e,i),i+=e.length;return n},copy(t,e,n,i,o){if(void 0!==o&&o<0)throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${o}`);if(o=o??t.length,void 0!==i&&(i<0||i>o))throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${o}. Received ${i}`);if(i=i??0,void 0!==n&&n<0)throw new RangeError(`The value of "targetStart" is out of range. It must be >= 0. Received ${n}`);n=n??0;const l=t.subarray(i,o),a=Math.min(l.length,e.length-n);return a<=0?0:(e.set(l.subarray(0,a),n),a)},equals(t,e){if(t.byteLength!==e.byteLength)return!1;for(let n=0;n<t.byteLength;n++)if(t[n]!==e[n])return!1;return!0},fromNumberArray:t=>Uint8Array.from(t),fromBase64:t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),fromUTF8:t=>(new TextEncoder).encode(t),toBase64:t=>btoa(mt.toISO88591(t)),fromISO88591:t=>Uint8Array.from(t,(t=>255&t.charCodeAt(0))),toISO88591:t=>Array.from(Uint16Array.from(t),(t=>String.fromCharCode(t))).join(""),fromHex(t){const e=t.length%2==0?t:t.slice(0,t.length-1),n=[];for(let t=0;t<e.length;t+=2){const i=e[t],o=e[t+1];if(!bt.test(i))break;if(!bt.test(o))break;const l=Number.parseInt(`${i}${o}`,16);n.push(l)}return Uint8Array.from(n)},toHex:t=>Array.from(t,(t=>t.toString(16).padStart(2,"0"))).join(""),toUTF8(t,e,n,i){const o=n-e<=20?lt(t,e,n):null;return null!=o?o:ot(t,e,n,i)},utf8ByteLength:t=>(new TextEncoder).encode(t).byteLength,encodeUTF8Into(t,e,n){const i=(new TextEncoder).encode(e);return t.set(i,n),i.byteLength},randomBytes:ut,swap32(t){if(t.length%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t.length;e+=4){const n=t[e],i=t[e+1],o=t[e+2],l=t[e+3];t[e]=l,t[e+1]=o,t[e+2]=i,t[e+3]=n}return t}},Zt="function"==typeof Buffer&&!0!==Buffer.prototype?._isBuffer?rt:mt,ht=Symbol.for("@@mdb.bson.type");class pt{get[ht](){return this._bsontype}get[f](){return X}[Symbol.for("nodejs.util.inspect.custom")](t,e,n){return this.inspect(t,e,n)}}const yt=new Float64Array(1),Gt=new Uint8Array(yt.buffer,0,8);yt[0]=-1;const Vt=0===Gt[7],Xt={isBigEndian:Vt,getNonnegativeInt32LE(t,e){if(t[e+3]>127)throw new RangeError(`Size cannot be negative at offset: ${e}`);return t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24},getInt32LE:(t,e)=>t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24,getUint32LE:(t,e)=>t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3],getUint32BE:(t,e)=>t[e+3]+256*t[e+2]+65536*t[e+1]+16777216*t[e],getBigInt64LE:(t,e)=>(BigInt(t[e+4]+256*t[e+5]+65536*t[e+6]+(t[e+7]<<24))<<32n)+BigInt(t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3]),getFloat64LE:Vt?(t,e)=>(Gt[7]=t[e],Gt[6]=t[e+1],Gt[5]=t[e+2],Gt[4]=t[e+3],Gt[3]=t[e+4],Gt[2]=t[e+5],Gt[1]=t[e+6],Gt[0]=t[e+7],yt[0]):(t,e)=>(Gt[0]=t[e],Gt[1]=t[e+1],Gt[2]=t[e+2],Gt[3]=t[e+3],Gt[4]=t[e+4],Gt[5]=t[e+5],Gt[6]=t[e+6],Gt[7]=t[e+7],yt[0]),setInt32BE:(t,e,n)=>(t[e+3]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e]=n,4),setInt32LE:(t,e,n)=>(t[e]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+3]=n,4),setBigInt64LE(t,e,n){const i=0xffffffffn;let o=Number(n&i);t[e]=o,o>>=8,t[e+1]=o,o>>=8,t[e+2]=o,o>>=8,t[e+3]=o;let l=Number(n>>32n&i);return t[e+4]=l,l>>=8,t[e+5]=l,l>>=8,t[e+6]=l,l>>=8,t[e+7]=l,8},setFloat64LE:Vt?(t,e,n)=>(yt[0]=n,t[e]=Gt[7],t[e+1]=Gt[6],t[e+2]=Gt[5],t[e+3]=Gt[4],t[e+4]=Gt[3],t[e+5]=Gt[2],t[e+6]=Gt[1],t[e+7]=Gt[0],8):(t,e,n)=>(yt[0]=n,t[e]=Gt[0],t[e+1]=Gt[1],t[e+2]=Gt[2],t[e+3]=Gt[3],t[e+4]=Gt[4],t[e+5]=Gt[5],t[e+6]=Gt[6],t[e+7]=Gt[7],8)};class ft extends pt{get _bsontype(){return"Binary"}static BSON_BINARY_SUBTYPE_DEFAULT=0;static BUFFER_SIZE=256;static SUBTYPE_DEFAULT=0;static SUBTYPE_FUNCTION=1;static SUBTYPE_BYTE_ARRAY=2;static SUBTYPE_UUID_OLD=3;static SUBTYPE_UUID=4;static SUBTYPE_MD5=5;static SUBTYPE_ENCRYPTED=6;static SUBTYPE_COLUMN=7;static SUBTYPE_SENSITIVE=8;static SUBTYPE_VECTOR=9;static SUBTYPE_USER_DEFINED=128;static VECTOR_TYPE=Object.freeze({Int8:3,Float32:39,PackedBit:16});buffer;sub_type;position;constructor(t,e){if(super(),null!=t&&"string"==typeof t&&!ArrayBuffer.isView(t)&&!h(t)&&!Array.isArray(t))throw new $("Binary can only be constructed from Uint8Array or number[]");this.sub_type=e??ft.BSON_BINARY_SUBTYPE_DEFAULT,null==t?(this.buffer=Zt.allocate(ft.BUFFER_SIZE),this.position=0):(this.buffer=Array.isArray(t)?Zt.fromNumberArray(t):Zt.toLocalBufferType(t),this.position=this.buffer.byteLength)}put(t){if("string"==typeof t&&1!==t.length)throw new $("only accepts single character String");if("number"!=typeof t&&1!==t.length)throw new $("only accepts single character Uint8Array or Array");let e;if(e="string"==typeof t?t.charCodeAt(0):"number"==typeof t?t:t[0],e<0||e>255)throw new $("only accepts number in a valid unsigned byte range 0-255");if(this.buffer.byteLength>this.position)this.buffer[this.position++]=e;else{const t=Zt.allocate(ft.BUFFER_SIZE+this.buffer.length);t.set(this.buffer,0),this.buffer=t,this.buffer[this.position++]=e}}write(t,e){if(e="number"==typeof e?e:this.position,this.buffer.byteLength<e+t.length){const e=Zt.allocate(this.buffer.byteLength+t.length);e.set(this.buffer,0),this.buffer=e}if(ArrayBuffer.isView(t))this.buffer.set(Zt.toLocalBufferType(t),e),this.position=e+t.byteLength>this.position?e+t.length:this.position;else if("string"==typeof t)throw new $("input cannot be string")}read(t,e){const n=t+(e=e&&e>0?e:this.position);return this.buffer.subarray(t,n>this.position?this.position:n)}value(){return this.buffer.length===this.position?this.buffer:this.buffer.subarray(0,this.position)}length(){return this.position}toJSON(){return Zt.toBase64(this.buffer.subarray(0,this.position))}toString(t){return"hex"===t?Zt.toHex(this.buffer.subarray(0,this.position)):"base64"===t?Zt.toBase64(this.buffer.subarray(0,this.position)):Zt.toUTF8(this.buffer,0,this.position,!1)}toExtendedJSON(t){t=t||{},this.sub_type===ft.SUBTYPE_VECTOR&>(this);const e=Zt.toBase64(this.buffer),n=Number(this.sub_type).toString(16);return t.legacy?{$binary:e,$type:1===n.length?"0"+n:n}:{$binary:{base64:e,subType:1===n.length?"0"+n:n}}}toUUID(){if(this.sub_type===ft.SUBTYPE_UUID)return new It(this.buffer.subarray(0,this.position));throw new $(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${ft.SUBTYPE_UUID}" is currently supported.`)}static createFromHexString(t,e){return new ft(Zt.fromHex(t),e)}static createFromBase64(t,e){return new ft(Zt.fromBase64(t),e)}static fromExtendedJSON(t,e){let n,i;if(e=e||{},"$binary"in t?e.legacy&&"string"==typeof t.$binary&&"$type"in t?(i=t.$type?parseInt(t.$type,16):0,n=Zt.fromBase64(t.$binary)):"string"!=typeof t.$binary&&(i=t.$binary.subType?parseInt(t.$binary.subType,16):0,n=Zt.fromBase64(t.$binary.base64)):"$uuid"in t&&(i=4,n=It.bytesFromString(t.$uuid)),!n)throw new $(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);return i===D?new It(n):new ft(n,i)}inspect(t,e,n){n??=V;return`Binary.createFromBase64(${n(Zt.toBase64(this.buffer.subarray(0,this.position)),e)}, ${n(this.sub_type,e)})`}toInt8Array(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.Int8)throw new $("Binary datatype field is not Int8");return gt(this),new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toFloat32Array(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.Float32)throw new $("Binary datatype field is not Float32");gt(this);const t=new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position));return Xt.isBigEndian&&Zt.swap32(t),new Float32Array(t.buffer)}toPackedBits(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.PackedBit)throw new $("Binary datatype field is not packed bit");return gt(this),new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toBits(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.PackedBit)throw new $("Binary datatype field is not packed bit");gt(this);const t=8*(this.length()-2)-this.buffer[1],e=new Int8Array(t);for(let t=0;t<e.length;t++){const n=t/8|0,i=this.buffer[n+2]>>7-t%8&1;e[t]=i}return e}static fromInt8Array(t){const e=Zt.allocate(t.byteLength+2);e[0]=ft.VECTOR_TYPE.Int8,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2);const i=new this(e,this.SUBTYPE_VECTOR);return gt(i),i}static fromFloat32Array(t){const e=Zt.allocate(t.byteLength+2);e[0]=ft.VECTOR_TYPE.Float32,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2),Xt.isBigEndian&&Zt.swap32(new Uint8Array(e.buffer,2));const i=new this(e,this.SUBTYPE_VECTOR);return gt(i),i}static fromPackedBits(t,e=0){const n=Zt.allocate(t.byteLength+2);n[0]=ft.VECTOR_TYPE.PackedBit,n[1]=e,n.set(t,2);const i=new this(n,this.SUBTYPE_VECTOR);return gt(i),i}static fromBits(t){const e=t.length+7>>>3,n=new Uint8Array(e+2);n[0]=ft.VECTOR_TYPE.PackedBit;const i=t.length%8;n[1]=0===i?0:8-i;for(let e=0;e<t.length;e++){const i=e>>>3,o=t[e];if(0!==o&&1!==o)throw new $(`Invalid bit value at ${e}: must be 0 or 1, found ${t[e]}`);if(0===o)continue;const l=7-e%8;n[i+2]|=o<<l}return new this(n,ft.SUBTYPE_VECTOR)}}function gt(t){if(t.sub_type!==ft.SUBTYPE_VECTOR)return;const e=t.position,n=t.buffer[0],i=t.buffer[1];if((n===ft.VECTOR_TYPE.Float32||n===ft.VECTOR_TYPE.Int8)&&0!==i)throw new $("Invalid Vector: padding must be zero for int8 and float32 vectors");if(n===ft.VECTOR_TYPE.Float32&&0!==e&&e-2!=0&&(e-2)%4!=0)throw new $("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");if(n===ft.VECTOR_TYPE.PackedBit&&0!==i&&2===e)throw new $("Invalid Vector: padding must be zero for packed bit vectors that are empty");if(n===ft.VECTOR_TYPE.PackedBit&&i>7)throw new $(`Invalid Vector: padding must be a value between 0 and 7. found: ${i}`)}const Wt=/^[0-9A-F]{32}$/i,St=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;class It extends ft{constructor(t){let e;if(null==t)e=It.generate();else if(t instanceof It)e=Zt.toLocalBufferType(new Uint8Array(t.buffer));else if(ArrayBuffer.isView(t)&&16===t.byteLength)e=Zt.toLocalBufferType(t);else{if("string"!=typeof t)throw new $("Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).");e=It.bytesFromString(t)}super(e,D)}get id(){return this.buffer}set id(t){this.buffer=t}toHexString(t=!0){return t?[Zt.toHex(this.buffer.subarray(0,4)),Zt.toHex(this.buffer.subarray(4,6)),Zt.toHex(this.buffer.subarray(6,8)),Zt.toHex(this.buffer.subarray(8,10)),Zt.toHex(this.buffer.subarray(10,16))].join("-"):Zt.toHex(this.buffer)}toString(t){return"hex"===t?Zt.toHex(this.id):"base64"===t?Zt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}equals(t){if(!t)return!1;if(t instanceof It)return Zt.equals(t.id,this.id);try{return Zt.equals(new It(t).id,this.id)}catch{return!1}}toBinary(){return new ft(this.id,ft.SUBTYPE_UUID)}static generate(){const t=Zt.randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,t}static isValid(t){return!!t&&("string"==typeof t?It.isValidUUIDString(t):Z(t)?16===t.byteLength:"Binary"===t._bsontype&&t.sub_type===this.SUBTYPE_UUID&&16===t.buffer.byteLength)}static createFromHexString(t){const e=It.bytesFromString(t);return new It(e)}static createFromBase64(t){return new It(Zt.fromBase64(t))}static bytesFromString(t){if(!It.isValidUUIDString(t))throw new $("UUID string representation must be 32 hex digits or canonical hyphenated representation");return Zt.fromHex(t.replace(/-/g,""))}static isValidUUIDString(t){return Wt.test(t)||St.test(t)}inspect(t,e,n){return n??=V,`new UUID(${n(this.toHexString(),e)})`}}class Tt extends pt{get _bsontype(){return"Code"}code;scope;constructor(t,e){super(),this.code=t.toString(),this.scope=e??null}toJSON(){return null!=this.scope?{code:this.code,scope:this.scope}:{code:this.code}}toExtendedJSON(){return this.scope?{$code:this.code,$scope:this.scope}:{$code:this.code}}static fromExtendedJSON(t){return new Tt(t.$code,t.$scope)}inspect(t,e,n){n??=V;let i=n(this.code,e);const o=i.includes("\n");null!=this.scope&&(i+=`,${o?"\n":" "}${n(this.scope,e)}`);return`new Code(${o?"\n":""}${i}${o&&null===this.scope?"\n":""})`}}function Ut(t){return null!=t&&"object"==typeof t&&"$id"in t&&null!=t.$id&&"$ref"in t&&"string"==typeof t.$ref&&(!("$db"in t)||"$db"in t&&"string"==typeof t.$db)}class Kt extends pt{get _bsontype(){return"DBRef"}collection;oid;db;fields;constructor(t,e,n,i){super();const o=t.split(".");2===o.length&&(n=o.shift(),t=o.shift()),this.collection=t,this.oid=e,this.db=n,this.fields=i||{}}get namespace(){return this.collection}set namespace(t){this.collection=t}toJSON(){const t=Object.assign({$ref:this.collection,$id:this.oid},this.fields);return null!=this.db&&(t.$db=this.db),t}toExtendedJSON(t){t=t||{};let e={$ref:this.collection,$id:this.oid};return t.legacy||(this.db&&(e.$db=this.db),e=Object.assign(e,this.fields)),e}static fromExtendedJSON(t){const e=Object.assign({},t);return delete e.$ref,delete e.$id,delete e.$db,new Kt(t.$ref,t.$id,t.$db,e)}inspect(t,e,n){n??=V;const i=[n(this.namespace,e),n(this.oid,e),...this.db?[n(this.db,e)]:[],...Object.keys(this.fields).length>0?[n(this.fields,e)]:[]];return i[1]=n===V?`new ObjectId(${i[1]})`:i[1],`new DBRef(${i.join(", ")})`}}function wt(t){if(""===t)return t;let e=0;const n="-"===t[e],i="+"===t[e];(i||n)&&(e+=1);let o=!1;for(;e<t.length&&"0"===t[e];++e)o=!0;return o?`${n?"-":""}${t.length===e?"0":t.slice(e)}`:i?t.slice(1):t}let Rt;try{Rt=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}const Jt=4294967296,Nt=0x10000000000000000,Yt=Nt/2,Lt={},zt={},xt=/^(\+?0|(\+|-)?[1-9][0-9]*)$/;class Ct extends pt{get _bsontype(){return"Long"}get __isLong__(){return!0}high;low;unsigned;constructor(t=0,e,n){super();const i="boolean"==typeof e?e:Boolean(n),o="number"==typeof e?e:0,l="string"==typeof t?Ct.fromString(t,i):"bigint"==typeof t?Ct.fromBigInt(t,i):{low:0|t,high:0|o,unsigned:i};this.low=l.low,this.high=l.high,this.unsigned=l.unsigned}static TWO_PWR_24=Ct.fromInt(16777216);static MAX_UNSIGNED_VALUE=Ct.fromBits(-1,-1,!0);static ZERO=Ct.fromInt(0);static UZERO=Ct.fromInt(0,!0);static ONE=Ct.fromInt(1);static UONE=Ct.fromInt(1,!0);static NEG_ONE=Ct.fromInt(-1);static MAX_VALUE=Ct.fromBits(-1,2147483647,!1);static MIN_VALUE=Ct.fromBits(0,-2147483648,!1);static fromBits(t,e,n){return new Ct(t,e,n)}static fromInt(t,e){let n,i,o;return e?(o=0<=(t>>>=0)&&t<256)&&(i=zt[t],i)?i:(n=Ct.fromBits(t,(0|t)<0?-1:0,!0),o&&(zt[t]=n),n):(o=-128<=(t|=0)&&t<128)&&(i=Lt[t],i)?i:(n=Ct.fromBits(t,t<0?-1:0,!1),o&&(Lt[t]=n),n)}static fromNumber(t,e){if(isNaN(t))return e?Ct.UZERO:Ct.ZERO;if(e){if(t<0)return Ct.UZERO;if(t>=Nt)return Ct.MAX_UNSIGNED_VALUE}else{if(t<=-Yt)return Ct.MIN_VALUE;if(t+1>=Yt)return Ct.MAX_VALUE}return t<0?Ct.fromNumber(-t,e).neg():Ct.fromBits(t%Jt|0,t/Jt|0,e)}static fromBigInt(t,e){const n=0xffffffffn;return new Ct(Number(t&n),Number(t>>32n&n),e)}static _fromString(t,e,n){if(0===t.length)throw new $("empty string");if(n<2||36<n)throw new $("radix");let i;if((i=t.indexOf("-"))>0)throw new $("interior hyphen");if(0===i)return Ct._fromString(t.substring(1),e,n).neg();const o=Ct.fromNumber(Math.pow(n,8));let l=Ct.ZERO;for(let e=0;e<t.length;e+=8){const i=Math.min(8,t.length-e),a=parseInt(t.substring(e,e+i),n);if(i<8){const t=Ct.fromNumber(Math.pow(n,i));l=l.mul(t).add(Ct.fromNumber(a))}else l=l.mul(o),l=l.add(Ct.fromNumber(a))}return l.unsigned=e,l}static fromStringStrict(t,e,n){let i=!1;if("number"==typeof e?(n=e,e=!1):i=!!e,n??=10,t.trim()!==t)throw new $(`Input: '${t}' contains leading and/or trailing whitespace`);if(!function(t,e){const n="0123456789abcdefghijklmnopqrstuvwxyz".slice(0,e=e??10);return!new RegExp(`[^-+${n}]`,"i").test(t)&&t}(t,n))throw new $(`Input: '${t}' contains invalid characters for radix: ${n}`);const o=wt(t),l=Ct._fromString(o,i,n);if(l.toString(n).toLowerCase()!==o.toLowerCase())throw new $(`Input: ${t} is not representable as ${l.unsigned?"an unsigned":"a signed"} 64-bit Long ${null!=n?`with radix: ${n}`:""}`);return l}static fromString(t,e,n){let i=!1;return"number"==typeof e?(n=e,e=!1):i=!!e,n??=10,"NaN"===t&&n<24||("Infinity"===t||"+Infinity"===t||"-Infinity"===t)&&n<35?Ct.ZERO:Ct._fromString(t,i,n)}static fromBytes(t,e,n){return n?Ct.fromBytesLE(t,e):Ct.fromBytesBE(t,e)}static fromBytesLE(t,e){return new Ct(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24,e)}static fromBytesBE(t,e){return new Ct(t[4]<<24|t[5]<<16|t[6]<<8|t[7],t[0]<<24|t[1]<<16|t[2]<<8|t[3],e)}static isLong(t){return null!=t&&"object"==typeof t&&"__isLong__"in t&&!0===t.__isLong__}static fromValue(t,e){return"number"==typeof t?Ct.fromNumber(t,e):"string"==typeof t?Ct.fromString(t,e):Ct.fromBits(t.low,t.high,"boolean"==typeof e?e:t.unsigned)}add(t){Ct.isLong(t)||(t=Ct.fromValue(t));const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,o=65535&this.low,l=t.high>>>16,a=65535&t.high,s=t.low>>>16;let c=0,r=0,d=0,u=0;return u+=o+(65535&t.low),d+=u>>>16,u&=65535,d+=i+s,r+=d>>>16,d&=65535,r+=n+a,c+=r>>>16,r&=65535,c+=e+l,c&=65535,Ct.fromBits(d<<16|u,c<<16|r,this.unsigned)}and(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),Ct.fromBits(this.low&t.low,this.high&t.high,this.unsigned)}compare(t){if(Ct.isLong(t)||(t=Ct.fromValue(t)),this.eq(t))return 0;const e=this.isNegative(),n=t.isNegative();return e&&!n?-1:!e&&n?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1}comp(t){return this.compare(t)}divide(t){if(Ct.isLong(t)||(t=Ct.fromValue(t)),t.isZero())throw new $("division by zero");if(Rt){if(!this.unsigned&&-2147483648===this.high&&-1===t.low&&-1===t.high)return this;const e=(this.unsigned?Rt.div_u:Rt.div_s)(this.low,this.high,t.low,t.high);return Ct.fromBits(e,Rt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?Ct.UZERO:Ct.ZERO;let e,n,i;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return Ct.UZERO;if(t.gt(this.shru(1)))return Ct.UONE;i=Ct.UZERO}else{if(this.eq(Ct.MIN_VALUE)){if(t.eq(Ct.ONE)||t.eq(Ct.NEG_ONE))return Ct.MIN_VALUE;if(t.eq(Ct.MIN_VALUE))return Ct.ONE;return e=this.shr(1).div(t).shl(1),e.eq(Ct.ZERO)?t.isNegative()?Ct.ONE:Ct.NEG_ONE:(n=this.sub(t.mul(e)),i=e.add(n.div(t)),i)}if(t.eq(Ct.MIN_VALUE))return this.unsigned?Ct.UZERO:Ct.ZERO;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();i=Ct.ZERO}for(n=this;n.gte(t);){e=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));const o=Math.ceil(Math.log(e)/Math.LN2),l=o<=48?1:Math.pow(2,o-48);let a=Ct.fromNumber(e),s=a.mul(t);for(;s.isNegative()||s.gt(n);)e-=l,a=Ct.fromNumber(e,this.unsigned),s=a.mul(t);a.isZero()&&(a=Ct.ONE),i=i.add(a),n=n.sub(s)}return i}div(t){return this.divide(t)}equals(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),(this.unsigned===t.unsigned||this.high>>>31!=1||t.high>>>31!=1)&&(this.high===t.high&&this.low===t.low)}eq(t){return this.equals(t)}getHighBits(){return this.high}getHighBitsUnsigned(){return this.high>>>0}getLowBits(){return this.low}getLowBitsUnsigned(){return this.low>>>0}getNumBitsAbs(){if(this.isNegative())return this.eq(Ct.MIN_VALUE)?64:this.neg().getNumBitsAbs();const t=0!==this.high?this.high:this.low;let e;for(e=31;e>0&&!(t&1<<e);e--);return 0!==this.high?e+33:e+1}greaterThan(t){return this.comp(t)>0}gt(t){return this.greaterThan(t)}greaterThanOrEqual(t){return this.comp(t)>=0}gte(t){return this.greaterThanOrEqual(t)}ge(t){return this.greaterThanOrEqual(t)}isEven(){return!(1&this.low)}isNegative(){return!this.unsigned&&this.high<0}isOdd(){return!(1&~this.low)}isPositive(){return this.unsigned||this.high>=0}isZero(){return 0===this.high&&0===this.low}lessThan(t){return this.comp(t)<0}lt(t){return this.lessThan(t)}lessThanOrEqual(t){return this.comp(t)<=0}lte(t){return this.lessThanOrEqual(t)}modulo(t){if(Ct.isLong(t)||(t=Ct.fromValue(t)),Rt){const e=(this.unsigned?Rt.rem_u:Rt.rem_s)(this.low,this.high,t.low,t.high);return Ct.fromBits(e,Rt.get_high(),this.unsigned)}return this.sub(this.div(t).mul(t))}mod(t){return this.modulo(t)}rem(t){return this.modulo(t)}multiply(t){if(this.isZero())return Ct.ZERO;if(Ct.isLong(t)||(t=Ct.fromValue(t)),Rt){const e=Rt.mul(this.low,this.high,t.low,t.high);return Ct.fromBits(e,Rt.get_high(),this.unsigned)}if(t.isZero())return Ct.ZERO;if(this.eq(Ct.MIN_VALUE))return t.isOdd()?Ct.MIN_VALUE:Ct.ZERO;if(t.eq(Ct.MIN_VALUE))return this.isOdd()?Ct.MIN_VALUE:Ct.ZERO;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(Ct.TWO_PWR_24)&&t.lt(Ct.TWO_PWR_24))return Ct.fromNumber(this.toNumber()*t.toNumber(),this.unsigned);const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,o=65535&this.low,l=t.high>>>16,a=65535&t.high,s=t.low>>>16,c=65535&t.low;let r=0,d=0,u=0,b=0;return b+=o*c,u+=b>>>16,b&=65535,u+=i*c,d+=u>>>16,u&=65535,u+=o*s,d+=u>>>16,u&=65535,d+=n*c,r+=d>>>16,d&=65535,d+=i*s,r+=d>>>16,d&=65535,d+=o*a,r+=d>>>16,d&=65535,r+=e*c+n*s+i*a+o*l,r&=65535,Ct.fromBits(u<<16|b,r<<16|d,this.unsigned)}mul(t){return this.multiply(t)}negate(){return!this.unsigned&&this.eq(Ct.MIN_VALUE)?Ct.MIN_VALUE:this.not().add(Ct.ONE)}neg(){return this.negate()}not(){return Ct.fromBits(~this.low,~this.high,this.unsigned)}notEquals(t){return!this.equals(t)}neq(t){return this.notEquals(t)}ne(t){return this.notEquals(t)}or(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),Ct.fromBits(this.low|t.low,this.high|t.high,this.unsigned)}shiftLeft(t){return Ct.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?Ct.fromBits(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):Ct.fromBits(0,this.low<<t-32,this.unsigned)}shl(t){return this.shiftLeft(t)}shiftRight(t){return Ct.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?Ct.fromBits(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):Ct.fromBits(this.high>>t-32,this.high>=0?0:-1,this.unsigned)}shr(t){return this.shiftRight(t)}shiftRightUnsigned(t){if(Ct.isLong(t)&&(t=t.toInt()),0===(t&=63))return this;{const e=this.high;if(t<32){const n=this.low;return Ct.fromBits(n>>>t|e<<32-t,e>>>t,this.unsigned)}return 32===t?Ct.fromBits(e,0,this.unsigned):Ct.fromBits(e>>>t-32,0,this.unsigned)}}shr_u(t){return this.shiftRightUnsigned(t)}shru(t){return this.shiftRightUnsigned(t)}subtract(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),this.add(t.neg())}sub(t){return this.subtract(t)}toInt(){return this.unsigned?this.low>>>0:this.low}toNumber(){return this.unsigned?(this.high>>>0)*Jt+(this.low>>>0):this.high*Jt+(this.low>>>0)}toBigInt(){return BigInt(this.toString())}toBytes(t){return t?this.toBytesLE():this.toBytesBE()}toBytesLE(){const t=this.high,e=this.low;return[255&e,e>>>8&255,e>>>16&255,e>>>24,255&t,t>>>8&255,t>>>16&255,t>>>24]}toBytesBE(){const t=this.high,e=this.low;return[t>>>24,t>>>16&255,t>>>8&255,255&t,e>>>24,e>>>16&255,e>>>8&255,255&e]}toSigned(){return this.unsigned?Ct.fromBits(this.low,this.high,!1):this}toString(t){if((t=t||10)<2||36<t)throw new $("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(Ct.MIN_VALUE)){const e=Ct.fromNumber(t),n=this.div(e),i=n.mul(e).sub(this);return n.toString(t)+i.toInt().toString(t)}return"-"+this.neg().toString(t)}const e=Ct.fromNumber(Math.pow(t,6),this.unsigned);let n=this,i="";for(;;){const o=n.div(e);let l=(n.sub(o.mul(e)).toInt()>>>0).toString(t);if(n=o,n.isZero())return l+i;for(;l.length<6;)l="0"+l;i=""+l+i}}toUnsigned(){return this.unsigned?this:Ct.fromBits(this.low,this.high,!0)}xor(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),Ct.fromBits(this.low^t.low,this.high^t.high,this.unsigned)}eqz(){return this.isZero()}le(t){return this.lessThanOrEqual(t)}toExtendedJSON(t){return t&&t.relaxed?this.toNumber():{$numberLong:this.toString()}}static fromExtendedJSON(t,e){const{useBigInt64:n=!1,relaxed:i=!0}={...e};if(t.$numberLong.length>20)throw new $("$numberLong string is too long");if(!xt.test(t.$numberLong))throw new $(`$numberLong string "${t.$numberLong}" is in an invalid format`);if(n){const e=BigInt(t.$numberLong);return BigInt.asIntN(64,e)}const o=Ct.fromString(t.$numberLong);return i?o.toNumber():o}inspect(t,e,n){n??=V;return`new Long(${n(this.toString(),e)}${this.unsigned?`, ${n(this.unsigned,e)}`:""})`}}const kt=/^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/,Bt=/^(\+|-)?(Infinity|inf)$/i,Pt=/^(\+|-)?NaN$/i,Ht=6111,vt=-6176,Mt=Zt.fromNumberArray([124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),jt=Zt.fromNumberArray([248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Qt=Zt.fromNumberArray([120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Et=/^([-+])?(\d+)?$/;function Ot(t){return!isNaN(parseInt(t,10))}function _t(t){const e=Ct.fromNumber(1e9);let n=Ct.fromNumber(0);if(!(t.parts[0]||t.parts[1]||t.parts[2]||t.parts[3]))return{quotient:t,rem:n};for(let i=0;i<=3;i++)n=n.shiftLeft(32),n=n.add(new Ct(t.parts[i],0)),t.parts[i]=n.div(e).low,n=n.modulo(e);return{quotient:t,rem:n}}function Ft(t,e){throw new $(`"${t}" is not a valid Decimal128 string - ${e}`)}class Dt extends pt{get _bsontype(){return"Decimal128"}bytes;constructor(t){if(super(),"string"==typeof t)this.bytes=Dt.fromString(t).bytes;else{if(!(t instanceof Uint8Array||Z(t)))throw new $("Decimal128 must take a Buffer or string");if(16!==t.byteLength)throw new $("Decimal128 must take a Buffer of 16 bytes");this.bytes=t}}static fromString(t){return Dt._fromString(t,{allowRounding:!1})}static fromStringWithRounding(t){return Dt._fromString(t,{allowRounding:!0})}static _fromString(t,e){let n=!1,i=!1,o=!1,l=!1,a=0,s=0,c=0,r=0,d=0;const u=[0];let b=0,m=0,Z=0,h=0,p=new Ct(0,0),y=new Ct(0,0),G=0,V=0;if(t.length>=7e3)throw new $(t+" not a valid Decimal128 string");const X=t.match(kt),f=t.match(Bt),g=t.match(Pt);if(!X&&!f&&!g||0===t.length)throw new $(t+" not a valid Decimal128 string");if(X){const e=X[2],n=X[4],i=X[5],o=X[6];n&&void 0===o&&Ft(t,"missing exponent power"),n&&void 0===e&&Ft(t,"missing exponent base"),void 0===n&&(i||o)&&Ft(t,"missing e before exponent")}if("+"!==t[V]&&"-"!==t[V]||(i=!0,n="-"===t[V++]),!Ot(t[V])&&"."!==t[V]){if("i"===t[V]||"I"===t[V])return new Dt(n?jt:Qt);if("N"===t[V])return new Dt(Mt)}for(;Ot(t[V])||"."===t[V];)"."!==t[V]?(b<34&&("0"!==t[V]||l)&&(l||(d=s),l=!0,u[m++]=parseInt(t[V],10),b+=1),l&&(c+=1),o&&(r+=1),s+=1,V+=1):(o&&Ft(t,"contains multiple periods"),o=!0,V+=1);if(o&&!s)throw new $(t+" not a valid Decimal128 string");if("e"===t[V]||"E"===t[V]){const e=t.substr(++V).match(Et);if(!e||!e[2])return new Dt(Mt);h=parseInt(e[0],10),V+=e[0].length}if(t[V])return new Dt(Mt);if(b){if(Z=b-1,a=c,1!==a)for(;"0"===t[d+a-1+Number(i)+Number(o)];)a-=1}else u[0]=0,c=1,b=1,a=0;for(h<=r&&r>h+16384?h=vt:h-=r;h>Ht;){if(Z+=1,Z>=34){if(0===a){h=Ht;break}Ft(t,"overflow")}h-=1}if(e.allowRounding){for(;h<vt||b<c;){if(0===Z&&a<b){h=vt,a=0;break}if(b<c?c-=1:Z-=1,h<Ht)h+=1;else{if(u.join("").match(/^0+$/)){h=Ht;break}Ft(t,"overflow")}}if(Z+1<a){let e=s;o&&(d+=1,e+=1),i&&(d+=1,e+=1);const l=parseInt(t[d+Z+1],10);let a=0;if(l>=5&&(a=1,5===l)){a=u[Z]%2==1?1:0;for(let n=d+Z+2;n<e;n++)if(parseInt(t[n],10)){a=1;break}}if(a){let t=Z;for(;t>=0&&++u[t]>9;t--)if(u[t]=0,0===t){if(!(h<Ht))return new Dt(n?jt:Qt);h+=1,u[t]=1}}}}else{for(;h<vt||b<c;){if(0===Z){if(0===a){h=vt;break}Ft(t,"exponent underflow")}b<c?("0"!==t[c-1+Number(i)+Number(o)]&&0!==a&&Ft(t,"inexact rounding"),c-=1):(0!==u[Z]&&Ft(t,"inexact rounding"),Z-=1),h<Ht?h+=1:Ft(t,"overflow")}if(Z+1<a){o&&(d+=1),i&&(d+=1);0!==parseInt(t[d+Z+1],10)&&Ft(t,"inexact rounding")}}if(p=Ct.fromNumber(0),y=Ct.fromNumber(0),0===a)p=Ct.fromNumber(0),y=Ct.fromNumber(0);else if(Z<17){let t=0;for(y=Ct.fromNumber(u[t++]),p=new Ct(0,0);t<=Z;t++)y=y.multiply(Ct.fromNumber(10)),y=y.add(Ct.fromNumber(u[t]))}else{let t=0;for(p=Ct.fromNumber(u[t++]);t<=Z-17;t++)p=p.multiply(Ct.fromNumber(10)),p=p.add(Ct.fromNumber(u[t]));for(y=Ct.fromNumber(u[t++]);t<=Z;t++)y=y.multiply(Ct.fromNumber(10)),y=y.add(Ct.fromNumber(u[t]))}const W=function(t,e){if(!t&&!e)return{high:Ct.fromNumber(0),low:Ct.fromNumber(0)};const n=t.shiftRightUnsigned(32),i=new Ct(t.getLowBits(),0),o=e.shiftRightUnsigned(32),l=new Ct(e.getLowBits(),0);let a=n.multiply(o),s=n.multiply(l);const c=i.multiply(o);let r=i.multiply(l);return a=a.add(s.shiftRightUnsigned(32)),s=new Ct(s.getLowBits(),0).add(c).add(r.shiftRightUnsigned(32)),a=a.add(s.shiftRightUnsigned(32)),r=s.shiftLeft(32).add(new Ct(r.getLowBits(),0)),{high:a,low:r}}(p,Ct.fromString("100000000000000000"));W.low=W.low.add(y),function(t,e){const n=t.high>>>0,i=e.high>>>0;if(n<i)return!0;if(n===i&&t.low>>>0<e.low>>>0)return!0;return!1}(W.low,y)&&(W.high=W.high.add(Ct.fromNumber(1))),G=h+6176;const S={low:Ct.fromNumber(0),high:Ct.fromNumber(0)};W.high.shiftRightUnsigned(49).and(Ct.fromNumber(1)).equals(Ct.fromNumber(1))?(S.high=S.high.or(Ct.fromNumber(3).shiftLeft(61)),S.high=S.high.or(Ct.fromNumber(G).and(Ct.fromNumber(16383).shiftLeft(47))),S.high=S.high.or(W.high.and(Ct.fromNumber(0x7fffffffffff)))):(S.high=S.high.or(Ct.fromNumber(16383&G).shiftLeft(49)),S.high=S.high.or(W.high.and(Ct.fromNumber(562949953421311)))),S.low=W.low,n&&(S.high=S.high.or(Ct.fromString("9223372036854775808")));const I=Zt.allocateUnsafe(16);return V=0,I[V++]=255&S.low.low,I[V++]=S.low.low>>8&255,I[V++]=S.low.low>>16&255,I[V++]=S.low.low>>24&255,I[V++]=255&S.low.high,I[V++]=S.low.high>>8&255,I[V++]=S.low.high>>16&255,I[V++]=S.low.high>>24&255,I[V++]=255&S.high.low,I[V++]=S.high.low>>8&255,I[V++]=S.high.low>>16&255,I[V++]=S.high.low>>24&255,I[V++]=255&S.high.high,I[V++]=S.high.high>>8&255,I[V++]=S.high.high>>16&255,I[V++]=S.high.high>>24&255,new Dt(I)}toString(){let t,e=0;const n=new Array(36);for(let t=0;t<n.length;t++)n[t]=0;let i,o,l,a=0,s=!1,c={parts:[0,0,0,0]};const r=[];a=0;const d=this.bytes,u=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24,b=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24,m=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24,Z=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24;a=0;({low:new Ct(u,b),high:new Ct(m,Z)}).high.lessThan(Ct.ZERO)&&r.push("-");const h=Z>>26&31;if(h>>3==3){if(30===h)return r.join("")+"Infinity";if(31===h)return"NaN";t=Z>>15&16383,i=8+(Z>>14&1)}else i=Z>>14&7,t=Z>>17&16383;const p=t-6176;if(c.parts[0]=(16383&Z)+((15&i)<<14),c.parts[1]=m,c.parts[2]=b,c.parts[3]=u,0===c.parts[0]&&0===c.parts[1]&&0===c.parts[2]&&0===c.parts[3])s=!0;else for(l=3;l>=0;l--){let t=0;const e=_t(c);if(c=e.quotient,t=e.rem.low,t)for(o=8;o>=0;o--)n[9*l+o]=t%10,t=Math.floor(t/10)}if(s)e=1,n[a]=0;else for(e=36;!n[a];)e-=1,a+=1;const y=e-1+p;if(y>=34||y<=-7||p>0){if(e>34)return r.push("0"),p>0?r.push(`E+${p}`):p<0&&r.push(`E${p}`),r.join("");r.push(`${n[a++]}`),e-=1,e&&r.push(".");for(let t=0;t<e;t++)r.push(`${n[a++]}`);r.push("E"),y>0?r.push(`+${y}`):r.push(`${y}`)}else if(p>=0)for(let t=0;t<e;t++)r.push(`${n[a++]}`);else{let t=e+p;if(t>0)for(let e=0;e<t;e++)r.push(`${n[a++]}`);else r.push("0");for(r.push(".");t++<0;)r.push("0");for(let i=0;i<e-Math.max(t-1,0);i++)r.push(`${n[a++]}`)}return r.join("")}toJSON(){return{$numberDecimal:this.toString()}}toExtendedJSON(){return{$numberDecimal:this.toString()}}static fromExtendedJSON(t){return Dt.fromString(t.$numberDecimal)}inspect(t,e,n){n??=V;return`new Decimal128(${n(this.toString(),e)})`}}class At extends pt{get _bsontype(){return"Double"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=+t}static fromString(t){const e=Number(t);if("NaN"===t)return new At(NaN);if("Infinity"===t)return new At(1/0);if("-Infinity"===t)return new At(-1/0);if(!Number.isFinite(e))throw new $(`Input: ${t} is not representable as a Double`);if(t.trim()!==t)throw new $(`Input: '${t}' contains whitespace`);if(""===t)throw new $("Input is an empty string");if(/[^-0-9.+eE]/.test(t))throw new $(`Input: '${t}' is not in decimal or exponential notation`);return new At(e)}valueOf(){return this.value}toJSON(){return this.value}toString(t){return this.value.toString(t)}toExtendedJSON(t){return t&&(t.legacy||t.relaxed&&isFinite(this.value))?this.value:Object.is(Math.sign(this.value),-0)?{$numberDouble:"-0.0"}:{$numberDouble:Number.isInteger(this.value)?this.value.toFixed(1):this.value.toString()}}static fromExtendedJSON(t,e){const n=parseFloat(t.$numberDouble);return e&&e.relaxed?n:new At(n)}inspect(t,e,n){return n??=V,`new Double(${n(this.value,e)})`}}class $t extends pt{get _bsontype(){return"Int32"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=0|+t}static fromString(t){const e=wt(t),n=Number(t);if(g<n)throw new $(`Input: '${t}' is larger than the maximum value for Int32`);if(W>n)throw new $(`Input: '${t}' is smaller than the minimum value for Int32`);if(!Number.isSafeInteger(n))throw new $(`Input: '${t}' is not a safe integer`);if(n.toString()!==e)throw new $(`Input: '${t}' is not a valid Int32 string`);return new $t(n)}valueOf(){return this.value}toString(t){return this.value.toString(t)}toJSON(){return this.value}toExtendedJSON(t){return t&&(t.relaxed||t.legacy)?this.value:{$numberInt:this.value.toString()}}static fromExtendedJSON(t,e){return e&&e.relaxed?parseInt(t.$numberInt,10):new $t(t.$numberInt)}inspect(t,e,n){return n??=V,`new Int32(${n(this.value,e)})`}}class qt extends pt{get _bsontype(){return"MaxKey"}toExtendedJSON(){return{$maxKey:1}}static fromExtendedJSON(){return new qt}inspect(){return"new MaxKey()"}}class te extends pt{get _bsontype(){return"MinKey"}toExtendedJSON(){return{$minKey:1}}static fromExtendedJSON(){return new te}inspect(){return"new MinKey()"}}let ee=null;const ne=new WeakMap;class ie extends pt{get _bsontype(){return"ObjectId"}static index=Math.floor(16777215*Math.random());static cacheHexString;buffer;constructor(t){let e;if(super(),"object"==typeof t&&t&&"id"in t){if("string"!=typeof t.id&&!ArrayBuffer.isView(t.id))throw new $("Argument passed in must have an id that is of type string or Buffer");e="toHexString"in t&&"function"==typeof t.toHexString?Zt.fromHex(t.toHexString()):t.id}else e=t;if(null==e)this.buffer=ie.generate();else if(ArrayBuffer.isView(e)&&12===e.byteLength)this.buffer=Zt.toLocalBufferType(e);else{if("string"!=typeof e)throw new $("Argument passed in does not match the accepted types");if(!ie.validateHexString(e))throw new $("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");this.buffer=Zt.fromHex(e),ie.cacheHexString&&ne.set(this,e)}}get id(){return this.buffer}set id(t){this.buffer=t,ie.cacheHexString&&ne.set(this,Zt.toHex(t))}static validateHexString(t){if(24!==t?.length)return!1;for(let e=0;e<24;e++){const n=t.charCodeAt(e);if(!(n>=48&&n<=57||n>=97&&n<=102||n>=65&&n<=70))return!1}return!0}toHexString(){if(ie.cacheHexString){const t=ne.get(this);if(t)return t}const t=Zt.toHex(this.id);return ie.cacheHexString&&ne.set(this,t),t}static getInc(){return ie.index=(ie.index+1)%16777215}static generate(t){"number"!=typeof t&&(t=Math.floor(Date.now()/1e3));const e=ie.getInc(),n=Zt.allocateUnsafe(12);return Xt.setInt32BE(n,0,t),null===ee&&(ee=Zt.randomBytes(5)),n[4]=ee[0],n[5]=ee[1],n[6]=ee[2],n[7]=ee[3],n[8]=ee[4],n[11]=255&e,n[10]=e>>8&255,n[9]=e>>16&255,n}toString(t){return"base64"===t?Zt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}static is(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"ObjectId"===t._bsontype}equals(t){if(null==t)return!1;if(ie.is(t))return this.buffer[11]===t.buffer[11]&&Zt.equals(this.buffer,t.buffer);if("string"==typeof t)return t.toLowerCase()===this.toHexString();if("object"==typeof t&&"function"==typeof t.toHexString){const e=t.toHexString(),n=this.toHexString();return"string"==typeof e&&e.toLowerCase()===n}return!1}getTimestamp(){const t=new Date,e=Xt.getUint32BE(this.buffer,0);return t.setTime(1e3*Math.floor(e)),t}static createPk(){return new ie}serializeInto(t,e){return t[e]=this.buffer[0],t[e+1]=this.buffer[1],t[e+2]=this.buffer[2],t[e+3]=this.buffer[3],t[e+4]=this.buffer[4],t[e+5]=this.buffer[5],t[e+6]=this.buffer[6],t[e+7]=this.buffer[7],t[e+8]=this.buffer[8],t[e+9]=this.buffer[9],t[e+10]=this.buffer[10],t[e+11]=this.buffer[11],12}static createFromTime(t){const e=Zt.allocate(12);for(let t=11;t>=4;t--)e[t]=0;return Xt.setInt32BE(e,0,t),new ie(e)}static createFromHexString(t){if(24!==t?.length)throw new $("hex string must be 24 characters");return new ie(Zt.fromHex(t))}static createFromBase64(t){if(16!==t?.length)throw new $("base64 string must be 16 characters");return new ie(Zt.fromBase64(t))}static isValid(t){if(null==t)return!1;if("string"==typeof t)return ie.validateHexString(t);try{return new ie(t),!0}catch{return!1}}toExtendedJSON(){return this.toHexString?{$oid:this.toHexString()}:{$oid:this.toString("hex")}}static fromExtendedJSON(t){return new ie(t.$oid)}isCached(){return ie.cacheHexString&&ne.has(this)}inspect(t,e,n){return n??=V,`new ObjectId(${n(this.toHexString(),e)})`}}function oe(t,e,n){let i=5;if(Array.isArray(t))for(let o=0;o<t.length;o++)i+=le(o.toString(),t[o],e,!0,n);else{"function"==typeof t?.toBSON&&(t=t.toBSON());for(const o of Object.keys(t))i+=le(o,t[o],e,!1,n)}return i}function le(t,e,n=!1,i=!1,o=!1){switch("function"==typeof e?.toBSON&&(e=e.toBSON()),typeof e){case"string":return 1+Zt.utf8ByteLength(t)+1+4+Zt.utf8ByteLength(e)+1;case"number":return Math.floor(e)===e&&e>=U&&e<=T&&e>=W&&e<=g?(null!=t?Zt.utf8ByteLength(t)+1:0)+5:(null!=t?Zt.utf8ByteLength(t)+1:0)+9;case"undefined":return i||!o?(null!=t?Zt.utf8ByteLength(t)+1:0)+1:0;case"boolean":return(null!=t?Zt.utf8ByteLength(t)+1:0)+2;case"object":if(null!=e&&"string"==typeof e._bsontype&&e[f]!==X)throw new q;if(null==e||"MinKey"===e._bsontype||"MaxKey"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+1;if("ObjectId"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+13;if(e instanceof Date||G(e))return(null!=t?Zt.utf8ByteLength(t)+1:0)+9;if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer||h(e))return(null!=t?Zt.utf8ByteLength(t)+1:0)+6+e.byteLength;if("Long"===e._bsontype||"Double"===e._bsontype||"Timestamp"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+9;if("Decimal128"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+17;if("Code"===e._bsontype)return null!=e.scope&&Object.keys(e.scope).length>0?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+4+4+Zt.utf8ByteLength(e.code.toString())+1+oe(e.scope,n,o):(null!=t?Zt.utf8ByteLength(t)+1:0)+1+4+Zt.utf8ByteLength(e.code.toString())+1;if("Binary"===e._bsontype){const n=e;return n.sub_type===ft.SUBTYPE_BYTE_ARRAY?(null!=t?Zt.utf8ByteLength(t)+1:0)+(n.position+1+4+1+4):(null!=t?Zt.utf8ByteLength(t)+1:0)+(n.position+1+4+1)}if("Symbol"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+Zt.utf8ByteLength(e.value)+4+1+1;if("DBRef"===e._bsontype){const i=Object.assign({$ref:e.collection,$id:e.oid},e.fields);return null!=e.db&&(i.$db=e.db),(null!=t?Zt.utf8ByteLength(t)+1:0)+1+oe(i,n,o)}return e instanceof RegExp||p(e)?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+Zt.utf8ByteLength(e.source)+1+(e.global?1:0)+(e.ignoreCase?1:0)+(e.multiline?1:0)+1:"BSONRegExp"===e._bsontype?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+Zt.utf8ByteLength(e.pattern)+1+Zt.utf8ByteLength(e.options)+1:(null!=t?Zt.utf8ByteLength(t)+1:0)+oe(e,n,o)+1;case"function":return n?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+4+Zt.utf8ByteLength(e.toString())+1:0;case"bigint":return(null!=t?Zt.utf8ByteLength(t)+1:0)+9;case"symbol":return 0;default:throw new $("Unrecognized JS type: "+typeof e)}}class ae extends pt{get _bsontype(){return"BSONRegExp"}pattern;options;constructor(t,e){if(super(),this.pattern=t,this.options=(e??"").split("").sort().join(""),-1!==this.pattern.indexOf("\0"))throw new $(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);if(-1!==this.options.indexOf("\0"))throw new $(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`);for(let t=0;t<this.options.length;t++)if("i"!==this.options[t]&&"m"!==this.options[t]&&"x"!==this.options[t]&&"l"!==this.options[t]&&"s"!==this.options[t]&&"u"!==this.options[t])throw new $(`The regular expression option [${this.options[t]}] is not supported`)}static parseOptions(t){return t?t.split("").sort().join(""):""}toExtendedJSON(t){return(t=t||{}).legacy?{$regex:this.pattern,$options:this.options}:{$regularExpression:{pattern:this.pattern,options:this.options}}}static fromExtendedJSON(t){if("$regex"in t){if("string"==typeof t.$regex)return new ae(t.$regex,ae.parseOptions(t.$options));if("BSONRegExp"===t.$regex._bsontype)return t}if("$regularExpression"in t)return new ae(t.$regularExpression.pattern,ae.parseOptions(t.$regularExpression.options));throw new $(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`)}inspect(t,e,n){const i=function(t){if(null!=t&&"object"==typeof t&&"stylize"in t&&"function"==typeof t.stylize)return t.stylize}(e)??(t=>t);n??=V;return`new BSONRegExp(${i(n(this.pattern),"regexp")}, ${i(n(this.options),"regexp")})`}}class se extends pt{get _bsontype(){return"BSONSymbol"}value;constructor(t){super(),this.value=t}valueOf(){return this.value}toString(){return this.value}toJSON(){return this.value}toExtendedJSON(){return{$symbol:this.value}}static fromExtendedJSON(t){return new se(t.$symbol)}inspect(t,e,n){return n??=V,`new BSONSymbol(${n(this.value,e)})`}}const ce=Ct;class re extends ce{get _bsontype(){return"Timestamp"}get[ht](){return"Timestamp"}static MAX_VALUE=Ct.MAX_UNSIGNED_VALUE;get i(){return this.low>>>0}get t(){return this.high>>>0}constructor(t){if(null==t)super(0,0,!0);else if("bigint"==typeof t)super(t,!0);else if(Ct.isLong(t))super(t.low,t.high,!0);else{if("object"!=typeof t||!("t"in t)||!("i"in t))throw new $("A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }");{if("number"!=typeof t.t&&("object"!=typeof t.t||"Int32"!==t.t._bsontype))throw new $("Timestamp constructed from { t, i } must provide t as a number");if("number"!=typeof t.i&&("object"!=typeof t.i||"Int32"!==t.i._bsontype))throw new $("Timestamp constructed from { t, i } must provide i as a number");const e=Number(t.t),n=Number(t.i);if(e<0||Number.isNaN(e))throw new $("Timestamp constructed from { t, i } must provide a positive t");if(n<0||Number.isNaN(n))throw new $("Timestamp constructed from { t, i } must provide a positive i");if(e>4294967295)throw new $("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");if(n>4294967295)throw new $("Timestamp constructed from { t, i } must provide i equal or less than uint32 max");super(n,e,!0)}}}toJSON(){return{$timestamp:this.toString()}}static fromInt(t){return new re(Ct.fromInt(t,!0))}static fromNumber(t){return new re(Ct.fromNumber(t,!0))}static fromBits(t,e){return new re({i:t,t:e})}static fromString(t,e){return new re(Ct.fromString(t,!0,e))}toExtendedJSON(){return{$timestamp:{t:this.t,i:this.i}}}static fromExtendedJSON(t){const e=Ct.isLong(t.$timestamp.i)?t.$timestamp.i.getLowBitsUnsigned():t.$timestamp.i,n=Ct.isLong(t.$timestamp.t)?t.$timestamp.t.getLowBitsUnsigned():t.$timestamp.t;return new re({t:n,i:e})}inspect(t,e,n){n??=V;return`new Timestamp({ t: ${n(this.t,e)}, i: ${n(this.i,e)} })`}}const de=Ct.fromNumber(T),ue=Ct.fromNumber(U);function be(t,e,n){const i=(e=null==e?{}:e)&&e.index?e.index:0,o=Xt.getInt32LE(t,i);if(o<5)throw new $(`bson size must be >= 5, is ${o}`);if(e.allowObjectSmallerThanBufferSize&&t.length<o)throw new $(`buffer length ${t.length} must be >= bson size ${o}`);if(!e.allowObjectSmallerThanBufferSize&&t.length!==o)throw new $(`buffer length ${t.length} must === bson size ${o}`);if(o+i>t.byteLength)throw new $(`(bson size ${o} + options.index ${i} must be <= buffer length ${t.byteLength})`);if(0!==t[i+o-1])throw new $("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return Ze(t,i,e,n)}const me=/^\$ref$|^\$id$|^\$db$/;function Ze(t,e,n,i=!1){const o=null==n.fieldsAsRaw?null:n.fieldsAsRaw,l=null!=n.raw&&n.raw,a="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,s=n.promoteBuffers??!1,c=n.promoteLongs??!0,r=n.promoteValues??!0,d=n.useBigInt64??!1;if(d&&!r)throw new $("Must either request bigint or Long for int64 deserialization");if(d&&!c)throw new $("Must either request bigint or Long for int64 deserialization");let u,b,m=!0;const Z=(null==n.validation?{utf8:!0}:n.validation).utf8;if("boolean"==typeof Z)u=Z;else{m=!1;const t=Object.keys(Z).map((function(t){return Z[t]}));if(0===t.length)throw new $("UTF-8 validation setting cannot be empty");if("boolean"!=typeof t[0])throw new $("Invalid UTF-8 validation option, must specify boolean values");if(u=t[0],!t.every((t=>t===u)))throw new $("Invalid UTF-8 validation option - keys must be all true or all false")}if(!m){b=new Set;for(const t of Object.keys(Z))b.add(t)}const h=e;if(t.length<5)throw new $("corrupt bson message < 5 bytes long");const p=Xt.getInt32LE(t,e);if(e+=4,p<5||p>t.length)throw new $("corrupt bson message");const y=i?[]:{};let G=0,V=!i&&null;for(;;){const Z=t[e++];if(0===Z)break;let h=e;for(;0!==t[h]&&h<t.length;)h++;if(h>=t.byteLength)throw new $("Bad BSON Document: illegal CString");const p=i?G++:Zt.toUTF8(t,e,h,!1);let X,f=!0;if(f=m||b?.has(p)?u:!u,!1!==V&&"$"===p[0]&&(V=me.test(p)),e=h+1,Z===w){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");X=Zt.toUTF8(t,e,e+n-1,f),e+=n}else if(Z===L){const n=Zt.allocateUnsafe(12);for(let i=0;i<12;i++)n[i]=t[e+i];X=new ie(n),e+=12}else if(Z===M&&!1===r)X=new $t(Xt.getInt32LE(t,e)),e+=4;else if(Z===M)X=Xt.getInt32LE(t,e),e+=4;else if(Z===K)X=Xt.getFloat64LE(t,e),e+=8,!1===r&&(X=new At(X));else if(Z===x){const n=Xt.getInt32LE(t,e),i=Xt.getInt32LE(t,e+4);e+=8,X=new Date(new Ct(n,i).toNumber())}else if(Z===z){if(0!==t[e]&&1!==t[e])throw new $("illegal boolean type value");X=1===t[e++]}else if(Z===R){const i=e,o=Xt.getInt32LE(t,e);if(o<=0||o>t.length-e)throw new $("bad embedded document length in bson");if(l)X=t.subarray(e,e+o);else{let e=n;m||(e={...n,validation:{utf8:f}}),X=Ze(t,i,e,!1)}e+=o}else if(Z===J){const i=e,l=Xt.getInt32LE(t,e);let a=n;const s=e+l;if(o&&o[p]&&(a={...n,raw:!0}),m||(a={...a,validation:{utf8:f}}),X=Ze(t,i,a,!0),0!==t[(e+=l)-1])throw new $("invalid array terminator byte");if(e!==s)throw new $("corrupted array bson")}else if(Z===Y)X=void 0;else if(Z===C)X=null;else if(Z===Q)if(d)X=Xt.getBigInt64LE(t,e),e+=8;else{const n=Xt.getInt32LE(t,e),i=Xt.getInt32LE(t,e+4);e+=8;const o=new Ct(n,i);X=c&&!0===r&&o.lessThanOrEqual(de)&&o.greaterThanOrEqual(ue)?o.toNumber():o}else if(Z===E){const n=Zt.allocateUnsafe(16);for(let i=0;i<16;i++)n[i]=t[e+i];e+=16,X=new Dt(n)}else if(Z===N){let n=Xt.getInt32LE(t,e);e+=4;const i=n,o=t[e++];if(n<0)throw new $("Negative binary type element size found");if(n>t.byteLength)throw new $("Binary type size larger than document size");if(o===ft.SUBTYPE_BYTE_ARRAY){if(n=Xt.getInt32LE(t,e),e+=4,n<0)throw new $("Negative binary type element size found for subtype 0x02");if(n>i-4)throw new $("Binary type with subtype 0x02 contains too long binary size");if(n<i-4)throw new $("Binary type with subtype 0x02 contains too short binary size")}s&&r?X=Zt.toLocalBufferType(t.subarray(e,e+n)):(X=new ft(t.subarray(e,e+n),o),o===D&&It.isValid(X)&&(X=X.toUUID())),e+=n}else if(Z===k&&!1===a){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const n=Zt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const i=Zt.toUTF8(t,e,h,!1);e=h+1;const o=new Array(i.length);for(h=0;h<i.length;h++)switch(i[h]){case"m":o[h]="m";break;case"s":o[h]="g";break;case"i":o[h]="i"}X=new RegExp(n,o.join(""))}else if(Z===k&&!0===a){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const n=Zt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const i=Zt.toUTF8(t,e,h,!1);e=h+1,X=new ae(n,i)}else if(Z===H){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");const i=Zt.toUTF8(t,e,e+n-1,f);X=r?i:new se(i),e+=n}else if(Z===j)X=new re({i:Xt.getUint32LE(t,e),t:Xt.getUint32LE(t,e+4)}),e+=8;else if(Z===O)X=new te;else if(Z===_)X=new qt;else if(Z===P){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");const i=Zt.toUTF8(t,e,e+n-1,f);X=new Tt(i),e+=n}else if(Z===v){const i=Xt.getInt32LE(t,e);if(e+=4,i<13)throw new $("code_w_scope total size shorter minimum expected length");const o=Xt.getInt32LE(t,e);if(e+=4,o<=0||o>t.length-e||0!==t[e+o-1])throw new $("bad string length in bson");const l=Zt.toUTF8(t,e,e+o-1,f),a=e+=o,s=Xt.getInt32LE(t,e),c=Ze(t,a,n,!1);if(e+=s,i<8+s+o)throw new $("code_w_scope total size is too short, truncating scope");if(i>8+s+o)throw new $("code_w_scope total size is too long, clips outer document");X=new Tt(l,c)}else{if(Z!==B)throw new $(`Detected unknown BSON type ${Z.toString(16)} for fieldname "${p}"`);{const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");const i=Zt.toUTF8(t,e,e+n-1,f);e+=n;const o=Zt.allocateUnsafe(12);for(let n=0;n<12;n++)o[n]=t[e+n];const l=new ie(o);e+=12,X=new Kt(i,l)}}"__proto__"===p?Object.defineProperty(y,p,{value:X,writable:!0,enumerable:!0,configurable:!0}):y[p]=X}if(p!==e-h){if(i)throw new $("corrupt array bson");throw new $("corrupt object bson")}if(!V)return y;if(Ut(y)){const t=Object.assign({},y);return delete t.$ref,delete t.$id,delete t.$db,new Kt(y.$ref,y.$id,y.$db,t)}return y}const he=/\x00/,pe=new Set(["$db","$ref","$id","$clusterTime"]);function ye(t,e,n,i){t[i++]=w;t[(i=i+Zt.encodeUTF8Into(t,e,i)+1)-1]=0;const o=Zt.encodeUTF8Into(t,n,i+4);return Xt.setInt32LE(t,i,o+1),i=i+4+o,t[i++]=0,i}function Ge(t,e,n,i){const o=!Object.is(n,-0)&&Number.isSafeInteger(n)&&n<=g&&n>=W?M:K;t[i++]=o;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=o===M?Xt.setInt32LE(t,i,n):Xt.setFloat64LE(t,i,n)}function Ve(t,e,n,i){t[i++]=Q;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setBigInt64LE(t,i,n)}function Xe(t,e,n,i){t[i++]=C;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i}function fe(t,e,n,i){t[i++]=z;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,t[i++]=n?1:0,i}function ge(t,e,n,i){t[i++]=x;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=Ct.fromNumber(n.getTime()),l=o.getLowBits(),a=o.getHighBits();return i+=Xt.setInt32LE(t,i,l),i+=Xt.setInt32LE(t,i,a)}function We(t,e,n,i){t[i++]=k;if(i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,n.source&&null!=n.source.match(he))throw new $("value "+n.source+" must not contain null bytes");return i+=Zt.encodeUTF8Into(t,n.source,i),t[i++]=0,n.ignoreCase&&(t[i++]=105),n.global&&(t[i++]=115),n.multiline&&(t[i++]=109),t[i++]=0,i}function Se(t,e,n,i){t[i++]=k;if(i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,null!=n.pattern.match(he))throw new $("pattern "+n.pattern+" must not contain null bytes");i+=Zt.encodeUTF8Into(t,n.pattern,i),t[i++]=0;const o=n.options.split("").sort().join("");return i+=Zt.encodeUTF8Into(t,o,i),t[i++]=0,i}function Ie(t,e,n,i){null===n?t[i++]=C:"MinKey"===n._bsontype?t[i++]=O:t[i++]=_;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i}function Te(t,e,n,i){t[i++]=L;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=n.serializeInto(t,i)}function Ue(t,e,n,i){t[i++]=N;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.length;if(i+=Xt.setInt32LE(t,i,o),t[i++]=F,o<=16)for(let e=0;e<o;e++)t[i+e]=n[e];else t.set(n,i);return i+=o}function Ke(t,e,n,i,o,l,a,s,c){if(c.has(n))throw new $("Cannot convert circular structure to BSON");c.add(n),t[i++]=Array.isArray(n)?J:R;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const r=ke(t,n,o,i,l+1,a,s,c);return c.delete(n),r}function we(t,e,n,i){t[i++]=E;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;for(let e=0;e<16;e++)t[i+e]=n.bytes[e];return i+16}function Re(t,e,n,i){t[i++]="Long"===n._bsontype?Q:j;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.getLowBits(),l=n.getHighBits();return i+=Xt.setInt32LE(t,i,o),i+=Xt.setInt32LE(t,i,l)}function Je(t,e,n,i){n=n.valueOf(),t[i++]=M;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setInt32LE(t,i,n)}function Ne(t,e,n,i){t[i++]=K;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setFloat64LE(t,i,n.value)}function Ye(t,e,n,i){t[i++]=P;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.toString(),l=Zt.encodeUTF8Into(t,o,i+4)+1;return Xt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0,i}function Le(t,e,n,i,o=!1,l=0,a=!1,s=!0,c){if(n.scope&&"object"==typeof n.scope){t[i++]=v;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;let r=i;const d=n.code;i+=4;const u=Zt.encodeUTF8Into(t,d,i+4)+1;Xt.setInt32LE(t,i,u),t[i+4+u-1]=0,i=i+u+4;const b=ke(t,n.scope,o,i,l+1,a,s,c);i=b-1;const m=b-r;r+=Xt.setInt32LE(t,r,m),t[i++]=0}else{t[i++]=P;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.code.toString(),l=Zt.encodeUTF8Into(t,o,i+4)+1;Xt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0}return i}function ze(t,e,n,i){t[i++]=N;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.buffer;let l=n.position;if(n.sub_type===ft.SUBTYPE_BYTE_ARRAY&&(l+=4),i+=Xt.setInt32LE(t,i,l),t[i++]=n.sub_type,n.sub_type===ft.SUBTYPE_BYTE_ARRAY&&(l-=4,i+=Xt.setInt32LE(t,i,l)),n.sub_type===ft.SUBTYPE_VECTOR&>(n),l<=16)for(let e=0;e<l;e++)t[i+e]=o[e];else t.set(o,i);return i+=n.position}function xe(t,e,n,i){t[i++]=H;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=Zt.encodeUTF8Into(t,n.value,i+4)+1;return Xt.setInt32LE(t,i,o),i=i+4+o-1,t[i++]=0,i}function Ce(t,e,n,i,o,l,a){t[i++]=R;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;let s=i,c={$ref:n.collection||n.namespace,$id:n.oid};null!=n.db&&(c.$db=n.db),c=Object.assign(c,n.fields);const r=ke(t,c,!1,i,o+1,l,!0,a),d=r-s;return s+=Xt.setInt32LE(t,i,d),r}function ke(t,e,n,i,o,l,a,s){if(null==s){if(null==e)return t[0]=5,t[1]=0,t[2]=0,t[3]=0,t[4]=0,5;if(Array.isArray(e))throw new $("serialize does not support an array as the root input");if("object"!=typeof e)throw new $("serialize does not support non-object as the root input");if("_bsontype"in e&&"string"==typeof e._bsontype)throw new $("BSON types cannot be serialized as a document");if(G(e)||p(e)||Z(e)||h(e))throw new $("date, regexp, typedarray, and arraybuffer cannot be BSON documents");s=new Set}s.add(e);let c=i+4;if(Array.isArray(e))for(let i=0;i<e.length;i++){const r=`${i}`;let d=e[i];"function"==typeof d?.toBSON&&(d=d.toBSON());const u=typeof d;if(void 0===d)c=Xe(t,r,0,c);else if(null===d)c=Xe(t,r,0,c);else if("string"===u)c=ye(t,r,d,c);else if("number"===u)c=Ge(t,r,d,c);else if("bigint"===u)c=Ve(t,r,d,c);else if("boolean"===u)c=fe(t,r,d,c);else if("object"===u&&null==d._bsontype)c=d instanceof Date||G(d)?ge(t,r,d,c):d instanceof Uint8Array||Z(d)?Ue(t,r,d,c):d instanceof RegExp||p(d)?We(t,r,d,c):Ke(t,r,d,c,n,o,l,a,s);else if("object"===u){if(d[f]!==X)throw new q;if("ObjectId"===d._bsontype)c=Te(t,r,d,c);else if("Decimal128"===d._bsontype)c=we(t,r,d,c);else if("Long"===d._bsontype||"Timestamp"===d._bsontype)c=Re(t,r,d,c);else if("Double"===d._bsontype)c=Ne(t,r,d,c);else if("Code"===d._bsontype)c=Le(t,r,d,c,n,o,l,a,s);else if("Binary"===d._bsontype)c=ze(t,r,d,c);else if("BSONSymbol"===d._bsontype)c=xe(t,r,d,c);else if("DBRef"===d._bsontype)c=Ce(t,r,d,c,o,l,s);else if("BSONRegExp"===d._bsontype)c=Se(t,r,d,c);else if("Int32"===d._bsontype)c=Je(t,r,d,c);else if("MinKey"===d._bsontype||"MaxKey"===d._bsontype)c=Ie(t,r,d,c);else if(void 0!==d._bsontype)throw new $(`Unrecognized or invalid _bsontype: ${String(d._bsontype)}`)}else"function"===u&&l&&(c=Ye(t,r,d,c))}else if(e instanceof Map||y(e)){const i=e.entries();let r=!1;for(;!r;){const e=i.next();if(r=!!e.done,r)continue;const d=e.value?e.value[0]:void 0;let u=e.value?e.value[1]:void 0;"function"==typeof u?.toBSON&&(u=u.toBSON());const b=typeof u;if("string"==typeof d&&!pe.has(d)){if(null!=d.match(he))throw new $("key "+d+" must not contain null bytes");if(n){if("$"===d[0])throw new $("key "+d+" must not start with '$'");if(d.includes("."))throw new $("key "+d+" must not contain '.'")}}if(void 0===u)!1===a&&(c=Xe(t,d,0,c));else if(null===u)c=Xe(t,d,0,c);else if("string"===b)c=ye(t,d,u,c);else if("number"===b)c=Ge(t,d,u,c);else if("bigint"===b)c=Ve(t,d,u,c);else if("boolean"===b)c=fe(t,d,u,c);else if("object"===b&&null==u._bsontype)c=u instanceof Date||G(u)?ge(t,d,u,c):u instanceof Uint8Array||Z(u)?Ue(t,d,u,c):u instanceof RegExp||p(u)?We(t,d,u,c):Ke(t,d,u,c,n,o,l,a,s);else if("object"===b){if(u[f]!==X)throw new q;if("ObjectId"===u._bsontype)c=Te(t,d,u,c);else if("Decimal128"===u._bsontype)c=we(t,d,u,c);else if("Long"===u._bsontype||"Timestamp"===u._bsontype)c=Re(t,d,u,c);else if("Double"===u._bsontype)c=Ne(t,d,u,c);else if("Code"===u._bsontype)c=Le(t,d,u,c,n,o,l,a,s);else if("Binary"===u._bsontype)c=ze(t,d,u,c);else if("BSONSymbol"===u._bsontype)c=xe(t,d,u,c);else if("DBRef"===u._bsontype)c=Ce(t,d,u,c,o,l,s);else if("BSONRegExp"===u._bsontype)c=Se(t,d,u,c);else if("Int32"===u._bsontype)c=Je(t,d,u,c);else if("MinKey"===u._bsontype||"MaxKey"===u._bsontype)c=Ie(t,d,u,c);else if(void 0!==u._bsontype)throw new $(`Unrecognized or invalid _bsontype: ${String(u._bsontype)}`)}else"function"===b&&l&&(c=Ye(t,d,u,c))}}else{if("function"==typeof e?.toBSON&&null!=(e=e.toBSON())&&"object"!=typeof e)throw new $("toBSON function did not return an object");for(const i of Object.keys(e)){let r=e[i];"function"==typeof r?.toBSON&&(r=r.toBSON());const d=typeof r;if("string"==typeof i&&!pe.has(i)){if(null!=i.match(he))throw new $("key "+i+" must not contain null bytes");if(n){if("$"===i[0])throw new $("key "+i+" must not start with '$'");if(i.includes("."))throw new $("key "+i+" must not contain '.'")}}if(void 0===r)!1===a&&(c=Xe(t,i,0,c));else if(null===r)c=Xe(t,i,0,c);else if("string"===d)c=ye(t,i,r,c);else if("number"===d)c=Ge(t,i,r,c);else if("bigint"===d)c=Ve(t,i,r,c);else if("boolean"===d)c=fe(t,i,r,c);else if("object"===d&&null==r._bsontype)c=r instanceof Date||G(r)?ge(t,i,r,c):r instanceof Uint8Array||Z(r)?Ue(t,i,r,c):r instanceof RegExp||p(r)?We(t,i,r,c):Ke(t,i,r,c,n,o,l,a,s);else if("object"===d){if(r[f]!==X)throw new q;if("ObjectId"===r._bsontype)c=Te(t,i,r,c);else if("Decimal128"===r._bsontype)c=we(t,i,r,c);else if("Long"===r._bsontype||"Timestamp"===r._bsontype)c=Re(t,i,r,c);else if("Double"===r._bsontype)c=Ne(t,i,r,c);else if("Code"===r._bsontype)c=Le(t,i,r,c,n,o,l,a,s);else if("Binary"===r._bsontype)c=ze(t,i,r,c);else if("BSONSymbol"===r._bsontype)c=xe(t,i,r,c);else if("DBRef"===r._bsontype)c=Ce(t,i,r,c,o,l,s);else if("BSONRegExp"===r._bsontype)c=Se(t,i,r,c);else if("Int32"===r._bsontype)c=Je(t,i,r,c);else if("MinKey"===r._bsontype||"MaxKey"===r._bsontype)c=Ie(t,i,r,c);else if(void 0!==r._bsontype)throw new $(`Unrecognized or invalid _bsontype: ${String(r._bsontype)}`)}else"function"===d&&l&&(c=Ye(t,i,r,c))}}s.delete(e),t[c++]=0;const r=c-i;return i+=Xt.setInt32LE(t,i,r),c}const Be={$oid:ie,$binary:ft,$uuid:ft,$symbol:se,$numberInt:$t,$numberDecimal:Dt,$numberDouble:At,$numberLong:Ct,$minKey:te,$maxKey:qt,$regex:ae,$regularExpression:ae,$timestamp:re};function Pe(t,e={}){if("number"==typeof t){const n=t<=g&&t>=W,i=t<=S&&t>=I;if(e.relaxed||e.legacy)return t;if(Number.isInteger(t)&&!Object.is(t,-0)){if(n)return new $t(t);if(i)return e.useBigInt64?BigInt(t):Ct.fromNumber(t)}return new At(t)}if(null==t||"object"!=typeof t)return t;if(t.$undefined)return null;const n=Object.keys(t).filter((e=>e.startsWith("$")&&null!=t[e]));for(let i=0;i<n.length;i++){const o=Be[n[i]];if(o)return o.fromExtendedJSON(t,e)}if(null!=t.$date){const n=t.$date,i=new Date;if(e.legacy)if("number"==typeof n)i.setTime(n);else if("string"==typeof n)i.setTime(Date.parse(n));else{if("bigint"!=typeof n)throw new tt("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}else if("string"==typeof n)i.setTime(Date.parse(n));else if(Ct.isLong(n))i.setTime(n.toNumber());else if("number"==typeof n&&e.relaxed)i.setTime(n);else{if("bigint"!=typeof n)throw new tt("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}return i}if(null!=t.$code){const e=Object.assign({},t);return t.$scope&&(e.$scope=Pe(t.$scope)),Tt.fromExtendedJSON(t)}if(Ut(t)||t.$dbPointer){const e=t.$ref?t:t.$dbPointer;if(e instanceof Kt)return e;const n=Object.keys(e).filter((t=>t.startsWith("$")));let i=!0;if(n.forEach((t=>{-1===["$ref","$id","$db"].indexOf(t)&&(i=!1)})),i)return Kt.fromExtendedJSON(e)}return t}function He(t){const e=t.toISOString();return 0!==t.getUTCMilliseconds()?e:e.slice(0,-5)+"Z"}function ve(t,e){if(t instanceof Map||y(t)){const n=Object.create(null);for(const[e,i]of t){if("string"!=typeof e)throw new $("Can only serialize maps with string keys");n[e]=i}return ve(n,e)}if(("object"==typeof t||"function"==typeof t)&&null!==t){const n=e.seenObjects.findIndex((e=>e.obj===t));if(-1!==n){const t=e.seenObjects.map((t=>t.propertyName)),i=t.slice(0,n).map((t=>`${t} -> `)).join(""),o=t[n],l=" -> "+t.slice(n+1,t.length-1).map((t=>`${t} -> `)).join(""),a=t[t.length-1],s=" ".repeat(i.length+o.length/2),c="-".repeat(l.length+(o.length+a.length)/2-1);throw new $(`Converting circular structure to EJSON:\n ${i}${o}${l}${a}\n ${s}\\${c}/`)}e.seenObjects[e.seenObjects.length-1].obj=t}if(Array.isArray(t))return function(t,e){return t.map(((t,n)=>{e.seenObjects.push({propertyName:`index ${n}`,obj:null});try{return ve(t,e)}finally{e.seenObjects.pop()}}))}(t,e);if(void 0===t)return e.ignoreUndefined?void 0:null;if(t instanceof Date||G(t)){const n=t.getTime(),i=n>-1&&n<2534023188e5;return e.legacy?e.relaxed&&i?{$date:t.getTime()}:{$date:He(t)}:e.relaxed&&i?{$date:He(t)}:{$date:{$numberLong:t.getTime().toString()}}}if(!("number"!=typeof t||e.relaxed&&isFinite(t))){if(Number.isInteger(t)&&!Object.is(t,-0)){if(t>=W&&t<=g)return{$numberInt:t.toString()};if(t>=I&&t<=S)return{$numberLong:t.toString()}}return{$numberDouble:Object.is(t,-0)?"-0.0":t.toString()}}if("bigint"==typeof t)return e.relaxed?Number(BigInt.asIntN(64,t)):{$numberLong:BigInt.asIntN(64,t).toString()};if(t instanceof RegExp||p(t)){let n=t.flags;if(void 0===n){const e=t.toString().match(/[gimuy]*$/);e&&(n=e[0])}return new ae(t.source,n).toExtendedJSON(e)}return null!=t&&"object"==typeof t?function(t,e){if(null==t||"object"!=typeof t)throw new $("not an object instance");const n=t._bsontype;if(void 0===n){const n={};for(const i of Object.keys(t)){e.seenObjects.push({propertyName:i,obj:null});try{const o=ve(t[i],e);"__proto__"===i?Object.defineProperty(n,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):n[i]=o}finally{e.seenObjects.pop()}}return n}if(null!=t&&"object"==typeof t&&"string"==typeof t._bsontype&&t[f]!==X)throw new q;if(function(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"string"==typeof t._bsontype}(t)){let i=t;if("function"!=typeof i.toExtendedJSON){const e=Me[t._bsontype];if(!e)throw new $("Unrecognized or invalid _bsontype: "+t._bsontype);i=e(i)}return"Code"===n&&i.scope?i=new Tt(i.code,ve(i.scope,e)):"DBRef"===n&&i.oid&&(i=new Kt(ve(i.collection,e),ve(i.oid,e),ve(i.db,e),ve(i.fields,e))),i.toExtendedJSON(e)}throw new $("_bsontype must be a string, but was: "+typeof n)}(t,e):t}const Me={Binary:t=>new ft(t.value(),t.sub_type),Code:t=>new Tt(t.code,t.scope),DBRef:t=>new Kt(t.collection||t.namespace,t.oid,t.db,t.fields),Decimal128:t=>new Dt(t.bytes),Double:t=>new At(t.value),Int32:t=>new $t(t.value),Long:t=>Ct.fromBits(null!=t.low?t.low:t.low_,null!=t.low?t.high:t.high_,null!=t.low?t.unsigned:t.unsigned_),MaxKey:()=>new qt,MinKey:()=>new te,ObjectId:t=>new ie(t),BSONRegExp:t=>new ae(t.pattern,t.options),BSONSymbol:t=>new se(t.value),Timestamp:t=>re.fromBits(t.low,t.high)};function je(t,e){const n={useBigInt64:e?.useBigInt64??!1,relaxed:e?.relaxed??!0,legacy:e?.legacy??!1};return JSON.parse(t,((t,e)=>{if(-1!==t.indexOf("\0"))throw new $(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t)}`);return Pe(e,n)}))}function Qe(t,e,n,i){null!=n&&"object"==typeof n&&(i=n,n=0),null==e||"object"!=typeof e||Array.isArray(e)||(i=e,e=void 0,n=0);const o=ve(t,Object.assign({relaxed:!0,legacy:!1},i,{seenObjects:[{propertyName:"(root)",obj:null}]}));return JSON.stringify(o,e,n)}const Ee=Object.create(null);Ee.parse=je,Ee.stringify=Qe,Ee.serialize=function(t,e){return e=e||{},JSON.parse(Qe(t,e))},Ee.deserialize=function(t,e){return e=e||{},je(JSON.stringify(t),e)},Object.freeze(Ee);const Oe=1,_e=2,Fe=3,De=4,Ae=5,$e=6,qe=7,tn=8,en=9,nn=10,on=11,ln=12,an=13,sn=14,cn=15,rn=16,dn=17,un=18,bn=19,mn=255,Zn=127;function hn(t,e){try{return Xt.getNonnegativeInt32LE(t,e)}catch(t){throw new et("BSON size cannot be negative",e,{cause:t})}}function pn(t,e){let n=e;for(;0!==t[n];n++);if(n===t.length-1)throw new et("Null terminator not found",e);return n}const yn=Object.create(null);yn.parseToElements=function(t,e=0){if(e??=0,t.length<5)throw new et(`Input must be at least 5 bytes, got ${t.length} bytes`,e);const n=hn(t,e);if(n>t.length-e)throw new et(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`,e);if(0!==t[e+n-1])throw new et("BSON documents must end in 0x00",e+n);const i=[];let o=e+4;for(;o<=n+e;){const l=t[o];if(o+=1,0===l){if(o-e!==n)throw new et("Invalid 0x00 type byte",o);break}const a=o,s=pn(t,o)-a;let c;if(o+=s+1,l===Oe||l===un||l===en||l===dn)c=8;else if(l===rn)c=4;else if(l===qe)c=12;else if(l===bn)c=16;else if(l===tn)c=1;else if(l===nn||l===$e||l===Zn||l===mn)c=0;else if(l===on)c=pn(t,pn(t,o)+1)+1-o;else if(l===Fe||l===De||l===cn)c=hn(t,o);else{if(l!==_e&&l!==Ae&&l!==ln&&l!==an&&l!==sn)throw new et(`Invalid 0x${l.toString(16).padStart(2,"0")} type byte`,o);c=hn(t,o)+4,l===Ae&&(c+=1),l===ln&&(c+=12)}if(c>n)throw new et("value reports length larger than document",o);i.push([l,a,s,o,c]),o+=c}return i},yn.ByteUtils=Zt,yn.NumberUtils=Xt,Object.freeze(yn);const Gn=17825792;let Vn=Zt.allocate(Gn);var Xn=Object.freeze({__proto__:null,BSONError:$,BSONOffsetError:et,BSONRegExp:ae,BSONRuntimeError:tt,BSONSymbol:se,BSONType:A,BSONValue:pt,BSONVersionError:q,Binary:ft,ByteUtils:Zt,Code:Tt,DBRef:Kt,Decimal128:Dt,Double:At,EJSON:Ee,Int32:$t,Long:Ct,MaxKey:qt,MinKey:te,NumberUtils:Xt,ObjectId:ie,Timestamp:re,UUID:It,bsonType:ht,calculateObjectSize:function(t,e={}){return oe(t,"boolean"==typeof(e=e||{}).serializeFunctions&&e.serializeFunctions,"boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined)},deserialize:function(t,e={}){return be(Zt.toLocalBufferType(t),e)},deserializeStream:function(t,e,n,i,o,l){const a=Object.assign({allowObjectSmallerThanBufferSize:!0,index:0},l),s=Zt.toLocalBufferType(t);let c=e;for(let t=0;t<n;t++){const e=Xt.getInt32LE(s,c);a.index=c,i[o+t]=be(s,a),c+=e}return c},onDemand:yn,serialize:function(t,e={}){const n="boolean"==typeof e.checkKeys&&e.checkKeys,i="boolean"==typeof e.serializeFunctions&&e.serializeFunctions,o="boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined,l="number"==typeof e.minInternalBufferSize?e.minInternalBufferSize:Gn;Vn.length<l&&(Vn=Zt.allocate(l));const a=ke(Vn,t,n,0,0,i,o,null),s=Zt.allocateUnsafe(a);return s.set(Vn.subarray(0,a),0),s},serializeWithBufferAndIndex:function(t,e,n={}){const i="boolean"==typeof n.checkKeys&&n.checkKeys,o="boolean"==typeof n.serializeFunctions&&n.serializeFunctions,l="boolean"!=typeof n.ignoreUndefined||n.ignoreUndefined,a="number"==typeof n.index?n.index:0,s=ke(Vn,t,i,0,0,o,l,null);return e.set(Vn.subarray(0,s),a),a+s-1},setInternalBufferSize:function(t){Vn.length<t&&(Vn=Zt.allocate(t))}});function fn(t){return!!t&&"object"==typeof t&&"buffer"in t&&t.buffer instanceof ArrayBuffer&&"number"==typeof t.byteOffset&&"number"==typeof t.byteLength}async function gn({client:t,limit:n,page_token:i,sort_by:l}){const a="/ml/conversations"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Wn({client:t,limit:n,page_token:i,sort_by:l}){const a="/ml-prompts"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Sn({client:t,limit:n,page_token:i,sort_by:l,no_models:a,no_parts:s,conversation_id:c}){const r="/user/text-to-cad"+e({limit:n,page_token:i,sort_by:l,no_models:a,no_parts:s,conversation_id:c}),d=(t?.baseUrl||"https://api.zoo.dev")+r,u=t&&t.token||"",b={};u&&(b.Authorization=`Bearer ${u}`);const m={method:"GET",headers:b},Z=t?.fetch||fetch,h=await Z(d,m);await o(h);return await h.json()}class In{constructor(){}static urlConstructFrom(t){const n="/ws/modeling/commands"+e({video_res_width:t.video_res_width,video_res_height:t.video_res_height,fps:t.fps,unlocked_framerate:t.unlocked_framerate,post_effect:t.post_effect,webrtc:t.webrtc,pool:t.pool,show_grid:t.show_grid,replay:t.replay,api_call_id:t.api_call_id,order_independent_transparency:t.order_independent_transparency,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}}async function Tn({client:t,id:n,limit:i,page_token:l,sort_by:a}){const s=`/orgs/${n}/oauth2/apps`+e({limit:i,page_token:l,sort_by:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function Un({client:t,id:n,limit:i,page_token:l,sort_by:a}){const s=`/users/${n}/oauth2/apps`+e({limit:i,page_token:l,sort_by:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function Kn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/oauth2/apps"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function wn({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/oauth2/apps"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Rn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/shortlinks"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Jn({client:t,id:n,limit:i,page_token:l,sort_by:a,filter:s}){const c=`/org/datasets/${n}/conversions`+e({limit:i,page_token:l,sort_by:a,filter:s}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`);const b={method:"GET",headers:u},m=t?.fetch||fetch,Z=await m(r,b);await o(Z);return await Z.json()}async function Nn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/datasets"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Yn({client:t,limit:n,page_token:i,sort_by:l,role:a}){const s="/org/members"+e({limit:n,page_token:i,sort_by:l,role:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function Ln({client:t,limit:n,page_token:i,sort_by:l}){const a="/orgs"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function zn({client:t,id:n,limit:i,page_token:l,q:a,sort_by:s}){const c=`/org/datasets/${n}/search/conversions`+e({limit:i,page_token:l,q:a,sort_by:s}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`);const b={method:"GET",headers:u},m=t?.fetch||fetch,Z=await m(r,b);await o(Z);return await Z.json()}async function xn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/service-accounts"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Cn({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/shortlinks"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function kn({client:t,limit:n,page_token:i,sort_by:l}){const a="/users"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Bn({client:t,limit:n,page_token:i,sort_by:l}){const a="/users-extended"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}var Pn=null;try{var Hn="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");Pn=Hn.Worker}catch(t){}function vn(t,e,n){var i=void 0===e?null:e,o=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==n&&n),l=o.indexOf("\n",10)+1,a=o.substring(l)+(i?"//# sourceMappingURL="+i:"");return function(t){return new Pn(a,Object.assign({},t,{eval:!0}))}}function Mn(t,e,n){var i=void 0===e?null:e,o=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),o=0,l=n.length;o<l;++o)i[o]=n.charCodeAt(o);return new TextDecoder("utf-16le").decode(new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),l=o.indexOf("\n",10)+1,a=o.substring(l)+(i?"//# sourceMappingURL="+i:""),s=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(s)}var jn="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function Qn(t,e,n){return jn?vn(t,e,n):function(t,e,n){var i;return function(o){return i=i||Mn(t,e,n),new Worker(i,o)}}(t,e,n)}var En=Qn("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImRlZmF1bHQiaW4gZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIG4oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGUmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe2lmKCJkZWZhdWx0IiE9PW4pe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHIuZ2V0P3I6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbbl19fSl9fSkpLHQuZGVmYXVsdD1lLE9iamVjdC5mcmVlemUodCl9dmFyIHI9bihlKSxpPXQoZSk7Y29uc3Qgbz1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gcyhlLHQsbil7ZS5sZW5ndGg+NTA/ZnVuY3Rpb24oZSx0LG4pe28uZW5jb2RlSW50byhlLHQuc3ViYXJyYXkobikpfShlLHQsbik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fShlLHQsbil9bmV3IFRleHREZWNvZGVyO2NsYXNzIGZ7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6dS5uYW1lfSl9fWZ1bmN0aW9uIGEoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBsPTQyOTQ5NjcyOTUsaD0xNzE3OTg2OTE4Mztjb25zdCBjPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1oKXtpZigwPT09dCYmZTw9bCl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGEociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgdShgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgZ3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBnO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYyl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCBuPTA7bjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuYnVpbHRJbkVuY29kZXJzW25dO2lmKG51bGwhPXIpe2NvbnN0IGk9cihlLHQpO2lmKG51bGwhPWkpe3JldHVybiBuZXcgZigtMS1uLGkpfX19Zm9yKGxldCBuPTA7bjx0aGlzLmVuY29kZXJzLmxlbmd0aDtuKyspe2NvbnN0IHI9dGhpcy5lbmNvZGVyc1tuXTtpZihudWxsIT1yKXtjb25zdCBpPXIoZSx0KTtpZihudWxsIT1pKXtyZXR1cm4gbmV3IGYobixpKX19fXJldHVybiBlIGluc3RhbmNlb2YgZj9lOm51bGx9ZGVjb2RlKGUsdCxuKXtjb25zdCByPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiByP3IoZSx0LG4pOm5ldyBmKHQsZSl9fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGJ7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9nLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGIoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNSt0KSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKHQpLHMoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9dH1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1kKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxhKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgcD0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiB5KGUpe3JldHVybiJVaW50OEFycmF5Ij09PXAoZSl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBTKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIEUoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpCKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgVT03LE89U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksTj0yMTQ3NDgzNjQ3LHg9LTIxNDc0ODM2NDgsST1NYXRoLnBvdygyLDYzKS0xLF89LU1hdGgucG93KDIsNjMpLFQ9TWF0aC5wb3coMiw1MyksJD0tTWF0aC5wb3coMiw1MyksTD0xLHY9MixBPTMsaj00LEY9NSxSPTYsRD03LHo9OCxWPTksQz0xMCxNPTExLFA9MTIsSj0xMyxrPTE0LFk9MTUsSD0xNixxPTE3LFc9MTgsSz0xOSxaPTI1NSxHPTEyNyxYPTAsUT00LGVlPU9iamVjdC5mcmVlemUoe2RvdWJsZToxLHN0cmluZzoyLG9iamVjdDozLGFycmF5OjQsYmluRGF0YTo1LHVuZGVmaW5lZDo2LG9iamVjdElkOjcsYm9vbDo4LGRhdGU6OSxudWxsOjEwLHJlZ2V4OjExLGRiUG9pbnRlcjoxMixqYXZhc2NyaXB0OjEzLHN5bWJvbDoxNCxqYXZhc2NyaXB0V2l0aFNjb3BlOjE1LGludDoxNix0aW1lc3RhbXA6MTcsbG9uZzoxOCxkZWNpbWFsOjE5LG1pbktleTotMSxtYXhLZXk6MTI3fSk7Y2xhc3MgdGUgZXh0ZW5kcyBFcnJvcntnZXQgYnNvbkVycm9yKCl7cmV0dXJuITB9Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTkVycm9yIn1jb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCl9c3RhdGljIGlzQlNPTkVycm9yKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJic29uRXJyb3IiaW4gZSYmITA9PT1lLmJzb25FcnJvciYmIm5hbWUiaW4gZSYmIm1lc3NhZ2UiaW4gZSYmInN0YWNrImluIGV9fWNsYXNzIG5lIGV4dGVuZHMgdGV7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlZlcnNpb25FcnJvciJ9Y29uc3RydWN0b3IoKXtzdXBlcihgVW5zdXBwb3J0ZWQgQlNPTiB2ZXJzaW9uLCBic29uIHR5cGVzIG11c3QgYmUgZnJvbSBic29uICR7VX0ueC54YCl9fWNsYXNzIHJlIGV4dGVuZHMgdGV7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIGllIGV4dGVuZHMgdGV7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTk9mZnNldEVycm9yIn1vZmZzZXQ7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGAke2V9LiBvZmZzZXQ6ICR7dH1gLG4pLHRoaXMub2Zmc2V0PXR9fWxldCBvZSxzZTtmdW5jdGlvbiBmZShlLHQsbixyKXtpZihyKXtvZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiEwfSk7dHJ5e3JldHVybiBvZS5kZWNvZGUoZS5zdWJhcnJheSh0LG4pKX1jYXRjaChlKXt0aHJvdyBuZXcgdGUoIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiBzZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksc2UuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gdWUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBhZShlKXtyZXR1cm4gY2UuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIGxlKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGNlLmFsbG9jYXRlKGUpKX1jb25zdCBoZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP2xlOmFlfSkoKSxjZT17aXNVaW50OEFycmF5OnksdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgdGUoIkNhbm5vdCBjcmVhdGUgQnVmZmVyIGZyb20gdGhlIHBhc3NlZCBwb3RlbnRpYWxCdWZmZXIuIil9LGFsbG9jYXRlOmU9PkJ1ZmZlci5hbGxvYyhlKSxhbGxvY2F0ZVVuc2FmZTplPT5CdWZmZXIuYWxsb2NVbnNhZmUoZSksY29tcGFyZTooZSx0KT0+Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuY29tcGFyZSh0KSxjb25jYXQ6ZT0+QnVmZmVyLmNvbmNhdChlKSxjb3B5OihlLHQsbixyLGkpPT5jZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb3B5KHQsbj8/MCxyPz8wLGk/P2UubGVuZ3RoKSxlcXVhbHM6KGUsdCk9PmNlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmVxdWFscyh0KSxmcm9tTnVtYmVyQXJyYXk6ZT0+QnVmZmVyLmZyb20oZSksZnJvbUJhc2U2NDplPT5CdWZmZXIuZnJvbShlLCJiYXNlNjQiKSxmcm9tVVRGODplPT5CdWZmZXIuZnJvbShlLCJ1dGY4IiksdG9CYXNlNjQ6ZT0+Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJhc2U2NCIpLGZyb21JU084ODU5MTplPT5CdWZmZXIuZnJvbShlLCJiaW5hcnkiKSx0b0lTTzg4NTkxOmU9PmNlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJiaW5hcnkiKSxmcm9tSGV4OmU9PkJ1ZmZlci5mcm9tKGUsImhleCIpLHRvSGV4OmU9PmNlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJoZXgiKSx0b1VURjgoZSx0LG4scil7Y29uc3QgaT1uLXQ8PTIwP3VlKGUsdCxuKTpudWxsO2lmKG51bGwhPWkpcmV0dXJuIGk7Y29uc3Qgbz1jZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygidXRmOCIsdCxuKTtpZihyKWZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKWlmKDY1NTMzPT09by5jaGFyQ29kZUF0KHIpKXtmZShlLHQsbiwhMCk7YnJlYWt9cmV0dXJuIG99LHV0ZjhCeXRlTGVuZ3RoOmU9PkJ1ZmZlci5ieXRlTGVuZ3RoKGUsInV0ZjgiKSxlbmNvZGVVVEY4SW50byhlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlLHQsbil7aWYoMD09PXQubGVuZ3RoKXJldHVybiAwO2lmKHQubGVuZ3RoPjI1KXJldHVybiBudWxsO2lmKGUubGVuZ3RoLW48dC5sZW5ndGgpcmV0dXJuIG51bGw7Zm9yKGxldCByPTAsaT1uO3I8dC5sZW5ndGg7cisrLGkrKyl7Y29uc3Qgbj10LmNoYXJDb2RlQXQocik7aWYobj4xMjcpcmV0dXJuIG51bGw7ZVtpXT1ufXJldHVybiB0Lmxlbmd0aH0oZSx0LG4pO3JldHVybiBudWxsIT1yP3I6Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkud3JpdGUodCxuLHZvaWQgMCwidXRmOCIpfSxyYW5kb21CeXRlczpoZSxzd2FwMzI6ZT0+Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuc3dhcDMyKCl9O2Z1bmN0aW9uIGdlKGUpe2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGFyZ3VtZW50ICdieXRlTGVuZ3RoJyBpcyBpbnZhbGlkLiBSZWNlaXZlZCAke2V9YCk7cmV0dXJuIHBlLmZyb21OdW1iZXJBcnJheShBcnJheS5mcm9tKHtsZW5ndGg6ZX0sKCgpPT5NYXRoLmZsb29yKDI1NipNYXRoLnJhbmRvbSgpKSkpKX1jb25zdCBkZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztpZihudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRSYW5kb21WYWx1ZXMpcmV0dXJuIHQ9PmUuZ2V0UmFuZG9tVmFsdWVzKHBlLmFsbG9jYXRlKHQpKTtpZihmdW5jdGlvbigpe2NvbnN0e25hdmlnYXRvcjplfT1nbG9iYWxUaGlzO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmIlJlYWN0TmF0aXZlIj09PWUucHJvZHVjdH0oKSl7Y29uc3R7Y29uc29sZTplfT1nbG9iYWxUaGlzO2U/Lndhcm4/LigiQlNPTjogRm9yIFJlYWN0IE5hdGl2ZSBwbGVhc2UgcG9seWZpbGwgY3J5cHRvLmdldFJhbmRvbVZhbHVlcywgZS5nLiB1c2luZzogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvcmVhY3QtbmF0aXZlLWdldC1yYW5kb20tdmFsdWVzLiIpfXJldHVybiBnZX0pKCksYmU9LyhcZHxbYS1mXSkvaSxwZT17aXNVaW50OEFycmF5OnksdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJVaW50OEFycmF5Ij09PXQpcmV0dXJuIGU7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlci5zbGljZShlLmJ5dGVPZmZzZXQsZS5ieXRlT2Zmc2V0K2UuYnl0ZUxlbmd0aCkpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBuZXcgVWludDhBcnJheShlKTt0aHJvdyBuZXcgdGUoIkNhbm5vdCBtYWtlIGEgVWludDhBcnJheSBmcm9tIHBhc3NlZCBwb3RlbnRpYWxCdWZmZXIuIil9LGFsbG9jYXRlKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgInNpemUiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkICR7U3RyaW5nKGUpfWApO3JldHVybiBuZXcgVWludDhBcnJheShlKX0sYWxsb2NhdGVVbnNhZmU6ZT0+cGUuYWxsb2NhdGUoZSksY29tcGFyZShlLHQpe2lmKGU9PT10KXJldHVybiAwO2NvbnN0IG49TWF0aC5taW4oZS5sZW5ndGgsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8bjtyKyspe2lmKGVbcl08dFtyXSlyZXR1cm4tMTtpZihlW3JdPnRbcl0pcmV0dXJuIDF9cmV0dXJuIGUubGVuZ3RoPHQubGVuZ3RoPy0xOmUubGVuZ3RoPnQubGVuZ3RoPzE6MH0sY29uY2F0KGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gcGUuYWxsb2NhdGUoMCk7bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXQrPW4ubGVuZ3RoO2NvbnN0IG49cGUuYWxsb2NhdGUodCk7bGV0IHI9MDtmb3IoY29uc3QgdCBvZiBlKW4uc2V0KHQscikscis9dC5sZW5ndGg7cmV0dXJuIG59LGNvcHkoZSx0LG4scixpKXtpZih2b2lkIDAhPT1pJiZpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlRW5kIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgPj0gMC4gUmVjZWl2ZWQgJHtpfWApO2lmKGk9aT8/ZS5sZW5ndGgsdm9pZCAwIT09ciYmKHI8MHx8cj5pKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJzb3VyY2VTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAgYW5kIDw9ICR7aX0uIFJlY2VpdmVkICR7cn1gKTtpZihyPXI/PzAsdm9pZCAwIT09biYmbjwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInRhcmdldFN0YXJ0IiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgPj0gMC4gUmVjZWl2ZWQgJHtufWApO249bj8/MDtjb25zdCBvPWUuc3ViYXJyYXkocixpKSxzPU1hdGgubWluKG8ubGVuZ3RoLHQubGVuZ3RoLW4pO3JldHVybiBzPD0wPzA6KHQuc2V0KG8uc3ViYXJyYXkoMCxzKSxuKSxzKX0sZXF1YWxzKGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wO248ZS5ieXRlTGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbU51bWJlckFycmF5OmU9PlVpbnQ4QXJyYXkuZnJvbShlKSxmcm9tQmFzZTY0OmU9PlVpbnQ4QXJyYXkuZnJvbShhdG9iKGUpLChlPT5lLmNoYXJDb2RlQXQoMCkpKSxmcm9tVVRGODplPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSksdG9CYXNlNjQ6ZT0+YnRvYShwZS50b0lTTzg4NTkxKGUpKSxmcm9tSVNPODg1OTE6ZT0+VWludDhBcnJheS5mcm9tKGUsKGU9PjI1NSZlLmNoYXJDb2RlQXQoMCkpKSx0b0lTTzg4NTkxOmU9PkFycmF5LmZyb20oVWludDE2QXJyYXkuZnJvbShlKSwoZT0+U3RyaW5nLmZyb21DaGFyQ29kZShlKSkpLmpvaW4oIiIpLGZyb21IZXgoZSl7Y29uc3QgdD1lLmxlbmd0aCUyPT0wP2U6ZS5zbGljZSgwLGUubGVuZ3RoLTEpLG49W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0yKXtjb25zdCByPXRbZV0saT10W2UrMV07aWYoIWJlLnRlc3QocikpYnJlYWs7aWYoIWJlLnRlc3QoaSkpYnJlYWs7Y29uc3Qgbz1OdW1iZXIucGFyc2VJbnQoYCR7cn0ke2l9YCwxNik7bi5wdXNoKG8pfXJldHVybiBVaW50OEFycmF5LmZyb20obil9LHRvSGV4OmU9PkFycmF5LmZyb20oZSwoZT0+ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKSkuam9pbigiIiksdG9VVEY4KGUsdCxuLHIpe2NvbnN0IGk9bi10PD0yMD91ZShlLHQsbik6bnVsbDtyZXR1cm4gbnVsbCE9aT9pOmZlKGUsdCxuLHIpfSx1dGY4Qnl0ZUxlbmd0aDplPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSkuYnl0ZUxlbmd0aCxlbmNvZGVVVEY4SW50byhlLHQsbil7Y29uc3Qgcj0obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCk7cmV0dXJuIGUuc2V0KHIsbiksci5ieXRlTGVuZ3RofSxyYW5kb21CeXRlczpkZSxzd2FwMzIoZSl7aWYoZS5sZW5ndGglNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTQpe2NvbnN0IG49ZVt0XSxyPWVbdCsxXSxpPWVbdCsyXSxvPWVbdCszXTtlW3RdPW8sZVt0KzFdPWksZVt0KzJdPXIsZVt0KzNdPW59cmV0dXJuIGV9fSx5ZT0iZnVuY3Rpb24iPT10eXBlb2YgQnVmZmVyJiYhMCE9PUJ1ZmZlci5wcm90b3R5cGU/Ll9pc0J1ZmZlcj9jZTpwZSx3ZT1TeW1ib2wuZm9yKCJAQG1kYi5ic29uLnR5cGUiKTtjbGFzcyBtZXtnZXRbd2VdKCl7cmV0dXJuIHRoaXMuX2Jzb250eXBlfWdldFtPXSgpe3JldHVybiBVfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXShlLHQsbil7cmV0dXJuIHRoaXMuaW5zcGVjdChlLHQsbil9fWNvbnN0IEJlPW5ldyBGbG9hdDY0QXJyYXkoMSksU2U9bmV3IFVpbnQ4QXJyYXkoQmUuYnVmZmVyLDAsOCk7QmVbMF09LTE7Y29uc3QgRWU9MD09PVNlWzddLFVlPXtpc0JpZ0VuZGlhbjpFZSxnZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KXtpZihlW3QrM10+MTI3KXRocm93IG5ldyBSYW5nZUVycm9yKGBTaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSBhdCBvZmZzZXQ6ICR7dH1gKTtyZXR1cm4gZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0fSxnZXRJbnQzMkxFOihlLHQpPT5lW3RdfGVbdCsxXTw8OHxlW3QrMl08PDE2fGVbdCszXTw8MjQsZ2V0VWludDMyTEU6KGUsdCk9PmVbdF0rMjU2KmVbdCsxXSs2NTUzNiplW3QrMl0rMTY3NzcyMTYqZVt0KzNdLGdldFVpbnQzMkJFOihlLHQpPT5lW3QrM10rMjU2KmVbdCsyXSs2NTUzNiplW3QrMV0rMTY3NzcyMTYqZVt0XSxnZXRCaWdJbnQ2NExFOihlLHQpPT4oQmlnSW50KGVbdCs0XSsyNTYqZVt0KzVdKzY1NTM2KmVbdCs2XSsoZVt0KzddPDwyNCkpPDwzMm4pK0JpZ0ludChlW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSksZ2V0RmxvYXQ2NExFOkVlPyhlLHQpPT4oU2VbN109ZVt0XSxTZVs2XT1lW3QrMV0sU2VbNV09ZVt0KzJdLFNlWzRdPWVbdCszXSxTZVszXT1lW3QrNF0sU2VbMl09ZVt0KzVdLFNlWzFdPWVbdCs2XSxTZVswXT1lW3QrN10sQmVbMF0pOihlLHQpPT4oU2VbMF09ZVt0XSxTZVsxXT1lW3QrMV0sU2VbMl09ZVt0KzJdLFNlWzNdPWVbdCszXSxTZVs0XT1lW3QrNF0sU2VbNV09ZVt0KzVdLFNlWzZdPWVbdCs2XSxTZVs3XT1lW3QrN10sQmVbMF0pLHNldEludDMyQkU6KGUsdCxuKT0+KGVbdCszXT1uLG4+Pj49OCxlW3QrMl09bixuPj4+PTgsZVt0KzFdPW4sbj4+Pj04LGVbdF09biw0KSxzZXRJbnQzMkxFOihlLHQsbik9PihlW3RdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3QrMl09bixuPj4+PTgsZVt0KzNdPW4sNCksc2V0QmlnSW50NjRMRShlLHQsbil7Y29uc3Qgcj0weGZmZmZmZmZmbjtsZXQgaT1OdW1iZXIobiZyKTtlW3RdPWksaT4+PTgsZVt0KzFdPWksaT4+PTgsZVt0KzJdPWksaT4+PTgsZVt0KzNdPWk7bGV0IG89TnVtYmVyKG4+PjMybiZyKTtyZXR1cm4gZVt0KzRdPW8sbz4+PTgsZVt0KzVdPW8sbz4+PTgsZVt0KzZdPW8sbz4+PTgsZVt0KzddPW8sOH0sc2V0RmxvYXQ2NExFOkVlPyhlLHQsbik9PihCZVswXT1uLGVbdF09U2VbN10sZVt0KzFdPVNlWzZdLGVbdCsyXT1TZVs1XSxlW3QrM109U2VbNF0sZVt0KzRdPVNlWzNdLGVbdCs1XT1TZVsyXSxlW3QrNl09U2VbMV0sZVt0KzddPVNlWzBdLDgpOihlLHQsbik9PihCZVswXT1uLGVbdF09U2VbMF0sZVt0KzFdPVNlWzFdLGVbdCsyXT1TZVsyXSxlW3QrM109U2VbM10sZVt0KzRdPVNlWzRdLGVbdCs1XT1TZVs1XSxlW3QrNl09U2VbNl0sZVt0KzddPVNlWzddLDgpfTtjbGFzcyBPZSBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iQmluYXJ5In1zdGF0aWMgQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUPTA7c3RhdGljIEJVRkZFUl9TSVpFPTI1NjtzdGF0aWMgU1VCVFlQRV9ERUZBVUxUPTA7c3RhdGljIFNVQlRZUEVfRlVOQ1RJT049MTtzdGF0aWMgU1VCVFlQRV9CWVRFX0FSUkFZPTI7c3RhdGljIFNVQlRZUEVfVVVJRF9PTEQ9MztzdGF0aWMgU1VCVFlQRV9VVUlEPTQ7c3RhdGljIFNVQlRZUEVfTUQ1PTU7c3RhdGljIFNVQlRZUEVfRU5DUllQVEVEPTY7c3RhdGljIFNVQlRZUEVfQ09MVU1OPTc7c3RhdGljIFNVQlRZUEVfU0VOU0lUSVZFPTg7c3RhdGljIFNVQlRZUEVfVkVDVE9SPTk7c3RhdGljIFNVQlRZUEVfVVNFUl9ERUZJTkVEPTEyODtzdGF0aWMgVkVDVE9SX1RZUEU9T2JqZWN0LmZyZWV6ZSh7SW50ODozLEZsb2F0MzI6MzksUGFja2VkQml0OjE2fSk7YnVmZmVyO3N1Yl90eXBlO3Bvc2l0aW9uO2NvbnN0cnVjdG9yKGUsdCl7aWYoc3VwZXIoKSxudWxsIT1lJiYic3RyaW5nIj09dHlwZW9mIGUmJiFBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJiF3KGUpJiYhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgdGUoIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPXQ/P09lLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCxudWxsPT1lPyh0aGlzLmJ1ZmZlcj15ZS5hbGxvY2F0ZShPZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT95ZS5mcm9tTnVtYmVyQXJyYXkoZSk6eWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBTdHJpbmciKTtpZigibnVtYmVyIiE9dHlwZW9mIGUmJjEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgdGUoIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFVpbnQ4QXJyYXkgb3IgQXJyYXkiKTtsZXQgdDtpZih0PSJzdHJpbmciPT10eXBlb2YgZT9lLmNoYXJDb2RlQXQoMCk6Im51bWJlciI9PXR5cGVvZiBlP2U6ZVswXSx0PDB8fHQ+MjU1KXRocm93IG5ldyB0ZSgib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT15ZS5hbGxvY2F0ZShPZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9eWUuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KHllLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IHRlKCJpbnB1dCBjYW5ub3QgYmUgc3RyaW5nIil9cmVhZChlLHQpe2NvbnN0IG49ZSsodD10JiZ0PjA/dDp0aGlzLnBvc2l0aW9uKTtyZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkoZSxuPnRoaXMucG9zaXRpb24/dGhpcy5wb3NpdGlvbjpuKX12YWx1ZSgpe3JldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGg9PT10aGlzLnBvc2l0aW9uP3RoaXMuYnVmZmVyOnRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbil9bGVuZ3RoKCl7cmV0dXJuIHRoaXMucG9zaXRpb259dG9KU09OKCl7cmV0dXJuIHllLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpfXRvU3RyaW5nKGUpe3JldHVybiJoZXgiPT09ZT95ZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKToiYmFzZTY0Ij09PWU/eWUudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSk6eWUudG9VVEY4KHRoaXMuYnVmZmVyLDAsdGhpcy5wb3NpdGlvbiwhMSl9dG9FeHRlbmRlZEpTT04oZSl7ZT1lfHx7fSx0aGlzLnN1Yl90eXBlPT09T2UuU1VCVFlQRV9WRUNUT1ImJk5lKHRoaXMpO2NvbnN0IHQ9eWUudG9CYXNlNjQodGhpcy5idWZmZXIpLG49TnVtYmVyKHRoaXMuc3ViX3R5cGUpLnRvU3RyaW5nKDE2KTtyZXR1cm4gZS5sZWdhY3k/eyRiaW5hcnk6dCwkdHlwZToxPT09bi5sZW5ndGg/IjAiK246bn06eyRiaW5hcnk6e2Jhc2U2NDp0LHN1YlR5cGU6MT09PW4ubGVuZ3RoPyIwIituOm59fX10b1VVSUQoKXtpZih0aGlzLnN1Yl90eXBlPT09T2UuU1VCVFlQRV9VVUlEKXJldHVybiBuZXcgX2UodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSk7dGhyb3cgbmV3IHRlKGBCaW5hcnkgc3ViX3R5cGUgIiR7dGhpcy5zdWJfdHlwZX0iIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbnZlcnRpbmcgdG8gVVVJRC4gT25seSAiJHtPZS5TVUJUWVBFX1VVSUR9IiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUsdCl7cmV0dXJuIG5ldyBPZSh5ZS5mcm9tSGV4KGUpLHQpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUsdCl7cmV0dXJuIG5ldyBPZSh5ZS5mcm9tQmFzZTY0KGUpLHQpfXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7bGV0IG4scjtpZih0PXR8fHt9LCIkYmluYXJ5ImluIGU/dC5sZWdhY3kmJiJzdHJpbmciPT10eXBlb2YgZS4kYmluYXJ5JiYiJHR5cGUiaW4gZT8ocj1lLiR0eXBlP3BhcnNlSW50KGUuJHR5cGUsMTYpOjAsbj15ZS5mcm9tQmFzZTY0KGUuJGJpbmFyeSkpOiJzdHJpbmciIT10eXBlb2YgZS4kYmluYXJ5JiYocj1lLiRiaW5hcnkuc3ViVHlwZT9wYXJzZUludChlLiRiaW5hcnkuc3ViVHlwZSwxNik6MCxuPXllLmZyb21CYXNlNjQoZS4kYmluYXJ5LmJhc2U2NCkpOiIkdXVpZCJpbiBlJiYocj00LG49X2UuYnl0ZXNGcm9tU3RyaW5nKGUuJHV1aWQpKSwhbil0aHJvdyBuZXcgdGUoYFVuZXhwZWN0ZWQgQmluYXJ5IEV4dGVuZGVkIEpTT04gZm9ybWF0ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIHI9PT1RP25ldyBfZShuKTpuZXcgT2UobixyKX1pbnNwZWN0KGUsdCxuKXtuPz89RTtyZXR1cm5gQmluYXJ5LmNyZWF0ZUZyb21CYXNlNjQoJHtuKHllLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpLHQpfSwgJHtuKHRoaXMuc3ViX3R5cGUsdCl9KWB9dG9JbnQ4QXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09T2UuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IHRlKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09T2UuVkVDVE9SX1RZUEUuSW50OCl0aHJvdyBuZXcgdGUoIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgSW50OCIpO3JldHVybiBOZSh0aGlzKSxuZXcgSW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9GbG9hdDMyQXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09T2UuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IHRlKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09T2UuVkVDVE9SX1RZUEUuRmxvYXQzMil0aHJvdyBuZXcgdGUoIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgRmxvYXQzMiIpO05lKHRoaXMpO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrMix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24pKTtyZXR1cm4gVWUuaXNCaWdFbmRpYW4mJnllLnN3YXAzMihlKSxuZXcgRmxvYXQzMkFycmF5KGUuYnVmZmVyKX10b1BhY2tlZEJpdHMoKXtpZih0aGlzLnN1Yl90eXBlIT09T2UuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IHRlKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09T2UuVkVDVE9SX1RZUEUuUGFja2VkQml0KXRocm93IG5ldyB0ZSgiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7cmV0dXJuIE5lKHRoaXMpLG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9CaXRzKCl7aWYodGhpcy5zdWJfdHlwZSE9PU9lLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyB0ZSgiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PU9lLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgdGUoIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgcGFja2VkIGJpdCIpO05lKHRoaXMpO2NvbnN0IGU9OCoodGhpcy5sZW5ndGgoKS0yKS10aGlzLmJ1ZmZlclsxXSx0PW5ldyBJbnQ4QXJyYXkoZSk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG49ZS84fDAscj10aGlzLmJ1ZmZlcltuKzJdPj43LWUlOCYxO3RbZV09cn1yZXR1cm4gdH1zdGF0aWMgZnJvbUludDhBcnJheShlKXtjb25zdCB0PXllLmFsbG9jYXRlKGUuYnl0ZUxlbmd0aCsyKTt0WzBdPU9lLlZFQ1RPUl9UWVBFLkludDgsdFsxXT0wO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7dC5zZXQobiwyKTtjb25zdCByPW5ldyB0aGlzKHQsdGhpcy5TVUJUWVBFX1ZFQ1RPUik7cmV0dXJuIE5lKHIpLHJ9c3RhdGljIGZyb21GbG9hdDMyQXJyYXkoZSl7Y29uc3QgdD15ZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7dFswXT1PZS5WRUNUT1JfVFlQRS5GbG9hdDMyLHRbMV09MDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO3Quc2V0KG4sMiksVWUuaXNCaWdFbmRpYW4mJnllLnN3YXAzMihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwyKSk7Y29uc3Qgcj1uZXcgdGhpcyh0LHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBOZShyKSxyfXN0YXRpYyBmcm9tUGFja2VkQml0cyhlLHQ9MCl7Y29uc3Qgbj15ZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7blswXT1PZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQsblsxXT10LG4uc2V0KGUsMik7Y29uc3Qgcj1uZXcgdGhpcyhuLHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBOZShyKSxyfXN0YXRpYyBmcm9tQml0cyhlKXtjb25zdCB0PWUubGVuZ3RoKzc+Pj4zLG49bmV3IFVpbnQ4QXJyYXkodCsyKTtuWzBdPU9lLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdDtjb25zdCByPWUubGVuZ3RoJTg7blsxXT0wPT09cj8wOjgtcjtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgcj10Pj4+MyxpPWVbdF07aWYoMCE9PWkmJjEhPT1pKXRocm93IG5ldyB0ZShgSW52YWxpZCBiaXQgdmFsdWUgYXQgJHt0fTogbXVzdCBiZSAwIG9yIDEsIGZvdW5kICR7ZVt0XX1gKTtpZigwPT09aSljb250aW51ZTtjb25zdCBvPTctdCU4O25bcisyXXw9aTw8b31yZXR1cm4gbmV3IHRoaXMobixPZS5TVUJUWVBFX1ZFQ1RPUil9fWZ1bmN0aW9uIE5lKGUpe2lmKGUuc3ViX3R5cGUhPT1PZS5TVUJUWVBFX1ZFQ1RPUilyZXR1cm47Y29uc3QgdD1lLnBvc2l0aW9uLG49ZS5idWZmZXJbMF0scj1lLmJ1ZmZlclsxXTtpZigobj09PU9lLlZFQ1RPUl9UWVBFLkZsb2F0MzJ8fG49PT1PZS5WRUNUT1JfVFlQRS5JbnQ4KSYmMCE9PXIpdGhyb3cgbmV3IHRlKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIGludDggYW5kIGZsb2F0MzIgdmVjdG9ycyIpO2lmKG49PT1PZS5WRUNUT1JfVFlQRS5GbG9hdDMyJiYwIT09dCYmdC0yIT0wJiYodC0yKSU0IT0wKXRocm93IG5ldyB0ZSgiSW52YWxpZCBWZWN0b3I6IEZsb2F0MzIgdmVjdG9yIG11c3QgY29udGFpbiBhIG11bHRpcGxlIG9mIDQgYnl0ZXMiKTtpZihuPT09T2UuVkVDVE9SX1RZUEUuUGFja2VkQml0JiYwIT09ciYmMj09PXQpdGhyb3cgbmV3IHRlKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIHBhY2tlZCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBlbXB0eSIpO2lmKG49PT1PZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJnI+Nyl0aHJvdyBuZXcgdGUoYEludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDcuIGZvdW5kOiAke3J9YCl9Y29uc3QgeGU9L15bMC05QS1GXXszMn0kL2ksSWU9L15bMC05QS1GXXs4fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXsxMn0kL2k7Y2xhc3MgX2UgZXh0ZW5kcyBPZXtjb25zdHJ1Y3RvcihlKXtsZXQgdDtpZihudWxsPT1lKXQ9X2UuZ2VuZXJhdGUoKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBfZSl0PXllLnRvTG9jYWxCdWZmZXJUeXBlKG5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSk7ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJjE2PT09ZS5ieXRlTGVuZ3RoKXQ9eWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHRlKCJBcmd1bWVudCBwYXNzZWQgaW4gVVVJRCBjb25zdHJ1Y3RvciBtdXN0IGJlIGEgVVVJRCwgYSAxNiBieXRlIEJ1ZmZlciBvciBhIDMyLzM2IGNoYXJhY3RlciBoZXggc3RyaW5nIChkYXNoZXMgZXhjbHVkZWQvaW5jbHVkZWQsIGZvcm1hdDogeHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4KS4iKTt0PV9lLmJ5dGVzRnJvbVN0cmluZyhlKX1zdXBlcih0LFEpfWdldCBpZCgpe3JldHVybiB0aGlzLmJ1ZmZlcn1zZXQgaWQoZSl7dGhpcy5idWZmZXI9ZX10b0hleFN0cmluZyhlPSEwKXtyZXR1cm4gZT9beWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoMCw0KSkseWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoNCw2KSkseWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoNiw4KSkseWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoOCwxMCkpLHllLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDEwLDE2KSldLmpvaW4oIi0iKTp5ZS50b0hleCh0aGlzLmJ1ZmZlcil9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP3llLnRvSGV4KHRoaXMuaWQpOiJiYXNlNjQiPT09ZT95ZS50b0Jhc2U2NCh0aGlzLmlkKTp0aGlzLnRvSGV4U3RyaW5nKCl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9IZXhTdHJpbmcoKX1lcXVhbHMoZSl7aWYoIWUpcmV0dXJuITE7aWYoZSBpbnN0YW5jZW9mIF9lKXJldHVybiB5ZS5lcXVhbHMoZS5pZCx0aGlzLmlkKTt0cnl7cmV0dXJuIHllLmVxdWFscyhuZXcgX2UoZSkuaWQsdGhpcy5pZCl9Y2F0Y2h7cmV0dXJuITF9fXRvQmluYXJ5KCl7cmV0dXJuIG5ldyBPZSh0aGlzLmlkLE9lLlNVQlRZUEVfVVVJRCl9c3RhdGljIGdlbmVyYXRlKCl7Y29uc3QgZT15ZS5yYW5kb21CeXRlcygxNik7cmV0dXJuIGVbNl09MTUmZVs2XXw2NCxlWzhdPTYzJmVbOF18MTI4LGV9c3RhdGljIGlzVmFsaWQoZSl7cmV0dXJuISFlJiYoInN0cmluZyI9PXR5cGVvZiBlP19lLmlzVmFsaWRVVUlEU3RyaW5nKGUpOnkoZSk/MTY9PT1lLmJ5dGVMZW5ndGg6IkJpbmFyeSI9PT1lLl9ic29udHlwZSYmZS5zdWJfdHlwZT09PXRoaXMuU1VCVFlQRV9VVUlEJiYxNj09PWUuYnVmZmVyLmJ5dGVMZW5ndGgpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2NvbnN0IHQ9X2UuYnl0ZXNGcm9tU3RyaW5nKGUpO3JldHVybiBuZXcgX2UodCl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSl7cmV0dXJuIG5ldyBfZSh5ZS5mcm9tQmFzZTY0KGUpKX1zdGF0aWMgYnl0ZXNGcm9tU3RyaW5nKGUpe2lmKCFfZS5pc1ZhbGlkVVVJRFN0cmluZyhlKSl0aHJvdyBuZXcgdGUoIlVVSUQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgYmUgMzIgaGV4IGRpZ2l0cyBvciBjYW5vbmljYWwgaHlwaGVuYXRlZCByZXByZXNlbnRhdGlvbiIpO3JldHVybiB5ZS5mcm9tSGV4KGUucmVwbGFjZSgvLS9nLCIiKSl9c3RhdGljIGlzVmFsaWRVVUlEU3RyaW5nKGUpe3JldHVybiB4ZS50ZXN0KGUpfHxJZS50ZXN0KGUpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89RSxgbmV3IFVVSUQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19Y2xhc3MgVGUgZXh0ZW5kcyBtZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkNvZGUifWNvZGU7c2NvcGU7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuY29kZT1lLnRvU3RyaW5nKCksdGhpcy5zY29wZT10Pz9udWxsfXRvSlNPTigpe3JldHVybiBudWxsIT10aGlzLnNjb3BlP3tjb2RlOnRoaXMuY29kZSxzY29wZTp0aGlzLnNjb3BlfTp7Y29kZTp0aGlzLmNvZGV9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMuc2NvcGU/eyRjb2RlOnRoaXMuY29kZSwkc2NvcGU6dGhpcy5zY29wZX06eyRjb2RlOnRoaXMuY29kZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBUZShlLiRjb2RlLGUuJHNjb3BlKX1pbnNwZWN0KGUsdCxuKXtuPz89RTtsZXQgcj1uKHRoaXMuY29kZSx0KTtjb25zdCBpPXIuaW5jbHVkZXMoIlxuIik7bnVsbCE9dGhpcy5zY29wZSYmKHIrPWAsJHtpPyJcbiI6IiAifSR7bih0aGlzLnNjb3BlLHQpfWApO3JldHVybmBuZXcgQ29kZSgke2k/IlxuIjoiIn0ke3J9JHtpJiZudWxsPT09dGhpcy5zY29wZT8iXG4iOiIifSlgfX1mdW5jdGlvbiAkZShlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiJGlkImluIGUmJm51bGwhPWUuJGlkJiYiJHJlZiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJHJlZiYmKCEoIiRkYiJpbiBlKXx8IiRkYiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJGRiKX1jbGFzcyBMZSBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iREJSZWYifWNvbGxlY3Rpb247b2lkO2RiO2ZpZWxkcztjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcigpO2NvbnN0IGk9ZS5zcGxpdCgiLiIpOzI9PT1pLmxlbmd0aCYmKG49aS5zaGlmdCgpLGU9aS5zaGlmdCgpKSx0aGlzLmNvbGxlY3Rpb249ZSx0aGlzLm9pZD10LHRoaXMuZGI9bix0aGlzLmZpZWxkcz1yfHx7fX1nZXQgbmFtZXNwYWNlKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZXQgbmFtZXNwYWNlKGUpe3RoaXMuY29sbGVjdGlvbj1lfXRvSlNPTigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7JHJlZjp0aGlzLmNvbGxlY3Rpb24sJGlkOnRoaXMub2lkfSx0aGlzLmZpZWxkcyk7cmV0dXJuIG51bGwhPXRoaXMuZGImJihlLiRkYj10aGlzLmRiKSxlfXRvRXh0ZW5kZWRKU09OKGUpe2U9ZXx8e307bGV0IHQ9eyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH07cmV0dXJuIGUubGVnYWN5fHwodGhpcy5kYiYmKHQuJGRiPXRoaXMuZGIpLHQ9T2JqZWN0LmFzc2lnbih0LHRoaXMuZmllbGRzKSksdH1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGRlbGV0ZSB0LiRyZWYsZGVsZXRlIHQuJGlkLGRlbGV0ZSB0LiRkYixuZXcgTGUoZS4kcmVmLGUuJGlkLGUuJGRiLHQpfWluc3BlY3QoZSx0LG4pe24/Pz1FO2NvbnN0IHI9W24odGhpcy5uYW1lc3BhY2UsdCksbih0aGlzLm9pZCx0KSwuLi50aGlzLmRiP1tuKHRoaXMuZGIsdCldOltdLC4uLk9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGg+MD9bbih0aGlzLmZpZWxkcyx0KV06W11dO3JldHVybiByWzFdPW49PT1FP2BuZXcgT2JqZWN0SWQoJHtyWzFdfSlgOnJbMV0sYG5ldyBEQlJlZigke3Iuam9pbigiLCAiKX0pYH19ZnVuY3Rpb24gdmUoZSl7aWYoIiI9PT1lKXJldHVybiBlO2xldCB0PTA7Y29uc3Qgbj0iLSI9PT1lW3RdLHI9IisiPT09ZVt0XTsocnx8bikmJih0Kz0xKTtsZXQgaT0hMTtmb3IoO3Q8ZS5sZW5ndGgmJiIwIj09PWVbdF07Kyt0KWk9ITA7cmV0dXJuIGk/YCR7bj8iLSI6IiJ9JHtlLmxlbmd0aD09PXQ/IjAiOmUuc2xpY2UodCl9YDpyP2Uuc2xpY2UoMSk6ZX1sZXQgQWU7dHJ5e0FlPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9Y29uc3QgamU9NDI5NDk2NzI5NixGZT0weDEwMDAwMDAwMDAwMDAwMDAwLFJlPUZlLzIsRGU9e30semU9e30sVmU9L14oXCs/MHwoXCt8LSk/WzEtOV1bMC05XSopJC87Y2xhc3MgQ2UgZXh0ZW5kcyBtZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkxvbmcifWdldCBfX2lzTG9uZ19fKCl7cmV0dXJuITB9aGlnaDtsb3c7dW5zaWduZWQ7Y29uc3RydWN0b3IoZT0wLHQsbil7c3VwZXIoKTtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIHQ/dDpCb29sZWFuKG4pLGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6MCxvPSJzdHJpbmciPT10eXBlb2YgZT9DZS5mcm9tU3RyaW5nKGUscik6ImJpZ2ludCI9PXR5cGVvZiBlP0NlLmZyb21CaWdJbnQoZSxyKTp7bG93OjB8ZSxoaWdoOjB8aSx1bnNpZ25lZDpyfTt0aGlzLmxvdz1vLmxvdyx0aGlzLmhpZ2g9by5oaWdoLHRoaXMudW5zaWduZWQ9by51bnNpZ25lZH1zdGF0aWMgVFdPX1BXUl8yND1DZS5mcm9tSW50KDE2Nzc3MjE2KTtzdGF0aWMgTUFYX1VOU0lHTkVEX1ZBTFVFPUNlLmZyb21CaXRzKC0xLC0xLCEwKTtzdGF0aWMgWkVSTz1DZS5mcm9tSW50KDApO3N0YXRpYyBVWkVSTz1DZS5mcm9tSW50KDAsITApO3N0YXRpYyBPTkU9Q2UuZnJvbUludCgxKTtzdGF0aWMgVU9ORT1DZS5mcm9tSW50KDEsITApO3N0YXRpYyBORUdfT05FPUNlLmZyb21JbnQoLTEpO3N0YXRpYyBNQVhfVkFMVUU9Q2UuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NywhMSk7c3RhdGljIE1JTl9WQUxVRT1DZS5mcm9tQml0cygwLC0yMTQ3NDgzNjQ4LCExKTtzdGF0aWMgZnJvbUJpdHMoZSx0LG4pe3JldHVybiBuZXcgQ2UoZSx0LG4pfXN0YXRpYyBmcm9tSW50KGUsdCl7bGV0IG4scixpO3JldHVybiB0PyhpPTA8PShlPj4+PTApJiZlPDI1NikmJihyPXplW2VdLHIpP3I6KG49Q2UuZnJvbUJpdHMoZSwoMHxlKTwwPy0xOjAsITApLGkmJih6ZVtlXT1uKSxuKTooaT0tMTI4PD0oZXw9MCkmJmU8MTI4KSYmKHI9RGVbZV0scik/cjoobj1DZS5mcm9tQml0cyhlLGU8MD8tMTowLCExKSxpJiYoRGVbZV09biksbil9c3RhdGljIGZyb21OdW1iZXIoZSx0KXtpZihpc05hTihlKSlyZXR1cm4gdD9DZS5VWkVSTzpDZS5aRVJPO2lmKHQpe2lmKGU8MClyZXR1cm4gQ2UuVVpFUk87aWYoZT49RmUpcmV0dXJuIENlLk1BWF9VTlNJR05FRF9WQUxVRX1lbHNle2lmKGU8PS1SZSlyZXR1cm4gQ2UuTUlOX1ZBTFVFO2lmKGUrMT49UmUpcmV0dXJuIENlLk1BWF9WQUxVRX1yZXR1cm4gZTwwP0NlLmZyb21OdW1iZXIoLWUsdCkubmVnKCk6Q2UuZnJvbUJpdHMoZSVqZXwwLGUvamV8MCx0KX1zdGF0aWMgZnJvbUJpZ0ludChlLHQpe2NvbnN0IG49MHhmZmZmZmZmZm47cmV0dXJuIG5ldyBDZShOdW1iZXIoZSZuKSxOdW1iZXIoZT4+MzJuJm4pLHQpfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyB0ZSgiZW1wdHkgc3RyaW5nIik7aWYobjwyfHwzNjxuKXRocm93IG5ldyB0ZSgicmFkaXgiKTtsZXQgcjtpZigocj1lLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBuZXcgdGUoImludGVyaW9yIGh5cGhlbiIpO2lmKDA9PT1yKXJldHVybiBDZS5fZnJvbVN0cmluZyhlLnN1YnN0cmluZygxKSx0LG4pLm5lZygpO2NvbnN0IGk9Q2UuZnJvbU51bWJlcihNYXRoLnBvdyhuLDgpKTtsZXQgbz1DZS5aRVJPO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9OCl7Y29uc3Qgcj1NYXRoLm1pbig4LGUubGVuZ3RoLXQpLHM9cGFyc2VJbnQoZS5zdWJzdHJpbmcodCx0K3IpLG4pO2lmKHI8OCl7Y29uc3QgZT1DZS5mcm9tTnVtYmVyKE1hdGgucG93KG4scikpO289by5tdWwoZSkuYWRkKENlLmZyb21OdW1iZXIocykpfWVsc2Ugbz1vLm11bChpKSxvPW8uYWRkKENlLmZyb21OdW1iZXIocykpfXJldHVybiBvLnVuc2lnbmVkPXQsb31zdGF0aWMgZnJvbVN0cmluZ1N0cmljdChlLHQsbil7bGV0IHI9ITE7aWYoIm51bWJlciI9PXR5cGVvZiB0PyhuPXQsdD0hMSk6cj0hIXQsbj8/PTEwLGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgdGUoYElucHV0OiAnJHtlfScgY29udGFpbnMgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgd2hpdGVzcGFjZWApO2lmKCFmdW5jdGlvbihlLHQpe2NvbnN0IG49IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc2xpY2UoMCx0PXQ/PzEwKTtyZXR1cm4hbmV3IFJlZ0V4cChgW14tKyR7bn1dYCwiaSIpLnRlc3QoZSkmJmV9KGUsbikpdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyBmb3IgcmFkaXg6ICR7bn1gKTtjb25zdCBpPXZlKGUpLG89Q2UuX2Zyb21TdHJpbmcoaSxyLG4pO2lmKG8udG9TdHJpbmcobikudG9Mb3dlckNhc2UoKSE9PWkudG9Mb3dlckNhc2UoKSl0aHJvdyBuZXcgdGUoYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzICR7by51bnNpZ25lZD8iYW4gdW5zaWduZWQiOiJhIHNpZ25lZCJ9IDY0LWJpdCBMb25nICR7bnVsbCE9bj9gd2l0aCByYWRpeDogJHtufWA6IiJ9YCk7cmV0dXJuIG99c3RhdGljIGZyb21TdHJpbmcoZSx0LG4pe2xldCByPSExO3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCwiTmFOIj09PWUmJm48MjR8fCgiSW5maW5pdHkiPT09ZXx8IitJbmZpbml0eSI9PT1lfHwiLUluZmluaXR5Ij09PWUpJiZuPDM1P0NlLlpFUk86Q2UuX2Zyb21TdHJpbmcoZSxyLG4pfXN0YXRpYyBmcm9tQnl0ZXMoZSx0LG4pe3JldHVybiBuP0NlLmZyb21CeXRlc0xFKGUsdCk6Q2UuZnJvbUJ5dGVzQkUoZSx0KX1zdGF0aWMgZnJvbUJ5dGVzTEUoZSx0KXtyZXR1cm4gbmV3IENlKGVbMF18ZVsxXTw8OHxlWzJdPDwxNnxlWzNdPDwyNCxlWzRdfGVbNV08PDh8ZVs2XTw8MTZ8ZVs3XTw8MjQsdCl9c3RhdGljIGZyb21CeXRlc0JFKGUsdCl7cmV0dXJuIG5ldyBDZShlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9faXNMb25nX18iaW4gZSYmITA9PT1lLl9faXNMb25nX199c3RhdGljIGZyb21WYWx1ZShlLHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9DZS5mcm9tTnVtYmVyKGUsdCk6InN0cmluZyI9PXR5cGVvZiBlP0NlLmZyb21TdHJpbmcoZSx0KTpDZS5mcm9tQml0cyhlLmxvdyxlLmhpZ2gsImJvb2xlYW4iPT10eXBlb2YgdD90OmUudW5zaWduZWQpfWFkZChlKXtDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGY9ZS5sb3c+Pj4xNjtsZXQgdT0wLGE9MCxsPTAsaD0wO3JldHVybiBoKz1pKyg2NTUzNSZlLmxvdyksbCs9aD4+PjE2LGgmPTY1NTM1LGwrPXIrZixhKz1sPj4+MTYsbCY9NjU1MzUsYSs9bitzLHUrPWE+Pj4xNixhJj02NTUzNSx1Kz10K28sdSY9NjU1MzUsQ2UuZnJvbUJpdHMobDw8MTZ8aCx1PDwxNnxhLHRoaXMudW5zaWduZWQpfWFuZChlKXtyZXR1cm4gQ2UuaXNMb25nKGUpfHwoZT1DZS5mcm9tVmFsdWUoZSkpLENlLmZyb21CaXRzKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9Y29tcGFyZShlKXtpZihDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSksdGhpcy5lcShlKSlyZXR1cm4gMDtjb25zdCB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfWNvbXAoZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlKX1kaXZpZGUoZSl7aWYoQ2UuaXNMb25nKGUpfHwoZT1DZS5mcm9tVmFsdWUoZSkpLGUuaXNaZXJvKCkpdGhyb3cgbmV3IHRlKCJkaXZpc2lvbiBieSB6ZXJvIik7aWYoQWUpe2lmKCF0aGlzLnVuc2lnbmVkJiYtMjE0NzQ4MzY0OD09PXRoaXMuaGlnaCYmLTE9PT1lLmxvdyYmLTE9PT1lLmhpZ2gpcmV0dXJuIHRoaXM7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9BZS5kaXZfdTpBZS5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIENlLmZyb21CaXRzKHQsQWUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1pZih0aGlzLmlzWmVybygpKXJldHVybiB0aGlzLnVuc2lnbmVkP0NlLlVaRVJPOkNlLlpFUk87bGV0IHQsbixyO2lmKHRoaXMudW5zaWduZWQpe2lmKGUudW5zaWduZWR8fChlPWUudG9VbnNpZ25lZCgpKSxlLmd0KHRoaXMpKXJldHVybiBDZS5VWkVSTztpZihlLmd0KHRoaXMuc2hydSgxKSkpcmV0dXJuIENlLlVPTkU7cj1DZS5VWkVST31lbHNle2lmKHRoaXMuZXEoQ2UuTUlOX1ZBTFVFKSl7aWYoZS5lcShDZS5PTkUpfHxlLmVxKENlLk5FR19PTkUpKXJldHVybiBDZS5NSU5fVkFMVUU7aWYoZS5lcShDZS5NSU5fVkFMVUUpKXJldHVybiBDZS5PTkU7cmV0dXJuIHQ9dGhpcy5zaHIoMSkuZGl2KGUpLnNobCgxKSx0LmVxKENlLlpFUk8pP2UuaXNOZWdhdGl2ZSgpP0NlLk9ORTpDZS5ORUdfT05FOihuPXRoaXMuc3ViKGUubXVsKHQpKSxyPXQuYWRkKG4uZGl2KGUpKSxyKX1pZihlLmVxKENlLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMudW5zaWduZWQ/Q2UuVVpFUk86Q2UuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5kaXYoZS5uZWcoKSk6dGhpcy5uZWcoKS5kaXYoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZGl2KGUubmVnKCkpLm5lZygpO3I9Q2UuWkVST31mb3Iobj10aGlzO24uZ3RlKGUpOyl7dD1NYXRoLm1heCgxLE1hdGguZmxvb3Iobi50b051bWJlcigpL2UudG9OdW1iZXIoKSkpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSxvPWk8PTQ4PzE6TWF0aC5wb3coMixpLTQ4KTtsZXQgcz1DZS5mcm9tTnVtYmVyKHQpLGY9cy5tdWwoZSk7Zm9yKDtmLmlzTmVnYXRpdmUoKXx8Zi5ndChuKTspdC09byxzPUNlLmZyb21OdW1iZXIodCx0aGlzLnVuc2lnbmVkKSxmPXMubXVsKGUpO3MuaXNaZXJvKCkmJihzPUNlLk9ORSkscj1yLmFkZChzKSxuPW4uc3ViKGYpfXJldHVybiByfWRpdihlKXtyZXR1cm4gdGhpcy5kaXZpZGUoZSl9ZXF1YWxzKGUpe3JldHVybiBDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSksKHRoaXMudW5zaWduZWQ9PT1lLnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8ZS5oaWdoPj4+MzEhPTEpJiYodGhpcy5oaWdoPT09ZS5oaWdoJiZ0aGlzLmxvdz09PWUubG93KX1lcShlKXtyZXR1cm4gdGhpcy5lcXVhbHMoZSl9Z2V0SGlnaEJpdHMoKXtyZXR1cm4gdGhpcy5oaWdofWdldEhpZ2hCaXRzVW5zaWduZWQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1nZXRMb3dCaXRzKCl7cmV0dXJuIHRoaXMubG93fWdldExvd0JpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0TnVtQml0c0Ficygpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxKENlLk1JTl9WQUxVRSk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Y29uc3QgZT0wIT09dGhpcy5oaWdoP3RoaXMuaGlnaDp0aGlzLmxvdztsZXQgdDtmb3IodD0zMTt0PjAmJiEoZSYxPDx0KTt0LS0pO3JldHVybiAwIT09dGhpcy5oaWdoP3QrMzM6dCsxfWdyZWF0ZXJUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+MH1ndChlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbihlKX1ncmVhdGVyVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKT49MH1ndGUoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWdlKGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuT3JFcXVhbChlKX1pc0V2ZW4oKXtyZXR1cm4hKDEmdGhpcy5sb3cpfWlzTmVnYXRpdmUoKXtyZXR1cm4hdGhpcy51bnNpZ25lZCYmdGhpcy5oaWdoPDB9aXNPZGQoKXtyZXR1cm4hKDEmfnRoaXMubG93KX1pc1Bvc2l0aXZlKCl7cmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaD49MH1pc1plcm8oKXtyZXR1cm4gMD09PXRoaXMuaGlnaCYmMD09PXRoaXMubG93fWxlc3NUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8MH1sdChlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbihlKX1sZXNzVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKTw9MH1sdGUoZSl7cmV0dXJuIHRoaXMubGVzc1RoYW5PckVxdWFsKGUpfW1vZHVsbyhlKXtpZihDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSksQWUpe2NvbnN0IHQ9KHRoaXMudW5zaWduZWQ/QWUucmVtX3U6QWUucmVtX3MpKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBDZS5mcm9tQml0cyh0LEFlLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9cmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGUpLm11bChlKSl9bW9kKGUpe3JldHVybiB0aGlzLm1vZHVsbyhlKX1yZW0oZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfW11bHRpcGx5KGUpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIENlLlpFUk87aWYoQ2UuaXNMb25nKGUpfHwoZT1DZS5mcm9tVmFsdWUoZSkpLEFlKXtjb25zdCB0PUFlLm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gQ2UuZnJvbUJpdHModCxBZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKGUuaXNaZXJvKCkpcmV0dXJuIENlLlpFUk87aWYodGhpcy5lcShDZS5NSU5fVkFMVUUpKXJldHVybiBlLmlzT2RkKCk/Q2UuTUlOX1ZBTFVFOkNlLlpFUk87aWYoZS5lcShDZS5NSU5fVkFMVUUpKXJldHVybiB0aGlzLmlzT2RkKCk/Q2UuTUlOX1ZBTFVFOkNlLlpFUk87aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKGUubmVnKCkpOnRoaXMubmVnKCkubXVsKGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bChlLm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KENlLlRXT19QV1JfMjQpJiZlLmx0KENlLlRXT19QV1JfMjQpKXJldHVybiBDZS5mcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSplLnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGY9ZS5sb3c+Pj4xNix1PTY1NTM1JmUubG93O2xldCBhPTAsbD0wLGg9MCxjPTA7cmV0dXJuIGMrPWkqdSxoKz1jPj4+MTYsYyY9NjU1MzUsaCs9cip1LGwrPWg+Pj4xNixoJj02NTUzNSxoKz1pKmYsbCs9aD4+PjE2LGgmPTY1NTM1LGwrPW4qdSxhKz1sPj4+MTYsbCY9NjU1MzUsbCs9cipmLGErPWw+Pj4xNixsJj02NTUzNSxsKz1pKnMsYSs9bD4+PjE2LGwmPTY1NTM1LGErPXQqdStuKmYrcipzK2kqbyxhJj02NTUzNSxDZS5mcm9tQml0cyhoPDwxNnxjLGE8PDE2fGwsdGhpcy51bnNpZ25lZCl9bXVsKGUpe3JldHVybiB0aGlzLm11bHRpcGx5KGUpfW5lZ2F0ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKENlLk1JTl9WQUxVRSk/Q2UuTUlOX1ZBTFVFOnRoaXMubm90KCkuYWRkKENlLk9ORSl9bmVnKCl7cmV0dXJuIHRoaXMubmVnYXRlKCl9bm90KCl7cmV0dXJuIENlLmZyb21CaXRzKH50aGlzLmxvdyx+dGhpcy5oaWdoLHRoaXMudW5zaWduZWQpfW5vdEVxdWFscyhlKXtyZXR1cm4hdGhpcy5lcXVhbHMoZSl9bmVxKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1uZShlKXtyZXR1cm4gdGhpcy5ub3RFcXVhbHMoZSl9b3IoZSl7cmV0dXJuIENlLmlzTG9uZyhlKXx8KGU9Q2UuZnJvbVZhbHVlKGUpKSxDZS5mcm9tQml0cyh0aGlzLmxvd3xlLmxvdyx0aGlzLmhpZ2h8ZS5oaWdoLHRoaXMudW5zaWduZWQpfXNoaWZ0TGVmdChlKXtyZXR1cm4gQ2UuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP0NlLmZyb21CaXRzKHRoaXMubG93PDxlLHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy51bnNpZ25lZCk6Q2UuZnJvbUJpdHMoMCx0aGlzLmxvdzw8ZS0zMix0aGlzLnVuc2lnbmVkKX1zaGwoZSl7cmV0dXJuIHRoaXMuc2hpZnRMZWZ0KGUpfXNoaWZ0UmlnaHQoZSl7cmV0dXJuIENlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9DZS5mcm9tQml0cyh0aGlzLmxvdz4+PmV8dGhpcy5oaWdoPDwzMi1lLHRoaXMuaGlnaD4+ZSx0aGlzLnVuc2lnbmVkKTpDZS5mcm9tQml0cyh0aGlzLmhpZ2g+PmUtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9c2hyKGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHQoZSl9c2hpZnRSaWdodFVuc2lnbmVkKGUpe2lmKENlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT09KGUmPTYzKSlyZXR1cm4gdGhpczt7Y29uc3QgdD10aGlzLmhpZ2g7aWYoZTwzMil7Y29uc3Qgbj10aGlzLmxvdztyZXR1cm4gQ2UuZnJvbUJpdHMobj4+PmV8dDw8MzItZSx0Pj4+ZSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gMzI9PT1lP0NlLmZyb21CaXRzKHQsMCx0aGlzLnVuc2lnbmVkKTpDZS5mcm9tQml0cyh0Pj4+ZS0zMiwwLHRoaXMudW5zaWduZWQpfX1zaHJfdShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c2hydShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c3VidHJhY3QoZSl7cmV0dXJuIENlLmlzTG9uZyhlKXx8KGU9Q2UuZnJvbVZhbHVlKGUpKSx0aGlzLmFkZChlLm5lZygpKX1zdWIoZSl7cmV0dXJuIHRoaXMuc3VidHJhY3QoZSl9dG9JbnQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9dG9OdW1iZXIoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqamUrKHRoaXMubG93Pj4+MCk6dGhpcy5oaWdoKmplKyh0aGlzLmxvdz4+PjApfXRvQmlnSW50KCl7cmV0dXJuIEJpZ0ludCh0aGlzLnRvU3RyaW5nKCkpfXRvQnl0ZXMoZSl7cmV0dXJuIGU/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfXRvQnl0ZXNMRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuWzI1NSZ0LHQ+Pj44JjI1NSx0Pj4+MTYmMjU1LHQ+Pj4yNCwyNTUmZSxlPj4+OCYyNTUsZT4+PjE2JjI1NSxlPj4+MjRdfXRvQnl0ZXNCRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuW2U+Pj4yNCxlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZSx0Pj4+MjQsdD4+PjE2JjI1NSx0Pj4+OCYyNTUsMjU1JnRdfXRvU2lnbmVkKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/Q2UuZnJvbUJpdHModGhpcy5sb3csdGhpcy5oaWdoLCExKTp0aGlzfXRvU3RyaW5nKGUpe2lmKChlPWV8fDEwKTwyfHwzNjxlKXRocm93IG5ldyB0ZSgicmFkaXgiKTtpZih0aGlzLmlzWmVybygpKXJldHVybiIwIjtpZih0aGlzLmlzTmVnYXRpdmUoKSl7aWYodGhpcy5lcShDZS5NSU5fVkFMVUUpKXtjb25zdCB0PUNlLmZyb21OdW1iZXIoZSksbj10aGlzLmRpdih0KSxyPW4ubXVsKHQpLnN1Yih0aGlzKTtyZXR1cm4gbi50b1N0cmluZyhlKStyLnRvSW50KCkudG9TdHJpbmcoZSl9cmV0dXJuIi0iK3RoaXMubmVnKCkudG9TdHJpbmcoZSl9Y29uc3QgdD1DZS5mcm9tTnVtYmVyKE1hdGgucG93KGUsNiksdGhpcy51bnNpZ25lZCk7bGV0IG49dGhpcyxyPSIiO2Zvcig7Oyl7Y29uc3QgaT1uLmRpdih0KTtsZXQgbz0obi5zdWIoaS5tdWwodCkpLnRvSW50KCk+Pj4wKS50b1N0cmluZyhlKTtpZihuPWksbi5pc1plcm8oKSlyZXR1cm4gbytyO2Zvcig7by5sZW5ndGg8Njspbz0iMCIrbztyPSIiK28rcn19dG9VbnNpZ25lZCgpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXM6Q2UuZnJvbUJpdHModGhpcy5sb3csdGhpcy5oaWdoLCEwKX14b3IoZSl7cmV0dXJuIENlLmlzTG9uZyhlKXx8KGU9Q2UuZnJvbVZhbHVlKGUpKSxDZS5mcm9tQml0cyh0aGlzLmxvd15lLmxvdyx0aGlzLmhpZ2heZS5oaWdoLHRoaXMudW5zaWduZWQpfWVxeigpe3JldHVybiB0aGlzLmlzWmVybygpfWxlKGUpe3JldHVybiB0aGlzLmxlc3NUaGFuT3JFcXVhbChlKX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmZS5yZWxheGVkP3RoaXMudG9OdW1iZXIoKTp7JG51bWJlckxvbmc6dGhpcy50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2NvbnN0e3VzZUJpZ0ludDY0Om49ITEscmVsYXhlZDpyPSEwfT17Li4udH07aWYoZS4kbnVtYmVyTG9uZy5sZW5ndGg+MjApdGhyb3cgbmV3IHRlKCIkbnVtYmVyTG9uZyBzdHJpbmcgaXMgdG9vIGxvbmciKTtpZighVmUudGVzdChlLiRudW1iZXJMb25nKSl0aHJvdyBuZXcgdGUoYCRudW1iZXJMb25nIHN0cmluZyAiJHtlLiRudW1iZXJMb25nfSIgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXRgKTtpZihuKXtjb25zdCB0PUJpZ0ludChlLiRudW1iZXJMb25nKTtyZXR1cm4gQmlnSW50LmFzSW50Tig2NCx0KX1jb25zdCBpPUNlLmZyb21TdHJpbmcoZS4kbnVtYmVyTG9uZyk7cmV0dXJuIHI/aS50b051bWJlcigpOml9aW5zcGVjdChlLHQsbil7bj8/PUU7cmV0dXJuYG5ldyBMb25nKCR7bih0aGlzLnRvU3RyaW5nKCksdCl9JHt0aGlzLnVuc2lnbmVkP2AsICR7bih0aGlzLnVuc2lnbmVkLHQpfWA6IiJ9KWB9fWNvbnN0IE1lPS9eKFwrfC0pPyhcZCt8KFxkKlwuXGQqKSk/KEV8ZSk/KFstK10pPyhcZCspPyQvLFBlPS9eKFwrfC0pPyhJbmZpbml0eXxpbmYpJC9pLEplPS9eKFwrfC0pP05hTiQvaSxrZT02MTExLFllPS02MTc2LEhlPXllLmZyb21OdW1iZXJBcnJheShbMTI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLHFlPXllLmZyb21OdW1iZXJBcnJheShbMjQ4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLFdlPXllLmZyb21OdW1iZXJBcnJheShbMTIwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLEtlPS9eKFstK10pPyhcZCspPyQvO2Z1bmN0aW9uIFplKGUpe3JldHVybiFpc05hTihwYXJzZUludChlLDEwKSl9ZnVuY3Rpb24gR2UoZSl7Y29uc3QgdD1DZS5mcm9tTnVtYmVyKDFlOSk7bGV0IG49Q2UuZnJvbU51bWJlcigwKTtpZighKGUucGFydHNbMF18fGUucGFydHNbMV18fGUucGFydHNbMl18fGUucGFydHNbM10pKXJldHVybntxdW90aWVudDplLHJlbTpufTtmb3IobGV0IHI9MDtyPD0zO3IrKyluPW4uc2hpZnRMZWZ0KDMyKSxuPW4uYWRkKG5ldyBDZShlLnBhcnRzW3JdLDApKSxlLnBhcnRzW3JdPW4uZGl2KHQpLmxvdyxuPW4ubW9kdWxvKHQpO3JldHVybntxdW90aWVudDplLHJlbTpufX1mdW5jdGlvbiBYZShlLHQpe3Rocm93IG5ldyB0ZShgIiR7ZX0iIGlzIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIC0gJHt0fWApfWNsYXNzIFFlIGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJEZWNpbWFsMTI4In1ieXRlcztjb25zdHJ1Y3RvcihlKXtpZihzdXBlcigpLCJzdHJpbmciPT10eXBlb2YgZSl0aGlzLmJ5dGVzPVFlLmZyb21TdHJpbmcoZSkuYnl0ZXM7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHx5KGUpKSl0aHJvdyBuZXcgdGUoIkRlY2ltYWwxMjggbXVzdCB0YWtlIGEgQnVmZmVyIG9yIHN0cmluZyIpO2lmKDE2IT09ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyB0ZSgiRGVjaW1hbDEyOCBtdXN0IHRha2UgYSBCdWZmZXIgb2YgMTYgYnl0ZXMiKTt0aGlzLmJ5dGVzPWV9fXN0YXRpYyBmcm9tU3RyaW5nKGUpe3JldHVybiBRZS5fZnJvbVN0cmluZyhlLHthbGxvd1JvdW5kaW5nOiExfSl9c3RhdGljIGZyb21TdHJpbmdXaXRoUm91bmRpbmcoZSl7cmV0dXJuIFFlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITB9KX1zdGF0aWMgX2Zyb21TdHJpbmcoZSx0KXtsZXQgbj0hMSxyPSExLGk9ITEsbz0hMSxzPTAsZj0wLHU9MCxhPTAsbD0wO2NvbnN0IGg9WzBdO2xldCBjPTAsZz0wLGQ9MCxiPTAscD1uZXcgQ2UoMCwwKSx5PW5ldyBDZSgwLDApLHc9MCxtPTA7aWYoZS5sZW5ndGg+PTdlMyl0aHJvdyBuZXcgdGUoZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7Y29uc3QgQj1lLm1hdGNoKE1lKSxTPWUubWF0Y2goUGUpLEU9ZS5tYXRjaChKZSk7aWYoIUImJiFTJiYhRXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyB0ZShlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtpZihCKXtjb25zdCB0PUJbMl0sbj1CWzRdLHI9Qls1XSxpPUJbNl07biYmdm9pZCAwPT09aSYmWGUoZSwibWlzc2luZyBleHBvbmVudCBwb3dlciIpLG4mJnZvaWQgMD09PXQmJlhlKGUsIm1pc3NpbmcgZXhwb25lbnQgYmFzZSIpLHZvaWQgMD09PW4mJihyfHxpKSYmWGUoZSwibWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCIpfWlmKCIrIiE9PWVbbV0mJiItIiE9PWVbbV18fChyPSEwLG49Ii0iPT09ZVttKytdKSwhWmUoZVttXSkmJiIuIiE9PWVbbV0pe2lmKCJpIj09PWVbbV18fCJJIj09PWVbbV0pcmV0dXJuIG5ldyBRZShuP3FlOldlKTtpZigiTiI9PT1lW21dKXJldHVybiBuZXcgUWUoSGUpfWZvcig7WmUoZVttXSl8fCIuIj09PWVbbV07KSIuIiE9PWVbbV0/KGM8MzQmJigiMCIhPT1lW21dfHxvKSYmKG98fChsPWYpLG89ITAsaFtnKytdPXBhcnNlSW50KGVbbV0sMTApLGMrPTEpLG8mJih1Kz0xKSxpJiYoYSs9MSksZis9MSxtKz0xKTooaSYmWGUoZSwiY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcyIpLGk9ITAsbSs9MSk7aWYoaSYmIWYpdGhyb3cgbmV3IHRlKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2lmKCJlIj09PWVbbV18fCJFIj09PWVbbV0pe2NvbnN0IHQ9ZS5zdWJzdHIoKyttKS5tYXRjaChLZSk7aWYoIXR8fCF0WzJdKXJldHVybiBuZXcgUWUoSGUpO2I9cGFyc2VJbnQodFswXSwxMCksbSs9dFswXS5sZW5ndGh9aWYoZVttXSlyZXR1cm4gbmV3IFFlKEhlKTtpZihjKXtpZihkPWMtMSxzPXUsMSE9PXMpZm9yKDsiMCI9PT1lW2wrcy0xK051bWJlcihyKStOdW1iZXIoaSldOylzLT0xfWVsc2UgaFswXT0wLHU9MSxjPTEscz0wO2ZvcihiPD1hJiZhPmIrMTYzODQ/Yj1ZZTpiLT1hO2I+a2U7KXtpZihkKz0xLGQ+PTM0KXtpZigwPT09cyl7Yj1rZTticmVha31YZShlLCJvdmVyZmxvdyIpfWItPTF9aWYodC5hbGxvd1JvdW5kaW5nKXtmb3IoO2I8WWV8fGM8dTspe2lmKDA9PT1kJiZzPGMpe2I9WWUscz0wO2JyZWFrfWlmKGM8dT91LT0xOmQtPTEsYjxrZSliKz0xO2Vsc2V7aWYoaC5qb2luKCIiKS5tYXRjaCgvXjArJC8pKXtiPWtlO2JyZWFrfVhlKGUsIm92ZXJmbG93Iil9fWlmKGQrMTxzKXtsZXQgdD1mO2kmJihsKz0xLHQrPTEpLHImJihsKz0xLHQrPTEpO2NvbnN0IG89cGFyc2VJbnQoZVtsK2QrMV0sMTApO2xldCBzPTA7aWYobz49NSYmKHM9MSw1PT09bykpe3M9aFtkXSUyPT0xPzE6MDtmb3IobGV0IG49bCtkKzI7bjx0O24rKylpZihwYXJzZUludChlW25dLDEwKSl7cz0xO2JyZWFrfX1pZihzKXtsZXQgZT1kO2Zvcig7ZT49MCYmKytoW2VdPjk7ZS0tKWlmKGhbZV09MCwwPT09ZSl7aWYoIShiPGtlKSlyZXR1cm4gbmV3IFFlKG4/cWU6V2UpO2IrPTEsaFtlXT0xfX19fWVsc2V7Zm9yKDtiPFllfHxjPHU7KXtpZigwPT09ZCl7aWYoMD09PXMpe2I9WWU7YnJlYWt9WGUoZSwiZXhwb25lbnQgdW5kZXJmbG93Iil9Yzx1PygiMCIhPT1lW3UtMStOdW1iZXIocikrTnVtYmVyKGkpXSYmMCE9PXMmJlhlKGUsImluZXhhY3Qgcm91bmRpbmciKSx1LT0xKTooMCE9PWhbZF0mJlhlKGUsImluZXhhY3Qgcm91bmRpbmciKSxkLT0xKSxiPGtlP2IrPTE6WGUoZSwib3ZlcmZsb3ciKX1pZihkKzE8cyl7aSYmKGwrPTEpLHImJihsKz0xKTswIT09cGFyc2VJbnQoZVtsK2QrMV0sMTApJiZYZShlLCJpbmV4YWN0IHJvdW5kaW5nIil9fWlmKHA9Q2UuZnJvbU51bWJlcigwKSx5PUNlLmZyb21OdW1iZXIoMCksMD09PXMpcD1DZS5mcm9tTnVtYmVyKDApLHk9Q2UuZnJvbU51bWJlcigwKTtlbHNlIGlmKGQ8MTcpe2xldCBlPTA7Zm9yKHk9Q2UuZnJvbU51bWJlcihoW2UrK10pLHA9bmV3IENlKDAsMCk7ZTw9ZDtlKyspeT15Lm11bHRpcGx5KENlLmZyb21OdW1iZXIoMTApKSx5PXkuYWRkKENlLmZyb21OdW1iZXIoaFtlXSkpfWVsc2V7bGV0IGU9MDtmb3IocD1DZS5mcm9tTnVtYmVyKGhbZSsrXSk7ZTw9ZC0xNztlKyspcD1wLm11bHRpcGx5KENlLmZyb21OdW1iZXIoMTApKSxwPXAuYWRkKENlLmZyb21OdW1iZXIoaFtlXSkpO2Zvcih5PUNlLmZyb21OdW1iZXIoaFtlKytdKTtlPD1kO2UrKyl5PXkubXVsdGlwbHkoQ2UuZnJvbU51bWJlcigxMCkpLHk9eS5hZGQoQ2UuZnJvbU51bWJlcihoW2VdKSl9Y29uc3QgVT1mdW5jdGlvbihlLHQpe2lmKCFlJiYhdClyZXR1cm57aGlnaDpDZS5mcm9tTnVtYmVyKDApLGxvdzpDZS5mcm9tTnVtYmVyKDApfTtjb25zdCBuPWUuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxyPW5ldyBDZShlLmdldExvd0JpdHMoKSwwKSxpPXQuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxvPW5ldyBDZSh0LmdldExvd0JpdHMoKSwwKTtsZXQgcz1uLm11bHRpcGx5KGkpLGY9bi5tdWx0aXBseShvKTtjb25zdCB1PXIubXVsdGlwbHkoaSk7bGV0IGE9ci5tdWx0aXBseShvKTtyZXR1cm4gcz1zLmFkZChmLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLGY9bmV3IENlKGYuZ2V0TG93Qml0cygpLDApLmFkZCh1KS5hZGQoYS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxzPXMuYWRkKGYuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksYT1mLnNoaWZ0TGVmdCgzMikuYWRkKG5ldyBDZShhLmdldExvd0JpdHMoKSwwKSkse2hpZ2g6cyxsb3c6YX19KHAsQ2UuZnJvbVN0cmluZygiMTAwMDAwMDAwMDAwMDAwMDAwIikpO1UubG93PVUubG93LmFkZCh5KSxmdW5jdGlvbihlLHQpe2NvbnN0IG49ZS5oaWdoPj4+MCxyPXQuaGlnaD4+PjA7aWYobjxyKXJldHVybiEwO2lmKG49PT1yJiZlLmxvdz4+PjA8dC5sb3c+Pj4wKXJldHVybiEwO3JldHVybiExfShVLmxvdyx5KSYmKFUuaGlnaD1VLmhpZ2guYWRkKENlLmZyb21OdW1iZXIoMSkpKSx3PWIrNjE3Njtjb25zdCBPPXtsb3c6Q2UuZnJvbU51bWJlcigwKSxoaWdoOkNlLmZyb21OdW1iZXIoMCl9O1UuaGlnaC5zaGlmdFJpZ2h0VW5zaWduZWQoNDkpLmFuZChDZS5mcm9tTnVtYmVyKDEpKS5lcXVhbHMoQ2UuZnJvbU51bWJlcigxKSk/KE8uaGlnaD1PLmhpZ2gub3IoQ2UuZnJvbU51bWJlcigzKS5zaGlmdExlZnQoNjEpKSxPLmhpZ2g9Ty5oaWdoLm9yKENlLmZyb21OdW1iZXIodykuYW5kKENlLmZyb21OdW1iZXIoMTYzODMpLnNoaWZ0TGVmdCg0NykpKSxPLmhpZ2g9Ty5oaWdoLm9yKFUuaGlnaC5hbmQoQ2UuZnJvbU51bWJlcigweDdmZmZmZmZmZmZmZikpKSk6KE8uaGlnaD1PLmhpZ2gub3IoQ2UuZnJvbU51bWJlcigxNjM4MyZ3KS5zaGlmdExlZnQoNDkpKSxPLmhpZ2g9Ty5oaWdoLm9yKFUuaGlnaC5hbmQoQ2UuZnJvbU51bWJlcig1NjI5NDk5NTM0MjEzMTEpKSkpLE8ubG93PVUubG93LG4mJihPLmhpZ2g9Ty5oaWdoLm9yKENlLmZyb21TdHJpbmcoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSkpO2NvbnN0IE49eWUuYWxsb2NhdGVVbnNhZmUoMTYpO3JldHVybiBtPTAsTlttKytdPTI1NSZPLmxvdy5sb3csTlttKytdPU8ubG93Lmxvdz4+OCYyNTUsTlttKytdPU8ubG93Lmxvdz4+MTYmMjU1LE5bbSsrXT1PLmxvdy5sb3c+PjI0JjI1NSxOW20rK109MjU1Jk8ubG93LmhpZ2gsTlttKytdPU8ubG93LmhpZ2g+PjgmMjU1LE5bbSsrXT1PLmxvdy5oaWdoPj4xNiYyNTUsTlttKytdPU8ubG93LmhpZ2g+PjI0JjI1NSxOW20rK109MjU1Jk8uaGlnaC5sb3csTlttKytdPU8uaGlnaC5sb3c+PjgmMjU1LE5bbSsrXT1PLmhpZ2gubG93Pj4xNiYyNTUsTlttKytdPU8uaGlnaC5sb3c+PjI0JjI1NSxOW20rK109MjU1Jk8uaGlnaC5oaWdoLE5bbSsrXT1PLmhpZ2guaGlnaD4+OCYyNTUsTlttKytdPU8uaGlnaC5oaWdoPj4xNiYyNTUsTlttKytdPU8uaGlnaC5oaWdoPj4yNCYyNTUsbmV3IFFlKE4pfXRvU3RyaW5nKCl7bGV0IGUsdD0wO2NvbnN0IG49bmV3IEFycmF5KDM2KTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdPTA7bGV0IHIsaSxvLHM9MCxmPSExLHU9e3BhcnRzOlswLDAsMCwwXX07Y29uc3QgYT1bXTtzPTA7Y29uc3QgbD10aGlzLmJ5dGVzLGg9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQsYz1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNCxnPWxbcysrXXxsW3MrK108PDh8bFtzKytdPDwxNnxsW3MrK108PDI0LGQ9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQ7cz0wOyh7bG93Om5ldyBDZShoLGMpLGhpZ2g6bmV3IENlKGcsZCl9KS5oaWdoLmxlc3NUaGFuKENlLlpFUk8pJiZhLnB1c2goIi0iKTtjb25zdCBiPWQ+PjI2JjMxO2lmKGI+PjM9PTMpe2lmKDMwPT09YilyZXR1cm4gYS5qb2luKCIiKSsiSW5maW5pdHkiO2lmKDMxPT09YilyZXR1cm4iTmFOIjtlPWQ+PjE1JjE2MzgzLHI9OCsoZD4+MTQmMSl9ZWxzZSByPWQ+PjE0JjcsZT1kPj4xNyYxNjM4Mztjb25zdCBwPWUtNjE3NjtpZih1LnBhcnRzWzBdPSgxNjM4MyZkKSsoKDE1JnIpPDwxNCksdS5wYXJ0c1sxXT1nLHUucGFydHNbMl09Yyx1LnBhcnRzWzNdPWgsMD09PXUucGFydHNbMF0mJjA9PT11LnBhcnRzWzFdJiYwPT09dS5wYXJ0c1syXSYmMD09PXUucGFydHNbM10pZj0hMDtlbHNlIGZvcihvPTM7bz49MDtvLS0pe2xldCBlPTA7Y29uc3QgdD1HZSh1KTtpZih1PXQucXVvdGllbnQsZT10LnJlbS5sb3csZSlmb3IoaT04O2k+PTA7aS0tKW5bOSpvK2ldPWUlMTAsZT1NYXRoLmZsb29yKGUvMTApfWlmKGYpdD0xLG5bc109MDtlbHNlIGZvcih0PTM2OyFuW3NdOyl0LT0xLHMrPTE7Y29uc3QgeT10LTErcDtpZih5Pj0zNHx8eTw9LTd8fHA+MCl7aWYodD4zNClyZXR1cm4gYS5wdXNoKCIwIikscD4wP2EucHVzaChgRSske3B9YCk6cDwwJiZhLnB1c2goYEUke3B9YCksYS5qb2luKCIiKTthLnB1c2goYCR7bltzKytdfWApLHQtPTEsdCYmYS5wdXNoKCIuIik7Zm9yKGxldCBlPTA7ZTx0O2UrKylhLnB1c2goYCR7bltzKytdfWApO2EucHVzaCgiRSIpLHk+MD9hLnB1c2goYCske3l9YCk6YS5wdXNoKGAke3l9YCl9ZWxzZSBpZihwPj0wKWZvcihsZXQgZT0wO2U8dDtlKyspYS5wdXNoKGAke25bcysrXX1gKTtlbHNle2xldCBlPXQrcDtpZihlPjApZm9yKGxldCB0PTA7dDxlO3QrKylhLnB1c2goYCR7bltzKytdfWApO2Vsc2UgYS5wdXNoKCIwIik7Zm9yKGEucHVzaCgiLiIpO2UrKzwwOylhLnB1c2goIjAiKTtmb3IobGV0IHI9MDtyPHQtTWF0aC5tYXgoZS0xLDApO3IrKylhLnB1c2goYCR7bltzKytdfWApfXJldHVybiBhLmpvaW4oIiIpfXRvSlNPTigpe3JldHVybnskbnVtYmVyRGVjaW1hbDp0aGlzLnRvU3RyaW5nKCl9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIFFlLmZyb21TdHJpbmcoZS4kbnVtYmVyRGVjaW1hbCl9aW5zcGVjdChlLHQsbil7bj8/PUU7cmV0dXJuYG5ldyBEZWNpbWFsMTI4KCR7bih0aGlzLnRvU3RyaW5nKCksdCl9KWB9fWNsYXNzIGV0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJEb3VibGUifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9K2V9c3RhdGljIGZyb21TdHJpbmcoZSl7Y29uc3QgdD1OdW1iZXIoZSk7aWYoIk5hTiI9PT1lKXJldHVybiBuZXcgZXQoTmFOKTtpZigiSW5maW5pdHkiPT09ZSlyZXR1cm4gbmV3IGV0KDEvMCk7aWYoIi1JbmZpbml0eSI9PT1lKXJldHVybiBuZXcgZXQoLTEvMCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSl0aHJvdyBuZXcgdGUoYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgRG91YmxlYCk7aWYoZS50cmltKCkhPT1lKXRocm93IG5ldyB0ZShgSW5wdXQ6ICcke2V9JyBjb250YWlucyB3aGl0ZXNwYWNlYCk7aWYoIiI9PT1lKXRocm93IG5ldyB0ZSgiSW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nIik7aWYoL1teLTAtOS4rZUVdLy50ZXN0KGUpKXRocm93IG5ldyB0ZShgSW5wdXQ6ICcke2V9JyBpcyBub3QgaW4gZGVjaW1hbCBvciBleHBvbmVudGlhbCBub3RhdGlvbmApO3JldHVybiBuZXcgZXQodCl9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5sZWdhY3l8fGUucmVsYXhlZCYmaXNGaW5pdGUodGhpcy52YWx1ZSkpP3RoaXMudmFsdWU6T2JqZWN0LmlzKE1hdGguc2lnbih0aGlzLnZhbHVlKSwtMCk/eyRudW1iZXJEb3VibGU6Ii0wLjAifTp7JG51bWJlckRvdWJsZTpOdW1iZXIuaXNJbnRlZ2VyKHRoaXMudmFsdWUpP3RoaXMudmFsdWUudG9GaXhlZCgxKTp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7Y29uc3Qgbj1wYXJzZUZsb2F0KGUuJG51bWJlckRvdWJsZSk7cmV0dXJuIHQmJnQucmVsYXhlZD9uOm5ldyBldChuKX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PUUsYG5ldyBEb3VibGUoJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNsYXNzIHR0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJJbnQzMiJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSxlIGluc3RhbmNlb2YgTnVtYmVyJiYoZT1lLnZhbHVlT2YoKSksdGhpcy52YWx1ZT0wfCtlfXN0YXRpYyBmcm9tU3RyaW5nKGUpe2NvbnN0IHQ9dmUoZSksbj1OdW1iZXIoZSk7aWYoTjxuKXRocm93IG5ldyB0ZShgSW5wdXQ6ICcke2V9JyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZih4Pm4pdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZighTnVtYmVyLmlzU2FmZUludGVnZXIobikpdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO2lmKG4udG9TdHJpbmcoKSE9PXQpdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHZhbGlkIEludDMyIHN0cmluZ2ApO3JldHVybiBuZXcgdHQobil9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5yZWxheGVkfHxlLmxlZ2FjeSk/dGhpcy52YWx1ZTp7JG51bWJlckludDp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7cmV0dXJuIHQmJnQucmVsYXhlZD9wYXJzZUludChlLiRudW1iZXJJbnQsMTApOm5ldyB0dChlLiRudW1iZXJJbnQpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89RSxgbmV3IEludDMyKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBudCBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWF4S2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWF4S2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBudH1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNYXhLZXkoKSJ9fWNsYXNzIHJ0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJNaW5LZXkifXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRtaW5LZXk6MX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oKXtyZXR1cm4gbmV3IHJ0fWluc3BlY3QoKXtyZXR1cm4ibmV3IE1pbktleSgpIn19bGV0IGl0PW51bGw7Y29uc3Qgb3Q9bmV3IFdlYWtNYXA7Y2xhc3Mgc3QgZXh0ZW5kcyBtZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk9iamVjdElkIn1zdGF0aWMgaW5kZXg9TWF0aC5mbG9vcigxNjc3NzIxNSpNYXRoLnJhbmRvbSgpKTtzdGF0aWMgY2FjaGVIZXhTdHJpbmc7YnVmZmVyO2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKHN1cGVyKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYiaWQiaW4gZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmlkJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUuaWQpKXRocm93IG5ldyB0ZSgiQXJndW1lbnQgcGFzc2VkIGluIG11c3QgaGF2ZSBhbiBpZCB0aGF0IGlzIG9mIHR5cGUgc3RyaW5nIG9yIEJ1ZmZlciIpO3Q9InRvSGV4U3RyaW5nImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvSGV4U3RyaW5nP3llLmZyb21IZXgoZS50b0hleFN0cmluZygpKTplLmlkfWVsc2UgdD1lO2lmKG51bGw9PXQpdGhpcy5idWZmZXI9c3QuZ2VuZXJhdGUoKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyh0KSYmMTI9PT10LmJ5dGVMZW5ndGgpdGhpcy5idWZmZXI9eWUudG9Mb2NhbEJ1ZmZlclR5cGUodCk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IHRlKCJBcmd1bWVudCBwYXNzZWQgaW4gZG9lcyBub3QgbWF0Y2ggdGhlIGFjY2VwdGVkIHR5cGVzIik7aWYoIXN0LnZhbGlkYXRlSGV4U3RyaW5nKHQpKXRocm93IG5ldyB0ZSgiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLmJ1ZmZlcj15ZS5mcm9tSGV4KHQpLHN0LmNhY2hlSGV4U3RyaW5nJiZvdC5zZXQodGhpcyx0KX19Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lLHN0LmNhY2hlSGV4U3RyaW5nJiZvdC5zZXQodGhpcyx5ZS50b0hleChlKSl9c3RhdGljIHZhbGlkYXRlSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8MjQ7dCsrKXtjb25zdCBuPWUuY2hhckNvZGVBdCh0KTtpZighKG4+PTQ4JiZuPD01N3x8bj49OTcmJm48PTEwMnx8bj49NjUmJm48PTcwKSlyZXR1cm4hMX1yZXR1cm4hMH10b0hleFN0cmluZygpe2lmKHN0LmNhY2hlSGV4U3RyaW5nKXtjb25zdCBlPW90LmdldCh0aGlzKTtpZihlKXJldHVybiBlfWNvbnN0IGU9eWUudG9IZXgodGhpcy5pZCk7cmV0dXJuIHN0LmNhY2hlSGV4U3RyaW5nJiZvdC5zZXQodGhpcyxlKSxlfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gc3QuaW5kZXg9KHN0LmluZGV4KzEpJTE2Nzc3MjE1fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PXN0LmdldEluYygpLG49eWUuYWxsb2NhdGVVbnNhZmUoMTIpO3JldHVybiBVZS5zZXRJbnQzMkJFKG4sMCxlKSxudWxsPT09aXQmJihpdD15ZS5yYW5kb21CeXRlcyg1KSksbls0XT1pdFswXSxuWzVdPWl0WzFdLG5bNl09aXRbMl0sbls3XT1pdFszXSxuWzhdPWl0WzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+PjgmMjU1LG5bOV09dD4+MTYmMjU1LG59dG9TdHJpbmcoZSl7cmV0dXJuImJhc2U2NCI9PT1lP3llLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfXN0YXRpYyBpcyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJPYmplY3RJZCI9PT1lLl9ic29udHlwZX1lcXVhbHMoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZihzdC5pcyhlKSlyZXR1cm4gdGhpcy5idWZmZXJbMTFdPT09ZS5idWZmZXJbMTFdJiZ5ZS5lcXVhbHModGhpcy5idWZmZXIsZS5idWZmZXIpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9VWUuZ2V0VWludDMyQkUodGhpcy5idWZmZXIsMCk7cmV0dXJuIGUuc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0KSksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IHN0fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmJ1ZmZlclswXSxlW3QrMV09dGhpcy5idWZmZXJbMV0sZVt0KzJdPXRoaXMuYnVmZmVyWzJdLGVbdCszXT10aGlzLmJ1ZmZlclszXSxlW3QrNF09dGhpcy5idWZmZXJbNF0sZVt0KzVdPXRoaXMuYnVmZmVyWzVdLGVbdCs2XT10aGlzLmJ1ZmZlcls2XSxlW3QrN109dGhpcy5idWZmZXJbN10sZVt0KzhdPXRoaXMuYnVmZmVyWzhdLGVbdCs5XT10aGlzLmJ1ZmZlcls5XSxlW3QrMTBdPXRoaXMuYnVmZmVyWzEwXSxlW3QrMTFdPXRoaXMuYnVmZmVyWzExXSwxMn1zdGF0aWMgY3JlYXRlRnJvbVRpbWUoZSl7Y29uc3QgdD15ZS5hbGxvY2F0ZSgxMik7Zm9yKGxldCBlPTExO2U+PTQ7ZS0tKXRbZV09MDtyZXR1cm4gVWUuc2V0SW50MzJCRSh0LDAsZSksbmV3IHN0KHQpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXRocm93IG5ldyB0ZSgiaGV4IHN0cmluZyBtdXN0IGJlIDI0IGNoYXJhY3RlcnMiKTtyZXR1cm4gbmV3IHN0KHllLmZyb21IZXgoZSkpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe2lmKDE2IT09ZT8ubGVuZ3RoKXRocm93IG5ldyB0ZSgiYmFzZTY0IHN0cmluZyBtdXN0IGJlIDE2IGNoYXJhY3RlcnMiKTtyZXR1cm4gbmV3IHN0KHllLmZyb21CYXNlNjQoZSkpfXN0YXRpYyBpc1ZhbGlkKGUpe2lmKG51bGw9PWUpcmV0dXJuITE7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBzdC52YWxpZGF0ZUhleFN0cmluZyhlKTt0cnl7cmV0dXJuIG5ldyBzdChlKSwhMH1jYXRjaHtyZXR1cm4hMX19dG9FeHRlbmRlZEpTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZz97JG9pZDp0aGlzLnRvSGV4U3RyaW5nKCl9Onskb2lkOnRoaXMudG9TdHJpbmcoImhleCIpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gbmV3IHN0KGUuJG9pZCl9aXNDYWNoZWQoKXtyZXR1cm4gc3QuY2FjaGVIZXhTdHJpbmcmJm90Lmhhcyh0aGlzKX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PUUsYG5ldyBPYmplY3RJZCgke24odGhpcy50b0hleFN0cmluZygpLHQpfSlgfX1mdW5jdGlvbiBmdChlLHQsbil7bGV0IHI9NTtpZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXIrPXV0KGkudG9TdHJpbmcoKSxlW2ldLHQsITAsbik7ZWxzZXsiZnVuY3Rpb24iPT10eXBlb2YgZT8udG9CU09OJiYoZT1lLnRvQlNPTigpKTtmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhlKSlyKz11dChpLGVbaV0sdCwhMSxuKX1yZXR1cm4gcn1mdW5jdGlvbiB1dChlLHQsbj0hMSxyPSExLGk9ITEpe3N3aXRjaCgiZnVuY3Rpb24iPT10eXBlb2YgdD8udG9CU09OJiYodD10LnRvQlNPTigpKSx0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOnJldHVybiAxK3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzErNCt5ZS51dGY4Qnl0ZUxlbmd0aCh0KSsxO2Nhc2UibnVtYmVyIjpyZXR1cm4gTWF0aC5mbG9vcih0KT09PXQmJnQ+PSQmJnQ8PVQmJnQ+PXgmJnQ8PU4/KG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs1OihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrOTtjYXNlInVuZGVmaW5lZCI6cmV0dXJuIHJ8fCFpPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTowO2Nhc2UiYm9vbGVhbiI6cmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSsyO2Nhc2Uib2JqZWN0IjppZihudWxsIT10JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlJiZ0W09dIT09VSl0aHJvdyBuZXcgbmU7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE7aWYoIk9iamVjdElkIj09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTM7aWYodCBpbnN0YW5jZW9mIERhdGV8fFModCkpcmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHx3KHQpKXJldHVybihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNit0LmJ5dGVMZW5ndGg7aWYoIkxvbmciPT09dC5fYnNvbnR5cGV8fCJEb3VibGUiPT09dC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKCJEZWNpbWFsMTI4Ij09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTc7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpcmV0dXJuIG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0KzQreWUudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzErZnQodC5zY29wZSxuLGkpOihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K3llLnV0ZjhCeXRlTGVuZ3RoKHQuY29kZS50b1N0cmluZygpKSsxO2lmKCJCaW5hcnkiPT09dC5fYnNvbnR5cGUpe2NvbnN0IG49dDtyZXR1cm4gbi5zdWJfdHlwZT09PU9lLlNVQlRZUEVfQllURV9BUlJBWT8obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKyhuLnBvc2l0aW9uKzErNCsxKzQpOihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrKG4ucG9zaXRpb24rMSs0KzEpfWlmKCJTeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSt5ZS51dGY4Qnl0ZUxlbmd0aCh0LnZhbHVlKSs0KzErMTtpZigiREJSZWYiPT09dC5fYnNvbnR5cGUpe2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7JHJlZjp0LmNvbGxlY3Rpb24sJGlkOnQub2lkfSx0LmZpZWxkcyk7cmV0dXJuIG51bGwhPXQuZGImJihyLiRkYj10LmRiKSwobnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErZnQocixuLGkpfXJldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfHxtKHQpPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSt5ZS51dGY4Qnl0ZUxlbmd0aCh0LnNvdXJjZSkrMSsodC5nbG9iYWw/MTowKSsodC5pZ25vcmVDYXNlPzE6MCkrKHQubXVsdGlsaW5lPzE6MCkrMToiQlNPTlJlZ0V4cCI9PT10Ll9ic29udHlwZT8obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzEreWUudXRmOEJ5dGVMZW5ndGgodC5wYXR0ZXJuKSsxK3llLnV0ZjhCeXRlTGVuZ3RoKHQub3B0aW9ucykrMToobnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApK2Z0KHQsbixpKSsxO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K3llLnV0ZjhCeXRlTGVuZ3RoKHQudG9TdHJpbmcoKSkrMTowO2Nhc2UiYmlnaW50IjpyZXR1cm4obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IHRlKCJVbnJlY29nbml6ZWQgSlMgdHlwZTogIit0eXBlb2YgdCl9fWNsYXNzIGF0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJCU09OUmVnRXhwIn1wYXR0ZXJuO29wdGlvbnM7Y29uc3RydWN0b3IoZSx0KXtpZihzdXBlcigpLHRoaXMucGF0dGVybj1lLHRoaXMub3B0aW9ucz0odD8/IiIpLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIiksLTEhPT10aGlzLnBhdHRlcm4uaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgdGUoYEJTT04gUmVnZXggcGF0dGVybnMgY2Fubm90IGNvbnRhaW4gbnVsbCBieXRlcywgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXR0ZXJuKX1gKTtpZigtMSE9PXRoaXMub3B0aW9ucy5pbmRleE9mKCJcMCIpKXRocm93IG5ldyB0ZShgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyB0ZShgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcHRpb24gWyR7dGhpcy5vcHRpb25zW2VdfV0gaXMgbm90IHN1cHBvcnRlZGApfXN0YXRpYyBwYXJzZU9wdGlvbnMoZSl7cmV0dXJuIGU/ZS5zcGxpdCgiIikuc29ydCgpLmpvaW4oIiIpOiIifXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybihlPWV8fHt9KS5sZWdhY3k/eyRyZWdleDp0aGlzLnBhdHRlcm4sJG9wdGlvbnM6dGhpcy5vcHRpb25zfTp7JHJlZ3VsYXJFeHByZXNzaW9uOntwYXR0ZXJuOnRoaXMucGF0dGVybixvcHRpb25zOnRoaXMub3B0aW9uc319fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2lmKCIkcmVnZXgiaW4gZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLiRyZWdleClyZXR1cm4gbmV3IGF0KGUuJHJlZ2V4LGF0LnBhcnNlT3B0aW9ucyhlLiRvcHRpb25zKSk7aWYoIkJTT05SZWdFeHAiPT09ZS4kcmVnZXguX2Jzb250eXBlKXJldHVybiBlfWlmKCIkcmVndWxhckV4cHJlc3Npb24iaW4gZSlyZXR1cm4gbmV3IGF0KGUuJHJlZ3VsYXJFeHByZXNzaW9uLnBhdHRlcm4sYXQucGFyc2VPcHRpb25zKGUuJHJlZ3VsYXJFeHByZXNzaW9uLm9wdGlvbnMpKTt0aHJvdyBuZXcgdGUoYFVuZXhwZWN0ZWQgQlNPTlJlZ0V4cCBFSlNPTiBvYmplY3QgZm9ybTogJHtKU09OLnN0cmluZ2lmeShlKX1gKX1pbnNwZWN0KGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmInN0eWxpemUiaW4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc3R5bGl6ZSlyZXR1cm4gZS5zdHlsaXplfSh0KT8/KGU9PmUpO24/Pz1FO3JldHVybmBuZXcgQlNPTlJlZ0V4cCgke3Iobih0aGlzLnBhdHRlcm4pLCJyZWdleHAiKX0sICR7cihuKHRoaXMub3B0aW9ucyksInJlZ2V4cCIpfSlgfX1jbGFzcyBsdCBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iQlNPTlN5bWJvbCJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnZhbHVlPWV9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9KU09OKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JHN5bWJvbDp0aGlzLnZhbHVlfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gbmV3IGx0KGUuJHN5bWJvbCl9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz1FLGBuZXcgQlNPTlN5bWJvbCgke24odGhpcy52YWx1ZSx0KX0pYH19Y29uc3QgaHQ9Q2U7Y2xhc3MgY3QgZXh0ZW5kcyBodHtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIlRpbWVzdGFtcCJ9Z2V0W3dlXSgpe3JldHVybiJUaW1lc3RhbXAifXN0YXRpYyBNQVhfVkFMVUU9Q2UuTUFYX1VOU0lHTkVEX1ZBTFVFO2dldCBpKCl7cmV0dXJuIHRoaXMubG93Pj4+MH1nZXQgdCgpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfWNvbnN0cnVjdG9yKGUpe2lmKG51bGw9PWUpc3VwZXIoMCwwLCEwKTtlbHNlIGlmKCJiaWdpbnQiPT10eXBlb2YgZSlzdXBlcihlLCEwKTtlbHNlIGlmKENlLmlzTG9uZyhlKSlzdXBlcihlLmxvdyxlLmhpZ2gsITApO2Vsc2V7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHwhKCJ0ImluIGUpfHwhKCJpImluIGUpKXRocm93IG5ldyB0ZSgiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyB0ZSgiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgYXMgYSBudW1iZXIiKTtpZigibnVtYmVyIiE9dHlwZW9mIGUuaSYmKCJvYmplY3QiIT10eXBlb2YgZS5pfHwiSW50MzIiIT09ZS5pLl9ic29udHlwZSkpdGhyb3cgbmV3IHRlKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgaSBhcyBhIG51bWJlciIpO2NvbnN0IHQ9TnVtYmVyKGUudCksbj1OdW1iZXIoZS5pKTtpZih0PDB8fE51bWJlci5pc05hTih0KSl0aHJvdyBuZXcgdGUoIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgdGUoIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIGkiKTtpZih0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHRlKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBlcXVhbCBvciBsZXNzIHRoYW4gdWludDMyIG1heCIpO2lmKG4+NDI5NDk2NzI5NSl0aHJvdyBuZXcgdGUoIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBjdChDZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGN0KENlLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgY3Qoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgY3QoQ2UuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9Q2UuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPUNlLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBjdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz1FO3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgZ3Q9Q2UuZnJvbU51bWJlcihUKSxkdD1DZS5mcm9tTnVtYmVyKCQpO2Z1bmN0aW9uIGJ0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9VWUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgdGUoYGJzb24gc2l6ZSBtdXN0IGJlID49IDUsIGlzICR7aX1gKTtpZih0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aDxpKXRocm93IG5ldyB0ZShgYnVmZmVyIGxlbmd0aCAke2UubGVuZ3RofSBtdXN0IGJlID49IGJzb24gc2l6ZSAke2l9YCk7aWYoIXQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoIT09aSl0aHJvdyBuZXcgdGUoYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyB0ZShgKGJzb24gc2l6ZSAke2l9ICsgb3B0aW9ucy5pbmRleCAke3J9IG11c3QgYmUgPD0gYnVmZmVyIGxlbmd0aCAke2UuYnl0ZUxlbmd0aH0pYCk7aWYoMCE9PWVbcitpLTFdKXRocm93IG5ldyB0ZSgiT25lIG9iamVjdCwgc2l6ZWQgY29ycmVjdGx5LCB3aXRoIGEgc3BvdCBmb3IgYW4gRU9PLCBidXQgdGhlIEVPTyBpc24ndCAweDAwIik7cmV0dXJuIHl0KGUscix0LG4pfWNvbnN0IHB0PS9eXCRyZWYkfF5cJGlkJHxeXCRkYiQvO2Z1bmN0aW9uIHl0KGUsdCxuLHI9ITEpe2NvbnN0IGk9bnVsbD09bi5maWVsZHNBc1Jhdz9udWxsOm4uZmllbGRzQXNSYXcsbz1udWxsIT1uLnJhdyYmbi5yYXcscz0iYm9vbGVhbiI9PXR5cGVvZiBuLmJzb25SZWdFeHAmJm4uYnNvblJlZ0V4cCxmPW4ucHJvbW90ZUJ1ZmZlcnM/PyExLHU9bi5wcm9tb3RlTG9uZ3M/PyEwLGE9bi5wcm9tb3RlVmFsdWVzPz8hMCxsPW4udXNlQmlnSW50NjQ/PyExO2lmKGwmJiFhKXRocm93IG5ldyB0ZSgiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYobCYmIXUpdGhyb3cgbmV3IHRlKCJNdXN0IGVpdGhlciByZXF1ZXN0IGJpZ2ludCBvciBMb25nIGZvciBpbnQ2NCBkZXNlcmlhbGl6YXRpb24iKTtsZXQgaCxjLGc9ITA7Y29uc3QgZD0obnVsbD09bi52YWxpZGF0aW9uP3t1dGY4OiEwfTpuLnZhbGlkYXRpb24pLnV0Zjg7aWYoImJvb2xlYW4iPT10eXBlb2YgZCloPWQ7ZWxzZXtnPSExO2NvbnN0IGU9T2JqZWN0LmtleXMoZCkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZFtlXX0pKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJVVEYtOCB2YWxpZGF0aW9uIHNldHRpbmcgY2Fubm90IGJlIGVtcHR5Iik7aWYoImJvb2xlYW4iIT10eXBlb2YgZVswXSl0aHJvdyBuZXcgdGUoIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24sIG11c3Qgc3BlY2lmeSBib29sZWFuIHZhbHVlcyIpO2lmKGg9ZVswXSwhZS5ldmVyeSgoZT0+ZT09PWgpKSl0aHJvdyBuZXcgdGUoIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24gLSBrZXlzIG11c3QgYmUgYWxsIHRydWUgb3IgYWxsIGZhbHNlIil9aWYoIWcpe2M9bmV3IFNldDtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhkKSljLmFkZChlKX1jb25zdCBiPXQ7aWYoZS5sZW5ndGg8NSl0aHJvdyBuZXcgdGUoImNvcnJ1cHQgYnNvbiBtZXNzYWdlIDwgNSBieXRlcyBsb25nIik7Y29uc3QgcD1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxwPDV8fHA+ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJjb3JydXB0IGJzb24gbWVzc2FnZSIpO2NvbnN0IHk9cj9bXTp7fTtsZXQgdz0wLG09IXImJm51bGw7Zm9yKDs7KXtjb25zdCBkPWVbdCsrXTtpZigwPT09ZClicmVhaztsZXQgYj10O2Zvcig7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IHRlKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3QgcD1yP3crKzp5ZS50b1VURjgoZSx0LGIsITEpO2xldCBCLFM9ITA7aWYoUz1nfHxjPy5oYXMocCk/aDohaCwhMSE9PW0mJiIkIj09PXBbMF0mJihtPXB0LnRlc3QocCkpLHQ9YisxLGQ9PT12KXtjb25zdCBuPVVlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyB0ZSgiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO0I9eWUudG9VVEY4KGUsdCx0K24tMSxTKSx0Kz1ufWVsc2UgaWYoZD09PUQpe2NvbnN0IG49eWUuYWxsb2NhdGVVbnNhZmUoMTIpO2ZvcihsZXQgcj0wO3I8MTI7cisrKW5bcl09ZVt0K3JdO0I9bmV3IHN0KG4pLHQrPTEyfWVsc2UgaWYoZD09PUgmJiExPT09YSlCPW5ldyB0dChVZS5nZXRJbnQzMkxFKGUsdCkpLHQrPTQ7ZWxzZSBpZihkPT09SClCPVVlLmdldEludDMyTEUoZSx0KSx0Kz00O2Vsc2UgaWYoZD09PUwpQj1VZS5nZXRGbG9hdDY0TEUoZSx0KSx0Kz04LCExPT09YSYmKEI9bmV3IGV0KEIpKTtlbHNlIGlmKGQ9PT1WKXtjb25zdCBuPVVlLmdldEludDMyTEUoZSx0KSxyPVVlLmdldEludDMyTEUoZSx0KzQpO3QrPTgsQj1uZXcgRGF0ZShuZXcgQ2UobixyKS50b051bWJlcigpKX1lbHNlIGlmKGQ9PT16KXtpZigwIT09ZVt0XSYmMSE9PWVbdF0pdGhyb3cgbmV3IHRlKCJpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZSIpO0I9MT09PWVbdCsrXX1lbHNlIGlmKGQ9PT1BKXtjb25zdCByPXQsaT1VZS5nZXRJbnQzMkxFKGUsdCk7aWYoaTw9MHx8aT5lLmxlbmd0aC10KXRocm93IG5ldyB0ZSgiYmFkIGVtYmVkZGVkIGRvY3VtZW50IGxlbmd0aCBpbiBic29uIik7aWYobylCPWUuc3ViYXJyYXkodCx0K2kpO2Vsc2V7bGV0IHQ9bjtnfHwodD17Li4ubix2YWxpZGF0aW9uOnt1dGY4OlN9fSksQj15dChlLHIsdCwhMSl9dCs9aX1lbHNlIGlmKGQ9PT1qKXtjb25zdCByPXQsbz1VZS5nZXRJbnQzMkxFKGUsdCk7bGV0IHM9bjtjb25zdCBmPXQrbztpZihpJiZpW3BdJiYocz17Li4ubixyYXc6ITB9KSxnfHwocz17Li4ucyx2YWxpZGF0aW9uOnt1dGY4OlN9fSksQj15dChlLHIscywhMCksMCE9PWVbKHQrPW8pLTFdKXRocm93IG5ldyB0ZSgiaW52YWxpZCBhcnJheSB0ZXJtaW5hdG9yIGJ5dGUiKTtpZih0IT09Zil0aHJvdyBuZXcgdGUoImNvcnJ1cHRlZCBhcnJheSBic29uIil9ZWxzZSBpZihkPT09UilCPXZvaWQgMDtlbHNlIGlmKGQ9PT1DKUI9bnVsbDtlbHNlIGlmKGQ9PT1XKWlmKGwpQj1VZS5nZXRCaWdJbnQ2NExFKGUsdCksdCs9ODtlbHNle2NvbnN0IG49VWUuZ2V0SW50MzJMRShlLHQpLHI9VWUuZ2V0SW50MzJMRShlLHQrNCk7dCs9ODtjb25zdCBpPW5ldyBDZShuLHIpO0I9dSYmITA9PT1hJiZpLmxlc3NUaGFuT3JFcXVhbChndCkmJmkuZ3JlYXRlclRoYW5PckVxdWFsKGR0KT9pLnRvTnVtYmVyKCk6aX1lbHNlIGlmKGQ9PT1LKXtjb25zdCBuPXllLmFsbG9jYXRlVW5zYWZlKDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyluW3JdPWVbdCtyXTt0Kz0xNixCPW5ldyBRZShuKX1lbHNlIGlmKGQ9PT1GKXtsZXQgbj1VZS5nZXRJbnQzMkxFKGUsdCk7dCs9NDtjb25zdCByPW4saT1lW3QrK107aWYobjwwKXRocm93IG5ldyB0ZSgiTmVnYXRpdmUgYmluYXJ5IHR5cGUgZWxlbWVudCBzaXplIGZvdW5kIik7aWYobj5lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IHRlKCJCaW5hcnkgdHlwZSBzaXplIGxhcmdlciB0aGFuIGRvY3VtZW50IHNpemUiKTtpZihpPT09T2UuU1VCVFlQRV9CWVRFX0FSUkFZKXtpZihuPVVlLmdldEludDMyTEUoZSx0KSx0Kz00LG48MCl0aHJvdyBuZXcgdGUoIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyIik7aWYobj5yLTQpdGhyb3cgbmV3IHRlKCJCaW5hcnkgdHlwZSB3aXRoIHN1YnR5cGUgMHgwMiBjb250YWlucyB0b28gbG9uZyBiaW5hcnkgc2l6ZSIpO2lmKG48ci00KXRocm93IG5ldyB0ZSgiQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG9vIHNob3J0IGJpbmFyeSBzaXplIil9ZiYmYT9CPXllLnRvTG9jYWxCdWZmZXJUeXBlKGUuc3ViYXJyYXkodCx0K24pKTooQj1uZXcgT2UoZS5zdWJhcnJheSh0LHQrbiksaSksaT09PVEmJl9lLmlzVmFsaWQoQikmJihCPUIudG9VVUlEKCkpKSx0Kz1ufWVsc2UgaWYoZD09PU0mJiExPT09cyl7Zm9yKGI9dDswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyB0ZSgiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49eWUudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyB0ZSgiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IHI9eWUudG9VVEY4KGUsdCxiLCExKTt0PWIrMTtjb25zdCBpPW5ldyBBcnJheShyLmxlbmd0aCk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrKylzd2l0Y2gocltiXSl7Y2FzZSJtIjppW2JdPSJtIjticmVhaztjYXNlInMiOmlbYl09ImciO2JyZWFrO2Nhc2UiaSI6aVtiXT0iaSJ9Qj1uZXcgUmVnRXhwKG4saS5qb2luKCIiKSl9ZWxzZSBpZihkPT09TSYmITA9PT1zKXtmb3IoYj10OzAhPT1lW2JdJiZiPGUubGVuZ3RoOyliKys7aWYoYj49ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgbj15ZS50b1VURjgoZSx0LGIsITEpO2ZvcihiPXQ9YisxOzAhPT1lW2JdJiZiPGUubGVuZ3RoOyliKys7aWYoYj49ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj15ZS50b1VURjgoZSx0LGIsITEpO3Q9YisxLEI9bmV3IGF0KG4scil9ZWxzZSBpZihkPT09ayl7Y29uc3Qgbj1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgdGUoImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPXllLnRvVVRGOChlLHQsdCtuLTEsUyk7Qj1hP3I6bmV3IGx0KHIpLHQrPW59ZWxzZSBpZihkPT09cSlCPW5ldyBjdCh7aTpVZS5nZXRVaW50MzJMRShlLHQpLHQ6VWUuZ2V0VWludDMyTEUoZSx0KzQpfSksdCs9ODtlbHNlIGlmKGQ9PT1aKUI9bmV3IHJ0O2Vsc2UgaWYoZD09PUcpQj1uZXcgbnQ7ZWxzZSBpZihkPT09Sil7Y29uc3Qgbj1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgdGUoImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPXllLnRvVVRGOChlLHQsdCtuLTEsUyk7Qj1uZXcgVGUociksdCs9bn1lbHNlIGlmKGQ9PT1ZKXtjb25zdCByPVVlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LHI8MTMpdGhyb3cgbmV3IHRlKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoIik7Y29uc3QgaT1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxpPD0wfHxpPmUubGVuZ3RoLXR8fDAhPT1lW3QraS0xXSl0aHJvdyBuZXcgdGUoImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCBvPXllLnRvVVRGOChlLHQsdCtpLTEsUykscz10Kz1pLGY9VWUuZ2V0SW50MzJMRShlLHQpLHU9eXQoZSxzLG4sITEpO2lmKHQrPWYscjw4K2YraSl0aHJvdyBuZXcgdGUoImNvZGVfd19zY29wZSB0b3RhbCBzaXplIGlzIHRvbyBzaG9ydCwgdHJ1bmNhdGluZyBzY29wZSIpO2lmKHI+OCtmK2kpdGhyb3cgbmV3IHRlKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQiKTtCPW5ldyBUZShvLHUpfWVsc2V7aWYoZCE9PVApdGhyb3cgbmV3IHRlKGBEZXRlY3RlZCB1bmtub3duIEJTT04gdHlwZSAke2QudG9TdHJpbmcoMTYpfSBmb3IgZmllbGRuYW1lICIke3B9ImApO3tjb25zdCBuPVVlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyB0ZSgiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9eWUudG9VVEY4KGUsdCx0K24tMSxTKTt0Kz1uO2NvbnN0IGk9eWUuYWxsb2NhdGVVbnNhZmUoMTIpO2ZvcihsZXQgbj0wO248MTI7bisrKWlbbl09ZVt0K25dO2NvbnN0IG89bmV3IHN0KGkpO3QrPTEyLEI9bmV3IExlKHIsbyl9fSJfX3Byb3RvX18iPT09cD9PYmplY3QuZGVmaW5lUHJvcGVydHkoeSxwLHt2YWx1ZTpCLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6eVtwXT1CfWlmKHAhPT10LWIpe2lmKHIpdGhyb3cgbmV3IHRlKCJjb3JydXB0IGFycmF5IGJzb24iKTt0aHJvdyBuZXcgdGUoImNvcnJ1cHQgb2JqZWN0IGJzb24iKX1pZighbSlyZXR1cm4geTtpZigkZSh5KSl7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHkpO3JldHVybiBkZWxldGUgZS4kcmVmLGRlbGV0ZSBlLiRpZCxkZWxldGUgZS4kZGIsbmV3IExlKHkuJHJlZix5LiRpZCx5LiRkYixlKX1yZXR1cm4geX1jb25zdCB3dD0vXHgwMC8sbXQ9bmV3IFNldChbIiRkYiIsIiRyZWYiLCIkaWQiLCIkY2x1c3RlclRpbWUiXSk7ZnVuY3Rpb24gQnQoZSx0LG4scil7ZVtyKytdPXY7ZVsocj1yK3llLmVuY29kZVVURjhJbnRvKGUsdCxyKSsxKS0xXT0wO2NvbnN0IGk9eWUuZW5jb2RlVVRGOEludG8oZSxuLHIrNCk7cmV0dXJuIFVlLnNldEludDMyTEUoZSxyLGkrMSkscj1yKzQraSxlW3IrK109MCxyfWZ1bmN0aW9uIFN0KGUsdCxuLHIpe2NvbnN0IGk9IU9iamVjdC5pcyhuLC0wKSYmTnVtYmVyLmlzU2FmZUludGVnZXIobikmJm48PU4mJm4+PXg/SDpMO2VbcisrXT1pO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9aT09PUg/VWUuc2V0SW50MzJMRShlLHIsbik6VWUuc2V0RmxvYXQ2NExFKGUscixuKX1mdW5jdGlvbiBFdChlLHQsbixyKXtlW3IrK109VztyZXR1cm4gcis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPVVlLnNldEJpZ0ludDY0TEUoZSxyLG4pfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe2VbcisrXT1DO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscn1mdW5jdGlvbiBPdChlLHQsbixyKXtlW3IrK109ejtyZXR1cm4gcis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLGVbcisrXT1uPzE6MCxyfWZ1bmN0aW9uIE50KGUsdCxuLHIpe2VbcisrXT1WO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPUNlLmZyb21OdW1iZXIobi5nZXRUaW1lKCkpLG89aS5nZXRMb3dCaXRzKCkscz1pLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPVVlLnNldEludDMyTEUoZSxyLG8pLHIrPVVlLnNldEludDMyTEUoZSxyLHMpfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe2VbcisrXT1NO2lmKHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxuLnNvdXJjZSYmbnVsbCE9bi5zb3VyY2UubWF0Y2god3QpKXRocm93IG5ldyB0ZSgidmFsdWUgIituLnNvdXJjZSsiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLG4uc291cmNlLHIpLGVbcisrXT0wLG4uaWdub3JlQ2FzZSYmKGVbcisrXT0xMDUpLG4uZ2xvYmFsJiYoZVtyKytdPTExNSksbi5tdWx0aWxpbmUmJihlW3IrK109MTA5KSxlW3IrK109MCxyfWZ1bmN0aW9uIEl0KGUsdCxuLHIpe2VbcisrXT1NO2lmKHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxudWxsIT1uLnBhdHRlcm4ubWF0Y2god3QpKXRocm93IG5ldyB0ZSgicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPXllLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPXllLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIF90KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1DOiJNaW5LZXkiPT09bi5fYnNvbnR5cGU/ZVtyKytdPVo6ZVtyKytdPUc7cmV0dXJuIHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIFR0KGUsdCxuLHIpe2VbcisrXT1EO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPUY7cis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9VWUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPVgsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gTHQoZSx0LG4scixpLG8scyxmLHUpe2lmKHUuaGFzKG4pKXRocm93IG5ldyB0ZSgiQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEJTT04iKTt1LmFkZChuKSxlW3IrK109QXJyYXkuaXNBcnJheShuKT9qOkE7cis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGE9TXQoZSxuLGkscixvKzEscyxmLHUpO3JldHVybiB1LmRlbGV0ZShuKSxhfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe2VbcisrXT1LO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtmb3IobGV0IHQ9MDt0PDE2O3QrKyllW3IrdF09bi5ieXRlc1t0XTtyZXR1cm4gcisxNn1mdW5jdGlvbiBBdChlLHQsbixyKXtlW3IrK109IkxvbmciPT09bi5fYnNvbnR5cGU/VzpxO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uZ2V0TG93Qml0cygpLG89bi5nZXRIaWdoQml0cygpO3JldHVybiByKz1VZS5zZXRJbnQzMkxFKGUscixpKSxyKz1VZS5zZXRJbnQzMkxFKGUscixvKX1mdW5jdGlvbiBqdChlLHQsbixyKXtuPW4udmFsdWVPZigpLGVbcisrXT1IO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9VWUuc2V0SW50MzJMRShlLHIsbil9ZnVuY3Rpb24gRnQoZSx0LG4scil7ZVtyKytdPUw7cmV0dXJuIHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1VZS5zZXRGbG9hdDY0TEUoZSxyLG4udmFsdWUpfWZ1bmN0aW9uIFJ0KGUsdCxuLHIpe2VbcisrXT1KO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4udG9TdHJpbmcoKSxvPXllLmVuY29kZVVURjhJbnRvKGUsaSxyKzQpKzE7cmV0dXJuIFVlLnNldEludDMyTEUoZSxyLG8pLHI9cis0K28tMSxlW3IrK109MCxyfWZ1bmN0aW9uIER0KGUsdCxuLHIsaT0hMSxvPTAscz0hMSxmPSEwLHUpe2lmKG4uc2NvcGUmJiJvYmplY3QiPT10eXBlb2Ygbi5zY29wZSl7ZVtyKytdPVk7cis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2xldCBhPXI7Y29uc3QgbD1uLmNvZGU7cis9NDtjb25zdCBoPXllLmVuY29kZVVURjhJbnRvKGUsbCxyKzQpKzE7VWUuc2V0SW50MzJMRShlLHIsaCksZVtyKzQraC0xXT0wLHI9citoKzQ7Y29uc3QgYz1NdChlLG4uc2NvcGUsaSxyLG8rMSxzLGYsdSk7cj1jLTE7Y29uc3QgZz1jLWE7YSs9VWUuc2V0SW50MzJMRShlLGEsZyksZVtyKytdPTB9ZWxzZXtlW3IrK109SjtyKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7Y29uc3QgaT1uLmNvZGUudG9TdHJpbmcoKSxvPXllLmVuY29kZVVURjhJbnRvKGUsaSxyKzQpKzE7VWUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wfXJldHVybiByfWZ1bmN0aW9uIHp0KGUsdCxuLHIpe2VbcisrXT1GO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uYnVmZmVyO2xldCBvPW4ucG9zaXRpb247aWYobi5zdWJfdHlwZT09PU9lLlNVQlRZUEVfQllURV9BUlJBWSYmKG8rPTQpLHIrPVVlLnNldEludDMyTEUoZSxyLG8pLGVbcisrXT1uLnN1Yl90eXBlLG4uc3ViX3R5cGU9PT1PZS5TVUJUWVBFX0JZVEVfQVJSQVkmJihvLT00LHIrPVVlLnNldEludDMyTEUoZSxyLG8pKSxuLnN1Yl90eXBlPT09T2UuU1VCVFlQRV9WRUNUT1ImJk5lKG4pLG88PTE2KWZvcihsZXQgdD0wO3Q8bzt0KyspZVtyK3RdPWlbdF07ZWxzZSBlLnNldChpLHIpO3JldHVybiByKz1uLnBvc2l0aW9ufWZ1bmN0aW9uIFZ0KGUsdCxuLHIpe2VbcisrXT1rO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPXllLmVuY29kZVVURjhJbnRvKGUsbi52YWx1ZSxyKzQpKzE7cmV0dXJuIFVlLnNldEludDMyTEUoZSxyLGkpLHI9cis0K2ktMSxlW3IrK109MCxyfWZ1bmN0aW9uIEN0KGUsdCxuLHIsaSxvLHMpe2VbcisrXT1BO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtsZXQgZj1yLHU9eyRyZWY6bi5jb2xsZWN0aW9ufHxuLm5hbWVzcGFjZSwkaWQ6bi5vaWR9O251bGwhPW4uZGImJih1LiRkYj1uLmRiKSx1PU9iamVjdC5hc3NpZ24odSxuLmZpZWxkcyk7Y29uc3QgYT1NdChlLHUsITEscixpKzEsbywhMCxzKSxsPWEtZjtyZXR1cm4gZis9VWUuc2V0SW50MzJMRShlLHIsbCksYX1mdW5jdGlvbiBNdChlLHQsbixyLGksbyxzLGYpe2lmKG51bGw9PWYpe2lmKG51bGw9PXQpcmV0dXJuIGVbMF09NSxlWzFdPTAsZVsyXT0wLGVbM109MCxlWzRdPTAsNTtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyB0ZSgic2VyaWFsaXplIGRvZXMgbm90IHN1cHBvcnQgYW4gYXJyYXkgYXMgdGhlIHJvb3QgaW5wdXQiKTtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IHRlKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyB0ZSgiQlNPTiB0eXBlcyBjYW5ub3QgYmUgc2VyaWFsaXplZCBhcyBhIGRvY3VtZW50Iik7aWYoUyh0KXx8bSh0KXx8eSh0KXx8dyh0KSl0aHJvdyBuZXcgdGUoImRhdGUsIHJlZ2V4cCwgdHlwZWRhcnJheSwgYW5kIGFycmF5YnVmZmVyIGNhbm5vdCBiZSBCU09OIGRvY3VtZW50cyIpO2Y9bmV3IFNldH1mLmFkZCh0KTtsZXQgdT1yKzQ7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3QgYT1gJHtyfWA7bGV0IGw9dFtyXTsiZnVuY3Rpb24iPT10eXBlb2YgbD8udG9CU09OJiYobD1sLnRvQlNPTigpKTtjb25zdCBoPXR5cGVvZiBsO2lmKHZvaWQgMD09PWwpdT1VdChlLGEsMCx1KTtlbHNlIGlmKG51bGw9PT1sKXU9VXQoZSxhLDAsdSk7ZWxzZSBpZigic3RyaW5nIj09PWgpdT1CdChlLGEsbCx1KTtlbHNlIGlmKCJudW1iZXIiPT09aCl1PVN0KGUsYSxsLHUpO2Vsc2UgaWYoImJpZ2ludCI9PT1oKXU9RXQoZSxhLGwsdSk7ZWxzZSBpZigiYm9vbGVhbiI9PT1oKXU9T3QoZSxhLGwsdSk7ZWxzZSBpZigib2JqZWN0Ij09PWgmJm51bGw9PWwuX2Jzb250eXBlKXU9bCBpbnN0YW5jZW9mIERhdGV8fFMobCk/TnQoZSxhLGwsdSk6bCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHkobCk/JHQoZSxhLGwsdSk6bCBpbnN0YW5jZW9mIFJlZ0V4cHx8bShsKT94dChlLGEsbCx1KTpMdChlLGEsbCx1LG4saSxvLHMsZik7ZWxzZSBpZigib2JqZWN0Ij09PWgpe2lmKGxbT10hPT1VKXRocm93IG5ldyBuZTtpZigiT2JqZWN0SWQiPT09bC5fYnNvbnR5cGUpdT1UdChlLGEsbCx1KTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWwuX2Jzb250eXBlKXU9dnQoZSxhLGwsdSk7ZWxzZSBpZigiTG9uZyI9PT1sLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1sLl9ic29udHlwZSl1PUF0KGUsYSxsLHUpO2Vsc2UgaWYoIkRvdWJsZSI9PT1sLl9ic29udHlwZSl1PUZ0KGUsYSxsLHUpO2Vsc2UgaWYoIkNvZGUiPT09bC5fYnNvbnR5cGUpdT1EdChlLGEsbCx1LG4saSxvLHMsZik7ZWxzZSBpZigiQmluYXJ5Ij09PWwuX2Jzb250eXBlKXU9enQoZSxhLGwsdSk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1sLl9ic29udHlwZSl1PVZ0KGUsYSxsLHUpO2Vsc2UgaWYoIkRCUmVmIj09PWwuX2Jzb250eXBlKXU9Q3QoZSxhLGwsdSxpLG8sZik7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1sLl9ic29udHlwZSl1PUl0KGUsYSxsLHUpO2Vsc2UgaWYoIkludDMyIj09PWwuX2Jzb250eXBlKXU9anQoZSxhLGwsdSk7ZWxzZSBpZigiTWluS2V5Ij09PWwuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWwuX2Jzb250eXBlKXU9X3QoZSxhLGwsdSk7ZWxzZSBpZih2b2lkIDAhPT1sLl9ic29udHlwZSl0aHJvdyBuZXcgdGUoYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcobC5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09aCYmbyYmKHU9UnQoZSxhLGwsdSkpfWVsc2UgaWYodCBpbnN0YW5jZW9mIE1hcHx8Qih0KSl7Y29uc3Qgcj10LmVudHJpZXMoKTtsZXQgYT0hMTtmb3IoOyFhOyl7Y29uc3QgdD1yLm5leHQoKTtpZihhPSEhdC5kb25lLGEpY29udGludWU7Y29uc3QgbD10LnZhbHVlP3QudmFsdWVbMF06dm9pZCAwO2xldCBoPXQudmFsdWU/dC52YWx1ZVsxXTp2b2lkIDA7ImZ1bmN0aW9uIj09dHlwZW9mIGg/LnRvQlNPTiYmKGg9aC50b0JTT04oKSk7Y29uc3QgYz10eXBlb2YgaDtpZigic3RyaW5nIj09dHlwZW9mIGwmJiFtdC5oYXMobCkpe2lmKG51bGwhPWwubWF0Y2god3QpKXRocm93IG5ldyB0ZSgia2V5ICIrbCsiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO2lmKG4pe2lmKCIkIj09PWxbMF0pdGhyb3cgbmV3IHRlKCJrZXkgIitsKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihsLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IHRlKCJrZXkgIitsKyIgbXVzdCBub3QgY29udGFpbiAnLiciKX19aWYodm9pZCAwPT09aCkhMT09PXMmJih1PVV0KGUsbCwwLHUpKTtlbHNlIGlmKG51bGw9PT1oKXU9VXQoZSxsLDAsdSk7ZWxzZSBpZigic3RyaW5nIj09PWMpdT1CdChlLGwsaCx1KTtlbHNlIGlmKCJudW1iZXIiPT09Yyl1PVN0KGUsbCxoLHUpO2Vsc2UgaWYoImJpZ2ludCI9PT1jKXU9RXQoZSxsLGgsdSk7ZWxzZSBpZigiYm9vbGVhbiI9PT1jKXU9T3QoZSxsLGgsdSk7ZWxzZSBpZigib2JqZWN0Ij09PWMmJm51bGw9PWguX2Jzb250eXBlKXU9aCBpbnN0YW5jZW9mIERhdGV8fFMoaCk/TnQoZSxsLGgsdSk6aCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHkoaCk/JHQoZSxsLGgsdSk6aCBpbnN0YW5jZW9mIFJlZ0V4cHx8bShoKT94dChlLGwsaCx1KTpMdChlLGwsaCx1LG4saSxvLHMsZik7ZWxzZSBpZigib2JqZWN0Ij09PWMpe2lmKGhbT10hPT1VKXRocm93IG5ldyBuZTtpZigiT2JqZWN0SWQiPT09aC5fYnNvbnR5cGUpdT1UdChlLGwsaCx1KTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWguX2Jzb250eXBlKXU9dnQoZSxsLGgsdSk7ZWxzZSBpZigiTG9uZyI9PT1oLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1oLl9ic29udHlwZSl1PUF0KGUsbCxoLHUpO2Vsc2UgaWYoIkRvdWJsZSI9PT1oLl9ic29udHlwZSl1PUZ0KGUsbCxoLHUpO2Vsc2UgaWYoIkNvZGUiPT09aC5fYnNvbnR5cGUpdT1EdChlLGwsaCx1LG4saSxvLHMsZik7ZWxzZSBpZigiQmluYXJ5Ij09PWguX2Jzb250eXBlKXU9enQoZSxsLGgsdSk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1oLl9ic29udHlwZSl1PVZ0KGUsbCxoLHUpO2Vsc2UgaWYoIkRCUmVmIj09PWguX2Jzb250eXBlKXU9Q3QoZSxsLGgsdSxpLG8sZik7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1oLl9ic29udHlwZSl1PUl0KGUsbCxoLHUpO2Vsc2UgaWYoIkludDMyIj09PWguX2Jzb250eXBlKXU9anQoZSxsLGgsdSk7ZWxzZSBpZigiTWluS2V5Ij09PWguX2Jzb250eXBlfHwiTWF4S2V5Ij09PWguX2Jzb250eXBlKXU9X3QoZSxsLGgsdSk7ZWxzZSBpZih2b2lkIDAhPT1oLl9ic29udHlwZSl0aHJvdyBuZXcgdGUoYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcoaC5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09YyYmbyYmKHU9UnQoZSxsLGgsdSkpfX1lbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Py50b0JTT04mJm51bGwhPSh0PXQudG9CU09OKCkpJiYib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IHRlKCJ0b0JTT04gZnVuY3Rpb24gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0Iik7Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModCkpe2xldCBhPXRbcl07ImZ1bmN0aW9uIj09dHlwZW9mIGE/LnRvQlNPTiYmKGE9YS50b0JTT04oKSk7Y29uc3QgbD10eXBlb2YgYTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFtdC5oYXMocikpe2lmKG51bGwhPXIubWF0Y2god3QpKXRocm93IG5ldyB0ZSgia2V5ICIrcisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO2lmKG4pe2lmKCIkIj09PXJbMF0pdGhyb3cgbmV3IHRlKCJrZXkgIityKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihyLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IHRlKCJrZXkgIityKyIgbXVzdCBub3QgY29udGFpbiAnLiciKX19aWYodm9pZCAwPT09YSkhMT09PXMmJih1PVV0KGUsciwwLHUpKTtlbHNlIGlmKG51bGw9PT1hKXU9VXQoZSxyLDAsdSk7ZWxzZSBpZigic3RyaW5nIj09PWwpdT1CdChlLHIsYSx1KTtlbHNlIGlmKCJudW1iZXIiPT09bCl1PVN0KGUscixhLHUpO2Vsc2UgaWYoImJpZ2ludCI9PT1sKXU9RXQoZSxyLGEsdSk7ZWxzZSBpZigiYm9vbGVhbiI9PT1sKXU9T3QoZSxyLGEsdSk7ZWxzZSBpZigib2JqZWN0Ij09PWwmJm51bGw9PWEuX2Jzb250eXBlKXU9YSBpbnN0YW5jZW9mIERhdGV8fFMoYSk/TnQoZSxyLGEsdSk6YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHkoYSk/JHQoZSxyLGEsdSk6YSBpbnN0YW5jZW9mIFJlZ0V4cHx8bShhKT94dChlLHIsYSx1KTpMdChlLHIsYSx1LG4saSxvLHMsZik7ZWxzZSBpZigib2JqZWN0Ij09PWwpe2lmKGFbT10hPT1VKXRocm93IG5ldyBuZTtpZigiT2JqZWN0SWQiPT09YS5fYnNvbnR5cGUpdT1UdChlLHIsYSx1KTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWEuX2Jzb250eXBlKXU9dnQoZSxyLGEsdSk7ZWxzZSBpZigiTG9uZyI9PT1hLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1hLl9ic29udHlwZSl1PUF0KGUscixhLHUpO2Vsc2UgaWYoIkRvdWJsZSI9PT1hLl9ic29udHlwZSl1PUZ0KGUscixhLHUpO2Vsc2UgaWYoIkNvZGUiPT09YS5fYnNvbnR5cGUpdT1EdChlLHIsYSx1LG4saSxvLHMsZik7ZWxzZSBpZigiQmluYXJ5Ij09PWEuX2Jzb250eXBlKXU9enQoZSxyLGEsdSk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1hLl9ic29udHlwZSl1PVZ0KGUscixhLHUpO2Vsc2UgaWYoIkRCUmVmIj09PWEuX2Jzb250eXBlKXU9Q3QoZSxyLGEsdSxpLG8sZik7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1hLl9ic29udHlwZSl1PUl0KGUscixhLHUpO2Vsc2UgaWYoIkludDMyIj09PWEuX2Jzb250eXBlKXU9anQoZSxyLGEsdSk7ZWxzZSBpZigiTWluS2V5Ij09PWEuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWEuX2Jzb250eXBlKXU9X3QoZSxyLGEsdSk7ZWxzZSBpZih2b2lkIDAhPT1hLl9ic29udHlwZSl0aHJvdyBuZXcgdGUoYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcoYS5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09bCYmbyYmKHU9UnQoZSxyLGEsdSkpfX1mLmRlbGV0ZSh0KSxlW3UrK109MDtjb25zdCBhPXUtcjtyZXR1cm4gcis9VWUuc2V0SW50MzJMRShlLHIsYSksdX1jb25zdCBQdD17JG9pZDpzdCwkYmluYXJ5Ok9lLCR1dWlkOk9lLCRzeW1ib2w6bHQsJG51bWJlckludDp0dCwkbnVtYmVyRGVjaW1hbDpRZSwkbnVtYmVyRG91YmxlOmV0LCRudW1iZXJMb25nOkNlLCRtaW5LZXk6cnQsJG1heEtleTpudCwkcmVnZXg6YXQsJHJlZ3VsYXJFeHByZXNzaW9uOmF0LCR0aW1lc3RhbXA6Y3R9O2Z1bmN0aW9uIEp0KGUsdD17fSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtjb25zdCBuPWU8PU4mJmU+PXgscj1lPD1JJiZlPj1fO2lmKHQucmVsYXhlZHx8dC5sZWdhY3kpcmV0dXJuIGU7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYobilyZXR1cm4gbmV3IHR0KGUpO2lmKHIpcmV0dXJuIHQudXNlQmlnSW50NjQ/QmlnSW50KGUpOkNlLmZyb21OdW1iZXIoZSl9cmV0dXJuIG5ldyBldChlKX1pZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoZS4kdW5kZWZpbmVkKXJldHVybiBudWxsO2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoIiQiKSYmbnVsbCE9ZVt0XSkpO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPVB0W25bcl1dO2lmKGkpcmV0dXJuIGkuZnJvbUV4dGVuZGVkSlNPTihlLHQpfWlmKG51bGwhPWUuJGRhdGUpe2NvbnN0IG49ZS4kZGF0ZSxyPW5ldyBEYXRlO2lmKHQubGVnYWN5KWlmKCJudW1iZXIiPT10eXBlb2YgbilyLnNldFRpbWUobik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyByZSgiVW5yZWNvZ25pemVkIHR5cGUgZm9yIEVKU09OIGRhdGU6ICIrdHlwZW9mIG4pO3Iuc2V0VGltZShOdW1iZXIobikpfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuKXIuc2V0VGltZShEYXRlLnBhcnNlKG4pKTtlbHNlIGlmKENlLmlzTG9uZyhuKSlyLnNldFRpbWUobi50b051bWJlcigpKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgbiYmdC5yZWxheGVkKXIuc2V0VGltZShuKTtlbHNle2lmKCJiaWdpbnQiIT10eXBlb2Ygbil0aHJvdyBuZXcgcmUoIlVucmVjb2duaXplZCB0eXBlIGZvciBFSlNPTiBkYXRlOiAiK3R5cGVvZiBuKTtyLnNldFRpbWUoTnVtYmVyKG4pKX1yZXR1cm4gcn1pZihudWxsIT1lLiRjb2RlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGUuJHNjb3BlJiYodC4kc2NvcGU9SnQoZS4kc2NvcGUpKSxUZS5mcm9tRXh0ZW5kZWRKU09OKGUpfWlmKCRlKGUpfHxlLiRkYlBvaW50ZXIpe2NvbnN0IHQ9ZS4kcmVmP2U6ZS4kZGJQb2ludGVyO2lmKHQgaW5zdGFuY2VvZiBMZSlyZXR1cm4gdDtjb25zdCBuPU9iamVjdC5rZXlzKHQpLmZpbHRlcigoZT0+ZS5zdGFydHNXaXRoKCIkIikpKTtsZXQgcj0hMDtpZihuLmZvckVhY2goKGU9PnstMT09PVsiJHJlZiIsIiRpZCIsIiRkYiJdLmluZGV4T2YoZSkmJihyPSExKX0pKSxyKXJldHVybiBMZS5mcm9tRXh0ZW5kZWRKU09OKHQpfXJldHVybiBlfWZ1bmN0aW9uIGt0KGUpe2NvbnN0IHQ9ZS50b0lTT1N0cmluZygpO3JldHVybiAwIT09ZS5nZXRVVENNaWxsaXNlY29uZHMoKT90OnQuc2xpY2UoMCwtNSkrIloifWZ1bmN0aW9uIFl0KGUsdCl7aWYoZSBpbnN0YW5jZW9mIE1hcHx8QihlKSl7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdFt0LHJdb2YgZSl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyB0ZSgiQ2FuIG9ubHkgc2VyaWFsaXplIG1hcHMgd2l0aCBzdHJpbmcga2V5cyIpO25bdF09cn1yZXR1cm4gWXQobix0KX1pZigoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJm51bGwhPT1lKXtjb25zdCBuPXQuc2Vlbk9iamVjdHMuZmluZEluZGV4KCh0PT50Lm9iaj09PWUpKTtpZigtMSE9PW4pe2NvbnN0IGU9dC5zZWVuT2JqZWN0cy5tYXAoKGU9PmUucHJvcGVydHlOYW1lKSkscj1lLnNsaWNlKDAsbikubWFwKChlPT5gJHtlfSAtPiBgKSkuam9pbigiIiksaT1lW25dLG89IiAtPiAiK2Uuc2xpY2UobisxLGUubGVuZ3RoLTEpLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLHM9ZVtlLmxlbmd0aC0xXSxmPSIgIi5yZXBlYXQoci5sZW5ndGgraS5sZW5ndGgvMiksdT0iLSIucmVwZWF0KG8ubGVuZ3RoKyhpLmxlbmd0aCtzLmxlbmd0aCkvMi0xKTt0aHJvdyBuZXcgdGUoYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEVKU09OOlxuICAgICR7cn0ke2l9JHtvfSR7c31cbiAgICAke2Z9XFwke3V9L2ApfXQuc2Vlbk9iamVjdHNbdC5zZWVuT2JqZWN0cy5sZW5ndGgtMV0ub2JqPWV9aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoKChlLG4pPT57dC5zZWVuT2JqZWN0cy5wdXNoKHtwcm9wZXJ0eU5hbWU6YGluZGV4ICR7bn1gLG9iajpudWxsfSk7dHJ5e3JldHVybiBZdChlLHQpfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19KSl9KGUsdCk7aWYodm9pZCAwPT09ZSlyZXR1cm4gdC5pZ25vcmVVbmRlZmluZWQ/dm9pZCAwOm51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGV8fFMoZSkpe2NvbnN0IG49ZS5nZXRUaW1lKCkscj1uPi0xJiZuPDI1MzQwMjMxODhlNTtyZXR1cm4gdC5sZWdhY3k/dC5yZWxheGVkJiZyP3skZGF0ZTplLmdldFRpbWUoKX06eyRkYXRlOmt0KGUpfTp0LnJlbGF4ZWQmJnI/eyRkYXRlOmt0KGUpfTp7JGRhdGU6eyRudW1iZXJMb25nOmUuZ2V0VGltZSgpLnRvU3RyaW5nKCl9fX1pZighKCJudW1iZXIiIT10eXBlb2YgZXx8dC5yZWxheGVkJiZpc0Zpbml0ZShlKSkpe2lmKE51bWJlci5pc0ludGVnZXIoZSkmJiFPYmplY3QuaXMoZSwtMCkpe2lmKGU+PXgmJmU8PU4pcmV0dXJueyRudW1iZXJJbnQ6ZS50b1N0cmluZygpfTtpZihlPj1fJiZlPD1JKXJldHVybnskbnVtYmVyTG9uZzplLnRvU3RyaW5nKCl9fXJldHVybnskbnVtYmVyRG91YmxlOk9iamVjdC5pcyhlLC0wKT8iLTAuMCI6ZS50b1N0cmluZygpfX1pZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuIHQucmVsYXhlZD9OdW1iZXIoQmlnSW50LmFzSW50Tig2NCxlKSk6eyRudW1iZXJMb25nOkJpZ0ludC5hc0ludE4oNjQsZSkudG9TdHJpbmcoKX07aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cHx8bShlKSl7bGV0IG49ZS5mbGFncztpZih2b2lkIDA9PT1uKXtjb25zdCB0PWUudG9TdHJpbmcoKS5tYXRjaCgvW2dpbXV5XSokLyk7dCYmKG49dFswXSl9cmV0dXJuIG5ldyBhdChlLnNvdXJjZSxuKS50b0V4dGVuZGVkSlNPTih0KX1yZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2Z1bmN0aW9uKGUsdCl7aWYobnVsbD09ZXx8Im9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyB0ZSgibm90IGFuIG9iamVjdCBpbnN0YW5jZSIpO2NvbnN0IG49ZS5fYnNvbnR5cGU7aWYodm9pZCAwPT09bil7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyhlKSl7dC5zZWVuT2JqZWN0cy5wdXNoKHtwcm9wZXJ0eU5hbWU6cixvYmo6bnVsbH0pO3RyeXtjb25zdCBpPVl0KGVbcl0sdCk7Il9fcHJvdG9fXyI9PT1yP09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse3ZhbHVlOmksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTpuW3JdPWl9ZmluYWxseXt0LnNlZW5PYmplY3RzLnBvcCgpfX1yZXR1cm4gbn1pZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGUmJmVbT10hPT1VKXRocm93IG5ldyBuZTtpZihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGV9KGUpKXtsZXQgcj1lO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnRvRXh0ZW5kZWRKU09OKXtjb25zdCB0PUh0W2UuX2Jzb250eXBlXTtpZighdCl0aHJvdyBuZXcgdGUoIlVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogIitlLl9ic29udHlwZSk7cj10KHIpfXJldHVybiJDb2RlIj09PW4mJnIuc2NvcGU/cj1uZXcgVGUoci5jb2RlLFl0KHIuc2NvcGUsdCkpOiJEQlJlZiI9PT1uJiZyLm9pZCYmKHI9bmV3IExlKFl0KHIuY29sbGVjdGlvbix0KSxZdChyLm9pZCx0KSxZdChyLmRiLHQpLFl0KHIuZmllbGRzLHQpKSksci50b0V4dGVuZGVkSlNPTih0KX10aHJvdyBuZXcgdGUoIl9ic29udHlwZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgd2FzOiAiK3R5cGVvZiBuKX0oZSx0KTplfWNvbnN0IEh0PXtCaW5hcnk6ZT0+bmV3IE9lKGUudmFsdWUoKSxlLnN1Yl90eXBlKSxDb2RlOmU9Pm5ldyBUZShlLmNvZGUsZS5zY29wZSksREJSZWY6ZT0+bmV3IExlKGUuY29sbGVjdGlvbnx8ZS5uYW1lc3BhY2UsZS5vaWQsZS5kYixlLmZpZWxkcyksRGVjaW1hbDEyODplPT5uZXcgUWUoZS5ieXRlcyksRG91YmxlOmU9Pm5ldyBldChlLnZhbHVlKSxJbnQzMjplPT5uZXcgdHQoZS52YWx1ZSksTG9uZzplPT5DZS5mcm9tQml0cyhudWxsIT1lLmxvdz9lLmxvdzplLmxvd18sbnVsbCE9ZS5sb3c/ZS5oaWdoOmUuaGlnaF8sbnVsbCE9ZS5sb3c/ZS51bnNpZ25lZDplLnVuc2lnbmVkXyksTWF4S2V5OigpPT5uZXcgbnQsTWluS2V5OigpPT5uZXcgcnQsT2JqZWN0SWQ6ZT0+bmV3IHN0KGUpLEJTT05SZWdFeHA6ZT0+bmV3IGF0KGUucGF0dGVybixlLm9wdGlvbnMpLEJTT05TeW1ib2w6ZT0+bmV3IGx0KGUudmFsdWUpLFRpbWVzdGFtcDplPT5jdC5mcm9tQml0cyhlLmxvdyxlLmhpZ2gpfTtmdW5jdGlvbiBxdChlLHQpe2NvbnN0IG49e3VzZUJpZ0ludDY0OnQ/LnVzZUJpZ0ludDY0Pz8hMSxyZWxheGVkOnQ/LnJlbGF4ZWQ/PyEwLGxlZ2FjeTp0Py5sZWdhY3k/PyExfTtyZXR1cm4gSlNPTi5wYXJzZShlLCgoZSx0KT0+e2lmKC0xIT09ZS5pbmRleE9mKCJcMCIpKXRocm93IG5ldyB0ZShgQlNPTiBEb2N1bWVudCBmaWVsZCBuYW1lcyBjYW5ub3QgY29udGFpbiBudWxsIGJ5dGVzLCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShlKX1gKTtyZXR1cm4gSnQodCxuKX0pKX1mdW5jdGlvbiBXdChlLHQsbixyKXtudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4mJihyPW4sbj0wKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDAsbj0wKTtjb25zdCBpPVl0KGUsT2JqZWN0LmFzc2lnbih7cmVsYXhlZDohMCxsZWdhY3k6ITF9LHIse3NlZW5PYmplY3RzOlt7cHJvcGVydHlOYW1lOiIocm9vdCkiLG9iajpudWxsfV19KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksdCxuKX1jb25zdCBLdD1PYmplY3QuY3JlYXRlKG51bGwpO0t0LnBhcnNlPXF0LEt0LnN0cmluZ2lmeT1XdCxLdC5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHx7fSxKU09OLnBhcnNlKFd0KGUsdCkpfSxLdC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LHF0KEpTT04uc3RyaW5naWZ5KGUpLHQpfSxPYmplY3QuZnJlZXplKEt0KTtjb25zdCBadD0xLEd0PTIsWHQ9MyxRdD00LGVuPTUsdG49Nixubj03LHJuPTgsb249OSxzbj0xMCxmbj0xMSx1bj0xMixhbj0xMyxsbj0xNCxobj0xNSxjbj0xNixnbj0xNyxkbj0xOCxibj0xOSxwbj0yNTUseW49MTI3O2Z1bmN0aW9uIHduKGUsdCl7dHJ5e3JldHVybiBVZS5nZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KX1jYXRjaChlKXt0aHJvdyBuZXcgaWUoIkJTT04gc2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUiLHQse2NhdXNlOmV9KX19ZnVuY3Rpb24gbW4oZSx0KXtsZXQgbj10O2Zvcig7MCE9PWVbbl07bisrKTtpZihuPT09ZS5sZW5ndGgtMSl0aHJvdyBuZXcgaWUoIk51bGwgdGVybWluYXRvciBub3QgZm91bmQiLHQpO3JldHVybiBufWNvbnN0IEJuPU9iamVjdC5jcmVhdGUobnVsbCk7Qm4ucGFyc2VUb0VsZW1lbnRzPWZ1bmN0aW9uKGUsdD0wKXtpZih0Pz89MCxlLmxlbmd0aDw1KXRocm93IG5ldyBpZShgSW5wdXQgbXVzdCBiZSBhdCBsZWFzdCA1IGJ5dGVzLCBnb3QgJHtlLmxlbmd0aH0gYnl0ZXNgLHQpO2NvbnN0IG49d24oZSx0KTtpZihuPmUubGVuZ3RoLXQpdGhyb3cgbmV3IGllKGBQYXJzZWQgZG9jdW1lbnRTaXplICgke259IGJ5dGVzKSBkb2VzIG5vdCBtYXRjaCBpbnB1dCBsZW5ndGggKCR7ZS5sZW5ndGh9IGJ5dGVzKWAsdCk7aWYoMCE9PWVbdCtuLTFdKXRocm93IG5ldyBpZSgiQlNPTiBkb2N1bWVudHMgbXVzdCBlbmQgaW4gMHgwMCIsdCtuKTtjb25zdCByPVtdO2xldCBpPXQrNDtmb3IoO2k8PW4rdDspe2NvbnN0IG89ZVtpXTtpZihpKz0xLDA9PT1vKXtpZihpLXQhPT1uKXRocm93IG5ldyBpZSgiSW52YWxpZCAweDAwIHR5cGUgYnl0ZSIsaSk7YnJlYWt9Y29uc3Qgcz1pLGY9bW4oZSxpKS1zO2xldCB1O2lmKGkrPWYrMSxvPT09WnR8fG89PT1kbnx8bz09PW9ufHxvPT09Z24pdT04O2Vsc2UgaWYobz09PWNuKXU9NDtlbHNlIGlmKG89PT1ubil1PTEyO2Vsc2UgaWYobz09PWJuKXU9MTY7ZWxzZSBpZihvPT09cm4pdT0xO2Vsc2UgaWYobz09PXNufHxvPT09dG58fG89PT15bnx8bz09PXBuKXU9MDtlbHNlIGlmKG89PT1mbil1PW1uKGUsbW4oZSxpKSsxKSsxLWk7ZWxzZSBpZihvPT09WHR8fG89PT1RdHx8bz09PWhuKXU9d24oZSxpKTtlbHNle2lmKG8hPT1HdCYmbyE9PWVuJiZvIT09dW4mJm8hPT1hbiYmbyE9PWxuKXRocm93IG5ldyBpZShgSW52YWxpZCAweCR7by50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfSB0eXBlIGJ5dGVgLGkpO3U9d24oZSxpKSs0LG89PT1lbiYmKHUrPTEpLG89PT11biYmKHUrPTEyKX1pZih1Pm4pdGhyb3cgbmV3IGllKCJ2YWx1ZSByZXBvcnRzIGxlbmd0aCBsYXJnZXIgdGhhbiBkb2N1bWVudCIsaSk7ci5wdXNoKFtvLHMsZixpLHVdKSxpKz11fXJldHVybiByfSxCbi5CeXRlVXRpbHM9eWUsQm4uTnVtYmVyVXRpbHM9VWUsT2JqZWN0LmZyZWV6ZShCbik7Y29uc3QgU249MTc4MjU3OTI7bGV0IEVuPXllLmFsbG9jYXRlKFNuKTt2YXIgVW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQlNPTkVycm9yOnRlLEJTT05PZmZzZXRFcnJvcjppZSxCU09OUmVnRXhwOmF0LEJTT05SdW50aW1lRXJyb3I6cmUsQlNPTlN5bWJvbDpsdCxCU09OVHlwZTplZSxCU09OVmFsdWU6bWUsQlNPTlZlcnNpb25FcnJvcjpuZSxCaW5hcnk6T2UsQnl0ZVV0aWxzOnllLENvZGU6VGUsREJSZWY6TGUsRGVjaW1hbDEyODpRZSxEb3VibGU6ZXQsRUpTT046S3QsSW50MzI6dHQsTG9uZzpDZSxNYXhLZXk6bnQsTWluS2V5OnJ0LE51bWJlclV0aWxzOlVlLE9iamVjdElkOnN0LFRpbWVzdGFtcDpjdCxVVUlEOl9lLGJzb25UeXBlOndlLGNhbGN1bGF0ZU9iamVjdFNpemU6ZnVuY3Rpb24oZSx0PXt9KXtyZXR1cm4gZnQoZSwiYm9vbGVhbiI9PXR5cGVvZih0PXR8fHt9KS5zZXJpYWxpemVGdW5jdGlvbnMmJnQuc2VyaWFsaXplRnVuY3Rpb25zLCJib29sZWFuIiE9dHlwZW9mIHQuaWdub3JlVW5kZWZpbmVkfHx0Lmlnbm9yZVVuZGVmaW5lZCl9LGRlc2VyaWFsaXplOmZ1bmN0aW9uKGUsdD17fSl7cmV0dXJuIGJ0KHllLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpfSxkZXNlcmlhbGl6ZVN0cmVhbTpmdW5jdGlvbihlLHQsbixyLGksbyl7Y29uc3Qgcz1PYmplY3QuYXNzaWduKHthbGxvd09iamVjdFNtYWxsZXJUaGFuQnVmZmVyU2l6ZTohMCxpbmRleDowfSxvKSxmPXllLnRvTG9jYWxCdWZmZXJUeXBlKGUpO2xldCB1PXQ7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgdD1VZS5nZXRJbnQzMkxFKGYsdSk7cy5pbmRleD11LHJbaStlXT1idChmLHMpLHUrPXR9cmV0dXJuIHV9LG9uRGVtYW5kOkJuLHNlcmlhbGl6ZTpmdW5jdGlvbihlLHQ9e30pe2NvbnN0IG49ImJvb2xlYW4iPT10eXBlb2YgdC5jaGVja0tleXMmJnQuY2hlY2tLZXlzLHI9ImJvb2xlYW4iPT10eXBlb2YgdC5zZXJpYWxpemVGdW5jdGlvbnMmJnQuc2VyaWFsaXplRnVuY3Rpb25zLGk9ImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVVbmRlZmluZWR8fHQuaWdub3JlVW5kZWZpbmVkLG89Im51bWJlciI9PXR5cGVvZiB0Lm1pbkludGVybmFsQnVmZmVyU2l6ZT90Lm1pbkludGVybmFsQnVmZmVyU2l6ZTpTbjtFbi5sZW5ndGg8byYmKEVuPXllLmFsbG9jYXRlKG8pKTtjb25zdCBzPU10KEVuLGUsbiwwLDAscixpLG51bGwpLGY9eWUuYWxsb2NhdGVVbnNhZmUocyk7cmV0dXJuIGYuc2V0KEVuLnN1YmFycmF5KDAscyksMCksZn0sc2VyaWFsaXplV2l0aEJ1ZmZlckFuZEluZGV4OmZ1bmN0aW9uKGUsdCxuPXt9KXtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIG4uY2hlY2tLZXlzJiZuLmNoZWNrS2V5cyxpPSJib29sZWFuIj09dHlwZW9mIG4uc2VyaWFsaXplRnVuY3Rpb25zJiZuLnNlcmlhbGl6ZUZ1bmN0aW9ucyxvPSJib29sZWFuIiE9dHlwZW9mIG4uaWdub3JlVW5kZWZpbmVkfHxuLmlnbm9yZVVuZGVmaW5lZCxzPSJudW1iZXIiPT10eXBlb2Ygbi5pbmRleD9uLmluZGV4OjAsZj1NdChFbixlLHIsMCwwLGksbyxudWxsKTtyZXR1cm4gdC5zZXQoRW4uc3ViYXJyYXkoMCxmKSxzKSxzK2YtMX0sc2V0SW50ZXJuYWxCdWZmZXJTaXplOmZ1bmN0aW9uKGUpe0VuLmxlbmd0aDxlJiYoRW49eWUuYWxsb2NhdGUoZSkpfX0pO2NsYXNzIE9ue2NvbnN0cnVjdG9yKCl7fXN0YXRpYyB1cmxDb25zdHJ1Y3RGcm9tKGUpe2NvbnN0IHQ9Ii93cy9tb2RlbGluZy9jb21tYW5kcyIrZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXMoZSkpaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KHIpKWZvcihjb25zdCBlIG9mIHIpdC5hcHBlbmQobixTdHJpbmcoZSkpO2Vsc2UgdC5hcHBlbmQobixTdHJpbmcocikpO2NvbnN0IG49dC50b1N0cmluZygpO3JldHVybiBuP2A/JHtufWA6IiJ9KHt2aWRlb19yZXNfd2lkdGg6ZS52aWRlb19yZXNfd2lkdGgsdmlkZW9fcmVzX2hlaWdodDplLnZpZGVvX3Jlc19oZWlnaHQsZnBzOmUuZnBzLHVubG9ja2VkX2ZyYW1lcmF0ZTplLnVubG9ja2VkX2ZyYW1lcmF0ZSxwb3N0X2VmZmVjdDplLnBvc3RfZWZmZWN0LHdlYnJ0YzplLndlYnJ0Yyxwb29sOmUucG9vbCxzaG93X2dyaWQ6ZS5zaG93X2dyaWQscmVwbGF5OmUucmVwbGF5LGFwaV9jYWxsX2lkOmUuYXBpX2NhbGxfaWQsb3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5OmUub3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5LHByOmUucHJ9KSxuPSgoZS5jbGllbnQ/LmJhc2VVcmx8fCJodHRwczovL2FwaS56b28uZGV2IikrdCkucmVwbGFjZSgvXmh0dHAvLCJ3cyIpO3JldHVybiBuZXcgVVJMKG4pfXN0YXRpYyBhdXRoZW50aWNhdGUoZSx0KXtjb25zdCBuPWUuY2xpZW50JiZlLmNsaWVudC50b2tlbnx8IiI7aWYobil0cnl7Y29uc3QgZT17dHlwZToiaGVhZGVycyIsaGVhZGVyczp7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7bn1gfX07dC5zZW5kKEpTT04uc3RyaW5naWZ5KGUpKX1jYXRjaHt9fXN0YXRpYyB0b0JTT04oZSl7cmV0dXJuIFVuLnNlcmlhbGl6ZShlKX1zdGF0aWMgcGFyc2VNZXNzYWdlKGUpe2NvbnN0IHQ9ZT8uZGF0YTtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEpTT04ucGFyc2UodCk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXImJkJ1ZmZlci5pc0J1ZmZlcj8uKHQpKXtjb25zdCBlPXQ7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUudG9TdHJpbmcoInV0ZjgiKSl9Y2F0Y2h7fXJldHVybiBVbi5kZXNlcmlhbGl6ZShlKX1pZih0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodCk7dHJ5e2NvbnN0IHQ9KG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGUpO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoe31yZXR1cm4gVW4uZGVzZXJpYWxpemUoZSl9aWYoKG49dCkmJiJvYmplY3QiPT10eXBlb2YgbiYmImJ1ZmZlciJpbiBuJiZuLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZU9mZnNldCYmIm51bWJlciI9PXR5cGVvZiBuLmJ5dGVMZW5ndGgpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCk7dHJ5e2NvbnN0IHQ9KG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGUpO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoe31yZXR1cm4gVW4uZGVzZXJpYWxpemUoZSl9dmFyIG47cmV0dXJuIHR9fWxldCBObjtjb25zdCB4bj17ZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKGUsdCxuLHIpe30sc2VuZE1vZGVsaW5nQ29tbWFuZEZyb21XYXNtOmFzeW5jKGUsdCxuLHIpPT4oTm4/LnNlbmQobiksbmV3IFByb21pc2UoKHQ9Pntjb25zdCBuPXI9PntpZihyLmRhdGEuaW5kZXhPZihlKTwwKXJldHVybjtjb25zdCBpPShvPUpTT04ucGFyc2Uoci5kYXRhKSxuZXcgYihzKS5lbmNvZGVTaGFyZWRSZWYobykpO3ZhciBvLHM7dChpKSxObi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuKX07Tm4uYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9KSkpLGFzeW5jIHN0YXJ0TmV3U2Vzc2lvbigpe319O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50byl7Y2FzZSJ3b3JrZXIiOnJldHVybiB2b2lkKCJzdGFydCI9PT10LnBheWxvYWQudHlwZSYmKGFzeW5jIGU9Pnthd2FpdCBmZXRjaChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjMwMDAva2NsX3dhc21fbGliX2JnLndhc20iKSkudGhlbigoZT0+ZS5hcnJheUJ1ZmZlcigpKSkudGhlbigoZT0+aS5kZWZhdWx0KHttb2R1bGVfb3JfcGF0aDplfSkpKSxObj1uZXcgV2ViU29ja2V0KE9uLnVybENvbnN0cnVjdEZyb20oe3dlYnJ0YzohMCwuLi5lfSkpLE5uLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgoKT0+e09uLmF1dGhlbnRpY2F0ZSh7Y2xpZW50OmUuY2xpZW50fSxObil9KSx7b25jZTohMH0pLE5uLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToibWVzc2FnZSIsZGF0YTplLmRhdGF9fSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57Tm4ucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOJiZObi5zZW5kKEpTT04uc3RyaW5naWZ5KHt0eXBlOiJwaW5nIn0pKX0pLDRlMyl9KSh0LnBheWxvYWQuZGF0YVswXSkpO2Nhc2Uid2Vic29ja2V0IjpyZXR1cm4gdm9pZCBObj8uW3QucGF5bG9hZC50eXBlXSguLi50LnBheWxvYWQuZGF0YSk7Y2FzZSJ3YXNtIjpyZXR1cm4gdm9pZCgiZXhlY3V0ZSI9PT10LnBheWxvYWQudHlwZT8oKGUsdD0ibWFpbi5rY2wiKT0+e2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiBlPyhvPWUse3JlYWRGaWxlOmFzeW5jIGU9PihuZXcgVGV4dEVuY29kZXIpLmVuY29kZShvKSxleGlzdHM6YXN5bmMgZT0+ITEsZ2V0QWxsRmlsZXM6YXN5bmMgZT0+W29dfSk6KGk9ZSx7YXN5bmMgcmVhZEZpbGUoZSl7Y29uc3QgdD1pLmdldChlKT8/IiI7cmV0dXJuKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpfSxleGlzdHM6YXN5bmMgZT0+aS5oYXMoZSksZ2V0QWxsRmlsZXM6YXN5bmMgZT0+QXJyYXkuZnJvbShpLnZhbHVlcygpKX0pO3ZhciBpLG87Y29uc3Qgcz0ic3RyaW5nIj09dHlwZW9mIGU/ZTplLmdldCh0KSxmPW5ldyByLkNvbnRleHQoeG4sbiksdT1yLnBhcnNlX3dhc20ocylbMF07cmV0dXJuIGYuZXhlY3V0ZShKU09OLnN0cmluZ2lmeSh1KSx0LCJ7fSIpfSkodC5wYXlsb2FkLmRhdGFbMF0pLnRoZW4oKCgpPT57cG9zdE1lc3NhZ2Uoe2Zyb206Indhc20iLHBheWxvYWQ6e3R5cGU6ImV4ZWN1dGUiLGRhdGE6ImRvbmUifX0pfSkpOnBvc3RNZXNzYWdlKHJbdC5wYXlsb2FkLnR5cGVdKC4uLnQucGF5bG9hZC5kYXRhKSkpfX0pKX0oem9vV2FzbSk7Cgo=",null,!1);const On=(t,e)=>{let n;return{fn:(...t)=>{n=t},intervalId:setInterval((()=>{if(void 0===n)return;const e=n;n=void 0,window.requestAnimationFrame((()=>{t(...e)}))}),e)}};var _n=function(t){return t[t.DOWN=0]="DOWN",t[t.UP=1]="UP",t}(_n||{}),Fn=function(t){return t[t.MIDDLE=1]="MIDDLE",t[t.RIGHT=2]="RIGHT",t}(Fn||{});const Dn={[_n.DOWN]:"camera_drag_start",[_n.UP]:"camera_drag_end"},An={[Fn.MIDDLE]:"pan",[Fn.RIGHT]:"rotatetrackball"};class $n extends EventTarget{removeMouseEvents=()=>{};constructor(t){super(),this.zooClientArgs=t,this.workerWebRTC=new En,this.rtcPeerConnection=new RTCPeerConnection({bundlePolicy:"max-bundle"}),this.rtcPeerConnection.addTransceiver("video",{direction:"recvonly"}),this.rtcPeerConnection.createDataChannel("unreliable_modeling_cmds"),this.ice(),this.rtcPeerConnection.addEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.addEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.addEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this))}deconstructor(){this.removeMouseEvents(),this.deice(),this.rtcPeerConnection.removeEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.removeEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.removeEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this)),this.workerWebRTC.terminate(),this.rtcPeerConnection.close()}start(){this.workerWebRTC.postMessage({to:"worker",payload:{type:"start",data:[this.zooClientArgs]}})}wasm(t,...e){return new Promise((n=>{const i=t=>{const e=t.data;"wasm"===e.from&&(this.workerWebRTC.removeEventListener("message",i),n(e.payload.data))};this.workerWebRTC.addEventListener("message",i),this.workerWebRTC.postMessage({to:"wasm",payload:{type:t,data:e??[]}})}))}executor(){return{addEventListener:this.workerWebRTC.addEventListener.bind(this.workerWebRTC,"message"),removeEventListener:this.workerWebRTC.removeEventListener.bind(this.workerWebRTC,"message"),submit:t=>new Promise((e=>{const n=t=>{const i=t.data;"wasm"===i.from&&"execute"===i.payload.type&&"done"===i.payload.data&&(this.workerWebRTC.removeEventListener("message",n),e(void 0))};this.workerWebRTC.addEventListener("message",n),this.workerWebRTC.postMessage({to:"wasm",payload:{type:"execute",data:[t]}})}))}}webRTCOnConnectionStateChange(){if("disconnected"===this.rtcPeerConnection.connectionState)this.dispatchEvent(new Event("close"))}webRTCOnTrack(t){this.track=t,this.dispatchEvent(new Event("track"))}webRTCOnDataChannel(t){this.channel=t.channel,this.dispatchEvent(new Event("datachannel")),this.dispatchEvent(new Event("connected"))}async iceOnIceServerInfo(t){if(0==t.data.ice_servers.length)return;this.rtcPeerConnection.setConfiguration({bundlePolicy:"max-bundle",iceServers:t.data.ice_servers,iceTransportPolicy:"relay"});const e=await this.rtcPeerConnection.createOffer();await this.rtcPeerConnection.setLocalDescription(e),this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"sdp_offer",offer:e})]}})}async iceOnSdpAnswer(t){await this.rtcPeerConnection.setRemoteDescription(t.data.answer)}async iceOnTrickleIce(t){await this.rtcPeerConnection.addIceCandidate(t.data.candidate)}iceOnIceCandidate(t){null!==t.candidate&&this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"trickle_ice",candidate:{candidate:t.candidate.candidate,sdpMid:t.candidate.sdpMid||void 0,sdpMLineIndex:t.candidate.sdpMLineIndex||void 0,usernameFragment:t.candidate.usernameFragment||void 0}})]}})}iceOnMessage(t){const e=In.parseMessage(t);if("resp"in e)switch(e.resp.type){case"ice_server_info":this.iceOnIceServerInfo(e.resp);break;case"sdp_answer":this.iceOnSdpAnswer(e.resp);break;case"trickle_ice":this.iceOnTrickleIce(e.resp)}}workerWebRTCOnMessage(t){const e=t.data;"websocket"===e.from&&"message"===e.payload.type&&this.iceOnMessage(e.payload)}ice(){this.workerWebRTC.addEventListener("message",this.workerWebRTCOnMessage.bind(this)),this.rtcPeerConnection.addEventListener("icecandidate",this.iceOnIceCandidate.bind(this))}deice(){this.workerWebRTC.removeEventListener("message",this.workerWebRTCOnMessage.bind(this)),this.rtcPeerConnection.removeEventListener("icecandidate",this.iceOnIceCandidate)}addMouseEvents(t){let e,n=_n.UP;const i=t=>i=>{const o=An[i.button];void 0!==o&&(this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:Dn[t],interaction:o,window:{x:i.offsetX,y:i.offsetY}}})]}}),e=i.button,n=t)},o=i(_n.DOWN),l=i(_n.UP),a=t=>{const i=An[e];void 0!==i&&(n=_n.UP,this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:Dn[n],interaction:i,window:{x:t.offsetX,y:t.offsetY}}})]}}))};let s=0;const c=On((t=>{n===_n.DOWN&&this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"camera_drag_move",interaction:An[e],window:{x:t.offsetX,y:t.offsetY}}})),s+=1,this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"mouse_move",sequence:s,window:{x:t.offsetX,y:t.offsetY}}}))}),1e3/30),r=On((t=>{t.preventDefault(),this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"default_camera_zoom",magnitude:-1*Math.sign(t.deltaY)*window.devicePixelRatio*100}}))}),1e3/30),d=e=>{this.channel=e.channel,t.addEventListener("pointerdown",o),t.addEventListener("pointermove",c.fn),t.addEventListener("pointerup",l),t.addEventListener("pointerleave",a),t.addEventListener("wheel",r.fn,{passive:!1})};this.rtcPeerConnection.addEventListener("datachannel",d),this.removeMouseEvents=()=>{this.rtcPeerConnection.removeEventListener("datachannel",d),t.removeEventListener("pointerdown",o),t.removeEventListener("pointermove",c.fn),clearInterval(c.intervalId),t.removeEventListener("pointerup",l),t.removeEventListener("pointerleave",a),t.removeEventListener("wheel",r.fn),clearInterval(r.intervalId)}}send(...t){this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:t}})}}const qn={get_api_call:async function({client:t,id:n}){const i=`/api-calls/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_api_call_for_org:async function({client:t,id:n}){const i=`/org/api-calls/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_api_call_for_user:async function({client:t,id:n}){const i=`/user/api-calls/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_api_call_metrics:async function({client:t,group_by:n}){const i="/api-call-metrics"+e({group_by:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_async_operation:async function({client:t,id:n}){const i=`/async/operations/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_api_calls:s,list_api_calls_for_user:c,list_api_calls_for_user_pager:function(t){return a(c,t,"page_token")},list_api_calls_pager:function(t){return a(s,t,"page_token")},list_async_operations:r,list_async_operations_pager:function(t){return a(r,t,"page_token")},org_list_api_calls:d,org_list_api_calls_pager:function(t){return a(d,t,"page_token")},user_list_api_calls:u,user_list_api_calls_pager:function(t){return a(u,t,"page_token")}},ti={create_api_token_for_user:async function({client:t,label:n}){const i="/user/api-tokens"+e({label:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_api_token_for_user:async function({client:t,token:n}){const i=`/user/api-tokens/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},get_api_token_for_user:async function({client:t,token:n}){const i=`/user/api-tokens/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_api_tokens_for_user:b,list_api_tokens_for_user_pager:function(t){return a(b,t,"page_token")}},ei={apps_github_callback:async function({client:t}={}){const n="/apps/github/callback"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},apps_github_consent:async function({client:t}={}){const n="/apps/github/consent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},apps_github_webhook:async function({client:t,body:n}){const i="/apps/github/webhook"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/octet-stream";const c={method:"POST",headers:s,body:n},r=t?.fetch||fetch,d=await r(l,c);await o(d)}},ni={create_executor_term:class{constructor(){}static urlConstructFrom(t){const n="/ws/executor/term"+e({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}},create_file_execution:async function({client:t,lang:n,output:i,body:l}){const a=`/file/execute/${n}`+e({output:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()}},ii={create_file_center_of_mass:async function({client:t,src_format:n,output_unit:i,body:l}){const a="/file/center-of-mass"+e({src_format:n,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_file_conversion:async function({client:t,src_format:n,output_format:i,body:l}){const a=`/file/conversion/${n}/${i}`+e({}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_file_conversion_options:async function({client:t,files:n,body:i}){const l="/file/conversion"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)})),r.append("event",JSON.stringify(i));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},create_file_density:async function({client:t,src_format:n,material_mass:i,material_mass_unit:l,output_unit:a,body:s}){const c="/file/density"+e({src_format:n,material_mass:i,material_mass_unit:l,output_unit:a}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`),u["Content-Type"]="application/octet-stream";const b={method:"POST",headers:u,body:s},m=t?.fetch||fetch,Z=await m(r,b);return await o(Z),await Z.json()},create_file_mass:async function({client:t,src_format:n,material_density:i,material_density_unit:l,output_unit:a,body:s}){const c="/file/mass"+e({src_format:n,material_density:i,material_density_unit:l,output_unit:a}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`),u["Content-Type"]="application/octet-stream";const b={method:"POST",headers:u,body:s},m=t?.fetch||fetch,Z=await m(r,b);return await o(Z),await Z.json()},create_file_surface_area:async function({client:t,src_format:n,output_unit:i,body:l}){const a="/file/surface-area"+e({src_format:n,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_file_volume:async function({client:t,src_format:n,output_unit:i,body:l}){const a="/file/volume"+e({src_format:n,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()}},oi={community_sso:async function({client:t,sso:n,sig:i}){const l="/community/sso"+e({sso:n,sig:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},create_event:async function({client:t,files:n,body:i}){const l="/events"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)})),r.append("event",JSON.stringify(i));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);await o(b)},get_ipinfo:async function({client:t}={}){const n="/_meta/ipinfo"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_pricing_subscriptions:async function({client:t}={}){const n="/pricing/subscriptions"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_schema:async function({client:t}={}){const n="/"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},internal_get_api_token_for_discord_user:async function({client:t,discord_id:n}){const i=`/internal/discord/api-token/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},ping:async function({client:t}={}){const n="/ping"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()}},li={create_custom_model:async function({client:t,body:n}){const i="/ml/custom/models"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_kcl_code_completions:async function({client:t,body:n}){const i="/ml/kcl/completions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_proprietary_to_kcl:async function({client:t,files:n,code_option:i}){const l="/ml/convert/proprietary-to-kcl"+e({code_option:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)}));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},create_text_to_cad:async function({client:t,output_format:n,kcl:i,body:l}){const a=`/ai/text-to-cad/${n}`+e({kcl:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/json";const d={method:"POST",headers:r,body:JSON.stringify(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_text_to_cad_iteration:async function({client:t,body:n}){const i="/ml/text-to-cad/iteration"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_text_to_cad_multi_file_iteration:async function({client:t,files:n,body:i}){const l="/ml/text-to-cad/multi-file/iteration"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)})),r.append("event",JSON.stringify(i));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},create_text_to_cad_part_feedback:async function({client:t,id:n,feedback:i}){const l=`/user/text-to-cad/${n}`+e({feedback:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"POST",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},get_custom_model:async function({client:t,id:n}){const i=`/ml/custom/models/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_ml_prompt:async function({client:t,id:n}){const i=`/ml-prompts/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_text_to_cad_part_for_user:async function({client:t,id:n}){const i=`/user/text-to-cad/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_conversations_for_user:gn,list_conversations_for_user_pager:function(t){return a(gn,t,"page_token")},list_ml_prompts:Wn,list_ml_prompts_pager:function(t){return a(Wn,t,"page_token")},list_org_datasets_for_model:async function({client:t,id:n}){const i=`/ml/custom/models/${n}/datasets`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_text_to_cad_parts_for_user:Sn,list_text_to_cad_parts_for_user_pager:function(t){return a(Sn,t,"page_token")},ml_copilot_ws:class{constructor(){}static urlConstructFrom(t){const n="/ws/ml/copilot"+e({replay:t.replay,conversation_id:t.conversation_id,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}},ml_reasoning_ws:class{constructor(){}static urlConstructFrom(t){const n=`/ws/ml/reasoning/${t.id}`+e({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}},update_custom_model:async function({client:t,id:n,body:i}){const l=`/ml/custom/models/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()}},ai={modeling_commands_ws:In},si={create_org_oauth2_app:async function({client:t,body:n}){const i="/org/oauth2/apps"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_user_oauth2_app:async function({client:t,body:n}){const i="/user/oauth2/apps"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_org_oauth2_app:async function({client:t,client_id:n}){const i=`/org/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_user_oauth2_app:async function({client:t,client_id:n}){const i=`/user/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},device_access_token:async function({client:t,body:i}){const l="/oauth2/device/token"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/x-www-form-urlencoded";const r={method:"POST",headers:c,body:n(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},device_auth_confirm:async function({client:t,body:n}){const i="/oauth2/device/confirm"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},device_auth_request:async function({client:t,body:i}){const l="/oauth2/device/auth"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/x-www-form-urlencoded";const r={method:"POST",headers:c,body:n(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},device_auth_verify:async function({client:t,user_code:n,app_name:i}){const l="/oauth2/device/verify"+e({user_code:n,app_name:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_org_oauth2_app:async function({client:t,client_id:n}){const i=`/org/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user_oauth2_app:async function({client:t,client_id:n}){const i=`/user/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_oauth2_apps_for_any_org:Tn,list_oauth2_apps_for_any_org_pager:function(t){return a(Tn,t,"page_token")},list_oauth2_apps_for_any_user:Un,list_oauth2_apps_for_any_user_pager:function(t){return a(Un,t,"page_token")},list_org_oauth2_apps:Kn,list_org_oauth2_apps_pager:function(t){return a(Kn,t,"page_token")},list_user_oauth2_apps:wn,list_user_oauth2_apps_pager:function(t){return a(wn,t,"page_token")},oauth2_provider_callback:async function({client:t,provider:n,code:i,state:l,id_token:a,user:s}){const c=`/oauth2/provider/${n}/callback`+e({code:i,state:l,id_token:a,user:s}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`);const b={method:"GET",headers:u},m=t?.fetch||fetch,Z=await m(r,b);return await o(Z),await Z.json()},oauth2_provider_callback_post:async function({client:t,provider:i,body:l}){const a=`/oauth2/provider/${i}/callback`+e({}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:r,body:n(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},oauth2_provider_consent:async function({client:t,provider:n,callback_url:i}){const l=`/oauth2/provider/${n}/consent`+e({callback_url:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},oauth2_token_revoke:async function({client:t,body:i}){const l="/oauth2/token/revoke"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/x-www-form-urlencoded";const r={method:"POST",headers:c,body:n(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_org_oauth2_app:async function({client:t,client_id:n,body:i}){const l=`/org/oauth2/apps/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_user_oauth2_app:async function({client:t,client_id:n,body:i}){const l=`/user/oauth2/apps/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},verify_oauth_account_linking:async function({client:t,token:n,callback_url:i}){const l="/oauth2/verify-account-linking"+e({token:n,callback_url:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()}},ci={create_org:async function({client:t,body:n}){const i="/org"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_org_dataset:async function({client:t,body:n}){const i="/org/datasets"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_org_member:async function({client:t,body:n}){const i="/org/members"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_org_saml_idp:async function({client:t,body:n}){const i="/org/saml/idp"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_org:async function({client:t}={}){const n="/org"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_org_dataset:async function({client:t,id:n}){const i=`/org/datasets/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_org_member:async function({client:t,user_id:n}){const i=`/org/members/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_org_saml_idp:async function({client:t}={}){const n="/org/saml/idp"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},download_org_dataset_conversion_original:async function({client:t,id:n,conversion_id:i}){const l=`/org/datasets/${n}/conversions/${i}/original`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},download_org_dataset_successful_kcl_bulk:async function({client:t,id:n}){const i=`/org/datasets/${n}/bulk-download/kcl`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_any_org:async function({client:t,id:n}){const i=`/orgs/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_billing_contract_for_any_org:async function({client:t,id:n}){const i=`/orgs/${n}/billing/contract`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org:async function({client:t}={}){const n="/org"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_org_dataset:async function({client:t,id:n}){const i=`/org/datasets/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org_dataset_conversion:async function({client:t,id:n,conversion_id:i}){const l=`/org/datasets/${n}/conversions/${i}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_org_dataset_conversion_stats:async function({client:t,id:n}){const i=`/org/datasets/${n}/stats`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org_member:async function({client:t,user_id:n}){const i=`/org/members/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org_privacy_settings:async function({client:t}={}){const n="/org/privacy"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_org_saml_idp:async function({client:t}={}){const n="/org/saml/idp"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_org_shortlinks:Rn,get_org_shortlinks_pager:function(t){return a(Rn,t,"page_token")},get_user_org:async function({client:t}={}){const n="/user/org"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_org_dataset_conversions:Jn,list_org_dataset_conversions_pager:function(t){return a(Jn,t,"page_token")},list_org_datasets:Nn,list_org_datasets_pager:function(t){return a(Nn,t,"page_token")},list_org_members:Yn,list_org_members_pager:function(t){return a(Yn,t,"page_token")},list_orgs:Ln,list_orgs_pager:function(t){return a(Ln,t,"page_token")},org_admin_details_get:async function({client:t,id:n}){const i=`/orgs/${n}/admin/details`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},org_dataset_s3_policies:async function({client:t,uri:n,role_arn:i}){const l="/org/dataset/s3/policies"+e({uri:n,role_arn:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},retrigger_org_dataset:async function({client:t,id:n,statuses:i}){const l=`/org/datasets/${n}/retrigger`+e({statuses:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"POST",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},retrigger_org_dataset_conversion:async function({client:t,id:n,conversion_id:i}){const l=`/org/datasets/${n}/conversions/${i}/retrigger`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"POST",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},search_org_dataset_conversions:zn,search_org_dataset_conversions_pager:function(t){return a(zn,t,"page_token")},search_org_dataset_semantic:async function({client:t,id:n,q:i,limit:l}){const a=`/org/datasets/${n}/search/semantic`+e({q:i,limit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},update_org:async function({client:t,body:n}){const i="/org"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_org_dataset:async function({client:t,id:n,body:i}){const l=`/org/datasets/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_org_member:async function({client:t,user_id:n,body:i}){const l=`/org/members/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_org_privacy_settings:async function({client:t,body:n}){const i="/org/privacy"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_org_saml_idp:async function({client:t,body:n}){const i="/org/saml/idp"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},upload_org_dataset_files:async function({client:t,files:n,id:i}){const l=`/org/datasets/${i}/uploads`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)}));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},upsert_billing_contract_for_any_org:async function({client:t,id:n,body:i}){const l=`/orgs/${n}/billing/contract`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()}},ri={create_org_subscription:async function({client:t,body:n}){const i="/org/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_payment_information_for_org:async function({client:t,body:n}){const i="/org/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_payment_information_for_user:async function({client:t,body:n}){const i="/user/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_payment_intent_for_org:async function({client:t}={}){const n="/org/payment/intent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},create_payment_intent_for_user:async function({client:t}={}){const n="/user/payment/intent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},create_user_subscription:async function({client:t,body:n}){const i="/user/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_payment_information_for_org:async function({client:t}={}){const n="/org/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_payment_information_for_user:async function({client:t}={}){const n="/user/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_payment_method_for_org:async function({client:t,id:n}){const i=`/org/payment/methods/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_payment_method_for_user:async function({client:t,id:n,force:i}){const l=`/user/payment/methods/${n}`+e({force:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"DELETE",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},get_org_subscription:async function({client:t}={}){const n="/org/payment/subscriptions"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_payment_balance_for_any_org:async function({client:t,include_total_due:n,id:i}){const l=`/orgs/${i}/payment/balance`+e({include_total_due:n}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_payment_balance_for_any_user:async function({client:t,id:n,include_total_due:i}){const l=`/users/${n}/payment/balance`+e({include_total_due:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_payment_balance_for_org:async function({client:t,include_total_due:n}){const i="/org/payment/balance"+e({include_total_due:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_payment_balance_for_user:async function({client:t,include_total_due:n}){const i="/user/payment/balance"+e({include_total_due:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_payment_information_for_org:async function({client:t}={}){const n="/org/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_payment_information_for_user:async function({client:t}={}){const n="/user/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_subscription:async function({client:t}={}){const n="/user/payment/subscriptions"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_invoices_for_org:async function({client:t}={}){const n="/org/payment/invoices"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_invoices_for_user:async function({client:t}={}){const n="/user/payment/invoices"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_payment_methods_for_org:async function({client:t}={}){const n="/org/payment/methods"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_payment_methods_for_user:async function({client:t}={}){const n="/user/payment/methods"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},set_default_payment_method_for_user:async function({client:t,id:n}){const i=`/user/payment/methods/${n}/default`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},update_org_subscription:async function({client:t,body:n}){const i="/org/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_org_subscription_for_any_org:async function({client:t,id:n,body:i}){const l=`/orgs/${n}/payment/subscriptions`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_payment_balance_for_any_org:async function({client:t,id:n,include_total_due:i,body:l}){const a=`/orgs/${n}/payment/balance`+e({include_total_due:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/json";const d={method:"PUT",headers:r,body:JSON.stringify(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},update_payment_balance_for_any_user:async function({client:t,id:n,include_total_due:i,body:l}){const a=`/users/${n}/payment/balance`+e({include_total_due:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/json";const d={method:"PUT",headers:r,body:JSON.stringify(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},update_payment_information_for_org:async function({client:t,body:n}){const i="/org/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_payment_information_for_user:async function({client:t,body:n}){const i="/user/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_user_subscription:async function({client:t,body:n}){const i="/user/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},upsert_subscription_plan_price:async function({client:t,slug:n,body:i}){const l=`/subscription-plans/${n}/prices`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"POST",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},validate_customer_tax_information_for_org:async function({client:t}={}){const n="/org/payment/tax"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},validate_customer_tax_information_for_user:async function({client:t}={}){const n="/user/payment/tax"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)}},di={create_project:async function({client:t,files:n}){const i="/user/projects"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c=new FormData;n.forEach((t=>{c.append(t.name,t.data,t.name)}));const r={method:"POST",headers:s,body:c},d=t?.fetch||fetch,u=await d(l,r);return await o(u),await u.json()},create_project_share_link:async function({client:t,id:n,body:i}){const l=`/user/projects/${n}/share-links`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"POST",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},create_public_project_vote:async function({client:t,id:n}){const i=`/projects/public/${n}/vote`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_project:async function({client:t,id:n}){const i=`/user/projects/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_project_share_link:async function({client:t,id:n,key:i}){const l=`/user/projects/${n}/share-links/${i}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"DELETE",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},delete_public_project_vote:async function({client:t,id:n}){const i=`/projects/public/${n}/vote`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},download_project:async function({client:t,id:n}){const i=`/user/projects/${n}/download`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_project:async function({client:t,id:n}){const i=`/user/projects/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_project_thumbnail:async function({client:t,id:n}){const i=`/user/projects/${n}/thumbnail`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_public_project_thumbnail:async function({client:t,id:n}){const i=`/projects/public/${n}/thumbnail`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_project_categories:async function({client:t}={}){const n="/projects/categories"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_project_share_links:async function({client:t,id:n}){const i=`/user/projects/${n}/share-links`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_projects:async function({client:t}={}){const n="/user/projects"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_public_projects:async function({client:t}={}){const n="/projects/public"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},publish_project:async function({client:t,id:n}){const i=`/user/projects/${n}/publish`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_project:async function({client:t,files:n,id:i}){const l=`/user/projects/${i}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)}));const d={method:"PUT",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()}},ui={create_service_account_for_org:async function({client:t,label:n}){const i="/org/service-accounts"+e({label:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_service_account_for_org:async function({client:t,token:n}){const i=`/org/service-accounts/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},get_service_account_for_org:async function({client:t,token:n}){const i=`/org/service-accounts/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_service_accounts_for_org:xn,list_service_accounts_for_org_pager:function(t){return a(xn,t,"page_token")}},bi={create_store_coupon:async function({client:t,body:n}){const i="/store/coupon"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()}},mi={get_angle_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/angle/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_area_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/area/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_current_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/current/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_energy_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/energy/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_force_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/force/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_frequency_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/frequency/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_length_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/length/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_mass_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/mass/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_power_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/power/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_pressure_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/pressure/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_temperature_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/temperature/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_torque_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/torque/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_volume_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/volume/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()}},Zi={create_user_shortlink:async function({client:t,body:n}){const i="/user/shortlinks"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_user_self:async function({client:t}={}){const n="/user"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_user_shortlink:async function({client:t,key:n}){const i=`/user/shortlinks/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},get_oauth2_providers_for_user:async function({client:t}={}){const n="/user/oauth2/providers"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_session_for_user:async function({client:t,token:n}){const i=`/user/session/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user:async function({client:t,id:n}){const i=`/users/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user_cad_user_info_form:async function({client:t}={}){const n="/user/cad-user-info"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_extended:async function({client:t,id:n}){const i=`/users-extended/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user_privacy_settings:async function({client:t}={}){const n="/user/privacy"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_self:async function({client:t}={}){const n="/user"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_self_extended:async function({client:t}={}){const n="/user/extended"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_shortlinks:Cn,get_user_shortlinks_pager:function(t){return a(Cn,t,"page_token")},list_users:kn,list_users_extended:Bn,list_users_extended_pager:function(t){return a(Bn,t,"page_token")},list_users_pager:function(t){return a(kn,t,"page_token")},put_public_email_marketing_consent_request:async function({client:t,body:n}){const i="/website/email-marketing-consent/request"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},put_public_mailing_list_subscribe:async function({client:t,slug:n,body:i}){const l=`/website/email-marketing-lists/${n}/subscribe`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);await o(u)},put_public_mailing_list_unsubscribe:async function({client:t,slug:n,body:i}){const l=`/website/email-marketing-lists/${n}/unsubscribe`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);await o(u)},put_public_sales_form:async function({client:t,body:n}){const i="/website/forms/sales"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},put_public_support_form:async function({client:t,body:n}){const i="/website/forms/support"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},put_user_cad_user_info_form:async function({client:t,body:n}){const i="/website/forms/cad-user-info"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},report_user_client_error:async function({client:t,body:n}){const i="/user/client-errors"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_subscription_for_user:async function({client:t,id:n,body:i}){const l=`/users/${n}/payment/subscriptions`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_user_privacy_settings:async function({client:t,body:n}){const i="/user/privacy"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_user_self:async function({client:t,body:n}){const i="/user"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_user_shortlink:async function({client:t,key:n,body:i}){const l=`/user/shortlinks/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);await o(u)},user_admin_details_get:async function({client:t,id:n}){const i=`/users/${n}/admin/details`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},user_email_marketing_consent_decline_post:async function({client:t}={}){const n="/user/email-marketing-consent/decline"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},user_email_marketing_consent_get:async function({client:t}={}){const n="/user/email-marketing-consent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},user_email_marketing_consent_request_post:async function({client:t}={}){const n="/user/email-marketing-consent/request"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},user_email_marketing_consent_seen_post:async function({client:t}={}){const n="/user/email-marketing-consent/seen"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},user_features_get:async function({client:t}={}){const n="/user/features"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()}};export{i as ApiError,t as Client,l as Pager,$n as WebRTC,qn as api_calls,ti as api_tokens,ei as apps,a as createPager,ni as executor,ii as file,oi as meta,li as ml,ai as modeling,si as oauth2,ci as orgs,ri as payments,di as projects,ui as service_accounts,bi as store,mi as unit,Zi as users};
|
|
1
|
+
try{if("undefined"==typeof fetch&&"undefined"!=typeof process&&process.versions?.node){new Function("m","return import(m)")("cross-fetch/polyfill").catch((()=>{}))}}catch{}class t{constructor(t){const e="undefined"!=typeof process?process.env:void 0,n=e?.KITTYCAD_TOKEN||e?.KITTYCAD_API_TOKEN||e?.ZOO_AI_TOKEN,i=e?.ZOO_HOST;"string"==typeof t?this.token=t:t&&"object"==typeof t&&(this.token=t.token,this.baseUrl=t.baseUrl,this.fetch=t.fetch),this.token??=n,this.baseUrl??=i}}function e(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));const n=e.toString();return n?`?${n}`:""}function n(t){const e=new URLSearchParams;for(const[n,i]of Object.entries(t||{}))if(void 0!==i)if(Array.isArray(i))for(const t of i)e.append(n,String(t));else e.append(n,String(i));return e}try{if("undefined"!=typeof process&&process.versions?.node&&"win32"===process.platform){new Function("m","return import(m)")("win-ca")}}catch{}class i extends Error{constructor(t,e,n){super(n||e?.message||`HTTP ${t}`),this.name="ApiError",this.status=t,this.error_code=e?.error_code,this.request_id=e?.request_id,this.body=e}}async function o(t){if(t.ok)return;let e;try{e=await t.json()}catch{try{const n=await t.text();e=n?{message:n}:void 0}catch{e=void 0}}throw new i(t.status,e)}class l{started=!1;constructor(t,e,n="page_token"){this.fetchPage=t,this.baseParams={...e},this.tokenField=n}hasNext(){return!this.started||!!this.nextToken}reset(){this.started=!1,this.nextToken=void 0}async next(){if(this.started&&!this.nextToken)return[];const t={...this.baseParams};this.started&&this.nextToken&&(t[this.tokenField]=this.nextToken);const e=await this.fetchPage(t);return this.started=!0,this.nextToken=e?.next_page??null,e?.items??[]}}function a(t,e,n="page_token"){return new l(t,e,n)}async function s({client:t,limit:n,page_token:i,sort_by:l}){const a="/api-calls"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function c({client:t,id:n,limit:i,page_token:l,sort_by:a}){const s=`/users/${n}/api-calls`+e({limit:i,page_token:l,sort_by:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function r({client:t,limit:n,page_token:i,sort_by:l,status:a}){const s="/async/operations"+e({limit:n,page_token:i,sort_by:l,status:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function d({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/api-calls"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function u({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/api-calls"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function b({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/api-tokens"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}const m=(()=>{const t=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype),Symbol.toStringTag).get;return e=>t.call(e)})();function Z(t){return"Uint8Array"===m(t)}function h(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&("ArrayBuffer"===t[Symbol.toStringTag]||"SharedArrayBuffer"===t[Symbol.toStringTag])}function p(t){return t instanceof RegExp||"[object RegExp]"===Object.prototype.toString.call(t)}function y(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&"Map"===t[Symbol.toStringTag]}function G(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function V(t,e){return JSON.stringify(t,((t,e)=>"bigint"==typeof e?{$numberLong:`${e}`}:y(e)?Object.fromEntries(e):e))}const X=7,f=Symbol.for("@@mdb.bson.version"),g=2147483647,W=-2147483648,S=Math.pow(2,63)-1,I=-Math.pow(2,63),T=Math.pow(2,53),U=-Math.pow(2,53),K=1,w=2,R=3,J=4,N=5,Y=6,L=7,z=8,x=9,C=10,k=11,B=12,P=13,H=14,v=15,M=16,j=17,Q=18,E=19,O=255,_=127,F=0,D=4,A=Object.freeze({double:1,string:2,object:3,array:4,binData:5,undefined:6,objectId:7,bool:8,date:9,null:10,regex:11,dbPointer:12,javascript:13,symbol:14,javascriptWithScope:15,int:16,timestamp:17,long:18,decimal:19,minKey:-1,maxKey:127});class $ extends Error{get bsonError(){return!0}get name(){return"BSONError"}constructor(t,e){super(t,e)}static isBSONError(t){return null!=t&&"object"==typeof t&&"bsonError"in t&&!0===t.bsonError&&"name"in t&&"message"in t&&"stack"in t}}class q extends ${get name(){return"BSONVersionError"}constructor(){super(`Unsupported BSON version, bson types must be from bson ${X}.x.x`)}}class tt extends ${get name(){return"BSONRuntimeError"}constructor(t){super(t)}}class et extends ${get name(){return"BSONOffsetError"}offset;constructor(t,e,n){super(`${t}. offset: ${e}`,n),this.offset=e}}let nt,it;function ot(t,e,n,i){if(i){nt??=new TextDecoder("utf8",{fatal:!0});try{return nt.decode(t.subarray(e,n))}catch(t){throw new $("Invalid UTF-8 string in BSON document",{cause:t})}}return it??=new TextDecoder("utf8",{fatal:!1}),it.decode(t.subarray(e,n))}function lt(t,e,n){if(0===t.length)return"";const i=n-e;if(0===i)return"";if(i>20)return null;if(1===i&&t[e]<128)return String.fromCharCode(t[e]);if(2===i&&t[e]<128&&t[e+1]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1]);if(3===i&&t[e]<128&&t[e+1]<128&&t[e+2]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1])+String.fromCharCode(t[e+2]);const o=[];for(let i=e;i<n;i++){const e=t[i];if(e>127)return null;o.push(e)}return String.fromCharCode(...o)}function at(t){return rt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}function st(t){return crypto.getRandomValues(rt.allocate(t))}const ct=(()=>{const{crypto:t}=globalThis;return null!=t&&"function"==typeof t.getRandomValues?st:at})(),rt={isUint8Array:Z,toLocalBufferType(t){if(Buffer.isBuffer(t))return t;if(ArrayBuffer.isView(t))return Buffer.from(t.buffer,t.byteOffset,t.byteLength);const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return Buffer.from(t);throw new $("Cannot create Buffer from the passed potentialBuffer.")},allocate:t=>Buffer.alloc(t),allocateUnsafe:t=>Buffer.allocUnsafe(t),compare:(t,e)=>rt.toLocalBufferType(t).compare(e),concat:t=>Buffer.concat(t),copy:(t,e,n,i,o)=>rt.toLocalBufferType(t).copy(e,n??0,i??0,o??t.length),equals:(t,e)=>rt.toLocalBufferType(t).equals(e),fromNumberArray:t=>Buffer.from(t),fromBase64:t=>Buffer.from(t,"base64"),fromUTF8:t=>Buffer.from(t,"utf8"),toBase64:t=>rt.toLocalBufferType(t).toString("base64"),fromISO88591:t=>Buffer.from(t,"binary"),toISO88591:t=>rt.toLocalBufferType(t).toString("binary"),fromHex:t=>Buffer.from(t,"hex"),toHex:t=>rt.toLocalBufferType(t).toString("hex"),toUTF8(t,e,n,i){const o=n-e<=20?lt(t,e,n):null;if(null!=o)return o;const l=rt.toLocalBufferType(t).toString("utf8",e,n);if(i)for(let i=0;i<l.length;i++)if(65533===l.charCodeAt(i)){ot(t,e,n,!0);break}return l},utf8ByteLength:t=>Buffer.byteLength(t,"utf8"),encodeUTF8Into(t,e,n){const i=function(t,e,n){if(0===e.length)return 0;if(e.length>25)return null;if(t.length-n<e.length)return null;for(let i=0,o=n;i<e.length;i++,o++){const n=e.charCodeAt(i);if(n>127)return null;t[o]=n}return e.length}(t,e,n);return null!=i?i:rt.toLocalBufferType(t).write(e,n,void 0,"utf8")},randomBytes:ct,swap32:t=>rt.toLocalBufferType(t).swap32()};function dt(t){if(t<0)throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);return mt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}const ut=(()=>{const{crypto:t}=globalThis;if(null!=t&&"function"==typeof t.getRandomValues)return e=>t.getRandomValues(mt.allocate(e));if(function(){const{navigator:t}=globalThis;return"object"==typeof t&&"ReactNative"===t.product}()){const{console:t}=globalThis;t?.warn?.("BSON: For React Native please polyfill crypto.getRandomValues, e.g. using: https://www.npmjs.com/package/react-native-get-random-values.")}return dt})(),bt=/(\d|[a-f])/i,mt={isUint8Array:Z,toLocalBufferType(t){const e=t?.[Symbol.toStringTag]??Object.prototype.toString.call(t);if("Uint8Array"===e)return t;if(ArrayBuffer.isView(t))return new Uint8Array(t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength));if("ArrayBuffer"===e||"SharedArrayBuffer"===e||"[object ArrayBuffer]"===e||"[object SharedArrayBuffer]"===e)return new Uint8Array(t);throw new $("Cannot make a Uint8Array from passed potentialBuffer.")},allocate(t){if("number"!=typeof t)throw new TypeError(`The "size" argument must be of type number. Received ${String(t)}`);return new Uint8Array(t)},allocateUnsafe:t=>mt.allocate(t),compare(t,e){if(t===e)return 0;const n=Math.min(t.length,e.length);for(let i=0;i<n;i++){if(t[i]<e[i])return-1;if(t[i]>e[i])return 1}return t.length<e.length?-1:t.length>e.length?1:0},concat(t){if(0===t.length)return mt.allocate(0);let e=0;for(const n of t)e+=n.length;const n=mt.allocate(e);let i=0;for(const e of t)n.set(e,i),i+=e.length;return n},copy(t,e,n,i,o){if(void 0!==o&&o<0)throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${o}`);if(o=o??t.length,void 0!==i&&(i<0||i>o))throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${o}. Received ${i}`);if(i=i??0,void 0!==n&&n<0)throw new RangeError(`The value of "targetStart" is out of range. It must be >= 0. Received ${n}`);n=n??0;const l=t.subarray(i,o),a=Math.min(l.length,e.length-n);return a<=0?0:(e.set(l.subarray(0,a),n),a)},equals(t,e){if(t.byteLength!==e.byteLength)return!1;for(let n=0;n<t.byteLength;n++)if(t[n]!==e[n])return!1;return!0},fromNumberArray:t=>Uint8Array.from(t),fromBase64:t=>Uint8Array.from(atob(t),(t=>t.charCodeAt(0))),fromUTF8:t=>(new TextEncoder).encode(t),toBase64:t=>btoa(mt.toISO88591(t)),fromISO88591:t=>Uint8Array.from(t,(t=>255&t.charCodeAt(0))),toISO88591:t=>Array.from(Uint16Array.from(t),(t=>String.fromCharCode(t))).join(""),fromHex(t){const e=t.length%2==0?t:t.slice(0,t.length-1),n=[];for(let t=0;t<e.length;t+=2){const i=e[t],o=e[t+1];if(!bt.test(i))break;if(!bt.test(o))break;const l=Number.parseInt(`${i}${o}`,16);n.push(l)}return Uint8Array.from(n)},toHex:t=>Array.from(t,(t=>t.toString(16).padStart(2,"0"))).join(""),toUTF8(t,e,n,i){const o=n-e<=20?lt(t,e,n):null;return null!=o?o:ot(t,e,n,i)},utf8ByteLength:t=>(new TextEncoder).encode(t).byteLength,encodeUTF8Into(t,e,n){const i=(new TextEncoder).encode(e);return t.set(i,n),i.byteLength},randomBytes:ut,swap32(t){if(t.length%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let e=0;e<t.length;e+=4){const n=t[e],i=t[e+1],o=t[e+2],l=t[e+3];t[e]=l,t[e+1]=o,t[e+2]=i,t[e+3]=n}return t}},Zt="function"==typeof Buffer&&!0!==Buffer.prototype?._isBuffer?rt:mt,ht=Symbol.for("@@mdb.bson.type");class pt{get[ht](){return this._bsontype}get[f](){return X}[Symbol.for("nodejs.util.inspect.custom")](t,e,n){return this.inspect(t,e,n)}}const yt=new Float64Array(1),Gt=new Uint8Array(yt.buffer,0,8);yt[0]=-1;const Vt=0===Gt[7],Xt={isBigEndian:Vt,getNonnegativeInt32LE(t,e){if(t[e+3]>127)throw new RangeError(`Size cannot be negative at offset: ${e}`);return t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24},getInt32LE:(t,e)=>t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24,getUint32LE:(t,e)=>t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3],getUint32BE:(t,e)=>t[e+3]+256*t[e+2]+65536*t[e+1]+16777216*t[e],getBigInt64LE:(t,e)=>(BigInt(t[e+4]+256*t[e+5]+65536*t[e+6]+(t[e+7]<<24))<<32n)+BigInt(t[e]+256*t[e+1]+65536*t[e+2]+16777216*t[e+3]),getFloat64LE:Vt?(t,e)=>(Gt[7]=t[e],Gt[6]=t[e+1],Gt[5]=t[e+2],Gt[4]=t[e+3],Gt[3]=t[e+4],Gt[2]=t[e+5],Gt[1]=t[e+6],Gt[0]=t[e+7],yt[0]):(t,e)=>(Gt[0]=t[e],Gt[1]=t[e+1],Gt[2]=t[e+2],Gt[3]=t[e+3],Gt[4]=t[e+4],Gt[5]=t[e+5],Gt[6]=t[e+6],Gt[7]=t[e+7],yt[0]),setInt32BE:(t,e,n)=>(t[e+3]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e]=n,4),setInt32LE:(t,e,n)=>(t[e]=n,n>>>=8,t[e+1]=n,n>>>=8,t[e+2]=n,n>>>=8,t[e+3]=n,4),setBigInt64LE(t,e,n){const i=0xffffffffn;let o=Number(n&i);t[e]=o,o>>=8,t[e+1]=o,o>>=8,t[e+2]=o,o>>=8,t[e+3]=o;let l=Number(n>>32n&i);return t[e+4]=l,l>>=8,t[e+5]=l,l>>=8,t[e+6]=l,l>>=8,t[e+7]=l,8},setFloat64LE:Vt?(t,e,n)=>(yt[0]=n,t[e]=Gt[7],t[e+1]=Gt[6],t[e+2]=Gt[5],t[e+3]=Gt[4],t[e+4]=Gt[3],t[e+5]=Gt[2],t[e+6]=Gt[1],t[e+7]=Gt[0],8):(t,e,n)=>(yt[0]=n,t[e]=Gt[0],t[e+1]=Gt[1],t[e+2]=Gt[2],t[e+3]=Gt[3],t[e+4]=Gt[4],t[e+5]=Gt[5],t[e+6]=Gt[6],t[e+7]=Gt[7],8)};class ft extends pt{get _bsontype(){return"Binary"}static BSON_BINARY_SUBTYPE_DEFAULT=0;static BUFFER_SIZE=256;static SUBTYPE_DEFAULT=0;static SUBTYPE_FUNCTION=1;static SUBTYPE_BYTE_ARRAY=2;static SUBTYPE_UUID_OLD=3;static SUBTYPE_UUID=4;static SUBTYPE_MD5=5;static SUBTYPE_ENCRYPTED=6;static SUBTYPE_COLUMN=7;static SUBTYPE_SENSITIVE=8;static SUBTYPE_VECTOR=9;static SUBTYPE_USER_DEFINED=128;static VECTOR_TYPE=Object.freeze({Int8:3,Float32:39,PackedBit:16});buffer;sub_type;position;constructor(t,e){if(super(),null!=t&&"string"==typeof t&&!ArrayBuffer.isView(t)&&!h(t)&&!Array.isArray(t))throw new $("Binary can only be constructed from Uint8Array or number[]");this.sub_type=e??ft.BSON_BINARY_SUBTYPE_DEFAULT,null==t?(this.buffer=Zt.allocate(ft.BUFFER_SIZE),this.position=0):(this.buffer=Array.isArray(t)?Zt.fromNumberArray(t):Zt.toLocalBufferType(t),this.position=this.buffer.byteLength)}put(t){if("string"==typeof t&&1!==t.length)throw new $("only accepts single character String");if("number"!=typeof t&&1!==t.length)throw new $("only accepts single character Uint8Array or Array");let e;if(e="string"==typeof t?t.charCodeAt(0):"number"==typeof t?t:t[0],e<0||e>255)throw new $("only accepts number in a valid unsigned byte range 0-255");if(this.buffer.byteLength>this.position)this.buffer[this.position++]=e;else{const t=Zt.allocate(ft.BUFFER_SIZE+this.buffer.length);t.set(this.buffer,0),this.buffer=t,this.buffer[this.position++]=e}}write(t,e){if(e="number"==typeof e?e:this.position,this.buffer.byteLength<e+t.length){const e=Zt.allocate(this.buffer.byteLength+t.length);e.set(this.buffer,0),this.buffer=e}if(ArrayBuffer.isView(t))this.buffer.set(Zt.toLocalBufferType(t),e),this.position=e+t.byteLength>this.position?e+t.length:this.position;else if("string"==typeof t)throw new $("input cannot be string")}read(t,e){const n=t+(e=e&&e>0?e:this.position);return this.buffer.subarray(t,n>this.position?this.position:n)}value(){return this.buffer.length===this.position?this.buffer:this.buffer.subarray(0,this.position)}length(){return this.position}toJSON(){return Zt.toBase64(this.buffer.subarray(0,this.position))}toString(t){return"hex"===t?Zt.toHex(this.buffer.subarray(0,this.position)):"base64"===t?Zt.toBase64(this.buffer.subarray(0,this.position)):Zt.toUTF8(this.buffer,0,this.position,!1)}toExtendedJSON(t){t=t||{},this.sub_type===ft.SUBTYPE_VECTOR&>(this);const e=Zt.toBase64(this.buffer),n=Number(this.sub_type).toString(16);return t.legacy?{$binary:e,$type:1===n.length?"0"+n:n}:{$binary:{base64:e,subType:1===n.length?"0"+n:n}}}toUUID(){if(this.sub_type===ft.SUBTYPE_UUID)return new It(this.buffer.subarray(0,this.position));throw new $(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${ft.SUBTYPE_UUID}" is currently supported.`)}static createFromHexString(t,e){return new ft(Zt.fromHex(t),e)}static createFromBase64(t,e){return new ft(Zt.fromBase64(t),e)}static fromExtendedJSON(t,e){let n,i;if(e=e||{},"$binary"in t?e.legacy&&"string"==typeof t.$binary&&"$type"in t?(i=t.$type?parseInt(t.$type,16):0,n=Zt.fromBase64(t.$binary)):"string"!=typeof t.$binary&&(i=t.$binary.subType?parseInt(t.$binary.subType,16):0,n=Zt.fromBase64(t.$binary.base64)):"$uuid"in t&&(i=4,n=It.bytesFromString(t.$uuid)),!n)throw new $(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);return i===D?new It(n):new ft(n,i)}inspect(t,e,n){n??=V;return`Binary.createFromBase64(${n(Zt.toBase64(this.buffer.subarray(0,this.position)),e)}, ${n(this.sub_type,e)})`}toInt8Array(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.Int8)throw new $("Binary datatype field is not Int8");return gt(this),new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toFloat32Array(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.Float32)throw new $("Binary datatype field is not Float32");gt(this);const t=new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position));return Xt.isBigEndian&&Zt.swap32(t),new Float32Array(t.buffer)}toPackedBits(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.PackedBit)throw new $("Binary datatype field is not packed bit");return gt(this),new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toBits(){if(this.sub_type!==ft.SUBTYPE_VECTOR)throw new $("Binary sub_type is not Vector");if(this.buffer[0]!==ft.VECTOR_TYPE.PackedBit)throw new $("Binary datatype field is not packed bit");gt(this);const t=8*(this.length()-2)-this.buffer[1],e=new Int8Array(t);for(let t=0;t<e.length;t++){const n=t/8|0,i=this.buffer[n+2]>>7-t%8&1;e[t]=i}return e}static fromInt8Array(t){const e=Zt.allocate(t.byteLength+2);e[0]=ft.VECTOR_TYPE.Int8,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2);const i=new this(e,this.SUBTYPE_VECTOR);return gt(i),i}static fromFloat32Array(t){const e=Zt.allocate(t.byteLength+2);e[0]=ft.VECTOR_TYPE.Float32,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2),Xt.isBigEndian&&Zt.swap32(new Uint8Array(e.buffer,2));const i=new this(e,this.SUBTYPE_VECTOR);return gt(i),i}static fromPackedBits(t,e=0){const n=Zt.allocate(t.byteLength+2);n[0]=ft.VECTOR_TYPE.PackedBit,n[1]=e,n.set(t,2);const i=new this(n,this.SUBTYPE_VECTOR);return gt(i),i}static fromBits(t){const e=t.length+7>>>3,n=new Uint8Array(e+2);n[0]=ft.VECTOR_TYPE.PackedBit;const i=t.length%8;n[1]=0===i?0:8-i;for(let e=0;e<t.length;e++){const i=e>>>3,o=t[e];if(0!==o&&1!==o)throw new $(`Invalid bit value at ${e}: must be 0 or 1, found ${t[e]}`);if(0===o)continue;const l=7-e%8;n[i+2]|=o<<l}return new this(n,ft.SUBTYPE_VECTOR)}}function gt(t){if(t.sub_type!==ft.SUBTYPE_VECTOR)return;const e=t.position,n=t.buffer[0],i=t.buffer[1];if((n===ft.VECTOR_TYPE.Float32||n===ft.VECTOR_TYPE.Int8)&&0!==i)throw new $("Invalid Vector: padding must be zero for int8 and float32 vectors");if(n===ft.VECTOR_TYPE.Float32&&0!==e&&e-2!=0&&(e-2)%4!=0)throw new $("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");if(n===ft.VECTOR_TYPE.PackedBit&&0!==i&&2===e)throw new $("Invalid Vector: padding must be zero for packed bit vectors that are empty");if(n===ft.VECTOR_TYPE.PackedBit&&i>7)throw new $(`Invalid Vector: padding must be a value between 0 and 7. found: ${i}`)}const Wt=/^[0-9A-F]{32}$/i,St=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;class It extends ft{constructor(t){let e;if(null==t)e=It.generate();else if(t instanceof It)e=Zt.toLocalBufferType(new Uint8Array(t.buffer));else if(ArrayBuffer.isView(t)&&16===t.byteLength)e=Zt.toLocalBufferType(t);else{if("string"!=typeof t)throw new $("Argument passed in UUID constructor must be a UUID, a 16 byte Buffer or a 32/36 character hex string (dashes excluded/included, format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).");e=It.bytesFromString(t)}super(e,D)}get id(){return this.buffer}set id(t){this.buffer=t}toHexString(t=!0){return t?[Zt.toHex(this.buffer.subarray(0,4)),Zt.toHex(this.buffer.subarray(4,6)),Zt.toHex(this.buffer.subarray(6,8)),Zt.toHex(this.buffer.subarray(8,10)),Zt.toHex(this.buffer.subarray(10,16))].join("-"):Zt.toHex(this.buffer)}toString(t){return"hex"===t?Zt.toHex(this.id):"base64"===t?Zt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}equals(t){if(!t)return!1;if(t instanceof It)return Zt.equals(t.id,this.id);try{return Zt.equals(new It(t).id,this.id)}catch{return!1}}toBinary(){return new ft(this.id,ft.SUBTYPE_UUID)}static generate(){const t=Zt.randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,t}static isValid(t){return!!t&&("string"==typeof t?It.isValidUUIDString(t):Z(t)?16===t.byteLength:"Binary"===t._bsontype&&t.sub_type===this.SUBTYPE_UUID&&16===t.buffer.byteLength)}static createFromHexString(t){const e=It.bytesFromString(t);return new It(e)}static createFromBase64(t){return new It(Zt.fromBase64(t))}static bytesFromString(t){if(!It.isValidUUIDString(t))throw new $("UUID string representation must be 32 hex digits or canonical hyphenated representation");return Zt.fromHex(t.replace(/-/g,""))}static isValidUUIDString(t){return Wt.test(t)||St.test(t)}inspect(t,e,n){return n??=V,`new UUID(${n(this.toHexString(),e)})`}}class Tt extends pt{get _bsontype(){return"Code"}code;scope;constructor(t,e){super(),this.code=t.toString(),this.scope=e??null}toJSON(){return null!=this.scope?{code:this.code,scope:this.scope}:{code:this.code}}toExtendedJSON(){return this.scope?{$code:this.code,$scope:this.scope}:{$code:this.code}}static fromExtendedJSON(t){return new Tt(t.$code,t.$scope)}inspect(t,e,n){n??=V;let i=n(this.code,e);const o=i.includes("\n");null!=this.scope&&(i+=`,${o?"\n":" "}${n(this.scope,e)}`);return`new Code(${o?"\n":""}${i}${o&&null===this.scope?"\n":""})`}}function Ut(t){return null!=t&&"object"==typeof t&&"$id"in t&&null!=t.$id&&"$ref"in t&&"string"==typeof t.$ref&&(!("$db"in t)||"$db"in t&&"string"==typeof t.$db)}class Kt extends pt{get _bsontype(){return"DBRef"}collection;oid;db;fields;constructor(t,e,n,i){super();const o=t.split(".");2===o.length&&(n=o.shift(),t=o.shift()),this.collection=t,this.oid=e,this.db=n,this.fields=i||{}}get namespace(){return this.collection}set namespace(t){this.collection=t}toJSON(){const t=Object.assign({$ref:this.collection,$id:this.oid},this.fields);return null!=this.db&&(t.$db=this.db),t}toExtendedJSON(t){t=t||{};let e={$ref:this.collection,$id:this.oid};return t.legacy||(this.db&&(e.$db=this.db),e=Object.assign(e,this.fields)),e}static fromExtendedJSON(t){const e=Object.assign({},t);return delete e.$ref,delete e.$id,delete e.$db,new Kt(t.$ref,t.$id,t.$db,e)}inspect(t,e,n){n??=V;const i=[n(this.namespace,e),n(this.oid,e),...this.db?[n(this.db,e)]:[],...Object.keys(this.fields).length>0?[n(this.fields,e)]:[]];return i[1]=n===V?`new ObjectId(${i[1]})`:i[1],`new DBRef(${i.join(", ")})`}}function wt(t){if(""===t)return t;let e=0;const n="-"===t[e],i="+"===t[e];(i||n)&&(e+=1);let o=!1;for(;e<t.length&&"0"===t[e];++e)o=!0;return o?`${n?"-":""}${t.length===e?"0":t.slice(e)}`:i?t.slice(1):t}let Rt;try{Rt=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch{}const Jt=4294967296,Nt=0x10000000000000000,Yt=Nt/2,Lt={},zt={},xt=/^(\+?0|(\+|-)?[1-9][0-9]*)$/;class Ct extends pt{get _bsontype(){return"Long"}get __isLong__(){return!0}high;low;unsigned;constructor(t=0,e,n){super();const i="boolean"==typeof e?e:Boolean(n),o="number"==typeof e?e:0,l="string"==typeof t?Ct.fromString(t,i):"bigint"==typeof t?Ct.fromBigInt(t,i):{low:0|t,high:0|o,unsigned:i};this.low=l.low,this.high=l.high,this.unsigned=l.unsigned}static TWO_PWR_24=Ct.fromInt(16777216);static MAX_UNSIGNED_VALUE=Ct.fromBits(-1,-1,!0);static ZERO=Ct.fromInt(0);static UZERO=Ct.fromInt(0,!0);static ONE=Ct.fromInt(1);static UONE=Ct.fromInt(1,!0);static NEG_ONE=Ct.fromInt(-1);static MAX_VALUE=Ct.fromBits(-1,2147483647,!1);static MIN_VALUE=Ct.fromBits(0,-2147483648,!1);static fromBits(t,e,n){return new Ct(t,e,n)}static fromInt(t,e){let n,i,o;return e?(o=0<=(t>>>=0)&&t<256)&&(i=zt[t],i)?i:(n=Ct.fromBits(t,(0|t)<0?-1:0,!0),o&&(zt[t]=n),n):(o=-128<=(t|=0)&&t<128)&&(i=Lt[t],i)?i:(n=Ct.fromBits(t,t<0?-1:0,!1),o&&(Lt[t]=n),n)}static fromNumber(t,e){if(isNaN(t))return e?Ct.UZERO:Ct.ZERO;if(e){if(t<0)return Ct.UZERO;if(t>=Nt)return Ct.MAX_UNSIGNED_VALUE}else{if(t<=-Yt)return Ct.MIN_VALUE;if(t+1>=Yt)return Ct.MAX_VALUE}return t<0?Ct.fromNumber(-t,e).neg():Ct.fromBits(t%Jt|0,t/Jt|0,e)}static fromBigInt(t,e){const n=0xffffffffn;return new Ct(Number(t&n),Number(t>>32n&n),e)}static _fromString(t,e,n){if(0===t.length)throw new $("empty string");if(n<2||36<n)throw new $("radix");let i;if((i=t.indexOf("-"))>0)throw new $("interior hyphen");if(0===i)return Ct._fromString(t.substring(1),e,n).neg();const o=Ct.fromNumber(Math.pow(n,8));let l=Ct.ZERO;for(let e=0;e<t.length;e+=8){const i=Math.min(8,t.length-e),a=parseInt(t.substring(e,e+i),n);if(i<8){const t=Ct.fromNumber(Math.pow(n,i));l=l.mul(t).add(Ct.fromNumber(a))}else l=l.mul(o),l=l.add(Ct.fromNumber(a))}return l.unsigned=e,l}static fromStringStrict(t,e,n){let i=!1;if("number"==typeof e?(n=e,e=!1):i=!!e,n??=10,t.trim()!==t)throw new $(`Input: '${t}' contains leading and/or trailing whitespace`);if(!function(t,e){const n="0123456789abcdefghijklmnopqrstuvwxyz".slice(0,e=e??10);return!new RegExp(`[^-+${n}]`,"i").test(t)&&t}(t,n))throw new $(`Input: '${t}' contains invalid characters for radix: ${n}`);const o=wt(t),l=Ct._fromString(o,i,n);if(l.toString(n).toLowerCase()!==o.toLowerCase())throw new $(`Input: ${t} is not representable as ${l.unsigned?"an unsigned":"a signed"} 64-bit Long ${null!=n?`with radix: ${n}`:""}`);return l}static fromString(t,e,n){let i=!1;return"number"==typeof e?(n=e,e=!1):i=!!e,n??=10,"NaN"===t&&n<24||("Infinity"===t||"+Infinity"===t||"-Infinity"===t)&&n<35?Ct.ZERO:Ct._fromString(t,i,n)}static fromBytes(t,e,n){return n?Ct.fromBytesLE(t,e):Ct.fromBytesBE(t,e)}static fromBytesLE(t,e){return new Ct(t[0]|t[1]<<8|t[2]<<16|t[3]<<24,t[4]|t[5]<<8|t[6]<<16|t[7]<<24,e)}static fromBytesBE(t,e){return new Ct(t[4]<<24|t[5]<<16|t[6]<<8|t[7],t[0]<<24|t[1]<<16|t[2]<<8|t[3],e)}static isLong(t){return null!=t&&"object"==typeof t&&"__isLong__"in t&&!0===t.__isLong__}static fromValue(t,e){return"number"==typeof t?Ct.fromNumber(t,e):"string"==typeof t?Ct.fromString(t,e):Ct.fromBits(t.low,t.high,"boolean"==typeof e?e:t.unsigned)}add(t){Ct.isLong(t)||(t=Ct.fromValue(t));const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,o=65535&this.low,l=t.high>>>16,a=65535&t.high,s=t.low>>>16;let c=0,r=0,d=0,u=0;return u+=o+(65535&t.low),d+=u>>>16,u&=65535,d+=i+s,r+=d>>>16,d&=65535,r+=n+a,c+=r>>>16,r&=65535,c+=e+l,c&=65535,Ct.fromBits(d<<16|u,c<<16|r,this.unsigned)}and(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),Ct.fromBits(this.low&t.low,this.high&t.high,this.unsigned)}compare(t){if(Ct.isLong(t)||(t=Ct.fromValue(t)),this.eq(t))return 0;const e=this.isNegative(),n=t.isNegative();return e&&!n?-1:!e&&n?1:this.unsigned?t.high>>>0>this.high>>>0||t.high===this.high&&t.low>>>0>this.low>>>0?-1:1:this.sub(t).isNegative()?-1:1}comp(t){return this.compare(t)}divide(t){if(Ct.isLong(t)||(t=Ct.fromValue(t)),t.isZero())throw new $("division by zero");if(Rt){if(!this.unsigned&&-2147483648===this.high&&-1===t.low&&-1===t.high)return this;const e=(this.unsigned?Rt.div_u:Rt.div_s)(this.low,this.high,t.low,t.high);return Ct.fromBits(e,Rt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?Ct.UZERO:Ct.ZERO;let e,n,i;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return Ct.UZERO;if(t.gt(this.shru(1)))return Ct.UONE;i=Ct.UZERO}else{if(this.eq(Ct.MIN_VALUE)){if(t.eq(Ct.ONE)||t.eq(Ct.NEG_ONE))return Ct.MIN_VALUE;if(t.eq(Ct.MIN_VALUE))return Ct.ONE;return e=this.shr(1).div(t).shl(1),e.eq(Ct.ZERO)?t.isNegative()?Ct.ONE:Ct.NEG_ONE:(n=this.sub(t.mul(e)),i=e.add(n.div(t)),i)}if(t.eq(Ct.MIN_VALUE))return this.unsigned?Ct.UZERO:Ct.ZERO;if(this.isNegative())return t.isNegative()?this.neg().div(t.neg()):this.neg().div(t).neg();if(t.isNegative())return this.div(t.neg()).neg();i=Ct.ZERO}for(n=this;n.gte(t);){e=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));const o=Math.ceil(Math.log(e)/Math.LN2),l=o<=48?1:Math.pow(2,o-48);let a=Ct.fromNumber(e),s=a.mul(t);for(;s.isNegative()||s.gt(n);)e-=l,a=Ct.fromNumber(e,this.unsigned),s=a.mul(t);a.isZero()&&(a=Ct.ONE),i=i.add(a),n=n.sub(s)}return i}div(t){return this.divide(t)}equals(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),(this.unsigned===t.unsigned||this.high>>>31!=1||t.high>>>31!=1)&&(this.high===t.high&&this.low===t.low)}eq(t){return this.equals(t)}getHighBits(){return this.high}getHighBitsUnsigned(){return this.high>>>0}getLowBits(){return this.low}getLowBitsUnsigned(){return this.low>>>0}getNumBitsAbs(){if(this.isNegative())return this.eq(Ct.MIN_VALUE)?64:this.neg().getNumBitsAbs();const t=0!==this.high?this.high:this.low;let e;for(e=31;e>0&&!(t&1<<e);e--);return 0!==this.high?e+33:e+1}greaterThan(t){return this.comp(t)>0}gt(t){return this.greaterThan(t)}greaterThanOrEqual(t){return this.comp(t)>=0}gte(t){return this.greaterThanOrEqual(t)}ge(t){return this.greaterThanOrEqual(t)}isEven(){return!(1&this.low)}isNegative(){return!this.unsigned&&this.high<0}isOdd(){return!(1&~this.low)}isPositive(){return this.unsigned||this.high>=0}isZero(){return 0===this.high&&0===this.low}lessThan(t){return this.comp(t)<0}lt(t){return this.lessThan(t)}lessThanOrEqual(t){return this.comp(t)<=0}lte(t){return this.lessThanOrEqual(t)}modulo(t){if(Ct.isLong(t)||(t=Ct.fromValue(t)),Rt){const e=(this.unsigned?Rt.rem_u:Rt.rem_s)(this.low,this.high,t.low,t.high);return Ct.fromBits(e,Rt.get_high(),this.unsigned)}return this.sub(this.div(t).mul(t))}mod(t){return this.modulo(t)}rem(t){return this.modulo(t)}multiply(t){if(this.isZero())return Ct.ZERO;if(Ct.isLong(t)||(t=Ct.fromValue(t)),Rt){const e=Rt.mul(this.low,this.high,t.low,t.high);return Ct.fromBits(e,Rt.get_high(),this.unsigned)}if(t.isZero())return Ct.ZERO;if(this.eq(Ct.MIN_VALUE))return t.isOdd()?Ct.MIN_VALUE:Ct.ZERO;if(t.eq(Ct.MIN_VALUE))return this.isOdd()?Ct.MIN_VALUE:Ct.ZERO;if(this.isNegative())return t.isNegative()?this.neg().mul(t.neg()):this.neg().mul(t).neg();if(t.isNegative())return this.mul(t.neg()).neg();if(this.lt(Ct.TWO_PWR_24)&&t.lt(Ct.TWO_PWR_24))return Ct.fromNumber(this.toNumber()*t.toNumber(),this.unsigned);const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,o=65535&this.low,l=t.high>>>16,a=65535&t.high,s=t.low>>>16,c=65535&t.low;let r=0,d=0,u=0,b=0;return b+=o*c,u+=b>>>16,b&=65535,u+=i*c,d+=u>>>16,u&=65535,u+=o*s,d+=u>>>16,u&=65535,d+=n*c,r+=d>>>16,d&=65535,d+=i*s,r+=d>>>16,d&=65535,d+=o*a,r+=d>>>16,d&=65535,r+=e*c+n*s+i*a+o*l,r&=65535,Ct.fromBits(u<<16|b,r<<16|d,this.unsigned)}mul(t){return this.multiply(t)}negate(){return!this.unsigned&&this.eq(Ct.MIN_VALUE)?Ct.MIN_VALUE:this.not().add(Ct.ONE)}neg(){return this.negate()}not(){return Ct.fromBits(~this.low,~this.high,this.unsigned)}notEquals(t){return!this.equals(t)}neq(t){return this.notEquals(t)}ne(t){return this.notEquals(t)}or(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),Ct.fromBits(this.low|t.low,this.high|t.high,this.unsigned)}shiftLeft(t){return Ct.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?Ct.fromBits(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):Ct.fromBits(0,this.low<<t-32,this.unsigned)}shl(t){return this.shiftLeft(t)}shiftRight(t){return Ct.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?Ct.fromBits(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):Ct.fromBits(this.high>>t-32,this.high>=0?0:-1,this.unsigned)}shr(t){return this.shiftRight(t)}shiftRightUnsigned(t){if(Ct.isLong(t)&&(t=t.toInt()),0===(t&=63))return this;{const e=this.high;if(t<32){const n=this.low;return Ct.fromBits(n>>>t|e<<32-t,e>>>t,this.unsigned)}return 32===t?Ct.fromBits(e,0,this.unsigned):Ct.fromBits(e>>>t-32,0,this.unsigned)}}shr_u(t){return this.shiftRightUnsigned(t)}shru(t){return this.shiftRightUnsigned(t)}subtract(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),this.add(t.neg())}sub(t){return this.subtract(t)}toInt(){return this.unsigned?this.low>>>0:this.low}toNumber(){return this.unsigned?(this.high>>>0)*Jt+(this.low>>>0):this.high*Jt+(this.low>>>0)}toBigInt(){return BigInt(this.toString())}toBytes(t){return t?this.toBytesLE():this.toBytesBE()}toBytesLE(){const t=this.high,e=this.low;return[255&e,e>>>8&255,e>>>16&255,e>>>24,255&t,t>>>8&255,t>>>16&255,t>>>24]}toBytesBE(){const t=this.high,e=this.low;return[t>>>24,t>>>16&255,t>>>8&255,255&t,e>>>24,e>>>16&255,e>>>8&255,255&e]}toSigned(){return this.unsigned?Ct.fromBits(this.low,this.high,!1):this}toString(t){if((t=t||10)<2||36<t)throw new $("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(Ct.MIN_VALUE)){const e=Ct.fromNumber(t),n=this.div(e),i=n.mul(e).sub(this);return n.toString(t)+i.toInt().toString(t)}return"-"+this.neg().toString(t)}const e=Ct.fromNumber(Math.pow(t,6),this.unsigned);let n=this,i="";for(;;){const o=n.div(e);let l=(n.sub(o.mul(e)).toInt()>>>0).toString(t);if(n=o,n.isZero())return l+i;for(;l.length<6;)l="0"+l;i=""+l+i}}toUnsigned(){return this.unsigned?this:Ct.fromBits(this.low,this.high,!0)}xor(t){return Ct.isLong(t)||(t=Ct.fromValue(t)),Ct.fromBits(this.low^t.low,this.high^t.high,this.unsigned)}eqz(){return this.isZero()}le(t){return this.lessThanOrEqual(t)}toExtendedJSON(t){return t&&t.relaxed?this.toNumber():{$numberLong:this.toString()}}static fromExtendedJSON(t,e){const{useBigInt64:n=!1,relaxed:i=!0}={...e};if(t.$numberLong.length>20)throw new $("$numberLong string is too long");if(!xt.test(t.$numberLong))throw new $(`$numberLong string "${t.$numberLong}" is in an invalid format`);if(n){const e=BigInt(t.$numberLong);return BigInt.asIntN(64,e)}const o=Ct.fromString(t.$numberLong);return i?o.toNumber():o}inspect(t,e,n){n??=V;return`new Long(${n(this.toString(),e)}${this.unsigned?`, ${n(this.unsigned,e)}`:""})`}}const kt=/^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/,Bt=/^(\+|-)?(Infinity|inf)$/i,Pt=/^(\+|-)?NaN$/i,Ht=6111,vt=-6176,Mt=Zt.fromNumberArray([124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),jt=Zt.fromNumberArray([248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Qt=Zt.fromNumberArray([120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Et=/^([-+])?(\d+)?$/;function Ot(t){return!isNaN(parseInt(t,10))}function _t(t){const e=Ct.fromNumber(1e9);let n=Ct.fromNumber(0);if(!(t.parts[0]||t.parts[1]||t.parts[2]||t.parts[3]))return{quotient:t,rem:n};for(let i=0;i<=3;i++)n=n.shiftLeft(32),n=n.add(new Ct(t.parts[i],0)),t.parts[i]=n.div(e).low,n=n.modulo(e);return{quotient:t,rem:n}}function Ft(t,e){throw new $(`"${t}" is not a valid Decimal128 string - ${e}`)}class Dt extends pt{get _bsontype(){return"Decimal128"}bytes;constructor(t){if(super(),"string"==typeof t)this.bytes=Dt.fromString(t).bytes;else{if(!(t instanceof Uint8Array||Z(t)))throw new $("Decimal128 must take a Buffer or string");if(16!==t.byteLength)throw new $("Decimal128 must take a Buffer of 16 bytes");this.bytes=t}}static fromString(t){return Dt._fromString(t,{allowRounding:!1})}static fromStringWithRounding(t){return Dt._fromString(t,{allowRounding:!0})}static _fromString(t,e){let n=!1,i=!1,o=!1,l=!1,a=0,s=0,c=0,r=0,d=0;const u=[0];let b=0,m=0,Z=0,h=0,p=new Ct(0,0),y=new Ct(0,0),G=0,V=0;if(t.length>=7e3)throw new $(t+" not a valid Decimal128 string");const X=t.match(kt),f=t.match(Bt),g=t.match(Pt);if(!X&&!f&&!g||0===t.length)throw new $(t+" not a valid Decimal128 string");if(X){const e=X[2],n=X[4],i=X[5],o=X[6];n&&void 0===o&&Ft(t,"missing exponent power"),n&&void 0===e&&Ft(t,"missing exponent base"),void 0===n&&(i||o)&&Ft(t,"missing e before exponent")}if("+"!==t[V]&&"-"!==t[V]||(i=!0,n="-"===t[V++]),!Ot(t[V])&&"."!==t[V]){if("i"===t[V]||"I"===t[V])return new Dt(n?jt:Qt);if("N"===t[V])return new Dt(Mt)}for(;Ot(t[V])||"."===t[V];)"."!==t[V]?(b<34&&("0"!==t[V]||l)&&(l||(d=s),l=!0,u[m++]=parseInt(t[V],10),b+=1),l&&(c+=1),o&&(r+=1),s+=1,V+=1):(o&&Ft(t,"contains multiple periods"),o=!0,V+=1);if(o&&!s)throw new $(t+" not a valid Decimal128 string");if("e"===t[V]||"E"===t[V]){const e=t.substr(++V).match(Et);if(!e||!e[2])return new Dt(Mt);h=parseInt(e[0],10),V+=e[0].length}if(t[V])return new Dt(Mt);if(b){if(Z=b-1,a=c,1!==a)for(;"0"===t[d+a-1+Number(i)+Number(o)];)a-=1}else u[0]=0,c=1,b=1,a=0;for(h<=r&&r>h+16384?h=vt:h-=r;h>Ht;){if(Z+=1,Z>=34){if(0===a){h=Ht;break}Ft(t,"overflow")}h-=1}if(e.allowRounding){for(;h<vt||b<c;){if(0===Z&&a<b){h=vt,a=0;break}if(b<c?c-=1:Z-=1,h<Ht)h+=1;else{if(u.join("").match(/^0+$/)){h=Ht;break}Ft(t,"overflow")}}if(Z+1<a){let e=s;o&&(d+=1,e+=1),i&&(d+=1,e+=1);const l=parseInt(t[d+Z+1],10);let a=0;if(l>=5&&(a=1,5===l)){a=u[Z]%2==1?1:0;for(let n=d+Z+2;n<e;n++)if(parseInt(t[n],10)){a=1;break}}if(a){let t=Z;for(;t>=0&&++u[t]>9;t--)if(u[t]=0,0===t){if(!(h<Ht))return new Dt(n?jt:Qt);h+=1,u[t]=1}}}}else{for(;h<vt||b<c;){if(0===Z){if(0===a){h=vt;break}Ft(t,"exponent underflow")}b<c?("0"!==t[c-1+Number(i)+Number(o)]&&0!==a&&Ft(t,"inexact rounding"),c-=1):(0!==u[Z]&&Ft(t,"inexact rounding"),Z-=1),h<Ht?h+=1:Ft(t,"overflow")}if(Z+1<a){o&&(d+=1),i&&(d+=1);0!==parseInt(t[d+Z+1],10)&&Ft(t,"inexact rounding")}}if(p=Ct.fromNumber(0),y=Ct.fromNumber(0),0===a)p=Ct.fromNumber(0),y=Ct.fromNumber(0);else if(Z<17){let t=0;for(y=Ct.fromNumber(u[t++]),p=new Ct(0,0);t<=Z;t++)y=y.multiply(Ct.fromNumber(10)),y=y.add(Ct.fromNumber(u[t]))}else{let t=0;for(p=Ct.fromNumber(u[t++]);t<=Z-17;t++)p=p.multiply(Ct.fromNumber(10)),p=p.add(Ct.fromNumber(u[t]));for(y=Ct.fromNumber(u[t++]);t<=Z;t++)y=y.multiply(Ct.fromNumber(10)),y=y.add(Ct.fromNumber(u[t]))}const W=function(t,e){if(!t&&!e)return{high:Ct.fromNumber(0),low:Ct.fromNumber(0)};const n=t.shiftRightUnsigned(32),i=new Ct(t.getLowBits(),0),o=e.shiftRightUnsigned(32),l=new Ct(e.getLowBits(),0);let a=n.multiply(o),s=n.multiply(l);const c=i.multiply(o);let r=i.multiply(l);return a=a.add(s.shiftRightUnsigned(32)),s=new Ct(s.getLowBits(),0).add(c).add(r.shiftRightUnsigned(32)),a=a.add(s.shiftRightUnsigned(32)),r=s.shiftLeft(32).add(new Ct(r.getLowBits(),0)),{high:a,low:r}}(p,Ct.fromString("100000000000000000"));W.low=W.low.add(y),function(t,e){const n=t.high>>>0,i=e.high>>>0;if(n<i)return!0;if(n===i&&t.low>>>0<e.low>>>0)return!0;return!1}(W.low,y)&&(W.high=W.high.add(Ct.fromNumber(1))),G=h+6176;const S={low:Ct.fromNumber(0),high:Ct.fromNumber(0)};W.high.shiftRightUnsigned(49).and(Ct.fromNumber(1)).equals(Ct.fromNumber(1))?(S.high=S.high.or(Ct.fromNumber(3).shiftLeft(61)),S.high=S.high.or(Ct.fromNumber(G).and(Ct.fromNumber(16383).shiftLeft(47))),S.high=S.high.or(W.high.and(Ct.fromNumber(0x7fffffffffff)))):(S.high=S.high.or(Ct.fromNumber(16383&G).shiftLeft(49)),S.high=S.high.or(W.high.and(Ct.fromNumber(562949953421311)))),S.low=W.low,n&&(S.high=S.high.or(Ct.fromString("9223372036854775808")));const I=Zt.allocateUnsafe(16);return V=0,I[V++]=255&S.low.low,I[V++]=S.low.low>>8&255,I[V++]=S.low.low>>16&255,I[V++]=S.low.low>>24&255,I[V++]=255&S.low.high,I[V++]=S.low.high>>8&255,I[V++]=S.low.high>>16&255,I[V++]=S.low.high>>24&255,I[V++]=255&S.high.low,I[V++]=S.high.low>>8&255,I[V++]=S.high.low>>16&255,I[V++]=S.high.low>>24&255,I[V++]=255&S.high.high,I[V++]=S.high.high>>8&255,I[V++]=S.high.high>>16&255,I[V++]=S.high.high>>24&255,new Dt(I)}toString(){let t,e=0;const n=new Array(36);for(let t=0;t<n.length;t++)n[t]=0;let i,o,l,a=0,s=!1,c={parts:[0,0,0,0]};const r=[];a=0;const d=this.bytes,u=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24,b=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24,m=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24,Z=d[a++]|d[a++]<<8|d[a++]<<16|d[a++]<<24;a=0;({low:new Ct(u,b),high:new Ct(m,Z)}).high.lessThan(Ct.ZERO)&&r.push("-");const h=Z>>26&31;if(h>>3==3){if(30===h)return r.join("")+"Infinity";if(31===h)return"NaN";t=Z>>15&16383,i=8+(Z>>14&1)}else i=Z>>14&7,t=Z>>17&16383;const p=t-6176;if(c.parts[0]=(16383&Z)+((15&i)<<14),c.parts[1]=m,c.parts[2]=b,c.parts[3]=u,0===c.parts[0]&&0===c.parts[1]&&0===c.parts[2]&&0===c.parts[3])s=!0;else for(l=3;l>=0;l--){let t=0;const e=_t(c);if(c=e.quotient,t=e.rem.low,t)for(o=8;o>=0;o--)n[9*l+o]=t%10,t=Math.floor(t/10)}if(s)e=1,n[a]=0;else for(e=36;!n[a];)e-=1,a+=1;const y=e-1+p;if(y>=34||y<=-7||p>0){if(e>34)return r.push("0"),p>0?r.push(`E+${p}`):p<0&&r.push(`E${p}`),r.join("");r.push(`${n[a++]}`),e-=1,e&&r.push(".");for(let t=0;t<e;t++)r.push(`${n[a++]}`);r.push("E"),y>0?r.push(`+${y}`):r.push(`${y}`)}else if(p>=0)for(let t=0;t<e;t++)r.push(`${n[a++]}`);else{let t=e+p;if(t>0)for(let e=0;e<t;e++)r.push(`${n[a++]}`);else r.push("0");for(r.push(".");t++<0;)r.push("0");for(let i=0;i<e-Math.max(t-1,0);i++)r.push(`${n[a++]}`)}return r.join("")}toJSON(){return{$numberDecimal:this.toString()}}toExtendedJSON(){return{$numberDecimal:this.toString()}}static fromExtendedJSON(t){return Dt.fromString(t.$numberDecimal)}inspect(t,e,n){n??=V;return`new Decimal128(${n(this.toString(),e)})`}}class At extends pt{get _bsontype(){return"Double"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=+t}static fromString(t){const e=Number(t);if("NaN"===t)return new At(NaN);if("Infinity"===t)return new At(1/0);if("-Infinity"===t)return new At(-1/0);if(!Number.isFinite(e))throw new $(`Input: ${t} is not representable as a Double`);if(t.trim()!==t)throw new $(`Input: '${t}' contains whitespace`);if(""===t)throw new $("Input is an empty string");if(/[^-0-9.+eE]/.test(t))throw new $(`Input: '${t}' is not in decimal or exponential notation`);return new At(e)}valueOf(){return this.value}toJSON(){return this.value}toString(t){return this.value.toString(t)}toExtendedJSON(t){return t&&(t.legacy||t.relaxed&&isFinite(this.value))?this.value:Object.is(Math.sign(this.value),-0)?{$numberDouble:"-0.0"}:{$numberDouble:Number.isInteger(this.value)?this.value.toFixed(1):this.value.toString()}}static fromExtendedJSON(t,e){const n=parseFloat(t.$numberDouble);return e&&e.relaxed?n:new At(n)}inspect(t,e,n){return n??=V,`new Double(${n(this.value,e)})`}}class $t extends pt{get _bsontype(){return"Int32"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=0|+t}static fromString(t){const e=wt(t),n=Number(t);if(g<n)throw new $(`Input: '${t}' is larger than the maximum value for Int32`);if(W>n)throw new $(`Input: '${t}' is smaller than the minimum value for Int32`);if(!Number.isSafeInteger(n))throw new $(`Input: '${t}' is not a safe integer`);if(n.toString()!==e)throw new $(`Input: '${t}' is not a valid Int32 string`);return new $t(n)}valueOf(){return this.value}toString(t){return this.value.toString(t)}toJSON(){return this.value}toExtendedJSON(t){return t&&(t.relaxed||t.legacy)?this.value:{$numberInt:this.value.toString()}}static fromExtendedJSON(t,e){return e&&e.relaxed?parseInt(t.$numberInt,10):new $t(t.$numberInt)}inspect(t,e,n){return n??=V,`new Int32(${n(this.value,e)})`}}class qt extends pt{get _bsontype(){return"MaxKey"}toExtendedJSON(){return{$maxKey:1}}static fromExtendedJSON(){return new qt}inspect(){return"new MaxKey()"}}class te extends pt{get _bsontype(){return"MinKey"}toExtendedJSON(){return{$minKey:1}}static fromExtendedJSON(){return new te}inspect(){return"new MinKey()"}}let ee=null;const ne=new WeakMap;class ie extends pt{get _bsontype(){return"ObjectId"}static index=Math.floor(16777215*Math.random());static cacheHexString;buffer;constructor(t){let e;if(super(),"object"==typeof t&&t&&"id"in t){if("string"!=typeof t.id&&!ArrayBuffer.isView(t.id))throw new $("Argument passed in must have an id that is of type string or Buffer");e="toHexString"in t&&"function"==typeof t.toHexString?Zt.fromHex(t.toHexString()):t.id}else e=t;if(null==e)this.buffer=ie.generate();else if(ArrayBuffer.isView(e)&&12===e.byteLength)this.buffer=Zt.toLocalBufferType(e);else{if("string"!=typeof e)throw new $("Argument passed in does not match the accepted types");if(!ie.validateHexString(e))throw new $("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");this.buffer=Zt.fromHex(e),ie.cacheHexString&&ne.set(this,e)}}get id(){return this.buffer}set id(t){this.buffer=t,ie.cacheHexString&&ne.set(this,Zt.toHex(t))}static validateHexString(t){if(24!==t?.length)return!1;for(let e=0;e<24;e++){const n=t.charCodeAt(e);if(!(n>=48&&n<=57||n>=97&&n<=102||n>=65&&n<=70))return!1}return!0}toHexString(){if(ie.cacheHexString){const t=ne.get(this);if(t)return t}const t=Zt.toHex(this.id);return ie.cacheHexString&&ne.set(this,t),t}static getInc(){return ie.index=(ie.index+1)%16777215}static generate(t){"number"!=typeof t&&(t=Math.floor(Date.now()/1e3));const e=ie.getInc(),n=Zt.allocateUnsafe(12);return Xt.setInt32BE(n,0,t),null===ee&&(ee=Zt.randomBytes(5)),n[4]=ee[0],n[5]=ee[1],n[6]=ee[2],n[7]=ee[3],n[8]=ee[4],n[11]=255&e,n[10]=e>>8&255,n[9]=e>>16&255,n}toString(t){return"base64"===t?Zt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}static is(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"ObjectId"===t._bsontype}equals(t){if(null==t)return!1;if(ie.is(t))return this.buffer[11]===t.buffer[11]&&Zt.equals(this.buffer,t.buffer);if("string"==typeof t)return t.toLowerCase()===this.toHexString();if("object"==typeof t&&"function"==typeof t.toHexString){const e=t.toHexString(),n=this.toHexString();return"string"==typeof e&&e.toLowerCase()===n}return!1}getTimestamp(){const t=new Date,e=Xt.getUint32BE(this.buffer,0);return t.setTime(1e3*Math.floor(e)),t}static createPk(){return new ie}serializeInto(t,e){return t[e]=this.buffer[0],t[e+1]=this.buffer[1],t[e+2]=this.buffer[2],t[e+3]=this.buffer[3],t[e+4]=this.buffer[4],t[e+5]=this.buffer[5],t[e+6]=this.buffer[6],t[e+7]=this.buffer[7],t[e+8]=this.buffer[8],t[e+9]=this.buffer[9],t[e+10]=this.buffer[10],t[e+11]=this.buffer[11],12}static createFromTime(t){const e=Zt.allocate(12);for(let t=11;t>=4;t--)e[t]=0;return Xt.setInt32BE(e,0,t),new ie(e)}static createFromHexString(t){if(24!==t?.length)throw new $("hex string must be 24 characters");return new ie(Zt.fromHex(t))}static createFromBase64(t){if(16!==t?.length)throw new $("base64 string must be 16 characters");return new ie(Zt.fromBase64(t))}static isValid(t){if(null==t)return!1;if("string"==typeof t)return ie.validateHexString(t);try{return new ie(t),!0}catch{return!1}}toExtendedJSON(){return this.toHexString?{$oid:this.toHexString()}:{$oid:this.toString("hex")}}static fromExtendedJSON(t){return new ie(t.$oid)}isCached(){return ie.cacheHexString&&ne.has(this)}inspect(t,e,n){return n??=V,`new ObjectId(${n(this.toHexString(),e)})`}}function oe(t,e,n){let i=5;if(Array.isArray(t))for(let o=0;o<t.length;o++)i+=le(o.toString(),t[o],e,!0,n);else{"function"==typeof t?.toBSON&&(t=t.toBSON());for(const o of Object.keys(t))i+=le(o,t[o],e,!1,n)}return i}function le(t,e,n=!1,i=!1,o=!1){switch("function"==typeof e?.toBSON&&(e=e.toBSON()),typeof e){case"string":return 1+Zt.utf8ByteLength(t)+1+4+Zt.utf8ByteLength(e)+1;case"number":return Math.floor(e)===e&&e>=U&&e<=T&&e>=W&&e<=g?(null!=t?Zt.utf8ByteLength(t)+1:0)+5:(null!=t?Zt.utf8ByteLength(t)+1:0)+9;case"undefined":return i||!o?(null!=t?Zt.utf8ByteLength(t)+1:0)+1:0;case"boolean":return(null!=t?Zt.utf8ByteLength(t)+1:0)+2;case"object":if(null!=e&&"string"==typeof e._bsontype&&e[f]!==X)throw new q;if(null==e||"MinKey"===e._bsontype||"MaxKey"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+1;if("ObjectId"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+13;if(e instanceof Date||G(e))return(null!=t?Zt.utf8ByteLength(t)+1:0)+9;if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer||h(e))return(null!=t?Zt.utf8ByteLength(t)+1:0)+6+e.byteLength;if("Long"===e._bsontype||"Double"===e._bsontype||"Timestamp"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+9;if("Decimal128"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+17;if("Code"===e._bsontype)return null!=e.scope&&Object.keys(e.scope).length>0?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+4+4+Zt.utf8ByteLength(e.code.toString())+1+oe(e.scope,n,o):(null!=t?Zt.utf8ByteLength(t)+1:0)+1+4+Zt.utf8ByteLength(e.code.toString())+1;if("Binary"===e._bsontype){const n=e;return n.sub_type===ft.SUBTYPE_BYTE_ARRAY?(null!=t?Zt.utf8ByteLength(t)+1:0)+(n.position+1+4+1+4):(null!=t?Zt.utf8ByteLength(t)+1:0)+(n.position+1+4+1)}if("Symbol"===e._bsontype)return(null!=t?Zt.utf8ByteLength(t)+1:0)+Zt.utf8ByteLength(e.value)+4+1+1;if("DBRef"===e._bsontype){const i=Object.assign({$ref:e.collection,$id:e.oid},e.fields);return null!=e.db&&(i.$db=e.db),(null!=t?Zt.utf8ByteLength(t)+1:0)+1+oe(i,n,o)}return e instanceof RegExp||p(e)?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+Zt.utf8ByteLength(e.source)+1+(e.global?1:0)+(e.ignoreCase?1:0)+(e.multiline?1:0)+1:"BSONRegExp"===e._bsontype?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+Zt.utf8ByteLength(e.pattern)+1+Zt.utf8ByteLength(e.options)+1:(null!=t?Zt.utf8ByteLength(t)+1:0)+oe(e,n,o)+1;case"function":return n?(null!=t?Zt.utf8ByteLength(t)+1:0)+1+4+Zt.utf8ByteLength(e.toString())+1:0;case"bigint":return(null!=t?Zt.utf8ByteLength(t)+1:0)+9;case"symbol":return 0;default:throw new $("Unrecognized JS type: "+typeof e)}}class ae extends pt{get _bsontype(){return"BSONRegExp"}pattern;options;constructor(t,e){if(super(),this.pattern=t,this.options=(e??"").split("").sort().join(""),-1!==this.pattern.indexOf("\0"))throw new $(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);if(-1!==this.options.indexOf("\0"))throw new $(`BSON Regex options cannot contain null bytes, found: ${JSON.stringify(this.options)}`);for(let t=0;t<this.options.length;t++)if("i"!==this.options[t]&&"m"!==this.options[t]&&"x"!==this.options[t]&&"l"!==this.options[t]&&"s"!==this.options[t]&&"u"!==this.options[t])throw new $(`The regular expression option [${this.options[t]}] is not supported`)}static parseOptions(t){return t?t.split("").sort().join(""):""}toExtendedJSON(t){return(t=t||{}).legacy?{$regex:this.pattern,$options:this.options}:{$regularExpression:{pattern:this.pattern,options:this.options}}}static fromExtendedJSON(t){if("$regex"in t){if("string"==typeof t.$regex)return new ae(t.$regex,ae.parseOptions(t.$options));if("BSONRegExp"===t.$regex._bsontype)return t}if("$regularExpression"in t)return new ae(t.$regularExpression.pattern,ae.parseOptions(t.$regularExpression.options));throw new $(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`)}inspect(t,e,n){const i=function(t){if(null!=t&&"object"==typeof t&&"stylize"in t&&"function"==typeof t.stylize)return t.stylize}(e)??(t=>t);n??=V;return`new BSONRegExp(${i(n(this.pattern),"regexp")}, ${i(n(this.options),"regexp")})`}}class se extends pt{get _bsontype(){return"BSONSymbol"}value;constructor(t){super(),this.value=t}valueOf(){return this.value}toString(){return this.value}toJSON(){return this.value}toExtendedJSON(){return{$symbol:this.value}}static fromExtendedJSON(t){return new se(t.$symbol)}inspect(t,e,n){return n??=V,`new BSONSymbol(${n(this.value,e)})`}}const ce=Ct;class re extends ce{get _bsontype(){return"Timestamp"}get[ht](){return"Timestamp"}static MAX_VALUE=Ct.MAX_UNSIGNED_VALUE;get i(){return this.low>>>0}get t(){return this.high>>>0}constructor(t){if(null==t)super(0,0,!0);else if("bigint"==typeof t)super(t,!0);else if(Ct.isLong(t))super(t.low,t.high,!0);else{if("object"!=typeof t||!("t"in t)||!("i"in t))throw new $("A Timestamp can only be constructed with: bigint, Long, or { t: number; i: number }");{if("number"!=typeof t.t&&("object"!=typeof t.t||"Int32"!==t.t._bsontype))throw new $("Timestamp constructed from { t, i } must provide t as a number");if("number"!=typeof t.i&&("object"!=typeof t.i||"Int32"!==t.i._bsontype))throw new $("Timestamp constructed from { t, i } must provide i as a number");const e=Number(t.t),n=Number(t.i);if(e<0||Number.isNaN(e))throw new $("Timestamp constructed from { t, i } must provide a positive t");if(n<0||Number.isNaN(n))throw new $("Timestamp constructed from { t, i } must provide a positive i");if(e>4294967295)throw new $("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");if(n>4294967295)throw new $("Timestamp constructed from { t, i } must provide i equal or less than uint32 max");super(n,e,!0)}}}toJSON(){return{$timestamp:this.toString()}}static fromInt(t){return new re(Ct.fromInt(t,!0))}static fromNumber(t){return new re(Ct.fromNumber(t,!0))}static fromBits(t,e){return new re({i:t,t:e})}static fromString(t,e){return new re(Ct.fromString(t,!0,e))}toExtendedJSON(){return{$timestamp:{t:this.t,i:this.i}}}static fromExtendedJSON(t){const e=Ct.isLong(t.$timestamp.i)?t.$timestamp.i.getLowBitsUnsigned():t.$timestamp.i,n=Ct.isLong(t.$timestamp.t)?t.$timestamp.t.getLowBitsUnsigned():t.$timestamp.t;return new re({t:n,i:e})}inspect(t,e,n){n??=V;return`new Timestamp({ t: ${n(this.t,e)}, i: ${n(this.i,e)} })`}}const de=Ct.fromNumber(T),ue=Ct.fromNumber(U);function be(t,e,n){const i=(e=null==e?{}:e)&&e.index?e.index:0,o=Xt.getInt32LE(t,i);if(o<5)throw new $(`bson size must be >= 5, is ${o}`);if(e.allowObjectSmallerThanBufferSize&&t.length<o)throw new $(`buffer length ${t.length} must be >= bson size ${o}`);if(!e.allowObjectSmallerThanBufferSize&&t.length!==o)throw new $(`buffer length ${t.length} must === bson size ${o}`);if(o+i>t.byteLength)throw new $(`(bson size ${o} + options.index ${i} must be <= buffer length ${t.byteLength})`);if(0!==t[i+o-1])throw new $("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return Ze(t,i,e,n)}const me=/^\$ref$|^\$id$|^\$db$/;function Ze(t,e,n,i=!1){const o=null==n.fieldsAsRaw?null:n.fieldsAsRaw,l=null!=n.raw&&n.raw,a="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,s=n.promoteBuffers??!1,c=n.promoteLongs??!0,r=n.promoteValues??!0,d=n.useBigInt64??!1;if(d&&!r)throw new $("Must either request bigint or Long for int64 deserialization");if(d&&!c)throw new $("Must either request bigint or Long for int64 deserialization");let u,b,m=!0;const Z=(null==n.validation?{utf8:!0}:n.validation).utf8;if("boolean"==typeof Z)u=Z;else{m=!1;const t=Object.keys(Z).map((function(t){return Z[t]}));if(0===t.length)throw new $("UTF-8 validation setting cannot be empty");if("boolean"!=typeof t[0])throw new $("Invalid UTF-8 validation option, must specify boolean values");if(u=t[0],!t.every((t=>t===u)))throw new $("Invalid UTF-8 validation option - keys must be all true or all false")}if(!m){b=new Set;for(const t of Object.keys(Z))b.add(t)}const h=e;if(t.length<5)throw new $("corrupt bson message < 5 bytes long");const p=Xt.getInt32LE(t,e);if(e+=4,p<5||p>t.length)throw new $("corrupt bson message");const y=i?[]:{};let G=0,V=!i&&null;for(;;){const Z=t[e++];if(0===Z)break;let h=e;for(;0!==t[h]&&h<t.length;)h++;if(h>=t.byteLength)throw new $("Bad BSON Document: illegal CString");const p=i?G++:Zt.toUTF8(t,e,h,!1);let X,f=!0;if(f=m||b?.has(p)?u:!u,!1!==V&&"$"===p[0]&&(V=me.test(p)),e=h+1,Z===w){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");X=Zt.toUTF8(t,e,e+n-1,f),e+=n}else if(Z===L){const n=Zt.allocateUnsafe(12);for(let i=0;i<12;i++)n[i]=t[e+i];X=new ie(n),e+=12}else if(Z===M&&!1===r)X=new $t(Xt.getInt32LE(t,e)),e+=4;else if(Z===M)X=Xt.getInt32LE(t,e),e+=4;else if(Z===K)X=Xt.getFloat64LE(t,e),e+=8,!1===r&&(X=new At(X));else if(Z===x){const n=Xt.getInt32LE(t,e),i=Xt.getInt32LE(t,e+4);e+=8,X=new Date(new Ct(n,i).toNumber())}else if(Z===z){if(0!==t[e]&&1!==t[e])throw new $("illegal boolean type value");X=1===t[e++]}else if(Z===R){const i=e,o=Xt.getInt32LE(t,e);if(o<=0||o>t.length-e)throw new $("bad embedded document length in bson");if(l)X=t.subarray(e,e+o);else{let e=n;m||(e={...n,validation:{utf8:f}}),X=Ze(t,i,e,!1)}e+=o}else if(Z===J){const i=e,l=Xt.getInt32LE(t,e);let a=n;const s=e+l;if(o&&o[p]&&(a={...n,raw:!0}),m||(a={...a,validation:{utf8:f}}),X=Ze(t,i,a,!0),0!==t[(e+=l)-1])throw new $("invalid array terminator byte");if(e!==s)throw new $("corrupted array bson")}else if(Z===Y)X=void 0;else if(Z===C)X=null;else if(Z===Q)if(d)X=Xt.getBigInt64LE(t,e),e+=8;else{const n=Xt.getInt32LE(t,e),i=Xt.getInt32LE(t,e+4);e+=8;const o=new Ct(n,i);X=c&&!0===r&&o.lessThanOrEqual(de)&&o.greaterThanOrEqual(ue)?o.toNumber():o}else if(Z===E){const n=Zt.allocateUnsafe(16);for(let i=0;i<16;i++)n[i]=t[e+i];e+=16,X=new Dt(n)}else if(Z===N){let n=Xt.getInt32LE(t,e);e+=4;const i=n,o=t[e++];if(n<0)throw new $("Negative binary type element size found");if(n>t.byteLength)throw new $("Binary type size larger than document size");if(o===ft.SUBTYPE_BYTE_ARRAY){if(n=Xt.getInt32LE(t,e),e+=4,n<0)throw new $("Negative binary type element size found for subtype 0x02");if(n>i-4)throw new $("Binary type with subtype 0x02 contains too long binary size");if(n<i-4)throw new $("Binary type with subtype 0x02 contains too short binary size")}s&&r?X=Zt.toLocalBufferType(t.subarray(e,e+n)):(X=new ft(t.subarray(e,e+n),o),o===D&&It.isValid(X)&&(X=X.toUUID())),e+=n}else if(Z===k&&!1===a){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const n=Zt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const i=Zt.toUTF8(t,e,h,!1);e=h+1;const o=new Array(i.length);for(h=0;h<i.length;h++)switch(i[h]){case"m":o[h]="m";break;case"s":o[h]="g";break;case"i":o[h]="i"}X=new RegExp(n,o.join(""))}else if(Z===k&&!0===a){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const n=Zt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new $("Bad BSON Document: illegal CString");const i=Zt.toUTF8(t,e,h,!1);e=h+1,X=new ae(n,i)}else if(Z===H){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");const i=Zt.toUTF8(t,e,e+n-1,f);X=r?i:new se(i),e+=n}else if(Z===j)X=new re({i:Xt.getUint32LE(t,e),t:Xt.getUint32LE(t,e+4)}),e+=8;else if(Z===O)X=new te;else if(Z===_)X=new qt;else if(Z===P){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");const i=Zt.toUTF8(t,e,e+n-1,f);X=new Tt(i),e+=n}else if(Z===v){const i=Xt.getInt32LE(t,e);if(e+=4,i<13)throw new $("code_w_scope total size shorter minimum expected length");const o=Xt.getInt32LE(t,e);if(e+=4,o<=0||o>t.length-e||0!==t[e+o-1])throw new $("bad string length in bson");const l=Zt.toUTF8(t,e,e+o-1,f),a=e+=o,s=Xt.getInt32LE(t,e),c=Ze(t,a,n,!1);if(e+=s,i<8+s+o)throw new $("code_w_scope total size is too short, truncating scope");if(i>8+s+o)throw new $("code_w_scope total size is too long, clips outer document");X=new Tt(l,c)}else{if(Z!==B)throw new $(`Detected unknown BSON type ${Z.toString(16)} for fieldname "${p}"`);{const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new $("bad string length in bson");const i=Zt.toUTF8(t,e,e+n-1,f);e+=n;const o=Zt.allocateUnsafe(12);for(let n=0;n<12;n++)o[n]=t[e+n];const l=new ie(o);e+=12,X=new Kt(i,l)}}"__proto__"===p?Object.defineProperty(y,p,{value:X,writable:!0,enumerable:!0,configurable:!0}):y[p]=X}if(p!==e-h){if(i)throw new $("corrupt array bson");throw new $("corrupt object bson")}if(!V)return y;if(Ut(y)){const t=Object.assign({},y);return delete t.$ref,delete t.$id,delete t.$db,new Kt(y.$ref,y.$id,y.$db,t)}return y}const he=/\x00/,pe=new Set(["$db","$ref","$id","$clusterTime"]);function ye(t,e,n,i){t[i++]=w;t[(i=i+Zt.encodeUTF8Into(t,e,i)+1)-1]=0;const o=Zt.encodeUTF8Into(t,n,i+4);return Xt.setInt32LE(t,i,o+1),i=i+4+o,t[i++]=0,i}function Ge(t,e,n,i){const o=!Object.is(n,-0)&&Number.isSafeInteger(n)&&n<=g&&n>=W?M:K;t[i++]=o;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=o===M?Xt.setInt32LE(t,i,n):Xt.setFloat64LE(t,i,n)}function Ve(t,e,n,i){t[i++]=Q;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setBigInt64LE(t,i,n)}function Xe(t,e,n,i){t[i++]=C;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i}function fe(t,e,n,i){t[i++]=z;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,t[i++]=n?1:0,i}function ge(t,e,n,i){t[i++]=x;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=Ct.fromNumber(n.getTime()),l=o.getLowBits(),a=o.getHighBits();return i+=Xt.setInt32LE(t,i,l),i+=Xt.setInt32LE(t,i,a)}function We(t,e,n,i){t[i++]=k;if(i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,n.source&&null!=n.source.match(he))throw new $("value "+n.source+" must not contain null bytes");return i+=Zt.encodeUTF8Into(t,n.source,i),t[i++]=0,n.ignoreCase&&(t[i++]=105),n.global&&(t[i++]=115),n.multiline&&(t[i++]=109),t[i++]=0,i}function Se(t,e,n,i){t[i++]=k;if(i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,null!=n.pattern.match(he))throw new $("pattern "+n.pattern+" must not contain null bytes");i+=Zt.encodeUTF8Into(t,n.pattern,i),t[i++]=0;const o=n.options.split("").sort().join("");return i+=Zt.encodeUTF8Into(t,o,i),t[i++]=0,i}function Ie(t,e,n,i){null===n?t[i++]=C:"MinKey"===n._bsontype?t[i++]=O:t[i++]=_;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i}function Te(t,e,n,i){t[i++]=L;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=n.serializeInto(t,i)}function Ue(t,e,n,i){t[i++]=N;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.length;if(i+=Xt.setInt32LE(t,i,o),t[i++]=F,o<=16)for(let e=0;e<o;e++)t[i+e]=n[e];else t.set(n,i);return i+=o}function Ke(t,e,n,i,o,l,a,s,c){if(c.has(n))throw new $("Cannot convert circular structure to BSON");c.add(n),t[i++]=Array.isArray(n)?J:R;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const r=ke(t,n,o,i,l+1,a,s,c);return c.delete(n),r}function we(t,e,n,i){t[i++]=E;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;for(let e=0;e<16;e++)t[i+e]=n.bytes[e];return i+16}function Re(t,e,n,i){t[i++]="Long"===n._bsontype?Q:j;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.getLowBits(),l=n.getHighBits();return i+=Xt.setInt32LE(t,i,o),i+=Xt.setInt32LE(t,i,l)}function Je(t,e,n,i){n=n.valueOf(),t[i++]=M;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setInt32LE(t,i,n)}function Ne(t,e,n,i){t[i++]=K;return i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setFloat64LE(t,i,n.value)}function Ye(t,e,n,i){t[i++]=P;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.toString(),l=Zt.encodeUTF8Into(t,o,i+4)+1;return Xt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0,i}function Le(t,e,n,i,o=!1,l=0,a=!1,s=!0,c){if(n.scope&&"object"==typeof n.scope){t[i++]=v;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;let r=i;const d=n.code;i+=4;const u=Zt.encodeUTF8Into(t,d,i+4)+1;Xt.setInt32LE(t,i,u),t[i+4+u-1]=0,i=i+u+4;const b=ke(t,n.scope,o,i,l+1,a,s,c);i=b-1;const m=b-r;r+=Xt.setInt32LE(t,r,m),t[i++]=0}else{t[i++]=P;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.code.toString(),l=Zt.encodeUTF8Into(t,o,i+4)+1;Xt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0}return i}function ze(t,e,n,i){t[i++]=N;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=n.buffer;let l=n.position;if(n.sub_type===ft.SUBTYPE_BYTE_ARRAY&&(l+=4),i+=Xt.setInt32LE(t,i,l),t[i++]=n.sub_type,n.sub_type===ft.SUBTYPE_BYTE_ARRAY&&(l-=4,i+=Xt.setInt32LE(t,i,l)),n.sub_type===ft.SUBTYPE_VECTOR&>(n),l<=16)for(let e=0;e<l;e++)t[i+e]=o[e];else t.set(o,i);return i+=n.position}function xe(t,e,n,i){t[i++]=H;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;const o=Zt.encodeUTF8Into(t,n.value,i+4)+1;return Xt.setInt32LE(t,i,o),i=i+4+o-1,t[i++]=0,i}function Ce(t,e,n,i,o,l,a){t[i++]=R;i+=Zt.encodeUTF8Into(t,e,i),t[i++]=0;let s=i,c={$ref:n.collection||n.namespace,$id:n.oid};null!=n.db&&(c.$db=n.db),c=Object.assign(c,n.fields);const r=ke(t,c,!1,i,o+1,l,!0,a),d=r-s;return s+=Xt.setInt32LE(t,i,d),r}function ke(t,e,n,i,o,l,a,s){if(null==s){if(null==e)return t[0]=5,t[1]=0,t[2]=0,t[3]=0,t[4]=0,5;if(Array.isArray(e))throw new $("serialize does not support an array as the root input");if("object"!=typeof e)throw new $("serialize does not support non-object as the root input");if("_bsontype"in e&&"string"==typeof e._bsontype)throw new $("BSON types cannot be serialized as a document");if(G(e)||p(e)||Z(e)||h(e))throw new $("date, regexp, typedarray, and arraybuffer cannot be BSON documents");s=new Set}s.add(e);let c=i+4;if(Array.isArray(e))for(let i=0;i<e.length;i++){const r=`${i}`;let d=e[i];"function"==typeof d?.toBSON&&(d=d.toBSON());const u=typeof d;if(void 0===d)c=Xe(t,r,0,c);else if(null===d)c=Xe(t,r,0,c);else if("string"===u)c=ye(t,r,d,c);else if("number"===u)c=Ge(t,r,d,c);else if("bigint"===u)c=Ve(t,r,d,c);else if("boolean"===u)c=fe(t,r,d,c);else if("object"===u&&null==d._bsontype)c=d instanceof Date||G(d)?ge(t,r,d,c):d instanceof Uint8Array||Z(d)?Ue(t,r,d,c):d instanceof RegExp||p(d)?We(t,r,d,c):Ke(t,r,d,c,n,o,l,a,s);else if("object"===u){if(d[f]!==X)throw new q;if("ObjectId"===d._bsontype)c=Te(t,r,d,c);else if("Decimal128"===d._bsontype)c=we(t,r,d,c);else if("Long"===d._bsontype||"Timestamp"===d._bsontype)c=Re(t,r,d,c);else if("Double"===d._bsontype)c=Ne(t,r,d,c);else if("Code"===d._bsontype)c=Le(t,r,d,c,n,o,l,a,s);else if("Binary"===d._bsontype)c=ze(t,r,d,c);else if("BSONSymbol"===d._bsontype)c=xe(t,r,d,c);else if("DBRef"===d._bsontype)c=Ce(t,r,d,c,o,l,s);else if("BSONRegExp"===d._bsontype)c=Se(t,r,d,c);else if("Int32"===d._bsontype)c=Je(t,r,d,c);else if("MinKey"===d._bsontype||"MaxKey"===d._bsontype)c=Ie(t,r,d,c);else if(void 0!==d._bsontype)throw new $(`Unrecognized or invalid _bsontype: ${String(d._bsontype)}`)}else"function"===u&&l&&(c=Ye(t,r,d,c))}else if(e instanceof Map||y(e)){const i=e.entries();let r=!1;for(;!r;){const e=i.next();if(r=!!e.done,r)continue;const d=e.value?e.value[0]:void 0;let u=e.value?e.value[1]:void 0;"function"==typeof u?.toBSON&&(u=u.toBSON());const b=typeof u;if("string"==typeof d&&!pe.has(d)){if(null!=d.match(he))throw new $("key "+d+" must not contain null bytes");if(n){if("$"===d[0])throw new $("key "+d+" must not start with '$'");if(d.includes("."))throw new $("key "+d+" must not contain '.'")}}if(void 0===u)!1===a&&(c=Xe(t,d,0,c));else if(null===u)c=Xe(t,d,0,c);else if("string"===b)c=ye(t,d,u,c);else if("number"===b)c=Ge(t,d,u,c);else if("bigint"===b)c=Ve(t,d,u,c);else if("boolean"===b)c=fe(t,d,u,c);else if("object"===b&&null==u._bsontype)c=u instanceof Date||G(u)?ge(t,d,u,c):u instanceof Uint8Array||Z(u)?Ue(t,d,u,c):u instanceof RegExp||p(u)?We(t,d,u,c):Ke(t,d,u,c,n,o,l,a,s);else if("object"===b){if(u[f]!==X)throw new q;if("ObjectId"===u._bsontype)c=Te(t,d,u,c);else if("Decimal128"===u._bsontype)c=we(t,d,u,c);else if("Long"===u._bsontype||"Timestamp"===u._bsontype)c=Re(t,d,u,c);else if("Double"===u._bsontype)c=Ne(t,d,u,c);else if("Code"===u._bsontype)c=Le(t,d,u,c,n,o,l,a,s);else if("Binary"===u._bsontype)c=ze(t,d,u,c);else if("BSONSymbol"===u._bsontype)c=xe(t,d,u,c);else if("DBRef"===u._bsontype)c=Ce(t,d,u,c,o,l,s);else if("BSONRegExp"===u._bsontype)c=Se(t,d,u,c);else if("Int32"===u._bsontype)c=Je(t,d,u,c);else if("MinKey"===u._bsontype||"MaxKey"===u._bsontype)c=Ie(t,d,u,c);else if(void 0!==u._bsontype)throw new $(`Unrecognized or invalid _bsontype: ${String(u._bsontype)}`)}else"function"===b&&l&&(c=Ye(t,d,u,c))}}else{if("function"==typeof e?.toBSON&&null!=(e=e.toBSON())&&"object"!=typeof e)throw new $("toBSON function did not return an object");for(const i of Object.keys(e)){let r=e[i];"function"==typeof r?.toBSON&&(r=r.toBSON());const d=typeof r;if("string"==typeof i&&!pe.has(i)){if(null!=i.match(he))throw new $("key "+i+" must not contain null bytes");if(n){if("$"===i[0])throw new $("key "+i+" must not start with '$'");if(i.includes("."))throw new $("key "+i+" must not contain '.'")}}if(void 0===r)!1===a&&(c=Xe(t,i,0,c));else if(null===r)c=Xe(t,i,0,c);else if("string"===d)c=ye(t,i,r,c);else if("number"===d)c=Ge(t,i,r,c);else if("bigint"===d)c=Ve(t,i,r,c);else if("boolean"===d)c=fe(t,i,r,c);else if("object"===d&&null==r._bsontype)c=r instanceof Date||G(r)?ge(t,i,r,c):r instanceof Uint8Array||Z(r)?Ue(t,i,r,c):r instanceof RegExp||p(r)?We(t,i,r,c):Ke(t,i,r,c,n,o,l,a,s);else if("object"===d){if(r[f]!==X)throw new q;if("ObjectId"===r._bsontype)c=Te(t,i,r,c);else if("Decimal128"===r._bsontype)c=we(t,i,r,c);else if("Long"===r._bsontype||"Timestamp"===r._bsontype)c=Re(t,i,r,c);else if("Double"===r._bsontype)c=Ne(t,i,r,c);else if("Code"===r._bsontype)c=Le(t,i,r,c,n,o,l,a,s);else if("Binary"===r._bsontype)c=ze(t,i,r,c);else if("BSONSymbol"===r._bsontype)c=xe(t,i,r,c);else if("DBRef"===r._bsontype)c=Ce(t,i,r,c,o,l,s);else if("BSONRegExp"===r._bsontype)c=Se(t,i,r,c);else if("Int32"===r._bsontype)c=Je(t,i,r,c);else if("MinKey"===r._bsontype||"MaxKey"===r._bsontype)c=Ie(t,i,r,c);else if(void 0!==r._bsontype)throw new $(`Unrecognized or invalid _bsontype: ${String(r._bsontype)}`)}else"function"===d&&l&&(c=Ye(t,i,r,c))}}s.delete(e),t[c++]=0;const r=c-i;return i+=Xt.setInt32LE(t,i,r),c}const Be={$oid:ie,$binary:ft,$uuid:ft,$symbol:se,$numberInt:$t,$numberDecimal:Dt,$numberDouble:At,$numberLong:Ct,$minKey:te,$maxKey:qt,$regex:ae,$regularExpression:ae,$timestamp:re};function Pe(t,e={}){if("number"==typeof t){const n=t<=g&&t>=W,i=t<=S&&t>=I;if(e.relaxed||e.legacy)return t;if(Number.isInteger(t)&&!Object.is(t,-0)){if(n)return new $t(t);if(i)return e.useBigInt64?BigInt(t):Ct.fromNumber(t)}return new At(t)}if(null==t||"object"!=typeof t)return t;if(t.$undefined)return null;const n=Object.keys(t).filter((e=>e.startsWith("$")&&null!=t[e]));for(let i=0;i<n.length;i++){const o=Be[n[i]];if(o)return o.fromExtendedJSON(t,e)}if(null!=t.$date){const n=t.$date,i=new Date;if(e.legacy)if("number"==typeof n)i.setTime(n);else if("string"==typeof n)i.setTime(Date.parse(n));else{if("bigint"!=typeof n)throw new tt("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}else if("string"==typeof n)i.setTime(Date.parse(n));else if(Ct.isLong(n))i.setTime(n.toNumber());else if("number"==typeof n&&e.relaxed)i.setTime(n);else{if("bigint"!=typeof n)throw new tt("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}return i}if(null!=t.$code){const e=Object.assign({},t);return t.$scope&&(e.$scope=Pe(t.$scope)),Tt.fromExtendedJSON(t)}if(Ut(t)||t.$dbPointer){const e=t.$ref?t:t.$dbPointer;if(e instanceof Kt)return e;const n=Object.keys(e).filter((t=>t.startsWith("$")));let i=!0;if(n.forEach((t=>{-1===["$ref","$id","$db"].indexOf(t)&&(i=!1)})),i)return Kt.fromExtendedJSON(e)}return t}function He(t){const e=t.toISOString();return 0!==t.getUTCMilliseconds()?e:e.slice(0,-5)+"Z"}function ve(t,e){if(t instanceof Map||y(t)){const n=Object.create(null);for(const[e,i]of t){if("string"!=typeof e)throw new $("Can only serialize maps with string keys");n[e]=i}return ve(n,e)}if(("object"==typeof t||"function"==typeof t)&&null!==t){const n=e.seenObjects.findIndex((e=>e.obj===t));if(-1!==n){const t=e.seenObjects.map((t=>t.propertyName)),i=t.slice(0,n).map((t=>`${t} -> `)).join(""),o=t[n],l=" -> "+t.slice(n+1,t.length-1).map((t=>`${t} -> `)).join(""),a=t[t.length-1],s=" ".repeat(i.length+o.length/2),c="-".repeat(l.length+(o.length+a.length)/2-1);throw new $(`Converting circular structure to EJSON:\n ${i}${o}${l}${a}\n ${s}\\${c}/`)}e.seenObjects[e.seenObjects.length-1].obj=t}if(Array.isArray(t))return function(t,e){return t.map(((t,n)=>{e.seenObjects.push({propertyName:`index ${n}`,obj:null});try{return ve(t,e)}finally{e.seenObjects.pop()}}))}(t,e);if(void 0===t)return e.ignoreUndefined?void 0:null;if(t instanceof Date||G(t)){const n=t.getTime(),i=n>-1&&n<2534023188e5;return e.legacy?e.relaxed&&i?{$date:t.getTime()}:{$date:He(t)}:e.relaxed&&i?{$date:He(t)}:{$date:{$numberLong:t.getTime().toString()}}}if(!("number"!=typeof t||e.relaxed&&isFinite(t))){if(Number.isInteger(t)&&!Object.is(t,-0)){if(t>=W&&t<=g)return{$numberInt:t.toString()};if(t>=I&&t<=S)return{$numberLong:t.toString()}}return{$numberDouble:Object.is(t,-0)?"-0.0":t.toString()}}if("bigint"==typeof t)return e.relaxed?Number(BigInt.asIntN(64,t)):{$numberLong:BigInt.asIntN(64,t).toString()};if(t instanceof RegExp||p(t)){let n=t.flags;if(void 0===n){const e=t.toString().match(/[gimuy]*$/);e&&(n=e[0])}return new ae(t.source,n).toExtendedJSON(e)}return null!=t&&"object"==typeof t?function(t,e){if(null==t||"object"!=typeof t)throw new $("not an object instance");const n=t._bsontype;if(void 0===n){const n={};for(const i of Object.keys(t)){e.seenObjects.push({propertyName:i,obj:null});try{const o=ve(t[i],e);"__proto__"===i?Object.defineProperty(n,i,{value:o,writable:!0,enumerable:!0,configurable:!0}):n[i]=o}finally{e.seenObjects.pop()}}return n}if(null!=t&&"object"==typeof t&&"string"==typeof t._bsontype&&t[f]!==X)throw new q;if(function(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"string"==typeof t._bsontype}(t)){let i=t;if("function"!=typeof i.toExtendedJSON){const e=Me[t._bsontype];if(!e)throw new $("Unrecognized or invalid _bsontype: "+t._bsontype);i=e(i)}return"Code"===n&&i.scope?i=new Tt(i.code,ve(i.scope,e)):"DBRef"===n&&i.oid&&(i=new Kt(ve(i.collection,e),ve(i.oid,e),ve(i.db,e),ve(i.fields,e))),i.toExtendedJSON(e)}throw new $("_bsontype must be a string, but was: "+typeof n)}(t,e):t}const Me={Binary:t=>new ft(t.value(),t.sub_type),Code:t=>new Tt(t.code,t.scope),DBRef:t=>new Kt(t.collection||t.namespace,t.oid,t.db,t.fields),Decimal128:t=>new Dt(t.bytes),Double:t=>new At(t.value),Int32:t=>new $t(t.value),Long:t=>Ct.fromBits(null!=t.low?t.low:t.low_,null!=t.low?t.high:t.high_,null!=t.low?t.unsigned:t.unsigned_),MaxKey:()=>new qt,MinKey:()=>new te,ObjectId:t=>new ie(t),BSONRegExp:t=>new ae(t.pattern,t.options),BSONSymbol:t=>new se(t.value),Timestamp:t=>re.fromBits(t.low,t.high)};function je(t,e){const n={useBigInt64:e?.useBigInt64??!1,relaxed:e?.relaxed??!0,legacy:e?.legacy??!1};return JSON.parse(t,((t,e)=>{if(-1!==t.indexOf("\0"))throw new $(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t)}`);return Pe(e,n)}))}function Qe(t,e,n,i){null!=n&&"object"==typeof n&&(i=n,n=0),null==e||"object"!=typeof e||Array.isArray(e)||(i=e,e=void 0,n=0);const o=ve(t,Object.assign({relaxed:!0,legacy:!1},i,{seenObjects:[{propertyName:"(root)",obj:null}]}));return JSON.stringify(o,e,n)}const Ee=Object.create(null);Ee.parse=je,Ee.stringify=Qe,Ee.serialize=function(t,e){return e=e||{},JSON.parse(Qe(t,e))},Ee.deserialize=function(t,e){return e=e||{},je(JSON.stringify(t),e)},Object.freeze(Ee);const Oe=1,_e=2,Fe=3,De=4,Ae=5,$e=6,qe=7,tn=8,en=9,nn=10,on=11,ln=12,an=13,sn=14,cn=15,rn=16,dn=17,un=18,bn=19,mn=255,Zn=127;function hn(t,e){try{return Xt.getNonnegativeInt32LE(t,e)}catch(t){throw new et("BSON size cannot be negative",e,{cause:t})}}function pn(t,e){let n=e;for(;0!==t[n];n++);if(n===t.length-1)throw new et("Null terminator not found",e);return n}const yn=Object.create(null);yn.parseToElements=function(t,e=0){if(e??=0,t.length<5)throw new et(`Input must be at least 5 bytes, got ${t.length} bytes`,e);const n=hn(t,e);if(n>t.length-e)throw new et(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`,e);if(0!==t[e+n-1])throw new et("BSON documents must end in 0x00",e+n);const i=[];let o=e+4;for(;o<=n+e;){const l=t[o];if(o+=1,0===l){if(o-e!==n)throw new et("Invalid 0x00 type byte",o);break}const a=o,s=pn(t,o)-a;let c;if(o+=s+1,l===Oe||l===un||l===en||l===dn)c=8;else if(l===rn)c=4;else if(l===qe)c=12;else if(l===bn)c=16;else if(l===tn)c=1;else if(l===nn||l===$e||l===Zn||l===mn)c=0;else if(l===on)c=pn(t,pn(t,o)+1)+1-o;else if(l===Fe||l===De||l===cn)c=hn(t,o);else{if(l!==_e&&l!==Ae&&l!==ln&&l!==an&&l!==sn)throw new et(`Invalid 0x${l.toString(16).padStart(2,"0")} type byte`,o);c=hn(t,o)+4,l===Ae&&(c+=1),l===ln&&(c+=12)}if(c>n)throw new et("value reports length larger than document",o);i.push([l,a,s,o,c]),o+=c}return i},yn.ByteUtils=Zt,yn.NumberUtils=Xt,Object.freeze(yn);const Gn=17825792;let Vn=Zt.allocate(Gn);var Xn=Object.freeze({__proto__:null,BSONError:$,BSONOffsetError:et,BSONRegExp:ae,BSONRuntimeError:tt,BSONSymbol:se,BSONType:A,BSONValue:pt,BSONVersionError:q,Binary:ft,ByteUtils:Zt,Code:Tt,DBRef:Kt,Decimal128:Dt,Double:At,EJSON:Ee,Int32:$t,Long:Ct,MaxKey:qt,MinKey:te,NumberUtils:Xt,ObjectId:ie,Timestamp:re,UUID:It,bsonType:ht,calculateObjectSize:function(t,e={}){return oe(t,"boolean"==typeof(e=e||{}).serializeFunctions&&e.serializeFunctions,"boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined)},deserialize:function(t,e={}){return be(Zt.toLocalBufferType(t),e)},deserializeStream:function(t,e,n,i,o,l){const a=Object.assign({allowObjectSmallerThanBufferSize:!0,index:0},l),s=Zt.toLocalBufferType(t);let c=e;for(let t=0;t<n;t++){const e=Xt.getInt32LE(s,c);a.index=c,i[o+t]=be(s,a),c+=e}return c},onDemand:yn,serialize:function(t,e={}){const n="boolean"==typeof e.checkKeys&&e.checkKeys,i="boolean"==typeof e.serializeFunctions&&e.serializeFunctions,o="boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined,l="number"==typeof e.minInternalBufferSize?e.minInternalBufferSize:Gn;Vn.length<l&&(Vn=Zt.allocate(l));const a=ke(Vn,t,n,0,0,i,o,null),s=Zt.allocateUnsafe(a);return s.set(Vn.subarray(0,a),0),s},serializeWithBufferAndIndex:function(t,e,n={}){const i="boolean"==typeof n.checkKeys&&n.checkKeys,o="boolean"==typeof n.serializeFunctions&&n.serializeFunctions,l="boolean"!=typeof n.ignoreUndefined||n.ignoreUndefined,a="number"==typeof n.index?n.index:0,s=ke(Vn,t,i,0,0,o,l,null);return e.set(Vn.subarray(0,s),a),a+s-1},setInternalBufferSize:function(t){Vn.length<t&&(Vn=Zt.allocate(t))}});function fn(t){return!!t&&"object"==typeof t&&"buffer"in t&&t.buffer instanceof ArrayBuffer&&"number"==typeof t.byteOffset&&"number"==typeof t.byteLength}async function gn({client:t,limit:n,page_token:i,sort_by:l}){const a="/ml/conversations"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Wn({client:t,limit:n,page_token:i,sort_by:l}){const a="/ml-prompts"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Sn({client:t,limit:n,page_token:i,sort_by:l,no_models:a,no_parts:s,conversation_id:c}){const r="/user/text-to-cad"+e({limit:n,page_token:i,sort_by:l,no_models:a,no_parts:s,conversation_id:c}),d=(t?.baseUrl||"https://api.zoo.dev")+r,u=t&&t.token||"",b={};u&&(b.Authorization=`Bearer ${u}`);const m={method:"GET",headers:b},Z=t?.fetch||fetch,h=await Z(d,m);await o(h);return await h.json()}class In{constructor(){}static urlConstructFrom(t){const n="/ws/modeling/commands"+e({video_res_width:t.video_res_width,video_res_height:t.video_res_height,fps:t.fps,unlocked_framerate:t.unlocked_framerate,post_effect:t.post_effect,webrtc:t.webrtc,pool:t.pool,show_grid:t.show_grid,replay:t.replay,api_call_id:t.api_call_id,order_independent_transparency:t.order_independent_transparency,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}}async function Tn({client:t,id:n,limit:i,page_token:l,sort_by:a}){const s=`/orgs/${n}/oauth2/apps`+e({limit:i,page_token:l,sort_by:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function Un({client:t,id:n,limit:i,page_token:l,sort_by:a}){const s=`/users/${n}/oauth2/apps`+e({limit:i,page_token:l,sort_by:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function Kn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/oauth2/apps"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function wn({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/oauth2/apps"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Rn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/shortlinks"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Jn({client:t,id:n,limit:i,page_token:l,sort_by:a,filter:s}){const c=`/org/datasets/${n}/conversions`+e({limit:i,page_token:l,sort_by:a,filter:s}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`);const b={method:"GET",headers:u},m=t?.fetch||fetch,Z=await m(r,b);await o(Z);return await Z.json()}async function Nn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/datasets"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Yn({client:t,limit:n,page_token:i,sort_by:l,role:a}){const s="/org/members"+e({limit:n,page_token:i,sort_by:l,role:a}),c=(t?.baseUrl||"https://api.zoo.dev")+s,r=t&&t.token||"",d={};r&&(d.Authorization=`Bearer ${r}`);const u={method:"GET",headers:d},b=t?.fetch||fetch,m=await b(c,u);await o(m);return await m.json()}async function Ln({client:t,limit:n,page_token:i,sort_by:l}){const a="/orgs"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function zn({client:t,id:n,limit:i,page_token:l,q:a,sort_by:s}){const c=`/org/datasets/${n}/search/conversions`+e({limit:i,page_token:l,q:a,sort_by:s}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`);const b={method:"GET",headers:u},m=t?.fetch||fetch,Z=await m(r,b);await o(Z);return await Z.json()}async function xn({client:t,limit:n,page_token:i,sort_by:l}){const a="/org/service-accounts"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Cn({client:t,limit:n,page_token:i,sort_by:l}){const a="/user/shortlinks"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function kn({client:t,limit:n,page_token:i,sort_by:l}){const a="/users"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}async function Bn({client:t,limit:n,page_token:i,sort_by:l}){const a="/users-extended"+e({limit:n,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);await o(b);return await b.json()}var Pn=null;try{var Hn="undefined"!=typeof module&&"function"==typeof module.require&&module.require("worker_threads")||"function"==typeof __non_webpack_require__&&__non_webpack_require__("worker_threads")||"function"==typeof require&&require("worker_threads");Pn=Hn.Worker}catch(t){}function vn(t,e,n){var i=void 0===e?null:e,o=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==n&&n),l=o.indexOf("\n",10)+1,a=o.substring(l)+(i?"//# sourceMappingURL="+i:"");return function(t){return new Pn(a,Object.assign({},t,{eval:!0}))}}function Mn(t,e,n){var i=void 0===e?null:e,o=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),o=0,l=n.length;o<l;++o)i[o]=n.charCodeAt(o);return new TextDecoder("utf-16le").decode(new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),l=o.indexOf("\n",10)+1,a=o.substring(l)+(i?"//# sourceMappingURL="+i:""),s=new Blob([a],{type:"application/javascript"});return URL.createObjectURL(s)}var jn="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function Qn(t,e,n){return jn?vn(t,e,n):function(t,e,n){var i;return function(o){return i=i||Mn(t,e,n),new Worker(i,o)}}(t,e,n)}var En=Qn("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImRlZmF1bHQiaW4gZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIG4oZSl7aWYoZSYmZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGUmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe2lmKCJkZWZhdWx0IiE9PW4pe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHIuZ2V0P3I6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbbl19fSl9fSkpLHQuZGVmYXVsdD1lLE9iamVjdC5mcmVlemUodCl9dmFyIHI9bihlKSxpPXQoZSk7Y29uc3Qgbz1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gcyhlLHQsbil7ZS5sZW5ndGg+NTA/ZnVuY3Rpb24oZSx0LG4pe28uZW5jb2RlSW50byhlLHQuc3ViYXJyYXkobikpfShlLHQsbik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fShlLHQsbil9bmV3IFRleHREZWNvZGVyO2NsYXNzIGZ7dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6dS5uYW1lfSl9fWZ1bmN0aW9uIGEoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBsPTQyOTQ5NjcyOTUsaD0xNzE3OTg2OTE4Mztjb25zdCBjPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1oKXtpZigwPT09dCYmZTw9bCl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGEociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgdShgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgZ3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBnO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYyl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCBuPTA7bjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7bisrKXtjb25zdCByPXRoaXMuYnVpbHRJbkVuY29kZXJzW25dO2lmKG51bGwhPXIpe2NvbnN0IGk9cihlLHQpO2lmKG51bGwhPWkpe3JldHVybiBuZXcgZigtMS1uLGkpfX19Zm9yKGxldCBuPTA7bjx0aGlzLmVuY29kZXJzLmxlbmd0aDtuKyspe2NvbnN0IHI9dGhpcy5lbmNvZGVyc1tuXTtpZihudWxsIT1yKXtjb25zdCBpPXIoZSx0KTtpZihudWxsIT1pKXtyZXR1cm4gbmV3IGYobixpKX19fXJldHVybiBlIGluc3RhbmNlb2YgZj9lOm51bGx9ZGVjb2RlKGUsdCxuKXtjb25zdCByPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiByP3IoZSx0LG4pOm5ldyBmKHQsZSl9fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGJ7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9nLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGIoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNSt0KSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKHQpLHMoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9dH1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1kKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxhKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgcD0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiB5KGUpe3JldHVybiJVaW50OEFycmF5Ij09PXAoZSl9ZnVuY3Rpb24gdyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBTKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIEUoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpCKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgVT03LE89U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksTj0yMTQ3NDgzNjQ3LHg9LTIxNDc0ODM2NDgsST1NYXRoLnBvdygyLDYzKS0xLF89LU1hdGgucG93KDIsNjMpLFQ9TWF0aC5wb3coMiw1MyksJD0tTWF0aC5wb3coMiw1MyksTD0xLHY9MixBPTMsaj00LEY9NSxSPTYsRD03LHo9OCxWPTksQz0xMCxNPTExLFA9MTIsSj0xMyxrPTE0LFk9MTUsSD0xNixxPTE3LFc9MTgsSz0xOSxaPTI1NSxHPTEyNyxYPTAsUT00LGVlPU9iamVjdC5mcmVlemUoe2RvdWJsZToxLHN0cmluZzoyLG9iamVjdDozLGFycmF5OjQsYmluRGF0YTo1LHVuZGVmaW5lZDo2LG9iamVjdElkOjcsYm9vbDo4LGRhdGU6OSxudWxsOjEwLHJlZ2V4OjExLGRiUG9pbnRlcjoxMixqYXZhc2NyaXB0OjEzLHN5bWJvbDoxNCxqYXZhc2NyaXB0V2l0aFNjb3BlOjE1LGludDoxNix0aW1lc3RhbXA6MTcsbG9uZzoxOCxkZWNpbWFsOjE5LG1pbktleTotMSxtYXhLZXk6MTI3fSk7Y2xhc3MgdGUgZXh0ZW5kcyBFcnJvcntnZXQgYnNvbkVycm9yKCl7cmV0dXJuITB9Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTkVycm9yIn1jb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCl9c3RhdGljIGlzQlNPTkVycm9yKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJic29uRXJyb3IiaW4gZSYmITA9PT1lLmJzb25FcnJvciYmIm5hbWUiaW4gZSYmIm1lc3NhZ2UiaW4gZSYmInN0YWNrImluIGV9fWNsYXNzIG5lIGV4dGVuZHMgdGV7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlZlcnNpb25FcnJvciJ9Y29uc3RydWN0b3IoKXtzdXBlcihgVW5zdXBwb3J0ZWQgQlNPTiB2ZXJzaW9uLCBic29uIHR5cGVzIG11c3QgYmUgZnJvbSBic29uICR7VX0ueC54YCl9fWNsYXNzIHJlIGV4dGVuZHMgdGV7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIGllIGV4dGVuZHMgdGV7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTk9mZnNldEVycm9yIn1vZmZzZXQ7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGAke2V9LiBvZmZzZXQ6ICR7dH1gLG4pLHRoaXMub2Zmc2V0PXR9fWxldCBvZSxzZTtmdW5jdGlvbiBmZShlLHQsbixyKXtpZihyKXtvZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiEwfSk7dHJ5e3JldHVybiBvZS5kZWNvZGUoZS5zdWJhcnJheSh0LG4pKX1jYXRjaChlKXt0aHJvdyBuZXcgdGUoIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiBzZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksc2UuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gdWUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBhZShlKXtyZXR1cm4gY2UuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIGxlKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGNlLmFsbG9jYXRlKGUpKX1jb25zdCBoZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP2xlOmFlfSkoKSxjZT17aXNVaW50OEFycmF5OnksdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgdGUoIkNhbm5vdCBjcmVhdGUgQnVmZmVyIGZyb20gdGhlIHBhc3NlZCBwb3RlbnRpYWxCdWZmZXIuIil9LGFsbG9jYXRlOmU9PkJ1ZmZlci5hbGxvYyhlKSxhbGxvY2F0ZVVuc2FmZTplPT5CdWZmZXIuYWxsb2NVbnNhZmUoZSksY29tcGFyZTooZSx0KT0+Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuY29tcGFyZSh0KSxjb25jYXQ6ZT0+QnVmZmVyLmNvbmNhdChlKSxjb3B5OihlLHQsbixyLGkpPT5jZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb3B5KHQsbj8/MCxyPz8wLGk/P2UubGVuZ3RoKSxlcXVhbHM6KGUsdCk9PmNlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmVxdWFscyh0KSxmcm9tTnVtYmVyQXJyYXk6ZT0+QnVmZmVyLmZyb20oZSksZnJvbUJhc2U2NDplPT5CdWZmZXIuZnJvbShlLCJiYXNlNjQiKSxmcm9tVVRGODplPT5CdWZmZXIuZnJvbShlLCJ1dGY4IiksdG9CYXNlNjQ6ZT0+Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJhc2U2NCIpLGZyb21JU084ODU5MTplPT5CdWZmZXIuZnJvbShlLCJiaW5hcnkiKSx0b0lTTzg4NTkxOmU9PmNlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJiaW5hcnkiKSxmcm9tSGV4OmU9PkJ1ZmZlci5mcm9tKGUsImhleCIpLHRvSGV4OmU9PmNlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJoZXgiKSx0b1VURjgoZSx0LG4scil7Y29uc3QgaT1uLXQ8PTIwP3VlKGUsdCxuKTpudWxsO2lmKG51bGwhPWkpcmV0dXJuIGk7Y29uc3Qgbz1jZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygidXRmOCIsdCxuKTtpZihyKWZvcihsZXQgcj0wO3I8by5sZW5ndGg7cisrKWlmKDY1NTMzPT09by5jaGFyQ29kZUF0KHIpKXtmZShlLHQsbiwhMCk7YnJlYWt9cmV0dXJuIG99LHV0ZjhCeXRlTGVuZ3RoOmU9PkJ1ZmZlci5ieXRlTGVuZ3RoKGUsInV0ZjgiKSxlbmNvZGVVVEY4SW50byhlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlLHQsbil7aWYoMD09PXQubGVuZ3RoKXJldHVybiAwO2lmKHQubGVuZ3RoPjI1KXJldHVybiBudWxsO2lmKGUubGVuZ3RoLW48dC5sZW5ndGgpcmV0dXJuIG51bGw7Zm9yKGxldCByPTAsaT1uO3I8dC5sZW5ndGg7cisrLGkrKyl7Y29uc3Qgbj10LmNoYXJDb2RlQXQocik7aWYobj4xMjcpcmV0dXJuIG51bGw7ZVtpXT1ufXJldHVybiB0Lmxlbmd0aH0oZSx0LG4pO3JldHVybiBudWxsIT1yP3I6Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkud3JpdGUodCxuLHZvaWQgMCwidXRmOCIpfSxyYW5kb21CeXRlczpoZSxzd2FwMzI6ZT0+Y2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuc3dhcDMyKCl9O2Z1bmN0aW9uIGdlKGUpe2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIGFyZ3VtZW50ICdieXRlTGVuZ3RoJyBpcyBpbnZhbGlkLiBSZWNlaXZlZCAke2V9YCk7cmV0dXJuIHBlLmZyb21OdW1iZXJBcnJheShBcnJheS5mcm9tKHtsZW5ndGg6ZX0sKCgpPT5NYXRoLmZsb29yKDI1NipNYXRoLnJhbmRvbSgpKSkpKX1jb25zdCBkZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztpZihudWxsIT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRSYW5kb21WYWx1ZXMpcmV0dXJuIHQ9PmUuZ2V0UmFuZG9tVmFsdWVzKHBlLmFsbG9jYXRlKHQpKTtpZihmdW5jdGlvbigpe2NvbnN0e25hdmlnYXRvcjplfT1nbG9iYWxUaGlzO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmIlJlYWN0TmF0aXZlIj09PWUucHJvZHVjdH0oKSl7Y29uc3R7Y29uc29sZTplfT1nbG9iYWxUaGlzO2U/Lndhcm4/LigiQlNPTjogRm9yIFJlYWN0IE5hdGl2ZSBwbGVhc2UgcG9seWZpbGwgY3J5cHRvLmdldFJhbmRvbVZhbHVlcywgZS5nLiB1c2luZzogaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvcmVhY3QtbmF0aXZlLWdldC1yYW5kb20tdmFsdWVzLiIpfXJldHVybiBnZX0pKCksYmU9LyhcZHxbYS1mXSkvaSxwZT17aXNVaW50OEFycmF5OnksdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJVaW50OEFycmF5Ij09PXQpcmV0dXJuIGU7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpKXJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlci5zbGljZShlLmJ5dGVPZmZzZXQsZS5ieXRlT2Zmc2V0K2UuYnl0ZUxlbmd0aCkpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBuZXcgVWludDhBcnJheShlKTt0aHJvdyBuZXcgdGUoIkNhbm5vdCBtYWtlIGEgVWludDhBcnJheSBmcm9tIHBhc3NlZCBwb3RlbnRpYWxCdWZmZXIuIil9LGFsbG9jYXRlKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKGBUaGUgInNpemUiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkICR7U3RyaW5nKGUpfWApO3JldHVybiBuZXcgVWludDhBcnJheShlKX0sYWxsb2NhdGVVbnNhZmU6ZT0+cGUuYWxsb2NhdGUoZSksY29tcGFyZShlLHQpe2lmKGU9PT10KXJldHVybiAwO2NvbnN0IG49TWF0aC5taW4oZS5sZW5ndGgsdC5sZW5ndGgpO2ZvcihsZXQgcj0wO3I8bjtyKyspe2lmKGVbcl08dFtyXSlyZXR1cm4tMTtpZihlW3JdPnRbcl0pcmV0dXJuIDF9cmV0dXJuIGUubGVuZ3RoPHQubGVuZ3RoPy0xOmUubGVuZ3RoPnQubGVuZ3RoPzE6MH0sY29uY2F0KGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gcGUuYWxsb2NhdGUoMCk7bGV0IHQ9MDtmb3IoY29uc3QgbiBvZiBlKXQrPW4ubGVuZ3RoO2NvbnN0IG49cGUuYWxsb2NhdGUodCk7bGV0IHI9MDtmb3IoY29uc3QgdCBvZiBlKW4uc2V0KHQscikscis9dC5sZW5ndGg7cmV0dXJuIG59LGNvcHkoZSx0LG4scixpKXtpZih2b2lkIDAhPT1pJiZpPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlRW5kIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgPj0gMC4gUmVjZWl2ZWQgJHtpfWApO2lmKGk9aT8/ZS5sZW5ndGgsdm9pZCAwIT09ciYmKHI8MHx8cj5pKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJzb3VyY2VTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAgYW5kIDw9ICR7aX0uIFJlY2VpdmVkICR7cn1gKTtpZihyPXI/PzAsdm9pZCAwIT09biYmbjwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInRhcmdldFN0YXJ0IiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgPj0gMC4gUmVjZWl2ZWQgJHtufWApO249bj8/MDtjb25zdCBvPWUuc3ViYXJyYXkocixpKSxzPU1hdGgubWluKG8ubGVuZ3RoLHQubGVuZ3RoLW4pO3JldHVybiBzPD0wPzA6KHQuc2V0KG8uc3ViYXJyYXkoMCxzKSxuKSxzKX0sZXF1YWxzKGUsdCl7aWYoZS5ieXRlTGVuZ3RoIT09dC5ieXRlTGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wO248ZS5ieXRlTGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbU51bWJlckFycmF5OmU9PlVpbnQ4QXJyYXkuZnJvbShlKSxmcm9tQmFzZTY0OmU9PlVpbnQ4QXJyYXkuZnJvbShhdG9iKGUpLChlPT5lLmNoYXJDb2RlQXQoMCkpKSxmcm9tVVRGODplPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSksdG9CYXNlNjQ6ZT0+YnRvYShwZS50b0lTTzg4NTkxKGUpKSxmcm9tSVNPODg1OTE6ZT0+VWludDhBcnJheS5mcm9tKGUsKGU9PjI1NSZlLmNoYXJDb2RlQXQoMCkpKSx0b0lTTzg4NTkxOmU9PkFycmF5LmZyb20oVWludDE2QXJyYXkuZnJvbShlKSwoZT0+U3RyaW5nLmZyb21DaGFyQ29kZShlKSkpLmpvaW4oIiIpLGZyb21IZXgoZSl7Y29uc3QgdD1lLmxlbmd0aCUyPT0wP2U6ZS5zbGljZSgwLGUubGVuZ3RoLTEpLG49W107Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0yKXtjb25zdCByPXRbZV0saT10W2UrMV07aWYoIWJlLnRlc3QocikpYnJlYWs7aWYoIWJlLnRlc3QoaSkpYnJlYWs7Y29uc3Qgbz1OdW1iZXIucGFyc2VJbnQoYCR7cn0ke2l9YCwxNik7bi5wdXNoKG8pfXJldHVybiBVaW50OEFycmF5LmZyb20obil9LHRvSGV4OmU9PkFycmF5LmZyb20oZSwoZT0+ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKSkuam9pbigiIiksdG9VVEY4KGUsdCxuLHIpe2NvbnN0IGk9bi10PD0yMD91ZShlLHQsbik6bnVsbDtyZXR1cm4gbnVsbCE9aT9pOmZlKGUsdCxuLHIpfSx1dGY4Qnl0ZUxlbmd0aDplPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoZSkuYnl0ZUxlbmd0aCxlbmNvZGVVVEY4SW50byhlLHQsbil7Y29uc3Qgcj0obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUodCk7cmV0dXJuIGUuc2V0KHIsbiksci5ieXRlTGVuZ3RofSxyYW5kb21CeXRlczpkZSxzd2FwMzIoZSl7aWYoZS5sZW5ndGglNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrPTQpe2NvbnN0IG49ZVt0XSxyPWVbdCsxXSxpPWVbdCsyXSxvPWVbdCszXTtlW3RdPW8sZVt0KzFdPWksZVt0KzJdPXIsZVt0KzNdPW59cmV0dXJuIGV9fSx5ZT0iZnVuY3Rpb24iPT10eXBlb2YgQnVmZmVyJiYhMCE9PUJ1ZmZlci5wcm90b3R5cGU/Ll9pc0J1ZmZlcj9jZTpwZSx3ZT1TeW1ib2wuZm9yKCJAQG1kYi5ic29uLnR5cGUiKTtjbGFzcyBtZXtnZXRbd2VdKCl7cmV0dXJuIHRoaXMuX2Jzb250eXBlfWdldFtPXSgpe3JldHVybiBVfVtTeW1ib2wuZm9yKCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbSIpXShlLHQsbil7cmV0dXJuIHRoaXMuaW5zcGVjdChlLHQsbil9fWNvbnN0IEJlPW5ldyBGbG9hdDY0QXJyYXkoMSksU2U9bmV3IFVpbnQ4QXJyYXkoQmUuYnVmZmVyLDAsOCk7QmVbMF09LTE7Y29uc3QgRWU9MD09PVNlWzddLFVlPXtpc0JpZ0VuZGlhbjpFZSxnZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KXtpZihlW3QrM10+MTI3KXRocm93IG5ldyBSYW5nZUVycm9yKGBTaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSBhdCBvZmZzZXQ6ICR7dH1gKTtyZXR1cm4gZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0fSxnZXRJbnQzMkxFOihlLHQpPT5lW3RdfGVbdCsxXTw8OHxlW3QrMl08PDE2fGVbdCszXTw8MjQsZ2V0VWludDMyTEU6KGUsdCk9PmVbdF0rMjU2KmVbdCsxXSs2NTUzNiplW3QrMl0rMTY3NzcyMTYqZVt0KzNdLGdldFVpbnQzMkJFOihlLHQpPT5lW3QrM10rMjU2KmVbdCsyXSs2NTUzNiplW3QrMV0rMTY3NzcyMTYqZVt0XSxnZXRCaWdJbnQ2NExFOihlLHQpPT4oQmlnSW50KGVbdCs0XSsyNTYqZVt0KzVdKzY1NTM2KmVbdCs2XSsoZVt0KzddPDwyNCkpPDwzMm4pK0JpZ0ludChlW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSksZ2V0RmxvYXQ2NExFOkVlPyhlLHQpPT4oU2VbN109ZVt0XSxTZVs2XT1lW3QrMV0sU2VbNV09ZVt0KzJdLFNlWzRdPWVbdCszXSxTZVszXT1lW3QrNF0sU2VbMl09ZVt0KzVdLFNlWzFdPWVbdCs2XSxTZVswXT1lW3QrN10sQmVbMF0pOihlLHQpPT4oU2VbMF09ZVt0XSxTZVsxXT1lW3QrMV0sU2VbMl09ZVt0KzJdLFNlWzNdPWVbdCszXSxTZVs0XT1lW3QrNF0sU2VbNV09ZVt0KzVdLFNlWzZdPWVbdCs2XSxTZVs3XT1lW3QrN10sQmVbMF0pLHNldEludDMyQkU6KGUsdCxuKT0+KGVbdCszXT1uLG4+Pj49OCxlW3QrMl09bixuPj4+PTgsZVt0KzFdPW4sbj4+Pj04LGVbdF09biw0KSxzZXRJbnQzMkxFOihlLHQsbik9PihlW3RdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3QrMl09bixuPj4+PTgsZVt0KzNdPW4sNCksc2V0QmlnSW50NjRMRShlLHQsbil7Y29uc3Qgcj0weGZmZmZmZmZmbjtsZXQgaT1OdW1iZXIobiZyKTtlW3RdPWksaT4+PTgsZVt0KzFdPWksaT4+PTgsZVt0KzJdPWksaT4+PTgsZVt0KzNdPWk7bGV0IG89TnVtYmVyKG4+PjMybiZyKTtyZXR1cm4gZVt0KzRdPW8sbz4+PTgsZVt0KzVdPW8sbz4+PTgsZVt0KzZdPW8sbz4+PTgsZVt0KzddPW8sOH0sc2V0RmxvYXQ2NExFOkVlPyhlLHQsbik9PihCZVswXT1uLGVbdF09U2VbN10sZVt0KzFdPVNlWzZdLGVbdCsyXT1TZVs1XSxlW3QrM109U2VbNF0sZVt0KzRdPVNlWzNdLGVbdCs1XT1TZVsyXSxlW3QrNl09U2VbMV0sZVt0KzddPVNlWzBdLDgpOihlLHQsbik9PihCZVswXT1uLGVbdF09U2VbMF0sZVt0KzFdPVNlWzFdLGVbdCsyXT1TZVsyXSxlW3QrM109U2VbM10sZVt0KzRdPVNlWzRdLGVbdCs1XT1TZVs1XSxlW3QrNl09U2VbNl0sZVt0KzddPVNlWzddLDgpfTtjbGFzcyBPZSBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iQmluYXJ5In1zdGF0aWMgQlNPTl9CSU5BUllfU1VCVFlQRV9ERUZBVUxUPTA7c3RhdGljIEJVRkZFUl9TSVpFPTI1NjtzdGF0aWMgU1VCVFlQRV9ERUZBVUxUPTA7c3RhdGljIFNVQlRZUEVfRlVOQ1RJT049MTtzdGF0aWMgU1VCVFlQRV9CWVRFX0FSUkFZPTI7c3RhdGljIFNVQlRZUEVfVVVJRF9PTEQ9MztzdGF0aWMgU1VCVFlQRV9VVUlEPTQ7c3RhdGljIFNVQlRZUEVfTUQ1PTU7c3RhdGljIFNVQlRZUEVfRU5DUllQVEVEPTY7c3RhdGljIFNVQlRZUEVfQ09MVU1OPTc7c3RhdGljIFNVQlRZUEVfU0VOU0lUSVZFPTg7c3RhdGljIFNVQlRZUEVfVkVDVE9SPTk7c3RhdGljIFNVQlRZUEVfVVNFUl9ERUZJTkVEPTEyODtzdGF0aWMgVkVDVE9SX1RZUEU9T2JqZWN0LmZyZWV6ZSh7SW50ODozLEZsb2F0MzI6MzksUGFja2VkQml0OjE2fSk7YnVmZmVyO3N1Yl90eXBlO3Bvc2l0aW9uO2NvbnN0cnVjdG9yKGUsdCl7aWYoc3VwZXIoKSxudWxsIT1lJiYic3RyaW5nIj09dHlwZW9mIGUmJiFBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJiF3KGUpJiYhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgdGUoIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPXQ/P09lLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCxudWxsPT1lPyh0aGlzLmJ1ZmZlcj15ZS5hbGxvY2F0ZShPZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT95ZS5mcm9tTnVtYmVyQXJyYXkoZSk6eWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBTdHJpbmciKTtpZigibnVtYmVyIiE9dHlwZW9mIGUmJjEhPT1lLmxlbmd0aCl0aHJvdyBuZXcgdGUoIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFVpbnQ4QXJyYXkgb3IgQXJyYXkiKTtsZXQgdDtpZih0PSJzdHJpbmciPT10eXBlb2YgZT9lLmNoYXJDb2RlQXQoMCk6Im51bWJlciI9PXR5cGVvZiBlP2U6ZVswXSx0PDB8fHQ+MjU1KXRocm93IG5ldyB0ZSgib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT15ZS5hbGxvY2F0ZShPZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9eWUuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KHllLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IHRlKCJpbnB1dCBjYW5ub3QgYmUgc3RyaW5nIil9cmVhZChlLHQpe2NvbnN0IG49ZSsodD10JiZ0PjA/dDp0aGlzLnBvc2l0aW9uKTtyZXR1cm4gdGhpcy5idWZmZXIuc3ViYXJyYXkoZSxuPnRoaXMucG9zaXRpb24/dGhpcy5wb3NpdGlvbjpuKX12YWx1ZSgpe3JldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGg9PT10aGlzLnBvc2l0aW9uP3RoaXMuYnVmZmVyOnRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbil9bGVuZ3RoKCl7cmV0dXJuIHRoaXMucG9zaXRpb259dG9KU09OKCl7cmV0dXJuIHllLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpfXRvU3RyaW5nKGUpe3JldHVybiJoZXgiPT09ZT95ZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKToiYmFzZTY0Ij09PWU/eWUudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSk6eWUudG9VVEY4KHRoaXMuYnVmZmVyLDAsdGhpcy5wb3NpdGlvbiwhMSl9dG9FeHRlbmRlZEpTT04oZSl7ZT1lfHx7fSx0aGlzLnN1Yl90eXBlPT09T2UuU1VCVFlQRV9WRUNUT1ImJk5lKHRoaXMpO2NvbnN0IHQ9eWUudG9CYXNlNjQodGhpcy5idWZmZXIpLG49TnVtYmVyKHRoaXMuc3ViX3R5cGUpLnRvU3RyaW5nKDE2KTtyZXR1cm4gZS5sZWdhY3k/eyRiaW5hcnk6dCwkdHlwZToxPT09bi5sZW5ndGg/IjAiK246bn06eyRiaW5hcnk6e2Jhc2U2NDp0LHN1YlR5cGU6MT09PW4ubGVuZ3RoPyIwIituOm59fX10b1VVSUQoKXtpZih0aGlzLnN1Yl90eXBlPT09T2UuU1VCVFlQRV9VVUlEKXJldHVybiBuZXcgX2UodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSk7dGhyb3cgbmV3IHRlKGBCaW5hcnkgc3ViX3R5cGUgIiR7dGhpcy5zdWJfdHlwZX0iIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGNvbnZlcnRpbmcgdG8gVVVJRC4gT25seSAiJHtPZS5TVUJUWVBFX1VVSUR9IiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUsdCl7cmV0dXJuIG5ldyBPZSh5ZS5mcm9tSGV4KGUpLHQpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUsdCl7cmV0dXJuIG5ldyBPZSh5ZS5mcm9tQmFzZTY0KGUpLHQpfXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7bGV0IG4scjtpZih0PXR8fHt9LCIkYmluYXJ5ImluIGU/dC5sZWdhY3kmJiJzdHJpbmciPT10eXBlb2YgZS4kYmluYXJ5JiYiJHR5cGUiaW4gZT8ocj1lLiR0eXBlP3BhcnNlSW50KGUuJHR5cGUsMTYpOjAsbj15ZS5mcm9tQmFzZTY0KGUuJGJpbmFyeSkpOiJzdHJpbmciIT10eXBlb2YgZS4kYmluYXJ5JiYocj1lLiRiaW5hcnkuc3ViVHlwZT9wYXJzZUludChlLiRiaW5hcnkuc3ViVHlwZSwxNik6MCxuPXllLmZyb21CYXNlNjQoZS4kYmluYXJ5LmJhc2U2NCkpOiIkdXVpZCJpbiBlJiYocj00LG49X2UuYnl0ZXNGcm9tU3RyaW5nKGUuJHV1aWQpKSwhbil0aHJvdyBuZXcgdGUoYFVuZXhwZWN0ZWQgQmluYXJ5IEV4dGVuZGVkIEpTT04gZm9ybWF0ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIHI9PT1RP25ldyBfZShuKTpuZXcgT2UobixyKX1pbnNwZWN0KGUsdCxuKXtuPz89RTtyZXR1cm5gQmluYXJ5LmNyZWF0ZUZyb21CYXNlNjQoJHtuKHllLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpLHQpfSwgJHtuKHRoaXMuc3ViX3R5cGUsdCl9KWB9dG9JbnQ4QXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09T2UuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IHRlKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09T2UuVkVDVE9SX1RZUEUuSW50OCl0aHJvdyBuZXcgdGUoIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgSW50OCIpO3JldHVybiBOZSh0aGlzKSxuZXcgSW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9GbG9hdDMyQXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09T2UuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IHRlKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09T2UuVkVDVE9SX1RZUEUuRmxvYXQzMil0aHJvdyBuZXcgdGUoIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgRmxvYXQzMiIpO05lKHRoaXMpO2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIuYnVmZmVyLnNsaWNlKHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrMix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0K3RoaXMucG9zaXRpb24pKTtyZXR1cm4gVWUuaXNCaWdFbmRpYW4mJnllLnN3YXAzMihlKSxuZXcgRmxvYXQzMkFycmF5KGUuYnVmZmVyKX10b1BhY2tlZEJpdHMoKXtpZih0aGlzLnN1Yl90eXBlIT09T2UuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IHRlKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09T2UuVkVDVE9SX1RZUEUuUGFja2VkQml0KXRocm93IG5ldyB0ZSgiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7cmV0dXJuIE5lKHRoaXMpLG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9CaXRzKCl7aWYodGhpcy5zdWJfdHlwZSE9PU9lLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyB0ZSgiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PU9lLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgdGUoIkJpbmFyeSBkYXRhdHlwZSBmaWVsZCBpcyBub3QgcGFja2VkIGJpdCIpO05lKHRoaXMpO2NvbnN0IGU9OCoodGhpcy5sZW5ndGgoKS0yKS10aGlzLmJ1ZmZlclsxXSx0PW5ldyBJbnQ4QXJyYXkoZSk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG49ZS84fDAscj10aGlzLmJ1ZmZlcltuKzJdPj43LWUlOCYxO3RbZV09cn1yZXR1cm4gdH1zdGF0aWMgZnJvbUludDhBcnJheShlKXtjb25zdCB0PXllLmFsbG9jYXRlKGUuYnl0ZUxlbmd0aCsyKTt0WzBdPU9lLlZFQ1RPUl9UWVBFLkludDgsdFsxXT0wO2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7dC5zZXQobiwyKTtjb25zdCByPW5ldyB0aGlzKHQsdGhpcy5TVUJUWVBFX1ZFQ1RPUik7cmV0dXJuIE5lKHIpLHJ9c3RhdGljIGZyb21GbG9hdDMyQXJyYXkoZSl7Y29uc3QgdD15ZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7dFswXT1PZS5WRUNUT1JfVFlQRS5GbG9hdDMyLHRbMV09MDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO3Quc2V0KG4sMiksVWUuaXNCaWdFbmRpYW4mJnllLnN3YXAzMihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwyKSk7Y29uc3Qgcj1uZXcgdGhpcyh0LHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBOZShyKSxyfXN0YXRpYyBmcm9tUGFja2VkQml0cyhlLHQ9MCl7Y29uc3Qgbj15ZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7blswXT1PZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQsblsxXT10LG4uc2V0KGUsMik7Y29uc3Qgcj1uZXcgdGhpcyhuLHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBOZShyKSxyfXN0YXRpYyBmcm9tQml0cyhlKXtjb25zdCB0PWUubGVuZ3RoKzc+Pj4zLG49bmV3IFVpbnQ4QXJyYXkodCsyKTtuWzBdPU9lLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdDtjb25zdCByPWUubGVuZ3RoJTg7blsxXT0wPT09cj8wOjgtcjtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgcj10Pj4+MyxpPWVbdF07aWYoMCE9PWkmJjEhPT1pKXRocm93IG5ldyB0ZShgSW52YWxpZCBiaXQgdmFsdWUgYXQgJHt0fTogbXVzdCBiZSAwIG9yIDEsIGZvdW5kICR7ZVt0XX1gKTtpZigwPT09aSljb250aW51ZTtjb25zdCBvPTctdCU4O25bcisyXXw9aTw8b31yZXR1cm4gbmV3IHRoaXMobixPZS5TVUJUWVBFX1ZFQ1RPUil9fWZ1bmN0aW9uIE5lKGUpe2lmKGUuc3ViX3R5cGUhPT1PZS5TVUJUWVBFX1ZFQ1RPUilyZXR1cm47Y29uc3QgdD1lLnBvc2l0aW9uLG49ZS5idWZmZXJbMF0scj1lLmJ1ZmZlclsxXTtpZigobj09PU9lLlZFQ1RPUl9UWVBFLkZsb2F0MzJ8fG49PT1PZS5WRUNUT1JfVFlQRS5JbnQ4KSYmMCE9PXIpdGhyb3cgbmV3IHRlKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIGludDggYW5kIGZsb2F0MzIgdmVjdG9ycyIpO2lmKG49PT1PZS5WRUNUT1JfVFlQRS5GbG9hdDMyJiYwIT09dCYmdC0yIT0wJiYodC0yKSU0IT0wKXRocm93IG5ldyB0ZSgiSW52YWxpZCBWZWN0b3I6IEZsb2F0MzIgdmVjdG9yIG11c3QgY29udGFpbiBhIG11bHRpcGxlIG9mIDQgYnl0ZXMiKTtpZihuPT09T2UuVkVDVE9SX1RZUEUuUGFja2VkQml0JiYwIT09ciYmMj09PXQpdGhyb3cgbmV3IHRlKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIHBhY2tlZCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBlbXB0eSIpO2lmKG49PT1PZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJnI+Nyl0aHJvdyBuZXcgdGUoYEludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgYSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDcuIGZvdW5kOiAke3J9YCl9Y29uc3QgeGU9L15bMC05QS1GXXszMn0kL2ksSWU9L15bMC05QS1GXXs4fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXs0fS1bMC05QS1GXXsxMn0kL2k7Y2xhc3MgX2UgZXh0ZW5kcyBPZXtjb25zdHJ1Y3RvcihlKXtsZXQgdDtpZihudWxsPT1lKXQ9X2UuZ2VuZXJhdGUoKTtlbHNlIGlmKGUgaW5zdGFuY2VvZiBfZSl0PXllLnRvTG9jYWxCdWZmZXJUeXBlKG5ldyBVaW50OEFycmF5KGUuYnVmZmVyKSk7ZWxzZSBpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkmJjE2PT09ZS5ieXRlTGVuZ3RoKXQ9eWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHRlKCJBcmd1bWVudCBwYXNzZWQgaW4gVVVJRCBjb25zdHJ1Y3RvciBtdXN0IGJlIGEgVVVJRCwgYSAxNiBieXRlIEJ1ZmZlciBvciBhIDMyLzM2IGNoYXJhY3RlciBoZXggc3RyaW5nIChkYXNoZXMgZXhjbHVkZWQvaW5jbHVkZWQsIGZvcm1hdDogeHh4eHh4eHgteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4KS4iKTt0PV9lLmJ5dGVzRnJvbVN0cmluZyhlKX1zdXBlcih0LFEpfWdldCBpZCgpe3JldHVybiB0aGlzLmJ1ZmZlcn1zZXQgaWQoZSl7dGhpcy5idWZmZXI9ZX10b0hleFN0cmluZyhlPSEwKXtyZXR1cm4gZT9beWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoMCw0KSkseWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoNCw2KSkseWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoNiw4KSkseWUudG9IZXgodGhpcy5idWZmZXIuc3ViYXJyYXkoOCwxMCkpLHllLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDEwLDE2KSldLmpvaW4oIi0iKTp5ZS50b0hleCh0aGlzLmJ1ZmZlcil9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP3llLnRvSGV4KHRoaXMuaWQpOiJiYXNlNjQiPT09ZT95ZS50b0Jhc2U2NCh0aGlzLmlkKTp0aGlzLnRvSGV4U3RyaW5nKCl9dG9KU09OKCl7cmV0dXJuIHRoaXMudG9IZXhTdHJpbmcoKX1lcXVhbHMoZSl7aWYoIWUpcmV0dXJuITE7aWYoZSBpbnN0YW5jZW9mIF9lKXJldHVybiB5ZS5lcXVhbHMoZS5pZCx0aGlzLmlkKTt0cnl7cmV0dXJuIHllLmVxdWFscyhuZXcgX2UoZSkuaWQsdGhpcy5pZCl9Y2F0Y2h7cmV0dXJuITF9fXRvQmluYXJ5KCl7cmV0dXJuIG5ldyBPZSh0aGlzLmlkLE9lLlNVQlRZUEVfVVVJRCl9c3RhdGljIGdlbmVyYXRlKCl7Y29uc3QgZT15ZS5yYW5kb21CeXRlcygxNik7cmV0dXJuIGVbNl09MTUmZVs2XXw2NCxlWzhdPTYzJmVbOF18MTI4LGV9c3RhdGljIGlzVmFsaWQoZSl7cmV0dXJuISFlJiYoInN0cmluZyI9PXR5cGVvZiBlP19lLmlzVmFsaWRVVUlEU3RyaW5nKGUpOnkoZSk/MTY9PT1lLmJ5dGVMZW5ndGg6IkJpbmFyeSI9PT1lLl9ic29udHlwZSYmZS5zdWJfdHlwZT09PXRoaXMuU1VCVFlQRV9VVUlEJiYxNj09PWUuYnVmZmVyLmJ5dGVMZW5ndGgpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2NvbnN0IHQ9X2UuYnl0ZXNGcm9tU3RyaW5nKGUpO3JldHVybiBuZXcgX2UodCl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSl7cmV0dXJuIG5ldyBfZSh5ZS5mcm9tQmFzZTY0KGUpKX1zdGF0aWMgYnl0ZXNGcm9tU3RyaW5nKGUpe2lmKCFfZS5pc1ZhbGlkVVVJRFN0cmluZyhlKSl0aHJvdyBuZXcgdGUoIlVVSUQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgYmUgMzIgaGV4IGRpZ2l0cyBvciBjYW5vbmljYWwgaHlwaGVuYXRlZCByZXByZXNlbnRhdGlvbiIpO3JldHVybiB5ZS5mcm9tSGV4KGUucmVwbGFjZSgvLS9nLCIiKSl9c3RhdGljIGlzVmFsaWRVVUlEU3RyaW5nKGUpe3JldHVybiB4ZS50ZXN0KGUpfHxJZS50ZXN0KGUpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89RSxgbmV3IFVVSUQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19Y2xhc3MgVGUgZXh0ZW5kcyBtZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkNvZGUifWNvZGU7c2NvcGU7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuY29kZT1lLnRvU3RyaW5nKCksdGhpcy5zY29wZT10Pz9udWxsfXRvSlNPTigpe3JldHVybiBudWxsIT10aGlzLnNjb3BlP3tjb2RlOnRoaXMuY29kZSxzY29wZTp0aGlzLnNjb3BlfTp7Y29kZTp0aGlzLmNvZGV9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMuc2NvcGU/eyRjb2RlOnRoaXMuY29kZSwkc2NvcGU6dGhpcy5zY29wZX06eyRjb2RlOnRoaXMuY29kZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBUZShlLiRjb2RlLGUuJHNjb3BlKX1pbnNwZWN0KGUsdCxuKXtuPz89RTtsZXQgcj1uKHRoaXMuY29kZSx0KTtjb25zdCBpPXIuaW5jbHVkZXMoIlxuIik7bnVsbCE9dGhpcy5zY29wZSYmKHIrPWAsJHtpPyJcbiI6IiAifSR7bih0aGlzLnNjb3BlLHQpfWApO3JldHVybmBuZXcgQ29kZSgke2k/IlxuIjoiIn0ke3J9JHtpJiZudWxsPT09dGhpcy5zY29wZT8iXG4iOiIifSlgfX1mdW5jdGlvbiAkZShlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiJGlkImluIGUmJm51bGwhPWUuJGlkJiYiJHJlZiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJHJlZiYmKCEoIiRkYiJpbiBlKXx8IiRkYiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJGRiKX1jbGFzcyBMZSBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iREJSZWYifWNvbGxlY3Rpb247b2lkO2RiO2ZpZWxkcztjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcigpO2NvbnN0IGk9ZS5zcGxpdCgiLiIpOzI9PT1pLmxlbmd0aCYmKG49aS5zaGlmdCgpLGU9aS5zaGlmdCgpKSx0aGlzLmNvbGxlY3Rpb249ZSx0aGlzLm9pZD10LHRoaXMuZGI9bix0aGlzLmZpZWxkcz1yfHx7fX1nZXQgbmFtZXNwYWNlKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZXQgbmFtZXNwYWNlKGUpe3RoaXMuY29sbGVjdGlvbj1lfXRvSlNPTigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7JHJlZjp0aGlzLmNvbGxlY3Rpb24sJGlkOnRoaXMub2lkfSx0aGlzLmZpZWxkcyk7cmV0dXJuIG51bGwhPXRoaXMuZGImJihlLiRkYj10aGlzLmRiKSxlfXRvRXh0ZW5kZWRKU09OKGUpe2U9ZXx8e307bGV0IHQ9eyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH07cmV0dXJuIGUubGVnYWN5fHwodGhpcy5kYiYmKHQuJGRiPXRoaXMuZGIpLHQ9T2JqZWN0LmFzc2lnbih0LHRoaXMuZmllbGRzKSksdH1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGRlbGV0ZSB0LiRyZWYsZGVsZXRlIHQuJGlkLGRlbGV0ZSB0LiRkYixuZXcgTGUoZS4kcmVmLGUuJGlkLGUuJGRiLHQpfWluc3BlY3QoZSx0LG4pe24/Pz1FO2NvbnN0IHI9W24odGhpcy5uYW1lc3BhY2UsdCksbih0aGlzLm9pZCx0KSwuLi50aGlzLmRiP1tuKHRoaXMuZGIsdCldOltdLC4uLk9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGg+MD9bbih0aGlzLmZpZWxkcyx0KV06W11dO3JldHVybiByWzFdPW49PT1FP2BuZXcgT2JqZWN0SWQoJHtyWzFdfSlgOnJbMV0sYG5ldyBEQlJlZigke3Iuam9pbigiLCAiKX0pYH19ZnVuY3Rpb24gdmUoZSl7aWYoIiI9PT1lKXJldHVybiBlO2xldCB0PTA7Y29uc3Qgbj0iLSI9PT1lW3RdLHI9IisiPT09ZVt0XTsocnx8bikmJih0Kz0xKTtsZXQgaT0hMTtmb3IoO3Q8ZS5sZW5ndGgmJiIwIj09PWVbdF07Kyt0KWk9ITA7cmV0dXJuIGk/YCR7bj8iLSI6IiJ9JHtlLmxlbmd0aD09PXQ/IjAiOmUuc2xpY2UodCl9YDpyP2Uuc2xpY2UoMSk6ZX1sZXQgQWU7dHJ5e0FlPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9Y29uc3QgamU9NDI5NDk2NzI5NixGZT0weDEwMDAwMDAwMDAwMDAwMDAwLFJlPUZlLzIsRGU9e30semU9e30sVmU9L14oXCs/MHwoXCt8LSk/WzEtOV1bMC05XSopJC87Y2xhc3MgQ2UgZXh0ZW5kcyBtZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkxvbmcifWdldCBfX2lzTG9uZ19fKCl7cmV0dXJuITB9aGlnaDtsb3c7dW5zaWduZWQ7Y29uc3RydWN0b3IoZT0wLHQsbil7c3VwZXIoKTtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIHQ/dDpCb29sZWFuKG4pLGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6MCxvPSJzdHJpbmciPT10eXBlb2YgZT9DZS5mcm9tU3RyaW5nKGUscik6ImJpZ2ludCI9PXR5cGVvZiBlP0NlLmZyb21CaWdJbnQoZSxyKTp7bG93OjB8ZSxoaWdoOjB8aSx1bnNpZ25lZDpyfTt0aGlzLmxvdz1vLmxvdyx0aGlzLmhpZ2g9by5oaWdoLHRoaXMudW5zaWduZWQ9by51bnNpZ25lZH1zdGF0aWMgVFdPX1BXUl8yND1DZS5mcm9tSW50KDE2Nzc3MjE2KTtzdGF0aWMgTUFYX1VOU0lHTkVEX1ZBTFVFPUNlLmZyb21CaXRzKC0xLC0xLCEwKTtzdGF0aWMgWkVSTz1DZS5mcm9tSW50KDApO3N0YXRpYyBVWkVSTz1DZS5mcm9tSW50KDAsITApO3N0YXRpYyBPTkU9Q2UuZnJvbUludCgxKTtzdGF0aWMgVU9ORT1DZS5mcm9tSW50KDEsITApO3N0YXRpYyBORUdfT05FPUNlLmZyb21JbnQoLTEpO3N0YXRpYyBNQVhfVkFMVUU9Q2UuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NywhMSk7c3RhdGljIE1JTl9WQUxVRT1DZS5mcm9tQml0cygwLC0yMTQ3NDgzNjQ4LCExKTtzdGF0aWMgZnJvbUJpdHMoZSx0LG4pe3JldHVybiBuZXcgQ2UoZSx0LG4pfXN0YXRpYyBmcm9tSW50KGUsdCl7bGV0IG4scixpO3JldHVybiB0PyhpPTA8PShlPj4+PTApJiZlPDI1NikmJihyPXplW2VdLHIpP3I6KG49Q2UuZnJvbUJpdHMoZSwoMHxlKTwwPy0xOjAsITApLGkmJih6ZVtlXT1uKSxuKTooaT0tMTI4PD0oZXw9MCkmJmU8MTI4KSYmKHI9RGVbZV0scik/cjoobj1DZS5mcm9tQml0cyhlLGU8MD8tMTowLCExKSxpJiYoRGVbZV09biksbil9c3RhdGljIGZyb21OdW1iZXIoZSx0KXtpZihpc05hTihlKSlyZXR1cm4gdD9DZS5VWkVSTzpDZS5aRVJPO2lmKHQpe2lmKGU8MClyZXR1cm4gQ2UuVVpFUk87aWYoZT49RmUpcmV0dXJuIENlLk1BWF9VTlNJR05FRF9WQUxVRX1lbHNle2lmKGU8PS1SZSlyZXR1cm4gQ2UuTUlOX1ZBTFVFO2lmKGUrMT49UmUpcmV0dXJuIENlLk1BWF9WQUxVRX1yZXR1cm4gZTwwP0NlLmZyb21OdW1iZXIoLWUsdCkubmVnKCk6Q2UuZnJvbUJpdHMoZSVqZXwwLGUvamV8MCx0KX1zdGF0aWMgZnJvbUJpZ0ludChlLHQpe2NvbnN0IG49MHhmZmZmZmZmZm47cmV0dXJuIG5ldyBDZShOdW1iZXIoZSZuKSxOdW1iZXIoZT4+MzJuJm4pLHQpfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyB0ZSgiZW1wdHkgc3RyaW5nIik7aWYobjwyfHwzNjxuKXRocm93IG5ldyB0ZSgicmFkaXgiKTtsZXQgcjtpZigocj1lLmluZGV4T2YoIi0iKSk+MCl0aHJvdyBuZXcgdGUoImludGVyaW9yIGh5cGhlbiIpO2lmKDA9PT1yKXJldHVybiBDZS5fZnJvbVN0cmluZyhlLnN1YnN0cmluZygxKSx0LG4pLm5lZygpO2NvbnN0IGk9Q2UuZnJvbU51bWJlcihNYXRoLnBvdyhuLDgpKTtsZXQgbz1DZS5aRVJPO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9OCl7Y29uc3Qgcj1NYXRoLm1pbig4LGUubGVuZ3RoLXQpLHM9cGFyc2VJbnQoZS5zdWJzdHJpbmcodCx0K3IpLG4pO2lmKHI8OCl7Y29uc3QgZT1DZS5mcm9tTnVtYmVyKE1hdGgucG93KG4scikpO289by5tdWwoZSkuYWRkKENlLmZyb21OdW1iZXIocykpfWVsc2Ugbz1vLm11bChpKSxvPW8uYWRkKENlLmZyb21OdW1iZXIocykpfXJldHVybiBvLnVuc2lnbmVkPXQsb31zdGF0aWMgZnJvbVN0cmluZ1N0cmljdChlLHQsbil7bGV0IHI9ITE7aWYoIm51bWJlciI9PXR5cGVvZiB0PyhuPXQsdD0hMSk6cj0hIXQsbj8/PTEwLGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgdGUoYElucHV0OiAnJHtlfScgY29udGFpbnMgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgd2hpdGVzcGFjZWApO2lmKCFmdW5jdGlvbihlLHQpe2NvbnN0IG49IjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc2xpY2UoMCx0PXQ/PzEwKTtyZXR1cm4hbmV3IFJlZ0V4cChgW14tKyR7bn1dYCwiaSIpLnRlc3QoZSkmJmV9KGUsbikpdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyBmb3IgcmFkaXg6ICR7bn1gKTtjb25zdCBpPXZlKGUpLG89Q2UuX2Zyb21TdHJpbmcoaSxyLG4pO2lmKG8udG9TdHJpbmcobikudG9Mb3dlckNhc2UoKSE9PWkudG9Mb3dlckNhc2UoKSl0aHJvdyBuZXcgdGUoYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzICR7by51bnNpZ25lZD8iYW4gdW5zaWduZWQiOiJhIHNpZ25lZCJ9IDY0LWJpdCBMb25nICR7bnVsbCE9bj9gd2l0aCByYWRpeDogJHtufWA6IiJ9YCk7cmV0dXJuIG99c3RhdGljIGZyb21TdHJpbmcoZSx0LG4pe2xldCByPSExO3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCwiTmFOIj09PWUmJm48MjR8fCgiSW5maW5pdHkiPT09ZXx8IitJbmZpbml0eSI9PT1lfHwiLUluZmluaXR5Ij09PWUpJiZuPDM1P0NlLlpFUk86Q2UuX2Zyb21TdHJpbmcoZSxyLG4pfXN0YXRpYyBmcm9tQnl0ZXMoZSx0LG4pe3JldHVybiBuP0NlLmZyb21CeXRlc0xFKGUsdCk6Q2UuZnJvbUJ5dGVzQkUoZSx0KX1zdGF0aWMgZnJvbUJ5dGVzTEUoZSx0KXtyZXR1cm4gbmV3IENlKGVbMF18ZVsxXTw8OHxlWzJdPDwxNnxlWzNdPDwyNCxlWzRdfGVbNV08PDh8ZVs2XTw8MTZ8ZVs3XTw8MjQsdCl9c3RhdGljIGZyb21CeXRlc0JFKGUsdCl7cmV0dXJuIG5ldyBDZShlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9faXNMb25nX18iaW4gZSYmITA9PT1lLl9faXNMb25nX199c3RhdGljIGZyb21WYWx1ZShlLHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9DZS5mcm9tTnVtYmVyKGUsdCk6InN0cmluZyI9PXR5cGVvZiBlP0NlLmZyb21TdHJpbmcoZSx0KTpDZS5mcm9tQml0cyhlLmxvdyxlLmhpZ2gsImJvb2xlYW4iPT10eXBlb2YgdD90OmUudW5zaWduZWQpfWFkZChlKXtDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGY9ZS5sb3c+Pj4xNjtsZXQgdT0wLGE9MCxsPTAsaD0wO3JldHVybiBoKz1pKyg2NTUzNSZlLmxvdyksbCs9aD4+PjE2LGgmPTY1NTM1LGwrPXIrZixhKz1sPj4+MTYsbCY9NjU1MzUsYSs9bitzLHUrPWE+Pj4xNixhJj02NTUzNSx1Kz10K28sdSY9NjU1MzUsQ2UuZnJvbUJpdHMobDw8MTZ8aCx1PDwxNnxhLHRoaXMudW5zaWduZWQpfWFuZChlKXtyZXR1cm4gQ2UuaXNMb25nKGUpfHwoZT1DZS5mcm9tVmFsdWUoZSkpLENlLmZyb21CaXRzKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9Y29tcGFyZShlKXtpZihDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSksdGhpcy5lcShlKSlyZXR1cm4gMDtjb25zdCB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfWNvbXAoZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlKX1kaXZpZGUoZSl7aWYoQ2UuaXNMb25nKGUpfHwoZT1DZS5mcm9tVmFsdWUoZSkpLGUuaXNaZXJvKCkpdGhyb3cgbmV3IHRlKCJkaXZpc2lvbiBieSB6ZXJvIik7aWYoQWUpe2lmKCF0aGlzLnVuc2lnbmVkJiYtMjE0NzQ4MzY0OD09PXRoaXMuaGlnaCYmLTE9PT1lLmxvdyYmLTE9PT1lLmhpZ2gpcmV0dXJuIHRoaXM7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9BZS5kaXZfdTpBZS5kaXZfcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIENlLmZyb21CaXRzKHQsQWUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1pZih0aGlzLmlzWmVybygpKXJldHVybiB0aGlzLnVuc2lnbmVkP0NlLlVaRVJPOkNlLlpFUk87bGV0IHQsbixyO2lmKHRoaXMudW5zaWduZWQpe2lmKGUudW5zaWduZWR8fChlPWUudG9VbnNpZ25lZCgpKSxlLmd0KHRoaXMpKXJldHVybiBDZS5VWkVSTztpZihlLmd0KHRoaXMuc2hydSgxKSkpcmV0dXJuIENlLlVPTkU7cj1DZS5VWkVST31lbHNle2lmKHRoaXMuZXEoQ2UuTUlOX1ZBTFVFKSl7aWYoZS5lcShDZS5PTkUpfHxlLmVxKENlLk5FR19PTkUpKXJldHVybiBDZS5NSU5fVkFMVUU7aWYoZS5lcShDZS5NSU5fVkFMVUUpKXJldHVybiBDZS5PTkU7cmV0dXJuIHQ9dGhpcy5zaHIoMSkuZGl2KGUpLnNobCgxKSx0LmVxKENlLlpFUk8pP2UuaXNOZWdhdGl2ZSgpP0NlLk9ORTpDZS5ORUdfT05FOihuPXRoaXMuc3ViKGUubXVsKHQpKSxyPXQuYWRkKG4uZGl2KGUpKSxyKX1pZihlLmVxKENlLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMudW5zaWduZWQ/Q2UuVVpFUk86Q2UuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5kaXYoZS5uZWcoKSk6dGhpcy5uZWcoKS5kaXYoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZGl2KGUubmVnKCkpLm5lZygpO3I9Q2UuWkVST31mb3Iobj10aGlzO24uZ3RlKGUpOyl7dD1NYXRoLm1heCgxLE1hdGguZmxvb3Iobi50b051bWJlcigpL2UudG9OdW1iZXIoKSkpO2NvbnN0IGk9TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSxvPWk8PTQ4PzE6TWF0aC5wb3coMixpLTQ4KTtsZXQgcz1DZS5mcm9tTnVtYmVyKHQpLGY9cy5tdWwoZSk7Zm9yKDtmLmlzTmVnYXRpdmUoKXx8Zi5ndChuKTspdC09byxzPUNlLmZyb21OdW1iZXIodCx0aGlzLnVuc2lnbmVkKSxmPXMubXVsKGUpO3MuaXNaZXJvKCkmJihzPUNlLk9ORSkscj1yLmFkZChzKSxuPW4uc3ViKGYpfXJldHVybiByfWRpdihlKXtyZXR1cm4gdGhpcy5kaXZpZGUoZSl9ZXF1YWxzKGUpe3JldHVybiBDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSksKHRoaXMudW5zaWduZWQ9PT1lLnVuc2lnbmVkfHx0aGlzLmhpZ2g+Pj4zMSE9MXx8ZS5oaWdoPj4+MzEhPTEpJiYodGhpcy5oaWdoPT09ZS5oaWdoJiZ0aGlzLmxvdz09PWUubG93KX1lcShlKXtyZXR1cm4gdGhpcy5lcXVhbHMoZSl9Z2V0SGlnaEJpdHMoKXtyZXR1cm4gdGhpcy5oaWdofWdldEhpZ2hCaXRzVW5zaWduZWQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1nZXRMb3dCaXRzKCl7cmV0dXJuIHRoaXMubG93fWdldExvd0JpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0TnVtQml0c0Ficygpe2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLmVxKENlLk1JTl9WQUxVRSk/NjQ6dGhpcy5uZWcoKS5nZXROdW1CaXRzQWJzKCk7Y29uc3QgZT0wIT09dGhpcy5oaWdoP3RoaXMuaGlnaDp0aGlzLmxvdztsZXQgdDtmb3IodD0zMTt0PjAmJiEoZSYxPDx0KTt0LS0pO3JldHVybiAwIT09dGhpcy5oaWdoP3QrMzM6dCsxfWdyZWF0ZXJUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk+MH1ndChlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbihlKX1ncmVhdGVyVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKT49MH1ndGUoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWdlKGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuT3JFcXVhbChlKX1pc0V2ZW4oKXtyZXR1cm4hKDEmdGhpcy5sb3cpfWlzTmVnYXRpdmUoKXtyZXR1cm4hdGhpcy51bnNpZ25lZCYmdGhpcy5oaWdoPDB9aXNPZGQoKXtyZXR1cm4hKDEmfnRoaXMubG93KX1pc1Bvc2l0aXZlKCl7cmV0dXJuIHRoaXMudW5zaWduZWR8fHRoaXMuaGlnaD49MH1pc1plcm8oKXtyZXR1cm4gMD09PXRoaXMuaGlnaCYmMD09PXRoaXMubG93fWxlc3NUaGFuKGUpe3JldHVybiB0aGlzLmNvbXAoZSk8MH1sdChlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbihlKX1sZXNzVGhhbk9yRXF1YWwoZSl7cmV0dXJuIHRoaXMuY29tcChlKTw9MH1sdGUoZSl7cmV0dXJuIHRoaXMubGVzc1RoYW5PckVxdWFsKGUpfW1vZHVsbyhlKXtpZihDZS5pc0xvbmcoZSl8fChlPUNlLmZyb21WYWx1ZShlKSksQWUpe2NvbnN0IHQ9KHRoaXMudW5zaWduZWQ/QWUucmVtX3U6QWUucmVtX3MpKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBDZS5mcm9tQml0cyh0LEFlLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9cmV0dXJuIHRoaXMuc3ViKHRoaXMuZGl2KGUpLm11bChlKSl9bW9kKGUpe3JldHVybiB0aGlzLm1vZHVsbyhlKX1yZW0oZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfW11bHRpcGx5KGUpe2lmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIENlLlpFUk87aWYoQ2UuaXNMb25nKGUpfHwoZT1DZS5mcm9tVmFsdWUoZSkpLEFlKXtjb25zdCB0PUFlLm11bCh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gQ2UuZnJvbUJpdHModCxBZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKGUuaXNaZXJvKCkpcmV0dXJuIENlLlpFUk87aWYodGhpcy5lcShDZS5NSU5fVkFMVUUpKXJldHVybiBlLmlzT2RkKCk/Q2UuTUlOX1ZBTFVFOkNlLlpFUk87aWYoZS5lcShDZS5NSU5fVkFMVUUpKXJldHVybiB0aGlzLmlzT2RkKCk/Q2UuTUlOX1ZBTFVFOkNlLlpFUk87aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIGUuaXNOZWdhdGl2ZSgpP3RoaXMubmVnKCkubXVsKGUubmVnKCkpOnRoaXMubmVnKCkubXVsKGUpLm5lZygpO2lmKGUuaXNOZWdhdGl2ZSgpKXJldHVybiB0aGlzLm11bChlLm5lZygpKS5uZWcoKTtpZih0aGlzLmx0KENlLlRXT19QV1JfMjQpJiZlLmx0KENlLlRXT19QV1JfMjQpKXJldHVybiBDZS5mcm9tTnVtYmVyKHRoaXMudG9OdW1iZXIoKSplLnRvTnVtYmVyKCksdGhpcy51bnNpZ25lZCk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGY9ZS5sb3c+Pj4xNix1PTY1NTM1JmUubG93O2xldCBhPTAsbD0wLGg9MCxjPTA7cmV0dXJuIGMrPWkqdSxoKz1jPj4+MTYsYyY9NjU1MzUsaCs9cip1LGwrPWg+Pj4xNixoJj02NTUzNSxoKz1pKmYsbCs9aD4+PjE2LGgmPTY1NTM1LGwrPW4qdSxhKz1sPj4+MTYsbCY9NjU1MzUsbCs9cipmLGErPWw+Pj4xNixsJj02NTUzNSxsKz1pKnMsYSs9bD4+PjE2LGwmPTY1NTM1LGErPXQqdStuKmYrcipzK2kqbyxhJj02NTUzNSxDZS5mcm9tQml0cyhoPDwxNnxjLGE8PDE2fGwsdGhpcy51bnNpZ25lZCl9bXVsKGUpe3JldHVybiB0aGlzLm11bHRpcGx5KGUpfW5lZ2F0ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmVxKENlLk1JTl9WQUxVRSk/Q2UuTUlOX1ZBTFVFOnRoaXMubm90KCkuYWRkKENlLk9ORSl9bmVnKCl7cmV0dXJuIHRoaXMubmVnYXRlKCl9bm90KCl7cmV0dXJuIENlLmZyb21CaXRzKH50aGlzLmxvdyx+dGhpcy5oaWdoLHRoaXMudW5zaWduZWQpfW5vdEVxdWFscyhlKXtyZXR1cm4hdGhpcy5lcXVhbHMoZSl9bmVxKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1uZShlKXtyZXR1cm4gdGhpcy5ub3RFcXVhbHMoZSl9b3IoZSl7cmV0dXJuIENlLmlzTG9uZyhlKXx8KGU9Q2UuZnJvbVZhbHVlKGUpKSxDZS5mcm9tQml0cyh0aGlzLmxvd3xlLmxvdyx0aGlzLmhpZ2h8ZS5oaWdoLHRoaXMudW5zaWduZWQpfXNoaWZ0TGVmdChlKXtyZXR1cm4gQ2UuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP0NlLmZyb21CaXRzKHRoaXMubG93PDxlLHRoaXMuaGlnaDw8ZXx0aGlzLmxvdz4+PjMyLWUsdGhpcy51bnNpZ25lZCk6Q2UuZnJvbUJpdHMoMCx0aGlzLmxvdzw8ZS0zMix0aGlzLnVuc2lnbmVkKX1zaGwoZSl7cmV0dXJuIHRoaXMuc2hpZnRMZWZ0KGUpfXNoaWZ0UmlnaHQoZSl7cmV0dXJuIENlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT0oZSY9NjMpP3RoaXM6ZTwzMj9DZS5mcm9tQml0cyh0aGlzLmxvdz4+PmV8dGhpcy5oaWdoPDwzMi1lLHRoaXMuaGlnaD4+ZSx0aGlzLnVuc2lnbmVkKTpDZS5mcm9tQml0cyh0aGlzLmhpZ2g+PmUtMzIsdGhpcy5oaWdoPj0wPzA6LTEsdGhpcy51bnNpZ25lZCl9c2hyKGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHQoZSl9c2hpZnRSaWdodFVuc2lnbmVkKGUpe2lmKENlLmlzTG9uZyhlKSYmKGU9ZS50b0ludCgpKSwwPT09KGUmPTYzKSlyZXR1cm4gdGhpczt7Y29uc3QgdD10aGlzLmhpZ2g7aWYoZTwzMil7Y29uc3Qgbj10aGlzLmxvdztyZXR1cm4gQ2UuZnJvbUJpdHMobj4+PmV8dDw8MzItZSx0Pj4+ZSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gMzI9PT1lP0NlLmZyb21CaXRzKHQsMCx0aGlzLnVuc2lnbmVkKTpDZS5mcm9tQml0cyh0Pj4+ZS0zMiwwLHRoaXMudW5zaWduZWQpfX1zaHJfdShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c2hydShlKXtyZXR1cm4gdGhpcy5zaGlmdFJpZ2h0VW5zaWduZWQoZSl9c3VidHJhY3QoZSl7cmV0dXJuIENlLmlzTG9uZyhlKXx8KGU9Q2UuZnJvbVZhbHVlKGUpKSx0aGlzLmFkZChlLm5lZygpKX1zdWIoZSl7cmV0dXJuIHRoaXMuc3VidHJhY3QoZSl9dG9JbnQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzLmxvdz4+PjA6dGhpcy5sb3d9dG9OdW1iZXIoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD8odGhpcy5oaWdoPj4+MCkqamUrKHRoaXMubG93Pj4+MCk6dGhpcy5oaWdoKmplKyh0aGlzLmxvdz4+PjApfXRvQmlnSW50KCl7cmV0dXJuIEJpZ0ludCh0aGlzLnRvU3RyaW5nKCkpfXRvQnl0ZXMoZSl7cmV0dXJuIGU/dGhpcy50b0J5dGVzTEUoKTp0aGlzLnRvQnl0ZXNCRSgpfXRvQnl0ZXNMRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuWzI1NSZ0LHQ+Pj44JjI1NSx0Pj4+MTYmMjU1LHQ+Pj4yNCwyNTUmZSxlPj4+OCYyNTUsZT4+PjE2JjI1NSxlPj4+MjRdfXRvQnl0ZXNCRSgpe2NvbnN0IGU9dGhpcy5oaWdoLHQ9dGhpcy5sb3c7cmV0dXJuW2U+Pj4yNCxlPj4+MTYmMjU1LGU+Pj44JjI1NSwyNTUmZSx0Pj4+MjQsdD4+PjE2JjI1NSx0Pj4+OCYyNTUsMjU1JnRdfXRvU2lnbmVkKCl7cmV0dXJuIHRoaXMudW5zaWduZWQ/Q2UuZnJvbUJpdHModGhpcy5sb3csdGhpcy5oaWdoLCExKTp0aGlzfXRvU3RyaW5nKGUpe2lmKChlPWV8fDEwKTwyfHwzNjxlKXRocm93IG5ldyB0ZSgicmFkaXgiKTtpZih0aGlzLmlzWmVybygpKXJldHVybiIwIjtpZih0aGlzLmlzTmVnYXRpdmUoKSl7aWYodGhpcy5lcShDZS5NSU5fVkFMVUUpKXtjb25zdCB0PUNlLmZyb21OdW1iZXIoZSksbj10aGlzLmRpdih0KSxyPW4ubXVsKHQpLnN1Yih0aGlzKTtyZXR1cm4gbi50b1N0cmluZyhlKStyLnRvSW50KCkudG9TdHJpbmcoZSl9cmV0dXJuIi0iK3RoaXMubmVnKCkudG9TdHJpbmcoZSl9Y29uc3QgdD1DZS5mcm9tTnVtYmVyKE1hdGgucG93KGUsNiksdGhpcy51bnNpZ25lZCk7bGV0IG49dGhpcyxyPSIiO2Zvcig7Oyl7Y29uc3QgaT1uLmRpdih0KTtsZXQgbz0obi5zdWIoaS5tdWwodCkpLnRvSW50KCk+Pj4wKS50b1N0cmluZyhlKTtpZihuPWksbi5pc1plcm8oKSlyZXR1cm4gbytyO2Zvcig7by5sZW5ndGg8Njspbz0iMCIrbztyPSIiK28rcn19dG9VbnNpZ25lZCgpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXM6Q2UuZnJvbUJpdHModGhpcy5sb3csdGhpcy5oaWdoLCEwKX14b3IoZSl7cmV0dXJuIENlLmlzTG9uZyhlKXx8KGU9Q2UuZnJvbVZhbHVlKGUpKSxDZS5mcm9tQml0cyh0aGlzLmxvd15lLmxvdyx0aGlzLmhpZ2heZS5oaWdoLHRoaXMudW5zaWduZWQpfWVxeigpe3JldHVybiB0aGlzLmlzWmVybygpfWxlKGUpe3JldHVybiB0aGlzLmxlc3NUaGFuT3JFcXVhbChlKX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmZS5yZWxheGVkP3RoaXMudG9OdW1iZXIoKTp7JG51bWJlckxvbmc6dGhpcy50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2NvbnN0e3VzZUJpZ0ludDY0Om49ITEscmVsYXhlZDpyPSEwfT17Li4udH07aWYoZS4kbnVtYmVyTG9uZy5sZW5ndGg+MjApdGhyb3cgbmV3IHRlKCIkbnVtYmVyTG9uZyBzdHJpbmcgaXMgdG9vIGxvbmciKTtpZighVmUudGVzdChlLiRudW1iZXJMb25nKSl0aHJvdyBuZXcgdGUoYCRudW1iZXJMb25nIHN0cmluZyAiJHtlLiRudW1iZXJMb25nfSIgaXMgaW4gYW4gaW52YWxpZCBmb3JtYXRgKTtpZihuKXtjb25zdCB0PUJpZ0ludChlLiRudW1iZXJMb25nKTtyZXR1cm4gQmlnSW50LmFzSW50Tig2NCx0KX1jb25zdCBpPUNlLmZyb21TdHJpbmcoZS4kbnVtYmVyTG9uZyk7cmV0dXJuIHI/aS50b051bWJlcigpOml9aW5zcGVjdChlLHQsbil7bj8/PUU7cmV0dXJuYG5ldyBMb25nKCR7bih0aGlzLnRvU3RyaW5nKCksdCl9JHt0aGlzLnVuc2lnbmVkP2AsICR7bih0aGlzLnVuc2lnbmVkLHQpfWA6IiJ9KWB9fWNvbnN0IE1lPS9eKFwrfC0pPyhcZCt8KFxkKlwuXGQqKSk/KEV8ZSk/KFstK10pPyhcZCspPyQvLFBlPS9eKFwrfC0pPyhJbmZpbml0eXxpbmYpJC9pLEplPS9eKFwrfC0pP05hTiQvaSxrZT02MTExLFllPS02MTc2LEhlPXllLmZyb21OdW1iZXJBcnJheShbMTI0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLHFlPXllLmZyb21OdW1iZXJBcnJheShbMjQ4LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLFdlPXllLmZyb21OdW1iZXJBcnJheShbMTIwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXS5yZXZlcnNlKCkpLEtlPS9eKFstK10pPyhcZCspPyQvO2Z1bmN0aW9uIFplKGUpe3JldHVybiFpc05hTihwYXJzZUludChlLDEwKSl9ZnVuY3Rpb24gR2UoZSl7Y29uc3QgdD1DZS5mcm9tTnVtYmVyKDFlOSk7bGV0IG49Q2UuZnJvbU51bWJlcigwKTtpZighKGUucGFydHNbMF18fGUucGFydHNbMV18fGUucGFydHNbMl18fGUucGFydHNbM10pKXJldHVybntxdW90aWVudDplLHJlbTpufTtmb3IobGV0IHI9MDtyPD0zO3IrKyluPW4uc2hpZnRMZWZ0KDMyKSxuPW4uYWRkKG5ldyBDZShlLnBhcnRzW3JdLDApKSxlLnBhcnRzW3JdPW4uZGl2KHQpLmxvdyxuPW4ubW9kdWxvKHQpO3JldHVybntxdW90aWVudDplLHJlbTpufX1mdW5jdGlvbiBYZShlLHQpe3Rocm93IG5ldyB0ZShgIiR7ZX0iIGlzIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIC0gJHt0fWApfWNsYXNzIFFlIGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJEZWNpbWFsMTI4In1ieXRlcztjb25zdHJ1Y3RvcihlKXtpZihzdXBlcigpLCJzdHJpbmciPT10eXBlb2YgZSl0aGlzLmJ5dGVzPVFlLmZyb21TdHJpbmcoZSkuYnl0ZXM7ZWxzZXtpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5fHx5KGUpKSl0aHJvdyBuZXcgdGUoIkRlY2ltYWwxMjggbXVzdCB0YWtlIGEgQnVmZmVyIG9yIHN0cmluZyIpO2lmKDE2IT09ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyB0ZSgiRGVjaW1hbDEyOCBtdXN0IHRha2UgYSBCdWZmZXIgb2YgMTYgYnl0ZXMiKTt0aGlzLmJ5dGVzPWV9fXN0YXRpYyBmcm9tU3RyaW5nKGUpe3JldHVybiBRZS5fZnJvbVN0cmluZyhlLHthbGxvd1JvdW5kaW5nOiExfSl9c3RhdGljIGZyb21TdHJpbmdXaXRoUm91bmRpbmcoZSl7cmV0dXJuIFFlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITB9KX1zdGF0aWMgX2Zyb21TdHJpbmcoZSx0KXtsZXQgbj0hMSxyPSExLGk9ITEsbz0hMSxzPTAsZj0wLHU9MCxhPTAsbD0wO2NvbnN0IGg9WzBdO2xldCBjPTAsZz0wLGQ9MCxiPTAscD1uZXcgQ2UoMCwwKSx5PW5ldyBDZSgwLDApLHc9MCxtPTA7aWYoZS5sZW5ndGg+PTdlMyl0aHJvdyBuZXcgdGUoZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7Y29uc3QgQj1lLm1hdGNoKE1lKSxTPWUubWF0Y2goUGUpLEU9ZS5tYXRjaChKZSk7aWYoIUImJiFTJiYhRXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyB0ZShlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtpZihCKXtjb25zdCB0PUJbMl0sbj1CWzRdLHI9Qls1XSxpPUJbNl07biYmdm9pZCAwPT09aSYmWGUoZSwibWlzc2luZyBleHBvbmVudCBwb3dlciIpLG4mJnZvaWQgMD09PXQmJlhlKGUsIm1pc3NpbmcgZXhwb25lbnQgYmFzZSIpLHZvaWQgMD09PW4mJihyfHxpKSYmWGUoZSwibWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCIpfWlmKCIrIiE9PWVbbV0mJiItIiE9PWVbbV18fChyPSEwLG49Ii0iPT09ZVttKytdKSwhWmUoZVttXSkmJiIuIiE9PWVbbV0pe2lmKCJpIj09PWVbbV18fCJJIj09PWVbbV0pcmV0dXJuIG5ldyBRZShuP3FlOldlKTtpZigiTiI9PT1lW21dKXJldHVybiBuZXcgUWUoSGUpfWZvcig7WmUoZVttXSl8fCIuIj09PWVbbV07KSIuIiE9PWVbbV0/KGM8MzQmJigiMCIhPT1lW21dfHxvKSYmKG98fChsPWYpLG89ITAsaFtnKytdPXBhcnNlSW50KGVbbV0sMTApLGMrPTEpLG8mJih1Kz0xKSxpJiYoYSs9MSksZis9MSxtKz0xKTooaSYmWGUoZSwiY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcyIpLGk9ITAsbSs9MSk7aWYoaSYmIWYpdGhyb3cgbmV3IHRlKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2lmKCJlIj09PWVbbV18fCJFIj09PWVbbV0pe2NvbnN0IHQ9ZS5zdWJzdHIoKyttKS5tYXRjaChLZSk7aWYoIXR8fCF0WzJdKXJldHVybiBuZXcgUWUoSGUpO2I9cGFyc2VJbnQodFswXSwxMCksbSs9dFswXS5sZW5ndGh9aWYoZVttXSlyZXR1cm4gbmV3IFFlKEhlKTtpZihjKXtpZihkPWMtMSxzPXUsMSE9PXMpZm9yKDsiMCI9PT1lW2wrcy0xK051bWJlcihyKStOdW1iZXIoaSldOylzLT0xfWVsc2UgaFswXT0wLHU9MSxjPTEscz0wO2ZvcihiPD1hJiZhPmIrMTYzODQ/Yj1ZZTpiLT1hO2I+a2U7KXtpZihkKz0xLGQ+PTM0KXtpZigwPT09cyl7Yj1rZTticmVha31YZShlLCJvdmVyZmxvdyIpfWItPTF9aWYodC5hbGxvd1JvdW5kaW5nKXtmb3IoO2I8WWV8fGM8dTspe2lmKDA9PT1kJiZzPGMpe2I9WWUscz0wO2JyZWFrfWlmKGM8dT91LT0xOmQtPTEsYjxrZSliKz0xO2Vsc2V7aWYoaC5qb2luKCIiKS5tYXRjaCgvXjArJC8pKXtiPWtlO2JyZWFrfVhlKGUsIm92ZXJmbG93Iil9fWlmKGQrMTxzKXtsZXQgdD1mO2kmJihsKz0xLHQrPTEpLHImJihsKz0xLHQrPTEpO2NvbnN0IG89cGFyc2VJbnQoZVtsK2QrMV0sMTApO2xldCBzPTA7aWYobz49NSYmKHM9MSw1PT09bykpe3M9aFtkXSUyPT0xPzE6MDtmb3IobGV0IG49bCtkKzI7bjx0O24rKylpZihwYXJzZUludChlW25dLDEwKSl7cz0xO2JyZWFrfX1pZihzKXtsZXQgZT1kO2Zvcig7ZT49MCYmKytoW2VdPjk7ZS0tKWlmKGhbZV09MCwwPT09ZSl7aWYoIShiPGtlKSlyZXR1cm4gbmV3IFFlKG4/cWU6V2UpO2IrPTEsaFtlXT0xfX19fWVsc2V7Zm9yKDtiPFllfHxjPHU7KXtpZigwPT09ZCl7aWYoMD09PXMpe2I9WWU7YnJlYWt9WGUoZSwiZXhwb25lbnQgdW5kZXJmbG93Iil9Yzx1PygiMCIhPT1lW3UtMStOdW1iZXIocikrTnVtYmVyKGkpXSYmMCE9PXMmJlhlKGUsImluZXhhY3Qgcm91bmRpbmciKSx1LT0xKTooMCE9PWhbZF0mJlhlKGUsImluZXhhY3Qgcm91bmRpbmciKSxkLT0xKSxiPGtlP2IrPTE6WGUoZSwib3ZlcmZsb3ciKX1pZihkKzE8cyl7aSYmKGwrPTEpLHImJihsKz0xKTswIT09cGFyc2VJbnQoZVtsK2QrMV0sMTApJiZYZShlLCJpbmV4YWN0IHJvdW5kaW5nIil9fWlmKHA9Q2UuZnJvbU51bWJlcigwKSx5PUNlLmZyb21OdW1iZXIoMCksMD09PXMpcD1DZS5mcm9tTnVtYmVyKDApLHk9Q2UuZnJvbU51bWJlcigwKTtlbHNlIGlmKGQ8MTcpe2xldCBlPTA7Zm9yKHk9Q2UuZnJvbU51bWJlcihoW2UrK10pLHA9bmV3IENlKDAsMCk7ZTw9ZDtlKyspeT15Lm11bHRpcGx5KENlLmZyb21OdW1iZXIoMTApKSx5PXkuYWRkKENlLmZyb21OdW1iZXIoaFtlXSkpfWVsc2V7bGV0IGU9MDtmb3IocD1DZS5mcm9tTnVtYmVyKGhbZSsrXSk7ZTw9ZC0xNztlKyspcD1wLm11bHRpcGx5KENlLmZyb21OdW1iZXIoMTApKSxwPXAuYWRkKENlLmZyb21OdW1iZXIoaFtlXSkpO2Zvcih5PUNlLmZyb21OdW1iZXIoaFtlKytdKTtlPD1kO2UrKyl5PXkubXVsdGlwbHkoQ2UuZnJvbU51bWJlcigxMCkpLHk9eS5hZGQoQ2UuZnJvbU51bWJlcihoW2VdKSl9Y29uc3QgVT1mdW5jdGlvbihlLHQpe2lmKCFlJiYhdClyZXR1cm57aGlnaDpDZS5mcm9tTnVtYmVyKDApLGxvdzpDZS5mcm9tTnVtYmVyKDApfTtjb25zdCBuPWUuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxyPW5ldyBDZShlLmdldExvd0JpdHMoKSwwKSxpPXQuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSxvPW5ldyBDZSh0LmdldExvd0JpdHMoKSwwKTtsZXQgcz1uLm11bHRpcGx5KGkpLGY9bi5tdWx0aXBseShvKTtjb25zdCB1PXIubXVsdGlwbHkoaSk7bGV0IGE9ci5tdWx0aXBseShvKTtyZXR1cm4gcz1zLmFkZChmLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLGY9bmV3IENlKGYuZ2V0TG93Qml0cygpLDApLmFkZCh1KS5hZGQoYS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxzPXMuYWRkKGYuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksYT1mLnNoaWZ0TGVmdCgzMikuYWRkKG5ldyBDZShhLmdldExvd0JpdHMoKSwwKSkse2hpZ2g6cyxsb3c6YX19KHAsQ2UuZnJvbVN0cmluZygiMTAwMDAwMDAwMDAwMDAwMDAwIikpO1UubG93PVUubG93LmFkZCh5KSxmdW5jdGlvbihlLHQpe2NvbnN0IG49ZS5oaWdoPj4+MCxyPXQuaGlnaD4+PjA7aWYobjxyKXJldHVybiEwO2lmKG49PT1yJiZlLmxvdz4+PjA8dC5sb3c+Pj4wKXJldHVybiEwO3JldHVybiExfShVLmxvdyx5KSYmKFUuaGlnaD1VLmhpZ2guYWRkKENlLmZyb21OdW1iZXIoMSkpKSx3PWIrNjE3Njtjb25zdCBPPXtsb3c6Q2UuZnJvbU51bWJlcigwKSxoaWdoOkNlLmZyb21OdW1iZXIoMCl9O1UuaGlnaC5zaGlmdFJpZ2h0VW5zaWduZWQoNDkpLmFuZChDZS5mcm9tTnVtYmVyKDEpKS5lcXVhbHMoQ2UuZnJvbU51bWJlcigxKSk/KE8uaGlnaD1PLmhpZ2gub3IoQ2UuZnJvbU51bWJlcigzKS5zaGlmdExlZnQoNjEpKSxPLmhpZ2g9Ty5oaWdoLm9yKENlLmZyb21OdW1iZXIodykuYW5kKENlLmZyb21OdW1iZXIoMTYzODMpLnNoaWZ0TGVmdCg0NykpKSxPLmhpZ2g9Ty5oaWdoLm9yKFUuaGlnaC5hbmQoQ2UuZnJvbU51bWJlcigweDdmZmZmZmZmZmZmZikpKSk6KE8uaGlnaD1PLmhpZ2gub3IoQ2UuZnJvbU51bWJlcigxNjM4MyZ3KS5zaGlmdExlZnQoNDkpKSxPLmhpZ2g9Ty5oaWdoLm9yKFUuaGlnaC5hbmQoQ2UuZnJvbU51bWJlcig1NjI5NDk5NTM0MjEzMTEpKSkpLE8ubG93PVUubG93LG4mJihPLmhpZ2g9Ty5oaWdoLm9yKENlLmZyb21TdHJpbmcoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSkpO2NvbnN0IE49eWUuYWxsb2NhdGVVbnNhZmUoMTYpO3JldHVybiBtPTAsTlttKytdPTI1NSZPLmxvdy5sb3csTlttKytdPU8ubG93Lmxvdz4+OCYyNTUsTlttKytdPU8ubG93Lmxvdz4+MTYmMjU1LE5bbSsrXT1PLmxvdy5sb3c+PjI0JjI1NSxOW20rK109MjU1Jk8ubG93LmhpZ2gsTlttKytdPU8ubG93LmhpZ2g+PjgmMjU1LE5bbSsrXT1PLmxvdy5oaWdoPj4xNiYyNTUsTlttKytdPU8ubG93LmhpZ2g+PjI0JjI1NSxOW20rK109MjU1Jk8uaGlnaC5sb3csTlttKytdPU8uaGlnaC5sb3c+PjgmMjU1LE5bbSsrXT1PLmhpZ2gubG93Pj4xNiYyNTUsTlttKytdPU8uaGlnaC5sb3c+PjI0JjI1NSxOW20rK109MjU1Jk8uaGlnaC5oaWdoLE5bbSsrXT1PLmhpZ2guaGlnaD4+OCYyNTUsTlttKytdPU8uaGlnaC5oaWdoPj4xNiYyNTUsTlttKytdPU8uaGlnaC5oaWdoPj4yNCYyNTUsbmV3IFFlKE4pfXRvU3RyaW5nKCl7bGV0IGUsdD0wO2NvbnN0IG49bmV3IEFycmF5KDM2KTtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyluW2VdPTA7bGV0IHIsaSxvLHM9MCxmPSExLHU9e3BhcnRzOlswLDAsMCwwXX07Y29uc3QgYT1bXTtzPTA7Y29uc3QgbD10aGlzLmJ5dGVzLGg9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQsYz1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNCxnPWxbcysrXXxsW3MrK108PDh8bFtzKytdPDwxNnxsW3MrK108PDI0LGQ9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQ7cz0wOyh7bG93Om5ldyBDZShoLGMpLGhpZ2g6bmV3IENlKGcsZCl9KS5oaWdoLmxlc3NUaGFuKENlLlpFUk8pJiZhLnB1c2goIi0iKTtjb25zdCBiPWQ+PjI2JjMxO2lmKGI+PjM9PTMpe2lmKDMwPT09YilyZXR1cm4gYS5qb2luKCIiKSsiSW5maW5pdHkiO2lmKDMxPT09YilyZXR1cm4iTmFOIjtlPWQ+PjE1JjE2MzgzLHI9OCsoZD4+MTQmMSl9ZWxzZSByPWQ+PjE0JjcsZT1kPj4xNyYxNjM4Mztjb25zdCBwPWUtNjE3NjtpZih1LnBhcnRzWzBdPSgxNjM4MyZkKSsoKDE1JnIpPDwxNCksdS5wYXJ0c1sxXT1nLHUucGFydHNbMl09Yyx1LnBhcnRzWzNdPWgsMD09PXUucGFydHNbMF0mJjA9PT11LnBhcnRzWzFdJiYwPT09dS5wYXJ0c1syXSYmMD09PXUucGFydHNbM10pZj0hMDtlbHNlIGZvcihvPTM7bz49MDtvLS0pe2xldCBlPTA7Y29uc3QgdD1HZSh1KTtpZih1PXQucXVvdGllbnQsZT10LnJlbS5sb3csZSlmb3IoaT04O2k+PTA7aS0tKW5bOSpvK2ldPWUlMTAsZT1NYXRoLmZsb29yKGUvMTApfWlmKGYpdD0xLG5bc109MDtlbHNlIGZvcih0PTM2OyFuW3NdOyl0LT0xLHMrPTE7Y29uc3QgeT10LTErcDtpZih5Pj0zNHx8eTw9LTd8fHA+MCl7aWYodD4zNClyZXR1cm4gYS5wdXNoKCIwIikscD4wP2EucHVzaChgRSske3B9YCk6cDwwJiZhLnB1c2goYEUke3B9YCksYS5qb2luKCIiKTthLnB1c2goYCR7bltzKytdfWApLHQtPTEsdCYmYS5wdXNoKCIuIik7Zm9yKGxldCBlPTA7ZTx0O2UrKylhLnB1c2goYCR7bltzKytdfWApO2EucHVzaCgiRSIpLHk+MD9hLnB1c2goYCske3l9YCk6YS5wdXNoKGAke3l9YCl9ZWxzZSBpZihwPj0wKWZvcihsZXQgZT0wO2U8dDtlKyspYS5wdXNoKGAke25bcysrXX1gKTtlbHNle2xldCBlPXQrcDtpZihlPjApZm9yKGxldCB0PTA7dDxlO3QrKylhLnB1c2goYCR7bltzKytdfWApO2Vsc2UgYS5wdXNoKCIwIik7Zm9yKGEucHVzaCgiLiIpO2UrKzwwOylhLnB1c2goIjAiKTtmb3IobGV0IHI9MDtyPHQtTWF0aC5tYXgoZS0xLDApO3IrKylhLnB1c2goYCR7bltzKytdfWApfXJldHVybiBhLmpvaW4oIiIpfXRvSlNPTigpe3JldHVybnskbnVtYmVyRGVjaW1hbDp0aGlzLnRvU3RyaW5nKCl9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIFFlLmZyb21TdHJpbmcoZS4kbnVtYmVyRGVjaW1hbCl9aW5zcGVjdChlLHQsbil7bj8/PUU7cmV0dXJuYG5ldyBEZWNpbWFsMTI4KCR7bih0aGlzLnRvU3RyaW5nKCksdCl9KWB9fWNsYXNzIGV0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJEb3VibGUifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9K2V9c3RhdGljIGZyb21TdHJpbmcoZSl7Y29uc3QgdD1OdW1iZXIoZSk7aWYoIk5hTiI9PT1lKXJldHVybiBuZXcgZXQoTmFOKTtpZigiSW5maW5pdHkiPT09ZSlyZXR1cm4gbmV3IGV0KDEvMCk7aWYoIi1JbmZpbml0eSI9PT1lKXJldHVybiBuZXcgZXQoLTEvMCk7aWYoIU51bWJlci5pc0Zpbml0ZSh0KSl0aHJvdyBuZXcgdGUoYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgRG91YmxlYCk7aWYoZS50cmltKCkhPT1lKXRocm93IG5ldyB0ZShgSW5wdXQ6ICcke2V9JyBjb250YWlucyB3aGl0ZXNwYWNlYCk7aWYoIiI9PT1lKXRocm93IG5ldyB0ZSgiSW5wdXQgaXMgYW4gZW1wdHkgc3RyaW5nIik7aWYoL1teLTAtOS4rZUVdLy50ZXN0KGUpKXRocm93IG5ldyB0ZShgSW5wdXQ6ICcke2V9JyBpcyBub3QgaW4gZGVjaW1hbCBvciBleHBvbmVudGlhbCBub3RhdGlvbmApO3JldHVybiBuZXcgZXQodCl9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5sZWdhY3l8fGUucmVsYXhlZCYmaXNGaW5pdGUodGhpcy52YWx1ZSkpP3RoaXMudmFsdWU6T2JqZWN0LmlzKE1hdGguc2lnbih0aGlzLnZhbHVlKSwtMCk/eyRudW1iZXJEb3VibGU6Ii0wLjAifTp7JG51bWJlckRvdWJsZTpOdW1iZXIuaXNJbnRlZ2VyKHRoaXMudmFsdWUpP3RoaXMudmFsdWUudG9GaXhlZCgxKTp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7Y29uc3Qgbj1wYXJzZUZsb2F0KGUuJG51bWJlckRvdWJsZSk7cmV0dXJuIHQmJnQucmVsYXhlZD9uOm5ldyBldChuKX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PUUsYG5ldyBEb3VibGUoJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNsYXNzIHR0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJJbnQzMiJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSxlIGluc3RhbmNlb2YgTnVtYmVyJiYoZT1lLnZhbHVlT2YoKSksdGhpcy52YWx1ZT0wfCtlfXN0YXRpYyBmcm9tU3RyaW5nKGUpe2NvbnN0IHQ9dmUoZSksbj1OdW1iZXIoZSk7aWYoTjxuKXRocm93IG5ldyB0ZShgSW5wdXQ6ICcke2V9JyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZih4Pm4pdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZighTnVtYmVyLmlzU2FmZUludGVnZXIobikpdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO2lmKG4udG9TdHJpbmcoKSE9PXQpdGhyb3cgbmV3IHRlKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHZhbGlkIEludDMyIHN0cmluZ2ApO3JldHVybiBuZXcgdHQobil9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5yZWxheGVkfHxlLmxlZ2FjeSk/dGhpcy52YWx1ZTp7JG51bWJlckludDp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7cmV0dXJuIHQmJnQucmVsYXhlZD9wYXJzZUludChlLiRudW1iZXJJbnQsMTApOm5ldyB0dChlLiRudW1iZXJJbnQpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89RSxgbmV3IEludDMyKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBudCBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWF4S2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWF4S2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBudH1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNYXhLZXkoKSJ9fWNsYXNzIHJ0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJNaW5LZXkifXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRtaW5LZXk6MX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oKXtyZXR1cm4gbmV3IHJ0fWluc3BlY3QoKXtyZXR1cm4ibmV3IE1pbktleSgpIn19bGV0IGl0PW51bGw7Y29uc3Qgb3Q9bmV3IFdlYWtNYXA7Y2xhc3Mgc3QgZXh0ZW5kcyBtZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk9iamVjdElkIn1zdGF0aWMgaW5kZXg9TWF0aC5mbG9vcigxNjc3NzIxNSpNYXRoLnJhbmRvbSgpKTtzdGF0aWMgY2FjaGVIZXhTdHJpbmc7YnVmZmVyO2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKHN1cGVyKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYiaWQiaW4gZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmlkJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUuaWQpKXRocm93IG5ldyB0ZSgiQXJndW1lbnQgcGFzc2VkIGluIG11c3QgaGF2ZSBhbiBpZCB0aGF0IGlzIG9mIHR5cGUgc3RyaW5nIG9yIEJ1ZmZlciIpO3Q9InRvSGV4U3RyaW5nImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvSGV4U3RyaW5nP3llLmZyb21IZXgoZS50b0hleFN0cmluZygpKTplLmlkfWVsc2UgdD1lO2lmKG51bGw9PXQpdGhpcy5idWZmZXI9c3QuZ2VuZXJhdGUoKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyh0KSYmMTI9PT10LmJ5dGVMZW5ndGgpdGhpcy5idWZmZXI9eWUudG9Mb2NhbEJ1ZmZlclR5cGUodCk7ZWxzZXtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbmV3IHRlKCJBcmd1bWVudCBwYXNzZWQgaW4gZG9lcyBub3QgbWF0Y2ggdGhlIGFjY2VwdGVkIHR5cGVzIik7aWYoIXN0LnZhbGlkYXRlSGV4U3RyaW5nKHQpKXRocm93IG5ldyB0ZSgiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLmJ1ZmZlcj15ZS5mcm9tSGV4KHQpLHN0LmNhY2hlSGV4U3RyaW5nJiZvdC5zZXQodGhpcyx0KX19Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lLHN0LmNhY2hlSGV4U3RyaW5nJiZvdC5zZXQodGhpcyx5ZS50b0hleChlKSl9c3RhdGljIHZhbGlkYXRlSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8MjQ7dCsrKXtjb25zdCBuPWUuY2hhckNvZGVBdCh0KTtpZighKG4+PTQ4JiZuPD01N3x8bj49OTcmJm48PTEwMnx8bj49NjUmJm48PTcwKSlyZXR1cm4hMX1yZXR1cm4hMH10b0hleFN0cmluZygpe2lmKHN0LmNhY2hlSGV4U3RyaW5nKXtjb25zdCBlPW90LmdldCh0aGlzKTtpZihlKXJldHVybiBlfWNvbnN0IGU9eWUudG9IZXgodGhpcy5pZCk7cmV0dXJuIHN0LmNhY2hlSGV4U3RyaW5nJiZvdC5zZXQodGhpcyxlKSxlfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gc3QuaW5kZXg9KHN0LmluZGV4KzEpJTE2Nzc3MjE1fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PXN0LmdldEluYygpLG49eWUuYWxsb2NhdGVVbnNhZmUoMTIpO3JldHVybiBVZS5zZXRJbnQzMkJFKG4sMCxlKSxudWxsPT09aXQmJihpdD15ZS5yYW5kb21CeXRlcyg1KSksbls0XT1pdFswXSxuWzVdPWl0WzFdLG5bNl09aXRbMl0sbls3XT1pdFszXSxuWzhdPWl0WzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+PjgmMjU1LG5bOV09dD4+MTYmMjU1LG59dG9TdHJpbmcoZSl7cmV0dXJuImJhc2U2NCI9PT1lP3llLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfXN0YXRpYyBpcyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJPYmplY3RJZCI9PT1lLl9ic29udHlwZX1lcXVhbHMoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZihzdC5pcyhlKSlyZXR1cm4gdGhpcy5idWZmZXJbMTFdPT09ZS5idWZmZXJbMTFdJiZ5ZS5lcXVhbHModGhpcy5idWZmZXIsZS5idWZmZXIpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9VWUuZ2V0VWludDMyQkUodGhpcy5idWZmZXIsMCk7cmV0dXJuIGUuc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0KSksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IHN0fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmJ1ZmZlclswXSxlW3QrMV09dGhpcy5idWZmZXJbMV0sZVt0KzJdPXRoaXMuYnVmZmVyWzJdLGVbdCszXT10aGlzLmJ1ZmZlclszXSxlW3QrNF09dGhpcy5idWZmZXJbNF0sZVt0KzVdPXRoaXMuYnVmZmVyWzVdLGVbdCs2XT10aGlzLmJ1ZmZlcls2XSxlW3QrN109dGhpcy5idWZmZXJbN10sZVt0KzhdPXRoaXMuYnVmZmVyWzhdLGVbdCs5XT10aGlzLmJ1ZmZlcls5XSxlW3QrMTBdPXRoaXMuYnVmZmVyWzEwXSxlW3QrMTFdPXRoaXMuYnVmZmVyWzExXSwxMn1zdGF0aWMgY3JlYXRlRnJvbVRpbWUoZSl7Y29uc3QgdD15ZS5hbGxvY2F0ZSgxMik7Zm9yKGxldCBlPTExO2U+PTQ7ZS0tKXRbZV09MDtyZXR1cm4gVWUuc2V0SW50MzJCRSh0LDAsZSksbmV3IHN0KHQpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXRocm93IG5ldyB0ZSgiaGV4IHN0cmluZyBtdXN0IGJlIDI0IGNoYXJhY3RlcnMiKTtyZXR1cm4gbmV3IHN0KHllLmZyb21IZXgoZSkpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe2lmKDE2IT09ZT8ubGVuZ3RoKXRocm93IG5ldyB0ZSgiYmFzZTY0IHN0cmluZyBtdXN0IGJlIDE2IGNoYXJhY3RlcnMiKTtyZXR1cm4gbmV3IHN0KHllLmZyb21CYXNlNjQoZSkpfXN0YXRpYyBpc1ZhbGlkKGUpe2lmKG51bGw9PWUpcmV0dXJuITE7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBzdC52YWxpZGF0ZUhleFN0cmluZyhlKTt0cnl7cmV0dXJuIG5ldyBzdChlKSwhMH1jYXRjaHtyZXR1cm4hMX19dG9FeHRlbmRlZEpTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZz97JG9pZDp0aGlzLnRvSGV4U3RyaW5nKCl9Onskb2lkOnRoaXMudG9TdHJpbmcoImhleCIpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gbmV3IHN0KGUuJG9pZCl9aXNDYWNoZWQoKXtyZXR1cm4gc3QuY2FjaGVIZXhTdHJpbmcmJm90Lmhhcyh0aGlzKX1pbnNwZWN0KGUsdCxuKXtyZXR1cm4gbj8/PUUsYG5ldyBPYmplY3RJZCgke24odGhpcy50b0hleFN0cmluZygpLHQpfSlgfX1mdW5jdGlvbiBmdChlLHQsbil7bGV0IHI9NTtpZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXIrPXV0KGkudG9TdHJpbmcoKSxlW2ldLHQsITAsbik7ZWxzZXsiZnVuY3Rpb24iPT10eXBlb2YgZT8udG9CU09OJiYoZT1lLnRvQlNPTigpKTtmb3IoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhlKSlyKz11dChpLGVbaV0sdCwhMSxuKX1yZXR1cm4gcn1mdW5jdGlvbiB1dChlLHQsbj0hMSxyPSExLGk9ITEpe3N3aXRjaCgiZnVuY3Rpb24iPT10eXBlb2YgdD8udG9CU09OJiYodD10LnRvQlNPTigpKSx0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOnJldHVybiAxK3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzErNCt5ZS51dGY4Qnl0ZUxlbmd0aCh0KSsxO2Nhc2UibnVtYmVyIjpyZXR1cm4gTWF0aC5mbG9vcih0KT09PXQmJnQ+PSQmJnQ8PVQmJnQ+PXgmJnQ8PU4/KG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs1OihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrOTtjYXNlInVuZGVmaW5lZCI6cmV0dXJuIHJ8fCFpPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTowO2Nhc2UiYm9vbGVhbiI6cmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSsyO2Nhc2Uib2JqZWN0IjppZihudWxsIT10JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlJiZ0W09dIT09VSl0aHJvdyBuZXcgbmU7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE7aWYoIk9iamVjdElkIj09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTM7aWYodCBpbnN0YW5jZW9mIERhdGV8fFModCkpcmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHx3KHQpKXJldHVybihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNit0LmJ5dGVMZW5ndGg7aWYoIkxvbmciPT09dC5fYnNvbnR5cGV8fCJEb3VibGUiPT09dC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKCJEZWNpbWFsMTI4Ij09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTc7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpcmV0dXJuIG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0KzQreWUudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzErZnQodC5zY29wZSxuLGkpOihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K3llLnV0ZjhCeXRlTGVuZ3RoKHQuY29kZS50b1N0cmluZygpKSsxO2lmKCJCaW5hcnkiPT09dC5fYnNvbnR5cGUpe2NvbnN0IG49dDtyZXR1cm4gbi5zdWJfdHlwZT09PU9lLlNVQlRZUEVfQllURV9BUlJBWT8obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKyhuLnBvc2l0aW9uKzErNCsxKzQpOihudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrKG4ucG9zaXRpb24rMSs0KzEpfWlmKCJTeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/eWUudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSt5ZS51dGY4Qnl0ZUxlbmd0aCh0LnZhbHVlKSs0KzErMTtpZigiREJSZWYiPT09dC5fYnNvbnR5cGUpe2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7JHJlZjp0LmNvbGxlY3Rpb24sJGlkOnQub2lkfSx0LmZpZWxkcyk7cmV0dXJuIG51bGwhPXQuZGImJihyLiRkYj10LmRiKSwobnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErZnQocixuLGkpfXJldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfHxtKHQpPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSt5ZS51dGY4Qnl0ZUxlbmd0aCh0LnNvdXJjZSkrMSsodC5nbG9iYWw/MTowKSsodC5pZ25vcmVDYXNlPzE6MCkrKHQubXVsdGlsaW5lPzE6MCkrMToiQlNPTlJlZ0V4cCI9PT10Ll9ic29udHlwZT8obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzEreWUudXRmOEJ5dGVMZW5ndGgodC5wYXR0ZXJuKSsxK3llLnV0ZjhCeXRlTGVuZ3RoKHQub3B0aW9ucykrMToobnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApK2Z0KHQsbixpKSsxO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuPyhudWxsIT1lP3llLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K3llLnV0ZjhCeXRlTGVuZ3RoKHQudG9TdHJpbmcoKSkrMTowO2Nhc2UiYmlnaW50IjpyZXR1cm4obnVsbCE9ZT95ZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IHRlKCJVbnJlY29nbml6ZWQgSlMgdHlwZTogIit0eXBlb2YgdCl9fWNsYXNzIGF0IGV4dGVuZHMgbWV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJCU09OUmVnRXhwIn1wYXR0ZXJuO29wdGlvbnM7Y29uc3RydWN0b3IoZSx0KXtpZihzdXBlcigpLHRoaXMucGF0dGVybj1lLHRoaXMub3B0aW9ucz0odD8/IiIpLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIiksLTEhPT10aGlzLnBhdHRlcm4uaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgdGUoYEJTT04gUmVnZXggcGF0dGVybnMgY2Fubm90IGNvbnRhaW4gbnVsbCBieXRlcywgZm91bmQ6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wYXR0ZXJuKX1gKTtpZigtMSE9PXRoaXMub3B0aW9ucy5pbmRleE9mKCJcMCIpKXRocm93IG5ldyB0ZShgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyB0ZShgVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvcHRpb24gWyR7dGhpcy5vcHRpb25zW2VdfV0gaXMgbm90IHN1cHBvcnRlZGApfXN0YXRpYyBwYXJzZU9wdGlvbnMoZSl7cmV0dXJuIGU/ZS5zcGxpdCgiIikuc29ydCgpLmpvaW4oIiIpOiIifXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybihlPWV8fHt9KS5sZWdhY3k/eyRyZWdleDp0aGlzLnBhdHRlcm4sJG9wdGlvbnM6dGhpcy5vcHRpb25zfTp7JHJlZ3VsYXJFeHByZXNzaW9uOntwYXR0ZXJuOnRoaXMucGF0dGVybixvcHRpb25zOnRoaXMub3B0aW9uc319fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2lmKCIkcmVnZXgiaW4gZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLiRyZWdleClyZXR1cm4gbmV3IGF0KGUuJHJlZ2V4LGF0LnBhcnNlT3B0aW9ucyhlLiRvcHRpb25zKSk7aWYoIkJTT05SZWdFeHAiPT09ZS4kcmVnZXguX2Jzb250eXBlKXJldHVybiBlfWlmKCIkcmVndWxhckV4cHJlc3Npb24iaW4gZSlyZXR1cm4gbmV3IGF0KGUuJHJlZ3VsYXJFeHByZXNzaW9uLnBhdHRlcm4sYXQucGFyc2VPcHRpb25zKGUuJHJlZ3VsYXJFeHByZXNzaW9uLm9wdGlvbnMpKTt0aHJvdyBuZXcgdGUoYFVuZXhwZWN0ZWQgQlNPTlJlZ0V4cCBFSlNPTiBvYmplY3QgZm9ybTogJHtKU09OLnN0cmluZ2lmeShlKX1gKX1pbnNwZWN0KGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmInN0eWxpemUiaW4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc3R5bGl6ZSlyZXR1cm4gZS5zdHlsaXplfSh0KT8/KGU9PmUpO24/Pz1FO3JldHVybmBuZXcgQlNPTlJlZ0V4cCgke3Iobih0aGlzLnBhdHRlcm4pLCJyZWdleHAiKX0sICR7cihuKHRoaXMub3B0aW9ucyksInJlZ2V4cCIpfSlgfX1jbGFzcyBsdCBleHRlbmRzIG1le2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iQlNPTlN5bWJvbCJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnZhbHVlPWV9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9KU09OKCl7cmV0dXJuIHRoaXMudmFsdWV9dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JHN5bWJvbDp0aGlzLnZhbHVlfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gbmV3IGx0KGUuJHN5bWJvbCl9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz1FLGBuZXcgQlNPTlN5bWJvbCgke24odGhpcy52YWx1ZSx0KX0pYH19Y29uc3QgaHQ9Q2U7Y2xhc3MgY3QgZXh0ZW5kcyBodHtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIlRpbWVzdGFtcCJ9Z2V0W3dlXSgpe3JldHVybiJUaW1lc3RhbXAifXN0YXRpYyBNQVhfVkFMVUU9Q2UuTUFYX1VOU0lHTkVEX1ZBTFVFO2dldCBpKCl7cmV0dXJuIHRoaXMubG93Pj4+MH1nZXQgdCgpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfWNvbnN0cnVjdG9yKGUpe2lmKG51bGw9PWUpc3VwZXIoMCwwLCEwKTtlbHNlIGlmKCJiaWdpbnQiPT10eXBlb2YgZSlzdXBlcihlLCEwKTtlbHNlIGlmKENlLmlzTG9uZyhlKSlzdXBlcihlLmxvdyxlLmhpZ2gsITApO2Vsc2V7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHwhKCJ0ImluIGUpfHwhKCJpImluIGUpKXRocm93IG5ldyB0ZSgiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyB0ZSgiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgYXMgYSBudW1iZXIiKTtpZigibnVtYmVyIiE9dHlwZW9mIGUuaSYmKCJvYmplY3QiIT10eXBlb2YgZS5pfHwiSW50MzIiIT09ZS5pLl9ic29udHlwZSkpdGhyb3cgbmV3IHRlKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgaSBhcyBhIG51bWJlciIpO2NvbnN0IHQ9TnVtYmVyKGUudCksbj1OdW1iZXIoZS5pKTtpZih0PDB8fE51bWJlci5pc05hTih0KSl0aHJvdyBuZXcgdGUoIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgdGUoIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIGkiKTtpZih0PjQyOTQ5NjcyOTUpdGhyb3cgbmV3IHRlKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBlcXVhbCBvciBsZXNzIHRoYW4gdWludDMyIG1heCIpO2lmKG4+NDI5NDk2NzI5NSl0aHJvdyBuZXcgdGUoIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBjdChDZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGN0KENlLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgY3Qoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgY3QoQ2UuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9Q2UuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPUNlLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBjdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz1FO3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgZ3Q9Q2UuZnJvbU51bWJlcihUKSxkdD1DZS5mcm9tTnVtYmVyKCQpO2Z1bmN0aW9uIGJ0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9VWUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgdGUoYGJzb24gc2l6ZSBtdXN0IGJlID49IDUsIGlzICR7aX1gKTtpZih0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aDxpKXRocm93IG5ldyB0ZShgYnVmZmVyIGxlbmd0aCAke2UubGVuZ3RofSBtdXN0IGJlID49IGJzb24gc2l6ZSAke2l9YCk7aWYoIXQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoIT09aSl0aHJvdyBuZXcgdGUoYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyB0ZShgKGJzb24gc2l6ZSAke2l9ICsgb3B0aW9ucy5pbmRleCAke3J9IG11c3QgYmUgPD0gYnVmZmVyIGxlbmd0aCAke2UuYnl0ZUxlbmd0aH0pYCk7aWYoMCE9PWVbcitpLTFdKXRocm93IG5ldyB0ZSgiT25lIG9iamVjdCwgc2l6ZWQgY29ycmVjdGx5LCB3aXRoIGEgc3BvdCBmb3IgYW4gRU9PLCBidXQgdGhlIEVPTyBpc24ndCAweDAwIik7cmV0dXJuIHl0KGUscix0LG4pfWNvbnN0IHB0PS9eXCRyZWYkfF5cJGlkJHxeXCRkYiQvO2Z1bmN0aW9uIHl0KGUsdCxuLHI9ITEpe2NvbnN0IGk9bnVsbD09bi5maWVsZHNBc1Jhdz9udWxsOm4uZmllbGRzQXNSYXcsbz1udWxsIT1uLnJhdyYmbi5yYXcscz0iYm9vbGVhbiI9PXR5cGVvZiBuLmJzb25SZWdFeHAmJm4uYnNvblJlZ0V4cCxmPW4ucHJvbW90ZUJ1ZmZlcnM/PyExLHU9bi5wcm9tb3RlTG9uZ3M/PyEwLGE9bi5wcm9tb3RlVmFsdWVzPz8hMCxsPW4udXNlQmlnSW50NjQ/PyExO2lmKGwmJiFhKXRocm93IG5ldyB0ZSgiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYobCYmIXUpdGhyb3cgbmV3IHRlKCJNdXN0IGVpdGhlciByZXF1ZXN0IGJpZ2ludCBvciBMb25nIGZvciBpbnQ2NCBkZXNlcmlhbGl6YXRpb24iKTtsZXQgaCxjLGc9ITA7Y29uc3QgZD0obnVsbD09bi52YWxpZGF0aW9uP3t1dGY4OiEwfTpuLnZhbGlkYXRpb24pLnV0Zjg7aWYoImJvb2xlYW4iPT10eXBlb2YgZCloPWQ7ZWxzZXtnPSExO2NvbnN0IGU9T2JqZWN0LmtleXMoZCkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZFtlXX0pKTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJVVEYtOCB2YWxpZGF0aW9uIHNldHRpbmcgY2Fubm90IGJlIGVtcHR5Iik7aWYoImJvb2xlYW4iIT10eXBlb2YgZVswXSl0aHJvdyBuZXcgdGUoIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24sIG11c3Qgc3BlY2lmeSBib29sZWFuIHZhbHVlcyIpO2lmKGg9ZVswXSwhZS5ldmVyeSgoZT0+ZT09PWgpKSl0aHJvdyBuZXcgdGUoIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24gLSBrZXlzIG11c3QgYmUgYWxsIHRydWUgb3IgYWxsIGZhbHNlIil9aWYoIWcpe2M9bmV3IFNldDtmb3IoY29uc3QgZSBvZiBPYmplY3Qua2V5cyhkKSljLmFkZChlKX1jb25zdCBiPXQ7aWYoZS5sZW5ndGg8NSl0aHJvdyBuZXcgdGUoImNvcnJ1cHQgYnNvbiBtZXNzYWdlIDwgNSBieXRlcyBsb25nIik7Y29uc3QgcD1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxwPDV8fHA+ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJjb3JydXB0IGJzb24gbWVzc2FnZSIpO2NvbnN0IHk9cj9bXTp7fTtsZXQgdz0wLG09IXImJm51bGw7Zm9yKDs7KXtjb25zdCBkPWVbdCsrXTtpZigwPT09ZClicmVhaztsZXQgYj10O2Zvcig7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IHRlKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3QgcD1yP3crKzp5ZS50b1VURjgoZSx0LGIsITEpO2xldCBCLFM9ITA7aWYoUz1nfHxjPy5oYXMocCk/aDohaCwhMSE9PW0mJiIkIj09PXBbMF0mJihtPXB0LnRlc3QocCkpLHQ9YisxLGQ9PT12KXtjb25zdCBuPVVlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyB0ZSgiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO0I9eWUudG9VVEY4KGUsdCx0K24tMSxTKSx0Kz1ufWVsc2UgaWYoZD09PUQpe2NvbnN0IG49eWUuYWxsb2NhdGVVbnNhZmUoMTIpO2ZvcihsZXQgcj0wO3I8MTI7cisrKW5bcl09ZVt0K3JdO0I9bmV3IHN0KG4pLHQrPTEyfWVsc2UgaWYoZD09PUgmJiExPT09YSlCPW5ldyB0dChVZS5nZXRJbnQzMkxFKGUsdCkpLHQrPTQ7ZWxzZSBpZihkPT09SClCPVVlLmdldEludDMyTEUoZSx0KSx0Kz00O2Vsc2UgaWYoZD09PUwpQj1VZS5nZXRGbG9hdDY0TEUoZSx0KSx0Kz04LCExPT09YSYmKEI9bmV3IGV0KEIpKTtlbHNlIGlmKGQ9PT1WKXtjb25zdCBuPVVlLmdldEludDMyTEUoZSx0KSxyPVVlLmdldEludDMyTEUoZSx0KzQpO3QrPTgsQj1uZXcgRGF0ZShuZXcgQ2UobixyKS50b051bWJlcigpKX1lbHNlIGlmKGQ9PT16KXtpZigwIT09ZVt0XSYmMSE9PWVbdF0pdGhyb3cgbmV3IHRlKCJpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZSIpO0I9MT09PWVbdCsrXX1lbHNlIGlmKGQ9PT1BKXtjb25zdCByPXQsaT1VZS5nZXRJbnQzMkxFKGUsdCk7aWYoaTw9MHx8aT5lLmxlbmd0aC10KXRocm93IG5ldyB0ZSgiYmFkIGVtYmVkZGVkIGRvY3VtZW50IGxlbmd0aCBpbiBic29uIik7aWYobylCPWUuc3ViYXJyYXkodCx0K2kpO2Vsc2V7bGV0IHQ9bjtnfHwodD17Li4ubix2YWxpZGF0aW9uOnt1dGY4OlN9fSksQj15dChlLHIsdCwhMSl9dCs9aX1lbHNlIGlmKGQ9PT1qKXtjb25zdCByPXQsbz1VZS5nZXRJbnQzMkxFKGUsdCk7bGV0IHM9bjtjb25zdCBmPXQrbztpZihpJiZpW3BdJiYocz17Li4ubixyYXc6ITB9KSxnfHwocz17Li4ucyx2YWxpZGF0aW9uOnt1dGY4OlN9fSksQj15dChlLHIscywhMCksMCE9PWVbKHQrPW8pLTFdKXRocm93IG5ldyB0ZSgiaW52YWxpZCBhcnJheSB0ZXJtaW5hdG9yIGJ5dGUiKTtpZih0IT09Zil0aHJvdyBuZXcgdGUoImNvcnJ1cHRlZCBhcnJheSBic29uIil9ZWxzZSBpZihkPT09UilCPXZvaWQgMDtlbHNlIGlmKGQ9PT1DKUI9bnVsbDtlbHNlIGlmKGQ9PT1XKWlmKGwpQj1VZS5nZXRCaWdJbnQ2NExFKGUsdCksdCs9ODtlbHNle2NvbnN0IG49VWUuZ2V0SW50MzJMRShlLHQpLHI9VWUuZ2V0SW50MzJMRShlLHQrNCk7dCs9ODtjb25zdCBpPW5ldyBDZShuLHIpO0I9dSYmITA9PT1hJiZpLmxlc3NUaGFuT3JFcXVhbChndCkmJmkuZ3JlYXRlclRoYW5PckVxdWFsKGR0KT9pLnRvTnVtYmVyKCk6aX1lbHNlIGlmKGQ9PT1LKXtjb25zdCBuPXllLmFsbG9jYXRlVW5zYWZlKDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyluW3JdPWVbdCtyXTt0Kz0xNixCPW5ldyBRZShuKX1lbHNlIGlmKGQ9PT1GKXtsZXQgbj1VZS5nZXRJbnQzMkxFKGUsdCk7dCs9NDtjb25zdCByPW4saT1lW3QrK107aWYobjwwKXRocm93IG5ldyB0ZSgiTmVnYXRpdmUgYmluYXJ5IHR5cGUgZWxlbWVudCBzaXplIGZvdW5kIik7aWYobj5lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IHRlKCJCaW5hcnkgdHlwZSBzaXplIGxhcmdlciB0aGFuIGRvY3VtZW50IHNpemUiKTtpZihpPT09T2UuU1VCVFlQRV9CWVRFX0FSUkFZKXtpZihuPVVlLmdldEludDMyTEUoZSx0KSx0Kz00LG48MCl0aHJvdyBuZXcgdGUoIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyIik7aWYobj5yLTQpdGhyb3cgbmV3IHRlKCJCaW5hcnkgdHlwZSB3aXRoIHN1YnR5cGUgMHgwMiBjb250YWlucyB0b28gbG9uZyBiaW5hcnkgc2l6ZSIpO2lmKG48ci00KXRocm93IG5ldyB0ZSgiQmluYXJ5IHR5cGUgd2l0aCBzdWJ0eXBlIDB4MDIgY29udGFpbnMgdG9vIHNob3J0IGJpbmFyeSBzaXplIil9ZiYmYT9CPXllLnRvTG9jYWxCdWZmZXJUeXBlKGUuc3ViYXJyYXkodCx0K24pKTooQj1uZXcgT2UoZS5zdWJhcnJheSh0LHQrbiksaSksaT09PVEmJl9lLmlzVmFsaWQoQikmJihCPUIudG9VVUlEKCkpKSx0Kz1ufWVsc2UgaWYoZD09PU0mJiExPT09cyl7Zm9yKGI9dDswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyB0ZSgiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49eWUudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyB0ZSgiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IHI9eWUudG9VVEY4KGUsdCxiLCExKTt0PWIrMTtjb25zdCBpPW5ldyBBcnJheShyLmxlbmd0aCk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrKylzd2l0Y2gocltiXSl7Y2FzZSJtIjppW2JdPSJtIjticmVhaztjYXNlInMiOmlbYl09ImciO2JyZWFrO2Nhc2UiaSI6aVtiXT0iaSJ9Qj1uZXcgUmVnRXhwKG4saS5qb2luKCIiKSl9ZWxzZSBpZihkPT09TSYmITA9PT1zKXtmb3IoYj10OzAhPT1lW2JdJiZiPGUubGVuZ3RoOyliKys7aWYoYj49ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgbj15ZS50b1VURjgoZSx0LGIsITEpO2ZvcihiPXQ9YisxOzAhPT1lW2JdJiZiPGUubGVuZ3RoOyliKys7aWYoYj49ZS5sZW5ndGgpdGhyb3cgbmV3IHRlKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj15ZS50b1VURjgoZSx0LGIsITEpO3Q9YisxLEI9bmV3IGF0KG4scil9ZWxzZSBpZihkPT09ayl7Y29uc3Qgbj1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgdGUoImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPXllLnRvVVRGOChlLHQsdCtuLTEsUyk7Qj1hP3I6bmV3IGx0KHIpLHQrPW59ZWxzZSBpZihkPT09cSlCPW5ldyBjdCh7aTpVZS5nZXRVaW50MzJMRShlLHQpLHQ6VWUuZ2V0VWludDMyTEUoZSx0KzQpfSksdCs9ODtlbHNlIGlmKGQ9PT1aKUI9bmV3IHJ0O2Vsc2UgaWYoZD09PUcpQj1uZXcgbnQ7ZWxzZSBpZihkPT09Sil7Y29uc3Qgbj1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgdGUoImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPXllLnRvVVRGOChlLHQsdCtuLTEsUyk7Qj1uZXcgVGUociksdCs9bn1lbHNlIGlmKGQ9PT1ZKXtjb25zdCByPVVlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LHI8MTMpdGhyb3cgbmV3IHRlKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoIik7Y29uc3QgaT1VZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxpPD0wfHxpPmUubGVuZ3RoLXR8fDAhPT1lW3QraS0xXSl0aHJvdyBuZXcgdGUoImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCBvPXllLnRvVVRGOChlLHQsdCtpLTEsUykscz10Kz1pLGY9VWUuZ2V0SW50MzJMRShlLHQpLHU9eXQoZSxzLG4sITEpO2lmKHQrPWYscjw4K2YraSl0aHJvdyBuZXcgdGUoImNvZGVfd19zY29wZSB0b3RhbCBzaXplIGlzIHRvbyBzaG9ydCwgdHJ1bmNhdGluZyBzY29wZSIpO2lmKHI+OCtmK2kpdGhyb3cgbmV3IHRlKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQiKTtCPW5ldyBUZShvLHUpfWVsc2V7aWYoZCE9PVApdGhyb3cgbmV3IHRlKGBEZXRlY3RlZCB1bmtub3duIEJTT04gdHlwZSAke2QudG9TdHJpbmcoMTYpfSBmb3IgZmllbGRuYW1lICIke3B9ImApO3tjb25zdCBuPVVlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyB0ZSgiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9eWUudG9VVEY4KGUsdCx0K24tMSxTKTt0Kz1uO2NvbnN0IGk9eWUuYWxsb2NhdGVVbnNhZmUoMTIpO2ZvcihsZXQgbj0wO248MTI7bisrKWlbbl09ZVt0K25dO2NvbnN0IG89bmV3IHN0KGkpO3QrPTEyLEI9bmV3IExlKHIsbyl9fSJfX3Byb3RvX18iPT09cD9PYmplY3QuZGVmaW5lUHJvcGVydHkoeSxwLHt2YWx1ZTpCLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6eVtwXT1CfWlmKHAhPT10LWIpe2lmKHIpdGhyb3cgbmV3IHRlKCJjb3JydXB0IGFycmF5IGJzb24iKTt0aHJvdyBuZXcgdGUoImNvcnJ1cHQgb2JqZWN0IGJzb24iKX1pZighbSlyZXR1cm4geTtpZigkZSh5KSl7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHkpO3JldHVybiBkZWxldGUgZS4kcmVmLGRlbGV0ZSBlLiRpZCxkZWxldGUgZS4kZGIsbmV3IExlKHkuJHJlZix5LiRpZCx5LiRkYixlKX1yZXR1cm4geX1jb25zdCB3dD0vXHgwMC8sbXQ9bmV3IFNldChbIiRkYiIsIiRyZWYiLCIkaWQiLCIkY2x1c3RlclRpbWUiXSk7ZnVuY3Rpb24gQnQoZSx0LG4scil7ZVtyKytdPXY7ZVsocj1yK3llLmVuY29kZVVURjhJbnRvKGUsdCxyKSsxKS0xXT0wO2NvbnN0IGk9eWUuZW5jb2RlVVRGOEludG8oZSxuLHIrNCk7cmV0dXJuIFVlLnNldEludDMyTEUoZSxyLGkrMSkscj1yKzQraSxlW3IrK109MCxyfWZ1bmN0aW9uIFN0KGUsdCxuLHIpe2NvbnN0IGk9IU9iamVjdC5pcyhuLC0wKSYmTnVtYmVyLmlzU2FmZUludGVnZXIobikmJm48PU4mJm4+PXg/SDpMO2VbcisrXT1pO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9aT09PUg/VWUuc2V0SW50MzJMRShlLHIsbik6VWUuc2V0RmxvYXQ2NExFKGUscixuKX1mdW5jdGlvbiBFdChlLHQsbixyKXtlW3IrK109VztyZXR1cm4gcis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPVVlLnNldEJpZ0ludDY0TEUoZSxyLG4pfWZ1bmN0aW9uIFV0KGUsdCxuLHIpe2VbcisrXT1DO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscn1mdW5jdGlvbiBPdChlLHQsbixyKXtlW3IrK109ejtyZXR1cm4gcis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLGVbcisrXT1uPzE6MCxyfWZ1bmN0aW9uIE50KGUsdCxuLHIpe2VbcisrXT1WO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPUNlLmZyb21OdW1iZXIobi5nZXRUaW1lKCkpLG89aS5nZXRMb3dCaXRzKCkscz1pLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPVVlLnNldEludDMyTEUoZSxyLG8pLHIrPVVlLnNldEludDMyTEUoZSxyLHMpfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe2VbcisrXT1NO2lmKHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxuLnNvdXJjZSYmbnVsbCE9bi5zb3VyY2UubWF0Y2god3QpKXRocm93IG5ldyB0ZSgidmFsdWUgIituLnNvdXJjZSsiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLG4uc291cmNlLHIpLGVbcisrXT0wLG4uaWdub3JlQ2FzZSYmKGVbcisrXT0xMDUpLG4uZ2xvYmFsJiYoZVtyKytdPTExNSksbi5tdWx0aWxpbmUmJihlW3IrK109MTA5KSxlW3IrK109MCxyfWZ1bmN0aW9uIEl0KGUsdCxuLHIpe2VbcisrXT1NO2lmKHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxudWxsIT1uLnBhdHRlcm4ubWF0Y2god3QpKXRocm93IG5ldyB0ZSgicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPXllLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPXllLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIF90KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1DOiJNaW5LZXkiPT09bi5fYnNvbnR5cGU/ZVtyKytdPVo6ZVtyKytdPUc7cmV0dXJuIHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIFR0KGUsdCxuLHIpe2VbcisrXT1EO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPUY7cis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9VWUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPVgsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gTHQoZSx0LG4scixpLG8scyxmLHUpe2lmKHUuaGFzKG4pKXRocm93IG5ldyB0ZSgiQ2Fubm90IGNvbnZlcnQgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEJTT04iKTt1LmFkZChuKSxlW3IrK109QXJyYXkuaXNBcnJheShuKT9qOkE7cis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGE9TXQoZSxuLGkscixvKzEscyxmLHUpO3JldHVybiB1LmRlbGV0ZShuKSxhfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe2VbcisrXT1LO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtmb3IobGV0IHQ9MDt0PDE2O3QrKyllW3IrdF09bi5ieXRlc1t0XTtyZXR1cm4gcisxNn1mdW5jdGlvbiBBdChlLHQsbixyKXtlW3IrK109IkxvbmciPT09bi5fYnNvbnR5cGU/VzpxO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uZ2V0TG93Qml0cygpLG89bi5nZXRIaWdoQml0cygpO3JldHVybiByKz1VZS5zZXRJbnQzMkxFKGUscixpKSxyKz1VZS5zZXRJbnQzMkxFKGUscixvKX1mdW5jdGlvbiBqdChlLHQsbixyKXtuPW4udmFsdWVPZigpLGVbcisrXT1IO3JldHVybiByKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9VWUuc2V0SW50MzJMRShlLHIsbil9ZnVuY3Rpb24gRnQoZSx0LG4scil7ZVtyKytdPUw7cmV0dXJuIHIrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1VZS5zZXRGbG9hdDY0TEUoZSxyLG4udmFsdWUpfWZ1bmN0aW9uIFJ0KGUsdCxuLHIpe2VbcisrXT1KO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4udG9TdHJpbmcoKSxvPXllLmVuY29kZVVURjhJbnRvKGUsaSxyKzQpKzE7cmV0dXJuIFVlLnNldEludDMyTEUoZSxyLG8pLHI9cis0K28tMSxlW3IrK109MCxyfWZ1bmN0aW9uIER0KGUsdCxuLHIsaT0hMSxvPTAscz0hMSxmPSEwLHUpe2lmKG4uc2NvcGUmJiJvYmplY3QiPT10eXBlb2Ygbi5zY29wZSl7ZVtyKytdPVk7cis9eWUuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2xldCBhPXI7Y29uc3QgbD1uLmNvZGU7cis9NDtjb25zdCBoPXllLmVuY29kZVVURjhJbnRvKGUsbCxyKzQpKzE7VWUuc2V0SW50MzJMRShlLHIsaCksZVtyKzQraC0xXT0wLHI9citoKzQ7Y29uc3QgYz1NdChlLG4uc2NvcGUsaSxyLG8rMSxzLGYsdSk7cj1jLTE7Y29uc3QgZz1jLWE7YSs9VWUuc2V0SW50MzJMRShlLGEsZyksZVtyKytdPTB9ZWxzZXtlW3IrK109SjtyKz15ZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7Y29uc3QgaT1uLmNvZGUudG9TdHJpbmcoKSxvPXllLmVuY29kZVVURjhJbnRvKGUsaSxyKzQpKzE7VWUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wfXJldHVybiByfWZ1bmN0aW9uIHp0KGUsdCxuLHIpe2VbcisrXT1GO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uYnVmZmVyO2xldCBvPW4ucG9zaXRpb247aWYobi5zdWJfdHlwZT09PU9lLlNVQlRZUEVfQllURV9BUlJBWSYmKG8rPTQpLHIrPVVlLnNldEludDMyTEUoZSxyLG8pLGVbcisrXT1uLnN1Yl90eXBlLG4uc3ViX3R5cGU9PT1PZS5TVUJUWVBFX0JZVEVfQVJSQVkmJihvLT00LHIrPVVlLnNldEludDMyTEUoZSxyLG8pKSxuLnN1Yl90eXBlPT09T2UuU1VCVFlQRV9WRUNUT1ImJk5lKG4pLG88PTE2KWZvcihsZXQgdD0wO3Q8bzt0KyspZVtyK3RdPWlbdF07ZWxzZSBlLnNldChpLHIpO3JldHVybiByKz1uLnBvc2l0aW9ufWZ1bmN0aW9uIFZ0KGUsdCxuLHIpe2VbcisrXT1rO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPXllLmVuY29kZVVURjhJbnRvKGUsbi52YWx1ZSxyKzQpKzE7cmV0dXJuIFVlLnNldEludDMyTEUoZSxyLGkpLHI9cis0K2ktMSxlW3IrK109MCxyfWZ1bmN0aW9uIEN0KGUsdCxuLHIsaSxvLHMpe2VbcisrXT1BO3IrPXllLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtsZXQgZj1yLHU9eyRyZWY6bi5jb2xsZWN0aW9ufHxuLm5hbWVzcGFjZSwkaWQ6bi5vaWR9O251bGwhPW4uZGImJih1LiRkYj1uLmRiKSx1PU9iamVjdC5hc3NpZ24odSxuLmZpZWxkcyk7Y29uc3QgYT1NdChlLHUsITEscixpKzEsbywhMCxzKSxsPWEtZjtyZXR1cm4gZis9VWUuc2V0SW50MzJMRShlLHIsbCksYX1mdW5jdGlvbiBNdChlLHQsbixyLGksbyxzLGYpe2lmKG51bGw9PWYpe2lmKG51bGw9PXQpcmV0dXJuIGVbMF09NSxlWzFdPTAsZVsyXT0wLGVbM109MCxlWzRdPTAsNTtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyB0ZSgic2VyaWFsaXplIGRvZXMgbm90IHN1cHBvcnQgYW4gYXJyYXkgYXMgdGhlIHJvb3QgaW5wdXQiKTtpZigib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IHRlKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyB0ZSgiQlNPTiB0eXBlcyBjYW5ub3QgYmUgc2VyaWFsaXplZCBhcyBhIGRvY3VtZW50Iik7aWYoUyh0KXx8bSh0KXx8eSh0KXx8dyh0KSl0aHJvdyBuZXcgdGUoImRhdGUsIHJlZ2V4cCwgdHlwZWRhcnJheSwgYW5kIGFycmF5YnVmZmVyIGNhbm5vdCBiZSBCU09OIGRvY3VtZW50cyIpO2Y9bmV3IFNldH1mLmFkZCh0KTtsZXQgdT1yKzQ7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7Y29uc3QgYT1gJHtyfWA7bGV0IGw9dFtyXTsiZnVuY3Rpb24iPT10eXBlb2YgbD8udG9CU09OJiYobD1sLnRvQlNPTigpKTtjb25zdCBoPXR5cGVvZiBsO2lmKHZvaWQgMD09PWwpdT1VdChlLGEsMCx1KTtlbHNlIGlmKG51bGw9PT1sKXU9VXQoZSxhLDAsdSk7ZWxzZSBpZigic3RyaW5nIj09PWgpdT1CdChlLGEsbCx1KTtlbHNlIGlmKCJudW1iZXIiPT09aCl1PVN0KGUsYSxsLHUpO2Vsc2UgaWYoImJpZ2ludCI9PT1oKXU9RXQoZSxhLGwsdSk7ZWxzZSBpZigiYm9vbGVhbiI9PT1oKXU9T3QoZSxhLGwsdSk7ZWxzZSBpZigib2JqZWN0Ij09PWgmJm51bGw9PWwuX2Jzb250eXBlKXU9bCBpbnN0YW5jZW9mIERhdGV8fFMobCk/TnQoZSxhLGwsdSk6bCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHkobCk/JHQoZSxhLGwsdSk6bCBpbnN0YW5jZW9mIFJlZ0V4cHx8bShsKT94dChlLGEsbCx1KTpMdChlLGEsbCx1LG4saSxvLHMsZik7ZWxzZSBpZigib2JqZWN0Ij09PWgpe2lmKGxbT10hPT1VKXRocm93IG5ldyBuZTtpZigiT2JqZWN0SWQiPT09bC5fYnNvbnR5cGUpdT1UdChlLGEsbCx1KTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWwuX2Jzb250eXBlKXU9dnQoZSxhLGwsdSk7ZWxzZSBpZigiTG9uZyI9PT1sLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1sLl9ic29udHlwZSl1PUF0KGUsYSxsLHUpO2Vsc2UgaWYoIkRvdWJsZSI9PT1sLl9ic29udHlwZSl1PUZ0KGUsYSxsLHUpO2Vsc2UgaWYoIkNvZGUiPT09bC5fYnNvbnR5cGUpdT1EdChlLGEsbCx1LG4saSxvLHMsZik7ZWxzZSBpZigiQmluYXJ5Ij09PWwuX2Jzb250eXBlKXU9enQoZSxhLGwsdSk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1sLl9ic29udHlwZSl1PVZ0KGUsYSxsLHUpO2Vsc2UgaWYoIkRCUmVmIj09PWwuX2Jzb250eXBlKXU9Q3QoZSxhLGwsdSxpLG8sZik7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1sLl9ic29udHlwZSl1PUl0KGUsYSxsLHUpO2Vsc2UgaWYoIkludDMyIj09PWwuX2Jzb250eXBlKXU9anQoZSxhLGwsdSk7ZWxzZSBpZigiTWluS2V5Ij09PWwuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWwuX2Jzb250eXBlKXU9X3QoZSxhLGwsdSk7ZWxzZSBpZih2b2lkIDAhPT1sLl9ic29udHlwZSl0aHJvdyBuZXcgdGUoYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcobC5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09aCYmbyYmKHU9UnQoZSxhLGwsdSkpfWVsc2UgaWYodCBpbnN0YW5jZW9mIE1hcHx8Qih0KSl7Y29uc3Qgcj10LmVudHJpZXMoKTtsZXQgYT0hMTtmb3IoOyFhOyl7Y29uc3QgdD1yLm5leHQoKTtpZihhPSEhdC5kb25lLGEpY29udGludWU7Y29uc3QgbD10LnZhbHVlP3QudmFsdWVbMF06dm9pZCAwO2xldCBoPXQudmFsdWU/dC52YWx1ZVsxXTp2b2lkIDA7ImZ1bmN0aW9uIj09dHlwZW9mIGg/LnRvQlNPTiYmKGg9aC50b0JTT04oKSk7Y29uc3QgYz10eXBlb2YgaDtpZigic3RyaW5nIj09dHlwZW9mIGwmJiFtdC5oYXMobCkpe2lmKG51bGwhPWwubWF0Y2god3QpKXRocm93IG5ldyB0ZSgia2V5ICIrbCsiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO2lmKG4pe2lmKCIkIj09PWxbMF0pdGhyb3cgbmV3IHRlKCJrZXkgIitsKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihsLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IHRlKCJrZXkgIitsKyIgbXVzdCBub3QgY29udGFpbiAnLiciKX19aWYodm9pZCAwPT09aCkhMT09PXMmJih1PVV0KGUsbCwwLHUpKTtlbHNlIGlmKG51bGw9PT1oKXU9VXQoZSxsLDAsdSk7ZWxzZSBpZigic3RyaW5nIj09PWMpdT1CdChlLGwsaCx1KTtlbHNlIGlmKCJudW1iZXIiPT09Yyl1PVN0KGUsbCxoLHUpO2Vsc2UgaWYoImJpZ2ludCI9PT1jKXU9RXQoZSxsLGgsdSk7ZWxzZSBpZigiYm9vbGVhbiI9PT1jKXU9T3QoZSxsLGgsdSk7ZWxzZSBpZigib2JqZWN0Ij09PWMmJm51bGw9PWguX2Jzb250eXBlKXU9aCBpbnN0YW5jZW9mIERhdGV8fFMoaCk/TnQoZSxsLGgsdSk6aCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHkoaCk/JHQoZSxsLGgsdSk6aCBpbnN0YW5jZW9mIFJlZ0V4cHx8bShoKT94dChlLGwsaCx1KTpMdChlLGwsaCx1LG4saSxvLHMsZik7ZWxzZSBpZigib2JqZWN0Ij09PWMpe2lmKGhbT10hPT1VKXRocm93IG5ldyBuZTtpZigiT2JqZWN0SWQiPT09aC5fYnNvbnR5cGUpdT1UdChlLGwsaCx1KTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWguX2Jzb250eXBlKXU9dnQoZSxsLGgsdSk7ZWxzZSBpZigiTG9uZyI9PT1oLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1oLl9ic29udHlwZSl1PUF0KGUsbCxoLHUpO2Vsc2UgaWYoIkRvdWJsZSI9PT1oLl9ic29udHlwZSl1PUZ0KGUsbCxoLHUpO2Vsc2UgaWYoIkNvZGUiPT09aC5fYnNvbnR5cGUpdT1EdChlLGwsaCx1LG4saSxvLHMsZik7ZWxzZSBpZigiQmluYXJ5Ij09PWguX2Jzb250eXBlKXU9enQoZSxsLGgsdSk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1oLl9ic29udHlwZSl1PVZ0KGUsbCxoLHUpO2Vsc2UgaWYoIkRCUmVmIj09PWguX2Jzb250eXBlKXU9Q3QoZSxsLGgsdSxpLG8sZik7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1oLl9ic29udHlwZSl1PUl0KGUsbCxoLHUpO2Vsc2UgaWYoIkludDMyIj09PWguX2Jzb250eXBlKXU9anQoZSxsLGgsdSk7ZWxzZSBpZigiTWluS2V5Ij09PWguX2Jzb250eXBlfHwiTWF4S2V5Ij09PWguX2Jzb250eXBlKXU9X3QoZSxsLGgsdSk7ZWxzZSBpZih2b2lkIDAhPT1oLl9ic29udHlwZSl0aHJvdyBuZXcgdGUoYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcoaC5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09YyYmbyYmKHU9UnQoZSxsLGgsdSkpfX1lbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Py50b0JTT04mJm51bGwhPSh0PXQudG9CU09OKCkpJiYib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IHRlKCJ0b0JTT04gZnVuY3Rpb24gZGlkIG5vdCByZXR1cm4gYW4gb2JqZWN0Iik7Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXModCkpe2xldCBhPXRbcl07ImZ1bmN0aW9uIj09dHlwZW9mIGE/LnRvQlNPTiYmKGE9YS50b0JTT04oKSk7Y29uc3QgbD10eXBlb2YgYTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFtdC5oYXMocikpe2lmKG51bGwhPXIubWF0Y2god3QpKXRocm93IG5ldyB0ZSgia2V5ICIrcisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO2lmKG4pe2lmKCIkIj09PXJbMF0pdGhyb3cgbmV3IHRlKCJrZXkgIityKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihyLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IHRlKCJrZXkgIityKyIgbXVzdCBub3QgY29udGFpbiAnLiciKX19aWYodm9pZCAwPT09YSkhMT09PXMmJih1PVV0KGUsciwwLHUpKTtlbHNlIGlmKG51bGw9PT1hKXU9VXQoZSxyLDAsdSk7ZWxzZSBpZigic3RyaW5nIj09PWwpdT1CdChlLHIsYSx1KTtlbHNlIGlmKCJudW1iZXIiPT09bCl1PVN0KGUscixhLHUpO2Vsc2UgaWYoImJpZ2ludCI9PT1sKXU9RXQoZSxyLGEsdSk7ZWxzZSBpZigiYm9vbGVhbiI9PT1sKXU9T3QoZSxyLGEsdSk7ZWxzZSBpZigib2JqZWN0Ij09PWwmJm51bGw9PWEuX2Jzb250eXBlKXU9YSBpbnN0YW5jZW9mIERhdGV8fFMoYSk/TnQoZSxyLGEsdSk6YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fHkoYSk/JHQoZSxyLGEsdSk6YSBpbnN0YW5jZW9mIFJlZ0V4cHx8bShhKT94dChlLHIsYSx1KTpMdChlLHIsYSx1LG4saSxvLHMsZik7ZWxzZSBpZigib2JqZWN0Ij09PWwpe2lmKGFbT10hPT1VKXRocm93IG5ldyBuZTtpZigiT2JqZWN0SWQiPT09YS5fYnNvbnR5cGUpdT1UdChlLHIsYSx1KTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWEuX2Jzb250eXBlKXU9dnQoZSxyLGEsdSk7ZWxzZSBpZigiTG9uZyI9PT1hLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1hLl9ic29udHlwZSl1PUF0KGUscixhLHUpO2Vsc2UgaWYoIkRvdWJsZSI9PT1hLl9ic29udHlwZSl1PUZ0KGUscixhLHUpO2Vsc2UgaWYoIkNvZGUiPT09YS5fYnNvbnR5cGUpdT1EdChlLHIsYSx1LG4saSxvLHMsZik7ZWxzZSBpZigiQmluYXJ5Ij09PWEuX2Jzb250eXBlKXU9enQoZSxyLGEsdSk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1hLl9ic29udHlwZSl1PVZ0KGUscixhLHUpO2Vsc2UgaWYoIkRCUmVmIj09PWEuX2Jzb250eXBlKXU9Q3QoZSxyLGEsdSxpLG8sZik7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1hLl9ic29udHlwZSl1PUl0KGUscixhLHUpO2Vsc2UgaWYoIkludDMyIj09PWEuX2Jzb250eXBlKXU9anQoZSxyLGEsdSk7ZWxzZSBpZigiTWluS2V5Ij09PWEuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWEuX2Jzb250eXBlKXU9X3QoZSxyLGEsdSk7ZWxzZSBpZih2b2lkIDAhPT1hLl9ic29udHlwZSl0aHJvdyBuZXcgdGUoYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcoYS5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09bCYmbyYmKHU9UnQoZSxyLGEsdSkpfX1mLmRlbGV0ZSh0KSxlW3UrK109MDtjb25zdCBhPXUtcjtyZXR1cm4gcis9VWUuc2V0SW50MzJMRShlLHIsYSksdX1jb25zdCBQdD17JG9pZDpzdCwkYmluYXJ5Ok9lLCR1dWlkOk9lLCRzeW1ib2w6bHQsJG51bWJlckludDp0dCwkbnVtYmVyRGVjaW1hbDpRZSwkbnVtYmVyRG91YmxlOmV0LCRudW1iZXJMb25nOkNlLCRtaW5LZXk6cnQsJG1heEtleTpudCwkcmVnZXg6YXQsJHJlZ3VsYXJFeHByZXNzaW9uOmF0LCR0aW1lc3RhbXA6Y3R9O2Z1bmN0aW9uIEp0KGUsdD17fSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtjb25zdCBuPWU8PU4mJmU+PXgscj1lPD1JJiZlPj1fO2lmKHQucmVsYXhlZHx8dC5sZWdhY3kpcmV0dXJuIGU7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYobilyZXR1cm4gbmV3IHR0KGUpO2lmKHIpcmV0dXJuIHQudXNlQmlnSW50NjQ/QmlnSW50KGUpOkNlLmZyb21OdW1iZXIoZSl9cmV0dXJuIG5ldyBldChlKX1pZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoZS4kdW5kZWZpbmVkKXJldHVybiBudWxsO2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoIiQiKSYmbnVsbCE9ZVt0XSkpO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPVB0W25bcl1dO2lmKGkpcmV0dXJuIGkuZnJvbUV4dGVuZGVkSlNPTihlLHQpfWlmKG51bGwhPWUuJGRhdGUpe2NvbnN0IG49ZS4kZGF0ZSxyPW5ldyBEYXRlO2lmKHQubGVnYWN5KWlmKCJudW1iZXIiPT10eXBlb2YgbilyLnNldFRpbWUobik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyByZSgiVW5yZWNvZ25pemVkIHR5cGUgZm9yIEVKU09OIGRhdGU6ICIrdHlwZW9mIG4pO3Iuc2V0VGltZShOdW1iZXIobikpfWVsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBuKXIuc2V0VGltZShEYXRlLnBhcnNlKG4pKTtlbHNlIGlmKENlLmlzTG9uZyhuKSlyLnNldFRpbWUobi50b051bWJlcigpKTtlbHNlIGlmKCJudW1iZXIiPT10eXBlb2YgbiYmdC5yZWxheGVkKXIuc2V0VGltZShuKTtlbHNle2lmKCJiaWdpbnQiIT10eXBlb2Ygbil0aHJvdyBuZXcgcmUoIlVucmVjb2duaXplZCB0eXBlIGZvciBFSlNPTiBkYXRlOiAiK3R5cGVvZiBuKTtyLnNldFRpbWUoTnVtYmVyKG4pKX1yZXR1cm4gcn1pZihudWxsIT1lLiRjb2RlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGUuJHNjb3BlJiYodC4kc2NvcGU9SnQoZS4kc2NvcGUpKSxUZS5mcm9tRXh0ZW5kZWRKU09OKGUpfWlmKCRlKGUpfHxlLiRkYlBvaW50ZXIpe2NvbnN0IHQ9ZS4kcmVmP2U6ZS4kZGJQb2ludGVyO2lmKHQgaW5zdGFuY2VvZiBMZSlyZXR1cm4gdDtjb25zdCBuPU9iamVjdC5rZXlzKHQpLmZpbHRlcigoZT0+ZS5zdGFydHNXaXRoKCIkIikpKTtsZXQgcj0hMDtpZihuLmZvckVhY2goKGU9PnstMT09PVsiJHJlZiIsIiRpZCIsIiRkYiJdLmluZGV4T2YoZSkmJihyPSExKX0pKSxyKXJldHVybiBMZS5mcm9tRXh0ZW5kZWRKU09OKHQpfXJldHVybiBlfWZ1bmN0aW9uIGt0KGUpe2NvbnN0IHQ9ZS50b0lTT1N0cmluZygpO3JldHVybiAwIT09ZS5nZXRVVENNaWxsaXNlY29uZHMoKT90OnQuc2xpY2UoMCwtNSkrIloifWZ1bmN0aW9uIFl0KGUsdCl7aWYoZSBpbnN0YW5jZW9mIE1hcHx8QihlKSl7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcihjb25zdFt0LHJdb2YgZSl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyB0ZSgiQ2FuIG9ubHkgc2VyaWFsaXplIG1hcHMgd2l0aCBzdHJpbmcga2V5cyIpO25bdF09cn1yZXR1cm4gWXQobix0KX1pZigoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJm51bGwhPT1lKXtjb25zdCBuPXQuc2Vlbk9iamVjdHMuZmluZEluZGV4KCh0PT50Lm9iaj09PWUpKTtpZigtMSE9PW4pe2NvbnN0IGU9dC5zZWVuT2JqZWN0cy5tYXAoKGU9PmUucHJvcGVydHlOYW1lKSkscj1lLnNsaWNlKDAsbikubWFwKChlPT5gJHtlfSAtPiBgKSkuam9pbigiIiksaT1lW25dLG89IiAtPiAiK2Uuc2xpY2UobisxLGUubGVuZ3RoLTEpLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLHM9ZVtlLmxlbmd0aC0xXSxmPSIgIi5yZXBlYXQoci5sZW5ndGgraS5sZW5ndGgvMiksdT0iLSIucmVwZWF0KG8ubGVuZ3RoKyhpLmxlbmd0aCtzLmxlbmd0aCkvMi0xKTt0aHJvdyBuZXcgdGUoYENvbnZlcnRpbmcgY2lyY3VsYXIgc3RydWN0dXJlIHRvIEVKU09OOlxuICAgICR7cn0ke2l9JHtvfSR7c31cbiAgICAke2Z9XFwke3V9L2ApfXQuc2Vlbk9iamVjdHNbdC5zZWVuT2JqZWN0cy5sZW5ndGgtMV0ub2JqPWV9aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5tYXAoKChlLG4pPT57dC5zZWVuT2JqZWN0cy5wdXNoKHtwcm9wZXJ0eU5hbWU6YGluZGV4ICR7bn1gLG9iajpudWxsfSk7dHJ5e3JldHVybiBZdChlLHQpfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19KSl9KGUsdCk7aWYodm9pZCAwPT09ZSlyZXR1cm4gdC5pZ25vcmVVbmRlZmluZWQ/dm9pZCAwOm51bGw7aWYoZSBpbnN0YW5jZW9mIERhdGV8fFMoZSkpe2NvbnN0IG49ZS5nZXRUaW1lKCkscj1uPi0xJiZuPDI1MzQwMjMxODhlNTtyZXR1cm4gdC5sZWdhY3k/dC5yZWxheGVkJiZyP3skZGF0ZTplLmdldFRpbWUoKX06eyRkYXRlOmt0KGUpfTp0LnJlbGF4ZWQmJnI/eyRkYXRlOmt0KGUpfTp7JGRhdGU6eyRudW1iZXJMb25nOmUuZ2V0VGltZSgpLnRvU3RyaW5nKCl9fX1pZighKCJudW1iZXIiIT10eXBlb2YgZXx8dC5yZWxheGVkJiZpc0Zpbml0ZShlKSkpe2lmKE51bWJlci5pc0ludGVnZXIoZSkmJiFPYmplY3QuaXMoZSwtMCkpe2lmKGU+PXgmJmU8PU4pcmV0dXJueyRudW1iZXJJbnQ6ZS50b1N0cmluZygpfTtpZihlPj1fJiZlPD1JKXJldHVybnskbnVtYmVyTG9uZzplLnRvU3RyaW5nKCl9fXJldHVybnskbnVtYmVyRG91YmxlOk9iamVjdC5pcyhlLC0wKT8iLTAuMCI6ZS50b1N0cmluZygpfX1pZigiYmlnaW50Ij09dHlwZW9mIGUpcmV0dXJuIHQucmVsYXhlZD9OdW1iZXIoQmlnSW50LmFzSW50Tig2NCxlKSk6eyRudW1iZXJMb25nOkJpZ0ludC5hc0ludE4oNjQsZSkudG9TdHJpbmcoKX07aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cHx8bShlKSl7bGV0IG49ZS5mbGFncztpZih2b2lkIDA9PT1uKXtjb25zdCB0PWUudG9TdHJpbmcoKS5tYXRjaCgvW2dpbXV5XSokLyk7dCYmKG49dFswXSl9cmV0dXJuIG5ldyBhdChlLnNvdXJjZSxuKS50b0V4dGVuZGVkSlNPTih0KX1yZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2Z1bmN0aW9uKGUsdCl7aWYobnVsbD09ZXx8Im9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyB0ZSgibm90IGFuIG9iamVjdCBpbnN0YW5jZSIpO2NvbnN0IG49ZS5fYnNvbnR5cGU7aWYodm9pZCAwPT09bil7Y29uc3Qgbj17fTtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyhlKSl7dC5zZWVuT2JqZWN0cy5wdXNoKHtwcm9wZXJ0eU5hbWU6cixvYmo6bnVsbH0pO3RyeXtjb25zdCBpPVl0KGVbcl0sdCk7Il9fcHJvdG9fXyI9PT1yP09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLHIse3ZhbHVlOmksd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTpuW3JdPWl9ZmluYWxseXt0LnNlZW5PYmplY3RzLnBvcCgpfX1yZXR1cm4gbn1pZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGUmJmVbT10hPT1VKXRocm93IG5ldyBuZTtpZihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGV9KGUpKXtsZXQgcj1lO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnRvRXh0ZW5kZWRKU09OKXtjb25zdCB0PUh0W2UuX2Jzb250eXBlXTtpZighdCl0aHJvdyBuZXcgdGUoIlVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogIitlLl9ic29udHlwZSk7cj10KHIpfXJldHVybiJDb2RlIj09PW4mJnIuc2NvcGU/cj1uZXcgVGUoci5jb2RlLFl0KHIuc2NvcGUsdCkpOiJEQlJlZiI9PT1uJiZyLm9pZCYmKHI9bmV3IExlKFl0KHIuY29sbGVjdGlvbix0KSxZdChyLm9pZCx0KSxZdChyLmRiLHQpLFl0KHIuZmllbGRzLHQpKSksci50b0V4dGVuZGVkSlNPTih0KX10aHJvdyBuZXcgdGUoIl9ic29udHlwZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgd2FzOiAiK3R5cGVvZiBuKX0oZSx0KTplfWNvbnN0IEh0PXtCaW5hcnk6ZT0+bmV3IE9lKGUudmFsdWUoKSxlLnN1Yl90eXBlKSxDb2RlOmU9Pm5ldyBUZShlLmNvZGUsZS5zY29wZSksREJSZWY6ZT0+bmV3IExlKGUuY29sbGVjdGlvbnx8ZS5uYW1lc3BhY2UsZS5vaWQsZS5kYixlLmZpZWxkcyksRGVjaW1hbDEyODplPT5uZXcgUWUoZS5ieXRlcyksRG91YmxlOmU9Pm5ldyBldChlLnZhbHVlKSxJbnQzMjplPT5uZXcgdHQoZS52YWx1ZSksTG9uZzplPT5DZS5mcm9tQml0cyhudWxsIT1lLmxvdz9lLmxvdzplLmxvd18sbnVsbCE9ZS5sb3c/ZS5oaWdoOmUuaGlnaF8sbnVsbCE9ZS5sb3c/ZS51bnNpZ25lZDplLnVuc2lnbmVkXyksTWF4S2V5OigpPT5uZXcgbnQsTWluS2V5OigpPT5uZXcgcnQsT2JqZWN0SWQ6ZT0+bmV3IHN0KGUpLEJTT05SZWdFeHA6ZT0+bmV3IGF0KGUucGF0dGVybixlLm9wdGlvbnMpLEJTT05TeW1ib2w6ZT0+bmV3IGx0KGUudmFsdWUpLFRpbWVzdGFtcDplPT5jdC5mcm9tQml0cyhlLmxvdyxlLmhpZ2gpfTtmdW5jdGlvbiBxdChlLHQpe2NvbnN0IG49e3VzZUJpZ0ludDY0OnQ/LnVzZUJpZ0ludDY0Pz8hMSxyZWxheGVkOnQ/LnJlbGF4ZWQ/PyEwLGxlZ2FjeTp0Py5sZWdhY3k/PyExfTtyZXR1cm4gSlNPTi5wYXJzZShlLCgoZSx0KT0+e2lmKC0xIT09ZS5pbmRleE9mKCJcMCIpKXRocm93IG5ldyB0ZShgQlNPTiBEb2N1bWVudCBmaWVsZCBuYW1lcyBjYW5ub3QgY29udGFpbiBudWxsIGJ5dGVzLCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShlKX1gKTtyZXR1cm4gSnQodCxuKX0pKX1mdW5jdGlvbiBXdChlLHQsbixyKXtudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4mJihyPW4sbj0wKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDAsbj0wKTtjb25zdCBpPVl0KGUsT2JqZWN0LmFzc2lnbih7cmVsYXhlZDohMCxsZWdhY3k6ITF9LHIse3NlZW5PYmplY3RzOlt7cHJvcGVydHlOYW1lOiIocm9vdCkiLG9iajpudWxsfV19KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksdCxuKX1jb25zdCBLdD1PYmplY3QuY3JlYXRlKG51bGwpO0t0LnBhcnNlPXF0LEt0LnN0cmluZ2lmeT1XdCxLdC5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHx7fSxKU09OLnBhcnNlKFd0KGUsdCkpfSxLdC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LHF0KEpTT04uc3RyaW5naWZ5KGUpLHQpfSxPYmplY3QuZnJlZXplKEt0KTtjb25zdCBadD0xLEd0PTIsWHQ9MyxRdD00LGVuPTUsdG49Nixubj03LHJuPTgsb249OSxzbj0xMCxmbj0xMSx1bj0xMixhbj0xMyxsbj0xNCxobj0xNSxjbj0xNixnbj0xNyxkbj0xOCxibj0xOSxwbj0yNTUseW49MTI3O2Z1bmN0aW9uIHduKGUsdCl7dHJ5e3JldHVybiBVZS5nZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KX1jYXRjaChlKXt0aHJvdyBuZXcgaWUoIkJTT04gc2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUiLHQse2NhdXNlOmV9KX19ZnVuY3Rpb24gbW4oZSx0KXtsZXQgbj10O2Zvcig7MCE9PWVbbl07bisrKTtpZihuPT09ZS5sZW5ndGgtMSl0aHJvdyBuZXcgaWUoIk51bGwgdGVybWluYXRvciBub3QgZm91bmQiLHQpO3JldHVybiBufWNvbnN0IEJuPU9iamVjdC5jcmVhdGUobnVsbCk7Qm4ucGFyc2VUb0VsZW1lbnRzPWZ1bmN0aW9uKGUsdD0wKXtpZih0Pz89MCxlLmxlbmd0aDw1KXRocm93IG5ldyBpZShgSW5wdXQgbXVzdCBiZSBhdCBsZWFzdCA1IGJ5dGVzLCBnb3QgJHtlLmxlbmd0aH0gYnl0ZXNgLHQpO2NvbnN0IG49d24oZSx0KTtpZihuPmUubGVuZ3RoLXQpdGhyb3cgbmV3IGllKGBQYXJzZWQgZG9jdW1lbnRTaXplICgke259IGJ5dGVzKSBkb2VzIG5vdCBtYXRjaCBpbnB1dCBsZW5ndGggKCR7ZS5sZW5ndGh9IGJ5dGVzKWAsdCk7aWYoMCE9PWVbdCtuLTFdKXRocm93IG5ldyBpZSgiQlNPTiBkb2N1bWVudHMgbXVzdCBlbmQgaW4gMHgwMCIsdCtuKTtjb25zdCByPVtdO2xldCBpPXQrNDtmb3IoO2k8PW4rdDspe2NvbnN0IG89ZVtpXTtpZihpKz0xLDA9PT1vKXtpZihpLXQhPT1uKXRocm93IG5ldyBpZSgiSW52YWxpZCAweDAwIHR5cGUgYnl0ZSIsaSk7YnJlYWt9Y29uc3Qgcz1pLGY9bW4oZSxpKS1zO2xldCB1O2lmKGkrPWYrMSxvPT09WnR8fG89PT1kbnx8bz09PW9ufHxvPT09Z24pdT04O2Vsc2UgaWYobz09PWNuKXU9NDtlbHNlIGlmKG89PT1ubil1PTEyO2Vsc2UgaWYobz09PWJuKXU9MTY7ZWxzZSBpZihvPT09cm4pdT0xO2Vsc2UgaWYobz09PXNufHxvPT09dG58fG89PT15bnx8bz09PXBuKXU9MDtlbHNlIGlmKG89PT1mbil1PW1uKGUsbW4oZSxpKSsxKSsxLWk7ZWxzZSBpZihvPT09WHR8fG89PT1RdHx8bz09PWhuKXU9d24oZSxpKTtlbHNle2lmKG8hPT1HdCYmbyE9PWVuJiZvIT09dW4mJm8hPT1hbiYmbyE9PWxuKXRocm93IG5ldyBpZShgSW52YWxpZCAweCR7by50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfSB0eXBlIGJ5dGVgLGkpO3U9d24oZSxpKSs0LG89PT1lbiYmKHUrPTEpLG89PT11biYmKHUrPTEyKX1pZih1Pm4pdGhyb3cgbmV3IGllKCJ2YWx1ZSByZXBvcnRzIGxlbmd0aCBsYXJnZXIgdGhhbiBkb2N1bWVudCIsaSk7ci5wdXNoKFtvLHMsZixpLHVdKSxpKz11fXJldHVybiByfSxCbi5CeXRlVXRpbHM9eWUsQm4uTnVtYmVyVXRpbHM9VWUsT2JqZWN0LmZyZWV6ZShCbik7Y29uc3QgU249MTc4MjU3OTI7bGV0IEVuPXllLmFsbG9jYXRlKFNuKTt2YXIgVW49T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQlNPTkVycm9yOnRlLEJTT05PZmZzZXRFcnJvcjppZSxCU09OUmVnRXhwOmF0LEJTT05SdW50aW1lRXJyb3I6cmUsQlNPTlN5bWJvbDpsdCxCU09OVHlwZTplZSxCU09OVmFsdWU6bWUsQlNPTlZlcnNpb25FcnJvcjpuZSxCaW5hcnk6T2UsQnl0ZVV0aWxzOnllLENvZGU6VGUsREJSZWY6TGUsRGVjaW1hbDEyODpRZSxEb3VibGU6ZXQsRUpTT046S3QsSW50MzI6dHQsTG9uZzpDZSxNYXhLZXk6bnQsTWluS2V5OnJ0LE51bWJlclV0aWxzOlVlLE9iamVjdElkOnN0LFRpbWVzdGFtcDpjdCxVVUlEOl9lLGJzb25UeXBlOndlLGNhbGN1bGF0ZU9iamVjdFNpemU6ZnVuY3Rpb24oZSx0PXt9KXtyZXR1cm4gZnQoZSwiYm9vbGVhbiI9PXR5cGVvZih0PXR8fHt9KS5zZXJpYWxpemVGdW5jdGlvbnMmJnQuc2VyaWFsaXplRnVuY3Rpb25zLCJib29sZWFuIiE9dHlwZW9mIHQuaWdub3JlVW5kZWZpbmVkfHx0Lmlnbm9yZVVuZGVmaW5lZCl9LGRlc2VyaWFsaXplOmZ1bmN0aW9uKGUsdD17fSl7cmV0dXJuIGJ0KHllLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpfSxkZXNlcmlhbGl6ZVN0cmVhbTpmdW5jdGlvbihlLHQsbixyLGksbyl7Y29uc3Qgcz1PYmplY3QuYXNzaWduKHthbGxvd09iamVjdFNtYWxsZXJUaGFuQnVmZmVyU2l6ZTohMCxpbmRleDowfSxvKSxmPXllLnRvTG9jYWxCdWZmZXJUeXBlKGUpO2xldCB1PXQ7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7Y29uc3QgdD1VZS5nZXRJbnQzMkxFKGYsdSk7cy5pbmRleD11LHJbaStlXT1idChmLHMpLHUrPXR9cmV0dXJuIHV9LG9uRGVtYW5kOkJuLHNlcmlhbGl6ZTpmdW5jdGlvbihlLHQ9e30pe2NvbnN0IG49ImJvb2xlYW4iPT10eXBlb2YgdC5jaGVja0tleXMmJnQuY2hlY2tLZXlzLHI9ImJvb2xlYW4iPT10eXBlb2YgdC5zZXJpYWxpemVGdW5jdGlvbnMmJnQuc2VyaWFsaXplRnVuY3Rpb25zLGk9ImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVVbmRlZmluZWR8fHQuaWdub3JlVW5kZWZpbmVkLG89Im51bWJlciI9PXR5cGVvZiB0Lm1pbkludGVybmFsQnVmZmVyU2l6ZT90Lm1pbkludGVybmFsQnVmZmVyU2l6ZTpTbjtFbi5sZW5ndGg8byYmKEVuPXllLmFsbG9jYXRlKG8pKTtjb25zdCBzPU10KEVuLGUsbiwwLDAscixpLG51bGwpLGY9eWUuYWxsb2NhdGVVbnNhZmUocyk7cmV0dXJuIGYuc2V0KEVuLnN1YmFycmF5KDAscyksMCksZn0sc2VyaWFsaXplV2l0aEJ1ZmZlckFuZEluZGV4OmZ1bmN0aW9uKGUsdCxuPXt9KXtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIG4uY2hlY2tLZXlzJiZuLmNoZWNrS2V5cyxpPSJib29sZWFuIj09dHlwZW9mIG4uc2VyaWFsaXplRnVuY3Rpb25zJiZuLnNlcmlhbGl6ZUZ1bmN0aW9ucyxvPSJib29sZWFuIiE9dHlwZW9mIG4uaWdub3JlVW5kZWZpbmVkfHxuLmlnbm9yZVVuZGVmaW5lZCxzPSJudW1iZXIiPT10eXBlb2Ygbi5pbmRleD9uLmluZGV4OjAsZj1NdChFbixlLHIsMCwwLGksbyxudWxsKTtyZXR1cm4gdC5zZXQoRW4uc3ViYXJyYXkoMCxmKSxzKSxzK2YtMX0sc2V0SW50ZXJuYWxCdWZmZXJTaXplOmZ1bmN0aW9uKGUpe0VuLmxlbmd0aDxlJiYoRW49eWUuYWxsb2NhdGUoZSkpfX0pO2NsYXNzIE9ue2NvbnN0cnVjdG9yKCl7fXN0YXRpYyB1cmxDb25zdHJ1Y3RGcm9tKGUpe2NvbnN0IHQ9Ii93cy9tb2RlbGluZy9jb21tYW5kcyIrZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXMoZSkpaWYodm9pZCAwIT09cilpZihBcnJheS5pc0FycmF5KHIpKWZvcihjb25zdCBlIG9mIHIpdC5hcHBlbmQobixTdHJpbmcoZSkpO2Vsc2UgdC5hcHBlbmQobixTdHJpbmcocikpO2NvbnN0IG49dC50b1N0cmluZygpO3JldHVybiBuP2A/JHtufWA6IiJ9KHt2aWRlb19yZXNfd2lkdGg6ZS52aWRlb19yZXNfd2lkdGgsdmlkZW9fcmVzX2hlaWdodDplLnZpZGVvX3Jlc19oZWlnaHQsZnBzOmUuZnBzLHVubG9ja2VkX2ZyYW1lcmF0ZTplLnVubG9ja2VkX2ZyYW1lcmF0ZSxwb3N0X2VmZmVjdDplLnBvc3RfZWZmZWN0LHdlYnJ0YzplLndlYnJ0Yyxwb29sOmUucG9vbCxzaG93X2dyaWQ6ZS5zaG93X2dyaWQscmVwbGF5OmUucmVwbGF5LGFwaV9jYWxsX2lkOmUuYXBpX2NhbGxfaWQsb3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5OmUub3JkZXJfaW5kZXBlbmRlbnRfdHJhbnNwYXJlbmN5LHByOmUucHJ9KSxuPSgoZS5jbGllbnQ/LmJhc2VVcmx8fCJodHRwczovL2FwaS56b28uZGV2IikrdCkucmVwbGFjZSgvXmh0dHAvLCJ3cyIpO3JldHVybiBuZXcgVVJMKG4pfXN0YXRpYyBhdXRoZW50aWNhdGUoZSx0KXtjb25zdCBuPWUuY2xpZW50JiZlLmNsaWVudC50b2tlbnx8IiI7aWYobil0cnl7Y29uc3QgZT17dHlwZToiaGVhZGVycyIsaGVhZGVyczp7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7bn1gfX07dC5zZW5kKEpTT04uc3RyaW5naWZ5KGUpKX1jYXRjaHt9fXN0YXRpYyB0b0JTT04oZSl7cmV0dXJuIFVuLnNlcmlhbGl6ZShlKX1zdGF0aWMgcGFyc2VNZXNzYWdlKGUpe2NvbnN0IHQ9ZT8uZGF0YTtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEpTT04ucGFyc2UodCk7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBCdWZmZXImJkJ1ZmZlci5pc0J1ZmZlcj8uKHQpKXtjb25zdCBlPXQ7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUudG9TdHJpbmcoInV0ZjgiKSl9Y2F0Y2h7fXJldHVybiBVbi5kZXNlcmlhbGl6ZShlKX1pZih0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodCk7dHJ5e2NvbnN0IHQ9KG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGUpO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoe31yZXR1cm4gVW4uZGVzZXJpYWxpemUoZSl9aWYoKG49dCkmJiJvYmplY3QiPT10eXBlb2YgbiYmImJ1ZmZlciJpbiBuJiZuLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZU9mZnNldCYmIm51bWJlciI9PXR5cGVvZiBuLmJ5dGVMZW5ndGgpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCk7dHJ5e2NvbnN0IHQ9KG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGUpO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoe31yZXR1cm4gVW4uZGVzZXJpYWxpemUoZSl9dmFyIG47cmV0dXJuIHR9fWxldCBObjtjb25zdCB4bj17ZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKGUsdCxuLHIpe30sc2VuZE1vZGVsaW5nQ29tbWFuZEZyb21XYXNtOmFzeW5jKGUsdCxuLHIpPT4oTm4/LnNlbmQobiksbmV3IFByb21pc2UoKHQ9Pntjb25zdCBuPXI9PntpZihyLmRhdGEuaW5kZXhPZihlKTwwKXJldHVybjtjb25zdCBpPShvPUpTT04ucGFyc2Uoci5kYXRhKSxuZXcgYihzKS5lbmNvZGVTaGFyZWRSZWYobykpO3ZhciBvLHM7dChpKSxObi5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuKX07Tm4uYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9KSkpLGFzeW5jIHN0YXJ0TmV3U2Vzc2lvbigpe319O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50byl7Y2FzZSJ3b3JrZXIiOnJldHVybiB2b2lkKCJzdGFydCI9PT10LnBheWxvYWQudHlwZSYmKGFzeW5jIGU9Pnthd2FpdCBmZXRjaChuZXcgVVJMKCJodHRwOi8vbG9jYWxob3N0OjMwMDAva2NsX3dhc21fbGliX2JnLndhc20iKSkudGhlbigoZT0+ZS5hcnJheUJ1ZmZlcigpKSkudGhlbigoZT0+aS5kZWZhdWx0KHttb2R1bGVfb3JfcGF0aDplfSkpKSxObj1uZXcgV2ViU29ja2V0KE9uLnVybENvbnN0cnVjdEZyb20oe3dlYnJ0YzohMCwuLi5lfSkpLE5uLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgoKT0+e09uLmF1dGhlbnRpY2F0ZSh7Y2xpZW50OmUuY2xpZW50fSxObil9KSx7b25jZTohMH0pLE5uLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToibWVzc2FnZSIsZGF0YTplLmRhdGF9fSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57Tm4ucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOJiZObi5zZW5kKEpTT04uc3RyaW5naWZ5KHt0eXBlOiJwaW5nIn0pKX0pLDRlMyl9KSh0LnBheWxvYWQuZGF0YVswXSkpO2Nhc2Uid2Vic29ja2V0IjpyZXR1cm4gdm9pZCBObj8uW3QucGF5bG9hZC50eXBlXSguLi50LnBheWxvYWQuZGF0YSk7Y2FzZSJ3YXNtIjpyZXR1cm4gdm9pZCgiZXhlY3V0ZSI9PT10LnBheWxvYWQudHlwZT8oKGUsdD0ibWFpbi5rY2wiKT0+e2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiBlPyhvPWUse3JlYWRGaWxlOmFzeW5jIGU9PihuZXcgVGV4dEVuY29kZXIpLmVuY29kZShvKSxleGlzdHM6YXN5bmMgZT0+ITEsZ2V0QWxsRmlsZXM6YXN5bmMgZT0+W29dfSk6KGk9ZSx7YXN5bmMgcmVhZEZpbGUoZSl7Y29uc3QgdD1pLmdldChlKT8/IiI7cmV0dXJuKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpfSxleGlzdHM6YXN5bmMgZT0+aS5oYXMoZSksZ2V0QWxsRmlsZXM6YXN5bmMgZT0+QXJyYXkuZnJvbShpLnZhbHVlcygpKX0pO3ZhciBpLG87Y29uc3Qgcz0ic3RyaW5nIj09dHlwZW9mIGU/ZTplLmdldCh0KSxmPW5ldyByLkNvbnRleHQoeG4sbiksdT1yLnBhcnNlX3dhc20ocylbMF07cmV0dXJuIGYuZXhlY3V0ZShKU09OLnN0cmluZ2lmeSh1KSx0LCJ7fSIpfSkodC5wYXlsb2FkLmRhdGFbMF0pLnRoZW4oKCgpPT57cG9zdE1lc3NhZ2Uoe2Zyb206Indhc20iLHBheWxvYWQ6e3R5cGU6ImV4ZWN1dGUiLGRhdGE6ImRvbmUifX0pfSkpOnBvc3RNZXNzYWdlKHJbdC5wYXlsb2FkLnR5cGVdKC4uLnQucGF5bG9hZC5kYXRhKSkpfX0pKX0oem9vV2FzbSk7Cgo=",null,!1);const On=(t,e)=>{let n;return{fn:(...t)=>{n=t},intervalId:setInterval((()=>{if(void 0===n)return;const e=n;n=void 0,window.requestAnimationFrame((()=>{t(...e)}))}),e)}};var _n=function(t){return t[t.DOWN=0]="DOWN",t[t.UP=1]="UP",t}(_n||{}),Fn=function(t){return t[t.MIDDLE=1]="MIDDLE",t[t.RIGHT=2]="RIGHT",t}(Fn||{});const Dn={[_n.DOWN]:"camera_drag_start",[_n.UP]:"camera_drag_end"},An={[Fn.MIDDLE]:"pan",[Fn.RIGHT]:"rotatetrackball"};class $n extends EventTarget{removeMouseEvents=()=>{};constructor(t){super(),this.zooClientArgs=t,this.workerWebRTC=new En,this.rtcPeerConnection=new RTCPeerConnection({bundlePolicy:"max-bundle"}),this.rtcPeerConnection.addTransceiver("video",{direction:"recvonly"}),this.rtcPeerConnection.createDataChannel("unreliable_modeling_cmds"),this.ice(),this.rtcPeerConnection.addEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.addEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.addEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this))}deconstructor(){this.removeMouseEvents(),this.deice(),this.rtcPeerConnection.removeEventListener("track",this.webRTCOnTrack.bind(this)),this.rtcPeerConnection.removeEventListener("datachannel",this.webRTCOnDataChannel.bind(this)),this.rtcPeerConnection.removeEventListener("connectionstatechange",this.webRTCOnConnectionStateChange.bind(this)),this.workerWebRTC.terminate(),this.rtcPeerConnection.close()}start(){this.workerWebRTC.postMessage({to:"worker",payload:{type:"start",data:[this.zooClientArgs]}})}wasm(t,...e){return new Promise((n=>{const i=t=>{const e=t.data;"wasm"===e.from&&(this.workerWebRTC.removeEventListener("message",i),n(e.payload.data))};this.workerWebRTC.addEventListener("message",i),this.workerWebRTC.postMessage({to:"wasm",payload:{type:t,data:e??[]}})}))}executor(){return{addEventListener:this.workerWebRTC.addEventListener.bind(this.workerWebRTC,"message"),removeEventListener:this.workerWebRTC.removeEventListener.bind(this.workerWebRTC,"message"),submit:t=>new Promise((e=>{const n=t=>{const i=t.data;"wasm"===i.from&&"execute"===i.payload.type&&"done"===i.payload.data&&(this.workerWebRTC.removeEventListener("message",n),e(void 0))};this.workerWebRTC.addEventListener("message",n),this.workerWebRTC.postMessage({to:"wasm",payload:{type:"execute",data:[t]}})}))}}webRTCOnConnectionStateChange(){if("disconnected"===this.rtcPeerConnection.connectionState)this.dispatchEvent(new Event("close"))}webRTCOnTrack(t){this.track=t,this.dispatchEvent(new Event("track"))}webRTCOnDataChannel(t){this.channel=t.channel,this.dispatchEvent(new Event("datachannel")),this.dispatchEvent(new Event("connected"))}async iceOnIceServerInfo(t){if(0==t.data.ice_servers.length)return;this.rtcPeerConnection.setConfiguration({bundlePolicy:"max-bundle",iceServers:t.data.ice_servers,iceTransportPolicy:"relay"});const e=await this.rtcPeerConnection.createOffer();await this.rtcPeerConnection.setLocalDescription(e),this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"sdp_offer",offer:e})]}})}async iceOnSdpAnswer(t){await this.rtcPeerConnection.setRemoteDescription(t.data.answer)}async iceOnTrickleIce(t){await this.rtcPeerConnection.addIceCandidate(t.data.candidate)}iceOnIceCandidate(t){null!==t.candidate&&this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"trickle_ice",candidate:{candidate:t.candidate.candidate,sdpMid:t.candidate.sdpMid||void 0,sdpMLineIndex:t.candidate.sdpMLineIndex||void 0,usernameFragment:t.candidate.usernameFragment||void 0}})]}})}iceOnMessage(t){const e=In.parseMessage(t);if("resp"in e)switch(e.resp.type){case"ice_server_info":this.iceOnIceServerInfo(e.resp);break;case"sdp_answer":this.iceOnSdpAnswer(e.resp);break;case"trickle_ice":this.iceOnTrickleIce(e.resp)}}workerWebRTCOnMessage(t){const e=t.data;"websocket"===e.from&&"message"===e.payload.type&&this.iceOnMessage(e.payload)}ice(){this.workerWebRTC.addEventListener("message",this.workerWebRTCOnMessage.bind(this)),this.rtcPeerConnection.addEventListener("icecandidate",this.iceOnIceCandidate.bind(this))}deice(){this.workerWebRTC.removeEventListener("message",this.workerWebRTCOnMessage.bind(this)),this.rtcPeerConnection.removeEventListener("icecandidate",this.iceOnIceCandidate)}addMouseEvents(t){let e,n=_n.UP;const i=t=>i=>{const o=An[i.button];void 0!==o&&(this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:Dn[t],interaction:o,window:{x:i.offsetX,y:i.offsetY}}})]}}),e=i.button,n=t)},o=i(_n.DOWN),l=i(_n.UP),a=t=>{const i=An[e];void 0!==i&&(n=_n.UP,this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:Dn[n],interaction:i,window:{x:t.offsetX,y:t.offsetY}}})]}}))};let s=0;const c=On((t=>{n===_n.DOWN&&this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"camera_drag_move",interaction:An[e],window:{x:t.offsetX,y:t.offsetY}}})),s+=1,this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"mouse_move",sequence:s,window:{x:t.offsetX,y:t.offsetY}}}))}),1e3/30),r=On((t=>{t.preventDefault(),this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"default_camera_zoom",magnitude:-1*Math.sign(t.deltaY)*window.devicePixelRatio*100}}))}),1e3/30),d=e=>{this.channel=e.channel,t.addEventListener("pointerdown",o),t.addEventListener("pointermove",c.fn),t.addEventListener("pointerup",l),t.addEventListener("pointerleave",a),t.addEventListener("wheel",r.fn,{passive:!1})};this.rtcPeerConnection.addEventListener("datachannel",d),this.removeMouseEvents=()=>{this.rtcPeerConnection.removeEventListener("datachannel",d),t.removeEventListener("pointerdown",o),t.removeEventListener("pointermove",c.fn),clearInterval(c.intervalId),t.removeEventListener("pointerup",l),t.removeEventListener("pointerleave",a),t.removeEventListener("wheel",r.fn),clearInterval(r.intervalId)}}send(...t){this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:t}})}}const qn={get_api_call:async function({client:t,id:n}){const i=`/api-calls/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_api_call_for_org:async function({client:t,id:n}){const i=`/org/api-calls/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_api_call_for_user:async function({client:t,id:n}){const i=`/user/api-calls/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_api_call_metrics:async function({client:t,group_by:n}){const i="/api-call-metrics"+e({group_by:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_async_operation:async function({client:t,id:n}){const i=`/async/operations/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_api_calls:s,list_api_calls_for_user:c,list_api_calls_for_user_pager:function(t){return a(c,t,"page_token")},list_api_calls_pager:function(t){return a(s,t,"page_token")},list_async_operations:r,list_async_operations_pager:function(t){return a(r,t,"page_token")},org_list_api_calls:d,org_list_api_calls_pager:function(t){return a(d,t,"page_token")},user_list_api_calls:u,user_list_api_calls_pager:function(t){return a(u,t,"page_token")}},ti={create_api_token_for_user:async function({client:t,label:n}){const i="/user/api-tokens"+e({label:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_api_token_for_user:async function({client:t,token:n}){const i=`/user/api-tokens/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},get_api_token_for_user:async function({client:t,token:n}){const i=`/user/api-tokens/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_api_tokens_for_user:b,list_api_tokens_for_user_pager:function(t){return a(b,t,"page_token")}},ei={apps_github_callback:async function({client:t}={}){const n="/apps/github/callback"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},apps_github_consent:async function({client:t}={}){const n="/apps/github/consent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},apps_github_webhook:async function({client:t,body:n}){const i="/apps/github/webhook"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/octet-stream";const c={method:"POST",headers:s,body:n},r=t?.fetch||fetch,d=await r(l,c);await o(d)}},ni={create_executor_term:class{constructor(){}static urlConstructFrom(t){const n="/ws/executor/term"+e({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}},create_file_execution:async function({client:t,lang:n,output:i,body:l}){const a=`/file/execute/${n}`+e({output:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()}},ii={create_file_center_of_mass:async function({client:t,src_format:n,output_unit:i,body:l}){const a="/file/center-of-mass"+e({src_format:n,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_file_conversion:async function({client:t,src_format:n,output_format:i,body:l}){const a=`/file/conversion/${n}/${i}`+e({}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_file_conversion_options:async function({client:t,files:n,body:i}){const l="/file/conversion"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)})),r.append("event",JSON.stringify(i));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},create_file_density:async function({client:t,src_format:n,material_mass:i,material_mass_unit:l,output_unit:a,body:s}){const c="/file/density"+e({src_format:n,material_mass:i,material_mass_unit:l,output_unit:a}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`),u["Content-Type"]="application/octet-stream";const b={method:"POST",headers:u,body:s},m=t?.fetch||fetch,Z=await m(r,b);return await o(Z),await Z.json()},create_file_mass:async function({client:t,src_format:n,material_density:i,material_density_unit:l,output_unit:a,body:s}){const c="/file/mass"+e({src_format:n,material_density:i,material_density_unit:l,output_unit:a}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`),u["Content-Type"]="application/octet-stream";const b={method:"POST",headers:u,body:s},m=t?.fetch||fetch,Z=await m(r,b);return await o(Z),await Z.json()},create_file_surface_area:async function({client:t,src_format:n,output_unit:i,body:l}){const a="/file/surface-area"+e({src_format:n,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_file_volume:async function({client:t,src_format:n,output_unit:i,body:l}){const a="/file/volume"+e({src_format:n,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/octet-stream";const d={method:"POST",headers:r,body:l},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()}},oi={community_sso:async function({client:t,sso:n,sig:i}){const l="/community/sso"+e({sso:n,sig:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},create_event:async function({client:t,files:n,body:i}){const l="/events"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)})),r.append("event",JSON.stringify(i));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);await o(b)},get_ipinfo:async function({client:t}={}){const n="/_meta/ipinfo"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_pricing_subscriptions:async function({client:t}={}){const n="/pricing/subscriptions"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_schema:async function({client:t}={}){const n="/"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},internal_get_api_token_for_discord_user:async function({client:t,discord_id:n}){const i=`/internal/discord/api-token/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},ping:async function({client:t}={}){const n="/ping"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()}},li={create_custom_model:async function({client:t,body:n}){const i="/ml/custom/models"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_kcl_code_completions:async function({client:t,body:n}){const i="/ml/kcl/completions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_proprietary_to_kcl:async function({client:t,files:n,code_option:i}){const l="/ml/convert/proprietary-to-kcl"+e({code_option:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)}));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},create_text_to_cad:async function({client:t,output_format:n,kcl:i,body:l}){const a=`/ai/text-to-cad/${n}`+e({kcl:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/json";const d={method:"POST",headers:r,body:JSON.stringify(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},create_text_to_cad_iteration:async function({client:t,body:n}){const i="/ml/text-to-cad/iteration"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_text_to_cad_multi_file_iteration:async function({client:t,files:n,body:i}){const l="/ml/text-to-cad/multi-file/iteration"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)})),r.append("event",JSON.stringify(i));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},create_text_to_cad_part_feedback:async function({client:t,id:n,feedback:i}){const l=`/user/text-to-cad/${n}`+e({feedback:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"POST",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},get_custom_model:async function({client:t,id:n}){const i=`/ml/custom/models/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_ml_prompt:async function({client:t,id:n}){const i=`/ml-prompts/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_text_to_cad_part_for_user:async function({client:t,id:n}){const i=`/user/text-to-cad/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_conversations_for_user:gn,list_conversations_for_user_pager:function(t){return a(gn,t,"page_token")},list_ml_prompts:Wn,list_ml_prompts_pager:function(t){return a(Wn,t,"page_token")},list_org_datasets_for_model:async function({client:t,id:n}){const i=`/ml/custom/models/${n}/datasets`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_text_to_cad_parts_for_user:Sn,list_text_to_cad_parts_for_user_pager:function(t){return a(Sn,t,"page_token")},ml_copilot_ws:class{constructor(){}static urlConstructFrom(t){const n="/ws/ml/copilot"+e({replay:t.replay,conversation_id:t.conversation_id,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}},ml_reasoning_ws:class{constructor(){}static urlConstructFrom(t){const n=`/ws/ml/reasoning/${t.id}`+e({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+n).replace(/^http/,"ws");return new URL(i)}static authenticate(t,e){const n=t.client&&t.client.token||"";if(n)try{const t={type:"headers",headers:{Authorization:`Bearer ${n}`}};e.send(JSON.stringify(t))}catch{}}static toBSON(t){return Xn.serialize(t)}static parseMessage(t){const e=t?.data;if("string"==typeof e)return JSON.parse(e);if("undefined"!=typeof Buffer&&Buffer.isBuffer?.(e)){const t=e;try{return JSON.parse(t.toString("utf8"))}catch{}return Xn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}if(fn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Xn.deserialize(t)}return e}},update_custom_model:async function({client:t,id:n,body:i}){const l=`/ml/custom/models/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()}},ai={modeling_commands_ws:In},si={create_org_oauth2_app:async function({client:t,body:n}){const i="/org/oauth2/apps"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_user_oauth2_app:async function({client:t,body:n}){const i="/user/oauth2/apps"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_org_oauth2_app:async function({client:t,client_id:n}){const i=`/org/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_user_oauth2_app:async function({client:t,client_id:n}){const i=`/user/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},device_access_token:async function({client:t,body:i}){const l="/oauth2/device/token"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/x-www-form-urlencoded";const r={method:"POST",headers:c,body:n(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},device_auth_confirm:async function({client:t,body:n}){const i="/oauth2/device/confirm"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},device_auth_request:async function({client:t,body:i}){const l="/oauth2/device/auth"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/x-www-form-urlencoded";const r={method:"POST",headers:c,body:n(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},device_auth_verify:async function({client:t,user_code:n,app_name:i}){const l="/oauth2/device/verify"+e({user_code:n,app_name:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_org_oauth2_app:async function({client:t,client_id:n}){const i=`/org/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user_oauth2_app:async function({client:t,client_id:n}){const i=`/user/oauth2/apps/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_oauth2_apps_for_any_org:Tn,list_oauth2_apps_for_any_org_pager:function(t){return a(Tn,t,"page_token")},list_oauth2_apps_for_any_user:Un,list_oauth2_apps_for_any_user_pager:function(t){return a(Un,t,"page_token")},list_org_oauth2_apps:Kn,list_org_oauth2_apps_pager:function(t){return a(Kn,t,"page_token")},list_user_oauth2_apps:wn,list_user_oauth2_apps_pager:function(t){return a(wn,t,"page_token")},oauth2_provider_callback:async function({client:t,provider:n,code:i,state:l,id_token:a,user:s}){const c=`/oauth2/provider/${n}/callback`+e({code:i,state:l,id_token:a,user:s}),r=(t?.baseUrl||"https://api.zoo.dev")+c,d=t&&t.token||"",u={};d&&(u.Authorization=`Bearer ${d}`);const b={method:"GET",headers:u},m=t?.fetch||fetch,Z=await m(r,b);return await o(Z),await Z.json()},oauth2_provider_callback_post:async function({client:t,provider:i,body:l}){const a=`/oauth2/provider/${i}/callback`+e({}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:r,body:n(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},oauth2_provider_consent:async function({client:t,provider:n,callback_url:i}){const l=`/oauth2/provider/${n}/consent`+e({callback_url:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},oauth2_token_revoke:async function({client:t,body:i}){const l="/oauth2/token/revoke"+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/x-www-form-urlencoded";const r={method:"POST",headers:c,body:n(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_org_oauth2_app:async function({client:t,client_id:n,body:i}){const l=`/org/oauth2/apps/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_user_oauth2_app:async function({client:t,client_id:n,body:i}){const l=`/user/oauth2/apps/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},verify_oauth_account_linking:async function({client:t,token:n,callback_url:i}){const l="/oauth2/verify-account-linking"+e({token:n,callback_url:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()}},ci={create_org:async function({client:t,body:n}){const i="/org"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_org_dataset:async function({client:t,body:n}){const i="/org/datasets"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_org_member:async function({client:t,body:n}){const i="/org/members"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_org_saml_idp:async function({client:t,body:n}){const i="/org/saml/idp"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_org:async function({client:t}={}){const n="/org"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_org_dataset:async function({client:t,id:n}){const i=`/org/datasets/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_org_member:async function({client:t,user_id:n}){const i=`/org/members/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_org_saml_idp:async function({client:t}={}){const n="/org/saml/idp"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},download_org_dataset_conversion_original:async function({client:t,id:n,conversion_id:i}){const l=`/org/datasets/${n}/conversions/${i}/original`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},download_org_dataset_successful_kcl_bulk:async function({client:t,id:n}){const i=`/org/datasets/${n}/bulk-download/kcl`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_any_org:async function({client:t,id:n}){const i=`/orgs/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_billing_contract_for_any_org:async function({client:t,id:n}){const i=`/orgs/${n}/billing/contract`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org:async function({client:t}={}){const n="/org"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_org_dataset:async function({client:t,id:n}){const i=`/org/datasets/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org_dataset_conversion:async function({client:t,id:n,conversion_id:i}){const l=`/org/datasets/${n}/conversions/${i}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_org_dataset_conversion_stats:async function({client:t,id:n}){const i=`/org/datasets/${n}/stats`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org_member:async function({client:t,user_id:n}){const i=`/org/members/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_org_privacy_settings:async function({client:t}={}){const n="/org/privacy"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_org_saml_idp:async function({client:t}={}){const n="/org/saml/idp"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_org_shortlinks:Rn,get_org_shortlinks_pager:function(t){return a(Rn,t,"page_token")},get_user_org:async function({client:t}={}){const n="/user/org"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_org_dataset_conversions:Jn,list_org_dataset_conversions_pager:function(t){return a(Jn,t,"page_token")},list_org_datasets:Nn,list_org_datasets_pager:function(t){return a(Nn,t,"page_token")},list_org_members:Yn,list_org_members_pager:function(t){return a(Yn,t,"page_token")},list_orgs:Ln,list_orgs_pager:function(t){return a(Ln,t,"page_token")},org_admin_details_get:async function({client:t,id:n}){const i=`/orgs/${n}/admin/details`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},org_dataset_s3_policies:async function({client:t,uri:n,role_arn:i}){const l="/org/dataset/s3/policies"+e({uri:n,role_arn:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},retrigger_org_dataset:async function({client:t,id:n,statuses:i}){const l=`/org/datasets/${n}/retrigger`+e({statuses:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"POST",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},retrigger_org_dataset_conversion:async function({client:t,id:n,conversion_id:i}){const l=`/org/datasets/${n}/conversions/${i}/retrigger`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"POST",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},search_org_dataset_conversions:zn,search_org_dataset_conversions_pager:function(t){return a(zn,t,"page_token")},search_org_dataset_semantic:async function({client:t,id:n,q:i,limit:l}){const a=`/org/datasets/${n}/search/semantic`+e({q:i,limit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},update_org:async function({client:t,body:n}){const i="/org"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_org_dataset:async function({client:t,id:n,body:i}){const l=`/org/datasets/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_org_member:async function({client:t,user_id:n,body:i}){const l=`/org/members/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_org_privacy_settings:async function({client:t,body:n}){const i="/org/privacy"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_org_saml_idp:async function({client:t,body:n}){const i="/org/saml/idp"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},upload_org_dataset_files:async function({client:t,files:n,id:i}){const l=`/org/datasets/${i}/uploads`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)}));const d={method:"POST",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()},upsert_billing_contract_for_any_org:async function({client:t,id:n,body:i}){const l=`/orgs/${n}/billing/contract`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()}},ri={create_org_subscription:async function({client:t,body:n}){const i="/org/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_payment_information_for_org:async function({client:t,body:n}){const i="/org/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_payment_information_for_user:async function({client:t,body:n}){const i="/user/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},create_payment_intent_for_org:async function({client:t}={}){const n="/org/payment/intent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},create_payment_intent_for_user:async function({client:t}={}){const n="/user/payment/intent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},create_user_subscription:async function({client:t,body:n}){const i="/user/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_payment_information_for_org:async function({client:t}={}){const n="/org/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_payment_information_for_user:async function({client:t}={}){const n="/user/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_payment_method_for_org:async function({client:t,id:n}){const i=`/org/payment/methods/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_payment_method_for_user:async function({client:t,id:n,force:i}){const l=`/user/payment/methods/${n}`+e({force:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"DELETE",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},get_org_subscription:async function({client:t}={}){const n="/org/payment/subscriptions"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_payment_balance_for_any_org:async function({client:t,include_total_due:n,id:i}){const l=`/orgs/${i}/payment/balance`+e({include_total_due:n}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_payment_balance_for_any_user:async function({client:t,id:n,include_total_due:i}){const l=`/users/${n}/payment/balance`+e({include_total_due:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_payment_balance_for_org:async function({client:t,include_total_due:n}){const i="/org/payment/balance"+e({include_total_due:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_payment_balance_for_user:async function({client:t,include_total_due:n}){const i="/user/payment/balance"+e({include_total_due:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_payment_information_for_org:async function({client:t}={}){const n="/org/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_payment_information_for_user:async function({client:t}={}){const n="/user/payment"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_subscription:async function({client:t}={}){const n="/user/payment/subscriptions"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_invoices_for_org:async function({client:t}={}){const n="/org/payment/invoices"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_invoices_for_user:async function({client:t}={}){const n="/user/payment/invoices"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_payment_methods_for_org:async function({client:t}={}){const n="/org/payment/methods"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_payment_methods_for_user:async function({client:t}={}){const n="/user/payment/methods"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},set_default_payment_method_for_user:async function({client:t,id:n}){const i=`/user/payment/methods/${n}/default`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},update_org_subscription:async function({client:t,body:n}){const i="/org/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_org_subscription_for_any_org:async function({client:t,id:n,body:i}){const l=`/orgs/${n}/payment/subscriptions`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_payment_balance_for_any_org:async function({client:t,id:n,include_total_due:i,body:l}){const a=`/orgs/${n}/payment/balance`+e({include_total_due:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/json";const d={method:"PUT",headers:r,body:JSON.stringify(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},update_payment_balance_for_any_user:async function({client:t,id:n,include_total_due:i,body:l}){const a=`/users/${n}/payment/balance`+e({include_total_due:i}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`),r["Content-Type"]="application/json";const d={method:"PUT",headers:r,body:JSON.stringify(l)},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},update_payment_information_for_org:async function({client:t,body:n}){const i="/org/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_payment_information_for_user:async function({client:t,body:n}){const i="/user/payment"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_user_subscription:async function({client:t,body:n}){const i="/user/payment/subscriptions"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},upsert_subscription_plan_price:async function({client:t,slug:n,body:i}){const l=`/subscription-plans/${n}/prices`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"POST",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},validate_customer_tax_information_for_org:async function({client:t}={}){const n="/org/payment/tax"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},validate_customer_tax_information_for_user:async function({client:t}={}){const n="/user/payment/tax"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)}},di={create_project:async function({client:t,files:n}){const i="/user/projects"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c=new FormData;n.forEach((t=>{c.append(t.name,t.data,t.name)}));const r={method:"POST",headers:s,body:c},d=t?.fetch||fetch,u=await d(l,r);return await o(u),await u.json()},create_project_share_link:async function({client:t,id:n,body:i}){const l=`/user/projects/${n}/share-links`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"POST",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},create_public_project_vote:async function({client:t,id:n}){const i=`/projects/public/${n}/vote`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_project:async function({client:t,id:n}){const i=`/user/projects/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},delete_project_share_link:async function({client:t,id:n,key:i}){const l=`/user/projects/${n}/share-links/${i}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"DELETE",headers:c},d=t?.fetch||fetch,u=await d(a,r);await o(u)},delete_public_project_vote:async function({client:t,id:n}){const i=`/projects/public/${n}/vote`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},download_project:async function({client:t,id:n,format:i}){const l=`/user/projects/${n}/download`+e({format:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},download_public_project:async function({client:t,id:n,format:i}){const l=`/projects/public/${n}/download`+e({format:i}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r={method:"GET",headers:c},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},get_project:async function({client:t,id:n}){const i=`/user/projects/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_project_thumbnail:async function({client:t,id:n}){const i=`/user/projects/${n}/thumbnail`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_public_project:async function({client:t,id:n}){const i=`/projects/public/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_public_project_thumbnail:async function({client:t,id:n}){const i=`/projects/public/${n}/thumbnail`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_project_categories:async function({client:t}={}){const n="/projects/categories"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_project_share_links:async function({client:t,id:n}){const i=`/user/projects/${n}/share-links`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_projects:async function({client:t}={}){const n="/user/projects"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},list_public_projects:async function({client:t}={}){const n="/projects/public"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},publish_project:async function({client:t,id:n}){const i=`/user/projects/${n}/publish`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_project:async function({client:t,files:n,id:i}){const l=`/user/projects/${i}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`);const r=new FormData;n.forEach((t=>{r.append(t.name,t.data,t.name)}));const d={method:"PUT",headers:c,body:r},u=t?.fetch||fetch,b=await u(a,d);return await o(b),await b.json()}},ui={create_service_account_for_org:async function({client:t,label:n}){const i="/org/service-accounts"+e({label:n}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"POST",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_service_account_for_org:async function({client:t,token:n}){const i=`/org/service-accounts/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},get_service_account_for_org:async function({client:t,token:n}){const i=`/org/service-accounts/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},list_service_accounts_for_org:xn,list_service_accounts_for_org_pager:function(t){return a(xn,t,"page_token")}},bi={create_store_coupon:async function({client:t,body:n}){const i="/store/coupon"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()}},mi={get_angle_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/angle/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_area_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/area/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_current_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/current/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_energy_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/energy/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_force_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/force/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_frequency_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/frequency/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_length_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/length/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_mass_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/mass/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_power_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/power/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_pressure_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/pressure/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_temperature_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/temperature/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_torque_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/torque/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()},get_volume_unit_conversion:async function({client:t,input_unit:n,output_unit:i,value:l}){const a=`/unit/conversion/volume/${n}/${i}`+e({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+a,c=t&&t.token||"",r={};c&&(r.Authorization=`Bearer ${c}`);const d={method:"GET",headers:r},u=t?.fetch||fetch,b=await u(s,d);return await o(b),await b.json()}},Zi={create_user_shortlink:async function({client:t,body:n}){const i="/user/shortlinks"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},delete_user_self:async function({client:t}={}){const n="/user"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},delete_user_shortlink:async function({client:t,key:n}){const i=`/user/shortlinks/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"DELETE",headers:s},r=t?.fetch||fetch,d=await r(l,c);await o(d)},get_oauth2_providers_for_user:async function({client:t}={}){const n="/user/oauth2/providers"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_session_for_user:async function({client:t,token:n}){const i=`/user/session/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user:async function({client:t,id:n}){const i=`/users/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user_cad_user_info_form:async function({client:t}={}){const n="/user/cad-user-info"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_extended:async function({client:t,id:n}){const i=`/users-extended/${n}`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},get_user_privacy_settings:async function({client:t}={}){const n="/user/privacy"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_self:async function({client:t}={}){const n="/user"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_self_extended:async function({client:t}={}){const n="/user/extended"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},get_user_shortlinks:Cn,get_user_shortlinks_pager:function(t){return a(Cn,t,"page_token")},list_users:kn,list_users_extended:Bn,list_users_extended_pager:function(t){return a(Bn,t,"page_token")},list_users_pager:function(t){return a(kn,t,"page_token")},put_public_email_marketing_consent_request:async function({client:t,body:n}){const i="/website/email-marketing-consent/request"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},put_public_mailing_list_subscribe:async function({client:t,slug:n,body:i}){const l=`/website/email-marketing-lists/${n}/subscribe`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);await o(u)},put_public_mailing_list_unsubscribe:async function({client:t,slug:n,body:i}){const l=`/website/email-marketing-lists/${n}/unsubscribe`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);await o(u)},put_public_sales_form:async function({client:t,body:n}){const i="/website/forms/sales"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},put_public_support_form:async function({client:t,body:n}){const i="/website/forms/support"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},put_user_cad_user_info_form:async function({client:t,body:n}){const i="/website/forms/cad-user-info"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);await o(d)},report_user_client_error:async function({client:t,body:n}){const i="/user/client-errors"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"POST",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_subscription_for_user:async function({client:t,id:n,body:i}){const l=`/users/${n}/payment/subscriptions`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);return await o(u),await u.json()},update_user_privacy_settings:async function({client:t,body:n}){const i="/user/privacy"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_user_self:async function({client:t,body:n}){const i="/user"+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`),s["Content-Type"]="application/json";const c={method:"PUT",headers:s,body:JSON.stringify(n)},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},update_user_shortlink:async function({client:t,key:n,body:i}){const l=`/user/shortlinks/${n}`+e({}),a=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",c={};s&&(c.Authorization=`Bearer ${s}`),c["Content-Type"]="application/json";const r={method:"PUT",headers:c,body:JSON.stringify(i)},d=t?.fetch||fetch,u=await d(a,r);await o(u)},user_admin_details_get:async function({client:t,id:n}){const i=`/users/${n}/admin/details`+e({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,a=t&&t.token||"",s={};a&&(s.Authorization=`Bearer ${a}`);const c={method:"GET",headers:s},r=t?.fetch||fetch,d=await r(l,c);return await o(d),await d.json()},user_email_marketing_consent_decline_post:async function({client:t}={}){const n="/user/email-marketing-consent/decline"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},user_email_marketing_consent_get:async function({client:t}={}){const n="/user/email-marketing-consent"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()},user_email_marketing_consent_request_post:async function({client:t}={}){const n="/user/email-marketing-consent/request"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},user_email_marketing_consent_seen_post:async function({client:t}={}){const n="/user/email-marketing-consent/seen"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"POST",headers:a},c=t?.fetch||fetch,r=await c(i,s);await o(r)},user_features_get:async function({client:t}={}){const n="/user/features"+e({}),i=(t?.baseUrl||"https://api.zoo.dev")+n,l=t&&t.token||"",a={};l&&(a.Authorization=`Bearer ${l}`);const s={method:"GET",headers:a},c=t?.fetch||fetch,r=await c(i,s);return await o(r),await r.json()}};export{i as ApiError,t as Client,l as Pager,$n as WebRTC,qn as api_calls,ti as api_tokens,ei as apps,a as createPager,ni as executor,ii as file,oi as meta,li as ml,ai as modeling,si as oauth2,ci as orgs,ri as payments,di as projects,ui as service_accounts,bi as store,mi as unit,Zi as users};
|