@kittycad/lib 4.2.1 → 4.2.2

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@kittycad/oauth2-auth-code-pkce");try{if("undefined"==typeof fetch&&"undefined"!=typeof process&&process.versions?.node){new Function("m","return import(m)")("cross-fetch/polyfill").catch((()=>{}))}}catch{}function e(t,e){return`${t.replace(/\/+$/,"")}/${e.replace(/^\/+/,"")}`}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));const n=e.toString();return n?`?${n}`:""}function i(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 l 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 l(t.status,e)}class c{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 s(t,e,n="page_token"){return new c(t,e,n)}async function a({client:t,id:e,limit:i,page_token:l,sort_by:c}){const s=`/users/${e}/api-calls`+n({limit:i,page_token:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},m=t?.fetch||fetch,r=await m(a,Z);await o(r);return await r.json()}async function d({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/api-calls"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function b({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/api-calls"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function Z({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/api-tokens"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}const m=(()=>{const t=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype),Symbol.toStringTag).get;return e=>t.call(e)})();function r(t){return"Uint8Array"===m(t)}function u(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&("ArrayBuffer"===t[Symbol.toStringTag]||"SharedArrayBuffer"===t[Symbol.toStringTag])}function h(t){return t instanceof RegExp||"[object RegExp]"===Object.prototype.toString.call(t)}function p(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&"Map"===t[Symbol.toStringTag]}function y(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function G(t,e){return JSON.stringify(t,((t,e)=>"bigint"==typeof e?{$numberLong:`${e}`}:p(e)?Object.fromEntries(e):e))}const X=7,V=Symbol.for("@@mdb.bson.version"),W=2147483647,f=-2147483648,g=Math.pow(2,63)-1,Y=-Math.pow(2,63),I=Math.pow(2,53),R=-Math.pow(2,53),S=1,J=2,K=3,T=4,L=5,U=6,x=7,z=8,N=9,w=10,k=11,H=12,C=13,B=14,v=15,M=16,j=17,P=18,F=19,Q=255,O=127,E=0,_=4,D=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 A 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 $ extends A{get name(){return"BSONVersionError"}constructor(){super(`Unsupported BSON version, bson types must be from bson ${X}.x.x`)}}class q extends A{get name(){return"BSONRuntimeError"}constructor(t){super(t)}}class tt extends A{get name(){return"BSONOffsetError"}offset;constructor(t,e,n){super(`${t}. offset: ${e}`,n),this.offset=e}}let et,nt;function it(t,e,n,i){if(i){et??=new TextDecoder("utf8",{fatal:!0});try{return et.decode(t.subarray(e,n))}catch(t){throw new A("Invalid UTF-8 string in BSON document",{cause:t})}}return nt??=new TextDecoder("utf8",{fatal:!1}),nt.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 l=[];for(let i=e;i<n;i++){const e=t[i];if(e>127)return null;l.push(e)}return String.fromCharCode(...l)}function ot(t){return at.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}function ct(t){return crypto.getRandomValues(at.allocate(t))}const st=(()=>{const{crypto:t}=globalThis;return null!=t&&"function"==typeof t.getRandomValues?ct:ot})(),at={isUint8Array:r,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 A("Cannot create Buffer from the passed potentialBuffer.")},allocate:t=>Buffer.alloc(t),allocateUnsafe:t=>Buffer.allocUnsafe(t),compare:(t,e)=>at.toLocalBufferType(t).compare(e),concat:t=>Buffer.concat(t),copy:(t,e,n,i,l)=>at.toLocalBufferType(t).copy(e,n??0,i??0,l??t.length),equals:(t,e)=>at.toLocalBufferType(t).equals(e),fromNumberArray:t=>Buffer.from(t),fromBase64:t=>Buffer.from(t,"base64"),fromUTF8:t=>Buffer.from(t,"utf8"),toBase64:t=>at.toLocalBufferType(t).toString("base64"),fromISO88591:t=>Buffer.from(t,"binary"),toISO88591:t=>at.toLocalBufferType(t).toString("binary"),fromHex:t=>Buffer.from(t,"hex"),toHex:t=>at.toLocalBufferType(t).toString("hex"),toUTF8(t,e,n,i){const l=n-e<=20?lt(t,e,n):null;if(null!=l)return l;const o=at.toLocalBufferType(t).toString("utf8",e,n);if(i)for(let i=0;i<o.length;i++)if(65533===o.charCodeAt(i)){it(t,e,n,!0);break}return o},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,l=n;i<e.length;i++,l++){const n=e.charCodeAt(i);if(n>127)return null;t[l]=n}return e.length}(t,e,n);return null!=i?i:at.toLocalBufferType(t).write(e,n,void 0,"utf8")},randomBytes:st,swap32:t=>at.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 bt=(()=>{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})(),Zt=/(\d|[a-f])/i,mt={isUint8Array:r,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 A("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,l){if(void 0!==l&&l<0)throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${l}`);if(l=l??t.length,void 0!==i&&(i<0||i>l))throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${l}. 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 o=t.subarray(i,l),c=Math.min(o.length,e.length-n);return c<=0?0:(e.set(o.subarray(0,c),n),c)},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],l=e[t+1];if(!Zt.test(i))break;if(!Zt.test(l))break;const o=Number.parseInt(`${i}${l}`,16);n.push(o)}return Uint8Array.from(n)},toHex:t=>Array.from(t,(t=>t.toString(16).padStart(2,"0"))).join(""),toUTF8(t,e,n,i){const l=n-e<=20?lt(t,e,n):null;return null!=l?l:it(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:bt,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],l=t[e+2],o=t[e+3];t[e]=o,t[e+1]=l,t[e+2]=i,t[e+3]=n}return t}},rt="function"==typeof Buffer&&!0!==Buffer.prototype?._isBuffer?at:mt,ut=Symbol.for("@@mdb.bson.type");class ht{get[ut](){return this._bsontype}get[V](){return X}[Symbol.for("nodejs.util.inspect.custom")](t,e,n){return this.inspect(t,e,n)}}const pt=new Float64Array(1),yt=new Uint8Array(pt.buffer,0,8);pt[0]=-1;const Gt=0===yt[7],Xt={isBigEndian:Gt,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:Gt?(t,e)=>(yt[7]=t[e],yt[6]=t[e+1],yt[5]=t[e+2],yt[4]=t[e+3],yt[3]=t[e+4],yt[2]=t[e+5],yt[1]=t[e+6],yt[0]=t[e+7],pt[0]):(t,e)=>(yt[0]=t[e],yt[1]=t[e+1],yt[2]=t[e+2],yt[3]=t[e+3],yt[4]=t[e+4],yt[5]=t[e+5],yt[6]=t[e+6],yt[7]=t[e+7],pt[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 l=Number(n&i);t[e]=l,l>>=8,t[e+1]=l,l>>=8,t[e+2]=l,l>>=8,t[e+3]=l;let o=Number(n>>32n&i);return t[e+4]=o,o>>=8,t[e+5]=o,o>>=8,t[e+6]=o,o>>=8,t[e+7]=o,8},setFloat64LE:Gt?(t,e,n)=>(pt[0]=n,t[e]=yt[7],t[e+1]=yt[6],t[e+2]=yt[5],t[e+3]=yt[4],t[e+4]=yt[3],t[e+5]=yt[2],t[e+6]=yt[1],t[e+7]=yt[0],8):(t,e,n)=>(pt[0]=n,t[e]=yt[0],t[e+1]=yt[1],t[e+2]=yt[2],t[e+3]=yt[3],t[e+4]=yt[4],t[e+5]=yt[5],t[e+6]=yt[6],t[e+7]=yt[7],8)};class Vt extends ht{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)&&!u(t)&&!Array.isArray(t))throw new A("Binary can only be constructed from Uint8Array or number[]");this.sub_type=e??Vt.BSON_BINARY_SUBTYPE_DEFAULT,null==t?(this.buffer=rt.allocate(Vt.BUFFER_SIZE),this.position=0):(this.buffer=Array.isArray(t)?rt.fromNumberArray(t):rt.toLocalBufferType(t),this.position=this.buffer.byteLength)}put(t){if("string"==typeof t&&1!==t.length)throw new A("only accepts single character String");if("number"!=typeof t&&1!==t.length)throw new A("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 A("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=rt.allocate(Vt.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=rt.allocate(this.buffer.byteLength+t.length);e.set(this.buffer,0),this.buffer=e}if(ArrayBuffer.isView(t))this.buffer.set(rt.toLocalBufferType(t),e),this.position=e+t.byteLength>this.position?e+t.length:this.position;else if("string"==typeof t)throw new A("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 rt.toBase64(this.buffer.subarray(0,this.position))}toString(t){return"hex"===t?rt.toHex(this.buffer.subarray(0,this.position)):"base64"===t?rt.toBase64(this.buffer.subarray(0,this.position)):rt.toUTF8(this.buffer,0,this.position,!1)}toExtendedJSON(t){t=t||{},this.sub_type===Vt.SUBTYPE_VECTOR&&Wt(this);const e=rt.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===Vt.SUBTYPE_UUID)return new Yt(this.buffer.subarray(0,this.position));throw new A(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Vt.SUBTYPE_UUID}" is currently supported.`)}static createFromHexString(t,e){return new Vt(rt.fromHex(t),e)}static createFromBase64(t,e){return new Vt(rt.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=rt.fromBase64(t.$binary)):"string"!=typeof t.$binary&&(i=t.$binary.subType?parseInt(t.$binary.subType,16):0,n=rt.fromBase64(t.$binary.base64)):"$uuid"in t&&(i=4,n=Yt.bytesFromString(t.$uuid)),!n)throw new A(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);return i===_?new Yt(n):new Vt(n,i)}inspect(t,e,n){n??=G;return`Binary.createFromBase64(${n(rt.toBase64(this.buffer.subarray(0,this.position)),e)}, ${n(this.sub_type,e)})`}toInt8Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Int8)throw new A("Binary datatype field is not Int8");return Wt(this),new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toFloat32Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Float32)throw new A("Binary datatype field is not Float32");Wt(this);const t=new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position));return Xt.isBigEndian&&rt.swap32(t),new Float32Array(t.buffer)}toPackedBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");return Wt(this),new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");Wt(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=rt.allocate(t.byteLength+2);e[0]=Vt.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 Wt(i),i}static fromFloat32Array(t){const e=rt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Float32,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2),Xt.isBigEndian&&rt.swap32(new Uint8Array(e.buffer,2));const i=new this(e,this.SUBTYPE_VECTOR);return Wt(i),i}static fromPackedBits(t,e=0){const n=rt.allocate(t.byteLength+2);n[0]=Vt.VECTOR_TYPE.PackedBit,n[1]=e,n.set(t,2);const i=new this(n,this.SUBTYPE_VECTOR);return Wt(i),i}static fromBits(t){const e=t.length+7>>>3,n=new Uint8Array(e+2);n[0]=Vt.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,l=t[e];if(0!==l&&1!==l)throw new A(`Invalid bit value at ${e}: must be 0 or 1, found ${t[e]}`);if(0===l)continue;const o=7-e%8;n[i+2]|=l<<o}return new this(n,Vt.SUBTYPE_VECTOR)}}function Wt(t){if(t.sub_type!==Vt.SUBTYPE_VECTOR)return;const e=t.position,n=t.buffer[0],i=t.buffer[1];if((n===Vt.VECTOR_TYPE.Float32||n===Vt.VECTOR_TYPE.Int8)&&0!==i)throw new A("Invalid Vector: padding must be zero for int8 and float32 vectors");if(n===Vt.VECTOR_TYPE.Float32&&0!==e&&e-2!=0&&(e-2)%4!=0)throw new A("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");if(n===Vt.VECTOR_TYPE.PackedBit&&0!==i&&2===e)throw new A("Invalid Vector: padding must be zero for packed bit vectors that are empty");if(n===Vt.VECTOR_TYPE.PackedBit&&i>7)throw new A(`Invalid Vector: padding must be a value between 0 and 7. found: ${i}`)}const ft=/^[0-9A-F]{32}$/i,gt=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;class Yt extends Vt{constructor(t){let e;if(null==t)e=Yt.generate();else if(t instanceof Yt)e=rt.toLocalBufferType(new Uint8Array(t.buffer));else if(ArrayBuffer.isView(t)&&16===t.byteLength)e=rt.toLocalBufferType(t);else{if("string"!=typeof t)throw new A("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=Yt.bytesFromString(t)}super(e,_)}get id(){return this.buffer}set id(t){this.buffer=t}toHexString(t=!0){return t?[rt.toHex(this.buffer.subarray(0,4)),rt.toHex(this.buffer.subarray(4,6)),rt.toHex(this.buffer.subarray(6,8)),rt.toHex(this.buffer.subarray(8,10)),rt.toHex(this.buffer.subarray(10,16))].join("-"):rt.toHex(this.buffer)}toString(t){return"hex"===t?rt.toHex(this.id):"base64"===t?rt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}equals(t){if(!t)return!1;if(t instanceof Yt)return rt.equals(t.id,this.id);try{return rt.equals(new Yt(t).id,this.id)}catch{return!1}}toBinary(){return new Vt(this.id,Vt.SUBTYPE_UUID)}static generate(){const t=rt.randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,t}static isValid(t){return!!t&&("string"==typeof t?Yt.isValidUUIDString(t):r(t)?16===t.byteLength:"Binary"===t._bsontype&&t.sub_type===this.SUBTYPE_UUID&&16===t.buffer.byteLength)}static createFromHexString(t){const e=Yt.bytesFromString(t);return new Yt(e)}static createFromBase64(t){return new Yt(rt.fromBase64(t))}static bytesFromString(t){if(!Yt.isValidUUIDString(t))throw new A("UUID string representation must be 32 hex digits or canonical hyphenated representation");return rt.fromHex(t.replace(/-/g,""))}static isValidUUIDString(t){return ft.test(t)||gt.test(t)}inspect(t,e,n){return n??=G,`new UUID(${n(this.toHexString(),e)})`}}class It extends ht{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 It(t.$code,t.$scope)}inspect(t,e,n){n??=G;let i=n(this.code,e);const l=i.includes("\n");null!=this.scope&&(i+=`,${l?"\n":" "}${n(this.scope,e)}`);return`new Code(${l?"\n":""}${i}${l&&null===this.scope?"\n":""})`}}function Rt(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 St extends ht{get _bsontype(){return"DBRef"}collection;oid;db;fields;constructor(t,e,n,i){super();const l=t.split(".");2===l.length&&(n=l.shift(),t=l.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 St(t.$ref,t.$id,t.$db,e)}inspect(t,e,n){n??=G;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===G?`new ObjectId(${i[1]})`:i[1],`new DBRef(${i.join(", ")})`}}function Jt(t){if(""===t)return t;let e=0;const n="-"===t[e],i="+"===t[e];(i||n)&&(e+=1);let l=!1;for(;e<t.length&&"0"===t[e];++e)l=!0;return l?`${n?"-":""}${t.length===e?"0":t.slice(e)}`:i?t.slice(1):t}let Kt;try{Kt=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 Tt=4294967296,Lt=0x10000000000000000,Ut=Lt/2,xt={},zt={},Nt=/^(\+?0|(\+|-)?[1-9][0-9]*)$/;class wt extends ht{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),l="number"==typeof e?e:0,o="string"==typeof t?wt.fromString(t,i):"bigint"==typeof t?wt.fromBigInt(t,i):{low:0|t,high:0|l,unsigned:i};this.low=o.low,this.high=o.high,this.unsigned=o.unsigned}static TWO_PWR_24=wt.fromInt(16777216);static MAX_UNSIGNED_VALUE=wt.fromBits(-1,-1,!0);static ZERO=wt.fromInt(0);static UZERO=wt.fromInt(0,!0);static ONE=wt.fromInt(1);static UONE=wt.fromInt(1,!0);static NEG_ONE=wt.fromInt(-1);static MAX_VALUE=wt.fromBits(-1,2147483647,!1);static MIN_VALUE=wt.fromBits(0,-2147483648,!1);static fromBits(t,e,n){return new wt(t,e,n)}static fromInt(t,e){let n,i,l;return e?(l=0<=(t>>>=0)&&t<256)&&(i=zt[t],i)?i:(n=wt.fromBits(t,(0|t)<0?-1:0,!0),l&&(zt[t]=n),n):(l=-128<=(t|=0)&&t<128)&&(i=xt[t],i)?i:(n=wt.fromBits(t,t<0?-1:0,!1),l&&(xt[t]=n),n)}static fromNumber(t,e){if(isNaN(t))return e?wt.UZERO:wt.ZERO;if(e){if(t<0)return wt.UZERO;if(t>=Lt)return wt.MAX_UNSIGNED_VALUE}else{if(t<=-Ut)return wt.MIN_VALUE;if(t+1>=Ut)return wt.MAX_VALUE}return t<0?wt.fromNumber(-t,e).neg():wt.fromBits(t%Tt|0,t/Tt|0,e)}static fromBigInt(t,e){const n=0xffffffffn;return new wt(Number(t&n),Number(t>>32n&n),e)}static _fromString(t,e,n){if(0===t.length)throw new A("empty string");if(n<2||36<n)throw new A("radix");let i;if((i=t.indexOf("-"))>0)throw new A("interior hyphen");if(0===i)return wt._fromString(t.substring(1),e,n).neg();const l=wt.fromNumber(Math.pow(n,8));let o=wt.ZERO;for(let e=0;e<t.length;e+=8){const i=Math.min(8,t.length-e),c=parseInt(t.substring(e,e+i),n);if(i<8){const t=wt.fromNumber(Math.pow(n,i));o=o.mul(t).add(wt.fromNumber(c))}else o=o.mul(l),o=o.add(wt.fromNumber(c))}return o.unsigned=e,o}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 A(`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 A(`Input: '${t}' contains invalid characters for radix: ${n}`);const l=Jt(t),o=wt._fromString(l,i,n);if(o.toString(n).toLowerCase()!==l.toLowerCase())throw new A(`Input: ${t} is not representable as ${o.unsigned?"an unsigned":"a signed"} 64-bit Long ${null!=n?`with radix: ${n}`:""}`);return o}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?wt.ZERO:wt._fromString(t,i,n)}static fromBytes(t,e,n){return n?wt.fromBytesLE(t,e):wt.fromBytesBE(t,e)}static fromBytesLE(t,e){return new wt(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 wt(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?wt.fromNumber(t,e):"string"==typeof t?wt.fromString(t,e):wt.fromBits(t.low,t.high,"boolean"==typeof e?e:t.unsigned)}add(t){wt.isLong(t)||(t=wt.fromValue(t));const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,l=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16;let a=0,d=0,b=0,Z=0;return Z+=l+(65535&t.low),b+=Z>>>16,Z&=65535,b+=i+s,d+=b>>>16,b&=65535,d+=n+c,a+=d>>>16,d&=65535,a+=e+o,a&=65535,wt.fromBits(b<<16|Z,a<<16|d,this.unsigned)}and(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low&t.low,this.high&t.high,this.unsigned)}compare(t){if(wt.isLong(t)||(t=wt.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(wt.isLong(t)||(t=wt.fromValue(t)),t.isZero())throw new A("division by zero");if(Kt){if(!this.unsigned&&-2147483648===this.high&&-1===t.low&&-1===t.high)return this;const e=(this.unsigned?Kt.div_u:Kt.div_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,Kt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?wt.UZERO:wt.ZERO;let e,n,i;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return wt.UZERO;if(t.gt(this.shru(1)))return wt.UONE;i=wt.UZERO}else{if(this.eq(wt.MIN_VALUE)){if(t.eq(wt.ONE)||t.eq(wt.NEG_ONE))return wt.MIN_VALUE;if(t.eq(wt.MIN_VALUE))return wt.ONE;return e=this.shr(1).div(t).shl(1),e.eq(wt.ZERO)?t.isNegative()?wt.ONE:wt.NEG_ONE:(n=this.sub(t.mul(e)),i=e.add(n.div(t)),i)}if(t.eq(wt.MIN_VALUE))return this.unsigned?wt.UZERO:wt.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=wt.ZERO}for(n=this;n.gte(t);){e=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));const l=Math.ceil(Math.log(e)/Math.LN2),o=l<=48?1:Math.pow(2,l-48);let c=wt.fromNumber(e),s=c.mul(t);for(;s.isNegative()||s.gt(n);)e-=o,c=wt.fromNumber(e,this.unsigned),s=c.mul(t);c.isZero()&&(c=wt.ONE),i=i.add(c),n=n.sub(s)}return i}div(t){return this.divide(t)}equals(t){return wt.isLong(t)||(t=wt.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(wt.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(wt.isLong(t)||(t=wt.fromValue(t)),Kt){const e=(this.unsigned?Kt.rem_u:Kt.rem_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,Kt.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 wt.ZERO;if(wt.isLong(t)||(t=wt.fromValue(t)),Kt){const e=Kt.mul(this.low,this.high,t.low,t.high);return wt.fromBits(e,Kt.get_high(),this.unsigned)}if(t.isZero())return wt.ZERO;if(this.eq(wt.MIN_VALUE))return t.isOdd()?wt.MIN_VALUE:wt.ZERO;if(t.eq(wt.MIN_VALUE))return this.isOdd()?wt.MIN_VALUE:wt.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(wt.TWO_PWR_24)&&t.lt(wt.TWO_PWR_24))return wt.fromNumber(this.toNumber()*t.toNumber(),this.unsigned);const e=this.high>>>16,n=65535&this.high,i=this.low>>>16,l=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16,a=65535&t.low;let d=0,b=0,Z=0,m=0;return m+=l*a,Z+=m>>>16,m&=65535,Z+=i*a,b+=Z>>>16,Z&=65535,Z+=l*s,b+=Z>>>16,Z&=65535,b+=n*a,d+=b>>>16,b&=65535,b+=i*s,d+=b>>>16,b&=65535,b+=l*c,d+=b>>>16,b&=65535,d+=e*a+n*s+i*c+l*o,d&=65535,wt.fromBits(Z<<16|m,d<<16|b,this.unsigned)}mul(t){return this.multiply(t)}negate(){return!this.unsigned&&this.eq(wt.MIN_VALUE)?wt.MIN_VALUE:this.not().add(wt.ONE)}neg(){return this.negate()}not(){return wt.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 wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low|t.low,this.high|t.high,this.unsigned)}shiftLeft(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):wt.fromBits(0,this.low<<t-32,this.unsigned)}shl(t){return this.shiftLeft(t)}shiftRight(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):wt.fromBits(this.high>>t-32,this.high>=0?0:-1,this.unsigned)}shr(t){return this.shiftRight(t)}shiftRightUnsigned(t){if(wt.isLong(t)&&(t=t.toInt()),0===(t&=63))return this;{const e=this.high;if(t<32){const n=this.low;return wt.fromBits(n>>>t|e<<32-t,e>>>t,this.unsigned)}return 32===t?wt.fromBits(e,0,this.unsigned):wt.fromBits(e>>>t-32,0,this.unsigned)}}shr_u(t){return this.shiftRightUnsigned(t)}shru(t){return this.shiftRightUnsigned(t)}subtract(t){return wt.isLong(t)||(t=wt.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)*Tt+(this.low>>>0):this.high*Tt+(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?wt.fromBits(this.low,this.high,!1):this}toString(t){if((t=t||10)<2||36<t)throw new A("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(wt.MIN_VALUE)){const e=wt.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=wt.fromNumber(Math.pow(t,6),this.unsigned);let n=this,i="";for(;;){const l=n.div(e);let o=(n.sub(l.mul(e)).toInt()>>>0).toString(t);if(n=l,n.isZero())return o+i;for(;o.length<6;)o="0"+o;i=""+o+i}}toUnsigned(){return this.unsigned?this:wt.fromBits(this.low,this.high,!0)}xor(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.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 A("$numberLong string is too long");if(!Nt.test(t.$numberLong))throw new A(`$numberLong string "${t.$numberLong}" is in an invalid format`);if(n){const e=BigInt(t.$numberLong);return BigInt.asIntN(64,e)}const l=wt.fromString(t.$numberLong);return i?l.toNumber():l}inspect(t,e,n){n??=G;return`new Long(${n(this.toString(),e)}${this.unsigned?`, ${n(this.unsigned,e)}`:""})`}}const kt=/^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/,Ht=/^(\+|-)?(Infinity|inf)$/i,Ct=/^(\+|-)?NaN$/i,Bt=6111,vt=-6176,Mt=rt.fromNumberArray([124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),jt=rt.fromNumberArray([248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Pt=rt.fromNumberArray([120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Ft=/^([-+])?(\d+)?$/;function Qt(t){return!isNaN(parseInt(t,10))}function Ot(t){const e=wt.fromNumber(1e9);let n=wt.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 wt(t.parts[i],0)),t.parts[i]=n.div(e).low,n=n.modulo(e);return{quotient:t,rem:n}}function Et(t,e){throw new A(`"${t}" is not a valid Decimal128 string - ${e}`)}class _t extends ht{get _bsontype(){return"Decimal128"}bytes;constructor(t){if(super(),"string"==typeof t)this.bytes=_t.fromString(t).bytes;else{if(!(t instanceof Uint8Array||r(t)))throw new A("Decimal128 must take a Buffer or string");if(16!==t.byteLength)throw new A("Decimal128 must take a Buffer of 16 bytes");this.bytes=t}}static fromString(t){return _t._fromString(t,{allowRounding:!1})}static fromStringWithRounding(t){return _t._fromString(t,{allowRounding:!0})}static _fromString(t,e){let n=!1,i=!1,l=!1,o=!1,c=0,s=0,a=0,d=0,b=0;const Z=[0];let m=0,r=0,u=0,h=0,p=new wt(0,0),y=new wt(0,0),G=0,X=0;if(t.length>=7e3)throw new A(t+" not a valid Decimal128 string");const V=t.match(kt),W=t.match(Ht),f=t.match(Ct);if(!V&&!W&&!f||0===t.length)throw new A(t+" not a valid Decimal128 string");if(V){const e=V[2],n=V[4],i=V[5],l=V[6];n&&void 0===l&&Et(t,"missing exponent power"),n&&void 0===e&&Et(t,"missing exponent base"),void 0===n&&(i||l)&&Et(t,"missing e before exponent")}if("+"!==t[X]&&"-"!==t[X]||(i=!0,n="-"===t[X++]),!Qt(t[X])&&"."!==t[X]){if("i"===t[X]||"I"===t[X])return new _t(n?jt:Pt);if("N"===t[X])return new _t(Mt)}for(;Qt(t[X])||"."===t[X];)"."!==t[X]?(m<34&&("0"!==t[X]||o)&&(o||(b=s),o=!0,Z[r++]=parseInt(t[X],10),m+=1),o&&(a+=1),l&&(d+=1),s+=1,X+=1):(l&&Et(t,"contains multiple periods"),l=!0,X+=1);if(l&&!s)throw new A(t+" not a valid Decimal128 string");if("e"===t[X]||"E"===t[X]){const e=t.substr(++X).match(Ft);if(!e||!e[2])return new _t(Mt);h=parseInt(e[0],10),X+=e[0].length}if(t[X])return new _t(Mt);if(m){if(u=m-1,c=a,1!==c)for(;"0"===t[b+c-1+Number(i)+Number(l)];)c-=1}else Z[0]=0,a=1,m=1,c=0;for(h<=d&&d>h+16384?h=vt:h-=d;h>Bt;){if(u+=1,u>=34){if(0===c){h=Bt;break}Et(t,"overflow")}h-=1}if(e.allowRounding){for(;h<vt||m<a;){if(0===u&&c<m){h=vt,c=0;break}if(m<a?a-=1:u-=1,h<Bt)h+=1;else{if(Z.join("").match(/^0+$/)){h=Bt;break}Et(t,"overflow")}}if(u+1<c){let e=s;l&&(b+=1,e+=1),i&&(b+=1,e+=1);const o=parseInt(t[b+u+1],10);let c=0;if(o>=5&&(c=1,5===o)){c=Z[u]%2==1?1:0;for(let n=b+u+2;n<e;n++)if(parseInt(t[n],10)){c=1;break}}if(c){let t=u;for(;t>=0&&++Z[t]>9;t--)if(Z[t]=0,0===t){if(!(h<Bt))return new _t(n?jt:Pt);h+=1,Z[t]=1}}}}else{for(;h<vt||m<a;){if(0===u){if(0===c){h=vt;break}Et(t,"exponent underflow")}m<a?("0"!==t[a-1+Number(i)+Number(l)]&&0!==c&&Et(t,"inexact rounding"),a-=1):(0!==Z[u]&&Et(t,"inexact rounding"),u-=1),h<Bt?h+=1:Et(t,"overflow")}if(u+1<c){l&&(b+=1),i&&(b+=1);0!==parseInt(t[b+u+1],10)&&Et(t,"inexact rounding")}}if(p=wt.fromNumber(0),y=wt.fromNumber(0),0===c)p=wt.fromNumber(0),y=wt.fromNumber(0);else if(u<17){let t=0;for(y=wt.fromNumber(Z[t++]),p=new wt(0,0);t<=u;t++)y=y.multiply(wt.fromNumber(10)),y=y.add(wt.fromNumber(Z[t]))}else{let t=0;for(p=wt.fromNumber(Z[t++]);t<=u-17;t++)p=p.multiply(wt.fromNumber(10)),p=p.add(wt.fromNumber(Z[t]));for(y=wt.fromNumber(Z[t++]);t<=u;t++)y=y.multiply(wt.fromNumber(10)),y=y.add(wt.fromNumber(Z[t]))}const g=function(t,e){if(!t&&!e)return{high:wt.fromNumber(0),low:wt.fromNumber(0)};const n=t.shiftRightUnsigned(32),i=new wt(t.getLowBits(),0),l=e.shiftRightUnsigned(32),o=new wt(e.getLowBits(),0);let c=n.multiply(l),s=n.multiply(o);const a=i.multiply(l);let d=i.multiply(o);return c=c.add(s.shiftRightUnsigned(32)),s=new wt(s.getLowBits(),0).add(a).add(d.shiftRightUnsigned(32)),c=c.add(s.shiftRightUnsigned(32)),d=s.shiftLeft(32).add(new wt(d.getLowBits(),0)),{high:c,low:d}}(p,wt.fromString("100000000000000000"));g.low=g.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}(g.low,y)&&(g.high=g.high.add(wt.fromNumber(1))),G=h+6176;const Y={low:wt.fromNumber(0),high:wt.fromNumber(0)};g.high.shiftRightUnsigned(49).and(wt.fromNumber(1)).equals(wt.fromNumber(1))?(Y.high=Y.high.or(wt.fromNumber(3).shiftLeft(61)),Y.high=Y.high.or(wt.fromNumber(G).and(wt.fromNumber(16383).shiftLeft(47))),Y.high=Y.high.or(g.high.and(wt.fromNumber(0x7fffffffffff)))):(Y.high=Y.high.or(wt.fromNumber(16383&G).shiftLeft(49)),Y.high=Y.high.or(g.high.and(wt.fromNumber(562949953421311)))),Y.low=g.low,n&&(Y.high=Y.high.or(wt.fromString("9223372036854775808")));const I=rt.allocateUnsafe(16);return X=0,I[X++]=255&Y.low.low,I[X++]=Y.low.low>>8&255,I[X++]=Y.low.low>>16&255,I[X++]=Y.low.low>>24&255,I[X++]=255&Y.low.high,I[X++]=Y.low.high>>8&255,I[X++]=Y.low.high>>16&255,I[X++]=Y.low.high>>24&255,I[X++]=255&Y.high.low,I[X++]=Y.high.low>>8&255,I[X++]=Y.high.low>>16&255,I[X++]=Y.high.low>>24&255,I[X++]=255&Y.high.high,I[X++]=Y.high.high>>8&255,I[X++]=Y.high.high>>16&255,I[X++]=Y.high.high>>24&255,new _t(I)}toString(){let t,e=0;const n=new Array(36);for(let t=0;t<n.length;t++)n[t]=0;let i,l,o,c=0,s=!1,a={parts:[0,0,0,0]};const d=[];c=0;const b=this.bytes,Z=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,m=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,r=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,u=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24;c=0;({low:new wt(Z,m),high:new wt(r,u)}).high.lessThan(wt.ZERO)&&d.push("-");const h=u>>26&31;if(h>>3==3){if(30===h)return d.join("")+"Infinity";if(31===h)return"NaN";t=u>>15&16383,i=8+(u>>14&1)}else i=u>>14&7,t=u>>17&16383;const p=t-6176;if(a.parts[0]=(16383&u)+((15&i)<<14),a.parts[1]=r,a.parts[2]=m,a.parts[3]=Z,0===a.parts[0]&&0===a.parts[1]&&0===a.parts[2]&&0===a.parts[3])s=!0;else for(o=3;o>=0;o--){let t=0;const e=Ot(a);if(a=e.quotient,t=e.rem.low,t)for(l=8;l>=0;l--)n[9*o+l]=t%10,t=Math.floor(t/10)}if(s)e=1,n[c]=0;else for(e=36;!n[c];)e-=1,c+=1;const y=e-1+p;if(y>=34||y<=-7||p>0){if(e>34)return d.push("0"),p>0?d.push(`E+${p}`):p<0&&d.push(`E${p}`),d.join("");d.push(`${n[c++]}`),e-=1,e&&d.push(".");for(let t=0;t<e;t++)d.push(`${n[c++]}`);d.push("E"),y>0?d.push(`+${y}`):d.push(`${y}`)}else if(p>=0)for(let t=0;t<e;t++)d.push(`${n[c++]}`);else{let t=e+p;if(t>0)for(let e=0;e<t;e++)d.push(`${n[c++]}`);else d.push("0");for(d.push(".");t++<0;)d.push("0");for(let i=0;i<e-Math.max(t-1,0);i++)d.push(`${n[c++]}`)}return d.join("")}toJSON(){return{$numberDecimal:this.toString()}}toExtendedJSON(){return{$numberDecimal:this.toString()}}static fromExtendedJSON(t){return _t.fromString(t.$numberDecimal)}inspect(t,e,n){n??=G;return`new Decimal128(${n(this.toString(),e)})`}}class Dt extends ht{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 Dt(NaN);if("Infinity"===t)return new Dt(1/0);if("-Infinity"===t)return new Dt(-1/0);if(!Number.isFinite(e))throw new A(`Input: ${t} is not representable as a Double`);if(t.trim()!==t)throw new A(`Input: '${t}' contains whitespace`);if(""===t)throw new A("Input is an empty string");if(/[^-0-9.+eE]/.test(t))throw new A(`Input: '${t}' is not in decimal or exponential notation`);return new Dt(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 Dt(n)}inspect(t,e,n){return n??=G,`new Double(${n(this.value,e)})`}}class At extends ht{get _bsontype(){return"Int32"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=0|+t}static fromString(t){const e=Jt(t),n=Number(t);if(W<n)throw new A(`Input: '${t}' is larger than the maximum value for Int32`);if(f>n)throw new A(`Input: '${t}' is smaller than the minimum value for Int32`);if(!Number.isSafeInteger(n))throw new A(`Input: '${t}' is not a safe integer`);if(n.toString()!==e)throw new A(`Input: '${t}' is not a valid Int32 string`);return new At(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 At(t.$numberInt)}inspect(t,e,n){return n??=G,`new Int32(${n(this.value,e)})`}}class $t extends ht{get _bsontype(){return"MaxKey"}toExtendedJSON(){return{$maxKey:1}}static fromExtendedJSON(){return new $t}inspect(){return"new MaxKey()"}}class qt extends ht{get _bsontype(){return"MinKey"}toExtendedJSON(){return{$minKey:1}}static fromExtendedJSON(){return new qt}inspect(){return"new MinKey()"}}let te=null;const ee=new WeakMap;class ne extends ht{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 A("Argument passed in must have an id that is of type string or Buffer");e="toHexString"in t&&"function"==typeof t.toHexString?rt.fromHex(t.toHexString()):t.id}else e=t;if(null==e)this.buffer=ne.generate();else if(ArrayBuffer.isView(e)&&12===e.byteLength)this.buffer=rt.toLocalBufferType(e);else{if("string"!=typeof e)throw new A("Argument passed in does not match the accepted types");if(!ne.validateHexString(e))throw new A("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");this.buffer=rt.fromHex(e),ne.cacheHexString&&ee.set(this,e)}}get id(){return this.buffer}set id(t){this.buffer=t,ne.cacheHexString&&ee.set(this,rt.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(ne.cacheHexString){const t=ee.get(this);if(t)return t}const t=rt.toHex(this.id);return ne.cacheHexString&&ee.set(this,t),t}static getInc(){return ne.index=(ne.index+1)%16777215}static generate(t){"number"!=typeof t&&(t=Math.floor(Date.now()/1e3));const e=ne.getInc(),n=rt.allocateUnsafe(12);return Xt.setInt32BE(n,0,t),null===te&&(te=rt.randomBytes(5)),n[4]=te[0],n[5]=te[1],n[6]=te[2],n[7]=te[3],n[8]=te[4],n[11]=255&e,n[10]=e>>8&255,n[9]=e>>16&255,n}toString(t){return"base64"===t?rt.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(ne.is(t))return this.buffer[11]===t.buffer[11]&&rt.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 ne}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=rt.allocate(12);for(let t=11;t>=4;t--)e[t]=0;return Xt.setInt32BE(e,0,t),new ne(e)}static createFromHexString(t){if(24!==t?.length)throw new A("hex string must be 24 characters");return new ne(rt.fromHex(t))}static createFromBase64(t){if(16!==t?.length)throw new A("base64 string must be 16 characters");return new ne(rt.fromBase64(t))}static isValid(t){if(null==t)return!1;if("string"==typeof t)return ne.validateHexString(t);try{return new ne(t),!0}catch{return!1}}toExtendedJSON(){return this.toHexString?{$oid:this.toHexString()}:{$oid:this.toString("hex")}}static fromExtendedJSON(t){return new ne(t.$oid)}isCached(){return ne.cacheHexString&&ee.has(this)}inspect(t,e,n){return n??=G,`new ObjectId(${n(this.toHexString(),e)})`}}function ie(t,e,n){let i=5;if(Array.isArray(t))for(let l=0;l<t.length;l++)i+=le(l.toString(),t[l],e,!0,n);else{"function"==typeof t?.toBSON&&(t=t.toBSON());for(const l of Object.keys(t))i+=le(l,t[l],e,!1,n)}return i}function le(t,e,n=!1,i=!1,l=!1){switch("function"==typeof e?.toBSON&&(e=e.toBSON()),typeof e){case"string":return 1+rt.utf8ByteLength(t)+1+4+rt.utf8ByteLength(e)+1;case"number":return Math.floor(e)===e&&e>=R&&e<=I&&e>=f&&e<=W?(null!=t?rt.utf8ByteLength(t)+1:0)+5:(null!=t?rt.utf8ByteLength(t)+1:0)+9;case"undefined":return i||!l?(null!=t?rt.utf8ByteLength(t)+1:0)+1:0;case"boolean":return(null!=t?rt.utf8ByteLength(t)+1:0)+2;case"object":if(null!=e&&"string"==typeof e._bsontype&&e[V]!==X)throw new $;if(null==e||"MinKey"===e._bsontype||"MaxKey"===e._bsontype)return(null!=t?rt.utf8ByteLength(t)+1:0)+1;if("ObjectId"===e._bsontype)return(null!=t?rt.utf8ByteLength(t)+1:0)+13;if(e instanceof Date||y(e))return(null!=t?rt.utf8ByteLength(t)+1:0)+9;if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer||u(e))return(null!=t?rt.utf8ByteLength(t)+1:0)+6+e.byteLength;if("Long"===e._bsontype||"Double"===e._bsontype||"Timestamp"===e._bsontype)return(null!=t?rt.utf8ByteLength(t)+1:0)+9;if("Decimal128"===e._bsontype)return(null!=t?rt.utf8ByteLength(t)+1:0)+17;if("Code"===e._bsontype)return null!=e.scope&&Object.keys(e.scope).length>0?(null!=t?rt.utf8ByteLength(t)+1:0)+1+4+4+rt.utf8ByteLength(e.code.toString())+1+ie(e.scope,n,l):(null!=t?rt.utf8ByteLength(t)+1:0)+1+4+rt.utf8ByteLength(e.code.toString())+1;if("Binary"===e._bsontype){const n=e;return n.sub_type===Vt.SUBTYPE_BYTE_ARRAY?(null!=t?rt.utf8ByteLength(t)+1:0)+(n.position+1+4+1+4):(null!=t?rt.utf8ByteLength(t)+1:0)+(n.position+1+4+1)}if("Symbol"===e._bsontype)return(null!=t?rt.utf8ByteLength(t)+1:0)+rt.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?rt.utf8ByteLength(t)+1:0)+1+ie(i,n,l)}return e instanceof RegExp||h(e)?(null!=t?rt.utf8ByteLength(t)+1:0)+1+rt.utf8ByteLength(e.source)+1+(e.global?1:0)+(e.ignoreCase?1:0)+(e.multiline?1:0)+1:"BSONRegExp"===e._bsontype?(null!=t?rt.utf8ByteLength(t)+1:0)+1+rt.utf8ByteLength(e.pattern)+1+rt.utf8ByteLength(e.options)+1:(null!=t?rt.utf8ByteLength(t)+1:0)+ie(e,n,l)+1;case"function":return n?(null!=t?rt.utf8ByteLength(t)+1:0)+1+4+rt.utf8ByteLength(e.toString())+1:0;case"bigint":return(null!=t?rt.utf8ByteLength(t)+1:0)+9;case"symbol":return 0;default:throw new A("Unrecognized JS type: "+typeof e)}}class oe extends ht{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 A(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);if(-1!==this.options.indexOf("\0"))throw new A(`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 A(`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 oe(t.$regex,oe.parseOptions(t.$options));if("BSONRegExp"===t.$regex._bsontype)return t}if("$regularExpression"in t)return new oe(t.$regularExpression.pattern,oe.parseOptions(t.$regularExpression.options));throw new A(`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??=G;return`new BSONRegExp(${i(n(this.pattern),"regexp")}, ${i(n(this.options),"regexp")})`}}class ce extends ht{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 ce(t.$symbol)}inspect(t,e,n){return n??=G,`new BSONSymbol(${n(this.value,e)})`}}const se=wt;class ae extends se{get _bsontype(){return"Timestamp"}get[ut](){return"Timestamp"}static MAX_VALUE=wt.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(wt.isLong(t))super(t.low,t.high,!0);else{if("object"!=typeof t||!("t"in t)||!("i"in t))throw new A("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 A("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 A("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 A("Timestamp constructed from { t, i } must provide a positive t");if(n<0||Number.isNaN(n))throw new A("Timestamp constructed from { t, i } must provide a positive i");if(e>4294967295)throw new A("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");if(n>4294967295)throw new A("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 ae(wt.fromInt(t,!0))}static fromNumber(t){return new ae(wt.fromNumber(t,!0))}static fromBits(t,e){return new ae({i:t,t:e})}static fromString(t,e){return new ae(wt.fromString(t,!0,e))}toExtendedJSON(){return{$timestamp:{t:this.t,i:this.i}}}static fromExtendedJSON(t){const e=wt.isLong(t.$timestamp.i)?t.$timestamp.i.getLowBitsUnsigned():t.$timestamp.i,n=wt.isLong(t.$timestamp.t)?t.$timestamp.t.getLowBitsUnsigned():t.$timestamp.t;return new ae({t:n,i:e})}inspect(t,e,n){n??=G;return`new Timestamp({ t: ${n(this.t,e)}, i: ${n(this.i,e)} })`}}const de=wt.fromNumber(I),be=wt.fromNumber(R);function Ze(t,e,n){const i=(e=null==e?{}:e)&&e.index?e.index:0,l=Xt.getInt32LE(t,i);if(l<5)throw new A(`bson size must be >= 5, is ${l}`);if(e.allowObjectSmallerThanBufferSize&&t.length<l)throw new A(`buffer length ${t.length} must be >= bson size ${l}`);if(!e.allowObjectSmallerThanBufferSize&&t.length!==l)throw new A(`buffer length ${t.length} must === bson size ${l}`);if(l+i>t.byteLength)throw new A(`(bson size ${l} + options.index ${i} must be <= buffer length ${t.byteLength})`);if(0!==t[i+l-1])throw new A("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return re(t,i,e,n)}const me=/^\$ref$|^\$id$|^\$db$/;function re(t,e,n,i=!1){const l=null==n.fieldsAsRaw?null:n.fieldsAsRaw,o=null!=n.raw&&n.raw,c="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,s=n.promoteBuffers??!1,a=n.promoteLongs??!0,d=n.promoteValues??!0,b=n.useBigInt64??!1;if(b&&!d)throw new A("Must either request bigint or Long for int64 deserialization");if(b&&!a)throw new A("Must either request bigint or Long for int64 deserialization");let Z,m,r=!0;const u=(null==n.validation?{utf8:!0}:n.validation).utf8;if("boolean"==typeof u)Z=u;else{r=!1;const t=Object.keys(u).map((function(t){return u[t]}));if(0===t.length)throw new A("UTF-8 validation setting cannot be empty");if("boolean"!=typeof t[0])throw new A("Invalid UTF-8 validation option, must specify boolean values");if(Z=t[0],!t.every((t=>t===Z)))throw new A("Invalid UTF-8 validation option - keys must be all true or all false")}if(!r){m=new Set;for(const t of Object.keys(u))m.add(t)}const h=e;if(t.length<5)throw new A("corrupt bson message < 5 bytes long");const p=Xt.getInt32LE(t,e);if(e+=4,p<5||p>t.length)throw new A("corrupt bson message");const y=i?[]:{};let G=0,X=!i&&null;for(;;){const u=t[e++];if(0===u)break;let h=e;for(;0!==t[h]&&h<t.length;)h++;if(h>=t.byteLength)throw new A("Bad BSON Document: illegal CString");const p=i?G++:rt.toUTF8(t,e,h,!1);let V,W=!0;if(W=r||m?.has(p)?Z:!Z,!1!==X&&"$"===p[0]&&(X=me.test(p)),e=h+1,u===J){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");V=rt.toUTF8(t,e,e+n-1,W),e+=n}else if(u===x){const n=rt.allocateUnsafe(12);for(let i=0;i<12;i++)n[i]=t[e+i];V=new ne(n),e+=12}else if(u===M&&!1===d)V=new At(Xt.getInt32LE(t,e)),e+=4;else if(u===M)V=Xt.getInt32LE(t,e),e+=4;else if(u===S)V=Xt.getFloat64LE(t,e),e+=8,!1===d&&(V=new Dt(V));else if(u===N){const n=Xt.getInt32LE(t,e),i=Xt.getInt32LE(t,e+4);e+=8,V=new Date(new wt(n,i).toNumber())}else if(u===z){if(0!==t[e]&&1!==t[e])throw new A("illegal boolean type value");V=1===t[e++]}else if(u===K){const i=e,l=Xt.getInt32LE(t,e);if(l<=0||l>t.length-e)throw new A("bad embedded document length in bson");if(o)V=t.subarray(e,e+l);else{let e=n;r||(e={...n,validation:{utf8:W}}),V=re(t,i,e,!1)}e+=l}else if(u===T){const i=e,o=Xt.getInt32LE(t,e);let c=n;const s=e+o;if(l&&l[p]&&(c={...n,raw:!0}),r||(c={...c,validation:{utf8:W}}),V=re(t,i,c,!0),0!==t[(e+=o)-1])throw new A("invalid array terminator byte");if(e!==s)throw new A("corrupted array bson")}else if(u===U)V=void 0;else if(u===w)V=null;else if(u===P)if(b)V=Xt.getBigInt64LE(t,e),e+=8;else{const n=Xt.getInt32LE(t,e),i=Xt.getInt32LE(t,e+4);e+=8;const l=new wt(n,i);V=a&&!0===d&&l.lessThanOrEqual(de)&&l.greaterThanOrEqual(be)?l.toNumber():l}else if(u===F){const n=rt.allocateUnsafe(16);for(let i=0;i<16;i++)n[i]=t[e+i];e+=16,V=new _t(n)}else if(u===L){let n=Xt.getInt32LE(t,e);e+=4;const i=n,l=t[e++];if(n<0)throw new A("Negative binary type element size found");if(n>t.byteLength)throw new A("Binary type size larger than document size");if(l===Vt.SUBTYPE_BYTE_ARRAY){if(n=Xt.getInt32LE(t,e),e+=4,n<0)throw new A("Negative binary type element size found for subtype 0x02");if(n>i-4)throw new A("Binary type with subtype 0x02 contains too long binary size");if(n<i-4)throw new A("Binary type with subtype 0x02 contains too short binary size")}s&&d?V=rt.toLocalBufferType(t.subarray(e,e+n)):(V=new Vt(t.subarray(e,e+n),l),l===_&&Yt.isValid(V)&&(V=V.toUUID())),e+=n}else if(u===k&&!1===c){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const n=rt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const i=rt.toUTF8(t,e,h,!1);e=h+1;const l=new Array(i.length);for(h=0;h<i.length;h++)switch(i[h]){case"m":l[h]="m";break;case"s":l[h]="g";break;case"i":l[h]="i"}V=new RegExp(n,l.join(""))}else if(u===k&&!0===c){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const n=rt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const i=rt.toUTF8(t,e,h,!1);e=h+1,V=new oe(n,i)}else if(u===B){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=rt.toUTF8(t,e,e+n-1,W);V=d?i:new ce(i),e+=n}else if(u===j)V=new ae({i:Xt.getUint32LE(t,e),t:Xt.getUint32LE(t,e+4)}),e+=8;else if(u===Q)V=new qt;else if(u===O)V=new $t;else if(u===C){const n=Xt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const i=rt.toUTF8(t,e,e+n-1,W);V=new It(i),e+=n}else if(u===v){const i=Xt.getInt32LE(t,e);if(e+=4,i<13)throw new A("code_w_scope total size shorter minimum expected length");const l=Xt.getInt32LE(t,e);if(e+=4,l<=0||l>t.length-e||0!==t[e+l-1])throw new A("bad string length in bson");const o=rt.toUTF8(t,e,e+l-1,W),c=e+=l,s=Xt.getInt32LE(t,e),a=re(t,c,n,!1);if(e+=s,i<8+s+l)throw new A("code_w_scope total size is too short, truncating scope");if(i>8+s+l)throw new A("code_w_scope total size is too long, clips outer document");V=new It(o,a)}else{if(u!==H)throw new A(`Detected unknown BSON type ${u.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 A("bad string length in bson");const i=rt.toUTF8(t,e,e+n-1,W);e+=n;const l=rt.allocateUnsafe(12);for(let n=0;n<12;n++)l[n]=t[e+n];const o=new ne(l);e+=12,V=new St(i,o)}}"__proto__"===p?Object.defineProperty(y,p,{value:V,writable:!0,enumerable:!0,configurable:!0}):y[p]=V}if(p!==e-h){if(i)throw new A("corrupt array bson");throw new A("corrupt object bson")}if(!X)return y;if(Rt(y)){const t=Object.assign({},y);return delete t.$ref,delete t.$id,delete t.$db,new St(y.$ref,y.$id,y.$db,t)}return y}const ue=/\x00/,he=new Set(["$db","$ref","$id","$clusterTime"]);function pe(t,e,n,i){t[i++]=J;t[(i=i+rt.encodeUTF8Into(t,e,i)+1)-1]=0;const l=rt.encodeUTF8Into(t,n,i+4);return Xt.setInt32LE(t,i,l+1),i=i+4+l,t[i++]=0,i}function ye(t,e,n,i){const l=!Object.is(n,-0)&&Number.isSafeInteger(n)&&n<=W&&n>=f?M:S;t[i++]=l;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i+=l===M?Xt.setInt32LE(t,i,n):Xt.setFloat64LE(t,i,n)}function Ge(t,e,n,i){t[i++]=P;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setBigInt64LE(t,i,n)}function Xe(t,e,n,i){t[i++]=w;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i}function Ve(t,e,n,i){t[i++]=z;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,t[i++]=n?1:0,i}function We(t,e,n,i){t[i++]=N;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=wt.fromNumber(n.getTime()),o=l.getLowBits(),c=l.getHighBits();return i+=Xt.setInt32LE(t,i,o),i+=Xt.setInt32LE(t,i,c)}function fe(t,e,n,i){t[i++]=k;if(i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,n.source&&null!=n.source.match(ue))throw new A("value "+n.source+" must not contain null bytes");return i+=rt.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 ge(t,e,n,i){t[i++]=k;if(i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,null!=n.pattern.match(ue))throw new A("pattern "+n.pattern+" must not contain null bytes");i+=rt.encodeUTF8Into(t,n.pattern,i),t[i++]=0;const l=n.options.split("").sort().join("");return i+=rt.encodeUTF8Into(t,l,i),t[i++]=0,i}function Ye(t,e,n,i){null===n?t[i++]=w:"MinKey"===n._bsontype?t[i++]=Q:t[i++]=O;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i}function Ie(t,e,n,i){t[i++]=x;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i+=n.serializeInto(t,i)}function Re(t,e,n,i){t[i++]=L;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.length;if(i+=Xt.setInt32LE(t,i,l),t[i++]=E,l<=16)for(let e=0;e<l;e++)t[i+e]=n[e];else t.set(n,i);return i+=l}function Se(t,e,n,i,l,o,c,s,a){if(a.has(n))throw new A("Cannot convert circular structure to BSON");a.add(n),t[i++]=Array.isArray(n)?T:K;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const d=ke(t,n,l,i,o+1,c,s,a);return a.delete(n),d}function Je(t,e,n,i){t[i++]=F;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;for(let e=0;e<16;e++)t[i+e]=n.bytes[e];return i+16}function Ke(t,e,n,i){t[i++]="Long"===n._bsontype?P:j;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.getLowBits(),o=n.getHighBits();return i+=Xt.setInt32LE(t,i,l),i+=Xt.setInt32LE(t,i,o)}function Te(t,e,n,i){n=n.valueOf(),t[i++]=M;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setInt32LE(t,i,n)}function Le(t,e,n,i){t[i++]=S;return i+=rt.encodeUTF8Into(t,e,i),t[i++]=0,i+=Xt.setFloat64LE(t,i,n.value)}function Ue(t,e,n,i){t[i++]=C;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.toString(),o=rt.encodeUTF8Into(t,l,i+4)+1;return Xt.setInt32LE(t,i,o),i=i+4+o-1,t[i++]=0,i}function xe(t,e,n,i,l=!1,o=0,c=!1,s=!0,a){if(n.scope&&"object"==typeof n.scope){t[i++]=v;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;let d=i;const b=n.code;i+=4;const Z=rt.encodeUTF8Into(t,b,i+4)+1;Xt.setInt32LE(t,i,Z),t[i+4+Z-1]=0,i=i+Z+4;const m=ke(t,n.scope,l,i,o+1,c,s,a);i=m-1;const r=m-d;d+=Xt.setInt32LE(t,d,r),t[i++]=0}else{t[i++]=C;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.code.toString(),o=rt.encodeUTF8Into(t,l,i+4)+1;Xt.setInt32LE(t,i,o),i=i+4+o-1,t[i++]=0}return i}function ze(t,e,n,i){t[i++]=L;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=n.buffer;let o=n.position;if(n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o+=4),i+=Xt.setInt32LE(t,i,o),t[i++]=n.sub_type,n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o-=4,i+=Xt.setInt32LE(t,i,o)),n.sub_type===Vt.SUBTYPE_VECTOR&&Wt(n),o<=16)for(let e=0;e<o;e++)t[i+e]=l[e];else t.set(l,i);return i+=n.position}function Ne(t,e,n,i){t[i++]=B;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;const l=rt.encodeUTF8Into(t,n.value,i+4)+1;return Xt.setInt32LE(t,i,l),i=i+4+l-1,t[i++]=0,i}function we(t,e,n,i,l,o,c){t[i++]=K;i+=rt.encodeUTF8Into(t,e,i),t[i++]=0;let s=i,a={$ref:n.collection||n.namespace,$id:n.oid};null!=n.db&&(a.$db=n.db),a=Object.assign(a,n.fields);const d=ke(t,a,!1,i,l+1,o,!0,c),b=d-s;return s+=Xt.setInt32LE(t,i,b),d}function ke(t,e,n,i,l,o,c,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 A("serialize does not support an array as the root input");if("object"!=typeof e)throw new A("serialize does not support non-object as the root input");if("_bsontype"in e&&"string"==typeof e._bsontype)throw new A("BSON types cannot be serialized as a document");if(y(e)||h(e)||r(e)||u(e))throw new A("date, regexp, typedarray, and arraybuffer cannot be BSON documents");s=new Set}s.add(e);let a=i+4;if(Array.isArray(e))for(let i=0;i<e.length;i++){const d=`${i}`;let b=e[i];"function"==typeof b?.toBSON&&(b=b.toBSON());const Z=typeof b;if(void 0===b)a=Xe(t,d,0,a);else if(null===b)a=Xe(t,d,0,a);else if("string"===Z)a=pe(t,d,b,a);else if("number"===Z)a=ye(t,d,b,a);else if("bigint"===Z)a=Ge(t,d,b,a);else if("boolean"===Z)a=Ve(t,d,b,a);else if("object"===Z&&null==b._bsontype)a=b instanceof Date||y(b)?We(t,d,b,a):b instanceof Uint8Array||r(b)?Re(t,d,b,a):b instanceof RegExp||h(b)?fe(t,d,b,a):Se(t,d,b,a,n,l,o,c,s);else if("object"===Z){if(b[V]!==X)throw new $;if("ObjectId"===b._bsontype)a=Ie(t,d,b,a);else if("Decimal128"===b._bsontype)a=Je(t,d,b,a);else if("Long"===b._bsontype||"Timestamp"===b._bsontype)a=Ke(t,d,b,a);else if("Double"===b._bsontype)a=Le(t,d,b,a);else if("Code"===b._bsontype)a=xe(t,d,b,a,n,l,o,c,s);else if("Binary"===b._bsontype)a=ze(t,d,b,a);else if("BSONSymbol"===b._bsontype)a=Ne(t,d,b,a);else if("DBRef"===b._bsontype)a=we(t,d,b,a,l,o,s);else if("BSONRegExp"===b._bsontype)a=ge(t,d,b,a);else if("Int32"===b._bsontype)a=Te(t,d,b,a);else if("MinKey"===b._bsontype||"MaxKey"===b._bsontype)a=Ye(t,d,b,a);else if(void 0!==b._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(b._bsontype)}`)}else"function"===Z&&o&&(a=Ue(t,d,b,a))}else if(e instanceof Map||p(e)){const i=e.entries();let d=!1;for(;!d;){const e=i.next();if(d=!!e.done,d)continue;const b=e.value?e.value[0]:void 0;let Z=e.value?e.value[1]:void 0;"function"==typeof Z?.toBSON&&(Z=Z.toBSON());const m=typeof Z;if("string"==typeof b&&!he.has(b)){if(null!=b.match(ue))throw new A("key "+b+" must not contain null bytes");if(n){if("$"===b[0])throw new A("key "+b+" must not start with '$'");if(b.includes("."))throw new A("key "+b+" must not contain '.'")}}if(void 0===Z)!1===c&&(a=Xe(t,b,0,a));else if(null===Z)a=Xe(t,b,0,a);else if("string"===m)a=pe(t,b,Z,a);else if("number"===m)a=ye(t,b,Z,a);else if("bigint"===m)a=Ge(t,b,Z,a);else if("boolean"===m)a=Ve(t,b,Z,a);else if("object"===m&&null==Z._bsontype)a=Z instanceof Date||y(Z)?We(t,b,Z,a):Z instanceof Uint8Array||r(Z)?Re(t,b,Z,a):Z instanceof RegExp||h(Z)?fe(t,b,Z,a):Se(t,b,Z,a,n,l,o,c,s);else if("object"===m){if(Z[V]!==X)throw new $;if("ObjectId"===Z._bsontype)a=Ie(t,b,Z,a);else if("Decimal128"===Z._bsontype)a=Je(t,b,Z,a);else if("Long"===Z._bsontype||"Timestamp"===Z._bsontype)a=Ke(t,b,Z,a);else if("Double"===Z._bsontype)a=Le(t,b,Z,a);else if("Code"===Z._bsontype)a=xe(t,b,Z,a,n,l,o,c,s);else if("Binary"===Z._bsontype)a=ze(t,b,Z,a);else if("BSONSymbol"===Z._bsontype)a=Ne(t,b,Z,a);else if("DBRef"===Z._bsontype)a=we(t,b,Z,a,l,o,s);else if("BSONRegExp"===Z._bsontype)a=ge(t,b,Z,a);else if("Int32"===Z._bsontype)a=Te(t,b,Z,a);else if("MinKey"===Z._bsontype||"MaxKey"===Z._bsontype)a=Ye(t,b,Z,a);else if(void 0!==Z._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(Z._bsontype)}`)}else"function"===m&&o&&(a=Ue(t,b,Z,a))}}else{if("function"==typeof e?.toBSON&&null!=(e=e.toBSON())&&"object"!=typeof e)throw new A("toBSON function did not return an object");for(const i of Object.keys(e)){let d=e[i];"function"==typeof d?.toBSON&&(d=d.toBSON());const b=typeof d;if("string"==typeof i&&!he.has(i)){if(null!=i.match(ue))throw new A("key "+i+" must not contain null bytes");if(n){if("$"===i[0])throw new A("key "+i+" must not start with '$'");if(i.includes("."))throw new A("key "+i+" must not contain '.'")}}if(void 0===d)!1===c&&(a=Xe(t,i,0,a));else if(null===d)a=Xe(t,i,0,a);else if("string"===b)a=pe(t,i,d,a);else if("number"===b)a=ye(t,i,d,a);else if("bigint"===b)a=Ge(t,i,d,a);else if("boolean"===b)a=Ve(t,i,d,a);else if("object"===b&&null==d._bsontype)a=d instanceof Date||y(d)?We(t,i,d,a):d instanceof Uint8Array||r(d)?Re(t,i,d,a):d instanceof RegExp||h(d)?fe(t,i,d,a):Se(t,i,d,a,n,l,o,c,s);else if("object"===b){if(d[V]!==X)throw new $;if("ObjectId"===d._bsontype)a=Ie(t,i,d,a);else if("Decimal128"===d._bsontype)a=Je(t,i,d,a);else if("Long"===d._bsontype||"Timestamp"===d._bsontype)a=Ke(t,i,d,a);else if("Double"===d._bsontype)a=Le(t,i,d,a);else if("Code"===d._bsontype)a=xe(t,i,d,a,n,l,o,c,s);else if("Binary"===d._bsontype)a=ze(t,i,d,a);else if("BSONSymbol"===d._bsontype)a=Ne(t,i,d,a);else if("DBRef"===d._bsontype)a=we(t,i,d,a,l,o,s);else if("BSONRegExp"===d._bsontype)a=ge(t,i,d,a);else if("Int32"===d._bsontype)a=Te(t,i,d,a);else if("MinKey"===d._bsontype||"MaxKey"===d._bsontype)a=Ye(t,i,d,a);else if(void 0!==d._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(d._bsontype)}`)}else"function"===b&&o&&(a=Ue(t,i,d,a))}}s.delete(e),t[a++]=0;const d=a-i;return i+=Xt.setInt32LE(t,i,d),a}const He={$oid:ne,$binary:Vt,$uuid:Vt,$symbol:ce,$numberInt:At,$numberDecimal:_t,$numberDouble:Dt,$numberLong:wt,$minKey:qt,$maxKey:$t,$regex:oe,$regularExpression:oe,$timestamp:ae};function Ce(t,e={}){if("number"==typeof t){const n=t<=W&&t>=f,i=t<=g&&t>=Y;if(e.relaxed||e.legacy)return t;if(Number.isInteger(t)&&!Object.is(t,-0)){if(n)return new At(t);if(i)return e.useBigInt64?BigInt(t):wt.fromNumber(t)}return new Dt(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 l=He[n[i]];if(l)return l.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 q("Unrecognized type for EJSON date: "+typeof n);i.setTime(Number(n))}else if("string"==typeof n)i.setTime(Date.parse(n));else if(wt.isLong(n))i.setTime(n.toNumber());else if("number"==typeof n&&e.relaxed)i.setTime(n);else{if("bigint"!=typeof n)throw new q("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=Ce(t.$scope)),It.fromExtendedJSON(t)}if(Rt(t)||t.$dbPointer){const e=t.$ref?t:t.$dbPointer;if(e instanceof St)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 St.fromExtendedJSON(e)}return t}function Be(t){const e=t.toISOString();return 0!==t.getUTCMilliseconds()?e:e.slice(0,-5)+"Z"}function ve(t,e){if(t instanceof Map||p(t)){const n=Object.create(null);for(const[e,i]of t){if("string"!=typeof e)throw new A("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(""),l=t[n],o=" -> "+t.slice(n+1,t.length-1).map((t=>`${t} -> `)).join(""),c=t[t.length-1],s=" ".repeat(i.length+l.length/2),a="-".repeat(o.length+(l.length+c.length)/2-1);throw new A(`Converting circular structure to EJSON:\n ${i}${l}${o}${c}\n ${s}\\${a}/`)}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||y(t)){const n=t.getTime(),i=n>-1&&n<2534023188e5;return e.legacy?e.relaxed&&i?{$date:t.getTime()}:{$date:Be(t)}:e.relaxed&&i?{$date:Be(t)}:{$date:{$numberLong:t.getTime().toString()}}}if(!("number"!=typeof t||e.relaxed&&isFinite(t))){if(Number.isInteger(t)&&!Object.is(t,-0)){if(t>=f&&t<=W)return{$numberInt:t.toString()};if(t>=Y&&t<=g)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||h(t)){let n=t.flags;if(void 0===n){const e=t.toString().match(/[gimuy]*$/);e&&(n=e[0])}return new oe(t.source,n).toExtendedJSON(e)}return null!=t&&"object"==typeof t?function(t,e){if(null==t||"object"!=typeof t)throw new A("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 l=ve(t[i],e);"__proto__"===i?Object.defineProperty(n,i,{value:l,writable:!0,enumerable:!0,configurable:!0}):n[i]=l}finally{e.seenObjects.pop()}}return n}if(null!=t&&"object"==typeof t&&"string"==typeof t._bsontype&&t[V]!==X)throw new $;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 A("Unrecognized or invalid _bsontype: "+t._bsontype);i=e(i)}return"Code"===n&&i.scope?i=new It(i.code,ve(i.scope,e)):"DBRef"===n&&i.oid&&(i=new St(ve(i.collection,e),ve(i.oid,e),ve(i.db,e),ve(i.fields,e))),i.toExtendedJSON(e)}throw new A("_bsontype must be a string, but was: "+typeof n)}(t,e):t}const Me={Binary:t=>new Vt(t.value(),t.sub_type),Code:t=>new It(t.code,t.scope),DBRef:t=>new St(t.collection||t.namespace,t.oid,t.db,t.fields),Decimal128:t=>new _t(t.bytes),Double:t=>new Dt(t.value),Int32:t=>new At(t.value),Long:t=>wt.fromBits(null!=t.low?t.low:t.low_,null!=t.low?t.high:t.high_,null!=t.low?t.unsigned:t.unsigned_),MaxKey:()=>new $t,MinKey:()=>new qt,ObjectId:t=>new ne(t),BSONRegExp:t=>new oe(t.pattern,t.options),BSONSymbol:t=>new ce(t.value),Timestamp:t=>ae.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 A(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t)}`);return Ce(e,n)}))}function Pe(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 l=ve(t,Object.assign({relaxed:!0,legacy:!1},i,{seenObjects:[{propertyName:"(root)",obj:null}]}));return JSON.stringify(l,e,n)}const Fe=Object.create(null);Fe.parse=je,Fe.stringify=Pe,Fe.serialize=function(t,e){return e=e||{},JSON.parse(Pe(t,e))},Fe.deserialize=function(t,e){return e=e||{},je(JSON.stringify(t),e)},Object.freeze(Fe);const Qe=1,Oe=2,Ee=3,_e=4,De=5,Ae=6,$e=7,qe=8,tn=9,en=10,nn=11,ln=12,on=13,cn=14,sn=15,an=16,dn=17,bn=18,Zn=19,mn=255,rn=127;function un(t,e){try{return Xt.getNonnegativeInt32LE(t,e)}catch(t){throw new tt("BSON size cannot be negative",e,{cause:t})}}function hn(t,e){let n=e;for(;0!==t[n];n++);if(n===t.length-1)throw new tt("Null terminator not found",e);return n}const pn=Object.create(null);pn.parseToElements=function(t,e=0){if(e??=0,t.length<5)throw new tt(`Input must be at least 5 bytes, got ${t.length} bytes`,e);const n=un(t,e);if(n>t.length-e)throw new tt(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`,e);if(0!==t[e+n-1])throw new tt("BSON documents must end in 0x00",e+n);const i=[];let l=e+4;for(;l<=n+e;){const o=t[l];if(l+=1,0===o){if(l-e!==n)throw new tt("Invalid 0x00 type byte",l);break}const c=l,s=hn(t,l)-c;let a;if(l+=s+1,o===Qe||o===bn||o===tn||o===dn)a=8;else if(o===an)a=4;else if(o===$e)a=12;else if(o===Zn)a=16;else if(o===qe)a=1;else if(o===en||o===Ae||o===rn||o===mn)a=0;else if(o===nn)a=hn(t,hn(t,l)+1)+1-l;else if(o===Ee||o===_e||o===sn)a=un(t,l);else{if(o!==Oe&&o!==De&&o!==ln&&o!==on&&o!==cn)throw new tt(`Invalid 0x${o.toString(16).padStart(2,"0")} type byte`,l);a=un(t,l)+4,o===De&&(a+=1),o===ln&&(a+=12)}if(a>n)throw new tt("value reports length larger than document",l);i.push([o,c,s,l,a]),l+=a}return i},pn.ByteUtils=rt,pn.NumberUtils=Xt,Object.freeze(pn);const yn=17825792;let Gn=rt.allocate(yn);var Xn=Object.freeze({__proto__:null,BSONError:A,BSONOffsetError:tt,BSONRegExp:oe,BSONRuntimeError:q,BSONSymbol:ce,BSONType:D,BSONValue:ht,BSONVersionError:$,Binary:Vt,ByteUtils:rt,Code:It,DBRef:St,Decimal128:_t,Double:Dt,EJSON:Fe,Int32:At,Long:wt,MaxKey:$t,MinKey:qt,NumberUtils:Xt,ObjectId:ne,Timestamp:ae,UUID:Yt,bsonType:ut,calculateObjectSize:function(t,e={}){return ie(t,"boolean"==typeof(e=e||{}).serializeFunctions&&e.serializeFunctions,"boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined)},deserialize:function(t,e={}){return Ze(rt.toLocalBufferType(t),e)},deserializeStream:function(t,e,n,i,l,o){const c=Object.assign({allowObjectSmallerThanBufferSize:!0,index:0},o),s=rt.toLocalBufferType(t);let a=e;for(let t=0;t<n;t++){const e=Xt.getInt32LE(s,a);c.index=a,i[l+t]=Ze(s,c),a+=e}return a},onDemand:pn,serialize:function(t,e={}){const n="boolean"==typeof e.checkKeys&&e.checkKeys,i="boolean"==typeof e.serializeFunctions&&e.serializeFunctions,l="boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined,o="number"==typeof e.minInternalBufferSize?e.minInternalBufferSize:yn;Gn.length<o&&(Gn=rt.allocate(o));const c=ke(Gn,t,n,0,0,i,l,null),s=rt.allocateUnsafe(c);return s.set(Gn.subarray(0,c),0),s},serializeWithBufferAndIndex:function(t,e,n={}){const i="boolean"==typeof n.checkKeys&&n.checkKeys,l="boolean"==typeof n.serializeFunctions&&n.serializeFunctions,o="boolean"!=typeof n.ignoreUndefined||n.ignoreUndefined,c="number"==typeof n.index?n.index:0,s=ke(Gn,t,i,0,0,l,o,null);return e.set(Gn.subarray(0,s),c),c+s-1},setInternalBufferSize:function(t){Gn.length<t&&(Gn=rt.allocate(t))}});function Vn(t){return!!t&&"object"==typeof t&&"buffer"in t&&t.buffer instanceof ArrayBuffer&&"number"==typeof t.byteOffset&&"number"==typeof t.byteLength}async function Wn({client:t,limit:e,page_token:i,sort_by:l}){const c="/ml/conversations"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function fn({client:t,limit:e,page_token:i,sort_by:l,no_models:c,no_parts:s,conversation_id:a}){const d="/user/text-to-cad"+n({limit:e,page_token:i,sort_by:l,no_models:c,no_parts:s,conversation_id:a}),b=(t?.baseUrl||"https://api.zoo.dev")+d,Z=t&&t.token||"",m={};Z&&(m.Authorization=`Bearer ${Z}`);const r={method:"GET",headers:m},u=t?.fetch||fetch,h=await u(b,r);await o(h);return await h.json()}class gn{constructor(){}static urlConstructFrom(t){const e="/ws/modeling/commands"+n({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")+e).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(Vn(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 Yn({client:t,id:e,limit:i,page_token:l,sort_by:c}){const s=`/orgs/${e}/oauth2/apps`+n({limit:i,page_token:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},m=t?.fetch||fetch,r=await m(a,Z);await o(r);return await r.json()}async function In({client:t,id:e,limit:i,page_token:l,sort_by:c}){const s=`/users/${e}/oauth2/apps`+n({limit:i,page_token:l,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},m=t?.fetch||fetch,r=await m(a,Z);await o(r);return await r.json()}async function Rn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/oauth2/apps"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function Sn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/oauth2/apps"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function Jn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/shortlinks"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function Kn({client:t,id:e,limit:i,page_token:l,sort_by:c,filter:s}){const a=`/org/datasets/${e}/conversions`+n({limit:i,page_token:l,sort_by:c,filter:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`);const m={method:"GET",headers:Z},r=t?.fetch||fetch,u=await r(d,m);await o(u);return await u.json()}async function Tn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/datasets"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function Ln({client:t,limit:e,page_token:i,sort_by:l,role:c}){const s="/org/members"+n({limit:e,page_token:i,sort_by:l,role:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},m=t?.fetch||fetch,r=await m(a,Z);await o(r);return await r.json()}async function Un({client:t,id:e,limit:i,page_token:l,q:c,sort_by:s}){const a=`/org/datasets/${e}/search/conversions`+n({limit:i,page_token:l,q:c,sort_by:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`);const m={method:"GET",headers:Z},r=t?.fetch||fetch,u=await r(d,m);await o(u);return await u.json()}async function xn({client:t,limit:e,page_token:i}){const l="/org/payment/invoices"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z);return await Z.json()}async function zn({client:t,limit:e,page_token:i}){const l="/user/payment/invoices"+n({limit:e,page_token:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z);return await Z.json()}async function Nn({client:t,limit:e,page_token:i,sort_by:l}){const c="/org/service-accounts"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}async function wn({client:t,limit:e,page_token:i,sort_by:l}){const c="/user/shortlinks"+n({limit:e,page_token:i,sort_by:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);await o(m);return await m.json()}var kn=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");kn=Hn.Worker}catch(t){}function Cn(t,e,n){var i=void 0===e?null:e,l=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==n&&n),o=l.indexOf("\n",10)+1,c=l.substring(o)+(i?"//# sourceMappingURL="+i:"");return function(t){return new kn(c,Object.assign({},t,{eval:!0}))}}function Bn(t,e,n){var i=void 0===e?null:e,l=function(t,e){var n=atob(t);if(e){for(var i=new Uint8Array(n.length),l=0,o=n.length;l<o;++l)i[l]=n.charCodeAt(l);return new TextDecoder("utf-16le").decode(new Uint16Array(i.buffer))}return n}(t,void 0!==n&&n),o=l.indexOf("\n",10)+1,c=l.substring(o)+(i?"//# sourceMappingURL="+i:""),s=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(s)}var vn="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function Mn(t,e,n){return vn?Cn(t,e,n):function(t,e,n){var i;return function(l){return i=i||Bn(t,e,n),new Worker(i,l)}}(t,e,n)}var jn=Mn("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgZT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gdCh0LG4scil7dC5sZW5ndGg+NTA/ZnVuY3Rpb24odCxuLHIpe2UuZW5jb2RlSW50byh0LG4uc3ViYXJyYXkocikpfSh0LG4scik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fSh0LG4scil9bmV3IFRleHREZWNvZGVyO2NsYXNzIG57dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ci5uYW1lfSl9fWZ1bmN0aW9uIGkoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBvPTQyOTQ5NjcyOTUscz0xNzE3OTg2OTE4Mztjb25zdCBhPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1zKXtpZigwPT09dCYmZTw9byl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGkociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgcihgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgY3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBjO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYSl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCByPTA7cjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuYnVpbHRJbkVuY29kZXJzW3JdO2lmKG51bGwhPWkpe2NvbnN0IG89aShlLHQpO2lmKG51bGwhPW8pe3JldHVybiBuZXcgbigtMS1yLG8pfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2NvbnN0IGk9dGhpcy5lbmNvZGVyc1tyXTtpZihudWxsIT1pKXtjb25zdCBvPWkoZSx0KTtpZihudWxsIT1vKXtyZXR1cm4gbmV3IG4ocixvKX19fXJldHVybiBlIGluc3RhbmNlb2Ygbj9lOm51bGx9ZGVjb2RlKGUsdCxyKXtjb25zdCBpPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiBpP2koZSx0LHIpOm5ldyBuKHQsZSl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGx7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9jLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGwoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStuKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKG4pLHQoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9bn1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1mKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxpKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgdT0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiBfKGUpe3JldHVybiJVaW50OEFycmF5Ij09PXUoZSl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gYihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBkKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHcoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpiKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgcD03LHk9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksbT0yMTQ3NDgzNjQ3LFM9LTIxNDc0ODM2NDgsQj1NYXRoLnBvdygyLDYzKS0xLHg9LU1hdGgucG93KDIsNjMpLEU9TWF0aC5wb3coMiw1MyksVT0tTWF0aC5wb3coMiw1MyksTz0xLE49MixJPTMsdj00LFQ9NSwkPTYsTD03LEE9OCxSPTksaj0xMCxGPTExLGs9MTIsej0xMyxEPTE0LEM9MTUsTT0xNixWPTE3LFA9MTgsSj0xOSxXPTI1NSxZPTEyNyxxPTAsSD00LEs9T2JqZWN0LmZyZWV6ZSh7ZG91YmxlOjEsc3RyaW5nOjIsb2JqZWN0OjMsYXJyYXk6NCxiaW5EYXRhOjUsdW5kZWZpbmVkOjYsb2JqZWN0SWQ6Nyxib29sOjgsZGF0ZTo5LG51bGw6MTAscmVnZXg6MTEsZGJQb2ludGVyOjEyLGphdmFzY3JpcHQ6MTMsc3ltYm9sOjE0LGphdmFzY3JpcHRXaXRoU2NvcGU6MTUsaW50OjE2LHRpbWVzdGFtcDoxNyxsb25nOjE4LGRlY2ltYWw6MTksbWluS2V5Oi0xLG1heEtleToxMjd9KTtjbGFzcyBaIGV4dGVuZHMgRXJyb3J7Z2V0IGJzb25FcnJvcigpe3JldHVybiEwfWdldCBuYW1lKCl7cmV0dXJuIkJTT05FcnJvciJ9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpfXN0YXRpYyBpc0JTT05FcnJvcihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiYnNvbkVycm9yImluIGUmJiEwPT09ZS5ic29uRXJyb3ImJiJuYW1lImluIGUmJiJtZXNzYWdlImluIGUmJiJzdGFjayJpbiBlfX1jbGFzcyBHIGV4dGVuZHMgWntnZXQgbmFtZSgpe3JldHVybiJCU09OVmVyc2lvbkVycm9yIn1jb25zdHJ1Y3Rvcigpe3N1cGVyKGBVbnN1cHBvcnRlZCBCU09OIHZlcnNpb24sIGJzb24gdHlwZXMgbXVzdCBiZSBmcm9tIGJzb24gJHtwfS54LnhgKX19Y2xhc3MgWCBleHRlbmRzIFp7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIFEgZXh0ZW5kcyBae2dldCBuYW1lKCl7cmV0dXJuIkJTT05PZmZzZXRFcnJvciJ9b2Zmc2V0O2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihgJHtlfS4gb2Zmc2V0OiAke3R9YCxuKSx0aGlzLm9mZnNldD10fX1sZXQgZWUsdGU7ZnVuY3Rpb24gbmUoZSx0LG4scil7aWYocil7ZWU/Pz1uZXcgVGV4dERlY29kZXIoInV0ZjgiLHtmYXRhbDohMH0pO3RyeXtyZXR1cm4gZWUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiB0ZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksdGUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gcmUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gYWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFlLmFsbG9jYXRlKGUpKX1jb25zdCBzZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP29lOmllfSkoKSxhZT17aXNVaW50OEFycmF5Ol8sdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgWigiQ2Fubm90IGNyZWF0ZSBCdWZmZXIgZnJvbSB0aGUgcGFzc2VkIHBvdGVudGlhbEJ1ZmZlci4iKX0sYWxsb2NhdGU6ZT0+QnVmZmVyLmFsbG9jKGUpLGFsbG9jYXRlVW5zYWZlOmU9PkJ1ZmZlci5hbGxvY1Vuc2FmZShlKSxjb21wYXJlOihlLHQpPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb21wYXJlKHQpLGNvbmNhdDplPT5CdWZmZXIuY29uY2F0KGUpLGNvcHk6KGUsdCxuLHIsaSk9PmFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmNvcHkodCxuPz8wLHI/PzAsaT8/ZS5sZW5ndGgpLGVxdWFsczooZSx0KT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuZXF1YWxzKHQpLGZyb21OdW1iZXJBcnJheTplPT5CdWZmZXIuZnJvbShlKSxmcm9tQmFzZTY0OmU9PkJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLGZyb21VVEY4OmU9PkJ1ZmZlci5mcm9tKGUsInV0ZjgiKSx0b0Jhc2U2NDplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygiYmFzZTY0IiksZnJvbUlTTzg4NTkxOmU9PkJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLHRvSVNPODg1OTE6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJpbmFyeSIpLGZyb21IZXg6ZT0+QnVmZmVyLmZyb20oZSwiaGV4IiksdG9IZXg6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImhleCIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7aWYobnVsbCE9aSlyZXR1cm4gaTtjb25zdCBvPWFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJ1dGY4Iix0LG4pO2lmKHIpZm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoNjU1MzM9PT1vLmNoYXJDb2RlQXQocikpe25lKGUsdCxuLCEwKTticmVha31yZXR1cm4gb30sdXRmOEJ5dGVMZW5ndGg6ZT0+QnVmZmVyLmJ5dGVMZW5ndGgoZSwidXRmOCIpLGVuY29kZVVURjhJbnRvKGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDA7aWYodC5sZW5ndGg+MjUpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGgtbjx0Lmxlbmd0aClyZXR1cm4gbnVsbDtmb3IobGV0IHI9MCxpPW47cjx0Lmxlbmd0aDtyKyssaSsrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKTtpZihuPjEyNylyZXR1cm4gbnVsbDtlW2ldPW59cmV0dXJuIHQubGVuZ3RofShlLHQsbik7cmV0dXJuIG51bGwhPXI/cjphZS50b0xvY2FsQnVmZmVyVHlwZShlKS53cml0ZSh0LG4sdm9pZCAwLCJ1dGY4Iil9LHJhbmRvbUJ5dGVzOnNlLHN3YXAzMjplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5zd2FwMzIoKX07ZnVuY3Rpb24gY2UoZSl7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYXJndW1lbnQgJ2J5dGVMZW5ndGgnIGlzIGludmFsaWQuIFJlY2VpdmVkICR7ZX1gKTtyZXR1cm4gdWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWNvbnN0IGZlPSgoKT0+e2NvbnN0e2NyeXB0bzplfT1nbG9iYWxUaGlzO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gdD0+ZS5nZXRSYW5kb21WYWx1ZXModWUuYWxsb2NhdGUodCkpO2lmKGZ1bmN0aW9uKCl7Y29uc3R7bmF2aWdhdG9yOmV9PWdsb2JhbFRoaXM7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiUmVhY3ROYXRpdmUiPT09ZS5wcm9kdWN0fSgpKXtjb25zdHtjb25zb2xlOmV9PWdsb2JhbFRoaXM7ZT8ud2Fybj8uKCJCU09OOiBGb3IgUmVhY3QgTmF0aXZlIHBsZWFzZSBwb2x5ZmlsbCBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLCBlLmcuIHVzaW5nOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWFjdC1uYXRpdmUtZ2V0LXJhbmRvbS12YWx1ZXMuIil9cmV0dXJuIGNlfSkoKSxsZT0vKFxkfFthLWZdKS9pLHVlPXtpc1VpbnQ4QXJyYXk6Xyx0b0xvY2FsQnVmZmVyVHlwZShlKXtjb25zdCB0PWU/LltTeW1ib2wudG9TdHJpbmdUYWddPz9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYoIlVpbnQ4QXJyYXkiPT09dClyZXR1cm4gZTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLnNsaWNlKGUuYnl0ZU9mZnNldCxlLmJ5dGVPZmZzZXQrZS5ieXRlTGVuZ3RoKSk7aWYoIkFycmF5QnVmZmVyIj09PXR8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PT10fHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dHx8IltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO3Rocm93IG5ldyBaKCJDYW5ub3QgbWFrZSBhIFVpbnQ4QXJyYXkgZnJvbSBwYXNzZWQgcG90ZW50aWFsQnVmZmVyLiIpfSxhbGxvY2F0ZShlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlICJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCAke1N0cmluZyhlKX1gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LGFsbG9jYXRlVW5zYWZlOmU9PnVlLmFsbG9jYXRlKGUpLGNvbXBhcmUoZSx0KXtpZihlPT09dClyZXR1cm4gMDtjb25zdCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZihlW3JdPHRbcl0pcmV0dXJuLTE7aWYoZVtyXT50W3JdKXJldHVybiAxfXJldHVybiBlLmxlbmd0aDx0Lmxlbmd0aD8tMTplLmxlbmd0aD50Lmxlbmd0aD8xOjB9LGNvbmNhdChlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHVlLmFsbG9jYXRlKDApO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl0Kz1uLmxlbmd0aDtjb25zdCBuPXVlLmFsbG9jYXRlKHQpO2xldCByPTA7Zm9yKGNvbnN0IHQgb2YgZSluLnNldCh0LHIpLHIrPXQubGVuZ3RoO3JldHVybiBufSxjb3B5KGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aSYmaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInNvdXJjZUVuZCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7aX1gKTtpZihpPWk/P2UubGVuZ3RoLHZvaWQgMCE9PXImJihyPDB8fHI+aSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlU3RhcnQiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwIGFuZCA8PSAke2l9LiBSZWNlaXZlZCAke3J9YCk7aWYocj1yPz8wLHZvaWQgMCE9PW4mJm48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJ0YXJnZXRTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7bn1gKTtuPW4/PzA7Y29uc3Qgbz1lLnN1YmFycmF5KHIsaSkscz1NYXRoLm1pbihvLmxlbmd0aCx0Lmxlbmd0aC1uKTtyZXR1cm4gczw9MD8wOih0LnNldChvLnN1YmFycmF5KDAscyksbikscyl9LGVxdWFscyhlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21OdW1iZXJBcnJheTplPT5VaW50OEFycmF5LmZyb20oZSksZnJvbUJhc2U2NDplPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwoZT0+ZS5jaGFyQ29kZUF0KDApKSksZnJvbVVURjg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLHRvQmFzZTY0OmU9PmJ0b2EodWUudG9JU084ODU5MShlKSksZnJvbUlTTzg4NTkxOmU9PlVpbnQ4QXJyYXkuZnJvbShlLChlPT4yNTUmZS5jaGFyQ29kZUF0KDApKSksdG9JU084ODU5MTplPT5BcnJheS5mcm9tKFVpbnQxNkFycmF5LmZyb20oZSksKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKCIiKSxmcm9tSGV4KGUpe2NvbnN0IHQ9ZS5sZW5ndGglMj09MD9lOmUuc2xpY2UoMCxlLmxlbmd0aC0xKSxuPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgcj10W2VdLGk9dFtlKzFdO2lmKCFsZS50ZXN0KHIpKWJyZWFrO2lmKCFsZS50ZXN0KGkpKWJyZWFrO2NvbnN0IG89TnVtYmVyLnBhcnNlSW50KGAke3J9JHtpfWAsMTYpO24ucHVzaChvKX1yZXR1cm4gVWludDhBcnJheS5mcm9tKG4pfSx0b0hleDplPT5BcnJheS5mcm9tKGUsKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpLmpvaW4oIiIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7cmV0dXJuIG51bGwhPWk/aTpuZShlLHQsbixyKX0sdXRmOEJ5dGVMZW5ndGg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLmJ5dGVMZW5ndGgsZW5jb2RlVVRGOEludG8oZSx0LG4pe2NvbnN0IHI9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpO3JldHVybiBlLnNldChyLG4pLHIuYnl0ZUxlbmd0aH0scmFuZG9tQnl0ZXM6ZmUsc3dhcDMyKGUpe2lmKGUubGVuZ3RoJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz00KXtjb25zdCBuPWVbdF0scj1lW3QrMV0saT1lW3QrMl0sbz1lW3QrM107ZVt0XT1vLGVbdCsxXT1pLGVbdCsyXT1yLGVbdCszXT1ufXJldHVybiBlfX0sX2U9ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmITAhPT1CdWZmZXIucHJvdG90eXBlPy5faXNCdWZmZXI/YWU6dWUsZ2U9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi50eXBlIik7Y2xhc3MgaGV7Z2V0W2dlXSgpe3JldHVybiB0aGlzLl9ic29udHlwZX1nZXRbeV0oKXtyZXR1cm4gcH1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oZSx0LG4pe3JldHVybiB0aGlzLmluc3BlY3QoZSx0LG4pfX1jb25zdCBiZT1uZXcgRmxvYXQ2NEFycmF5KDEpLGRlPW5ldyBVaW50OEFycmF5KGJlLmJ1ZmZlciwwLDgpO2JlWzBdPS0xO2NvbnN0IHdlPTA9PT1kZVs3XSxwZT17aXNCaWdFbmRpYW46d2UsZ2V0Tm9ubmVnYXRpdmVJbnQzMkxFKGUsdCl7aWYoZVt0KzNdPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUgYXQgb2Zmc2V0OiAke3R9YCk7cmV0dXJuIGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNH0sZ2V0SW50MzJMRTooZSx0KT0+ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0LGdldFVpbnQzMkxFOihlLHQpPT5lW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSxnZXRVaW50MzJCRTooZSx0KT0+ZVt0KzNdKzI1NiplW3QrMl0rNjU1MzYqZVt0KzFdKzE2Nzc3MjE2KmVbdF0sZ2V0QmlnSW50NjRMRTooZSx0KT0+KEJpZ0ludChlW3QrNF0rMjU2KmVbdCs1XSs2NTUzNiplW3QrNl0rKGVbdCs3XTw8MjQpKTw8MzJuKStCaWdJbnQoZVt0XSsyNTYqZVt0KzFdKzY1NTM2KmVbdCsyXSsxNjc3NzIxNiplW3QrM10pLGdldEZsb2F0NjRMRTp3ZT8oZSx0KT0+KGRlWzddPWVbdF0sZGVbNl09ZVt0KzFdLGRlWzVdPWVbdCsyXSxkZVs0XT1lW3QrM10sZGVbM109ZVt0KzRdLGRlWzJdPWVbdCs1XSxkZVsxXT1lW3QrNl0sZGVbMF09ZVt0KzddLGJlWzBdKTooZSx0KT0+KGRlWzBdPWVbdF0sZGVbMV09ZVt0KzFdLGRlWzJdPWVbdCsyXSxkZVszXT1lW3QrM10sZGVbNF09ZVt0KzRdLGRlWzVdPWVbdCs1XSxkZVs2XT1lW3QrNl0sZGVbN109ZVt0KzddLGJlWzBdKSxzZXRJbnQzMkJFOihlLHQsbik9PihlW3QrM109bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3RdPW4sNCksc2V0SW50MzJMRTooZSx0LG4pPT4oZVt0XT1uLG4+Pj49OCxlW3QrMV09bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCszXT1uLDQpLHNldEJpZ0ludDY0TEUoZSx0LG4pe2NvbnN0IHI9MHhmZmZmZmZmZm47bGV0IGk9TnVtYmVyKG4mcik7ZVt0XT1pLGk+Pj04LGVbdCsxXT1pLGk+Pj04LGVbdCsyXT1pLGk+Pj04LGVbdCszXT1pO2xldCBvPU51bWJlcihuPj4zMm4mcik7cmV0dXJuIGVbdCs0XT1vLG8+Pj04LGVbdCs1XT1vLG8+Pj04LGVbdCs2XT1vLG8+Pj04LGVbdCs3XT1vLDh9LHNldEZsb2F0NjRMRTp3ZT8oZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzddLGVbdCsxXT1kZVs2XSxlW3QrMl09ZGVbNV0sZVt0KzNdPWRlWzRdLGVbdCs0XT1kZVszXSxlW3QrNV09ZGVbMl0sZVt0KzZdPWRlWzFdLGVbdCs3XT1kZVswXSw4KTooZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzBdLGVbdCsxXT1kZVsxXSxlW3QrMl09ZGVbMl0sZVt0KzNdPWRlWzNdLGVbdCs0XT1kZVs0XSxlW3QrNV09ZGVbNV0sZVt0KzZdPWRlWzZdLGVbdCs3XT1kZVs3XSw4KX07Y2xhc3MgeWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJpbmFyeSJ9c3RhdGljIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBCVUZGRVJfU0laRT0yNTY7c3RhdGljIFNVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBTVUJUWVBFX0ZVTkNUSU9OPTE7c3RhdGljIFNVQlRZUEVfQllURV9BUlJBWT0yO3N0YXRpYyBTVUJUWVBFX1VVSURfT0xEPTM7c3RhdGljIFNVQlRZUEVfVVVJRD00O3N0YXRpYyBTVUJUWVBFX01ENT01O3N0YXRpYyBTVUJUWVBFX0VOQ1JZUFRFRD02O3N0YXRpYyBTVUJUWVBFX0NPTFVNTj03O3N0YXRpYyBTVUJUWVBFX1NFTlNJVElWRT04O3N0YXRpYyBTVUJUWVBFX1ZFQ1RPUj05O3N0YXRpYyBTVUJUWVBFX1VTRVJfREVGSU5FRD0xMjg7c3RhdGljIFZFQ1RPUl9UWVBFPU9iamVjdC5mcmVlemUoe0ludDg6MyxGbG9hdDMyOjM5LFBhY2tlZEJpdDoxNn0pO2J1ZmZlcjtzdWJfdHlwZTtwb3NpdGlvbjtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbCE9ZSYmInN0cmluZyI9PXR5cGVvZiBlJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUpJiYhZyhlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFooIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPXQ/P3llLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCxudWxsPT1lPyh0aGlzLmJ1ZmZlcj1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT9fZS5mcm9tTnVtYmVyQXJyYXkoZSk6X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZyIpO2lmKCJudW1iZXIiIT10eXBlb2YgZSYmMSE9PWUubGVuZ3RoKXRocm93IG5ldyBaKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBVaW50OEFycmF5IG9yIEFycmF5Iik7bGV0IHQ7aWYodD0ic3RyaW5nIj09dHlwZW9mIGU/ZS5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2YgZT9lOmVbMF0sdDwwfHx0PjI1NSl0aHJvdyBuZXcgWigib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9X2UuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KF9lLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFooImlucHV0IGNhbm5vdCBiZSBzdHJpbmciKX1yZWFkKGUsdCl7Y29uc3Qgbj1lKyh0PXQmJnQ+MD90OnRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheShlLG4+dGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uOm4pfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aD09PXRoaXMucG9zaXRpb24/dGhpcy5idWZmZXI6dGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn10b0pTT04oKXtyZXR1cm4gX2UudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSl9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpOiJiYXNlNjQiPT09ZT9fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTpfZS50b1VURjgodGhpcy5idWZmZXIsMCx0aGlzLnBvc2l0aW9uLCExKX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9LHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUodGhpcyk7Y29uc3QgdD1fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlciksbj1OdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO3JldHVybiBlLmxlZ2FjeT97JGJpbmFyeTp0LCR0eXBlOjE9PT1uLmxlbmd0aD8iMCIrbjpufTp7JGJpbmFyeTp7YmFzZTY0OnQsc3ViVHlwZToxPT09bi5sZW5ndGg/IjAiK246bn19fXRvVVVJRCgpe2lmKHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1VVSUQpcmV0dXJuIG5ldyB4ZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTt0aHJvdyBuZXcgWihgQmluYXJ5IHN1Yl90eXBlICIke3RoaXMuc3ViX3R5cGV9IiBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb252ZXJ0aW5nIHRvIFVVSUQuIE9ubHkgIiR7eWUuU1VCVFlQRV9VVUlEfSIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5gKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUhleChlKSx0KX1zdGF0aWMgY3JlYXRlRnJvbUJhc2U2NChlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUJhc2U2NChlKSx0KX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2xldCBuLHI7aWYodD10fHx7fSwiJGJpbmFyeSJpbiBlP3QubGVnYWN5JiYic3RyaW5nIj09dHlwZW9mIGUuJGJpbmFyeSYmIiR0eXBlImluIGU/KHI9ZS4kdHlwZT9wYXJzZUludChlLiR0eXBlLDE2KTowLG49X2UuZnJvbUJhc2U2NChlLiRiaW5hcnkpKToic3RyaW5nIiE9dHlwZW9mIGUuJGJpbmFyeSYmKHI9ZS4kYmluYXJ5LnN1YlR5cGU/cGFyc2VJbnQoZS4kYmluYXJ5LnN1YlR5cGUsMTYpOjAsbj1fZS5mcm9tQmFzZTY0KGUuJGJpbmFyeS5iYXNlNjQpKToiJHV1aWQiaW4gZSYmKHI9NCxuPXhlLmJ5dGVzRnJvbVN0cmluZyhlLiR1dWlkKSksIW4pdGhyb3cgbmV3IFooYFVuZXhwZWN0ZWQgQmluYXJ5IEV4dGVuZGVkIEpTT04gZm9ybWF0ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIHI9PT1IP25ldyB4ZShuKTpuZXcgeWUobixyKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gQmluYXJ5LmNyZWF0ZUZyb21CYXNlNjQoJHtuKF9lLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpLHQpfSwgJHtuKHRoaXMuc3ViX3R5cGUsdCl9KWB9dG9JbnQ4QXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IFooIkJpbmFyeSBzdWJfdHlwZSBpcyBub3QgVmVjdG9yIik7aWYodGhpcy5idWZmZXJbMF0hPT15ZS5WRUNUT1JfVFlQRS5JbnQ4KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IEludDgiKTtyZXR1cm4gbWUodGhpcyksbmV3IEludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpfXRvRmxvYXQzMkFycmF5KCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMil0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBGbG9hdDMyIik7bWUodGhpcyk7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpO3JldHVybiBwZS5pc0JpZ0VuZGlhbiYmX2Uuc3dhcDMyKGUpLG5ldyBGbG9hdDMyQXJyYXkoZS5idWZmZXIpfXRvUGFja2VkQml0cygpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7cmV0dXJuIG1lKHRoaXMpLG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9CaXRzKCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IHBhY2tlZCBiaXQiKTttZSh0aGlzKTtjb25zdCBlPTgqKHRoaXMubGVuZ3RoKCktMiktdGhpcy5idWZmZXJbMV0sdD1uZXcgSW50OEFycmF5KGUpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPWUvOHwwLHI9dGhpcy5idWZmZXJbbisyXT4+Ny1lJTgmMTt0W2VdPXJ9cmV0dXJuIHR9c3RhdGljIGZyb21JbnQ4QXJyYXkoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7dFswXT15ZS5WRUNUT1JfVFlQRS5JbnQ4LHRbMV09MDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO3Quc2V0KG4sMik7Y29uc3Qgcj1uZXcgdGhpcyh0LHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBtZShyKSxyfXN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGUpe2NvbnN0IHQ9X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO3RbMF09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMix0WzFdPTA7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTt0LnNldChuLDIpLHBlLmlzQmlnRW5kaWFuJiZfZS5zd2FwMzIobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMikpO2NvbnN0IHI9bmV3IHRoaXModCx0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbVBhY2tlZEJpdHMoZSx0PTApe2NvbnN0IG49X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO25bMF09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0LG5bMV09dCxuLnNldChlLDIpO2NvbnN0IHI9bmV3IHRoaXMobix0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbUJpdHMoZSl7Y29uc3QgdD1lLmxlbmd0aCs3Pj4+MyxuPW5ldyBVaW50OEFycmF5KHQrMik7blswXT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQ7Y29uc3Qgcj1lLmxlbmd0aCU4O25bMV09MD09PXI/MDo4LXI7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IHI9dD4+PjMsaT1lW3RdO2lmKDAhPT1pJiYxIT09aSl0aHJvdyBuZXcgWihgSW52YWxpZCBiaXQgdmFsdWUgYXQgJHt0fTogbXVzdCBiZSAwIG9yIDEsIGZvdW5kICR7ZVt0XX1gKTtpZigwPT09aSljb250aW51ZTtjb25zdCBvPTctdCU4O25bcisyXXw9aTw8b31yZXR1cm4gbmV3IHRoaXMobix5ZS5TVUJUWVBFX1ZFQ1RPUil9fWZ1bmN0aW9uIG1lKGUpe2lmKGUuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUilyZXR1cm47Y29uc3QgdD1lLnBvc2l0aW9uLG49ZS5idWZmZXJbMF0scj1lLmJ1ZmZlclsxXTtpZigobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzJ8fG49PT15ZS5WRUNUT1JfVFlQRS5JbnQ4KSYmMCE9PXIpdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgemVybyBmb3IgaW50OCBhbmQgZmxvYXQzMiB2ZWN0b3JzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzImJjAhPT10JiZ0LTIhPTAmJih0LTIpJTQhPTApdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBGbG9hdDMyIHZlY3RvciBtdXN0IGNvbnRhaW4gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCYmMCE9PXImJjI9PT10KXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIHBhY2tlZCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBlbXB0eSIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJnI+Nyl0aHJvdyBuZXcgWihgSW52YWxpZCBWZWN0b3I6IHBhZGRpbmcgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgNy4gZm91bmQ6ICR7cn1gKX1jb25zdCBTZT0vXlswLTlBLUZdezMyfSQvaSxCZT0vXlswLTlBLUZdezh9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezEyfSQvaTtjbGFzcyB4ZSBleHRlbmRzIHlle2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKG51bGw9PWUpdD14ZS5nZW5lcmF0ZSgpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHhlKXQ9X2UudG9Mb2NhbEJ1ZmZlclR5cGUobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSYmMTY9PT1lLmJ5dGVMZW5ndGgpdD1fZS50b0xvY2FsQnVmZmVyVHlwZShlKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIFVVSUQgY29uc3RydWN0b3IgbXVzdCBiZSBhIFVVSUQsIGEgMTYgYnl0ZSBCdWZmZXIgb3IgYSAzMi8zNiBjaGFyYWN0ZXIgaGV4IHN0cmluZyAoZGFzaGVzIGV4Y2x1ZGVkL2luY2x1ZGVkLCBmb3JtYXQ6IHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCkuIik7dD14ZS5ieXRlc0Zyb21TdHJpbmcoZSl9c3VwZXIodCxIKX1nZXQgaWQoKXtyZXR1cm4gdGhpcy5idWZmZXJ9c2V0IGlkKGUpe3RoaXMuYnVmZmVyPWV9dG9IZXhTdHJpbmcoZT0hMCl7cmV0dXJuIGU/W19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsNCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDQsNikpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDYsOCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDgsMTApKSxfZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgxMCwxNikpXS5qb2luKCItIik6X2UudG9IZXgodGhpcy5idWZmZXIpfXRvU3RyaW5nKGUpe3JldHVybiJoZXgiPT09ZT9fZS50b0hleCh0aGlzLmlkKToiYmFzZTY0Ij09PWU/X2UudG9CYXNlNjQodGhpcy5pZCk6dGhpcy50b0hleFN0cmluZygpfXRvSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nKCl9ZXF1YWxzKGUpe2lmKCFlKXJldHVybiExO2lmKGUgaW5zdGFuY2VvZiB4ZSlyZXR1cm4gX2UuZXF1YWxzKGUuaWQsdGhpcy5pZCk7dHJ5e3JldHVybiBfZS5lcXVhbHMobmV3IHhlKGUpLmlkLHRoaXMuaWQpfWNhdGNoe3JldHVybiExfX10b0JpbmFyeSgpe3JldHVybiBuZXcgeWUodGhpcy5pZCx5ZS5TVUJUWVBFX1VVSUQpfXN0YXRpYyBnZW5lcmF0ZSgpe2NvbnN0IGU9X2UucmFuZG9tQnl0ZXMoMTYpO3JldHVybiBlWzZdPTE1JmVbNl18NjQsZVs4XT02MyZlWzhdfDEyOCxlfXN0YXRpYyBpc1ZhbGlkKGUpe3JldHVybiEhZSYmKCJzdHJpbmciPT10eXBlb2YgZT94ZS5pc1ZhbGlkVVVJRFN0cmluZyhlKTpfKGUpPzE2PT09ZS5ieXRlTGVuZ3RoOiJCaW5hcnkiPT09ZS5fYnNvbnR5cGUmJmUuc3ViX3R5cGU9PT10aGlzLlNVQlRZUEVfVVVJRCYmMTY9PT1lLmJ1ZmZlci5ieXRlTGVuZ3RoKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlKXtjb25zdCB0PXhlLmJ5dGVzRnJvbVN0cmluZyhlKTtyZXR1cm4gbmV3IHhlKHQpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe3JldHVybiBuZXcgeGUoX2UuZnJvbUJhc2U2NChlKSl9c3RhdGljIGJ5dGVzRnJvbVN0cmluZyhlKXtpZigheGUuaXNWYWxpZFVVSURTdHJpbmcoZSkpdGhyb3cgbmV3IFooIlVVSUQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgYmUgMzIgaGV4IGRpZ2l0cyBvciBjYW5vbmljYWwgaHlwaGVuYXRlZCByZXByZXNlbnRhdGlvbiIpO3JldHVybiBfZS5mcm9tSGV4KGUucmVwbGFjZSgvLS9nLCIiKSl9c3RhdGljIGlzVmFsaWRVVUlEU3RyaW5nKGUpe3JldHVybiBTZS50ZXN0KGUpfHxCZS50ZXN0KGUpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IFVVSUQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19Y2xhc3MgRWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkNvZGUifWNvZGU7c2NvcGU7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuY29kZT1lLnRvU3RyaW5nKCksdGhpcy5zY29wZT10Pz9udWxsfXRvSlNPTigpe3JldHVybiBudWxsIT10aGlzLnNjb3BlP3tjb2RlOnRoaXMuY29kZSxzY29wZTp0aGlzLnNjb3BlfTp7Y29kZTp0aGlzLmNvZGV9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMuc2NvcGU/eyRjb2RlOnRoaXMuY29kZSwkc2NvcGU6dGhpcy5zY29wZX06eyRjb2RlOnRoaXMuY29kZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBFZShlLiRjb2RlLGUuJHNjb3BlKX1pbnNwZWN0KGUsdCxuKXtuPz89dztsZXQgcj1uKHRoaXMuY29kZSx0KTtjb25zdCBpPXIuaW5jbHVkZXMoIlxuIik7bnVsbCE9dGhpcy5zY29wZSYmKHIrPWAsJHtpPyJcbiI6IiAifSR7bih0aGlzLnNjb3BlLHQpfWApO3JldHVybmBuZXcgQ29kZSgke2k/IlxuIjoiIn0ke3J9JHtpJiZudWxsPT09dGhpcy5zY29wZT8iXG4iOiIifSlgfX1mdW5jdGlvbiBVZShlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiJGlkImluIGUmJm51bGwhPWUuJGlkJiYiJHJlZiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJHJlZiYmKCEoIiRkYiJpbiBlKXx8IiRkYiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJGRiKX1jbGFzcyBPZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iREJSZWYifWNvbGxlY3Rpb247b2lkO2RiO2ZpZWxkcztjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcigpO2NvbnN0IGk9ZS5zcGxpdCgiLiIpOzI9PT1pLmxlbmd0aCYmKG49aS5zaGlmdCgpLGU9aS5zaGlmdCgpKSx0aGlzLmNvbGxlY3Rpb249ZSx0aGlzLm9pZD10LHRoaXMuZGI9bix0aGlzLmZpZWxkcz1yfHx7fX1nZXQgbmFtZXNwYWNlKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZXQgbmFtZXNwYWNlKGUpe3RoaXMuY29sbGVjdGlvbj1lfXRvSlNPTigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7JHJlZjp0aGlzLmNvbGxlY3Rpb24sJGlkOnRoaXMub2lkfSx0aGlzLmZpZWxkcyk7cmV0dXJuIG51bGwhPXRoaXMuZGImJihlLiRkYj10aGlzLmRiKSxlfXRvRXh0ZW5kZWRKU09OKGUpe2U9ZXx8e307bGV0IHQ9eyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH07cmV0dXJuIGUubGVnYWN5fHwodGhpcy5kYiYmKHQuJGRiPXRoaXMuZGIpLHQ9T2JqZWN0LmFzc2lnbih0LHRoaXMuZmllbGRzKSksdH1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGRlbGV0ZSB0LiRyZWYsZGVsZXRlIHQuJGlkLGRlbGV0ZSB0LiRkYixuZXcgT2UoZS4kcmVmLGUuJGlkLGUuJGRiLHQpfWluc3BlY3QoZSx0LG4pe24/Pz13O2NvbnN0IHI9W24odGhpcy5uYW1lc3BhY2UsdCksbih0aGlzLm9pZCx0KSwuLi50aGlzLmRiP1tuKHRoaXMuZGIsdCldOltdLC4uLk9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGg+MD9bbih0aGlzLmZpZWxkcyx0KV06W11dO3JldHVybiByWzFdPW49PT13P2BuZXcgT2JqZWN0SWQoJHtyWzFdfSlgOnJbMV0sYG5ldyBEQlJlZigke3Iuam9pbigiLCAiKX0pYH19ZnVuY3Rpb24gTmUoZSl7aWYoIiI9PT1lKXJldHVybiBlO2xldCB0PTA7Y29uc3Qgbj0iLSI9PT1lW3RdLHI9IisiPT09ZVt0XTsocnx8bikmJih0Kz0xKTtsZXQgaT0hMTtmb3IoO3Q8ZS5sZW5ndGgmJiIwIj09PWVbdF07Kyt0KWk9ITA7cmV0dXJuIGk/YCR7bj8iLSI6IiJ9JHtlLmxlbmd0aD09PXQ/IjAiOmUuc2xpY2UodCl9YDpyP2Uuc2xpY2UoMSk6ZX1sZXQgSWU7dHJ5e0llPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9Y29uc3QgdmU9NDI5NDk2NzI5NixUZT0weDEwMDAwMDAwMDAwMDAwMDAwLCRlPVRlLzIsTGU9e30sQWU9e30sUmU9L14oXCs/MHwoXCt8LSk/WzEtOV1bMC05XSopJC87Y2xhc3MgamUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkxvbmcifWdldCBfX2lzTG9uZ19fKCl7cmV0dXJuITB9aGlnaDtsb3c7dW5zaWduZWQ7Y29uc3RydWN0b3IoZT0wLHQsbil7c3VwZXIoKTtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIHQ/dDpCb29sZWFuKG4pLGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6MCxvPSJzdHJpbmciPT10eXBlb2YgZT9qZS5mcm9tU3RyaW5nKGUscik6ImJpZ2ludCI9PXR5cGVvZiBlP2plLmZyb21CaWdJbnQoZSxyKTp7bG93OjB8ZSxoaWdoOjB8aSx1bnNpZ25lZDpyfTt0aGlzLmxvdz1vLmxvdyx0aGlzLmhpZ2g9by5oaWdoLHRoaXMudW5zaWduZWQ9by51bnNpZ25lZH1zdGF0aWMgVFdPX1BXUl8yND1qZS5mcm9tSW50KDE2Nzc3MjE2KTtzdGF0aWMgTUFYX1VOU0lHTkVEX1ZBTFVFPWplLmZyb21CaXRzKC0xLC0xLCEwKTtzdGF0aWMgWkVSTz1qZS5mcm9tSW50KDApO3N0YXRpYyBVWkVSTz1qZS5mcm9tSW50KDAsITApO3N0YXRpYyBPTkU9amUuZnJvbUludCgxKTtzdGF0aWMgVU9ORT1qZS5mcm9tSW50KDEsITApO3N0YXRpYyBORUdfT05FPWplLmZyb21JbnQoLTEpO3N0YXRpYyBNQVhfVkFMVUU9amUuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NywhMSk7c3RhdGljIE1JTl9WQUxVRT1qZS5mcm9tQml0cygwLC0yMTQ3NDgzNjQ4LCExKTtzdGF0aWMgZnJvbUJpdHMoZSx0LG4pe3JldHVybiBuZXcgamUoZSx0LG4pfXN0YXRpYyBmcm9tSW50KGUsdCl7bGV0IG4scixpO3JldHVybiB0PyhpPTA8PShlPj4+PTApJiZlPDI1NikmJihyPUFlW2VdLHIpP3I6KG49amUuZnJvbUJpdHMoZSwoMHxlKTwwPy0xOjAsITApLGkmJihBZVtlXT1uKSxuKTooaT0tMTI4PD0oZXw9MCkmJmU8MTI4KSYmKHI9TGVbZV0scik/cjoobj1qZS5mcm9tQml0cyhlLGU8MD8tMTowLCExKSxpJiYoTGVbZV09biksbil9c3RhdGljIGZyb21OdW1iZXIoZSx0KXtpZihpc05hTihlKSlyZXR1cm4gdD9qZS5VWkVSTzpqZS5aRVJPO2lmKHQpe2lmKGU8MClyZXR1cm4gamUuVVpFUk87aWYoZT49VGUpcmV0dXJuIGplLk1BWF9VTlNJR05FRF9WQUxVRX1lbHNle2lmKGU8PS0kZSlyZXR1cm4gamUuTUlOX1ZBTFVFO2lmKGUrMT49JGUpcmV0dXJuIGplLk1BWF9WQUxVRX1yZXR1cm4gZTwwP2plLmZyb21OdW1iZXIoLWUsdCkubmVnKCk6amUuZnJvbUJpdHMoZSV2ZXwwLGUvdmV8MCx0KX1zdGF0aWMgZnJvbUJpZ0ludChlLHQpe2NvbnN0IG49MHhmZmZmZmZmZm47cmV0dXJuIG5ldyBqZShOdW1iZXIoZSZuKSxOdW1iZXIoZT4+MzJuJm4pLHQpfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBaKCJlbXB0eSBzdHJpbmciKTtpZihuPDJ8fDM2PG4pdGhyb3cgbmV3IFooInJhZGl4Iik7bGV0IHI7aWYoKHI9ZS5pbmRleE9mKCItIikpPjApdGhyb3cgbmV3IFooImludGVyaW9yIGh5cGhlbiIpO2lmKDA9PT1yKXJldHVybiBqZS5fZnJvbVN0cmluZyhlLnN1YnN0cmluZygxKSx0LG4pLm5lZygpO2NvbnN0IGk9amUuZnJvbU51bWJlcihNYXRoLnBvdyhuLDgpKTtsZXQgbz1qZS5aRVJPO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9OCl7Y29uc3Qgcj1NYXRoLm1pbig4LGUubGVuZ3RoLXQpLHM9cGFyc2VJbnQoZS5zdWJzdHJpbmcodCx0K3IpLG4pO2lmKHI8OCl7Y29uc3QgZT1qZS5mcm9tTnVtYmVyKE1hdGgucG93KG4scikpO289by5tdWwoZSkuYWRkKGplLmZyb21OdW1iZXIocykpfWVsc2Ugbz1vLm11bChpKSxvPW8uYWRkKGplLmZyb21OdW1iZXIocykpfXJldHVybiBvLnVuc2lnbmVkPXQsb31zdGF0aWMgZnJvbVN0cmluZ1N0cmljdChlLHQsbil7bGV0IHI9ITE7aWYoIm51bWJlciI9PXR5cGVvZiB0PyhuPXQsdD0hMSk6cj0hIXQsbj8/PTEwLGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyB3aGl0ZXNwYWNlYCk7aWYoIWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zbGljZSgwLHQ9dD8/MTApO3JldHVybiFuZXcgUmVnRXhwKGBbXi0rJHtufV1gLCJpIikudGVzdChlKSYmZX0oZSxuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIHJhZGl4OiAke259YCk7Y29uc3QgaT1OZShlKSxvPWplLl9mcm9tU3RyaW5nKGkscixuKTtpZihvLnRvU3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkhPT1pLnRvTG93ZXJDYXNlKCkpdGhyb3cgbmV3IFooYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzICR7by51bnNpZ25lZD8iYW4gdW5zaWduZWQiOiJhIHNpZ25lZCJ9IDY0LWJpdCBMb25nICR7bnVsbCE9bj9gd2l0aCByYWRpeDogJHtufWA6IiJ9YCk7cmV0dXJuIG99c3RhdGljIGZyb21TdHJpbmcoZSx0LG4pe2xldCByPSExO3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCwiTmFOIj09PWUmJm48MjR8fCgiSW5maW5pdHkiPT09ZXx8IitJbmZpbml0eSI9PT1lfHwiLUluZmluaXR5Ij09PWUpJiZuPDM1P2plLlpFUk86amUuX2Zyb21TdHJpbmcoZSxyLG4pfXN0YXRpYyBmcm9tQnl0ZXMoZSx0LG4pe3JldHVybiBuP2plLmZyb21CeXRlc0xFKGUsdCk6amUuZnJvbUJ5dGVzQkUoZSx0KX1zdGF0aWMgZnJvbUJ5dGVzTEUoZSx0KXtyZXR1cm4gbmV3IGplKGVbMF18ZVsxXTw8OHxlWzJdPDwxNnxlWzNdPDwyNCxlWzRdfGVbNV08PDh8ZVs2XTw8MTZ8ZVs3XTw8MjQsdCl9c3RhdGljIGZyb21CeXRlc0JFKGUsdCl7cmV0dXJuIG5ldyBqZShlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9faXNMb25nX18iaW4gZSYmITA9PT1lLl9faXNMb25nX199c3RhdGljIGZyb21WYWx1ZShlLHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9qZS5mcm9tTnVtYmVyKGUsdCk6InN0cmluZyI9PXR5cGVvZiBlP2plLmZyb21TdHJpbmcoZSx0KTpqZS5mcm9tQml0cyhlLmxvdyxlLmhpZ2gsImJvb2xlYW4iPT10eXBlb2YgdD90OmUudW5zaWduZWQpfWFkZChlKXtqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGE9ZS5sb3c+Pj4xNjtsZXQgYz0wLGY9MCxsPTAsdT0wO3JldHVybiB1Kz1pKyg2NTUzNSZlLmxvdyksbCs9dT4+PjE2LHUmPTY1NTM1LGwrPXIrYSxmKz1sPj4+MTYsbCY9NjU1MzUsZis9bitzLGMrPWY+Pj4xNixmJj02NTUzNSxjKz10K28sYyY9NjU1MzUsamUuZnJvbUJpdHMobDw8MTZ8dSxjPDwxNnxmLHRoaXMudW5zaWduZWQpfWFuZChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9Y29tcGFyZShlKXtpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksdGhpcy5lcShlKSlyZXR1cm4gMDtjb25zdCB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfWNvbXAoZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlKX1kaXZpZGUoZSl7aWYoamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGUuaXNaZXJvKCkpdGhyb3cgbmV3IFooImRpdmlzaW9uIGJ5IHplcm8iKTtpZihJZSl7aWYoIXRoaXMudW5zaWduZWQmJi0yMTQ3NDgzNjQ4PT09dGhpcy5oaWdoJiYtMT09PWUubG93JiYtMT09PWUuaGlnaClyZXR1cm4gdGhpcztjb25zdCB0PSh0aGlzLnVuc2lnbmVkP0llLmRpdl91OkllLmRpdl9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gamUuZnJvbUJpdHModCxJZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/amUuVVpFUk86amUuWkVSTztsZXQgdCxuLHI7aWYodGhpcy51bnNpZ25lZCl7aWYoZS51bnNpZ25lZHx8KGU9ZS50b1Vuc2lnbmVkKCkpLGUuZ3QodGhpcykpcmV0dXJuIGplLlVaRVJPO2lmKGUuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gamUuVU9ORTtyPWplLlVaRVJPfWVsc2V7aWYodGhpcy5lcShqZS5NSU5fVkFMVUUpKXtpZihlLmVxKGplLk9ORSl8fGUuZXEoamUuTkVHX09ORSkpcmV0dXJuIGplLk1JTl9WQUxVRTtpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGplLk9ORTtyZXR1cm4gdD10aGlzLnNocigxKS5kaXYoZSkuc2hsKDEpLHQuZXEoamUuWkVSTyk/ZS5pc05lZ2F0aXZlKCk/amUuT05FOmplLk5FR19PTkU6KG49dGhpcy5zdWIoZS5tdWwodCkpLHI9dC5hZGQobi5kaXYoZSkpLHIpfWlmKGUuZXEoamUuTUlOX1ZBTFVFKSlyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5VWkVSTzpqZS5aRVJPO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBlLmlzTmVnYXRpdmUoKT90aGlzLm5lZygpLmRpdihlLm5lZygpKTp0aGlzLm5lZygpLmRpdihlKS5uZWcoKTtpZihlLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5kaXYoZS5uZWcoKSkubmVnKCk7cj1qZS5aRVJPfWZvcihuPXRoaXM7bi5ndGUoZSk7KXt0PU1hdGgubWF4KDEsTWF0aC5mbG9vcihuLnRvTnVtYmVyKCkvZS50b051bWJlcigpKSk7Y29uc3QgaT1NYXRoLmNlaWwoTWF0aC5sb2codCkvTWF0aC5MTjIpLG89aTw9NDg/MTpNYXRoLnBvdygyLGktNDgpO2xldCBzPWplLmZyb21OdW1iZXIodCksYT1zLm11bChlKTtmb3IoO2EuaXNOZWdhdGl2ZSgpfHxhLmd0KG4pOyl0LT1vLHM9amUuZnJvbU51bWJlcih0LHRoaXMudW5zaWduZWQpLGE9cy5tdWwoZSk7cy5pc1plcm8oKSYmKHM9amUuT05FKSxyPXIuYWRkKHMpLG49bi5zdWIoYSl9cmV0dXJuIHJ9ZGl2KGUpe3JldHVybiB0aGlzLmRpdmlkZShlKX1lcXVhbHMoZSl7cmV0dXJuIGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSwodGhpcy51bnNpZ25lZD09PWUudW5zaWduZWR8fHRoaXMuaGlnaD4+PjMxIT0xfHxlLmhpZ2g+Pj4zMSE9MSkmJih0aGlzLmhpZ2g9PT1lLmhpZ2gmJnRoaXMubG93PT09ZS5sb3cpfWVxKGUpe3JldHVybiB0aGlzLmVxdWFscyhlKX1nZXRIaWdoQml0cygpe3JldHVybiB0aGlzLmhpZ2h9Z2V0SGlnaEJpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfWdldExvd0JpdHMoKXtyZXR1cm4gdGhpcy5sb3d9Z2V0TG93Qml0c1Vuc2lnbmVkKCl7cmV0dXJuIHRoaXMubG93Pj4+MH1nZXROdW1CaXRzQWJzKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoamUuTUlOX1ZBTFVFKT82NDp0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtjb25zdCBlPTAhPT10aGlzLmhpZ2g/dGhpcy5oaWdoOnRoaXMubG93O2xldCB0O2Zvcih0PTMxO3Q+MCYmIShlJjE8PHQpO3QtLSk7cmV0dXJuIDAhPT10aGlzLmhpZ2g/dCszMzp0KzF9Z3JlYXRlclRoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKT4wfWd0KGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuKGUpfWdyZWF0ZXJUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPj0wfWd0ZShlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbk9yRXF1YWwoZSl9Z2UoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWlzRXZlbigpe3JldHVybiEoMSZ0aGlzLmxvdyl9aXNOZWdhdGl2ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g8MH1pc09kZCgpe3JldHVybiEoMSZ+dGhpcy5sb3cpfWlzUG9zaXRpdmUoKXtyZXR1cm4gdGhpcy51bnNpZ25lZHx8dGhpcy5oaWdoPj0wfWlzWmVybygpe3JldHVybiAwPT09dGhpcy5oaWdoJiYwPT09dGhpcy5sb3d9bGVzc1RoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKTwwfWx0KGUpe3JldHVybiB0aGlzLmxlc3NUaGFuKGUpfWxlc3NUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPD0wfWx0ZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9bW9kdWxvKGUpe2lmKGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSxJZSl7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9JZS5yZW1fdTpJZS5yZW1fcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIGplLmZyb21CaXRzKHQsSWUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZSkubXVsKGUpKX1tb2QoZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfXJlbShlKXtyZXR1cm4gdGhpcy5tb2R1bG8oZSl9bXVsdGlwbHkoZSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksSWUpe2NvbnN0IHQ9SWUubXVsKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBqZS5mcm9tQml0cyh0LEllLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9aWYoZS5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZih0aGlzLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGUuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5tdWwoZS5uZWcoKSk6dGhpcy5uZWcoKS5tdWwoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMubXVsKGUubmVnKCkpLm5lZygpO2lmKHRoaXMubHQoamUuVFdPX1BXUl8yNCkmJmUubHQoamUuVFdPX1BXUl8yNCkpcmV0dXJuIGplLmZyb21OdW1iZXIodGhpcy50b051bWJlcigpKmUudG9OdW1iZXIoKSx0aGlzLnVuc2lnbmVkKTtjb25zdCB0PXRoaXMuaGlnaD4+PjE2LG49NjU1MzUmdGhpcy5oaWdoLHI9dGhpcy5sb3c+Pj4xNixpPTY1NTM1JnRoaXMubG93LG89ZS5oaWdoPj4+MTYscz02NTUzNSZlLmhpZ2gsYT1lLmxvdz4+PjE2LGM9NjU1MzUmZS5sb3c7bGV0IGY9MCxsPTAsdT0wLF89MDtyZXR1cm4gXys9aSpjLHUrPV8+Pj4xNixfJj02NTUzNSx1Kz1yKmMsbCs9dT4+PjE2LHUmPTY1NTM1LHUrPWkqYSxsKz11Pj4+MTYsdSY9NjU1MzUsbCs9bipjLGYrPWw+Pj4xNixsJj02NTUzNSxsKz1yKmEsZis9bD4+PjE2LGwmPTY1NTM1LGwrPWkqcyxmKz1sPj4+MTYsbCY9NjU1MzUsZis9dCpjK24qYStyKnMraSpvLGYmPTY1NTM1LGplLmZyb21CaXRzKHU8PDE2fF8sZjw8MTZ8bCx0aGlzLnVuc2lnbmVkKX1tdWwoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHkoZSl9bmVnYXRlKCl7cmV0dXJuIXRoaXMudW5zaWduZWQmJnRoaXMuZXEoamUuTUlOX1ZBTFVFKT9qZS5NSU5fVkFMVUU6dGhpcy5ub3QoKS5hZGQoamUuT05FKX1uZWcoKXtyZXR1cm4gdGhpcy5uZWdhdGUoKX1ub3QoKXtyZXR1cm4gamUuZnJvbUJpdHMofnRoaXMubG93LH50aGlzLmhpZ2gsdGhpcy51bnNpZ25lZCl9bm90RXF1YWxzKGUpe3JldHVybiF0aGlzLmVxdWFscyhlKX1uZXEoZSl7cmV0dXJuIHRoaXMubm90RXF1YWxzKGUpfW5lKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1vcihlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93fGUubG93LHRoaXMuaGlnaHxlLmhpZ2gsdGhpcy51bnNpZ25lZCl9c2hpZnRMZWZ0KGUpe3JldHVybiBqZS5pc0xvbmcoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/amUuZnJvbUJpdHModGhpcy5sb3c8PGUsdGhpcy5oaWdoPDxlfHRoaXMubG93Pj4+MzItZSx0aGlzLnVuc2lnbmVkKTpqZS5mcm9tQml0cygwLHRoaXMubG93PDxlLTMyLHRoaXMudW5zaWduZWQpfXNobChlKXtyZXR1cm4gdGhpcy5zaGlmdExlZnQoZSl9c2hpZnRSaWdodChlKXtyZXR1cm4gamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2plLmZyb21CaXRzKHRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWUsdGhpcy5oaWdoPj5lLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHRoaXMuaGlnaD4+ZS0zMix0aGlzLmhpZ2g+PTA/MDotMSx0aGlzLnVuc2lnbmVkKX1zaHIoZSl7cmV0dXJuIHRoaXMuc2hpZnRSaWdodChlKX1zaGlmdFJpZ2h0VW5zaWduZWQoZSl7aWYoamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PT0oZSY9NjMpKXJldHVybiB0aGlzO3tjb25zdCB0PXRoaXMuaGlnaDtpZihlPDMyKXtjb25zdCBuPXRoaXMubG93O3JldHVybiBqZS5mcm9tQml0cyhuPj4+ZXx0PDwzMi1lLHQ+Pj5lLHRoaXMudW5zaWduZWQpfXJldHVybiAzMj09PWU/amUuZnJvbUJpdHModCwwLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHQ+Pj5lLTMyLDAsdGhpcy51bnNpZ25lZCl9fXNocl91KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zaHJ1KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zdWJ0cmFjdChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLHRoaXMuYWRkKGUubmVnKCkpfXN1YihlKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdChlKX10b0ludCgpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXMubG93Pj4+MDp0aGlzLmxvd310b051bWJlcigpe3JldHVybiB0aGlzLnVuc2lnbmVkPyh0aGlzLmhpZ2g+Pj4wKSp2ZSsodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqdmUrKHRoaXMubG93Pj4+MCl9dG9CaWdJbnQoKXtyZXR1cm4gQmlnSW50KHRoaXMudG9TdHJpbmcoKSl9dG9CeXRlcyhlKXtyZXR1cm4gZT90aGlzLnRvQnl0ZXNMRSgpOnRoaXMudG9CeXRlc0JFKCl9dG9CeXRlc0xFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bMjU1JnQsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0LDI1NSZlLGU+Pj44JjI1NSxlPj4+MTYmMjU1LGU+Pj4yNF19dG9CeXRlc0JFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bZT4+PjI0LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlLHQ+Pj4yNCx0Pj4+MTYmMjU1LHQ+Pj44JjI1NSwyNTUmdF19dG9TaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5mcm9tQml0cyh0aGlzLmxvdyx0aGlzLmhpZ2gsITEpOnRoaXN9dG9TdHJpbmcoZSl7aWYoKGU9ZXx8MTApPDJ8fDM2PGUpdGhyb3cgbmV3IFooInJhZGl4Iik7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4iMCI7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXEoamUuTUlOX1ZBTFVFKSl7Y29uc3QgdD1qZS5mcm9tTnVtYmVyKGUpLG49dGhpcy5kaXYodCkscj1uLm11bCh0KS5zdWIodGhpcyk7cmV0dXJuIG4udG9TdHJpbmcoZSkrci50b0ludCgpLnRvU3RyaW5nKGUpfXJldHVybiItIit0aGlzLm5lZygpLnRvU3RyaW5nKGUpfWNvbnN0IHQ9amUuZnJvbU51bWJlcihNYXRoLnBvdyhlLDYpLHRoaXMudW5zaWduZWQpO2xldCBuPXRoaXMscj0iIjtmb3IoOzspe2NvbnN0IGk9bi5kaXYodCk7bGV0IG89KG4uc3ViKGkubXVsKHQpKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYobj1pLG4uaXNaZXJvKCkpcmV0dXJuIG8rcjtmb3IoO28ubGVuZ3RoPDY7KW89IjAiK287cj0iIitvK3J9fXRvVW5zaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzOmplLmZyb21CaXRzKHRoaXMubG93LHRoaXMuaGlnaCwhMCl9eG9yKGUpe3JldHVybiBqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksamUuZnJvbUJpdHModGhpcy5sb3deZS5sb3csdGhpcy5oaWdoXmUuaGlnaCx0aGlzLnVuc2lnbmVkKX1lcXooKXtyZXR1cm4gdGhpcy5pc1plcm8oKX1sZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuIGUmJmUucmVsYXhlZD90aGlzLnRvTnVtYmVyKCk6eyRudW1iZXJMb25nOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtjb25zdHt1c2VCaWdJbnQ2NDpuPSExLHJlbGF4ZWQ6cj0hMH09ey4uLnR9O2lmKGUuJG51bWJlckxvbmcubGVuZ3RoPjIwKXRocm93IG5ldyBaKCIkbnVtYmVyTG9uZyBzdHJpbmcgaXMgdG9vIGxvbmciKTtpZighUmUudGVzdChlLiRudW1iZXJMb25nKSl0aHJvdyBuZXcgWihgJG51bWJlckxvbmcgc3RyaW5nICIke2UuJG51bWJlckxvbmd9IiBpcyBpbiBhbiBpbnZhbGlkIGZvcm1hdGApO2lmKG4pe2NvbnN0IHQ9QmlnSW50KGUuJG51bWJlckxvbmcpO3JldHVybiBCaWdJbnQuYXNJbnROKDY0LHQpfWNvbnN0IGk9amUuZnJvbVN0cmluZyhlLiRudW1iZXJMb25nKTtyZXR1cm4gcj9pLnRvTnVtYmVyKCk6aX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IExvbmcoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0ke3RoaXMudW5zaWduZWQ/YCwgJHtuKHRoaXMudW5zaWduZWQsdCl9YDoiIn0pYH19Y29uc3QgRmU9L14oXCt8LSk/KFxkK3woXGQqXC5cZCopKT8oRXxlKT8oWy0rXSk/KFxkKyk/JC8sa2U9L14oXCt8LSk/KEluZmluaXR5fGluZikkL2ksemU9L14oXCt8LSk/TmFOJC9pLERlPTYxMTEsQ2U9LTYxNzYsTWU9X2UuZnJvbU51bWJlckFycmF5KFsxMjQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksVmU9X2UuZnJvbU51bWJlckFycmF5KFsyNDgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksUGU9X2UuZnJvbU51bWJlckFycmF5KFsxMjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksSmU9L14oWy0rXSk/KFxkKyk/JC87ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX1mdW5jdGlvbiBZZShlKXtjb25zdCB0PWplLmZyb21OdW1iZXIoMWU5KTtsZXQgbj1qZS5mcm9tTnVtYmVyKDApO2lmKCEoZS5wYXJ0c1swXXx8ZS5wYXJ0c1sxXXx8ZS5wYXJ0c1syXXx8ZS5wYXJ0c1szXSkpcmV0dXJue3F1b3RpZW50OmUscmVtOm59O2ZvcihsZXQgcj0wO3I8PTM7cisrKW49bi5zaGlmdExlZnQoMzIpLG49bi5hZGQobmV3IGplKGUucGFydHNbcl0sMCkpLGUucGFydHNbcl09bi5kaXYodCkubG93LG49bi5tb2R1bG8odCk7cmV0dXJue3F1b3RpZW50OmUscmVtOm59fWZ1bmN0aW9uIHFlKGUsdCl7dGhyb3cgbmV3IFooYCIke2V9IiBpcyBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyAtICR7dH1gKX1jbGFzcyBIZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iRGVjaW1hbDEyOCJ9Ynl0ZXM7Y29uc3RydWN0b3IoZSl7aWYoc3VwZXIoKSwic3RyaW5nIj09dHlwZW9mIGUpdGhpcy5ieXRlcz1IZS5mcm9tU3RyaW5nKGUpLmJ5dGVzO2Vsc2V7aWYoIShlIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhlKSkpdGhyb3cgbmV3IFooIkRlY2ltYWwxMjggbXVzdCB0YWtlIGEgQnVmZmVyIG9yIHN0cmluZyIpO2lmKDE2IT09ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKCJEZWNpbWFsMTI4IG11c3QgdGFrZSBhIEJ1ZmZlciBvZiAxNiBieXRlcyIpO3RoaXMuYnl0ZXM9ZX19c3RhdGljIGZyb21TdHJpbmcoZSl7cmV0dXJuIEhlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITF9KX1zdGF0aWMgZnJvbVN0cmluZ1dpdGhSb3VuZGluZyhlKXtyZXR1cm4gSGUuX2Zyb21TdHJpbmcoZSx7YWxsb3dSb3VuZGluZzohMH0pfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQpe2xldCBuPSExLHI9ITEsaT0hMSxvPSExLHM9MCxhPTAsYz0wLGY9MCxsPTA7Y29uc3QgdT1bMF07bGV0IF89MCxnPTAsaD0wLGI9MCxkPW5ldyBqZSgwLDApLHc9bmV3IGplKDAsMCkscD0wLHk9MDtpZihlLmxlbmd0aD49N2UzKXRocm93IG5ldyBaKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2NvbnN0IG09ZS5tYXRjaChGZSksUz1lLm1hdGNoKGtlKSxCPWUubWF0Y2goemUpO2lmKCFtJiYhUyYmIUJ8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWihlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtpZihtKXtjb25zdCB0PW1bMl0sbj1tWzRdLHI9bVs1XSxpPW1bNl07biYmdm9pZCAwPT09aSYmcWUoZSwibWlzc2luZyBleHBvbmVudCBwb3dlciIpLG4mJnZvaWQgMD09PXQmJnFlKGUsIm1pc3NpbmcgZXhwb25lbnQgYmFzZSIpLHZvaWQgMD09PW4mJihyfHxpKSYmcWUoZSwibWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCIpfWlmKCIrIiE9PWVbeV0mJiItIiE9PWVbeV18fChyPSEwLG49Ii0iPT09ZVt5KytdKSwhV2UoZVt5XSkmJiIuIiE9PWVbeV0pe2lmKCJpIj09PWVbeV18fCJJIj09PWVbeV0pcmV0dXJuIG5ldyBIZShuP1ZlOlBlKTtpZigiTiI9PT1lW3ldKXJldHVybiBuZXcgSGUoTWUpfWZvcig7V2UoZVt5XSl8fCIuIj09PWVbeV07KSIuIiE9PWVbeV0/KF88MzQmJigiMCIhPT1lW3ldfHxvKSYmKG98fChsPWEpLG89ITAsdVtnKytdPXBhcnNlSW50KGVbeV0sMTApLF8rPTEpLG8mJihjKz0xKSxpJiYoZis9MSksYSs9MSx5Kz0xKTooaSYmcWUoZSwiY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcyIpLGk9ITAseSs9MSk7aWYoaSYmIWEpdGhyb3cgbmV3IFooZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7aWYoImUiPT09ZVt5XXx8IkUiPT09ZVt5XSl7Y29uc3QgdD1lLnN1YnN0cigrK3kpLm1hdGNoKEplKTtpZighdHx8IXRbMl0pcmV0dXJuIG5ldyBIZShNZSk7Yj1wYXJzZUludCh0WzBdLDEwKSx5Kz10WzBdLmxlbmd0aH1pZihlW3ldKXJldHVybiBuZXcgSGUoTWUpO2lmKF8pe2lmKGg9Xy0xLHM9YywxIT09cylmb3IoOyIwIj09PWVbbCtzLTErTnVtYmVyKHIpK051bWJlcihpKV07KXMtPTF9ZWxzZSB1WzBdPTAsYz0xLF89MSxzPTA7Zm9yKGI8PWYmJmY+YisxNjM4ND9iPUNlOmItPWY7Yj5EZTspe2lmKGgrPTEsaD49MzQpe2lmKDA9PT1zKXtiPURlO2JyZWFrfXFlKGUsIm92ZXJmbG93Iil9Yi09MX1pZih0LmFsbG93Um91bmRpbmcpe2Zvcig7YjxDZXx8XzxjOyl7aWYoMD09PWgmJnM8Xyl7Yj1DZSxzPTA7YnJlYWt9aWYoXzxjP2MtPTE6aC09MSxiPERlKWIrPTE7ZWxzZXtpZih1LmpvaW4oIiIpLm1hdGNoKC9eMCskLykpe2I9RGU7YnJlYWt9cWUoZSwib3ZlcmZsb3ciKX19aWYoaCsxPHMpe2xldCB0PWE7aSYmKGwrPTEsdCs9MSksciYmKGwrPTEsdCs9MSk7Y29uc3Qgbz1wYXJzZUludChlW2wraCsxXSwxMCk7bGV0IHM9MDtpZihvPj01JiYocz0xLDU9PT1vKSl7cz11W2hdJTI9PTE/MTowO2ZvcihsZXQgbj1sK2grMjtuPHQ7bisrKWlmKHBhcnNlSW50KGVbbl0sMTApKXtzPTE7YnJlYWt9fWlmKHMpe2xldCBlPWg7Zm9yKDtlPj0wJiYrK3VbZV0+OTtlLS0paWYodVtlXT0wLDA9PT1lKXtpZighKGI8RGUpKXJldHVybiBuZXcgSGUobj9WZTpQZSk7Yis9MSx1W2VdPTF9fX19ZWxzZXtmb3IoO2I8Q2V8fF88Yzspe2lmKDA9PT1oKXtpZigwPT09cyl7Yj1DZTticmVha31xZShlLCJleHBvbmVudCB1bmRlcmZsb3ciKX1fPGM/KCIwIiE9PWVbYy0xK051bWJlcihyKStOdW1iZXIoaSldJiYwIT09cyYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGMtPTEpOigwIT09dVtoXSYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGgtPTEpLGI8RGU/Yis9MTpxZShlLCJvdmVyZmxvdyIpfWlmKGgrMTxzKXtpJiYobCs9MSksciYmKGwrPTEpOzAhPT1wYXJzZUludChlW2wraCsxXSwxMCkmJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKX19aWYoZD1qZS5mcm9tTnVtYmVyKDApLHc9amUuZnJvbU51bWJlcigwKSwwPT09cylkPWplLmZyb21OdW1iZXIoMCksdz1qZS5mcm9tTnVtYmVyKDApO2Vsc2UgaWYoaDwxNyl7bGV0IGU9MDtmb3Iodz1qZS5mcm9tTnVtYmVyKHVbZSsrXSksZD1uZXcgamUoMCwwKTtlPD1oO2UrKyl3PXcubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLHc9dy5hZGQoamUuZnJvbU51bWJlcih1W2VdKSl9ZWxzZXtsZXQgZT0wO2ZvcihkPWplLmZyb21OdW1iZXIodVtlKytdKTtlPD1oLTE3O2UrKylkPWQubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLGQ9ZC5hZGQoamUuZnJvbU51bWJlcih1W2VdKSk7Zm9yKHc9amUuZnJvbU51bWJlcih1W2UrK10pO2U8PWg7ZSsrKXc9dy5tdWx0aXBseShqZS5mcm9tTnVtYmVyKDEwKSksdz13LmFkZChqZS5mcm9tTnVtYmVyKHVbZV0pKX1jb25zdCB4PWZ1bmN0aW9uKGUsdCl7aWYoIWUmJiF0KXJldHVybntoaWdoOmplLmZyb21OdW1iZXIoMCksbG93OmplLmZyb21OdW1iZXIoMCl9O2NvbnN0IG49ZS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLHI9bmV3IGplKGUuZ2V0TG93Qml0cygpLDApLGk9dC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLG89bmV3IGplKHQuZ2V0TG93Qml0cygpLDApO2xldCBzPW4ubXVsdGlwbHkoaSksYT1uLm11bHRpcGx5KG8pO2NvbnN0IGM9ci5tdWx0aXBseShpKTtsZXQgZj1yLm11bHRpcGx5KG8pO3JldHVybiBzPXMuYWRkKGEuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksYT1uZXcgamUoYS5nZXRMb3dCaXRzKCksMCkuYWRkKGMpLmFkZChmLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLHM9cy5hZGQoYS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxmPWEuc2hpZnRMZWZ0KDMyKS5hZGQobmV3IGplKGYuZ2V0TG93Qml0cygpLDApKSx7aGlnaDpzLGxvdzpmfX0oZCxqZS5mcm9tU3RyaW5nKCIxMDAwMDAwMDAwMDAwMDAwMDAiKSk7eC5sb3c9eC5sb3cuYWRkKHcpLGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmhpZ2g+Pj4wLHI9dC5oaWdoPj4+MDtpZihuPHIpcmV0dXJuITA7aWYobj09PXImJmUubG93Pj4+MDx0Lmxvdz4+PjApcmV0dXJuITA7cmV0dXJuITF9KHgubG93LHcpJiYoeC5oaWdoPXguaGlnaC5hZGQoamUuZnJvbU51bWJlcigxKSkpLHA9Yis2MTc2O2NvbnN0IEU9e2xvdzpqZS5mcm9tTnVtYmVyKDApLGhpZ2g6amUuZnJvbU51bWJlcigwKX07eC5oaWdoLnNoaWZ0UmlnaHRVbnNpZ25lZCg0OSkuYW5kKGplLmZyb21OdW1iZXIoMSkpLmVxdWFscyhqZS5mcm9tTnVtYmVyKDEpKT8oRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDMpLnNoaWZ0TGVmdCg2MSkpLEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbU51bWJlcihwKS5hbmQoamUuZnJvbU51bWJlcigxNjM4Mykuc2hpZnRMZWZ0KDQ3KSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDB4N2ZmZmZmZmZmZmZmKSkpKTooRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDE2MzgzJnApLnNoaWZ0TGVmdCg0OSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDU2Mjk0OTk1MzQyMTMxMSkpKSksRS5sb3c9eC5sb3csbiYmKEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbVN0cmluZygiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKSk7Y29uc3QgVT1fZS5hbGxvY2F0ZVVuc2FmZSgxNik7cmV0dXJuIHk9MCxVW3krK109MjU1JkUubG93LmxvdyxVW3krK109RS5sb3cubG93Pj44JjI1NSxVW3krK109RS5sb3cubG93Pj4xNiYyNTUsVVt5KytdPUUubG93Lmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5sb3cuaGlnaCxVW3krK109RS5sb3cuaGlnaD4+OCYyNTUsVVt5KytdPUUubG93LmhpZ2g+PjE2JjI1NSxVW3krK109RS5sb3cuaGlnaD4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmxvdyxVW3krK109RS5oaWdoLmxvdz4+OCYyNTUsVVt5KytdPUUuaGlnaC5sb3c+PjE2JjI1NSxVW3krK109RS5oaWdoLmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmhpZ2gsVVt5KytdPUUuaGlnaC5oaWdoPj44JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjE2JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjI0JjI1NSxuZXcgSGUoVSl9dG9TdHJpbmcoKXtsZXQgZSx0PTA7Y29uc3Qgbj1uZXcgQXJyYXkoMzYpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV09MDtsZXQgcixpLG8scz0wLGE9ITEsYz17cGFydHM6WzAsMCwwLDBdfTtjb25zdCBmPVtdO3M9MDtjb25zdCBsPXRoaXMuYnl0ZXMsdT1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNCxfPWxbcysrXXxsW3MrK108PDh8bFtzKytdPDwxNnxsW3MrK108PDI0LGc9bFtzKytdfGxbcysrXTw8OHxsW3MrK108PDE2fGxbcysrXTw8MjQsaD1sW3MrK118bFtzKytdPDw4fGxbcysrXTw8MTZ8bFtzKytdPDwyNDtzPTA7KHtsb3c6bmV3IGplKHUsXyksaGlnaDpuZXcgamUoZyxoKX0pLmhpZ2gubGVzc1RoYW4oamUuWkVSTykmJmYucHVzaCgiLSIpO2NvbnN0IGI9aD4+MjYmMzE7aWYoYj4+Mz09Myl7aWYoMzA9PT1iKXJldHVybiBmLmpvaW4oIiIpKyJJbmZpbml0eSI7aWYoMzE9PT1iKXJldHVybiJOYU4iO2U9aD4+MTUmMTYzODMscj04KyhoPj4xNCYxKX1lbHNlIHI9aD4+MTQmNyxlPWg+PjE3JjE2MzgzO2NvbnN0IGQ9ZS02MTc2O2lmKGMucGFydHNbMF09KDE2MzgzJmgpKygoMTUmcik8PDE0KSxjLnBhcnRzWzFdPWcsYy5wYXJ0c1syXT1fLGMucGFydHNbM109dSwwPT09Yy5wYXJ0c1swXSYmMD09PWMucGFydHNbMV0mJjA9PT1jLnBhcnRzWzJdJiYwPT09Yy5wYXJ0c1szXSlhPSEwO2Vsc2UgZm9yKG89MztvPj0wO28tLSl7bGV0IGU9MDtjb25zdCB0PVllKGMpO2lmKGM9dC5xdW90aWVudCxlPXQucmVtLmxvdyxlKWZvcihpPTg7aT49MDtpLS0pbls5Km8raV09ZSUxMCxlPU1hdGguZmxvb3IoZS8xMCl9aWYoYSl0PTEsbltzXT0wO2Vsc2UgZm9yKHQ9MzY7IW5bc107KXQtPTEscys9MTtjb25zdCB3PXQtMStkO2lmKHc+PTM0fHx3PD0tN3x8ZD4wKXtpZih0PjM0KXJldHVybiBmLnB1c2goIjAiKSxkPjA/Zi5wdXNoKGBFKyR7ZH1gKTpkPDAmJmYucHVzaChgRSR7ZH1gKSxmLmpvaW4oIiIpO2YucHVzaChgJHtuW3MrK119YCksdC09MSx0JiZmLnB1c2goIi4iKTtmb3IobGV0IGU9MDtlPHQ7ZSsrKWYucHVzaChgJHtuW3MrK119YCk7Zi5wdXNoKCJFIiksdz4wP2YucHVzaChgKyR7d31gKTpmLnB1c2goYCR7d31gKX1lbHNlIGlmKGQ+PTApZm9yKGxldCBlPTA7ZTx0O2UrKylmLnB1c2goYCR7bltzKytdfWApO2Vsc2V7bGV0IGU9dCtkO2lmKGU+MClmb3IobGV0IHQ9MDt0PGU7dCsrKWYucHVzaChgJHtuW3MrK119YCk7ZWxzZSBmLnB1c2goIjAiKTtmb3IoZi5wdXNoKCIuIik7ZSsrPDA7KWYucHVzaCgiMCIpO2ZvcihsZXQgcj0wO3I8dC1NYXRoLm1heChlLTEsMCk7cisrKWYucHVzaChgJHtuW3MrK119YCl9cmV0dXJuIGYuam9pbigiIil9dG9KU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JG51bWJlckRlY2ltYWw6dGhpcy50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gSGUuZnJvbVN0cmluZyhlLiRudW1iZXJEZWNpbWFsKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IERlY2ltYWwxMjgoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0pYH19Y2xhc3MgS2UgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRvdWJsZSJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSxlIGluc3RhbmNlb2YgTnVtYmVyJiYoZT1lLnZhbHVlT2YoKSksdGhpcy52YWx1ZT0rZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU51bWJlcihlKTtpZigiTmFOIj09PWUpcmV0dXJuIG5ldyBLZShOYU4pO2lmKCJJbmZpbml0eSI9PT1lKXJldHVybiBuZXcgS2UoMS8wKTtpZigiLUluZmluaXR5Ij09PWUpcmV0dXJuIG5ldyBLZSgtMS8wKTtpZighTnVtYmVyLmlzRmluaXRlKHQpKXRocm93IG5ldyBaKGBJbnB1dDogJHtlfSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIERvdWJsZWApO2lmKGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyB3aGl0ZXNwYWNlYCk7aWYoIiI9PT1lKXRocm93IG5ldyBaKCJJbnB1dCBpcyBhbiBlbXB0eSBzdHJpbmciKTtpZigvW14tMC05LitlRV0vLnRlc3QoZSkpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbm90IGluIGRlY2ltYWwgb3IgZXhwb25lbnRpYWwgbm90YXRpb25gKTtyZXR1cm4gbmV3IEtlKHQpfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b0pTT04oKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZyhlKXtyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZyhlKX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmKGUubGVnYWN5fHxlLnJlbGF4ZWQmJmlzRmluaXRlKHRoaXMudmFsdWUpKT90aGlzLnZhbHVlOk9iamVjdC5pcyhNYXRoLnNpZ24odGhpcy52YWx1ZSksLTApP3skbnVtYmVyRG91YmxlOiItMC4wIn06eyRudW1iZXJEb3VibGU6TnVtYmVyLmlzSW50ZWdlcih0aGlzLnZhbHVlKT90aGlzLnZhbHVlLnRvRml4ZWQoMSk6dGhpcy52YWx1ZS50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2NvbnN0IG49cGFyc2VGbG9hdChlLiRudW1iZXJEb3VibGUpO3JldHVybiB0JiZ0LnJlbGF4ZWQ/bjpuZXcgS2Uobil9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgRG91YmxlKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBaZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iSW50MzIifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9MHwrZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU5lKGUpLG49TnVtYmVyKGUpO2lmKG08bil0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZihTPm4pdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBJbnQzMmApO2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtpZihuLnRvU3RyaW5nKCkhPT10KXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHZhbGlkIEludDMyIHN0cmluZ2ApO3JldHVybiBuZXcgWmUobil9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5yZWxheGVkfHxlLmxlZ2FjeSk/dGhpcy52YWx1ZTp7JG51bWJlckludDp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7cmV0dXJuIHQmJnQucmVsYXhlZD9wYXJzZUludChlLiRudW1iZXJJbnQsMTApOm5ldyBaZShlLiRudW1iZXJJbnQpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEludDMyKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBHZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWF4S2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWF4S2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBHZX1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNYXhLZXkoKSJ9fWNsYXNzIFhlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJNaW5LZXkifXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRtaW5LZXk6MX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oKXtyZXR1cm4gbmV3IFhlfWluc3BlY3QoKXtyZXR1cm4ibmV3IE1pbktleSgpIn19bGV0IFFlPW51bGw7Y29uc3QgZXQ9bmV3IFdlYWtNYXA7Y2xhc3MgdHQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk9iamVjdElkIn1zdGF0aWMgaW5kZXg9TWF0aC5mbG9vcigxNjc3NzIxNSpNYXRoLnJhbmRvbSgpKTtzdGF0aWMgY2FjaGVIZXhTdHJpbmc7YnVmZmVyO2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKHN1cGVyKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYiaWQiaW4gZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmlkJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUuaWQpKXRocm93IG5ldyBaKCJBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBoYXZlIGFuIGlkIHRoYXQgaXMgb2YgdHlwZSBzdHJpbmcgb3IgQnVmZmVyIik7dD0idG9IZXhTdHJpbmciaW4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmc/X2UuZnJvbUhleChlLnRvSGV4U3RyaW5nKCkpOmUuaWR9ZWxzZSB0PWU7aWYobnVsbD09dCl0aGlzLmJ1ZmZlcj10dC5nZW5lcmF0ZSgpO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYxMj09PXQuYnl0ZUxlbmd0aCl0aGlzLmJ1ZmZlcj1fZS50b0xvY2FsQnVmZmVyVHlwZSh0KTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NlcHRlZCB0eXBlcyIpO2lmKCF0dC52YWxpZGF0ZUhleFN0cmluZyh0KSl0aHJvdyBuZXcgWigiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLmJ1ZmZlcj1fZS5mcm9tSGV4KHQpLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyx0KX19Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxfZS50b0hleChlKSl9c3RhdGljIHZhbGlkYXRlSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8MjQ7dCsrKXtjb25zdCBuPWUuY2hhckNvZGVBdCh0KTtpZighKG4+PTQ4JiZuPD01N3x8bj49OTcmJm48PTEwMnx8bj49NjUmJm48PTcwKSlyZXR1cm4hMX1yZXR1cm4hMH10b0hleFN0cmluZygpe2lmKHR0LmNhY2hlSGV4U3RyaW5nKXtjb25zdCBlPWV0LmdldCh0aGlzKTtpZihlKXJldHVybiBlfWNvbnN0IGU9X2UudG9IZXgodGhpcy5pZCk7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxlKSxlfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gdHQuaW5kZXg9KHR0LmluZGV4KzEpJTE2Nzc3MjE1fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PXR0LmdldEluYygpLG49X2UuYWxsb2NhdGVVbnNhZmUoMTIpO3JldHVybiBwZS5zZXRJbnQzMkJFKG4sMCxlKSxudWxsPT09UWUmJihRZT1fZS5yYW5kb21CeXRlcyg1KSksbls0XT1RZVswXSxuWzVdPVFlWzFdLG5bNl09UWVbMl0sbls3XT1RZVszXSxuWzhdPVFlWzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+PjgmMjU1LG5bOV09dD4+MTYmMjU1LG59dG9TdHJpbmcoZSl7cmV0dXJuImJhc2U2NCI9PT1lP19lLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfXN0YXRpYyBpcyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJPYmplY3RJZCI9PT1lLl9ic29udHlwZX1lcXVhbHMoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZih0dC5pcyhlKSlyZXR1cm4gdGhpcy5idWZmZXJbMTFdPT09ZS5idWZmZXJbMTFdJiZfZS5lcXVhbHModGhpcy5idWZmZXIsZS5idWZmZXIpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9cGUuZ2V0VWludDMyQkUodGhpcy5idWZmZXIsMCk7cmV0dXJuIGUuc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0KSksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IHR0fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmJ1ZmZlclswXSxlW3QrMV09dGhpcy5idWZmZXJbMV0sZVt0KzJdPXRoaXMuYnVmZmVyWzJdLGVbdCszXT10aGlzLmJ1ZmZlclszXSxlW3QrNF09dGhpcy5idWZmZXJbNF0sZVt0KzVdPXRoaXMuYnVmZmVyWzVdLGVbdCs2XT10aGlzLmJ1ZmZlcls2XSxlW3QrN109dGhpcy5idWZmZXJbN10sZVt0KzhdPXRoaXMuYnVmZmVyWzhdLGVbdCs5XT10aGlzLmJ1ZmZlcls5XSxlW3QrMTBdPXRoaXMuYnVmZmVyWzEwXSxlW3QrMTFdPXRoaXMuYnVmZmVyWzExXSwxMn1zdGF0aWMgY3JlYXRlRnJvbVRpbWUoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZSgxMik7Zm9yKGxldCBlPTExO2U+PTQ7ZS0tKXRbZV09MDtyZXR1cm4gcGUuc2V0SW50MzJCRSh0LDAsZSksbmV3IHR0KHQpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXRocm93IG5ldyBaKCJoZXggc3RyaW5nIG11c3QgYmUgMjQgY2hhcmFjdGVycyIpO3JldHVybiBuZXcgdHQoX2UuZnJvbUhleChlKSl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSl7aWYoMTYhPT1lPy5sZW5ndGgpdGhyb3cgbmV3IFooImJhc2U2NCBzdHJpbmcgbXVzdCBiZSAxNiBjaGFyYWN0ZXJzIik7cmV0dXJuIG5ldyB0dChfZS5mcm9tQmFzZTY0KGUpKX1zdGF0aWMgaXNWYWxpZChlKXtpZihudWxsPT1lKXJldHVybiExO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdHQudmFsaWRhdGVIZXhTdHJpbmcoZSk7dHJ5e3JldHVybiBuZXcgdHQoZSksITB9Y2F0Y2h7cmV0dXJuITF9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMudG9IZXhTdHJpbmc/eyRvaWQ6dGhpcy50b0hleFN0cmluZygpfTp7JG9pZDp0aGlzLnRvU3RyaW5nKCJoZXgiKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyB0dChlLiRvaWQpfWlzQ2FjaGVkKCl7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5oYXModGhpcyl9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgT2JqZWN0SWQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19ZnVuY3Rpb24gbnQoZSx0LG4pe2xldCByPTU7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKylyKz1ydChpLnRvU3RyaW5nKCksZVtpXSx0LCEwLG4pO2Vsc2V7ImZ1bmN0aW9uIj09dHlwZW9mIGU/LnRvQlNPTiYmKGU9ZS50b0JTT04oKSk7Zm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZSkpcis9cnQoaSxlW2ldLHQsITEsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gcnQoZSx0LG49ITEscj0hMSxpPSExKXtzd2l0Y2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/LnRvQlNPTiYmKHQ9dC50b0JTT04oKSksdHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gMStfZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzQrX2UudXRmOEJ5dGVMZW5ndGgodCkrMTtjYXNlIm51bWJlciI6cmV0dXJuIE1hdGguZmxvb3IodCk9PT10JiZ0Pj1VJiZ0PD1FJiZ0Pj1TJiZ0PD1tPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiByfHwhaT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE6MDtjYXNlImJvb2xlYW4iOnJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMjtjYXNlIm9iamVjdCI6aWYobnVsbCE9dCYmInN0cmluZyI9PXR5cGVvZiB0Ll9ic29udHlwZSYmdFt5XSE9PXApdGhyb3cgbmV3IEc7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE7aWYoIk9iamVjdElkIj09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTM7aWYodCBpbnN0YW5jZW9mIERhdGV8fGQodCkpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnKHQpKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNit0LmJ5dGVMZW5ndGg7aWYoIkxvbmciPT09dC5fYnNvbnR5cGV8fCJEb3VibGUiPT09dC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKCJEZWNpbWFsMTI4Ij09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTc7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpcmV0dXJuIG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0KzQrX2UudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzErbnQodC5zY29wZSxuLGkpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQuY29kZS50b1N0cmluZygpKSsxO2lmKCJCaW5hcnkiPT09dC5fYnNvbnR5cGUpe2NvbnN0IG49dDtyZXR1cm4gbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKyhuLnBvc2l0aW9uKzErNCsxKzQpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrKG4ucG9zaXRpb24rMSs0KzEpfWlmKCJTeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKStfZS51dGY4Qnl0ZUxlbmd0aCh0LnZhbHVlKSs0KzErMTtpZigiREJSZWYiPT09dC5fYnNvbnR5cGUpe2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7JHJlZjp0LmNvbGxlY3Rpb24sJGlkOnQub2lkfSx0LmZpZWxkcyk7cmV0dXJuIG51bGwhPXQuZGImJihyLiRkYj10LmRiKSwobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErbnQocixuLGkpfXJldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfHxoKHQpPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMStfZS51dGY4Qnl0ZUxlbmd0aCh0LnNvdXJjZSkrMSsodC5nbG9iYWw/MTowKSsodC5pZ25vcmVDYXNlPzE6MCkrKHQubXVsdGlsaW5lPzE6MCkrMToiQlNPTlJlZ0V4cCI9PT10Ll9ic29udHlwZT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErX2UudXRmOEJ5dGVMZW5ndGgodC5wYXR0ZXJuKSsxK19lLnV0ZjhCeXRlTGVuZ3RoKHQub3B0aW9ucykrMToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApK250KHQsbixpKSsxO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQudG9TdHJpbmcoKSkrMTowO2Nhc2UiYmlnaW50IjpyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBKUyB0eXBlOiAiK3R5cGVvZiB0KX19Y2xhc3MgaXQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05SZWdFeHAifXBhdHRlcm47b3B0aW9ucztjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksdGhpcy5wYXR0ZXJuPWUsdGhpcy5vcHRpb25zPSh0Pz8iIikuc3BsaXQoIiIpLnNvcnQoKS5qb2luKCIiKSwtMSE9PXRoaXMucGF0dGVybi5pbmRleE9mKCJcMCIpKXRocm93IG5ldyBaKGBCU09OIFJlZ2V4IHBhdHRlcm5zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGF0dGVybil9YCk7aWYoLTEhPT10aGlzLm9wdGlvbnMuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyBaKGBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbJHt0aGlzLm9wdGlvbnNbZV19XSBpcyBub3Qgc3VwcG9ydGVkYCl9c3RhdGljIHBhcnNlT3B0aW9ucyhlKXtyZXR1cm4gZT9lLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik6IiJ9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuKGU9ZXx8e30pLmxlZ2FjeT97JHJlZ2V4OnRoaXMucGF0dGVybiwkb3B0aW9uczp0aGlzLm9wdGlvbnN9OnskcmVndWxhckV4cHJlc3Npb246e3BhdHRlcm46dGhpcy5wYXR0ZXJuLG9wdGlvbnM6dGhpcy5vcHRpb25zfX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7aWYoIiRyZWdleCJpbiBlKXtpZigic3RyaW5nIj09dHlwZW9mIGUuJHJlZ2V4KXJldHVybiBuZXcgaXQoZS4kcmVnZXgsaXQucGFyc2VPcHRpb25zKGUuJG9wdGlvbnMpKTtpZigiQlNPTlJlZ0V4cCI9PT1lLiRyZWdleC5fYnNvbnR5cGUpcmV0dXJuIGV9aWYoIiRyZWd1bGFyRXhwcmVzc2lvbiJpbiBlKXJldHVybiBuZXcgaXQoZS4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybixpdC5wYXJzZU9wdGlvbnMoZS4kcmVndWxhckV4cHJlc3Npb24ub3B0aW9ucykpO3Rocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJTT05SZWdFeHAgRUpTT04gb2JqZWN0IGZvcm06ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCl9aW5zcGVjdChlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHlsaXplImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0eWxpemUpcmV0dXJuIGUuc3R5bGl6ZX0odCk/PyhlPT5lKTtuPz89dztyZXR1cm5gbmV3IEJTT05SZWdFeHAoJHtyKG4odGhpcy5wYXR0ZXJuKSwicmVnZXhwIil9LCAke3Iobih0aGlzLm9wdGlvbnMpLCJyZWdleHAiKX0pYH19Y2xhc3Mgb3QgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05TeW1ib2wifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy52YWx1ZT1lfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRzeW1ib2w6dGhpcy52YWx1ZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBvdChlLiRzeW1ib2wpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEJTT05TeW1ib2woJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNvbnN0IHN0PWplO2NsYXNzIGF0IGV4dGVuZHMgc3R7Z2V0IF9ic29udHlwZSgpe3JldHVybiJUaW1lc3RhbXAifWdldFtnZV0oKXtyZXR1cm4iVGltZXN0YW1wIn1zdGF0aWMgTUFYX1ZBTFVFPWplLk1BWF9VTlNJR05FRF9WQUxVRTtnZXQgaSgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0IHQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1jb25zdHJ1Y3RvcihlKXtpZihudWxsPT1lKXN1cGVyKDAsMCwhMCk7ZWxzZSBpZigiYmlnaW50Ij09dHlwZW9mIGUpc3VwZXIoZSwhMCk7ZWxzZSBpZihqZS5pc0xvbmcoZSkpc3VwZXIoZS5sb3csZS5oaWdoLCEwKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ISgidCJpbiBlKXx8ISgiaSJpbiBlKSl0aHJvdyBuZXcgWigiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyBaKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBhcyBhIG51bWJlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgZS5pJiYoIm9iamVjdCIhPXR5cGVvZiBlLml8fCJJbnQzMiIhPT1lLmkuX2Jzb250eXBlKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGkgYXMgYSBudW1iZXIiKTtjb25zdCB0PU51bWJlcihlLnQpLG49TnVtYmVyKGUuaSk7aWYodDwwfHxOdW1iZXIuaXNOYU4odCkpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgaSIpO2lmKHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgZXF1YWwgb3IgbGVzcyB0aGFuIHVpbnQzMiBtYXgiKTtpZihuPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBhdChqZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGF0KGplLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgYXQoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgYXQoamUuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9amUuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPWplLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBhdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz13O3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgY3Q9amUuZnJvbU51bWJlcihFKSxmdD1qZS5mcm9tTnVtYmVyKFUpO2Z1bmN0aW9uIGx0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9cGUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgWihgYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgJHtpfWApO2lmKHQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoPGkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCBiZSA+PSBic29uIHNpemUgJHtpfWApO2lmKCF0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aCE9PWkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKGAoYnNvbiBzaXplICR7aX0gKyBvcHRpb25zLmluZGV4ICR7cn0gbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoICR7ZS5ieXRlTGVuZ3RofSlgKTtpZigwIT09ZVtyK2ktMV0pdGhyb3cgbmV3IFooIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMCIpO3JldHVybiBfdChlLHIsdCxuKX1jb25zdCB1dD0vXlwkcmVmJHxeXCRpZCR8XlwkZGIkLztmdW5jdGlvbiBfdChlLHQsbixyPSExKXtjb25zdCBpPW51bGw9PW4uZmllbGRzQXNSYXc/bnVsbDpuLmZpZWxkc0FzUmF3LG89bnVsbCE9bi5yYXcmJm4ucmF3LHM9ImJvb2xlYW4iPT10eXBlb2Ygbi5ic29uUmVnRXhwJiZuLmJzb25SZWdFeHAsYT1uLnByb21vdGVCdWZmZXJzPz8hMSxjPW4ucHJvbW90ZUxvbmdzPz8hMCxmPW4ucHJvbW90ZVZhbHVlcz8/ITAsbD1uLnVzZUJpZ0ludDY0Pz8hMTtpZihsJiYhZil0aHJvdyBuZXcgWigiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYobCYmIWMpdGhyb3cgbmV3IFooIk11c3QgZWl0aGVyIHJlcXVlc3QgYmlnaW50IG9yIExvbmcgZm9yIGludDY0IGRlc2VyaWFsaXphdGlvbiIpO2xldCB1LF8sZz0hMDtjb25zdCBoPShudWxsPT1uLnZhbGlkYXRpb24/e3V0Zjg6ITB9Om4udmFsaWRhdGlvbikudXRmODtpZigiYm9vbGVhbiI9PXR5cGVvZiBoKXU9aDtlbHNle2c9ITE7Y29uc3QgZT1PYmplY3Qua2V5cyhoKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoW2VdfSkpO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWigiVVRGLTggdmFsaWRhdGlvbiBzZXR0aW5nIGNhbm5vdCBiZSBlbXB0eSIpO2lmKCJib29sZWFuIiE9dHlwZW9mIGVbMF0pdGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24sIG11c3Qgc3BlY2lmeSBib29sZWFuIHZhbHVlcyIpO2lmKHU9ZVswXSwhZS5ldmVyeSgoZT0+ZT09PXUpKSl0aHJvdyBuZXcgWigiSW52YWxpZCBVVEYtOCB2YWxpZGF0aW9uIG9wdGlvbiAtIGtleXMgbXVzdCBiZSBhbGwgdHJ1ZSBvciBhbGwgZmFsc2UiKX1pZighZyl7Xz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKGgpKV8uYWRkKGUpfWNvbnN0IGI9dDtpZihlLmxlbmd0aDw1KXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSA8IDUgYnl0ZXMgbG9uZyIpO2NvbnN0IGQ9cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsZDw1fHxkPmUubGVuZ3RoKXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSIpO2NvbnN0IHc9cj9bXTp7fTtsZXQgcD0wLHk9IXImJm51bGw7Zm9yKDs7KXtjb25zdCBoPWVbdCsrXTtpZigwPT09aClicmVhaztsZXQgYj10O2Zvcig7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCBkPXI/cCsrOl9lLnRvVVRGOChlLHQsYiwhMSk7bGV0IG0sUz0hMDtpZihTPWd8fF8/LmhhcyhkKT91OiF1LCExIT09eSYmIiQiPT09ZFswXSYmKHk9dXQudGVzdChkKSksdD1iKzEsaD09PU4pe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTttPV9lLnRvVVRGOChlLHQsdCtuLTEsUyksdCs9bn1lbHNlIGlmKGg9PT1MKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IHI9MDtyPDEyO3IrKyluW3JdPWVbdCtyXTttPW5ldyB0dChuKSx0Kz0xMn1lbHNlIGlmKGg9PT1NJiYhMT09PWYpbT1uZXcgWmUocGUuZ2V0SW50MzJMRShlLHQpKSx0Kz00O2Vsc2UgaWYoaD09PU0pbT1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NDtlbHNlIGlmKGg9PT1PKW09cGUuZ2V0RmxvYXQ2NExFKGUsdCksdCs9OCwhMT09PWYmJihtPW5ldyBLZShtKSk7ZWxzZSBpZihoPT09Uil7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCkscj1wZS5nZXRJbnQzMkxFKGUsdCs0KTt0Kz04LG09bmV3IERhdGUobmV3IGplKG4scikudG9OdW1iZXIoKSl9ZWxzZSBpZihoPT09QSl7aWYoMCE9PWVbdF0mJjEhPT1lW3RdKXRocm93IG5ldyBaKCJpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZSIpO209MT09PWVbdCsrXX1lbHNlIGlmKGg9PT1JKXtjb25zdCByPXQsaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYoaTw9MHx8aT5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24iKTtpZihvKW09ZS5zdWJhcnJheSh0LHQraSk7ZWxzZXtsZXQgdD1uO2d8fCh0PXsuLi5uLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscix0LCExKX10Kz1pfWVsc2UgaWYoaD09PXYpe2NvbnN0IHI9dCxvPXBlLmdldEludDMyTEUoZSx0KTtsZXQgcz1uO2NvbnN0IGE9dCtvO2lmKGkmJmlbZF0mJihzPXsuLi5uLHJhdzohMH0pLGd8fChzPXsuLi5zLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscixzLCEwKSwwIT09ZVsodCs9byktMV0pdGhyb3cgbmV3IFooImludmFsaWQgYXJyYXkgdGVybWluYXRvciBieXRlIik7aWYodCE9PWEpdGhyb3cgbmV3IFooImNvcnJ1cHRlZCBhcnJheSBic29uIil9ZWxzZSBpZihoPT09JCltPXZvaWQgMDtlbHNlIGlmKGg9PT1qKW09bnVsbDtlbHNlIGlmKGg9PT1QKWlmKGwpbT1wZS5nZXRCaWdJbnQ2NExFKGUsdCksdCs9ODtlbHNle2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpLHI9cGUuZ2V0SW50MzJMRShlLHQrNCk7dCs9ODtjb25zdCBpPW5ldyBqZShuLHIpO209YyYmITA9PT1mJiZpLmxlc3NUaGFuT3JFcXVhbChjdCkmJmkuZ3JlYXRlclRoYW5PckVxdWFsKGZ0KT9pLnRvTnVtYmVyKCk6aX1lbHNlIGlmKGg9PT1KKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyluW3JdPWVbdCtyXTt0Kz0xNixtPW5ldyBIZShuKX1lbHNlIGlmKGg9PT1UKXtsZXQgbj1wZS5nZXRJbnQzMkxFKGUsdCk7dCs9NDtjb25zdCByPW4saT1lW3QrK107aWYobjwwKXRocm93IG5ldyBaKCJOZWdhdGl2ZSBiaW5hcnkgdHlwZSBlbGVtZW50IHNpemUgZm91bmQiKTtpZihuPmUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgc2l6ZSBsYXJnZXIgdGhhbiBkb2N1bWVudCBzaXplIik7aWYoaT09PXllLlNVQlRZUEVfQllURV9BUlJBWSl7aWYobj1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NCxuPDApdGhyb3cgbmV3IFooIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyIik7aWYobj5yLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBsb25nIGJpbmFyeSBzaXplIik7aWYobjxyLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBzaG9ydCBiaW5hcnkgc2l6ZSIpfWEmJmY/bT1fZS50b0xvY2FsQnVmZmVyVHlwZShlLnN1YmFycmF5KHQsdCtuKSk6KG09bmV3IHllKGUuc3ViYXJyYXkodCx0K24pLGkpLGk9PT1IJiZ4ZS5pc1ZhbGlkKG0pJiYobT1tLnRvVVVJRCgpKSksdCs9bn1lbHNlIGlmKGg9PT1GJiYhMT09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxO2NvbnN0IGk9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IoYj0wO2I8ci5sZW5ndGg7YisrKXN3aXRjaChyW2JdKXtjYXNlIm0iOmlbYl09Im0iO2JyZWFrO2Nhc2UicyI6aVtiXT0iZyI7YnJlYWs7Y2FzZSJpIjppW2JdPSJpIn1tPW5ldyBSZWdFeHAobixpLmpvaW4oIiIpKX1lbHNlIGlmKGg9PT1GJiYhMD09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxLG09bmV3IGl0KG4scil9ZWxzZSBpZihoPT09RCl7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9X2UudG9VVEY4KGUsdCx0K24tMSxTKTttPWY/cjpuZXcgb3QociksdCs9bn1lbHNlIGlmKGg9PT1WKW09bmV3IGF0KHtpOnBlLmdldFVpbnQzMkxFKGUsdCksdDpwZS5nZXRVaW50MzJMRShlLHQrNCl9KSx0Kz04O2Vsc2UgaWYoaD09PVcpbT1uZXcgWGU7ZWxzZSBpZihoPT09WSltPW5ldyBHZTtlbHNlIGlmKGg9PT16KXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LHQrbi0xLFMpO209bmV3IEVlKHIpLHQrPW59ZWxzZSBpZihoPT09Qyl7Y29uc3Qgcj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxyPDEzKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoIik7Y29uc3QgaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxpPD0wfHxpPmUubGVuZ3RoLXR8fDAhPT1lW3QraS0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IG89X2UudG9VVEY4KGUsdCx0K2ktMSxTKSxzPXQrPWksYT1wZS5nZXRJbnQzMkxFKGUsdCksYz1fdChlLHMsbiwhMSk7aWYodCs9YSxyPDgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gc2hvcnQsIHRydW5jYXRpbmcgc2NvcGUiKTtpZihyPjgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQiKTttPW5ldyBFZShvLGMpfWVsc2V7aWYoaCE9PWspdGhyb3cgbmV3IFooYERldGVjdGVkIHVua25vd24gQlNPTiB0eXBlICR7aC50b1N0cmluZygxNil9IGZvciBmaWVsZG5hbWUgIiR7ZH0iYCk7e2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPV9lLnRvVVRGOChlLHQsdCtuLTEsUyk7dCs9bjtjb25zdCBpPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IG49MDtuPDEyO24rKylpW25dPWVbdCtuXTtjb25zdCBvPW5ldyB0dChpKTt0Kz0xMixtPW5ldyBPZShyLG8pfX0iX19wcm90b19fIj09PWQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHcsZCx7dmFsdWU6bSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOndbZF09bX1pZihkIT09dC1iKXtpZihyKXRocm93IG5ldyBaKCJjb3JydXB0IGFycmF5IGJzb24iKTt0aHJvdyBuZXcgWigiY29ycnVwdCBvYmplY3QgYnNvbiIpfWlmKCF5KXJldHVybiB3O2lmKFVlKHcpKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe30sdyk7cmV0dXJuIGRlbGV0ZSBlLiRyZWYsZGVsZXRlIGUuJGlkLGRlbGV0ZSBlLiRkYixuZXcgT2Uody4kcmVmLHcuJGlkLHcuJGRiLGUpfXJldHVybiB3fWNvbnN0IGd0PS9ceDAwLyxodD1uZXcgU2V0KFsiJGRiIiwiJHJlZiIsIiRpZCIsIiRjbHVzdGVyVGltZSJdKTtmdW5jdGlvbiBidChlLHQsbixyKXtlW3IrK109TjtlWyhyPXIrX2UuZW5jb2RlVVRGOEludG8oZSx0LHIpKzEpLTFdPTA7Y29uc3QgaT1fZS5lbmNvZGVVVEY4SW50byhlLG4scis0KTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSsxKSxyPXIrNCtpLGVbcisrXT0wLHJ9ZnVuY3Rpb24gZHQoZSx0LG4scil7Y29uc3QgaT0hT2JqZWN0LmlzKG4sLTApJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmbjw9bSYmbj49Uz9NOk87ZVtyKytdPWk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1pPT09TT9wZS5zZXRJbnQzMkxFKGUscixuKTpwZS5zZXRGbG9hdDY0TEUoZSxyLG4pfWZ1bmN0aW9uIHd0KGUsdCxuLHIpe2VbcisrXT1QO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9cGUuc2V0QmlnSW50NjRMRShlLHIsbil9ZnVuY3Rpb24gcHQoZSx0LG4scil7ZVtyKytdPWo7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHl0KGUsdCxuLHIpe2VbcisrXT1BO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsZVtyKytdPW4/MTowLHJ9ZnVuY3Rpb24gbXQoZSx0LG4scil7ZVtyKytdPVI7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9amUuZnJvbU51bWJlcihuLmdldFRpbWUoKSksbz1pLmdldExvd0JpdHMoKSxzPWkuZ2V0SGlnaEJpdHMoKTtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbykscis9cGUuc2V0SW50MzJMRShlLHIscyl9ZnVuY3Rpb24gU3QoZSx0LG4scil7ZVtyKytdPUY7aWYocis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLG4uc291cmNlJiZudWxsIT1uLnNvdXJjZS5tYXRjaChndCkpdGhyb3cgbmV3IFooInZhbHVlICIrbi5zb3VyY2UrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSxuLnNvdXJjZSxyKSxlW3IrK109MCxuLmlnbm9yZUNhc2UmJihlW3IrK109MTA1KSxuLmdsb2JhbCYmKGVbcisrXT0xMTUpLG4ubXVsdGlsaW5lJiYoZVtyKytdPTEwOSksZVtyKytdPTAscn1mdW5jdGlvbiBCdChlLHQsbixyKXtlW3IrK109RjtpZihyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsbnVsbCE9bi5wYXR0ZXJuLm1hdGNoKGd0KSl0aHJvdyBuZXcgWigicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPV9lLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1qOiJNaW5LZXkiPT09bi5fYnNvbnR5cGU/ZVtyKytdPVc6ZVtyKytdPVk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe2VbcisrXT1MO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gVXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9cGUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPXEsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gT3QoZSx0LG4scixpLG8scyxhLGMpe2lmKGMuaGFzKG4pKXRocm93IG5ldyBaKCJDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gQlNPTiIpO2MuYWRkKG4pLGVbcisrXT1BcnJheS5pc0FycmF5KG4pP3Y6STtyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7Y29uc3QgZj1GdChlLG4saSxyLG8rMSxzLGEsYyk7cmV0dXJuIGMuZGVsZXRlKG4pLGZ9ZnVuY3Rpb24gTnQoZSx0LG4scil7ZVtyKytdPUo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWVbcit0XT1uLmJ5dGVzW3RdO3JldHVybiByKzE2fWZ1bmN0aW9uIEl0KGUsdCxuLHIpe2VbcisrXT0iTG9uZyI9PT1uLl9ic29udHlwZT9QOlY7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5nZXRMb3dCaXRzKCksbz1uLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPXBlLnNldEludDMyTEUoZSxyLGkpLHIrPXBlLnNldEludDMyTEUoZSxyLG8pfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe249bi52YWx1ZU9mKCksZVtyKytdPU07cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1wZS5zZXRJbnQzMkxFKGUscixuKX1mdW5jdGlvbiBUdChlLHQsbixyKXtlW3IrK109TztyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPXBlLnNldEZsb2F0NjRMRShlLHIsbi52YWx1ZSl9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPXo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24gTHQoZSx0LG4scixpPSExLG89MCxzPSExLGE9ITAsYyl7aWYobi5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBuLnNjb3BlKXtlW3IrK109QztyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7bGV0IGY9cjtjb25zdCBsPW4uY29kZTtyKz00O2NvbnN0IHU9X2UuZW5jb2RlVVRGOEludG8oZSxsLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscix1KSxlW3IrNCt1LTFdPTAscj1yK3UrNDtjb25zdCBfPUZ0KGUsbi5zY29wZSxpLHIsbysxLHMsYSxjKTtyPV8tMTtjb25zdCBnPV8tZjtmKz1wZS5zZXRJbnQzMkxFKGUsZixnKSxlW3IrK109MH1lbHNle2VbcisrXT16O3IrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uY29kZS50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscixvKSxyPXIrNCtvLTEsZVtyKytdPTB9cmV0dXJuIHJ9ZnVuY3Rpb24gQXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5idWZmZXI7bGV0IG89bi5wb3NpdGlvbjtpZihuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZJiYobys9NCkscis9cGUuc2V0SW50MzJMRShlLHIsbyksZVtyKytdPW4uc3ViX3R5cGUsbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWSYmKG8tPTQscis9cGUuc2V0SW50MzJMRShlLHIsbykpLG4uc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUobiksbzw9MTYpZm9yKGxldCB0PTA7dDxvO3QrKyllW3IrdF09aVt0XTtlbHNlIGUuc2V0KGkscik7cmV0dXJuIHIrPW4ucG9zaXRpb259ZnVuY3Rpb24gUnQoZSx0LG4scil7ZVtyKytdPUQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9X2UuZW5jb2RlVVRGOEludG8oZSxuLnZhbHVlLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSkscj1yKzQraS0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24ganQoZSx0LG4scixpLG8scyl7ZVtyKytdPUk7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2xldCBhPXIsYz17JHJlZjpuLmNvbGxlY3Rpb258fG4ubmFtZXNwYWNlLCRpZDpuLm9pZH07bnVsbCE9bi5kYiYmKGMuJGRiPW4uZGIpLGM9T2JqZWN0LmFzc2lnbihjLG4uZmllbGRzKTtjb25zdCBmPUZ0KGUsYywhMSxyLGkrMSxvLCEwLHMpLGw9Zi1hO3JldHVybiBhKz1wZS5zZXRJbnQzMkxFKGUscixsKSxmfWZ1bmN0aW9uIEZ0KGUsdCxuLHIsaSxvLHMsYSl7aWYobnVsbD09YSl7aWYobnVsbD09dClyZXR1cm4gZVswXT01LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCw1O2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFooInNlcmlhbGl6ZSBkb2VzIG5vdCBzdXBwb3J0IGFuIGFycmF5IGFzIHRoZSByb290IGlucHV0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBaKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyBaKCJCU09OIHR5cGVzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIGEgZG9jdW1lbnQiKTtpZihkKHQpfHxoKHQpfHxfKHQpfHxnKHQpKXRocm93IG5ldyBaKCJkYXRlLCByZWdleHAsIHR5cGVkYXJyYXksIGFuZCBhcnJheWJ1ZmZlciBjYW5ub3QgYmUgQlNPTiBkb2N1bWVudHMiKTthPW5ldyBTZXR9YS5hZGQodCk7bGV0IGM9cis0O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IGY9YCR7cn1gO2xldCBsPXRbcl07ImZ1bmN0aW9uIj09dHlwZW9mIGw/LnRvQlNPTiYmKGw9bC50b0JTT04oKSk7Y29uc3QgdT10eXBlb2YgbDtpZih2b2lkIDA9PT1sKWM9cHQoZSxmLDAsYyk7ZWxzZSBpZihudWxsPT09bCljPXB0KGUsZiwwLGMpO2Vsc2UgaWYoInN0cmluZyI9PT11KWM9YnQoZSxmLGwsYyk7ZWxzZSBpZigibnVtYmVyIj09PXUpYz1kdChlLGYsbCxjKTtlbHNlIGlmKCJiaWdpbnQiPT09dSljPXd0KGUsZixsLGMpO2Vsc2UgaWYoImJvb2xlYW4iPT09dSljPXl0KGUsZixsLGMpO2Vsc2UgaWYoIm9iamVjdCI9PT11JiZudWxsPT1sLl9ic29udHlwZSljPWwgaW5zdGFuY2VvZiBEYXRlfHxkKGwpP210KGUsZixsLGMpOmwgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxfKGwpP1V0KGUsZixsLGMpOmwgaW5zdGFuY2VvZiBSZWdFeHB8fGgobCk/U3QoZSxmLGwsYyk6T3QoZSxmLGwsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIm9iamVjdCI9PT11KXtpZihsW3ldIT09cCl0aHJvdyBuZXcgRztpZigiT2JqZWN0SWQiPT09bC5fYnNvbnR5cGUpYz1FdChlLGYsbCxjKTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWwuX2Jzb250eXBlKWM9TnQoZSxmLGwsYyk7ZWxzZSBpZigiTG9uZyI9PT1sLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1sLl9ic29udHlwZSljPUl0KGUsZixsLGMpO2Vsc2UgaWYoIkRvdWJsZSI9PT1sLl9ic29udHlwZSljPVR0KGUsZixsLGMpO2Vsc2UgaWYoIkNvZGUiPT09bC5fYnNvbnR5cGUpYz1MdChlLGYsbCxjLG4saSxvLHMsYSk7ZWxzZSBpZigiQmluYXJ5Ij09PWwuX2Jzb250eXBlKWM9QXQoZSxmLGwsYyk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1sLl9ic29udHlwZSljPVJ0KGUsZixsLGMpO2Vsc2UgaWYoIkRCUmVmIj09PWwuX2Jzb250eXBlKWM9anQoZSxmLGwsYyxpLG8sYSk7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1sLl9ic29udHlwZSljPUJ0KGUsZixsLGMpO2Vsc2UgaWYoIkludDMyIj09PWwuX2Jzb250eXBlKWM9dnQoZSxmLGwsYyk7ZWxzZSBpZigiTWluS2V5Ij09PWwuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWwuX2Jzb250eXBlKWM9eHQoZSxmLGwsYyk7ZWxzZSBpZih2b2lkIDAhPT1sLl9ic29udHlwZSl0aHJvdyBuZXcgWihgVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAke1N0cmluZyhsLl9ic29udHlwZSl9YCl9ZWxzZSJmdW5jdGlvbiI9PT11JiZvJiYoYz0kdChlLGYsbCxjKSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgTWFwfHxiKHQpKXtjb25zdCByPXQuZW50cmllcygpO2xldCBmPSExO2Zvcig7IWY7KXtjb25zdCB0PXIubmV4dCgpO2lmKGY9ISF0LmRvbmUsZiljb250aW51ZTtjb25zdCBsPXQudmFsdWU/dC52YWx1ZVswXTp2b2lkIDA7bGV0IHU9dC52YWx1ZT90LnZhbHVlWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgdT8udG9CU09OJiYodT11LnRvQlNPTigpKTtjb25zdCBnPXR5cGVvZiB1O2lmKCJzdHJpbmciPT10eXBlb2YgbCYmIWh0LmhhcyhsKSl7aWYobnVsbCE9bC5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK2wrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1sWzBdKXRocm93IG5ldyBaKCJrZXkgIitsKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihsLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK2wrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT11KSExPT09cyYmKGM9cHQoZSxsLDAsYykpO2Vsc2UgaWYobnVsbD09PXUpYz1wdChlLGwsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09ZyljPWJ0KGUsbCx1LGMpO2Vsc2UgaWYoIm51bWJlciI9PT1nKWM9ZHQoZSxsLHUsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWcpYz13dChlLGwsdSxjKTtlbHNlIGlmKCJib29sZWFuIj09PWcpYz15dChlLGwsdSxjKTtlbHNlIGlmKCJvYmplY3QiPT09ZyYmbnVsbD09dS5fYnNvbnR5cGUpYz11IGluc3RhbmNlb2YgRGF0ZXx8ZCh1KT9tdChlLGwsdSxjKTp1IGluc3RhbmNlb2YgVWludDhBcnJheXx8Xyh1KT9VdChlLGwsdSxjKTp1IGluc3RhbmNlb2YgUmVnRXhwfHxoKHUpP1N0KGUsbCx1LGMpOk90KGUsbCx1LGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09Zyl7aWYodVt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PXUuX2Jzb250eXBlKWM9RXQoZSxsLHUsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT11Ll9ic29udHlwZSljPU50KGUsbCx1LGMpO2Vsc2UgaWYoIkxvbmciPT09dS5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dS5fYnNvbnR5cGUpYz1JdChlLGwsdSxjKTtlbHNlIGlmKCJEb3VibGUiPT09dS5fYnNvbnR5cGUpYz1UdChlLGwsdSxjKTtlbHNlIGlmKCJDb2RlIj09PXUuX2Jzb250eXBlKWM9THQoZSxsLHUsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT11Ll9ic29udHlwZSljPUF0KGUsbCx1LGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09dS5fYnNvbnR5cGUpYz1SdChlLGwsdSxjKTtlbHNlIGlmKCJEQlJlZiI9PT11Ll9ic29udHlwZSljPWp0KGUsbCx1LGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09dS5fYnNvbnR5cGUpYz1CdChlLGwsdSxjKTtlbHNlIGlmKCJJbnQzMiI9PT11Ll9ic29udHlwZSljPXZ0KGUsbCx1LGMpO2Vsc2UgaWYoIk1pbktleSI9PT11Ll9ic29udHlwZXx8Ik1heEtleSI9PT11Ll9ic29udHlwZSljPXh0KGUsbCx1LGMpO2Vsc2UgaWYodm9pZCAwIT09dS5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcodS5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09ZyYmbyYmKGM9JHQoZSxsLHUsYykpfX1lbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Py50b0JTT04mJm51bGwhPSh0PXQudG9CU09OKCkpJiYib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFooInRvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QiKTtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyh0KSl7bGV0IGY9dFtyXTsiZnVuY3Rpb24iPT10eXBlb2YgZj8udG9CU09OJiYoZj1mLnRvQlNPTigpKTtjb25zdCBsPXR5cGVvZiBmO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWh0LmhhcyhyKSl7aWYobnVsbCE9ci5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1yWzBdKXRocm93IG5ldyBaKCJrZXkgIityKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihyLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT1mKSExPT09cyYmKGM9cHQoZSxyLDAsYykpO2Vsc2UgaWYobnVsbD09PWYpYz1wdChlLHIsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09bCljPWJ0KGUscixmLGMpO2Vsc2UgaWYoIm51bWJlciI9PT1sKWM9ZHQoZSxyLGYsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWwpYz13dChlLHIsZixjKTtlbHNlIGlmKCJib29sZWFuIj09PWwpYz15dChlLHIsZixjKTtlbHNlIGlmKCJvYmplY3QiPT09bCYmbnVsbD09Zi5fYnNvbnR5cGUpYz1mIGluc3RhbmNlb2YgRGF0ZXx8ZChmKT9tdChlLHIsZixjKTpmIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhmKT9VdChlLHIsZixjKTpmIGluc3RhbmNlb2YgUmVnRXhwfHxoKGYpP1N0KGUscixmLGMpOk90KGUscixmLGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09bCl7aWYoZlt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PWYuX2Jzb250eXBlKWM9RXQoZSxyLGYsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT1mLl9ic29udHlwZSljPU50KGUscixmLGMpO2Vsc2UgaWYoIkxvbmciPT09Zi5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09Zi5fYnNvbnR5cGUpYz1JdChlLHIsZixjKTtlbHNlIGlmKCJEb3VibGUiPT09Zi5fYnNvbnR5cGUpYz1UdChlLHIsZixjKTtlbHNlIGlmKCJDb2RlIj09PWYuX2Jzb250eXBlKWM9THQoZSxyLGYsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT1mLl9ic29udHlwZSljPUF0KGUscixmLGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09Zi5fYnNvbnR5cGUpYz1SdChlLHIsZixjKTtlbHNlIGlmKCJEQlJlZiI9PT1mLl9ic29udHlwZSljPWp0KGUscixmLGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09Zi5fYnNvbnR5cGUpYz1CdChlLHIsZixjKTtlbHNlIGlmKCJJbnQzMiI9PT1mLl9ic29udHlwZSljPXZ0KGUscixmLGMpO2Vsc2UgaWYoIk1pbktleSI9PT1mLl9ic29udHlwZXx8Ik1heEtleSI9PT1mLl9ic29udHlwZSljPXh0KGUscixmLGMpO2Vsc2UgaWYodm9pZCAwIT09Zi5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcoZi5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09bCYmbyYmKGM9JHQoZSxyLGYsYykpfX1hLmRlbGV0ZSh0KSxlW2MrK109MDtjb25zdCBmPWMtcjtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsZiksY31jb25zdCBrdD17JG9pZDp0dCwkYmluYXJ5OnllLCR1dWlkOnllLCRzeW1ib2w6b3QsJG51bWJlckludDpaZSwkbnVtYmVyRGVjaW1hbDpIZSwkbnVtYmVyRG91YmxlOktlLCRudW1iZXJMb25nOmplLCRtaW5LZXk6WGUsJG1heEtleTpHZSwkcmVnZXg6aXQsJHJlZ3VsYXJFeHByZXNzaW9uOml0LCR0aW1lc3RhbXA6YXR9O2Z1bmN0aW9uIHp0KGUsdD17fSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtjb25zdCBuPWU8PW0mJmU+PVMscj1lPD1CJiZlPj14O2lmKHQucmVsYXhlZHx8dC5sZWdhY3kpcmV0dXJuIGU7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYobilyZXR1cm4gbmV3IFplKGUpO2lmKHIpcmV0dXJuIHQudXNlQmlnSW50NjQ/QmlnSW50KGUpOmplLmZyb21OdW1iZXIoZSl9cmV0dXJuIG5ldyBLZShlKX1pZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoZS4kdW5kZWZpbmVkKXJldHVybiBudWxsO2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoIiQiKSYmbnVsbCE9ZVt0XSkpO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPWt0W25bcl1dO2lmKGkpcmV0dXJuIGkuZnJvbUV4dGVuZGVkSlNPTihlLHQpfWlmKG51bGwhPWUuJGRhdGUpe2NvbnN0IG49ZS4kZGF0ZSxyPW5ldyBEYXRlO2lmKHQubGVnYWN5KWlmKCJudW1iZXIiPT10eXBlb2YgbilyLnNldFRpbWUobik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2UgaWYoamUuaXNMb25nKG4pKXIuc2V0VGltZShuLnRvTnVtYmVyKCkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuJiZ0LnJlbGF4ZWQpci5zZXRUaW1lKG4pO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9cmV0dXJuIHJ9aWYobnVsbCE9ZS4kY29kZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBlLiRzY29wZSYmKHQuJHNjb3BlPXp0KGUuJHNjb3BlKSksRWUuZnJvbUV4dGVuZGVkSlNPTihlKX1pZihVZShlKXx8ZS4kZGJQb2ludGVyKXtjb25zdCB0PWUuJHJlZj9lOmUuJGRiUG9pbnRlcjtpZih0IGluc3RhbmNlb2YgT2UpcmV0dXJuIHQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KS5maWx0ZXIoKGU9PmUuc3RhcnRzV2l0aCgiJCIpKSk7bGV0IHI9ITA7aWYobi5mb3JFYWNoKChlPT57LTE9PT1bIiRyZWYiLCIkaWQiLCIkZGIiXS5pbmRleE9mKGUpJiYocj0hMSl9KSkscilyZXR1cm4gT2UuZnJvbUV4dGVuZGVkSlNPTih0KX1yZXR1cm4gZX1mdW5jdGlvbiBEdChlKXtjb25zdCB0PWUudG9JU09TdHJpbmcoKTtyZXR1cm4gMCE9PWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk/dDp0LnNsaWNlKDAsLTUpKyJaIn1mdW5jdGlvbiBDdChlLHQpe2lmKGUgaW5zdGFuY2VvZiBNYXB8fGIoZSkpe2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbdCxyXW9mIGUpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQ2FuIG9ubHkgc2VyaWFsaXplIG1hcHMgd2l0aCBzdHJpbmcga2V5cyIpO25bdF09cn1yZXR1cm4gQ3Qobix0KX1pZigoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJm51bGwhPT1lKXtjb25zdCBuPXQuc2Vlbk9iamVjdHMuZmluZEluZGV4KCh0PT50Lm9iaj09PWUpKTtpZigtMSE9PW4pe2NvbnN0IGU9dC5zZWVuT2JqZWN0cy5tYXAoKGU9PmUucHJvcGVydHlOYW1lKSkscj1lLnNsaWNlKDAsbikubWFwKChlPT5gJHtlfSAtPiBgKSkuam9pbigiIiksaT1lW25dLG89IiAtPiAiK2Uuc2xpY2UobisxLGUubGVuZ3RoLTEpLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLHM9ZVtlLmxlbmd0aC0xXSxhPSIgIi5yZXBlYXQoci5sZW5ndGgraS5sZW5ndGgvMiksYz0iLSIucmVwZWF0KG8ubGVuZ3RoKyhpLmxlbmd0aCtzLmxlbmd0aCkvMi0xKTt0aHJvdyBuZXcgWihgQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gRUpTT046XG4gICAgJHtyfSR7aX0ke299JHtzfVxuICAgICR7YX1cXCR7Y30vYCl9dC5zZWVuT2JqZWN0c1t0LnNlZW5PYmplY3RzLmxlbmd0aC0xXS5vYmo9ZX1pZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiBlLm1hcCgoKGUsbik9Pnt0LnNlZW5PYmplY3RzLnB1c2goe3Byb3BlcnR5TmFtZTpgaW5kZXggJHtufWAsb2JqOm51bGx9KTt0cnl7cmV0dXJuIEN0KGUsdCl9ZmluYWxseXt0LnNlZW5PYmplY3RzLnBvcCgpfX0pKX0oZSx0KTtpZih2b2lkIDA9PT1lKXJldHVybiB0Lmlnbm9yZVVuZGVmaW5lZD92b2lkIDA6bnVsbDtpZihlIGluc3RhbmNlb2YgRGF0ZXx8ZChlKSl7Y29uc3Qgbj1lLmdldFRpbWUoKSxyPW4+LTEmJm48MjUzNDAyMzE4OGU1O3JldHVybiB0LmxlZ2FjeT90LnJlbGF4ZWQmJnI/eyRkYXRlOmUuZ2V0VGltZSgpfTp7JGRhdGU6RHQoZSl9OnQucmVsYXhlZCYmcj97JGRhdGU6RHQoZSl9OnskZGF0ZTp7JG51bWJlckxvbmc6ZS5nZXRUaW1lKCkudG9TdHJpbmcoKX19fWlmKCEoIm51bWJlciIhPXR5cGVvZiBlfHx0LnJlbGF4ZWQmJmlzRmluaXRlKGUpKSl7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYoZT49UyYmZTw9bSlyZXR1cm57JG51bWJlckludDplLnRvU3RyaW5nKCl9O2lmKGU+PXgmJmU8PUIpcmV0dXJueyRudW1iZXJMb25nOmUudG9TdHJpbmcoKX19cmV0dXJueyRudW1iZXJEb3VibGU6T2JqZWN0LmlzKGUsLTApPyItMC4wIjplLnRvU3RyaW5nKCl9fWlmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm4gdC5yZWxheGVkP051bWJlcihCaWdJbnQuYXNJbnROKDY0LGUpKTp7JG51bWJlckxvbmc6QmlnSW50LmFzSW50Tig2NCxlKS50b1N0cmluZygpfTtpZihlIGluc3RhbmNlb2YgUmVnRXhwfHxoKGUpKXtsZXQgbj1lLmZsYWdzO2lmKHZvaWQgMD09PW4pe2NvbnN0IHQ9ZS50b1N0cmluZygpLm1hdGNoKC9bZ2ltdXldKiQvKTt0JiYobj10WzBdKX1yZXR1cm4gbmV3IGl0KGUuc291cmNlLG4pLnRvRXh0ZW5kZWRKU09OKHQpfXJldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGU/ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFooIm5vdCBhbiBvYmplY3QgaW5zdGFuY2UiKTtjb25zdCBuPWUuX2Jzb250eXBlO2lmKHZvaWQgMD09PW4pe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXMoZSkpe3Quc2Vlbk9iamVjdHMucHVzaCh7cHJvcGVydHlOYW1lOnIsb2JqOm51bGx9KTt0cnl7Y29uc3QgaT1DdChlW3JdLHQpOyJfX3Byb3RvX18iPT09cj9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTppLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6bltyXT1pfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19cmV0dXJuIG59aWYobnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIGUuX2Jzb250eXBlJiZlW3ldIT09cCl0aHJvdyBuZXcgRztpZihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGV9KGUpKXtsZXQgcj1lO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnRvRXh0ZW5kZWRKU09OKXtjb25zdCB0PU10W2UuX2Jzb250eXBlXTtpZighdCl0aHJvdyBuZXcgWigiVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAiK2UuX2Jzb250eXBlKTtyPXQocil9cmV0dXJuIkNvZGUiPT09biYmci5zY29wZT9yPW5ldyBFZShyLmNvZGUsQ3Qoci5zY29wZSx0KSk6IkRCUmVmIj09PW4mJnIub2lkJiYocj1uZXcgT2UoQ3Qoci5jb2xsZWN0aW9uLHQpLEN0KHIub2lkLHQpLEN0KHIuZGIsdCksQ3Qoci5maWVsZHMsdCkpKSxyLnRvRXh0ZW5kZWRKU09OKHQpfXRocm93IG5ldyBaKCJfYnNvbnR5cGUgbXVzdCBiZSBhIHN0cmluZywgYnV0IHdhczogIit0eXBlb2Ygbil9KGUsdCk6ZX1jb25zdCBNdD17QmluYXJ5OmU9Pm5ldyB5ZShlLnZhbHVlKCksZS5zdWJfdHlwZSksQ29kZTplPT5uZXcgRWUoZS5jb2RlLGUuc2NvcGUpLERCUmVmOmU9Pm5ldyBPZShlLmNvbGxlY3Rpb258fGUubmFtZXNwYWNlLGUub2lkLGUuZGIsZS5maWVsZHMpLERlY2ltYWwxMjg6ZT0+bmV3IEhlKGUuYnl0ZXMpLERvdWJsZTplPT5uZXcgS2UoZS52YWx1ZSksSW50MzI6ZT0+bmV3IFplKGUudmFsdWUpLExvbmc6ZT0+amUuZnJvbUJpdHMobnVsbCE9ZS5sb3c/ZS5sb3c6ZS5sb3dfLG51bGwhPWUubG93P2UuaGlnaDplLmhpZ2hfLG51bGwhPWUubG93P2UudW5zaWduZWQ6ZS51bnNpZ25lZF8pLE1heEtleTooKT0+bmV3IEdlLE1pbktleTooKT0+bmV3IFhlLE9iamVjdElkOmU9Pm5ldyB0dChlKSxCU09OUmVnRXhwOmU9Pm5ldyBpdChlLnBhdHRlcm4sZS5vcHRpb25zKSxCU09OU3ltYm9sOmU9Pm5ldyBvdChlLnZhbHVlKSxUaW1lc3RhbXA6ZT0+YXQuZnJvbUJpdHMoZS5sb3csZS5oaWdoKX07ZnVuY3Rpb24gVnQoZSx0KXtjb25zdCBuPXt1c2VCaWdJbnQ2NDp0Py51c2VCaWdJbnQ2ND8/ITEscmVsYXhlZDp0Py5yZWxheGVkPz8hMCxsZWdhY3k6dD8ubGVnYWN5Pz8hMX07cmV0dXJuIEpTT04ucGFyc2UoZSwoKGUsdCk9PntpZigtMSE9PWUuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBEb2N1bWVudCBmaWVsZCBuYW1lcyBjYW5ub3QgY29udGFpbiBudWxsIGJ5dGVzLCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShlKX1gKTtyZXR1cm4genQodCxuKX0pKX1mdW5jdGlvbiBQdChlLHQsbixyKXtudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4mJihyPW4sbj0wKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDAsbj0wKTtjb25zdCBpPUN0KGUsT2JqZWN0LmFzc2lnbih7cmVsYXhlZDohMCxsZWdhY3k6ITF9LHIse3NlZW5PYmplY3RzOlt7cHJvcGVydHlOYW1lOiIocm9vdCkiLG9iajpudWxsfV19KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksdCxuKX1jb25zdCBKdD1PYmplY3QuY3JlYXRlKG51bGwpO0p0LnBhcnNlPVZ0LEp0LnN0cmluZ2lmeT1QdCxKdC5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHx7fSxKU09OLnBhcnNlKFB0KGUsdCkpfSxKdC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LFZ0KEpTT04uc3RyaW5naWZ5KGUpLHQpfSxPYmplY3QuZnJlZXplKEp0KTtjb25zdCBXdD0xLFl0PTIscXQ9MyxIdD00LEt0PTUsWnQ9NixHdD03LFh0PTgsUXQ9OSxlbj0xMCx0bj0xMSxubj0xMixybj0xMyxvbj0xNCxzbj0xNSxhbj0xNixjbj0xNyxmbj0xOCxsbj0xOSx1bj0yNTUsX249MTI3O2Z1bmN0aW9uIGduKGUsdCl7dHJ5e3JldHVybiBwZS5nZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KX1jYXRjaChlKXt0aHJvdyBuZXcgUSgiQlNPTiBzaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSIsdCx7Y2F1c2U6ZX0pfX1mdW5jdGlvbiBobihlLHQpe2xldCBuPXQ7Zm9yKDswIT09ZVtuXTtuKyspO2lmKG49PT1lLmxlbmd0aC0xKXRocm93IG5ldyBRKCJOdWxsIHRlcm1pbmF0b3Igbm90IGZvdW5kIix0KTtyZXR1cm4gbn1jb25zdCBibj1PYmplY3QuY3JlYXRlKG51bGwpO2JuLnBhcnNlVG9FbGVtZW50cz1mdW5jdGlvbihlLHQ9MCl7aWYodD8/PTAsZS5sZW5ndGg8NSl0aHJvdyBuZXcgUShgSW5wdXQgbXVzdCBiZSBhdCBsZWFzdCA1IGJ5dGVzLCBnb3QgJHtlLmxlbmd0aH0gYnl0ZXNgLHQpO2NvbnN0IG49Z24oZSx0KTtpZihuPmUubGVuZ3RoLXQpdGhyb3cgbmV3IFEoYFBhcnNlZCBkb2N1bWVudFNpemUgKCR7bn0gYnl0ZXMpIGRvZXMgbm90IG1hdGNoIGlucHV0IGxlbmd0aCAoJHtlLmxlbmd0aH0gYnl0ZXMpYCx0KTtpZigwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFEoIkJTT04gZG9jdW1lbnRzIG11c3QgZW5kIGluIDB4MDAiLHQrbik7Y29uc3Qgcj1bXTtsZXQgaT10KzQ7Zm9yKDtpPD1uK3Q7KXtjb25zdCBvPWVbaV07aWYoaSs9MSwwPT09byl7aWYoaS10IT09bil0aHJvdyBuZXcgUSgiSW52YWxpZCAweDAwIHR5cGUgYnl0ZSIsaSk7YnJlYWt9Y29uc3Qgcz1pLGE9aG4oZSxpKS1zO2xldCBjO2lmKGkrPWErMSxvPT09V3R8fG89PT1mbnx8bz09PVF0fHxvPT09Y24pYz04O2Vsc2UgaWYobz09PWFuKWM9NDtlbHNlIGlmKG89PT1HdCljPTEyO2Vsc2UgaWYobz09PWxuKWM9MTY7ZWxzZSBpZihvPT09WHQpYz0xO2Vsc2UgaWYobz09PWVufHxvPT09WnR8fG89PT1fbnx8bz09PXVuKWM9MDtlbHNlIGlmKG89PT10biljPWhuKGUsaG4oZSxpKSsxKSsxLWk7ZWxzZSBpZihvPT09cXR8fG89PT1IdHx8bz09PXNuKWM9Z24oZSxpKTtlbHNle2lmKG8hPT1ZdCYmbyE9PUt0JiZvIT09bm4mJm8hPT1ybiYmbyE9PW9uKXRocm93IG5ldyBRKGBJbnZhbGlkIDB4JHtvLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9IHR5cGUgYnl0ZWAsaSk7Yz1nbihlLGkpKzQsbz09PUt0JiYoYys9MSksbz09PW5uJiYoYys9MTIpfWlmKGM+bil0aHJvdyBuZXcgUSgidmFsdWUgcmVwb3J0cyBsZW5ndGggbGFyZ2VyIHRoYW4gZG9jdW1lbnQiLGkpO3IucHVzaChbbyxzLGEsaSxjXSksaSs9Y31yZXR1cm4gcn0sYm4uQnl0ZVV0aWxzPV9lLGJuLk51bWJlclV0aWxzPXBlLE9iamVjdC5mcmVlemUoYm4pO2NvbnN0IGRuPTE3ODI1NzkyO2xldCB3bj1fZS5hbGxvY2F0ZShkbik7dmFyIHBuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJTT05FcnJvcjpaLEJTT05PZmZzZXRFcnJvcjpRLEJTT05SZWdFeHA6aXQsQlNPTlJ1bnRpbWVFcnJvcjpYLEJTT05TeW1ib2w6b3QsQlNPTlR5cGU6SyxCU09OVmFsdWU6aGUsQlNPTlZlcnNpb25FcnJvcjpHLEJpbmFyeTp5ZSxCeXRlVXRpbHM6X2UsQ29kZTpFZSxEQlJlZjpPZSxEZWNpbWFsMTI4OkhlLERvdWJsZTpLZSxFSlNPTjpKdCxJbnQzMjpaZSxMb25nOmplLE1heEtleTpHZSxNaW5LZXk6WGUsTnVtYmVyVXRpbHM6cGUsT2JqZWN0SWQ6dHQsVGltZXN0YW1wOmF0LFVVSUQ6eGUsYnNvblR5cGU6Z2UsY2FsY3VsYXRlT2JqZWN0U2l6ZTpmdW5jdGlvbihlLHQ9e30pe3JldHVybiBudChlLCJib29sZWFuIj09dHlwZW9mKHQ9dHx8e30pLnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVVbmRlZmluZWR8fHQuaWdub3JlVW5kZWZpbmVkKX0sZGVzZXJpYWxpemU6ZnVuY3Rpb24oZSx0PXt9KXtyZXR1cm4gbHQoX2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdCl9LGRlc2VyaWFsaXplU3RyZWFtOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oe2FsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplOiEwLGluZGV4OjB9LG8pLGE9X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7bGV0IGM9dDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCB0PXBlLmdldEludDMyTEUoYSxjKTtzLmluZGV4PWMscltpK2VdPWx0KGEscyksYys9dH1yZXR1cm4gY30sb25EZW1hbmQ6Ym4sc2VyaWFsaXplOmZ1bmN0aW9uKGUsdD17fSl7Y29uc3Qgbj0iYm9vbGVhbiI9PXR5cGVvZiB0LmNoZWNrS2V5cyYmdC5jaGVja0tleXMscj0iYm9vbGVhbiI9PXR5cGVvZiB0LnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsaT0iYm9vbGVhbiIhPXR5cGVvZiB0Lmlnbm9yZVVuZGVmaW5lZHx8dC5pZ25vcmVVbmRlZmluZWQsbz0ibnVtYmVyIj09dHlwZW9mIHQubWluSW50ZXJuYWxCdWZmZXJTaXplP3QubWluSW50ZXJuYWxCdWZmZXJTaXplOmRuO3duLmxlbmd0aDxvJiYod249X2UuYWxsb2NhdGUobykpO2NvbnN0IHM9RnQod24sZSxuLDAsMCxyLGksbnVsbCksYT1fZS5hbGxvY2F0ZVVuc2FmZShzKTtyZXR1cm4gYS5zZXQod24uc3ViYXJyYXkoMCxzKSwwKSxhfSxzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6ZnVuY3Rpb24oZSx0LG49e30pe2NvbnN0IHI9ImJvb2xlYW4iPT10eXBlb2Ygbi5jaGVja0tleXMmJm4uY2hlY2tLZXlzLGk9ImJvb2xlYW4iPT10eXBlb2Ygbi5zZXJpYWxpemVGdW5jdGlvbnMmJm4uc2VyaWFsaXplRnVuY3Rpb25zLG89ImJvb2xlYW4iIT10eXBlb2Ygbi5pZ25vcmVVbmRlZmluZWR8fG4uaWdub3JlVW5kZWZpbmVkLHM9Im51bWJlciI9PXR5cGVvZiBuLmluZGV4P24uaW5kZXg6MCxhPUZ0KHduLGUsciwwLDAsaSxvLG51bGwpO3JldHVybiB0LnNldCh3bi5zdWJhcnJheSgwLGEpLHMpLHMrYS0xfSxzZXRJbnRlcm5hbEJ1ZmZlclNpemU6ZnVuY3Rpb24oZSl7d24ubGVuZ3RoPGUmJih3bj1fZS5hbGxvY2F0ZShlKSl9fSk7Y2xhc3MgeW57Y29uc3RydWN0b3IoKXt9c3RhdGljIHVybENvbnN0cnVjdEZyb20oZSl7Y29uc3QgdD0iL3dzL21vZGVsaW5nL2NvbW1hbmRzIitmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSlpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkocikpZm9yKGNvbnN0IGUgb2Ygcil0LmFwcGVuZChuLFN0cmluZyhlKSk7ZWxzZSB0LmFwcGVuZChuLFN0cmluZyhyKSk7Y29uc3Qgbj10LnRvU3RyaW5nKCk7cmV0dXJuIG4/YD8ke259YDoiIn0oe3ZpZGVvX3Jlc193aWR0aDplLnZpZGVvX3Jlc193aWR0aCx2aWRlb19yZXNfaGVpZ2h0OmUudmlkZW9fcmVzX2hlaWdodCxmcHM6ZS5mcHMsdW5sb2NrZWRfZnJhbWVyYXRlOmUudW5sb2NrZWRfZnJhbWVyYXRlLHBvc3RfZWZmZWN0OmUucG9zdF9lZmZlY3Qsd2VicnRjOmUud2VicnRjLHBvb2w6ZS5wb29sLHNob3dfZ3JpZDplLnNob3dfZ3JpZCxyZXBsYXk6ZS5yZXBsYXksYXBpX2NhbGxfaWQ6ZS5hcGlfY2FsbF9pZCxvcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3k6ZS5vcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3kscHI6ZS5wcn0pLG49KChlLmNsaWVudD8uYmFzZVVybHx8Imh0dHBzOi8vYXBpLnpvby5kZXYiKSt0KS5yZXBsYWNlKC9eaHR0cC8sIndzIik7cmV0dXJuIG5ldyBVUkwobil9c3RhdGljIGF1dGhlbnRpY2F0ZShlLHQpe2NvbnN0IG49ZS5jbGllbnQmJmUuY2xpZW50LnRva2VufHwiIjtpZihuKXRyeXtjb25zdCBlPXt0eXBlOiJoZWFkZXJzIixoZWFkZXJzOntBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9fTt0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319c3RhdGljIHRvQlNPTihlKXtyZXR1cm4gcG4uc2VyaWFsaXplKGUpfXN0YXRpYyBwYXJzZU1lc3NhZ2UoZSl7Y29uc3QgdD1lPy5kYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gSlNPTi5wYXJzZSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmQnVmZmVyLmlzQnVmZmVyPy4odCkpe2NvbnN0IGU9dDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZS50b1N0cmluZygidXRmOCIpKX1jYXRjaHt9cmV0dXJuIHBuLmRlc2VyaWFsaXplKGUpfWlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX1pZigobj10KSYmIm9iamVjdCI9PXR5cGVvZiBuJiYiYnVmZmVyImluIG4mJm4uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJiJudW1iZXIiPT10eXBlb2Ygbi5ieXRlT2Zmc2V0JiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX12YXIgbjtyZXR1cm4gdH19Y2xhc3MgbW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19jb250ZXh0X2ZyZWUoZSwwKX1hZGRfY29uc3RyYWludChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3I7cmV0dXJuIHVyLmNvbnRleHRfYWRkX2NvbnN0cmFpbnQodGhpcy5fX3diZ19wdHIsbyxzLGEsYyxmLGwsdSxfLGkpfWFkZF9maWxlKGUsdCl7Y29uc3Qgbj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfZmlsZSh0aGlzLl9fd2JnX3B0cixlLG4scil9YWRkX3NlZ21lbnQoZSx0LG4scixpLG8pe2NvbnN0IHM9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3IsYz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcixsPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSx1PV9yO3ZhciBfPW5yKHIpPzA6b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGc9X3I7Y29uc3QgaD1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfc2VnbWVudCh0aGlzLl9fd2JnX3B0cixzLGEsYyxmLGwsdSxfLGcsaCxiLG8pfWJ1c3RDYWNoZUFuZFJlc2V0U2NlbmUoZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO3ZhciBpPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLmNvbnRleHRfYnVzdENhY2hlQW5kUmVzZXRTY2VuZSh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1jaGFpbl9zZWdtZW50KGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsZj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcix1PW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3I7dmFyIGI9bnIoaSk/MDpvcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZD1fcjtjb25zdCB3PW9yKG8sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxwPV9yO3JldHVybiB1ci5jb250ZXh0X2NoYWluX3NlZ21lbnQodGhpcy5fX3diZ19wdHIsYSxjLGYsbCx1LF8sZyxoLGIsZCx3LHAscyl9Y2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKCl7cmV0dXJuIHVyLmNvbnRleHRfY2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKHRoaXMuX193YmdfcHRyKX1kZWxldGVfb2JqZWN0cyhlLHQsbixyLGksbyl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLGw9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9X3IsXz1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZz1fcixoPW9yKGksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxiPV9yO3JldHVybiB1ci5jb250ZXh0X2RlbGV0ZV9vYmplY3RzKHRoaXMuX193YmdfcHRyLHMsYSxjLGYsbCx1LF8sZyxoLGIsbyl9ZGVsZXRlX3NrZXRjaChlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZGVsZXRlX3NrZXRjaCh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZWRpdF9jb25zdHJhaW50KGUsdCxuLHIsaSxvKXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3IsbD1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcixfPW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxnPV9yLGg9b3IoaSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9jb25zdHJhaW50KHRoaXMuX193YmdfcHRyLHMsYSxjLGYsbCx1LF8sZyxoLGIsbyl9ZWRpdF9zZWdtZW50cyhlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9zZWdtZW50cyh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLGYsbCx1LF8saSl9ZWRpdF9za2V0Y2goZSx0LG4scixpKXtjb25zdCBvPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsZj1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcix1PW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3IoaSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9za2V0Y2godGhpcy5fX3diZ19wdHIsbyxzLGEsYyxmLGwsdSxfLGcsaCl9ZXhlY3V0ZShlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjt2YXIgbz1ucih0KT8wOm9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yO2NvbnN0IGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZXhlY3V0ZSh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZXhlY3V0ZU1vY2soZSx0LG4scil7Y29uc3QgaT1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjt2YXIgcz1ucih0KT8wOm9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO2NvbnN0IGM9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3I7cmV0dXJuIHVyLmNvbnRleHRfZXhlY3V0ZU1vY2sodGhpcy5fX3diZ19wdHIsaSxvLHMsYSxjLGYscil9ZXhlY3V0ZV90cmltKGUsdCxuLHIpe2NvbnN0IGk9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPWlyKG4sdXIuX193YmluZGdlbl9tYWxsb2MpLGY9X3IsbD1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcjtyZXR1cm4gdXIuY29udGV4dF9leGVjdXRlX3RyaW0odGhpcy5fX3diZ19wdHIsaSxvLHMsYSxjLGYsbCx1KX1leGl0X3NrZXRjaChlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZXhpdF9za2V0Y2godGhpcy5fX3diZ19wdHIscixpLG8scyxhLGMpfWV4cG9ydChlLHQpe2NvbnN0IG49b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3IsaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjtyZXR1cm4gdXIuY29udGV4dF9leHBvcnQodGhpcy5fX3diZ19wdHIsbixyLGksbyl9Z2V0X2ZpbGUoZSx0KXtyZXR1cm4gdXIuY29udGV4dF9nZXRfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQpfWdldF9wcm9qZWN0KGUpe3JldHVybiB1ci5jb250ZXh0X2dldF9wcm9qZWN0KHRoaXMuX193YmdfcHRyLGUpfWhhY2tfc2V0X3Byb2dyYW0oZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yLGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLmNvbnRleHRfaGFja19zZXRfcHJvZ3JhbSh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1jb25zdHJ1Y3RvcihlLHQpe2NvbnN0IG49dXIuY29udGV4dF9uZXcoZSx0KTtpZihuWzJdKXRocm93IHNyKG5bMV0pO3JldHVybiB0aGlzLl9fd2JnX3B0cj1uWzBdPj4+MCxSbi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9bmV3X3NrZXRjaChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3IsZz1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD1fcjtyZXR1cm4gdXIuY29udGV4dF9uZXdfc2tldGNoKHRoaXMuX193YmdfcHRyLG8scyxhLGMsZixsLHUsXyxnLGgpfW9wZW5fcHJvamVjdChlLHQsbil7Y29uc3Qgcj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjtyZXR1cm4gdXIuY29udGV4dF9vcGVuX3Byb2plY3QodGhpcy5fX3diZ19wdHIsZSxyLGksbil9cmVmcmVzaChlKXtyZXR1cm4gdXIuY29udGV4dF9yZWZyZXNoKHRoaXMuX193YmdfcHRyLGUpfXJlbW92ZV9maWxlKGUsdCl7cmV0dXJuIHVyLmNvbnRleHRfcmVtb3ZlX2ZpbGUodGhpcy5fX3diZ19wdHIsZSx0KX1yZXN0b3JlX3NrZXRjaF9jaGVja3BvaW50KGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3I7cmV0dXJuIHVyLmNvbnRleHRfcmVzdG9yZV9za2V0Y2hfY2hlY2twb2ludCh0aGlzLl9fd2JnX3B0cix0LG4pfXNlbmRSZXNwb25zZShlKXtyZXR1cm4gdXIuY29udGV4dF9zZW5kUmVzcG9uc2UodGhpcy5fX3diZ19wdHIsZSl9c2tldGNoX2V4ZWN1dGVfbW9jayhlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfc2tldGNoX2V4ZWN1dGVfbW9jayh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9c3dpdGNoX2ZpbGUoZSx0KXtyZXR1cm4gdXIuY29udGV4dF9zd2l0Y2hfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQpfXRyYW5zcGlsZV9vbGRfc2tldGNoKGUsdCxuLHIpe2NvbnN0IGk9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcjt2YXIgYz1ucihuKT8wOm9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yO2NvbnN0IGw9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9X3I7cmV0dXJuIHVyLmNvbnRleHRfdHJhbnNwaWxlX29sZF9za2V0Y2godGhpcy5fX3diZ19wdHIsaSxvLHMsYSxjLGYsbCx1KX11cGRhdGVfZmlsZShlLHQsbil7Y29uc3Qgcj1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjtyZXR1cm4gdXIuY29udGV4dF91cGRhdGVfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQscixpKX19U3ltYm9sLmRpc3Bvc2UmJihtbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPW1uLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBTbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLGpuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX2ludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9mcmVlKGUsMCl9Z2V0IGF1dG9BbGxvY2F0ZUNodW5rU2l6ZSgpe3JldHVybiB1ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfYXV0b0FsbG9jYXRlQ2h1bmtTaXplKHRoaXMuX193YmdfcHRyKT4+PjB9Y2FuY2VsKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9jYW5jZWwoZSl9cHVsbChlKXtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9c3RhcnQoZSl7dXIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX3N0YXJ0KHRoaXMuX193YmdfcHRyLGUpfWdldCB0eXBlKCl7Y29uc3QgZT11ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfdHlwZSh0aGlzLl9fd2JnX3B0cik7cmV0dXJuIEFuW2VdfX1TeW1ib2wuZGlzcG9zZSYmKFNuLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09U24ucHJvdG90eXBlLmZyZWUpO2NsYXNzIEJue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsRm4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuX193YmdfaW50b3VuZGVybHlpbmdzaW5rX2ZyZWUoZSwwKX1hYm9ydChlKXtjb25zdCB0PXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc2lua19hYm9ydCh0LGUpfWNsb3NlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3JldHVybiB1ci5pbnRvdW5kZXJseWluZ3NpbmtfY2xvc2UoZSl9d3JpdGUoZSl7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc2lua193cml0ZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihCbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUJuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyB4bntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLGtuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX2ludG91bmRlcmx5aW5nc291cmNlX2ZyZWUoZSwwKX1jYW5jZWwoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuaW50b3VuZGVybHlpbmdzb3VyY2VfY2FuY2VsKGUpfXB1bGwoZSl7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc291cmNlX3B1bGwodGhpcy5fX3diZ19wdHIsZSl9fVN5bWJvbC5kaXNwb3NlJiYoeG4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT14bi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgRW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCx6bi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19sc3BzZXJ2ZXJjb25maWdfZnJlZShlLDApfWNvbnN0cnVjdG9yKGUsdCxuKXtjb25zdCByPXVyLmxzcHNlcnZlcmNvbmZpZ19uZXcoZSx0LG4pO3JldHVybiB0aGlzLl9fd2JnX3B0cj1yPj4+MCx6bi5yZWdpc3Rlcih0aGlzLHRoaXMuX193YmdfcHRyLHRoaXMpLHRoaXN9fVN5bWJvbC5kaXNwb3NlJiYoRW4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Fbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgVW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxEbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19yZXNwb25zZWNvbnRleHRfZnJlZShlLDApfWNvbnN0cnVjdG9yKCl7Y29uc3QgZT11ci5yZXNwb25zZWNvbnRleHRfbmV3KCk7cmV0dXJuIHRoaXMuX193YmdfcHRyPWU+Pj4wLERuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31zZW5kX3Jlc3BvbnNlKGUpe3JldHVybiB1ci5yZXNwb25zZWNvbnRleHRfc2VuZF9yZXNwb25zZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihVbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPVVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBPbntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoT24ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxDbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxDbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ190YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZnJlZShlLDApfWdldCBhcmNfbGVuZ3RoKCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX2xlbmd0aCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeCgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGFyY19taWRfcG9pbnRfeSgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IGNjdygpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2Njdyh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl94KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyKX1nZXQgZW5kX2FuZ2xlKCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZW5kX2FuZ2xlKHRoaXMuX193YmdfcHRyKX1nZXQgcmFkaXVzKCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fcmFkaXVzKHRoaXMuX193YmdfcHRyKX1nZXQgc3RhcnRfYW5nbGUoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cil9c2V0IGFyY19sZW5ndGgoZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbGVuZ3RoKHRoaXMuX193YmdfcHRyLGUpfXNldCBhcmNfbWlkX3BvaW50X3goZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbWlkX3BvaW50X3godGhpcy5fX3diZ19wdHIsZSl9c2V0IGFyY19taWRfcG9pbnRfeShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2N3KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2N3KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeChlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl94KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2NlbnRlcl95KHRoaXMuX193YmdfcHRyLGUpfXNldCBlbmRfYW5nbGUoZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9lbmRfYW5nbGUodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3JhZGl1cyh0aGlzLl9fd2JnX3B0cixlKX1zZXQgc3RhcnRfYW5nbGUoZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9zdGFydF9hbmdsZSh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJihPbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPU9uLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBObntzdGF0aWMgX193cmFwKGUpe2U+Pj49MDtjb25zdCB0PU9iamVjdC5jcmVhdGUoTm4ucHJvdG90eXBlKTtyZXR1cm4gdC5fX3diZ19wdHI9ZSxNbi5yZWdpc3Rlcih0LHQuX193YmdfcHRyLHQpLHR9X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxNbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ193YXNtY2lyY2xlcGFyYW1zX2ZyZWUoZSwwKX1nZXQgY2VudGVyX3goKXtyZXR1cm4gdXIuX193YmdfZ2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3godGhpcy5fX3diZ19wdHIpfWdldCBjZW50ZXJfeSgpe3JldHVybiB1ci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeSh0aGlzLl9fd2JnX3B0cil9Z2V0IHJhZGl1cygpe3JldHVybiB1ci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIpfXNldCBjZW50ZXJfeChlKXt1ci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cixlKX1zZXQgY2VudGVyX3koZSl7dXIuX193Ymdfc2V0X3dhc21jaXJjbGVwYXJhbXNfY2VudGVyX3kodGhpcy5fX3diZ19wdHIsZSl9c2V0IHJhZGl1cyhlKXt1ci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19yYWRpdXModGhpcy5fX3diZ19wdHIsZSl9fWZ1bmN0aW9uIEluKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5wYXJzZV93YXNtKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9ZnVuY3Rpb24gdm4oKXtjb25zdCBlPXtfX3Byb3RvX186bnVsbCxfX3diZ19FcnJvcl81NTUzODQ4M2RlNmUzYWJlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEVycm9yKFhuKGUsdCkpfSxfX3diZ19fX3diaW5kZ2VuX2Jvb2xlYW5fZ2V0X2ZlMmEyNGZkZmRiNDA2NGY6ZnVuY3Rpb24oZSl7Y29uc3QgdD0iYm9vbGVhbiI9PXR5cGVvZiBlP2U6dm9pZCAwO3JldHVybiBucih0KT8xNjc3NzIxNTp0PzE6MH0sX193YmdfX193YmluZGdlbl9kZWJ1Z19zdHJpbmdfZDg5NjI3MjAyZDAxNTViNzpmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IoV24odCksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO0tuKCkuc2V0SW50MzIoZSs0LHIsITApLEtuKCkuc2V0SW50MzIoZSswLG4sITApfSxfX3diZ19fX3diaW5kZ2VuX2lzX2Z1bmN0aW9uXzJhOTU0MDY0MjNlYTg2MjY6ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9LF9fd2JnX19fd2JpbmRnZW5faXNfbnVsbF84ZDkwNTI0YzllMGFmMTgzOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZX0sX193YmdfX193YmluZGdlbl9pc19vYmplY3RfNTlhMDAyZTc2YjA1OTMxMjpmdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfSxfX3diZ19fX3diaW5kZ2VuX2lzX3VuZGVmaW5lZF84N2EzYTgzN2YzMzFmZWY1OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSxfX3diZ19fX3diaW5kZ2VuX3N0cmluZ19nZXRfZjExNjEzOTA0MTRmOWI1OTpmdW5jdGlvbihlLHQpe2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiB0P3Q6dm9pZCAwO3ZhciByPW5yKG4pPzA6b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGk9X3I7S24oKS5zZXRJbnQzMihlKzQsaSwhMCksS24oKS5zZXRJbnQzMihlKzAsciwhMCl9LF9fd2JnX19fd2JpbmRnZW5fdGhyb3dfNTU0OTQ5MmRhZWRhZDEzOTpmdW5jdGlvbihlLHQpe3Rocm93IG5ldyBFcnJvcihYbihlLHQpKX0sX193YmdfX3diZ19jYl91bnJlZl9mYmU2OWJiMDc2YzE2YmFkOmZ1bmN0aW9uKGUpe2UuX3diZ19jYl91bnJlZigpfSxfX3diZ19idWZmZXJfMGE1Nzc4OGNkZmNlMjFiYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5idWZmZXJ9LF9fd2JnX2J5b2JSZXF1ZXN0X2FiMGU1N2Y1NWJmNzc0ZjI6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLmJ5b2JSZXF1ZXN0O3JldHVybiBucih0KT8wOlZuKHQpfSxfX3diZ19ieXRlTGVuZ3RoXzk5MzFkYjAwZTU4NjFiZjk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZUxlbmd0aH0sX193YmdfYnl0ZU9mZnNldF8wYTk4NWE5OGY4ZmZiOGQ3OmZ1bmN0aW9uKGUpe3JldHVybiBlLmJ5dGVPZmZzZXR9LF9fd2JnX2NhbGxfOGY1ZDdiYjA3MDI4MzUwODpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmNhbGwodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzYyZjZhNGVhZGM5NDU2NWY6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe2UuY2xvc2UoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Nsb3NlXzg3MWU1MTZhMjczZDE1Zjg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvc2UoKX0sX193YmdfY2xvc2VfZjI4NzA1ODcxNjA4OGE1MDpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSksYXJndW1lbnRzKX0sX193YmdfZG9uZV8xOWY5MmNiMWY4NzM4YWJhOmZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmV9LF9fd2JnX2VucXVldWVfZWUwNTkzY2VhOWJlOTNiZDpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtlLmVucXVldWUodCl9KSxhcmd1bWVudHMpfSxfX3diZ19lcnJvcl9hNmZhMjAyYjU4YWExY2QzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7bj1lLHI9dCxjb25zb2xlLmVycm9yKFhuKGUsdCkpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LF9fd2JnX2Vycm9yX2RlNmI4NmU1OTg1MDUyNDY6ZnVuY3Rpb24oZSl7Y29uc29sZS5lcnJvcihlKX0sX193YmdfZXhpc3RzXzNhNzFlODcwYWM3MTk2ZWI6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLmV4aXN0cyhYbih0LG4pKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtXzVkMWVmY2Y1ZDEzNDhjZjY6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMsYSxjKXtsZXQgZixsLHUsXyxnLGgsYixkO3RyeXtmPXQsbD1uLHU9cixfPWksZz1vLGg9cyxiPWEsZD1jLGUuZmlyZU1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKFhuKHQsbiksWG4ocixpKSxYbihvLHMpLFhuKGEsYykpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKGYsbCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUodSxfLDEpLHVyLl9fd2JpbmRnZW5fZnJlZShnLGgsMSksdXIuX193YmluZGdlbl9mcmVlKGIsZCwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19nZXRBbGxGaWxlc19mN2VjNjVkYTlmMzAxZGY2OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7cj10LGk9bjtyZXR1cm4gZS5nZXRBbGxGaWxlcyhYbih0LG4pKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfZ2V0Q2xpZW50U3RhdGVfNGQ2ZjVhZDQyNTM3YzViMzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0Q2xpZW50U3RhdGUoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX2dldE9zSW5mb18xNjgxNmU5Yjc4ZjQwOTFlOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IodC5nZXRPc0luZm8oKSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfM2Y0NGI3MDAzOTUwNjJlNTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfZWYxMjU1MmJmNWFjZDJmZTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRUaW1lX2MzYWYzNTU5NGUyODMzNTY6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VGltZSgpfSxfX3diZ19nZXRXZWJydGNTdGF0c185NjU2YzE4ZTJiNDBmMzUyOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRXZWJydGNTdGF0cygpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0V3JpdGVyXzdjOTUzMTQ5YWYyNzNjMjk6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFdyaXRlcigpfSksYXJndW1lbnRzKX0sX193YmdfZ2V0X2ZmNWYxZmIyMjAyMzM0Nzc6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFJlZmxlY3QuZ2V0KGUsdCl9KSxhcmd1bWVudHMpfSxfX3diZ19pbnN0YW5jZW9mX1VpbnQ4QXJyYXlfY2UyNGQ1OGE1ZjRiZGNjMzpmdW5jdGlvbihlKXtsZXQgdDt0cnl7dD1lIGluc3RhbmNlb2YgVWludDhBcnJheX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pbnN0YW5jZW9mX1dpbmRvd18yZmE4ZDljMmQ1YjYxMDRhOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXaW5kb3d9Y2F0Y2goZSl7dD0hMX1yZXR1cm4gdH0sX193YmdfaW5zdGFuY2VvZl9Xb3JrZXJHbG9iYWxTY29wZV9hNDMwN2M4NWY3M2Q4M2MzOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZX1jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pc0Rlc2t0b3BfYjA2ZTdmZjZiNmE5OWExNzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXNEZXNrdG9wKCl9KSxhcmd1bWVudHMpfSxfX3diZ19rY2xDb2RlXzQxNDMzYWM1NjI4YzkyMDg6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1vcih0LmtjbENvZGUoKSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9KSxhcmd1bWVudHMpfSxfX3diZ19sZW5ndGhfZTZlMTYzM2ZiZWE2Y2ZhOTpmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGh9LF9fd2JnX2xvZ182YTc1YjcxZDYzMTZlOTM1OmZ1bmN0aW9uKGUpe2NvbnNvbGUubG9nKGUpfSxfX3diZ19uZXdfMF9lNjQ5Yzk5ZTczODIzMTNmOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBEYXRlfSxfX3diZ19uZXdfMWQ5NjY3OGFhYWNjYTMyZTpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LF9fd2JnX25ld18yMjdkN2MwNTQxNGViODYxOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcn0sX193YmdfbmV3XzRhODQzZmUyZWU0MDgyYTk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IEVycm9yKFhuKGUsdCkpfSxfX3diZ19uZXdfZnJvbV9zbGljZV8wYmM1OGUzNmY4MmExYjUwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBVaW50OEFycmF5KHFuKGUsdCkpfSxfX3diZ19uZXdfdHlwZWRfMjVkZGEyMzg4ZDdlNWU5ZjpmdW5jdGlvbihlLHQpe3RyeXt2YXIgbj17YTplLGI6dH07Y29uc3Qgcj1uZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPW4uYTtuLmE9MDt0cnl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3VyLndhc21fYmluZGdlbl9fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9faDIzNmExZTJlNzI0YzcxZDkoZSx0LG4scil9KHIsbi5iLGUsdCl9ZmluYWxseXtuLmE9cn19KSk7cmV0dXJuIHJ9ZmluYWxseXtuLmE9MH19LF9fd2JnX25ld193aXRoX2J5dGVfb2Zmc2V0X2FuZF9sZW5ndGhfYWIxZTEwMDJkN2E2OTRlNDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG5ldyBVaW50OEFycmF5KGUsdD4+PjAsbj4+PjApfSxfX3diZ19uZXh0XzFiN2I1YzAwNzk2NjU2MGY6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLm5leHQoKX0pLGFyZ3VtZW50cyl9LF9fd2JnX25vd19hOWFmNDU1NGVkYjdhYzc4OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdygpfSxfX3diZ19ub3dfZTdjNjc5NWE3ZjgxZTEwZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub3coKX0sX193YmdfcGFyc2VfZTU3MDNmZDUyMjExZTY4ODpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5wYXJzZShYbihlLHQpKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3BlcmZvcm1hbmNlXzNmY2Y2ZTMyYTdlMWVkMGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGVyZm9ybWFuY2V9LF9fd2JnX3Byb3RvdHlwZXNldGNhbGxfMzg3NWQ1NGQxMmVmMmVlYzpmdW5jdGlvbihlLHQsbil7VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwocW4oZSx0KSxuKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfODg2ODM2NTExNGZlMjNiNTpmdW5jdGlvbihlKXtxdWV1ZU1pY3JvdGFzayhlKX0sX193YmdfcXVldWVNaWNyb3Rhc2tfY2ZjNWEwZTYyZjllYmRiZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5xdWV1ZU1pY3JvdGFza30sX193YmdfcmVhZEZpbGVfMjJiMDU3YTMwZWNjNjkxNTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe2xldCByLGk7dHJ5e3I9dCxpPW47cmV0dXJuIGUucmVhZEZpbGUoWG4odCxuKSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUocixpLDEpfX0pLGFyZ3VtZW50cyl9LF9fd2JnX3JlYWR5XzU4NTZkYjZmMDBlM2UyMGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVhZHl9LF9fd2JnX3JlbGVhc2VMb2NrXzk1YmJjN2NmN2I4Nzk3N2Q6ZnVuY3Rpb24oZSl7ZS5yZWxlYXNlTG9jaygpfSxfX3diZ19yZXNvbHZlX2Q4MDU5YmMxMTNlMjE1YmY6ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0sX193YmdfcmVzcG9uZF8xZWMyOTM5NWVkYmU3ZmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2UucmVzcG9uZCh0Pj4+MCl9KSxhcmd1bWVudHMpfSxfX3diZ19zZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc21fMjU2ODc3YjdiM2Y0ZWQ1MzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4scixpLG8scyxhLGMpe2xldCBmLGwsdSxfLGcsaCxiLGQ7dHJ5e2Y9dCxsPW4sdT1yLF89aSxnPW8saD1zLGI9YSxkPWM7cmV0dXJuIGUuc2VuZE1vZGVsaW5nQ29tbWFuZEZyb21XYXNtKFhuKHQsbiksWG4ocixpKSxYbihvLHMpLFhuKGEsYykpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKGYsbCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUodSxfLDEpLHVyLl9fd2JpbmRnZW5fZnJlZShnLGgsMSksdXIuX193YmluZGdlbl9mcmVlKGIsZCwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0XzQ2NmQ1MGYzNTEyMjQ1Y2I6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5zZXRUaW1lb3V0KHQsbil9KSxhcmd1bWVudHMpfSxfX3diZ19zZXRUaW1lb3V0X2MxYzlhMThiNjM0M2ViZDM6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5zZXRUaW1lb3V0KHQsbil9KSxhcmd1bWVudHMpfSxfX3diZ19zZXRfMjk1YmFkM2I1ZWFkNGU5OTpmdW5jdGlvbihlLHQsbil7ZS5zZXQocW4odCxuKSl9LF9fd2JnX3N0YWNrXzNiMGQ5NzRiYmYzMWU0NGY6ZnVuY3Rpb24oZSx0KXtjb25zdCBuPW9yKHQuc3RhY2ssdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO0tuKCkuc2V0SW50MzIoZSs0LHIsITApLEtuKCkuc2V0SW50MzIoZSswLG4sITApfSxfX3diZ19zdGFydE5ld1Nlc3Npb25fZDE0YzA4ZjM0MzgxZDE1ZTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3RhcnROZXdTZXNzaW9uKCl9KSxhcmd1bWVudHMpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMXzhkZmI3ZjVlMjZlYmU1MjM6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2YgZ2xvYmFsP251bGw6Z2xvYmFsO3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfR0xPQkFMX1RISVNfOTQxMTU0ZWZjODM5NWNkZDpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWxUaGlzP251bGw6Z2xvYmFsVGhpcztyZXR1cm4gbnIoZSk/MDpWbihlKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1NFTEZfNThkYWM5YWY4MjJmNTYxZjpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiBzZWxmP251bGw6c2VsZjtyZXR1cm4gbnIoZSk/MDpWbihlKX0sX193Ymdfc3RhdGljX2FjY2Vzc29yX1dJTkRPV19lZTY0ZjBiM2Q4MzU0YzBiOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz9udWxsOndpbmRvdztyZXR1cm4gbnIoZSk/MDpWbihlKX0sX193Ymdfc3RyaW5naWZ5X2I2N2UyYzhjNjBiOTNmNjk6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3RoZW5fMDE1MDM1MmU0YWQyMDM0NDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUudGhlbih0LG4pfSxfX3diZ190aGVuXzUxNjA0ODZjNjdkZGI5OGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS50aGVuKHQpfSxfX3diZ190b1N0cmluZ181NTNiNWY2ZTk1ZTNlNDFiOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9LF9fd2JnX3RvU3RyaW5nXzllNzM1M2E3N2NiNDE1YTI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0sX193YmdfdmFsdWVfZDViMjQ4Y2U4NDE5YmQxYjpmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZX0sX193YmdfdmVyc2lvbl84NTE2MDE1ZGVhNTM5ZTE2OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IodC52ZXJzaW9uKCksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO0tuKCkuc2V0SW50MzIoZSs0LHIsITApLEtuKCkuc2V0SW50MzIoZSswLG4sITApfSksYXJndW1lbnRzKX0sX193Ymdfdmlld18zOGE5MzA4NDRjOTY0MTAzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9ZS52aWV3O3JldHVybiBucih0KT8wOlZuKHQpfSxfX3diZ193YXJuXzg2ZWYwM2RiOGNmYjRkZDQ6ZnVuY3Rpb24oZSl7Y29uc29sZS53YXJuKGUpfSxfX3diZ193cml0ZV9mZjNhM2RlNDkwMmFhOGJmOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUud3JpdGUodCl9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAxOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJyKGUsdCwkbil9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJyKGUsdCxMbil9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDAzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJyKGUsdCxUbil9LF9fd2JpbmRnZW5fY2FzdF8wMDAwMDAwMDAwMDAwMDA0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFhuKGUsdCl9LF9fd2JpbmRnZW5faW5pdF9leHRlcm5yZWZfdGFibGU6ZnVuY3Rpb24oKXtjb25zdCBlPXVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcyx0PWUuZ3Jvdyg0KTtlLnNldCgwLHZvaWQgMCksZS5zZXQodCswLHZvaWQgMCksZS5zZXQodCsxLG51bGwpLGUuc2V0KHQrMiwhMCksZS5zZXQodCszLCExKX19O3JldHVybntfX3Byb3RvX186bnVsbCwiLi9rY2xfd2FzbV9saWJfYmcuanMiOmV9fWZ1bmN0aW9uIFRuKGUsdCl7dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oMmY0YWE2M2RjZDU5OWNmNyhlLHQpfWZ1bmN0aW9uICRuKGUsdCxuKXtjb25zdCByPXVyLndhc21fYmluZGdlbl9fY29udmVydF9fY2xvc3VyZXNfX19fX2ludm9rZV9faGYxMzA4MTZjZDkwMDViOTkoZSx0LG4pO2lmKHJbMV0pdGhyb3cgc3IoclswXSl9ZnVuY3Rpb24gTG4oZSx0LG4pe2NvbnN0IHI9dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oZDQ0MGRiNTc2OTY3YzY1ZihlLHQsbik7aWYoclsxXSl0aHJvdyBzcihyWzBdKX1TeW1ib2wuZGlzcG9zZSYmKE5uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Tm4ucHJvdG90eXBlLmZyZWUpO2NvbnN0IEFuPVsiYnl0ZXMiXSxSbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfY29udGV4dF9mcmVlKGU+Pj4wLDEpKSksam49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JnX2ludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9mcmVlKGU+Pj4wLDEpKSksRm49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JnX2ludG91bmRlcmx5aW5nc2lua19mcmVlKGU+Pj4wLDEpKSksa249InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JnX2ludG91bmRlcmx5aW5nc291cmNlX2ZyZWUoZT4+PjAsMSkpKSx6bj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfbHNwc2VydmVyY29uZmlnX2ZyZWUoZT4+PjAsMSkpKSxEbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfcmVzcG9uc2Vjb250ZXh0X2ZyZWUoZT4+PjAsMSkpKSxDbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2ZyZWUoZT4+PjAsMSkpKSxNbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193Ymdfd2FzbWNpcmNsZXBhcmFtc19mcmVlKGU+Pj4wLDEpKSk7ZnVuY3Rpb24gVm4oZSl7Y29uc3QgdD11ci5fX2V4dGVybnJlZl90YWJsZV9hbGxvYygpO3JldHVybiB1ci5fX3diaW5kZ2VuX2V4dGVybnJlZnMuc2V0KHQsZSksdH1mdW5jdGlvbiBQbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgJHt0Lm5hbWV9YCl9Y29uc3QgSm49InVuZGVmaW5lZCI9PXR5cGVvZiBGaW5hbGl6YXRpb25SZWdpc3RyeT97cmVnaXN0ZXI6KCk9Pnt9LHVucmVnaXN0ZXI6KCk9Pnt9fTpuZXcgRmluYWxpemF0aW9uUmVnaXN0cnkoKGU9PnVyLl9fd2JpbmRnZW5fZGVzdHJveV9jbG9zdXJlKGUuYSxlLmIpKSk7ZnVuY3Rpb24gV24oZSl7Y29uc3QgdD10eXBlb2YgZTtpZigibnVtYmVyIj09dHx8ImJvb2xlYW4iPT10fHxudWxsPT1lKXJldHVybmAke2V9YDtpZigic3RyaW5nIj09dClyZXR1cm5gIiR7ZX0iYDtpZigic3ltYm9sIj09dCl7Y29uc3QgdD1lLmRlc2NyaXB0aW9uO3JldHVybiBudWxsPT10PyJTeW1ib2wiOmBTeW1ib2woJHt0fSlgfWlmKCJmdW5jdGlvbiI9PXQpe2NvbnN0IHQ9ZS5uYW1lO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC5sZW5ndGg+MD9gRnVuY3Rpb24oJHt0fSlgOiJGdW5jdGlvbiJ9aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgbj0iWyI7dD4wJiYobis9V24oZVswXSkpO2ZvcihsZXQgcj0xO3I8dDtyKyspbis9IiwgIitXbihlW3JdKTtyZXR1cm4gbis9Il0iLG59Y29uc3Qgbj0vXFtvYmplY3QgKFteXF1dKylcXS8uZXhlYyh0b1N0cmluZy5jYWxsKGUpKTtsZXQgcjtpZighKG4mJm4ubGVuZ3RoPjEpKXJldHVybiB0b1N0cmluZy5jYWxsKGUpO2lmKHI9blsxXSwiT2JqZWN0Ij09cil0cnl7cmV0dXJuIk9iamVjdCgiK0pTT04uc3RyaW5naWZ5KGUpKyIpIn1jYXRjaChlKXtyZXR1cm4iT2JqZWN0In1yZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yP2Ake2UubmFtZX06ICR7ZS5tZXNzYWdlfVxuJHtlLnN0YWNrfWA6cn1mdW5jdGlvbiBZbihlLHQpe2U+Pj49MDtjb25zdCBuPUtuKCkscj1bXTtmb3IobGV0IGk9ZTtpPGUrNCp0O2krPTQpci5wdXNoKHVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5nZXQobi5nZXRVaW50MzIoaSwhMCkpKTtyZXR1cm4gdXIuX19leHRlcm5yZWZfZHJvcF9zbGljZShlLHQpLHJ9ZnVuY3Rpb24gcW4oZSx0KXtyZXR1cm4gZT4+Pj0wLGVyKCkuc3ViYXJyYXkoZS8xLGUvMSt0KX1sZXQgSG49bnVsbDtmdW5jdGlvbiBLbigpe3JldHVybihudWxsPT09SG58fCEwPT09SG4uYnVmZmVyLmRldGFjaGVkfHx2b2lkIDA9PT1Ibi5idWZmZXIuZGV0YWNoZWQmJkhuLmJ1ZmZlciE9PXVyLm1lbW9yeS5idWZmZXIpJiYoSG49bmV3IERhdGFWaWV3KHVyLm1lbW9yeS5idWZmZXIpKSxIbn1sZXQgWm49bnVsbDtmdW5jdGlvbiBHbigpe3JldHVybiBudWxsIT09Wm4mJjAhPT1abi5ieXRlTGVuZ3RofHwoWm49bmV3IEZsb2F0NjRBcnJheSh1ci5tZW1vcnkuYnVmZmVyKSksWm59ZnVuY3Rpb24gWG4oZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtmcis9dCxmcj49Y3ImJihhcj1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSksYXIuZGVjb2RlKCksZnI9dCk7cmV0dXJuIGFyLmRlY29kZShlcigpLnN1YmFycmF5KGUsZSt0KSl9KGU+Pj49MCx0KX1sZXQgUW49bnVsbDtmdW5jdGlvbiBlcigpe3JldHVybiBudWxsIT09UW4mJjAhPT1Rbi5ieXRlTGVuZ3RofHwoUW49bmV3IFVpbnQ4QXJyYXkodXIubWVtb3J5LmJ1ZmZlcikpLFFufWZ1bmN0aW9uIHRyKGUsdCl7dHJ5e3JldHVybiBlLmFwcGx5KHRoaXMsdCl9Y2F0Y2goZSl7Y29uc3QgdD1WbihlKTt1ci5fX3diaW5kZ2VuX2V4bl9zdG9yZSh0KX19ZnVuY3Rpb24gbnIoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gcnIoZSx0LG4pe2NvbnN0IHI9e2E6ZSxiOnQsY250OjF9LGk9KC4uLmUpPT57ci5jbnQrKztjb25zdCB0PXIuYTtyLmE9MDt0cnl7cmV0dXJuIG4odCxyLmIsLi4uZSl9ZmluYWxseXtyLmE9dCxpLl93YmdfY2JfdW5yZWYoKX19O3JldHVybiBpLl93YmdfY2JfdW5yZWY9KCk9PnswPT0tLXIuY250JiYodXIuX193YmluZGdlbl9kZXN0cm95X2Nsb3N1cmUoci5hLHIuYiksci5hPTAsSm4udW5yZWdpc3RlcihyKSl9LEpuLnJlZ2lzdGVyKGkscixyKSxpfWZ1bmN0aW9uIGlyKGUsdCl7Y29uc3Qgbj10KDgqZS5sZW5ndGgsOCk+Pj4wO3JldHVybiBHbigpLnNldChlLG4vOCksX3I9ZS5sZW5ndGgsbn1mdW5jdGlvbiBvcihlLHQsbil7aWYodm9pZCAwPT09bil7Y29uc3Qgbj1sci5lbmNvZGUoZSkscj10KG4ubGVuZ3RoLDEpPj4+MDtyZXR1cm4gZXIoKS5zdWJhcnJheShyLHIrbi5sZW5ndGgpLnNldChuKSxfcj1uLmxlbmd0aCxyfWxldCByPWUubGVuZ3RoLGk9dChyLDEpPj4+MDtjb25zdCBvPWVyKCk7bGV0IHM9MDtmb3IoO3M8cjtzKyspe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHMpO2lmKHQ+MTI3KWJyZWFrO29baStzXT10fWlmKHMhPT1yKXswIT09cyYmKGU9ZS5zbGljZShzKSksaT1uKGkscixyPXMrMyplLmxlbmd0aCwxKT4+PjA7Y29uc3QgdD1lcigpLnN1YmFycmF5KGkrcyxpK3IpO3MrPWxyLmVuY29kZUludG8oZSx0KS53cml0dGVuLGk9bihpLHIscywxKT4+PjB9cmV0dXJuIF9yPXMsaX1mdW5jdGlvbiBzcihlKXtjb25zdCB0PXVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5nZXQoZSk7cmV0dXJuIHVyLl9fZXh0ZXJucmVmX3RhYmxlX2RlYWxsb2MoZSksdH1sZXQgYXI9bmV3IFRleHREZWNvZGVyKCJ1dGYtOCIse2lnbm9yZUJPTTohMCxmYXRhbDohMH0pO2FyLmRlY29kZSgpO2NvbnN0IGNyPTIxNDY0MzUwNzI7bGV0IGZyPTA7Y29uc3QgbHI9bmV3IFRleHRFbmNvZGVyOyJlbmNvZGVJbnRvImluIGxyfHwobHIuZW5jb2RlSW50bz1mdW5jdGlvbihlLHQpe2NvbnN0IG49bHIuZW5jb2RlKGUpO3JldHVybiB0LnNldChuKSx7cmVhZDplLmxlbmd0aCx3cml0dGVuOm4ubGVuZ3RofX0pO2xldCB1cixfcj0wO2Z1bmN0aW9uIGdyKGUsdCl7cmV0dXJuIHVyPWUuZXhwb3J0cyxIbj1udWxsLFpuPW51bGwsUW49bnVsbCx1ci5fX3diaW5kZ2VuX3N0YXJ0KCksdXJ9YXN5bmMgZnVuY3Rpb24gaHIoZSl7aWYodm9pZCAwIT09dXIpcmV0dXJuIHVyO3ZvaWQgMCE9PWUmJihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlX29yX3BhdGg6ZX09ZSk6Y29uc29sZS53YXJuKCJ1c2luZyBkZXByZWNhdGVkIHBhcmFtZXRlcnMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbjsgcGFzcyBhIHNpbmdsZSBvYmplY3QgaW5zdGVhZCIpKSx2b2lkIDA9PT1lJiYoZT1uZXcgVVJMKCJrY2xfd2FzbV9saWJfYmcud2FzbSIsZG9jdW1lbnQuY3VycmVudFNjcmlwdCYmIlNDUklQVCI9PT1kb2N1bWVudC5jdXJyZW50U2NyaXB0LnRhZ05hbWUudG9VcHBlckNhc2UoKSYmZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmN8fG5ldyBVUkwoIndvcmtlci13ZWJydGMuanMiLGRvY3VtZW50LmJhc2VVUkkpLmhyZWYpKTtjb25zdCB0PXZuKCk7KCJzdHJpbmciPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIFJlcXVlc3QmJmUgaW5zdGFuY2VvZiBSZXF1ZXN0fHwiZnVuY3Rpb24iPT10eXBlb2YgVVJMJiZlIGluc3RhbmNlb2YgVVJMKSYmKGU9ZmV0Y2goZSkpO2NvbnN0e2luc3RhbmNlOm4sbW9kdWxlOnJ9PWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFJlc3BvbnNlJiZlIGluc3RhbmNlb2YgUmVzcG9uc2Upe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZVN0cmVhbWluZyl0cnl7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKGUsdCl9Y2F0Y2godCl7aWYoIWUub2t8fCFmdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJiYXNpYyI6Y2FzZSJjb3JzIjpjYXNlImRlZmF1bHQiOnJldHVybiEwfXJldHVybiExfShlLnR5cGUpfHwiYXBwbGljYXRpb24vd2FzbSI9PT1lLmhlYWRlcnMuZ2V0KCJDb250ZW50LVR5cGUiKSl0aHJvdyB0O2NvbnNvbGUud2FybigiYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nYCBmYWlsZWQgYmVjYXVzZSB5b3VyIHNlcnZlciBkb2VzIG5vdCBzZXJ2ZSBXYXNtIHdpdGggYGFwcGxpY2F0aW9uL3dhc21gIE1JTUUgdHlwZS4gRmFsbGluZyBiYWNrIHRvIGBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZWAgd2hpY2ggaXMgc2xvd2VyLiBPcmlnaW5hbCBlcnJvcjpcbiIsdCl9Y29uc3Qgbj1hd2FpdCBlLmFycmF5QnVmZmVyKCk7cmV0dXJuIGF3YWl0IFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKG4sdCl9e2NvbnN0IG49YXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUoZSx0KTtyZXR1cm4gbiBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lkluc3RhbmNlP3tpbnN0YW5jZTpuLG1vZHVsZTplfTpufX0oYXdhaXQgZSx0KTtyZXR1cm4gZ3Iobil9dmFyIGJyPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLENvbnRleHQ6bW4sSW50b1VuZGVybHlpbmdCeXRlU291cmNlOlNuLEludG9VbmRlcmx5aW5nU2luazpCbixJbnRvVW5kZXJseWluZ1NvdXJjZTp4bixMc3BTZXJ2ZXJDb25maWc6RW4sUmVzcG9uc2VDb250ZXh0OlVuLFRhbmdlbnRpYWxBcmNJbmZvT3V0cHV0V2FzbTpPbixXYXNtQ2lyY2xlUGFyYW1zOk5uLGJhc2U2NF9kZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLmJhc2U2NF9kZWNvZGUodCxuKTtpZihyWzNdKXRocm93IHNyKHJbMl0pO3ZhciBpPXFuKHJbMF0sclsxXSkuc2xpY2UoKTtyZXR1cm4gdXIuX193YmluZGdlbl9mcmVlKHJbMF0sMSpyWzFdLDEpLGl9LGNhbGN1bGF0ZV9jaXJjbGVfZnJvbV8zX3BvaW50czpmdW5jdGlvbihlLHQsbixyLGksbyl7Y29uc3Qgcz11ci5jYWxjdWxhdGVfY2lyY2xlX2Zyb21fM19wb2ludHMoZSx0LG4scixpLG8pO3JldHVybiBObi5fX3dyYXAocyl9LGNoYW5nZV9kZWZhdWx0X3VuaXRzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLGw9dXIuY2hhbmdlX2RlZmF1bHRfdW5pdHMocyxhLGMsZik7dmFyIGk9bFswXSxvPWxbMV07aWYobFszXSl0aHJvdyBpPTAsbz0wLHNyKGxbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sY2hhbmdlX2V4cGVyaW1lbnRhbF9mZWF0dXJlczpmdW5jdGlvbihlLHQpe2xldCBuLHI7dHJ5e2NvbnN0IHM9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3IsYz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcixsPXVyLmNoYW5nZV9leHBlcmltZW50YWxfZmVhdHVyZXMocyxhLGMsZik7dmFyIGk9bFswXSxvPWxbMV07aWYobFszXSl0aHJvdyBpPTAsbz0wLHNyKGxbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sY29yZWR1bXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHVyLmNvcmVkdW1wKGUpfSxkZWZhdWx0X2FwcF9zZXR0aW5nczpmdW5jdGlvbigpe2NvbnN0IGU9dXIuZGVmYXVsdF9hcHBfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IHNyKGVbMV0pO3JldHVybiBzcihlWzBdKX0sZGVmYXVsdF9wcm9qZWN0X3NldHRpbmdzOmZ1bmN0aW9uKCl7Y29uc3QgZT11ci5kZWZhdWx0X3Byb2plY3Rfc2V0dGluZ3MoKTtpZihlWzJdKXRocm93IHNyKGVbMV0pO3JldHVybiBzcihlWzBdKX0sZm9ybWF0X251bWJlcl9saXRlcmFsOmZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtjb25zdCBhPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxjPV9yLGY9dXIuZm9ybWF0X251bWJlcl9saXRlcmFsKGUsYSxjLG5yKG4pPzQyOTQ5NjcyOTc6bj4+PjApO3ZhciBvPWZbMF0scz1mWzFdO2lmKGZbM10pdGhyb3cgbz0wLHM9MCxzcihmWzJdKTtyZXR1cm4gcj1vLGk9cyxYbihvLHMpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19LGZvcm1hdF9udW1iZXJfdmFsdWU6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9dXIuZm9ybWF0X251bWJlcl92YWx1ZShlLHMsYSk7dmFyIGk9Y1swXSxvPWNbMV07aWYoY1szXSl0aHJvdyBpPTAsbz0wLHNyKGNbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sZ2V0X2tjbF92ZXJzaW9uOmZ1bmN0aW9uKCl7bGV0IGUsdDt0cnl7Y29uc3Qgbj11ci5nZXRfa2NsX3ZlcnNpb24oKTtyZXR1cm4gZT1uWzBdLHQ9blsxXSxYbihuWzBdLG5bMV0pfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKGUsdCwxKX19LGdldF90YW5nZW50aWFsX2FyY190b19pbmZvOmZ1bmN0aW9uKGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9dXIuZ2V0X3RhbmdlbnRpYWxfYXJjX3RvX2luZm8oZSx0LG4scixpLG8scyk7cmV0dXJuIE9uLl9fd3JhcChhKX0saHVtYW5fZGlzcGxheV9udW1iZXI6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9dXIuaHVtYW5fZGlzcGxheV9udW1iZXIoZSxzLGEpO3ZhciBpPWNbMF0sbz1jWzFdO2lmKGNbM10pdGhyb3cgaT0wLG89MCxzcihjWzJdKTtyZXR1cm4gbj1pLHI9byxYbihpLG8pfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGltcG9ydF9maWxlX2V4dGVuc2lvbnM6ZnVuY3Rpb24oKXtjb25zdCBlPXVyLmltcG9ydF9maWxlX2V4dGVuc2lvbnMoKTtpZihlWzNdKXRocm93IHNyKGVbMl0pO3ZhciB0PVluKGVbMF0sZVsxXSkuc2xpY2UoKTtyZXR1cm4gdXIuX193YmluZGdlbl9mcmVlKGVbMF0sNCplWzFdLDQpLHR9LGlzX2tjbF9lbXB0eV9vcl9vbmx5X3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5pc19rY2xfZW1wdHlfb3Jfb25seV9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgc3IoclsxXSk7cmV0dXJuIHNyKHJbMF0pfSxpc19wb2ludHNfY2N3OmZ1bmN0aW9uKGUpe2NvbnN0IHQ9aXIoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyksbj1fcjtyZXR1cm4gdXIuaXNfcG9pbnRzX2Njdyh0LG4pfSxrY2xfbGludDpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yO3JldHVybiB1ci5rY2xfbGludCh0LG4pfSxrY2xfc2V0dGluZ3M6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLmtjbF9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgc3IoclsxXSk7cmV0dXJuIHNyKHJbMF0pfSxsc3BfcnVuX2NvcGlsb3Q6ZnVuY3Rpb24oZSx0LG4pe1BuKGUsRW4pO3ZhciByPWUuX19kZXN0cm95X2ludG9fcmF3KCk7Y29uc3QgaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO3JldHVybiB1ci5sc3BfcnVuX2NvcGlsb3QocixpLG8scyxhKX0sbHNwX3J1bl9rY2w6ZnVuY3Rpb24oZSx0LG4pe1BuKGUsRW4pO3ZhciByPWUuX19kZXN0cm95X2ludG9fcmF3KCk7Y29uc3QgaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO3JldHVybiB1ci5sc3BfcnVuX2tjbChyLGksbyxzLGEpfSxub2RlX3BhdGhfZnJvbV9yYW5nZTpmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3IsaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjtyZXR1cm4gdXIubm9kZV9wYXRoX2Zyb21fcmFuZ2UobixyLGksbyl9LHBhcnNlX2FwcF9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIucGFyc2VfYXBwX3NldHRpbmdzKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9LHBhcnNlX3Byb2plY3Rfc2V0dGluZ3M6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnBhcnNlX3Byb2plY3Rfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0scGFyc2Vfd2FzbTpJbixwb2ludF90b191bml0OmZ1bmN0aW9uKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yLG89b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixmPXVyLnBvaW50X3RvX3VuaXQocixpLG8scyxhLGMpO2lmKGZbM10pdGhyb3cgc3IoZlsyXSk7dmFyIGwsdSxfPShsPWZbMF0sdT1mWzFdLGw+Pj49MCxHbigpLnN1YmFycmF5KGwvOCxsLzgrdSkpLnNsaWNlKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZnJlZShmWzBdLDgqZlsxXSw4KSxffSxyZWNhc3Rfd2FzbTpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIucmVjYXN0X3dhc20odCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0scmVsZXZhbnRfZmlsZV9leHRlbnNpb25zOmZ1bmN0aW9uKCl7Y29uc3QgZT11ci5yZWxldmFudF9maWxlX2V4dGVuc2lvbnMoKTtpZihlWzNdKXRocm93IHNyKGVbMl0pO3ZhciB0PVluKGVbMF0sZVsxXSkuc2xpY2UoKTtyZXR1cm4gdXIuX193YmluZGdlbl9mcmVlKGVbMF0sNCplWzFdLDQpLHR9LHNlcmlhbGl6ZV9jb25maWd1cmF0aW9uOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9dXIuc2VyaWFsaXplX2NvbmZpZ3VyYXRpb24oZSk7aWYodFsyXSl0aHJvdyBzcih0WzFdKTtyZXR1cm4gc3IodFswXSl9LHNlcmlhbGl6ZV9wcm9qZWN0X2NvbmZpZ3VyYXRpb246ZnVuY3Rpb24oZSl7Y29uc3QgdD11ci5zZXJpYWxpemVfcHJvamVjdF9jb25maWd1cmF0aW9uKGUpO2lmKHRbMl0pdGhyb3cgc3IodFsxXSk7cmV0dXJuIHNyKHRbMF0pfSxza2V0Y2hfY2hlY2twb2ludF9saW1pdDpmdW5jdGlvbigpe3JldHVybiB1ci5za2V0Y2hfY2hlY2twb2ludF9saW1pdCgpPj4+MH0saW5pdFN5bmM6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dXIpcmV0dXJuIHVyO3ZvaWQgMCE9PWUmJihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1PYmplY3QucHJvdG90eXBlPyh7bW9kdWxlOmV9PWUpOmNvbnNvbGUud2FybigidXNpbmcgZGVwcmVjYXRlZCBwYXJhbWV0ZXJzIGZvciBgaW5pdFN5bmMoKWA7IHBhc3MgYSBzaW5nbGUgb2JqZWN0IGluc3RlYWQiKSk7Y29uc3QgdD12bigpO3JldHVybiBlIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuTW9kdWxlfHwoZT1uZXcgV2ViQXNzZW1ibHkuTW9kdWxlKGUpKSxncihuZXcgV2ViQXNzZW1ibHkuSW5zdGFuY2UoZSx0KSl9LGRlZmF1bHQ6aHJ9KTtsZXQgZHI7Y29uc3Qgd3I9e2ZpcmVNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbShlLHQsbixyKXt9LHNlbmRNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbTphc3luYyhlLHQsbixyKT0+KHBvc3RNZXNzYWdlKHt0bzoid2Vic29ja2V0IixwYXlsb2FkOnt0eXBlOiJzZW5kIixkYXRhOm59fSksZHI/LnNlbmQobiksbmV3IFByb21pc2UoKHQ9Pntjb25zdCBuPXI9PntpZihyLmRhdGEuaW5kZXhPZihlKTwwKXJldHVybjtjb25zdCBpPShvPUpTT04ucGFyc2Uoci5kYXRhKSxuZXcgbChzKS5lbmNvZGVTaGFyZWRSZWYobykpO3ZhciBvLHM7dChpKSxkci5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuKX07ZHIuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9KSkpLGFzeW5jIHN0YXJ0TmV3U2Vzc2lvbigpe319O3NlbGYuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsKGU9Pntjb25zdCB0PWUuZGF0YTtzd2l0Y2godC50byl7Y2FzZSJ3b3JrZXIiOnJldHVybiB2b2lkKCJzdGFydCI9PT10LnBheWxvYWQudHlwZSYmKGFzeW5jIGU9Pnthd2FpdCBmZXRjaChuZXcgVVJMKCIva2NsX3dhc21fbGliX2JnLndhc20iLGxvY2F0aW9uLm9yaWdpbikpLnRoZW4oKGU9PmUuYXJyYXlCdWZmZXIoKSkpLnRoZW4oKGU9PmhyKHttb2R1bGVfb3JfcGF0aDplfSkpKSxkcj1uZXcgV2ViU29ja2V0KHluLnVybENvbnN0cnVjdEZyb20oe3dlYnJ0YzohMCwuLi5lfSkpLGRyLmFkZEV2ZW50TGlzdGVuZXIoIm9wZW4iLCgoKT0+e3luLmF1dGhlbnRpY2F0ZSh7Y2xpZW50OmUuY2xpZW50fSxkcil9KSx7b25jZTohMH0pLGRyLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToibWVzc2FnZSIsZGF0YTplLmRhdGF9fSl9KSksc2V0SW50ZXJ2YWwoKCgpPT57ZHIucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOJiZkci5zZW5kKEpTT04uc3RyaW5naWZ5KHt0eXBlOiJwaW5nIn0pKX0pLDRlMyl9KSh0LnBheWxvYWQuZGF0YVswXSkpO2Nhc2Uid2Vic29ja2V0IjpyZXR1cm4gdm9pZCBkcj8uW3QucGF5bG9hZC50eXBlXSguLi50LnBheWxvYWQuZGF0YSk7Y2FzZSJ3YXNtIjpyZXR1cm4gdm9pZCgiZXhlY3V0ZSI9PT10LnBheWxvYWQudHlwZT8oKGUsdD17bWFpbktjbFBhdGhOYW1lOiJtYWluLmtjbCJ9KT0+e2NvbnN0IG49InN0cmluZyI9PXR5cGVvZiBlPyhpPWUse3JlYWRGaWxlOmFzeW5jIGU9PihuZXcgVGV4dEVuY29kZXIpLmVuY29kZShpKSxleGlzdHM6YXN5bmMgZT0+ITEsZ2V0QWxsRmlsZXM6YXN5bmMgZT0+W2ldfSk6KHI9ZSx7YXN5bmMgcmVhZEZpbGUoZSl7Y29uc3QgdD1yLmdldChlKT8/IiI7cmV0dXJuKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpfSxleGlzdHM6YXN5bmMgZT0+ci5oYXMoZSksZ2V0QWxsRmlsZXM6YXN5bmMgZT0+QXJyYXkuZnJvbShyLnZhbHVlcygpKX0pO3ZhciByLGk7Y29uc3Qgbz0ic3RyaW5nIj09dHlwZW9mIGU/ZTplLmdldCh0Lm1haW5LY2xQYXRoTmFtZSkscz1uZXcgbW4od3IsbiksYT1JbihvKVswXTtyZXR1cm4gcy5leGVjdXRlKEpTT04uc3RyaW5naWZ5KGEpLHQubWFpbktjbFBhdGhOYW1lLCJ7fSIpfSkodC5wYXlsb2FkLmRhdGFbMF0sdC5wYXlsb2FkLmRhdGFbMV0pLnRoZW4oKGU9Pntwb3N0TWVzc2FnZSh7ZnJvbToid2FzbSIscGF5bG9hZDp7dHlwZToiZXhlY3V0ZSIsZGF0YTplfX0pfSkpLmNhdGNoKChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206Indhc20iLHBheWxvYWQ6e3R5cGU6ImV4ZWN1dGUiLGRhdGE6ZX19KX0pKTpwb3N0TWVzc2FnZShiclt0LnBheWxvYWQudHlwZV0oLi4udC5wYXlsb2FkLmRhdGEpKSl9fSkpfSgpOwoK",null,!1);const Pn=(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 Fn=function(t){return t[t.DOWN=0]="DOWN",t[t.UP=1]="UP",t}(Fn||{}),Qn=function(t){return t[t.MIDDLE=1]="MIDDLE",t[t.RIGHT=2]="RIGHT",t}(Qn||{});const On={[Fn.DOWN]:"camera_drag_start",[Fn.UP]:"camera_drag_end"},En={[Qn.MIDDLE]:"pan",[Qn.RIGHT]:"rotatetrackball"};class _n extends EventTarget{removeMouseEvents=()=>{};removeResizeObserver=()=>{};constructor(t){super(),this.zooClientArgs=t,this.workerWebRTC=new jn,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.removeResizeObserver(),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()}async start(){const e=t=>{const n=t.data;"from"in n&&"websocket"===n.from&&"payload"in n&&"object"==typeof n.payload&&"data"in n.payload&&"string"==typeof n.payload.data&&n.payload.data.indexOf("auth_token_invalid")>=0&&(this.workerWebRTC.removeEventListener("message",e),this.zooClientArgs.client.oauth2.fetchAuthorizationCode())};this.zooClientArgs.client.oauth2.getAccessToken().then((t=>{var n;t?.token?.value&&(this.zooClientArgs.client.token=t?.token?.value),void 0===this.zooClientArgs.client.token&&(this.zooClientArgs.client.token="00000000-0000-0000-0000-000000000000"),this.workerWebRTC.addEventListener("message",e),this.workerWebRTC.postMessage({to:"worker",payload:{type:"start",data:[(n=this.zooClientArgs,JSON.parse(JSON.stringify(n)))]}})})).catch((e=>{"object"==typeof e&&"kind"in e&&[t.EErrorOAuth2.ErrorNoAuthCode,t.EErrorOAuth2.ErrorAccessTokenResponse].some((t=>t===e.kind))&&this.zooClientArgs.client.oauth2.fetchAuthorizationCode()}))}wasm(t,...e){return new Promise((n=>{const i=t=>{const e=t.data;"from"in e&&"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,e={mainKclPathName:"main.kcl"})=>new Promise((n=>{const i=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&"execute"===e.payload.type&&(this.workerWebRTC.removeEventListener("message",i),n(e.payload.data))};this.workerWebRTC.addEventListener("message",i),this.workerWebRTC.postMessage({to:"wasm",payload:{type:"execute",data:[t,e]}})}))}}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=gn.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;"from"in e&&"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=Fn.UP;const i=t=>i=>{const l=En[i.button];if(void 0===l)return;const o={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:On[t],interaction:l,window:{x:i.offsetX,y:i.offsetY}}})]};this.workerWebRTC.postMessage({to:"websocket",payload:o}),this.channel?.send(o.data[0]),e=i.button,n=t},l=i(Fn.DOWN),o=i(Fn.UP),c=t=>{const i=En[e];if(void 0===i)return;n=Fn.UP;const l={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:On[n],interaction:i,window:{x:t.offsetX,y:t.offsetY}}})]};this.workerWebRTC.postMessage({to:"websocket",payload:l}),this.channel?.send(l.data[0])};let s=0;const a=Pn((t=>{n===Fn.DOWN&&this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"camera_drag_move",interaction:En[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),d=Pn((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*50}}))}),1e3/30),b=e=>{this.channel=e.channel,t.addEventListener("pointerdown",l),t.addEventListener("pointermove",a.fn),t.addEventListener("pointerup",o),t.addEventListener("pointerleave",c),t.addEventListener("wheel",d.fn,{passive:!1})};this.rtcPeerConnection.addEventListener("datachannel",b),this.removeMouseEvents=()=>{this.rtcPeerConnection.removeEventListener("datachannel",b),t.removeEventListener("pointerdown",l),t.removeEventListener("pointermove",a.fn),clearInterval(a.intervalId),t.removeEventListener("pointerup",o),t.removeEventListener("pointerleave",c),t.removeEventListener("wheel",d.fn),clearInterval(d.intervalId)}}resize(t){window.requestAnimationFrame((()=>{this.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"reconfigure_stream",...t,fps:30}}))}))}addResizeObserver(t){const e=t.querySelector("video"),n=Pn((t=>{for(const n of t){const t=n.contentRect.width-n.contentRect.width%4,i=n.contentRect.height-n.contentRect.height%4;e.width=t,e.height=i,this.resize({width:t,height:i})}}),62.5),i=new ResizeObserver(n.fn);i.observe(t),this.removeResizeObserver=()=>{clearInterval(n.intervalId),i.disconnect()}}send(...t){return new Promise((e=>{const n=t=>{const i=t.data;"from"in i&&"websocket"===i.from&&(this.workerWebRTC.removeEventListener("message",n),e(i.payload.data))};this.workerWebRTC.addEventListener("message",n),this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:t}})}))}}const Dn={get_api_call:async function({client:t,id:e}){const i=`/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_api_call_for_org:async function({client:t,id:e}){const i=`/org/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_api_call_for_user:async function({client:t,id:e}){const i=`/user/api-calls/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_async_operation:async function({client:t,id:e}){const i=`/async/operations/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_api_calls_for_user:a,list_api_calls_for_user_pager:function(t){return s(a,t,"page_token")},org_list_api_calls:d,org_list_api_calls_pager:function(t){return s(d,t,"page_token")},user_list_api_calls:b,user_list_api_calls_pager:function(t){return s(b,t,"page_token")}},An={create_api_token_for_user:async function({client:t,label:e}){const i="/user/api-tokens"+n({label:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_api_token_for_user:async function({client:t,token:e}){const i=`/user/api-tokens/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_api_token_for_user:async function({client:t,token:e}){const i=`/user/api-tokens/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_api_tokens_for_user:Z,list_api_tokens_for_user_pager:function(t){return s(Z,t,"page_token")}},$n={apps_github_callback:async function({client:t}={}){const e="/apps/github/callback"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},apps_github_consent:async function({client:t}={}){const e="/apps/github/consent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},apps_github_webhook:async function({client:t,body:e}){const i="/apps/github/webhook"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/octet-stream";const a={method:"POST",headers:s,body:e},d=t?.fetch||fetch,b=await d(l,a);await o(b)}},qn={create_executor_term:class{constructor(){}static urlConstructFrom(t){const e="/ws/executor/term"+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).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(Vn(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:e,output:i,body:l}){const c=`/file/execute/${e}`+n({output:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()}},ti={create_file_center_of_mass:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/center-of-mass"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},create_file_conversion:async function({client:t,src_format:e,output_format:i,body:l}){const c=`/file/conversion/${e}/${i}`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},create_file_conversion_options:async function({client:t,files:e,body:i}){const l="/file/conversion"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)})),d.append("event",JSON.stringify(i));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,m=await Z(c,b);return await o(m),await m.json()},create_file_density:async function({client:t,src_format:e,material_mass:i,material_mass_unit:l,output_unit:c,body:s}){const a="/file/density"+n({src_format:e,material_mass:i,material_mass_unit:l,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`),Z["Content-Type"]="application/octet-stream";const m={method:"POST",headers:Z,body:s},r=t?.fetch||fetch,u=await r(d,m);return await o(u),await u.json()},create_file_mass:async function({client:t,src_format:e,material_density:i,material_density_unit:l,output_unit:c,body:s}){const a="/file/mass"+n({src_format:e,material_density:i,material_density_unit:l,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`),Z["Content-Type"]="application/octet-stream";const m={method:"POST",headers:Z,body:s},r=t?.fetch||fetch,u=await r(d,m);return await o(u),await u.json()},create_file_surface_area:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/surface-area"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},create_file_volume:async function({client:t,src_format:e,output_unit:i,body:l}){const c="/file/volume"+n({src_format:e,output_unit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:l},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()}},ei={community_sso:async function({client:t,sso:e,sig:i}){const l="/community/sso"+n({sso:e,sig:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_ipinfo:async function({client:t}={}){const e="/_meta/ipinfo"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_pricing_subscriptions:async function({client:t}={}){const e="/pricing/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_schema:async function({client:t}={}){const e="/"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},internal_get_api_token_for_discord_user:async function({client:t,discord_id:e}){const i=`/internal/discord/api-token/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},ping:async function({client:t}={}){const e="/ping"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()}},ni={create_custom_model:async function({client:t,body:e}){const i="/ml/custom/models"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_kcl_code_completions:async function({client:t,body:e}){const i="/ml/kcl/completions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_proprietary_to_kcl:async function({client:t,files:e,code_option:i}){const l="/ml/convert/proprietary-to-kcl"+n({code_option:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,m=await Z(c,b);return await o(m),await m.json()},create_text_to_cad:async function({client:t,output_format:e,kcl:i,body:l}){const c=`/ai/text-to-cad/${e}`+n({kcl:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/json";const b={method:"POST",headers:d,body:JSON.stringify(l)},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},create_text_to_cad_iteration:async function({client:t,body:e}){const i="/ml/text-to-cad/iteration"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_text_to_cad_multi_file_iteration:async function({client:t,files:e,body:i}){const l="/ml/text-to-cad/multi-file/iteration"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)})),d.append("event",JSON.stringify(i));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,m=await Z(c,b);return await o(m),await m.json()},create_text_to_cad_part_feedback:async function({client:t,id:e,feedback:i}){const l=`/user/text-to-cad/${e}`+n({feedback:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},get_custom_model:async function({client:t,id:e}){const i=`/ml/custom/models/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_text_to_cad_part_for_user:async function({client:t,id:e}){const i=`/user/text-to-cad/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_conversations_for_user:Wn,list_conversations_for_user_pager:function(t){return s(Wn,t,"page_token")},list_org_datasets_for_model:async function({client:t,id:e}){const i=`/ml/custom/models/${e}/datasets`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_text_to_cad_parts_for_user:fn,list_text_to_cad_parts_for_user_pager:function(t){return s(fn,t,"page_token")},ml_copilot_ws:class{constructor(){}static urlConstructFrom(t){const e="/ws/ml/copilot"+n({replay:t.replay,conversation_id:t.conversation_id,pr:t.pr}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).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(Vn(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 e=`/ws/ml/reasoning/${t.id}`+n({}),i=((t.client?.baseUrl||"https://api.zoo.dev")+e).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(Vn(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:e,body:i}){const l=`/ml/custom/models/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()}},ii={modeling_commands_ws:gn},li={approve_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}/approve`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_oauth2_app:async function({client:t,body:e}){const i="/org/oauth2/apps"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_user_oauth2_app:async function({client:t,body:e}){const i="/user/oauth2/apps"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_org_oauth2_app:async function({client:t,client_id:e}){const i=`/org/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_user_oauth2_app:async function({client:t,client_id:e}){const i=`/user/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},deny_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}/deny`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},device_access_token:async function({client:t,body:e}){const l="/oauth2/device/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},device_auth_confirm:async function({client:t,body:e}){const i="/oauth2/device/confirm"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},device_auth_request:async function({client:t,body:e}){const l="/oauth2/device/auth"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},device_auth_verify:async function({client:t,user_code:e,app_name:i}){const l="/oauth2/device/verify"+n({user_code:e,app_name:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_oauth2_authorization_request:async function({client:t,request_id:e}){const i=`/oauth2/authorization-requests/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_oauth2_app:async function({client:t,client_id:e}){const i=`/org/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_oauth2_app:async function({client:t,client_id:e}){const i=`/user/oauth2/apps/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_oauth2_apps_for_any_org:Yn,list_oauth2_apps_for_any_org_pager:function(t){return s(Yn,t,"page_token")},list_oauth2_apps_for_any_user:In,list_oauth2_apps_for_any_user_pager:function(t){return s(In,t,"page_token")},list_org_oauth2_apps:Rn,list_org_oauth2_apps_pager:function(t){return s(Rn,t,"page_token")},list_user_oauth2_apps:Sn,list_user_oauth2_apps_pager:function(t){return s(Sn,t,"page_token")},oauth2_authorize:async function({client:t,response_type:e,client_id:i,redirect_uri:l,state:c,scope:s,code_challenge:a,code_challenge_method:d}){const b="/oauth2/authorize"+n({response_type:e,client_id:i,redirect_uri:l,state:c,scope:s,code_challenge:a,code_challenge_method:d}),Z=(t?.baseUrl||"https://api.zoo.dev")+b,m=t&&t.token||"",r={};m&&(r.Authorization=`Bearer ${m}`);const u={method:"GET",headers:r},h=t?.fetch||fetch,p=await h(Z,u);return await o(p),await p.json()},oauth2_provider_callback:async function({client:t,provider:e,code:i,state:l,id_token:c,user:s}){const a=`/oauth2/provider/${e}/callback`+n({code:i,state:l,id_token:c,user:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`);const m={method:"GET",headers:Z},r=t?.fetch||fetch,u=await r(d,m);return await o(u),await u.json()},oauth2_provider_callback_post:async function({client:t,provider:e,body:l}){const c=`/oauth2/provider/${e}/callback`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/x-www-form-urlencoded";const b={method:"POST",headers:d,body:i(l)},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},oauth2_provider_consent:async function({client:t,provider:e,callback_url:i}){const l=`/oauth2/provider/${e}/consent`+n({callback_url:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},oauth2_token:async function({client:t,body:e}){const l="/oauth2/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},oauth2_token_revoke:async function({client:t,body:e}){const l="/oauth2/token/revoke"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:i(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_org_oauth2_app:async function({client:t,client_id:e,body:i}){const l=`/org/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_user_oauth2_app:async function({client:t,client_id:e,body:i}){const l=`/user/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},verify_oauth_account_linking:async function({client:t,token:e,callback_url:i}){const l="/oauth2/verify-account-linking"+n({token:e,callback_url:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()}},oi={create_org:async function({client:t,body:e}){const i="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_dataset:async function({client:t,body:e}){const i="/org/datasets"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_member:async function({client:t,body:e}){const i="/org/members"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_org_saml_idp:async function({client:t,body:e}){const i="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_org:async function({client:t}={}){const e="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_org_dataset:async function({client:t,id:e}){const i=`/org/datasets/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_org_member:async function({client:t,user_id:e}){const i=`/org/members/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},download_org_dataset_conversion_original:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}/original`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},download_org_dataset_successful_kcl_bulk:async function({client:t,id:e}){const i=`/org/datasets/${e}/bulk-download/kcl`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_billing_contract_for_any_org:async function({client:t,id:e}){const i=`/orgs/${e}/billing/contract`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org:async function({client:t}={}){const e="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_dataset:async function({client:t,id:e}){const i=`/org/datasets/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_dataset_conversion:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_org_dataset_conversion_stats:async function({client:t,id:e}){const i=`/org/datasets/${e}/stats`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_member:async function({client:t,user_id:e}){const i=`/org/members/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_org_privacy_settings:async function({client:t}={}){const e="/org/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_org_shortlinks:Jn,get_org_shortlinks_pager:function(t){return s(Jn,t,"page_token")},get_user_org:async function({client:t}={}){const e="/user/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_org_dataset_conversions:Kn,list_org_dataset_conversions_pager:function(t){return s(Kn,t,"page_token")},list_org_datasets:Tn,list_org_datasets_pager:function(t){return s(Tn,t,"page_token")},list_org_members:Ln,list_org_members_pager:function(t){return s(Ln,t,"page_token")},org_admin_details_get:async function({client:t,id:e}){const i=`/orgs/${e}/admin/details`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},org_dataset_s3_policies:async function({client:t,uri:e,role_arn:i}){const l="/org/dataset/s3/policies"+n({uri:e,role_arn:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},retrigger_org_dataset:async function({client:t,id:e,statuses:i}){const l=`/org/datasets/${e}/retrigger`+n({statuses:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},retrigger_org_dataset_conversion:async function({client:t,id:e,conversion_id:i}){const l=`/org/datasets/${e}/conversions/${i}/retrigger`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},search_org_dataset_conversions:Un,search_org_dataset_conversions_pager:function(t){return s(Un,t,"page_token")},search_org_dataset_semantic:async function({client:t,id:e,q:i,limit:l}){const c=`/org/datasets/${e}/search/semantic`+n({q:i,limit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},update_org:async function({client:t,body:e}){const i="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_dataset:async function({client:t,id:e,body:i}){const l=`/org/datasets/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_org_member:async function({client:t,user_id:e,body:i}){const l=`/org/members/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_org_privacy_settings:async function({client:t,body:e}){const i="/org/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_saml_idp:async function({client:t,body:e}){const i="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},upload_org_dataset_files:async function({client:t,files:e,id:i}){const l=`/org/datasets/${i}/uploads`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,m=await Z(c,b);return await o(m),await m.json()},upsert_billing_contract_for_any_org:async function({client:t,id:e,body:i}){const l=`/orgs/${e}/billing/contract`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()}},ci={create_org_subscription:async function({client:t,body:e}){const i="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_information_for_org:async function({client:t,body:e}){const i="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_information_for_user:async function({client:t,body:e}){const i="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},create_payment_intent_for_org:async function({client:t}={}){const e="/org/payment/intent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},create_payment_intent_for_user:async function({client:t}={}){const e="/user/payment/intent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},create_user_subscription:async function({client:t,body:e}){const i="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_payment_method_for_org:async function({client:t,id:e}){const i=`/org/payment/methods/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_payment_method_for_user:async function({client:t,id:e}){const i=`/user/payment/methods/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_org_subscription:async function({client:t}={}){const e="/org/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_payment_balance_for_any_org:async function({client:t,include_total_due:e,id:i}){const l=`/orgs/${i}/payment/balance`+n({include_total_due:e}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_payment_balance_for_any_user:async function({client:t,id:e,include_total_due:i}){const l=`/users/${e}/payment/balance`+n({include_total_due:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_payment_balance_for_org:async function({client:t,include_total_due:e}){const i="/org/payment/balance"+n({include_total_due:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_payment_balance_for_user:async function({client:t,include_total_due:e}){const i="/user/payment/balance"+n({include_total_due:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_subscription:async function({client:t}={}){const e="/user/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_invoices_for_org:xn,list_invoices_for_org_pager:function(t){return s(xn,t,"page_token")},list_invoices_for_user:zn,list_invoices_for_user_pager:function(t){return s(zn,t,"page_token")},list_payment_methods_for_org:async function({client:t}={}){const e="/org/payment/methods"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_payment_methods_for_user:async function({client:t}={}){const e="/user/payment/methods"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},redirect_payment_method_portal_link_for_org:async function({client:t,return_url:e}){const i="/org/payment/method-portal-link"+n({return_url:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},redirect_payment_method_portal_link_for_user:async function({client:t,return_url:e}){const i="/user/payment/method-portal-link"+n({return_url:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},set_default_payment_method_for_user:async function({client:t,id:e}){const i=`/user/payment/methods/${e}/default`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},update_org_subscription:async function({client:t,body:e}){const i="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_org_subscription_for_any_org:async function({client:t,id:e,body:i}){const l=`/orgs/${e}/payment/subscriptions`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_payment_balance_for_any_org:async function({client:t,id:e,include_total_due:i,body:l}){const c=`/orgs/${e}/payment/balance`+n({include_total_due:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/json";const b={method:"PUT",headers:d,body:JSON.stringify(l)},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},update_payment_balance_for_any_user:async function({client:t,id:e,include_total_due:i,body:l}){const c=`/users/${e}/payment/balance`+n({include_total_due:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/json";const b={method:"PUT",headers:d,body:JSON.stringify(l)},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},update_payment_information_for_org:async function({client:t,body:e}){const i="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_payment_information_for_user:async function({client:t,body:e}){const i="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_subscription:async function({client:t,body:e}){const i="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},upsert_subscription_plan_price:async function({client:t,slug:e,body:i}){const l=`/subscription-plans/${e}/prices`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"POST",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},validate_customer_tax_information_for_org:async function({client:t}={}){const e="/org/payment/tax"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},validate_customer_tax_information_for_user:async function({client:t}={}){const e="/user/payment/tax"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)}},si={create_project:async function({client:t,files:e}){const i="/user/projects"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a=new FormData;e.forEach((t=>{a.append(t.name,t.data,t.name)}));const d={method:"POST",headers:s,body:a},b=t?.fetch||fetch,Z=await b(l,d);return await o(Z),await Z.json()},create_project_share_link:async function({client:t,id:e,body:i}){const l=`/user/projects/${e}/share-links`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"POST",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},create_public_project_vote:async function({client:t,id:e}){const i=`/projects/public/${e}/vote`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_project:async function({client:t,id:e}){const i=`/user/projects/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},delete_project_share_link:async function({client:t,id:e,key:i}){const l=`/user/projects/${e}/share-links/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"DELETE",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},delete_public_project_vote:async function({client:t,id:e}){const i=`/projects/public/${e}/vote`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},download_project:async function({client:t,id:e,format:i}){const l=`/user/projects/${e}/download`+n({format:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},download_public_project:async function({client:t,id:e,format:i}){const l=`/projects/public/${e}/download`+n({format:i}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_project:async function({client:t,id:e}){const i=`/user/projects/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_project_thumbnail:async function({client:t,id:e}){const i=`/user/projects/${e}/thumbnail`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_public_project:async function({client:t,id:e}){const i=`/projects/public/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_public_project_thumbnail:async function({client:t,id:e}){const i=`/projects/public/${e}/thumbnail`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_project_categories:async function({client:t}={}){const e="/projects/categories"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_project_share_links:async function({client:t,id:e}){const i=`/user/projects/${e}/share-links`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_projects:async function({client:t}={}){const e="/user/projects"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},list_public_projects:async function({client:t}={}){const e="/projects/public"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},publish_project:async function({client:t,id:e}){const i=`/user/projects/${e}/publish`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_project:async function({client:t,files:e,id:i}){const l=`/user/projects/${i}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"PUT",headers:a,body:d},Z=t?.fetch||fetch,m=await Z(c,b);return await o(m),await m.json()}},ai={create_service_account_for_org:async function({client:t,label:e}){const i="/org/service-accounts"+n({label:e}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_service_account_for_org:async function({client:t,token:e}){const i=`/org/service-accounts/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_service_account_for_org:async function({client:t,token:e}){const i=`/org/service-accounts/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},list_service_accounts_for_org:Nn,list_service_accounts_for_org_pager:function(t){return s(Nn,t,"page_token")}},di={create_store_coupon:async function({client:t,body:e}){const i="/store/coupon"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()}},bi={get_angle_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/angle/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_area_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/area/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_current_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/current/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_energy_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/energy/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_force_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/force/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_frequency_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/frequency/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_length_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/length/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_mass_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/mass/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_power_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/power/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_pressure_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/pressure/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_temperature_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/temperature/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_torque_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/torque/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()},get_volume_unit_conversion:async function({client:t,input_unit:e,output_unit:i,value:l}){const c=`/unit/conversion/volume/${e}/${i}`+n({value:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,m=await Z(s,b);return await o(m),await m.json()}},Zi={create_user_shortlink:async function({client:t,body:e}){const i="/user/shortlinks"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},delete_user_self:async function({client:t}={}){const e="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},delete_user_shortlink:async function({client:t,key:e}){const i=`/user/shortlinks/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(l,a);await o(b)},get_oauth2_providers_for_user:async function({client:t}={}){const e="/user/oauth2/providers"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_session_for_user:async function({client:t,token:e}){const i=`/user/session/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user:async function({client:t,id:e}){const i=`/users/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_cad_user_info_form:async function({client:t}={}){const e="/user/cad-user-info"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_extended:async function({client:t,id:e}){const i=`/users-extended/${e}`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},get_user_privacy_settings:async function({client:t}={}){const e="/user/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_self:async function({client:t}={}){const e="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_self_extended:async function({client:t}={}){const e="/user/extended"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},get_user_shortlinks:wn,get_user_shortlinks_pager:function(t){return s(wn,t,"page_token")},put_public_email_marketing_consent_request:async function({client:t,body:e}){const i="/website/email-marketing-consent/request"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_public_mailing_list_subscribe:async function({client:t,slug:e,body:i}){const l=`/website/email-marketing-lists/${e}/subscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},put_public_mailing_list_unsubscribe:async function({client:t,slug:e,body:i}){const l=`/website/email-marketing-lists/${e}/unsubscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},put_public_sales_form:async function({client:t,body:e}){const i="/website/forms/sales"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_public_support_form:async function({client:t,body:e}){const i="/website/forms/support"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},put_user_cad_user_info_form:async function({client:t,body:e}){const i="/website/forms/cad-user-info"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);await o(b)},report_user_client_error:async function({client:t,body:e}){const i="/user/client-errors"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_subscription_for_user:async function({client:t,id:e,body:i}){const l=`/users/${e}/payment/subscriptions`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_user_privacy_settings:async function({client:t,body:e}){const i="/user/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_self:async function({client:t,body:e}){const i="/user"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},update_user_shortlink:async function({client:t,key:e,body:i}){const l=`/user/shortlinks/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+l,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(i)},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},user_admin_details_get:async function({client:t,id:e}){const i=`/users/${e}/admin/details`+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+i,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(l,a);return await o(b),await b.json()},user_email_marketing_consent_decline_post:async function({client:t}={}){const e="/user/email-marketing-consent/decline"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_email_marketing_consent_get:async function({client:t}={}){const e="/user/email-marketing-consent"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()},user_email_marketing_consent_request_post:async function({client:t}={}){const e="/user/email-marketing-consent/request"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_email_marketing_consent_seen_post:async function({client:t}={}){const e="/user/email-marketing-consent/seen"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(i,s);await o(d)},user_features_get:async function({client:t}={}){const e="/user/features"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+e,l=t&&t.token||"",c={};l&&(c.Authorization=`Bearer ${l}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(i,s);return await o(d),await d.json()}};exports.ApiError=l,exports.Client=class{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.clientId=t.clientId,this.redirectUrl=t.redirectUrl,this.scopes=t.scopes,this.onAccessTokenExpiry=t.onAccessTokenExpiry,this.onInvalidGrant=t.onInvalidGrant),this.token??=n,this.baseUrl??=i,this.clientId&&"undefined"!=typeof localStorage&&(this.oauth2=this.createOAuth2Client(),this.oauth2.isHTTPDecoratorActive(!0),this.fetch=this.oauth2.decorateFetchHTTPClient(this.fetch||fetch))}authorize(t){return this.oauth2.fetchAuthorizationCode(t)}isReturningFromAuthServer(){return this.oauth2.isReturningFromAuthServer()}async getAccessToken(){const t=await this.oauth2.getAccessToken();return this.updateTokenFromAccessContext(t),t}resetOAuth2(){this.oauth2.reset(),this.token=void 0}createOAuth2Client(){const n=this.baseUrl||"https://api.zoo.dev",i=this.redirectUrl||("undefined"==typeof location?void 0:`${location.origin}${location.pathname}`);if(!i)throw new Error("OAuth2 requires redirectUrl when the current browser URL is unavailable.");return new t.OAuth2AuthCodePKCE({authorizationUrl:e(n,"/oauth2/authorize"),tokenUrl:e(n,"/oauth2/token"),clientId:this.clientId,redirectUrl:i,scopes:this.scopes||[],onAccessTokenExpiry:async t=>{const e=await(this.onAccessTokenExpiry?this.onAccessTokenExpiry(t):t());return this.updateTokenFromAccessContext(e),e},onInvalidGrant:this.onInvalidGrant||(()=>{})})}updateTokenFromAccessContext(t){t?.token?.value&&(this.token=t.token.value)}},exports.Pager=c,exports.WebRTC=_n,exports.api_calls=Dn,exports.api_tokens=An,exports.apps=$n,exports.createPager=s,exports.executor=qn,exports.file=ti,exports.meta=ei,exports.ml=ni,exports.modeling=ii,exports.oauth2=li,exports.orgs=oi,exports.payments=ci,exports.projects=si,exports.service_accounts=ai,exports.store=di,exports.unit=bi,exports.users=Zi;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@kittycad/oauth2-auth-code-pkce");try{if("undefined"==typeof fetch&&"undefined"!=typeof process&&process.versions?.node){new Function("m","return import(m)")("cross-fetch/polyfill").catch((()=>{}))}}catch{}function e(t,e){return`${t.replace(/\/+$/,"")}/${e.replace(/^\/+/,"")}`}function n(t){const e=new URLSearchParams;for(const[n,l]of Object.entries(t))if(void 0!==l)if(Array.isArray(l))for(const t of l)e.append(n,String(t));else e.append(n,String(l));const n=e.toString();return n?`?${n}`:""}function l(t){const e=new URLSearchParams;for(const[n,l]of Object.entries(t||{}))if(void 0!==l)if(Array.isArray(l))for(const t of l)e.append(n,String(t));else e.append(n,String(l));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 c{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 s(t,e,n="page_token"){return new c(t,e,n)}async function a({client:t,id:e,limit:l,page_token:i,sort_by:c}){const s=`/users/${e}/api-calls`+n({limit:l,page_token:i,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},r=t?.fetch||fetch,m=await r(a,Z);await o(m);return await m.json()}async function d({client:t,limit:e,page_token:l,sort_by:i}){const c="/org/api-calls"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function b({client:t,limit:e,page_token:l,sort_by:i}){const c="/user/api-calls"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function Z({client:t,limit:e,page_token:l,sort_by:i}){const c="/user/api-tokens"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}const r=(()=>{const t=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Uint8Array.prototype),Symbol.toStringTag).get;return e=>t.call(e)})();function m(t){return"Uint8Array"===r(t)}function u(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&("ArrayBuffer"===t[Symbol.toStringTag]||"SharedArrayBuffer"===t[Symbol.toStringTag])}function h(t){return t instanceof RegExp||"[object RegExp]"===Object.prototype.toString.call(t)}function p(t){return"object"==typeof t&&null!=t&&Symbol.toStringTag in t&&"Map"===t[Symbol.toStringTag]}function y(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function X(t,e){return JSON.stringify(t,((t,e)=>"bigint"==typeof e?{$numberLong:`${e}`}:p(e)?Object.fromEntries(e):e))}const G=7,V=Symbol.for("@@mdb.bson.version"),W=2147483647,f=-2147483648,g=Math.pow(2,63)-1,Y=-Math.pow(2,63),I=Math.pow(2,53),R=-Math.pow(2,53),J=1,S=2,K=3,T=4,L=5,z=6,x=7,U=8,N=9,w=10,k=11,H=12,C=13,B=14,v=15,j=16,M=17,P=18,F=19,Q=255,O=127,E=0,_=4,D=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 A 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 $ extends A{get name(){return"BSONVersionError"}constructor(){super(`Unsupported BSON version, bson types must be from bson ${G}.x.x`)}}class q extends A{get name(){return"BSONRuntimeError"}constructor(t){super(t)}}class tt extends A{get name(){return"BSONOffsetError"}offset;constructor(t,e,n){super(`${t}. offset: ${e}`,n),this.offset=e}}let et,nt;function lt(t,e,n,l){if(l){et??=new TextDecoder("utf8",{fatal:!0});try{return et.decode(t.subarray(e,n))}catch(t){throw new A("Invalid UTF-8 string in BSON document",{cause:t})}}return nt??=new TextDecoder("utf8",{fatal:!1}),nt.decode(t.subarray(e,n))}function it(t,e,n){if(0===t.length)return"";const l=n-e;if(0===l)return"";if(l>20)return null;if(1===l&&t[e]<128)return String.fromCharCode(t[e]);if(2===l&&t[e]<128&&t[e+1]<128)return String.fromCharCode(t[e])+String.fromCharCode(t[e+1]);if(3===l&&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 i=[];for(let l=e;l<n;l++){const e=t[l];if(e>127)return null;i.push(e)}return String.fromCharCode(...i)}function ot(t){return at.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}function ct(t){return crypto.getRandomValues(at.allocate(t))}const st=(()=>{const{crypto:t}=globalThis;return null!=t&&"function"==typeof t.getRandomValues?ct:ot})(),at={isUint8Array:m,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 A("Cannot create Buffer from the passed potentialBuffer.")},allocate:t=>Buffer.alloc(t),allocateUnsafe:t=>Buffer.allocUnsafe(t),compare:(t,e)=>at.toLocalBufferType(t).compare(e),concat:t=>Buffer.concat(t),copy:(t,e,n,l,i)=>at.toLocalBufferType(t).copy(e,n??0,l??0,i??t.length),equals:(t,e)=>at.toLocalBufferType(t).equals(e),fromNumberArray:t=>Buffer.from(t),fromBase64:t=>Buffer.from(t,"base64"),fromUTF8:t=>Buffer.from(t,"utf8"),toBase64:t=>at.toLocalBufferType(t).toString("base64"),fromISO88591:t=>Buffer.from(t,"binary"),toISO88591:t=>at.toLocalBufferType(t).toString("binary"),fromHex:t=>Buffer.from(t,"hex"),toHex:t=>at.toLocalBufferType(t).toString("hex"),toUTF8(t,e,n,l){const i=n-e<=20?it(t,e,n):null;if(null!=i)return i;const o=at.toLocalBufferType(t).toString("utf8",e,n);if(l)for(let l=0;l<o.length;l++)if(65533===o.charCodeAt(l)){lt(t,e,n,!0);break}return o},utf8ByteLength:t=>Buffer.byteLength(t,"utf8"),encodeUTF8Into(t,e,n){const l=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 l=0,i=n;l<e.length;l++,i++){const n=e.charCodeAt(l);if(n>127)return null;t[i]=n}return e.length}(t,e,n);return null!=l?l:at.toLocalBufferType(t).write(e,n,void 0,"utf8")},randomBytes:st,swap32:t=>at.toLocalBufferType(t).swap32()};function dt(t){if(t<0)throw new RangeError(`The argument 'byteLength' is invalid. Received ${t}`);return rt.fromNumberArray(Array.from({length:t},(()=>Math.floor(256*Math.random()))))}const bt=(()=>{const{crypto:t}=globalThis;if(null!=t&&"function"==typeof t.getRandomValues)return e=>t.getRandomValues(rt.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})(),Zt=/(\d|[a-f])/i,rt={isUint8Array:m,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 A("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=>rt.allocate(t),compare(t,e){if(t===e)return 0;const n=Math.min(t.length,e.length);for(let l=0;l<n;l++){if(t[l]<e[l])return-1;if(t[l]>e[l])return 1}return t.length<e.length?-1:t.length>e.length?1:0},concat(t){if(0===t.length)return rt.allocate(0);let e=0;for(const n of t)e+=n.length;const n=rt.allocate(e);let l=0;for(const e of t)n.set(e,l),l+=e.length;return n},copy(t,e,n,l,i){if(void 0!==i&&i<0)throw new RangeError(`The value of "sourceEnd" is out of range. It must be >= 0. Received ${i}`);if(i=i??t.length,void 0!==l&&(l<0||l>i))throw new RangeError(`The value of "sourceStart" is out of range. It must be >= 0 and <= ${i}. Received ${l}`);if(l=l??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 o=t.subarray(l,i),c=Math.min(o.length,e.length-n);return c<=0?0:(e.set(o.subarray(0,c),n),c)},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(rt.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 l=e[t],i=e[t+1];if(!Zt.test(l))break;if(!Zt.test(i))break;const o=Number.parseInt(`${l}${i}`,16);n.push(o)}return Uint8Array.from(n)},toHex:t=>Array.from(t,(t=>t.toString(16).padStart(2,"0"))).join(""),toUTF8(t,e,n,l){const i=n-e<=20?it(t,e,n):null;return null!=i?i:lt(t,e,n,l)},utf8ByteLength:t=>(new TextEncoder).encode(t).byteLength,encodeUTF8Into(t,e,n){const l=(new TextEncoder).encode(e);return t.set(l,n),l.byteLength},randomBytes:bt,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],l=t[e+1],i=t[e+2],o=t[e+3];t[e]=o,t[e+1]=i,t[e+2]=l,t[e+3]=n}return t}},mt="function"==typeof Buffer&&!0!==Buffer.prototype?._isBuffer?at:rt,ut=Symbol.for("@@mdb.bson.type");class ht{get[ut](){return this._bsontype}get[V](){return G}[Symbol.for("nodejs.util.inspect.custom")](t,e,n){return this.inspect(t,e,n)}}const pt=new Float64Array(1),yt=new Uint8Array(pt.buffer,0,8);pt[0]=-1;const Xt=0===yt[7],Gt={isBigEndian:Xt,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:Xt?(t,e)=>(yt[7]=t[e],yt[6]=t[e+1],yt[5]=t[e+2],yt[4]=t[e+3],yt[3]=t[e+4],yt[2]=t[e+5],yt[1]=t[e+6],yt[0]=t[e+7],pt[0]):(t,e)=>(yt[0]=t[e],yt[1]=t[e+1],yt[2]=t[e+2],yt[3]=t[e+3],yt[4]=t[e+4],yt[5]=t[e+5],yt[6]=t[e+6],yt[7]=t[e+7],pt[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 l=0xffffffffn;let i=Number(n&l);t[e]=i,i>>=8,t[e+1]=i,i>>=8,t[e+2]=i,i>>=8,t[e+3]=i;let o=Number(n>>32n&l);return t[e+4]=o,o>>=8,t[e+5]=o,o>>=8,t[e+6]=o,o>>=8,t[e+7]=o,8},setFloat64LE:Xt?(t,e,n)=>(pt[0]=n,t[e]=yt[7],t[e+1]=yt[6],t[e+2]=yt[5],t[e+3]=yt[4],t[e+4]=yt[3],t[e+5]=yt[2],t[e+6]=yt[1],t[e+7]=yt[0],8):(t,e,n)=>(pt[0]=n,t[e]=yt[0],t[e+1]=yt[1],t[e+2]=yt[2],t[e+3]=yt[3],t[e+4]=yt[4],t[e+5]=yt[5],t[e+6]=yt[6],t[e+7]=yt[7],8)};class Vt extends ht{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)&&!u(t)&&!Array.isArray(t))throw new A("Binary can only be constructed from Uint8Array or number[]");this.sub_type=e??Vt.BSON_BINARY_SUBTYPE_DEFAULT,null==t?(this.buffer=mt.allocate(Vt.BUFFER_SIZE),this.position=0):(this.buffer=Array.isArray(t)?mt.fromNumberArray(t):mt.toLocalBufferType(t),this.position=this.buffer.byteLength)}put(t){if("string"==typeof t&&1!==t.length)throw new A("only accepts single character String");if("number"!=typeof t&&1!==t.length)throw new A("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 A("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=mt.allocate(Vt.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=mt.allocate(this.buffer.byteLength+t.length);e.set(this.buffer,0),this.buffer=e}if(ArrayBuffer.isView(t))this.buffer.set(mt.toLocalBufferType(t),e),this.position=e+t.byteLength>this.position?e+t.length:this.position;else if("string"==typeof t)throw new A("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 mt.toBase64(this.buffer.subarray(0,this.position))}toString(t){return"hex"===t?mt.toHex(this.buffer.subarray(0,this.position)):"base64"===t?mt.toBase64(this.buffer.subarray(0,this.position)):mt.toUTF8(this.buffer,0,this.position,!1)}toExtendedJSON(t){t=t||{},this.sub_type===Vt.SUBTYPE_VECTOR&&Wt(this);const e=mt.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===Vt.SUBTYPE_UUID)return new Yt(this.buffer.subarray(0,this.position));throw new A(`Binary sub_type "${this.sub_type}" is not supported for converting to UUID. Only "${Vt.SUBTYPE_UUID}" is currently supported.`)}static createFromHexString(t,e){return new Vt(mt.fromHex(t),e)}static createFromBase64(t,e){return new Vt(mt.fromBase64(t),e)}static fromExtendedJSON(t,e){let n,l;if(e=e||{},"$binary"in t?e.legacy&&"string"==typeof t.$binary&&"$type"in t?(l=t.$type?parseInt(t.$type,16):0,n=mt.fromBase64(t.$binary)):"string"!=typeof t.$binary&&(l=t.$binary.subType?parseInt(t.$binary.subType,16):0,n=mt.fromBase64(t.$binary.base64)):"$uuid"in t&&(l=4,n=Yt.bytesFromString(t.$uuid)),!n)throw new A(`Unexpected Binary Extended JSON format ${JSON.stringify(t)}`);return l===_?new Yt(n):new Vt(n,l)}inspect(t,e,n){n??=X;return`Binary.createFromBase64(${n(mt.toBase64(this.buffer.subarray(0,this.position)),e)}, ${n(this.sub_type,e)})`}toInt8Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Int8)throw new A("Binary datatype field is not Int8");return Wt(this),new Int8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toFloat32Array(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.Float32)throw new A("Binary datatype field is not Float32");Wt(this);const t=new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position));return Gt.isBigEndian&&mt.swap32(t),new Float32Array(t.buffer)}toPackedBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");return Wt(this),new Uint8Array(this.buffer.buffer.slice(this.buffer.byteOffset+2,this.buffer.byteOffset+this.position))}toBits(){if(this.sub_type!==Vt.SUBTYPE_VECTOR)throw new A("Binary sub_type is not Vector");if(this.buffer[0]!==Vt.VECTOR_TYPE.PackedBit)throw new A("Binary datatype field is not packed bit");Wt(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,l=this.buffer[n+2]>>7-t%8&1;e[t]=l}return e}static fromInt8Array(t){const e=mt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Int8,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2);const l=new this(e,this.SUBTYPE_VECTOR);return Wt(l),l}static fromFloat32Array(t){const e=mt.allocate(t.byteLength+2);e[0]=Vt.VECTOR_TYPE.Float32,e[1]=0;const n=new Uint8Array(t.buffer,t.byteOffset,t.byteLength);e.set(n,2),Gt.isBigEndian&&mt.swap32(new Uint8Array(e.buffer,2));const l=new this(e,this.SUBTYPE_VECTOR);return Wt(l),l}static fromPackedBits(t,e=0){const n=mt.allocate(t.byteLength+2);n[0]=Vt.VECTOR_TYPE.PackedBit,n[1]=e,n.set(t,2);const l=new this(n,this.SUBTYPE_VECTOR);return Wt(l),l}static fromBits(t){const e=t.length+7>>>3,n=new Uint8Array(e+2);n[0]=Vt.VECTOR_TYPE.PackedBit;const l=t.length%8;n[1]=0===l?0:8-l;for(let e=0;e<t.length;e++){const l=e>>>3,i=t[e];if(0!==i&&1!==i)throw new A(`Invalid bit value at ${e}: must be 0 or 1, found ${t[e]}`);if(0===i)continue;const o=7-e%8;n[l+2]|=i<<o}return new this(n,Vt.SUBTYPE_VECTOR)}}function Wt(t){if(t.sub_type!==Vt.SUBTYPE_VECTOR)return;const e=t.position,n=t.buffer[0],l=t.buffer[1];if((n===Vt.VECTOR_TYPE.Float32||n===Vt.VECTOR_TYPE.Int8)&&0!==l)throw new A("Invalid Vector: padding must be zero for int8 and float32 vectors");if(n===Vt.VECTOR_TYPE.Float32&&0!==e&&e-2!=0&&(e-2)%4!=0)throw new A("Invalid Vector: Float32 vector must contain a multiple of 4 bytes");if(n===Vt.VECTOR_TYPE.PackedBit&&0!==l&&2===e)throw new A("Invalid Vector: padding must be zero for packed bit vectors that are empty");if(n===Vt.VECTOR_TYPE.PackedBit&&l>7)throw new A(`Invalid Vector: padding must be a value between 0 and 7. found: ${l}`)}const ft=/^[0-9A-F]{32}$/i,gt=/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i;class Yt extends Vt{constructor(t){let e;if(null==t)e=Yt.generate();else if(t instanceof Yt)e=mt.toLocalBufferType(new Uint8Array(t.buffer));else if(ArrayBuffer.isView(t)&&16===t.byteLength)e=mt.toLocalBufferType(t);else{if("string"!=typeof t)throw new A("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=Yt.bytesFromString(t)}super(e,_)}get id(){return this.buffer}set id(t){this.buffer=t}toHexString(t=!0){return t?[mt.toHex(this.buffer.subarray(0,4)),mt.toHex(this.buffer.subarray(4,6)),mt.toHex(this.buffer.subarray(6,8)),mt.toHex(this.buffer.subarray(8,10)),mt.toHex(this.buffer.subarray(10,16))].join("-"):mt.toHex(this.buffer)}toString(t){return"hex"===t?mt.toHex(this.id):"base64"===t?mt.toBase64(this.id):this.toHexString()}toJSON(){return this.toHexString()}equals(t){if(!t)return!1;if(t instanceof Yt)return mt.equals(t.id,this.id);try{return mt.equals(new Yt(t).id,this.id)}catch{return!1}}toBinary(){return new Vt(this.id,Vt.SUBTYPE_UUID)}static generate(){const t=mt.randomBytes(16);return t[6]=15&t[6]|64,t[8]=63&t[8]|128,t}static isValid(t){return!!t&&("string"==typeof t?Yt.isValidUUIDString(t):m(t)?16===t.byteLength:"Binary"===t._bsontype&&t.sub_type===this.SUBTYPE_UUID&&16===t.buffer.byteLength)}static createFromHexString(t){const e=Yt.bytesFromString(t);return new Yt(e)}static createFromBase64(t){return new Yt(mt.fromBase64(t))}static bytesFromString(t){if(!Yt.isValidUUIDString(t))throw new A("UUID string representation must be 32 hex digits or canonical hyphenated representation");return mt.fromHex(t.replace(/-/g,""))}static isValidUUIDString(t){return ft.test(t)||gt.test(t)}inspect(t,e,n){return n??=X,`new UUID(${n(this.toHexString(),e)})`}}class It extends ht{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 It(t.$code,t.$scope)}inspect(t,e,n){n??=X;let l=n(this.code,e);const i=l.includes("\n");null!=this.scope&&(l+=`,${i?"\n":" "}${n(this.scope,e)}`);return`new Code(${i?"\n":""}${l}${i&&null===this.scope?"\n":""})`}}function Rt(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 Jt extends ht{get _bsontype(){return"DBRef"}collection;oid;db;fields;constructor(t,e,n,l){super();const i=t.split(".");2===i.length&&(n=i.shift(),t=i.shift()),this.collection=t,this.oid=e,this.db=n,this.fields=l||{}}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 Jt(t.$ref,t.$id,t.$db,e)}inspect(t,e,n){n??=X;const l=[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 l[1]=n===X?`new ObjectId(${l[1]})`:l[1],`new DBRef(${l.join(", ")})`}}function St(t){if(""===t)return t;let e=0;const n="-"===t[e],l="+"===t[e];(l||n)&&(e+=1);let i=!1;for(;e<t.length&&"0"===t[e];++e)i=!0;return i?`${n?"-":""}${t.length===e?"0":t.slice(e)}`:l?t.slice(1):t}let Kt;try{Kt=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 Tt=4294967296,Lt=0x10000000000000000,zt=Lt/2,xt={},Ut={},Nt=/^(\+?0|(\+|-)?[1-9][0-9]*)$/;class wt extends ht{get _bsontype(){return"Long"}get __isLong__(){return!0}high;low;unsigned;constructor(t=0,e,n){super();const l="boolean"==typeof e?e:Boolean(n),i="number"==typeof e?e:0,o="string"==typeof t?wt.fromString(t,l):"bigint"==typeof t?wt.fromBigInt(t,l):{low:0|t,high:0|i,unsigned:l};this.low=o.low,this.high=o.high,this.unsigned=o.unsigned}static TWO_PWR_24=wt.fromInt(16777216);static MAX_UNSIGNED_VALUE=wt.fromBits(-1,-1,!0);static ZERO=wt.fromInt(0);static UZERO=wt.fromInt(0,!0);static ONE=wt.fromInt(1);static UONE=wt.fromInt(1,!0);static NEG_ONE=wt.fromInt(-1);static MAX_VALUE=wt.fromBits(-1,2147483647,!1);static MIN_VALUE=wt.fromBits(0,-2147483648,!1);static fromBits(t,e,n){return new wt(t,e,n)}static fromInt(t,e){let n,l,i;return e?(i=0<=(t>>>=0)&&t<256)&&(l=Ut[t],l)?l:(n=wt.fromBits(t,(0|t)<0?-1:0,!0),i&&(Ut[t]=n),n):(i=-128<=(t|=0)&&t<128)&&(l=xt[t],l)?l:(n=wt.fromBits(t,t<0?-1:0,!1),i&&(xt[t]=n),n)}static fromNumber(t,e){if(isNaN(t))return e?wt.UZERO:wt.ZERO;if(e){if(t<0)return wt.UZERO;if(t>=Lt)return wt.MAX_UNSIGNED_VALUE}else{if(t<=-zt)return wt.MIN_VALUE;if(t+1>=zt)return wt.MAX_VALUE}return t<0?wt.fromNumber(-t,e).neg():wt.fromBits(t%Tt|0,t/Tt|0,e)}static fromBigInt(t,e){const n=0xffffffffn;return new wt(Number(t&n),Number(t>>32n&n),e)}static _fromString(t,e,n){if(0===t.length)throw new A("empty string");if(n<2||36<n)throw new A("radix");let l;if((l=t.indexOf("-"))>0)throw new A("interior hyphen");if(0===l)return wt._fromString(t.substring(1),e,n).neg();const i=wt.fromNumber(Math.pow(n,8));let o=wt.ZERO;for(let e=0;e<t.length;e+=8){const l=Math.min(8,t.length-e),c=parseInt(t.substring(e,e+l),n);if(l<8){const t=wt.fromNumber(Math.pow(n,l));o=o.mul(t).add(wt.fromNumber(c))}else o=o.mul(i),o=o.add(wt.fromNumber(c))}return o.unsigned=e,o}static fromStringStrict(t,e,n){let l=!1;if("number"==typeof e?(n=e,e=!1):l=!!e,n??=10,t.trim()!==t)throw new A(`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 A(`Input: '${t}' contains invalid characters for radix: ${n}`);const i=St(t),o=wt._fromString(i,l,n);if(o.toString(n).toLowerCase()!==i.toLowerCase())throw new A(`Input: ${t} is not representable as ${o.unsigned?"an unsigned":"a signed"} 64-bit Long ${null!=n?`with radix: ${n}`:""}`);return o}static fromString(t,e,n){let l=!1;return"number"==typeof e?(n=e,e=!1):l=!!e,n??=10,"NaN"===t&&n<24||("Infinity"===t||"+Infinity"===t||"-Infinity"===t)&&n<35?wt.ZERO:wt._fromString(t,l,n)}static fromBytes(t,e,n){return n?wt.fromBytesLE(t,e):wt.fromBytesBE(t,e)}static fromBytesLE(t,e){return new wt(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 wt(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?wt.fromNumber(t,e):"string"==typeof t?wt.fromString(t,e):wt.fromBits(t.low,t.high,"boolean"==typeof e?e:t.unsigned)}add(t){wt.isLong(t)||(t=wt.fromValue(t));const e=this.high>>>16,n=65535&this.high,l=this.low>>>16,i=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16;let a=0,d=0,b=0,Z=0;return Z+=i+(65535&t.low),b+=Z>>>16,Z&=65535,b+=l+s,d+=b>>>16,b&=65535,d+=n+c,a+=d>>>16,d&=65535,a+=e+o,a&=65535,wt.fromBits(b<<16|Z,a<<16|d,this.unsigned)}and(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low&t.low,this.high&t.high,this.unsigned)}compare(t){if(wt.isLong(t)||(t=wt.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(wt.isLong(t)||(t=wt.fromValue(t)),t.isZero())throw new A("division by zero");if(Kt){if(!this.unsigned&&-2147483648===this.high&&-1===t.low&&-1===t.high)return this;const e=(this.unsigned?Kt.div_u:Kt.div_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,Kt.get_high(),this.unsigned)}if(this.isZero())return this.unsigned?wt.UZERO:wt.ZERO;let e,n,l;if(this.unsigned){if(t.unsigned||(t=t.toUnsigned()),t.gt(this))return wt.UZERO;if(t.gt(this.shru(1)))return wt.UONE;l=wt.UZERO}else{if(this.eq(wt.MIN_VALUE)){if(t.eq(wt.ONE)||t.eq(wt.NEG_ONE))return wt.MIN_VALUE;if(t.eq(wt.MIN_VALUE))return wt.ONE;return e=this.shr(1).div(t).shl(1),e.eq(wt.ZERO)?t.isNegative()?wt.ONE:wt.NEG_ONE:(n=this.sub(t.mul(e)),l=e.add(n.div(t)),l)}if(t.eq(wt.MIN_VALUE))return this.unsigned?wt.UZERO:wt.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();l=wt.ZERO}for(n=this;n.gte(t);){e=Math.max(1,Math.floor(n.toNumber()/t.toNumber()));const i=Math.ceil(Math.log(e)/Math.LN2),o=i<=48?1:Math.pow(2,i-48);let c=wt.fromNumber(e),s=c.mul(t);for(;s.isNegative()||s.gt(n);)e-=o,c=wt.fromNumber(e,this.unsigned),s=c.mul(t);c.isZero()&&(c=wt.ONE),l=l.add(c),n=n.sub(s)}return l}div(t){return this.divide(t)}equals(t){return wt.isLong(t)||(t=wt.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(wt.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(wt.isLong(t)||(t=wt.fromValue(t)),Kt){const e=(this.unsigned?Kt.rem_u:Kt.rem_s)(this.low,this.high,t.low,t.high);return wt.fromBits(e,Kt.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 wt.ZERO;if(wt.isLong(t)||(t=wt.fromValue(t)),Kt){const e=Kt.mul(this.low,this.high,t.low,t.high);return wt.fromBits(e,Kt.get_high(),this.unsigned)}if(t.isZero())return wt.ZERO;if(this.eq(wt.MIN_VALUE))return t.isOdd()?wt.MIN_VALUE:wt.ZERO;if(t.eq(wt.MIN_VALUE))return this.isOdd()?wt.MIN_VALUE:wt.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(wt.TWO_PWR_24)&&t.lt(wt.TWO_PWR_24))return wt.fromNumber(this.toNumber()*t.toNumber(),this.unsigned);const e=this.high>>>16,n=65535&this.high,l=this.low>>>16,i=65535&this.low,o=t.high>>>16,c=65535&t.high,s=t.low>>>16,a=65535&t.low;let d=0,b=0,Z=0,r=0;return r+=i*a,Z+=r>>>16,r&=65535,Z+=l*a,b+=Z>>>16,Z&=65535,Z+=i*s,b+=Z>>>16,Z&=65535,b+=n*a,d+=b>>>16,b&=65535,b+=l*s,d+=b>>>16,b&=65535,b+=i*c,d+=b>>>16,b&=65535,d+=e*a+n*s+l*c+i*o,d&=65535,wt.fromBits(Z<<16|r,d<<16|b,this.unsigned)}mul(t){return this.multiply(t)}negate(){return!this.unsigned&&this.eq(wt.MIN_VALUE)?wt.MIN_VALUE:this.not().add(wt.ONE)}neg(){return this.negate()}not(){return wt.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 wt.isLong(t)||(t=wt.fromValue(t)),wt.fromBits(this.low|t.low,this.high|t.high,this.unsigned)}shiftLeft(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low<<t,this.high<<t|this.low>>>32-t,this.unsigned):wt.fromBits(0,this.low<<t-32,this.unsigned)}shl(t){return this.shiftLeft(t)}shiftRight(t){return wt.isLong(t)&&(t=t.toInt()),0==(t&=63)?this:t<32?wt.fromBits(this.low>>>t|this.high<<32-t,this.high>>t,this.unsigned):wt.fromBits(this.high>>t-32,this.high>=0?0:-1,this.unsigned)}shr(t){return this.shiftRight(t)}shiftRightUnsigned(t){if(wt.isLong(t)&&(t=t.toInt()),0===(t&=63))return this;{const e=this.high;if(t<32){const n=this.low;return wt.fromBits(n>>>t|e<<32-t,e>>>t,this.unsigned)}return 32===t?wt.fromBits(e,0,this.unsigned):wt.fromBits(e>>>t-32,0,this.unsigned)}}shr_u(t){return this.shiftRightUnsigned(t)}shru(t){return this.shiftRightUnsigned(t)}subtract(t){return wt.isLong(t)||(t=wt.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)*Tt+(this.low>>>0):this.high*Tt+(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?wt.fromBits(this.low,this.high,!1):this}toString(t){if((t=t||10)<2||36<t)throw new A("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(wt.MIN_VALUE)){const e=wt.fromNumber(t),n=this.div(e),l=n.mul(e).sub(this);return n.toString(t)+l.toInt().toString(t)}return"-"+this.neg().toString(t)}const e=wt.fromNumber(Math.pow(t,6),this.unsigned);let n=this,l="";for(;;){const i=n.div(e);let o=(n.sub(i.mul(e)).toInt()>>>0).toString(t);if(n=i,n.isZero())return o+l;for(;o.length<6;)o="0"+o;l=""+o+l}}toUnsigned(){return this.unsigned?this:wt.fromBits(this.low,this.high,!0)}xor(t){return wt.isLong(t)||(t=wt.fromValue(t)),wt.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:l=!0}={...e};if(t.$numberLong.length>20)throw new A("$numberLong string is too long");if(!Nt.test(t.$numberLong))throw new A(`$numberLong string "${t.$numberLong}" is in an invalid format`);if(n){const e=BigInt(t.$numberLong);return BigInt.asIntN(64,e)}const i=wt.fromString(t.$numberLong);return l?i.toNumber():i}inspect(t,e,n){n??=X;return`new Long(${n(this.toString(),e)}${this.unsigned?`, ${n(this.unsigned,e)}`:""})`}}const kt=/^(\+|-)?(\d+|(\d*\.\d*))?(E|e)?([-+])?(\d+)?$/,Ht=/^(\+|-)?(Infinity|inf)$/i,Ct=/^(\+|-)?NaN$/i,Bt=6111,vt=-6176,jt=mt.fromNumberArray([124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Mt=mt.fromNumberArray([248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Pt=mt.fromNumberArray([120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].reverse()),Ft=/^([-+])?(\d+)?$/;function Qt(t){return!isNaN(parseInt(t,10))}function Ot(t){const e=wt.fromNumber(1e9);let n=wt.fromNumber(0);if(!(t.parts[0]||t.parts[1]||t.parts[2]||t.parts[3]))return{quotient:t,rem:n};for(let l=0;l<=3;l++)n=n.shiftLeft(32),n=n.add(new wt(t.parts[l],0)),t.parts[l]=n.div(e).low,n=n.modulo(e);return{quotient:t,rem:n}}function Et(t,e){throw new A(`"${t}" is not a valid Decimal128 string - ${e}`)}class _t extends ht{get _bsontype(){return"Decimal128"}bytes;constructor(t){if(super(),"string"==typeof t)this.bytes=_t.fromString(t).bytes;else{if(!(t instanceof Uint8Array||m(t)))throw new A("Decimal128 must take a Buffer or string");if(16!==t.byteLength)throw new A("Decimal128 must take a Buffer of 16 bytes");this.bytes=t}}static fromString(t){return _t._fromString(t,{allowRounding:!1})}static fromStringWithRounding(t){return _t._fromString(t,{allowRounding:!0})}static _fromString(t,e){let n=!1,l=!1,i=!1,o=!1,c=0,s=0,a=0,d=0,b=0;const Z=[0];let r=0,m=0,u=0,h=0,p=new wt(0,0),y=new wt(0,0),X=0,G=0;if(t.length>=7e3)throw new A(t+" not a valid Decimal128 string");const V=t.match(kt),W=t.match(Ht),f=t.match(Ct);if(!V&&!W&&!f||0===t.length)throw new A(t+" not a valid Decimal128 string");if(V){const e=V[2],n=V[4],l=V[5],i=V[6];n&&void 0===i&&Et(t,"missing exponent power"),n&&void 0===e&&Et(t,"missing exponent base"),void 0===n&&(l||i)&&Et(t,"missing e before exponent")}if("+"!==t[G]&&"-"!==t[G]||(l=!0,n="-"===t[G++]),!Qt(t[G])&&"."!==t[G]){if("i"===t[G]||"I"===t[G])return new _t(n?Mt:Pt);if("N"===t[G])return new _t(jt)}for(;Qt(t[G])||"."===t[G];)"."!==t[G]?(r<34&&("0"!==t[G]||o)&&(o||(b=s),o=!0,Z[m++]=parseInt(t[G],10),r+=1),o&&(a+=1),i&&(d+=1),s+=1,G+=1):(i&&Et(t,"contains multiple periods"),i=!0,G+=1);if(i&&!s)throw new A(t+" not a valid Decimal128 string");if("e"===t[G]||"E"===t[G]){const e=t.substr(++G).match(Ft);if(!e||!e[2])return new _t(jt);h=parseInt(e[0],10),G+=e[0].length}if(t[G])return new _t(jt);if(r){if(u=r-1,c=a,1!==c)for(;"0"===t[b+c-1+Number(l)+Number(i)];)c-=1}else Z[0]=0,a=1,r=1,c=0;for(h<=d&&d>h+16384?h=vt:h-=d;h>Bt;){if(u+=1,u>=34){if(0===c){h=Bt;break}Et(t,"overflow")}h-=1}if(e.allowRounding){for(;h<vt||r<a;){if(0===u&&c<r){h=vt,c=0;break}if(r<a?a-=1:u-=1,h<Bt)h+=1;else{if(Z.join("").match(/^0+$/)){h=Bt;break}Et(t,"overflow")}}if(u+1<c){let e=s;i&&(b+=1,e+=1),l&&(b+=1,e+=1);const o=parseInt(t[b+u+1],10);let c=0;if(o>=5&&(c=1,5===o)){c=Z[u]%2==1?1:0;for(let n=b+u+2;n<e;n++)if(parseInt(t[n],10)){c=1;break}}if(c){let t=u;for(;t>=0&&++Z[t]>9;t--)if(Z[t]=0,0===t){if(!(h<Bt))return new _t(n?Mt:Pt);h+=1,Z[t]=1}}}}else{for(;h<vt||r<a;){if(0===u){if(0===c){h=vt;break}Et(t,"exponent underflow")}r<a?("0"!==t[a-1+Number(l)+Number(i)]&&0!==c&&Et(t,"inexact rounding"),a-=1):(0!==Z[u]&&Et(t,"inexact rounding"),u-=1),h<Bt?h+=1:Et(t,"overflow")}if(u+1<c){i&&(b+=1),l&&(b+=1);0!==parseInt(t[b+u+1],10)&&Et(t,"inexact rounding")}}if(p=wt.fromNumber(0),y=wt.fromNumber(0),0===c)p=wt.fromNumber(0),y=wt.fromNumber(0);else if(u<17){let t=0;for(y=wt.fromNumber(Z[t++]),p=new wt(0,0);t<=u;t++)y=y.multiply(wt.fromNumber(10)),y=y.add(wt.fromNumber(Z[t]))}else{let t=0;for(p=wt.fromNumber(Z[t++]);t<=u-17;t++)p=p.multiply(wt.fromNumber(10)),p=p.add(wt.fromNumber(Z[t]));for(y=wt.fromNumber(Z[t++]);t<=u;t++)y=y.multiply(wt.fromNumber(10)),y=y.add(wt.fromNumber(Z[t]))}const g=function(t,e){if(!t&&!e)return{high:wt.fromNumber(0),low:wt.fromNumber(0)};const n=t.shiftRightUnsigned(32),l=new wt(t.getLowBits(),0),i=e.shiftRightUnsigned(32),o=new wt(e.getLowBits(),0);let c=n.multiply(i),s=n.multiply(o);const a=l.multiply(i);let d=l.multiply(o);return c=c.add(s.shiftRightUnsigned(32)),s=new wt(s.getLowBits(),0).add(a).add(d.shiftRightUnsigned(32)),c=c.add(s.shiftRightUnsigned(32)),d=s.shiftLeft(32).add(new wt(d.getLowBits(),0)),{high:c,low:d}}(p,wt.fromString("100000000000000000"));g.low=g.low.add(y),function(t,e){const n=t.high>>>0,l=e.high>>>0;if(n<l)return!0;if(n===l&&t.low>>>0<e.low>>>0)return!0;return!1}(g.low,y)&&(g.high=g.high.add(wt.fromNumber(1))),X=h+6176;const Y={low:wt.fromNumber(0),high:wt.fromNumber(0)};g.high.shiftRightUnsigned(49).and(wt.fromNumber(1)).equals(wt.fromNumber(1))?(Y.high=Y.high.or(wt.fromNumber(3).shiftLeft(61)),Y.high=Y.high.or(wt.fromNumber(X).and(wt.fromNumber(16383).shiftLeft(47))),Y.high=Y.high.or(g.high.and(wt.fromNumber(0x7fffffffffff)))):(Y.high=Y.high.or(wt.fromNumber(16383&X).shiftLeft(49)),Y.high=Y.high.or(g.high.and(wt.fromNumber(562949953421311)))),Y.low=g.low,n&&(Y.high=Y.high.or(wt.fromString("9223372036854775808")));const I=mt.allocateUnsafe(16);return G=0,I[G++]=255&Y.low.low,I[G++]=Y.low.low>>8&255,I[G++]=Y.low.low>>16&255,I[G++]=Y.low.low>>24&255,I[G++]=255&Y.low.high,I[G++]=Y.low.high>>8&255,I[G++]=Y.low.high>>16&255,I[G++]=Y.low.high>>24&255,I[G++]=255&Y.high.low,I[G++]=Y.high.low>>8&255,I[G++]=Y.high.low>>16&255,I[G++]=Y.high.low>>24&255,I[G++]=255&Y.high.high,I[G++]=Y.high.high>>8&255,I[G++]=Y.high.high>>16&255,I[G++]=Y.high.high>>24&255,new _t(I)}toString(){let t,e=0;const n=new Array(36);for(let t=0;t<n.length;t++)n[t]=0;let l,i,o,c=0,s=!1,a={parts:[0,0,0,0]};const d=[];c=0;const b=this.bytes,Z=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,r=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,m=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24,u=b[c++]|b[c++]<<8|b[c++]<<16|b[c++]<<24;c=0;({low:new wt(Z,r),high:new wt(m,u)}).high.lessThan(wt.ZERO)&&d.push("-");const h=u>>26&31;if(h>>3==3){if(30===h)return d.join("")+"Infinity";if(31===h)return"NaN";t=u>>15&16383,l=8+(u>>14&1)}else l=u>>14&7,t=u>>17&16383;const p=t-6176;if(a.parts[0]=(16383&u)+((15&l)<<14),a.parts[1]=m,a.parts[2]=r,a.parts[3]=Z,0===a.parts[0]&&0===a.parts[1]&&0===a.parts[2]&&0===a.parts[3])s=!0;else for(o=3;o>=0;o--){let t=0;const e=Ot(a);if(a=e.quotient,t=e.rem.low,t)for(i=8;i>=0;i--)n[9*o+i]=t%10,t=Math.floor(t/10)}if(s)e=1,n[c]=0;else for(e=36;!n[c];)e-=1,c+=1;const y=e-1+p;if(y>=34||y<=-7||p>0){if(e>34)return d.push("0"),p>0?d.push(`E+${p}`):p<0&&d.push(`E${p}`),d.join("");d.push(`${n[c++]}`),e-=1,e&&d.push(".");for(let t=0;t<e;t++)d.push(`${n[c++]}`);d.push("E"),y>0?d.push(`+${y}`):d.push(`${y}`)}else if(p>=0)for(let t=0;t<e;t++)d.push(`${n[c++]}`);else{let t=e+p;if(t>0)for(let e=0;e<t;e++)d.push(`${n[c++]}`);else d.push("0");for(d.push(".");t++<0;)d.push("0");for(let l=0;l<e-Math.max(t-1,0);l++)d.push(`${n[c++]}`)}return d.join("")}toJSON(){return{$numberDecimal:this.toString()}}toExtendedJSON(){return{$numberDecimal:this.toString()}}static fromExtendedJSON(t){return _t.fromString(t.$numberDecimal)}inspect(t,e,n){n??=X;return`new Decimal128(${n(this.toString(),e)})`}}class Dt extends ht{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 Dt(NaN);if("Infinity"===t)return new Dt(1/0);if("-Infinity"===t)return new Dt(-1/0);if(!Number.isFinite(e))throw new A(`Input: ${t} is not representable as a Double`);if(t.trim()!==t)throw new A(`Input: '${t}' contains whitespace`);if(""===t)throw new A("Input is an empty string");if(/[^-0-9.+eE]/.test(t))throw new A(`Input: '${t}' is not in decimal or exponential notation`);return new Dt(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 Dt(n)}inspect(t,e,n){return n??=X,`new Double(${n(this.value,e)})`}}class At extends ht{get _bsontype(){return"Int32"}value;constructor(t){super(),t instanceof Number&&(t=t.valueOf()),this.value=0|+t}static fromString(t){const e=St(t),n=Number(t);if(W<n)throw new A(`Input: '${t}' is larger than the maximum value for Int32`);if(f>n)throw new A(`Input: '${t}' is smaller than the minimum value for Int32`);if(!Number.isSafeInteger(n))throw new A(`Input: '${t}' is not a safe integer`);if(n.toString()!==e)throw new A(`Input: '${t}' is not a valid Int32 string`);return new At(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 At(t.$numberInt)}inspect(t,e,n){return n??=X,`new Int32(${n(this.value,e)})`}}class $t extends ht{get _bsontype(){return"MaxKey"}toExtendedJSON(){return{$maxKey:1}}static fromExtendedJSON(){return new $t}inspect(){return"new MaxKey()"}}class qt extends ht{get _bsontype(){return"MinKey"}toExtendedJSON(){return{$minKey:1}}static fromExtendedJSON(){return new qt}inspect(){return"new MinKey()"}}let te=null;const ee=new WeakMap;class ne extends ht{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 A("Argument passed in must have an id that is of type string or Buffer");e="toHexString"in t&&"function"==typeof t.toHexString?mt.fromHex(t.toHexString()):t.id}else e=t;if(null==e)this.buffer=ne.generate();else if(ArrayBuffer.isView(e)&&12===e.byteLength)this.buffer=mt.toLocalBufferType(e);else{if("string"!=typeof e)throw new A("Argument passed in does not match the accepted types");if(!ne.validateHexString(e))throw new A("input must be a 24 character hex string, 12 byte Uint8Array, or an integer");this.buffer=mt.fromHex(e),ne.cacheHexString&&ee.set(this,e)}}get id(){return this.buffer}set id(t){this.buffer=t,ne.cacheHexString&&ee.set(this,mt.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(ne.cacheHexString){const t=ee.get(this);if(t)return t}const t=mt.toHex(this.id);return ne.cacheHexString&&ee.set(this,t),t}static getInc(){return ne.index=(ne.index+1)%16777215}static generate(t){"number"!=typeof t&&(t=Math.floor(Date.now()/1e3));const e=ne.getInc(),n=mt.allocateUnsafe(12);return Gt.setInt32BE(n,0,t),null===te&&(te=mt.randomBytes(5)),n[4]=te[0],n[5]=te[1],n[6]=te[2],n[7]=te[3],n[8]=te[4],n[11]=255&e,n[10]=e>>8&255,n[9]=e>>16&255,n}toString(t){return"base64"===t?mt.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(ne.is(t))return this.buffer[11]===t.buffer[11]&&mt.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=Gt.getUint32BE(this.buffer,0);return t.setTime(1e3*Math.floor(e)),t}static createPk(){return new ne}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=mt.allocate(12);for(let t=11;t>=4;t--)e[t]=0;return Gt.setInt32BE(e,0,t),new ne(e)}static createFromHexString(t){if(24!==t?.length)throw new A("hex string must be 24 characters");return new ne(mt.fromHex(t))}static createFromBase64(t){if(16!==t?.length)throw new A("base64 string must be 16 characters");return new ne(mt.fromBase64(t))}static isValid(t){if(null==t)return!1;if("string"==typeof t)return ne.validateHexString(t);try{return new ne(t),!0}catch{return!1}}toExtendedJSON(){return this.toHexString?{$oid:this.toHexString()}:{$oid:this.toString("hex")}}static fromExtendedJSON(t){return new ne(t.$oid)}isCached(){return ne.cacheHexString&&ee.has(this)}inspect(t,e,n){return n??=X,`new ObjectId(${n(this.toHexString(),e)})`}}function le(t,e,n){let l=5;if(Array.isArray(t))for(let i=0;i<t.length;i++)l+=ie(i.toString(),t[i],e,!0,n);else{"function"==typeof t?.toBSON&&(t=t.toBSON());for(const i of Object.keys(t))l+=ie(i,t[i],e,!1,n)}return l}function ie(t,e,n=!1,l=!1,i=!1){switch("function"==typeof e?.toBSON&&(e=e.toBSON()),typeof e){case"string":return 1+mt.utf8ByteLength(t)+1+4+mt.utf8ByteLength(e)+1;case"number":return Math.floor(e)===e&&e>=R&&e<=I&&e>=f&&e<=W?(null!=t?mt.utf8ByteLength(t)+1:0)+5:(null!=t?mt.utf8ByteLength(t)+1:0)+9;case"undefined":return l||!i?(null!=t?mt.utf8ByteLength(t)+1:0)+1:0;case"boolean":return(null!=t?mt.utf8ByteLength(t)+1:0)+2;case"object":if(null!=e&&"string"==typeof e._bsontype&&e[V]!==G)throw new $;if(null==e||"MinKey"===e._bsontype||"MaxKey"===e._bsontype)return(null!=t?mt.utf8ByteLength(t)+1:0)+1;if("ObjectId"===e._bsontype)return(null!=t?mt.utf8ByteLength(t)+1:0)+13;if(e instanceof Date||y(e))return(null!=t?mt.utf8ByteLength(t)+1:0)+9;if(ArrayBuffer.isView(e)||e instanceof ArrayBuffer||u(e))return(null!=t?mt.utf8ByteLength(t)+1:0)+6+e.byteLength;if("Long"===e._bsontype||"Double"===e._bsontype||"Timestamp"===e._bsontype)return(null!=t?mt.utf8ByteLength(t)+1:0)+9;if("Decimal128"===e._bsontype)return(null!=t?mt.utf8ByteLength(t)+1:0)+17;if("Code"===e._bsontype)return null!=e.scope&&Object.keys(e.scope).length>0?(null!=t?mt.utf8ByteLength(t)+1:0)+1+4+4+mt.utf8ByteLength(e.code.toString())+1+le(e.scope,n,i):(null!=t?mt.utf8ByteLength(t)+1:0)+1+4+mt.utf8ByteLength(e.code.toString())+1;if("Binary"===e._bsontype){const n=e;return n.sub_type===Vt.SUBTYPE_BYTE_ARRAY?(null!=t?mt.utf8ByteLength(t)+1:0)+(n.position+1+4+1+4):(null!=t?mt.utf8ByteLength(t)+1:0)+(n.position+1+4+1)}if("Symbol"===e._bsontype)return(null!=t?mt.utf8ByteLength(t)+1:0)+mt.utf8ByteLength(e.value)+4+1+1;if("DBRef"===e._bsontype){const l=Object.assign({$ref:e.collection,$id:e.oid},e.fields);return null!=e.db&&(l.$db=e.db),(null!=t?mt.utf8ByteLength(t)+1:0)+1+le(l,n,i)}return e instanceof RegExp||h(e)?(null!=t?mt.utf8ByteLength(t)+1:0)+1+mt.utf8ByteLength(e.source)+1+(e.global?1:0)+(e.ignoreCase?1:0)+(e.multiline?1:0)+1:"BSONRegExp"===e._bsontype?(null!=t?mt.utf8ByteLength(t)+1:0)+1+mt.utf8ByteLength(e.pattern)+1+mt.utf8ByteLength(e.options)+1:(null!=t?mt.utf8ByteLength(t)+1:0)+le(e,n,i)+1;case"function":return n?(null!=t?mt.utf8ByteLength(t)+1:0)+1+4+mt.utf8ByteLength(e.toString())+1:0;case"bigint":return(null!=t?mt.utf8ByteLength(t)+1:0)+9;case"symbol":return 0;default:throw new A("Unrecognized JS type: "+typeof e)}}class oe extends ht{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 A(`BSON Regex patterns cannot contain null bytes, found: ${JSON.stringify(this.pattern)}`);if(-1!==this.options.indexOf("\0"))throw new A(`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 A(`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 oe(t.$regex,oe.parseOptions(t.$options));if("BSONRegExp"===t.$regex._bsontype)return t}if("$regularExpression"in t)return new oe(t.$regularExpression.pattern,oe.parseOptions(t.$regularExpression.options));throw new A(`Unexpected BSONRegExp EJSON object form: ${JSON.stringify(t)}`)}inspect(t,e,n){const l=function(t){if(null!=t&&"object"==typeof t&&"stylize"in t&&"function"==typeof t.stylize)return t.stylize}(e)??(t=>t);n??=X;return`new BSONRegExp(${l(n(this.pattern),"regexp")}, ${l(n(this.options),"regexp")})`}}class ce extends ht{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 ce(t.$symbol)}inspect(t,e,n){return n??=X,`new BSONSymbol(${n(this.value,e)})`}}const se=wt;class ae extends se{get _bsontype(){return"Timestamp"}get[ut](){return"Timestamp"}static MAX_VALUE=wt.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(wt.isLong(t))super(t.low,t.high,!0);else{if("object"!=typeof t||!("t"in t)||!("i"in t))throw new A("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 A("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 A("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 A("Timestamp constructed from { t, i } must provide a positive t");if(n<0||Number.isNaN(n))throw new A("Timestamp constructed from { t, i } must provide a positive i");if(e>4294967295)throw new A("Timestamp constructed from { t, i } must provide t equal or less than uint32 max");if(n>4294967295)throw new A("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 ae(wt.fromInt(t,!0))}static fromNumber(t){return new ae(wt.fromNumber(t,!0))}static fromBits(t,e){return new ae({i:t,t:e})}static fromString(t,e){return new ae(wt.fromString(t,!0,e))}toExtendedJSON(){return{$timestamp:{t:this.t,i:this.i}}}static fromExtendedJSON(t){const e=wt.isLong(t.$timestamp.i)?t.$timestamp.i.getLowBitsUnsigned():t.$timestamp.i,n=wt.isLong(t.$timestamp.t)?t.$timestamp.t.getLowBitsUnsigned():t.$timestamp.t;return new ae({t:n,i:e})}inspect(t,e,n){n??=X;return`new Timestamp({ t: ${n(this.t,e)}, i: ${n(this.i,e)} })`}}const de=wt.fromNumber(I),be=wt.fromNumber(R);function Ze(t,e,n){const l=(e=null==e?{}:e)&&e.index?e.index:0,i=Gt.getInt32LE(t,l);if(i<5)throw new A(`bson size must be >= 5, is ${i}`);if(e.allowObjectSmallerThanBufferSize&&t.length<i)throw new A(`buffer length ${t.length} must be >= bson size ${i}`);if(!e.allowObjectSmallerThanBufferSize&&t.length!==i)throw new A(`buffer length ${t.length} must === bson size ${i}`);if(i+l>t.byteLength)throw new A(`(bson size ${i} + options.index ${l} must be <= buffer length ${t.byteLength})`);if(0!==t[l+i-1])throw new A("One object, sized correctly, with a spot for an EOO, but the EOO isn't 0x00");return me(t,l,e,n)}const re=/^\$ref$|^\$id$|^\$db$/;function me(t,e,n,l=!1){const i=null==n.fieldsAsRaw?null:n.fieldsAsRaw,o=null!=n.raw&&n.raw,c="boolean"==typeof n.bsonRegExp&&n.bsonRegExp,s=n.promoteBuffers??!1,a=n.promoteLongs??!0,d=n.promoteValues??!0,b=n.useBigInt64??!1;if(b&&!d)throw new A("Must either request bigint or Long for int64 deserialization");if(b&&!a)throw new A("Must either request bigint or Long for int64 deserialization");let Z,r,m=!0;const u=(null==n.validation?{utf8:!0}:n.validation).utf8;if("boolean"==typeof u)Z=u;else{m=!1;const t=Object.keys(u).map((function(t){return u[t]}));if(0===t.length)throw new A("UTF-8 validation setting cannot be empty");if("boolean"!=typeof t[0])throw new A("Invalid UTF-8 validation option, must specify boolean values");if(Z=t[0],!t.every((t=>t===Z)))throw new A("Invalid UTF-8 validation option - keys must be all true or all false")}if(!m){r=new Set;for(const t of Object.keys(u))r.add(t)}const h=e;if(t.length<5)throw new A("corrupt bson message < 5 bytes long");const p=Gt.getInt32LE(t,e);if(e+=4,p<5||p>t.length)throw new A("corrupt bson message");const y=l?[]:{};let X=0,G=!l&&null;for(;;){const u=t[e++];if(0===u)break;let h=e;for(;0!==t[h]&&h<t.length;)h++;if(h>=t.byteLength)throw new A("Bad BSON Document: illegal CString");const p=l?X++:mt.toUTF8(t,e,h,!1);let V,W=!0;if(W=m||r?.has(p)?Z:!Z,!1!==G&&"$"===p[0]&&(G=re.test(p)),e=h+1,u===S){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");V=mt.toUTF8(t,e,e+n-1,W),e+=n}else if(u===x){const n=mt.allocateUnsafe(12);for(let l=0;l<12;l++)n[l]=t[e+l];V=new ne(n),e+=12}else if(u===j&&!1===d)V=new At(Gt.getInt32LE(t,e)),e+=4;else if(u===j)V=Gt.getInt32LE(t,e),e+=4;else if(u===J)V=Gt.getFloat64LE(t,e),e+=8,!1===d&&(V=new Dt(V));else if(u===N){const n=Gt.getInt32LE(t,e),l=Gt.getInt32LE(t,e+4);e+=8,V=new Date(new wt(n,l).toNumber())}else if(u===U){if(0!==t[e]&&1!==t[e])throw new A("illegal boolean type value");V=1===t[e++]}else if(u===K){const l=e,i=Gt.getInt32LE(t,e);if(i<=0||i>t.length-e)throw new A("bad embedded document length in bson");if(o)V=t.subarray(e,e+i);else{let e=n;m||(e={...n,validation:{utf8:W}}),V=me(t,l,e,!1)}e+=i}else if(u===T){const l=e,o=Gt.getInt32LE(t,e);let c=n;const s=e+o;if(i&&i[p]&&(c={...n,raw:!0}),m||(c={...c,validation:{utf8:W}}),V=me(t,l,c,!0),0!==t[(e+=o)-1])throw new A("invalid array terminator byte");if(e!==s)throw new A("corrupted array bson")}else if(u===z)V=void 0;else if(u===w)V=null;else if(u===P)if(b)V=Gt.getBigInt64LE(t,e),e+=8;else{const n=Gt.getInt32LE(t,e),l=Gt.getInt32LE(t,e+4);e+=8;const i=new wt(n,l);V=a&&!0===d&&i.lessThanOrEqual(de)&&i.greaterThanOrEqual(be)?i.toNumber():i}else if(u===F){const n=mt.allocateUnsafe(16);for(let l=0;l<16;l++)n[l]=t[e+l];e+=16,V=new _t(n)}else if(u===L){let n=Gt.getInt32LE(t,e);e+=4;const l=n,i=t[e++];if(n<0)throw new A("Negative binary type element size found");if(n>t.byteLength)throw new A("Binary type size larger than document size");if(i===Vt.SUBTYPE_BYTE_ARRAY){if(n=Gt.getInt32LE(t,e),e+=4,n<0)throw new A("Negative binary type element size found for subtype 0x02");if(n>l-4)throw new A("Binary type with subtype 0x02 contains too long binary size");if(n<l-4)throw new A("Binary type with subtype 0x02 contains too short binary size")}s&&d?V=mt.toLocalBufferType(t.subarray(e,e+n)):(V=new Vt(t.subarray(e,e+n),i),i===_&&Yt.isValid(V)&&(V=V.toUUID())),e+=n}else if(u===k&&!1===c){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const n=mt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const l=mt.toUTF8(t,e,h,!1);e=h+1;const i=new Array(l.length);for(h=0;h<l.length;h++)switch(l[h]){case"m":i[h]="m";break;case"s":i[h]="g";break;case"i":i[h]="i"}V=new RegExp(n,i.join(""))}else if(u===k&&!0===c){for(h=e;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const n=mt.toUTF8(t,e,h,!1);for(h=e=h+1;0!==t[h]&&h<t.length;)h++;if(h>=t.length)throw new A("Bad BSON Document: illegal CString");const l=mt.toUTF8(t,e,h,!1);e=h+1,V=new oe(n,l)}else if(u===B){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const l=mt.toUTF8(t,e,e+n-1,W);V=d?l:new ce(l),e+=n}else if(u===M)V=new ae({i:Gt.getUint32LE(t,e),t:Gt.getUint32LE(t,e+4)}),e+=8;else if(u===Q)V=new qt;else if(u===O)V=new $t;else if(u===C){const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const l=mt.toUTF8(t,e,e+n-1,W);V=new It(l),e+=n}else if(u===v){const l=Gt.getInt32LE(t,e);if(e+=4,l<13)throw new A("code_w_scope total size shorter minimum expected length");const i=Gt.getInt32LE(t,e);if(e+=4,i<=0||i>t.length-e||0!==t[e+i-1])throw new A("bad string length in bson");const o=mt.toUTF8(t,e,e+i-1,W),c=e+=i,s=Gt.getInt32LE(t,e),a=me(t,c,n,!1);if(e+=s,l<8+s+i)throw new A("code_w_scope total size is too short, truncating scope");if(l>8+s+i)throw new A("code_w_scope total size is too long, clips outer document");V=new It(o,a)}else{if(u!==H)throw new A(`Detected unknown BSON type ${u.toString(16)} for fieldname "${p}"`);{const n=Gt.getInt32LE(t,e);if(e+=4,n<=0||n>t.length-e||0!==t[e+n-1])throw new A("bad string length in bson");const l=mt.toUTF8(t,e,e+n-1,W);e+=n;const i=mt.allocateUnsafe(12);for(let n=0;n<12;n++)i[n]=t[e+n];const o=new ne(i);e+=12,V=new Jt(l,o)}}"__proto__"===p?Object.defineProperty(y,p,{value:V,writable:!0,enumerable:!0,configurable:!0}):y[p]=V}if(p!==e-h){if(l)throw new A("corrupt array bson");throw new A("corrupt object bson")}if(!G)return y;if(Rt(y)){const t=Object.assign({},y);return delete t.$ref,delete t.$id,delete t.$db,new Jt(y.$ref,y.$id,y.$db,t)}return y}const ue=/\x00/,he=new Set(["$db","$ref","$id","$clusterTime"]);function pe(t,e,n,l){t[l++]=S;t[(l=l+mt.encodeUTF8Into(t,e,l)+1)-1]=0;const i=mt.encodeUTF8Into(t,n,l+4);return Gt.setInt32LE(t,l,i+1),l=l+4+i,t[l++]=0,l}function ye(t,e,n,l){const i=!Object.is(n,-0)&&Number.isSafeInteger(n)&&n<=W&&n>=f?j:J;t[l++]=i;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l+=i===j?Gt.setInt32LE(t,l,n):Gt.setFloat64LE(t,l,n)}function Xe(t,e,n,l){t[l++]=P;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l+=Gt.setBigInt64LE(t,l,n)}function Ge(t,e,n,l){t[l++]=w;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l}function Ve(t,e,n,l){t[l++]=U;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,t[l++]=n?1:0,l}function We(t,e,n,l){t[l++]=N;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=wt.fromNumber(n.getTime()),o=i.getLowBits(),c=i.getHighBits();return l+=Gt.setInt32LE(t,l,o),l+=Gt.setInt32LE(t,l,c)}function fe(t,e,n,l){t[l++]=k;if(l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,n.source&&null!=n.source.match(ue))throw new A("value "+n.source+" must not contain null bytes");return l+=mt.encodeUTF8Into(t,n.source,l),t[l++]=0,n.ignoreCase&&(t[l++]=105),n.global&&(t[l++]=115),n.multiline&&(t[l++]=109),t[l++]=0,l}function ge(t,e,n,l){t[l++]=k;if(l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,null!=n.pattern.match(ue))throw new A("pattern "+n.pattern+" must not contain null bytes");l+=mt.encodeUTF8Into(t,n.pattern,l),t[l++]=0;const i=n.options.split("").sort().join("");return l+=mt.encodeUTF8Into(t,i,l),t[l++]=0,l}function Ye(t,e,n,l){null===n?t[l++]=w:"MinKey"===n._bsontype?t[l++]=Q:t[l++]=O;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l}function Ie(t,e,n,l){t[l++]=x;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l+=n.serializeInto(t,l)}function Re(t,e,n,l){t[l++]=L;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=n.length;if(l+=Gt.setInt32LE(t,l,i),t[l++]=E,i<=16)for(let e=0;e<i;e++)t[l+e]=n[e];else t.set(n,l);return l+=i}function Je(t,e,n,l,i,o,c,s,a){if(a.has(n))throw new A("Cannot convert circular structure to BSON");a.add(n),t[l++]=Array.isArray(n)?T:K;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const d=ke(t,n,i,l,o+1,c,s,a);return a.delete(n),d}function Se(t,e,n,l){t[l++]=F;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;for(let e=0;e<16;e++)t[l+e]=n.bytes[e];return l+16}function Ke(t,e,n,l){t[l++]="Long"===n._bsontype?P:M;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=n.getLowBits(),o=n.getHighBits();return l+=Gt.setInt32LE(t,l,i),l+=Gt.setInt32LE(t,l,o)}function Te(t,e,n,l){n=n.valueOf(),t[l++]=j;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l+=Gt.setInt32LE(t,l,n)}function Le(t,e,n,l){t[l++]=J;return l+=mt.encodeUTF8Into(t,e,l),t[l++]=0,l+=Gt.setFloat64LE(t,l,n.value)}function ze(t,e,n,l){t[l++]=C;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=n.toString(),o=mt.encodeUTF8Into(t,i,l+4)+1;return Gt.setInt32LE(t,l,o),l=l+4+o-1,t[l++]=0,l}function xe(t,e,n,l,i=!1,o=0,c=!1,s=!0,a){if(n.scope&&"object"==typeof n.scope){t[l++]=v;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;let d=l;const b=n.code;l+=4;const Z=mt.encodeUTF8Into(t,b,l+4)+1;Gt.setInt32LE(t,l,Z),t[l+4+Z-1]=0,l=l+Z+4;const r=ke(t,n.scope,i,l,o+1,c,s,a);l=r-1;const m=r-d;d+=Gt.setInt32LE(t,d,m),t[l++]=0}else{t[l++]=C;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=n.code.toString(),o=mt.encodeUTF8Into(t,i,l+4)+1;Gt.setInt32LE(t,l,o),l=l+4+o-1,t[l++]=0}return l}function Ue(t,e,n,l){t[l++]=L;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=n.buffer;let o=n.position;if(n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o+=4),l+=Gt.setInt32LE(t,l,o),t[l++]=n.sub_type,n.sub_type===Vt.SUBTYPE_BYTE_ARRAY&&(o-=4,l+=Gt.setInt32LE(t,l,o)),n.sub_type===Vt.SUBTYPE_VECTOR&&Wt(n),o<=16)for(let e=0;e<o;e++)t[l+e]=i[e];else t.set(i,l);return l+=n.position}function Ne(t,e,n,l){t[l++]=B;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;const i=mt.encodeUTF8Into(t,n.value,l+4)+1;return Gt.setInt32LE(t,l,i),l=l+4+i-1,t[l++]=0,l}function we(t,e,n,l,i,o,c){t[l++]=K;l+=mt.encodeUTF8Into(t,e,l),t[l++]=0;let s=l,a={$ref:n.collection||n.namespace,$id:n.oid};null!=n.db&&(a.$db=n.db),a=Object.assign(a,n.fields);const d=ke(t,a,!1,l,i+1,o,!0,c),b=d-s;return s+=Gt.setInt32LE(t,l,b),d}function ke(t,e,n,l,i,o,c,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 A("serialize does not support an array as the root input");if("object"!=typeof e)throw new A("serialize does not support non-object as the root input");if("_bsontype"in e&&"string"==typeof e._bsontype)throw new A("BSON types cannot be serialized as a document");if(y(e)||h(e)||m(e)||u(e))throw new A("date, regexp, typedarray, and arraybuffer cannot be BSON documents");s=new Set}s.add(e);let a=l+4;if(Array.isArray(e))for(let l=0;l<e.length;l++){const d=`${l}`;let b=e[l];"function"==typeof b?.toBSON&&(b=b.toBSON());const Z=typeof b;if(void 0===b)a=Ge(t,d,0,a);else if(null===b)a=Ge(t,d,0,a);else if("string"===Z)a=pe(t,d,b,a);else if("number"===Z)a=ye(t,d,b,a);else if("bigint"===Z)a=Xe(t,d,b,a);else if("boolean"===Z)a=Ve(t,d,b,a);else if("object"===Z&&null==b._bsontype)a=b instanceof Date||y(b)?We(t,d,b,a):b instanceof Uint8Array||m(b)?Re(t,d,b,a):b instanceof RegExp||h(b)?fe(t,d,b,a):Je(t,d,b,a,n,i,o,c,s);else if("object"===Z){if(b[V]!==G)throw new $;if("ObjectId"===b._bsontype)a=Ie(t,d,b,a);else if("Decimal128"===b._bsontype)a=Se(t,d,b,a);else if("Long"===b._bsontype||"Timestamp"===b._bsontype)a=Ke(t,d,b,a);else if("Double"===b._bsontype)a=Le(t,d,b,a);else if("Code"===b._bsontype)a=xe(t,d,b,a,n,i,o,c,s);else if("Binary"===b._bsontype)a=Ue(t,d,b,a);else if("BSONSymbol"===b._bsontype)a=Ne(t,d,b,a);else if("DBRef"===b._bsontype)a=we(t,d,b,a,i,o,s);else if("BSONRegExp"===b._bsontype)a=ge(t,d,b,a);else if("Int32"===b._bsontype)a=Te(t,d,b,a);else if("MinKey"===b._bsontype||"MaxKey"===b._bsontype)a=Ye(t,d,b,a);else if(void 0!==b._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(b._bsontype)}`)}else"function"===Z&&o&&(a=ze(t,d,b,a))}else if(e instanceof Map||p(e)){const l=e.entries();let d=!1;for(;!d;){const e=l.next();if(d=!!e.done,d)continue;const b=e.value?e.value[0]:void 0;let Z=e.value?e.value[1]:void 0;"function"==typeof Z?.toBSON&&(Z=Z.toBSON());const r=typeof Z;if("string"==typeof b&&!he.has(b)){if(null!=b.match(ue))throw new A("key "+b+" must not contain null bytes");if(n){if("$"===b[0])throw new A("key "+b+" must not start with '$'");if(b.includes("."))throw new A("key "+b+" must not contain '.'")}}if(void 0===Z)!1===c&&(a=Ge(t,b,0,a));else if(null===Z)a=Ge(t,b,0,a);else if("string"===r)a=pe(t,b,Z,a);else if("number"===r)a=ye(t,b,Z,a);else if("bigint"===r)a=Xe(t,b,Z,a);else if("boolean"===r)a=Ve(t,b,Z,a);else if("object"===r&&null==Z._bsontype)a=Z instanceof Date||y(Z)?We(t,b,Z,a):Z instanceof Uint8Array||m(Z)?Re(t,b,Z,a):Z instanceof RegExp||h(Z)?fe(t,b,Z,a):Je(t,b,Z,a,n,i,o,c,s);else if("object"===r){if(Z[V]!==G)throw new $;if("ObjectId"===Z._bsontype)a=Ie(t,b,Z,a);else if("Decimal128"===Z._bsontype)a=Se(t,b,Z,a);else if("Long"===Z._bsontype||"Timestamp"===Z._bsontype)a=Ke(t,b,Z,a);else if("Double"===Z._bsontype)a=Le(t,b,Z,a);else if("Code"===Z._bsontype)a=xe(t,b,Z,a,n,i,o,c,s);else if("Binary"===Z._bsontype)a=Ue(t,b,Z,a);else if("BSONSymbol"===Z._bsontype)a=Ne(t,b,Z,a);else if("DBRef"===Z._bsontype)a=we(t,b,Z,a,i,o,s);else if("BSONRegExp"===Z._bsontype)a=ge(t,b,Z,a);else if("Int32"===Z._bsontype)a=Te(t,b,Z,a);else if("MinKey"===Z._bsontype||"MaxKey"===Z._bsontype)a=Ye(t,b,Z,a);else if(void 0!==Z._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(Z._bsontype)}`)}else"function"===r&&o&&(a=ze(t,b,Z,a))}}else{if("function"==typeof e?.toBSON&&null!=(e=e.toBSON())&&"object"!=typeof e)throw new A("toBSON function did not return an object");for(const l of Object.keys(e)){let d=e[l];"function"==typeof d?.toBSON&&(d=d.toBSON());const b=typeof d;if("string"==typeof l&&!he.has(l)){if(null!=l.match(ue))throw new A("key "+l+" must not contain null bytes");if(n){if("$"===l[0])throw new A("key "+l+" must not start with '$'");if(l.includes("."))throw new A("key "+l+" must not contain '.'")}}if(void 0===d)!1===c&&(a=Ge(t,l,0,a));else if(null===d)a=Ge(t,l,0,a);else if("string"===b)a=pe(t,l,d,a);else if("number"===b)a=ye(t,l,d,a);else if("bigint"===b)a=Xe(t,l,d,a);else if("boolean"===b)a=Ve(t,l,d,a);else if("object"===b&&null==d._bsontype)a=d instanceof Date||y(d)?We(t,l,d,a):d instanceof Uint8Array||m(d)?Re(t,l,d,a):d instanceof RegExp||h(d)?fe(t,l,d,a):Je(t,l,d,a,n,i,o,c,s);else if("object"===b){if(d[V]!==G)throw new $;if("ObjectId"===d._bsontype)a=Ie(t,l,d,a);else if("Decimal128"===d._bsontype)a=Se(t,l,d,a);else if("Long"===d._bsontype||"Timestamp"===d._bsontype)a=Ke(t,l,d,a);else if("Double"===d._bsontype)a=Le(t,l,d,a);else if("Code"===d._bsontype)a=xe(t,l,d,a,n,i,o,c,s);else if("Binary"===d._bsontype)a=Ue(t,l,d,a);else if("BSONSymbol"===d._bsontype)a=Ne(t,l,d,a);else if("DBRef"===d._bsontype)a=we(t,l,d,a,i,o,s);else if("BSONRegExp"===d._bsontype)a=ge(t,l,d,a);else if("Int32"===d._bsontype)a=Te(t,l,d,a);else if("MinKey"===d._bsontype||"MaxKey"===d._bsontype)a=Ye(t,l,d,a);else if(void 0!==d._bsontype)throw new A(`Unrecognized or invalid _bsontype: ${String(d._bsontype)}`)}else"function"===b&&o&&(a=ze(t,l,d,a))}}s.delete(e),t[a++]=0;const d=a-l;return l+=Gt.setInt32LE(t,l,d),a}const He={$oid:ne,$binary:Vt,$uuid:Vt,$symbol:ce,$numberInt:At,$numberDecimal:_t,$numberDouble:Dt,$numberLong:wt,$minKey:qt,$maxKey:$t,$regex:oe,$regularExpression:oe,$timestamp:ae};function Ce(t,e={}){if("number"==typeof t){const n=t<=W&&t>=f,l=t<=g&&t>=Y;if(e.relaxed||e.legacy)return t;if(Number.isInteger(t)&&!Object.is(t,-0)){if(n)return new At(t);if(l)return e.useBigInt64?BigInt(t):wt.fromNumber(t)}return new Dt(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 l=0;l<n.length;l++){const i=He[n[l]];if(i)return i.fromExtendedJSON(t,e)}if(null!=t.$date){const n=t.$date,l=new Date;if(e.legacy)if("number"==typeof n)l.setTime(n);else if("string"==typeof n)l.setTime(Date.parse(n));else{if("bigint"!=typeof n)throw new q("Unrecognized type for EJSON date: "+typeof n);l.setTime(Number(n))}else if("string"==typeof n)l.setTime(Date.parse(n));else if(wt.isLong(n))l.setTime(n.toNumber());else if("number"==typeof n&&e.relaxed)l.setTime(n);else{if("bigint"!=typeof n)throw new q("Unrecognized type for EJSON date: "+typeof n);l.setTime(Number(n))}return l}if(null!=t.$code){const e=Object.assign({},t);return t.$scope&&(e.$scope=Ce(t.$scope)),It.fromExtendedJSON(t)}if(Rt(t)||t.$dbPointer){const e=t.$ref?t:t.$dbPointer;if(e instanceof Jt)return e;const n=Object.keys(e).filter((t=>t.startsWith("$")));let l=!0;if(n.forEach((t=>{-1===["$ref","$id","$db"].indexOf(t)&&(l=!1)})),l)return Jt.fromExtendedJSON(e)}return t}function Be(t){const e=t.toISOString();return 0!==t.getUTCMilliseconds()?e:e.slice(0,-5)+"Z"}function ve(t,e){if(t instanceof Map||p(t)){const n=Object.create(null);for(const[e,l]of t){if("string"!=typeof e)throw new A("Can only serialize maps with string keys");n[e]=l}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)),l=t.slice(0,n).map((t=>`${t} -> `)).join(""),i=t[n],o=" -> "+t.slice(n+1,t.length-1).map((t=>`${t} -> `)).join(""),c=t[t.length-1],s=" ".repeat(l.length+i.length/2),a="-".repeat(o.length+(i.length+c.length)/2-1);throw new A(`Converting circular structure to EJSON:\n ${l}${i}${o}${c}\n ${s}\\${a}/`)}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||y(t)){const n=t.getTime(),l=n>-1&&n<2534023188e5;return e.legacy?e.relaxed&&l?{$date:t.getTime()}:{$date:Be(t)}:e.relaxed&&l?{$date:Be(t)}:{$date:{$numberLong:t.getTime().toString()}}}if(!("number"!=typeof t||e.relaxed&&isFinite(t))){if(Number.isInteger(t)&&!Object.is(t,-0)){if(t>=f&&t<=W)return{$numberInt:t.toString()};if(t>=Y&&t<=g)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||h(t)){let n=t.flags;if(void 0===n){const e=t.toString().match(/[gimuy]*$/);e&&(n=e[0])}return new oe(t.source,n).toExtendedJSON(e)}return null!=t&&"object"==typeof t?function(t,e){if(null==t||"object"!=typeof t)throw new A("not an object instance");const n=t._bsontype;if(void 0===n){const n={};for(const l of Object.keys(t)){e.seenObjects.push({propertyName:l,obj:null});try{const i=ve(t[l],e);"__proto__"===l?Object.defineProperty(n,l,{value:i,writable:!0,enumerable:!0,configurable:!0}):n[l]=i}finally{e.seenObjects.pop()}}return n}if(null!=t&&"object"==typeof t&&"string"==typeof t._bsontype&&t[V]!==G)throw new $;if(function(t){return null!=t&&"object"==typeof t&&"_bsontype"in t&&"string"==typeof t._bsontype}(t)){let l=t;if("function"!=typeof l.toExtendedJSON){const e=je[t._bsontype];if(!e)throw new A("Unrecognized or invalid _bsontype: "+t._bsontype);l=e(l)}return"Code"===n&&l.scope?l=new It(l.code,ve(l.scope,e)):"DBRef"===n&&l.oid&&(l=new Jt(ve(l.collection,e),ve(l.oid,e),ve(l.db,e),ve(l.fields,e))),l.toExtendedJSON(e)}throw new A("_bsontype must be a string, but was: "+typeof n)}(t,e):t}const je={Binary:t=>new Vt(t.value(),t.sub_type),Code:t=>new It(t.code,t.scope),DBRef:t=>new Jt(t.collection||t.namespace,t.oid,t.db,t.fields),Decimal128:t=>new _t(t.bytes),Double:t=>new Dt(t.value),Int32:t=>new At(t.value),Long:t=>wt.fromBits(null!=t.low?t.low:t.low_,null!=t.low?t.high:t.high_,null!=t.low?t.unsigned:t.unsigned_),MaxKey:()=>new $t,MinKey:()=>new qt,ObjectId:t=>new ne(t),BSONRegExp:t=>new oe(t.pattern,t.options),BSONSymbol:t=>new ce(t.value),Timestamp:t=>ae.fromBits(t.low,t.high)};function Me(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 A(`BSON Document field names cannot contain null bytes, found: ${JSON.stringify(t)}`);return Ce(e,n)}))}function Pe(t,e,n,l){null!=n&&"object"==typeof n&&(l=n,n=0),null==e||"object"!=typeof e||Array.isArray(e)||(l=e,e=void 0,n=0);const i=ve(t,Object.assign({relaxed:!0,legacy:!1},l,{seenObjects:[{propertyName:"(root)",obj:null}]}));return JSON.stringify(i,e,n)}const Fe=Object.create(null);Fe.parse=Me,Fe.stringify=Pe,Fe.serialize=function(t,e){return e=e||{},JSON.parse(Pe(t,e))},Fe.deserialize=function(t,e){return e=e||{},Me(JSON.stringify(t),e)},Object.freeze(Fe);const Qe=1,Oe=2,Ee=3,_e=4,De=5,Ae=6,$e=7,qe=8,tn=9,en=10,nn=11,ln=12,on=13,cn=14,sn=15,an=16,dn=17,bn=18,Zn=19,rn=255,mn=127;function un(t,e){try{return Gt.getNonnegativeInt32LE(t,e)}catch(t){throw new tt("BSON size cannot be negative",e,{cause:t})}}function hn(t,e){let n=e;for(;0!==t[n];n++);if(n===t.length-1)throw new tt("Null terminator not found",e);return n}const pn=Object.create(null);pn.parseToElements=function(t,e=0){if(e??=0,t.length<5)throw new tt(`Input must be at least 5 bytes, got ${t.length} bytes`,e);const n=un(t,e);if(n>t.length-e)throw new tt(`Parsed documentSize (${n} bytes) does not match input length (${t.length} bytes)`,e);if(0!==t[e+n-1])throw new tt("BSON documents must end in 0x00",e+n);const l=[];let i=e+4;for(;i<=n+e;){const o=t[i];if(i+=1,0===o){if(i-e!==n)throw new tt("Invalid 0x00 type byte",i);break}const c=i,s=hn(t,i)-c;let a;if(i+=s+1,o===Qe||o===bn||o===tn||o===dn)a=8;else if(o===an)a=4;else if(o===$e)a=12;else if(o===Zn)a=16;else if(o===qe)a=1;else if(o===en||o===Ae||o===mn||o===rn)a=0;else if(o===nn)a=hn(t,hn(t,i)+1)+1-i;else if(o===Ee||o===_e||o===sn)a=un(t,i);else{if(o!==Oe&&o!==De&&o!==ln&&o!==on&&o!==cn)throw new tt(`Invalid 0x${o.toString(16).padStart(2,"0")} type byte`,i);a=un(t,i)+4,o===De&&(a+=1),o===ln&&(a+=12)}if(a>n)throw new tt("value reports length larger than document",i);l.push([o,c,s,i,a]),i+=a}return l},pn.ByteUtils=mt,pn.NumberUtils=Gt,Object.freeze(pn);const yn=17825792;let Xn=mt.allocate(yn);var Gn=Object.freeze({__proto__:null,BSONError:A,BSONOffsetError:tt,BSONRegExp:oe,BSONRuntimeError:q,BSONSymbol:ce,BSONType:D,BSONValue:ht,BSONVersionError:$,Binary:Vt,ByteUtils:mt,Code:It,DBRef:Jt,Decimal128:_t,Double:Dt,EJSON:Fe,Int32:At,Long:wt,MaxKey:$t,MinKey:qt,NumberUtils:Gt,ObjectId:ne,Timestamp:ae,UUID:Yt,bsonType:ut,calculateObjectSize:function(t,e={}){return le(t,"boolean"==typeof(e=e||{}).serializeFunctions&&e.serializeFunctions,"boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined)},deserialize:function(t,e={}){return Ze(mt.toLocalBufferType(t),e)},deserializeStream:function(t,e,n,l,i,o){const c=Object.assign({allowObjectSmallerThanBufferSize:!0,index:0},o),s=mt.toLocalBufferType(t);let a=e;for(let t=0;t<n;t++){const e=Gt.getInt32LE(s,a);c.index=a,l[i+t]=Ze(s,c),a+=e}return a},onDemand:pn,serialize:function(t,e={}){const n="boolean"==typeof e.checkKeys&&e.checkKeys,l="boolean"==typeof e.serializeFunctions&&e.serializeFunctions,i="boolean"!=typeof e.ignoreUndefined||e.ignoreUndefined,o="number"==typeof e.minInternalBufferSize?e.minInternalBufferSize:yn;Xn.length<o&&(Xn=mt.allocate(o));const c=ke(Xn,t,n,0,0,l,i,null),s=mt.allocateUnsafe(c);return s.set(Xn.subarray(0,c),0),s},serializeWithBufferAndIndex:function(t,e,n={}){const l="boolean"==typeof n.checkKeys&&n.checkKeys,i="boolean"==typeof n.serializeFunctions&&n.serializeFunctions,o="boolean"!=typeof n.ignoreUndefined||n.ignoreUndefined,c="number"==typeof n.index?n.index:0,s=ke(Xn,t,l,0,0,i,o,null);return e.set(Xn.subarray(0,s),c),c+s-1},setInternalBufferSize:function(t){Xn.length<t&&(Xn=mt.allocate(t))}});function Vn(t){return!!t&&"object"==typeof t&&"buffer"in t&&t.buffer instanceof ArrayBuffer&&"number"==typeof t.byteOffset&&"number"==typeof t.byteLength}async function Wn({client:t,limit:e,page_token:l,sort_by:i}){const c="/ml/conversations"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function fn({client:t,limit:e,page_token:l,sort_by:i,no_models:c,no_parts:s,conversation_id:a}){const d="/user/text-to-cad"+n({limit:e,page_token:l,sort_by:i,no_models:c,no_parts:s,conversation_id:a}),b=(t?.baseUrl||"https://api.zoo.dev")+d,Z=t&&t.token||"",r={};Z&&(r.Authorization=`Bearer ${Z}`);const m={method:"GET",headers:r},u=t?.fetch||fetch,h=await u(b,m);await o(h);return await h.json()}class gn{constructor(){}static urlConstructFrom(t){const e="/ws/modeling/commands"+n({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}),l=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(l)}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 Gn.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 Gn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}if(Vn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}return e}}async function Yn({client:t,id:e,limit:l,page_token:i,sort_by:c}){const s=`/orgs/${e}/oauth2/apps`+n({limit:l,page_token:i,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},r=t?.fetch||fetch,m=await r(a,Z);await o(m);return await m.json()}async function In({client:t,id:e,limit:l,page_token:i,sort_by:c}){const s=`/users/${e}/oauth2/apps`+n({limit:l,page_token:i,sort_by:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},r=t?.fetch||fetch,m=await r(a,Z);await o(m);return await m.json()}async function Rn({client:t,limit:e,page_token:l,sort_by:i}){const c="/org/oauth2/apps"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function Jn({client:t,limit:e,page_token:l,sort_by:i}){const c="/user/oauth2/apps"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function Sn({client:t,limit:e,page_token:l,sort_by:i}){const c="/org/shortlinks"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function Kn({client:t,id:e,limit:l,page_token:i,sort_by:c,filter:s}){const a=`/org/datasets/${e}/conversions`+n({limit:l,page_token:i,sort_by:c,filter:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`);const r={method:"GET",headers:Z},m=t?.fetch||fetch,u=await m(d,r);await o(u);return await u.json()}async function Tn({client:t,limit:e,page_token:l,sort_by:i}){const c="/org/datasets"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function Ln({client:t,limit:e,page_token:l,sort_by:i,role:c}){const s="/org/members"+n({limit:e,page_token:l,sort_by:i,role:c}),a=(t?.baseUrl||"https://api.zoo.dev")+s,d=t&&t.token||"",b={};d&&(b.Authorization=`Bearer ${d}`);const Z={method:"GET",headers:b},r=t?.fetch||fetch,m=await r(a,Z);await o(m);return await m.json()}async function zn({client:t,id:e,limit:l,page_token:i,q:c,sort_by:s}){const a=`/org/datasets/${e}/search/conversions`+n({limit:l,page_token:i,q:c,sort_by:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`);const r={method:"GET",headers:Z},m=t?.fetch||fetch,u=await m(d,r);await o(u);return await u.json()}async function xn({client:t,limit:e,page_token:l}){const i="/org/payment/invoices"+n({limit:e,page_token:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z);return await Z.json()}async function Un({client:t,limit:e,page_token:l}){const i="/user/payment/invoices"+n({limit:e,page_token:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z);return await Z.json()}async function Nn({client:t,limit:e,page_token:l,sort_by:i}){const c="/org/service-accounts"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}async function wn({client:t,limit:e,page_token:l,sort_by:i}){const c="/user/shortlinks"+n({limit:e,page_token:l,sort_by:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);await o(r);return await r.json()}var kn=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");kn=Hn.Worker}catch(t){}function Cn(t,e,n){var l=void 0===e?null:e,i=function(t,e){return Buffer.from(t,"base64").toString(e?"utf16":"utf8")}(t,void 0!==n&&n),o=i.indexOf("\n",10)+1,c=i.substring(o)+(l?"//# sourceMappingURL="+l:"");return function(t){return new kn(c,Object.assign({},t,{eval:!0}))}}function Bn(t,e,n){var l=void 0===e?null:e,i=function(t,e){var n=atob(t);if(e){for(var l=new Uint8Array(n.length),i=0,o=n.length;i<o;++i)l[i]=n.charCodeAt(i);return new TextDecoder("utf-16le").decode(new Uint16Array(l.buffer))}return n}(t,void 0!==n&&n),o=i.indexOf("\n",10)+1,c=i.substring(o)+(l?"//# sourceMappingURL="+l:""),s=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(s)}var vn="[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0);function jn(t,e,n){return vn?Cn(t,e,n):function(t,e,n){var l;return function(i){return l=l||Bn(t,e,n),new Worker(l,i)}}(t,e,n)}var Mn=jn("Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y29uc3QgZT1uZXcgVGV4dEVuY29kZXI7ZnVuY3Rpb24gdCh0LG4scil7dC5sZW5ndGg+NTA/ZnVuY3Rpb24odCxuLHIpe2UuZW5jb2RlSW50byh0LG4uc3ViYXJyYXkocikpfSh0LG4scik6ZnVuY3Rpb24oZSx0LG4pe2NvbnN0IHI9ZS5sZW5ndGg7bGV0IGk9bixvPTA7Zm9yKDtvPHI7KXtsZXQgbj1lLmNoYXJDb2RlQXQobysrKTtpZig0Mjk0OTY3MTY4Jm4pe2lmKDQyOTQ5NjUyNDgmbil7aWYobj49NTUyOTYmJm48PTU2MzE5JiZvPHIpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KG8pOzU2MzIwPT0oNjQ1MTImdCkmJigrK28sbj0oKDEwMjMmbik8PDEwKSsoMTAyMyZ0KSs2NTUzNil9NDI5NDkwMTc2MCZuPyh0W2krK109bj4+MTgmN3wyNDAsdFtpKytdPW4+PjEyJjYzfDEyOCx0W2krK109bj4+NiY2M3wxMjgpOih0W2krK109bj4+MTImMTV8MjI0LHRbaSsrXT1uPj42JjYzfDEyOCl9ZWxzZSB0W2krK109bj4+NiYzMXwxOTI7dFtpKytdPTYzJm58MTI4fWVsc2UgdFtpKytdPW59fSh0LG4scil9bmV3IFRleHREZWNvZGVyO2NsYXNzIG57dHlwZTtkYXRhO2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50eXBlPWUsdGhpcy5kYXRhPXR9fWNsYXNzIHIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKTtjb25zdCB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsdmFsdWU6ci5uYW1lfSl9fWZ1bmN0aW9uIGkoZSx0LG4pe2NvbnN0IHI9TWF0aC5mbG9vcihuLzQyOTQ5NjcyOTYpLGk9bjtlLnNldFVpbnQzMih0LHIpLGUuc2V0VWludDMyKHQrNCxpKX1jb25zdCBvPTQyOTQ5NjcyOTUscz0xNzE3OTg2OTE4Mztjb25zdCBhPXt0eXBlOi0xLGVuY29kZTpmdW5jdGlvbihlKXtpZihlIGluc3RhbmNlb2YgRGF0ZSl7cmV0dXJuIGZ1bmN0aW9uKHtzZWM6ZSxuc2VjOnR9KXtpZihlPj0wJiZ0Pj0wJiZlPD1zKXtpZigwPT09dCYmZTw9byl7Y29uc3QgdD1uZXcgVWludDhBcnJheSg0KTtyZXR1cm4gbmV3IERhdGFWaWV3KHQuYnVmZmVyKS5zZXRVaW50MzIoMCxlKSx0fXtjb25zdCBuPWUvNDI5NDk2NzI5NixyPTQyOTQ5NjcyOTUmZSxpPW5ldyBVaW50OEFycmF5KDgpLG89bmV3IERhdGFWaWV3KGkuYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0PDwyfDMmbiksby5zZXRVaW50MzIoNCxyKSxpfX17Y29uc3Qgbj1uZXcgVWludDhBcnJheSgxMikscj1uZXcgRGF0YVZpZXcobi5idWZmZXIpO3JldHVybiByLnNldFVpbnQzMigwLHQpLGkociw0LGUpLG59fShmdW5jdGlvbihlKXtjb25zdCB0PWUuZ2V0VGltZSgpLG49TWF0aC5mbG9vcih0LzFlMykscj0xZTYqKHQtMWUzKm4pLGk9TWF0aC5mbG9vcihyLzFlOSk7cmV0dXJue3NlYzpuK2ksbnNlYzpyLTFlOSppfX0oZSkpfXJldHVybiBudWxsfSxkZWNvZGU6ZnVuY3Rpb24oZSl7Y29uc3QgdD1mdW5jdGlvbihlKXtjb25zdCB0PW5ldyBEYXRhVmlldyhlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTtzd2l0Y2goZS5ieXRlTGVuZ3RoKXtjYXNlIDQ6cmV0dXJue3NlYzp0LmdldFVpbnQzMigwKSxuc2VjOjB9O2Nhc2UgODp7Y29uc3QgZT10LmdldFVpbnQzMigwKTtyZXR1cm57c2VjOjQyOTQ5NjcyOTYqKDMmZSkrdC5nZXRVaW50MzIoNCksbnNlYzplPj4+Mn19Y2FzZSAxMjp7Y29uc3QgZT1mdW5jdGlvbihlLHQpe3JldHVybiA0Mjk0OTY3Mjk2KmUuZ2V0SW50MzIodCkrZS5nZXRVaW50MzIodCs0KX0odCw0KTtyZXR1cm57c2VjOmUsbnNlYzp0LmdldFVpbnQzMigwKX19ZGVmYXVsdDp0aHJvdyBuZXcgcihgVW5yZWNvZ25pemVkIGRhdGEgc2l6ZSBmb3IgdGltZXN0YW1wIChleHBlY3RlZCA0LCA4LCBvciAxMik6ICR7ZS5sZW5ndGh9YCl9fShlKTtyZXR1cm4gbmV3IERhdGUoMWUzKnQuc2VjK3QubnNlYy8xZTYpfX07Y2xhc3MgY3tzdGF0aWMgZGVmYXVsdENvZGVjPW5ldyBjO19fYnJhbmQ7YnVpbHRJbkVuY29kZXJzPVtdO2J1aWx0SW5EZWNvZGVycz1bXTtlbmNvZGVycz1bXTtkZWNvZGVycz1bXTtjb25zdHJ1Y3Rvcigpe3RoaXMucmVnaXN0ZXIoYSl9cmVnaXN0ZXIoe3R5cGU6ZSxlbmNvZGU6dCxkZWNvZGU6bn0pe2lmKGU+PTApdGhpcy5lbmNvZGVyc1tlXT10LHRoaXMuZGVjb2RlcnNbZV09bjtlbHNle2NvbnN0IHI9LTEtZTt0aGlzLmJ1aWx0SW5FbmNvZGVyc1tyXT10LHRoaXMuYnVpbHRJbkRlY29kZXJzW3JdPW59fXRyeVRvRW5jb2RlKGUsdCl7Zm9yKGxldCByPTA7cjx0aGlzLmJ1aWx0SW5FbmNvZGVycy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuYnVpbHRJbkVuY29kZXJzW3JdO2lmKG51bGwhPWkpe2NvbnN0IG89aShlLHQpO2lmKG51bGwhPW8pe3JldHVybiBuZXcgbigtMS1yLG8pfX19Zm9yKGxldCByPTA7cjx0aGlzLmVuY29kZXJzLmxlbmd0aDtyKyspe2NvbnN0IGk9dGhpcy5lbmNvZGVyc1tyXTtpZihudWxsIT1pKXtjb25zdCBvPWkoZSx0KTtpZihudWxsIT1vKXtyZXR1cm4gbmV3IG4ocixvKX19fXJldHVybiBlIGluc3RhbmNlb2Ygbj9lOm51bGx9ZGVjb2RlKGUsdCxyKXtjb25zdCBpPXQ8MD90aGlzLmJ1aWx0SW5EZWNvZGVyc1stMS10XTp0aGlzLmRlY29kZXJzW3RdO3JldHVybiBpP2koZSx0LHIpOm5ldyBuKHQsZSl9fWZ1bmN0aW9uIGwoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5P2U6QXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpOmZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJ1bmRlZmluZWQiIT10eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXImJmUgaW5zdGFuY2VvZiBTaGFyZWRBcnJheUJ1ZmZlcn0oZSk/bmV3IFVpbnQ4QXJyYXkoZSk6VWludDhBcnJheS5mcm9tKGUpfWNsYXNzIGZ7ZXh0ZW5zaW9uQ29kZWM7Y29udGV4dDt1c2VCaWdJbnQ2NDttYXhEZXB0aDtpbml0aWFsQnVmZmVyU2l6ZTtzb3J0S2V5cztmb3JjZUZsb2F0MzI7aWdub3JlVW5kZWZpbmVkO2ZvcmNlSW50ZWdlclRvRmxvYXQ7cG9zO3ZpZXc7Ynl0ZXM7ZW50ZXJlZD0hMTtjb25zdHJ1Y3RvcihlKXt0aGlzLmV4dGVuc2lvbkNvZGVjPWU/LmV4dGVuc2lvbkNvZGVjPz9jLmRlZmF1bHRDb2RlYyx0aGlzLmNvbnRleHQ9ZT8uY29udGV4dCx0aGlzLnVzZUJpZ0ludDY0PWU/LnVzZUJpZ0ludDY0Pz8hMSx0aGlzLm1heERlcHRoPWU/Lm1heERlcHRoPz8xMDAsdGhpcy5pbml0aWFsQnVmZmVyU2l6ZT1lPy5pbml0aWFsQnVmZmVyU2l6ZT8/MjA0OCx0aGlzLnNvcnRLZXlzPWU/LnNvcnRLZXlzPz8hMSx0aGlzLmZvcmNlRmxvYXQzMj1lPy5mb3JjZUZsb2F0MzI/PyExLHRoaXMuaWdub3JlVW5kZWZpbmVkPWU/Lmlnbm9yZVVuZGVmaW5lZD8/ITEsdGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0PWU/LmZvcmNlSW50ZWdlclRvRmxvYXQ/PyExLHRoaXMucG9zPTAsdGhpcy52aWV3PW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIodGhpcy5pbml0aWFsQnVmZmVyU2l6ZSkpLHRoaXMuYnl0ZXM9bmV3IFVpbnQ4QXJyYXkodGhpcy52aWV3LmJ1ZmZlcil9Y2xvbmUoKXtyZXR1cm4gbmV3IGYoe2V4dGVuc2lvbkNvZGVjOnRoaXMuZXh0ZW5zaW9uQ29kZWMsY29udGV4dDp0aGlzLmNvbnRleHQsdXNlQmlnSW50NjQ6dGhpcy51c2VCaWdJbnQ2NCxtYXhEZXB0aDp0aGlzLm1heERlcHRoLGluaXRpYWxCdWZmZXJTaXplOnRoaXMuaW5pdGlhbEJ1ZmZlclNpemUsc29ydEtleXM6dGhpcy5zb3J0S2V5cyxmb3JjZUZsb2F0MzI6dGhpcy5mb3JjZUZsb2F0MzIsaWdub3JlVW5kZWZpbmVkOnRoaXMuaWdub3JlVW5kZWZpbmVkLGZvcmNlSW50ZWdlclRvRmxvYXQ6dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0fSl9cmVpbml0aWFsaXplU3RhdGUoKXt0aGlzLnBvcz0wfWVuY29kZVNoYXJlZFJlZihlKXtpZih0aGlzLmVudGVyZWQpe3JldHVybiB0aGlzLmNsb25lKCkuZW5jb2RlU2hhcmVkUmVmKGUpfXRyeXtyZXR1cm4gdGhpcy5lbnRlcmVkPSEwLHRoaXMucmVpbml0aWFsaXplU3RhdGUoKSx0aGlzLmRvRW5jb2RlKGUsMSksdGhpcy5ieXRlcy5zdWJhcnJheSgwLHRoaXMucG9zKX1maW5hbGx5e3RoaXMuZW50ZXJlZD0hMX19ZW5jb2RlKGUpe2lmKHRoaXMuZW50ZXJlZCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5lbmNvZGUoZSl9dHJ5e3JldHVybiB0aGlzLmVudGVyZWQ9ITAsdGhpcy5yZWluaXRpYWxpemVTdGF0ZSgpLHRoaXMuZG9FbmNvZGUoZSwxKSx0aGlzLmJ5dGVzLnNsaWNlKDAsdGhpcy5wb3MpfWZpbmFsbHl7dGhpcy5lbnRlcmVkPSExfX1kb0VuY29kZShlLHQpe2lmKHQ+dGhpcy5tYXhEZXB0aCl0aHJvdyBuZXcgRXJyb3IoYFRvbyBkZWVwIG9iamVjdHMgaW4gZGVwdGggJHt0fWApO251bGw9PWU/dGhpcy5lbmNvZGVOaWwoKToiYm9vbGVhbiI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQm9vbGVhbihlKToibnVtYmVyIj09dHlwZW9mIGU/dGhpcy5mb3JjZUludGVnZXJUb0Zsb2F0P3RoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKTp0aGlzLmVuY29kZU51bWJlcihlKToic3RyaW5nIj09dHlwZW9mIGU/dGhpcy5lbmNvZGVTdHJpbmcoZSk6dGhpcy51c2VCaWdJbnQ2NCYmImJpZ2ludCI9PXR5cGVvZiBlP3RoaXMuZW5jb2RlQmlnSW50NjQoZSk6dGhpcy5lbmNvZGVPYmplY3QoZSx0KX1lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZShlKXtjb25zdCB0PXRoaXMucG9zK2U7dGhpcy52aWV3LmJ5dGVMZW5ndGg8dCYmdGhpcy5yZXNpemVCdWZmZXIoMip0KX1yZXNpemVCdWZmZXIoZSl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoZSksbj1uZXcgVWludDhBcnJheSh0KSxyPW5ldyBEYXRhVmlldyh0KTtuLnNldCh0aGlzLmJ5dGVzKSx0aGlzLnZpZXc9cix0aGlzLmJ5dGVzPW59ZW5jb2RlTmlsKCl7dGhpcy53cml0ZVU4KDE5Mil9ZW5jb2RlQm9vbGVhbihlKXshMT09PWU/dGhpcy53cml0ZVU4KDE5NCk6dGhpcy53cml0ZVU4KDE5NSl9ZW5jb2RlTnVtYmVyKGUpeyF0aGlzLmZvcmNlSW50ZWdlclRvRmxvYXQmJk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpP2U+PTA/ZTwxMjg/dGhpcy53cml0ZVU4KGUpOmU8MjU2Pyh0aGlzLndyaXRlVTgoMjA0KSx0aGlzLndyaXRlVTgoZSkpOmU8NjU1MzY/KHRoaXMud3JpdGVVOCgyMDUpLHRoaXMud3JpdGVVMTYoZSkpOmU8NDI5NDk2NzI5Nj8odGhpcy53cml0ZVU4KDIwNiksdGhpcy53cml0ZVUzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMDcpLHRoaXMud3JpdGVVNjQoZSkpOmU+PS0zMj90aGlzLndyaXRlVTgoMjI0fGUrMzIpOmU+PS0xMjg/KHRoaXMud3JpdGVVOCgyMDgpLHRoaXMud3JpdGVJOChlKSk6ZT49LTMyNzY4Pyh0aGlzLndyaXRlVTgoMjA5KSx0aGlzLndyaXRlSTE2KGUpKTplPj0tMjE0NzQ4MzY0OD8odGhpcy53cml0ZVU4KDIxMCksdGhpcy53cml0ZUkzMihlKSk6dGhpcy51c2VCaWdJbnQ2ND90aGlzLmVuY29kZU51bWJlckFzRmxvYXQoZSk6KHRoaXMud3JpdGVVOCgyMTEpLHRoaXMud3JpdGVJNjQoZSkpOnRoaXMuZW5jb2RlTnVtYmVyQXNGbG9hdChlKX1lbmNvZGVOdW1iZXJBc0Zsb2F0KGUpe3RoaXMuZm9yY2VGbG9hdDMyPyh0aGlzLndyaXRlVTgoMjAyKSx0aGlzLndyaXRlRjMyKGUpKToodGhpcy53cml0ZVU4KDIwMyksdGhpcy53cml0ZUY2NChlKSl9ZW5jb2RlQmlnSW50NjQoZSl7ZT49QmlnSW50KDApPyh0aGlzLndyaXRlVTgoMjA3KSx0aGlzLndyaXRlQmlnVWludDY0KGUpKToodGhpcy53cml0ZVU4KDIxMSksdGhpcy53cml0ZUJpZ0ludDY0KGUpKX13cml0ZVN0cmluZ0hlYWRlcihlKXtpZihlPDMyKXRoaXMud3JpdGVVOCgxNjArZSk7ZWxzZSBpZihlPDI1Nil0aGlzLndyaXRlVTgoMjE3KSx0aGlzLndyaXRlVTgoZSk7ZWxzZSBpZihlPDY1NTM2KXRoaXMud3JpdGVVOCgyMTgpLHRoaXMud3JpdGVVMTYoZSk7ZWxzZXtpZighKGU8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbG9uZyBzdHJpbmc6ICR7ZX0gYnl0ZXMgaW4gVVRGLThgKTt0aGlzLndyaXRlVTgoMjE5KSx0aGlzLndyaXRlVTMyKGUpfX1lbmNvZGVTdHJpbmcoZSl7Y29uc3Qgbj1mdW5jdGlvbihlKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPTAscj0wO2Zvcig7cjx0Oyl7bGV0IGk9ZS5jaGFyQ29kZUF0KHIrKyk7aWYoNDI5NDk2NzE2OCZpKWlmKDQyOTQ5NjUyNDgmaSl7aWYoaT49NTUyOTYmJmk8PTU2MzE5JiZyPHQpe2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KHIpOzU2MzIwPT0oNjQ1MTImdCkmJigrK3IsaT0oKDEwMjMmaSk8PDEwKSsoMTAyMyZ0KSs2NTUzNil9bis9NDI5NDkwMTc2MCZpPzQ6M31lbHNlIG4rPTI7ZWxzZSBuKyt9cmV0dXJuIG59KGUpO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNStuKSx0aGlzLndyaXRlU3RyaW5nSGVhZGVyKG4pLHQoZSx0aGlzLmJ5dGVzLHRoaXMucG9zKSx0aGlzLnBvcys9bn1lbmNvZGVPYmplY3QoZSx0KXtjb25zdCBuPXRoaXMuZXh0ZW5zaW9uQ29kZWMudHJ5VG9FbmNvZGUoZSx0aGlzLmNvbnRleHQpO2lmKG51bGwhPW4pdGhpcy5lbmNvZGVFeHRlbnNpb24obik7ZWxzZSBpZihBcnJheS5pc0FycmF5KGUpKXRoaXMuZW5jb2RlQXJyYXkoZSx0KTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSl0aGlzLmVuY29kZUJpbmFyeShlKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoYFVucmVjb2duaXplZCBvYmplY3Q6ICR7T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShlKX1gKTt0aGlzLmVuY29kZU1hcChlLHQpfX1lbmNvZGVCaW5hcnkoZSl7Y29uc3QgdD1lLmJ5dGVMZW5ndGg7aWYodDwyNTYpdGhpcy53cml0ZVU4KDE5NiksdGhpcy53cml0ZVU4KHQpO2Vsc2UgaWYodDw2NTUzNil0aGlzLndyaXRlVTgoMTk3KSx0aGlzLndyaXRlVTE2KHQpO2Vsc2V7aWYoISh0PDQyOTQ5NjcyOTYpKXRocm93IG5ldyBFcnJvcihgVG9vIGxhcmdlIGJpbmFyeTogJHt0fWApO3RoaXMud3JpdGVVOCgxOTgpLHRoaXMud3JpdGVVMzIodCl9Y29uc3Qgbj1sKGUpO3RoaXMud3JpdGVVOGEobil9ZW5jb2RlQXJyYXkoZSx0KXtjb25zdCBuPWUubGVuZ3RoO2lmKG48MTYpdGhpcy53cml0ZVU4KDE0NCtuKTtlbHNlIGlmKG48NjU1MzYpdGhpcy53cml0ZVU4KDIyMCksdGhpcy53cml0ZVUxNihuKTtlbHNle2lmKCEobjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBhcnJheTogJHtufWApO3RoaXMud3JpdGVVOCgyMjEpLHRoaXMud3JpdGVVMzIobil9Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmRvRW5jb2RlKG4sdCsxKX1jb3VudFdpdGhvdXRVbmRlZmluZWQoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIHQpdm9pZCAwIT09ZVtyXSYmbisrO3JldHVybiBufWVuY29kZU1hcChlLHQpe2NvbnN0IG49T2JqZWN0LmtleXMoZSk7dGhpcy5zb3J0S2V5cyYmbi5zb3J0KCk7Y29uc3Qgcj10aGlzLmlnbm9yZVVuZGVmaW5lZD90aGlzLmNvdW50V2l0aG91dFVuZGVmaW5lZChlLG4pOm4ubGVuZ3RoO2lmKHI8MTYpdGhpcy53cml0ZVU4KDEyOCtyKTtlbHNlIGlmKHI8NjU1MzYpdGhpcy53cml0ZVU4KDIyMiksdGhpcy53cml0ZVUxNihyKTtlbHNle2lmKCEocjw0Mjk0OTY3Mjk2KSl0aHJvdyBuZXcgRXJyb3IoYFRvbyBsYXJnZSBtYXAgb2JqZWN0OiAke3J9YCk7dGhpcy53cml0ZVU4KDIyMyksdGhpcy53cml0ZVUzMihyKX1mb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPWVbcl07dGhpcy5pZ25vcmVVbmRlZmluZWQmJnZvaWQgMD09PW58fCh0aGlzLmVuY29kZVN0cmluZyhyKSx0aGlzLmRvRW5jb2RlKG4sdCsxKSl9fWVuY29kZUV4dGVuc2lvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5kYXRhKXtjb25zdCB0PWUuZGF0YSh0aGlzLnBvcys2KSxuPXQubGVuZ3RoO2lmKG4+PTQyOTQ5NjcyOTYpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHtufWApO3JldHVybiB0aGlzLndyaXRlVTgoMjAxKSx0aGlzLndyaXRlVTMyKG4pLHRoaXMud3JpdGVJOChlLnR5cGUpLHZvaWQgdGhpcy53cml0ZVU4YSh0KX1jb25zdCB0PWUuZGF0YS5sZW5ndGg7aWYoMT09PXQpdGhpcy53cml0ZVU4KDIxMik7ZWxzZSBpZigyPT09dCl0aGlzLndyaXRlVTgoMjEzKTtlbHNlIGlmKDQ9PT10KXRoaXMud3JpdGVVOCgyMTQpO2Vsc2UgaWYoOD09PXQpdGhpcy53cml0ZVU4KDIxNSk7ZWxzZSBpZigxNj09PXQpdGhpcy53cml0ZVU4KDIxNik7ZWxzZSBpZih0PDI1Nil0aGlzLndyaXRlVTgoMTk5KSx0aGlzLndyaXRlVTgodCk7ZWxzZSBpZih0PDY1NTM2KXRoaXMud3JpdGVVOCgyMDApLHRoaXMud3JpdGVVMTYodCk7ZWxzZXtpZighKHQ8NDI5NDk2NzI5NikpdGhyb3cgbmV3IEVycm9yKGBUb28gbGFyZ2UgZXh0ZW5zaW9uIG9iamVjdDogJHt0fWApO3RoaXMud3JpdGVVOCgyMDEpLHRoaXMud3JpdGVVMzIodCl9dGhpcy53cml0ZUk4KGUudHlwZSksdGhpcy53cml0ZVU4YShlLmRhdGEpfXdyaXRlVTgoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgxKSx0aGlzLnZpZXcuc2V0VWludDgodGhpcy5wb3MsZSksdGhpcy5wb3MrK313cml0ZVU4YShlKXtjb25zdCB0PWUubGVuZ3RoO3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUodCksdGhpcy5ieXRlcy5zZXQoZSx0aGlzLnBvcyksdGhpcy5wb3MrPXR9d3JpdGVJOChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDEpLHRoaXMudmlldy5zZXRJbnQ4KHRoaXMucG9zLGUpLHRoaXMucG9zKyt9d3JpdGVVMTYoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSgyKSx0aGlzLnZpZXcuc2V0VWludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlSTE2KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoMiksdGhpcy52aWV3LnNldEludDE2KHRoaXMucG9zLGUpLHRoaXMucG9zKz0yfXdyaXRlVTMyKGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoNCksdGhpcy52aWV3LnNldFVpbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUkzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRJbnQzMih0aGlzLnBvcyxlKSx0aGlzLnBvcys9NH13cml0ZUYzMihlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDQpLHRoaXMudmlldy5zZXRGbG9hdDMyKHRoaXMucG9zLGUpLHRoaXMucG9zKz00fXdyaXRlRjY0KGUpe3RoaXMuZW5zdXJlQnVmZmVyU2l6ZVRvV3JpdGUoOCksdGhpcy52aWV3LnNldEZsb2F0NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVVNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1uLzQyOTQ5NjcyOTYsaT1uO2Uuc2V0VWludDMyKHQsciksZS5zZXRVaW50MzIodCs0LGkpfSh0aGlzLnZpZXcsdGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVJNjQoZSl7dGhpcy5lbnN1cmVCdWZmZXJTaXplVG9Xcml0ZSg4KSxpKHRoaXMudmlldyx0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH13cml0ZUJpZ1VpbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdVaW50NjQodGhpcy5wb3MsZSksdGhpcy5wb3MrPTh9d3JpdGVCaWdJbnQ2NChlKXt0aGlzLmVuc3VyZUJ1ZmZlclNpemVUb1dyaXRlKDgpLHRoaXMudmlldy5zZXRCaWdJbnQ2NCh0aGlzLnBvcyxlKSx0aGlzLnBvcys9OH19dHJ5e2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJiJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2VzcyYmcHJvY2Vzcy52ZXJzaW9ucz8ubm9kZSl7bmV3IEZ1bmN0aW9uKCJtIiwicmV0dXJuIGltcG9ydChtKSIpKCJjcm9zcy1mZXRjaC9wb2x5ZmlsbCIpLmNhdGNoKCgoKT0+e30pKX19Y2F0Y2h7fXRyeXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHByb2Nlc3MmJnByb2Nlc3MudmVyc2lvbnM/Lm5vZGUmJiJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtKXtuZXcgRnVuY3Rpb24oIm0iLCJyZXR1cm4gaW1wb3J0KG0pIikoIndpbi1jYSIpfX1jYXRjaHt9Y29uc3QgdT0oKCk9Pntjb25zdCBlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKSxTeW1ib2wudG9TdHJpbmdUYWcpLmdldDtyZXR1cm4gdD0+ZS5jYWxsKHQpfSkoKTtmdW5jdGlvbiBfKGUpe3JldHVybiJVaW50OEFycmF5Ij09PXUoZSl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYoIkFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXXx8IlNoYXJlZEFycmF5QnVmZmVyIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSl9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFJlZ0V4cHx8IltvYmplY3QgUmVnRXhwXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gYihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiBlJiYiTWFwIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXX1mdW5jdGlvbiBkKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRGF0ZXx8IltvYmplY3QgRGF0ZV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIHcoZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSwoKGUsdCk9PiJiaWdpbnQiPT10eXBlb2YgdD97JG51bWJlckxvbmc6YCR7dH1gfTpiKHQpP09iamVjdC5mcm9tRW50cmllcyh0KTp0KSl9Y29uc3QgcD03LHk9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi52ZXJzaW9uIiksbT0yMTQ3NDgzNjQ3LFM9LTIxNDc0ODM2NDgsQj1NYXRoLnBvdygyLDYzKS0xLHg9LU1hdGgucG93KDIsNjMpLEU9TWF0aC5wb3coMiw1MyksVT0tTWF0aC5wb3coMiw1MyksTz0xLE49MixJPTMsdj00LFQ9NSwkPTYsTD03LEE9OCxSPTksaj0xMCxGPTExLGs9MTIsej0xMyxEPTE0LEM9MTUsTT0xNixWPTE3LFA9MTgsSj0xOSxXPTI1NSxZPTEyNyxxPTAsSD00LEs9T2JqZWN0LmZyZWV6ZSh7ZG91YmxlOjEsc3RyaW5nOjIsb2JqZWN0OjMsYXJyYXk6NCxiaW5EYXRhOjUsdW5kZWZpbmVkOjYsb2JqZWN0SWQ6Nyxib29sOjgsZGF0ZTo5LG51bGw6MTAscmVnZXg6MTEsZGJQb2ludGVyOjEyLGphdmFzY3JpcHQ6MTMsc3ltYm9sOjE0LGphdmFzY3JpcHRXaXRoU2NvcGU6MTUsaW50OjE2LHRpbWVzdGFtcDoxNyxsb25nOjE4LGRlY2ltYWw6MTksbWluS2V5Oi0xLG1heEtleToxMjd9KTtjbGFzcyBaIGV4dGVuZHMgRXJyb3J7Z2V0IGJzb25FcnJvcigpe3JldHVybiEwfWdldCBuYW1lKCl7cmV0dXJuIkJTT05FcnJvciJ9Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpfXN0YXRpYyBpc0JTT05FcnJvcihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiYnNvbkVycm9yImluIGUmJiEwPT09ZS5ic29uRXJyb3ImJiJuYW1lImluIGUmJiJtZXNzYWdlImluIGUmJiJzdGFjayJpbiBlfX1jbGFzcyBHIGV4dGVuZHMgWntnZXQgbmFtZSgpe3JldHVybiJCU09OVmVyc2lvbkVycm9yIn1jb25zdHJ1Y3Rvcigpe3N1cGVyKGBVbnN1cHBvcnRlZCBCU09OIHZlcnNpb24sIGJzb24gdHlwZXMgbXVzdCBiZSBmcm9tIGJzb24gJHtwfS54LnhgKX19Y2xhc3MgWCBleHRlbmRzIFp7Z2V0IG5hbWUoKXtyZXR1cm4iQlNPTlJ1bnRpbWVFcnJvciJ9Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9fWNsYXNzIFEgZXh0ZW5kcyBae2dldCBuYW1lKCl7cmV0dXJuIkJTT05PZmZzZXRFcnJvciJ9b2Zmc2V0O2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihgJHtlfS4gb2Zmc2V0OiAke3R9YCxuKSx0aGlzLm9mZnNldD10fX1sZXQgZWUsdGU7ZnVuY3Rpb24gbmUoZSx0LG4scil7aWYocil7ZWU/Pz1uZXcgVGV4dERlY29kZXIoInV0ZjgiLHtmYXRhbDohMH0pO3RyeXtyZXR1cm4gZWUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9Y2F0Y2goZSl7dGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggc3RyaW5nIGluIEJTT04gZG9jdW1lbnQiLHtjYXVzZTplfSl9fXJldHVybiB0ZT8/PW5ldyBUZXh0RGVjb2RlcigidXRmOCIse2ZhdGFsOiExfSksdGUuZGVjb2RlKGUuc3ViYXJyYXkodCxuKSl9ZnVuY3Rpb24gcmUoZSx0LG4pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtjb25zdCByPW4tdDtpZigwPT09cilyZXR1cm4iIjtpZihyPjIwKXJldHVybiBudWxsO2lmKDE9PT1yJiZlW3RdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKTtpZigyPT09ciYmZVt0XTwxMjgmJmVbdCsxXTwxMjgpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoZVt0XSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMV0pO2lmKDM9PT1yJiZlW3RdPDEyOCYmZVt0KzFdPDEyOCYmZVt0KzJdPDEyOClyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlW3RdKStTdHJpbmcuZnJvbUNoYXJDb2RlKGVbdCsxXSkrU3RyaW5nLmZyb21DaGFyQ29kZShlW3QrMl0pO2NvbnN0IGk9W107Zm9yKGxldCByPXQ7cjxuO3IrKyl7Y29uc3QgdD1lW3JdO2lmKHQ+MTI3KXJldHVybiBudWxsO2kucHVzaCh0KX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5pKX1mdW5jdGlvbiBpZShlKXtyZXR1cm4gYWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWZ1bmN0aW9uIG9lKGUpe3JldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFlLmFsbG9jYXRlKGUpKX1jb25zdCBzZT0oKCk9Pntjb25zdHtjcnlwdG86ZX09Z2xvYmFsVGhpcztyZXR1cm4gbnVsbCE9ZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0UmFuZG9tVmFsdWVzP29lOmllfSkoKSxhZT17aXNVaW50OEFycmF5Ol8sdG9Mb2NhbEJ1ZmZlclR5cGUoZSl7aWYoQnVmZmVyLmlzQnVmZmVyKGUpKXJldHVybiBlO2lmKEFycmF5QnVmZmVyLmlzVmlldyhlKSlyZXR1cm4gQnVmZmVyLmZyb20oZS5idWZmZXIsZS5ieXRlT2Zmc2V0LGUuYnl0ZUxlbmd0aCk7Y29uc3QgdD1lPy5bU3ltYm9sLnRvU3RyaW5nVGFnXT8/T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKCJBcnJheUJ1ZmZlciI9PT10fHwiU2hhcmVkQXJyYXlCdWZmZXIiPT09dHx8IltvYmplY3QgQXJyYXlCdWZmZXJdIj09PXR8fCJbb2JqZWN0IFNoYXJlZEFycmF5QnVmZmVyXSI9PT10KXJldHVybiBCdWZmZXIuZnJvbShlKTt0aHJvdyBuZXcgWigiQ2Fubm90IGNyZWF0ZSBCdWZmZXIgZnJvbSB0aGUgcGFzc2VkIHBvdGVudGlhbEJ1ZmZlci4iKX0sYWxsb2NhdGU6ZT0+QnVmZmVyLmFsbG9jKGUpLGFsbG9jYXRlVW5zYWZlOmU9PkJ1ZmZlci5hbGxvY1Vuc2FmZShlKSxjb21wYXJlOihlLHQpPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5jb21wYXJlKHQpLGNvbmNhdDplPT5CdWZmZXIuY29uY2F0KGUpLGNvcHk6KGUsdCxuLHIsaSk9PmFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLmNvcHkodCxuPz8wLHI/PzAsaT8/ZS5sZW5ndGgpLGVxdWFsczooZSx0KT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkuZXF1YWxzKHQpLGZyb21OdW1iZXJBcnJheTplPT5CdWZmZXIuZnJvbShlKSxmcm9tQmFzZTY0OmU9PkJ1ZmZlci5mcm9tKGUsImJhc2U2NCIpLGZyb21VVEY4OmU9PkJ1ZmZlci5mcm9tKGUsInV0ZjgiKSx0b0Jhc2U2NDplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS50b1N0cmluZygiYmFzZTY0IiksZnJvbUlTTzg4NTkxOmU9PkJ1ZmZlci5mcm9tKGUsImJpbmFyeSIpLHRvSVNPODg1OTE6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImJpbmFyeSIpLGZyb21IZXg6ZT0+QnVmZmVyLmZyb20oZSwiaGV4IiksdG9IZXg6ZT0+YWUudG9Mb2NhbEJ1ZmZlclR5cGUoZSkudG9TdHJpbmcoImhleCIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7aWYobnVsbCE9aSlyZXR1cm4gaTtjb25zdCBvPWFlLnRvTG9jYWxCdWZmZXJUeXBlKGUpLnRvU3RyaW5nKCJ1dGY4Iix0LG4pO2lmKHIpZm9yKGxldCByPTA7cjxvLmxlbmd0aDtyKyspaWYoNjU1MzM9PT1vLmNoYXJDb2RlQXQocikpe25lKGUsdCxuLCEwKTticmVha31yZXR1cm4gb30sdXRmOEJ5dGVMZW5ndGg6ZT0+QnVmZmVyLmJ5dGVMZW5ndGgoZSwidXRmOCIpLGVuY29kZVVURjhJbnRvKGUsdCxuKXtjb25zdCByPWZ1bmN0aW9uKGUsdCxuKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIDA7aWYodC5sZW5ndGg+MjUpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGgtbjx0Lmxlbmd0aClyZXR1cm4gbnVsbDtmb3IobGV0IHI9MCxpPW47cjx0Lmxlbmd0aDtyKyssaSsrKXtjb25zdCBuPXQuY2hhckNvZGVBdChyKTtpZihuPjEyNylyZXR1cm4gbnVsbDtlW2ldPW59cmV0dXJuIHQubGVuZ3RofShlLHQsbik7cmV0dXJuIG51bGwhPXI/cjphZS50b0xvY2FsQnVmZmVyVHlwZShlKS53cml0ZSh0LG4sdm9pZCAwLCJ1dGY4Iil9LHJhbmRvbUJ5dGVzOnNlLHN3YXAzMjplPT5hZS50b0xvY2FsQnVmZmVyVHlwZShlKS5zd2FwMzIoKX07ZnVuY3Rpb24gY2UoZSl7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgYXJndW1lbnQgJ2J5dGVMZW5ndGgnIGlzIGludmFsaWQuIFJlY2VpdmVkICR7ZX1gKTtyZXR1cm4gdWUuZnJvbU51bWJlckFycmF5KEFycmF5LmZyb20oe2xlbmd0aDplfSwoKCk9Pk1hdGguZmxvb3IoMjU2Kk1hdGgucmFuZG9tKCkpKSkpfWNvbnN0IGxlPSgoKT0+e2NvbnN0e2NyeXB0bzplfT1nbG9iYWxUaGlzO2lmKG51bGwhPWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldFJhbmRvbVZhbHVlcylyZXR1cm4gdD0+ZS5nZXRSYW5kb21WYWx1ZXModWUuYWxsb2NhdGUodCkpO2lmKGZ1bmN0aW9uKCl7Y29uc3R7bmF2aWdhdG9yOmV9PWdsb2JhbFRoaXM7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiYiUmVhY3ROYXRpdmUiPT09ZS5wcm9kdWN0fSgpKXtjb25zdHtjb25zb2xlOmV9PWdsb2JhbFRoaXM7ZT8ud2Fybj8uKCJCU09OOiBGb3IgUmVhY3QgTmF0aXZlIHBsZWFzZSBwb2x5ZmlsbCBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLCBlLmcuIHVzaW5nOiBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9yZWFjdC1uYXRpdmUtZ2V0LXJhbmRvbS12YWx1ZXMuIil9cmV0dXJuIGNlfSkoKSxmZT0vKFxkfFthLWZdKS9pLHVlPXtpc1VpbnQ4QXJyYXk6Xyx0b0xvY2FsQnVmZmVyVHlwZShlKXtjb25zdCB0PWU/LltTeW1ib2wudG9TdHJpbmdUYWddPz9PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYoIlVpbnQ4QXJyYXkiPT09dClyZXR1cm4gZTtpZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUuYnVmZmVyLnNsaWNlKGUuYnl0ZU9mZnNldCxlLmJ5dGVPZmZzZXQrZS5ieXRlTGVuZ3RoKSk7aWYoIkFycmF5QnVmZmVyIj09PXR8fCJTaGFyZWRBcnJheUJ1ZmZlciI9PT10fHwiW29iamVjdCBBcnJheUJ1ZmZlcl0iPT09dHx8IltvYmplY3QgU2hhcmVkQXJyYXlCdWZmZXJdIj09PXQpcmV0dXJuIG5ldyBVaW50OEFycmF5KGUpO3Rocm93IG5ldyBaKCJDYW5ub3QgbWFrZSBhIFVpbnQ4QXJyYXkgZnJvbSBwYXNzZWQgcG90ZW50aWFsQnVmZmVyLiIpfSxhbGxvY2F0ZShlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgVGhlICJzaXplIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCAke1N0cmluZyhlKX1gKTtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSl9LGFsbG9jYXRlVW5zYWZlOmU9PnVlLmFsbG9jYXRlKGUpLGNvbXBhcmUoZSx0KXtpZihlPT09dClyZXR1cm4gMDtjb25zdCBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTtmb3IobGV0IHI9MDtyPG47cisrKXtpZihlW3JdPHRbcl0pcmV0dXJuLTE7aWYoZVtyXT50W3JdKXJldHVybiAxfXJldHVybiBlLmxlbmd0aDx0Lmxlbmd0aD8tMTplLmxlbmd0aD50Lmxlbmd0aD8xOjB9LGNvbmNhdChlKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHVlLmFsbG9jYXRlKDApO2xldCB0PTA7Zm9yKGNvbnN0IG4gb2YgZSl0Kz1uLmxlbmd0aDtjb25zdCBuPXVlLmFsbG9jYXRlKHQpO2xldCByPTA7Zm9yKGNvbnN0IHQgb2YgZSluLnNldCh0LHIpLHIrPXQubGVuZ3RoO3JldHVybiBufSxjb3B5KGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aSYmaTwwKXRocm93IG5ldyBSYW5nZUVycm9yKGBUaGUgdmFsdWUgb2YgInNvdXJjZUVuZCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7aX1gKTtpZihpPWk/P2UubGVuZ3RoLHZvaWQgMCE9PXImJihyPDB8fHI+aSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFRoZSB2YWx1ZSBvZiAic291cmNlU3RhcnQiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSA+PSAwIGFuZCA8PSAke2l9LiBSZWNlaXZlZCAke3J9YCk7aWYocj1yPz8wLHZvaWQgMCE9PW4mJm48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlIHZhbHVlIG9mICJ0YXJnZXRTdGFydCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlID49IDAuIFJlY2VpdmVkICR7bn1gKTtuPW4/PzA7Y29uc3Qgbz1lLnN1YmFycmF5KHIsaSkscz1NYXRoLm1pbihvLmxlbmd0aCx0Lmxlbmd0aC1uKTtyZXR1cm4gczw9MD8wOih0LnNldChvLnN1YmFycmF5KDAscyksbikscyl9LGVxdWFscyhlLHQpe2lmKGUuYnl0ZUxlbmd0aCE9PXQuYnl0ZUxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPGUuYnl0ZUxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9LGZyb21OdW1iZXJBcnJheTplPT5VaW50OEFycmF5LmZyb20oZSksZnJvbUJhc2U2NDplPT5VaW50OEFycmF5LmZyb20oYXRvYihlKSwoZT0+ZS5jaGFyQ29kZUF0KDApKSksZnJvbVVURjg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLHRvQmFzZTY0OmU9PmJ0b2EodWUudG9JU084ODU5MShlKSksZnJvbUlTTzg4NTkxOmU9PlVpbnQ4QXJyYXkuZnJvbShlLChlPT4yNTUmZS5jaGFyQ29kZUF0KDApKSksdG9JU084ODU5MTplPT5BcnJheS5mcm9tKFVpbnQxNkFycmF5LmZyb20oZSksKGU9PlN0cmluZy5mcm9tQ2hhckNvZGUoZSkpKS5qb2luKCIiKSxmcm9tSGV4KGUpe2NvbnN0IHQ9ZS5sZW5ndGglMj09MD9lOmUuc2xpY2UoMCxlLmxlbmd0aC0xKSxuPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSs9Mil7Y29uc3Qgcj10W2VdLGk9dFtlKzFdO2lmKCFmZS50ZXN0KHIpKWJyZWFrO2lmKCFmZS50ZXN0KGkpKWJyZWFrO2NvbnN0IG89TnVtYmVyLnBhcnNlSW50KGAke3J9JHtpfWAsMTYpO24ucHVzaChvKX1yZXR1cm4gVWludDhBcnJheS5mcm9tKG4pfSx0b0hleDplPT5BcnJheS5mcm9tKGUsKGU9PmUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIjAiKSkpLmpvaW4oIiIpLHRvVVRGOChlLHQsbixyKXtjb25zdCBpPW4tdDw9MjA/cmUoZSx0LG4pOm51bGw7cmV0dXJuIG51bGwhPWk/aTpuZShlLHQsbixyKX0sdXRmOEJ5dGVMZW5ndGg6ZT0+KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpLmJ5dGVMZW5ndGgsZW5jb2RlVVRGOEludG8oZSx0LG4pe2NvbnN0IHI9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpO3JldHVybiBlLnNldChyLG4pLHIuYnl0ZUxlbmd0aH0scmFuZG9tQnl0ZXM6bGUsc3dhcDMyKGUpe2lmKGUubGVuZ3RoJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kz00KXtjb25zdCBuPWVbdF0scj1lW3QrMV0saT1lW3QrMl0sbz1lW3QrM107ZVt0XT1vLGVbdCsxXT1pLGVbdCsyXT1yLGVbdCszXT1ufXJldHVybiBlfX0sX2U9ImZ1bmN0aW9uIj09dHlwZW9mIEJ1ZmZlciYmITAhPT1CdWZmZXIucHJvdG90eXBlPy5faXNCdWZmZXI/YWU6dWUsZ2U9U3ltYm9sLmZvcigiQEBtZGIuYnNvbi50eXBlIik7Y2xhc3MgaGV7Z2V0W2dlXSgpe3JldHVybiB0aGlzLl9ic29udHlwZX1nZXRbeV0oKXtyZXR1cm4gcH1bU3ltYm9sLmZvcigibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b20iKV0oZSx0LG4pe3JldHVybiB0aGlzLmluc3BlY3QoZSx0LG4pfX1jb25zdCBiZT1uZXcgRmxvYXQ2NEFycmF5KDEpLGRlPW5ldyBVaW50OEFycmF5KGJlLmJ1ZmZlciwwLDgpO2JlWzBdPS0xO2NvbnN0IHdlPTA9PT1kZVs3XSxwZT17aXNCaWdFbmRpYW46d2UsZ2V0Tm9ubmVnYXRpdmVJbnQzMkxFKGUsdCl7aWYoZVt0KzNdPjEyNyl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgU2l6ZSBjYW5ub3QgYmUgbmVnYXRpdmUgYXQgb2Zmc2V0OiAke3R9YCk7cmV0dXJuIGVbdF18ZVt0KzFdPDw4fGVbdCsyXTw8MTZ8ZVt0KzNdPDwyNH0sZ2V0SW50MzJMRTooZSx0KT0+ZVt0XXxlW3QrMV08PDh8ZVt0KzJdPDwxNnxlW3QrM108PDI0LGdldFVpbnQzMkxFOihlLHQpPT5lW3RdKzI1NiplW3QrMV0rNjU1MzYqZVt0KzJdKzE2Nzc3MjE2KmVbdCszXSxnZXRVaW50MzJCRTooZSx0KT0+ZVt0KzNdKzI1NiplW3QrMl0rNjU1MzYqZVt0KzFdKzE2Nzc3MjE2KmVbdF0sZ2V0QmlnSW50NjRMRTooZSx0KT0+KEJpZ0ludChlW3QrNF0rMjU2KmVbdCs1XSs2NTUzNiplW3QrNl0rKGVbdCs3XTw8MjQpKTw8MzJuKStCaWdJbnQoZVt0XSsyNTYqZVt0KzFdKzY1NTM2KmVbdCsyXSsxNjc3NzIxNiplW3QrM10pLGdldEZsb2F0NjRMRTp3ZT8oZSx0KT0+KGRlWzddPWVbdF0sZGVbNl09ZVt0KzFdLGRlWzVdPWVbdCsyXSxkZVs0XT1lW3QrM10sZGVbM109ZVt0KzRdLGRlWzJdPWVbdCs1XSxkZVsxXT1lW3QrNl0sZGVbMF09ZVt0KzddLGJlWzBdKTooZSx0KT0+KGRlWzBdPWVbdF0sZGVbMV09ZVt0KzFdLGRlWzJdPWVbdCsyXSxkZVszXT1lW3QrM10sZGVbNF09ZVt0KzRdLGRlWzVdPWVbdCs1XSxkZVs2XT1lW3QrNl0sZGVbN109ZVt0KzddLGJlWzBdKSxzZXRJbnQzMkJFOihlLHQsbik9PihlW3QrM109bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCsxXT1uLG4+Pj49OCxlW3RdPW4sNCksc2V0SW50MzJMRTooZSx0LG4pPT4oZVt0XT1uLG4+Pj49OCxlW3QrMV09bixuPj4+PTgsZVt0KzJdPW4sbj4+Pj04LGVbdCszXT1uLDQpLHNldEJpZ0ludDY0TEUoZSx0LG4pe2NvbnN0IHI9MHhmZmZmZmZmZm47bGV0IGk9TnVtYmVyKG4mcik7ZVt0XT1pLGk+Pj04LGVbdCsxXT1pLGk+Pj04LGVbdCsyXT1pLGk+Pj04LGVbdCszXT1pO2xldCBvPU51bWJlcihuPj4zMm4mcik7cmV0dXJuIGVbdCs0XT1vLG8+Pj04LGVbdCs1XT1vLG8+Pj04LGVbdCs2XT1vLG8+Pj04LGVbdCs3XT1vLDh9LHNldEZsb2F0NjRMRTp3ZT8oZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzddLGVbdCsxXT1kZVs2XSxlW3QrMl09ZGVbNV0sZVt0KzNdPWRlWzRdLGVbdCs0XT1kZVszXSxlW3QrNV09ZGVbMl0sZVt0KzZdPWRlWzFdLGVbdCs3XT1kZVswXSw4KTooZSx0LG4pPT4oYmVbMF09bixlW3RdPWRlWzBdLGVbdCsxXT1kZVsxXSxlW3QrMl09ZGVbMl0sZVt0KzNdPWRlWzNdLGVbdCs0XT1kZVs0XSxlW3QrNV09ZGVbNV0sZVt0KzZdPWRlWzZdLGVbdCs3XT1kZVs3XSw4KX07Y2xhc3MgeWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJpbmFyeSJ9c3RhdGljIEJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBCVUZGRVJfU0laRT0yNTY7c3RhdGljIFNVQlRZUEVfREVGQVVMVD0wO3N0YXRpYyBTVUJUWVBFX0ZVTkNUSU9OPTE7c3RhdGljIFNVQlRZUEVfQllURV9BUlJBWT0yO3N0YXRpYyBTVUJUWVBFX1VVSURfT0xEPTM7c3RhdGljIFNVQlRZUEVfVVVJRD00O3N0YXRpYyBTVUJUWVBFX01ENT01O3N0YXRpYyBTVUJUWVBFX0VOQ1JZUFRFRD02O3N0YXRpYyBTVUJUWVBFX0NPTFVNTj03O3N0YXRpYyBTVUJUWVBFX1NFTlNJVElWRT04O3N0YXRpYyBTVUJUWVBFX1ZFQ1RPUj05O3N0YXRpYyBTVUJUWVBFX1VTRVJfREVGSU5FRD0xMjg7c3RhdGljIFZFQ1RPUl9UWVBFPU9iamVjdC5mcmVlemUoe0ludDg6MyxGbG9hdDMyOjM5LFBhY2tlZEJpdDoxNn0pO2J1ZmZlcjtzdWJfdHlwZTtwb3NpdGlvbjtjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksbnVsbCE9ZSYmInN0cmluZyI9PXR5cGVvZiBlJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUpJiYhZyhlKSYmIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFooIkJpbmFyeSBjYW4gb25seSBiZSBjb25zdHJ1Y3RlZCBmcm9tIFVpbnQ4QXJyYXkgb3IgbnVtYmVyW10iKTt0aGlzLnN1Yl90eXBlPXQ/P3llLkJTT05fQklOQVJZX1NVQlRZUEVfREVGQVVMVCxudWxsPT1lPyh0aGlzLmJ1ZmZlcj1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSksdGhpcy5wb3NpdGlvbj0wKToodGhpcy5idWZmZXI9QXJyYXkuaXNBcnJheShlKT9fZS5mcm9tTnVtYmVyQXJyYXkoZSk6X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdGhpcy5wb3NpdGlvbj10aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoKX1wdXQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYxIT09ZS5sZW5ndGgpdGhyb3cgbmV3IFooIm9ubHkgYWNjZXB0cyBzaW5nbGUgY2hhcmFjdGVyIFN0cmluZyIpO2lmKCJudW1iZXIiIT10eXBlb2YgZSYmMSE9PWUubGVuZ3RoKXRocm93IG5ldyBaKCJvbmx5IGFjY2VwdHMgc2luZ2xlIGNoYXJhY3RlciBVaW50OEFycmF5IG9yIEFycmF5Iik7bGV0IHQ7aWYodD0ic3RyaW5nIj09dHlwZW9mIGU/ZS5jaGFyQ29kZUF0KDApOiJudW1iZXIiPT10eXBlb2YgZT9lOmVbMF0sdDwwfHx0PjI1NSl0aHJvdyBuZXcgWigib25seSBhY2NlcHRzIG51bWJlciBpbiBhIHZhbGlkIHVuc2lnbmVkIGJ5dGUgcmFuZ2UgMC0yNTUiKTtpZih0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPnRoaXMucG9zaXRpb24pdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10O2Vsc2V7Y29uc3QgZT1fZS5hbGxvY2F0ZSh5ZS5CVUZGRVJfU0laRSt0aGlzLmJ1ZmZlci5sZW5ndGgpO2Uuc2V0KHRoaXMuYnVmZmVyLDApLHRoaXMuYnVmZmVyPWUsdGhpcy5idWZmZXJbdGhpcy5wb3NpdGlvbisrXT10fX13cml0ZShlLHQpe2lmKHQ9Im51bWJlciI9PXR5cGVvZiB0P3Q6dGhpcy5wb3NpdGlvbix0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RoPHQrZS5sZW5ndGgpe2NvbnN0IHQ9X2UuYWxsb2NhdGUodGhpcy5idWZmZXIuYnl0ZUxlbmd0aCtlLmxlbmd0aCk7dC5zZXQodGhpcy5idWZmZXIsMCksdGhpcy5idWZmZXI9dH1pZihBcnJheUJ1ZmZlci5pc1ZpZXcoZSkpdGhpcy5idWZmZXIuc2V0KF9lLnRvTG9jYWxCdWZmZXJUeXBlKGUpLHQpLHRoaXMucG9zaXRpb249dCtlLmJ5dGVMZW5ndGg+dGhpcy5wb3NpdGlvbj90K2UubGVuZ3RoOnRoaXMucG9zaXRpb247ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpdGhyb3cgbmV3IFooImlucHV0IGNhbm5vdCBiZSBzdHJpbmciKX1yZWFkKGUsdCl7Y29uc3Qgbj1lKyh0PXQmJnQ+MD90OnRoaXMucG9zaXRpb24pO3JldHVybiB0aGlzLmJ1ZmZlci5zdWJhcnJheShlLG4+dGhpcy5wb3NpdGlvbj90aGlzLnBvc2l0aW9uOm4pfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyLmxlbmd0aD09PXRoaXMucG9zaXRpb24/dGhpcy5idWZmZXI6dGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKX1sZW5ndGgoKXtyZXR1cm4gdGhpcy5wb3NpdGlvbn10b0pTT04oKXtyZXR1cm4gX2UudG9CYXNlNjQodGhpcy5idWZmZXIuc3ViYXJyYXkoMCx0aGlzLnBvc2l0aW9uKSl9dG9TdHJpbmcoZSl7cmV0dXJuImhleCI9PT1lP19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpOiJiYXNlNjQiPT09ZT9fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTpfZS50b1VURjgodGhpcy5idWZmZXIsMCx0aGlzLnBvc2l0aW9uLCExKX10b0V4dGVuZGVkSlNPTihlKXtlPWV8fHt9LHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUodGhpcyk7Y29uc3QgdD1fZS50b0Jhc2U2NCh0aGlzLmJ1ZmZlciksbj1OdW1iZXIodGhpcy5zdWJfdHlwZSkudG9TdHJpbmcoMTYpO3JldHVybiBlLmxlZ2FjeT97JGJpbmFyeTp0LCR0eXBlOjE9PT1uLmxlbmd0aD8iMCIrbjpufTp7JGJpbmFyeTp7YmFzZTY0OnQsc3ViVHlwZToxPT09bi5sZW5ndGg/IjAiK246bn19fXRvVVVJRCgpe2lmKHRoaXMuc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1VVSUQpcmV0dXJuIG5ldyB4ZSh0aGlzLmJ1ZmZlci5zdWJhcnJheSgwLHRoaXMucG9zaXRpb24pKTt0aHJvdyBuZXcgWihgQmluYXJ5IHN1Yl90eXBlICIke3RoaXMuc3ViX3R5cGV9IiBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb252ZXJ0aW5nIHRvIFVVSUQuIE9ubHkgIiR7eWUuU1VCVFlQRV9VVUlEfSIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5gKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUhleChlKSx0KX1zdGF0aWMgY3JlYXRlRnJvbUJhc2U2NChlLHQpe3JldHVybiBuZXcgeWUoX2UuZnJvbUJhc2U2NChlKSx0KX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2xldCBuLHI7aWYodD10fHx7fSwiJGJpbmFyeSJpbiBlP3QubGVnYWN5JiYic3RyaW5nIj09dHlwZW9mIGUuJGJpbmFyeSYmIiR0eXBlImluIGU/KHI9ZS4kdHlwZT9wYXJzZUludChlLiR0eXBlLDE2KTowLG49X2UuZnJvbUJhc2U2NChlLiRiaW5hcnkpKToic3RyaW5nIiE9dHlwZW9mIGUuJGJpbmFyeSYmKHI9ZS4kYmluYXJ5LnN1YlR5cGU/cGFyc2VJbnQoZS4kYmluYXJ5LnN1YlR5cGUsMTYpOjAsbj1fZS5mcm9tQmFzZTY0KGUuJGJpbmFyeS5iYXNlNjQpKToiJHV1aWQiaW4gZSYmKHI9NCxuPXhlLmJ5dGVzRnJvbVN0cmluZyhlLiR1dWlkKSksIW4pdGhyb3cgbmV3IFooYFVuZXhwZWN0ZWQgQmluYXJ5IEV4dGVuZGVkIEpTT04gZm9ybWF0ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7cmV0dXJuIHI9PT1IP25ldyB4ZShuKTpuZXcgeWUobixyKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gQmluYXJ5LmNyZWF0ZUZyb21CYXNlNjQoJHtuKF9lLnRvQmFzZTY0KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsdGhpcy5wb3NpdGlvbikpLHQpfSwgJHtuKHRoaXMuc3ViX3R5cGUsdCl9KWB9dG9JbnQ4QXJyYXkoKXtpZih0aGlzLnN1Yl90eXBlIT09eWUuU1VCVFlQRV9WRUNUT1IpdGhyb3cgbmV3IFooIkJpbmFyeSBzdWJfdHlwZSBpcyBub3QgVmVjdG9yIik7aWYodGhpcy5idWZmZXJbMF0hPT15ZS5WRUNUT1JfVFlQRS5JbnQ4KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IEludDgiKTtyZXR1cm4gbWUodGhpcyksbmV3IEludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpfXRvRmxvYXQzMkFycmF5KCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMil0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBGbG9hdDMyIik7bWUodGhpcyk7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlci5idWZmZXIuc2xpY2UodGhpcy5idWZmZXIuYnl0ZU9mZnNldCsyLHRoaXMuYnVmZmVyLmJ5dGVPZmZzZXQrdGhpcy5wb3NpdGlvbikpO3JldHVybiBwZS5pc0JpZ0VuZGlhbiYmX2Uuc3dhcDMyKGUpLG5ldyBGbG9hdDMyQXJyYXkoZS5idWZmZXIpfXRvUGFja2VkQml0cygpe2lmKHRoaXMuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUil0aHJvdyBuZXcgWigiQmluYXJ5IHN1Yl90eXBlIGlzIG5vdCBWZWN0b3IiKTtpZih0aGlzLmJ1ZmZlclswXSE9PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCl0aHJvdyBuZXcgWigiQmluYXJ5IGRhdGF0eXBlIGZpZWxkIGlzIG5vdCBwYWNrZWQgYml0Iik7cmV0dXJuIG1lKHRoaXMpLG5ldyBVaW50OEFycmF5KHRoaXMuYnVmZmVyLmJ1ZmZlci5zbGljZSh0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0KzIsdGhpcy5idWZmZXIuYnl0ZU9mZnNldCt0aGlzLnBvc2l0aW9uKSl9dG9CaXRzKCl7aWYodGhpcy5zdWJfdHlwZSE9PXllLlNVQlRZUEVfVkVDVE9SKXRocm93IG5ldyBaKCJCaW5hcnkgc3ViX3R5cGUgaXMgbm90IFZlY3RvciIpO2lmKHRoaXMuYnVmZmVyWzBdIT09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0KXRocm93IG5ldyBaKCJCaW5hcnkgZGF0YXR5cGUgZmllbGQgaXMgbm90IHBhY2tlZCBiaXQiKTttZSh0aGlzKTtjb25zdCBlPTgqKHRoaXMubGVuZ3RoKCktMiktdGhpcy5idWZmZXJbMV0sdD1uZXcgSW50OEFycmF5KGUpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBuPWUvOHwwLHI9dGhpcy5idWZmZXJbbisyXT4+Ny1lJTgmMTt0W2VdPXJ9cmV0dXJuIHR9c3RhdGljIGZyb21JbnQ4QXJyYXkoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZShlLmJ5dGVMZW5ndGgrMik7dFswXT15ZS5WRUNUT1JfVFlQRS5JbnQ4LHRbMV09MDtjb25zdCBuPW5ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpO3Quc2V0KG4sMik7Y29uc3Qgcj1uZXcgdGhpcyh0LHRoaXMuU1VCVFlQRV9WRUNUT1IpO3JldHVybiBtZShyKSxyfXN0YXRpYyBmcm9tRmxvYXQzMkFycmF5KGUpe2NvbnN0IHQ9X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO3RbMF09eWUuVkVDVE9SX1RZUEUuRmxvYXQzMix0WzFdPTA7Y29uc3Qgbj1uZXcgVWludDhBcnJheShlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKTt0LnNldChuLDIpLHBlLmlzQmlnRW5kaWFuJiZfZS5zd2FwMzIobmV3IFVpbnQ4QXJyYXkodC5idWZmZXIsMikpO2NvbnN0IHI9bmV3IHRoaXModCx0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbVBhY2tlZEJpdHMoZSx0PTApe2NvbnN0IG49X2UuYWxsb2NhdGUoZS5ieXRlTGVuZ3RoKzIpO25bMF09eWUuVkVDVE9SX1RZUEUuUGFja2VkQml0LG5bMV09dCxuLnNldChlLDIpO2NvbnN0IHI9bmV3IHRoaXMobix0aGlzLlNVQlRZUEVfVkVDVE9SKTtyZXR1cm4gbWUocikscn1zdGF0aWMgZnJvbUJpdHMoZSl7Y29uc3QgdD1lLmxlbmd0aCs3Pj4+MyxuPW5ldyBVaW50OEFycmF5KHQrMik7blswXT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQ7Y29uc3Qgcj1lLmxlbmd0aCU4O25bMV09MD09PXI/MDo4LXI7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IHI9dD4+PjMsaT1lW3RdO2lmKDAhPT1pJiYxIT09aSl0aHJvdyBuZXcgWihgSW52YWxpZCBiaXQgdmFsdWUgYXQgJHt0fTogbXVzdCBiZSAwIG9yIDEsIGZvdW5kICR7ZVt0XX1gKTtpZigwPT09aSljb250aW51ZTtjb25zdCBvPTctdCU4O25bcisyXXw9aTw8b31yZXR1cm4gbmV3IHRoaXMobix5ZS5TVUJUWVBFX1ZFQ1RPUil9fWZ1bmN0aW9uIG1lKGUpe2lmKGUuc3ViX3R5cGUhPT15ZS5TVUJUWVBFX1ZFQ1RPUilyZXR1cm47Y29uc3QgdD1lLnBvc2l0aW9uLG49ZS5idWZmZXJbMF0scj1lLmJ1ZmZlclsxXTtpZigobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzJ8fG49PT15ZS5WRUNUT1JfVFlQRS5JbnQ4KSYmMCE9PXIpdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBwYWRkaW5nIG11c3QgYmUgemVybyBmb3IgaW50OCBhbmQgZmxvYXQzMiB2ZWN0b3JzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLkZsb2F0MzImJjAhPT10JiZ0LTIhPTAmJih0LTIpJTQhPTApdGhyb3cgbmV3IFooIkludmFsaWQgVmVjdG9yOiBGbG9hdDMyIHZlY3RvciBtdXN0IGNvbnRhaW4gYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIik7aWYobj09PXllLlZFQ1RPUl9UWVBFLlBhY2tlZEJpdCYmMCE9PXImJjI9PT10KXRocm93IG5ldyBaKCJJbnZhbGlkIFZlY3RvcjogcGFkZGluZyBtdXN0IGJlIHplcm8gZm9yIHBhY2tlZCBiaXQgdmVjdG9ycyB0aGF0IGFyZSBlbXB0eSIpO2lmKG49PT15ZS5WRUNUT1JfVFlQRS5QYWNrZWRCaXQmJnI+Nyl0aHJvdyBuZXcgWihgSW52YWxpZCBWZWN0b3I6IHBhZGRpbmcgbXVzdCBiZSBhIHZhbHVlIGJldHdlZW4gMCBhbmQgNy4gZm91bmQ6ICR7cn1gKX1jb25zdCBTZT0vXlswLTlBLUZdezMyfSQvaSxCZT0vXlswLTlBLUZdezh9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezR9LVswLTlBLUZdezEyfSQvaTtjbGFzcyB4ZSBleHRlbmRzIHlle2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKG51bGw9PWUpdD14ZS5nZW5lcmF0ZSgpO2Vsc2UgaWYoZSBpbnN0YW5jZW9mIHhlKXQ9X2UudG9Mb2NhbEJ1ZmZlclR5cGUobmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpKTtlbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhlKSYmMTY9PT1lLmJ5dGVMZW5ndGgpdD1fZS50b0xvY2FsQnVmZmVyVHlwZShlKTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIFVVSUQgY29uc3RydWN0b3IgbXVzdCBiZSBhIFVVSUQsIGEgMTYgYnl0ZSBCdWZmZXIgb3IgYSAzMi8zNiBjaGFyYWN0ZXIgaGV4IHN0cmluZyAoZGFzaGVzIGV4Y2x1ZGVkL2luY2x1ZGVkLCBmb3JtYXQ6IHh4eHh4eHh4LXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCkuIik7dD14ZS5ieXRlc0Zyb21TdHJpbmcoZSl9c3VwZXIodCxIKX1nZXQgaWQoKXtyZXR1cm4gdGhpcy5idWZmZXJ9c2V0IGlkKGUpe3RoaXMuYnVmZmVyPWV9dG9IZXhTdHJpbmcoZT0hMCl7cmV0dXJuIGU/W19lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDAsNCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDQsNikpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDYsOCkpLF9lLnRvSGV4KHRoaXMuYnVmZmVyLnN1YmFycmF5KDgsMTApKSxfZS50b0hleCh0aGlzLmJ1ZmZlci5zdWJhcnJheSgxMCwxNikpXS5qb2luKCItIik6X2UudG9IZXgodGhpcy5idWZmZXIpfXRvU3RyaW5nKGUpe3JldHVybiJoZXgiPT09ZT9fZS50b0hleCh0aGlzLmlkKToiYmFzZTY0Ij09PWU/X2UudG9CYXNlNjQodGhpcy5pZCk6dGhpcy50b0hleFN0cmluZygpfXRvSlNPTigpe3JldHVybiB0aGlzLnRvSGV4U3RyaW5nKCl9ZXF1YWxzKGUpe2lmKCFlKXJldHVybiExO2lmKGUgaW5zdGFuY2VvZiB4ZSlyZXR1cm4gX2UuZXF1YWxzKGUuaWQsdGhpcy5pZCk7dHJ5e3JldHVybiBfZS5lcXVhbHMobmV3IHhlKGUpLmlkLHRoaXMuaWQpfWNhdGNoe3JldHVybiExfX10b0JpbmFyeSgpe3JldHVybiBuZXcgeWUodGhpcy5pZCx5ZS5TVUJUWVBFX1VVSUQpfXN0YXRpYyBnZW5lcmF0ZSgpe2NvbnN0IGU9X2UucmFuZG9tQnl0ZXMoMTYpO3JldHVybiBlWzZdPTE1JmVbNl18NjQsZVs4XT02MyZlWzhdfDEyOCxlfXN0YXRpYyBpc1ZhbGlkKGUpe3JldHVybiEhZSYmKCJzdHJpbmciPT10eXBlb2YgZT94ZS5pc1ZhbGlkVVVJRFN0cmluZyhlKTpfKGUpPzE2PT09ZS5ieXRlTGVuZ3RoOiJCaW5hcnkiPT09ZS5fYnNvbnR5cGUmJmUuc3ViX3R5cGU9PT10aGlzLlNVQlRZUEVfVVVJRCYmMTY9PT1lLmJ1ZmZlci5ieXRlTGVuZ3RoKX1zdGF0aWMgY3JlYXRlRnJvbUhleFN0cmluZyhlKXtjb25zdCB0PXhlLmJ5dGVzRnJvbVN0cmluZyhlKTtyZXR1cm4gbmV3IHhlKHQpfXN0YXRpYyBjcmVhdGVGcm9tQmFzZTY0KGUpe3JldHVybiBuZXcgeGUoX2UuZnJvbUJhc2U2NChlKSl9c3RhdGljIGJ5dGVzRnJvbVN0cmluZyhlKXtpZigheGUuaXNWYWxpZFVVSURTdHJpbmcoZSkpdGhyb3cgbmV3IFooIlVVSUQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgYmUgMzIgaGV4IGRpZ2l0cyBvciBjYW5vbmljYWwgaHlwaGVuYXRlZCByZXByZXNlbnRhdGlvbiIpO3JldHVybiBfZS5mcm9tSGV4KGUucmVwbGFjZSgvLS9nLCIiKSl9c3RhdGljIGlzVmFsaWRVVUlEU3RyaW5nKGUpe3JldHVybiBTZS50ZXN0KGUpfHxCZS50ZXN0KGUpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IFVVSUQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19Y2xhc3MgRWUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkNvZGUifWNvZGU7c2NvcGU7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMuY29kZT1lLnRvU3RyaW5nKCksdGhpcy5zY29wZT10Pz9udWxsfXRvSlNPTigpe3JldHVybiBudWxsIT10aGlzLnNjb3BlP3tjb2RlOnRoaXMuY29kZSxzY29wZTp0aGlzLnNjb3BlfTp7Y29kZTp0aGlzLmNvZGV9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMuc2NvcGU/eyRjb2RlOnRoaXMuY29kZSwkc2NvcGU6dGhpcy5zY29wZX06eyRjb2RlOnRoaXMuY29kZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBFZShlLiRjb2RlLGUuJHNjb3BlKX1pbnNwZWN0KGUsdCxuKXtuPz89dztsZXQgcj1uKHRoaXMuY29kZSx0KTtjb25zdCBpPXIuaW5jbHVkZXMoIlxuIik7bnVsbCE9dGhpcy5zY29wZSYmKHIrPWAsJHtpPyJcbiI6IiAifSR7bih0aGlzLnNjb3BlLHQpfWApO3JldHVybmBuZXcgQ29kZSgke2k/IlxuIjoiIn0ke3J9JHtpJiZudWxsPT09dGhpcy5zY29wZT8iXG4iOiIifSlgfX1mdW5jdGlvbiBVZShlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiJGlkImluIGUmJm51bGwhPWUuJGlkJiYiJHJlZiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJHJlZiYmKCEoIiRkYiJpbiBlKXx8IiRkYiJpbiBlJiYic3RyaW5nIj09dHlwZW9mIGUuJGRiKX1jbGFzcyBPZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iREJSZWYifWNvbGxlY3Rpb247b2lkO2RiO2ZpZWxkcztjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcigpO2NvbnN0IGk9ZS5zcGxpdCgiLiIpOzI9PT1pLmxlbmd0aCYmKG49aS5zaGlmdCgpLGU9aS5zaGlmdCgpKSx0aGlzLmNvbGxlY3Rpb249ZSx0aGlzLm9pZD10LHRoaXMuZGI9bix0aGlzLmZpZWxkcz1yfHx7fX1nZXQgbmFtZXNwYWNlKCl7cmV0dXJuIHRoaXMuY29sbGVjdGlvbn1zZXQgbmFtZXNwYWNlKGUpe3RoaXMuY29sbGVjdGlvbj1lfXRvSlNPTigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7JHJlZjp0aGlzLmNvbGxlY3Rpb24sJGlkOnRoaXMub2lkfSx0aGlzLmZpZWxkcyk7cmV0dXJuIG51bGwhPXRoaXMuZGImJihlLiRkYj10aGlzLmRiKSxlfXRvRXh0ZW5kZWRKU09OKGUpe2U9ZXx8e307bGV0IHQ9eyRyZWY6dGhpcy5jb2xsZWN0aW9uLCRpZDp0aGlzLm9pZH07cmV0dXJuIGUubGVnYWN5fHwodGhpcy5kYiYmKHQuJGRiPXRoaXMuZGIpLHQ9T2JqZWN0LmFzc2lnbih0LHRoaXMuZmllbGRzKSksdH1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIGRlbGV0ZSB0LiRyZWYsZGVsZXRlIHQuJGlkLGRlbGV0ZSB0LiRkYixuZXcgT2UoZS4kcmVmLGUuJGlkLGUuJGRiLHQpfWluc3BlY3QoZSx0LG4pe24/Pz13O2NvbnN0IHI9W24odGhpcy5uYW1lc3BhY2UsdCksbih0aGlzLm9pZCx0KSwuLi50aGlzLmRiP1tuKHRoaXMuZGIsdCldOltdLC4uLk9iamVjdC5rZXlzKHRoaXMuZmllbGRzKS5sZW5ndGg+MD9bbih0aGlzLmZpZWxkcyx0KV06W11dO3JldHVybiByWzFdPW49PT13P2BuZXcgT2JqZWN0SWQoJHtyWzFdfSlgOnJbMV0sYG5ldyBEQlJlZigke3Iuam9pbigiLCAiKX0pYH19ZnVuY3Rpb24gTmUoZSl7aWYoIiI9PT1lKXJldHVybiBlO2xldCB0PTA7Y29uc3Qgbj0iLSI9PT1lW3RdLHI9IisiPT09ZVt0XTsocnx8bikmJih0Kz0xKTtsZXQgaT0hMTtmb3IoO3Q8ZS5sZW5ndGgmJiIwIj09PWVbdF07Kyt0KWk9ITA7cmV0dXJuIGk/YCR7bj8iLSI6IiJ9JHtlLmxlbmd0aD09PXQ/IjAiOmUuc2xpY2UodCl9YDpyP2Uuc2xpY2UoMSk6ZX1sZXQgSWU7dHJ5e0llPW5ldyBXZWJBc3NlbWJseS5JbnN0YW5jZShuZXcgV2ViQXNzZW1ibHkuTW9kdWxlKG5ldyBVaW50OEFycmF5KFswLDk3LDExNSwxMDksMSwwLDAsMCwxLDEzLDIsOTYsMCwxLDEyNyw5Niw0LDEyNywxMjcsMTI3LDEyNywxLDEyNywzLDcsNiwwLDEsMSwxLDEsMSw2LDYsMSwxMjcsMSw2NSwwLDExLDcsNTAsNiwzLDEwOSwxMTcsMTA4LDAsMSw1LDEwMCwxMDUsMTE4LDk1LDExNSwwLDIsNSwxMDAsMTA1LDExOCw5NSwxMTcsMCwzLDUsMTE0LDEwMSwxMDksOTUsMTE1LDAsNCw1LDExNCwxMDEsMTA5LDk1LDExNywwLDUsOCwxMDMsMTAxLDExNiw5NSwxMDQsMTA1LDEwMywxMDQsMCwwLDEwLDE5MSwxLDYsNCwwLDM1LDAsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI2LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEyNywzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMSwzNiwxLDEsMTI2LDMyLDAsMTczLDMyLDEsMTczLDY2LDMyLDEzNCwxMzIsMzIsMiwxNzMsMzIsMywxNzMsNjYsMzIsMTM0LDEzMiwxMjgsMzQsNCw2NiwzMiwxMzUsMTY3LDM2LDAsMzIsNCwxNjcsMTEsMzYsMSwxLDEyNiwzMiwwLDE3MywzMiwxLDE3Myw2NiwzMiwxMzQsMTMyLDMyLDIsMTczLDMyLDMsMTczLDY2LDMyLDEzNCwxMzIsMTI5LDM0LDQsNjYsMzIsMTM1LDE2NywzNiwwLDMyLDQsMTY3LDExLDM2LDEsMSwxMjYsMzIsMCwxNzMsMzIsMSwxNzMsNjYsMzIsMTM0LDEzMiwzMiwyLDE3MywzMiwzLDE3Myw2NiwzMiwxMzQsMTMyLDEzMCwzNCw0LDY2LDMyLDEzNSwxNjcsMzYsMCwzMiw0LDE2NywxMV0pKSx7fSkuZXhwb3J0c31jYXRjaHt9Y29uc3QgdmU9NDI5NDk2NzI5NixUZT0weDEwMDAwMDAwMDAwMDAwMDAwLCRlPVRlLzIsTGU9e30sQWU9e30sUmU9L14oXCs/MHwoXCt8LSk/WzEtOV1bMC05XSopJC87Y2xhc3MgamUgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkxvbmcifWdldCBfX2lzTG9uZ19fKCl7cmV0dXJuITB9aGlnaDtsb3c7dW5zaWduZWQ7Y29uc3RydWN0b3IoZT0wLHQsbil7c3VwZXIoKTtjb25zdCByPSJib29sZWFuIj09dHlwZW9mIHQ/dDpCb29sZWFuKG4pLGk9Im51bWJlciI9PXR5cGVvZiB0P3Q6MCxvPSJzdHJpbmciPT10eXBlb2YgZT9qZS5mcm9tU3RyaW5nKGUscik6ImJpZ2ludCI9PXR5cGVvZiBlP2plLmZyb21CaWdJbnQoZSxyKTp7bG93OjB8ZSxoaWdoOjB8aSx1bnNpZ25lZDpyfTt0aGlzLmxvdz1vLmxvdyx0aGlzLmhpZ2g9by5oaWdoLHRoaXMudW5zaWduZWQ9by51bnNpZ25lZH1zdGF0aWMgVFdPX1BXUl8yND1qZS5mcm9tSW50KDE2Nzc3MjE2KTtzdGF0aWMgTUFYX1VOU0lHTkVEX1ZBTFVFPWplLmZyb21CaXRzKC0xLC0xLCEwKTtzdGF0aWMgWkVSTz1qZS5mcm9tSW50KDApO3N0YXRpYyBVWkVSTz1qZS5mcm9tSW50KDAsITApO3N0YXRpYyBPTkU9amUuZnJvbUludCgxKTtzdGF0aWMgVU9ORT1qZS5mcm9tSW50KDEsITApO3N0YXRpYyBORUdfT05FPWplLmZyb21JbnQoLTEpO3N0YXRpYyBNQVhfVkFMVUU9amUuZnJvbUJpdHMoLTEsMjE0NzQ4MzY0NywhMSk7c3RhdGljIE1JTl9WQUxVRT1qZS5mcm9tQml0cygwLC0yMTQ3NDgzNjQ4LCExKTtzdGF0aWMgZnJvbUJpdHMoZSx0LG4pe3JldHVybiBuZXcgamUoZSx0LG4pfXN0YXRpYyBmcm9tSW50KGUsdCl7bGV0IG4scixpO3JldHVybiB0PyhpPTA8PShlPj4+PTApJiZlPDI1NikmJihyPUFlW2VdLHIpP3I6KG49amUuZnJvbUJpdHMoZSwoMHxlKTwwPy0xOjAsITApLGkmJihBZVtlXT1uKSxuKTooaT0tMTI4PD0oZXw9MCkmJmU8MTI4KSYmKHI9TGVbZV0scik/cjoobj1qZS5mcm9tQml0cyhlLGU8MD8tMTowLCExKSxpJiYoTGVbZV09biksbil9c3RhdGljIGZyb21OdW1iZXIoZSx0KXtpZihpc05hTihlKSlyZXR1cm4gdD9qZS5VWkVSTzpqZS5aRVJPO2lmKHQpe2lmKGU8MClyZXR1cm4gamUuVVpFUk87aWYoZT49VGUpcmV0dXJuIGplLk1BWF9VTlNJR05FRF9WQUxVRX1lbHNle2lmKGU8PS0kZSlyZXR1cm4gamUuTUlOX1ZBTFVFO2lmKGUrMT49JGUpcmV0dXJuIGplLk1BWF9WQUxVRX1yZXR1cm4gZTwwP2plLmZyb21OdW1iZXIoLWUsdCkubmVnKCk6amUuZnJvbUJpdHMoZSV2ZXwwLGUvdmV8MCx0KX1zdGF0aWMgZnJvbUJpZ0ludChlLHQpe2NvbnN0IG49MHhmZmZmZmZmZm47cmV0dXJuIG5ldyBqZShOdW1iZXIoZSZuKSxOdW1iZXIoZT4+MzJuJm4pLHQpfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQsbil7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBaKCJlbXB0eSBzdHJpbmciKTtpZihuPDJ8fDM2PG4pdGhyb3cgbmV3IFooInJhZGl4Iik7bGV0IHI7aWYoKHI9ZS5pbmRleE9mKCItIikpPjApdGhyb3cgbmV3IFooImludGVyaW9yIGh5cGhlbiIpO2lmKDA9PT1yKXJldHVybiBqZS5fZnJvbVN0cmluZyhlLnN1YnN0cmluZygxKSx0LG4pLm5lZygpO2NvbnN0IGk9amUuZnJvbU51bWJlcihNYXRoLnBvdyhuLDgpKTtsZXQgbz1qZS5aRVJPO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCs9OCl7Y29uc3Qgcj1NYXRoLm1pbig4LGUubGVuZ3RoLXQpLHM9cGFyc2VJbnQoZS5zdWJzdHJpbmcodCx0K3IpLG4pO2lmKHI8OCl7Y29uc3QgZT1qZS5mcm9tTnVtYmVyKE1hdGgucG93KG4scikpO289by5tdWwoZSkuYWRkKGplLmZyb21OdW1iZXIocykpfWVsc2Ugbz1vLm11bChpKSxvPW8uYWRkKGplLmZyb21OdW1iZXIocykpfXJldHVybiBvLnVuc2lnbmVkPXQsb31zdGF0aWMgZnJvbVN0cmluZ1N0cmljdChlLHQsbil7bGV0IHI9ITE7aWYoIm51bWJlciI9PXR5cGVvZiB0PyhuPXQsdD0hMSk6cj0hIXQsbj8/PTEwLGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBsZWFkaW5nIGFuZC9vciB0cmFpbGluZyB3aGl0ZXNwYWNlYCk7aWYoIWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0iMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6Ii5zbGljZSgwLHQ9dD8/MTApO3JldHVybiFuZXcgUmVnRXhwKGBbXi0rJHtufV1gLCJpIikudGVzdChlKSYmZX0oZSxuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgZm9yIHJhZGl4OiAke259YCk7Y29uc3QgaT1OZShlKSxvPWplLl9mcm9tU3RyaW5nKGkscixuKTtpZihvLnRvU3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkhPT1pLnRvTG93ZXJDYXNlKCkpdGhyb3cgbmV3IFooYElucHV0OiAke2V9IGlzIG5vdCByZXByZXNlbnRhYmxlIGFzICR7by51bnNpZ25lZD8iYW4gdW5zaWduZWQiOiJhIHNpZ25lZCJ9IDY0LWJpdCBMb25nICR7bnVsbCE9bj9gd2l0aCByYWRpeDogJHtufWA6IiJ9YCk7cmV0dXJuIG99c3RhdGljIGZyb21TdHJpbmcoZSx0LG4pe2xldCByPSExO3JldHVybiJudW1iZXIiPT10eXBlb2YgdD8obj10LHQ9ITEpOnI9ISF0LG4/Pz0xMCwiTmFOIj09PWUmJm48MjR8fCgiSW5maW5pdHkiPT09ZXx8IitJbmZpbml0eSI9PT1lfHwiLUluZmluaXR5Ij09PWUpJiZuPDM1P2plLlpFUk86amUuX2Zyb21TdHJpbmcoZSxyLG4pfXN0YXRpYyBmcm9tQnl0ZXMoZSx0LG4pe3JldHVybiBuP2plLmZyb21CeXRlc0xFKGUsdCk6amUuZnJvbUJ5dGVzQkUoZSx0KX1zdGF0aWMgZnJvbUJ5dGVzTEUoZSx0KXtyZXR1cm4gbmV3IGplKGVbMF18ZVsxXTw8OHxlWzJdPDwxNnxlWzNdPDwyNCxlWzRdfGVbNV08PDh8ZVs2XTw8MTZ8ZVs3XTw8MjQsdCl9c3RhdGljIGZyb21CeXRlc0JFKGUsdCl7cmV0dXJuIG5ldyBqZShlWzRdPDwyNHxlWzVdPDwxNnxlWzZdPDw4fGVbN10sZVswXTw8MjR8ZVsxXTw8MTZ8ZVsyXTw8OHxlWzNdLHQpfXN0YXRpYyBpc0xvbmcoZSl7cmV0dXJuIG51bGwhPWUmJiJvYmplY3QiPT10eXBlb2YgZSYmIl9faXNMb25nX18iaW4gZSYmITA9PT1lLl9faXNMb25nX199c3RhdGljIGZyb21WYWx1ZShlLHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9qZS5mcm9tTnVtYmVyKGUsdCk6InN0cmluZyI9PXR5cGVvZiBlP2plLmZyb21TdHJpbmcoZSx0KTpqZS5mcm9tQml0cyhlLmxvdyxlLmhpZ2gsImJvb2xlYW4iPT10eXBlb2YgdD90OmUudW5zaWduZWQpfWFkZChlKXtqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSk7Y29uc3QgdD10aGlzLmhpZ2g+Pj4xNixuPTY1NTM1JnRoaXMuaGlnaCxyPXRoaXMubG93Pj4+MTYsaT02NTUzNSZ0aGlzLmxvdyxvPWUuaGlnaD4+PjE2LHM9NjU1MzUmZS5oaWdoLGE9ZS5sb3c+Pj4xNjtsZXQgYz0wLGw9MCxmPTAsdT0wO3JldHVybiB1Kz1pKyg2NTUzNSZlLmxvdyksZis9dT4+PjE2LHUmPTY1NTM1LGYrPXIrYSxsKz1mPj4+MTYsZiY9NjU1MzUsbCs9bitzLGMrPWw+Pj4xNixsJj02NTUzNSxjKz10K28sYyY9NjU1MzUsamUuZnJvbUJpdHMoZjw8MTZ8dSxjPDwxNnxsLHRoaXMudW5zaWduZWQpfWFuZChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93JmUubG93LHRoaXMuaGlnaCZlLmhpZ2gsdGhpcy51bnNpZ25lZCl9Y29tcGFyZShlKXtpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksdGhpcy5lcShlKSlyZXR1cm4gMDtjb25zdCB0PXRoaXMuaXNOZWdhdGl2ZSgpLG49ZS5pc05lZ2F0aXZlKCk7cmV0dXJuIHQmJiFuPy0xOiF0JiZuPzE6dGhpcy51bnNpZ25lZD9lLmhpZ2g+Pj4wPnRoaXMuaGlnaD4+PjB8fGUuaGlnaD09PXRoaXMuaGlnaCYmZS5sb3c+Pj4wPnRoaXMubG93Pj4+MD8tMToxOnRoaXMuc3ViKGUpLmlzTmVnYXRpdmUoKT8tMToxfWNvbXAoZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlKX1kaXZpZGUoZSl7aWYoamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGUuaXNaZXJvKCkpdGhyb3cgbmV3IFooImRpdmlzaW9uIGJ5IHplcm8iKTtpZihJZSl7aWYoIXRoaXMudW5zaWduZWQmJi0yMTQ3NDgzNjQ4PT09dGhpcy5oaWdoJiYtMT09PWUubG93JiYtMT09PWUuaGlnaClyZXR1cm4gdGhpcztjb25zdCB0PSh0aGlzLnVuc2lnbmVkP0llLmRpdl91OkllLmRpdl9zKSh0aGlzLmxvdyx0aGlzLmhpZ2gsZS5sb3csZS5oaWdoKTtyZXR1cm4gamUuZnJvbUJpdHModCxJZS5nZXRfaGlnaCgpLHRoaXMudW5zaWduZWQpfWlmKHRoaXMuaXNaZXJvKCkpcmV0dXJuIHRoaXMudW5zaWduZWQ/amUuVVpFUk86amUuWkVSTztsZXQgdCxuLHI7aWYodGhpcy51bnNpZ25lZCl7aWYoZS51bnNpZ25lZHx8KGU9ZS50b1Vuc2lnbmVkKCkpLGUuZ3QodGhpcykpcmV0dXJuIGplLlVaRVJPO2lmKGUuZ3QodGhpcy5zaHJ1KDEpKSlyZXR1cm4gamUuVU9ORTtyPWplLlVaRVJPfWVsc2V7aWYodGhpcy5lcShqZS5NSU5fVkFMVUUpKXtpZihlLmVxKGplLk9ORSl8fGUuZXEoamUuTkVHX09ORSkpcmV0dXJuIGplLk1JTl9WQUxVRTtpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGplLk9ORTtyZXR1cm4gdD10aGlzLnNocigxKS5kaXYoZSkuc2hsKDEpLHQuZXEoamUuWkVSTyk/ZS5pc05lZ2F0aXZlKCk/amUuT05FOmplLk5FR19PTkU6KG49dGhpcy5zdWIoZS5tdWwodCkpLHI9dC5hZGQobi5kaXYoZSkpLHIpfWlmKGUuZXEoamUuTUlOX1ZBTFVFKSlyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5VWkVSTzpqZS5aRVJPO2lmKHRoaXMuaXNOZWdhdGl2ZSgpKXJldHVybiBlLmlzTmVnYXRpdmUoKT90aGlzLm5lZygpLmRpdihlLm5lZygpKTp0aGlzLm5lZygpLmRpdihlKS5uZWcoKTtpZihlLmlzTmVnYXRpdmUoKSlyZXR1cm4gdGhpcy5kaXYoZS5uZWcoKSkubmVnKCk7cj1qZS5aRVJPfWZvcihuPXRoaXM7bi5ndGUoZSk7KXt0PU1hdGgubWF4KDEsTWF0aC5mbG9vcihuLnRvTnVtYmVyKCkvZS50b051bWJlcigpKSk7Y29uc3QgaT1NYXRoLmNlaWwoTWF0aC5sb2codCkvTWF0aC5MTjIpLG89aTw9NDg/MTpNYXRoLnBvdygyLGktNDgpO2xldCBzPWplLmZyb21OdW1iZXIodCksYT1zLm11bChlKTtmb3IoO2EuaXNOZWdhdGl2ZSgpfHxhLmd0KG4pOyl0LT1vLHM9amUuZnJvbU51bWJlcih0LHRoaXMudW5zaWduZWQpLGE9cy5tdWwoZSk7cy5pc1plcm8oKSYmKHM9amUuT05FKSxyPXIuYWRkKHMpLG49bi5zdWIoYSl9cmV0dXJuIHJ9ZGl2KGUpe3JldHVybiB0aGlzLmRpdmlkZShlKX1lcXVhbHMoZSl7cmV0dXJuIGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSwodGhpcy51bnNpZ25lZD09PWUudW5zaWduZWR8fHRoaXMuaGlnaD4+PjMxIT0xfHxlLmhpZ2g+Pj4zMSE9MSkmJih0aGlzLmhpZ2g9PT1lLmhpZ2gmJnRoaXMubG93PT09ZS5sb3cpfWVxKGUpe3JldHVybiB0aGlzLmVxdWFscyhlKX1nZXRIaWdoQml0cygpe3JldHVybiB0aGlzLmhpZ2h9Z2V0SGlnaEJpdHNVbnNpZ25lZCgpe3JldHVybiB0aGlzLmhpZ2g+Pj4wfWdldExvd0JpdHMoKXtyZXR1cm4gdGhpcy5sb3d9Z2V0TG93Qml0c1Vuc2lnbmVkKCl7cmV0dXJuIHRoaXMubG93Pj4+MH1nZXROdW1CaXRzQWJzKCl7aWYodGhpcy5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMuZXEoamUuTUlOX1ZBTFVFKT82NDp0aGlzLm5lZygpLmdldE51bUJpdHNBYnMoKTtjb25zdCBlPTAhPT10aGlzLmhpZ2g/dGhpcy5oaWdoOnRoaXMubG93O2xldCB0O2Zvcih0PTMxO3Q+MCYmIShlJjE8PHQpO3QtLSk7cmV0dXJuIDAhPT10aGlzLmhpZ2g/dCszMzp0KzF9Z3JlYXRlclRoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKT4wfWd0KGUpe3JldHVybiB0aGlzLmdyZWF0ZXJUaGFuKGUpfWdyZWF0ZXJUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPj0wfWd0ZShlKXtyZXR1cm4gdGhpcy5ncmVhdGVyVGhhbk9yRXF1YWwoZSl9Z2UoZSl7cmV0dXJuIHRoaXMuZ3JlYXRlclRoYW5PckVxdWFsKGUpfWlzRXZlbigpe3JldHVybiEoMSZ0aGlzLmxvdyl9aXNOZWdhdGl2ZSgpe3JldHVybiF0aGlzLnVuc2lnbmVkJiZ0aGlzLmhpZ2g8MH1pc09kZCgpe3JldHVybiEoMSZ+dGhpcy5sb3cpfWlzUG9zaXRpdmUoKXtyZXR1cm4gdGhpcy51bnNpZ25lZHx8dGhpcy5oaWdoPj0wfWlzWmVybygpe3JldHVybiAwPT09dGhpcy5oaWdoJiYwPT09dGhpcy5sb3d9bGVzc1RoYW4oZSl7cmV0dXJuIHRoaXMuY29tcChlKTwwfWx0KGUpe3JldHVybiB0aGlzLmxlc3NUaGFuKGUpfWxlc3NUaGFuT3JFcXVhbChlKXtyZXR1cm4gdGhpcy5jb21wKGUpPD0wfWx0ZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9bW9kdWxvKGUpe2lmKGplLmlzTG9uZyhlKXx8KGU9amUuZnJvbVZhbHVlKGUpKSxJZSl7Y29uc3QgdD0odGhpcy51bnNpZ25lZD9JZS5yZW1fdTpJZS5yZW1fcykodGhpcy5sb3csdGhpcy5oaWdoLGUubG93LGUuaGlnaCk7cmV0dXJuIGplLmZyb21CaXRzKHQsSWUuZ2V0X2hpZ2goKSx0aGlzLnVuc2lnbmVkKX1yZXR1cm4gdGhpcy5zdWIodGhpcy5kaXYoZSkubXVsKGUpKX1tb2QoZSl7cmV0dXJuIHRoaXMubW9kdWxvKGUpfXJlbShlKXtyZXR1cm4gdGhpcy5tb2R1bG8oZSl9bXVsdGlwbHkoZSl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZihqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksSWUpe2NvbnN0IHQ9SWUubXVsKHRoaXMubG93LHRoaXMuaGlnaCxlLmxvdyxlLmhpZ2gpO3JldHVybiBqZS5mcm9tQml0cyh0LEllLmdldF9oaWdoKCksdGhpcy51bnNpZ25lZCl9aWYoZS5pc1plcm8oKSlyZXR1cm4gamUuWkVSTztpZih0aGlzLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIGUuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZihlLmVxKGplLk1JTl9WQUxVRSkpcmV0dXJuIHRoaXMuaXNPZGQoKT9qZS5NSU5fVkFMVUU6amUuWkVSTztpZih0aGlzLmlzTmVnYXRpdmUoKSlyZXR1cm4gZS5pc05lZ2F0aXZlKCk/dGhpcy5uZWcoKS5tdWwoZS5uZWcoKSk6dGhpcy5uZWcoKS5tdWwoZSkubmVnKCk7aWYoZS5pc05lZ2F0aXZlKCkpcmV0dXJuIHRoaXMubXVsKGUubmVnKCkpLm5lZygpO2lmKHRoaXMubHQoamUuVFdPX1BXUl8yNCkmJmUubHQoamUuVFdPX1BXUl8yNCkpcmV0dXJuIGplLmZyb21OdW1iZXIodGhpcy50b051bWJlcigpKmUudG9OdW1iZXIoKSx0aGlzLnVuc2lnbmVkKTtjb25zdCB0PXRoaXMuaGlnaD4+PjE2LG49NjU1MzUmdGhpcy5oaWdoLHI9dGhpcy5sb3c+Pj4xNixpPTY1NTM1JnRoaXMubG93LG89ZS5oaWdoPj4+MTYscz02NTUzNSZlLmhpZ2gsYT1lLmxvdz4+PjE2LGM9NjU1MzUmZS5sb3c7bGV0IGw9MCxmPTAsdT0wLF89MDtyZXR1cm4gXys9aSpjLHUrPV8+Pj4xNixfJj02NTUzNSx1Kz1yKmMsZis9dT4+PjE2LHUmPTY1NTM1LHUrPWkqYSxmKz11Pj4+MTYsdSY9NjU1MzUsZis9bipjLGwrPWY+Pj4xNixmJj02NTUzNSxmKz1yKmEsbCs9Zj4+PjE2LGYmPTY1NTM1LGYrPWkqcyxsKz1mPj4+MTYsZiY9NjU1MzUsbCs9dCpjK24qYStyKnMraSpvLGwmPTY1NTM1LGplLmZyb21CaXRzKHU8PDE2fF8sbDw8MTZ8Zix0aGlzLnVuc2lnbmVkKX1tdWwoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHkoZSl9bmVnYXRlKCl7cmV0dXJuIXRoaXMudW5zaWduZWQmJnRoaXMuZXEoamUuTUlOX1ZBTFVFKT9qZS5NSU5fVkFMVUU6dGhpcy5ub3QoKS5hZGQoamUuT05FKX1uZWcoKXtyZXR1cm4gdGhpcy5uZWdhdGUoKX1ub3QoKXtyZXR1cm4gamUuZnJvbUJpdHMofnRoaXMubG93LH50aGlzLmhpZ2gsdGhpcy51bnNpZ25lZCl9bm90RXF1YWxzKGUpe3JldHVybiF0aGlzLmVxdWFscyhlKX1uZXEoZSl7cmV0dXJuIHRoaXMubm90RXF1YWxzKGUpfW5lKGUpe3JldHVybiB0aGlzLm5vdEVxdWFscyhlKX1vcihlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLGplLmZyb21CaXRzKHRoaXMubG93fGUubG93LHRoaXMuaGlnaHxlLmhpZ2gsdGhpcy51bnNpZ25lZCl9c2hpZnRMZWZ0KGUpe3JldHVybiBqZS5pc0xvbmcoZSkmJihlPWUudG9JbnQoKSksMD09KGUmPTYzKT90aGlzOmU8MzI/amUuZnJvbUJpdHModGhpcy5sb3c8PGUsdGhpcy5oaWdoPDxlfHRoaXMubG93Pj4+MzItZSx0aGlzLnVuc2lnbmVkKTpqZS5mcm9tQml0cygwLHRoaXMubG93PDxlLTMyLHRoaXMudW5zaWduZWQpfXNobChlKXtyZXR1cm4gdGhpcy5zaGlmdExlZnQoZSl9c2hpZnRSaWdodChlKXtyZXR1cm4gamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PShlJj02Myk/dGhpczplPDMyP2plLmZyb21CaXRzKHRoaXMubG93Pj4+ZXx0aGlzLmhpZ2g8PDMyLWUsdGhpcy5oaWdoPj5lLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHRoaXMuaGlnaD4+ZS0zMix0aGlzLmhpZ2g+PTA/MDotMSx0aGlzLnVuc2lnbmVkKX1zaHIoZSl7cmV0dXJuIHRoaXMuc2hpZnRSaWdodChlKX1zaGlmdFJpZ2h0VW5zaWduZWQoZSl7aWYoamUuaXNMb25nKGUpJiYoZT1lLnRvSW50KCkpLDA9PT0oZSY9NjMpKXJldHVybiB0aGlzO3tjb25zdCB0PXRoaXMuaGlnaDtpZihlPDMyKXtjb25zdCBuPXRoaXMubG93O3JldHVybiBqZS5mcm9tQml0cyhuPj4+ZXx0PDwzMi1lLHQ+Pj5lLHRoaXMudW5zaWduZWQpfXJldHVybiAzMj09PWU/amUuZnJvbUJpdHModCwwLHRoaXMudW5zaWduZWQpOmplLmZyb21CaXRzKHQ+Pj5lLTMyLDAsdGhpcy51bnNpZ25lZCl9fXNocl91KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zaHJ1KGUpe3JldHVybiB0aGlzLnNoaWZ0UmlnaHRVbnNpZ25lZChlKX1zdWJ0cmFjdChlKXtyZXR1cm4gamUuaXNMb25nKGUpfHwoZT1qZS5mcm9tVmFsdWUoZSkpLHRoaXMuYWRkKGUubmVnKCkpfXN1YihlKXtyZXR1cm4gdGhpcy5zdWJ0cmFjdChlKX10b0ludCgpe3JldHVybiB0aGlzLnVuc2lnbmVkP3RoaXMubG93Pj4+MDp0aGlzLmxvd310b051bWJlcigpe3JldHVybiB0aGlzLnVuc2lnbmVkPyh0aGlzLmhpZ2g+Pj4wKSp2ZSsodGhpcy5sb3c+Pj4wKTp0aGlzLmhpZ2gqdmUrKHRoaXMubG93Pj4+MCl9dG9CaWdJbnQoKXtyZXR1cm4gQmlnSW50KHRoaXMudG9TdHJpbmcoKSl9dG9CeXRlcyhlKXtyZXR1cm4gZT90aGlzLnRvQnl0ZXNMRSgpOnRoaXMudG9CeXRlc0JFKCl9dG9CeXRlc0xFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bMjU1JnQsdD4+PjgmMjU1LHQ+Pj4xNiYyNTUsdD4+PjI0LDI1NSZlLGU+Pj44JjI1NSxlPj4+MTYmMjU1LGU+Pj4yNF19dG9CeXRlc0JFKCl7Y29uc3QgZT10aGlzLmhpZ2gsdD10aGlzLmxvdztyZXR1cm5bZT4+PjI0LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlLHQ+Pj4yNCx0Pj4+MTYmMjU1LHQ+Pj44JjI1NSwyNTUmdF19dG9TaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD9qZS5mcm9tQml0cyh0aGlzLmxvdyx0aGlzLmhpZ2gsITEpOnRoaXN9dG9TdHJpbmcoZSl7aWYoKGU9ZXx8MTApPDJ8fDM2PGUpdGhyb3cgbmV3IFooInJhZGl4Iik7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4iMCI7aWYodGhpcy5pc05lZ2F0aXZlKCkpe2lmKHRoaXMuZXEoamUuTUlOX1ZBTFVFKSl7Y29uc3QgdD1qZS5mcm9tTnVtYmVyKGUpLG49dGhpcy5kaXYodCkscj1uLm11bCh0KS5zdWIodGhpcyk7cmV0dXJuIG4udG9TdHJpbmcoZSkrci50b0ludCgpLnRvU3RyaW5nKGUpfXJldHVybiItIit0aGlzLm5lZygpLnRvU3RyaW5nKGUpfWNvbnN0IHQ9amUuZnJvbU51bWJlcihNYXRoLnBvdyhlLDYpLHRoaXMudW5zaWduZWQpO2xldCBuPXRoaXMscj0iIjtmb3IoOzspe2NvbnN0IGk9bi5kaXYodCk7bGV0IG89KG4uc3ViKGkubXVsKHQpKS50b0ludCgpPj4+MCkudG9TdHJpbmcoZSk7aWYobj1pLG4uaXNaZXJvKCkpcmV0dXJuIG8rcjtmb3IoO28ubGVuZ3RoPDY7KW89IjAiK287cj0iIitvK3J9fXRvVW5zaWduZWQoKXtyZXR1cm4gdGhpcy51bnNpZ25lZD90aGlzOmplLmZyb21CaXRzKHRoaXMubG93LHRoaXMuaGlnaCwhMCl9eG9yKGUpe3JldHVybiBqZS5pc0xvbmcoZSl8fChlPWplLmZyb21WYWx1ZShlKSksamUuZnJvbUJpdHModGhpcy5sb3deZS5sb3csdGhpcy5oaWdoXmUuaGlnaCx0aGlzLnVuc2lnbmVkKX1lcXooKXtyZXR1cm4gdGhpcy5pc1plcm8oKX1sZShlKXtyZXR1cm4gdGhpcy5sZXNzVGhhbk9yRXF1YWwoZSl9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuIGUmJmUucmVsYXhlZD90aGlzLnRvTnVtYmVyKCk6eyRudW1iZXJMb25nOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSx0KXtjb25zdHt1c2VCaWdJbnQ2NDpuPSExLHJlbGF4ZWQ6cj0hMH09ey4uLnR9O2lmKGUuJG51bWJlckxvbmcubGVuZ3RoPjIwKXRocm93IG5ldyBaKCIkbnVtYmVyTG9uZyBzdHJpbmcgaXMgdG9vIGxvbmciKTtpZighUmUudGVzdChlLiRudW1iZXJMb25nKSl0aHJvdyBuZXcgWihgJG51bWJlckxvbmcgc3RyaW5nICIke2UuJG51bWJlckxvbmd9IiBpcyBpbiBhbiBpbnZhbGlkIGZvcm1hdGApO2lmKG4pe2NvbnN0IHQ9QmlnSW50KGUuJG51bWJlckxvbmcpO3JldHVybiBCaWdJbnQuYXNJbnROKDY0LHQpfWNvbnN0IGk9amUuZnJvbVN0cmluZyhlLiRudW1iZXJMb25nKTtyZXR1cm4gcj9pLnRvTnVtYmVyKCk6aX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IExvbmcoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0ke3RoaXMudW5zaWduZWQ/YCwgJHtuKHRoaXMudW5zaWduZWQsdCl9YDoiIn0pYH19Y29uc3QgRmU9L14oXCt8LSk/KFxkK3woXGQqXC5cZCopKT8oRXxlKT8oWy0rXSk/KFxkKyk/JC8sa2U9L14oXCt8LSk/KEluZmluaXR5fGluZikkL2ksemU9L14oXCt8LSk/TmFOJC9pLERlPTYxMTEsQ2U9LTYxNzYsTWU9X2UuZnJvbU51bWJlckFycmF5KFsxMjQsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksVmU9X2UuZnJvbU51bWJlckFycmF5KFsyNDgsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksUGU9X2UuZnJvbU51bWJlckFycmF5KFsxMjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDBdLnJldmVyc2UoKSksSmU9L14oWy0rXSk/KFxkKyk/JC87ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX1mdW5jdGlvbiBZZShlKXtjb25zdCB0PWplLmZyb21OdW1iZXIoMWU5KTtsZXQgbj1qZS5mcm9tTnVtYmVyKDApO2lmKCEoZS5wYXJ0c1swXXx8ZS5wYXJ0c1sxXXx8ZS5wYXJ0c1syXXx8ZS5wYXJ0c1szXSkpcmV0dXJue3F1b3RpZW50OmUscmVtOm59O2ZvcihsZXQgcj0wO3I8PTM7cisrKW49bi5zaGlmdExlZnQoMzIpLG49bi5hZGQobmV3IGplKGUucGFydHNbcl0sMCkpLGUucGFydHNbcl09bi5kaXYodCkubG93LG49bi5tb2R1bG8odCk7cmV0dXJue3F1b3RpZW50OmUscmVtOm59fWZ1bmN0aW9uIHFlKGUsdCl7dGhyb3cgbmV3IFooYCIke2V9IiBpcyBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyAtICR7dH1gKX1jbGFzcyBIZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iRGVjaW1hbDEyOCJ9Ynl0ZXM7Y29uc3RydWN0b3IoZSl7aWYoc3VwZXIoKSwic3RyaW5nIj09dHlwZW9mIGUpdGhpcy5ieXRlcz1IZS5mcm9tU3RyaW5nKGUpLmJ5dGVzO2Vsc2V7aWYoIShlIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhlKSkpdGhyb3cgbmV3IFooIkRlY2ltYWwxMjggbXVzdCB0YWtlIGEgQnVmZmVyIG9yIHN0cmluZyIpO2lmKDE2IT09ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKCJEZWNpbWFsMTI4IG11c3QgdGFrZSBhIEJ1ZmZlciBvZiAxNiBieXRlcyIpO3RoaXMuYnl0ZXM9ZX19c3RhdGljIGZyb21TdHJpbmcoZSl7cmV0dXJuIEhlLl9mcm9tU3RyaW5nKGUse2FsbG93Um91bmRpbmc6ITF9KX1zdGF0aWMgZnJvbVN0cmluZ1dpdGhSb3VuZGluZyhlKXtyZXR1cm4gSGUuX2Zyb21TdHJpbmcoZSx7YWxsb3dSb3VuZGluZzohMH0pfXN0YXRpYyBfZnJvbVN0cmluZyhlLHQpe2xldCBuPSExLHI9ITEsaT0hMSxvPSExLHM9MCxhPTAsYz0wLGw9MCxmPTA7Y29uc3QgdT1bMF07bGV0IF89MCxnPTAsaD0wLGI9MCxkPW5ldyBqZSgwLDApLHc9bmV3IGplKDAsMCkscD0wLHk9MDtpZihlLmxlbmd0aD49N2UzKXRocm93IG5ldyBaKGUrIiBub3QgYSB2YWxpZCBEZWNpbWFsMTI4IHN0cmluZyIpO2NvbnN0IG09ZS5tYXRjaChGZSksUz1lLm1hdGNoKGtlKSxCPWUubWF0Y2goemUpO2lmKCFtJiYhUyYmIUJ8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWihlKyIgbm90IGEgdmFsaWQgRGVjaW1hbDEyOCBzdHJpbmciKTtpZihtKXtjb25zdCB0PW1bMl0sbj1tWzRdLHI9bVs1XSxpPW1bNl07biYmdm9pZCAwPT09aSYmcWUoZSwibWlzc2luZyBleHBvbmVudCBwb3dlciIpLG4mJnZvaWQgMD09PXQmJnFlKGUsIm1pc3NpbmcgZXhwb25lbnQgYmFzZSIpLHZvaWQgMD09PW4mJihyfHxpKSYmcWUoZSwibWlzc2luZyBlIGJlZm9yZSBleHBvbmVudCIpfWlmKCIrIiE9PWVbeV0mJiItIiE9PWVbeV18fChyPSEwLG49Ii0iPT09ZVt5KytdKSwhV2UoZVt5XSkmJiIuIiE9PWVbeV0pe2lmKCJpIj09PWVbeV18fCJJIj09PWVbeV0pcmV0dXJuIG5ldyBIZShuP1ZlOlBlKTtpZigiTiI9PT1lW3ldKXJldHVybiBuZXcgSGUoTWUpfWZvcig7V2UoZVt5XSl8fCIuIj09PWVbeV07KSIuIiE9PWVbeV0/KF88MzQmJigiMCIhPT1lW3ldfHxvKSYmKG98fChmPWEpLG89ITAsdVtnKytdPXBhcnNlSW50KGVbeV0sMTApLF8rPTEpLG8mJihjKz0xKSxpJiYobCs9MSksYSs9MSx5Kz0xKTooaSYmcWUoZSwiY29udGFpbnMgbXVsdGlwbGUgcGVyaW9kcyIpLGk9ITAseSs9MSk7aWYoaSYmIWEpdGhyb3cgbmV3IFooZSsiIG5vdCBhIHZhbGlkIERlY2ltYWwxMjggc3RyaW5nIik7aWYoImUiPT09ZVt5XXx8IkUiPT09ZVt5XSl7Y29uc3QgdD1lLnN1YnN0cigrK3kpLm1hdGNoKEplKTtpZighdHx8IXRbMl0pcmV0dXJuIG5ldyBIZShNZSk7Yj1wYXJzZUludCh0WzBdLDEwKSx5Kz10WzBdLmxlbmd0aH1pZihlW3ldKXJldHVybiBuZXcgSGUoTWUpO2lmKF8pe2lmKGg9Xy0xLHM9YywxIT09cylmb3IoOyIwIj09PWVbZitzLTErTnVtYmVyKHIpK051bWJlcihpKV07KXMtPTF9ZWxzZSB1WzBdPTAsYz0xLF89MSxzPTA7Zm9yKGI8PWwmJmw+YisxNjM4ND9iPUNlOmItPWw7Yj5EZTspe2lmKGgrPTEsaD49MzQpe2lmKDA9PT1zKXtiPURlO2JyZWFrfXFlKGUsIm92ZXJmbG93Iil9Yi09MX1pZih0LmFsbG93Um91bmRpbmcpe2Zvcig7YjxDZXx8XzxjOyl7aWYoMD09PWgmJnM8Xyl7Yj1DZSxzPTA7YnJlYWt9aWYoXzxjP2MtPTE6aC09MSxiPERlKWIrPTE7ZWxzZXtpZih1LmpvaW4oIiIpLm1hdGNoKC9eMCskLykpe2I9RGU7YnJlYWt9cWUoZSwib3ZlcmZsb3ciKX19aWYoaCsxPHMpe2xldCB0PWE7aSYmKGYrPTEsdCs9MSksciYmKGYrPTEsdCs9MSk7Y29uc3Qgbz1wYXJzZUludChlW2YraCsxXSwxMCk7bGV0IHM9MDtpZihvPj01JiYocz0xLDU9PT1vKSl7cz11W2hdJTI9PTE/MTowO2ZvcihsZXQgbj1mK2grMjtuPHQ7bisrKWlmKHBhcnNlSW50KGVbbl0sMTApKXtzPTE7YnJlYWt9fWlmKHMpe2xldCBlPWg7Zm9yKDtlPj0wJiYrK3VbZV0+OTtlLS0paWYodVtlXT0wLDA9PT1lKXtpZighKGI8RGUpKXJldHVybiBuZXcgSGUobj9WZTpQZSk7Yis9MSx1W2VdPTF9fX19ZWxzZXtmb3IoO2I8Q2V8fF88Yzspe2lmKDA9PT1oKXtpZigwPT09cyl7Yj1DZTticmVha31xZShlLCJleHBvbmVudCB1bmRlcmZsb3ciKX1fPGM/KCIwIiE9PWVbYy0xK051bWJlcihyKStOdW1iZXIoaSldJiYwIT09cyYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGMtPTEpOigwIT09dVtoXSYmcWUoZSwiaW5leGFjdCByb3VuZGluZyIpLGgtPTEpLGI8RGU/Yis9MTpxZShlLCJvdmVyZmxvdyIpfWlmKGgrMTxzKXtpJiYoZis9MSksciYmKGYrPTEpOzAhPT1wYXJzZUludChlW2YraCsxXSwxMCkmJnFlKGUsImluZXhhY3Qgcm91bmRpbmciKX19aWYoZD1qZS5mcm9tTnVtYmVyKDApLHc9amUuZnJvbU51bWJlcigwKSwwPT09cylkPWplLmZyb21OdW1iZXIoMCksdz1qZS5mcm9tTnVtYmVyKDApO2Vsc2UgaWYoaDwxNyl7bGV0IGU9MDtmb3Iodz1qZS5mcm9tTnVtYmVyKHVbZSsrXSksZD1uZXcgamUoMCwwKTtlPD1oO2UrKyl3PXcubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLHc9dy5hZGQoamUuZnJvbU51bWJlcih1W2VdKSl9ZWxzZXtsZXQgZT0wO2ZvcihkPWplLmZyb21OdW1iZXIodVtlKytdKTtlPD1oLTE3O2UrKylkPWQubXVsdGlwbHkoamUuZnJvbU51bWJlcigxMCkpLGQ9ZC5hZGQoamUuZnJvbU51bWJlcih1W2VdKSk7Zm9yKHc9amUuZnJvbU51bWJlcih1W2UrK10pO2U8PWg7ZSsrKXc9dy5tdWx0aXBseShqZS5mcm9tTnVtYmVyKDEwKSksdz13LmFkZChqZS5mcm9tTnVtYmVyKHVbZV0pKX1jb25zdCB4PWZ1bmN0aW9uKGUsdCl7aWYoIWUmJiF0KXJldHVybntoaWdoOmplLmZyb21OdW1iZXIoMCksbG93OmplLmZyb21OdW1iZXIoMCl9O2NvbnN0IG49ZS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLHI9bmV3IGplKGUuZ2V0TG93Qml0cygpLDApLGk9dC5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpLG89bmV3IGplKHQuZ2V0TG93Qml0cygpLDApO2xldCBzPW4ubXVsdGlwbHkoaSksYT1uLm11bHRpcGx5KG8pO2NvbnN0IGM9ci5tdWx0aXBseShpKTtsZXQgbD1yLm11bHRpcGx5KG8pO3JldHVybiBzPXMuYWRkKGEuc2hpZnRSaWdodFVuc2lnbmVkKDMyKSksYT1uZXcgamUoYS5nZXRMb3dCaXRzKCksMCkuYWRkKGMpLmFkZChsLnNoaWZ0UmlnaHRVbnNpZ25lZCgzMikpLHM9cy5hZGQoYS5zaGlmdFJpZ2h0VW5zaWduZWQoMzIpKSxsPWEuc2hpZnRMZWZ0KDMyKS5hZGQobmV3IGplKGwuZ2V0TG93Qml0cygpLDApKSx7aGlnaDpzLGxvdzpsfX0oZCxqZS5mcm9tU3RyaW5nKCIxMDAwMDAwMDAwMDAwMDAwMDAiKSk7eC5sb3c9eC5sb3cuYWRkKHcpLGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1lLmhpZ2g+Pj4wLHI9dC5oaWdoPj4+MDtpZihuPHIpcmV0dXJuITA7aWYobj09PXImJmUubG93Pj4+MDx0Lmxvdz4+PjApcmV0dXJuITA7cmV0dXJuITF9KHgubG93LHcpJiYoeC5oaWdoPXguaGlnaC5hZGQoamUuZnJvbU51bWJlcigxKSkpLHA9Yis2MTc2O2NvbnN0IEU9e2xvdzpqZS5mcm9tTnVtYmVyKDApLGhpZ2g6amUuZnJvbU51bWJlcigwKX07eC5oaWdoLnNoaWZ0UmlnaHRVbnNpZ25lZCg0OSkuYW5kKGplLmZyb21OdW1iZXIoMSkpLmVxdWFscyhqZS5mcm9tTnVtYmVyKDEpKT8oRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDMpLnNoaWZ0TGVmdCg2MSkpLEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbU51bWJlcihwKS5hbmQoamUuZnJvbU51bWJlcigxNjM4Mykuc2hpZnRMZWZ0KDQ3KSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDB4N2ZmZmZmZmZmZmZmKSkpKTooRS5oaWdoPUUuaGlnaC5vcihqZS5mcm9tTnVtYmVyKDE2MzgzJnApLnNoaWZ0TGVmdCg0OSkpLEUuaGlnaD1FLmhpZ2gub3IoeC5oaWdoLmFuZChqZS5mcm9tTnVtYmVyKDU2Mjk0OTk1MzQyMTMxMSkpKSksRS5sb3c9eC5sb3csbiYmKEUuaGlnaD1FLmhpZ2gub3IoamUuZnJvbVN0cmluZygiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKSk7Y29uc3QgVT1fZS5hbGxvY2F0ZVVuc2FmZSgxNik7cmV0dXJuIHk9MCxVW3krK109MjU1JkUubG93LmxvdyxVW3krK109RS5sb3cubG93Pj44JjI1NSxVW3krK109RS5sb3cubG93Pj4xNiYyNTUsVVt5KytdPUUubG93Lmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5sb3cuaGlnaCxVW3krK109RS5sb3cuaGlnaD4+OCYyNTUsVVt5KytdPUUubG93LmhpZ2g+PjE2JjI1NSxVW3krK109RS5sb3cuaGlnaD4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmxvdyxVW3krK109RS5oaWdoLmxvdz4+OCYyNTUsVVt5KytdPUUuaGlnaC5sb3c+PjE2JjI1NSxVW3krK109RS5oaWdoLmxvdz4+MjQmMjU1LFVbeSsrXT0yNTUmRS5oaWdoLmhpZ2gsVVt5KytdPUUuaGlnaC5oaWdoPj44JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjE2JjI1NSxVW3krK109RS5oaWdoLmhpZ2g+PjI0JjI1NSxuZXcgSGUoVSl9dG9TdHJpbmcoKXtsZXQgZSx0PTA7Y29uc3Qgbj1uZXcgQXJyYXkoMzYpO2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSsrKW5bZV09MDtsZXQgcixpLG8scz0wLGE9ITEsYz17cGFydHM6WzAsMCwwLDBdfTtjb25zdCBsPVtdO3M9MDtjb25zdCBmPXRoaXMuYnl0ZXMsdT1mW3MrK118ZltzKytdPDw4fGZbcysrXTw8MTZ8ZltzKytdPDwyNCxfPWZbcysrXXxmW3MrK108PDh8ZltzKytdPDwxNnxmW3MrK108PDI0LGc9ZltzKytdfGZbcysrXTw8OHxmW3MrK108PDE2fGZbcysrXTw8MjQsaD1mW3MrK118ZltzKytdPDw4fGZbcysrXTw8MTZ8ZltzKytdPDwyNDtzPTA7KHtsb3c6bmV3IGplKHUsXyksaGlnaDpuZXcgamUoZyxoKX0pLmhpZ2gubGVzc1RoYW4oamUuWkVSTykmJmwucHVzaCgiLSIpO2NvbnN0IGI9aD4+MjYmMzE7aWYoYj4+Mz09Myl7aWYoMzA9PT1iKXJldHVybiBsLmpvaW4oIiIpKyJJbmZpbml0eSI7aWYoMzE9PT1iKXJldHVybiJOYU4iO2U9aD4+MTUmMTYzODMscj04KyhoPj4xNCYxKX1lbHNlIHI9aD4+MTQmNyxlPWg+PjE3JjE2MzgzO2NvbnN0IGQ9ZS02MTc2O2lmKGMucGFydHNbMF09KDE2MzgzJmgpKygoMTUmcik8PDE0KSxjLnBhcnRzWzFdPWcsYy5wYXJ0c1syXT1fLGMucGFydHNbM109dSwwPT09Yy5wYXJ0c1swXSYmMD09PWMucGFydHNbMV0mJjA9PT1jLnBhcnRzWzJdJiYwPT09Yy5wYXJ0c1szXSlhPSEwO2Vsc2UgZm9yKG89MztvPj0wO28tLSl7bGV0IGU9MDtjb25zdCB0PVllKGMpO2lmKGM9dC5xdW90aWVudCxlPXQucmVtLmxvdyxlKWZvcihpPTg7aT49MDtpLS0pbls5Km8raV09ZSUxMCxlPU1hdGguZmxvb3IoZS8xMCl9aWYoYSl0PTEsbltzXT0wO2Vsc2UgZm9yKHQ9MzY7IW5bc107KXQtPTEscys9MTtjb25zdCB3PXQtMStkO2lmKHc+PTM0fHx3PD0tN3x8ZD4wKXtpZih0PjM0KXJldHVybiBsLnB1c2goIjAiKSxkPjA/bC5wdXNoKGBFKyR7ZH1gKTpkPDAmJmwucHVzaChgRSR7ZH1gKSxsLmpvaW4oIiIpO2wucHVzaChgJHtuW3MrK119YCksdC09MSx0JiZsLnB1c2goIi4iKTtmb3IobGV0IGU9MDtlPHQ7ZSsrKWwucHVzaChgJHtuW3MrK119YCk7bC5wdXNoKCJFIiksdz4wP2wucHVzaChgKyR7d31gKTpsLnB1c2goYCR7d31gKX1lbHNlIGlmKGQ+PTApZm9yKGxldCBlPTA7ZTx0O2UrKylsLnB1c2goYCR7bltzKytdfWApO2Vsc2V7bGV0IGU9dCtkO2lmKGU+MClmb3IobGV0IHQ9MDt0PGU7dCsrKWwucHVzaChgJHtuW3MrK119YCk7ZWxzZSBsLnB1c2goIjAiKTtmb3IobC5wdXNoKCIuIik7ZSsrPDA7KWwucHVzaCgiMCIpO2ZvcihsZXQgcj0wO3I8dC1NYXRoLm1heChlLTEsMCk7cisrKWwucHVzaChgJHtuW3MrK119YCl9cmV0dXJuIGwuam9pbigiIil9dG9KU09OKCl7cmV0dXJueyRudW1iZXJEZWNpbWFsOnRoaXMudG9TdHJpbmcoKX19dG9FeHRlbmRlZEpTT04oKXtyZXR1cm57JG51bWJlckRlY2ltYWw6dGhpcy50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlKXtyZXR1cm4gSGUuZnJvbVN0cmluZyhlLiRudW1iZXJEZWNpbWFsKX1pbnNwZWN0KGUsdCxuKXtuPz89dztyZXR1cm5gbmV3IERlY2ltYWwxMjgoJHtuKHRoaXMudG9TdHJpbmcoKSx0KX0pYH19Y2xhc3MgS2UgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkRvdWJsZSJ9dmFsdWU7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSxlIGluc3RhbmNlb2YgTnVtYmVyJiYoZT1lLnZhbHVlT2YoKSksdGhpcy52YWx1ZT0rZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU51bWJlcihlKTtpZigiTmFOIj09PWUpcmV0dXJuIG5ldyBLZShOYU4pO2lmKCJJbmZpbml0eSI9PT1lKXJldHVybiBuZXcgS2UoMS8wKTtpZigiLUluZmluaXR5Ij09PWUpcmV0dXJuIG5ldyBLZSgtMS8wKTtpZighTnVtYmVyLmlzRmluaXRlKHQpKXRocm93IG5ldyBaKGBJbnB1dDogJHtlfSBpcyBub3QgcmVwcmVzZW50YWJsZSBhcyBhIERvdWJsZWApO2lmKGUudHJpbSgpIT09ZSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBjb250YWlucyB3aGl0ZXNwYWNlYCk7aWYoIiI9PT1lKXRocm93IG5ldyBaKCJJbnB1dCBpcyBhbiBlbXB0eSBzdHJpbmciKTtpZigvW14tMC05LitlRV0vLnRlc3QoZSkpdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgbm90IGluIGRlY2ltYWwgb3IgZXhwb25lbnRpYWwgbm90YXRpb25gKTtyZXR1cm4gbmV3IEtlKHQpfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b0pTT04oKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZyhlKXtyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZyhlKX10b0V4dGVuZGVkSlNPTihlKXtyZXR1cm4gZSYmKGUubGVnYWN5fHxlLnJlbGF4ZWQmJmlzRmluaXRlKHRoaXMudmFsdWUpKT90aGlzLnZhbHVlOk9iamVjdC5pcyhNYXRoLnNpZ24odGhpcy52YWx1ZSksLTApP3skbnVtYmVyRG91YmxlOiItMC4wIn06eyRudW1iZXJEb3VibGU6TnVtYmVyLmlzSW50ZWdlcih0aGlzLnZhbHVlKT90aGlzLnZhbHVlLnRvRml4ZWQoMSk6dGhpcy52YWx1ZS50b1N0cmluZygpfX1zdGF0aWMgZnJvbUV4dGVuZGVkSlNPTihlLHQpe2NvbnN0IG49cGFyc2VGbG9hdChlLiRudW1iZXJEb3VibGUpO3JldHVybiB0JiZ0LnJlbGF4ZWQ/bjpuZXcgS2Uobil9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgRG91YmxlKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBaZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iSW50MzIifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksZSBpbnN0YW5jZW9mIE51bWJlciYmKGU9ZS52YWx1ZU9mKCkpLHRoaXMudmFsdWU9MHwrZX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCB0PU5lKGUpLG49TnVtYmVyKGUpO2lmKG08bil0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSB2YWx1ZSBmb3IgSW50MzJgKTtpZihTPm4pdGhyb3cgbmV3IFooYElucHV0OiAnJHtlfScgaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBJbnQzMmApO2lmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSl0aHJvdyBuZXcgWihgSW5wdXQ6ICcke2V9JyBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtpZihuLnRvU3RyaW5nKCkhPT10KXRocm93IG5ldyBaKGBJbnB1dDogJyR7ZX0nIGlzIG5vdCBhIHZhbGlkIEludDMyIHN0cmluZ2ApO3JldHVybiBuZXcgWmUobil9dmFsdWVPZigpe3JldHVybiB0aGlzLnZhbHVlfXRvU3RyaW5nKGUpe3JldHVybiB0aGlzLnZhbHVlLnRvU3RyaW5nKGUpfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKGUpe3JldHVybiBlJiYoZS5yZWxheGVkfHxlLmxlZ2FjeSk/dGhpcy52YWx1ZTp7JG51bWJlckludDp0aGlzLnZhbHVlLnRvU3RyaW5nKCl9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUsdCl7cmV0dXJuIHQmJnQucmVsYXhlZD9wYXJzZUludChlLiRudW1iZXJJbnQsMTApOm5ldyBaZShlLiRudW1iZXJJbnQpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEludDMyKCR7bih0aGlzLnZhbHVlLHQpfSlgfX1jbGFzcyBHZSBleHRlbmRzIGhle2dldCBfYnNvbnR5cGUoKXtyZXR1cm4iTWF4S2V5In10b0V4dGVuZGVkSlNPTigpe3JldHVybnskbWF4S2V5OjF9fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKCl7cmV0dXJuIG5ldyBHZX1pbnNwZWN0KCl7cmV0dXJuIm5ldyBNYXhLZXkoKSJ9fWNsYXNzIFhlIGV4dGVuZHMgaGV7Z2V0IF9ic29udHlwZSgpe3JldHVybiJNaW5LZXkifXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRtaW5LZXk6MX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oKXtyZXR1cm4gbmV3IFhlfWluc3BlY3QoKXtyZXR1cm4ibmV3IE1pbktleSgpIn19bGV0IFFlPW51bGw7Y29uc3QgZXQ9bmV3IFdlYWtNYXA7Y2xhc3MgdHQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIk9iamVjdElkIn1zdGF0aWMgaW5kZXg9TWF0aC5mbG9vcigxNjc3NzIxNSpNYXRoLnJhbmRvbSgpKTtzdGF0aWMgY2FjaGVIZXhTdHJpbmc7YnVmZmVyO2NvbnN0cnVjdG9yKGUpe2xldCB0O2lmKHN1cGVyKCksIm9iamVjdCI9PXR5cGVvZiBlJiZlJiYiaWQiaW4gZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLmlkJiYhQXJyYXlCdWZmZXIuaXNWaWV3KGUuaWQpKXRocm93IG5ldyBaKCJBcmd1bWVudCBwYXNzZWQgaW4gbXVzdCBoYXZlIGFuIGlkIHRoYXQgaXMgb2YgdHlwZSBzdHJpbmcgb3IgQnVmZmVyIik7dD0idG9IZXhTdHJpbmciaW4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmc/X2UuZnJvbUhleChlLnRvSGV4U3RyaW5nKCkpOmUuaWR9ZWxzZSB0PWU7aWYobnVsbD09dCl0aGlzLmJ1ZmZlcj10dC5nZW5lcmF0ZSgpO2Vsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYxMj09PXQuYnl0ZUxlbmd0aCl0aGlzLmJ1ZmZlcj1fZS50b0xvY2FsQnVmZmVyVHlwZSh0KTtlbHNle2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQXJndW1lbnQgcGFzc2VkIGluIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NlcHRlZCB0eXBlcyIpO2lmKCF0dC52YWxpZGF0ZUhleFN0cmluZyh0KSl0aHJvdyBuZXcgWigiaW5wdXQgbXVzdCBiZSBhIDI0IGNoYXJhY3RlciBoZXggc3RyaW5nLCAxMiBieXRlIFVpbnQ4QXJyYXksIG9yIGFuIGludGVnZXIiKTt0aGlzLmJ1ZmZlcj1fZS5mcm9tSGV4KHQpLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyx0KX19Z2V0IGlkKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNldCBpZChlKXt0aGlzLmJ1ZmZlcj1lLHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxfZS50b0hleChlKSl9c3RhdGljIHZhbGlkYXRlSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgdD0wO3Q8MjQ7dCsrKXtjb25zdCBuPWUuY2hhckNvZGVBdCh0KTtpZighKG4+PTQ4JiZuPD01N3x8bj49OTcmJm48PTEwMnx8bj49NjUmJm48PTcwKSlyZXR1cm4hMX1yZXR1cm4hMH10b0hleFN0cmluZygpe2lmKHR0LmNhY2hlSGV4U3RyaW5nKXtjb25zdCBlPWV0LmdldCh0aGlzKTtpZihlKXJldHVybiBlfWNvbnN0IGU9X2UudG9IZXgodGhpcy5pZCk7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5zZXQodGhpcyxlKSxlfXN0YXRpYyBnZXRJbmMoKXtyZXR1cm4gdHQuaW5kZXg9KHR0LmluZGV4KzEpJTE2Nzc3MjE1fXN0YXRpYyBnZW5lcmF0ZShlKXsibnVtYmVyIiE9dHlwZW9mIGUmJihlPU1hdGguZmxvb3IoRGF0ZS5ub3coKS8xZTMpKTtjb25zdCB0PXR0LmdldEluYygpLG49X2UuYWxsb2NhdGVVbnNhZmUoMTIpO3JldHVybiBwZS5zZXRJbnQzMkJFKG4sMCxlKSxudWxsPT09UWUmJihRZT1fZS5yYW5kb21CeXRlcyg1KSksbls0XT1RZVswXSxuWzVdPVFlWzFdLG5bNl09UWVbMl0sbls3XT1RZVszXSxuWzhdPVFlWzRdLG5bMTFdPTI1NSZ0LG5bMTBdPXQ+PjgmMjU1LG5bOV09dD4+MTYmMjU1LG59dG9TdHJpbmcoZSl7cmV0dXJuImJhc2U2NCI9PT1lP19lLnRvQmFzZTY0KHRoaXMuaWQpOnRoaXMudG9IZXhTdHJpbmcoKX10b0pTT04oKXtyZXR1cm4gdGhpcy50b0hleFN0cmluZygpfXN0YXRpYyBpcyhlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJPYmplY3RJZCI9PT1lLl9ic29udHlwZX1lcXVhbHMoZSl7aWYobnVsbD09ZSlyZXR1cm4hMTtpZih0dC5pcyhlKSlyZXR1cm4gdGhpcy5idWZmZXJbMTFdPT09ZS5idWZmZXJbMTFdJiZfZS5lcXVhbHModGhpcy5idWZmZXIsZS5idWZmZXIpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZS50b0xvd2VyQ2FzZSgpPT09dGhpcy50b0hleFN0cmluZygpO2lmKCJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9IZXhTdHJpbmcpe2NvbnN0IHQ9ZS50b0hleFN0cmluZygpLG49dGhpcy50b0hleFN0cmluZygpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmdC50b0xvd2VyQ2FzZSgpPT09bn1yZXR1cm4hMX1nZXRUaW1lc3RhbXAoKXtjb25zdCBlPW5ldyBEYXRlLHQ9cGUuZ2V0VWludDMyQkUodGhpcy5idWZmZXIsMCk7cmV0dXJuIGUuc2V0VGltZSgxZTMqTWF0aC5mbG9vcih0KSksZX1zdGF0aWMgY3JlYXRlUGsoKXtyZXR1cm4gbmV3IHR0fXNlcmlhbGl6ZUludG8oZSx0KXtyZXR1cm4gZVt0XT10aGlzLmJ1ZmZlclswXSxlW3QrMV09dGhpcy5idWZmZXJbMV0sZVt0KzJdPXRoaXMuYnVmZmVyWzJdLGVbdCszXT10aGlzLmJ1ZmZlclszXSxlW3QrNF09dGhpcy5idWZmZXJbNF0sZVt0KzVdPXRoaXMuYnVmZmVyWzVdLGVbdCs2XT10aGlzLmJ1ZmZlcls2XSxlW3QrN109dGhpcy5idWZmZXJbN10sZVt0KzhdPXRoaXMuYnVmZmVyWzhdLGVbdCs5XT10aGlzLmJ1ZmZlcls5XSxlW3QrMTBdPXRoaXMuYnVmZmVyWzEwXSxlW3QrMTFdPXRoaXMuYnVmZmVyWzExXSwxMn1zdGF0aWMgY3JlYXRlRnJvbVRpbWUoZSl7Y29uc3QgdD1fZS5hbGxvY2F0ZSgxMik7Zm9yKGxldCBlPTExO2U+PTQ7ZS0tKXRbZV09MDtyZXR1cm4gcGUuc2V0SW50MzJCRSh0LDAsZSksbmV3IHR0KHQpfXN0YXRpYyBjcmVhdGVGcm9tSGV4U3RyaW5nKGUpe2lmKDI0IT09ZT8ubGVuZ3RoKXRocm93IG5ldyBaKCJoZXggc3RyaW5nIG11c3QgYmUgMjQgY2hhcmFjdGVycyIpO3JldHVybiBuZXcgdHQoX2UuZnJvbUhleChlKSl9c3RhdGljIGNyZWF0ZUZyb21CYXNlNjQoZSl7aWYoMTYhPT1lPy5sZW5ndGgpdGhyb3cgbmV3IFooImJhc2U2NCBzdHJpbmcgbXVzdCBiZSAxNiBjaGFyYWN0ZXJzIik7cmV0dXJuIG5ldyB0dChfZS5mcm9tQmFzZTY0KGUpKX1zdGF0aWMgaXNWYWxpZChlKXtpZihudWxsPT1lKXJldHVybiExO2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gdHQudmFsaWRhdGVIZXhTdHJpbmcoZSk7dHJ5e3JldHVybiBuZXcgdHQoZSksITB9Y2F0Y2h7cmV0dXJuITF9fXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJuIHRoaXMudG9IZXhTdHJpbmc/eyRvaWQ6dGhpcy50b0hleFN0cmluZygpfTp7JG9pZDp0aGlzLnRvU3RyaW5nKCJoZXgiKX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyB0dChlLiRvaWQpfWlzQ2FjaGVkKCl7cmV0dXJuIHR0LmNhY2hlSGV4U3RyaW5nJiZldC5oYXModGhpcyl9aW5zcGVjdChlLHQsbil7cmV0dXJuIG4/Pz13LGBuZXcgT2JqZWN0SWQoJHtuKHRoaXMudG9IZXhTdHJpbmcoKSx0KX0pYH19ZnVuY3Rpb24gbnQoZSx0LG4pe2xldCByPTU7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKylyKz1ydChpLnRvU3RyaW5nKCksZVtpXSx0LCEwLG4pO2Vsc2V7ImZ1bmN0aW9uIj09dHlwZW9mIGU/LnRvQlNPTiYmKGU9ZS50b0JTT04oKSk7Zm9yKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoZSkpcis9cnQoaSxlW2ldLHQsITEsbil9cmV0dXJuIHJ9ZnVuY3Rpb24gcnQoZSx0LG49ITEscj0hMSxpPSExKXtzd2l0Y2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/LnRvQlNPTiYmKHQ9dC50b0JTT04oKSksdHlwZW9mIHQpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gMStfZS51dGY4Qnl0ZUxlbmd0aChlKSsxKzQrX2UudXRmOEJ5dGVMZW5ndGgodCkrMTtjYXNlIm51bWJlciI6cmV0dXJuIE1hdGguZmxvb3IodCk9PT10JiZ0Pj1VJiZ0PD1FJiZ0Pj1TJiZ0PD1tPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiByfHwhaT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE6MDtjYXNlImJvb2xlYW4iOnJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMjtjYXNlIm9iamVjdCI6aWYobnVsbCE9dCYmInN0cmluZyI9PXR5cGVvZiB0Ll9ic29udHlwZSYmdFt5XSE9PXApdGhyb3cgbmV3IEc7aWYobnVsbD09dHx8Ik1pbktleSI9PT10Ll9ic29udHlwZXx8Ik1heEtleSI9PT10Ll9ic29udHlwZSlyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzE7aWYoIk9iamVjdElkIj09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTM7aWYodCBpbnN0YW5jZW9mIERhdGV8fGQodCkpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxnKHQpKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrNit0LmJ5dGVMZW5ndGg7aWYoIkxvbmciPT09dC5fYnNvbnR5cGV8fCJEb3VibGUiPT09dC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKSs5O2lmKCJEZWNpbWFsMTI4Ij09PXQuX2Jzb250eXBlKXJldHVybihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMTc7aWYoIkNvZGUiPT09dC5fYnNvbnR5cGUpcmV0dXJuIG51bGwhPXQuc2NvcGUmJk9iamVjdC5rZXlzKHQuc2NvcGUpLmxlbmd0aD4wPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0KzQrX2UudXRmOEJ5dGVMZW5ndGgodC5jb2RlLnRvU3RyaW5nKCkpKzErbnQodC5zY29wZSxuLGkpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQuY29kZS50b1N0cmluZygpKSsxO2lmKCJCaW5hcnkiPT09dC5fYnNvbnR5cGUpe2NvbnN0IG49dDtyZXR1cm4gbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKyhuLnBvc2l0aW9uKzErNCsxKzQpOihudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrKG4ucG9zaXRpb24rMSs0KzEpfWlmKCJTeW1ib2wiPT09dC5fYnNvbnR5cGUpcmV0dXJuKG51bGwhPWU/X2UudXRmOEJ5dGVMZW5ndGgoZSkrMTowKStfZS51dGY4Qnl0ZUxlbmd0aCh0LnZhbHVlKSs0KzErMTtpZigiREJSZWYiPT09dC5fYnNvbnR5cGUpe2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7JHJlZjp0LmNvbGxlY3Rpb24sJGlkOnQub2lkfSx0LmZpZWxkcyk7cmV0dXJuIG51bGwhPXQuZGImJihyLiRkYj10LmRiKSwobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErbnQocixuLGkpfXJldHVybiB0IGluc3RhbmNlb2YgUmVnRXhwfHxoKHQpPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMStfZS51dGY4Qnl0ZUxlbmd0aCh0LnNvdXJjZSkrMSsodC5nbG9iYWw/MTowKSsodC5pZ25vcmVDYXNlPzE6MCkrKHQubXVsdGlsaW5lPzE6MCkrMToiQlNPTlJlZ0V4cCI9PT10Ll9ic29udHlwZT8obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzErX2UudXRmOEJ5dGVMZW5ndGgodC5wYXR0ZXJuKSsxK19lLnV0ZjhCeXRlTGVuZ3RoKHQub3B0aW9ucykrMToobnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApK250KHQsbixpKSsxO2Nhc2UiZnVuY3Rpb24iOnJldHVybiBuPyhudWxsIT1lP19lLnV0ZjhCeXRlTGVuZ3RoKGUpKzE6MCkrMSs0K19lLnV0ZjhCeXRlTGVuZ3RoKHQudG9TdHJpbmcoKSkrMTowO2Nhc2UiYmlnaW50IjpyZXR1cm4obnVsbCE9ZT9fZS51dGY4Qnl0ZUxlbmd0aChlKSsxOjApKzk7Y2FzZSJzeW1ib2wiOnJldHVybiAwO2RlZmF1bHQ6dGhyb3cgbmV3IFooIlVucmVjb2duaXplZCBKUyB0eXBlOiAiK3R5cGVvZiB0KX19Y2xhc3MgaXQgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05SZWdFeHAifXBhdHRlcm47b3B0aW9ucztjb25zdHJ1Y3RvcihlLHQpe2lmKHN1cGVyKCksdGhpcy5wYXR0ZXJuPWUsdGhpcy5vcHRpb25zPSh0Pz8iIikuc3BsaXQoIiIpLnNvcnQoKS5qb2luKCIiKSwtMSE9PXRoaXMucGF0dGVybi5pbmRleE9mKCJcMCIpKXRocm93IG5ldyBaKGBCU09OIFJlZ2V4IHBhdHRlcm5zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMucGF0dGVybil9YCk7aWYoLTEhPT10aGlzLm9wdGlvbnMuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBSZWdleCBvcHRpb25zIGNhbm5vdCBjb250YWluIG51bGwgYnl0ZXMsIGZvdW5kOiAke0pTT04uc3RyaW5naWZ5KHRoaXMub3B0aW9ucyl9YCk7Zm9yKGxldCBlPTA7ZTx0aGlzLm9wdGlvbnMubGVuZ3RoO2UrKylpZigiaSIhPT10aGlzLm9wdGlvbnNbZV0mJiJtIiE9PXRoaXMub3B0aW9uc1tlXSYmIngiIT09dGhpcy5vcHRpb25zW2VdJiYibCIhPT10aGlzLm9wdGlvbnNbZV0mJiJzIiE9PXRoaXMub3B0aW9uc1tlXSYmInUiIT09dGhpcy5vcHRpb25zW2VdKXRocm93IG5ldyBaKGBUaGUgcmVndWxhciBleHByZXNzaW9uIG9wdGlvbiBbJHt0aGlzLm9wdGlvbnNbZV19XSBpcyBub3Qgc3VwcG9ydGVkYCl9c3RhdGljIHBhcnNlT3B0aW9ucyhlKXtyZXR1cm4gZT9lLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik6IiJ9dG9FeHRlbmRlZEpTT04oZSl7cmV0dXJuKGU9ZXx8e30pLmxlZ2FjeT97JHJlZ2V4OnRoaXMucGF0dGVybiwkb3B0aW9uczp0aGlzLm9wdGlvbnN9OnskcmVndWxhckV4cHJlc3Npb246e3BhdHRlcm46dGhpcy5wYXR0ZXJuLG9wdGlvbnM6dGhpcy5vcHRpb25zfX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7aWYoIiRyZWdleCJpbiBlKXtpZigic3RyaW5nIj09dHlwZW9mIGUuJHJlZ2V4KXJldHVybiBuZXcgaXQoZS4kcmVnZXgsaXQucGFyc2VPcHRpb25zKGUuJG9wdGlvbnMpKTtpZigiQlNPTlJlZ0V4cCI9PT1lLiRyZWdleC5fYnNvbnR5cGUpcmV0dXJuIGV9aWYoIiRyZWd1bGFyRXhwcmVzc2lvbiJpbiBlKXJldHVybiBuZXcgaXQoZS4kcmVndWxhckV4cHJlc3Npb24ucGF0dGVybixpdC5wYXJzZU9wdGlvbnMoZS4kcmVndWxhckV4cHJlc3Npb24ub3B0aW9ucykpO3Rocm93IG5ldyBaKGBVbmV4cGVjdGVkIEJTT05SZWdFeHAgRUpTT04gb2JqZWN0IGZvcm06ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCl9aW5zcGVjdChlLHQsbil7Y29uc3Qgcj1mdW5jdGlvbihlKXtpZihudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiJzdHlsaXplImluIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN0eWxpemUpcmV0dXJuIGUuc3R5bGl6ZX0odCk/PyhlPT5lKTtuPz89dztyZXR1cm5gbmV3IEJTT05SZWdFeHAoJHtyKG4odGhpcy5wYXR0ZXJuKSwicmVnZXhwIil9LCAke3Iobih0aGlzLm9wdGlvbnMpLCJyZWdleHAiKX0pYH19Y2xhc3Mgb3QgZXh0ZW5kcyBoZXtnZXQgX2Jzb250eXBlKCl7cmV0dXJuIkJTT05TeW1ib2wifXZhbHVlO2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy52YWx1ZT1lfXZhbHVlT2YoKXtyZXR1cm4gdGhpcy52YWx1ZX10b1N0cmluZygpe3JldHVybiB0aGlzLnZhbHVlfXRvSlNPTigpe3JldHVybiB0aGlzLnZhbHVlfXRvRXh0ZW5kZWRKU09OKCl7cmV0dXJueyRzeW1ib2w6dGhpcy52YWx1ZX19c3RhdGljIGZyb21FeHRlbmRlZEpTT04oZSl7cmV0dXJuIG5ldyBvdChlLiRzeW1ib2wpfWluc3BlY3QoZSx0LG4pe3JldHVybiBuPz89dyxgbmV3IEJTT05TeW1ib2woJHtuKHRoaXMudmFsdWUsdCl9KWB9fWNvbnN0IHN0PWplO2NsYXNzIGF0IGV4dGVuZHMgc3R7Z2V0IF9ic29udHlwZSgpe3JldHVybiJUaW1lc3RhbXAifWdldFtnZV0oKXtyZXR1cm4iVGltZXN0YW1wIn1zdGF0aWMgTUFYX1ZBTFVFPWplLk1BWF9VTlNJR05FRF9WQUxVRTtnZXQgaSgpe3JldHVybiB0aGlzLmxvdz4+PjB9Z2V0IHQoKXtyZXR1cm4gdGhpcy5oaWdoPj4+MH1jb25zdHJ1Y3RvcihlKXtpZihudWxsPT1lKXN1cGVyKDAsMCwhMCk7ZWxzZSBpZigiYmlnaW50Ij09dHlwZW9mIGUpc3VwZXIoZSwhMCk7ZWxzZSBpZihqZS5pc0xvbmcoZSkpc3VwZXIoZS5sb3csZS5oaWdoLCEwKTtlbHNle2lmKCJvYmplY3QiIT10eXBlb2YgZXx8ISgidCJpbiBlKXx8ISgiaSJpbiBlKSl0aHJvdyBuZXcgWigiQSBUaW1lc3RhbXAgY2FuIG9ubHkgYmUgY29uc3RydWN0ZWQgd2l0aDogYmlnaW50LCBMb25nLCBvciB7IHQ6IG51bWJlcjsgaTogbnVtYmVyIH0iKTt7aWYoIm51bWJlciIhPXR5cGVvZiBlLnQmJigib2JqZWN0IiE9dHlwZW9mIGUudHx8IkludDMyIiE9PWUudC5fYnNvbnR5cGUpKXRocm93IG5ldyBaKCJUaW1lc3RhbXAgY29uc3RydWN0ZWQgZnJvbSB7IHQsIGkgfSBtdXN0IHByb3ZpZGUgdCBhcyBhIG51bWJlciIpO2lmKCJudW1iZXIiIT10eXBlb2YgZS5pJiYoIm9iamVjdCIhPXR5cGVvZiBlLml8fCJJbnQzMiIhPT1lLmkuX2Jzb250eXBlKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGkgYXMgYSBudW1iZXIiKTtjb25zdCB0PU51bWJlcihlLnQpLG49TnVtYmVyKGUuaSk7aWYodDwwfHxOdW1iZXIuaXNOYU4odCkpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBhIHBvc2l0aXZlIHQiKTtpZihuPDB8fE51bWJlci5pc05hTihuKSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIGEgcG9zaXRpdmUgaSIpO2lmKHQ+NDI5NDk2NzI5NSl0aHJvdyBuZXcgWigiVGltZXN0YW1wIGNvbnN0cnVjdGVkIGZyb20geyB0LCBpIH0gbXVzdCBwcm92aWRlIHQgZXF1YWwgb3IgbGVzcyB0aGFuIHVpbnQzMiBtYXgiKTtpZihuPjQyOTQ5NjcyOTUpdGhyb3cgbmV3IFooIlRpbWVzdGFtcCBjb25zdHJ1Y3RlZCBmcm9tIHsgdCwgaSB9IG11c3QgcHJvdmlkZSBpIGVxdWFsIG9yIGxlc3MgdGhhbiB1aW50MzIgbWF4Iik7c3VwZXIobix0LCEwKX19fXRvSlNPTigpe3JldHVybnskdGltZXN0YW1wOnRoaXMudG9TdHJpbmcoKX19c3RhdGljIGZyb21JbnQoZSl7cmV0dXJuIG5ldyBhdChqZS5mcm9tSW50KGUsITApKX1zdGF0aWMgZnJvbU51bWJlcihlKXtyZXR1cm4gbmV3IGF0KGplLmZyb21OdW1iZXIoZSwhMCkpfXN0YXRpYyBmcm9tQml0cyhlLHQpe3JldHVybiBuZXcgYXQoe2k6ZSx0OnR9KX1zdGF0aWMgZnJvbVN0cmluZyhlLHQpe3JldHVybiBuZXcgYXQoamUuZnJvbVN0cmluZyhlLCEwLHQpKX10b0V4dGVuZGVkSlNPTigpe3JldHVybnskdGltZXN0YW1wOnt0OnRoaXMudCxpOnRoaXMuaX19fXN0YXRpYyBmcm9tRXh0ZW5kZWRKU09OKGUpe2NvbnN0IHQ9amUuaXNMb25nKGUuJHRpbWVzdGFtcC5pKT9lLiR0aW1lc3RhbXAuaS5nZXRMb3dCaXRzVW5zaWduZWQoKTplLiR0aW1lc3RhbXAuaSxuPWplLmlzTG9uZyhlLiR0aW1lc3RhbXAudCk/ZS4kdGltZXN0YW1wLnQuZ2V0TG93Qml0c1Vuc2lnbmVkKCk6ZS4kdGltZXN0YW1wLnQ7cmV0dXJuIG5ldyBhdCh7dDpuLGk6dH0pfWluc3BlY3QoZSx0LG4pe24/Pz13O3JldHVybmBuZXcgVGltZXN0YW1wKHsgdDogJHtuKHRoaXMudCx0KX0sIGk6ICR7bih0aGlzLmksdCl9IH0pYH19Y29uc3QgY3Q9amUuZnJvbU51bWJlcihFKSxsdD1qZS5mcm9tTnVtYmVyKFUpO2Z1bmN0aW9uIGZ0KGUsdCxuKXtjb25zdCByPSh0PW51bGw9PXQ/e306dCkmJnQuaW5kZXg/dC5pbmRleDowLGk9cGUuZ2V0SW50MzJMRShlLHIpO2lmKGk8NSl0aHJvdyBuZXcgWihgYnNvbiBzaXplIG11c3QgYmUgPj0gNSwgaXMgJHtpfWApO2lmKHQuYWxsb3dPYmplY3RTbWFsbGVyVGhhbkJ1ZmZlclNpemUmJmUubGVuZ3RoPGkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCBiZSA+PSBic29uIHNpemUgJHtpfWApO2lmKCF0LmFsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplJiZlLmxlbmd0aCE9PWkpdGhyb3cgbmV3IFooYGJ1ZmZlciBsZW5ndGggJHtlLmxlbmd0aH0gbXVzdCA9PT0gYnNvbiBzaXplICR7aX1gKTtpZihpK3I+ZS5ieXRlTGVuZ3RoKXRocm93IG5ldyBaKGAoYnNvbiBzaXplICR7aX0gKyBvcHRpb25zLmluZGV4ICR7cn0gbXVzdCBiZSA8PSBidWZmZXIgbGVuZ3RoICR7ZS5ieXRlTGVuZ3RofSlgKTtpZigwIT09ZVtyK2ktMV0pdGhyb3cgbmV3IFooIk9uZSBvYmplY3QsIHNpemVkIGNvcnJlY3RseSwgd2l0aCBhIHNwb3QgZm9yIGFuIEVPTywgYnV0IHRoZSBFT08gaXNuJ3QgMHgwMCIpO3JldHVybiBfdChlLHIsdCxuKX1jb25zdCB1dD0vXlwkcmVmJHxeXCRpZCR8XlwkZGIkLztmdW5jdGlvbiBfdChlLHQsbixyPSExKXtjb25zdCBpPW51bGw9PW4uZmllbGRzQXNSYXc/bnVsbDpuLmZpZWxkc0FzUmF3LG89bnVsbCE9bi5yYXcmJm4ucmF3LHM9ImJvb2xlYW4iPT10eXBlb2Ygbi5ic29uUmVnRXhwJiZuLmJzb25SZWdFeHAsYT1uLnByb21vdGVCdWZmZXJzPz8hMSxjPW4ucHJvbW90ZUxvbmdzPz8hMCxsPW4ucHJvbW90ZVZhbHVlcz8/ITAsZj1uLnVzZUJpZ0ludDY0Pz8hMTtpZihmJiYhbCl0aHJvdyBuZXcgWigiTXVzdCBlaXRoZXIgcmVxdWVzdCBiaWdpbnQgb3IgTG9uZyBmb3IgaW50NjQgZGVzZXJpYWxpemF0aW9uIik7aWYoZiYmIWMpdGhyb3cgbmV3IFooIk11c3QgZWl0aGVyIHJlcXVlc3QgYmlnaW50IG9yIExvbmcgZm9yIGludDY0IGRlc2VyaWFsaXphdGlvbiIpO2xldCB1LF8sZz0hMDtjb25zdCBoPShudWxsPT1uLnZhbGlkYXRpb24/e3V0Zjg6ITB9Om4udmFsaWRhdGlvbikudXRmODtpZigiYm9vbGVhbiI9PXR5cGVvZiBoKXU9aDtlbHNle2c9ITE7Y29uc3QgZT1PYmplY3Qua2V5cyhoKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoW2VdfSkpO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgWigiVVRGLTggdmFsaWRhdGlvbiBzZXR0aW5nIGNhbm5vdCBiZSBlbXB0eSIpO2lmKCJib29sZWFuIiE9dHlwZW9mIGVbMF0pdGhyb3cgbmV3IFooIkludmFsaWQgVVRGLTggdmFsaWRhdGlvbiBvcHRpb24sIG11c3Qgc3BlY2lmeSBib29sZWFuIHZhbHVlcyIpO2lmKHU9ZVswXSwhZS5ldmVyeSgoZT0+ZT09PXUpKSl0aHJvdyBuZXcgWigiSW52YWxpZCBVVEYtOCB2YWxpZGF0aW9uIG9wdGlvbiAtIGtleXMgbXVzdCBiZSBhbGwgdHJ1ZSBvciBhbGwgZmFsc2UiKX1pZighZyl7Xz1uZXcgU2V0O2Zvcihjb25zdCBlIG9mIE9iamVjdC5rZXlzKGgpKV8uYWRkKGUpfWNvbnN0IGI9dDtpZihlLmxlbmd0aDw1KXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSA8IDUgYnl0ZXMgbG9uZyIpO2NvbnN0IGQ9cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsZDw1fHxkPmUubGVuZ3RoKXRocm93IG5ldyBaKCJjb3JydXB0IGJzb24gbWVzc2FnZSIpO2NvbnN0IHc9cj9bXTp7fTtsZXQgcD0wLHk9IXImJm51bGw7Zm9yKDs7KXtjb25zdCBoPWVbdCsrXTtpZigwPT09aClicmVhaztsZXQgYj10O2Zvcig7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmJ5dGVMZW5ndGgpdGhyb3cgbmV3IFooIkJhZCBCU09OIERvY3VtZW50OiBpbGxlZ2FsIENTdHJpbmciKTtjb25zdCBkPXI/cCsrOl9lLnRvVVRGOChlLHQsYiwhMSk7bGV0IG0sUz0hMDtpZihTPWd8fF8/LmhhcyhkKT91OiF1LCExIT09eSYmIiQiPT09ZFswXSYmKHk9dXQudGVzdChkKSksdD1iKzEsaD09PU4pe2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTttPV9lLnRvVVRGOChlLHQsdCtuLTEsUyksdCs9bn1lbHNlIGlmKGg9PT1MKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IHI9MDtyPDEyO3IrKyluW3JdPWVbdCtyXTttPW5ldyB0dChuKSx0Kz0xMn1lbHNlIGlmKGg9PT1NJiYhMT09PWwpbT1uZXcgWmUocGUuZ2V0SW50MzJMRShlLHQpKSx0Kz00O2Vsc2UgaWYoaD09PU0pbT1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NDtlbHNlIGlmKGg9PT1PKW09cGUuZ2V0RmxvYXQ2NExFKGUsdCksdCs9OCwhMT09PWwmJihtPW5ldyBLZShtKSk7ZWxzZSBpZihoPT09Uil7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCkscj1wZS5nZXRJbnQzMkxFKGUsdCs0KTt0Kz04LG09bmV3IERhdGUobmV3IGplKG4scikudG9OdW1iZXIoKSl9ZWxzZSBpZihoPT09QSl7aWYoMCE9PWVbdF0mJjEhPT1lW3RdKXRocm93IG5ldyBaKCJpbGxlZ2FsIGJvb2xlYW4gdHlwZSB2YWx1ZSIpO209MT09PWVbdCsrXX1lbHNlIGlmKGg9PT1JKXtjb25zdCByPXQsaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYoaTw9MHx8aT5lLmxlbmd0aC10KXRocm93IG5ldyBaKCJiYWQgZW1iZWRkZWQgZG9jdW1lbnQgbGVuZ3RoIGluIGJzb24iKTtpZihvKW09ZS5zdWJhcnJheSh0LHQraSk7ZWxzZXtsZXQgdD1uO2d8fCh0PXsuLi5uLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscix0LCExKX10Kz1pfWVsc2UgaWYoaD09PXYpe2NvbnN0IHI9dCxvPXBlLmdldEludDMyTEUoZSx0KTtsZXQgcz1uO2NvbnN0IGE9dCtvO2lmKGkmJmlbZF0mJihzPXsuLi5uLHJhdzohMH0pLGd8fChzPXsuLi5zLHZhbGlkYXRpb246e3V0Zjg6U319KSxtPV90KGUscixzLCEwKSwwIT09ZVsodCs9byktMV0pdGhyb3cgbmV3IFooImludmFsaWQgYXJyYXkgdGVybWluYXRvciBieXRlIik7aWYodCE9PWEpdGhyb3cgbmV3IFooImNvcnJ1cHRlZCBhcnJheSBic29uIil9ZWxzZSBpZihoPT09JCltPXZvaWQgMDtlbHNlIGlmKGg9PT1qKW09bnVsbDtlbHNlIGlmKGg9PT1QKWlmKGYpbT1wZS5nZXRCaWdJbnQ2NExFKGUsdCksdCs9ODtlbHNle2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpLHI9cGUuZ2V0SW50MzJMRShlLHQrNCk7dCs9ODtjb25zdCBpPW5ldyBqZShuLHIpO209YyYmITA9PT1sJiZpLmxlc3NUaGFuT3JFcXVhbChjdCkmJmkuZ3JlYXRlclRoYW5PckVxdWFsKGx0KT9pLnRvTnVtYmVyKCk6aX1lbHNlIGlmKGg9PT1KKXtjb25zdCBuPV9lLmFsbG9jYXRlVW5zYWZlKDE2KTtmb3IobGV0IHI9MDtyPDE2O3IrKyluW3JdPWVbdCtyXTt0Kz0xNixtPW5ldyBIZShuKX1lbHNlIGlmKGg9PT1UKXtsZXQgbj1wZS5nZXRJbnQzMkxFKGUsdCk7dCs9NDtjb25zdCByPW4saT1lW3QrK107aWYobjwwKXRocm93IG5ldyBaKCJOZWdhdGl2ZSBiaW5hcnkgdHlwZSBlbGVtZW50IHNpemUgZm91bmQiKTtpZihuPmUuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgWigiQmluYXJ5IHR5cGUgc2l6ZSBsYXJnZXIgdGhhbiBkb2N1bWVudCBzaXplIik7aWYoaT09PXllLlNVQlRZUEVfQllURV9BUlJBWSl7aWYobj1wZS5nZXRJbnQzMkxFKGUsdCksdCs9NCxuPDApdGhyb3cgbmV3IFooIk5lZ2F0aXZlIGJpbmFyeSB0eXBlIGVsZW1lbnQgc2l6ZSBmb3VuZCBmb3Igc3VidHlwZSAweDAyIik7aWYobj5yLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBsb25nIGJpbmFyeSBzaXplIik7aWYobjxyLTQpdGhyb3cgbmV3IFooIkJpbmFyeSB0eXBlIHdpdGggc3VidHlwZSAweDAyIGNvbnRhaW5zIHRvbyBzaG9ydCBiaW5hcnkgc2l6ZSIpfWEmJmw/bT1fZS50b0xvY2FsQnVmZmVyVHlwZShlLnN1YmFycmF5KHQsdCtuKSk6KG09bmV3IHllKGUuc3ViYXJyYXkodCx0K24pLGkpLGk9PT1IJiZ4ZS5pc1ZhbGlkKG0pJiYobT1tLnRvVVVJRCgpKSksdCs9bn1lbHNlIGlmKGg9PT1GJiYhMT09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxO2NvbnN0IGk9bmV3IEFycmF5KHIubGVuZ3RoKTtmb3IoYj0wO2I8ci5sZW5ndGg7YisrKXN3aXRjaChyW2JdKXtjYXNlIm0iOmlbYl09Im0iO2JyZWFrO2Nhc2UicyI6aVtiXT0iZyI7YnJlYWs7Y2FzZSJpIjppW2JdPSJpIn1tPW5ldyBSZWdFeHAobixpLmpvaW4oIiIpKX1lbHNlIGlmKGg9PT1GJiYhMD09PXMpe2ZvcihiPXQ7MCE9PWVbYl0mJmI8ZS5sZW5ndGg7KWIrKztpZihiPj1lLmxlbmd0aCl0aHJvdyBuZXcgWigiQmFkIEJTT04gRG9jdW1lbnQ6IGlsbGVnYWwgQ1N0cmluZyIpO2NvbnN0IG49X2UudG9VVEY4KGUsdCxiLCExKTtmb3IoYj10PWIrMTswIT09ZVtiXSYmYjxlLmxlbmd0aDspYisrO2lmKGI+PWUubGVuZ3RoKXRocm93IG5ldyBaKCJCYWQgQlNPTiBEb2N1bWVudDogaWxsZWdhbCBDU3RyaW5nIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LGIsITEpO3Q9YisxLG09bmV3IGl0KG4scil9ZWxzZSBpZihoPT09RCl7Y29uc3Qgbj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxuPD0wfHxuPmUubGVuZ3RoLXR8fDAhPT1lW3Qrbi0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IHI9X2UudG9VVEY4KGUsdCx0K24tMSxTKTttPWw/cjpuZXcgb3QociksdCs9bn1lbHNlIGlmKGg9PT1WKW09bmV3IGF0KHtpOnBlLmdldFVpbnQzMkxFKGUsdCksdDpwZS5nZXRVaW50MzJMRShlLHQrNCl9KSx0Kz04O2Vsc2UgaWYoaD09PVcpbT1uZXcgWGU7ZWxzZSBpZihoPT09WSltPW5ldyBHZTtlbHNlIGlmKGg9PT16KXtjb25zdCBuPXBlLmdldEludDMyTEUoZSx0KTtpZih0Kz00LG48PTB8fG4+ZS5sZW5ndGgtdHx8MCE9PWVbdCtuLTFdKXRocm93IG5ldyBaKCJiYWQgc3RyaW5nIGxlbmd0aCBpbiBic29uIik7Y29uc3Qgcj1fZS50b1VURjgoZSx0LHQrbi0xLFMpO209bmV3IEVlKHIpLHQrPW59ZWxzZSBpZihoPT09Qyl7Y29uc3Qgcj1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxyPDEzKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBzaG9ydGVyIG1pbmltdW0gZXhwZWN0ZWQgbGVuZ3RoIik7Y29uc3QgaT1wZS5nZXRJbnQzMkxFKGUsdCk7aWYodCs9NCxpPD0wfHxpPmUubGVuZ3RoLXR8fDAhPT1lW3QraS0xXSl0aHJvdyBuZXcgWigiYmFkIHN0cmluZyBsZW5ndGggaW4gYnNvbiIpO2NvbnN0IG89X2UudG9VVEY4KGUsdCx0K2ktMSxTKSxzPXQrPWksYT1wZS5nZXRJbnQzMkxFKGUsdCksYz1fdChlLHMsbiwhMSk7aWYodCs9YSxyPDgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gc2hvcnQsIHRydW5jYXRpbmcgc2NvcGUiKTtpZihyPjgrYStpKXRocm93IG5ldyBaKCJjb2RlX3dfc2NvcGUgdG90YWwgc2l6ZSBpcyB0b28gbG9uZywgY2xpcHMgb3V0ZXIgZG9jdW1lbnQiKTttPW5ldyBFZShvLGMpfWVsc2V7aWYoaCE9PWspdGhyb3cgbmV3IFooYERldGVjdGVkIHVua25vd24gQlNPTiB0eXBlICR7aC50b1N0cmluZygxNil9IGZvciBmaWVsZG5hbWUgIiR7ZH0iYCk7e2NvbnN0IG49cGUuZ2V0SW50MzJMRShlLHQpO2lmKHQrPTQsbjw9MHx8bj5lLmxlbmd0aC10fHwwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFooImJhZCBzdHJpbmcgbGVuZ3RoIGluIGJzb24iKTtjb25zdCByPV9lLnRvVVRGOChlLHQsdCtuLTEsUyk7dCs9bjtjb25zdCBpPV9lLmFsbG9jYXRlVW5zYWZlKDEyKTtmb3IobGV0IG49MDtuPDEyO24rKylpW25dPWVbdCtuXTtjb25zdCBvPW5ldyB0dChpKTt0Kz0xMixtPW5ldyBPZShyLG8pfX0iX19wcm90b19fIj09PWQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHcsZCx7dmFsdWU6bSx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOndbZF09bX1pZihkIT09dC1iKXtpZihyKXRocm93IG5ldyBaKCJjb3JydXB0IGFycmF5IGJzb24iKTt0aHJvdyBuZXcgWigiY29ycnVwdCBvYmplY3QgYnNvbiIpfWlmKCF5KXJldHVybiB3O2lmKFVlKHcpKXtjb25zdCBlPU9iamVjdC5hc3NpZ24oe30sdyk7cmV0dXJuIGRlbGV0ZSBlLiRyZWYsZGVsZXRlIGUuJGlkLGRlbGV0ZSBlLiRkYixuZXcgT2Uody4kcmVmLHcuJGlkLHcuJGRiLGUpfXJldHVybiB3fWNvbnN0IGd0PS9ceDAwLyxodD1uZXcgU2V0KFsiJGRiIiwiJHJlZiIsIiRpZCIsIiRjbHVzdGVyVGltZSJdKTtmdW5jdGlvbiBidChlLHQsbixyKXtlW3IrK109TjtlWyhyPXIrX2UuZW5jb2RlVVRGOEludG8oZSx0LHIpKzEpLTFdPTA7Y29uc3QgaT1fZS5lbmNvZGVVVEY4SW50byhlLG4scis0KTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSsxKSxyPXIrNCtpLGVbcisrXT0wLHJ9ZnVuY3Rpb24gZHQoZSx0LG4scil7Y29uc3QgaT0hT2JqZWN0LmlzKG4sLTApJiZOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmbjw9bSYmbj49Uz9NOk87ZVtyKytdPWk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1pPT09TT9wZS5zZXRJbnQzMkxFKGUscixuKTpwZS5zZXRGbG9hdDY0TEUoZSxyLG4pfWZ1bmN0aW9uIHd0KGUsdCxuLHIpe2VbcisrXT1QO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9cGUuc2V0QmlnSW50NjRMRShlLHIsbil9ZnVuY3Rpb24gcHQoZSx0LG4scil7ZVtyKytdPWo7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHl0KGUsdCxuLHIpe2VbcisrXT1BO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsZVtyKytdPW4/MTowLHJ9ZnVuY3Rpb24gbXQoZSx0LG4scil7ZVtyKytdPVI7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9amUuZnJvbU51bWJlcihuLmdldFRpbWUoKSksbz1pLmdldExvd0JpdHMoKSxzPWkuZ2V0SGlnaEJpdHMoKTtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbykscis9cGUuc2V0SW50MzJMRShlLHIscyl9ZnVuY3Rpb24gU3QoZSx0LG4scil7ZVtyKytdPUY7aWYocis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLG4uc291cmNlJiZudWxsIT1uLnNvdXJjZS5tYXRjaChndCkpdGhyb3cgbmV3IFooInZhbHVlICIrbi5zb3VyY2UrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSxuLnNvdXJjZSxyKSxlW3IrK109MCxuLmlnbm9yZUNhc2UmJihlW3IrK109MTA1KSxuLmdsb2JhbCYmKGVbcisrXT0xMTUpLG4ubXVsdGlsaW5lJiYoZVtyKytdPTEwOSksZVtyKytdPTAscn1mdW5jdGlvbiBCdChlLHQsbixyKXtlW3IrK109RjtpZihyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAsbnVsbCE9bi5wYXR0ZXJuLm1hdGNoKGd0KSl0aHJvdyBuZXcgWigicGF0dGVybiAiK24ucGF0dGVybisiIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcyIpO3IrPV9lLmVuY29kZVVURjhJbnRvKGUsbi5wYXR0ZXJuLHIpLGVbcisrXT0wO2NvbnN0IGk9bi5vcHRpb25zLnNwbGl0KCIiKS5zb3J0KCkuam9pbigiIik7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsaSxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe251bGw9PT1uP2VbcisrXT1qOiJNaW5LZXkiPT09bi5fYnNvbnR5cGU/ZVtyKytdPVc6ZVtyKytdPVk7cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyfWZ1bmN0aW9uIEV0KGUsdCxuLHIpe2VbcisrXT1MO3JldHVybiByKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTAscis9bi5zZXJpYWxpemVJbnRvKGUscil9ZnVuY3Rpb24gVXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5sZW5ndGg7aWYocis9cGUuc2V0SW50MzJMRShlLHIsaSksZVtyKytdPXEsaTw9MTYpZm9yKGxldCB0PTA7dDxpO3QrKyllW3IrdF09blt0XTtlbHNlIGUuc2V0KG4scik7cmV0dXJuIHIrPWl9ZnVuY3Rpb24gT3QoZSx0LG4scixpLG8scyxhLGMpe2lmKGMuaGFzKG4pKXRocm93IG5ldyBaKCJDYW5ub3QgY29udmVydCBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gQlNPTiIpO2MuYWRkKG4pLGVbcisrXT1BcnJheS5pc0FycmF5KG4pP3Y6STtyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7Y29uc3QgbD1GdChlLG4saSxyLG8rMSxzLGEsYyk7cmV0dXJuIGMuZGVsZXRlKG4pLGx9ZnVuY3Rpb24gTnQoZSx0LG4scil7ZVtyKytdPUo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2ZvcihsZXQgdD0wO3Q8MTY7dCsrKWVbcit0XT1uLmJ5dGVzW3RdO3JldHVybiByKzE2fWZ1bmN0aW9uIEl0KGUsdCxuLHIpe2VbcisrXT0iTG9uZyI9PT1uLl9ic29udHlwZT9QOlY7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5nZXRMb3dCaXRzKCksbz1uLmdldEhpZ2hCaXRzKCk7cmV0dXJuIHIrPXBlLnNldEludDMyTEUoZSxyLGkpLHIrPXBlLnNldEludDMyTEUoZSxyLG8pfWZ1bmN0aW9uIHZ0KGUsdCxuLHIpe249bi52YWx1ZU9mKCksZVtyKytdPU07cmV0dXJuIHIrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MCxyKz1wZS5zZXRJbnQzMkxFKGUscixuKX1mdW5jdGlvbiBUdChlLHQsbixyKXtlW3IrK109TztyZXR1cm4gcis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wLHIrPXBlLnNldEZsb2F0NjRMRShlLHIsbi52YWx1ZSl9ZnVuY3Rpb24gJHQoZSx0LG4scil7ZVtyKytdPXo7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsbykscj1yKzQrby0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24gTHQoZSx0LG4scixpPSExLG89MCxzPSExLGE9ITAsYyl7aWYobi5zY29wZSYmIm9iamVjdCI9PXR5cGVvZiBuLnNjb3BlKXtlW3IrK109QztyKz1fZS5lbmNvZGVVVEY4SW50byhlLHQsciksZVtyKytdPTA7bGV0IGw9cjtjb25zdCBmPW4uY29kZTtyKz00O2NvbnN0IHU9X2UuZW5jb2RlVVRGOEludG8oZSxmLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscix1KSxlW3IrNCt1LTFdPTAscj1yK3UrNDtjb25zdCBfPUZ0KGUsbi5zY29wZSxpLHIsbysxLHMsYSxjKTtyPV8tMTtjb25zdCBnPV8tbDtsKz1wZS5zZXRJbnQzMkxFKGUsbCxnKSxlW3IrK109MH1lbHNle2VbcisrXT16O3IrPV9lLmVuY29kZVVURjhJbnRvKGUsdCxyKSxlW3IrK109MDtjb25zdCBpPW4uY29kZS50b1N0cmluZygpLG89X2UuZW5jb2RlVVRGOEludG8oZSxpLHIrNCkrMTtwZS5zZXRJbnQzMkxFKGUscixvKSxyPXIrNCtvLTEsZVtyKytdPTB9cmV0dXJuIHJ9ZnVuY3Rpb24gQXQoZSx0LG4scil7ZVtyKytdPVQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9bi5idWZmZXI7bGV0IG89bi5wb3NpdGlvbjtpZihuLnN1Yl90eXBlPT09eWUuU1VCVFlQRV9CWVRFX0FSUkFZJiYobys9NCkscis9cGUuc2V0SW50MzJMRShlLHIsbyksZVtyKytdPW4uc3ViX3R5cGUsbi5zdWJfdHlwZT09PXllLlNVQlRZUEVfQllURV9BUlJBWSYmKG8tPTQscis9cGUuc2V0SW50MzJMRShlLHIsbykpLG4uc3ViX3R5cGU9PT15ZS5TVUJUWVBFX1ZFQ1RPUiYmbWUobiksbzw9MTYpZm9yKGxldCB0PTA7dDxvO3QrKyllW3IrdF09aVt0XTtlbHNlIGUuc2V0KGkscik7cmV0dXJuIHIrPW4ucG9zaXRpb259ZnVuY3Rpb24gUnQoZSx0LG4scil7ZVtyKytdPUQ7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2NvbnN0IGk9X2UuZW5jb2RlVVRGOEludG8oZSxuLnZhbHVlLHIrNCkrMTtyZXR1cm4gcGUuc2V0SW50MzJMRShlLHIsaSkscj1yKzQraS0xLGVbcisrXT0wLHJ9ZnVuY3Rpb24ganQoZSx0LG4scixpLG8scyl7ZVtyKytdPUk7cis9X2UuZW5jb2RlVVRGOEludG8oZSx0LHIpLGVbcisrXT0wO2xldCBhPXIsYz17JHJlZjpuLmNvbGxlY3Rpb258fG4ubmFtZXNwYWNlLCRpZDpuLm9pZH07bnVsbCE9bi5kYiYmKGMuJGRiPW4uZGIpLGM9T2JqZWN0LmFzc2lnbihjLG4uZmllbGRzKTtjb25zdCBsPUZ0KGUsYywhMSxyLGkrMSxvLCEwLHMpLGY9bC1hO3JldHVybiBhKz1wZS5zZXRJbnQzMkxFKGUscixmKSxsfWZ1bmN0aW9uIEZ0KGUsdCxuLHIsaSxvLHMsYSl7aWYobnVsbD09YSl7aWYobnVsbD09dClyZXR1cm4gZVswXT01LGVbMV09MCxlWzJdPTAsZVszXT0wLGVbNF09MCw1O2lmKEFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IFooInNlcmlhbGl6ZSBkb2VzIG5vdCBzdXBwb3J0IGFuIGFycmF5IGFzIHRoZSByb290IGlucHV0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXRocm93IG5ldyBaKCJzZXJpYWxpemUgZG9lcyBub3Qgc3VwcG9ydCBub24tb2JqZWN0IGFzIHRoZSByb290IGlucHV0Iik7aWYoIl9ic29udHlwZSJpbiB0JiYic3RyaW5nIj09dHlwZW9mIHQuX2Jzb250eXBlKXRocm93IG5ldyBaKCJCU09OIHR5cGVzIGNhbm5vdCBiZSBzZXJpYWxpemVkIGFzIGEgZG9jdW1lbnQiKTtpZihkKHQpfHxoKHQpfHxfKHQpfHxnKHQpKXRocm93IG5ldyBaKCJkYXRlLCByZWdleHAsIHR5cGVkYXJyYXksIGFuZCBhcnJheWJ1ZmZlciBjYW5ub3QgYmUgQlNPTiBkb2N1bWVudHMiKTthPW5ldyBTZXR9YS5hZGQodCk7bGV0IGM9cis0O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspe2NvbnN0IGw9YCR7cn1gO2xldCBmPXRbcl07ImZ1bmN0aW9uIj09dHlwZW9mIGY/LnRvQlNPTiYmKGY9Zi50b0JTT04oKSk7Y29uc3QgdT10eXBlb2YgZjtpZih2b2lkIDA9PT1mKWM9cHQoZSxsLDAsYyk7ZWxzZSBpZihudWxsPT09ZiljPXB0KGUsbCwwLGMpO2Vsc2UgaWYoInN0cmluZyI9PT11KWM9YnQoZSxsLGYsYyk7ZWxzZSBpZigibnVtYmVyIj09PXUpYz1kdChlLGwsZixjKTtlbHNlIGlmKCJiaWdpbnQiPT09dSljPXd0KGUsbCxmLGMpO2Vsc2UgaWYoImJvb2xlYW4iPT09dSljPXl0KGUsbCxmLGMpO2Vsc2UgaWYoIm9iamVjdCI9PT11JiZudWxsPT1mLl9ic29udHlwZSljPWYgaW5zdGFuY2VvZiBEYXRlfHxkKGYpP210KGUsbCxmLGMpOmYgaW5zdGFuY2VvZiBVaW50OEFycmF5fHxfKGYpP1V0KGUsbCxmLGMpOmYgaW5zdGFuY2VvZiBSZWdFeHB8fGgoZik/U3QoZSxsLGYsYyk6T3QoZSxsLGYsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIm9iamVjdCI9PT11KXtpZihmW3ldIT09cCl0aHJvdyBuZXcgRztpZigiT2JqZWN0SWQiPT09Zi5fYnNvbnR5cGUpYz1FdChlLGwsZixjKTtlbHNlIGlmKCJEZWNpbWFsMTI4Ij09PWYuX2Jzb250eXBlKWM9TnQoZSxsLGYsYyk7ZWxzZSBpZigiTG9uZyI9PT1mLl9ic29udHlwZXx8IlRpbWVzdGFtcCI9PT1mLl9ic29udHlwZSljPUl0KGUsbCxmLGMpO2Vsc2UgaWYoIkRvdWJsZSI9PT1mLl9ic29udHlwZSljPVR0KGUsbCxmLGMpO2Vsc2UgaWYoIkNvZGUiPT09Zi5fYnNvbnR5cGUpYz1MdChlLGwsZixjLG4saSxvLHMsYSk7ZWxzZSBpZigiQmluYXJ5Ij09PWYuX2Jzb250eXBlKWM9QXQoZSxsLGYsYyk7ZWxzZSBpZigiQlNPTlN5bWJvbCI9PT1mLl9ic29udHlwZSljPVJ0KGUsbCxmLGMpO2Vsc2UgaWYoIkRCUmVmIj09PWYuX2Jzb250eXBlKWM9anQoZSxsLGYsYyxpLG8sYSk7ZWxzZSBpZigiQlNPTlJlZ0V4cCI9PT1mLl9ic29udHlwZSljPUJ0KGUsbCxmLGMpO2Vsc2UgaWYoIkludDMyIj09PWYuX2Jzb250eXBlKWM9dnQoZSxsLGYsYyk7ZWxzZSBpZigiTWluS2V5Ij09PWYuX2Jzb250eXBlfHwiTWF4S2V5Ij09PWYuX2Jzb250eXBlKWM9eHQoZSxsLGYsYyk7ZWxzZSBpZih2b2lkIDAhPT1mLl9ic29udHlwZSl0aHJvdyBuZXcgWihgVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAke1N0cmluZyhmLl9ic29udHlwZSl9YCl9ZWxzZSJmdW5jdGlvbiI9PT11JiZvJiYoYz0kdChlLGwsZixjKSl9ZWxzZSBpZih0IGluc3RhbmNlb2YgTWFwfHxiKHQpKXtjb25zdCByPXQuZW50cmllcygpO2xldCBsPSExO2Zvcig7IWw7KXtjb25zdCB0PXIubmV4dCgpO2lmKGw9ISF0LmRvbmUsbCljb250aW51ZTtjb25zdCBmPXQudmFsdWU/dC52YWx1ZVswXTp2b2lkIDA7bGV0IHU9dC52YWx1ZT90LnZhbHVlWzFdOnZvaWQgMDsiZnVuY3Rpb24iPT10eXBlb2YgdT8udG9CU09OJiYodT11LnRvQlNPTigpKTtjb25zdCBnPXR5cGVvZiB1O2lmKCJzdHJpbmciPT10eXBlb2YgZiYmIWh0LmhhcyhmKSl7aWYobnVsbCE9Zi5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK2YrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1mWzBdKXRocm93IG5ldyBaKCJrZXkgIitmKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihmLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK2YrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT11KSExPT09cyYmKGM9cHQoZSxmLDAsYykpO2Vsc2UgaWYobnVsbD09PXUpYz1wdChlLGYsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09ZyljPWJ0KGUsZix1LGMpO2Vsc2UgaWYoIm51bWJlciI9PT1nKWM9ZHQoZSxmLHUsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWcpYz13dChlLGYsdSxjKTtlbHNlIGlmKCJib29sZWFuIj09PWcpYz15dChlLGYsdSxjKTtlbHNlIGlmKCJvYmplY3QiPT09ZyYmbnVsbD09dS5fYnNvbnR5cGUpYz11IGluc3RhbmNlb2YgRGF0ZXx8ZCh1KT9tdChlLGYsdSxjKTp1IGluc3RhbmNlb2YgVWludDhBcnJheXx8Xyh1KT9VdChlLGYsdSxjKTp1IGluc3RhbmNlb2YgUmVnRXhwfHxoKHUpP1N0KGUsZix1LGMpOk90KGUsZix1LGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09Zyl7aWYodVt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PXUuX2Jzb250eXBlKWM9RXQoZSxmLHUsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT11Ll9ic29udHlwZSljPU50KGUsZix1LGMpO2Vsc2UgaWYoIkxvbmciPT09dS5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09dS5fYnNvbnR5cGUpYz1JdChlLGYsdSxjKTtlbHNlIGlmKCJEb3VibGUiPT09dS5fYnNvbnR5cGUpYz1UdChlLGYsdSxjKTtlbHNlIGlmKCJDb2RlIj09PXUuX2Jzb250eXBlKWM9THQoZSxmLHUsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT11Ll9ic29udHlwZSljPUF0KGUsZix1LGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09dS5fYnNvbnR5cGUpYz1SdChlLGYsdSxjKTtlbHNlIGlmKCJEQlJlZiI9PT11Ll9ic29udHlwZSljPWp0KGUsZix1LGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09dS5fYnNvbnR5cGUpYz1CdChlLGYsdSxjKTtlbHNlIGlmKCJJbnQzMiI9PT11Ll9ic29udHlwZSljPXZ0KGUsZix1LGMpO2Vsc2UgaWYoIk1pbktleSI9PT11Ll9ic29udHlwZXx8Ik1heEtleSI9PT11Ll9ic29udHlwZSljPXh0KGUsZix1LGMpO2Vsc2UgaWYodm9pZCAwIT09dS5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcodS5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09ZyYmbyYmKGM9JHQoZSxmLHUsYykpfX1lbHNle2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Py50b0JTT04mJm51bGwhPSh0PXQudG9CU09OKCkpJiYib2JqZWN0IiE9dHlwZW9mIHQpdGhyb3cgbmV3IFooInRvQlNPTiBmdW5jdGlvbiBkaWQgbm90IHJldHVybiBhbiBvYmplY3QiKTtmb3IoY29uc3QgciBvZiBPYmplY3Qua2V5cyh0KSl7bGV0IGw9dFtyXTsiZnVuY3Rpb24iPT10eXBlb2YgbD8udG9CU09OJiYobD1sLnRvQlNPTigpKTtjb25zdCBmPXR5cGVvZiBsO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWh0LmhhcyhyKSl7aWYobnVsbCE9ci5tYXRjaChndCkpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluIG51bGwgYnl0ZXMiKTtpZihuKXtpZigiJCI9PT1yWzBdKXRocm93IG5ldyBaKCJrZXkgIityKyIgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJCciKTtpZihyLmluY2x1ZGVzKCIuIikpdGhyb3cgbmV3IFooImtleSAiK3IrIiBtdXN0IG5vdCBjb250YWluICcuJyIpfX1pZih2b2lkIDA9PT1sKSExPT09cyYmKGM9cHQoZSxyLDAsYykpO2Vsc2UgaWYobnVsbD09PWwpYz1wdChlLHIsMCxjKTtlbHNlIGlmKCJzdHJpbmciPT09ZiljPWJ0KGUscixsLGMpO2Vsc2UgaWYoIm51bWJlciI9PT1mKWM9ZHQoZSxyLGwsYyk7ZWxzZSBpZigiYmlnaW50Ij09PWYpYz13dChlLHIsbCxjKTtlbHNlIGlmKCJib29sZWFuIj09PWYpYz15dChlLHIsbCxjKTtlbHNlIGlmKCJvYmplY3QiPT09ZiYmbnVsbD09bC5fYnNvbnR5cGUpYz1sIGluc3RhbmNlb2YgRGF0ZXx8ZChsKT9tdChlLHIsbCxjKTpsIGluc3RhbmNlb2YgVWludDhBcnJheXx8XyhsKT9VdChlLHIsbCxjKTpsIGluc3RhbmNlb2YgUmVnRXhwfHxoKGwpP1N0KGUscixsLGMpOk90KGUscixsLGMsbixpLG8scyxhKTtlbHNlIGlmKCJvYmplY3QiPT09Zil7aWYobFt5XSE9PXApdGhyb3cgbmV3IEc7aWYoIk9iamVjdElkIj09PWwuX2Jzb250eXBlKWM9RXQoZSxyLGwsYyk7ZWxzZSBpZigiRGVjaW1hbDEyOCI9PT1sLl9ic29udHlwZSljPU50KGUscixsLGMpO2Vsc2UgaWYoIkxvbmciPT09bC5fYnNvbnR5cGV8fCJUaW1lc3RhbXAiPT09bC5fYnNvbnR5cGUpYz1JdChlLHIsbCxjKTtlbHNlIGlmKCJEb3VibGUiPT09bC5fYnNvbnR5cGUpYz1UdChlLHIsbCxjKTtlbHNlIGlmKCJDb2RlIj09PWwuX2Jzb250eXBlKWM9THQoZSxyLGwsYyxuLGksbyxzLGEpO2Vsc2UgaWYoIkJpbmFyeSI9PT1sLl9ic29udHlwZSljPUF0KGUscixsLGMpO2Vsc2UgaWYoIkJTT05TeW1ib2wiPT09bC5fYnNvbnR5cGUpYz1SdChlLHIsbCxjKTtlbHNlIGlmKCJEQlJlZiI9PT1sLl9ic29udHlwZSljPWp0KGUscixsLGMsaSxvLGEpO2Vsc2UgaWYoIkJTT05SZWdFeHAiPT09bC5fYnNvbnR5cGUpYz1CdChlLHIsbCxjKTtlbHNlIGlmKCJJbnQzMiI9PT1sLl9ic29udHlwZSljPXZ0KGUscixsLGMpO2Vsc2UgaWYoIk1pbktleSI9PT1sLl9ic29udHlwZXx8Ik1heEtleSI9PT1sLl9ic29udHlwZSljPXh0KGUscixsLGMpO2Vsc2UgaWYodm9pZCAwIT09bC5fYnNvbnR5cGUpdGhyb3cgbmV3IFooYFVucmVjb2duaXplZCBvciBpbnZhbGlkIF9ic29udHlwZTogJHtTdHJpbmcobC5fYnNvbnR5cGUpfWApfWVsc2UiZnVuY3Rpb24iPT09ZiYmbyYmKGM9JHQoZSxyLGwsYykpfX1hLmRlbGV0ZSh0KSxlW2MrK109MDtjb25zdCBsPWMtcjtyZXR1cm4gcis9cGUuc2V0SW50MzJMRShlLHIsbCksY31jb25zdCBrdD17JG9pZDp0dCwkYmluYXJ5OnllLCR1dWlkOnllLCRzeW1ib2w6b3QsJG51bWJlckludDpaZSwkbnVtYmVyRGVjaW1hbDpIZSwkbnVtYmVyRG91YmxlOktlLCRudW1iZXJMb25nOmplLCRtaW5LZXk6WGUsJG1heEtleTpHZSwkcmVnZXg6aXQsJHJlZ3VsYXJFeHByZXNzaW9uOml0LCR0aW1lc3RhbXA6YXR9O2Z1bmN0aW9uIHp0KGUsdD17fSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtjb25zdCBuPWU8PW0mJmU+PVMscj1lPD1CJiZlPj14O2lmKHQucmVsYXhlZHx8dC5sZWdhY3kpcmV0dXJuIGU7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYobilyZXR1cm4gbmV3IFplKGUpO2lmKHIpcmV0dXJuIHQudXNlQmlnSW50NjQ/QmlnSW50KGUpOmplLmZyb21OdW1iZXIoZSl9cmV0dXJuIG5ldyBLZShlKX1pZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoZS4kdW5kZWZpbmVkKXJldHVybiBudWxsO2NvbnN0IG49T2JqZWN0LmtleXMoZSkuZmlsdGVyKCh0PT50LnN0YXJ0c1dpdGgoIiQiKSYmbnVsbCE9ZVt0XSkpO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPWt0W25bcl1dO2lmKGkpcmV0dXJuIGkuZnJvbUV4dGVuZGVkSlNPTihlLHQpfWlmKG51bGwhPWUuJGRhdGUpe2NvbnN0IG49ZS4kZGF0ZSxyPW5ldyBEYXRlO2lmKHQubGVnYWN5KWlmKCJudW1iZXIiPT10eXBlb2YgbilyLnNldFRpbWUobik7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIG4pci5zZXRUaW1lKERhdGUucGFyc2UobikpO2Vsc2UgaWYoamUuaXNMb25nKG4pKXIuc2V0VGltZShuLnRvTnVtYmVyKCkpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBuJiZ0LnJlbGF4ZWQpci5zZXRUaW1lKG4pO2Vsc2V7aWYoImJpZ2ludCIhPXR5cGVvZiBuKXRocm93IG5ldyBYKCJVbnJlY29nbml6ZWQgdHlwZSBmb3IgRUpTT04gZGF0ZTogIit0eXBlb2Ygbik7ci5zZXRUaW1lKE51bWJlcihuKSl9cmV0dXJuIHJ9aWYobnVsbCE9ZS4kY29kZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBlLiRzY29wZSYmKHQuJHNjb3BlPXp0KGUuJHNjb3BlKSksRWUuZnJvbUV4dGVuZGVkSlNPTihlKX1pZihVZShlKXx8ZS4kZGJQb2ludGVyKXtjb25zdCB0PWUuJHJlZj9lOmUuJGRiUG9pbnRlcjtpZih0IGluc3RhbmNlb2YgT2UpcmV0dXJuIHQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0KS5maWx0ZXIoKGU9PmUuc3RhcnRzV2l0aCgiJCIpKSk7bGV0IHI9ITA7aWYobi5mb3JFYWNoKChlPT57LTE9PT1bIiRyZWYiLCIkaWQiLCIkZGIiXS5pbmRleE9mKGUpJiYocj0hMSl9KSkscilyZXR1cm4gT2UuZnJvbUV4dGVuZGVkSlNPTih0KX1yZXR1cm4gZX1mdW5jdGlvbiBEdChlKXtjb25zdCB0PWUudG9JU09TdHJpbmcoKTtyZXR1cm4gMCE9PWUuZ2V0VVRDTWlsbGlzZWNvbmRzKCk/dDp0LnNsaWNlKDAsLTUpKyJaIn1mdW5jdGlvbiBDdChlLHQpe2lmKGUgaW5zdGFuY2VvZiBNYXB8fGIoZSkpe2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3RbdCxyXW9mIGUpe2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgWigiQ2FuIG9ubHkgc2VyaWFsaXplIG1hcHMgd2l0aCBzdHJpbmcga2V5cyIpO25bdF09cn1yZXR1cm4gQ3Qobix0KX1pZigoIm9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZSkmJm51bGwhPT1lKXtjb25zdCBuPXQuc2Vlbk9iamVjdHMuZmluZEluZGV4KCh0PT50Lm9iaj09PWUpKTtpZigtMSE9PW4pe2NvbnN0IGU9dC5zZWVuT2JqZWN0cy5tYXAoKGU9PmUucHJvcGVydHlOYW1lKSkscj1lLnNsaWNlKDAsbikubWFwKChlPT5gJHtlfSAtPiBgKSkuam9pbigiIiksaT1lW25dLG89IiAtPiAiK2Uuc2xpY2UobisxLGUubGVuZ3RoLTEpLm1hcCgoZT0+YCR7ZX0gLT4gYCkpLmpvaW4oIiIpLHM9ZVtlLmxlbmd0aC0xXSxhPSIgIi5yZXBlYXQoci5sZW5ndGgraS5sZW5ndGgvMiksYz0iLSIucmVwZWF0KG8ubGVuZ3RoKyhpLmxlbmd0aCtzLmxlbmd0aCkvMi0xKTt0aHJvdyBuZXcgWihgQ29udmVydGluZyBjaXJjdWxhciBzdHJ1Y3R1cmUgdG8gRUpTT046XG4gICAgJHtyfSR7aX0ke299JHtzfVxuICAgICR7YX1cXCR7Y30vYCl9dC5zZWVuT2JqZWN0c1t0LnNlZW5PYmplY3RzLmxlbmd0aC0xXS5vYmo9ZX1pZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiBlLm1hcCgoKGUsbik9Pnt0LnNlZW5PYmplY3RzLnB1c2goe3Byb3BlcnR5TmFtZTpgaW5kZXggJHtufWAsb2JqOm51bGx9KTt0cnl7cmV0dXJuIEN0KGUsdCl9ZmluYWxseXt0LnNlZW5PYmplY3RzLnBvcCgpfX0pKX0oZSx0KTtpZih2b2lkIDA9PT1lKXJldHVybiB0Lmlnbm9yZVVuZGVmaW5lZD92b2lkIDA6bnVsbDtpZihlIGluc3RhbmNlb2YgRGF0ZXx8ZChlKSl7Y29uc3Qgbj1lLmdldFRpbWUoKSxyPW4+LTEmJm48MjUzNDAyMzE4OGU1O3JldHVybiB0LmxlZ2FjeT90LnJlbGF4ZWQmJnI/eyRkYXRlOmUuZ2V0VGltZSgpfTp7JGRhdGU6RHQoZSl9OnQucmVsYXhlZCYmcj97JGRhdGU6RHQoZSl9OnskZGF0ZTp7JG51bWJlckxvbmc6ZS5nZXRUaW1lKCkudG9TdHJpbmcoKX19fWlmKCEoIm51bWJlciIhPXR5cGVvZiBlfHx0LnJlbGF4ZWQmJmlzRmluaXRlKGUpKSl7aWYoTnVtYmVyLmlzSW50ZWdlcihlKSYmIU9iamVjdC5pcyhlLC0wKSl7aWYoZT49UyYmZTw9bSlyZXR1cm57JG51bWJlckludDplLnRvU3RyaW5nKCl9O2lmKGU+PXgmJmU8PUIpcmV0dXJueyRudW1iZXJMb25nOmUudG9TdHJpbmcoKX19cmV0dXJueyRudW1iZXJEb3VibGU6T2JqZWN0LmlzKGUsLTApPyItMC4wIjplLnRvU3RyaW5nKCl9fWlmKCJiaWdpbnQiPT10eXBlb2YgZSlyZXR1cm4gdC5yZWxheGVkP051bWJlcihCaWdJbnQuYXNJbnROKDY0LGUpKTp7JG51bWJlckxvbmc6QmlnSW50LmFzSW50Tig2NCxlKS50b1N0cmluZygpfTtpZihlIGluc3RhbmNlb2YgUmVnRXhwfHxoKGUpKXtsZXQgbj1lLmZsYWdzO2lmKHZvaWQgMD09PW4pe2NvbnN0IHQ9ZS50b1N0cmluZygpLm1hdGNoKC9bZ2ltdXldKiQvKTt0JiYobj10WzBdKX1yZXR1cm4gbmV3IGl0KGUuc291cmNlLG4pLnRvRXh0ZW5kZWRKU09OKHQpfXJldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGU/ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lfHwib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFooIm5vdCBhbiBvYmplY3QgaW5zdGFuY2UiKTtjb25zdCBuPWUuX2Jzb250eXBlO2lmKHZvaWQgMD09PW4pe2NvbnN0IG49e307Zm9yKGNvbnN0IHIgb2YgT2JqZWN0LmtleXMoZSkpe3Quc2Vlbk9iamVjdHMucHVzaCh7cHJvcGVydHlOYW1lOnIsb2JqOm51bGx9KTt0cnl7Y29uc3QgaT1DdChlW3JdLHQpOyJfX3Byb3RvX18iPT09cj9PYmplY3QuZGVmaW5lUHJvcGVydHkobixyLHt2YWx1ZTppLHdyaXRhYmxlOiEwLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSk6bltyXT1pfWZpbmFsbHl7dC5zZWVuT2JqZWN0cy5wb3AoKX19cmV0dXJuIG59aWYobnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYic3RyaW5nIj09dHlwZW9mIGUuX2Jzb250eXBlJiZlW3ldIT09cCl0aHJvdyBuZXcgRztpZihmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYiX2Jzb250eXBlImluIGUmJiJzdHJpbmciPT10eXBlb2YgZS5fYnNvbnR5cGV9KGUpKXtsZXQgcj1lO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLnRvRXh0ZW5kZWRKU09OKXtjb25zdCB0PU10W2UuX2Jzb250eXBlXTtpZighdCl0aHJvdyBuZXcgWigiVW5yZWNvZ25pemVkIG9yIGludmFsaWQgX2Jzb250eXBlOiAiK2UuX2Jzb250eXBlKTtyPXQocil9cmV0dXJuIkNvZGUiPT09biYmci5zY29wZT9yPW5ldyBFZShyLmNvZGUsQ3Qoci5zY29wZSx0KSk6IkRCUmVmIj09PW4mJnIub2lkJiYocj1uZXcgT2UoQ3Qoci5jb2xsZWN0aW9uLHQpLEN0KHIub2lkLHQpLEN0KHIuZGIsdCksQ3Qoci5maWVsZHMsdCkpKSxyLnRvRXh0ZW5kZWRKU09OKHQpfXRocm93IG5ldyBaKCJfYnNvbnR5cGUgbXVzdCBiZSBhIHN0cmluZywgYnV0IHdhczogIit0eXBlb2Ygbil9KGUsdCk6ZX1jb25zdCBNdD17QmluYXJ5OmU9Pm5ldyB5ZShlLnZhbHVlKCksZS5zdWJfdHlwZSksQ29kZTplPT5uZXcgRWUoZS5jb2RlLGUuc2NvcGUpLERCUmVmOmU9Pm5ldyBPZShlLmNvbGxlY3Rpb258fGUubmFtZXNwYWNlLGUub2lkLGUuZGIsZS5maWVsZHMpLERlY2ltYWwxMjg6ZT0+bmV3IEhlKGUuYnl0ZXMpLERvdWJsZTplPT5uZXcgS2UoZS52YWx1ZSksSW50MzI6ZT0+bmV3IFplKGUudmFsdWUpLExvbmc6ZT0+amUuZnJvbUJpdHMobnVsbCE9ZS5sb3c/ZS5sb3c6ZS5sb3dfLG51bGwhPWUubG93P2UuaGlnaDplLmhpZ2hfLG51bGwhPWUubG93P2UudW5zaWduZWQ6ZS51bnNpZ25lZF8pLE1heEtleTooKT0+bmV3IEdlLE1pbktleTooKT0+bmV3IFhlLE9iamVjdElkOmU9Pm5ldyB0dChlKSxCU09OUmVnRXhwOmU9Pm5ldyBpdChlLnBhdHRlcm4sZS5vcHRpb25zKSxCU09OU3ltYm9sOmU9Pm5ldyBvdChlLnZhbHVlKSxUaW1lc3RhbXA6ZT0+YXQuZnJvbUJpdHMoZS5sb3csZS5oaWdoKX07ZnVuY3Rpb24gVnQoZSx0KXtjb25zdCBuPXt1c2VCaWdJbnQ2NDp0Py51c2VCaWdJbnQ2ND8/ITEscmVsYXhlZDp0Py5yZWxheGVkPz8hMCxsZWdhY3k6dD8ubGVnYWN5Pz8hMX07cmV0dXJuIEpTT04ucGFyc2UoZSwoKGUsdCk9PntpZigtMSE9PWUuaW5kZXhPZigiXDAiKSl0aHJvdyBuZXcgWihgQlNPTiBEb2N1bWVudCBmaWVsZCBuYW1lcyBjYW5ub3QgY29udGFpbiBudWxsIGJ5dGVzLCBmb3VuZDogJHtKU09OLnN0cmluZ2lmeShlKX1gKTtyZXR1cm4genQodCxuKX0pKX1mdW5jdGlvbiBQdChlLHQsbixyKXtudWxsIT1uJiYib2JqZWN0Ij09dHlwZW9mIG4mJihyPW4sbj0wKSxudWxsPT10fHwib2JqZWN0IiE9dHlwZW9mIHR8fEFycmF5LmlzQXJyYXkodCl8fChyPXQsdD12b2lkIDAsbj0wKTtjb25zdCBpPUN0KGUsT2JqZWN0LmFzc2lnbih7cmVsYXhlZDohMCxsZWdhY3k6ITF9LHIse3NlZW5PYmplY3RzOlt7cHJvcGVydHlOYW1lOiIocm9vdCkiLG9iajpudWxsfV19KSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGksdCxuKX1jb25zdCBKdD1PYmplY3QuY3JlYXRlKG51bGwpO0p0LnBhcnNlPVZ0LEp0LnN0cmluZ2lmeT1QdCxKdC5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD10fHx7fSxKU09OLnBhcnNlKFB0KGUsdCkpfSxKdC5kZXNlcmlhbGl6ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LFZ0KEpTT04uc3RyaW5naWZ5KGUpLHQpfSxPYmplY3QuZnJlZXplKEp0KTtjb25zdCBXdD0xLFl0PTIscXQ9MyxIdD00LEt0PTUsWnQ9NixHdD03LFh0PTgsUXQ9OSxlbj0xMCx0bj0xMSxubj0xMixybj0xMyxvbj0xNCxzbj0xNSxhbj0xNixjbj0xNyxsbj0xOCxmbj0xOSx1bj0yNTUsX249MTI3O2Z1bmN0aW9uIGduKGUsdCl7dHJ5e3JldHVybiBwZS5nZXROb25uZWdhdGl2ZUludDMyTEUoZSx0KX1jYXRjaChlKXt0aHJvdyBuZXcgUSgiQlNPTiBzaXplIGNhbm5vdCBiZSBuZWdhdGl2ZSIsdCx7Y2F1c2U6ZX0pfX1mdW5jdGlvbiBobihlLHQpe2xldCBuPXQ7Zm9yKDswIT09ZVtuXTtuKyspO2lmKG49PT1lLmxlbmd0aC0xKXRocm93IG5ldyBRKCJOdWxsIHRlcm1pbmF0b3Igbm90IGZvdW5kIix0KTtyZXR1cm4gbn1jb25zdCBibj1PYmplY3QuY3JlYXRlKG51bGwpO2JuLnBhcnNlVG9FbGVtZW50cz1mdW5jdGlvbihlLHQ9MCl7aWYodD8/PTAsZS5sZW5ndGg8NSl0aHJvdyBuZXcgUShgSW5wdXQgbXVzdCBiZSBhdCBsZWFzdCA1IGJ5dGVzLCBnb3QgJHtlLmxlbmd0aH0gYnl0ZXNgLHQpO2NvbnN0IG49Z24oZSx0KTtpZihuPmUubGVuZ3RoLXQpdGhyb3cgbmV3IFEoYFBhcnNlZCBkb2N1bWVudFNpemUgKCR7bn0gYnl0ZXMpIGRvZXMgbm90IG1hdGNoIGlucHV0IGxlbmd0aCAoJHtlLmxlbmd0aH0gYnl0ZXMpYCx0KTtpZigwIT09ZVt0K24tMV0pdGhyb3cgbmV3IFEoIkJTT04gZG9jdW1lbnRzIG11c3QgZW5kIGluIDB4MDAiLHQrbik7Y29uc3Qgcj1bXTtsZXQgaT10KzQ7Zm9yKDtpPD1uK3Q7KXtjb25zdCBvPWVbaV07aWYoaSs9MSwwPT09byl7aWYoaS10IT09bil0aHJvdyBuZXcgUSgiSW52YWxpZCAweDAwIHR5cGUgYnl0ZSIsaSk7YnJlYWt9Y29uc3Qgcz1pLGE9aG4oZSxpKS1zO2xldCBjO2lmKGkrPWErMSxvPT09V3R8fG89PT1sbnx8bz09PVF0fHxvPT09Y24pYz04O2Vsc2UgaWYobz09PWFuKWM9NDtlbHNlIGlmKG89PT1HdCljPTEyO2Vsc2UgaWYobz09PWZuKWM9MTY7ZWxzZSBpZihvPT09WHQpYz0xO2Vsc2UgaWYobz09PWVufHxvPT09WnR8fG89PT1fbnx8bz09PXVuKWM9MDtlbHNlIGlmKG89PT10biljPWhuKGUsaG4oZSxpKSsxKSsxLWk7ZWxzZSBpZihvPT09cXR8fG89PT1IdHx8bz09PXNuKWM9Z24oZSxpKTtlbHNle2lmKG8hPT1ZdCYmbyE9PUt0JiZvIT09bm4mJm8hPT1ybiYmbyE9PW9uKXRocm93IG5ldyBRKGBJbnZhbGlkIDB4JHtvLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCIwIil9IHR5cGUgYnl0ZWAsaSk7Yz1nbihlLGkpKzQsbz09PUt0JiYoYys9MSksbz09PW5uJiYoYys9MTIpfWlmKGM+bil0aHJvdyBuZXcgUSgidmFsdWUgcmVwb3J0cyBsZW5ndGggbGFyZ2VyIHRoYW4gZG9jdW1lbnQiLGkpO3IucHVzaChbbyxzLGEsaSxjXSksaSs9Y31yZXR1cm4gcn0sYm4uQnl0ZVV0aWxzPV9lLGJuLk51bWJlclV0aWxzPXBlLE9iamVjdC5mcmVlemUoYm4pO2NvbnN0IGRuPTE3ODI1NzkyO2xldCB3bj1fZS5hbGxvY2F0ZShkbik7dmFyIHBuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJTT05FcnJvcjpaLEJTT05PZmZzZXRFcnJvcjpRLEJTT05SZWdFeHA6aXQsQlNPTlJ1bnRpbWVFcnJvcjpYLEJTT05TeW1ib2w6b3QsQlNPTlR5cGU6SyxCU09OVmFsdWU6aGUsQlNPTlZlcnNpb25FcnJvcjpHLEJpbmFyeTp5ZSxCeXRlVXRpbHM6X2UsQ29kZTpFZSxEQlJlZjpPZSxEZWNpbWFsMTI4OkhlLERvdWJsZTpLZSxFSlNPTjpKdCxJbnQzMjpaZSxMb25nOmplLE1heEtleTpHZSxNaW5LZXk6WGUsTnVtYmVyVXRpbHM6cGUsT2JqZWN0SWQ6dHQsVGltZXN0YW1wOmF0LFVVSUQ6eGUsYnNvblR5cGU6Z2UsY2FsY3VsYXRlT2JqZWN0U2l6ZTpmdW5jdGlvbihlLHQ9e30pe3JldHVybiBudChlLCJib29sZWFuIj09dHlwZW9mKHQ9dHx8e30pLnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsImJvb2xlYW4iIT10eXBlb2YgdC5pZ25vcmVVbmRlZmluZWR8fHQuaWdub3JlVW5kZWZpbmVkKX0sZGVzZXJpYWxpemU6ZnVuY3Rpb24oZSx0PXt9KXtyZXR1cm4gZnQoX2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSksdCl9LGRlc2VyaWFsaXplU3RyZWFtOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtjb25zdCBzPU9iamVjdC5hc3NpZ24oe2FsbG93T2JqZWN0U21hbGxlclRoYW5CdWZmZXJTaXplOiEwLGluZGV4OjB9LG8pLGE9X2UudG9Mb2NhbEJ1ZmZlclR5cGUoZSk7bGV0IGM9dDtmb3IobGV0IGU9MDtlPG47ZSsrKXtjb25zdCB0PXBlLmdldEludDMyTEUoYSxjKTtzLmluZGV4PWMscltpK2VdPWZ0KGEscyksYys9dH1yZXR1cm4gY30sb25EZW1hbmQ6Ym4sc2VyaWFsaXplOmZ1bmN0aW9uKGUsdD17fSl7Y29uc3Qgbj0iYm9vbGVhbiI9PXR5cGVvZiB0LmNoZWNrS2V5cyYmdC5jaGVja0tleXMscj0iYm9vbGVhbiI9PXR5cGVvZiB0LnNlcmlhbGl6ZUZ1bmN0aW9ucyYmdC5zZXJpYWxpemVGdW5jdGlvbnMsaT0iYm9vbGVhbiIhPXR5cGVvZiB0Lmlnbm9yZVVuZGVmaW5lZHx8dC5pZ25vcmVVbmRlZmluZWQsbz0ibnVtYmVyIj09dHlwZW9mIHQubWluSW50ZXJuYWxCdWZmZXJTaXplP3QubWluSW50ZXJuYWxCdWZmZXJTaXplOmRuO3duLmxlbmd0aDxvJiYod249X2UuYWxsb2NhdGUobykpO2NvbnN0IHM9RnQod24sZSxuLDAsMCxyLGksbnVsbCksYT1fZS5hbGxvY2F0ZVVuc2FmZShzKTtyZXR1cm4gYS5zZXQod24uc3ViYXJyYXkoMCxzKSwwKSxhfSxzZXJpYWxpemVXaXRoQnVmZmVyQW5kSW5kZXg6ZnVuY3Rpb24oZSx0LG49e30pe2NvbnN0IHI9ImJvb2xlYW4iPT10eXBlb2Ygbi5jaGVja0tleXMmJm4uY2hlY2tLZXlzLGk9ImJvb2xlYW4iPT10eXBlb2Ygbi5zZXJpYWxpemVGdW5jdGlvbnMmJm4uc2VyaWFsaXplRnVuY3Rpb25zLG89ImJvb2xlYW4iIT10eXBlb2Ygbi5pZ25vcmVVbmRlZmluZWR8fG4uaWdub3JlVW5kZWZpbmVkLHM9Im51bWJlciI9PXR5cGVvZiBuLmluZGV4P24uaW5kZXg6MCxhPUZ0KHduLGUsciwwLDAsaSxvLG51bGwpO3JldHVybiB0LnNldCh3bi5zdWJhcnJheSgwLGEpLHMpLHMrYS0xfSxzZXRJbnRlcm5hbEJ1ZmZlclNpemU6ZnVuY3Rpb24oZSl7d24ubGVuZ3RoPGUmJih3bj1fZS5hbGxvY2F0ZShlKSl9fSk7Y2xhc3MgeW57Y29uc3RydWN0b3IoKXt9c3RhdGljIHVybENvbnN0cnVjdEZyb20oZSl7Y29uc3QgdD0iL3dzL21vZGVsaW5nL2NvbW1hbmRzIitmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSlpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkocikpZm9yKGNvbnN0IGUgb2Ygcil0LmFwcGVuZChuLFN0cmluZyhlKSk7ZWxzZSB0LmFwcGVuZChuLFN0cmluZyhyKSk7Y29uc3Qgbj10LnRvU3RyaW5nKCk7cmV0dXJuIG4/YD8ke259YDoiIn0oe3ZpZGVvX3Jlc193aWR0aDplLnZpZGVvX3Jlc193aWR0aCx2aWRlb19yZXNfaGVpZ2h0OmUudmlkZW9fcmVzX2hlaWdodCxmcHM6ZS5mcHMsdW5sb2NrZWRfZnJhbWVyYXRlOmUudW5sb2NrZWRfZnJhbWVyYXRlLHBvc3RfZWZmZWN0OmUucG9zdF9lZmZlY3Qsd2VicnRjOmUud2VicnRjLHBvb2w6ZS5wb29sLHNob3dfZ3JpZDplLnNob3dfZ3JpZCxyZXBsYXk6ZS5yZXBsYXksYXBpX2NhbGxfaWQ6ZS5hcGlfY2FsbF9pZCxvcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3k6ZS5vcmRlcl9pbmRlcGVuZGVudF90cmFuc3BhcmVuY3kscHI6ZS5wcn0pLG49KChlLmNsaWVudD8uYmFzZVVybHx8Imh0dHBzOi8vYXBpLnpvby5kZXYiKSt0KS5yZXBsYWNlKC9eaHR0cC8sIndzIik7cmV0dXJuIG5ldyBVUkwobil9c3RhdGljIGF1dGhlbnRpY2F0ZShlLHQpe2NvbnN0IG49ZS5jbGllbnQmJmUuY2xpZW50LnRva2VufHwiIjtpZihuKXRyeXtjb25zdCBlPXt0eXBlOiJoZWFkZXJzIixoZWFkZXJzOntBdXRob3JpemF0aW9uOmBCZWFyZXIgJHtufWB9fTt0LnNlbmQoSlNPTi5zdHJpbmdpZnkoZSkpfWNhdGNoe319c3RhdGljIHRvQlNPTihlKXtyZXR1cm4gcG4uc2VyaWFsaXplKGUpfXN0YXRpYyBwYXJzZU1lc3NhZ2UoZSl7Y29uc3QgdD1lPy5kYXRhO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gSlNPTi5wYXJzZSh0KTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEJ1ZmZlciYmQnVmZmVyLmlzQnVmZmVyPy4odCkpe2NvbnN0IGU9dDt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZS50b1N0cmluZygidXRmOCIpKX1jYXRjaHt9cmV0dXJuIHBuLmRlc2VyaWFsaXplKGUpfWlmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0KTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX1pZigobj10KSYmIm9iamVjdCI9PXR5cGVvZiBuJiYiYnVmZmVyImluIG4mJm4uYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJiJudW1iZXIiPT10eXBlb2Ygbi5ieXRlT2Zmc2V0JiYibnVtYmVyIj09dHlwZW9mIG4uYnl0ZUxlbmd0aCl7Y29uc3QgZT1uZXcgVWludDhBcnJheSh0LmJ1ZmZlcix0LmJ5dGVPZmZzZXQsdC5ieXRlTGVuZ3RoKTt0cnl7Y29uc3QgdD0obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoZSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2h7fXJldHVybiBwbi5kZXNlcmlhbGl6ZShlKX12YXIgbjtyZXR1cm4gdH19Y2xhc3MgbW57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxSbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19jb250ZXh0X2ZyZWUoZSwwKX1hZGRfY29uc3RyYWludChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixsPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3I7cmV0dXJuIHVyLmNvbnRleHRfYWRkX2NvbnN0cmFpbnQodGhpcy5fX3diZ19wdHIsbyxzLGEsYyxsLGYsdSxfLGkpfWFkZF9maWxlKGUsdCl7Y29uc3Qgbj1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfZmlsZSh0aGlzLl9fd2JnX3B0cixlLG4scil9YWRkX3NlZ21lbnQoZSx0LG4scixpLG8pe2NvbnN0IHM9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3IsYz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcixmPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSx1PV9yO3ZhciBfPW5yKHIpPzA6b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGc9X3I7Y29uc3QgaD1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYj1fcjtyZXR1cm4gdXIuY29udGV4dF9hZGRfc2VnbWVudCh0aGlzLl9fd2JnX3B0cixzLGEsYyxsLGYsdSxfLGcsaCxiLG8pfWJ1c3RDYWNoZUFuZFJlc2V0U2NlbmUoZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yO3ZhciBpPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLmNvbnRleHRfYnVzdENhY2hlQW5kUmVzZXRTY2VuZSh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1jaGFpbl9zZWdtZW50KGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsbD1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcix1PW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3I7dmFyIGI9bnIoaSk/MDpvcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZD1fcjtjb25zdCB3PW9yKG8sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxwPV9yO3JldHVybiB1ci5jb250ZXh0X2NoYWluX3NlZ21lbnQodGhpcy5fX3diZ19wdHIsYSxjLGwsZix1LF8sZyxoLGIsZCx3LHAscyl9Y2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKCl7cmV0dXJuIHVyLmNvbnRleHRfY2xlYXJfc2tldGNoX2NoZWNrcG9pbnRzKHRoaXMuX193YmdfcHRyKX1kZWxldGVfb2JqZWN0cyhlLHQsbixyLGksbyl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLGY9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHU9X3IsXz1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZz1fcixoPW9yKGksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxiPV9yO3JldHVybiB1ci5jb250ZXh0X2RlbGV0ZV9vYmplY3RzKHRoaXMuX193YmdfcHRyLHMsYSxjLGwsZix1LF8sZyxoLGIsbyl9ZGVsZXRlX3NrZXRjaChlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3I7cmV0dXJuIHVyLmNvbnRleHRfZGVsZXRlX3NrZXRjaCh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZWRpdF9jb25zdHJhaW50KGUsdCxuLHIsaSxvKXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3IsZj1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcixfPW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxnPV9yLGg9b3IoaSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGI9X3I7cmV0dXJuIHVyLmNvbnRleHRfZWRpdF9jb25zdHJhaW50KHRoaXMuX193YmdfcHRyLHMsYSxjLGwsZix1LF8sZyxoLGIsbyl9ZWRpdF9kaXN0YW5jZV9jb25zdHJhaW50X2xhYmVsX3Bvc2l0aW9uKGUsdCxuLHIsaSxvLHMpe2NvbnN0IGE9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsbD1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZj1fcix1PW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxfPV9yLGc9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGg9X3IsYj1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksZD1fcix3PW9yKHMsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxwPV9yO3JldHVybiB1ci5jb250ZXh0X2VkaXRfZGlzdGFuY2VfY29uc3RyYWludF9sYWJlbF9wb3NpdGlvbih0aGlzLl9fd2JnX3B0cixhLGMsbCxmLHUsXyxnLGgsYixkLG8sdyxwKX1lZGl0X3NlZ21lbnRzKGUsdCxuLHIsaSl7Y29uc3Qgbz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscz1fcixhPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxjPV9yLGw9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3IsdT1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz1fcjtyZXR1cm4gdXIuY29udGV4dF9lZGl0X3NlZ21lbnRzKHRoaXMuX193YmdfcHRyLG8scyxhLGMsbCxmLHUsXyxpKX1lZGl0X3NrZXRjaChlLHQsbixyLGkpe2NvbnN0IG89b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixsPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxmPV9yLHU9b3Iocix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLF89X3IsZz1vcihpLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaD1fcjtyZXR1cm4gdXIuY29udGV4dF9lZGl0X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixvLHMsYSxjLGwsZix1LF8sZyxoKX1leGVjdXRlKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yO3ZhciBvPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3I7Y29uc3QgYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcjtyZXR1cm4gdXIuY29udGV4dF9leGVjdXRlKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1leGVjdXRlTW9jayhlLHQsbixyKXtjb25zdCBpPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxvPV9yO3ZhciBzPW5yKHQpPzA6b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGE9X3I7Y29uc3QgYz1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbD1fcjtyZXR1cm4gdXIuY29udGV4dF9leGVjdXRlTW9jayh0aGlzLl9fd2JnX3B0cixpLG8scyxhLGMsbCxyKX1leGVjdXRlX3RyaW0oZSx0LG4scil7Y29uc3QgaT1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9aXIobix1ci5fX3diaW5kZ2VuX21hbGxvYyksbD1fcixmPW9yKHIsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSx1PV9yO3JldHVybiB1ci5jb250ZXh0X2V4ZWN1dGVfdHJpbSh0aGlzLl9fd2JnX3B0cixpLG8scyxhLGMsbCxmLHUpfWV4aXRfc2tldGNoKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yLG89b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcjtyZXR1cm4gdXIuY29udGV4dF9leGl0X3NrZXRjaCh0aGlzLl9fd2JnX3B0cixyLGksbyxzLGEsYyl9ZXhwb3J0KGUsdCl7Y29uc3Qgbj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscj1fcixpPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxvPV9yO3JldHVybiB1ci5jb250ZXh0X2V4cG9ydCh0aGlzLl9fd2JnX3B0cixuLHIsaSxvKX1nZXRfZmlsZShlLHQpe3JldHVybiB1ci5jb250ZXh0X2dldF9maWxlKHRoaXMuX193YmdfcHRyLGUsdCl9Z2V0X3Byb2plY3QoZSl7cmV0dXJuIHVyLmNvbnRleHRfZ2V0X3Byb2plY3QodGhpcy5fX3diZ19wdHIsZSl9aGFja19zZXRfcHJvZ3JhbShlLHQpe2NvbnN0IG49b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3IsaT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcjtyZXR1cm4gdXIuY29udGV4dF9oYWNrX3NldF9wcm9ncmFtKHRoaXMuX193YmdfcHRyLG4scixpLG8pfWNvbnN0cnVjdG9yKGUsdCl7Y29uc3Qgbj11ci5jb250ZXh0X25ldyhlLHQpO2lmKG5bMl0pdGhyb3cgc3IoblsxXSk7cmV0dXJuIHRoaXMuX193YmdfcHRyPW5bMF0+Pj4wLFJuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc31uZXdfc2tldGNoKGUsdCxuLHIsaSl7Y29uc3Qgbz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYykscz1fcixhPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxjPV9yLGw9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGY9X3IsdT1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksXz1fcixnPW9yKGksdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxoPV9yO3JldHVybiB1ci5jb250ZXh0X25ld19za2V0Y2godGhpcy5fX3diZ19wdHIsbyxzLGEsYyxsLGYsdSxfLGcsaCl9b3Blbl9wcm9qZWN0KGUsdCxuKXtjb25zdCByPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yO3JldHVybiB1ci5jb250ZXh0X29wZW5fcHJvamVjdCh0aGlzLl9fd2JnX3B0cixlLHIsaSxuKX1yZWZyZXNoKGUpe3JldHVybiB1ci5jb250ZXh0X3JlZnJlc2godGhpcy5fX3diZ19wdHIsZSl9cmVtb3ZlX2ZpbGUoZSx0KXtyZXR1cm4gdXIuY29udGV4dF9yZW1vdmVfZmlsZSh0aGlzLl9fd2JnX3B0cixlLHQpfXJlc3RvcmVfc2tldGNoX2NoZWNrcG9pbnQoZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcjtyZXR1cm4gdXIuY29udGV4dF9yZXN0b3JlX3NrZXRjaF9jaGVja3BvaW50KHRoaXMuX193YmdfcHRyLHQsbil9c2VuZFJlc3BvbnNlKGUpe3JldHVybiB1ci5jb250ZXh0X3NlbmRSZXNwb25zZSh0aGlzLl9fd2JnX3B0cixlKX1za2V0Y2hfZXhlY3V0ZV9tb2NrKGUsdCxuKXtjb25zdCByPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yLG89b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHM9X3IsYT1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcjtyZXR1cm4gdXIuY29udGV4dF9za2V0Y2hfZXhlY3V0ZV9tb2NrKHRoaXMuX193YmdfcHRyLHIsaSxvLHMsYSxjKX1zd2l0Y2hfZmlsZShlLHQpe3JldHVybiB1ci5jb250ZXh0X3N3aXRjaF9maWxlKHRoaXMuX193YmdfcHRyLGUsdCl9dHJhbnNwaWxlX29sZF9za2V0Y2goZSx0LG4scil7Y29uc3QgaT1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbz1fcixzPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yO3ZhciBjPW5yKG4pPzA6b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3I7Y29uc3QgZj1vcihyLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksdT1fcjtyZXR1cm4gdXIuY29udGV4dF90cmFuc3BpbGVfb2xkX3NrZXRjaCh0aGlzLl9fd2JnX3B0cixpLG8scyxhLGMsbCxmLHUpfXVwZGF0ZV9maWxlKGUsdCxuKXtjb25zdCByPW9yKG4sdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxpPV9yO3JldHVybiB1ci5jb250ZXh0X3VwZGF0ZV9maWxlKHRoaXMuX193YmdfcHRyLGUsdCxyLGkpfX1TeW1ib2wuZGlzcG9zZSYmKG1uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09bW4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIFNue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsam4udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuX193YmdfaW50b3VuZGVybHlpbmdieXRlc291cmNlX2ZyZWUoZSwwKX1nZXQgYXV0b0FsbG9jYXRlQ2h1bmtTaXplKCl7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV9hdXRvQWxsb2NhdGVDaHVua1NpemUodGhpcy5fX3diZ19wdHIpPj4+MH1jYW5jZWwoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuaW50b3VuZGVybHlpbmdieXRlc291cmNlX2NhbmNlbChlKX1wdWxsKGUpe3JldHVybiB1ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2VfcHVsbCh0aGlzLl9fd2JnX3B0cixlKX1zdGFydChlKXt1ci5pbnRvdW5kZXJseWluZ2J5dGVzb3VyY2Vfc3RhcnQodGhpcy5fX3diZ19wdHIsZSl9Z2V0IHR5cGUoKXtjb25zdCBlPXVyLmludG91bmRlcmx5aW5nYnl0ZXNvdXJjZV90eXBlKHRoaXMuX193YmdfcHRyKTtyZXR1cm4gQW5bZV19fVN5bWJvbC5kaXNwb3NlJiYoU24ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Tbi5wcm90b3R5cGUuZnJlZSk7Y2xhc3MgQm57X19kZXN0cm95X2ludG9fcmF3KCl7Y29uc3QgZT10aGlzLl9fd2JnX3B0cjtyZXR1cm4gdGhpcy5fX3diZ19wdHI9MCxGbi51bnJlZ2lzdGVyKHRoaXMpLGV9ZnJlZSgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5fX3diZ19pbnRvdW5kZXJseWluZ3NpbmtfZnJlZShlLDApfWFib3J0KGUpe2NvbnN0IHQ9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdzaW5rX2Fib3J0KHQsZSl9Y2xvc2UoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7cmV0dXJuIHVyLmludG91bmRlcmx5aW5nc2lua19jbG9zZShlKX13cml0ZShlKXtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdzaW5rX3dyaXRlKHRoaXMuX193YmdfcHRyLGUpfX1TeW1ib2wuZGlzcG9zZSYmKEJuLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09Qm4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIHhue19fZGVzdHJveV9pbnRvX3Jhdygpe2NvbnN0IGU9dGhpcy5fX3diZ19wdHI7cmV0dXJuIHRoaXMuX193YmdfcHRyPTAsa24udW5yZWdpc3Rlcih0aGlzKSxlfWZyZWUoKXtjb25zdCBlPXRoaXMuX19kZXN0cm95X2ludG9fcmF3KCk7dXIuX193YmdfaW50b3VuZGVybHlpbmdzb3VyY2VfZnJlZShlLDApfWNhbmNlbCgpe2NvbnN0IGU9dGhpcy5fX2Rlc3Ryb3lfaW50b19yYXcoKTt1ci5pbnRvdW5kZXJseWluZ3NvdXJjZV9jYW5jZWwoZSl9cHVsbChlKXtyZXR1cm4gdXIuaW50b3VuZGVybHlpbmdzb3VyY2VfcHVsbCh0aGlzLl9fd2JnX3B0cixlKX19U3ltYm9sLmRpc3Bvc2UmJih4bi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPXhuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBFbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLHpuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX2xzcHNlcnZlcmNvbmZpZ19mcmVlKGUsMCl9Y29uc3RydWN0b3IoZSx0LG4pe2NvbnN0IHI9dXIubHNwc2VydmVyY29uZmlnX25ldyhlLHQsbik7cmV0dXJuIHRoaXMuX193YmdfcHRyPXI+Pj4wLHpuLnJlZ2lzdGVyKHRoaXMsdGhpcy5fX3diZ19wdHIsdGhpcyksdGhpc319U3ltYm9sLmRpc3Bvc2UmJihFbi5wcm90b3R5cGVbU3ltYm9sLmRpc3Bvc2VdPUVuLnByb3RvdHlwZS5mcmVlKTtjbGFzcyBVbntfX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLERuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX3Jlc3BvbnNlY29udGV4dF9mcmVlKGUsMCl9Y29uc3RydWN0b3IoKXtjb25zdCBlPXVyLnJlc3BvbnNlY29udGV4dF9uZXcoKTtyZXR1cm4gdGhpcy5fX3diZ19wdHI9ZT4+PjAsRG4ucmVnaXN0ZXIodGhpcyx0aGlzLl9fd2JnX3B0cix0aGlzKSx0aGlzfXNlbmRfcmVzcG9uc2UoZSl7cmV0dXJuIHVyLnJlc3BvbnNlY29udGV4dF9zZW5kX3Jlc3BvbnNlKHRoaXMuX193YmdfcHRyLGUpfX1TeW1ib2wuZGlzcG9zZSYmKFVuLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09VW4ucHJvdG90eXBlLmZyZWUpO2NsYXNzIE9ue3N0YXRpYyBfX3dyYXAoZSl7ZT4+Pj0wO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShPbi5wcm90b3R5cGUpO3JldHVybiB0Ll9fd2JnX3B0cj1lLENuLnJlZ2lzdGVyKHQsdC5fX3diZ19wdHIsdCksdH1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLENuLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9mcmVlKGUsMCl9Z2V0IGFyY19sZW5ndGgoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9hcmNfbGVuZ3RoKHRoaXMuX193YmdfcHRyKX1nZXQgYXJjX21pZF9wb2ludF94KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX21pZF9wb2ludF94KHRoaXMuX193YmdfcHRyKX1nZXQgYXJjX21pZF9wb2ludF95KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX21pZF9wb2ludF95KHRoaXMuX193YmdfcHRyKX1nZXQgY2N3KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2N3KHRoaXMuX193YmdfcHRyKX1nZXQgY2VudGVyX3goKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl95KCl7cmV0dXJuIHVyLl9fd2JnX2dldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3kodGhpcy5fX3diZ19wdHIpfWdldCBlbmRfYW5nbGUoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9lbmRfYW5nbGUodGhpcy5fX3diZ19wdHIpfWdldCByYWRpdXMoKXtyZXR1cm4gdXIuX193YmdfZ2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9yYWRpdXModGhpcy5fX3diZ19wdHIpfWdldCBzdGFydF9hbmdsZSgpe3JldHVybiB1ci5fX3diZ19nZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3N0YXJ0X2FuZ2xlKHRoaXMuX193YmdfcHRyKX1zZXQgYXJjX2xlbmd0aChlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19sZW5ndGgodGhpcy5fX3diZ19wdHIsZSl9c2V0IGFyY19taWRfcG9pbnRfeChlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2FyY19taWRfcG9pbnRfeCh0aGlzLl9fd2JnX3B0cixlKX1zZXQgYXJjX21pZF9wb2ludF95KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fYXJjX21pZF9wb2ludF95KHRoaXMuX193YmdfcHRyLGUpfXNldCBjY3coZSl7dXIuX193Ymdfc2V0X3RhbmdlbnRpYWxhcmNpbmZvb3V0cHV0d2FzbV9jY3codGhpcy5fX3diZ19wdHIsZSl9c2V0IGNlbnRlcl94KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3godGhpcy5fX3diZ19wdHIsZSl9c2V0IGNlbnRlcl95KGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fY2VudGVyX3kodGhpcy5fX3diZ19wdHIsZSl9c2V0IGVuZF9hbmdsZShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX2VuZF9hbmdsZSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgcmFkaXVzKGUpe3VyLl9fd2JnX3NldF90YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fcmFkaXVzKHRoaXMuX193YmdfcHRyLGUpfXNldCBzdGFydF9hbmdsZShlKXt1ci5fX3diZ19zZXRfdGFuZ2VudGlhbGFyY2luZm9vdXRwdXR3YXNtX3N0YXJ0X2FuZ2xlKHRoaXMuX193YmdfcHRyLGUpfX1TeW1ib2wuZGlzcG9zZSYmKE9uLnByb3RvdHlwZVtTeW1ib2wuZGlzcG9zZV09T24ucHJvdG90eXBlLmZyZWUpO2NsYXNzIE5ue3N0YXRpYyBfX3dyYXAoZSl7ZT4+Pj0wO2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShObi5wcm90b3R5cGUpO3JldHVybiB0Ll9fd2JnX3B0cj1lLE1uLnJlZ2lzdGVyKHQsdC5fX3diZ19wdHIsdCksdH1fX2Rlc3Ryb3lfaW50b19yYXcoKXtjb25zdCBlPXRoaXMuX193YmdfcHRyO3JldHVybiB0aGlzLl9fd2JnX3B0cj0wLE1uLnVucmVnaXN0ZXIodGhpcyksZX1mcmVlKCl7Y29uc3QgZT10aGlzLl9fZGVzdHJveV9pbnRvX3JhdygpO3VyLl9fd2JnX3dhc21jaXJjbGVwYXJhbXNfZnJlZShlLDApfWdldCBjZW50ZXJfeCgpe3JldHVybiB1ci5fX3diZ19nZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeCh0aGlzLl9fd2JnX3B0cil9Z2V0IGNlbnRlcl95KCl7cmV0dXJuIHVyLl9fd2JnX2dldF93YXNtY2lyY2xlcGFyYW1zX2NlbnRlcl95KHRoaXMuX193YmdfcHRyKX1nZXQgcmFkaXVzKCl7cmV0dXJuIHVyLl9fd2JnX2dldF93YXNtY2lyY2xlcGFyYW1zX3JhZGl1cyh0aGlzLl9fd2JnX3B0cil9c2V0IGNlbnRlcl94KGUpe3VyLl9fd2JnX3NldF93YXNtY2lyY2xlcGFyYW1zX2NlbnRlcl94KHRoaXMuX193YmdfcHRyLGUpfXNldCBjZW50ZXJfeShlKXt1ci5fX3diZ19zZXRfd2FzbWNpcmNsZXBhcmFtc19jZW50ZXJfeSh0aGlzLl9fd2JnX3B0cixlKX1zZXQgcmFkaXVzKGUpe3VyLl9fd2JnX3NldF93YXNtY2lyY2xlcGFyYW1zX3JhZGl1cyh0aGlzLl9fd2JnX3B0cixlKX19ZnVuY3Rpb24gSW4oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnBhcnNlX3dhc20odCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX1mdW5jdGlvbiB2bigpe2NvbnN0IGU9e19fcHJvdG9fXzpudWxsLF9fd2JnX0Vycm9yXzU1NTM4NDgzZGU2ZTNhYmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gRXJyb3IoWG4oZSx0KSl9LF9fd2JnX19fd2JpbmRnZW5fYm9vbGVhbl9nZXRfZmUyYTI0ZmRmZGI0MDY0ZjpmdW5jdGlvbihlKXtjb25zdCB0PSJib29sZWFuIj09dHlwZW9mIGU/ZTp2b2lkIDA7cmV0dXJuIG5yKHQpPzE2Nzc3MjE1OnQ/MTowfSxfX3diZ19fX3diaW5kZ2VuX2RlYnVnX3N0cmluZ19kODk2MjcyMDJkMDE1NWI3OmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1vcihXbih0KSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9LF9fd2JnX19fd2JpbmRnZW5faXNfZnVuY3Rpb25fMmE5NTQwNjQyM2VhODYyNjpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX0sX193YmdfX193YmluZGdlbl9pc19udWxsXzhkOTA1MjRjOWUwYWYxODM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfSxfX3diZ19fX3diaW5kZ2VuX2lzX29iamVjdF81OWEwMDJlNzZiMDU5MzEyOmZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWV9LF9fd2JnX19fd2JpbmRnZW5faXNfdW5kZWZpbmVkXzg3YTNhODM3ZjMzMWZlZjU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWV9LF9fd2JnX19fd2JpbmRnZW5fc3RyaW5nX2dldF9mMTE2MTM5MDQxNGY5YjU5OmZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0ic3RyaW5nIj09dHlwZW9mIHQ/dDp2b2lkIDA7dmFyIHI9bnIobik/MDpvcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcjtLbigpLnNldEludDMyKGUrNCxpLCEwKSxLbigpLnNldEludDMyKGUrMCxyLCEwKX0sX193YmdfX193YmluZGdlbl90aHJvd181NTQ5NDkyZGFlZGFkMTM5OmZ1bmN0aW9uKGUsdCl7dGhyb3cgbmV3IEVycm9yKFhuKGUsdCkpfSxfX3diZ19fd2JnX2NiX3VucmVmX2ZiZTY5YmIwNzZjMTZiYWQ6ZnVuY3Rpb24oZSl7ZS5fd2JnX2NiX3VucmVmKCl9LF9fd2JnX2J1ZmZlcl8wYTU3Nzg4Y2RmY2UyMWJhOmZ1bmN0aW9uKGUpe3JldHVybiBlLmJ1ZmZlcn0sX193YmdfYnlvYlJlcXVlc3RfYWIwZTU3ZjU1YmY3NzRmMjpmdW5jdGlvbihlKXtjb25zdCB0PWUuYnlvYlJlcXVlc3Q7cmV0dXJuIG5yKHQpPzA6Vm4odCl9LF9fd2JnX2J5dGVMZW5ndGhfOTkzMWRiMDBlNTg2MWJmOTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ieXRlTGVuZ3RofSxfX3diZ19ieXRlT2Zmc2V0XzBhOTg1YTk4ZjhmZmI4ZDc6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYnl0ZU9mZnNldH0sX193YmdfY2FsbF84ZjVkN2JiMDcwMjgzNTA4OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuY2FsbCh0LG4pfSksYXJndW1lbnRzKX0sX193YmdfY2xvc2VfNjJmNmE0ZWFkYzk0NTY1ZjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7ZS5jbG9zZSgpfSksYXJndW1lbnRzKX0sX193YmdfY2xvc2VfODcxZTUxNmEyNzNkMTVmODpmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9zZSgpfSxfX3diZ19jbG9zZV9mMjg3MDU4NzE2MDg4YTUwOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlKXtlLmNsb3NlKCl9KSxhcmd1bWVudHMpfSxfX3diZ19kb25lXzE5ZjkyY2IxZjg3MzhhYmE6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZG9uZX0sX193YmdfZW5xdWV1ZV9lZTA1OTNjZWE5YmU5M2JkOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe2UuZW5xdWV1ZSh0KX0pLGFyZ3VtZW50cyl9LF9fd2JnX2Vycm9yX2E2ZmEyMDJiNThhYTFjZDM6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtuPWUscj10LGNvbnNvbGUuZXJyb3IoWG4oZSx0KSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sX193YmdfZXJyb3JfZGU2Yjg2ZTU5ODUwNTI0NjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfSxfX3diZ19leGlzdHNfM2Q0YTg5M2EwNDE2OGEzZjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe2xldCByLGk7dHJ5e3I9dCxpPW47cmV0dXJuIGUuZXhpc3RzKFhuKHQsbikpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19maXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc21fMzczNjE4ZTUzMjk4MWU1YjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4scixpLG8scyxhLGMpe2xldCBsLGYsdSxfLGcsaCxiLGQ7dHJ5e2w9dCxmPW4sdT1yLF89aSxnPW8saD1zLGI9YSxkPWMsZS5maXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oWG4odCxuKSxYbihyLGkpLFhuKG8scyksWG4oYSxjKSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobCxmLDEpLHVyLl9fd2JpbmRnZW5fZnJlZSh1LF8sMSksdXIuX193YmluZGdlbl9mcmVlKGcsaCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUoYixkLDEpfX0pLGFyZ3VtZW50cyl9LF9fd2JnX2dldEFsbEZpbGVzX2I5YzRmMGZiOTAxMGExN2E6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCxuKXtsZXQgcixpO3RyeXtyPXQsaT1uO3JldHVybiBlLmdldEFsbEZpbGVzKFhuKHQsbikpfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKHIsaSwxKX19KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfM2Y0NGI3MDAzOTUwNjJlNTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRSYW5kb21WYWx1ZXNfZWYxMjU1MmJmNWFjZDJmZTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtnbG9iYWxUaGlzLmNyeXB0by5nZXRSYW5kb21WYWx1ZXMocW4oZSx0KSl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRXcml0ZXJfN2M5NTMxNDlhZjI3M2MyOTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0V3JpdGVyKCl9KSxhcmd1bWVudHMpfSxfX3diZ19nZXRfZmY1ZjFmYjIyMDIzMzQ3NzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gUmVmbGVjdC5nZXQoZSx0KX0pLGFyZ3VtZW50cyl9LF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV9jZTI0ZDU4YTVmNGJkY2MzOmZ1bmN0aW9uKGUpe2xldCB0O3RyeXt0PWUgaW5zdGFuY2VvZiBVaW50OEFycmF5fWNhdGNoKGUpe3Q9ITF9cmV0dXJuIHR9LF9fd2JnX2luc3RhbmNlb2ZfV2luZG93XzJmYThkOWMyZDViNjEwNGE6ZnVuY3Rpb24oZSl7bGV0IHQ7dHJ5e3Q9ZSBpbnN0YW5jZW9mIFdpbmRvd31jYXRjaChlKXt0PSExfXJldHVybiB0fSxfX3diZ19pbnN0YW5jZW9mX1dvcmtlckdsb2JhbFNjb3BlX2E0MzA3Yzg1ZjczZDgzYzM6ZnVuY3Rpb24oZSl7bGV0IHQ7dHJ5e3Q9ZSBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlfWNhdGNoKGUpe3Q9ITF9cmV0dXJuIHR9LF9fd2JnX2xlbmd0aF9lNmUxNjMzZmJlYTZjZmE5OmZ1bmN0aW9uKGUpe3JldHVybiBlLmxlbmd0aH0sX193YmdfbG9nXzZhNzViNzFkNjMxNmU5MzU6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LF9fd2JnX25ld18xZDk2Njc4YWFhY2NhMzJlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgVWludDhBcnJheShlKX0sX193YmdfbmV3XzIyN2Q3YzA1NDE0ZWI4NjE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEVycm9yfSxfX3diZ19uZXdfNGE4NDNmZTJlZTQwODJhOTpmdW5jdGlvbihlLHQpe3JldHVybiBuZXcgRXJyb3IoWG4oZSx0KSl9LF9fd2JnX25ld19mcm9tX3NsaWNlXzBiYzU4ZTM2ZjgyYTFiNTA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkocW4oZSx0KSl9LF9fd2JnX25ld190eXBlZF8yNWRkYTIzODhkN2U1ZTlmOmZ1bmN0aW9uKGUsdCl7dHJ5e3ZhciBuPXthOmUsYjp0fTtjb25zdCByPW5ldyBQcm9taXNlKCgoZSx0KT0+e2NvbnN0IHI9bi5hO24uYT0wO3RyeXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oMjM2YTFlMmU3MjRjNzFkOShlLHQsbixyKX0ocixuLmIsZSx0KX1maW5hbGx5e24uYT1yfX0pKTtyZXR1cm4gcn1maW5hbGx5e24uYT0wfX0sX193YmdfbmV3X3dpdGhfYnl0ZV9vZmZzZXRfYW5kX2xlbmd0aF9hYjFlMTAwMmQ3YTY5NGU0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZSx0Pj4+MCxuPj4+MCl9LF9fd2JnX25leHRfMWI3YjVjMDA3OTY2NTYwZjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIGUubmV4dCgpfSksYXJndW1lbnRzKX0sX193Ymdfbm93X2E5YWY0NTU0ZWRiN2FjNzg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm93KCl9LF9fd2JnX25vd19lN2M2Nzk1YTdmODFlMTBmOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vdygpfSxfX3diZ19wYXJzZV9lNTcwM2ZkNTIyMTFlNjg4OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQpe3JldHVybiBKU09OLnBhcnNlKFhuKGUsdCkpfSksYXJndW1lbnRzKX0sX193YmdfcGVyZm9ybWFuY2VfM2ZjZjZlMzJhN2UxZWQwYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wZXJmb3JtYW5jZX0sX193YmdfcHJvdG90eXBlc2V0Y2FsbF8zODc1ZDU0ZDEyZWYyZWVjOmZ1bmN0aW9uKGUsdCxuKXtVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChxbihlLHQpLG4pfSxfX3diZ19xdWV1ZU1pY3JvdGFza184ODY4MzY1MTE0ZmUyM2I1OmZ1bmN0aW9uKGUpe3F1ZXVlTWljcm90YXNrKGUpfSxfX3diZ19xdWV1ZU1pY3JvdGFza19jZmM1YTBlNjJmOWViZGJlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnF1ZXVlTWljcm90YXNrfSxfX3diZ19yZWFkRmlsZV9jZTFiNmJlY2MwNWY5MzBmOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7cj10LGk9bjtyZXR1cm4gZS5yZWFkRmlsZShYbih0LG4pKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSksYXJndW1lbnRzKX0sX193YmdfcmVhZHlfNTg1NmRiNmYwMGUzZTIwYTpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWFkeX0sX193YmdfcmVsZWFzZUxvY2tfOTViYmM3Y2Y3Yjg3OTc3ZDpmdW5jdGlvbihlKXtlLnJlbGVhc2VMb2NrKCl9LF9fd2JnX3Jlc29sdmVfZDgwNTliYzExM2UyMTViZjpmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfSxfX3diZ19yZXNwb25kXzFlYzI5Mzk1ZWRiZTdmY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdHIoKGZ1bmN0aW9uKGUsdCl7ZS5yZXNwb25kKHQ+Pj4wKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NlbmRNb2RlbGluZ0NvbW1hbmRGcm9tV2FzbV8zOTUyMWIxMWQ1OWVlYjI3OmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlLHQsbixyLGksbyxzLGEsYyl7bGV0IGwsZix1LF8sZyxoLGIsZDt0cnl7bD10LGY9bix1PXIsXz1pLGc9byxoPXMsYj1hLGQ9YztyZXR1cm4gZS5zZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oWG4odCxuKSxYbihyLGkpLFhuKG8scyksWG4oYSxjKSl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobCxmLDEpLHVyLl9fd2JpbmRnZW5fZnJlZSh1LF8sMSksdXIuX193YmluZGdlbl9mcmVlKGcsaCwxKSx1ci5fX3diaW5kZ2VuX2ZyZWUoYixkLDEpfX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NldFRpbWVvdXRfNDY2ZDUwZjM1MTIyNDVjYjpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnNldFRpbWVvdXQodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NldFRpbWVvdXRfYzFjOWExOGI2MzQzZWJkMzpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLnNldFRpbWVvdXQodCxuKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3NldF8yOTViYWQzYjVlYWQ0ZTk5OmZ1bmN0aW9uKGUsdCxuKXtlLnNldChxbih0LG4pKX0sX193Ymdfc3RhY2tfM2IwZDk3NGJiZjMxZTQ0ZjpmdW5jdGlvbihlLHQpe2NvbnN0IG49b3IodC5zdGFjayx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLHI9X3I7S24oKS5zZXRJbnQzMihlKzQsciwhMCksS24oKS5zZXRJbnQzMihlKzAsbiwhMCl9LF9fd2JnX3N0YXJ0TmV3U2Vzc2lvbl83ZDQ4NWFiZTJkOTRjNWMyOmZ1bmN0aW9uKCl7cmV0dXJuIHRyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdGFydE5ld1Nlc3Npb24oKX0pLGFyZ3VtZW50cyl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfOGRmYjdmNWUyNmViZTUyMzpmdW5jdGlvbigpe2NvbnN0IGU9InVuZGVmaW5lZCI9PXR5cGVvZiBnbG9iYWw/bnVsbDpnbG9iYWw7cmV0dXJuIG5yKGUpPzA6Vm4oZSl9LF9fd2JnX3N0YXRpY19hY2Nlc3Nvcl9HTE9CQUxfVEhJU185NDExNTRlZmM4Mzk1Y2RkOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIGdsb2JhbFRoaXM/bnVsbDpnbG9iYWxUaGlzO3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfU0VMRl81OGRhYzlhZjgyMmY1NjFmOmZ1bmN0aW9uKCl7Y29uc3QgZT0idW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/bnVsbDpzZWxmO3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdGF0aWNfYWNjZXNzb3JfV0lORE9XX2VlNjRmMGIzZDgzNTRjMGI6ZnVuY3Rpb24oKXtjb25zdCBlPSJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P251bGw6d2luZG93O3JldHVybiBucihlKT8wOlZuKGUpfSxfX3diZ19zdHJpbmdpZnlfYjY3ZTJjOGM2MGI5M2Y2OTpmdW5jdGlvbigpe3JldHVybiB0cigoZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfSksYXJndW1lbnRzKX0sX193YmdfdGhlbl8wMTUwMzUyZTRhZDIwMzQ0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS50aGVuKHQsbil9LF9fd2JnX3RoZW5fNTE2MDQ4NmM2N2RkYjk4YTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnRoZW4odCl9LF9fd2JnX3RvU3RyaW5nXzU1M2I1ZjZlOTVlM2U0MWI6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9TdHJpbmcoKX0sX193YmdfdG9TdHJpbmdfOWU3MzUzYTc3Y2I0MTVhMjpmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSxfX3diZ192YWx1ZV9kNWIyNDhjZTg0MTliZDFiOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlfSxfX3diZ192aWV3XzM4YTkzMDg0NGM5NjQxMDM6ZnVuY3Rpb24oZSl7Y29uc3QgdD1lLnZpZXc7cmV0dXJuIG5yKHQpPzA6Vm4odCl9LF9fd2JnX3dhcm5fODZlZjAzZGI4Y2ZiNGRkNDpmdW5jdGlvbihlKXtjb25zb2xlLndhcm4oZSl9LF9fd2JnX3dyaXRlX2ZmM2EzZGU0OTAyYWE4YmY6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS53cml0ZSh0KX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcnIoZSx0LCRuKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcnIoZSx0LExuKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcnIoZSx0LFRuKX0sX193YmluZGdlbl9jYXN0XzAwMDAwMDAwMDAwMDAwMDQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gWG4oZSx0KX0sX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZTpmdW5jdGlvbigpe2NvbnN0IGU9dXIuX193YmluZGdlbl9leHRlcm5yZWZzLHQ9ZS5ncm93KDQpO2Uuc2V0KDAsdm9pZCAwKSxlLnNldCh0KzAsdm9pZCAwKSxlLnNldCh0KzEsbnVsbCksZS5zZXQodCsyLCEwKSxlLnNldCh0KzMsITEpfX07cmV0dXJue19fcHJvdG9fXzpudWxsLCIuL2tjbF93YXNtX2xpYl9iZy5qcyI6ZX19ZnVuY3Rpb24gVG4oZSx0KXt1ci53YXNtX2JpbmRnZW5fX2NvbnZlcnRfX2Nsb3N1cmVzX19fX19pbnZva2VfX2gyZjRhYTYzZGNkNTk5Y2Y3KGUsdCl9ZnVuY3Rpb24gJG4oZSx0LG4pe2NvbnN0IHI9dXIud2FzbV9iaW5kZ2VuX19jb252ZXJ0X19jbG9zdXJlc19fX19faW52b2tlX19oZjEzMDgxNmNkOTAwNWI5OShlLHQsbik7aWYoclsxXSl0aHJvdyBzcihyWzBdKX1mdW5jdGlvbiBMbihlLHQsbil7Y29uc3Qgcj11ci53YXNtX2JpbmRnZW5fX2NvbnZlcnRfX2Nsb3N1cmVzX19fX19pbnZva2VfX2hmMTEyMzMwZTAxZDUxZGViKGUsdCxuKTtpZihyWzFdKXRocm93IHNyKHJbMF0pfVN5bWJvbC5kaXNwb3NlJiYoTm4ucHJvdG90eXBlW1N5bWJvbC5kaXNwb3NlXT1Obi5wcm90b3R5cGUuZnJlZSk7Y29uc3QgQW49WyJieXRlcyJdLFJuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ19jb250ZXh0X2ZyZWUoZT4+PjAsMSkpKSxqbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfaW50b3VuZGVybHlpbmdieXRlc291cmNlX2ZyZWUoZT4+PjAsMSkpKSxGbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfaW50b3VuZGVybHlpbmdzaW5rX2ZyZWUoZT4+PjAsMSkpKSxrbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmdfaW50b3VuZGVybHlpbmdzb3VyY2VfZnJlZShlPj4+MCwxKSkpLHpuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ19sc3BzZXJ2ZXJjb25maWdfZnJlZShlPj4+MCwxKSkpLERuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ19yZXNwb25zZWNvbnRleHRfZnJlZShlPj4+MCwxKSkpLENuPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ190YW5nZW50aWFsYXJjaW5mb291dHB1dHdhc21fZnJlZShlPj4+MCwxKSkpLE1uPSJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/e3JlZ2lzdGVyOigpPT57fSx1bnJlZ2lzdGVyOigpPT57fX06bmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlPT51ci5fX3diZ193YXNtY2lyY2xlcGFyYW1zX2ZyZWUoZT4+PjAsMSkpKTtmdW5jdGlvbiBWbihlKXtjb25zdCB0PXVyLl9fZXh0ZXJucmVmX3RhYmxlX2FsbG9jKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZXh0ZXJucmVmcy5zZXQodCxlKSx0fWZ1bmN0aW9uIFBuKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCBpbnN0YW5jZSBvZiAke3QubmFtZX1gKX1jb25zdCBKbj0idW5kZWZpbmVkIj09dHlwZW9mIEZpbmFsaXphdGlvblJlZ2lzdHJ5P3tyZWdpc3RlcjooKT0+e30sdW5yZWdpc3RlcjooKT0+e319Om5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeSgoZT0+dXIuX193YmluZGdlbl9kZXN0cm95X2Nsb3N1cmUoZS5hLGUuYikpKTtmdW5jdGlvbiBXbihlKXtjb25zdCB0PXR5cGVvZiBlO2lmKCJudW1iZXIiPT10fHwiYm9vbGVhbiI9PXR8fG51bGw9PWUpcmV0dXJuYCR7ZX1gO2lmKCJzdHJpbmciPT10KXJldHVybmAiJHtlfSJgO2lmKCJzeW1ib2wiPT10KXtjb25zdCB0PWUuZGVzY3JpcHRpb247cmV0dXJuIG51bGw9PXQ/IlN5bWJvbCI6YFN5bWJvbCgke3R9KWB9aWYoImZ1bmN0aW9uIj09dCl7Y29uc3QgdD1lLm5hbWU7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZ0Lmxlbmd0aD4wP2BGdW5jdGlvbigke3R9KWA6IkZ1bmN0aW9uIn1pZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCB0PWUubGVuZ3RoO2xldCBuPSJbIjt0PjAmJihuKz1XbihlWzBdKSk7Zm9yKGxldCByPTE7cjx0O3IrKyluKz0iLCAiK1duKGVbcl0pO3JldHVybiBuKz0iXSIsbn1jb25zdCBuPS9cW29iamVjdCAoW15cXV0rKVxdLy5leGVjKHRvU3RyaW5nLmNhbGwoZSkpO2xldCByO2lmKCEobiYmbi5sZW5ndGg+MSkpcmV0dXJuIHRvU3RyaW5nLmNhbGwoZSk7aWYocj1uWzFdLCJPYmplY3QiPT1yKXRyeXtyZXR1cm4iT2JqZWN0KCIrSlNPTi5zdHJpbmdpZnkoZSkrIikifWNhdGNoKGUpe3JldHVybiJPYmplY3QifXJldHVybiBlIGluc3RhbmNlb2YgRXJyb3I/YCR7ZS5uYW1lfTogJHtlLm1lc3NhZ2V9XG4ke2Uuc3RhY2t9YDpyfWZ1bmN0aW9uIFluKGUsdCl7ZT4+Pj0wO2NvbnN0IG49S24oKSxyPVtdO2ZvcihsZXQgaT1lO2k8ZSs0KnQ7aSs9NClyLnB1c2godXIuX193YmluZGdlbl9leHRlcm5yZWZzLmdldChuLmdldFVpbnQzMihpLCEwKSkpO3JldHVybiB1ci5fX2V4dGVybnJlZl9kcm9wX3NsaWNlKGUsdCkscn1mdW5jdGlvbiBxbihlLHQpe3JldHVybiBlPj4+PTAsZXIoKS5zdWJhcnJheShlLzEsZS8xK3QpfWxldCBIbj1udWxsO2Z1bmN0aW9uIEtuKCl7cmV0dXJuKG51bGw9PT1Ibnx8ITA9PT1Ibi5idWZmZXIuZGV0YWNoZWR8fHZvaWQgMD09PUhuLmJ1ZmZlci5kZXRhY2hlZCYmSG4uYnVmZmVyIT09dXIubWVtb3J5LmJ1ZmZlcikmJihIbj1uZXcgRGF0YVZpZXcodXIubWVtb3J5LmJ1ZmZlcikpLEhufWxldCBabj1udWxsO2Z1bmN0aW9uIEduKCl7cmV0dXJuIG51bGwhPT1abiYmMCE9PVpuLmJ5dGVMZW5ndGh8fChabj1uZXcgRmxvYXQ2NEFycmF5KHVyLm1lbW9yeS5idWZmZXIpKSxabn1mdW5jdGlvbiBYbihlLHQpe3JldHVybiBmdW5jdGlvbihlLHQpe2xyKz10LGxyPj1jciYmKGFyPW5ldyBUZXh0RGVjb2RlcigidXRmLTgiLHtpZ25vcmVCT006ITAsZmF0YWw6ITB9KSxhci5kZWNvZGUoKSxscj10KTtyZXR1cm4gYXIuZGVjb2RlKGVyKCkuc3ViYXJyYXkoZSxlK3QpKX0oZT4+Pj0wLHQpfWxldCBRbj1udWxsO2Z1bmN0aW9uIGVyKCl7cmV0dXJuIG51bGwhPT1RbiYmMCE9PVFuLmJ5dGVMZW5ndGh8fChRbj1uZXcgVWludDhBcnJheSh1ci5tZW1vcnkuYnVmZmVyKSksUW59ZnVuY3Rpb24gdHIoZSx0KXt0cnl7cmV0dXJuIGUuYXBwbHkodGhpcyx0KX1jYXRjaChlKXtjb25zdCB0PVZuKGUpO3VyLl9fd2JpbmRnZW5fZXhuX3N0b3JlKHQpfX1mdW5jdGlvbiBucihlKXtyZXR1cm4gbnVsbD09ZX1mdW5jdGlvbiBycihlLHQsbil7Y29uc3Qgcj17YTplLGI6dCxjbnQ6MX0saT0oLi4uZSk9PntyLmNudCsrO2NvbnN0IHQ9ci5hO3IuYT0wO3RyeXtyZXR1cm4gbih0LHIuYiwuLi5lKX1maW5hbGx5e3IuYT10LGkuX3diZ19jYl91bnJlZigpfX07cmV0dXJuIGkuX3diZ19jYl91bnJlZj0oKT0+ezA9PS0tci5jbnQmJih1ci5fX3diaW5kZ2VuX2Rlc3Ryb3lfY2xvc3VyZShyLmEsci5iKSxyLmE9MCxKbi51bnJlZ2lzdGVyKHIpKX0sSm4ucmVnaXN0ZXIoaSxyLHIpLGl9ZnVuY3Rpb24gaXIoZSx0KXtjb25zdCBuPXQoOCplLmxlbmd0aCw4KT4+PjA7cmV0dXJuIEduKCkuc2V0KGUsbi84KSxfcj1lLmxlbmd0aCxufWZ1bmN0aW9uIG9yKGUsdCxuKXtpZih2b2lkIDA9PT1uKXtjb25zdCBuPWZyLmVuY29kZShlKSxyPXQobi5sZW5ndGgsMSk+Pj4wO3JldHVybiBlcigpLnN1YmFycmF5KHIscituLmxlbmd0aCkuc2V0KG4pLF9yPW4ubGVuZ3RoLHJ9bGV0IHI9ZS5sZW5ndGgsaT10KHIsMSk+Pj4wO2NvbnN0IG89ZXIoKTtsZXQgcz0wO2Zvcig7czxyO3MrKyl7Y29uc3QgdD1lLmNoYXJDb2RlQXQocyk7aWYodD4xMjcpYnJlYWs7b1tpK3NdPXR9aWYocyE9PXIpezAhPT1zJiYoZT1lLnNsaWNlKHMpKSxpPW4oaSxyLHI9cyszKmUubGVuZ3RoLDEpPj4+MDtjb25zdCB0PWVyKCkuc3ViYXJyYXkoaStzLGkrcik7cys9ZnIuZW5jb2RlSW50byhlLHQpLndyaXR0ZW4saT1uKGkscixzLDEpPj4+MH1yZXR1cm4gX3I9cyxpfWZ1bmN0aW9uIHNyKGUpe2NvbnN0IHQ9dXIuX193YmluZGdlbl9leHRlcm5yZWZzLmdldChlKTtyZXR1cm4gdXIuX19leHRlcm5yZWZfdGFibGVfZGVhbGxvYyhlKSx0fWxldCBhcj1uZXcgVGV4dERlY29kZXIoInV0Zi04Iix7aWdub3JlQk9NOiEwLGZhdGFsOiEwfSk7YXIuZGVjb2RlKCk7Y29uc3QgY3I9MjE0NjQzNTA3MjtsZXQgbHI9MDtjb25zdCBmcj1uZXcgVGV4dEVuY29kZXI7ImVuY29kZUludG8iaW4gZnJ8fChmci5lbmNvZGVJbnRvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1mci5lbmNvZGUoZSk7cmV0dXJuIHQuc2V0KG4pLHtyZWFkOmUubGVuZ3RoLHdyaXR0ZW46bi5sZW5ndGh9fSk7bGV0IHVyLF9yPTA7ZnVuY3Rpb24gZ3IoZSx0KXtyZXR1cm4gdXI9ZS5leHBvcnRzLEhuPW51bGwsWm49bnVsbCxRbj1udWxsLHVyLl9fd2JpbmRnZW5fc3RhcnQoKSx1cn1hc3luYyBmdW5jdGlvbiBocihlKXtpZih2b2lkIDAhPT11cilyZXR1cm4gdXI7dm9pZCAwIT09ZSYmKE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PU9iamVjdC5wcm90b3R5cGU/KHttb2R1bGVfb3JfcGF0aDplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpLHZvaWQgMD09PWUmJihlPW5ldyBVUkwoImtjbF93YXNtX2xpYl9iZy53YXNtIixkb2N1bWVudC5jdXJyZW50U2NyaXB0JiYiU0NSSVBUIj09PWRvY3VtZW50LmN1cnJlbnRTY3JpcHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpJiZkb2N1bWVudC5jdXJyZW50U2NyaXB0LnNyY3x8bmV3IFVSTCgid29ya2VyLXdlYnJ0Yy5qcyIsZG9jdW1lbnQuYmFzZVVSSSkuaHJlZikpO2NvbnN0IHQ9dm4oKTsoInN0cmluZyI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgUmVxdWVzdCYmZSBpbnN0YW5jZW9mIFJlcXVlc3R8fCJmdW5jdGlvbiI9PXR5cGVvZiBVUkwmJmUgaW5zdGFuY2VvZiBVUkwpJiYoZT1mZXRjaChlKSk7Y29uc3R7aW5zdGFuY2U6bixtb2R1bGU6cn09YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgUmVzcG9uc2UmJmUgaW5zdGFuY2VvZiBSZXNwb25zZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlU3RyZWFtaW5nKXRyeXtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmcoZSx0KX1jYXRjaCh0KXtpZighZS5va3x8IWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlImJhc2ljIjpjYXNlImNvcnMiOmNhc2UiZGVmYXVsdCI6cmV0dXJuITB9cmV0dXJuITF9KGUudHlwZSl8fCJhcHBsaWNhdGlvbi93YXNtIj09PWUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpKXRocm93IHQ7Y29uc29sZS53YXJuKCJgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGVTdHJlYW1pbmdgIGZhaWxlZCBiZWNhdXNlIHlvdXIgc2VydmVyIGRvZXMgbm90IHNlcnZlIFdhc20gd2l0aCBgYXBwbGljYXRpb24vd2FzbWAgTUlNRSB0eXBlLiBGYWxsaW5nIGJhY2sgdG8gYFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlYCB3aGljaCBpcyBzbG93ZXIuIE9yaWdpbmFsIGVycm9yOlxuIix0KX1jb25zdCBuPWF3YWl0IGUuYXJyYXlCdWZmZXIoKTtyZXR1cm4gYXdhaXQgV2ViQXNzZW1ibHkuaW5zdGFudGlhdGUobix0KX17Y29uc3Qgbj1hd2FpdCBXZWJBc3NlbWJseS5pbnN0YW50aWF0ZShlLHQpO3JldHVybiBuIGluc3RhbmNlb2YgV2ViQXNzZW1ibHkuSW5zdGFuY2U/e2luc3RhbmNlOm4sbW9kdWxlOmV9Om59fShhd2FpdCBlLHQpO3JldHVybiBncihuKX12YXIgYnI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQ29udGV4dDptbixJbnRvVW5kZXJseWluZ0J5dGVTb3VyY2U6U24sSW50b1VuZGVybHlpbmdTaW5rOkJuLEludG9VbmRlcmx5aW5nU291cmNlOnhuLExzcFNlcnZlckNvbmZpZzpFbixSZXNwb25zZUNvbnRleHQ6VW4sVGFuZ2VudGlhbEFyY0luZm9PdXRwdXRXYXNtOk9uLFdhc21DaXJjbGVQYXJhbXM6Tm4sYmFzZTY0X2RlY29kZTpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIuYmFzZTY0X2RlY29kZSh0LG4pO2lmKHJbM10pdGhyb3cgc3IoclsyXSk7dmFyIGk9cW4oclswXSxyWzFdKS5zbGljZSgpO3JldHVybiB1ci5fX3diaW5kZ2VuX2ZyZWUoclswXSwxKnJbMV0sMSksaX0sY2FsY3VsYXRlX2NpcmNsZV9mcm9tXzNfcG9pbnRzOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXtjb25zdCBzPXVyLmNhbGN1bGF0ZV9jaXJjbGVfZnJvbV8zX3BvaW50cyhlLHQsbixyLGksbyk7cmV0dXJuIE5uLl9fd3JhcChzKX0sY2hhbmdlX2RlZmF1bHRfdW5pdHM6ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3IsZj11ci5jaGFuZ2VfZGVmYXVsdF91bml0cyhzLGEsYyxsKTt2YXIgaT1mWzBdLG89ZlsxXTtpZihmWzNdKXRocm93IGk9MCxvPTAsc3IoZlsyXSk7cmV0dXJuIG49aSxyPW8sWG4oaSxvKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxjaGFuZ2VfZXhwZXJpbWVudGFsX2ZlYXR1cmVzOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxsPV9yLGY9dXIuY2hhbmdlX2V4cGVyaW1lbnRhbF9mZWF0dXJlcyhzLGEsYyxsKTt2YXIgaT1mWzBdLG89ZlsxXTtpZihmWzNdKXRocm93IGk9MCxvPTAsc3IoZlsyXSk7cmV0dXJuIG49aSxyPW8sWG4oaSxvKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxjaGFuZ2Vfa2NsX3ZlcnNpb246ZnVuY3Rpb24oZSx0KXtsZXQgbixyO3RyeXtjb25zdCBzPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxhPV9yLGM9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGw9X3IsZj11ci5jaGFuZ2Vfa2NsX3ZlcnNpb24ocyxhLGMsbCk7dmFyIGk9ZlswXSxvPWZbMV07aWYoZlszXSl0aHJvdyBpPTAsbz0wLHNyKGZbMl0pO3JldHVybiBuPWkscj1vLFhuKGksbyl9ZmluYWxseXt1ci5fX3diaW5kZ2VuX2ZyZWUobixyLDEpfX0sZGVmYXVsdF9hcHBfc2V0dGluZ3M6ZnVuY3Rpb24oKXtjb25zdCBlPXVyLmRlZmF1bHRfYXBwX3NldHRpbmdzKCk7aWYoZVsyXSl0aHJvdyBzcihlWzFdKTtyZXR1cm4gc3IoZVswXSl9LGRlZmF1bHRfcHJvamVjdF9zZXR0aW5nczpmdW5jdGlvbigpe2NvbnN0IGU9dXIuZGVmYXVsdF9wcm9qZWN0X3NldHRpbmdzKCk7aWYoZVsyXSl0aHJvdyBzcihlWzFdKTtyZXR1cm4gc3IoZVswXSl9LGZvcm1hdF9udW1iZXJfbGl0ZXJhbDpmdW5jdGlvbihlLHQsbil7bGV0IHIsaTt0cnl7Y29uc3QgYT1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYz1fcixsPXVyLmZvcm1hdF9udW1iZXJfbGl0ZXJhbChlLGEsYyxucihuKT80Mjk0OTY3Mjk3Om4+Pj4wKTt2YXIgbz1sWzBdLHM9bFsxXTtpZihsWzNdKXRocm93IG89MCxzPTAsc3IobFsyXSk7cmV0dXJuIHI9byxpPXMsWG4obyxzKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShyLGksMSl9fSxmb3JtYXRfbnVtYmVyX3ZhbHVlOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPXVyLmZvcm1hdF9udW1iZXJfdmFsdWUoZSxzLGEpO3ZhciBpPWNbMF0sbz1jWzFdO2lmKGNbM10pdGhyb3cgaT0wLG89MCxzcihjWzJdKTtyZXR1cm4gbj1pLHI9byxYbihpLG8pfWZpbmFsbHl7dXIuX193YmluZGdlbl9mcmVlKG4sciwxKX19LGdldF9rY2xfdmVyc2lvbjpmdW5jdGlvbigpe2xldCBlLHQ7dHJ5e2NvbnN0IG49dXIuZ2V0X2tjbF92ZXJzaW9uKCk7cmV0dXJuIGU9blswXSx0PW5bMV0sWG4oblswXSxuWzFdKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShlLHQsMSl9fSxnZXRfdGFuZ2VudGlhbF9hcmNfdG9faW5mbzpmdW5jdGlvbihlLHQsbixyLGksbyxzKXtjb25zdCBhPXVyLmdldF90YW5nZW50aWFsX2FyY190b19pbmZvKGUsdCxuLHIsaSxvLHMpO3JldHVybiBPbi5fX3dyYXAoYSl9LGh1bWFuX2Rpc3BsYXlfbnVtYmVyOmZ1bmN0aW9uKGUsdCl7bGV0IG4scjt0cnl7Y29uc3Qgcz1vcih0LHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcixjPXVyLmh1bWFuX2Rpc3BsYXlfbnVtYmVyKGUscyxhKTt2YXIgaT1jWzBdLG89Y1sxXTtpZihjWzNdKXRocm93IGk9MCxvPTAsc3IoY1syXSk7cmV0dXJuIG49aSxyPW8sWG4oaSxvKX1maW5hbGx5e3VyLl9fd2JpbmRnZW5fZnJlZShuLHIsMSl9fSxpbXBvcnRfZmlsZV9leHRlbnNpb25zOmZ1bmN0aW9uKCl7Y29uc3QgZT11ci5pbXBvcnRfZmlsZV9leHRlbnNpb25zKCk7aWYoZVszXSl0aHJvdyBzcihlWzJdKTt2YXIgdD1ZbihlWzBdLGVbMV0pLnNsaWNlKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZnJlZShlWzBdLDQqZVsxXSw0KSx0fSxpc19rY2xfZW1wdHlfb3Jfb25seV9zZXR0aW5nczpmdW5jdGlvbihlKXtjb25zdCB0PW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxuPV9yLHI9dXIuaXNfa2NsX2VtcHR5X29yX29ubHlfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0saXNfcG9pbnRzX2NjdzpmdW5jdGlvbihlKXtjb25zdCB0PWlyKGUsdXIuX193YmluZGdlbl9tYWxsb2MpLG49X3I7cmV0dXJuIHVyLmlzX3BvaW50c19jY3codCxuKX0sa2NsX2xpbnQ6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcjtyZXR1cm4gdXIua2NsX2xpbnQodCxuKX0sa2NsX3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5rY2xfc2V0dGluZ3ModCxuKTtpZihyWzJdKXRocm93IHNyKHJbMV0pO3JldHVybiBzcihyWzBdKX0sbHNwX3J1bl9jb3BpbG90OmZ1bmN0aW9uKGUsdCxuKXtQbihlLEVuKTt2YXIgcj1lLl9fZGVzdHJveV9pbnRvX3JhdygpO2NvbnN0IGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcjtyZXR1cm4gdXIubHNwX3J1bl9jb3BpbG90KHIsaSxvLHMsYSl9LGxzcF9ydW5fa2NsOmZ1bmN0aW9uKGUsdCxuKXtQbihlLEVuKTt2YXIgcj1lLl9fZGVzdHJveV9pbnRvX3JhdygpO2NvbnN0IGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3Iscz1vcihuLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksYT1fcjtyZXR1cm4gdXIubHNwX3J1bl9rY2wocixpLG8scyxhKX0sbm9kZV9wYXRoX2Zyb21fcmFuZ2U6ZnVuY3Rpb24oZSx0KXtjb25zdCBuPW9yKGUsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxyPV9yLGk9b3IodCx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG89X3I7cmV0dXJuIHVyLm5vZGVfcGF0aF9mcm9tX3JhbmdlKG4scixpLG8pfSxwYXJzZV9hcHBfc2V0dGluZ3M6ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnBhcnNlX2FwcF9zZXR0aW5ncyh0LG4pO2lmKHJbMl0pdGhyb3cgc3IoclsxXSk7cmV0dXJuIHNyKHJbMF0pfSxwYXJzZV9wcm9qZWN0X3NldHRpbmdzOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9b3IoZSx1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLG49X3Iscj11ci5wYXJzZV9wcm9qZWN0X3NldHRpbmdzKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9LHBhcnNlX3dhc206SW4scG9pbnRfdG9fdW5pdDpmdW5jdGlvbihlLHQsbil7Y29uc3Qgcj1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksaT1fcixvPW9yKHQsdXIuX193YmluZGdlbl9tYWxsb2MsdXIuX193YmluZGdlbl9yZWFsbG9jKSxzPV9yLGE9b3Iobix1ci5fX3diaW5kZ2VuX21hbGxvYyx1ci5fX3diaW5kZ2VuX3JlYWxsb2MpLGM9X3IsbD11ci5wb2ludF90b191bml0KHIsaSxvLHMsYSxjKTtpZihsWzNdKXRocm93IHNyKGxbMl0pO3ZhciBmLHUsXz0oZj1sWzBdLHU9bFsxXSxmPj4+PTAsR24oKS5zdWJhcnJheShmLzgsZi84K3UpKS5zbGljZSgpO3JldHVybiB1ci5fX3diaW5kZ2VuX2ZyZWUobFswXSw4KmxbMV0sOCksX30scmVjYXN0X3dhc206ZnVuY3Rpb24oZSl7Y29uc3QgdD1vcihlLHVyLl9fd2JpbmRnZW5fbWFsbG9jLHVyLl9fd2JpbmRnZW5fcmVhbGxvYyksbj1fcixyPXVyLnJlY2FzdF93YXNtKHQsbik7aWYoclsyXSl0aHJvdyBzcihyWzFdKTtyZXR1cm4gc3IoclswXSl9LHJlbGV2YW50X2ZpbGVfZXh0ZW5zaW9uczpmdW5jdGlvbigpe2NvbnN0IGU9dXIucmVsZXZhbnRfZmlsZV9leHRlbnNpb25zKCk7aWYoZVszXSl0aHJvdyBzcihlWzJdKTt2YXIgdD1ZbihlWzBdLGVbMV0pLnNsaWNlKCk7cmV0dXJuIHVyLl9fd2JpbmRnZW5fZnJlZShlWzBdLDQqZVsxXSw0KSx0fSxzZXJpYWxpemVfY29uZmlndXJhdGlvbjpmdW5jdGlvbihlKXtjb25zdCB0PXVyLnNlcmlhbGl6ZV9jb25maWd1cmF0aW9uKGUpO2lmKHRbMl0pdGhyb3cgc3IodFsxXSk7cmV0dXJuIHNyKHRbMF0pfSxzZXJpYWxpemVfcHJvamVjdF9jb25maWd1cmF0aW9uOmZ1bmN0aW9uKGUpe2NvbnN0IHQ9dXIuc2VyaWFsaXplX3Byb2plY3RfY29uZmlndXJhdGlvbihlKTtpZih0WzJdKXRocm93IHNyKHRbMV0pO3JldHVybiBzcih0WzBdKX0sc2tldGNoX2NoZWNrcG9pbnRfbGltaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdXIuc2tldGNoX2NoZWNrcG9pbnRfbGltaXQoKT4+PjB9LGluaXRTeW5jOmZ1bmN0aW9uKGUpe2lmKHZvaWQgMCE9PXVyKXJldHVybiB1cjt2b2lkIDAhPT1lJiYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09T2JqZWN0LnByb3RvdHlwZT8oe21vZHVsZTplfT1lKTpjb25zb2xlLndhcm4oInVzaW5nIGRlcHJlY2F0ZWQgcGFyYW1ldGVycyBmb3IgYGluaXRTeW5jKClgOyBwYXNzIGEgc2luZ2xlIG9iamVjdCBpbnN0ZWFkIikpO2NvbnN0IHQ9dm4oKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFdlYkFzc2VtYmx5Lk1vZHVsZXx8KGU9bmV3IFdlYkFzc2VtYmx5Lk1vZHVsZShlKSksZ3IobmV3IFdlYkFzc2VtYmx5Lkluc3RhbmNlKGUsdCkpfSxkZWZhdWx0OmhyfSk7bGV0IGRyO2NvbnN0IHdyPXtmaXJlTW9kZWxpbmdDb21tYW5kRnJvbVdhc20oZSx0LG4scil7fSxzZW5kTW9kZWxpbmdDb21tYW5kRnJvbVdhc206YXN5bmMoZSx0LG4scik9Pihwb3N0TWVzc2FnZSh7dG86IndlYnNvY2tldCIscGF5bG9hZDp7dHlwZToic2VuZCIsZGF0YTpufX0pLGRyPy5zZW5kKG4pLG5ldyBQcm9taXNlKCh0PT57Y29uc3Qgbj1yPT57aWYoci5kYXRhLmluZGV4T2YoZSk8MClyZXR1cm47Y29uc3QgaT0obz1KU09OLnBhcnNlKHIuZGF0YSksbmV3IGYocykuZW5jb2RlU2hhcmVkUmVmKG8pKTt2YXIgbyxzO3QoaSksZHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbil9O2RyLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG4pfSkpKSxhc3luYyBzdGFydE5ld1Nlc3Npb24oKXt9fTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLChlPT57Y29uc3QgdD1lLmRhdGE7c3dpdGNoKHQudG8pe2Nhc2Uid29ya2VyIjpyZXR1cm4gdm9pZCgic3RhcnQiPT09dC5wYXlsb2FkLnR5cGUmJihhc3luYyBlPT57YXdhaXQgZmV0Y2gobmV3IFVSTCgiL2tjbF93YXNtX2xpYl9iZy53YXNtIixsb2NhdGlvbi5vcmlnaW4pKS50aGVuKChlPT5lLmFycmF5QnVmZmVyKCkpKS50aGVuKChlPT5ocih7bW9kdWxlX29yX3BhdGg6ZX0pKSksZHI9bmV3IFdlYlNvY2tldCh5bi51cmxDb25zdHJ1Y3RGcm9tKHt3ZWJydGM6ITAsLi4uZX0pKSxkci5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwoKCk9Pnt5bi5hdXRoZW50aWNhdGUoe2NsaWVudDplLmNsaWVudH0sZHIpfSkse29uY2U6ITB9KSxkci5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZT0+e3Bvc3RNZXNzYWdlKHtmcm9tOiJ3ZWJzb2NrZXQiLHBheWxvYWQ6e3R5cGU6Im1lc3NhZ2UiLGRhdGE6ZS5kYXRhfX0pfSkpLHNldEludGVydmFsKCgoKT0+e2RyLnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmZHIuc2VuZChKU09OLnN0cmluZ2lmeSh7dHlwZToicGluZyJ9KSl9KSw0ZTMpfSkodC5wYXlsb2FkLmRhdGFbMF0pKTtjYXNlIndlYnNvY2tldCI6cmV0dXJuIHZvaWQgZHI/Llt0LnBheWxvYWQudHlwZV0oLi4udC5wYXlsb2FkLmRhdGEpO2Nhc2Uid2FzbSI6cmV0dXJuIHZvaWQoImV4ZWN1dGUiPT09dC5wYXlsb2FkLnR5cGU/KChlLHQ9e21haW5LY2xQYXRoTmFtZToibWFpbi5rY2wifSk9Pntjb25zdCBuPSJzdHJpbmciPT10eXBlb2YgZT8oaT1lLHtyZWFkRmlsZTphc3luYyBlPT4obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoaSksZXhpc3RzOmFzeW5jIGU9PiExLGdldEFsbEZpbGVzOmFzeW5jIGU9PltpXX0pOihyPWUse2FzeW5jIHJlYWRGaWxlKGUpe2NvbnN0IHQ9ci5nZXQoZSk/PyIiO3JldHVybihuZXcgVGV4dEVuY29kZXIpLmVuY29kZSh0KX0sZXhpc3RzOmFzeW5jIGU9PnIuaGFzKGUpLGdldEFsbEZpbGVzOmFzeW5jIGU9PkFycmF5LmZyb20oci52YWx1ZXMoKSl9KTt2YXIgcixpO2NvbnN0IG89InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5nZXQodC5tYWluS2NsUGF0aE5hbWUpLHM9bmV3IG1uKHdyLG4pLGE9SW4obylbMF07cmV0dXJuIHMuZXhlY3V0ZShKU09OLnN0cmluZ2lmeShhKSx0Lm1haW5LY2xQYXRoTmFtZSwie30iKX0pKHQucGF5bG9hZC5kYXRhWzBdLHQucGF5bG9hZC5kYXRhWzFdKS50aGVuKChlPT57cG9zdE1lc3NhZ2Uoe2Zyb206Indhc20iLHBheWxvYWQ6e3R5cGU6ImV4ZWN1dGUiLGRhdGE6ZX19KX0pKS5jYXRjaCgoZT0+e3Bvc3RNZXNzYWdlKHtmcm9tOiJ3YXNtIixwYXlsb2FkOnt0eXBlOiJleGVjdXRlIixkYXRhOmV9fSl9KSk6cG9zdE1lc3NhZ2UoYnJbdC5wYXlsb2FkLnR5cGVdKC4uLnQucGF5bG9hZC5kYXRhKSkpfX0pKX0oKTsKCg==",null,!1);const Pn=(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 Fn=function(t){return t[t.DOWN=0]="DOWN",t[t.UP=1]="UP",t}(Fn||{}),Qn=function(t){return t[t.MIDDLE=1]="MIDDLE",t[t.RIGHT=2]="RIGHT",t}(Qn||{});const On={[Fn.DOWN]:"camera_drag_start",[Fn.UP]:"camera_drag_end"},En={[Qn.MIDDLE]:"pan",[Qn.RIGHT]:"rotatetrackball"};class _n extends EventTarget{removeMouseEvents=()=>{};removeResizeObserver=()=>{};constructor(t){super(),this.zooClientArgs=t,this.workerWebRTC=new Mn,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.removeResizeObserver(),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()}async start(){const e=t=>{const n=t.data;"from"in n&&"websocket"===n.from&&"payload"in n&&"object"==typeof n.payload&&"data"in n.payload&&"string"==typeof n.payload.data&&n.payload.data.indexOf("auth_token_invalid")>=0&&(this.workerWebRTC.removeEventListener("message",e),this.zooClientArgs.client.oauth2.fetchAuthorizationCode())};this.zooClientArgs.client.oauth2.getAccessToken().then((t=>{var n;t?.token?.value&&(this.zooClientArgs.client.token=t?.token?.value),void 0===this.zooClientArgs.client.token&&(this.zooClientArgs.client.token="00000000-0000-0000-0000-000000000000"),this.workerWebRTC.addEventListener("message",e),this.workerWebRTC.postMessage({to:"worker",payload:{type:"start",data:[(n=this.zooClientArgs,JSON.parse(JSON.stringify(n)))]}})})).catch((e=>{"object"==typeof e&&"kind"in e&&[t.EErrorOAuth2.ErrorNoAuthCode,t.EErrorOAuth2.ErrorAccessTokenResponse].some((t=>t===e.kind))&&this.zooClientArgs.client.oauth2.fetchAuthorizationCode()}))}wasm(t,...e){return new Promise((n=>{const l=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&(this.workerWebRTC.removeEventListener("message",l),n(e.payload.data))};this.workerWebRTC.addEventListener("message",l),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,e={mainKclPathName:"main.kcl"})=>new Promise((n=>{const l=t=>{const e=t.data;"from"in e&&"wasm"===e.from&&"execute"===e.payload.type&&(this.workerWebRTC.removeEventListener("message",l),n(e.payload.data))};this.workerWebRTC.addEventListener("message",l),this.workerWebRTC.postMessage({to:"wasm",payload:{type:"execute",data:[t,e]}})}))}}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=gn.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;"from"in e&&"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=Fn.UP;const l=t=>l=>{const i=En[l.button];if(void 0===i)return;const o={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:On[t],interaction:i,window:{x:l.offsetX,y:l.offsetY}}})]};this.workerWebRTC.postMessage({to:"websocket",payload:o}),this.channel?.send(o.data[0]),e=l.button,n=t},i=l(Fn.DOWN),o=l(Fn.UP),c=t=>{const l=En[e];if(void 0===l)return;n=Fn.UP;const i={type:"send",data:[JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:On[n],interaction:l,window:{x:t.offsetX,y:t.offsetY}}})]};this.workerWebRTC.postMessage({to:"websocket",payload:i}),this.channel?.send(i.data[0])};let s=0;const a=Pn((t=>{n===Fn.DOWN&&this.channel?.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"camera_drag_move",interaction:En[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),d=Pn((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*50}}))}),1e3/30),b=e=>{this.channel=e.channel,t.addEventListener("pointerdown",i),t.addEventListener("pointermove",a.fn),t.addEventListener("pointerup",o),t.addEventListener("pointerleave",c),t.addEventListener("wheel",d.fn,{passive:!1})};this.rtcPeerConnection.addEventListener("datachannel",b),this.removeMouseEvents=()=>{this.rtcPeerConnection.removeEventListener("datachannel",b),t.removeEventListener("pointerdown",i),t.removeEventListener("pointermove",a.fn),clearInterval(a.intervalId),t.removeEventListener("pointerup",o),t.removeEventListener("pointerleave",c),t.removeEventListener("wheel",d.fn),clearInterval(d.intervalId)}}resize(t){window.requestAnimationFrame((()=>{this.send(JSON.stringify({type:"modeling_cmd_req",cmd_id:"00000000-0000-0000-0000-000000000000",cmd:{type:"reconfigure_stream",...t,fps:30}}))}))}addResizeObserver(t){const e=t.querySelector("video"),n=Pn((t=>{for(const n of t){const t=n.contentRect.width-n.contentRect.width%4,l=n.contentRect.height-n.contentRect.height%4;e.width=t,e.height=l,this.resize({width:t,height:l})}}),62.5),l=new ResizeObserver(n.fn);l.observe(t),this.removeResizeObserver=()=>{clearInterval(n.intervalId),l.disconnect()}}send(...t){return new Promise((e=>{const n=t=>{const l=t.data;"from"in l&&"websocket"===l.from&&(this.workerWebRTC.removeEventListener("message",n),e(l.payload.data))};this.workerWebRTC.addEventListener("message",n),this.workerWebRTC.postMessage({to:"websocket",payload:{type:"send",data:t}})}))}}const Dn={get_api_call:async function({client:t,id:e}){const l=`/api-calls/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_api_call_for_org:async function({client:t,id:e}){const l=`/org/api-calls/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_api_call_for_user:async function({client:t,id:e}){const l=`/user/api-calls/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_async_operation:async function({client:t,id:e}){const l=`/async/operations/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_api_calls_for_user:a,list_api_calls_for_user_pager:function(t){return s(a,t,"page_token")},org_list_api_calls:d,org_list_api_calls_pager:function(t){return s(d,t,"page_token")},user_list_api_calls:b,user_list_api_calls_pager:function(t){return s(b,t,"page_token")}},An={create_api_token_for_user:async function({client:t,label:e}){const l="/user/api-tokens"+n({label:e}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_api_token_for_user:async function({client:t,token:e}){const l=`/user/api-tokens/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},get_api_token_for_user:async function({client:t,token:e}){const l=`/user/api-tokens/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_api_tokens_for_user:Z,list_api_tokens_for_user_pager:function(t){return s(Z,t,"page_token")}},$n={apps_github_callback:async function({client:t}={}){const e="/apps/github/callback"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},apps_github_consent:async function({client:t}={}){const e="/apps/github/consent"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},apps_github_webhook:async function({client:t,body:e}){const l="/apps/github/webhook"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/octet-stream";const a={method:"POST",headers:s,body:e},d=t?.fetch||fetch,b=await d(i,a);await o(b)}},qn={create_executor_term:class{constructor(){}static urlConstructFrom(t){const e="/ws/executor/term"+n({}),l=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(l)}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 Gn.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 Gn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}if(Vn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}return e}},create_file_execution:async function({client:t,lang:e,output:l,body:i}){const c=`/file/execute/${e}`+n({output:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:i},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()}},tl={create_file_center_of_mass:async function({client:t,src_format:e,output_unit:l,body:i}){const c="/file/center-of-mass"+n({src_format:e,output_unit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:i},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},create_file_conversion:async function({client:t,src_format:e,output_format:l,body:i}){const c=`/file/conversion/${e}/${l}`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:i},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},create_file_conversion_options:async function({client:t,files:e,body:l}){const i="/file/conversion"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)})),d.append("event",JSON.stringify(l));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,r=await Z(c,b);return await o(r),await r.json()},create_file_density:async function({client:t,src_format:e,material_mass:l,material_mass_unit:i,output_unit:c,body:s}){const a="/file/density"+n({src_format:e,material_mass:l,material_mass_unit:i,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`),Z["Content-Type"]="application/octet-stream";const r={method:"POST",headers:Z,body:s},m=t?.fetch||fetch,u=await m(d,r);return await o(u),await u.json()},create_file_mass:async function({client:t,src_format:e,material_density:l,material_density_unit:i,output_unit:c,body:s}){const a="/file/mass"+n({src_format:e,material_density:l,material_density_unit:i,output_unit:c}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`),Z["Content-Type"]="application/octet-stream";const r={method:"POST",headers:Z,body:s},m=t?.fetch||fetch,u=await m(d,r);return await o(u),await u.json()},create_file_surface_area:async function({client:t,src_format:e,output_unit:l,body:i}){const c="/file/surface-area"+n({src_format:e,output_unit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:i},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},create_file_volume:async function({client:t,src_format:e,output_unit:l,body:i}){const c="/file/volume"+n({src_format:e,output_unit:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/octet-stream";const b={method:"POST",headers:d,body:i},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()}},el={community_sso:async function({client:t,sso:e,sig:l}){const i="/community/sso"+n({sso:e,sig:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_ipinfo:async function({client:t}={}){const e="/_meta/ipinfo"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_pricing_subscriptions:async function({client:t}={}){const e="/pricing/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_schema:async function({client:t}={}){const e="/"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},internal_get_api_token_for_discord_user:async function({client:t,discord_id:e}){const l=`/internal/discord/api-token/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},ping:async function({client:t}={}){const e="/ping"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()}},nl={create_custom_model:async function({client:t,body:e}){const l="/ml/custom/models"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_kcl_code_completions:async function({client:t,body:e}){const l="/ml/kcl/completions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_proprietary_to_kcl:async function({client:t,files:e,code_option:l}){const i="/ml/convert/proprietary-to-kcl"+n({code_option:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,r=await Z(c,b);return await o(r),await r.json()},create_text_to_cad:async function({client:t,output_format:e,kcl:l,body:i}){const c=`/ai/text-to-cad/${e}`+n({kcl:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/json";const b={method:"POST",headers:d,body:JSON.stringify(i)},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},create_text_to_cad_iteration:async function({client:t,body:e}){const l="/ml/text-to-cad/iteration"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_text_to_cad_multi_file_iteration:async function({client:t,files:e,body:l}){const i="/ml/text-to-cad/multi-file/iteration"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)})),d.append("event",JSON.stringify(l));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,r=await Z(c,b);return await o(r),await r.json()},create_text_to_cad_part_feedback:async function({client:t,id:e,feedback:l}){const i=`/user/text-to-cad/${e}`+n({feedback:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},get_custom_model:async function({client:t,id:e}){const l=`/ml/custom/models/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_text_to_cad_part_for_user:async function({client:t,id:e}){const l=`/user/text-to-cad/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_conversations_for_user:Wn,list_conversations_for_user_pager:function(t){return s(Wn,t,"page_token")},list_org_datasets_for_model:async function({client:t,id:e}){const l=`/ml/custom/models/${e}/datasets`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_text_to_cad_parts_for_user:fn,list_text_to_cad_parts_for_user_pager:function(t){return s(fn,t,"page_token")},ml_copilot_ws:class{constructor(){}static urlConstructFrom(t){const e="/ws/ml/copilot"+n({replay:t.replay,conversation_id:t.conversation_id,pr:t.pr}),l=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(l)}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 Gn.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 Gn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}if(Vn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}return e}},ml_reasoning_ws:class{constructor(){}static urlConstructFrom(t){const e=`/ws/ml/reasoning/${t.id}`+n({}),l=((t.client?.baseUrl||"https://api.zoo.dev")+e).replace(/^http/,"ws");return new URL(l)}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 Gn.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 Gn.deserialize(t)}if(e instanceof ArrayBuffer){const t=new Uint8Array(e);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}if(Vn(e)){const t=new Uint8Array(e.buffer,e.byteOffset,e.byteLength);try{const e=(new TextDecoder).decode(t);return JSON.parse(e)}catch{}return Gn.deserialize(t)}return e}},update_custom_model:async function({client:t,id:e,body:l}){const i=`/ml/custom/models/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()}},ll={modeling_commands_ws:gn},il={approve_oauth2_authorization_request:async function({client:t,request_id:e}){const l=`/oauth2/authorization-requests/${e}/approve`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_org_oauth2_app:async function({client:t,body:e}){const l="/org/oauth2/apps"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_user_oauth2_app:async function({client:t,body:e}){const l="/user/oauth2/apps"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_org_oauth2_app:async function({client:t,client_id:e}){const l=`/org/oauth2/apps/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},delete_user_oauth2_app:async function({client:t,client_id:e}){const l=`/user/oauth2/apps/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},deny_oauth2_authorization_request:async function({client:t,request_id:e}){const l=`/oauth2/authorization-requests/${e}/deny`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},device_access_token:async function({client:t,body:e}){const i="/oauth2/device/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:l(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},device_auth_confirm:async function({client:t,body:e}){const l="/oauth2/device/confirm"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);await o(b)},device_auth_request:async function({client:t,body:e}){const i="/oauth2/device/auth"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:l(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},device_auth_verify:async function({client:t,user_code:e,app_name:l}){const i="/oauth2/device/verify"+n({user_code:e,app_name:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_oauth2_authorization_request:async function({client:t,request_id:e}){const l=`/oauth2/authorization-requests/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_org_oauth2_app:async function({client:t,client_id:e}){const l=`/org/oauth2/apps/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_user_oauth2_app:async function({client:t,client_id:e}){const l=`/user/oauth2/apps/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_oauth2_apps_for_any_org:Yn,list_oauth2_apps_for_any_org_pager:function(t){return s(Yn,t,"page_token")},list_oauth2_apps_for_any_user:In,list_oauth2_apps_for_any_user_pager:function(t){return s(In,t,"page_token")},list_org_oauth2_apps:Rn,list_org_oauth2_apps_pager:function(t){return s(Rn,t,"page_token")},list_user_oauth2_apps:Jn,list_user_oauth2_apps_pager:function(t){return s(Jn,t,"page_token")},oauth2_authorize:async function({client:t,response_type:e,client_id:l,redirect_uri:i,state:c,scope:s,code_challenge:a,code_challenge_method:d}){const b="/oauth2/authorize"+n({response_type:e,client_id:l,redirect_uri:i,state:c,scope:s,code_challenge:a,code_challenge_method:d}),Z=(t?.baseUrl||"https://api.zoo.dev")+b,r=t&&t.token||"",m={};r&&(m.Authorization=`Bearer ${r}`);const u={method:"GET",headers:m},h=t?.fetch||fetch,p=await h(Z,u);return await o(p),await p.json()},oauth2_provider_callback:async function({client:t,provider:e,code:l,state:i,id_token:c,user:s}){const a=`/oauth2/provider/${e}/callback`+n({code:l,state:i,id_token:c,user:s}),d=(t?.baseUrl||"https://api.zoo.dev")+a,b=t&&t.token||"",Z={};b&&(Z.Authorization=`Bearer ${b}`);const r={method:"GET",headers:Z},m=t?.fetch||fetch,u=await m(d,r);return await o(u),await u.json()},oauth2_provider_callback_post:async function({client:t,provider:e,body:i}){const c=`/oauth2/provider/${e}/callback`+n({}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/x-www-form-urlencoded";const b={method:"POST",headers:d,body:l(i)},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},oauth2_provider_consent:async function({client:t,provider:e,callback_url:l}){const i=`/oauth2/provider/${e}/consent`+n({callback_url:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},oauth2_token:async function({client:t,body:e}){const i="/oauth2/token"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:l(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},oauth2_token_revoke:async function({client:t,body:e}){const i="/oauth2/token/revoke"+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/x-www-form-urlencoded";const d={method:"POST",headers:a,body:l(e)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_org_oauth2_app:async function({client:t,client_id:e,body:l}){const i=`/org/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_user_oauth2_app:async function({client:t,client_id:e,body:l}){const i=`/user/oauth2/apps/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},verify_oauth_account_linking:async function({client:t,token:e,callback_url:l}){const i="/oauth2/verify-account-linking"+n({token:e,callback_url:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()}},ol={create_org:async function({client:t,body:e}){const l="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_org_dataset:async function({client:t,body:e}){const l="/org/datasets"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_org_member:async function({client:t,body:e}){const l="/org/members"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_org_saml_idp:async function({client:t,body:e}){const l="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_org:async function({client:t}={}){const e="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},delete_org_dataset:async function({client:t,id:e}){const l=`/org/datasets/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},delete_org_member:async function({client:t,user_id:e}){const l=`/org/members/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},delete_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},download_org_dataset_conversion_original:async function({client:t,id:e,conversion_id:l}){const i=`/org/datasets/${e}/conversions/${l}/original`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},download_org_dataset_successful_kcl_bulk:async function({client:t,id:e}){const l=`/org/datasets/${e}/bulk-download/kcl`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_billing_contract_for_any_org:async function({client:t,id:e}){const l=`/orgs/${e}/billing/contract`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_org:async function({client:t}={}){const e="/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_org_dataset:async function({client:t,id:e}){const l=`/org/datasets/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_org_dataset_conversion:async function({client:t,id:e,conversion_id:l}){const i=`/org/datasets/${e}/conversions/${l}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_org_dataset_conversion_stats:async function({client:t,id:e}){const l=`/org/datasets/${e}/stats`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_org_member:async function({client:t,user_id:e}){const l=`/org/members/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_org_privacy_settings:async function({client:t}={}){const e="/org/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_org_saml_idp:async function({client:t}={}){const e="/org/saml/idp"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_org_shortlinks:Sn,get_org_shortlinks_pager:function(t){return s(Sn,t,"page_token")},get_user_org:async function({client:t}={}){const e="/user/org"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},list_org_dataset_conversions:Kn,list_org_dataset_conversions_pager:function(t){return s(Kn,t,"page_token")},list_org_datasets:Tn,list_org_datasets_pager:function(t){return s(Tn,t,"page_token")},list_org_members:Ln,list_org_members_pager:function(t){return s(Ln,t,"page_token")},org_admin_details_get:async function({client:t,id:e}){const l=`/orgs/${e}/admin/details`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},org_dataset_s3_policies:async function({client:t,uri:e,role_arn:l}){const i="/org/dataset/s3/policies"+n({uri:e,role_arn:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},retrigger_org_dataset:async function({client:t,id:e,statuses:l}){const i=`/org/datasets/${e}/retrigger`+n({statuses:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},retrigger_org_dataset_conversion:async function({client:t,id:e,conversion_id:l}){const i=`/org/datasets/${e}/conversions/${l}/retrigger`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"POST",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},search_org_dataset_conversions:zn,search_org_dataset_conversions_pager:function(t){return s(zn,t,"page_token")},search_org_dataset_semantic:async function({client:t,id:e,q:l,limit:i}){const c=`/org/datasets/${e}/search/semantic`+n({q:l,limit:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},update_org:async function({client:t,body:e}){const l="/org"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_org_dataset:async function({client:t,id:e,body:l}){const i=`/org/datasets/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_org_member:async function({client:t,user_id:e,body:l}){const i=`/org/members/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_org_privacy_settings:async function({client:t,body:e}){const l="/org/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_org_saml_idp:async function({client:t,body:e}){const l="/org/saml/idp"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},upload_org_dataset_files:async function({client:t,files:e,id:l}){const i=`/org/datasets/${l}/uploads`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"POST",headers:a,body:d},Z=t?.fetch||fetch,r=await Z(c,b);return await o(r),await r.json()},upsert_billing_contract_for_any_org:async function({client:t,id:e,body:l}){const i=`/orgs/${e}/billing/contract`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()}},cl={create_org_subscription:async function({client:t,body:e}){const l="/org/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_payment_information_for_org:async function({client:t,body:e}){const l="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_payment_information_for_user:async function({client:t,body:e}){const l="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},create_payment_intent_for_org:async function({client:t}={}){const e="/org/payment/intent"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},create_payment_intent_for_user:async function({client:t}={}){const e="/user/payment/intent"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},create_user_subscription:async function({client:t,body:e}){const l="/user/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},delete_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},delete_payment_method_for_org:async function({client:t,id:e}){const l=`/org/payment/methods/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},delete_payment_method_for_user:async function({client:t,id:e}){const l=`/user/payment/methods/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},get_org_subscription:async function({client:t}={}){const e="/org/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_payment_balance_for_any_org:async function({client:t,include_total_due:e,id:l}){const i=`/orgs/${l}/payment/balance`+n({include_total_due:e}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_payment_balance_for_any_user:async function({client:t,id:e,include_total_due:l}){const i=`/users/${e}/payment/balance`+n({include_total_due:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_payment_balance_for_org:async function({client:t,include_total_due:e}){const l="/org/payment/balance"+n({include_total_due:e}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_payment_balance_for_user:async function({client:t,include_total_due:e}){const l="/user/payment/balance"+n({include_total_due:e}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_payment_information_for_org:async function({client:t}={}){const e="/org/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_payment_information_for_user:async function({client:t}={}){const e="/user/payment"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_user_subscription:async function({client:t}={}){const e="/user/payment/subscriptions"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},list_invoices_for_org:xn,list_invoices_for_org_pager:function(t){return s(xn,t,"page_token")},list_invoices_for_user:Un,list_invoices_for_user_pager:function(t){return s(Un,t,"page_token")},list_payment_methods_for_org:async function({client:t}={}){const e="/org/payment/methods"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},list_payment_methods_for_user:async function({client:t}={}){const e="/user/payment/methods"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},redirect_payment_method_portal_link_for_org:async function({client:t,return_url:e}){const l="/org/payment/method-portal-link"+n({return_url:e}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},redirect_payment_method_portal_link_for_user:async function({client:t,return_url:e}){const l="/user/payment/method-portal-link"+n({return_url:e}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},set_default_payment_method_for_user:async function({client:t,id:e}){const l=`/user/payment/methods/${e}/default`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},update_org_subscription:async function({client:t,body:e}){const l="/org/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_org_subscription_for_any_org:async function({client:t,id:e,body:l}){const i=`/orgs/${e}/payment/subscriptions`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_payment_balance_for_any_org:async function({client:t,id:e,include_total_due:l,body:i}){const c=`/orgs/${e}/payment/balance`+n({include_total_due:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/json";const b={method:"PUT",headers:d,body:JSON.stringify(i)},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},update_payment_balance_for_any_user:async function({client:t,id:e,include_total_due:l,body:i}){const c=`/users/${e}/payment/balance`+n({include_total_due:l}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`),d["Content-Type"]="application/json";const b={method:"PUT",headers:d,body:JSON.stringify(i)},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},update_payment_information_for_org:async function({client:t,body:e}){const l="/org/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_payment_information_for_user:async function({client:t,body:e}){const l="/user/payment"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_user_subscription:async function({client:t,body:e}){const l="/user/payment/subscriptions"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},upsert_subscription_plan_price:async function({client:t,slug:e,body:l}){const i=`/subscription-plans/${e}/prices`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"POST",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},validate_customer_tax_information_for_org:async function({client:t}={}){const e="/org/payment/tax"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},validate_customer_tax_information_for_user:async function({client:t}={}){const e="/user/payment/tax"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)}},sl={create_project:async function({client:t,files:e}){const l="/user/projects"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a=new FormData;e.forEach((t=>{a.append(t.name,t.data,t.name)}));const d={method:"POST",headers:s,body:a},b=t?.fetch||fetch,Z=await b(i,d);return await o(Z),await Z.json()},create_project_share_link:async function({client:t,id:e,body:l}){const i=`/user/projects/${e}/share-links`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"POST",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},create_public_project_vote:async function({client:t,id:e}){const l=`/projects/public/${e}/vote`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_project:async function({client:t,id:e}){const l=`/user/projects/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},delete_project_share_link:async function({client:t,id:e,key:l}){const i=`/user/projects/${e}/share-links/${l}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"DELETE",headers:a},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},delete_public_project_vote:async function({client:t,id:e}){const l=`/projects/public/${e}/vote`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},download_project:async function({client:t,id:e,format:l}){const i=`/user/projects/${e}/download`+n({format:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},download_public_project:async function({client:t,id:e,format:l}){const i=`/projects/public/${e}/download`+n({format:l}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d={method:"GET",headers:a},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},get_project:async function({client:t,id:e}){const l=`/user/projects/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_project_thumbnail:async function({client:t,id:e}){const l=`/user/projects/${e}/thumbnail`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_public_project:async function({client:t,id:e}){const l=`/projects/public/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_public_project_thumbnail:async function({client:t,id:e}){const l=`/projects/public/${e}/thumbnail`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_project_categories:async function({client:t}={}){const e="/projects/categories"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},list_project_share_links:async function({client:t,id:e}){const l=`/user/projects/${e}/share-links`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_projects:async function({client:t}={}){const e="/user/projects"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},list_public_projects:async function({client:t}={}){const e="/projects/public"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},publish_project:async function({client:t,id:e}){const l=`/user/projects/${e}/publish`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_project:async function({client:t,files:e,id:l}){const i=`/user/projects/${l}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`);const d=new FormData;e.forEach((t=>{d.append(t.name,t.data,t.name)}));const b={method:"PUT",headers:a,body:d},Z=t?.fetch||fetch,r=await Z(c,b);return await o(r),await r.json()}},al={create_service_account_for_org:async function({client:t,label:e}){const l="/org/service-accounts"+n({label:e}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"POST",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_service_account_for_org:async function({client:t,token:e}){const l=`/org/service-accounts/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},get_service_account_for_org:async function({client:t,token:e}){const l=`/org/service-accounts/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},list_service_accounts_for_org:Nn,list_service_accounts_for_org_pager:function(t){return s(Nn,t,"page_token")}},dl={create_store_coupon:async function({client:t,body:e}){const l="/store/coupon"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()}},bl={get_angle_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/angle/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_area_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/area/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_current_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/current/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_energy_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/energy/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_force_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/force/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_frequency_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/frequency/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_length_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/length/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_mass_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/mass/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_power_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/power/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_pressure_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/pressure/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_temperature_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/temperature/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_torque_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/torque/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()},get_volume_unit_conversion:async function({client:t,input_unit:e,output_unit:l,value:i}){const c=`/unit/conversion/volume/${e}/${l}`+n({value:i}),s=(t?.baseUrl||"https://api.zoo.dev")+c,a=t&&t.token||"",d={};a&&(d.Authorization=`Bearer ${a}`);const b={method:"GET",headers:d},Z=t?.fetch||fetch,r=await Z(s,b);return await o(r),await r.json()}},Zl={create_user_shortlink:async function({client:t,body:e}){const l="/user/shortlinks"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},delete_user_self:async function({client:t}={}){const e="/user"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"DELETE",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},delete_user_shortlink:async function({client:t,key:e}){const l=`/user/shortlinks/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"DELETE",headers:s},d=t?.fetch||fetch,b=await d(i,a);await o(b)},get_oauth2_providers_for_user:async function({client:t}={}){const e="/user/oauth2/providers"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_session_for_user:async function({client:t,token:e}){const l=`/user/session/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_user:async function({client:t,id:e}){const l=`/users/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_user_cad_user_info_form:async function({client:t}={}){const e="/user/cad-user-info"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_user_extended:async function({client:t,id:e}){const l=`/users-extended/${e}`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},get_user_privacy_settings:async function({client:t}={}){const e="/user/privacy"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_user_self:async function({client:t}={}){const e="/user"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_user_self_extended:async function({client:t}={}){const e="/user/extended"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},get_user_shortlinks:wn,get_user_shortlinks_pager:function(t){return s(wn,t,"page_token")},put_public_email_marketing_consent_request:async function({client:t,body:e}){const l="/website/email-marketing-consent/request"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);await o(b)},put_public_mailing_list_subscribe:async function({client:t,slug:e,body:l}){const i=`/website/email-marketing-lists/${e}/subscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},put_public_mailing_list_unsubscribe:async function({client:t,slug:e,body:l}){const i=`/website/email-marketing-lists/${e}/unsubscribe`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},put_public_sales_form:async function({client:t,body:e}){const l="/website/forms/sales"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);await o(b)},put_public_support_form:async function({client:t,body:e}){const l="/website/forms/support"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);await o(b)},put_user_cad_user_info_form:async function({client:t,body:e}){const l="/website/forms/cad-user-info"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);await o(b)},report_user_client_error:async function({client:t,body:e}){const l="/user/client-errors"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"POST",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_subscription_for_user:async function({client:t,id:e,body:l}){const i=`/users/${e}/payment/subscriptions`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);return await o(Z),await Z.json()},update_user_privacy_settings:async function({client:t,body:e}){const l="/user/privacy"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_user_self:async function({client:t,body:e}){const l="/user"+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`),s["Content-Type"]="application/json";const a={method:"PUT",headers:s,body:JSON.stringify(e)},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},update_user_shortlink:async function({client:t,key:e,body:l}){const i=`/user/shortlinks/${e}`+n({}),c=(t?.baseUrl||"https://api.zoo.dev")+i,s=t&&t.token||"",a={};s&&(a.Authorization=`Bearer ${s}`),a["Content-Type"]="application/json";const d={method:"PUT",headers:a,body:JSON.stringify(l)},b=t?.fetch||fetch,Z=await b(c,d);await o(Z)},user_admin_details_get:async function({client:t,id:e}){const l=`/users/${e}/admin/details`+n({}),i=(t?.baseUrl||"https://api.zoo.dev")+l,c=t&&t.token||"",s={};c&&(s.Authorization=`Bearer ${c}`);const a={method:"GET",headers:s},d=t?.fetch||fetch,b=await d(i,a);return await o(b),await b.json()},user_email_marketing_consent_decline_post:async function({client:t}={}){const e="/user/email-marketing-consent/decline"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},user_email_marketing_consent_get:async function({client:t}={}){const e="/user/email-marketing-consent"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()},user_email_marketing_consent_request_post:async function({client:t}={}){const e="/user/email-marketing-consent/request"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},user_email_marketing_consent_seen_post:async function({client:t}={}){const e="/user/email-marketing-consent/seen"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"POST",headers:c},a=t?.fetch||fetch,d=await a(l,s);await o(d)},user_features_get:async function({client:t}={}){const e="/user/features"+n({}),l=(t?.baseUrl||"https://api.zoo.dev")+e,i=t&&t.token||"",c={};i&&(c.Authorization=`Bearer ${i}`);const s={method:"GET",headers:c},a=t?.fetch||fetch,d=await a(l,s);return await o(d),await d.json()}};exports.ApiError=i,exports.Client=class{constructor(t){const e="undefined"!=typeof process?process.env:void 0,n=e?.KITTYCAD_TOKEN||e?.KITTYCAD_API_TOKEN||e?.ZOO_AI_TOKEN,l=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.clientId=t.clientId,this.redirectUrl=t.redirectUrl,this.scopes=t.scopes,this.onAccessTokenExpiry=t.onAccessTokenExpiry,this.onInvalidGrant=t.onInvalidGrant),this.token??=n,this.baseUrl??=l,this.clientId&&"undefined"!=typeof localStorage&&(this.oauth2=this.createOAuth2Client(),this.oauth2.isHTTPDecoratorActive(!0),this.fetch=this.oauth2.decorateFetchHTTPClient(this.fetch||fetch))}authorize(t){return this.oauth2.fetchAuthorizationCode(t)}isReturningFromAuthServer(){return this.oauth2.isReturningFromAuthServer()}async getAccessToken(){const t=await this.oauth2.getAccessToken();return this.updateTokenFromAccessContext(t),t}resetOAuth2(){this.oauth2.reset(),this.token=void 0}createOAuth2Client(){const n=this.baseUrl||"https://api.zoo.dev",l=this.redirectUrl||("undefined"==typeof location?void 0:`${location.origin}${location.pathname}`);if(!l)throw new Error("OAuth2 requires redirectUrl when the current browser URL is unavailable.");return new t.OAuth2AuthCodePKCE({authorizationUrl:e(n,"/oauth2/authorize"),tokenUrl:e(n,"/oauth2/token"),clientId:this.clientId,redirectUrl:l,scopes:this.scopes||[],onAccessTokenExpiry:async t=>{const e=await(this.onAccessTokenExpiry?this.onAccessTokenExpiry(t):t());return this.updateTokenFromAccessContext(e),e},onInvalidGrant:this.onInvalidGrant||(()=>{})})}updateTokenFromAccessContext(t){t?.token?.value&&(this.token=t.token.value)}},exports.Pager=c,exports.WebRTC=_n,exports.api_calls=Dn,exports.api_tokens=An,exports.apps=$n,exports.createPager=s,exports.executor=qn,exports.file=tl,exports.meta=el,exports.ml=nl,exports.modeling=ll,exports.oauth2=il,exports.orgs=ol,exports.payments=cl,exports.projects=sl,exports.service_accounts=al,exports.store=dl,exports.unit=bl,exports.users=Zl;