@serenityjs/raknet 0.8.3 → 0.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var ne=Object.defineProperty;var Xe=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var d=(o,e)=>ne(o,"name",{value:e,configurable:!0});var et=(o,e)=>{for(var t in e)ne(o,t,{get:e[t],enumerable:!0})},tt=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Je(e))!Ye.call(o,i)&&i!==t&&ne(o,i,{get:()=>e[i],enumerable:!(n=Xe(e,i))||n.enumerable});return o};var nt=o=>tt(ne({},"__esModule",{value:!0}),o);var at={};et(at,{Ack:()=>k,Address:()=>u,BasePacket:()=>l,Bitflags:()=>I,ConnectedPing:()=>N,ConnectedPong:()=>D,Connection:()=>De,ConnectionRequest:()=>E,ConnectionRequestAccepted:()=>w,DGRAM_HEADER_SIZE:()=>ze,DGRAM_MTU_OVERHEAD:()=>Ae,DataType:()=>R,Disconnect:()=>J,Frame:()=>O,FrameSet:()=>_,IncompatibleProtocolVersion:()=>j,MAX_MTU_SIZE:()=>je,MIN_MTU_SIZE:()=>_e,MTU:()=>xe,Magic:()=>g,Nack:()=>Q,NewIncomingConnection:()=>F,Offline:()=>he,OpenConnectionReply1:()=>q,OpenConnectionReply2:()=>b,OpenConnectionRequest1:()=>U,OpenConnectionRequest2:()=>B,Packet:()=>a,Priority:()=>C,Proto:()=>f,RAKNET_PROTOCOL:()=>$,RAKNET_TICK_LEN:()=>Ue,RAKNET_TPS:()=>ct,Reliability:()=>m,Serialize:()=>p,Server:()=>pt,Status:()=>y,SystemAddress:()=>ve,UDP_HEADER_SIZE:()=>me,UnconnectedPing:()=>P,UnconnectedPong:()=>S});module.exports=nt(at);var ci=require("reflect-metadata");var H=require("@serenityjs/nbt");function f(o){return function(e){e.id=o;let t=Reflect.getOwnMetadata("properties",e.prototype),n=Object.getOwnPropertyNames(e.prototype);n.includes("serialize")||(e.prototype.serialize=function(){if(this.flush(),e.id_type.write(this,e.id),!t)return this.getBuffer();for(let{name:i,type:r,endian:s,parameter:c}of t)if(c){if(r.prototype===H.CompoundTag.prototype)throw new Error("Parameters are not supported for CompoundTag serialization.");let h=this[c],z=r,Ge=this[i];z.write(this,Ge,s,h)}else if(r.prototype===H.CompoundTag.prototype){let h=r,z=this[i];h.write(this,z,s)}else{let h=r,z=this[i];h.write(this,z,s)}return this.getBuffer()}),n.includes("deserialize")||(e.prototype.deserialize=function(){if(this.binary.length===0)return this;if(e.id_type.read(this),!t)return this;for(let{name:i,type:r,endian:s,parameter:c}of t)if(c){if(r.prototype===H.CompoundTag.prototype)throw new Error("Parameters are not supported for CompoundTag deserialization.");let h=this[c],z=r;this[i]=z.read(this,s,h)}else if(r.prototype===H.CompoundTag.prototype){let h=r;this[i]=h.read(this,s)}else{let h=r;this[i]=h.read(this,s)}return this}),n.includes("getId")||(e.prototype.getId=function(){return e.id}),n.includes("getIdType")||(e.prototype.getIdType=function(){return e.id_type})}}d(f,"Proto");var Ee=require("@serenityjs/binarystream");function p(o,e=Ee.Endianness.Big,t){if(!o)throw new Error("@Serialize() failed, no type provided.");return function(n,i){let r=Reflect.getMetadata("properties",n)||[];r.push({name:i,type:o,endian:e,parameter:t}),Reflect.defineMetadata("properties",r,n)}}d(p,"Serialize");var ye=require("@serenityjs/binarystream");var R=class{static{d(this,"DataType")}constructor(...e){}static read(e,t=ye.Endianness.Big,n){}static write(e,t,n=ye.Endianness.Big,i){}};var Fe=Buffer.from("\0\xFF\xFF\0\xFE\xFE\xFE\xFE\xFD\xFD\xFD\xFD4Vx","binary"),g=class extends R{static{d(this,"Magic")}static read(e){return e.readBuffer(Fe.length)}static write(e){e.writeBuffer(Fe)}};var xe=class extends R{static{d(this,"MTU")}static read(e){return e.getBuffer().byteLength}static write(e,t){e.writeBuffer(Buffer.alloc(t-e.getBuffer().length))}};var u=class o extends R{static{d(this,"Address")}address;port;version;constructor(e,t,n){super(),this.address=e,this.port=t,this.version=n}static fromIdentifier(e){return new o(e.address,e.port,e.family==="IPv4"?4:6)}static write(e,t){if(e.writeUint8(t.version),t.version===4){let n=t.address.split(".",4);for(let i of n)e.writeUint8(Number.parseInt(i,10)^255);e.writeUShort(t.port)}else if(t.version===6){e.writeUShort(23),e.writeUShort(t.port),e.writeUint32(0);let n=t.address.split(":");for(let i of n){let r=Number.parseInt(i,16);e.writeUShort(r^65535)}e.writeUint32(0)}}static read(e){let t=e.readUint8();if(t===4){let i=e.read(4).map(s=>(s^255).toString()).join("."),r=e.readUShort();return new o(i,r,t)}if(t===6){e.skip(2);let n=e.readUShort();e.skip(4);let i=[];for(let s=0;s<8;s++){let c=e.readUShort()^65535;i.push(c.toString(16).padStart(4,"0"))}let r=i.join(":");return e.skip(4),new o(r,n,t)}return new o("",0,0)}};var A=require("@serenityjs/binarystream");var a=function(o){return o[o.ConnectedPing=0]="ConnectedPing",o[o.UnconnectedPing=1]="UnconnectedPing",o[o.ConnectedPong=3]="ConnectedPong",o[o.OpenConnectionRequest1=5]="OpenConnectionRequest1",o[o.OpenConnectionReply1=6]="OpenConnectionReply1",o[o.OpenConnectionRequest2=7]="OpenConnectionRequest2",o[o.OpenConnectionReply2=8]="OpenConnectionReply2",o[o.ConnectionRequest=9]="ConnectionRequest",o[o.ConnectionRequestAccepted=16]="ConnectionRequestAccepted",o[o.NewIncomingConnection=19]="NewIncomingConnection",o[o.Disconnect=21]="Disconnect",o[o.IncompatibleProtocolVersion=25]="IncompatibleProtocolVersion",o[o.UnconnectedPong=28]="UnconnectedPong",o[o.FrameSet=128]="FrameSet",o[o.Nack=160]="Nack",o[o.Ack=192]="Ack",o}(a||{});var I=function(o){return o[o.Valid=128]="Valid",o[o.Ack=64]="Ack",o[o.Nak=32]="Nak",o[o.Split=16]="Split",o}(I||{});var C=function(o){return o[o.Normal=0]="Normal",o[o.Immediate=1]="Immediate",o}(C||{});var y=function(o){return o[o.Connecting=0]="Connecting",o[o.Connected=1]="Connected",o[o.Disconnecting=2]="Disconnecting",o[o.Disconnected=3]="Disconnected",o}(y||{});var m=function(o){return o[o.Unreliable=0]="Unreliable",o[o.UnreliableSequenced=1]="UnreliableSequenced",o[o.Reliable=2]="Reliable",o[o.ReliableOrdered=3]="ReliableOrdered",o[o.ReliableSequenced=4]="ReliableSequenced",o[o.UnreliableWithAckReceipt=5]="UnreliableWithAckReceipt",o[o.ReliableWithAckReceipt=6]="ReliableWithAckReceipt",o[o.ReliableOrderedWithAckReceipt=7]="ReliableOrderedWithAckReceipt",o}(m||{});var O=class $e extends R{static{d(this,"Frame")}reliability;reliableIndex;sequenceIndex;orderIndex;orderChannel;splitSize;splitId;splitIndex;payload;isSplit(){return this.splitSize>0}isReliable(){return[m.Reliable,m.ReliableOrdered,m.ReliableSequenced,m.ReliableWithAckReceipt,m.ReliableOrderedWithAckReceipt].includes(this.reliability)}isSequenced(){return[m.ReliableSequenced,m.UnreliableSequenced].includes(this.reliability)}isOrdered(){return[m.UnreliableSequenced,m.ReliableOrdered,m.ReliableSequenced,m.ReliableOrderedWithAckReceipt].includes(this.reliability)}isOrderExclusive(){return[m.ReliableOrdered,m.ReliableOrderedWithAckReceipt].includes(this.reliability)}getByteLength(){return 3+this.payload.byteLength+(this.isReliable()?3:0)+(this.isSequenced()?3:0)+(this.isOrdered()?4:0)+(this.isSplit()?10:0)}static read(e){let t=[];do{let n=new $e,i=e.readUint8();n.reliability=(i&224)>>5;let r=(i&I.Split)!==0,s=Math.ceil(e.readUint16()/8);n.isReliable()&&(n.reliableIndex=e.readUint24(A.Endianness.Little)),n.isSequenced()&&(n.sequenceIndex=e.readUint24(A.Endianness.Little)),n.isOrdered()&&(n.orderIndex=e.readUint24(A.Endianness.Little),n.orderChannel=e.readUint8()),r&&(n.splitSize=e.readUint32(),n.splitId=e.readUint16(),n.splitIndex=e.readUint32()),n.payload=e.readBuffer(s),t.push(n)}while(!e.cursorAtEnd());return t}static write(e,t){for(let n of t)e.writeUint8(n.reliability<<5|(n.isSplit()?I.Split:0)),e.writeUint16(n.payload.byteLength<<3),n.isReliable()&&e.writeUint24(n.reliableIndex,A.Endianness.Little),n.isSequenced()&&e.writeUint24(n.sequenceIndex,A.Endianness.Little),n.isOrdered()&&(e.writeUint24(n.orderIndex,A.Endianness.Little),e.writeUint8(n.orderChannel)),n.isSplit()&&(e.writeUint32(n.splitSize),e.writeUint16(n.splitId),e.writeUint32(n.splitIndex)),e.writeBuffer(n.payload)}};var ve=class extends R{static{d(this,"SystemAddress")}static fromIdentifier(e){return new u(e.address,e.port,e.version)}static read(e){let t=[];for(let n=0;n<20;n++){let i=u.read(e);t.push(i)}return t}static write(e){let t=[{address:"127.0.0.1",port:0,version:4}];for(let n=0;n<20;n++)u.write(e,t[n]||{address:"0.0.0.0",port:0,version:4})}};var re=require("@serenityjs/binarystream");var l=class extends re.BinaryStream{static{d(this,"BasePacket")}static id;static id_type=re.Uint8;flush(){this.binary=[]}getId(){throw new Error("BasePacket.getId() is not implemented.")}getIdType(){throw new Error("BasePacket.getIdType() is not implemented.")}serialize(){throw new Error("BasePacket.serialize() is not implemented.")}deserialize(){throw new Error("BasePacket.deserialize() is not implemented.")}};var be=require("@serenityjs/binarystream");function oe(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(oe,"_ts_decorate");function Re(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Re,"_ts_metadata");var P=class extends l{static{d(this,"UnconnectedPing")}timestamp;magic;client};oe([p(be.Long),Re("design:type",typeof BigInt>"u"?Object:BigInt)],P.prototype,"timestamp",void 0);oe([p(g),Re("design:type",typeof Buffer>"u"?Object:Buffer)],P.prototype,"magic",void 0);oe([p(be.Long),Re("design:type",typeof BigInt>"u"?Object:BigInt)],P.prototype,"client",void 0);P=oe([f(a.UnconnectedPing)],P);var K=require("@serenityjs/binarystream");function W(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(W,"_ts_decorate");function ie(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ie,"_ts_metadata");var S=class extends l{static{d(this,"UnconnectedPong")}timestamp;guid;magic;message};W([p(K.Long),ie("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"timestamp",void 0);W([p(K.Long),ie("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"guid",void 0);W([p(g),ie("design:type",typeof Buffer>"u"?Object:Buffer)],S.prototype,"magic",void 0);W([p(K.String16),ie("design:type",String)],S.prototype,"message",void 0);S=W([f(a.UnconnectedPong)],S);var Me=require("@serenityjs/binarystream");function se(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(se,"_ts_decorate");function we(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(we,"_ts_metadata");var U=class extends l{static{d(this,"OpenConnectionRequest1")}magic;protocol;mtu};se([p(g),we("design:type",typeof Buffer>"u"?Object:Buffer)],U.prototype,"magic",void 0);se([p(Me.Uint8),we("design:type",Number)],U.prototype,"protocol",void 0);se([p(xe),we("design:type",Number)],U.prototype,"mtu",void 0);U=se([f(a.OpenConnectionRequest1)],U);var M=require("@serenityjs/binarystream");function Z(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Z,"_ts_decorate");function ce(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ce,"_ts_metadata");var q=class extends l{static{d(this,"OpenConnectionReply1")}magic;guid;security;mtu};Z([p(g),ce("design:type",typeof Buffer>"u"?Object:Buffer)],q.prototype,"magic",void 0);Z([p(M.Long),ce("design:type",typeof BigInt>"u"?Object:BigInt)],q.prototype,"guid",void 0);Z([p(M.Bool),ce("design:type",Boolean)],q.prototype,"security",void 0);Z([p(M.Short),ce("design:type",Number)],q.prototype,"mtu",void 0);q=Z([f(a.OpenConnectionReply1)],q);var pe=require("@serenityjs/binarystream");function G(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(G,"_ts_decorate");function de(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(de,"_ts_metadata");var B=class extends l{static{d(this,"OpenConnectionRequest2")}magic;address;mtu;client};G([p(g),de("design:type",typeof Buffer>"u"?Object:Buffer)],B.prototype,"magic",void 0);G([p(u),de("design:type",typeof u>"u"?Object:u)],B.prototype,"address",void 0);G([p(pe.Short),de("design:type",Number)],B.prototype,"mtu",void 0);G([p(pe.Long),de("design:type",typeof BigInt>"u"?Object:BigInt)],B.prototype,"client",void 0);B=G([f(a.OpenConnectionRequest2)],B);var T=require("@serenityjs/binarystream");function L(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(L,"_ts_decorate");function X(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(X,"_ts_metadata");var b=class extends l{static{d(this,"OpenConnectionReply2")}magic;guid;address;mtu;encryption};L([p(g),X("design:type",typeof Buffer>"u"?Object:Buffer)],b.prototype,"magic",void 0);L([p(T.Long),X("design:type",typeof BigInt>"u"?Object:BigInt)],b.prototype,"guid",void 0);L([p(u),X("design:type",typeof u>"u"?Object:u)],b.prototype,"address",void 0);L([p(T.Short),X("design:type",Number)],b.prototype,"mtu",void 0);L([p(T.Bool),X("design:type",Boolean)],b.prototype,"encryption",void 0);b=L([f(a.OpenConnectionReply2)],b);var Oe=require("@serenityjs/binarystream");function Ie(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Ie,"_ts_decorate");function Le(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Le,"_ts_metadata");var D=class extends l{static{d(this,"ConnectedPong")}pingTimestamp;timestamp};Ie([p(Oe.Long),Le("design:type",typeof BigInt>"u"?Object:BigInt)],D.prototype,"pingTimestamp",void 0);Ie([p(Oe.Long),Le("design:type",typeof BigInt>"u"?Object:BigInt)],D.prototype,"timestamp",void 0);D=Ie([f(a.ConnectedPong)],D);var Ne=require("@serenityjs/binarystream");function Te(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Te,"_ts_decorate");function rt(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(rt,"_ts_metadata");var N=class extends l{static{d(this,"ConnectedPing")}timestamp};Te([p(Ne.Long),rt("design:type",typeof BigInt>"u"?Object:BigInt)],N.prototype,"timestamp",void 0);N=Te([f(a.ConnectedPing)],N);var qe=require("@serenityjs/binarystream");function Se(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Se,"_ts_decorate");function ke(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ke,"_ts_metadata");var E=class extends l{static{d(this,"ConnectionRequest")}client;timestamp};Se([p(qe.Long),ke("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"client",void 0);Se([p(qe.Long),ke("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"timestamp",void 0);E=Se([f(a.ConnectionRequest)],E);var ae=require("@serenityjs/binarystream");function Be(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Be,"_ts_decorate");function Qe(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Qe,"_ts_metadata");var _=class extends l{static{d(this,"FrameSet")}sequence;frames};Be([p(ae.Uint24,ae.Endianness.Little),Qe("design:type",Number)],_.prototype,"sequence",void 0);Be([p(O),Qe("design:type",typeof Array>"u"?Object:Array)],_.prototype,"frames",void 0);_=Be([f(a.FrameSet)],_);var x=require("@serenityjs/binarystream");function ot(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(ot,"_ts_decorate");var k=class Ve extends l{static{d(this,"Ack")}sequences=[];serialize(){this.writeUint8(Ve.id);let e=new x.BinaryStream,t=this.sequences.length,n=0;if(t>0){let i=0,r=this.sequences[0],s=this.sequences[0];for(;i<t;){let c=this.sequences[i++],h=c-s;h===1?s=c:h>1&&(r===s?(e.writeBool(!0),e.writeUint24(r,x.Endianness.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,x.Endianness.Little),e.writeUint24(s,x.Endianness.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,x.Endianness.Little)):(e.writeBool(!1),e.writeUint24(r,x.Endianness.Little),e.writeUint24(s,x.Endianness.Little)),++n,this.writeUShort(n),this.writeBuffer(e.getBuffer())}return this.getBuffer()}deserialize(){this.readUint8(),this.sequences=[];let e=this.readUShort();for(let t=0;t<e;t++)if(this.readBool())this.sequences.push(this.readUint24(x.Endianness.Little));else{let i=this.readUint24(x.Endianness.Little),r=this.readUint24(x.Endianness.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};k=ot([f(a.Ack)],k);var v=require("@serenityjs/binarystream");function it(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(it,"_ts_decorate");var Q=class He extends l{static{d(this,"Nack")}sequences=[];serialize(){this.writeUint8(He.id);let e=new v.BinaryStream,t=this.sequences.length,n=0;if(t>0){let i=0,r=this.sequences[0],s=this.sequences[0];for(;i<t;){let c=this.sequences[i++],h=c-s;h===1?s=c:h>1&&(r===s?(e.writeBool(!0),e.writeUint24(r,v.Endianness.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,v.Endianness.Little),e.writeUint24(s,v.Endianness.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,v.Endianness.Little)):(e.writeBool(!1),e.writeUint24(r,v.Endianness.Little),e.writeUint24(s,v.Endianness.Little)),++n,this.writeUShort(n),this.writeBuffer(e.getBuffer())}return this.getBuffer()}deserialize(){this.readUint8(),this.sequences=[];let e=this.readUShort();for(let t=0;t<e;t++)if(this.readBool())this.sequences.push(this.readUint24(v.Endianness.Little));else{let i=this.readUint24(v.Endianness.Little),r=this.readUint24(v.Endianness.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};Q=it([f(a.Nack)],Q);function st(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(st,"_ts_decorate");var J=class extends l{static{d(this,"Disconnect")}};J=st([f(a.Disconnect)],J);var le=require("@serenityjs/binarystream");function fe(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(fe,"_ts_decorate");function Ce(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Ce,"_ts_metadata");var j=class extends l{static{d(this,"IncompatibleProtocolVersion")}protocol;magic;guid};fe([p(le.Uint8),Ce("design:type",Number)],j.prototype,"protocol",void 0);fe([p(g),Ce("design:type",typeof Buffer>"u"?Object:Buffer)],j.prototype,"magic",void 0);fe([p(le.Uint64),Ce("design:type",typeof BigInt>"u"?Object:BigInt)],j.prototype,"guid",void 0);j=fe([f(a.IncompatibleProtocolVersion)],j);var ee=require("@serenityjs/binarystream");function V(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(V,"_ts_decorate");function Y(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Y,"_ts_metadata");var w=class extends l{static{d(this,"ConnectionRequestAccepted")}address;systemIndex;systemAddress;requestTimestamp;timestamp};V([p(u),Y("design:type",typeof u>"u"?Object:u)],w.prototype,"address",void 0);V([p(ee.Short),Y("design:type",Number)],w.prototype,"systemIndex",void 0);V([p(ve),Y("design:type",typeof Array>"u"?Object:Array)],w.prototype,"systemAddress",void 0);V([p(ee.Long),Y("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"requestTimestamp",void 0);V([p(ee.Long),Y("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"timestamp",void 0);w=V([f(a.ConnectionRequestAccepted)],w);var Pe=require("@serenityjs/binarystream");function te(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(te,"_ts_decorate");function ue(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ue,"_ts_metadata");var F=class extends l{static{d(this,"NewIncomingConnection")}serverAddress;internalAddress;incomingTimestamp;serverTimestamp};te([p(u),ue("design:type",String)],F.prototype,"serverAddress",void 0);te([p(u),ue("design:type",String)],F.prototype,"internalAddress",void 0);te([p(Pe.Long),ue("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"incomingTimestamp",void 0);te([p(Pe.Long),ue("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"serverTimestamp",void 0);F=te([f(a.NewIncomingConnection)],F);var Ke=require("dgram"),Ze=require("@serenityjs/emitter"),ge=require("@serenityjs/logger");var $=11,ct=100,Ue=.01,me=28,_e=400,je=1492,ze=4,Ae=36;var We=require("@serenityjs/binarystream");var De=class{static{d(this,"Connection")}server;status=y.Connecting;lastUpdate=Date.now();rinfo;guid;mtu;receivedFrameSequences=new Set;lostFrameSequences=new Set;inputHighestSequenceIndex;fragmentsQueue=new Map;inputOrderIndex;inputOrderingQueue=new Map;lastInputSequence=-1;outputOrderIndex;outputSequenceIndex;outputFrames=new Set;outputBackup=new Map;outputSequence=0;outputsplitIndex=0;outputReliableIndex=0;constructor(e,t,n,i){this.server=e,this.rinfo=t,this.guid=n,this.mtu=i,this.inputOrderIndex=Array.from({length:32}).fill(0);for(let r=0;r<32;r++)this.inputOrderingQueue.set(r,new Map);this.inputHighestSequenceIndex=Array.from({length:32}).fill(0),this.outputOrderIndex=Array.from({length:32}).fill(0),this.outputSequenceIndex=Array.from({length:32}).fill(0)}tick(){if(this.lastUpdate+15e3<Date.now())return this.server.logger.warn(`Detected stale connection from \xA7c${this.rinfo.address}\xA7r:\xA7c${this.rinfo.port}\xA7r, disconnecting...`),this.disconnect();if(!(this.status===y.Disconnecting||this.status===y.Disconnected)){if(this.receivedFrameSequences.size>0){let e=new k;e.sequences=[...this.receivedFrameSequences];for(let t of this.receivedFrameSequences)this.receivedFrameSequences.delete(t);this.server.send(e.serialize(),this.rinfo)}if(this.lostFrameSequences.size>0){let e=new Q;e.sequences=[...this.lostFrameSequences];for(let t of this.lostFrameSequences)this.lostFrameSequences.delete(t);this.server.send(e.serialize(),this.rinfo)}return this.sendQueue(this.outputFrames.size)}}disconnect(){this.status=y.Disconnecting;let e=new J,t=new O;t.reliability=m.ReliableOrdered,t.orderChannel=0,t.payload=e.serialize(),this.sendFrame(t,C.Immediate),this.server.emit("disconnect",this),this.server.connections.delete(this),this.status=y.Disconnected}incoming(e){this.lastUpdate=Date.now();let t=e[0]&240;switch(t){default:{let n=t.toString(16).length===1?"0"+t.toString(16):t.toString(16);return this.server.logger.debug(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`))}case a.Ack:{this.ack(e);break}case a.Nack:{this.nack(e);break}case I.Valid:{this.handleIncomingFrameSet(e);break}}}incomingBatch(e){let t=e[0];if(this.status===y.Connecting){switch(t){default:{let n=t.toString(16).length===1?"0"+t.toString(16):t.toString(16);return this.server.logger.debug(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`))}case a.Disconnect:{this.status=y.Disconnecting,this.server.connections.delete(this),this.status=y.Disconnected;break}case a.ConnectionRequest:{this.handleIncomingConnectionRequest(e);break}case a.NewIncomingConnection:{this.status=y.Connected,this.server.emit("connect",this);break}}return}switch(t){default:{let n=t.toString(16).length===1?"0"+t.toString(16):t.toString(16);return this.server.logger.debug(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`))}case a.Disconnect:{this.status=y.Disconnecting,this.server.emit("disconnect",this),this.server.connections.delete(this),this.status=y.Disconnected;break}case a.ConnectedPing:return this.handleIncomingConnectedPing(e);case 254:this.server.emit("encapsulated",this,e)}}ack(e){let t=new k(e).deserialize();for(let n of t.sequences)this.outputBackup.has(n)||this.server.logger.debug(`Received ack for unknown sequence ${n} from ${this.rinfo.address}:${this.rinfo.port}.`),this.outputBackup.delete(n)}nack(e){let t=new Q(e).deserialize();for(let n of t.sequences){let i=this.outputBackup.get(n)??[];for(let r of i)this.sendFrame(r,C.Immediate)}}handleIncomingFrameSet(e){let t=new _(e).deserialize();if(this.receivedFrameSequences.has(t.sequence))return this.server.logger.debug(`Received duplicate frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Recieved duplicate frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`));if(this.lostFrameSequences.delete(t.sequence),t.sequence<this.lastInputSequence||t.sequence===this.lastInputSequence)return this.server.logger.debug(`Received out of order frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Recieved out of order frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`));if(this.receivedFrameSequences.add(t.sequence),t.sequence-this.lastInputSequence>1)for(let n=this.lastInputSequence+1;n<t.sequence;n++)this.lostFrameSequences.add(n);this.lastInputSequence=t.sequence;for(let n of t.frames)this.handleFrame(n)}handleFrame(e){if(e.isSplit())return this.handleFragment(e);if(e.isSequenced())return e.sequenceIndex<this.inputHighestSequenceIndex[e.orderChannel]||e.orderIndex<this.inputOrderIndex[e.orderChannel]?(this.server.logger.debug(`Recieved out of order frame ${e.sequenceIndex} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Recieved out of order frame ${e.sequenceIndex} from ${this.rinfo.address}:${this.rinfo.port}!`))):(this.inputHighestSequenceIndex[e.orderChannel]=e.sequenceIndex+1,this.incomingBatch(e.payload));if(e.isOrdered()){if(e.orderIndex===this.inputOrderIndex[e.orderChannel]){this.inputHighestSequenceIndex[e.orderChannel]=0,this.inputOrderIndex[e.orderChannel]=e.orderIndex+1,this.incomingBatch(e.payload);let t=this.inputOrderIndex[e.orderChannel],n=this.inputOrderingQueue.get(e.orderChannel);for(;n.has(t);t++){let i=n.get(t);if(!i)break;this.incomingBatch(i.payload),n.delete(t)}this.inputOrderingQueue.set(e.orderChannel,n),this.inputOrderIndex[e.orderChannel]=t}else if(e.orderIndex>this.inputOrderIndex[e.orderChannel]){let t=this.inputOrderingQueue.get(e.orderChannel);if(!t)return;t.set(e.orderIndex,e)}}else return this.incomingBatch(e.payload)}handleFragment(e){if(this.fragmentsQueue.has(e.splitId)){let t=this.fragmentsQueue.get(e.splitId);if(!t)return;if(t.set(e.splitIndex,e),t.size===e.splitSize){let n=new We.BinaryStream;for(let r=0;r<t.size;r++){let s=t.get(r);n.writeBuffer(s.payload)}let i=new O;return i.reliability=e.reliability,i.reliableIndex=e.reliableIndex,i.sequenceIndex=e.sequenceIndex,i.orderIndex=e.orderIndex,i.orderChannel=e.orderChannel,i.payload=n.getBuffer(),this.fragmentsQueue.delete(e.splitId),this.handleFrame(i)}}else this.fragmentsQueue.set(e.splitId,new Map([[e.splitIndex,e]]))}sendFrame(e,t){e.isSequenced()?(e.orderIndex=this.outputOrderIndex[e.orderChannel],e.sequenceIndex=this.outputSequenceIndex[e.orderChannel]++):e.isOrderExclusive()&&(e.orderIndex=this.outputOrderIndex[e.orderChannel]++,this.outputSequenceIndex[e.orderChannel]=0);let n=this.mtu-36,i=Math.ceil(e.payload.byteLength/n);if(e.reliableIndex=this.outputReliableIndex++,e.payload.byteLength>n){let r=this.outputsplitIndex++%65536;for(let s=0;s<e.payload.byteLength;s+=n){let c=new O;c.reliableIndex=e.reliableIndex,s!==0&&(c.reliableIndex=this.outputReliableIndex++),c.sequenceIndex=e.sequenceIndex,c.orderIndex=e.orderIndex,c.orderChannel=e.orderChannel,c.reliability=e.reliability,c.payload=e.payload.subarray(s,s+n),c.splitIndex=s/n,c.splitId=r,c.splitSize=i,this.queueFrame(c,t)}}else return this.queueFrame(e,t)}queueFrame(e,t){let n=4;for(let i of this.outputFrames)n+=i.getByteLength();if(n+e.getByteLength()>this.mtu-36&&this.sendQueue(this.outputFrames.size),this.outputFrames.add(e),t===C.Immediate)return this.sendQueue(1)}sendQueue(e){if(this.outputFrames.size===0)return;let t=new _;t.sequence=this.outputSequence++,t.frames=[...this.outputFrames].slice(0,e),this.outputBackup.set(t.sequence,t.frames);for(let n of t.frames)this.outputFrames.delete(n);return this.server.send(t.serialize(),this.rinfo)}handleIncomingConnectionRequest(e){let t=new E(e).deserialize(),n=new w;n.address=u.fromIdentifier(this.rinfo),n.systemIndex=0,n.systemAddress=[],n.requestTimestamp=t.timestamp,n.timestamp=BigInt(Date.now());let i=new O;return i.reliability=m.ReliableOrdered,i.orderChannel=0,i.payload=n.serialize(),this.sendFrame(i,C.Normal)}handleIncomingConnectedPing(e){let t=new N(e).deserialize(),n=new D;n.timestamp=t.timestamp,n.pingTimestamp=t.timestamp,n.timestamp=BigInt(Date.now());let i=new O;i.reliability=m.ReliableOrdered,i.orderChannel=0,i.payload=n.serialize(),this.sendFrame(i,C.Normal)}};var he=class{static{d(this,"Offline")}static server;static handle(e,t){let n=e[0];if(!n)throw new Error("Invalid offline packet header");switch(n){case a.UnconnectedPing:{this.unconnectedPing(e,t);break}case a.OpenConnectionRequest1:{this.openConnectionRequest1(e,t);break}case a.OpenConnectionRequest2:{this.openConnectionRequest2(e,t);break}default:{let i=n.toString(16).length===1?"0"+n.toString(16):n.toString(16);this.server.logger.debug(`Received an unknown offline packet identifier "0x${i}" from ${t.address}:${t.port}`)}}}static unconnectedPing(e,t){let n=new P(e).deserialize(),i=new S;i.timestamp=n.timestamp,i.guid=this.server.guid,i.message=["MCPE",this.server.message??"Raknet Server",this.server.protocol??100,this.server.version??"1.0.0",this.server.connections.size,this.server.maxConnections??10,this.server.guid,"SerenityJS","Survival",1,this.server.port,this.server.port+1].join(";")+";",this.server.send(i.serialize(),t)}static openConnectionRequest1(e,t){let n=new U(e).deserialize();if(n.protocol!==11){let r=new j;return r.protocol=11,r.guid=this.server.guid,this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to incompatible protocol version v${n.protocol}, expected v${11}.`),this.server.send(r.serialize(),t)}let i=new q;return i.guid=this.server.guid,i.security=!1,i.mtu=n.mtu+28>this.server.maxMtuSize?this.server.maxMtuSize:n.mtu+28,this.server.send(i.serialize(),t)}static openConnectionRequest2(e,t){let n=new B(e).deserialize();if(n.address.port!==this.server.port)return this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to mismatched port.`);if(n.mtu<this.server.minMtuSize||n.mtu>this.server.maxMtuSize)return this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to invalid mtu size.`);if([...this.server.connections.values()].find(s=>s.rinfo.address===t.address&&s.rinfo.port===t.port))return this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to already established connection.`);let r=new b;return r.guid=this.server.guid,r.address=u.fromIdentifier(t),r.mtu=n.mtu,r.encryption=!1,this.server.logger.debug(`Establishing connection from ${t.address}:${t.port} with mtu size of ${n.mtu}.`),this.server.connections.add(new De(this.server,t,n.client,n.mtu)),this.server.send(r.serialize(),t)}};var dt={address:"0.0.0.0",port:19132,protocol:11,version:"1.0.0",message:"Raknet Server",maxConnections:40,mtuMaxSize:1492,mtuMinSize:400},pt=class extends Ze.Emitter{static{d(this,"Server")}interval=null;properties;logger=new ge.Logger("Raknet",ge.LoggerColors.DarkAqua);socket=(0,Ke.createSocket)("udp4");connections=new Set;guid=BigInt(Math.floor(Math.random()*2**64));get address(){return this.properties.address}set address(e){this.properties.address=e}get port(){return this.properties.port}set port(e){this.properties.port=e}get maxMtuSize(){return this.properties.mtuMaxSize}set maxMtuSize(e){this.properties.mtuMaxSize=e}get minMtuSize(){return this.properties.mtuMinSize}set minMtuSize(e){this.properties.mtuMinSize=e}get protocol(){return this.properties.protocol}set protocol(e){this.properties.protocol=e}get version(){return this.properties.version}set version(e){this.properties.version=e}get message(){return this.properties.message}set message(e){this.properties.message=e}get maxConnections(){return this.properties.maxConnections}set maxConnections(e){this.properties.maxConnections=e}alive=!0;constructor(e){super(),this.properties={...dt,...e},this.socket.on("message",this.handle.bind(this)),this.socket.unref(),he.server=this}start(e=!0){this.socket.bind(this.port,this.address);let t=d(()=>setTimeout(()=>{if(!(!this.alive||!this.interval)){for(let n of this.connections)n.tick();return t()}},.01),"tick");e&&(this.interval=t())}stop(){try{this.alive=!1;for(let e of this.connections)e.disconnect();this.interval&&(this.interval=null),this.socket.close()}catch{this.emit("error",new Error("Failed to close the server"))}}handle(e,t){let n=e[0];if(!n)throw new Error("Invalid packet header");let i=(n&I.Valid)===0,r=[...this.connections.values()].find(s=>s.rinfo.address===t.address&&s.rinfo.port===t.port);if(i)return he.handle(e,t);if(!i&&r)return r.incoming(e)}send(e,t){this.socket.send(e,t.port,t.address)}};0&&(module.exports={Ack,Address,BasePacket,Bitflags,ConnectedPing,ConnectedPong,Connection,ConnectionRequest,ConnectionRequestAccepted,DGRAM_HEADER_SIZE,DGRAM_MTU_OVERHEAD,DataType,Disconnect,Frame,FrameSet,IncompatibleProtocolVersion,MAX_MTU_SIZE,MIN_MTU_SIZE,MTU,Magic,Nack,NewIncomingConnection,Offline,OpenConnectionReply1,OpenConnectionReply2,OpenConnectionRequest1,OpenConnectionRequest2,Packet,Priority,Proto,RAKNET_PROTOCOL,RAKNET_TICK_LEN,RAKNET_TPS,Reliability,Serialize,Server,Status,SystemAddress,UDP_HEADER_SIZE,UnconnectedPing,UnconnectedPong});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3Byb3RvLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3NlcmlhbGl6ZS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvdHlwZS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvbWFnaWMudHMiLCAiLi4vc3JjL3Byb3RvL3R5cGVzL210dS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvYWRkcmVzcy50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvZnJhbWUudHMiLCAiLi4vc3JjL2VudW1zL3BhY2tldC50cyIsICIuLi9zcmMvZW51bXMvYml0LWZsYWdzLnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvZW51bXMvc3RhdHVzLnRzIiwgIi4uL3NyYy9lbnVtcy9yZWxpYWJpbGl0eS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvc3lzdGVtLWFkZHJlc3MudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvYmFzZS50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS91bmNvbm5lY3RlZC1waW5nLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL3VuY29ubmVjdGVkLXBvbmcudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvb3Blbi1jb25uZWN0aW9uLXJlcXVlc3QtMS50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9vcGVuLWNvbm5lY3Rpb24tcmVwbHktMS50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9vcGVuLWNvbm5lY3Rpb24tcmVxdWVzdC0yLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL29wZW4tY29ubmVjdGlvbi1yZXBseS0yLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL2Nvbm5lY3RlZC1wb25nLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL2Nvbm5lY3RlZC1waW5nLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL2Nvbm5lY3Rpb24tcmVxdWVzdC50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9mcmFtZS1zZXQudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvYWNrLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL25hY2sudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvZGlzY29ubmVjdC50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9pbmNvbXBhdGlibGUtcHJvdG9jb2wudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvY29ubmVjdGlvbi1yZXF1ZXN0LWFjY2VwdGVkLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL25ldy1pbmNvbWluZy1jb25uZWN0aW9uLnRzIiwgIi4uL3NyYy9zZXJ2ZXIvcmFrbmV0LnRzIiwgIi4uL3NyYy9jb25zdGFudHMvcmFrbmV0LnRzIiwgIi4uL3NyYy9zZXJ2ZXIvY29ubmVjdGlvbi50cyIsICIuLi9zcmMvc2VydmVyL29mZmxpbmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcHJvdG9cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VudW1zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXJ2ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuaW1wb3J0IHR5cGUgeyBFbmRpYW5uZXNzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlUGFja2V0LCBEYXRhVHlwZSB9IGZyb20gXCIuLi9wcm90b1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXRNZXRhZGF0YSB9IGZyb20gXCIuLi90eXBlcy9wYWNrZXRcIjtcblxuLyoqXG4gKiBQcm90byBkZWNvcmF0b3IgZm9yIHBhY2tldCBjbGFzc2VzLlxuICpcbiAqIEBwYXJhbSBpZCBQYWNrZXQgaWQuXG4gKiBAcmV0dXJucyBUaGUgcGFja2V0IGRlY29yYXRvci5cbiAqL1xuZnVuY3Rpb24gUHJvdG8oaWQ6IG51bWJlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogdHlwZW9mIEJhc2VQYWNrZXQpIHtcbiAgICAvLyBTZXQgdGhlIHBhY2tldCBpZC5cbiAgICB0YXJnZXQuaWQgPSBpZDtcblxuICAgIC8vIFJlc29sdmUgdGhlIG1ldGFkYXRhIGZvciB0aGUgcGFja2V0LlxuICAgIGNvbnN0IG1ldGFkYXRhOiBBcnJheTxQYWNrZXRNZXRhZGF0YT4gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgICAgXCJwcm9wZXJ0aWVzXCIsXG4gICAgICB0YXJnZXQucHJvdG90eXBlXG4gICAgKTtcblxuICAgIC8vIFJlYWQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhY2tldC5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgdGhlIHNlcmlhbGl6ZSBtZXRob2QuXG4gICAgLy8gVGhpcyBhbGxvd3MgY3VzdG9tIHBhY2tldHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VyaWFsaXphdGlvbi5cbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoXCJzZXJpYWxpemVcIikpXG4gICAgICAvLyBEZWZpbmUgdGhlIHNlcmlhbGl6ZSBtZXRob2QgZm9yIHRoZSBwYWNrZXQuXG4gICAgICB0YXJnZXQucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIGJpbmFyeSBzdHJlYW0uXG4gICAgICAgIHRoaXMuZmx1c2goKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgcGFja2V0IGlkIHVzaW5nIHRoZSBpZCB0eXBlLlxuICAgICAgICB0YXJnZXQuaWRfdHlwZS53cml0ZSh0aGlzLCB0YXJnZXQuaWQgYXMgbmV2ZXIpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSBtZXRhZGF0YS5cbiAgICAgICAgLy8gSWYgbm90LCByZXR1cm4gdGhlIGJ1ZmZlci5cbiAgICAgICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBtZXRhZGF0YSBhbmQgd3JpdGUgdGhlIHByb3BlcnRpZXMgdG8gdGhlIGJpbmFyeSBzdHJlYW0uXG4gICAgICAgIGZvciAoY29uc3QgeyBuYW1lLCB0eXBlLCBlbmRpYW4sIHBhcmFtZXRlciB9IG9mIG1ldGFkYXRhKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYXJhbWV0ZXIgZm9yIHR5cGUgdGVzdGluZy5cbiAgICAgICAgICBpZiAocGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHlwZSBpcyBhIGNvbXBvdW5kIHRhZy5cbiAgICAgICAgICAgIGlmICh0eXBlLnByb3RvdHlwZSA9PT0gQ29tcG91bmRUYWcucHJvdG90eXBlKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBDb21wb3VuZFRhZyBzZXJpYWxpemF0aW9uLlwiXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFB1bGwgdGhlIHZhbHVlIGZyb20gdGhlIGNsYXNzIHVzaW5nIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcGFyYW1ldGVyIGFzIGtleW9mIEJhc2VQYWNrZXRdO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSB0eXBlIHRvIERhdGFUeXBlLlxuICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgLy8gUHVsbCB0aGUgZGF0YSBmcm9tIHRoZSBjbGFzcy5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAodGhpcyBhcyBuZXZlcilbbmFtZV07XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0eSB0byB0aGUgYmluYXJ5IHN0cmVhbSB1c2luZyB0aGUgdHlwZS5cbiAgICAgICAgICAgIGR0eXBlLndyaXRlKHRoaXMsIGRhdGEsIGVuZGlhbiBhcyBFbmRpYW5uZXNzLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGEgY29tcG91bmQgdGFnLlxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlID09PSBDb21wb3VuZFRhZy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBDb21wb3VuZFRhZy5cbiAgICAgICAgICAgICAgY29uc3QgY3R5cGUgPSB0eXBlIGFzIHR5cGVvZiBDb21wb3VuZFRhZztcblxuICAgICAgICAgICAgICAvLyBQdWxsIHRoZSB0YWcgZnJvbSB0aGUgY2xhc3MuXG4gICAgICAgICAgICAgIGNvbnN0IHRhZyA9ICh0aGlzIGFzIG5ldmVyKVtuYW1lXSBhcyBDb21wb3VuZFRhZzx1bmtub3duPjtcblxuICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgcHJvcGVydHkgdG8gdGhlIGJpbmFyeSBzdHJlYW0gdXNpbmcgdGhlIHR5cGUuXG4gICAgICAgICAgICAgIGN0eXBlLndyaXRlKHRoaXMsIHRhZywgZW5kaWFuIGFzIGJvb2xlYW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBEYXRhVHlwZS5cbiAgICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgICAvLyBQdWxsIHRoZSBkYXRhIGZyb20gdGhlIGNsYXNzLlxuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gKHRoaXMgYXMgbmV2ZXIpW25hbWVdO1xuXG4gICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0eSB0byB0aGUgYmluYXJ5IHN0cmVhbSB1c2luZyB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgZHR5cGUud3JpdGUodGhpcywgZGF0YSwgZW5kaWFuIGFzIEVuZGlhbm5lc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0aGUgYnVmZmVyLlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgdGhlIGRlc2VyaWFsaXplIG1ldGhvZC5cbiAgICAvLyBUaGlzIGFsbG93cyBjdXN0b20gcGFja2V0cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBkZXNlcmlhbGl6YXRpb24uXG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKFwiZGVzZXJpYWxpemVcIikpXG4gICAgICB0YXJnZXQucHJvdG90eXBlLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYmluYXJ5IHN0cmVhbSBpcyBlbXB0eS5cbiAgICAgICAgLy8gSWYgc28sIHJldHVybiB0aGUgcGFja2V0LiBUaGlzIG1lYW5zIHRoZSBwYWNrZXQgaGFzIGFscmVhZHkgYmVlbiBkZXNlcmlhbGl6ZWQuXG4gICAgICAgIGlmICh0aGlzLmJpbmFyeS5sZW5ndGggPT09IDApIHJldHVybiB0aGlzO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2tldCBpZCB1c2luZyB0aGUgaWQgdHlwZS5cbiAgICAgICAgdGFyZ2V0LmlkX3R5cGUucmVhZCh0aGlzKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgbWV0YWRhdGEuXG4gICAgICAgIC8vIElmIG5vdCwgcmV0dXJuIHRoZSBwYWNrZXQuXG4gICAgICAgIGlmICghbWV0YWRhdGEpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbWV0YWRhdGEgYW5kIHJlYWQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS5cbiAgICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHR5cGUsIGVuZGlhbiwgcGFyYW1ldGVyIH0gb2YgbWV0YWRhdGEpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhcmFtZXRlciBmb3IgdHlwZSB0ZXN0aW5nLlxuICAgICAgICAgIGlmIChwYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGEgY29tcG91bmQgdGFnLlxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlID09PSBDb21wb3VuZFRhZy5wcm90b3R5cGUpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENvbXBvdW5kVGFnIGRlc2VyaWFsaXphdGlvbi5cIlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtIHVzaW5nIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcGFyYW1ldGVyIGFzIGtleW9mIEJhc2VQYWNrZXRdO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSB0eXBlIHRvIERhdGFUeXBlLlxuICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0eSB1c2luZyB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdHlwZS5cbiAgICAgICAgICAgICh0aGlzW25hbWUgYXMga2V5b2YgQmFzZVBhY2tldF0gYXMgdW5rbm93bikgPSBkdHlwZS5yZWFkKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBlbmRpYW4gYXMgRW5kaWFubmVzcyxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGEgY29tcG91bmQgdGFnLlxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlID09PSBDb21wb3VuZFRhZy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBDb21wb3VuZFRhZy5cbiAgICAgICAgICAgICAgY29uc3QgY3R5cGUgPSB0eXBlIGFzIHR5cGVvZiBDb21wb3VuZFRhZztcblxuICAgICAgICAgICAgICAvLyBTZXQgdGhlIHByb3BlcnR5IHVzaW5nIHRoZSB0eXBlLlxuICAgICAgICAgICAgICAodGhpc1tuYW1lIGFzIGtleW9mIEJhc2VQYWNrZXRdIGFzIHVua25vd24pID0gY3R5cGUucmVhZChcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGVuZGlhbiBhcyBuZXZlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBEYXRhVHlwZS5cbiAgICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgICAvLyBTZXQgdGhlIHByb3BlcnR5IHVzaW5nIHRoZSB0eXBlLlxuICAgICAgICAgICAgICAodGhpc1tuYW1lIGFzIGtleW9mIEJhc2VQYWNrZXRdIGFzIHVua25vd24pID0gZHR5cGUucmVhZChcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGVuZGlhbiBhcyBFbmRpYW5uZXNzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwYWNrZXQuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSB0aGUgZ2V0SWQgbWV0aG9kLlxuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhcImdldElkXCIpKVxuICAgICAgdGFyZ2V0LnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldC5pZDtcbiAgICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgdGhlIGdldElkVHlwZSBtZXRob2QuXG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKFwiZ2V0SWRUeXBlXCIpKVxuICAgICAgdGFyZ2V0LnByb3RvdHlwZS5nZXRJZFR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQuaWRfdHlwZTtcbiAgICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IFByb3RvIH07XG4iLCAiaW1wb3J0IHsgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHR5cGUgeyBWYWxpZFR5cGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi4vcHJvdG9cIjtcblxuZnVuY3Rpb24gU2VyaWFsaXplKFxuICB0eXBlOiBWYWxpZFR5cGVzLFxuICBlbmRpYW46IEVuZGlhbm5lc3MgfCBib29sZWFuID0gRW5kaWFubmVzcy5CaWcsXG4gIHBhcmFtZXRlcj86IHN0cmluZ1xuKSB7XG4gIC8vIENoZWNrIGlmIHRoZSB3YXNudCBhIHR5cGUgcHJvdmlkZWQuXG4gIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiQFNlcmlhbGl6ZSgpIGZhaWxlZCwgbm8gdHlwZSBwcm92aWRlZC5cIik7XG5cbiAgLy8gUmV0dXJuIHRoZSBzZXJpYWxpemUgZGVjb3JhdG9yLlxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogQmFzZVBhY2tldCwgbmFtZTogc3RyaW5nKSB7XG4gICAgLy8gR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB0YXJnZXQuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJwcm9wZXJ0aWVzXCIsIHRhcmdldCkgfHwgW107XG5cbiAgICAvLyBQdXNoIHRoZSBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyBhcnJheS5cbiAgICBwcm9wZXJ0aWVzLnB1c2goeyBuYW1lLCB0eXBlLCBlbmRpYW4sIHBhcmFtZXRlciB9KTtcblxuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBtZXRhZGF0YS5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwicHJvcGVydGllc1wiLCBwcm9wZXJ0aWVzLCB0YXJnZXQpO1xuICB9O1xufVxuXG5leHBvcnQgeyBTZXJpYWxpemUgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEJpbmFyeVN0cmVhbSwgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZGF0YSB0eXBlLlxuICovXG5hYnN0cmFjdCBjbGFzcyBEYXRhVHlwZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5fYXJndW1lbnRzXzogQXJyYXk8dW5rbm93bj4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIF9zdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCBmcm9tLlxuICAgKiBAcGFyYW0gX2VuZGlhbiBUaGUgZW5kaWFubmVzcyB0byB1c2UuXG4gICAqIEBwYXJhbSBfcGFyYW1ldGVyIEFuIG9wdGlvbmFsIHBhcmFtZXRlci5cbiAgICogQHJldHVybnMgVGhlIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZChcbiAgICBfc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgX2VuZGlhbiA9IEVuZGlhbm5lc3MuQmlnLFxuICAgIF9wYXJhbWV0ZXI/OiB1bmtub3duXG4gICk6IHVua25vd24ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGRhdGEgdHlwZSB0byBhIGJpbmFyeSBzdHJlYW0uXG4gICAqIEBwYXJhbSBfc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICAgKiBAcGFyYW0gX3ZhbHVlIFRoZSBkYXRhIHR5cGUgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBfZW5kaWFuIFRoZSBlbmRpYW5uZXNzIHRvIHVzZS5cbiAgICogQHBhcmFtIF9wYXJhbWV0ZXIgQW4gb3B0aW9uYWwgcGFyYW1ldGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3cml0ZShcbiAgICBfc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgX3ZhbHVlOiB1bmtub3duLFxuICAgIF9lbmRpYW4gPSBFbmRpYW5uZXNzLkJpZyxcbiAgICBfcGFyYW1ldGVyPzogdW5rbm93blxuICApOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZXhwb3J0IHsgRGF0YVR5cGUgfTtcbiIsICJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gXCIuL3R5cGVcIjtcblxuaW1wb3J0IHR5cGUgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmNvbnN0IE1hZ2ljQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gIFwiXFx1MDAwMFxcdTAwRkZcXHUwMEZGXFx1MDAwMFxcdTAwRkVcXHUwMEZFXFx1MDBGRVxcdTAwRkVcXHUwMEZEXFx1MDBGRFxcdTAwRkRcXHUwMEZEXFx1MDAxMlxcdTAwMzRcXHUwMDU2XFx1MDA3OFwiLFxuICBcImJpbmFyeVwiXG4pO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYWdpYyBkYXRhIHR5cGUuXG4gKiBNYWdpYyBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiBSYWtOZXQuXG4gKi9cbmNsYXNzIE1hZ2ljIGV4dGVuZHMgRGF0YVR5cGUge1xuICAvKipcbiAgICogUmVhZHMgdGhlIG1hZ2ljIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBtYWdpYyBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBCdWZmZXIge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZEJ1ZmZlcihNYWdpY0J1ZmZlci5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgbWFnaWMgZGF0YSB0eXBlIHRvIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byB3cml0ZSB0by5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgd3JpdGUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiB2b2lkIHtcbiAgICBzdHJlYW0ud3JpdGVCdWZmZXIoTWFnaWNCdWZmZXIpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1hZ2ljIH07XG4iLCAiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmltcG9ydCB0eXBlIHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYXhpbXVtIHRyYW5zbWlzc2lvbiB1bml0IGRhdGEgdHlwZS5cbiAqIE1UVSBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiBSYWtOZXQuXG4gKi9cbmNsYXNzIE1UVSBleHRlbmRzIERhdGFUeXBlIHtcbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBtdHUgZGF0YSB0eXBlIGZyb20gYSBiaW5hcnkgc3RyZWFtLlxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHJlYWQgZnJvbS5cbiAgICogQHJldHVybnMgVGhlIG10dSBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBudW1iZXIge1xuICAgIHJldHVybiBzdHJlYW0uZ2V0QnVmZmVyKCkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIG10dSBkYXRhIHR5cGUgdG8gYSBiaW5hcnkgc3RyZWFtLlxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3cml0ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihCdWZmZXIuYWxsb2ModmFsdWUgLSBzdHJlYW0uZ2V0QnVmZmVyKCkubGVuZ3RoKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTVRVIH07XG4iLCAiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmltcG9ydCB0eXBlIHsgUmVtb3RlSW5mbyB9IGZyb20gXCJub2RlOmRncmFtXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGFkZHJlc3MgZGF0YSB0eXBlLlxuICogQWRkcmVzcyBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiBSYWtOZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRyZXNzIGV4dGVuZHMgRGF0YVR5cGUge1xuICAvKipcbiAgICogVGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IG9mIHRoZSBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHZlcnNpb246IG51bWJlcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFkZHJlc3MgZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFkZHJlc3M6IHN0cmluZywgcG9ydDogbnVtYmVyLCB2ZXJzaW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBBZGRyZXNzIGRhdGEgdHlwZSB0byBhIE5ldHdvcmtJZGVudGlmaWVyLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgTmV0d29ya0lkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIFRoZSBOZXR3b3JrSWRlbnRpZmllci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUlkZW50aWZpZXIoaWRlbnRpZmllcjogUmVtb3RlSW5mbyk6IEFkZHJlc3Mge1xuICAgIHJldHVybiBuZXcgQWRkcmVzcyhcbiAgICAgIGlkZW50aWZpZXIuYWRkcmVzcyxcbiAgICAgIGlkZW50aWZpZXIucG9ydCxcbiAgICAgIGlkZW50aWZpZXIuZmFtaWx5ID09PSBcIklQdjRcIiA/IDQgOiA2XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIEFkZHJlc3MgZGF0YSB0eXBlIHRvIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byB3cml0ZSB0by5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgd3JpdGUoc3RyZWFtOiBCaW5hcnlTdHJlYW0sIHZhbHVlOiBBZGRyZXNzKTogdm9pZCB7XG4gICAgc3RyZWFtLndyaXRlVWludDgodmFsdWUudmVyc2lvbik7XG4gICAgaWYgKHZhbHVlLnZlcnNpb24gPT09IDQpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NCaXRzID0gdmFsdWUuYWRkcmVzcy5zcGxpdChcIi5cIiwgNCk7XG4gICAgICBmb3IgKGNvbnN0IGJpdCBvZiBhZGRyZXNzQml0cykge1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50OChOdW1iZXIucGFyc2VJbnQoYml0LCAxMCkgXiAweGZmKTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS53cml0ZVVTaG9ydCh2YWx1ZS5wb3J0KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnZlcnNpb24gPT09IDYpIHtcbiAgICAgIHN0cmVhbS53cml0ZVVTaG9ydCgyMyk7XG4gICAgICBzdHJlYW0ud3JpdGVVU2hvcnQodmFsdWUucG9ydCk7XG4gICAgICBzdHJlYW0ud3JpdGVVaW50MzIoMCk7XG4gICAgICBjb25zdCBhZGRyZXNzUGFydHMgPSB2YWx1ZS5hZGRyZXNzLnNwbGl0KFwiOlwiKTtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBhZGRyZXNzUGFydHMpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KHBhcnQsIDE2KTtcbiAgICAgICAgc3RyZWFtLndyaXRlVVNob3J0KG51bSBeIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJlYW0ud3JpdGVVaW50MzIoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBBZGRyZXNzIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBBZGRyZXNzIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZChzdHJlYW06IEJpbmFyeVN0cmVhbSk6IEFkZHJlc3Mge1xuICAgIGNvbnN0IHZlcnNpb24gPSBzdHJlYW0ucmVhZFVpbnQ4KCk7XG4gICAgaWYgKHZlcnNpb24gPT09IDQpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gc3RyZWFtLnJlYWQoNCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gYnl0ZXMubWFwKChieXRlKSA9PiAoYnl0ZSBeIDB4ZmYpLnRvU3RyaW5nKCkpLmpvaW4oXCIuXCIpO1xuICAgICAgY29uc3QgcG9ydCA9IHN0cmVhbS5yZWFkVVNob3J0KCk7XG4gICAgICByZXR1cm4gbmV3IEFkZHJlc3MoYWRkcmVzcywgcG9ydCwgdmVyc2lvbik7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uID09PSA2KSB7XG4gICAgICBzdHJlYW0uc2tpcCgyKTtcbiAgICAgIGNvbnN0IHBvcnQgPSBzdHJlYW0ucmVhZFVTaG9ydCgpO1xuICAgICAgc3RyZWFtLnNraXAoNCk7XG4gICAgICBjb25zdCBhZGRyZXNzUGFydHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBzdHJlYW0ucmVhZFVTaG9ydCgpIF4gMHhmZmZmO1xuICAgICAgICBhZGRyZXNzUGFydHMucHVzaChwYXJ0LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCBcIjBcIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgYWRkcmVzcyA9IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKTtcbiAgICAgIHN0cmVhbS5za2lwKDQpO1xuICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzKGFkZHJlc3MsIHBvcnQsIHZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFkZHJlc3MoXCJcIiwgMCwgMCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyB0eXBlIEJpbmFyeVN0cmVhbSwgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgQml0ZmxhZ3MsIFJlbGlhYmlsaXR5IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBmcmFtZSBkYXRhIHR5cGUuXG4gKiBGcmFtZSBpcyB1c2VkIHdoZW4gc2VuZGluZyBkYXRhIGluIFJha05ldC5cbiAqL1xuY2xhc3MgRnJhbWUgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVsaWFiaWxpdHkgb2YgdGhlIGZyYW1lLlxuICAgKi9cbiAgcHVibGljIHJlbGlhYmlsaXR5ITogUmVsaWFiaWxpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxpYWJsZSBpbmRleCBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBwdWJsaWMgcmVsaWFibGVJbmRleCE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHNlcXVlbmNlIGluZGV4IG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBzZXF1ZW5jZUluZGV4ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JkZXIgaW5kZXggb2YgdGhlIGZyYW1lLlxuICAgKi9cbiAgcHVibGljIG9yZGVySW5kZXghOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBjaGFubmVsIG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBvcmRlckNoYW5uZWwhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGxpdCBzaXplIG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBzcGxpdFNpemUhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGxpdCBpZCBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBwdWJsaWMgc3BsaXRJZCE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHNwbGl0IGluZGV4IG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBzcGxpdEluZGV4ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF5bG9hZCBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBwdWJsaWMgcGF5bG9hZCE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBmcmFtZSBpcyBzcGxpdC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZnJhbWUgaXMgc3BsaXQ7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgaXNTcGxpdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdFNpemUgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZnJhbWUgaXMgcmVsaWFibGUuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZyYW1lIGlzIHJlbGlhYmxlOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGlzUmVsaWFibGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGUsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZVNlcXVlbmNlZCxcbiAgICAgIFJlbGlhYmlsaXR5LlJlbGlhYmxlV2l0aEFja1JlY2VpcHQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxuICAgIF07XG5cbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHRoaXMucmVsaWFiaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZnJhbWUgaXMgc2VxdWVuY2VkLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmcmFtZSBpcyBzZXF1ZW5jZWQ7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgaXNTZXF1ZW5jZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGVTZXF1ZW5jZWQsXG4gICAgICBSZWxpYWJpbGl0eS5VbnJlbGlhYmxlU2VxdWVuY2VkXG4gICAgXTtcblxuICAgIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModGhpcy5yZWxpYWJpbGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBmcmFtZSBpcyBvcmRlcmVkLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmcmFtZSBpcyBvcmRlcmVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGlzT3JkZXJlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBSZWxpYWJpbGl0eS5VbnJlbGlhYmxlU2VxdWVuY2VkLFxuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGVPcmRlcmVkLFxuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGVTZXF1ZW5jZWQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxuICAgIF07XG5cbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHRoaXMucmVsaWFiaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZnJhbWUgaXMgb3JkZXIgZXhjbHVzaXZlLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmcmFtZSBpcyBvcmRlciBleGNsdXNpdmU7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgaXNPcmRlckV4Y2x1c2l2ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxuICAgIF07XG5cbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHRoaXMucmVsaWFiaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBmcmFtZS5cbiAgICogQHJldHVybnMgVGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXRCeXRlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIDMgK1xuICAgICAgdGhpcy5wYXlsb2FkLmJ5dGVMZW5ndGggK1xuICAgICAgKHRoaXMuaXNSZWxpYWJsZSgpID8gMyA6IDApICtcbiAgICAgICh0aGlzLmlzU2VxdWVuY2VkKCkgPyAzIDogMCkgK1xuICAgICAgKHRoaXMuaXNPcmRlcmVkKCkgPyA0IDogMCkgK1xuICAgICAgKHRoaXMuaXNTcGxpdCgpID8gMTAgOiAwKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIEZyYW1lIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBGcmFtZSBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBBcnJheTxGcmFtZT4ge1xuICAgIC8vIFByZXBhcmUgYW4gYXJyYXkgdG8gc3RvcmUgdGhlIGZyYW1lcy5cbiAgICBjb25zdCBmcmFtZXM6IEFycmF5PEZyYW1lPiA9IFtdO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzdHJlYW0gdW50aWwgdGhlIGVuZC5cbiAgICBkbyB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgZnJhbWUuXG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBGcmFtZSgpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgYW5kIG1hc2sgdGhlIHJlbGlhYmlsaXR5LlxuICAgICAgY29uc3QgaGVhZGVyID0gc3RyZWFtLnJlYWRVaW50OCgpO1xuICAgICAgZnJhbWUucmVsaWFiaWxpdHkgPSAoaGVhZGVyICYgMHhlMCkgPj4gNTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNwbGl0LlxuICAgICAgY29uc3Qgc3BsaXQgPSAoaGVhZGVyICYgQml0ZmxhZ3MuU3BsaXQpICE9PSAwO1xuXG4gICAgICAvLyBSZWFkIGFuZCBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgYm9keS5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGguY2VpbChzdHJlYW0ucmVhZFVpbnQxNigpIC8gOCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBpcyByZWxpYWJsZS5cbiAgICAgIC8vIElmIHNvLCByZWFkIHRoZSByZWxpYWJsZSBpbmRleC5cbiAgICAgIGlmIChmcmFtZS5pc1JlbGlhYmxlKCkpIHtcbiAgICAgICAgZnJhbWUucmVsaWFibGVJbmRleCA9IHN0cmVhbS5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNlcXVlbmNlZC5cbiAgICAgIC8vIElmIHNvLCByZWFkIHRoZSBzZXF1ZW5jZSBpbmRleC5cbiAgICAgIGlmIChmcmFtZS5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICAgIGZyYW1lLnNlcXVlbmNlSW5kZXggPSBzdHJlYW0ucmVhZFVpbnQyNChFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBpcyBvcmRlcmVkLlxuICAgICAgLy8gSWYgc28sIHJlYWQgdGhlIG9yZGVyIGluZGV4IGFuZCBjaGFubmVsLlxuICAgICAgaWYgKGZyYW1lLmlzT3JkZXJlZCgpKSB7XG4gICAgICAgIGZyYW1lLm9yZGVySW5kZXggPSBzdHJlYW0ucmVhZFVpbnQyNChFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgIGZyYW1lLm9yZGVyQ2hhbm5lbCA9IHN0cmVhbS5yZWFkVWludDgoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNwbGl0LlxuICAgICAgLy8gSWYgc28sIHJlYWQgdGhlIGZyYWdtZW50IHNpemUsIGlkIGFuZCBpbmRleC5cbiAgICAgIGlmIChzcGxpdCkge1xuICAgICAgICBmcmFtZS5zcGxpdFNpemUgPSBzdHJlYW0ucmVhZFVpbnQzMigpO1xuICAgICAgICBmcmFtZS5zcGxpdElkID0gc3RyZWFtLnJlYWRVaW50MTYoKTtcbiAgICAgICAgZnJhbWUuc3BsaXRJbmRleCA9IHN0cmVhbS5yZWFkVWludDMyKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHBheWxvYWQuXG4gICAgICBmcmFtZS5wYXlsb2FkID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgLy8gQWRkIHRoZSBmcmFtZSB0byB0aGUgYXJyYXkuXG4gICAgICBmcmFtZXMucHVzaChmcmFtZSk7XG4gICAgfSB3aGlsZSAoIXN0cmVhbS5jdXJzb3JBdEVuZCgpKTtcblxuICAgIC8vIFJldHVybiB0aGUgZnJhbWVzLlxuICAgIHJldHVybiBmcmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBGcmFtZSBkYXRhIHR5cGUgdG8gYSBiaW5hcnkgc3RyZWFtLlxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3cml0ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgdmFsdWU6IEFycmF5PEZyYW1lPik6IHZvaWQge1xuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZnJhbWVzLlxuICAgIC8vIFdyaXRpbmcgZWFjaCBmcmFtZSB0byB0aGUgc3RyZWFtLlxuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgdmFsdWUpIHtcbiAgICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIgd2l0aCB0aGUgcmVsaWFiaWxpdHkgYW5kIHNwbGl0IGZsYWcuXG4gICAgICBzdHJlYW0ud3JpdGVVaW50OChcbiAgICAgICAgKGZyYW1lLnJlbGlhYmlsaXR5IDw8IDUpIHwgKGZyYW1lLmlzU3BsaXQoKSA/IEJpdGZsYWdzLlNwbGl0IDogMClcbiAgICAgICk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIHBheWxvYWQuXG4gICAgICBzdHJlYW0ud3JpdGVVaW50MTYoZnJhbWUucGF5bG9hZC5ieXRlTGVuZ3RoIDw8IDMpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZnJhbWUgaXMgcmVsaWFibGUuXG4gICAgICAvLyBJZiBzbywgd3JpdGUgdGhlIHJlbGlhYmxlIGluZGV4LlxuICAgICAgaWYgKGZyYW1lLmlzUmVsaWFibGUoKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQoZnJhbWUucmVsaWFibGVJbmRleCBhcyBudW1iZXIsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNlcXVlbmNlZC5cbiAgICAgIC8vIElmIHNvLCB3cml0ZSB0aGUgc2VxdWVuY2UgaW5kZXguXG4gICAgICBpZiAoZnJhbWUuaXNTZXF1ZW5jZWQoKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQoZnJhbWUuc2VxdWVuY2VJbmRleCBhcyBudW1iZXIsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIG9yZGVyZWQuXG4gICAgICAvLyBJZiBzbywgd3JpdGUgdGhlIG9yZGVyIGluZGV4IGFuZCBjaGFubmVsLlxuICAgICAgaWYgKGZyYW1lLmlzT3JkZXJlZCgpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChmcmFtZS5vcmRlckluZGV4IGFzIG51bWJlciwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50OChmcmFtZS5vcmRlckNoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZnJhbWUgaXMgc3BsaXQuXG4gICAgICAvLyBJZiBzbywgd3JpdGUgdGhlIGZyYWdtZW50IHNpemUsIGlkIGFuZCBpbmRleC5cbiAgICAgIGlmIChmcmFtZS5pc1NwbGl0KCkpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlVWludDMyKGZyYW1lLnNwbGl0U2l6ZSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQxNihmcmFtZS5zcGxpdElkKTtcbiAgICAgICAgc3RyZWFtLndyaXRlVWludDMyKGZyYW1lLnNwbGl0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSB0aGUgcGF5bG9hZC5cbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihmcmFtZS5wYXlsb2FkKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgRnJhbWUgfTtcbiIsICIvLyBOT1RFOiBQbGVhc2Uga2VlcCBhbGwgcGFja2V0cyBpbiBudW1lcmljYWwgb3JkZXIgYnkgdGhlaXIgaWQuIFRoYW5rcyFcblxuZW51bSBQYWNrZXQge1xuICBDb25uZWN0ZWRQaW5nID0gMHgwMCwgLy8gMFxuICBVbmNvbm5lY3RlZFBpbmcgPSAweDAxLCAvLyAxXG4gIENvbm5lY3RlZFBvbmcgPSAweDAzLCAvLyAzXG4gIE9wZW5Db25uZWN0aW9uUmVxdWVzdDEgPSAweDA1LCAvLyA1XG4gIE9wZW5Db25uZWN0aW9uUmVwbHkxID0gMHgwNiwgLy8gNlxuICBPcGVuQ29ubmVjdGlvblJlcXVlc3QyID0gMHgwNywgLy8gN1xuICBPcGVuQ29ubmVjdGlvblJlcGx5MiA9IDB4MDgsIC8vIDhcbiAgQ29ubmVjdGlvblJlcXVlc3QgPSAweDA5LCAvLyA5XG4gIENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQgPSAweDEwLCAvLyAxNlxuICBOZXdJbmNvbWluZ0Nvbm5lY3Rpb24gPSAweDEzLCAvLyAxOVxuICBEaXNjb25uZWN0ID0gMHgxNSwgLy8gMjFcbiAgSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uID0gMHgxOSwgLy8gMjVcbiAgVW5jb25uZWN0ZWRQb25nID0gMHgxYywgLy8gMjhcbiAgRnJhbWVTZXQgPSAweDgwLCAvLyAxMjhcbiAgTmFjayA9IDB4YTAsIC8vIDE2MFxuICBBY2sgPSAweGMwIC8vIDE5MlxufVxuXG5leHBvcnQgeyBQYWNrZXQgfTtcbiIsICJlbnVtIEJpdGZsYWdzIHtcbiAgVmFsaWQgPSAweDgwLFxuICBBY2sgPSAweDQwLFxuICBOYWsgPSAweDIwLFxuICBTcGxpdCA9IDB4MTBcbn1cblxuZXhwb3J0IHsgQml0ZmxhZ3MgfTtcbiIsICJlbnVtIFByaW9yaXR5IHtcbiAgTm9ybWFsLFxuICBJbW1lZGlhdGVcbn1cblxuZXhwb3J0IHsgUHJpb3JpdHkgfTtcbiIsICJlbnVtIFN0YXR1cyB7XG4gIENvbm5lY3RpbmcsXG4gIENvbm5lY3RlZCxcbiAgRGlzY29ubmVjdGluZyxcbiAgRGlzY29ubmVjdGVkXG59XG5cbmV4cG9ydCB7IFN0YXR1cyB9O1xuIiwgImVudW0gUmVsaWFiaWxpdHkge1xuICBVbnJlbGlhYmxlLFxuICBVbnJlbGlhYmxlU2VxdWVuY2VkLFxuICBSZWxpYWJsZSxcbiAgUmVsaWFibGVPcmRlcmVkLFxuICBSZWxpYWJsZVNlcXVlbmNlZCxcbiAgVW5yZWxpYWJsZVdpdGhBY2tSZWNlaXB0LFxuICBSZWxpYWJsZVdpdGhBY2tSZWNlaXB0LFxuICBSZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxufVxuXG5leHBvcnQgeyBSZWxpYWJpbGl0eSB9O1xuIiwgImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gXCIuL2FkZHJlc3NcIjtcblxuaW1wb3J0IHR5cGUgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5pbXBvcnQgdHlwZSB7IE5ldHdvcmtJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBhZGRyZXNzIGRhdGEgdHlwZS5cbiAqIEFkZHJlc3MgaXMgdXNlZCB3aGVuIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gaW4gUmFrTmV0LlxuICovXG5jbGFzcyBTeXN0ZW1BZGRyZXNzIGV4dGVuZHMgRGF0YVR5cGUge1xuICAvKipcbiAgICogQ29udmVydHMgdGhlIEFkZHJlc3MgZGF0YSB0eXBlIHRvIGEgTmV0d29ya0lkZW50aWZpZXIuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBOZXR3b3JrSWRlbnRpZmllci5cbiAgICogQHJldHVybnMgVGhlIE5ldHdvcmtJZGVudGlmaWVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSWRlbnRpZmllcihpZGVudGlmaWVyOiBOZXR3b3JrSWRlbnRpZmllcik6IEFkZHJlc3Mge1xuICAgIHJldHVybiBuZXcgQWRkcmVzcyhpZGVudGlmaWVyLmFkZHJlc3MsIGlkZW50aWZpZXIucG9ydCwgaWRlbnRpZmllci52ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgQWRkcmVzcyBkYXRhIHR5cGUgZnJvbSBhIGJpbmFyeSBzdHJlYW0uXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgQWRkcmVzcyBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBBcnJheTxBZGRyZXNzPiB7XG4gICAgLy8gUHJlcGFyZSB0aGUgYWRkcmVzc2VzIGFycmF5LlxuICAgIGNvbnN0IGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz4gPSBbXTtcblxuICAgIC8vIFJlYWQgdGhlIGFkZHJlc3Nlcy5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMjA7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBBZGRyZXNzLnJlYWQoc3RyZWFtKTtcbiAgICAgIGFkZHJlc3Nlcy5wdXNoKGFkZHJlc3MpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgYWRkcmVzc2VzLlxuICAgIHJldHVybiBhZGRyZXNzZXM7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBBZGRyZXNzIGRhdGEgdHlwZSB0byBhIGJpbmFyeSBzdHJlYW0uXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gd3JpdGUgdG8uXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHdyaXRlKHN0cmVhbTogQmluYXJ5U3RyZWFtKTogdm9pZCB7XG4gICAgY29uc3QgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPiA9IFtcbiAgICAgIHsgYWRkcmVzczogXCIxMjcuMC4wLjFcIiwgcG9ydDogMCwgdmVyc2lvbjogNCB9XG4gICAgXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMjA7IGluZGV4KyspIHtcbiAgICAgIEFkZHJlc3Mud3JpdGUoXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgYWRkcmVzc2VzW2luZGV4XSB8fCB7IGFkZHJlc3M6IFwiMC4wLjAuMFwiLCBwb3J0OiAwLCB2ZXJzaW9uOiA0IH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFN5c3RlbUFkZHJlc3MgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0sIFVpbnQ4IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkVHlwZXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcGFja2V0LlxuICovXG5hYnN0cmFjdCBjbGFzcyBCYXNlUGFja2V0IGV4dGVuZHMgQmluYXJ5U3RyZWFtIHtcbiAgLyoqXG4gICAqIFRoZSBwYWNrZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWNrZXQgaWQgZGF0YSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZF90eXBlOiBWYWxpZFR5cGVzID0gVWludDg7XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhlIGJpbmFyeSBzdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgdGhpcy5iaW5hcnkgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYWNrZXQgaWQuXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0SWQoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlUGFja2V0LmdldElkKCkgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYWNrZXQgaWQgZGF0YSB0eXBlLlxuICAgKiBAcmV0dXJucyBUaGUgcGFja2V0IGlkIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJZFR5cGUoKTogVmFsaWRUeXBlcyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQmFzZVBhY2tldC5nZXRJZFR5cGUoKSBpcyBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIHBhY2tldC5cbiAgICogQHJldHVybnMgVGhlIHNlcmlhbGl6ZWQgcGFja2V0LlxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpOiBCdWZmZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkJhc2VQYWNrZXQuc2VyaWFsaXplKCkgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgdGhlIHBhY2tldC5cbiAgICovXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZSgpOiB0aGlzIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlUGFja2V0LmRlc2VyaWFsaXplKCkgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCYXNlUGFja2V0IH07XG4iLCAiaW1wb3J0IHsgTG9uZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IE1hZ2ljIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiB1bmNvbm5lY3RlZCBwaW5nIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5VbmNvbm5lY3RlZFBpbmcpXG5jbGFzcyBVbmNvbm5lY3RlZFBpbmcgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHBpbmcuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyB0aW1lc3RhbXAhOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcGluZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIGNsaWVudCBndWlkIG9mIHRoZSBwaW5nLlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgY2xpZW50ITogYmlnaW50O1xufVxuXG5leHBvcnQgeyBVbmNvbm5lY3RlZFBpbmcgfTtcbiIsICJpbXBvcnQgeyBMb25nLCBTdHJpbmcxNiB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IE1hZ2ljIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiB1bmNvbm5lY3RlZCBwb25nIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5VbmNvbm5lY3RlZFBvbmcpXG5jbGFzcyBVbmNvbm5lY3RlZFBvbmcgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHBvbmcuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyB0aW1lc3RhbXAhOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZ3VpZCBvZiB0aGUgcG9uZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIGd1aWQhOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcG9uZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBtZXNzYWdlIG9mIHRoZSBwb25nLlxuICAgKi9cbiAgQFNlcmlhbGl6ZShTdHJpbmcxNikgcHVibGljIG1lc3NhZ2UhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB7IFVuY29ubmVjdGVkUG9uZyB9O1xuIiwgImltcG9ydCB7IFVpbnQ4IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgTVRVLCBNYWdpYyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMSBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSlcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVxdWVzdDEgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKFVpbnQ4KSBwdWJsaWMgcHJvdG9jb2whOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRyYW5zZmVyIHVuaXQgb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKE1UVSkgcHVibGljIG10dSE6IG51bWJlcjtcbn1cblxuZXhwb3J0IHsgT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSB9O1xuIiwgImltcG9ydCB7IExvbmcsIEJvb2wsIFNob3J0IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgTWFnaWMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgQmFzZVBhY2tldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wZW4gY29ubmVjdGlvbiByZXBseSAxIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5PcGVuQ29ubmVjdGlvblJlcGx5MSlcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVwbHkxIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIC8qKlxuICAgKiBUaGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShNYWdpYykgcHVibGljIG1hZ2ljITogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGd1aWQgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgZ3VpZCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogSWYgcmFrbmV0IGlzIHVzaW5nIHNlY3VyaXR5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShCb29sKSBwdWJsaWMgc2VjdXJpdHkhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0cmFuc2ZlciB1bml0IG9mIHRoZSByZXBseS5cbiAgICovXG4gIEBTZXJpYWxpemUoU2hvcnQpIHB1YmxpYyBtdHUhOiBudW1iZXI7XG59XG5cbmV4cG9ydCB7IE9wZW5Db25uZWN0aW9uUmVwbHkxIH07XG4iLCAiaW1wb3J0IHsgTG9uZywgU2hvcnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBBZGRyZXNzLCBNYWdpYyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMiBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MilcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVxdWVzdDIgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKEFkZHJlc3MpIHB1YmxpYyBhZGRyZXNzITogQWRkcmVzcztcblxuICAvKipcbiAgICogVGhlIG10dSBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoU2hvcnQpIHB1YmxpYyBtdHUhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZ3VpZCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIGNsaWVudCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MiB9O1xuIiwgImltcG9ydCB7IExvbmcsIEJvb2wsIFNob3J0IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQWRkcmVzcywgTWFnaWMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgQmFzZVBhY2tldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5PcGVuQ29ubmVjdGlvblJlcGx5MilcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVwbHkyIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIC8qKlxuICAgKiBUaGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShNYWdpYykgcHVibGljIG1hZ2ljITogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGd1aWQgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgZ3VpZCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogQ2xpZW50IGFkcnJlc3MuXG4gICAqL1xuICBAU2VyaWFsaXplKEFkZHJlc3MpIHB1YmxpYyBhZGRyZXNzITogQWRkcmVzcztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdHJhbnNmZXIgdW5pdCBvZiB0aGUgcmVwbHkuXG4gICAqL1xuICBAU2VyaWFsaXplKFNob3J0KSBwdWJsaWMgbXR1ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiByYWtuZXQgaXMgdXNpbmcgZW5jcnlwdGlvbi5cbiAgICovXG4gIEBTZXJpYWxpemUoQm9vbCkgcHVibGljIGVuY3J5cHRpb24hOiBib29sZWFuO1xufVxuXG5leHBvcnQgeyBPcGVuQ29ubmVjdGlvblJlcGx5MiB9O1xuIiwgImltcG9ydCB7IExvbmcgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBjb25uZWN0ZWQgcG9uZyBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuQ29ubmVjdGVkUG9uZylcbmNsYXNzIENvbm5lY3RlZFBvbmcgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHBpbmcuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyBwaW5nVGltZXN0YW1wITogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBwb25nLlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgdGltZXN0YW1wITogYmlnaW50O1xufVxuXG5leHBvcnQgeyBDb25uZWN0ZWRQb25nIH07XG4iLCAiaW1wb3J0IHsgTG9uZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmFzZVBhY2tldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGNvbm5lY3RlZCBwaW5nIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5Db25uZWN0ZWRQaW5nKVxuY2xhc3MgQ29ubmVjdGVkUGluZyBleHRlbmRzIEJhc2VQYWNrZXQge1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgcGluZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIHRpbWVzdGFtcCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgQ29ubmVjdGVkUGluZyB9O1xuIiwgImltcG9ydCB7IExvbmcgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBjb25uZWN0aW9uIHJlcXVlc3QgcGFja2V0LlxuICovXG5AUHJvdG8oUGFja2V0LkNvbm5lY3Rpb25SZXF1ZXN0KVxuY2xhc3MgQ29ubmVjdGlvblJlcXVlc3QgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZ3VpZCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIGNsaWVudCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIHRpbWVzdGFtcCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgQ29ubmVjdGlvblJlcXVlc3QgfTtcbiIsICJpbXBvcnQgeyBFbmRpYW5uZXNzLCBVaW50MjQgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBGcmFtZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBmcmFtZSBzZXQgcGFja2V0LlxuICogVGhpcyBwYWNrZXQgaG9sZCBtdWx0aXBsZSBmcmFtZXMuXG4gKi9cbkBQcm90byhQYWNrZXQuRnJhbWVTZXQpXG5jbGFzcyBGcmFtZVNldCBleHRlbmRzIEJhc2VQYWNrZXQge1xuICAvKipcbiAgICogVGhlIHNlcXVlbmNlIG9mIHRoZSBmcmFtZSBzZXQuXG4gICAqL1xuICBAU2VyaWFsaXplKFVpbnQyNCwgRW5kaWFubmVzcy5MaXR0bGUpIHB1YmxpYyBzZXF1ZW5jZSE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZyYW1lcyBvZiB0aGUgZnJhbWUgc2V0LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShGcmFtZSkgcHVibGljIGZyYW1lcyE6IEFycmF5PEZyYW1lPjtcbn1cblxuZXhwb3J0IHsgRnJhbWVTZXQgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0sIEVuZGlhbm5lc3MgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5AUHJvdG8oUGFja2V0LkFjaylcbmNsYXNzIEFjayBleHRlbmRzIEJhc2VQYWNrZXQge1xuICBwdWJsaWMgc2VxdWVuY2VzOiBBcnJheTxudW1iZXI+ID0gW107XG5cbiAgLy8gT3ZlcnJpZGUgZW5jb2RlIGR1ZSB0byBjdXN0b20gbG9naWMsIG1heWJlIG1vdmUgaW50byBvd24gdHlwZT9cbiAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBCdWZmZXIge1xuICAgIHRoaXMud3JpdGVVaW50OChBY2suaWQpO1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VxdWVuY2VzLmxlbmd0aDtcbiAgICBsZXQgcmVjb3JkcyA9IDA7XG5cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICBsZXQgY3Vyc29yID0gMDtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuc2VxdWVuY2VzWzBdIGFzIG51bWJlcjtcbiAgICAgIGxldCBsYXN0ID0gdGhpcy5zZXF1ZW5jZXNbMF0gYXMgbnVtYmVyO1xuXG4gICAgICB3aGlsZSAoY3Vyc29yIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VxdWVuY2VzW2N1cnNvcisrXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBjdXJyZW50IC0gbGFzdDtcbiAgICAgICAgaWYgKGRpZmYgPT09IDEpIHtcbiAgICAgICAgICBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gMSkge1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbCh0cnVlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdGFydCA9IGxhc3QgPSBjdXJyZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sKGZhbHNlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQobGFzdCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgICAgICAgc3RhcnQgPSBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICArK3JlY29yZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGFzdCBpdGVyYXRpb25cbiAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sKHRydWUpOyAvLyBzaW5nbGU/XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChzdGFydCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbChmYWxzZSk7IC8vIHNpbmdsZT9cbiAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChsYXN0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICB9XG5cbiAgICAgICsrcmVjb3JkcztcblxuICAgICAgdGhpcy53cml0ZVVTaG9ydChyZWNvcmRzKTtcbiAgICAgIHRoaXMud3JpdGVCdWZmZXIoc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGRlY29kZSBkdWUgdG8gY3VzdG9tIGxvZ2ljLCBtYXliZSBtb3ZlIGludG8gb3duIHR5cGU/XG4gIHB1YmxpYyBvdmVycmlkZSBkZXNlcmlhbGl6ZSgpOiB0aGlzIHtcbiAgICB0aGlzLnJlYWRVaW50OCgpO1xuICAgIHRoaXMuc2VxdWVuY2VzID0gW107XG4gICAgY29uc3QgcmVjb3JkQ291bnQgPSB0aGlzLnJlYWRVU2hvcnQoKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVjb3JkQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yZWFkQm9vbCgpOyAvLyBGYWxzZSBmb3IgcmFuZ2UsIFRydWUgZm9yIG5vIHJhbmdlXG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaCh0aGlzLnJlYWRVaW50MjQoRW5kaWFubmVzcy5MaXR0bGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPD0gZW5kOyBpbmRleCsrKSB7XG4gICAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBBY2sgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0sIEVuZGlhbm5lc3MgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5AUHJvdG8oUGFja2V0Lk5hY2spXG5jbGFzcyBOYWNrIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIHB1YmxpYyBzZXF1ZW5jZXM6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICAvLyBPdmVycmlkZSBlbmNvZGUgZHVlIHRvIGN1c3RvbSBsb2dpYywgbWF5YmUgbW92ZSBpbnRvIG93biB0eXBlP1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IEJ1ZmZlciB7XG4gICAgdGhpcy53cml0ZVVpbnQ4KE5hY2suaWQpO1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VxdWVuY2VzLmxlbmd0aDtcbiAgICBsZXQgcmVjb3JkcyA9IDA7XG5cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICBsZXQgY3Vyc29yID0gMDtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuc2VxdWVuY2VzWzBdIGFzIG51bWJlcjtcbiAgICAgIGxldCBsYXN0ID0gdGhpcy5zZXF1ZW5jZXNbMF0gYXMgbnVtYmVyO1xuXG4gICAgICB3aGlsZSAoY3Vyc29yIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VxdWVuY2VzW2N1cnNvcisrXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBjdXJyZW50IC0gbGFzdDtcbiAgICAgICAgaWYgKGRpZmYgPT09IDEpIHtcbiAgICAgICAgICBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gMSkge1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbCh0cnVlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdGFydCA9IGxhc3QgPSBjdXJyZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sKGZhbHNlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQobGFzdCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgICAgICAgc3RhcnQgPSBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICArK3JlY29yZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGFzdCBpdGVyYXRpb25cbiAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sKHRydWUpOyAvLyBzaW5nbGU/XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChzdGFydCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbChmYWxzZSk7IC8vIHNpbmdsZT9cbiAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChsYXN0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICB9XG5cbiAgICAgICsrcmVjb3JkcztcblxuICAgICAgdGhpcy53cml0ZVVTaG9ydChyZWNvcmRzKTtcbiAgICAgIHRoaXMud3JpdGVCdWZmZXIoc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGRlY29kZSBkdWUgdG8gY3VzdG9tIGxvZ2ljLCBtYXliZSBtb3ZlIGludG8gb3duIHR5cGU/XG4gIHB1YmxpYyBvdmVycmlkZSBkZXNlcmlhbGl6ZSgpOiB0aGlzIHtcbiAgICB0aGlzLnJlYWRVaW50OCgpO1xuICAgIHRoaXMuc2VxdWVuY2VzID0gW107XG4gICAgY29uc3QgcmVjb3JkQ291bnQgPSB0aGlzLnJlYWRVU2hvcnQoKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVjb3JkQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yZWFkQm9vbCgpOyAvLyBGYWxzZSBmb3IgcmFuZ2UsIFRydWUgZm9yIG5vIHJhbmdlXG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaCh0aGlzLnJlYWRVaW50MjQoRW5kaWFubmVzcy5MaXR0bGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPD0gZW5kOyBpbmRleCsrKSB7XG4gICAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBOYWNrIH07XG4iLCAiaW1wb3J0IHsgUHJvdG8gfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRpc2Nvbm5lY3QgcGFja2V0LlxuICovXG5AUHJvdG8oUGFja2V0LkRpc2Nvbm5lY3QpXG5jbGFzcyBEaXNjb25uZWN0IGV4dGVuZHMgQmFzZVBhY2tldCB7fVxuXG5leHBvcnQgeyBEaXNjb25uZWN0IH07XG4iLCAiaW1wb3J0IHsgVWludDgsIFVpbnQ2NCB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IE1hZ2ljIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVuIGNvbm5lY3Rpb24gcmVwbHkgMSBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uKVxuY2xhc3MgSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIEBTZXJpYWxpemUoVWludDgpIHB1YmxpYyBwcm90b2NvbCE6IG51bWJlcjtcbiAgQFNlcmlhbGl6ZShNYWdpYykgcHVibGljIG1hZ2ljITogQnVmZmVyO1xuICBAU2VyaWFsaXplKFVpbnQ2NCkgcHVibGljIGd1aWQhOiBiaWdpbnQ7XG59XG5cbmV4cG9ydCB7IEluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbiB9O1xuIiwgImltcG9ydCB7IExvbmcsIFNob3J0IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQWRkcmVzcywgU3lzdGVtQWRkcmVzcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gY29ubmVjdGlvbiByZXF1ZXN0IGFjY2VwdGVkIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5Db25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkKVxuY2xhc3MgQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCBleHRlbmRzIEJhc2VQYWNrZXQge1xuICAvKipcbiAgICogVGhlIGNsaWVudCBhZGRyZXNzIG9mIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShBZGRyZXNzKSBwdWJsaWMgYWRkcmVzcyE6IEFkZHJlc3M7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gaW5kZXggb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKFNob3J0KSBwdWJsaWMgc3lzdGVtSW5kZXghOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gYWRkcmVzcyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoU3lzdGVtQWRkcmVzcykgcHVibGljIHN5c3RlbUFkZHJlc3MhOiBBcnJheTxBZGRyZXNzPjtcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgdGltZXN0YW1wIG9mIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgcmVxdWVzdFRpbWVzdGFtcCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIHRpbWVzdGFtcCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCB9O1xuIiwgImltcG9ydCB7IExvbmcgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVuIGNvbm5lY3Rpb24gcmVwbHkgMSBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuTmV3SW5jb21pbmdDb25uZWN0aW9uKVxuY2xhc3MgTmV3SW5jb21pbmdDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIC8qKlxuICAgKiB0aGUgc2VydmVyIGFkcmVzcyBvZiB0aGUgcmVwbHkuXG4gICAqL1xuICBAU2VyaWFsaXplKEFkZHJlc3MpIHB1YmxpYyBzZXJ2ZXJBZGRyZXNzITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB1bmtub3duIHdoYXQgdGhpcyBpcyB1c2VkIGZvci5cbiAgICovXG4gIEBTZXJpYWxpemUoQWRkcmVzcykgcHVibGljIGludGVybmFsQWRkcmVzcyE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGluY29taW5nIHRpbWVzdGFtcCBvZiB0aGUgcmVwbHkuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyBpbmNvbWluZ1RpbWVzdGFtcCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHNlcnZlciB0aW1lc3RhbXAgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgc2VydmVyVGltZXN0YW1wITogYmlnaW50O1xufVxuXG5leHBvcnQgeyBOZXdJbmNvbWluZ0Nvbm5lY3Rpb24gfTtcbiIsICJpbXBvcnQgeyB0eXBlIFJlbW90ZUluZm8sIFNvY2tldCwgY3JlYXRlU29ja2V0IH0gZnJvbSBcIm5vZGU6ZGdyYW1cIjtcblxuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHtcbiAgTUFYX01UVV9TSVpFLFxuICBNSU5fTVRVX1NJWkUsXG4gIFJBS05FVF9QUk9UT0NPTCxcbiAgUkFLTkVUX1RJQ0tfTEVOXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEJpdGZsYWdzIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IE9mZmxpbmUgfSBmcm9tIFwiLi9vZmZsaW5lXCI7XG5cbmltcG9ydCB0eXBlIHsgUmFrbmV0RXZlbnRzLCBSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9jb25uZWN0aW9uXCI7XG5cbmNvbnN0IERlZmF1bHRSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzOiBSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzID0ge1xuICBhZGRyZXNzOiBcIjAuMC4wLjBcIixcbiAgcG9ydDogMTkxMzIsXG4gIHByb3RvY29sOiBSQUtORVRfUFJPVE9DT0wsXG4gIHZlcnNpb246IFwiMS4wLjBcIixcbiAgbWVzc2FnZTogXCJSYWtuZXQgU2VydmVyXCIsXG4gIG1heENvbm5lY3Rpb25zOiA0MCxcbiAgbXR1TWF4U2l6ZTogTUFYX01UVV9TSVpFLFxuICBtdHVNaW5TaXplOiBNSU5fTVRVX1NJWkVcbn07XG5cbi8qKlxuICogVGhlIHJha25ldCBzZXJ2ZXJcbiAqL1xuY2xhc3MgU2VydmVyIGV4dGVuZHMgRW1pdHRlcjxSYWtuZXRFdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgdGljayBpbnRlcnZhbFxuICAgKi9cbiAgcHJvdGVjdGVkIGludGVydmFsOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgcmFrbmV0IHByb3BlcnRpZXMgZm9yIHRoZSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydGllczogUmFrbmV0U2VydmVyUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIHJha25ldCBzZXJ2ZXIgbG9nZ2VyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlJha25ldFwiLCBMb2dnZXJDb2xvcnMuRGFya0FxdWEpO1xuXG4gIC8qKlxuICAgKiBUaGUgdWRwNCBzb2NrZXQgaW5zdGFuY2UgZm9yIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc29ja2V0OiBTb2NrZXQgPSBjcmVhdGVTb2NrZXQoXCJ1ZHA0XCIpO1xuXG4gIC8qKlxuICAgKiBBIGNvbGxlY3Rpb24gb2YgY29ubmVjdGlvbnMgZm9yIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnMgPSBuZXcgU2V0PENvbm5lY3Rpb24+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZ3VpZCBmb3IgdGhlIHNlcnZlciBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBndWlkID0gQmlnSW50KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIgKiogNjQpKTtcblxuICAvKipcbiAgICogVGhlIGFkZHJlc3MgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFkZHJlc3MgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgc2V0IGFkZHJlc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvcGVydGllcy5hZGRyZXNzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBvcnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgc2V0IHBvcnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy5wb3J0ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXQgc2l6ZSBmb3IgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4TXR1U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMubXR1TWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCBzaXplIGZvciB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIHNldCBtYXhNdHVTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnByb3BlcnRpZXMubXR1TWF4U2l6ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHRyYW5zbWlzc2lvbiB1bml0IHNpemUgZm9yIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbk10dVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm10dU1pblNpemU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gdHJhbnNtaXNzaW9uIHVuaXQgc2l6ZSBmb3IgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgbWluTXR1U2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLm10dU1pblNpemUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm90b2NvbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMucHJvdG9jb2w7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgcHJvdG9jb2wodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy5wcm90b2NvbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmVyc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLnZlcnNpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSBvZiB0aGUgZGF5IG9mIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBvZiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIHNldCBtZXNzYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb3BlcnRpZXMubWVzc2FnZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggY29ubmVjdGlvbnMgb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4Q29ubmVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm1heENvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggY29ubmVjdGlvbnMgb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgbWF4Q29ubmVjdGlvbnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy5tYXhDb25uZWN0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdlYXRoZXIgdGhlIHNlcnZlciBpcyBhbGl2ZVxuICAgKi9cbiAgcHVibGljIGFsaXZlID0gdHJ1ZTtcblxuICAvKipcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzPzogUGFydGlhbDxSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzPikge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHNlcnZlciBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFJha25ldFNlcnZlclByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEJpbmQgdGhlIGluY29taW5nIG1lc3NhZ2VzIHRvIHRoZSBoYW5kbGUgbWV0aG9kXG4gICAgdGhpcy5zb2NrZXQub24oXCJtZXNzYWdlXCIsIHRoaXMuaGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc29ja2V0LnVucmVmKCk7XG5cbiAgICAvLyBCaW5kIHNlcnZlciBpbnN0YW5jZSB0byB0aGUgb2ZmbGluZSBoYW5kbGVyXG4gICAgT2ZmbGluZS5zZXJ2ZXIgPSB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoc2hvdWxkVGljayA9IHRydWUpIHtcbiAgICB0aGlzLnNvY2tldC5iaW5kKHRoaXMucG9ydCwgdGhpcy5hZGRyZXNzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRpY2sgZnVuY3Rpb25cbiAgICBjb25zdCB0aWNrID0gKCkgPT5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2VydmVyIGlzIGFsaXZlLCBpZiBub3QgY2xlYXIgdGhlIGludGVydmFsXG4gICAgICAgIGlmICghdGhpcy5hbGl2ZSB8fCAhdGhpcy5pbnRlcnZhbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbnMgZm9yIHRoZSBzZXJ2ZXJcbiAgICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIGNvbm5lY3Rpb24udGljaygpO1xuXG4gICAgICAgIC8vIENhbGwgdGhlIHRpY2sgbWV0aG9kIGZvciBlYWNoIGNvbm5lY3Rpb25cbiAgICAgICAgcmV0dXJuIHRpY2soKTtcbiAgICAgIH0sIFJBS05FVF9USUNLX0xFTik7XG5cbiAgICAvLyBTZXQgdGhlIGludGVydmFsIHRvIHRoZSB0aWNrIG1ldGhvZFxuICAgIGlmIChzaG91bGRUaWNrKSB0aGlzLmludGVydmFsID0gdGljaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyBzdG9wKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBTZXQgdGhlIHNlcnZlciB0byBub3QgYWxpdmVcbiAgICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcblxuICAgICAgLy8gRGlzY29ubmVjdCBhbGwgY29ubmVjdGlvbnNcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgICAgLy8gQ2xlYXIgdGhlIGludGVydmFsXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkgdGhpcy5pbnRlcnZhbCA9IG51bGw7XG5cbiAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXRcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB2b2lkIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBFcnJvcihcIkZhaWxlZCB0byBjbG9zZSB0aGUgc2VydmVyXCIpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlKGJ1ZmZlcjogQnVmZmVyLCByaW5mbzogUmVtb3RlSW5mbyk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYnVmZmVyLCB0aGlzIGlzIHRoZSBwYWNrZXQgaGVhZGVyLlxuICAgIC8vIFRoZSBwYWNrZXQgaGVhZGVyIGNvbnRhaW5zIHRoZSBwYWNrZXQgaWRlbnRpZmllciBhbmQgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0LlxuICAgIGNvbnN0IGhlYWRlciA9IGJ1ZmZlclswXTtcblxuICAgIC8vIFNhbml0eSBjaGVjayBmb3IgdGhlIHBhY2tldCBoZWFkZXJcbiAgICBpZiAoIWhlYWRlcikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXQgaGVhZGVyXCIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGFncmFtIGlzIGFuIG9mZmxpbmUgcGFja2V0LCBpZiBzbyBoYW5kbGUgaXQgYWNjb3JkaW5nbHlcbiAgICBjb25zdCBvZmZsaW5lID0gKGhlYWRlciAmIEJpdGZsYWdzLlZhbGlkKSA9PT0gMDtcblxuICAgIC8vIEF0dGVtcHQgdG8gZmluZCB0aGUgY29ubmVjdGlvbiBpbiB0aGUgY29ubmVjdGlvbiBzZXRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gWy4uLnRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCldLmZpbmQoXG4gICAgICAoeCkgPT4geC5yaW5mby5hZGRyZXNzID09PSByaW5mby5hZGRyZXNzICYmIHgucmluZm8ucG9ydCA9PT0gcmluZm8ucG9ydFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcmVtb3RlIGNsaWVudCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXJcbiAgICAvLyBBbmQgaWYgdGhlIHJlbW90ZSBjbGllbnQgaXMgc2VuZGluZyBhbiBvZmZsaW5lIHBhY2tldFxuICAgIGlmIChvZmZsaW5lKVxuICAgICAgLy8gUGFzcyB0aGUgYnVmZmVyIGFuZCByZW1vdGUgY2xpZW50IGluZm9ybWF0aW9uIHRvIHRoZSBvZmZsaW5lIGhhbmRsZXJcbiAgICAgIHJldHVybiBPZmZsaW5lLmhhbmRsZShidWZmZXIsIHJpbmZvKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSByZW1vdGUgY2xpZW50IGhhcyBhbiBlc3RhYmxpc2hlZCBjb25uZWN0aW9uIHdpdGggdGhlIHNlcnZlclxuICAgIC8vIEFuZCBpZiB0aGUgcmVtb3RlIGNsaWVudCBpcyBzZW5kaW5nIGEgY29ubmVjdGVkIHBhY2tldFxuICAgIGlmICghb2ZmbGluZSAmJiBjb25uZWN0aW9uKVxuICAgICAgLy8gUGFzcyB0aGUgYnVmZmVyIHRvIHRoZSBjb25uZWN0aW9uIGhhbmRsZXJcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmluY29taW5nKGJ1ZmZlcik7XG4gIH1cblxuICBwdWJsaWMgc2VuZChidWZmZXI6IEJ1ZmZlciwgcmluZm86IFJlbW90ZUluZm8pOiB2b2lkIHtcbiAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlciwgcmluZm8ucG9ydCwgcmluZm8uYWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VydmVyIH07XG4iLCAiLyoqXG4gKiBSYWtuZXQgcHJvdG9jb2wgdmVyc2lvbi5cbiAqL1xuY29uc3QgUkFLTkVUX1BST1RPQ09MID0gMTE7XG5cbi8qKlxuICogVGhlIHRpY2sgcmF0ZSBvZiB0aGUgUmFrbmV0IHByb3RvY29sLlxuICovXG5jb25zdCBSQUtORVRfVFBTID0gMTAwO1xuLyoqXG4gKiBUaGUgbGVuZ3RoIG9mIGEgUmFrbmV0IHRpY2sgaW4gc2Vjb25kcy5cbiAqL1xuY29uc3QgUkFLTkVUX1RJQ0tfTEVOID0gMSAvIFJBS05FVF9UUFM7XG5cbi8qKlxuICogVGhlIHNpemUgb2YgYSBVRFAgaGVhZGVyLlxuICovXG5jb25zdCBVRFBfSEVBREVSX1NJWkUgPSAyODtcblxuLyoqXG4gKiBUaGUgbWluaW11bSBzaXplIG9mIGEgUmFrbmV0IHBhY2tldC5cbiAqL1xuY29uc3QgTUlOX01UVV9TSVpFID0gNDAwO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBSYWtuZXQgcGFja2V0LlxuICovXG5jb25zdCBNQVhfTVRVX1NJWkUgPSAxNDkyO1xuXG4vKipcbiAqIFRoZSBzaXplIG9mIGEgUmFrbmV0IGRhdGFncmFtIGhlYWRlci5cbiAqL1xuY29uc3QgREdSQU1fSEVBREVSX1NJWkUgPSA0O1xuXG4vKipcbiAqIFRoZSBvdmVyaGVhZCBvZiBhIFJha25ldCBkYXRhZ3JhbS5cbiAqL1xuY29uc3QgREdSQU1fTVRVX09WRVJIRUFEID0gMzY7XG5cbmV4cG9ydCB7XG4gIFJBS05FVF9QUk9UT0NPTCxcbiAgUkFLTkVUX1RQUyxcbiAgUkFLTkVUX1RJQ0tfTEVOLFxuICBVRFBfSEVBREVSX1NJWkUsXG4gIE1JTl9NVFVfU0laRSxcbiAgTUFYX01UVV9TSVpFLFxuICBER1JBTV9IRUFERVJfU0laRSxcbiAgREdSQU1fTVRVX09WRVJIRUFEXG59O1xuIiwgImltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgQml0ZmxhZ3MsIFByaW9yaXR5LCBSZWxpYWJpbGl0eSwgU3RhdHVzLCBQYWNrZXQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIEFjayxcbiAgQWRkcmVzcyxcbiAgQ29ubmVjdGVkUGluZyxcbiAgQ29ubmVjdGVkUG9uZyxcbiAgQ29ubmVjdGlvblJlcXVlc3QsXG4gIENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQsXG4gIERpc2Nvbm5lY3QsXG4gIEZyYW1lLFxuICBGcmFtZVNldCxcbiAgTmFja1xufSBmcm9tIFwiLi4vcHJvdG9cIjtcbmltcG9ydCB7IERHUkFNX0hFQURFUl9TSVpFLCBER1JBTV9NVFVfT1ZFUkhFQUQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB0eXBlIHsgUmVtb3RlSW5mbyB9IGZyb20gXCJub2RlOmRncmFtXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlciB9IGZyb20gXCIuL3Jha25ldFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb25uZWN0aW9uIGluIHRoZSBzZXJ2ZXJcbiAqL1xuY2xhc3MgQ29ubmVjdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0dXMgPSBTdGF0dXMuQ29ubmVjdGluZztcblxuICAvKipcbiAgICogVGhlIGxhc3QgdXBkYXRlIHRpbWUgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyBsYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaWRlbnRpZmllciBvZiB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJpbmZvOiBSZW1vdGVJbmZvO1xuXG4gIC8qKlxuICAgKiBUaGUgR1VJRCBvZiB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGd1aWQ6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXQgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtdHU6IG51bWJlcjtcblxuICAvLyBJbnB1dHNcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvc3RGcmFtZVNlcXVlbmNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleDogQXJyYXk8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZyYWdtZW50c1F1ZXVlOiBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBGcmFtZT4+ID1cbiAgICBuZXcgTWFwKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0T3JkZXJJbmRleDogQXJyYXk8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIGlucHV0T3JkZXJpbmdRdWV1ZTogTWFwPG51bWJlciwgTWFwPG51bWJlciwgRnJhbWU+PiA9IG5ldyBNYXAoKTtcbiAgcHJvdGVjdGVkIGxhc3RJbnB1dFNlcXVlbmNlID0gLTE7XG5cbiAgLy8gT3V0cHV0c1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0cHV0T3JkZXJJbmRleDogQXJyYXk8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG91dHB1dFNlcXVlbmNlSW5kZXg6IEFycmF5PG51bWJlcj47XG5cbiAgcHJvdGVjdGVkIG91dHB1dEZyYW1lcyA9IG5ldyBTZXQ8RnJhbWU+KCk7XG4gIHByb3RlY3RlZCBvdXRwdXRCYWNrdXAgPSBuZXcgTWFwPG51bWJlciwgQXJyYXk8RnJhbWU+PigpO1xuXG4gIHByb3RlY3RlZCBvdXRwdXRTZXF1ZW5jZSA9IDA7XG5cbiAgcHJvdGVjdGVkIG91dHB1dHNwbGl0SW5kZXggPSAwO1xuXG4gIHByb3RlY3RlZCBvdXRwdXRSZWxpYWJsZUluZGV4ID0gMDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIHNlcnZlciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBpbmZvXG4gICAqIEBwYXJhbSBndWlkIFRoZSBHVUlEXG4gICAqIEBwYXJhbSBtdHUgVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXRcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJ2ZXI6IFNlcnZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mbyxcbiAgICBndWlkOiBiaWdpbnQsXG4gICAgbXR1OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy5yaW5mbyA9IHJpbmZvO1xuICAgIHRoaXMuZ3VpZCA9IGd1aWQ7XG4gICAgdGhpcy5tdHUgPSBtdHU7XG5cbiAgICAvLyBJbnB1dHNcbiAgICB0aGlzLmlucHV0T3JkZXJJbmRleCA9IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogMzIgfSkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMzI7IGluZGV4KyspIHtcbiAgICAgIHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLnNldChpbmRleCwgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXggPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IDMyIH0pLmZpbGwoMCk7XG5cbiAgICAvLyBPdXRwdXRzXG4gICAgdGhpcy5vdXRwdXRPcmRlckluZGV4ID0gQXJyYXkuZnJvbTxudW1iZXI+KHsgbGVuZ3RoOiAzMiB9KS5maWxsKDApO1xuICAgIHRoaXMub3V0cHV0U2VxdWVuY2VJbmRleCA9IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogMzIgfSkuZmlsbCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaWNrcyB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCBpcyBzdGFsZVxuICAgIGlmICh0aGlzLmxhc3RVcGRhdGUgKyAxNV8wMDAgPCBEYXRlLm5vdygpKSB7XG4gICAgICAvLyBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHN0YWxlIGNvbm5lY3Rpb25zXG4gICAgICB0aGlzLnNlcnZlci5sb2dnZXIud2FybihcbiAgICAgICAgYERldGVjdGVkIHN0YWxlIGNvbm5lY3Rpb24gZnJvbSDCp2Mke3RoaXMucmluZm8uYWRkcmVzc33Cp3I6wqdjJHt0aGlzLnJpbmZvLnBvcnR9wqdyLCBkaXNjb25uZWN0aW5nLi4uYFxuICAgICAgKTtcblxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgY2xpZW50XG4gICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCBpcyBkaXNjb25uZWN0aW5nIG9yIGRpc2Nvbm5lY3RlZFxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdHVzID09PSBTdGF0dXMuRGlzY29ubmVjdGluZyB8fFxuICAgICAgdGhpcy5zdGF0dXMgPT09IFN0YXR1cy5EaXNjb25uZWN0ZWRcbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHJlY2VpdmVkIGFueSBBQ0tzIG9yIE5BQ0tzXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSByZWNlaXZlZCBhbnkgcGFja2V0cyB0byBzZW5kIGFuIEFDSyBmb3JcbiAgICBpZiAodGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLnNpemUgPiAwKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgQUNLIGluc3RhbmNlXG4gICAgICBjb25zdCBhY2sgPSBuZXcgQWNrKCk7XG4gICAgICBhY2suc2VxdWVuY2VzID0gWy4uLnRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlc107XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgc2VxdWVuY2VzIGZyb20gdGhlIHJlY2VpdmVkIGZyYW1lIHNlcXVlbmNlc1xuICAgICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiB0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMpXG4gICAgICAgIHRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlcy5kZWxldGUoc2VxdWVuY2UpO1xuXG4gICAgICAvLyBTZW5kIHRoZSBBQ0sgdG8gdGhlIHJlbW90ZSBjbGllbnRcbiAgICAgIHRoaXMuc2VydmVyLnNlbmQoYWNrLnNlcmlhbGl6ZSgpLCB0aGlzLnJpbmZvKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFueSBsb3N0IHBhY2tldHMgdG8gc2VuZCBhIE5BQ0sgZm9yXG4gICAgaWYgKHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLnNpemUgPiAwKSB7XG4gICAgICBjb25zdCBuYWNrID0gbmV3IE5hY2soKTtcbiAgICAgIG5hY2suc2VxdWVuY2VzID0gWy4uLnRoaXMubG9zdEZyYW1lU2VxdWVuY2VzXTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSBzZXF1ZW5jZXMgZnJvbSB0aGUgbG9zdCBmcmFtZSBzZXF1ZW5jZXNcbiAgICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2YgdGhpcy5sb3N0RnJhbWVTZXF1ZW5jZXMpXG4gICAgICAgIHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLmRlbGV0ZShzZXF1ZW5jZSk7XG5cbiAgICAgIC8vIFNlbmQgdGhlIE5BQ0sgdG8gdGhlIHJlbW90ZSBjbGllbnRcbiAgICAgIHRoaXMuc2VydmVyLnNlbmQobmFjay5zZXJpYWxpemUoKSwgdGhpcy5yaW5mbyk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgb3V0cHV0IHF1ZXVlXG4gICAgcmV0dXJuIHRoaXMuc2VuZFF1ZXVlKHRoaXMub3V0cHV0RnJhbWVzLnNpemUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIHN0YXR1cyB0byBkaXNjb25uZWN0aW5nXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGluZztcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBEaXNjb25uZWN0IGluc3RhbmNlXG4gICAgY29uc3QgZGlzY29ubmVjdCA9IG5ldyBEaXNjb25uZWN0KCk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGZyYW1lXG4gICAgY29uc3QgZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICBmcmFtZS5yZWxpYWJpbGl0eSA9IFJlbGlhYmlsaXR5LlJlbGlhYmxlT3JkZXJlZDtcbiAgICBmcmFtZS5vcmRlckNoYW5uZWwgPSAwO1xuICAgIGZyYW1lLnBheWxvYWQgPSBkaXNjb25uZWN0LnNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gU2VuZCB0aGUgZnJhbWVcbiAgICB0aGlzLnNlbmRGcmFtZShmcmFtZSwgUHJpb3JpdHkuSW1tZWRpYXRlKTtcblxuICAgIC8vIEVtaXQgdGhlIGRpc2Nvbm5lY3QgZXZlbnQsIGFuZCBkZWxldGUgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgdm9pZCB0aGlzLnNlcnZlci5lbWl0KFwiZGlzY29ubmVjdFwiLCB0aGlzKTtcbiAgICB0aGlzLnNlcnZlci5jb25uZWN0aW9ucy5kZWxldGUodGhpcyk7XG5cbiAgICAvLyBTZXQgdGhlIHN0YXR1cyB0byBkaXNjb25uZWN0ZWRcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBwYWNrZXRzXG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXJcbiAgICovXG4gIHB1YmxpYyBpbmNvbWluZyhidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCB1cGRhdGUgdGltZVxuICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG5cbiAgICAvLyBSZWFkcyB0aGUgaGVhZGVyIG9mIHRoZSBwYWNrZXQgKHU4KVxuICAgIC8vIEFuZCBtYXNrcyBpdCB3aXRoIDB4ZjAgdG8gZ2V0IHRoZSBoZWFkZXJcbiAgICBjb25zdCBoZWFkZXIgPSAoYnVmZmVyWzBdIGFzIG51bWJlcikgJiAweGYwO1xuXG4gICAgLy8gU3dpdGNoZXMgdGhlIGhlYWRlciBvZiB0aGUgcGFja2V0XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY2FzZSBmb3IgdGhlIGhlYWRlciwgaXQgd2lsbCBsb2cgdGhlIHBhY2tldCBpZCBhcyB1bmtub3duXG4gICAgc3dpdGNoIChoZWFkZXIpIHtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRm9ybWF0IHRoZSBwYWNrZXQgaWQgdG8gYSBoZXggc3RyaW5nXG4gICAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgICBoZWFkZXIudG9TdHJpbmcoMTYpLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBcIjBcIiArIGhlYWRlci50b1N0cmluZygxNilcbiAgICAgICAgICAgIDogaGVhZGVyLnRvU3RyaW5nKDE2KTtcblxuICAgICAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB1bmtub3duIHBhY2tldCBoZWFkZXJzXG4gICAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgUmVjZWl2ZWQgdW5rbm93biBvbmxpbmUgcGFja2V0IDB4JHtpZH0gZnJvbSAke3RoaXMucmluZm8uYWRkcmVzc306JHt0aGlzLnJpbmZvLnBvcnR9IWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGFuIGVycm9yIGZvciB1bmtub3duIHBhY2tldCBoZWFkZXJzXG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuc2VydmVyLmVtaXQoXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG9ubGluZSBwYWNrZXQgMHgke2lkfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGluY29taW5nIGFja3NcbiAgICAgIGNhc2UgUGFja2V0LkFjazoge1xuICAgICAgICB0aGlzLmFjayhidWZmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGluY29taW5nIG5hY2tzXG4gICAgICBjYXNlIFBhY2tldC5OYWNrOiB7XG4gICAgICAgIHRoaXMubmFjayhidWZmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGluY29taW5nIGZyYW1lc2V0c1xuICAgICAgY2FzZSBCaXRmbGFncy5WYWxpZDoge1xuICAgICAgICB0aGlzLmhhbmRsZUluY29taW5nRnJhbWVTZXQoYnVmZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgYmF0Y2ggcGFja2V0c1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5jb21pbmdCYXRjaChidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIFJlYWRzIHRoZSBoZWFkZXIgb2YgdGhlIHBhY2tldCAodTgpXG4gICAgY29uc3QgaGVhZGVyID0gYnVmZmVyWzBdIGFzIG51bWJlcjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGNvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5Db25uZWN0aW5nKSB7XG4gICAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9ybWF0IHRoZSBwYWNrZXQgaWQgdG8gYSBoZXggc3RyaW5nXG4gICAgICAgICAgY29uc3QgaWQgPVxuICAgICAgICAgICAgaGVhZGVyLnRvU3RyaW5nKDE2KS5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyBcIjBcIiArIGhlYWRlci50b1N0cmluZygxNilcbiAgICAgICAgICAgICAgOiBoZWFkZXIudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBmb3IgdW5rbm93biBwYWNrZXQgaGVhZGVyc1xuICAgICAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG9ubGluZSBwYWNrZXQgMHgke2lkfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFbWl0IGFuIGVycm9yIGZvciB1bmtub3duIHBhY2tldCBoZWFkZXJzXG4gICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFJlY2VpdmVkIHVua25vd24gb25saW5lIHBhY2tldCAweCR7aWR9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgYSBkaXNjb25uZWN0IHBhY2tldFxuICAgICAgICBjYXNlIFBhY2tldC5EaXNjb25uZWN0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGluZztcbiAgICAgICAgICB0aGlzLnNlcnZlci5jb25uZWN0aW9ucy5kZWxldGUodGhpcyk7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGVkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBhIGNvbm5lY3Rpb24gcmVxdWVzdCBwYWNrZXRcbiAgICAgICAgY2FzZSBQYWNrZXQuQ29ubmVjdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUluY29taW5nQ29ubmVjdGlvblJlcXVlc3QoYnVmZmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgYSBuZXcgaW5jb21pbmcgY29ubmVjdGlvbiBwYWNrZXRcbiAgICAgICAgLy8gSWYgc28sIGVtaXQgdGhlIGNvbm5lY3QgZXZlbnRcbiAgICAgICAgY2FzZSBQYWNrZXQuTmV3SW5jb21pbmdDb25uZWN0aW9uOiB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuQ29ubmVjdGVkO1xuICAgICAgICAgIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcImNvbm5lY3RcIiwgdGhpcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgY29ubmVjdGVkIHBhY2tldHNcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBGb3JtYXQgdGhlIHBhY2tldCBpZCB0byBhIGhleCBzdHJpbmdcbiAgICAgICAgY29uc3QgaWQgPVxuICAgICAgICAgIGhlYWRlci50b1N0cmluZygxNikubGVuZ3RoID09PSAxXG4gICAgICAgICAgICA/IFwiMFwiICsgaGVhZGVyLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgOiBoZWFkZXIudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgZm9yIHVua25vd24gcGFja2V0IGhlYWRlcnNcbiAgICAgICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG9ubGluZSBwYWNrZXQgMHgke2lkfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgYW4gZXJyb3IgZm9yIHVua25vd24gcGFja2V0IGhlYWRlcnNcbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFJlY2VpdmVkIHVua25vd24gb25saW5lIHBhY2tldCAweCR7aWR9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGEgZGlzY29ubmVjdCBwYWNrZXRcbiAgICAgIGNhc2UgUGFja2V0LkRpc2Nvbm5lY3Q6IHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGluZztcbiAgICAgICAgdm9pZCB0aGlzLnNlcnZlci5lbWl0KFwiZGlzY29ubmVjdFwiLCB0aGlzKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMuZGVsZXRlKHRoaXMpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGEgcGluZyBwYWNrZXRcbiAgICAgIGNhc2UgUGFja2V0LkNvbm5lY3RlZFBpbmc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jb21pbmdDb25uZWN0ZWRQaW5nKGJ1ZmZlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBhIGdhbWUgcGFja2V0XG4gICAgICBjYXNlIDB4ZmU6IHtcbiAgICAgICAgdm9pZCB0aGlzLnNlcnZlci5lbWl0KFwiZW5jYXBzdWxhdGVkXCIsIHRoaXMsIGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgYWNrc1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYWNrKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gRGVzZXJpYWxpemUgdGhlIGFjayBwYWNrZXRcbiAgICBjb25zdCBhY2sgPSBuZXcgQWNrKGJ1ZmZlcikuZGVzZXJpYWxpemUoKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc2VxdWVuY2VzIGluIHRoZSBhY2sgcGFja2V0XG4gICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBhY2suc2VxdWVuY2VzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWNrIGlzIG5vdCBmb3VuZFxuICAgICAgaWYgKCF0aGlzLm91dHB1dEJhY2t1cC5oYXMoc2VxdWVuY2UpKVxuICAgICAgICB0aGlzLnNlcnZlci5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFJlY2VpdmVkIGFjayBmb3IgdW5rbm93biBzZXF1ZW5jZSAke3NlcXVlbmNlfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0uYFxuICAgICAgICApO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIGFjayBmcm9tIHRoZSBzZXRcbiAgICAgIHRoaXMub3V0cHV0QmFja3VwLmRlbGV0ZShzZXF1ZW5jZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbmFja3NcbiAgICogQHBhcmFtIGJ1ZmZlciBUaGUgcGFja2V0IGJ1ZmZlclxuICAgKi9cbiAgcHJvdGVjdGVkIG5hY2soYnVmZmVyOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgbmFjayBwYWNrZXRcbiAgICBjb25zdCBuYWNrID0gbmV3IE5hY2soYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzZXF1ZW5jZXMgaW4gdGhlIG5hY2sgcGFja2V0XG4gICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBuYWNrLnNlcXVlbmNlcykge1xuICAgICAgLy8gR2V0IHRoZSBmcmFtZXMgZnJvbSB0aGUgb3V0cHV0IGJhY2t1cFxuICAgICAgY29uc3QgZnJhbWVzID0gdGhpcy5vdXRwdXRCYWNrdXAuZ2V0KHNlcXVlbmNlKSA/PyBbXTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBmcmFtZXNcbiAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzKSB7XG4gICAgICAgIC8vIFNlbmQgdGhlIGZyYW1lIHRvIHRoZSBjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuc2VuZEZyYW1lKGZyYW1lLCBQcmlvcml0eS5JbW1lZGlhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIGZyYW1lc2V0c1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlSW5jb21pbmdGcmFtZVNldChidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBGcmFtZVNldCBpbnN0YW5jZSBhbmQgZGVzZXJpYWxpemUgdGhlIGJ1ZmZlclxuICAgIGNvbnN0IGZyYW1lc2V0ID0gbmV3IEZyYW1lU2V0KGJ1ZmZlcikuZGVzZXJpYWxpemUoKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgc2VxdWVuY2Ugb2YgdGhlIGZyYW1lc2V0IGhhcyBhbHJlYWR5IGJlZW4gcmVjaWV2ZWRcbiAgICBpZiAodGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLmhhcyhmcmFtZXNldC5zZXF1ZW5jZSkpIHtcbiAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgZm9yIGR1cGxpY2F0ZSBmcmFtZXNldHNcbiAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFJlY2VpdmVkIGR1cGxpY2F0ZSBmcmFtZXNldCAke2ZyYW1lc2V0LnNlcXVlbmNlfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYFJlY2lldmVkIGR1cGxpY2F0ZSBmcmFtZXNldCAke2ZyYW1lc2V0LnNlcXVlbmNlfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZXMgdGhlIHNlcXVlbmNlIGZyb20gdGhlIGxvc3QgZnJhbWUgc2VxdWVuY2VzXG4gICAgdGhpcy5sb3N0RnJhbWVTZXF1ZW5jZXMuZGVsZXRlKGZyYW1lc2V0LnNlcXVlbmNlKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgc2VxdWVuY2UgaXMgb3V0IG9mIG9yZGVyXG4gICAgaWYgKFxuICAgICAgZnJhbWVzZXQuc2VxdWVuY2UgPCB0aGlzLmxhc3RJbnB1dFNlcXVlbmNlIHx8XG4gICAgICBmcmFtZXNldC5zZXF1ZW5jZSA9PT0gdGhpcy5sYXN0SW5wdXRTZXF1ZW5jZVxuICAgICkge1xuICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBmb3Igb3V0IG9mIG9yZGVyIGZyYW1lc2V0c1xuICAgICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmVjZWl2ZWQgb3V0IG9mIG9yZGVyIGZyYW1lc2V0ICR7ZnJhbWVzZXQuc2VxdWVuY2V9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdm9pZCB0aGlzLnNlcnZlci5lbWl0KFxuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgUmVjaWV2ZWQgb3V0IG9mIG9yZGVyIGZyYW1lc2V0ICR7ZnJhbWVzZXQuc2VxdWVuY2V9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkcyB0aGUgc2VxdWVuY2UgdG8gdGhlIHJlY2lldmVkIGZyYW1lIHNlcXVlbmNlcywgQWNrIHdpbGwgYmUgc2VudCBvbiBuZXh0IHRpY2tcbiAgICB0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMuYWRkKGZyYW1lc2V0LnNlcXVlbmNlKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGVyZSBhcmUgYW55IG1pc3NpbmdzIGZyYW1lc2V0cyxcbiAgICAvLyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGxhc3QgaW5wdXQgc2VxdWVuY2UgYW5kIHRoZSBjdXJyZW50IHNlcXVlbmNlXG4gICAgLy8gYWRkIHRoZSBtaXNzaW5nIGZyYW1lIHNlcXVlbmNlcyB0byB0aGUgbG9zdCBxdWV1ZVxuICAgIGlmIChmcmFtZXNldC5zZXF1ZW5jZSAtIHRoaXMubGFzdElucHV0U2VxdWVuY2UgPiAxKSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmxhc3RJbnB1dFNlcXVlbmNlICsgMTtcbiAgICAgICAgaW5kZXggPCBmcmFtZXNldC5zZXF1ZW5jZTtcbiAgICAgICAgaW5kZXgrK1xuICAgICAgKVxuICAgICAgICB0aGlzLmxvc3RGcmFtZVNlcXVlbmNlcy5hZGQoaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbGFzdCBpbnB1dCBzZXF1ZW5jZSB0byB0aGUgY3VycmVudCBzZXF1ZW5jZVxuICAgIHRoaXMubGFzdElucHV0U2VxdWVuY2UgPSBmcmFtZXNldC5zZXF1ZW5jZTtcblxuICAgIC8vIEhhbmRsZSB0aGUgZnJhbWVzXG4gICAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZXNldC5mcmFtZXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJhbWUoZnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIGZyYW1lc1xuICAgKiBAcGFyYW0gZnJhbWUgVGhlIGZyYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlRnJhbWUoZnJhbWU6IEZyYW1lKTogdm9pZCB7XG4gICAgLy8gQ2hlY2tzIGlmIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZFxuICAgIGlmIChmcmFtZS5pc1NwbGl0KCkpIHJldHVybiB0aGlzLmhhbmRsZUZyYWdtZW50KGZyYW1lKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgcGFja2V0IGlzIHNlcXVlbmNlZFxuICAgIGlmIChmcmFtZS5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZyYW1lLnNlcXVlbmNlSW5kZXggPFxuICAgICAgICAgICh0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXIpIHx8XG4gICAgICAgIGZyYW1lLm9yZGVySW5kZXggPCAodGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXIpXG4gICAgICApIHtcbiAgICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBmb3Igb3V0IG9mIG9yZGVyIGZyYW1lc1xuICAgICAgICB0aGlzLnNlcnZlci5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFJlY2lldmVkIG91dCBvZiBvcmRlciBmcmFtZSAke2ZyYW1lLnNlcXVlbmNlSW5kZXh9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFJlY2lldmVkIG91dCBvZiBvcmRlciBmcmFtZSAke2ZyYW1lLnNlcXVlbmNlSW5kZXh9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIG5ldyBoaWdoZXN0IHNlcXVlbmNlIGluZGV4XG4gICAgICB0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSA9XG4gICAgICAgIGZyYW1lLnNlcXVlbmNlSW5kZXggKyAxO1xuICAgICAgLy8gSGFuZGxlIHRoZSBwYWNrZXRcbiAgICAgIHJldHVybiB0aGlzLmluY29taW5nQmF0Y2goZnJhbWUucGF5bG9hZCk7XG4gICAgfSBlbHNlIGlmIChmcmFtZS5pc09yZGVyZWQoKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBvdXQgb2Ygb3JkZXJcbiAgICAgIGlmIChmcmFtZS5vcmRlckluZGV4ID09PSB0aGlzLmlucHV0T3JkZXJJbmRleFtmcmFtZS5vcmRlckNoYW5uZWxdKSB7XG4gICAgICAgIHRoaXMuaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleFtmcmFtZS5vcmRlckNoYW5uZWxdID0gMDtcbiAgICAgICAgdGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSA9IGZyYW1lLm9yZGVySW5kZXggKyAxO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgcGFja2V0XG4gICAgICAgIHRoaXMuaW5jb21pbmdCYXRjaChmcmFtZS5wYXlsb2FkKTtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IG91dE9mT3JkZXJRdWV1ZSA9IHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLmdldChcbiAgICAgICAgICBmcmFtZS5vcmRlckNoYW5uZWxcbiAgICAgICAgKSBhcyBNYXA8bnVtYmVyLCBGcmFtZT47XG4gICAgICAgIGZvciAoOyBvdXRPZk9yZGVyUXVldWUuaGFzKGluZGV4KTsgaW5kZXgrKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgZnJhbWUgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgICBjb25zdCBmcmFtZSA9IG91dE9mT3JkZXJRdWV1ZS5nZXQoaW5kZXgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIG51bGxcbiAgICAgICAgICBpZiAoIWZyYW1lKSBicmVhaztcblxuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcGFja2V0IGFuZCBkZWxldGUgaXQgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgICB0aGlzLmluY29taW5nQmF0Y2goZnJhbWUucGF5bG9hZCk7XG4gICAgICAgICAgb3V0T2ZPcmRlclF1ZXVlLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHF1ZXVlXG4gICAgICAgIHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLnNldChmcmFtZS5vcmRlckNoYW5uZWwsIG91dE9mT3JkZXJRdWV1ZSk7XG4gICAgICAgIHRoaXMuaW5wdXRPcmRlckluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0gPSBpbmRleDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZyYW1lLm9yZGVySW5kZXggPiAodGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXIpXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IHRoZSB1bm9yZGVyZWQgcXVldWVcbiAgICAgICAgY29uc3QgdW5vcmRlcmVkID0gdGhpcy5pbnB1dE9yZGVyaW5nUXVldWUuZ2V0KGZyYW1lLm9yZGVyQ2hhbm5lbCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIG51bGxcbiAgICAgICAgaWYgKCF1bm9yZGVyZWQpIHJldHVybjtcblxuICAgICAgICAvLyBBZGQgdGhlIGZyYW1lIHRvIHRoZSBxdWV1ZVxuICAgICAgICB1bm9yZGVyZWQuc2V0KGZyYW1lLm9yZGVySW5kZXgsIGZyYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIHRoZSBwYWNrZXQsIG5vIG5lZWQgdG8gZm9ybWF0IGl0XG4gICAgICByZXR1cm4gdGhpcy5pbmNvbWluZ0JhdGNoKGZyYW1lLnBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGZyYWdtZW50ZWQgZnJhbWVzXG4gICAqIEBwYXJhbSBmcmFtZSBUaGUgZnJhbWVcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVGcmFnbWVudChmcmFtZTogRnJhbWUpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGZyYWdtZW50IGlkXG4gICAgaWYgKHRoaXMuZnJhZ21lbnRzUXVldWUuaGFzKGZyYW1lLnNwbGl0SWQpKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnRzUXVldWUuZ2V0KGZyYW1lLnNwbGl0SWQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZnJhZ21lbnQgaXMgbnVsbFxuICAgICAgaWYgKCFmcmFnbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBTZXQgdGhlIHNwbGl0IGZyYW1lIHRvIHRoZSBmcmFnbWVudFxuICAgICAgZnJhZ21lbnQuc2V0KGZyYW1lLnNwbGl0SW5kZXgsIGZyYW1lKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgdGhlIGZyYWdtZW50c1xuICAgICAgLy8gVGhlbiB3ZSBjYW4gcmVidWlsZCB0aGUgcGFja2V0XG4gICAgICBpZiAoZnJhZ21lbnQuc2l6ZSA9PT0gZnJhbWUuc3BsaXRTaXplKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmcmFnbWVudHMgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN0cmVhbVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZnJhZ21lbnQuc2l6ZTsgaW5kZXgrKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgc3BsaXQgZnJhbWUgZnJvbSB0aGUgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBzZnJhbWUgPSBmcmFnbWVudC5nZXQoaW5kZXgpIGFzIEZyYW1lO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIHBheWxvYWQgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihzZnJhbWUucGF5bG9hZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIG5ldyBmcmFtZVxuICAgICAgICAvLyBBc3NpZ24gdGhlIHZhbHVlcyBmcm9tIHRoZSBvcmlnaW5hbCBmcmFtZVxuICAgICAgICBjb25zdCBuZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICAgICAgbmZyYW1lLnJlbGlhYmlsaXR5ID0gZnJhbWUucmVsaWFiaWxpdHk7XG4gICAgICAgIG5mcmFtZS5yZWxpYWJsZUluZGV4ID0gZnJhbWUucmVsaWFibGVJbmRleDtcbiAgICAgICAgbmZyYW1lLnNlcXVlbmNlSW5kZXggPSBmcmFtZS5zZXF1ZW5jZUluZGV4O1xuICAgICAgICBuZnJhbWUub3JkZXJJbmRleCA9IGZyYW1lLm9yZGVySW5kZXg7XG4gICAgICAgIG5mcmFtZS5vcmRlckNoYW5uZWwgPSBmcmFtZS5vcmRlckNoYW5uZWw7XG4gICAgICAgIG5mcmFtZS5wYXlsb2FkID0gc3RyZWFtLmdldEJ1ZmZlcigpO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZnJhZ21lbnQgaWQgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5mcmFnbWVudHNRdWV1ZS5kZWxldGUoZnJhbWUuc3BsaXRJZCk7XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgbmV3IGZyYW1lIHRvIHRoZSBoYW5kbGVGcmFtZSBmdW5jdGlvblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGcmFtZShuZnJhbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdGhlIGZyYWdtZW50IGlkIHRvIHRoZSBxdWV1ZVxuICAgICAgdGhpcy5mcmFnbWVudHNRdWV1ZS5zZXQoXG4gICAgICAgIGZyYW1lLnNwbGl0SWQsXG4gICAgICAgIG5ldyBNYXAoW1tmcmFtZS5zcGxpdEluZGV4LCBmcmFtZV1dKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBmcmFtZSB0byB0aGUgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGZyYW1lIC0gVGhlIGZyYW1lIHRvIHNlbmRcbiAgICogQHBhcmFtIHByaW9yaXR5IC0gVGhlIHByaW9yaXR5IG9mIHRoZSBmcmFtZVxuICAgKi9cbiAgcHVibGljIHNlbmRGcmFtZShmcmFtZTogRnJhbWUsIHByaW9yaXR5OiBQcmlvcml0eSk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgc2VxdWVuY2VkIG9yIG9yZGVyZWRcbiAgICBpZiAoZnJhbWUuaXNTZXF1ZW5jZWQoKSkge1xuICAgICAgLy8gU2V0IHRoZSBvcmRlciBpbmRleCBhbmQgdGhlIHNlcXVlbmNlIGluZGV4XG4gICAgICBmcmFtZS5vcmRlckluZGV4ID0gdGhpcy5vdXRwdXRPcmRlckluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0gYXMgbnVtYmVyO1xuICAgICAgZnJhbWUuc2VxdWVuY2VJbmRleCA9ICh0aGlzLm91dHB1dFNlcXVlbmNlSW5kZXhbXG4gICAgICAgIGZyYW1lLm9yZGVyQ2hhbm5lbFxuICAgICAgXSBhcyBudW1iZXIpKys7XG4gICAgfSBlbHNlIGlmIChmcmFtZS5pc09yZGVyRXhjbHVzaXZlKCkpIHtcbiAgICAgIC8vIFNldCB0aGUgb3JkZXIgaW5kZXggYW5kIHRoZSBzZXF1ZW5jZSBpbmRleFxuICAgICAgZnJhbWUub3JkZXJJbmRleCA9ICh0aGlzLm91dHB1dE9yZGVySW5kZXhbXG4gICAgICAgIGZyYW1lLm9yZGVyQ2hhbm5lbFxuICAgICAgXSBhcyBudW1iZXIpKys7XG4gICAgICB0aGlzLm91dHB1dFNlcXVlbmNlSW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcGFja2V0IGlmIGJpZ2dlciB0aGFuIE1UVSBzaXplXG4gICAgY29uc3QgbWF4U2l6ZSA9IHRoaXMubXR1IC0gMzY7XG4gICAgY29uc3Qgc3BsaXRTaXplID0gTWF0aC5jZWlsKGZyYW1lLnBheWxvYWQuYnl0ZUxlbmd0aCAvIG1heFNpemUpO1xuXG4gICAgLy8gSW5jcmVtZW50IHRoZSByZWxpYWJsZSBpbmRleFxuICAgIGZyYW1lLnJlbGlhYmxlSW5kZXggPSB0aGlzLm91dHB1dFJlbGlhYmxlSW5kZXgrKztcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBpcyBiaWdnZXIgdGhhbiB0aGUgTVRVXG4gICAgaWYgKGZyYW1lLnBheWxvYWQuYnl0ZUxlbmd0aCA+IG1heFNpemUpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWZmZXIgZnJvbSB0aGUgcGF5bG9hZCBhbmQgZ2VuZXJhdGUgYSBmcmFnbWVudCBpZFxuICAgICAgLy8gY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZnJhbWUucGF5bG9hZCk7XG4gICAgICBjb25zdCBzcGxpdElkID0gdGhpcy5vdXRwdXRzcGxpdEluZGV4KysgJSA2NV81MzY7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYnVmZmVyIGFuZCBzcGxpdCBpdCBpbnRvIGZyYWdtZW50cyBiYXNlZCBvbiB0aGUgTVRVIHNpemVcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmcmFtZS5wYXlsb2FkLmJ5dGVMZW5ndGg7IGluZGV4ICs9IG1heFNpemUpIHtcbiAgICAgICAgY29uc3QgbmZyYW1lID0gbmV3IEZyYW1lKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSByZWxpYWJpbGl0eSBhbmQgdGhlIHJlbGlhYmxlIGluZGV4XG4gICAgICAgIG5mcmFtZS5yZWxpYWJsZUluZGV4ID0gZnJhbWUucmVsaWFibGVJbmRleDtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAwKSBuZnJhbWUucmVsaWFibGVJbmRleCA9IHRoaXMub3V0cHV0UmVsaWFibGVJbmRleCsrO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBmcmFtZSBhbmQgYXNzaWduIHRoZSB2YWx1ZXNcbiAgICAgICAgbmZyYW1lLnNlcXVlbmNlSW5kZXggPSBmcmFtZS5zZXF1ZW5jZUluZGV4O1xuICAgICAgICBuZnJhbWUub3JkZXJJbmRleCA9IGZyYW1lLm9yZGVySW5kZXg7XG4gICAgICAgIG5mcmFtZS5vcmRlckNoYW5uZWwgPSBmcmFtZS5vcmRlckNoYW5uZWw7XG4gICAgICAgIG5mcmFtZS5yZWxpYWJpbGl0eSA9IGZyYW1lLnJlbGlhYmlsaXR5O1xuICAgICAgICBuZnJhbWUucGF5bG9hZCA9IGZyYW1lLnBheWxvYWQuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgbWF4U2l6ZSk7XG4gICAgICAgIG5mcmFtZS5zcGxpdEluZGV4ID0gaW5kZXggLyBtYXhTaXplO1xuICAgICAgICBuZnJhbWUuc3BsaXRJZCA9IHNwbGl0SWQ7XG4gICAgICAgIG5mcmFtZS5zcGxpdFNpemUgPSBzcGxpdFNpemU7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBmcmFtZSB0byB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5xdWV1ZUZyYW1lKG5mcmFtZSwgcHJpb3JpdHkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZUZyYW1lKGZyYW1lLCBwcmlvcml0eSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBmcmFtZSB0byB0aGUgb3V0cHV0IHF1ZXVlXG4gICAqIEBwYXJhbSBmcmFtZSBUaGUgZnJhbWVcbiAgICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eVxuICAgKi9cbiAgcHJpdmF0ZSBxdWV1ZUZyYW1lKGZyYW1lOiBGcmFtZSwgcHJpb3JpdHk6IFByaW9yaXR5KTogdm9pZCB7XG4gICAgbGV0IGxlbmd0aCA9IERHUkFNX0hFQURFUl9TSVpFO1xuXG4gICAgLy8gQWRkIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRvIHRoZSBsZW5ndGhcbiAgICBmb3IgKGNvbnN0IGZyYW1lIG9mIHRoaXMub3V0cHV0RnJhbWVzKSBsZW5ndGggKz0gZnJhbWUuZ2V0Qnl0ZUxlbmd0aCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIGJpZ2dlciB0aGFuIHRoZSBNVFUsIGlmIHNvLCBzZW5kIHRoZSBxdWV1ZVxuICAgIGlmIChsZW5ndGggKyBmcmFtZS5nZXRCeXRlTGVuZ3RoKCkgPiB0aGlzLm10dSAtIERHUkFNX01UVV9PVkVSSEVBRClcbiAgICAgIC8vIFNlbmQgdGhlIHF1ZXVlIGFzIHVwY29taW5nIGZyYW1lcyB3aWxsIGJlIHRvbyBiaWdcbiAgICAgIHRoaXMuc2VuZFF1ZXVlKHRoaXMub3V0cHV0RnJhbWVzLnNpemUpO1xuXG4gICAgLy8gQWRkIHRoZSBmcmFtZSB0byB0aGUgcXVldWVcbiAgICB0aGlzLm91dHB1dEZyYW1lcy5hZGQoZnJhbWUpO1xuXG4gICAgLy8gSWYgdGhlIHByaW9yaXR5IGlzIGltbWVkaWF0ZSwgc2VuZCB0aGUgcXVldWVcbiAgICBpZiAocHJpb3JpdHkgPT09IFByaW9yaXR5LkltbWVkaWF0ZSkgcmV0dXJuIHRoaXMuc2VuZFF1ZXVlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBvdXRwdXQgZnJhbWUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBzZW5kUXVldWUoYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICBpZiAodGhpcy5vdXRwdXRGcmFtZXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGZyYW1lIHNldFxuICAgIGNvbnN0IGZyYW1lc2V0ID0gbmV3IEZyYW1lU2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIGZyYW1lIHNldCBwcm9wZXJ0aWVzXG4gICAgZnJhbWVzZXQuc2VxdWVuY2UgPSB0aGlzLm91dHB1dFNlcXVlbmNlKys7XG4gICAgZnJhbWVzZXQuZnJhbWVzID0gWy4uLnRoaXMub3V0cHV0RnJhbWVzXS5zbGljZSgwLCBhbW91bnQpO1xuXG4gICAgLy8gQWRkIHRoZSBmcmFtZSBzZXQgdG8gdGhlIGJhY2t1cCBtYXBcbiAgICB0aGlzLm91dHB1dEJhY2t1cC5zZXQoZnJhbWVzZXQuc2VxdWVuY2UsIGZyYW1lc2V0LmZyYW1lcyk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGZyYW1lcyBmcm9tIHRoZSBxdWV1ZVxuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzZXQuZnJhbWVzKSB0aGlzLm91dHB1dEZyYW1lcy5kZWxldGUoZnJhbWUpO1xuXG4gICAgLy8gU2VuZCB0aGUgZnJhbWUgc2V0IHRvIHRoZSByZW1vdGUgY2xpZW50XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQoZnJhbWVzZXQuc2VyaWFsaXplKCksIHRoaXMucmluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXJcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlSW5jb21pbmdDb25uZWN0aW9uUmVxdWVzdChidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBDb25uZWN0aW9uUmVxdWVzdCBpbnN0YW5jZSBhbmQgZGVzZXJpYWxpemUgdGhlIGJ1ZmZlclxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgQ29ubmVjdGlvblJlcXVlc3QoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQgaW5zdGFuY2VcbiAgICBjb25zdCBhY2NlcHRlZCA9IG5ldyBDb25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkKCk7XG5cbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjY2VwdGVkIHBhY2tldFxuICAgIGFjY2VwdGVkLmFkZHJlc3MgPSBBZGRyZXNzLmZyb21JZGVudGlmaWVyKHRoaXMucmluZm8pO1xuICAgIGFjY2VwdGVkLnN5c3RlbUluZGV4ID0gMDtcbiAgICBhY2NlcHRlZC5zeXN0ZW1BZGRyZXNzID0gW107XG4gICAgYWNjZXB0ZWQucmVxdWVzdFRpbWVzdGFtcCA9IHJlcXVlc3QudGltZXN0YW1wO1xuICAgIGFjY2VwdGVkLnRpbWVzdGFtcCA9IEJpZ0ludChEYXRlLm5vdygpKTtcblxuICAgIC8vIFNldCB0aGUgYWNjZXB0ZWQgcGFja2V0IHRvIGEgbmV3IGZyYW1lXG4gICAgY29uc3QgZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICBmcmFtZS5yZWxpYWJpbGl0eSA9IFJlbGlhYmlsaXR5LlJlbGlhYmxlT3JkZXJlZDtcbiAgICBmcmFtZS5vcmRlckNoYW5uZWwgPSAwO1xuICAgIGZyYW1lLnBheWxvYWQgPSBhY2NlcHRlZC5zZXJpYWxpemUoKTtcblxuICAgIC8vIFNlbmQgdGhlIGZyYW1lXG4gICAgcmV0dXJuIHRoaXMuc2VuZEZyYW1lKGZyYW1lLCBQcmlvcml0eS5Ob3JtYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29ubmVjdGVkIHBpbmdcbiAgICogQHBhcmFtIGJ1ZmZlciBUaGUgcGFja2V0IGJ1ZmZlclxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ0Nvbm5lY3RlZFBpbmcoYnVmZmVyOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQ29ubmVjdGVkUGluZyBpbnN0YW5jZSBhbmQgZGVzZXJpYWxpemUgdGhlIGJ1ZmZlclxuICAgIGNvbnN0IHBpbmcgPSBuZXcgQ29ubmVjdGVkUGluZyhidWZmZXIpLmRlc2VyaWFsaXplKCk7XG4gICAgY29uc3QgcG9uZyA9IG5ldyBDb25uZWN0ZWRQb25nKCk7XG4gICAgcG9uZy50aW1lc3RhbXAgPSBwaW5nLnRpbWVzdGFtcDtcbiAgICBwb25nLnBpbmdUaW1lc3RhbXAgPSBwaW5nLnRpbWVzdGFtcDtcbiAgICBwb25nLnRpbWVzdGFtcCA9IEJpZ0ludChEYXRlLm5vdygpKTtcblxuICAgIGNvbnN0IGZyYW1lID0gbmV3IEZyYW1lKCk7XG4gICAgZnJhbWUucmVsaWFiaWxpdHkgPSBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWQ7XG4gICAgZnJhbWUub3JkZXJDaGFubmVsID0gMDtcbiAgICBmcmFtZS5wYXlsb2FkID0gcG9uZy5zZXJpYWxpemUoKTtcblxuICAgIHRoaXMuc2VuZEZyYW1lKGZyYW1lLCBQcmlvcml0eS5Ob3JtYWwpO1xuICB9XG59XG5cbmV4cG9ydCB7IENvbm5lY3Rpb24gfTtcbiIsICJpbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIEluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbixcbiAgT3BlbkNvbm5lY3Rpb25SZXBseTEsXG4gIE9wZW5Db25uZWN0aW9uUmVwbHkyLFxuICBPcGVuQ29ubmVjdGlvblJlcXVlc3QxLFxuICBPcGVuQ29ubmVjdGlvblJlcXVlc3QyLFxuICBVbmNvbm5lY3RlZFBpbmcsXG4gIFVuY29ubmVjdGVkUG9uZ1xufSBmcm9tIFwiLi4vcHJvdG9cIjtcbmltcG9ydCB7IFJBS05FVF9QUk9UT0NPTCwgVURQX0hFQURFUl9TSVpFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4vY29ubmVjdGlvblwiO1xuXG5pbXBvcnQgdHlwZSB7IFJlbW90ZUluZm8gfSBmcm9tIFwibm9kZTpkZ3JhbVwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXIgfSBmcm9tIFwiLi9yYWtuZXRcIjtcblxuY2xhc3MgT2ZmbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgcmFrbmV0IHNlcnZlciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJ2ZXI6IFNlcnZlcjtcblxuICAvKipcbiAgICogSGFuZGxlcyBhbGwgaW5jb21pbmcgb2ZmbGluZSBkYXRhZ3JhbXMgZnJvbSByZW1vdGUgY2xpZW50c1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyIGZyb20gdGhlIHJlbW90ZSBjbGllbnRcbiAgICogQHBhcmFtIHJpbmZvIFRoZSByZW1vdGUgY2xpZW50IGluZm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhbmRsZShidWZmZXI6IEJ1ZmZlciwgcmluZm86IFJlbW90ZUluZm8pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJ1ZmZlciwgdGhpcyBpcyB0aGUgcGFja2V0IGhlYWRlci5cbiAgICAvLyBUaGUgcGFja2V0IGhlYWRlciBjb250YWlucyB0aGUgcGFja2V0IGlkZW50aWZpZXIuXG4gICAgY29uc3QgaGVhZGVyID0gYnVmZmVyWzBdO1xuXG4gICAgLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgcGFja2V0IGhlYWRlclxuICAgIGlmICghaGVhZGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9mZmxpbmUgcGFja2V0IGhlYWRlclwiKTtcblxuICAgIC8vIEhhbmQgb2ZmIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgYmFzZWQgb24gdGhlIHBhY2tldCBoZWFkZXJcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgY2FzZSBQYWNrZXQuVW5jb25uZWN0ZWRQaW5nOiB7XG4gICAgICAgIC8vIFRoaXMgaGFuZHNoYWtlIGRpc3BsYXlzIHRoZSBzZXJ2ZXIgaW5mb3JtYXRpb24gdG8gdGhlIGNsaWVudCAobW90ZCwgcGluZywgZXRjLilcbiAgICAgICAgdGhpcy51bmNvbm5lY3RlZFBpbmcoYnVmZmVyLCByaW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBhY2tldC5PcGVuQ29ubmVjdGlvblJlcXVlc3QxOiB7XG4gICAgICAgIC8vIFRoaXMgaGFuZHNoYWtlIGlzIHRoZSBmaXJzdCBzdGVwIGluIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyXG4gICAgICAgIHRoaXMub3BlbkNvbm5lY3Rpb25SZXF1ZXN0MShidWZmZXIsIHJpbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgUGFja2V0Lk9wZW5Db25uZWN0aW9uUmVxdWVzdDI6IHtcbiAgICAgICAgLy8gVGhpcyBoYW5kc2hha2UgaXMgdGhlIHNlY29uZCBzdGVwIGluIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyXG4gICAgICAgIHRoaXMub3BlbkNvbm5lY3Rpb25SZXF1ZXN0MihidWZmZXIsIHJpbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRm9ybWF0IHRoZSBwYWNrZXQgaWQgdG8gYSBoZXggc3RyaW5nXG4gICAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgICBoZWFkZXIudG9TdHJpbmcoMTYpLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBcIjBcIiArIGhlYWRlci50b1N0cmluZygxNilcbiAgICAgICAgICAgIDogaGVhZGVyLnRvU3RyaW5nKDE2KTtcblxuICAgICAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB0aGUgdW5rbm93biBwYWNrZXQgaGVhZGVyXG4gICAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgUmVjZWl2ZWQgYW4gdW5rbm93biBvZmZsaW5lIHBhY2tldCBpZGVudGlmaWVyIFwiMHgke2lkfVwiIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIHVuY29ubmVjdGVkIHBpbmcgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5jb25uZWN0ZWRQaW5nKGJ1ZmZlcjogQnVmZmVyLCByaW5mbzogUmVtb3RlSW5mbyk6IHZvaWQge1xuICAgIC8vIERlc2VyaWFsaXplIHRoZSB1bmNvbm5lY3RlZCBwaW5nXG4gICAgY29uc3QgcGluZyA9IG5ldyBVbmNvbm5lY3RlZFBpbmcoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHVuY29ubmVjdGVkIHBvbmcgcGFja2V0XG4gICAgY29uc3QgcG9uZyA9IG5ldyBVbmNvbm5lY3RlZFBvbmcoKTtcbiAgICBwb25nLnRpbWVzdGFtcCA9IHBpbmcudGltZXN0YW1wO1xuICAgIHBvbmcuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcG9uZy5tZXNzYWdlID1cbiAgICAgIFtcbiAgICAgICAgXCJNQ1BFXCIsIC8vIE1DRUUgPSBNaW5lY3JhZnQ6IEVkdWNhdGlvbiBFZGl0aW9uXG4gICAgICAgIHRoaXMuc2VydmVyLm1lc3NhZ2UgPz8gXCJSYWtuZXQgU2VydmVyXCIsXG4gICAgICAgIHRoaXMuc2VydmVyLnByb3RvY29sID8/IDEwMCxcbiAgICAgICAgdGhpcy5zZXJ2ZXIudmVyc2lvbiA/PyBcIjEuMC4wXCIsXG4gICAgICAgIHRoaXMuc2VydmVyLmNvbm5lY3Rpb25zLnNpemUsXG4gICAgICAgIHRoaXMuc2VydmVyLm1heENvbm5lY3Rpb25zID8/IDEwLFxuICAgICAgICB0aGlzLnNlcnZlci5ndWlkLFxuICAgICAgICBcIlNlcmVuaXR5SlNcIixcbiAgICAgICAgXCJTdXJ2aXZhbFwiLFxuICAgICAgICAxLFxuICAgICAgICB0aGlzLnNlcnZlci5wb3J0LFxuICAgICAgICB0aGlzLnNlcnZlci5wb3J0ICsgMVxuICAgICAgXS5qb2luKFwiO1wiKSArIFwiO1wiO1xuXG4gICAgLy8gU2VuZCB0aGUgdW5jb25uZWN0ZWQgcG9uZyBwYWNrZXQgdG8gdGhlIHJlbW90ZSBjbGllbnRcbiAgICB0aGlzLnNlcnZlci5zZW5kKHBvbmcuc2VyaWFsaXplKCksIHJpbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIG9wZW4gY29ubmVjdGlvbiByZXF1ZXN0IDEgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkNvbm5lY3Rpb25SZXF1ZXN0MShcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mb1xuICApOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMSBwYWNrZXRcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVxdWVzdDEoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJha25ldCBwcm90b2NvbCB2ZXJzaW9ucyBhcmUgbWlzbWF0Y2hlZFxuICAgIC8vIFRoZSByYWtuZXQgcHJvdG9jb2wgdmVyc2lvbiB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGdhbWVcbiAgICAvLyBUaGVyZSBzZWVtcyB0byBiZSBtaW5vciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2ZXJzaW9ucy5cbiAgICBpZiAocmVxdWVzdC5wcm90b2NvbCAhPT0gUkFLTkVUX1BST1RPQ09MKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaW5jb21wYXRpYmxlIHByb3RvY29sIHZlcnNpb24gcGFja2V0XG4gICAgICBjb25zdCBpbmNvbXBhdGlibGUgPSBuZXcgSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uKCk7XG4gICAgICBpbmNvbXBhdGlibGUucHJvdG9jb2wgPSBSQUtORVRfUFJPVE9DT0w7XG4gICAgICBpbmNvbXBhdGlibGUuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG5cbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIGluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uXG4gICAgICB0aGlzLnNlcnZlci5sb2dnZXIud2FybihcbiAgICAgICAgYFJlZnVzaW5nIGNvbm5lY3Rpb24gZnJvbSAke3JpbmZvLmFkZHJlc3N9OiR7cmluZm8ucG9ydH0gZHVlIHRvIGluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uIHYke3JlcXVlc3QucHJvdG9jb2x9LCBleHBlY3RlZCB2JHtSQUtORVRfUFJPVE9DT0x9LmBcbiAgICAgICk7XG5cbiAgICAgIC8vIFNlbmQgdGhlIGluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uIHBhY2tldCB0byB0aGUgcmVtb3RlIGNsaWVudFxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQoaW5jb21wYXRpYmxlLnNlcmlhbGl6ZSgpLCByaW5mbyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9wZW4gY29ubmVjdGlvbiByZXBseSAxIHBhY2tldFxuICAgIGNvbnN0IHJlcGx5ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVwbHkxKCk7XG4gICAgcmVwbHkuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcmVwbHkuc2VjdXJpdHkgPSBmYWxzZTsgLy8gV2UgYXJlIG5vdCB1c2luZyBzZWN1cml0eVxuICAgIHJlcGx5Lm10dSA9XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIG10dSArIHRoZSB1ZHAgaGVhZGVyIHNpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG10dSBzaXplXG4gICAgICByZXF1ZXN0Lm10dSArIFVEUF9IRUFERVJfU0laRSA+IHRoaXMuc2VydmVyLm1heE10dVNpemVcbiAgICAgICAgPyB0aGlzLnNlcnZlci5tYXhNdHVTaXplIC8vIEFzc2lnbiB0aGUgbWF4aW11bSB0cmFuc2ZlciB1bml0IHNpemVcbiAgICAgICAgOiByZXF1ZXN0Lm10dSArIFVEUF9IRUFERVJfU0laRTsgLy8gQXNzaWduIHRoZSByZXF1ZXN0ZWQgdHJhbnNmZXIgdW5pdCBzaXplICsgdGhlIHVkcCBoZWFkZXIgc2l6ZVxuXG4gICAgLy8gU2VuZCB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcGx5IDEgcGFja2V0IHRvIHRoZSByZW1vdGUgY2xpZW50XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQocmVwbHkuc2VyaWFsaXplKCksIHJpbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIG9wZW4gY29ubmVjdGlvbiByZXF1ZXN0IDIgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkNvbm5lY3Rpb25SZXF1ZXN0MihcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mb1xuICApOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMiBwYWNrZXRcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVxdWVzdDIoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBwb3J0IG1hdGNoZXMgdGhlIHNlcnZlciBwb3J0XG4gICAgLy8gVGhpcyBpcyBhIHVubGlrZWx5IHNjZW5hcmlvLCBidXQgaXQgaXMgcG9zc2libGVcbiAgICBpZiAocmVxdWVzdC5hZGRyZXNzLnBvcnQgIT09IHRoaXMuc2VydmVyLnBvcnQpIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIG1pc21hdGNoZWQgcG9ydFxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gbWlzbWF0Y2hlZCBwb3J0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG10dSBzaXplIGlzIGJldHdlZW4gdGhlIGFsbG93ZWQgbWluaW11bSBhbmQgbWF4aW11bSBtdHUgc2l6ZS5cbiAgICAvLyBJZiBub3QsIHdlIHdpbGwgcmVmdXNlIHRoZSBjb25uZWN0aW9uLlxuICAgIGlmIChcbiAgICAgIHJlcXVlc3QubXR1IDwgdGhpcy5zZXJ2ZXIubWluTXR1U2l6ZSB8fFxuICAgICAgcmVxdWVzdC5tdHUgPiB0aGlzLnNlcnZlci5tYXhNdHVTaXplXG4gICAgKSB7XG4gICAgICAvLyBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBpbnZhbGlkIG10dSBzaXplXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXIubG9nZ2VyLndhcm4oXG4gICAgICAgIGBSZWZ1c2luZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IGR1ZSB0byBpbnZhbGlkIG10dSBzaXplLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBlc3RhYmxpc2hlZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBbLi4udGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMudmFsdWVzKCldLmZpbmQoXG4gICAgICAoeCkgPT4geC5yaW5mby5hZGRyZXNzID09PSByaW5mby5hZGRyZXNzICYmIHgucmluZm8ucG9ydCA9PT0gcmluZm8ucG9ydFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkXG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIGFscmVhZHkgZXN0YWJsaXNoZWQgY29ubmVjdGlvblxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gYWxyZWFkeSBlc3RhYmxpc2hlZCBjb25uZWN0aW9uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldFxuICAgIGNvbnN0IHJlcGx5ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVwbHkyKCk7XG4gICAgcmVwbHkuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcmVwbHkuYWRkcmVzcyA9IEFkZHJlc3MuZnJvbUlkZW50aWZpZXIocmluZm8pO1xuICAgIHJlcGx5Lm10dSA9IHJlcXVlc3QubXR1O1xuICAgIHJlcGx5LmVuY3J5cHRpb24gPSBmYWxzZTsgLy8gV2UgYXJlIG5vdCB1c2luZyBlbmNyeXB0aW9uXG5cbiAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB0aGUgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG4gICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgYEVzdGFibGlzaGluZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IHdpdGggbXR1IHNpemUgb2YgJHtyZXF1ZXN0Lm10dX0uYFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiwgYW5kIGFkZCBpdCB0byB0aGUgY29ubmVjdGlvbnMgc2V0XG4gICAgdGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMuYWRkKFxuICAgICAgLy8gQnVpbGQgYSBuZXcgY29ubmVjdGlvbiBpbnN0YW5jZVxuICAgICAgbmV3IENvbm5lY3Rpb24odGhpcy5zZXJ2ZXIsIHJpbmZvLCByZXF1ZXN0LmNsaWVudCwgcmVxdWVzdC5tdHUpXG4gICAgKTtcblxuICAgIC8vIFNlbmQgdGhlIG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldCB0byB0aGUgcmVtb3RlIGNsaWVudFxuICAgIHJldHVybiB0aGlzLnNlcnZlci5zZW5kKHJlcGx5LnNlcmlhbGl6ZSgpLCByaW5mbyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgT2ZmbGluZSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjJlQUFBLElBQUFBLEdBQUEsR0FBQUMsR0FBQUQsR0FBQSxTQUFBRSxFQUFBLFlBQUFDLEVBQUEsZUFBQUMsRUFBQSxhQUFBQyxFQUFBLGtCQUFBQyxFQUFBLGtCQUFBQyxFQUFBLGVBQUFDLEdB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VEwsSUFBWSxLQUFLMUIsU0FBVzJCLEVBQUFBLEVBQ2xDLENBS09LLE1BQU8sQ0FDWixHQUFJLENBRUYsS0FBS2QsTUFBUSxHQUdiLFFBQVdZLEtBQWMsS0FBS3RCLFlBQWFzQixFQUFXRyxXQUFVLEVBRzVELEtBQUtqQyxXQUFVLEtBQUtBLFNBQVcsTUFHbkMsS0FBS00sT0FBTzRCLE1BQUssQ0FDbkIsTUFBUSxDQUNELEtBQUtDLEtBQUssUUFBUyxJQUFJQyxNQUFNLDRCQUFBLENBQUEsQ0FDcEMsQ0FDRixDQUVVaEIsT0FBT2lCLEVBQWdCQyxFQUF5QixDQUd4RCxJQUFNQyxFQUFTRixFQUFPLENBQUEsRUFHdEIsR0FBSSxDQUFDRSxFQUFRLE1BQU0sSUFBSUgsTUFBTSx1QkFBQSxFQUc3QixJQUFNSSxHQUFXRCxFQUFTRSxFQUFTQyxTQUFXLEVBR3hDWixFQUFhLElBQUksS0FBS3RCLFlBQVltQyxPQUFNLEdBQUlDLEtBQy9DQyxHQUFNQSxFQUFFUCxNQUFNbkQsVUFBWW1ELEVBQU1uRCxTQUFXMEQsRUFBRVAsTUFBTWxELE9BQVNrRCxFQUFNbEQsSUFBSSxFQUt6RSxHQUFJb0QsRUFFRixPQUFPakIsR0FBUUgsT0FBT2lCLEVBQVFDLENBQUFBLEVBSWhDLEdBQUksQ0FBQ0UsR0FBV1YsRUFFZCxPQUFPQSxFQUFXZ0IsU0FBU1QsQ0FBQUEsQ0FDL0IsQ0FFT1UsS0FBS1YsRUFBZ0JDLEVBQXlCLENBQ25ELEtBQUtoQyxPQUFPeUMsS0FBS1YsRUFBUUMsRUFBTWxELEtBQU1rRCxFQUFNbkQsT0FBTyxDQUNwRCxDQUNGIiwKICAibmFtZXMiOiBbImluZGV4X2V4cG9ydHMiLCAiX19leHBvcnQiLCAiQWNrIiwgIkFkZHJlc3MiLCAiQmFzZVBhY2tldCIsICJCaXRmbGFncyIsICJDb25uZWN0ZWRQaW5nIiwgIkNvbm5lY3RlZFBvbmciLCAiQ29ubmVjdGlvbiIsICJDb25uZWN0aW9uUmVxdWVzdCIsICJDb25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkIiwgIkRHUkFNX0hFQURFUl9TSVpFIiwgIkRHUkFNX01UVV9PVkVSSEVBRCIsICJEYXRhVHlwZSIsICJEaXNjb25uZWN0IiwgIkZyYW1lIiwgIkZyYW1lU2V0IiwgIkluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbiIsICJNQVhfTVRVX1NJWkUiLCAiTUlOX01UVV9TSVpFIiwgIk1UVSIsICJNYWdpYyIsICJOYWNrIiwgIk5ld0luY29taW5nQ29ubmVjdGlvbiIsICJPZmZsaW5lIiwgIk9wZW5Db25uZWN0aW9uUmVwbHkxIiwgIk9wZW5Db25uZWN0aW9uUmVwbHkyIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDEiLCAiT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MiIsICJQYWNrZXQiLCAiUHJpb3JpdHkiLCAiUHJvdG8iLCAiUkFLTkVUX1BST1RPQ09MIiwgIlJBS05FVF9USUNLX0xFTiIsICJSQUtORVRfVFBTIiwgIlJlbGlhYmlsaXR5IiwgIlNlcmlhbGl6ZSIsICJTZXJ2ZXIiLCAiU3RhdHVzIiwgIlN5c3RlbUFkZHJlc3MiLCAiVURQX0hFQURFUl9TSVpFIiwgIlVuY29ubmVjdGVkUGluZyIsICJVbmNvbm5lY3RlZFBvbmciLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9yZWZsZWN0X21ldGFkYXRhIiwgImltcG9ydF9uYnQiLCAiUHJvdG8iLCAiaWQiLCAidGFyZ2V0IiwgIm1ldGFkYXRhIiwgIlJlZmxlY3QiLCAiZ2V0T3duTWV0YWRhdGEiLCAicHJvdG90eXBlIiwgInByb3BlcnRpZXMiLCAiT2JqZWN0IiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiaW5jbHVkZXMiLCAic2VyaWFsaXplIiwgImZsdXNoIiwgImlkX3R5cGUiLCAid3JpdGUiLCAiZ2V0QnVmZmVyIiwgIm5hbWUiLCAidHlwZSIsICJlbmRpYW4iLCAicGFyYW1ldGVyIiwgIkNvbXBvdW5kVGFnIiwgIkVycm9yIiwgInZhbHVlIiwgImR0eXBlIiwgImRhdGEiLCAiY3R5cGUiLCAidGFnIiwgImRlc2VyaWFsaXplIiwgImJpbmFyeSIsICJsZW5ndGgiLCAicmVhZCIsICJnZXRJZCIsICJnZXRJZFR5cGUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJTZXJpYWxpemUiLCAidHlwZSIsICJlbmRpYW4iLCAiRW5kaWFubmVzcyIsICJCaWciLCAicGFyYW1ldGVyIiwgIkVycm9yIiwgInRhcmdldCIsICJuYW1lIiwgInByb3BlcnRpZXMiLCAiUmVmbGVjdCIsICJnZXRNZXRhZGF0YSIsICJwdXNoIiwgImRlZmluZU1ldGFkYXRhIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiRGF0YVR5cGUiLCAiX2FyZ3VtZW50c18iLCAicmVhZCIsICJfc3RyZWFtIiwgIl9lbmRpYW4iLCAiRW5kaWFubmVzcyIsICJCaWciLCAiX3BhcmFtZXRlciIsICJ3cml0ZSIsICJfdmFsdWUiLCAiTWFnaWNCdWZmZXIiLCAiQnVmZmVyIiwgImZyb20iLCAiTWFnaWMiLCAiRGF0YVR5cGUiLCAicmVhZCIsICJzdHJlYW0iLCAicmVhZEJ1ZmZlciIsICJsZW5ndGgiLCAid3JpdGUiLCAid3JpdGVCdWZmZXIiLCAiTVRVIiwgIkRhdGFUeXBlIiwgInJlYWQiLCAic3RyZWFtIiwgImdldEJ1ZmZlciIsICJieXRlTGVuZ3RoIiwgIndyaXRlIiwgInZhbHVlIiwgIndyaXRlQnVmZmVyIiwgIkJ1ZmZlciIsICJhbGxvYyIsICJsZW5ndGgiLCAiQWRkcmVzcyIsICJEYXRhVHlwZSIsICJhZGRyZXNzIiwgInBvcnQiLCAidmVyc2lvbiIsICJmcm9tSWRlbnRpZmllciIsICJpZGVudGlmaWVyIiwgImZhbWlseSIsICJ3cml0ZSIsICJzdHJlYW0iLCAidmFsdWUiLCAid3JpdGVVaW50OCIsICJhZGRyZXNzQml0cyIsICJzcGxpdCIsICJiaXQiLCAiTnVtYmVyIiwgInBhcnNlSW50IiwgIndyaXRlVVNob3J0IiwgIndyaXRlVWludDMyIiwgImFkZHJlc3NQYXJ0cyIsICJwYXJ0IiwgIm51bSIsICJyZWFkIiwgInJlYWRVaW50OCIsICJtYXAiLCAiYnl0ZSIsICJ0b1N0cmluZyIsICJqb2luIiwgInJlYWRVU2hvcnQiLCAic2tpcCIsICJpIiwgInB1c2giLCAicGFkU3RhcnQiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJQYWNrZXQiLCAiQml0ZmxhZ3MiLCAiUHJpb3JpdHkiLCAiU3RhdHVzIiwgIlJlbGlhYmlsaXR5IiwgIkZyYW1lIiwgIkRhdGFUeXBlIiwgInJlbGlhYmlsaXR5IiwgInJlbGlhYmxlSW5kZXgiLCAic2VxdWVuY2VJbmRleCIsICJvcmRlckluZGV4IiwgIm9yZGVyQ2hhbm5lbCIsICJzcGxpdFNpemUiLCAic3BsaXRJZCIsICJzcGxpdEluZGV4IiwgInBheWxvYWQiLCAiaXNTcGxpdCIsICJpc1JlbGlhYmxlIiwgIlJlbGlhYmlsaXR5IiwgIlJlbGlhYmxlIiwgIlJlbGlhYmxlT3JkZXJlZCIsICJSZWxpYWJsZVNlcXVlbmNlZCIsICJSZWxpYWJsZVdpdGhBY2tSZWNlaXB0IiwgIlJlbGlhYmxlT3JkZXJlZFdpdGhBY2tSZWNlaXB0IiwgImluY2x1ZGVzIiwgImlzU2VxdWVuY2VkIiwgIlVucmVsaWFibGVTZXF1ZW5jZWQiLCAiaXNPcmRlcmVkIiwgImlzT3JkZXJFeGNsdXNpdmUiLCAiZ2V0Qnl0ZUxlbmd0aCIsICJieXRlTGVuZ3RoIiwgInJlYWQiLCAic3RyZWFtIiwgImZyYW1lcyIsICJmcmFtZSIsICJoZWFkZXIiLCAicmVhZFVpbnQ4IiwgInNwbGl0IiwgIkJpdGZsYWdzIiwgIlNwbGl0IiwgImxlbmd0aCIsICJNYXRoIiwgImNlaWwiLCAicmVhZFVpbnQxNiIsICJyZWFkVWludDI0IiwgIkVuZGlhbm5lc3MiLCAiTGl0dGxlIiwgInJlYWRVaW50MzIiLCAicmVhZEJ1ZmZlciIsICJwdXNoIiwgImN1cnNvckF0RW5kIiwgIndyaXRlIiwgInZhbHVlIiwgIndyaXRlVWludDgiLCAid3JpdGVVaW50MTYiLCAid3JpdGVVaW50MjQiLCAid3JpdGVVaW50MzIiLCAid3JpdGVCdWZmZXIiLCAiU3lzdGVtQWRkcmVzcyIsICJEYXRhVHlwZSIsICJmcm9tSWRlbnRpZmllciIsICJpZGVudGlmaWVyIiwgIkFkZHJlc3MiLCAiYWRkcmVzcyIsICJwb3J0IiwgInZlcnNpb24iLCAicmVhZCIsICJzdHJlYW0iLCAiYWRkcmVzc2VzIiwgImluZGV4IiwgInB1c2giLCAid3JpdGUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJCYXNlUGFja2V0IiwgIkJpbmFyeVN0cmVhbSIsICJpZCIsICJpZF90eXBlIiwgIlVpbnQ4IiwgImZsdXNoIiwgImJpbmFyeSIsICJnZXRJZCIsICJFcnJvciIsICJnZXRJZFR5cGUiLCAic2VyaWFsaXplIiwgImRlc2VyaWFsaXplIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiVW5jb25uZWN0ZWRQaW5nIiwgIkJhc2VQYWNrZXQiLCAidGltZXN0YW1wIiwgIm1hZ2ljIiwgImNsaWVudCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIlVuY29ubmVjdGVkUG9uZyIsICJCYXNlUGFja2V0IiwgInRpbWVzdGFtcCIsICJndWlkIiwgIm1hZ2ljIiwgIm1lc3NhZ2UiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJPcGVuQ29ubmVjdGlvblJlcXVlc3QxIiwgIkJhc2VQYWNrZXQiLCAibWFnaWMiLCAicHJvdG9jb2wiLCAibXR1IiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiT3BlbkNvbm5lY3Rpb25SZXBseTEiLCAiQmFzZVBhY2tldCIsICJtYWdpYyIsICJndWlkIiwgInNlY3VyaXR5IiwgIm10dSIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDIiLCAiQmFzZVBhY2tldCIsICJtYWdpYyIsICJhZGRyZXNzIiwgIm10dSIsICJjbGllbnQiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJPcGVuQ29ubmVjdGlvblJlcGx5MiIsICJCYXNlUGFja2V0IiwgIm1hZ2ljIiwgImd1aWQiLCAiYWRkcmVzcyIsICJtdHUiLCAiZW5jcnlwdGlvbiIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkNvbm5lY3RlZFBvbmciLCAiQmFzZVBhY2tldCIsICJwaW5nVGltZXN0YW1wIiwgInRpbWVzdGFtcCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkNvbm5lY3RlZFBpbmciLCAiQmFzZVBhY2tldCIsICJ0aW1lc3RhbXAiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJDb25uZWN0aW9uUmVxdWVzdCIsICJCYXNlUGFja2V0IiwgImNsaWVudCIsICJ0aW1lc3RhbXAiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJGcmFtZVNldCIsICJCYXNlUGFja2V0IiwgInNlcXVlbmNlIiwgImZyYW1lcyIsICJMaXR0bGUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJBY2siLCAiQmFzZVBhY2tldCIsICJzZXF1ZW5jZXMiLCAic2VyaWFsaXplIiwgIndyaXRlVWludDgiLCAiaWQiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJjb3VudCIsICJsZW5ndGgiLCAicmVjb3JkcyIsICJjdXJzb3IiLCAic3RhcnQiLCAibGFzdCIsICJjdXJyZW50IiwgImRpZmYiLCAid3JpdGVCb29sIiwgIndyaXRlVWludDI0IiwgIkVuZGlhbm5lc3MiLCAiTGl0dGxlIiwgIndyaXRlVVNob3J0IiwgIndyaXRlQnVmZmVyIiwgImdldEJ1ZmZlciIsICJkZXNlcmlhbGl6ZSIsICJyZWFkVWludDgiLCAicmVjb3JkQ291bnQiLCAicmVhZFVTaG9ydCIsICJpbmRleCIsICJyZWFkQm9vbCIsICJwdXNoIiwgInJlYWRVaW50MjQiLCAiZW5kIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiTmFjayIsICJCYXNlUGFja2V0IiwgInNlcXVlbmNlcyIsICJzZXJpYWxpemUiLCAid3JpdGVVaW50OCIsICJpZCIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgImNvdW50IiwgImxlbmd0aCIsICJyZWNvcmRzIiwgImN1cnNvciIsICJzdGFydCIsICJsYXN0IiwgImN1cnJlbnQiLCAiZGlmZiIsICJ3cml0ZUJvb2wiLCAid3JpdGVVaW50MjQiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAid3JpdGVVU2hvcnQiLCAid3JpdGVCdWZmZXIiLCAiZ2V0QnVmZmVyIiwgImRlc2VyaWFsaXplIiwgInJlYWRVaW50OCIsICJyZWNvcmRDb3VudCIsICJyZWFkVVNob3J0IiwgImluZGV4IiwgInJlYWRCb29sIiwgInB1c2giLCAicmVhZFVpbnQyNCIsICJlbmQiLCAiRGlzY29ubmVjdCIsICJCYXNlUGFja2V0IiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uIiwgIkJhc2VQYWNrZXQiLCAicHJvdG9jb2wiLCAibWFnaWMiLCAiZ3VpZCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkNvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQiLCAiQmFzZVBhY2tldCIsICJhZGRyZXNzIiwgInN5c3RlbUluZGV4IiwgInN5c3RlbUFkZHJlc3MiLCAicmVxdWVzdFRpbWVzdGFtcCIsICJ0aW1lc3RhbXAiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJOZXdJbmNvbWluZ0Nvbm5lY3Rpb24iLCAiQmFzZVBhY2tldCIsICJzZXJ2ZXJBZGRyZXNzIiwgImludGVybmFsQWRkcmVzcyIsICJpbmNvbWluZ1RpbWVzdGFtcCIsICJzZXJ2ZXJUaW1lc3RhbXAiLCAiaW1wb3J0X25vZGVfZGdyYW0iLCAiaW1wb3J0X2VtaXR0ZXIiLCAiaW1wb3J0X2xvZ2dlciIsICJSQUtORVRfUFJPVE9DT0wiLCAiUkFLTkVUX1RQUyIsICJSQUtORVRfVElDS19MRU4iLCAiVURQX0hFQURFUl9TSVpFIiwgIk1JTl9NVFVfU0laRSIsICJNQVhfTVRVX1NJWkUiLCAiREdSQU1fSEVBREVSX1NJWkUiLCAiREdSQU1fTVRVX09WRVJIRUFEIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiQ29ubmVjdGlvbiIsICJzZXJ2ZXIiLCAic3RhdHVzIiwgIlN0YXR1cyIsICJDb25uZWN0aW5nIiwgImxhc3RVcGRhdGUiLCAiRGF0ZSIsICJub3ciLCAicmluZm8iLCAiZ3VpZCIsICJtdHUiLCAicmVjZWl2ZWRGcmFtZVNlcXVlbmNlcyIsICJTZXQiLCAibG9zdEZyYW1lU2VxdWVuY2VzIiwgImlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXgiLCAiZnJhZ21lbnRzUXVldWUiLCAiTWFwIiwgImlucHV0T3JkZXJJbmRleCIsICJpbnB1dE9yZGVyaW5nUXVldWUiLCAibGFzdElucHV0U2VxdWVuY2UiLCAib3V0cHV0T3JkZXJJbmRleCIsICJvdXRwdXRTZXF1ZW5jZUluZGV4IiwgIm91dHB1dEZyYW1lcyIsICJvdXRwdXRCYWNrdXAiLCAib3V0cHV0U2VxdWVuY2UiLCAib3V0cHV0c3BsaXRJbmRleCIsICJvdXRwdXRSZWxpYWJsZUluZGV4IiwgIkFycmF5IiwgImZyb20iLCAibGVuZ3RoIiwgImZpbGwiLCAiaW5kZXgiLCAic2V0IiwgInRpY2siLCAibG9nZ2VyIiwgIndhcm4iLCAiYWRkcmVzcyIsICJwb3J0IiwgImRpc2Nvbm5lY3QiLCAiRGlzY29ubmVjdGluZyIsICJEaXNjb25uZWN0ZWQiLCAic2l6ZSIsICJhY2siLCAiQWNrIiwgInNlcXVlbmNlcyIsICJzZXF1ZW5jZSIsICJkZWxldGUiLCAic2VuZCIsICJzZXJpYWxpemUiLCAibmFjayIsICJOYWNrIiwgInNlbmRRdWV1ZSIsICJEaXNjb25uZWN0IiwgImZyYW1lIiwgIkZyYW1lIiwgInJlbGlhYmlsaXR5IiwgIlJlbGlhYmlsaXR5IiwgIlJlbGlhYmxlT3JkZXJlZCIsICJvcmRlckNoYW5uZWwiLCAicGF5bG9hZCIsICJzZW5kRnJhbWUiLCAiUHJpb3JpdHkiLCAiSW1tZWRpYXRlIiwgImVtaXQiLCAiY29ubmVjdGlvbnMiLCAiaW5jb21pbmciLCAiYnVmZmVyIiwgImhlYWRlciIsICJpZCIsICJ0b1N0cmluZyIsICJkZWJ1ZyIsICJFcnJvciIsICJQYWNrZXQiLCAiQml0ZmxhZ3MiLCAiVmFsaWQiLCAiaGFuZGxlSW5jb21pbmdGcmFtZVNldCIsICJpbmNvbWluZ0JhdGNoIiwgIkNvbm5lY3Rpb25SZXF1ZXN0IiwgImhhbmRsZUluY29taW5nQ29ubmVjdGlvblJlcXVlc3QiLCAiTmV3SW5jb21pbmdDb25uZWN0aW9uIiwgIkNvbm5lY3RlZCIsICJDb25uZWN0ZWRQaW5nIiwgImhhbmRsZUluY29taW5nQ29ubmVjdGVkUGluZyIsICJkZXNlcmlhbGl6ZSIsICJoYXMiLCAiZnJhbWVzIiwgImdldCIsICJmcmFtZXNldCIsICJGcmFtZVNldCIsICJhZGQiLCAiaGFuZGxlRnJhbWUiLCAiaXNTcGxpdCIsICJoYW5kbGVGcmFnbWVudCIsICJpc1NlcXVlbmNlZCIsICJzZXF1ZW5jZUluZGV4IiwgIm9yZGVySW5kZXgiLCAiaXNPcmRlcmVkIiwgIm91dE9mT3JkZXJRdWV1ZSIsICJ1bm9yZGVyZWQiLCAic3BsaXRJZCIsICJmcmFnbWVudCIsICJzcGxpdEluZGV4IiwgInNwbGl0U2l6ZSIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInNmcmFtZSIsICJ3cml0ZUJ1ZmZlciIsICJuZnJhbWUiLCAicmVsaWFibGVJbmRleCIsICJnZXRCdWZmZXIiLCAicHJpb3JpdHkiLCAiaXNPcmRlckV4Y2x1c2l2ZSIsICJtYXhTaXplIiwgIk1hdGgiLCAiY2VpbCIsICJieXRlTGVuZ3RoIiwgInN1YmFycmF5IiwgInF1ZXVlRnJhbWUiLCAiREdSQU1fSEVBREVSX1NJWkUiLCAiZ2V0Qnl0ZUxlbmd0aCIsICJER1JBTV9NVFVfT1ZFUkhFQUQiLCAiYW1vdW50IiwgInNsaWNlIiwgInJlcXVlc3QiLCAiYWNjZXB0ZWQiLCAiQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCIsICJBZGRyZXNzIiwgImZyb21JZGVudGlmaWVyIiwgInN5c3RlbUluZGV4IiwgInN5c3RlbUFkZHJlc3MiLCAicmVxdWVzdFRpbWVzdGFtcCIsICJ0aW1lc3RhbXAiLCAiQmlnSW50IiwgIk5vcm1hbCIsICJwaW5nIiwgInBvbmciLCAiQ29ubmVjdGVkUG9uZyIsICJwaW5nVGltZXN0YW1wIiwgIk9mZmxpbmUiLCAic2VydmVyIiwgImhhbmRsZSIsICJidWZmZXIiLCAicmluZm8iLCAiaGVhZGVyIiwgIkVycm9yIiwgIlBhY2tldCIsICJVbmNvbm5lY3RlZFBpbmciLCAidW5jb25uZWN0ZWRQaW5nIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDEiLCAib3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSIsICJPcGVuQ29ubmVjdGlvblJlcXVlc3QyIiwgIm9wZW5Db25uZWN0aW9uUmVxdWVzdDIiLCAiaWQiLCAidG9TdHJpbmciLCAibGVuZ3RoIiwgImxvZ2dlciIsICJkZWJ1ZyIsICJhZGRyZXNzIiwgInBvcnQiLCAicGluZyIsICJkZXNlcmlhbGl6ZSIsICJwb25nIiwgIlVuY29ubmVjdGVkUG9uZyIsICJ0aW1lc3RhbXAiLCAiZ3VpZCIsICJtZXNzYWdlIiwgInByb3RvY29sIiwgInZlcnNpb24iLCAiY29ubmVjdGlvbnMiLCAic2l6ZSIsICJtYXhDb25uZWN0aW9ucyIsICJqb2luIiwgInNlbmQiLCAic2VyaWFsaXplIiwgInJlcXVlc3QiLCAiUkFLTkVUX1BST1RPQ09MIiwgImluY29tcGF0aWJsZSIsICJJbmNvbXBhdGlibGVQcm90b2NvbFZlcnNpb24iLCAid2FybiIsICJyZXBseSIsICJPcGVuQ29ubmVjdGlvblJlcGx5MSIsICJzZWN1cml0eSIsICJtdHUiLCAiVURQX0hFQURFUl9TSVpFIiwgIm1heE10dVNpemUiLCAibWluTXR1U2l6ZSIsICJ2YWx1ZXMiLCAiZmluZCIsICJ4IiwgIk9wZW5Db25uZWN0aW9uUmVwbHkyIiwgIkFkZHJlc3MiLCAiZnJvbUlkZW50aWZpZXIiLCAiZW5jcnlwdGlvbiIsICJhZGQiLCAiQ29ubmVjdGlvbiIsICJjbGllbnQiLCAiRGVmYXVsdFJha25ldFNlcnZlclByb3BlcnRpZXMiLCAiYWRkcmVzcyIsICJwb3J0IiwgInByb3RvY29sIiwgIlJBS05FVF9QUk9UT0NPTCIsICJ2ZXJzaW9uIiwgIm1lc3NhZ2UiLCAibWF4Q29ubmVjdGlvbnMiLCAibXR1TWF4U2l6ZSIsICJNQVhfTVRVX1NJWkUiLCAibXR1TWluU2l6ZSIsICJNSU5fTVRVX1NJWkUiLCAiU2VydmVyIiwgIkVtaXR0ZXIiLCAiaW50ZXJ2YWwiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJEYXJrQXF1YSIsICJzb2NrZXQiLCAiY3JlYXRlU29ja2V0IiwgImNvbm5lY3Rpb25zIiwgIlNldCIsICJndWlkIiwgIkJpZ0ludCIsICJNYXRoIiwgImZsb29yIiwgInJhbmRvbSIsICJ2YWx1ZSIsICJtYXhNdHVTaXplIiwgIm1pbk10dVNpemUiLCAiYWxpdmUiLCAib24iLCAiaGFuZGxlIiwgImJpbmQiLCAidW5yZWYiLCAiT2ZmbGluZSIsICJzZXJ2ZXIiLCAic3RhcnQiLCAic2hvdWxkVGljayIsICJ0aWNrIiwgIl9fbmFtZSIsICJzZXRUaW1lb3V0IiwgImNvbm5lY3Rpb24iLCAiUkFLTkVUX1RJQ0tfTEVOIiwgInN0b3AiLCAiZGlzY29ubmVjdCIsICJjbG9zZSIsICJlbWl0IiwgIkVycm9yIiwgImJ1ZmZlciIsICJyaW5mbyIsICJoZWFkZXIiLCAib2ZmbGluZSIsICJCaXRmbGFncyIsICJWYWxpZCIsICJ2YWx1ZXMiLCAiZmluZCIsICJ4IiwgImluY29taW5nIiwgInNlbmQiXQp9Cg==
1
+ "use strict";var ne=Object.defineProperty;var Xe=Object.getOwnPropertyDescriptor;var Je=Object.getOwnPropertyNames;var Ye=Object.prototype.hasOwnProperty;var d=(o,e)=>ne(o,"name",{value:e,configurable:!0});var et=(o,e)=>{for(var t in e)ne(o,t,{get:e[t],enumerable:!0})},tt=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Je(e))!Ye.call(o,i)&&i!==t&&ne(o,i,{get:()=>e[i],enumerable:!(n=Xe(e,i))||n.enumerable});return o};var nt=o=>tt(ne({},"__esModule",{value:!0}),o);var at={};et(at,{Ack:()=>k,Address:()=>u,BasePacket:()=>l,Bitflags:()=>I,ConnectedPing:()=>N,ConnectedPong:()=>D,Connection:()=>De,ConnectionRequest:()=>E,ConnectionRequestAccepted:()=>w,DGRAM_HEADER_SIZE:()=>ze,DGRAM_MTU_OVERHEAD:()=>Ae,DataType:()=>R,Disconnect:()=>J,Frame:()=>O,FrameSet:()=>_,IncompatibleProtocolVersion:()=>j,MAX_MTU_SIZE:()=>je,MIN_MTU_SIZE:()=>_e,MTU:()=>ve,Magic:()=>g,Nack:()=>Q,NewIncomingConnection:()=>F,Offline:()=>he,OpenConnectionReply1:()=>q,OpenConnectionReply2:()=>b,OpenConnectionRequest1:()=>U,OpenConnectionRequest2:()=>B,Packet:()=>a,Priority:()=>C,Proto:()=>f,RAKNET_PROTOCOL:()=>$,RAKNET_TICK_LEN:()=>Ue,RAKNET_TPS:()=>ct,Reliability:()=>m,Serialize:()=>p,Server:()=>pt,Status:()=>y,SystemAddress:()=>xe,UDP_HEADER_SIZE:()=>me,UnconnectedPing:()=>P,UnconnectedPong:()=>S});module.exports=nt(at);var ci=require("reflect-metadata");var H=require("@serenityjs/nbt");function f(o){return function(e){e.id=o;let t=Reflect.getOwnMetadata("properties",e.prototype),n=Object.getOwnPropertyNames(e.prototype);n.includes("serialize")||(e.prototype.serialize=function(){if(this.flush(),e.id_type.write(this,e.id),!t)return this.getBuffer();for(let{name:i,type:r,endian:s,parameter:c}of t)if(c){if(r.prototype===H.CompoundTag.prototype)throw new Error("Parameters are not supported for CompoundTag serialization.");let h=this[c],z=r,Ge=this[i];z.write(this,Ge,s,h)}else if(r.prototype===H.CompoundTag.prototype){let h=r,z=this[i];h.write(this,z,{name:!0,type:!0,varint:s})}else{let h=r,z=this[i];h.write(this,z,s)}return this.getBuffer()}),n.includes("deserialize")||(e.prototype.deserialize=function(){if(this.binary.length===0)return this;if(e.id_type.read(this),!t)return this;for(let{name:i,type:r,endian:s,parameter:c}of t)if(c){if(r.prototype===H.CompoundTag.prototype)throw new Error("Parameters are not supported for CompoundTag deserialization.");let h=this[c],z=r;this[i]=z.read(this,s,h)}else if(r.prototype===H.CompoundTag.prototype){let h=r;this[i]=h.read(this,s)}else{let h=r;this[i]=h.read(this,s)}return this}),n.includes("getId")||(e.prototype.getId=function(){return e.id}),n.includes("getIdType")||(e.prototype.getIdType=function(){return e.id_type})}}d(f,"Proto");var Ee=require("@serenityjs/binarystream");function p(o,e=Ee.Endianness.Big,t){if(!o)throw new Error("@Serialize() failed, no type provided.");return function(n,i){let r=Reflect.getMetadata("properties",n)||[];r.push({name:i,type:o,endian:e,parameter:t}),Reflect.defineMetadata("properties",r,n)}}d(p,"Serialize");var ye=require("@serenityjs/binarystream");var R=class{static{d(this,"DataType")}constructor(...e){}static read(e,t=ye.Endianness.Big,n){}static write(e,t,n=ye.Endianness.Big,i){}};var Fe=Buffer.from("\0\xFF\xFF\0\xFE\xFE\xFE\xFE\xFD\xFD\xFD\xFD4Vx","binary"),g=class extends R{static{d(this,"Magic")}static read(e){return e.readBuffer(Fe.length)}static write(e){e.writeBuffer(Fe)}};var ve=class extends R{static{d(this,"MTU")}static read(e){return e.getBuffer().byteLength}static write(e,t){e.writeBuffer(Buffer.alloc(t-e.getBuffer().length))}};var u=class o extends R{static{d(this,"Address")}address;port;version;constructor(e,t,n){super(),this.address=e,this.port=t,this.version=n}static fromIdentifier(e){return new o(e.address,e.port,e.family==="IPv4"?4:6)}static write(e,t){if(e.writeUint8(t.version),t.version===4){let n=t.address.split(".",4);for(let i of n)e.writeUint8(Number.parseInt(i,10)^255);e.writeUShort(t.port)}else if(t.version===6){e.writeUShort(23),e.writeUShort(t.port),e.writeUint32(0);let n=t.address.split(":");for(let i of n){let r=Number.parseInt(i,16);e.writeUShort(r^65535)}e.writeUint32(0)}}static read(e){let t=e.readUint8();if(t===4){let i=e.read(4).map(s=>(s^255).toString()).join("."),r=e.readUShort();return new o(i,r,t)}if(t===6){e.skip(2);let n=e.readUShort();e.skip(4);let i=[];for(let s=0;s<8;s++){let c=e.readUShort()^65535;i.push(c.toString(16).padStart(4,"0"))}let r=i.join(":");return e.skip(4),new o(r,n,t)}return new o("",0,0)}};var A=require("@serenityjs/binarystream");var a=function(o){return o[o.ConnectedPing=0]="ConnectedPing",o[o.UnconnectedPing=1]="UnconnectedPing",o[o.ConnectedPong=3]="ConnectedPong",o[o.OpenConnectionRequest1=5]="OpenConnectionRequest1",o[o.OpenConnectionReply1=6]="OpenConnectionReply1",o[o.OpenConnectionRequest2=7]="OpenConnectionRequest2",o[o.OpenConnectionReply2=8]="OpenConnectionReply2",o[o.ConnectionRequest=9]="ConnectionRequest",o[o.ConnectionRequestAccepted=16]="ConnectionRequestAccepted",o[o.NewIncomingConnection=19]="NewIncomingConnection",o[o.Disconnect=21]="Disconnect",o[o.IncompatibleProtocolVersion=25]="IncompatibleProtocolVersion",o[o.UnconnectedPong=28]="UnconnectedPong",o[o.FrameSet=128]="FrameSet",o[o.Nack=160]="Nack",o[o.Ack=192]="Ack",o}(a||{});var I=function(o){return o[o.Valid=128]="Valid",o[o.Ack=64]="Ack",o[o.Nak=32]="Nak",o[o.Split=16]="Split",o}(I||{});var C=function(o){return o[o.Normal=0]="Normal",o[o.Immediate=1]="Immediate",o}(C||{});var y=function(o){return o[o.Connecting=0]="Connecting",o[o.Connected=1]="Connected",o[o.Disconnecting=2]="Disconnecting",o[o.Disconnected=3]="Disconnected",o}(y||{});var m=function(o){return o[o.Unreliable=0]="Unreliable",o[o.UnreliableSequenced=1]="UnreliableSequenced",o[o.Reliable=2]="Reliable",o[o.ReliableOrdered=3]="ReliableOrdered",o[o.ReliableSequenced=4]="ReliableSequenced",o[o.UnreliableWithAckReceipt=5]="UnreliableWithAckReceipt",o[o.ReliableWithAckReceipt=6]="ReliableWithAckReceipt",o[o.ReliableOrderedWithAckReceipt=7]="ReliableOrderedWithAckReceipt",o}(m||{});var O=class $e extends R{static{d(this,"Frame")}reliability;reliableIndex;sequenceIndex;orderIndex;orderChannel;splitSize;splitId;splitIndex;payload;isSplit(){return this.splitSize>0}isReliable(){return[m.Reliable,m.ReliableOrdered,m.ReliableSequenced,m.ReliableWithAckReceipt,m.ReliableOrderedWithAckReceipt].includes(this.reliability)}isSequenced(){return[m.ReliableSequenced,m.UnreliableSequenced].includes(this.reliability)}isOrdered(){return[m.UnreliableSequenced,m.ReliableOrdered,m.ReliableSequenced,m.ReliableOrderedWithAckReceipt].includes(this.reliability)}isOrderExclusive(){return[m.ReliableOrdered,m.ReliableOrderedWithAckReceipt].includes(this.reliability)}getByteLength(){return 3+this.payload.byteLength+(this.isReliable()?3:0)+(this.isSequenced()?3:0)+(this.isOrdered()?4:0)+(this.isSplit()?10:0)}static read(e){let t=[];do{let n=new $e,i=e.readUint8();n.reliability=(i&224)>>5;let r=(i&I.Split)!==0,s=Math.ceil(e.readUint16()/8);n.isReliable()&&(n.reliableIndex=e.readUint24(A.Endianness.Little)),n.isSequenced()&&(n.sequenceIndex=e.readUint24(A.Endianness.Little)),n.isOrdered()&&(n.orderIndex=e.readUint24(A.Endianness.Little),n.orderChannel=e.readUint8()),r&&(n.splitSize=e.readUint32(),n.splitId=e.readUint16(),n.splitIndex=e.readUint32()),n.payload=e.readBuffer(s),t.push(n)}while(!e.cursorAtEnd());return t}static write(e,t){for(let n of t)e.writeUint8(n.reliability<<5|(n.isSplit()?I.Split:0)),e.writeUint16(n.payload.byteLength<<3),n.isReliable()&&e.writeUint24(n.reliableIndex,A.Endianness.Little),n.isSequenced()&&e.writeUint24(n.sequenceIndex,A.Endianness.Little),n.isOrdered()&&(e.writeUint24(n.orderIndex,A.Endianness.Little),e.writeUint8(n.orderChannel)),n.isSplit()&&(e.writeUint32(n.splitSize),e.writeUint16(n.splitId),e.writeUint32(n.splitIndex)),e.writeBuffer(n.payload)}};var xe=class extends R{static{d(this,"SystemAddress")}static fromIdentifier(e){return new u(e.address,e.port,e.version)}static read(e){let t=[];for(let n=0;n<20;n++){let i=u.read(e);t.push(i)}return t}static write(e){let t=[{address:"127.0.0.1",port:0,version:4}];for(let n=0;n<20;n++)u.write(e,t[n]||{address:"0.0.0.0",port:0,version:4})}};var re=require("@serenityjs/binarystream");var l=class extends re.BinaryStream{static{d(this,"BasePacket")}static id;static id_type=re.Uint8;flush(){this.binary=[]}getId(){throw new Error("BasePacket.getId() is not implemented.")}getIdType(){throw new Error("BasePacket.getIdType() is not implemented.")}serialize(){throw new Error("BasePacket.serialize() is not implemented.")}deserialize(){throw new Error("BasePacket.deserialize() is not implemented.")}};var be=require("@serenityjs/binarystream");function oe(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(oe,"_ts_decorate");function Re(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Re,"_ts_metadata");var P=class extends l{static{d(this,"UnconnectedPing")}timestamp;magic;client};oe([p(be.Long),Re("design:type",typeof BigInt>"u"?Object:BigInt)],P.prototype,"timestamp",void 0);oe([p(g),Re("design:type",typeof Buffer>"u"?Object:Buffer)],P.prototype,"magic",void 0);oe([p(be.Long),Re("design:type",typeof BigInt>"u"?Object:BigInt)],P.prototype,"client",void 0);P=oe([f(a.UnconnectedPing)],P);var K=require("@serenityjs/binarystream");function W(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(W,"_ts_decorate");function ie(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ie,"_ts_metadata");var S=class extends l{static{d(this,"UnconnectedPong")}timestamp;guid;magic;message};W([p(K.Long),ie("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"timestamp",void 0);W([p(K.Long),ie("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"guid",void 0);W([p(g),ie("design:type",typeof Buffer>"u"?Object:Buffer)],S.prototype,"magic",void 0);W([p(K.String16),ie("design:type",String)],S.prototype,"message",void 0);S=W([f(a.UnconnectedPong)],S);var Me=require("@serenityjs/binarystream");function se(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(se,"_ts_decorate");function we(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(we,"_ts_metadata");var U=class extends l{static{d(this,"OpenConnectionRequest1")}magic;protocol;mtu};se([p(g),we("design:type",typeof Buffer>"u"?Object:Buffer)],U.prototype,"magic",void 0);se([p(Me.Uint8),we("design:type",Number)],U.prototype,"protocol",void 0);se([p(ve),we("design:type",Number)],U.prototype,"mtu",void 0);U=se([f(a.OpenConnectionRequest1)],U);var M=require("@serenityjs/binarystream");function Z(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Z,"_ts_decorate");function ce(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ce,"_ts_metadata");var q=class extends l{static{d(this,"OpenConnectionReply1")}magic;guid;security;mtu};Z([p(g),ce("design:type",typeof Buffer>"u"?Object:Buffer)],q.prototype,"magic",void 0);Z([p(M.Long),ce("design:type",typeof BigInt>"u"?Object:BigInt)],q.prototype,"guid",void 0);Z([p(M.Bool),ce("design:type",Boolean)],q.prototype,"security",void 0);Z([p(M.Short),ce("design:type",Number)],q.prototype,"mtu",void 0);q=Z([f(a.OpenConnectionReply1)],q);var pe=require("@serenityjs/binarystream");function G(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(G,"_ts_decorate");function de(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(de,"_ts_metadata");var B=class extends l{static{d(this,"OpenConnectionRequest2")}magic;address;mtu;client};G([p(g),de("design:type",typeof Buffer>"u"?Object:Buffer)],B.prototype,"magic",void 0);G([p(u),de("design:type",typeof u>"u"?Object:u)],B.prototype,"address",void 0);G([p(pe.Short),de("design:type",Number)],B.prototype,"mtu",void 0);G([p(pe.Long),de("design:type",typeof BigInt>"u"?Object:BigInt)],B.prototype,"client",void 0);B=G([f(a.OpenConnectionRequest2)],B);var T=require("@serenityjs/binarystream");function L(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(L,"_ts_decorate");function X(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(X,"_ts_metadata");var b=class extends l{static{d(this,"OpenConnectionReply2")}magic;guid;address;mtu;encryption};L([p(g),X("design:type",typeof Buffer>"u"?Object:Buffer)],b.prototype,"magic",void 0);L([p(T.Long),X("design:type",typeof BigInt>"u"?Object:BigInt)],b.prototype,"guid",void 0);L([p(u),X("design:type",typeof u>"u"?Object:u)],b.prototype,"address",void 0);L([p(T.Short),X("design:type",Number)],b.prototype,"mtu",void 0);L([p(T.Bool),X("design:type",Boolean)],b.prototype,"encryption",void 0);b=L([f(a.OpenConnectionReply2)],b);var Oe=require("@serenityjs/binarystream");function Ie(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Ie,"_ts_decorate");function Le(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Le,"_ts_metadata");var D=class extends l{static{d(this,"ConnectedPong")}pingTimestamp;timestamp};Ie([p(Oe.Long),Le("design:type",typeof BigInt>"u"?Object:BigInt)],D.prototype,"pingTimestamp",void 0);Ie([p(Oe.Long),Le("design:type",typeof BigInt>"u"?Object:BigInt)],D.prototype,"timestamp",void 0);D=Ie([f(a.ConnectedPong)],D);var Ne=require("@serenityjs/binarystream");function Te(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Te,"_ts_decorate");function rt(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(rt,"_ts_metadata");var N=class extends l{static{d(this,"ConnectedPing")}timestamp};Te([p(Ne.Long),rt("design:type",typeof BigInt>"u"?Object:BigInt)],N.prototype,"timestamp",void 0);N=Te([f(a.ConnectedPing)],N);var qe=require("@serenityjs/binarystream");function Se(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Se,"_ts_decorate");function ke(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ke,"_ts_metadata");var E=class extends l{static{d(this,"ConnectionRequest")}client;timestamp};Se([p(qe.Long),ke("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"client",void 0);Se([p(qe.Long),ke("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"timestamp",void 0);E=Se([f(a.ConnectionRequest)],E);var ae=require("@serenityjs/binarystream");function Be(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(Be,"_ts_decorate");function Qe(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Qe,"_ts_metadata");var _=class extends l{static{d(this,"FrameSet")}sequence;frames};Be([p(ae.Uint24,ae.Endianness.Little),Qe("design:type",Number)],_.prototype,"sequence",void 0);Be([p(O),Qe("design:type",typeof Array>"u"?Object:Array)],_.prototype,"frames",void 0);_=Be([f(a.FrameSet)],_);var v=require("@serenityjs/binarystream");function ot(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(ot,"_ts_decorate");var k=class Ve extends l{static{d(this,"Ack")}sequences=[];serialize(){this.writeUint8(Ve.id);let e=new v.BinaryStream,t=this.sequences.length,n=0;if(t>0){let i=0,r=this.sequences[0],s=this.sequences[0];for(;i<t;){let c=this.sequences[i++],h=c-s;h===1?s=c:h>1&&(r===s?(e.writeBool(!0),e.writeUint24(r,v.Endianness.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,v.Endianness.Little),e.writeUint24(s,v.Endianness.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,v.Endianness.Little)):(e.writeBool(!1),e.writeUint24(r,v.Endianness.Little),e.writeUint24(s,v.Endianness.Little)),++n,this.writeUShort(n),this.writeBuffer(e.getBuffer())}return this.getBuffer()}deserialize(){this.readUint8(),this.sequences=[];let e=this.readUShort();for(let t=0;t<e;t++)if(this.readBool())this.sequences.push(this.readUint24(v.Endianness.Little));else{let i=this.readUint24(v.Endianness.Little),r=this.readUint24(v.Endianness.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};k=ot([f(a.Ack)],k);var x=require("@serenityjs/binarystream");function it(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(it,"_ts_decorate");var Q=class He extends l{static{d(this,"Nack")}sequences=[];serialize(){this.writeUint8(He.id);let e=new x.BinaryStream,t=this.sequences.length,n=0;if(t>0){let i=0,r=this.sequences[0],s=this.sequences[0];for(;i<t;){let c=this.sequences[i++],h=c-s;h===1?s=c:h>1&&(r===s?(e.writeBool(!0),e.writeUint24(r,x.Endianness.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,x.Endianness.Little),e.writeUint24(s,x.Endianness.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,x.Endianness.Little)):(e.writeBool(!1),e.writeUint24(r,x.Endianness.Little),e.writeUint24(s,x.Endianness.Little)),++n,this.writeUShort(n),this.writeBuffer(e.getBuffer())}return this.getBuffer()}deserialize(){this.readUint8(),this.sequences=[];let e=this.readUShort();for(let t=0;t<e;t++)if(this.readBool())this.sequences.push(this.readUint24(x.Endianness.Little));else{let i=this.readUint24(x.Endianness.Little),r=this.readUint24(x.Endianness.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};Q=it([f(a.Nack)],Q);function st(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(st,"_ts_decorate");var J=class extends l{static{d(this,"Disconnect")}};J=st([f(a.Disconnect)],J);var le=require("@serenityjs/binarystream");function fe(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(fe,"_ts_decorate");function Ce(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Ce,"_ts_metadata");var j=class extends l{static{d(this,"IncompatibleProtocolVersion")}protocol;magic;guid};fe([p(le.Uint8),Ce("design:type",Number)],j.prototype,"protocol",void 0);fe([p(g),Ce("design:type",typeof Buffer>"u"?Object:Buffer)],j.prototype,"magic",void 0);fe([p(le.Uint64),Ce("design:type",typeof BigInt>"u"?Object:BigInt)],j.prototype,"guid",void 0);j=fe([f(a.IncompatibleProtocolVersion)],j);var ee=require("@serenityjs/binarystream");function V(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(V,"_ts_decorate");function Y(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Y,"_ts_metadata");var w=class extends l{static{d(this,"ConnectionRequestAccepted")}address;systemIndex;systemAddress;requestTimestamp;timestamp};V([p(u),Y("design:type",typeof u>"u"?Object:u)],w.prototype,"address",void 0);V([p(ee.Short),Y("design:type",Number)],w.prototype,"systemIndex",void 0);V([p(xe),Y("design:type",typeof Array>"u"?Object:Array)],w.prototype,"systemAddress",void 0);V([p(ee.Long),Y("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"requestTimestamp",void 0);V([p(ee.Long),Y("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"timestamp",void 0);w=V([f(a.ConnectionRequestAccepted)],w);var Pe=require("@serenityjs/binarystream");function te(o,e,t,n){var i=arguments.length,r=i<3?e:n===null?n=Object.getOwnPropertyDescriptor(e,t):n,s;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")r=Reflect.decorate(o,e,t,n);else for(var c=o.length-1;c>=0;c--)(s=o[c])&&(r=(i<3?s(r):i>3?s(e,t,r):s(e,t))||r);return i>3&&r&&Object.defineProperty(e,t,r),r}d(te,"_ts_decorate");function ue(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ue,"_ts_metadata");var F=class extends l{static{d(this,"NewIncomingConnection")}serverAddress;internalAddress;incomingTimestamp;serverTimestamp};te([p(u),ue("design:type",String)],F.prototype,"serverAddress",void 0);te([p(u),ue("design:type",String)],F.prototype,"internalAddress",void 0);te([p(Pe.Long),ue("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"incomingTimestamp",void 0);te([p(Pe.Long),ue("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"serverTimestamp",void 0);F=te([f(a.NewIncomingConnection)],F);var Ke=require("dgram"),Ze=require("@serenityjs/emitter"),ge=require("@serenityjs/logger");var $=11,ct=100,Ue=.01,me=28,_e=400,je=1492,ze=4,Ae=36;var We=require("@serenityjs/binarystream");var De=class{static{d(this,"Connection")}server;status=y.Connecting;lastUpdate=Date.now();rinfo;guid;mtu;receivedFrameSequences=new Set;lostFrameSequences=new Set;inputHighestSequenceIndex;fragmentsQueue=new Map;inputOrderIndex;inputOrderingQueue=new Map;lastInputSequence=-1;outputOrderIndex;outputSequenceIndex;outputFrames=new Set;outputBackup=new Map;outputSequence=0;outputsplitIndex=0;outputReliableIndex=0;constructor(e,t,n,i){this.server=e,this.rinfo=t,this.guid=n,this.mtu=i,this.inputOrderIndex=Array.from({length:32}).fill(0);for(let r=0;r<32;r++)this.inputOrderingQueue.set(r,new Map);this.inputHighestSequenceIndex=Array.from({length:32}).fill(0),this.outputOrderIndex=Array.from({length:32}).fill(0),this.outputSequenceIndex=Array.from({length:32}).fill(0)}tick(){if(this.lastUpdate+15e3<Date.now())return this.server.logger.warn(`Detected stale connection from \xA7c${this.rinfo.address}\xA7r:\xA7c${this.rinfo.port}\xA7r, disconnecting...`),this.disconnect();if(!(this.status===y.Disconnecting||this.status===y.Disconnected)){if(this.receivedFrameSequences.size>0){let e=new k;e.sequences=[...this.receivedFrameSequences];for(let t of this.receivedFrameSequences)this.receivedFrameSequences.delete(t);this.server.send(e.serialize(),this.rinfo)}if(this.lostFrameSequences.size>0){let e=new Q;e.sequences=[...this.lostFrameSequences];for(let t of this.lostFrameSequences)this.lostFrameSequences.delete(t);this.server.send(e.serialize(),this.rinfo)}return this.sendQueue(this.outputFrames.size)}}disconnect(){this.status=y.Disconnecting;let e=new J,t=new O;t.reliability=m.ReliableOrdered,t.orderChannel=0,t.payload=e.serialize(),this.sendFrame(t,C.Immediate),this.server.emit("disconnect",this),this.server.connections.delete(this),this.status=y.Disconnected}incoming(e){this.lastUpdate=Date.now();let t=e[0]&240;switch(t){default:{let n=t.toString(16).length===1?"0"+t.toString(16):t.toString(16);return this.server.logger.debug(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`))}case a.Ack:{this.ack(e);break}case a.Nack:{this.nack(e);break}case I.Valid:{this.handleIncomingFrameSet(e);break}}}incomingBatch(e){let t=e[0];if(this.status===y.Connecting){switch(t){default:{let n=t.toString(16).length===1?"0"+t.toString(16):t.toString(16);return this.server.logger.debug(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`))}case a.Disconnect:{this.status=y.Disconnecting,this.server.connections.delete(this),this.status=y.Disconnected;break}case a.ConnectionRequest:{this.handleIncomingConnectionRequest(e);break}case a.NewIncomingConnection:{this.status=y.Connected,this.server.emit("connect",this);break}}return}switch(t){default:{let n=t.toString(16).length===1?"0"+t.toString(16):t.toString(16);return this.server.logger.debug(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Received unknown online packet 0x${n} from ${this.rinfo.address}:${this.rinfo.port}!`))}case a.Disconnect:{this.status=y.Disconnecting,this.server.emit("disconnect",this),this.server.connections.delete(this),this.status=y.Disconnected;break}case a.ConnectedPing:return this.handleIncomingConnectedPing(e);case 254:this.server.emit("encapsulated",this,e)}}ack(e){let t=new k(e).deserialize();for(let n of t.sequences)this.outputBackup.has(n)||this.server.logger.debug(`Received ack for unknown sequence ${n} from ${this.rinfo.address}:${this.rinfo.port}.`),this.outputBackup.delete(n)}nack(e){let t=new Q(e).deserialize();for(let n of t.sequences){let i=this.outputBackup.get(n)??[];for(let r of i)this.sendFrame(r,C.Immediate)}}handleIncomingFrameSet(e){let t=new _(e).deserialize();if(this.receivedFrameSequences.has(t.sequence))return this.server.logger.debug(`Received duplicate frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Recieved duplicate frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`));if(this.lostFrameSequences.delete(t.sequence),t.sequence<this.lastInputSequence||t.sequence===this.lastInputSequence)return this.server.logger.debug(`Received out of order frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Recieved out of order frameset ${t.sequence} from ${this.rinfo.address}:${this.rinfo.port}!`));if(this.receivedFrameSequences.add(t.sequence),t.sequence-this.lastInputSequence>1)for(let n=this.lastInputSequence+1;n<t.sequence;n++)this.lostFrameSequences.add(n);this.lastInputSequence=t.sequence;for(let n of t.frames)this.handleFrame(n)}handleFrame(e){if(e.isSplit())return this.handleFragment(e);if(e.isSequenced())return e.sequenceIndex<this.inputHighestSequenceIndex[e.orderChannel]||e.orderIndex<this.inputOrderIndex[e.orderChannel]?(this.server.logger.debug(`Recieved out of order frame ${e.sequenceIndex} from ${this.rinfo.address}:${this.rinfo.port}!`),void this.server.emit("error",new Error(`Recieved out of order frame ${e.sequenceIndex} from ${this.rinfo.address}:${this.rinfo.port}!`))):(this.inputHighestSequenceIndex[e.orderChannel]=e.sequenceIndex+1,this.incomingBatch(e.payload));if(e.isOrdered()){if(e.orderIndex===this.inputOrderIndex[e.orderChannel]){this.inputHighestSequenceIndex[e.orderChannel]=0,this.inputOrderIndex[e.orderChannel]=e.orderIndex+1,this.incomingBatch(e.payload);let t=this.inputOrderIndex[e.orderChannel],n=this.inputOrderingQueue.get(e.orderChannel);for(;n.has(t);t++){let i=n.get(t);if(!i)break;this.incomingBatch(i.payload),n.delete(t)}this.inputOrderingQueue.set(e.orderChannel,n),this.inputOrderIndex[e.orderChannel]=t}else if(e.orderIndex>this.inputOrderIndex[e.orderChannel]){let t=this.inputOrderingQueue.get(e.orderChannel);if(!t)return;t.set(e.orderIndex,e)}}else return this.incomingBatch(e.payload)}handleFragment(e){if(this.fragmentsQueue.has(e.splitId)){let t=this.fragmentsQueue.get(e.splitId);if(!t)return;if(t.set(e.splitIndex,e),t.size===e.splitSize){let n=new We.BinaryStream;for(let r=0;r<t.size;r++){let s=t.get(r);n.writeBuffer(s.payload)}let i=new O;return i.reliability=e.reliability,i.reliableIndex=e.reliableIndex,i.sequenceIndex=e.sequenceIndex,i.orderIndex=e.orderIndex,i.orderChannel=e.orderChannel,i.payload=n.getBuffer(),this.fragmentsQueue.delete(e.splitId),this.handleFrame(i)}}else this.fragmentsQueue.set(e.splitId,new Map([[e.splitIndex,e]]))}sendFrame(e,t){e.isSequenced()?(e.orderIndex=this.outputOrderIndex[e.orderChannel],e.sequenceIndex=this.outputSequenceIndex[e.orderChannel]++):e.isOrderExclusive()&&(e.orderIndex=this.outputOrderIndex[e.orderChannel]++,this.outputSequenceIndex[e.orderChannel]=0);let n=this.mtu-36,i=Math.ceil(e.payload.byteLength/n);if(e.reliableIndex=this.outputReliableIndex++,e.payload.byteLength>n){let r=this.outputsplitIndex++%65536;for(let s=0;s<e.payload.byteLength;s+=n){let c=new O;c.reliableIndex=e.reliableIndex,s!==0&&(c.reliableIndex=this.outputReliableIndex++),c.sequenceIndex=e.sequenceIndex,c.orderIndex=e.orderIndex,c.orderChannel=e.orderChannel,c.reliability=e.reliability,c.payload=e.payload.subarray(s,s+n),c.splitIndex=s/n,c.splitId=r,c.splitSize=i,this.queueFrame(c,t)}}else return this.queueFrame(e,t)}queueFrame(e,t){let n=4;for(let i of this.outputFrames)n+=i.getByteLength();if(n+e.getByteLength()>this.mtu-36&&this.sendQueue(this.outputFrames.size),this.outputFrames.add(e),t===C.Immediate)return this.sendQueue(1)}sendQueue(e){if(this.outputFrames.size===0)return;let t=new _;t.sequence=this.outputSequence++,t.frames=[...this.outputFrames].slice(0,e),this.outputBackup.set(t.sequence,t.frames);for(let n of t.frames)this.outputFrames.delete(n);return this.server.send(t.serialize(),this.rinfo)}handleIncomingConnectionRequest(e){let t=new E(e).deserialize(),n=new w;n.address=u.fromIdentifier(this.rinfo),n.systemIndex=0,n.systemAddress=[],n.requestTimestamp=t.timestamp,n.timestamp=BigInt(Date.now());let i=new O;return i.reliability=m.ReliableOrdered,i.orderChannel=0,i.payload=n.serialize(),this.sendFrame(i,C.Normal)}handleIncomingConnectedPing(e){let t=new N(e).deserialize(),n=new D;n.timestamp=t.timestamp,n.pingTimestamp=t.timestamp,n.timestamp=BigInt(Date.now());let i=new O;i.reliability=m.ReliableOrdered,i.orderChannel=0,i.payload=n.serialize(),this.sendFrame(i,C.Normal)}};var he=class{static{d(this,"Offline")}static server;static handle(e,t){let n=e[0];if(!n)throw new Error("Invalid offline packet header");switch(n){case a.UnconnectedPing:{this.unconnectedPing(e,t);break}case a.OpenConnectionRequest1:{this.openConnectionRequest1(e,t);break}case a.OpenConnectionRequest2:{this.openConnectionRequest2(e,t);break}default:{let i=n.toString(16).length===1?"0"+n.toString(16):n.toString(16);this.server.logger.debug(`Received an unknown offline packet identifier "0x${i}" from ${t.address}:${t.port}`)}}}static unconnectedPing(e,t){let n=new P(e).deserialize(),i=new S;i.timestamp=n.timestamp,i.guid=this.server.guid,i.message=["MCPE",this.server.message??"Raknet Server",this.server.protocol??100,this.server.version??"1.0.0",this.server.connections.size,this.server.maxConnections??10,this.server.guid,"SerenityJS","Survival",1,this.server.port,this.server.port+1].join(";")+";",this.server.send(i.serialize(),t)}static openConnectionRequest1(e,t){let n=new U(e).deserialize();if(n.protocol!==11){let r=new j;return r.protocol=11,r.guid=this.server.guid,this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to incompatible protocol version v${n.protocol}, expected v${11}.`),this.server.send(r.serialize(),t)}let i=new q;return i.guid=this.server.guid,i.security=!1,i.mtu=n.mtu+28>this.server.maxMtuSize?this.server.maxMtuSize:n.mtu+28,this.server.send(i.serialize(),t)}static openConnectionRequest2(e,t){let n=new B(e).deserialize();if(n.address.port!==this.server.port)return this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to mismatched port.`);if(n.mtu<this.server.minMtuSize||n.mtu>this.server.maxMtuSize)return this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to invalid mtu size.`);if([...this.server.connections.values()].find(s=>s.rinfo.address===t.address&&s.rinfo.port===t.port))return this.server.logger.warn(`Refusing connection from ${t.address}:${t.port} due to already established connection.`);let r=new b;return r.guid=this.server.guid,r.address=u.fromIdentifier(t),r.mtu=n.mtu,r.encryption=!1,this.server.logger.debug(`Establishing connection from ${t.address}:${t.port} with mtu size of ${n.mtu}.`),this.server.connections.add(new De(this.server,t,n.client,n.mtu)),this.server.send(r.serialize(),t)}};var dt={address:"0.0.0.0",port:19132,protocol:11,version:"1.0.0",message:"Raknet Server",maxConnections:40,mtuMaxSize:1492,mtuMinSize:400},pt=class extends Ze.Emitter{static{d(this,"Server")}interval=null;properties;logger=new ge.Logger("Raknet",ge.LoggerColors.DarkAqua);socket=(0,Ke.createSocket)("udp4");connections=new Set;guid=BigInt(Math.floor(Math.random()*2**64));get address(){return this.properties.address}set address(e){this.properties.address=e}get port(){return this.properties.port}set port(e){this.properties.port=e}get maxMtuSize(){return this.properties.mtuMaxSize}set maxMtuSize(e){this.properties.mtuMaxSize=e}get minMtuSize(){return this.properties.mtuMinSize}set minMtuSize(e){this.properties.mtuMinSize=e}get protocol(){return this.properties.protocol}set protocol(e){this.properties.protocol=e}get version(){return this.properties.version}set version(e){this.properties.version=e}get message(){return this.properties.message}set message(e){this.properties.message=e}get maxConnections(){return this.properties.maxConnections}set maxConnections(e){this.properties.maxConnections=e}alive=!0;constructor(e){super(),this.properties={...dt,...e},this.socket.on("message",this.handle.bind(this)),this.socket.unref(),he.server=this}start(e=!0){this.socket.bind(this.port,this.address);let t=d(()=>setTimeout(()=>{if(!(!this.alive||!this.interval)){for(let n of this.connections)n.tick();return t()}},.01),"tick");e&&(this.interval=t())}stop(){try{this.alive=!1;for(let e of this.connections)e.disconnect();this.interval&&(this.interval=null),this.socket.close()}catch{this.emit("error",new Error("Failed to close the server"))}}handle(e,t){let n=e[0];if(!n)throw new Error("Invalid packet header");let i=(n&I.Valid)===0,r=[...this.connections.values()].find(s=>s.rinfo.address===t.address&&s.rinfo.port===t.port);if(i)return he.handle(e,t);if(!i&&r)return r.incoming(e)}send(e,t){this.socket.send(e,t.port,t.address)}};0&&(module.exports={Ack,Address,BasePacket,Bitflags,ConnectedPing,ConnectedPong,Connection,ConnectionRequest,ConnectionRequestAccepted,DGRAM_HEADER_SIZE,DGRAM_MTU_OVERHEAD,DataType,Disconnect,Frame,FrameSet,IncompatibleProtocolVersion,MAX_MTU_SIZE,MIN_MTU_SIZE,MTU,Magic,Nack,NewIncomingConnection,Offline,OpenConnectionReply1,OpenConnectionReply2,OpenConnectionRequest1,OpenConnectionRequest2,Packet,Priority,Proto,RAKNET_PROTOCOL,RAKNET_TICK_LEN,RAKNET_TPS,Reliability,Serialize,Server,Status,SystemAddress,UDP_HEADER_SIZE,UnconnectedPing,UnconnectedPong});
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3Byb3RvLnRzIiwgIi4uL3NyYy9kZWNvcmF0b3JzL3NlcmlhbGl6ZS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvdHlwZS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvbWFnaWMudHMiLCAiLi4vc3JjL3Byb3RvL3R5cGVzL210dS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvYWRkcmVzcy50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvZnJhbWUudHMiLCAiLi4vc3JjL2VudW1zL3BhY2tldC50cyIsICIuLi9zcmMvZW51bXMvYml0LWZsYWdzLnRzIiwgIi4uL3NyYy9lbnVtcy9wcmlvcml0eS50cyIsICIuLi9zcmMvZW51bXMvc3RhdHVzLnRzIiwgIi4uL3NyYy9lbnVtcy9yZWxpYWJpbGl0eS50cyIsICIuLi9zcmMvcHJvdG8vdHlwZXMvc3lzdGVtLWFkZHJlc3MudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvYmFzZS50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS91bmNvbm5lY3RlZC1waW5nLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL3VuY29ubmVjdGVkLXBvbmcudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvb3Blbi1jb25uZWN0aW9uLXJlcXVlc3QtMS50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9vcGVuLWNvbm5lY3Rpb24tcmVwbHktMS50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9vcGVuLWNvbm5lY3Rpb24tcmVxdWVzdC0yLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL29wZW4tY29ubmVjdGlvbi1yZXBseS0yLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL2Nvbm5lY3RlZC1wb25nLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL2Nvbm5lY3RlZC1waW5nLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL2Nvbm5lY3Rpb24tcmVxdWVzdC50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9mcmFtZS1zZXQudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvYWNrLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL25hY2sudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvZGlzY29ubmVjdC50cyIsICIuLi9zcmMvcHJvdG8vZGF0YS9pbmNvbXBhdGlibGUtcHJvdG9jb2wudHMiLCAiLi4vc3JjL3Byb3RvL2RhdGEvY29ubmVjdGlvbi1yZXF1ZXN0LWFjY2VwdGVkLnRzIiwgIi4uL3NyYy9wcm90by9kYXRhL25ldy1pbmNvbWluZy1jb25uZWN0aW9uLnRzIiwgIi4uL3NyYy9zZXJ2ZXIvcmFrbmV0LnRzIiwgIi4uL3NyYy9jb25zdGFudHMvcmFrbmV0LnRzIiwgIi4uL3NyYy9zZXJ2ZXIvY29ubmVjdGlvbi50cyIsICIuLi9zcmMvc2VydmVyL29mZmxpbmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcHJvdG9cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2VudW1zXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZXJ2ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbiIsICJpbXBvcnQgeyBDb21wb3VuZFRhZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9uYnRcIjtcblxuaW1wb3J0IHR5cGUgeyBFbmRpYW5uZXNzIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlUGFja2V0LCBEYXRhVHlwZSB9IGZyb20gXCIuLi9wcm90b1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrZXRNZXRhZGF0YSB9IGZyb20gXCIuLi90eXBlcy9wYWNrZXRcIjtcblxuLyoqXG4gKiBQcm90byBkZWNvcmF0b3IgZm9yIHBhY2tldCBjbGFzc2VzLlxuICpcbiAqIEBwYXJhbSBpZCBQYWNrZXQgaWQuXG4gKiBAcmV0dXJucyBUaGUgcGFja2V0IGRlY29yYXRvci5cbiAqL1xuZnVuY3Rpb24gUHJvdG8oaWQ6IG51bWJlcikge1xuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogdHlwZW9mIEJhc2VQYWNrZXQpIHtcbiAgICAvLyBTZXQgdGhlIHBhY2tldCBpZC5cbiAgICB0YXJnZXQuaWQgPSBpZDtcblxuICAgIC8vIFJlc29sdmUgdGhlIG1ldGFkYXRhIGZvciB0aGUgcGFja2V0LlxuICAgIGNvbnN0IG1ldGFkYXRhOiBBcnJheTxQYWNrZXRNZXRhZGF0YT4gPSBSZWZsZWN0LmdldE93bk1ldGFkYXRhKFxuICAgICAgXCJwcm9wZXJ0aWVzXCIsXG4gICAgICB0YXJnZXQucHJvdG90eXBlXG4gICAgKTtcblxuICAgIC8vIFJlYWQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBhY2tldC5cbiAgICBjb25zdCBwcm9wZXJ0aWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGFyZ2V0LnByb3RvdHlwZSk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgdGhlIHNlcmlhbGl6ZSBtZXRob2QuXG4gICAgLy8gVGhpcyBhbGxvd3MgY3VzdG9tIHBhY2tldHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2VyaWFsaXphdGlvbi5cbiAgICBpZiAoIXByb3BlcnRpZXMuaW5jbHVkZXMoXCJzZXJpYWxpemVcIikpXG4gICAgICAvLyBEZWZpbmUgdGhlIHNlcmlhbGl6ZSBtZXRob2QgZm9yIHRoZSBwYWNrZXQuXG4gICAgICB0YXJnZXQucHJvdG90eXBlLnNlcmlhbGl6ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gRmx1c2ggdGhlIGJpbmFyeSBzdHJlYW0uXG4gICAgICAgIHRoaXMuZmx1c2goKTtcblxuICAgICAgICAvLyBXcml0ZSB0aGUgcGFja2V0IGlkIHVzaW5nIHRoZSBpZCB0eXBlLlxuICAgICAgICB0YXJnZXQuaWRfdHlwZS53cml0ZSh0aGlzLCB0YXJnZXQuaWQgYXMgbmV2ZXIpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSBtZXRhZGF0YS5cbiAgICAgICAgLy8gSWYgbm90LCByZXR1cm4gdGhlIGJ1ZmZlci5cbiAgICAgICAgaWYgKCFtZXRhZGF0YSkgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyKCk7XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBtZXRhZGF0YSBhbmQgd3JpdGUgdGhlIHByb3BlcnRpZXMgdG8gdGhlIGJpbmFyeSBzdHJlYW0uXG4gICAgICAgIGZvciAoY29uc3QgeyBuYW1lLCB0eXBlLCBlbmRpYW4sIHBhcmFtZXRlciB9IG9mIG1ldGFkYXRhKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYXJhbWV0ZXIgZm9yIHR5cGUgdGVzdGluZy5cbiAgICAgICAgICBpZiAocGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdHlwZSBpcyBhIGNvbXBvdW5kIHRhZy5cbiAgICAgICAgICAgIGlmICh0eXBlLnByb3RvdHlwZSA9PT0gQ29tcG91bmRUYWcucHJvdG90eXBlKVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJQYXJhbWV0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBDb21wb3VuZFRhZyBzZXJpYWxpemF0aW9uLlwiXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFB1bGwgdGhlIHZhbHVlIGZyb20gdGhlIGNsYXNzIHVzaW5nIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcGFyYW1ldGVyIGFzIGtleW9mIEJhc2VQYWNrZXRdO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSB0eXBlIHRvIERhdGFUeXBlLlxuICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgLy8gUHVsbCB0aGUgZGF0YSBmcm9tIHRoZSBjbGFzcy5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAodGhpcyBhcyBuZXZlcilbbmFtZV07XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0eSB0byB0aGUgYmluYXJ5IHN0cmVhbSB1c2luZyB0aGUgdHlwZS5cbiAgICAgICAgICAgIGR0eXBlLndyaXRlKHRoaXMsIGRhdGEsIGVuZGlhbiBhcyBFbmRpYW5uZXNzLCB2YWx1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGEgY29tcG91bmQgdGFnLlxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlID09PSBDb21wb3VuZFRhZy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBDb21wb3VuZFRhZy5cbiAgICAgICAgICAgICAgY29uc3QgY3R5cGUgPSB0eXBlIGFzIHR5cGVvZiBDb21wb3VuZFRhZztcblxuICAgICAgICAgICAgICAvLyBQdWxsIHRoZSB0YWcgZnJvbSB0aGUgY2xhc3MuXG4gICAgICAgICAgICAgIGNvbnN0IHRhZyA9ICh0aGlzIGFzIG5ldmVyKVtuYW1lXSBhcyBDb21wb3VuZFRhZztcblxuICAgICAgICAgICAgICAvLyBXcml0ZSB0aGUgcHJvcGVydHkgdG8gdGhlIGJpbmFyeSBzdHJlYW0gdXNpbmcgdGhlIHR5cGUuXG4gICAgICAgICAgICAgIGN0eXBlLndyaXRlKHRoaXMsIHRhZywge1xuICAgICAgICAgICAgICAgIG5hbWU6IHRydWUsXG4gICAgICAgICAgICAgICAgdHlwZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB2YXJpbnQ6IGVuZGlhbiBhcyBib29sZWFuXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBEYXRhVHlwZS5cbiAgICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgICAvLyBQdWxsIHRoZSBkYXRhIGZyb20gdGhlIGNsYXNzLlxuICAgICAgICAgICAgICBjb25zdCBkYXRhID0gKHRoaXMgYXMgbmV2ZXIpW25hbWVdO1xuXG4gICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0eSB0byB0aGUgYmluYXJ5IHN0cmVhbSB1c2luZyB0aGUgdHlwZS5cbiAgICAgICAgICAgICAgZHR5cGUud3JpdGUodGhpcywgZGF0YSwgZW5kaWFuIGFzIEVuZGlhbm5lc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0aGUgYnVmZmVyLlxuICAgICAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgdGhlIGRlc2VyaWFsaXplIG1ldGhvZC5cbiAgICAvLyBUaGlzIGFsbG93cyBjdXN0b20gcGFja2V0cyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBkZXNlcmlhbGl6YXRpb24uXG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKFwiZGVzZXJpYWxpemVcIikpXG4gICAgICB0YXJnZXQucHJvdG90eXBlLmRlc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgYmluYXJ5IHN0cmVhbSBpcyBlbXB0eS5cbiAgICAgICAgLy8gSWYgc28sIHJldHVybiB0aGUgcGFja2V0LiBUaGlzIG1lYW5zIHRoZSBwYWNrZXQgaGFzIGFscmVhZHkgYmVlbiBkZXNlcmlhbGl6ZWQuXG4gICAgICAgIGlmICh0aGlzLmJpbmFyeS5sZW5ndGggPT09IDApIHJldHVybiB0aGlzO1xuXG4gICAgICAgIC8vIFJlYWQgdGhlIHBhY2tldCBpZCB1c2luZyB0aGUgaWQgdHlwZS5cbiAgICAgICAgdGFyZ2V0LmlkX3R5cGUucmVhZCh0aGlzKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgbWV0YWRhdGEuXG4gICAgICAgIC8vIElmIG5vdCwgcmV0dXJuIHRoZSBwYWNrZXQuXG4gICAgICAgIGlmICghbWV0YWRhdGEpIHJldHVybiB0aGlzO1xuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbWV0YWRhdGEgYW5kIHJlYWQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS5cbiAgICAgICAgZm9yIChjb25zdCB7IG5hbWUsIHR5cGUsIGVuZGlhbiwgcGFyYW1ldGVyIH0gb2YgbWV0YWRhdGEpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhcmFtZXRlciBmb3IgdHlwZSB0ZXN0aW5nLlxuICAgICAgICAgIGlmIChwYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGEgY29tcG91bmQgdGFnLlxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlID09PSBDb21wb3VuZFRhZy5wcm90b3R5cGUpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIlBhcmFtZXRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENvbXBvdW5kVGFnIGRlc2VyaWFsaXphdGlvbi5cIlxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBSZWFkIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtIHVzaW5nIHRoZSBwYXJhbWV0ZXIuXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXNbcGFyYW1ldGVyIGFzIGtleW9mIEJhc2VQYWNrZXRdO1xuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IHRoZSB0eXBlIHRvIERhdGFUeXBlLlxuICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSBwcm9wZXJ0eSB1c2luZyB0aGUgcGFyYW1ldGVyIGFuZCB0aGUgdHlwZS5cbiAgICAgICAgICAgICh0aGlzW25hbWUgYXMga2V5b2YgQmFzZVBhY2tldF0gYXMgdW5rbm93bikgPSBkdHlwZS5yZWFkKFxuICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICBlbmRpYW4gYXMgRW5kaWFubmVzcyxcbiAgICAgICAgICAgICAgdmFsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSB0eXBlIGlzIGEgY29tcG91bmQgdGFnLlxuICAgICAgICAgICAgaWYgKHR5cGUucHJvdG90eXBlID09PSBDb21wb3VuZFRhZy5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBDb21wb3VuZFRhZy5cbiAgICAgICAgICAgICAgY29uc3QgY3R5cGUgPSB0eXBlIGFzIHR5cGVvZiBDb21wb3VuZFRhZztcblxuICAgICAgICAgICAgICAvLyBTZXQgdGhlIHByb3BlcnR5IHVzaW5nIHRoZSB0eXBlLlxuICAgICAgICAgICAgICAodGhpc1tuYW1lIGFzIGtleW9mIEJhc2VQYWNrZXRdIGFzIHVua25vd24pID0gY3R5cGUucmVhZChcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGVuZGlhbiBhcyBuZXZlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ29udmVydCB0aGUgdHlwZSB0byBEYXRhVHlwZS5cbiAgICAgICAgICAgICAgY29uc3QgZHR5cGUgPSB0eXBlIGFzIHR5cGVvZiBEYXRhVHlwZTtcblxuICAgICAgICAgICAgICAvLyBTZXQgdGhlIHByb3BlcnR5IHVzaW5nIHRoZSB0eXBlLlxuICAgICAgICAgICAgICAodGhpc1tuYW1lIGFzIGtleW9mIEJhc2VQYWNrZXRdIGFzIHVua25vd24pID0gZHR5cGUucmVhZChcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIGVuZGlhbiBhcyBFbmRpYW5uZXNzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmV0dXJuIHRoZSBwYWNrZXQuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSB0aGUgZ2V0SWQgbWV0aG9kLlxuICAgIGlmICghcHJvcGVydGllcy5pbmNsdWRlcyhcImdldElkXCIpKVxuICAgICAgdGFyZ2V0LnByb3RvdHlwZS5nZXRJZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldC5pZDtcbiAgICAgIH07XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGRvZXMgbm90IGhhdmUgdGhlIGdldElkVHlwZSBtZXRob2QuXG4gICAgaWYgKCFwcm9wZXJ0aWVzLmluY2x1ZGVzKFwiZ2V0SWRUeXBlXCIpKVxuICAgICAgdGFyZ2V0LnByb3RvdHlwZS5nZXRJZFR5cGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0YXJnZXQuaWRfdHlwZTtcbiAgICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCB7IFByb3RvIH07XG4iLCAiaW1wb3J0IHsgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHR5cGUgeyBWYWxpZFR5cGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi4vcHJvdG9cIjtcblxuZnVuY3Rpb24gU2VyaWFsaXplKFxuICB0eXBlOiBWYWxpZFR5cGVzLFxuICBlbmRpYW46IEVuZGlhbm5lc3MgfCBib29sZWFuID0gRW5kaWFubmVzcy5CaWcsXG4gIHBhcmFtZXRlcj86IHN0cmluZ1xuKSB7XG4gIC8vIENoZWNrIGlmIHRoZSB3YXNudCBhIHR5cGUgcHJvdmlkZWQuXG4gIGlmICghdHlwZSkgdGhyb3cgbmV3IEVycm9yKFwiQFNlcmlhbGl6ZSgpIGZhaWxlZCwgbm8gdHlwZSBwcm92aWRlZC5cIik7XG5cbiAgLy8gUmV0dXJuIHRoZSBzZXJpYWxpemUgZGVjb3JhdG9yLlxuICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogQmFzZVBhY2tldCwgbmFtZTogc3RyaW5nKSB7XG4gICAgLy8gR2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB0YXJnZXQuXG4gICAgY29uc3QgcHJvcGVydGllcyA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXCJwcm9wZXJ0aWVzXCIsIHRhcmdldCkgfHwgW107XG5cbiAgICAvLyBQdXNoIHRoZSBwcm9wZXJ0eSB0byB0aGUgcHJvcGVydGllcyBhcnJheS5cbiAgICBwcm9wZXJ0aWVzLnB1c2goeyBuYW1lLCB0eXBlLCBlbmRpYW4sIHBhcmFtZXRlciB9KTtcblxuICAgIC8vIFNldCB0aGUgcHJvcGVydGllcyBtZXRhZGF0YS5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFwicHJvcGVydGllc1wiLCBwcm9wZXJ0aWVzLCB0YXJnZXQpO1xuICB9O1xufVxuXG5leHBvcnQgeyBTZXJpYWxpemUgfTtcbiIsICJpbXBvcnQgeyB0eXBlIEJpbmFyeVN0cmVhbSwgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgZGF0YSB0eXBlLlxuICovXG5hYnN0cmFjdCBjbGFzcyBEYXRhVHlwZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvciguLi5fYXJndW1lbnRzXzogQXJyYXk8dW5rbm93bj4pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIF9zdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCBmcm9tLlxuICAgKiBAcGFyYW0gX2VuZGlhbiBUaGUgZW5kaWFubmVzcyB0byB1c2UuXG4gICAqIEBwYXJhbSBfcGFyYW1ldGVyIEFuIG9wdGlvbmFsIHBhcmFtZXRlci5cbiAgICogQHJldHVybnMgVGhlIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZChcbiAgICBfc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgX2VuZGlhbiA9IEVuZGlhbm5lc3MuQmlnLFxuICAgIF9wYXJhbWV0ZXI/OiB1bmtub3duXG4gICk6IHVua25vd24ge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIGRhdGEgdHlwZSB0byBhIGJpbmFyeSBzdHJlYW0uXG4gICAqIEBwYXJhbSBfc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICAgKiBAcGFyYW0gX3ZhbHVlIFRoZSBkYXRhIHR5cGUgdG8gd3JpdGUuXG4gICAqIEBwYXJhbSBfZW5kaWFuIFRoZSBlbmRpYW5uZXNzIHRvIHVzZS5cbiAgICogQHBhcmFtIF9wYXJhbWV0ZXIgQW4gb3B0aW9uYWwgcGFyYW1ldGVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3cml0ZShcbiAgICBfc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgX3ZhbHVlOiB1bmtub3duLFxuICAgIF9lbmRpYW4gPSBFbmRpYW5uZXNzLkJpZyxcbiAgICBfcGFyYW1ldGVyPzogdW5rbm93blxuICApOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cbn1cblxuZXhwb3J0IHsgRGF0YVR5cGUgfTtcbiIsICJpbXBvcnQgeyBEYXRhVHlwZSB9IGZyb20gXCIuL3R5cGVcIjtcblxuaW1wb3J0IHR5cGUgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmNvbnN0IE1hZ2ljQnVmZmVyID0gQnVmZmVyLmZyb20oXG4gIFwiXFx1MDAwMFxcdTAwRkZcXHUwMEZGXFx1MDAwMFxcdTAwRkVcXHUwMEZFXFx1MDBGRVxcdTAwRkVcXHUwMEZEXFx1MDBGRFxcdTAwRkRcXHUwMEZEXFx1MDAxMlxcdTAwMzRcXHUwMDU2XFx1MDA3OFwiLFxuICBcImJpbmFyeVwiXG4pO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYWdpYyBkYXRhIHR5cGUuXG4gKiBNYWdpYyBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiBSYWtOZXQuXG4gKi9cbmNsYXNzIE1hZ2ljIGV4dGVuZHMgRGF0YVR5cGUge1xuICAvKipcbiAgICogUmVhZHMgdGhlIG1hZ2ljIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBtYWdpYyBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBCdWZmZXIge1xuICAgIHJldHVybiBzdHJlYW0ucmVhZEJ1ZmZlcihNYWdpY0J1ZmZlci5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgbWFnaWMgZGF0YSB0eXBlIHRvIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byB3cml0ZSB0by5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgd3JpdGUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiB2b2lkIHtcbiAgICBzdHJlYW0ud3JpdGVCdWZmZXIoTWFnaWNCdWZmZXIpO1xuICB9XG59XG5cbmV4cG9ydCB7IE1hZ2ljIH07XG4iLCAiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmltcG9ydCB0eXBlIHsgQmluYXJ5U3RyZWFtIH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYXhpbXVtIHRyYW5zbWlzc2lvbiB1bml0IGRhdGEgdHlwZS5cbiAqIE1UVSBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiBSYWtOZXQuXG4gKi9cbmNsYXNzIE1UVSBleHRlbmRzIERhdGFUeXBlIHtcbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBtdHUgZGF0YSB0eXBlIGZyb20gYSBiaW5hcnkgc3RyZWFtLlxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHJlYWQgZnJvbS5cbiAgICogQHJldHVybnMgVGhlIG10dSBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBudW1iZXIge1xuICAgIHJldHVybiBzdHJlYW0uZ2V0QnVmZmVyKCkuYnl0ZUxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIG10dSBkYXRhIHR5cGUgdG8gYSBiaW5hcnkgc3RyZWFtLlxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3cml0ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihCdWZmZXIuYWxsb2ModmFsdWUgLSBzdHJlYW0uZ2V0QnVmZmVyKCkubGVuZ3RoKSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgTVRVIH07XG4iLCAiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tIFwiLi90eXBlXCI7XG5cbmltcG9ydCB0eXBlIHsgUmVtb3RlSW5mbyB9IGZyb20gXCJub2RlOmRncmFtXCI7XG5pbXBvcnQgdHlwZSB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGFkZHJlc3MgZGF0YSB0eXBlLlxuICogQWRkcmVzcyBpcyB1c2VkIHdoZW4gZXN0YWJsaXNoaW5nIGEgY29ubmVjdGlvbiBpbiBSYWtOZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBBZGRyZXNzIGV4dGVuZHMgRGF0YVR5cGUge1xuICAvKipcbiAgICogVGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBhZGRyZXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IG9mIHRoZSBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHZlcnNpb246IG51bWJlcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEFkZHJlc3MgZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0gYWRkcmVzcyBUaGUgYWRkcmVzcyBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0gcG9ydCBUaGUgcG9ydCBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgZGF0YSB0eXBlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFkZHJlc3M6IHN0cmluZywgcG9ydDogbnVtYmVyLCB2ZXJzaW9uOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBBZGRyZXNzIGRhdGEgdHlwZSB0byBhIE5ldHdvcmtJZGVudGlmaWVyLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgTmV0d29ya0lkZW50aWZpZXIuXG4gICAqIEByZXR1cm5zIFRoZSBOZXR3b3JrSWRlbnRpZmllci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUlkZW50aWZpZXIoaWRlbnRpZmllcjogUmVtb3RlSW5mbyk6IEFkZHJlc3Mge1xuICAgIHJldHVybiBuZXcgQWRkcmVzcyhcbiAgICAgIGlkZW50aWZpZXIuYWRkcmVzcyxcbiAgICAgIGlkZW50aWZpZXIucG9ydCxcbiAgICAgIGlkZW50aWZpZXIuZmFtaWx5ID09PSBcIklQdjRcIiA/IDQgOiA2XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIEFkZHJlc3MgZGF0YSB0eXBlIHRvIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byB3cml0ZSB0by5cbiAgICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgd3JpdGUoc3RyZWFtOiBCaW5hcnlTdHJlYW0sIHZhbHVlOiBBZGRyZXNzKTogdm9pZCB7XG4gICAgc3RyZWFtLndyaXRlVWludDgodmFsdWUudmVyc2lvbik7XG4gICAgaWYgKHZhbHVlLnZlcnNpb24gPT09IDQpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NCaXRzID0gdmFsdWUuYWRkcmVzcy5zcGxpdChcIi5cIiwgNCk7XG4gICAgICBmb3IgKGNvbnN0IGJpdCBvZiBhZGRyZXNzQml0cykge1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50OChOdW1iZXIucGFyc2VJbnQoYml0LCAxMCkgXiAweGZmKTtcbiAgICAgIH1cbiAgICAgIHN0cmVhbS53cml0ZVVTaG9ydCh2YWx1ZS5wb3J0KTtcbiAgICB9IGVsc2UgaWYgKHZhbHVlLnZlcnNpb24gPT09IDYpIHtcbiAgICAgIHN0cmVhbS53cml0ZVVTaG9ydCgyMyk7XG4gICAgICBzdHJlYW0ud3JpdGVVU2hvcnQodmFsdWUucG9ydCk7XG4gICAgICBzdHJlYW0ud3JpdGVVaW50MzIoMCk7XG4gICAgICBjb25zdCBhZGRyZXNzUGFydHMgPSB2YWx1ZS5hZGRyZXNzLnNwbGl0KFwiOlwiKTtcbiAgICAgIGZvciAoY29uc3QgcGFydCBvZiBhZGRyZXNzUGFydHMpIHtcbiAgICAgICAgY29uc3QgbnVtID0gTnVtYmVyLnBhcnNlSW50KHBhcnQsIDE2KTtcbiAgICAgICAgc3RyZWFtLndyaXRlVVNob3J0KG51bSBeIDB4ZmZmZik7XG4gICAgICB9XG4gICAgICBzdHJlYW0ud3JpdGVVaW50MzIoMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBBZGRyZXNzIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBBZGRyZXNzIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZChzdHJlYW06IEJpbmFyeVN0cmVhbSk6IEFkZHJlc3Mge1xuICAgIGNvbnN0IHZlcnNpb24gPSBzdHJlYW0ucmVhZFVpbnQ4KCk7XG4gICAgaWYgKHZlcnNpb24gPT09IDQpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gc3RyZWFtLnJlYWQoNCk7XG4gICAgICBjb25zdCBhZGRyZXNzID0gYnl0ZXMubWFwKChieXRlKSA9PiAoYnl0ZSBeIDB4ZmYpLnRvU3RyaW5nKCkpLmpvaW4oXCIuXCIpO1xuICAgICAgY29uc3QgcG9ydCA9IHN0cmVhbS5yZWFkVVNob3J0KCk7XG4gICAgICByZXR1cm4gbmV3IEFkZHJlc3MoYWRkcmVzcywgcG9ydCwgdmVyc2lvbik7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uID09PSA2KSB7XG4gICAgICBzdHJlYW0uc2tpcCgyKTtcbiAgICAgIGNvbnN0IHBvcnQgPSBzdHJlYW0ucmVhZFVTaG9ydCgpO1xuICAgICAgc3RyZWFtLnNraXAoNCk7XG4gICAgICBjb25zdCBhZGRyZXNzUGFydHMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHBhcnQgPSBzdHJlYW0ucmVhZFVTaG9ydCgpIF4gMHhmZmZmO1xuICAgICAgICBhZGRyZXNzUGFydHMucHVzaChwYXJ0LnRvU3RyaW5nKDE2KS5wYWRTdGFydCg0LCBcIjBcIikpO1xuICAgICAgfVxuICAgICAgY29uc3QgYWRkcmVzcyA9IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKTtcbiAgICAgIHN0cmVhbS5za2lwKDQpO1xuICAgICAgcmV0dXJuIG5ldyBBZGRyZXNzKGFkZHJlc3MsIHBvcnQsIHZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEFkZHJlc3MoXCJcIiwgMCwgMCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyB0eXBlIEJpbmFyeVN0cmVhbSwgRW5kaWFubmVzcyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgQml0ZmxhZ3MsIFJlbGlhYmlsaXR5IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBmcmFtZSBkYXRhIHR5cGUuXG4gKiBGcmFtZSBpcyB1c2VkIHdoZW4gc2VuZGluZyBkYXRhIGluIFJha05ldC5cbiAqL1xuY2xhc3MgRnJhbWUgZXh0ZW5kcyBEYXRhVHlwZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVsaWFiaWxpdHkgb2YgdGhlIGZyYW1lLlxuICAgKi9cbiAgcHVibGljIHJlbGlhYmlsaXR5ITogUmVsaWFiaWxpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSByZWxpYWJsZSBpbmRleCBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBwdWJsaWMgcmVsaWFibGVJbmRleCE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHNlcXVlbmNlIGluZGV4IG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBzZXF1ZW5jZUluZGV4ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb3JkZXIgaW5kZXggb2YgdGhlIGZyYW1lLlxuICAgKi9cbiAgcHVibGljIG9yZGVySW5kZXghOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBjaGFubmVsIG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBvcmRlckNoYW5uZWwhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGxpdCBzaXplIG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBzcGxpdFNpemUhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGxpdCBpZCBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBwdWJsaWMgc3BsaXRJZCE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHNwbGl0IGluZGV4IG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBzcGxpdEluZGV4ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF5bG9hZCBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBwdWJsaWMgcGF5bG9hZCE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBmcmFtZSBpcyBzcGxpdC5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZnJhbWUgaXMgc3BsaXQ7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgaXNTcGxpdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdFNpemUgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZnJhbWUgaXMgcmVsaWFibGUuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZyYW1lIGlzIHJlbGlhYmxlOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGlzUmVsaWFibGUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGUsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZVNlcXVlbmNlZCxcbiAgICAgIFJlbGlhYmlsaXR5LlJlbGlhYmxlV2l0aEFja1JlY2VpcHQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxuICAgIF07XG5cbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHRoaXMucmVsaWFiaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZnJhbWUgaXMgc2VxdWVuY2VkLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmcmFtZSBpcyBzZXF1ZW5jZWQ7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgaXNTZXF1ZW5jZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGVTZXF1ZW5jZWQsXG4gICAgICBSZWxpYWJpbGl0eS5VbnJlbGlhYmxlU2VxdWVuY2VkXG4gICAgXTtcblxuICAgIHJldHVybiB2YWx1ZXMuaW5jbHVkZXModGhpcy5yZWxpYWJpbGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBmcmFtZSBpcyBvcmRlcmVkLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmcmFtZSBpcyBvcmRlcmVkOyBvdGhlcndpc2UsIGZhbHNlLlxuICAgKi9cbiAgcHVibGljIGlzT3JkZXJlZCgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBSZWxpYWJpbGl0eS5VbnJlbGlhYmxlU2VxdWVuY2VkLFxuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGVPcmRlcmVkLFxuICAgICAgUmVsaWFiaWxpdHkuUmVsaWFibGVTZXF1ZW5jZWQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxuICAgIF07XG5cbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHRoaXMucmVsaWFiaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgZnJhbWUgaXMgb3JkZXIgZXhjbHVzaXZlLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmcmFtZSBpcyBvcmRlciBleGNsdXNpdmU7IG90aGVyd2lzZSwgZmFsc2UuXG4gICAqL1xuICBwdWJsaWMgaXNPcmRlckV4Y2x1c2l2ZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBbXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWQsXG4gICAgICBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxuICAgIF07XG5cbiAgICByZXR1cm4gdmFsdWVzLmluY2x1ZGVzKHRoaXMucmVsaWFiaWxpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBmcmFtZS5cbiAgICogQHJldHVybnMgVGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBmcmFtZS5cbiAgICovXG4gIHB1YmxpYyBnZXRCeXRlTGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIDMgK1xuICAgICAgdGhpcy5wYXlsb2FkLmJ5dGVMZW5ndGggK1xuICAgICAgKHRoaXMuaXNSZWxpYWJsZSgpID8gMyA6IDApICtcbiAgICAgICh0aGlzLmlzU2VxdWVuY2VkKCkgPyAzIDogMCkgK1xuICAgICAgKHRoaXMuaXNPcmRlcmVkKCkgPyA0IDogMCkgK1xuICAgICAgKHRoaXMuaXNTcGxpdCgpID8gMTAgOiAwKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIEZyYW1lIGRhdGEgdHlwZSBmcm9tIGEgYmluYXJ5IHN0cmVhbS5cbiAgICogQHBhcmFtIHN0cmVhbSBUaGUgYmluYXJ5IHN0cmVhbSB0byByZWFkIGZyb20uXG4gICAqIEByZXR1cm5zIFRoZSBGcmFtZSBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBBcnJheTxGcmFtZT4ge1xuICAgIC8vIFByZXBhcmUgYW4gYXJyYXkgdG8gc3RvcmUgdGhlIGZyYW1lcy5cbiAgICBjb25zdCBmcmFtZXM6IEFycmF5PEZyYW1lPiA9IFtdO1xuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzdHJlYW0gdW50aWwgdGhlIGVuZC5cbiAgICBkbyB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgZnJhbWUuXG4gICAgICBjb25zdCBmcmFtZSA9IG5ldyBGcmFtZSgpO1xuXG4gICAgICAvLyBSZWFkIHRoZSBoZWFkZXIgYW5kIG1hc2sgdGhlIHJlbGlhYmlsaXR5LlxuICAgICAgY29uc3QgaGVhZGVyID0gc3RyZWFtLnJlYWRVaW50OCgpO1xuICAgICAgZnJhbWUucmVsaWFiaWxpdHkgPSAoaGVhZGVyICYgMHhlMCkgPj4gNTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNwbGl0LlxuICAgICAgY29uc3Qgc3BsaXQgPSAoaGVhZGVyICYgQml0ZmxhZ3MuU3BsaXQpICE9PSAwO1xuXG4gICAgICAvLyBSZWFkIGFuZCBjYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgYm9keS5cbiAgICAgIGNvbnN0IGxlbmd0aCA9IE1hdGguY2VpbChzdHJlYW0ucmVhZFVpbnQxNigpIC8gOCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBpcyByZWxpYWJsZS5cbiAgICAgIC8vIElmIHNvLCByZWFkIHRoZSByZWxpYWJsZSBpbmRleC5cbiAgICAgIGlmIChmcmFtZS5pc1JlbGlhYmxlKCkpIHtcbiAgICAgICAgZnJhbWUucmVsaWFibGVJbmRleCA9IHN0cmVhbS5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNlcXVlbmNlZC5cbiAgICAgIC8vIElmIHNvLCByZWFkIHRoZSBzZXF1ZW5jZSBpbmRleC5cbiAgICAgIGlmIChmcmFtZS5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICAgIGZyYW1lLnNlcXVlbmNlSW5kZXggPSBzdHJlYW0ucmVhZFVpbnQyNChFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBpcyBvcmRlcmVkLlxuICAgICAgLy8gSWYgc28sIHJlYWQgdGhlIG9yZGVyIGluZGV4IGFuZCBjaGFubmVsLlxuICAgICAgaWYgKGZyYW1lLmlzT3JkZXJlZCgpKSB7XG4gICAgICAgIGZyYW1lLm9yZGVySW5kZXggPSBzdHJlYW0ucmVhZFVpbnQyNChFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgIGZyYW1lLm9yZGVyQ2hhbm5lbCA9IHN0cmVhbS5yZWFkVWludDgoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNwbGl0LlxuICAgICAgLy8gSWYgc28sIHJlYWQgdGhlIGZyYWdtZW50IHNpemUsIGlkIGFuZCBpbmRleC5cbiAgICAgIGlmIChzcGxpdCkge1xuICAgICAgICBmcmFtZS5zcGxpdFNpemUgPSBzdHJlYW0ucmVhZFVpbnQzMigpO1xuICAgICAgICBmcmFtZS5zcGxpdElkID0gc3RyZWFtLnJlYWRVaW50MTYoKTtcbiAgICAgICAgZnJhbWUuc3BsaXRJbmRleCA9IHN0cmVhbS5yZWFkVWludDMyKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlYWQgdGhlIHBheWxvYWQuXG4gICAgICBmcmFtZS5wYXlsb2FkID0gc3RyZWFtLnJlYWRCdWZmZXIobGVuZ3RoKTtcblxuICAgICAgLy8gQWRkIHRoZSBmcmFtZSB0byB0aGUgYXJyYXkuXG4gICAgICBmcmFtZXMucHVzaChmcmFtZSk7XG4gICAgfSB3aGlsZSAoIXN0cmVhbS5jdXJzb3JBdEVuZCgpKTtcblxuICAgIC8vIFJldHVybiB0aGUgZnJhbWVzLlxuICAgIHJldHVybiBmcmFtZXM7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBGcmFtZSBkYXRhIHR5cGUgdG8gYSBiaW5hcnkgc3RyZWFtLlxuICAgKiBAcGFyYW0gc3RyZWFtIFRoZSBiaW5hcnkgc3RyZWFtIHRvIHdyaXRlIHRvLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB3cml0ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgdmFsdWU6IEFycmF5PEZyYW1lPik6IHZvaWQge1xuICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZnJhbWVzLlxuICAgIC8vIFdyaXRpbmcgZWFjaCBmcmFtZSB0byB0aGUgc3RyZWFtLlxuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgdmFsdWUpIHtcbiAgICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIgd2l0aCB0aGUgcmVsaWFiaWxpdHkgYW5kIHNwbGl0IGZsYWcuXG4gICAgICBzdHJlYW0ud3JpdGVVaW50OChcbiAgICAgICAgKGZyYW1lLnJlbGlhYmlsaXR5IDw8IDUpIHwgKGZyYW1lLmlzU3BsaXQoKSA/IEJpdGZsYWdzLlNwbGl0IDogMClcbiAgICAgICk7XG5cbiAgICAgIC8vIFdyaXRlIHRoZSBsZW5ndGggb2YgdGhlIHBheWxvYWQuXG4gICAgICBzdHJlYW0ud3JpdGVVaW50MTYoZnJhbWUucGF5bG9hZC5ieXRlTGVuZ3RoIDw8IDMpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZnJhbWUgaXMgcmVsaWFibGUuXG4gICAgICAvLyBJZiBzbywgd3JpdGUgdGhlIHJlbGlhYmxlIGluZGV4LlxuICAgICAgaWYgKGZyYW1lLmlzUmVsaWFibGUoKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQoZnJhbWUucmVsaWFibGVJbmRleCBhcyBudW1iZXIsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIHNlcXVlbmNlZC5cbiAgICAgIC8vIElmIHNvLCB3cml0ZSB0aGUgc2VxdWVuY2UgaW5kZXguXG4gICAgICBpZiAoZnJhbWUuaXNTZXF1ZW5jZWQoKSkge1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQoZnJhbWUuc2VxdWVuY2VJbmRleCBhcyBudW1iZXIsIEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIG9yZGVyZWQuXG4gICAgICAvLyBJZiBzbywgd3JpdGUgdGhlIG9yZGVyIGluZGV4IGFuZCBjaGFubmVsLlxuICAgICAgaWYgKGZyYW1lLmlzT3JkZXJlZCgpKSB7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChmcmFtZS5vcmRlckluZGV4IGFzIG51bWJlciwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgICBzdHJlYW0ud3JpdGVVaW50OChmcmFtZS5vcmRlckNoYW5uZWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZnJhbWUgaXMgc3BsaXQuXG4gICAgICAvLyBJZiBzbywgd3JpdGUgdGhlIGZyYWdtZW50IHNpemUsIGlkIGFuZCBpbmRleC5cbiAgICAgIGlmIChmcmFtZS5pc1NwbGl0KCkpIHtcbiAgICAgICAgc3RyZWFtLndyaXRlVWludDMyKGZyYW1lLnNwbGl0U2l6ZSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQxNihmcmFtZS5zcGxpdElkKTtcbiAgICAgICAgc3RyZWFtLndyaXRlVWludDMyKGZyYW1lLnNwbGl0SW5kZXgpO1xuICAgICAgfVxuXG4gICAgICAvLyBXcml0ZSB0aGUgcGF5bG9hZC5cbiAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihmcmFtZS5wYXlsb2FkKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHsgRnJhbWUgfTtcbiIsICIvLyBOT1RFOiBQbGVhc2Uga2VlcCBhbGwgcGFja2V0cyBpbiBudW1lcmljYWwgb3JkZXIgYnkgdGhlaXIgaWQuIFRoYW5rcyFcblxuZW51bSBQYWNrZXQge1xuICBDb25uZWN0ZWRQaW5nID0gMHgwMCwgLy8gMFxuICBVbmNvbm5lY3RlZFBpbmcgPSAweDAxLCAvLyAxXG4gIENvbm5lY3RlZFBvbmcgPSAweDAzLCAvLyAzXG4gIE9wZW5Db25uZWN0aW9uUmVxdWVzdDEgPSAweDA1LCAvLyA1XG4gIE9wZW5Db25uZWN0aW9uUmVwbHkxID0gMHgwNiwgLy8gNlxuICBPcGVuQ29ubmVjdGlvblJlcXVlc3QyID0gMHgwNywgLy8gN1xuICBPcGVuQ29ubmVjdGlvblJlcGx5MiA9IDB4MDgsIC8vIDhcbiAgQ29ubmVjdGlvblJlcXVlc3QgPSAweDA5LCAvLyA5XG4gIENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQgPSAweDEwLCAvLyAxNlxuICBOZXdJbmNvbWluZ0Nvbm5lY3Rpb24gPSAweDEzLCAvLyAxOVxuICBEaXNjb25uZWN0ID0gMHgxNSwgLy8gMjFcbiAgSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uID0gMHgxOSwgLy8gMjVcbiAgVW5jb25uZWN0ZWRQb25nID0gMHgxYywgLy8gMjhcbiAgRnJhbWVTZXQgPSAweDgwLCAvLyAxMjhcbiAgTmFjayA9IDB4YTAsIC8vIDE2MFxuICBBY2sgPSAweGMwIC8vIDE5MlxufVxuXG5leHBvcnQgeyBQYWNrZXQgfTtcbiIsICJlbnVtIEJpdGZsYWdzIHtcbiAgVmFsaWQgPSAweDgwLFxuICBBY2sgPSAweDQwLFxuICBOYWsgPSAweDIwLFxuICBTcGxpdCA9IDB4MTBcbn1cblxuZXhwb3J0IHsgQml0ZmxhZ3MgfTtcbiIsICJlbnVtIFByaW9yaXR5IHtcbiAgTm9ybWFsLFxuICBJbW1lZGlhdGVcbn1cblxuZXhwb3J0IHsgUHJpb3JpdHkgfTtcbiIsICJlbnVtIFN0YXR1cyB7XG4gIENvbm5lY3RpbmcsXG4gIENvbm5lY3RlZCxcbiAgRGlzY29ubmVjdGluZyxcbiAgRGlzY29ubmVjdGVkXG59XG5cbmV4cG9ydCB7IFN0YXR1cyB9O1xuIiwgImVudW0gUmVsaWFiaWxpdHkge1xuICBVbnJlbGlhYmxlLFxuICBVbnJlbGlhYmxlU2VxdWVuY2VkLFxuICBSZWxpYWJsZSxcbiAgUmVsaWFibGVPcmRlcmVkLFxuICBSZWxpYWJsZVNlcXVlbmNlZCxcbiAgVW5yZWxpYWJsZVdpdGhBY2tSZWNlaXB0LFxuICBSZWxpYWJsZVdpdGhBY2tSZWNlaXB0LFxuICBSZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdFxufVxuXG5leHBvcnQgeyBSZWxpYWJpbGl0eSB9O1xuIiwgImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSBcIi4vdHlwZVwiO1xuaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gXCIuL2FkZHJlc3NcIjtcblxuaW1wb3J0IHR5cGUgeyBCaW5hcnlTdHJlYW0gfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5pbXBvcnQgdHlwZSB7IE5ldHdvcmtJZGVudGlmaWVyIH0gZnJvbSBcIi4uLy4uL3R5cGVzXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBhZGRyZXNzIGRhdGEgdHlwZS5cbiAqIEFkZHJlc3MgaXMgdXNlZCB3aGVuIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gaW4gUmFrTmV0LlxuICovXG5jbGFzcyBTeXN0ZW1BZGRyZXNzIGV4dGVuZHMgRGF0YVR5cGUge1xuICAvKipcbiAgICogQ29udmVydHMgdGhlIEFkZHJlc3MgZGF0YSB0eXBlIHRvIGEgTmV0d29ya0lkZW50aWZpZXIuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIFRoZSBOZXR3b3JrSWRlbnRpZmllci5cbiAgICogQHJldHVybnMgVGhlIE5ldHdvcmtJZGVudGlmaWVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tSWRlbnRpZmllcihpZGVudGlmaWVyOiBOZXR3b3JrSWRlbnRpZmllcik6IEFkZHJlc3Mge1xuICAgIHJldHVybiBuZXcgQWRkcmVzcyhpZGVudGlmaWVyLmFkZHJlc3MsIGlkZW50aWZpZXIucG9ydCwgaWRlbnRpZmllci52ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgQWRkcmVzcyBkYXRhIHR5cGUgZnJvbSBhIGJpbmFyeSBzdHJlYW0uXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCBmcm9tLlxuICAgKiBAcmV0dXJucyBUaGUgQWRkcmVzcyBkYXRhIHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWQoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBBcnJheTxBZGRyZXNzPiB7XG4gICAgLy8gUHJlcGFyZSB0aGUgYWRkcmVzc2VzIGFycmF5LlxuICAgIGNvbnN0IGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz4gPSBbXTtcblxuICAgIC8vIFJlYWQgdGhlIGFkZHJlc3Nlcy5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMjA7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBBZGRyZXNzLnJlYWQoc3RyZWFtKTtcbiAgICAgIGFkZHJlc3Nlcy5wdXNoKGFkZHJlc3MpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0aGUgYWRkcmVzc2VzLlxuICAgIHJldHVybiBhZGRyZXNzZXM7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIHRoZSBBZGRyZXNzIGRhdGEgdHlwZSB0byBhIGJpbmFyeSBzdHJlYW0uXG4gICAqIEBwYXJhbSBzdHJlYW0gVGhlIGJpbmFyeSBzdHJlYW0gdG8gd3JpdGUgdG8uXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHdyaXRlKHN0cmVhbTogQmluYXJ5U3RyZWFtKTogdm9pZCB7XG4gICAgY29uc3QgYWRkcmVzc2VzOiBBcnJheTxBZGRyZXNzPiA9IFtcbiAgICAgIHsgYWRkcmVzczogXCIxMjcuMC4wLjFcIiwgcG9ydDogMCwgdmVyc2lvbjogNCB9XG4gICAgXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMjA7IGluZGV4KyspIHtcbiAgICAgIEFkZHJlc3Mud3JpdGUoXG4gICAgICAgIHN0cmVhbSxcbiAgICAgICAgYWRkcmVzc2VzW2luZGV4XSB8fCB7IGFkZHJlc3M6IFwiMC4wLjAuMFwiLCBwb3J0OiAwLCB2ZXJzaW9uOiA0IH1cbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCB7IFN5c3RlbUFkZHJlc3MgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0sIFVpbnQ4IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgdHlwZSB7IFZhbGlkVHlwZXMgfSBmcm9tIFwiLi4vLi4vdHlwZXNcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcGFja2V0LlxuICovXG5hYnN0cmFjdCBjbGFzcyBCYXNlUGFja2V0IGV4dGVuZHMgQmluYXJ5U3RyZWFtIHtcbiAgLyoqXG4gICAqIFRoZSBwYWNrZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWNrZXQgaWQgZGF0YSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZF90eXBlOiBWYWxpZFR5cGVzID0gVWludDg7XG5cbiAgLyoqXG4gICAqIEZsdXNoZXMgdGhlIGJpbmFyeSBzdHJlYW0uXG4gICAqL1xuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgdGhpcy5iaW5hcnkgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYWNrZXQgaWQuXG4gICAqIEByZXR1cm5zIFRoZSBwYWNrZXQgaWQuXG4gICAqL1xuICBwdWJsaWMgZ2V0SWQoKTogbnVtYmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlUGFja2V0LmdldElkKCkgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBwYWNrZXQgaWQgZGF0YSB0eXBlLlxuICAgKiBAcmV0dXJucyBUaGUgcGFja2V0IGlkIGRhdGEgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBnZXRJZFR5cGUoKTogVmFsaWRUeXBlcyB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQmFzZVBhY2tldC5nZXRJZFR5cGUoKSBpcyBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIHBhY2tldC5cbiAgICogQHJldHVybnMgVGhlIHNlcmlhbGl6ZWQgcGFja2V0LlxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpOiBCdWZmZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkJhc2VQYWNrZXQuc2VyaWFsaXplKCkgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgdGhlIHBhY2tldC5cbiAgICovXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZSgpOiB0aGlzIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJCYXNlUGFja2V0LmRlc2VyaWFsaXplKCkgaXMgbm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxufVxuXG5leHBvcnQgeyBCYXNlUGFja2V0IH07XG4iLCAiaW1wb3J0IHsgTG9uZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IE1hZ2ljIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiB1bmNvbm5lY3RlZCBwaW5nIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5VbmNvbm5lY3RlZFBpbmcpXG5jbGFzcyBVbmNvbm5lY3RlZFBpbmcgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHBpbmcuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyB0aW1lc3RhbXAhOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcGluZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIGNsaWVudCBndWlkIG9mIHRoZSBwaW5nLlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgY2xpZW50ITogYmlnaW50O1xufVxuXG5leHBvcnQgeyBVbmNvbm5lY3RlZFBpbmcgfTtcbiIsICJpbXBvcnQgeyBMb25nLCBTdHJpbmcxNiB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IE1hZ2ljIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiB1bmNvbm5lY3RlZCBwb25nIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5VbmNvbm5lY3RlZFBvbmcpXG5jbGFzcyBVbmNvbm5lY3RlZFBvbmcgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHBvbmcuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyB0aW1lc3RhbXAhOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZ3VpZCBvZiB0aGUgcG9uZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIGd1aWQhOiBiaWdpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcG9uZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBtZXNzYWdlIG9mIHRoZSBwb25nLlxuICAgKi9cbiAgQFNlcmlhbGl6ZShTdHJpbmcxNikgcHVibGljIG1lc3NhZ2UhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB7IFVuY29ubmVjdGVkUG9uZyB9O1xuIiwgImltcG9ydCB7IFVpbnQ4IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgTVRVLCBNYWdpYyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMSBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSlcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVxdWVzdDEgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKFVpbnQ4KSBwdWJsaWMgcHJvdG9jb2whOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRyYW5zZmVyIHVuaXQgb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKE1UVSkgcHVibGljIG10dSE6IG51bWJlcjtcbn1cblxuZXhwb3J0IHsgT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSB9O1xuIiwgImltcG9ydCB7IExvbmcsIEJvb2wsIFNob3J0IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgTWFnaWMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgQmFzZVBhY2tldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wZW4gY29ubmVjdGlvbiByZXBseSAxIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5PcGVuQ29ubmVjdGlvblJlcGx5MSlcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVwbHkxIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIC8qKlxuICAgKiBUaGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShNYWdpYykgcHVibGljIG1hZ2ljITogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGd1aWQgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgZ3VpZCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogSWYgcmFrbmV0IGlzIHVzaW5nIHNlY3VyaXR5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShCb29sKSBwdWJsaWMgc2VjdXJpdHkhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0cmFuc2ZlciB1bml0IG9mIHRoZSByZXBseS5cbiAgICovXG4gIEBTZXJpYWxpemUoU2hvcnQpIHB1YmxpYyBtdHUhOiBudW1iZXI7XG59XG5cbmV4cG9ydCB7IE9wZW5Db25uZWN0aW9uUmVwbHkxIH07XG4iLCAiaW1wb3J0IHsgTG9uZywgU2hvcnQgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBBZGRyZXNzLCBNYWdpYyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMiBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MilcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVxdWVzdDIgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSBtYWdpYyBieXRlcyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTWFnaWMpIHB1YmxpYyBtYWdpYyE6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKEFkZHJlc3MpIHB1YmxpYyBhZGRyZXNzITogQWRkcmVzcztcblxuICAvKipcbiAgICogVGhlIG10dSBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoU2hvcnQpIHB1YmxpYyBtdHUhOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZ3VpZCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIGNsaWVudCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MiB9O1xuIiwgImltcG9ydCB7IExvbmcsIEJvb2wsIFNob3J0IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQWRkcmVzcywgTWFnaWMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgQmFzZVBhY2tldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5PcGVuQ29ubmVjdGlvblJlcGx5MilcbmNsYXNzIE9wZW5Db25uZWN0aW9uUmVwbHkyIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIC8qKlxuICAgKiBUaGUgbWFnaWMgYnl0ZXMgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShNYWdpYykgcHVibGljIG1hZ2ljITogQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGd1aWQgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgZ3VpZCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogQ2xpZW50IGFkcnJlc3MuXG4gICAqL1xuICBAU2VyaWFsaXplKEFkZHJlc3MpIHB1YmxpYyBhZGRyZXNzITogQWRkcmVzcztcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdHJhbnNmZXIgdW5pdCBvZiB0aGUgcmVwbHkuXG4gICAqL1xuICBAU2VyaWFsaXplKFNob3J0KSBwdWJsaWMgbXR1ITogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiByYWtuZXQgaXMgdXNpbmcgZW5jcnlwdGlvbi5cbiAgICovXG4gIEBTZXJpYWxpemUoQm9vbCkgcHVibGljIGVuY3J5cHRpb24hOiBib29sZWFuO1xufVxuXG5leHBvcnQgeyBPcGVuQ29ubmVjdGlvblJlcGx5MiB9O1xuIiwgImltcG9ydCB7IExvbmcgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBjb25uZWN0ZWQgcG9uZyBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuQ29ubmVjdGVkUG9uZylcbmNsYXNzIENvbm5lY3RlZFBvbmcgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHBpbmcuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyBwaW5nVGltZXN0YW1wITogYmlnaW50O1xuXG4gIC8qKlxuICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBwb25nLlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgdGltZXN0YW1wITogYmlnaW50O1xufVxuXG5leHBvcnQgeyBDb25uZWN0ZWRQb25nIH07XG4iLCAiaW1wb3J0IHsgTG9uZyB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcblxuaW1wb3J0IHsgQmFzZVBhY2tldCB9IGZyb20gXCIuL2Jhc2VcIjtcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGNvbm5lY3RlZCBwaW5nIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5Db25uZWN0ZWRQaW5nKVxuY2xhc3MgQ29ubmVjdGVkUGluZyBleHRlbmRzIEJhc2VQYWNrZXQge1xuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgcGluZy5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIHRpbWVzdGFtcCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgQ29ubmVjdGVkUGluZyB9O1xuIiwgImltcG9ydCB7IExvbmcgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBjb25uZWN0aW9uIHJlcXVlc3QgcGFja2V0LlxuICovXG5AUHJvdG8oUGFja2V0LkNvbm5lY3Rpb25SZXF1ZXN0KVxuY2xhc3MgQ29ubmVjdGlvblJlcXVlc3QgZXh0ZW5kcyBCYXNlUGFja2V0IHtcbiAgLyoqXG4gICAqIFRoZSBjbGllbnQgZ3VpZCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIGNsaWVudCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIHRpbWVzdGFtcCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgQ29ubmVjdGlvblJlcXVlc3QgfTtcbiIsICJpbXBvcnQgeyBFbmRpYW5uZXNzLCBVaW50MjQgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBGcmFtZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBmcmFtZSBzZXQgcGFja2V0LlxuICogVGhpcyBwYWNrZXQgaG9sZCBtdWx0aXBsZSBmcmFtZXMuXG4gKi9cbkBQcm90byhQYWNrZXQuRnJhbWVTZXQpXG5jbGFzcyBGcmFtZVNldCBleHRlbmRzIEJhc2VQYWNrZXQge1xuICAvKipcbiAgICogVGhlIHNlcXVlbmNlIG9mIHRoZSBmcmFtZSBzZXQuXG4gICAqL1xuICBAU2VyaWFsaXplKFVpbnQyNCwgRW5kaWFubmVzcy5MaXR0bGUpIHB1YmxpYyBzZXF1ZW5jZSE6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGZyYW1lcyBvZiB0aGUgZnJhbWUgc2V0LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShGcmFtZSkgcHVibGljIGZyYW1lcyE6IEFycmF5PEZyYW1lPjtcbn1cblxuZXhwb3J0IHsgRnJhbWVTZXQgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0sIEVuZGlhbm5lc3MgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5AUHJvdG8oUGFja2V0LkFjaylcbmNsYXNzIEFjayBleHRlbmRzIEJhc2VQYWNrZXQge1xuICBwdWJsaWMgc2VxdWVuY2VzOiBBcnJheTxudW1iZXI+ID0gW107XG5cbiAgLy8gT3ZlcnJpZGUgZW5jb2RlIGR1ZSB0byBjdXN0b20gbG9naWMsIG1heWJlIG1vdmUgaW50byBvd24gdHlwZT9cbiAgcHVibGljIG92ZXJyaWRlIHNlcmlhbGl6ZSgpOiBCdWZmZXIge1xuICAgIHRoaXMud3JpdGVVaW50OChBY2suaWQpO1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VxdWVuY2VzLmxlbmd0aDtcbiAgICBsZXQgcmVjb3JkcyA9IDA7XG5cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICBsZXQgY3Vyc29yID0gMDtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuc2VxdWVuY2VzWzBdIGFzIG51bWJlcjtcbiAgICAgIGxldCBsYXN0ID0gdGhpcy5zZXF1ZW5jZXNbMF0gYXMgbnVtYmVyO1xuXG4gICAgICB3aGlsZSAoY3Vyc29yIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VxdWVuY2VzW2N1cnNvcisrXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBjdXJyZW50IC0gbGFzdDtcbiAgICAgICAgaWYgKGRpZmYgPT09IDEpIHtcbiAgICAgICAgICBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gMSkge1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbCh0cnVlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdGFydCA9IGxhc3QgPSBjdXJyZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sKGZhbHNlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQobGFzdCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgICAgICAgc3RhcnQgPSBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICArK3JlY29yZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGFzdCBpdGVyYXRpb25cbiAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sKHRydWUpOyAvLyBzaW5nbGU/XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChzdGFydCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbChmYWxzZSk7IC8vIHNpbmdsZT9cbiAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChsYXN0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICB9XG5cbiAgICAgICsrcmVjb3JkcztcblxuICAgICAgdGhpcy53cml0ZVVTaG9ydChyZWNvcmRzKTtcbiAgICAgIHRoaXMud3JpdGVCdWZmZXIoc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGRlY29kZSBkdWUgdG8gY3VzdG9tIGxvZ2ljLCBtYXliZSBtb3ZlIGludG8gb3duIHR5cGU/XG4gIHB1YmxpYyBvdmVycmlkZSBkZXNlcmlhbGl6ZSgpOiB0aGlzIHtcbiAgICB0aGlzLnJlYWRVaW50OCgpO1xuICAgIHRoaXMuc2VxdWVuY2VzID0gW107XG4gICAgY29uc3QgcmVjb3JkQ291bnQgPSB0aGlzLnJlYWRVU2hvcnQoKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVjb3JkQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yZWFkQm9vbCgpOyAvLyBGYWxzZSBmb3IgcmFuZ2UsIFRydWUgZm9yIG5vIHJhbmdlXG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaCh0aGlzLnJlYWRVaW50MjQoRW5kaWFubmVzcy5MaXR0bGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPD0gZW5kOyBpbmRleCsrKSB7XG4gICAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBBY2sgfTtcbiIsICJpbXBvcnQgeyBCaW5hcnlTdHJlYW0sIEVuZGlhbm5lc3MgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG5AUHJvdG8oUGFja2V0Lk5hY2spXG5jbGFzcyBOYWNrIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIHB1YmxpYyBzZXF1ZW5jZXM6IEFycmF5PG51bWJlcj4gPSBbXTtcblxuICAvLyBPdmVycmlkZSBlbmNvZGUgZHVlIHRvIGN1c3RvbSBsb2dpYywgbWF5YmUgbW92ZSBpbnRvIG93biB0eXBlP1xuICBwdWJsaWMgb3ZlcnJpZGUgc2VyaWFsaXplKCk6IEJ1ZmZlciB7XG4gICAgdGhpcy53cml0ZVVpbnQ4KE5hY2suaWQpO1xuICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VxdWVuY2VzLmxlbmd0aDtcbiAgICBsZXQgcmVjb3JkcyA9IDA7XG5cbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICBsZXQgY3Vyc29yID0gMDtcbiAgICAgIGxldCBzdGFydCA9IHRoaXMuc2VxdWVuY2VzWzBdIGFzIG51bWJlcjtcbiAgICAgIGxldCBsYXN0ID0gdGhpcy5zZXF1ZW5jZXNbMF0gYXMgbnVtYmVyO1xuXG4gICAgICB3aGlsZSAoY3Vyc29yIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VxdWVuY2VzW2N1cnNvcisrXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IGRpZmYgPSBjdXJyZW50IC0gbGFzdDtcbiAgICAgICAgaWYgKGRpZmYgPT09IDEpIHtcbiAgICAgICAgICBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgfSBlbHNlIGlmIChkaWZmID4gMSkge1xuICAgICAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbCh0cnVlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdGFydCA9IGxhc3QgPSBjdXJyZW50O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sKGZhbHNlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVaW50MjQobGFzdCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgICAgICAgc3RhcnQgPSBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICArK3JlY29yZHM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbGFzdCBpdGVyYXRpb25cbiAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICBzdHJlYW0ud3JpdGVCb29sKHRydWUpOyAvLyBzaW5nbGU/XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChzdGFydCwgRW5kaWFubmVzcy5MaXR0bGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyZWFtLndyaXRlQm9vbChmYWxzZSk7IC8vIHNpbmdsZT9cbiAgICAgICAgc3RyZWFtLndyaXRlVWludDI0KHN0YXJ0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVpbnQyNChsYXN0LCBFbmRpYW5uZXNzLkxpdHRsZSk7XG4gICAgICB9XG5cbiAgICAgICsrcmVjb3JkcztcblxuICAgICAgdGhpcy53cml0ZVVTaG9ydChyZWNvcmRzKTtcbiAgICAgIHRoaXMud3JpdGVCdWZmZXIoc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRCdWZmZXIoKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIGRlY29kZSBkdWUgdG8gY3VzdG9tIGxvZ2ljLCBtYXliZSBtb3ZlIGludG8gb3duIHR5cGU/XG4gIHB1YmxpYyBvdmVycmlkZSBkZXNlcmlhbGl6ZSgpOiB0aGlzIHtcbiAgICB0aGlzLnJlYWRVaW50OCgpO1xuICAgIHRoaXMuc2VxdWVuY2VzID0gW107XG4gICAgY29uc3QgcmVjb3JkQ291bnQgPSB0aGlzLnJlYWRVU2hvcnQoKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcmVjb3JkQ291bnQ7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5yZWFkQm9vbCgpOyAvLyBGYWxzZSBmb3IgcmFuZ2UsIFRydWUgZm9yIG5vIHJhbmdlXG4gICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaCh0aGlzLnJlYWRVaW50MjQoRW5kaWFubmVzcy5MaXR0bGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgY29uc3QgZW5kID0gdGhpcy5yZWFkVWludDI0KEVuZGlhbm5lc3MuTGl0dGxlKTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPD0gZW5kOyBpbmRleCsrKSB7XG4gICAgICAgICAgdGhpcy5zZXF1ZW5jZXMucHVzaChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuXG5leHBvcnQgeyBOYWNrIH07XG4iLCAiaW1wb3J0IHsgUHJvdG8gfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGRpc2Nvbm5lY3QgcGFja2V0LlxuICovXG5AUHJvdG8oUGFja2V0LkRpc2Nvbm5lY3QpXG5jbGFzcyBEaXNjb25uZWN0IGV4dGVuZHMgQmFzZVBhY2tldCB7fVxuXG5leHBvcnQgeyBEaXNjb25uZWN0IH07XG4iLCAiaW1wb3J0IHsgVWludDgsIFVpbnQ2NCB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgUHJvdG8sIFNlcmlhbGl6ZSB9IGZyb20gXCIuLi8uLi9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vLi4vZW51bXNcIjtcbmltcG9ydCB7IE1hZ2ljIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVuIGNvbm5lY3Rpb24gcmVwbHkgMSBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uKVxuY2xhc3MgSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIEBTZXJpYWxpemUoVWludDgpIHB1YmxpYyBwcm90b2NvbCE6IG51bWJlcjtcbiAgQFNlcmlhbGl6ZShNYWdpYykgcHVibGljIG1hZ2ljITogQnVmZmVyO1xuICBAU2VyaWFsaXplKFVpbnQ2NCkgcHVibGljIGd1aWQhOiBiaWdpbnQ7XG59XG5cbmV4cG9ydCB7IEluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbiB9O1xuIiwgImltcG9ydCB7IExvbmcsIFNob3J0IH0gZnJvbSBcIkBzZXJlbml0eWpzL2JpbmFyeXN0cmVhbVwiO1xuXG5pbXBvcnQgeyBQcm90bywgU2VyaWFsaXplIH0gZnJvbSBcIi4uLy4uL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IFBhY2tldCB9IGZyb20gXCIuLi8uLi9lbnVtc1wiO1xuaW1wb3J0IHsgQWRkcmVzcywgU3lzdGVtQWRkcmVzcyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5pbXBvcnQgeyBCYXNlUGFja2V0IH0gZnJvbSBcIi4vYmFzZVwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gY29ubmVjdGlvbiByZXF1ZXN0IGFjY2VwdGVkIHBhY2tldC5cbiAqL1xuQFByb3RvKFBhY2tldC5Db25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkKVxuY2xhc3MgQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCBleHRlbmRzIEJhc2VQYWNrZXQge1xuICAvKipcbiAgICogVGhlIGNsaWVudCBhZGRyZXNzIG9mIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShBZGRyZXNzKSBwdWJsaWMgYWRkcmVzcyE6IEFkZHJlc3M7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gaW5kZXggb2YgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBAU2VyaWFsaXplKFNob3J0KSBwdWJsaWMgc3lzdGVtSW5kZXghOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gYWRkcmVzcyBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoU3lzdGVtQWRkcmVzcykgcHVibGljIHN5c3RlbUFkZHJlc3MhOiBBcnJheTxBZGRyZXNzPjtcblxuICAvKipcbiAgICogVGhlIHJlcXVlc3QgdGltZXN0YW1wIG9mIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgcmVxdWVzdFRpbWVzdGFtcCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHRpbWVzdGFtcCBvZiB0aGUgcmVxdWVzdC5cbiAgICovXG4gIEBTZXJpYWxpemUoTG9uZykgcHVibGljIHRpbWVzdGFtcCE6IGJpZ2ludDtcbn1cblxuZXhwb3J0IHsgQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCB9O1xuIiwgImltcG9ydCB7IExvbmcgfSBmcm9tIFwiQHNlcmVuaXR5anMvYmluYXJ5c3RyZWFtXCI7XG5cbmltcG9ydCB7IFByb3RvLCBTZXJpYWxpemUgfSBmcm9tIFwiLi4vLi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUGFja2V0IH0gZnJvbSBcIi4uLy4uL2VudW1zXCI7XG5pbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmltcG9ydCB7IEJhc2VQYWNrZXQgfSBmcm9tIFwiLi9iYXNlXCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBvcGVuIGNvbm5lY3Rpb24gcmVwbHkgMSBwYWNrZXQuXG4gKi9cbkBQcm90byhQYWNrZXQuTmV3SW5jb21pbmdDb25uZWN0aW9uKVxuY2xhc3MgTmV3SW5jb21pbmdDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tldCB7XG4gIC8qKlxuICAgKiB0aGUgc2VydmVyIGFkcmVzcyBvZiB0aGUgcmVwbHkuXG4gICAqL1xuICBAU2VyaWFsaXplKEFkZHJlc3MpIHB1YmxpYyBzZXJ2ZXJBZGRyZXNzITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiB1bmtub3duIHdoYXQgdGhpcyBpcyB1c2VkIGZvci5cbiAgICovXG4gIEBTZXJpYWxpemUoQWRkcmVzcykgcHVibGljIGludGVybmFsQWRkcmVzcyE6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGluY29taW5nIHRpbWVzdGFtcCBvZiB0aGUgcmVwbHkuXG4gICAqL1xuICBAU2VyaWFsaXplKExvbmcpIHB1YmxpYyBpbmNvbWluZ1RpbWVzdGFtcCE6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIHNlcnZlciB0aW1lc3RhbXAgb2YgdGhlIHJlcGx5LlxuICAgKi9cbiAgQFNlcmlhbGl6ZShMb25nKSBwdWJsaWMgc2VydmVyVGltZXN0YW1wITogYmlnaW50O1xufVxuXG5leHBvcnQgeyBOZXdJbmNvbWluZ0Nvbm5lY3Rpb24gfTtcbiIsICJpbXBvcnQgeyB0eXBlIFJlbW90ZUluZm8sIFNvY2tldCwgY3JlYXRlU29ja2V0IH0gZnJvbSBcIm5vZGU6ZGdyYW1cIjtcblxuaW1wb3J0IHsgRW1pdHRlciB9IGZyb20gXCJAc2VyZW5pdHlqcy9lbWl0dGVyXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ2dlckNvbG9ycyB9IGZyb20gXCJAc2VyZW5pdHlqcy9sb2dnZXJcIjtcblxuaW1wb3J0IHtcbiAgTUFYX01UVV9TSVpFLFxuICBNSU5fTVRVX1NJWkUsXG4gIFJBS05FVF9QUk9UT0NPTCxcbiAgUkFLTkVUX1RJQ0tfTEVOXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEJpdGZsYWdzIH0gZnJvbSBcIi4uL2VudW1zXCI7XG5cbmltcG9ydCB7IE9mZmxpbmUgfSBmcm9tIFwiLi9vZmZsaW5lXCI7XG5cbmltcG9ydCB0eXBlIHsgUmFrbmV0RXZlbnRzLCBSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IENvbm5lY3Rpb24gfSBmcm9tIFwiLi9jb25uZWN0aW9uXCI7XG5cbmNvbnN0IERlZmF1bHRSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzOiBSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzID0ge1xuICBhZGRyZXNzOiBcIjAuMC4wLjBcIixcbiAgcG9ydDogMTkxMzIsXG4gIHByb3RvY29sOiBSQUtORVRfUFJPVE9DT0wsXG4gIHZlcnNpb246IFwiMS4wLjBcIixcbiAgbWVzc2FnZTogXCJSYWtuZXQgU2VydmVyXCIsXG4gIG1heENvbm5lY3Rpb25zOiA0MCxcbiAgbXR1TWF4U2l6ZTogTUFYX01UVV9TSVpFLFxuICBtdHVNaW5TaXplOiBNSU5fTVRVX1NJWkVcbn07XG5cbi8qKlxuICogVGhlIHJha25ldCBzZXJ2ZXJcbiAqL1xuY2xhc3MgU2VydmVyIGV4dGVuZHMgRW1pdHRlcjxSYWtuZXRFdmVudHM+IHtcbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgdGljayBpbnRlcnZhbFxuICAgKi9cbiAgcHJvdGVjdGVkIGludGVydmFsOiBOb2RlSlMuVGltZW91dCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgcmFrbmV0IHByb3BlcnRpZXMgZm9yIHRoZSBzZXJ2ZXIgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcHJvcGVydGllczogUmFrbmV0U2VydmVyUHJvcGVydGllcztcblxuICAvKipcbiAgICogVGhlIHJha25ldCBzZXJ2ZXIgbG9nZ2VyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyID0gbmV3IExvZ2dlcihcIlJha25ldFwiLCBMb2dnZXJDb2xvcnMuRGFya0FxdWEpO1xuXG4gIC8qKlxuICAgKiBUaGUgdWRwNCBzb2NrZXQgaW5zdGFuY2UgZm9yIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc29ja2V0OiBTb2NrZXQgPSBjcmVhdGVTb2NrZXQoXCJ1ZHA0XCIpO1xuXG4gIC8qKlxuICAgKiBBIGNvbGxlY3Rpb24gb2YgY29ubmVjdGlvbnMgZm9yIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGlvbnMgPSBuZXcgU2V0PENvbm5lY3Rpb24+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgZ3VpZCBmb3IgdGhlIHNlcnZlciBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBndWlkID0gQmlnSW50KE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIgKiogNjQpKTtcblxuICAvKipcbiAgICogVGhlIGFkZHJlc3MgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFkZHJlc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmFkZHJlc3M7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFkZHJlc3MgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgc2V0IGFkZHJlc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvcGVydGllcy5hZGRyZXNzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHBvcnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnBvcnQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhlIHJha25ldCBzZXJ2ZXIgaXMgYm91bmQgdG8uXG4gICAqL1xuICBwdWJsaWMgc2V0IHBvcnQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy5wb3J0ID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXQgc2l6ZSBmb3IgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4TXR1U2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMubXR1TWF4U2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCBzaXplIGZvciB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIHNldCBtYXhNdHVTaXplKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnByb3BlcnRpZXMubXR1TWF4U2l6ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIHRyYW5zbWlzc2lvbiB1bml0IHNpemUgZm9yIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1pbk10dVNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm10dU1pblNpemU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1pbmltdW0gdHJhbnNtaXNzaW9uIHVuaXQgc2l6ZSBmb3IgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgbWluTXR1U2l6ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLm10dU1pblNpemUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcHJvdG9jb2wgdmVyc2lvbiBvZiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGdldCBwcm90b2NvbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMucHJvdG9jb2w7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgcHJvdG9jb2wodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy5wcm90b2NvbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLnZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgdmVyc2lvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5wcm9wZXJ0aWVzLnZlcnNpb24gPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSBvZiB0aGUgZGF5IG9mIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2Ugb2YgdGhlIGRheSBvZiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIHNldCBtZXNzYWdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnByb3BlcnRpZXMubWVzc2FnZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggY29ubmVjdGlvbnMgb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgbWF4Q29ubmVjdGlvbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLm1heENvbm5lY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXggY29ubmVjdGlvbnMgb2YgdGhlIHNlcnZlci5cbiAgICovXG4gIHB1YmxpYyBzZXQgbWF4Q29ubmVjdGlvbnModmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMucHJvcGVydGllcy5tYXhDb25uZWN0aW9ucyA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdlYXRoZXIgdGhlIHNlcnZlciBpcyBhbGl2ZVxuICAgKi9cbiAgcHVibGljIGFsaXZlID0gdHJ1ZTtcblxuICAvKipcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzPzogUGFydGlhbDxSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzPikge1xuICAgIHN1cGVyKCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIHNlcnZlciBwcm9wZXJ0aWVzIHdpdGggdGhlIGRlZmF1bHQgcHJvcGVydGllc1xuICAgIHRoaXMucHJvcGVydGllcyA9IHsgLi4uRGVmYXVsdFJha25ldFNlcnZlclByb3BlcnRpZXMsIC4uLnByb3BlcnRpZXMgfTtcblxuICAgIC8vIEJpbmQgdGhlIGluY29taW5nIG1lc3NhZ2VzIHRvIHRoZSBoYW5kbGUgbWV0aG9kXG4gICAgdGhpcy5zb2NrZXQub24oXCJtZXNzYWdlXCIsIHRoaXMuaGFuZGxlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuc29ja2V0LnVucmVmKCk7XG5cbiAgICAvLyBCaW5kIHNlcnZlciBpbnN0YW5jZSB0byB0aGUgb2ZmbGluZSBoYW5kbGVyXG4gICAgT2ZmbGluZS5zZXJ2ZXIgPSB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgc2VydmVyXG4gICAqL1xuICBwdWJsaWMgc3RhcnQoc2hvdWxkVGljayA9IHRydWUpIHtcbiAgICB0aGlzLnNvY2tldC5iaW5kKHRoaXMucG9ydCwgdGhpcy5hZGRyZXNzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRpY2sgZnVuY3Rpb25cbiAgICBjb25zdCB0aWNrID0gKCkgPT5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2VydmVyIGlzIGFsaXZlLCBpZiBub3QgY2xlYXIgdGhlIGludGVydmFsXG4gICAgICAgIGlmICghdGhpcy5hbGl2ZSB8fCAhdGhpcy5pbnRlcnZhbCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbnMgZm9yIHRoZSBzZXJ2ZXJcbiAgICAgICAgZm9yIChjb25zdCBjb25uZWN0aW9uIG9mIHRoaXMuY29ubmVjdGlvbnMpIGNvbm5lY3Rpb24udGljaygpO1xuXG4gICAgICAgIC8vIENhbGwgdGhlIHRpY2sgbWV0aG9kIGZvciBlYWNoIGNvbm5lY3Rpb25cbiAgICAgICAgcmV0dXJuIHRpY2soKTtcbiAgICAgIH0sIFJBS05FVF9USUNLX0xFTik7XG5cbiAgICAvLyBTZXQgdGhlIGludGVydmFsIHRvIHRoZSB0aWNrIG1ldGhvZFxuICAgIGlmIChzaG91bGRUaWNrKSB0aGlzLmludGVydmFsID0gdGljaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyBzdG9wKCkge1xuICAgIHRyeSB7XG4gICAgICAvLyBTZXQgdGhlIHNlcnZlciB0byBub3QgYWxpdmVcbiAgICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcblxuICAgICAgLy8gRGlzY29ubmVjdCBhbGwgY29ubmVjdGlvbnNcbiAgICAgIGZvciAoY29uc3QgY29ubmVjdGlvbiBvZiB0aGlzLmNvbm5lY3Rpb25zKSBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTtcblxuICAgICAgLy8gQ2xlYXIgdGhlIGludGVydmFsXG4gICAgICBpZiAodGhpcy5pbnRlcnZhbCkgdGhpcy5pbnRlcnZhbCA9IG51bGw7XG5cbiAgICAgIC8vIENsb3NlIHRoZSBzb2NrZXRcbiAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB2b2lkIHRoaXMuZW1pdChcImVycm9yXCIsIG5ldyBFcnJvcihcIkZhaWxlZCB0byBjbG9zZSB0aGUgc2VydmVyXCIpKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlKGJ1ZmZlcjogQnVmZmVyLCByaW5mbzogUmVtb3RlSW5mbyk6IHZvaWQge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYnVmZmVyLCB0aGlzIGlzIHRoZSBwYWNrZXQgaGVhZGVyLlxuICAgIC8vIFRoZSBwYWNrZXQgaGVhZGVyIGNvbnRhaW5zIHRoZSBwYWNrZXQgaWRlbnRpZmllciBhbmQgdGhlIGZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFja2V0LlxuICAgIGNvbnN0IGhlYWRlciA9IGJ1ZmZlclswXTtcblxuICAgIC8vIFNhbml0eSBjaGVjayBmb3IgdGhlIHBhY2tldCBoZWFkZXJcbiAgICBpZiAoIWhlYWRlcikgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBwYWNrZXQgaGVhZGVyXCIpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGRhdGFncmFtIGlzIGFuIG9mZmxpbmUgcGFja2V0LCBpZiBzbyBoYW5kbGUgaXQgYWNjb3JkaW5nbHlcbiAgICBjb25zdCBvZmZsaW5lID0gKGhlYWRlciAmIEJpdGZsYWdzLlZhbGlkKSA9PT0gMDtcblxuICAgIC8vIEF0dGVtcHQgdG8gZmluZCB0aGUgY29ubmVjdGlvbiBpbiB0aGUgY29ubmVjdGlvbiBzZXRcbiAgICBjb25zdCBjb25uZWN0aW9uID0gWy4uLnRoaXMuY29ubmVjdGlvbnMudmFsdWVzKCldLmZpbmQoXG4gICAgICAoeCkgPT4geC5yaW5mby5hZGRyZXNzID09PSByaW5mby5hZGRyZXNzICYmIHgucmluZm8ucG9ydCA9PT0gcmluZm8ucG9ydFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcmVtb3RlIGNsaWVudCBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSBzZXJ2ZXJcbiAgICAvLyBBbmQgaWYgdGhlIHJlbW90ZSBjbGllbnQgaXMgc2VuZGluZyBhbiBvZmZsaW5lIHBhY2tldFxuICAgIGlmIChvZmZsaW5lKVxuICAgICAgLy8gUGFzcyB0aGUgYnVmZmVyIGFuZCByZW1vdGUgY2xpZW50IGluZm9ybWF0aW9uIHRvIHRoZSBvZmZsaW5lIGhhbmRsZXJcbiAgICAgIHJldHVybiBPZmZsaW5lLmhhbmRsZShidWZmZXIsIHJpbmZvKTtcblxuICAgIC8vIENoZWNrIGlmIHRoZSByZW1vdGUgY2xpZW50IGhhcyBhbiBlc3RhYmxpc2hlZCBjb25uZWN0aW9uIHdpdGggdGhlIHNlcnZlclxuICAgIC8vIEFuZCBpZiB0aGUgcmVtb3RlIGNsaWVudCBpcyBzZW5kaW5nIGEgY29ubmVjdGVkIHBhY2tldFxuICAgIGlmICghb2ZmbGluZSAmJiBjb25uZWN0aW9uKVxuICAgICAgLy8gUGFzcyB0aGUgYnVmZmVyIHRvIHRoZSBjb25uZWN0aW9uIGhhbmRsZXJcbiAgICAgIHJldHVybiBjb25uZWN0aW9uLmluY29taW5nKGJ1ZmZlcik7XG4gIH1cblxuICBwdWJsaWMgc2VuZChidWZmZXI6IEJ1ZmZlciwgcmluZm86IFJlbW90ZUluZm8pOiB2b2lkIHtcbiAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlciwgcmluZm8ucG9ydCwgcmluZm8uYWRkcmVzcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VydmVyIH07XG4iLCAiLyoqXG4gKiBSYWtuZXQgcHJvdG9jb2wgdmVyc2lvbi5cbiAqL1xuY29uc3QgUkFLTkVUX1BST1RPQ09MID0gMTE7XG5cbi8qKlxuICogVGhlIHRpY2sgcmF0ZSBvZiB0aGUgUmFrbmV0IHByb3RvY29sLlxuICovXG5jb25zdCBSQUtORVRfVFBTID0gMTAwO1xuLyoqXG4gKiBUaGUgbGVuZ3RoIG9mIGEgUmFrbmV0IHRpY2sgaW4gc2Vjb25kcy5cbiAqL1xuY29uc3QgUkFLTkVUX1RJQ0tfTEVOID0gMSAvIFJBS05FVF9UUFM7XG5cbi8qKlxuICogVGhlIHNpemUgb2YgYSBVRFAgaGVhZGVyLlxuICovXG5jb25zdCBVRFBfSEVBREVSX1NJWkUgPSAyODtcblxuLyoqXG4gKiBUaGUgbWluaW11bSBzaXplIG9mIGEgUmFrbmV0IHBhY2tldC5cbiAqL1xuY29uc3QgTUlOX01UVV9TSVpFID0gNDAwO1xuXG4vKipcbiAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBSYWtuZXQgcGFja2V0LlxuICovXG5jb25zdCBNQVhfTVRVX1NJWkUgPSAxNDkyO1xuXG4vKipcbiAqIFRoZSBzaXplIG9mIGEgUmFrbmV0IGRhdGFncmFtIGhlYWRlci5cbiAqL1xuY29uc3QgREdSQU1fSEVBREVSX1NJWkUgPSA0O1xuXG4vKipcbiAqIFRoZSBvdmVyaGVhZCBvZiBhIFJha25ldCBkYXRhZ3JhbS5cbiAqL1xuY29uc3QgREdSQU1fTVRVX09WRVJIRUFEID0gMzY7XG5cbmV4cG9ydCB7XG4gIFJBS05FVF9QUk9UT0NPTCxcbiAgUkFLTkVUX1RQUyxcbiAgUkFLTkVUX1RJQ0tfTEVOLFxuICBVRFBfSEVBREVSX1NJWkUsXG4gIE1JTl9NVFVfU0laRSxcbiAgTUFYX01UVV9TSVpFLFxuICBER1JBTV9IRUFERVJfU0laRSxcbiAgREdSQU1fTVRVX09WRVJIRUFEXG59O1xuIiwgImltcG9ydCB7IEJpbmFyeVN0cmVhbSB9IGZyb20gXCJAc2VyZW5pdHlqcy9iaW5hcnlzdHJlYW1cIjtcblxuaW1wb3J0IHsgQml0ZmxhZ3MsIFByaW9yaXR5LCBSZWxpYWJpbGl0eSwgU3RhdHVzLCBQYWNrZXQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIEFjayxcbiAgQWRkcmVzcyxcbiAgQ29ubmVjdGVkUGluZyxcbiAgQ29ubmVjdGVkUG9uZyxcbiAgQ29ubmVjdGlvblJlcXVlc3QsXG4gIENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQsXG4gIERpc2Nvbm5lY3QsXG4gIEZyYW1lLFxuICBGcmFtZVNldCxcbiAgTmFja1xufSBmcm9tIFwiLi4vcHJvdG9cIjtcbmltcG9ydCB7IERHUkFNX0hFQURFUl9TSVpFLCBER1JBTV9NVFVfT1ZFUkhFQUQgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmltcG9ydCB0eXBlIHsgUmVtb3RlSW5mbyB9IGZyb20gXCJub2RlOmRncmFtXCI7XG5pbXBvcnQgdHlwZSB7IFNlcnZlciB9IGZyb20gXCIuL3Jha25ldFwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb25uZWN0aW9uIGluIHRoZSBzZXJ2ZXJcbiAqL1xuY2xhc3MgQ29ubmVjdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2VydmVyOiBTZXJ2ZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0dXMgPSBTdGF0dXMuQ29ubmVjdGluZztcblxuICAvKipcbiAgICogVGhlIGxhc3QgdXBkYXRlIHRpbWUgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyBsYXN0VXBkYXRlID0gRGF0ZS5ub3coKTtcblxuICAvKipcbiAgICogVGhlIG5ldHdvcmsgaWRlbnRpZmllciBvZiB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJpbmZvOiBSZW1vdGVJbmZvO1xuXG4gIC8qKlxuICAgKiBUaGUgR1VJRCBvZiB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGd1aWQ6IGJpZ2ludDtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXQgb2YgdGhlIGNvbm5lY3Rpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtdHU6IG51bWJlcjtcblxuICAvLyBJbnB1dHNcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxvc3RGcmFtZVNlcXVlbmNlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleDogQXJyYXk8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZyYWdtZW50c1F1ZXVlOiBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBGcmFtZT4+ID1cbiAgICBuZXcgTWFwKCk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlucHV0T3JkZXJJbmRleDogQXJyYXk8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIGlucHV0T3JkZXJpbmdRdWV1ZTogTWFwPG51bWJlciwgTWFwPG51bWJlciwgRnJhbWU+PiA9IG5ldyBNYXAoKTtcbiAgcHJvdGVjdGVkIGxhc3RJbnB1dFNlcXVlbmNlID0gLTE7XG5cbiAgLy8gT3V0cHV0c1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgb3V0cHV0T3JkZXJJbmRleDogQXJyYXk8bnVtYmVyPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG91dHB1dFNlcXVlbmNlSW5kZXg6IEFycmF5PG51bWJlcj47XG5cbiAgcHJvdGVjdGVkIG91dHB1dEZyYW1lcyA9IG5ldyBTZXQ8RnJhbWU+KCk7XG4gIHByb3RlY3RlZCBvdXRwdXRCYWNrdXAgPSBuZXcgTWFwPG51bWJlciwgQXJyYXk8RnJhbWU+PigpO1xuXG4gIHByb3RlY3RlZCBvdXRwdXRTZXF1ZW5jZSA9IDA7XG5cbiAgcHJvdGVjdGVkIG91dHB1dHNwbGl0SW5kZXggPSAwO1xuXG4gIHByb3RlY3RlZCBvdXRwdXRSZWxpYWJsZUluZGV4ID0gMDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSBzZXJ2ZXIgVGhlIHNlcnZlciBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBpbmZvXG4gICAqIEBwYXJhbSBndWlkIFRoZSBHVUlEXG4gICAqIEBwYXJhbSBtdHUgVGhlIG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXRcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzZXJ2ZXI6IFNlcnZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mbyxcbiAgICBndWlkOiBiaWdpbnQsXG4gICAgbXR1OiBudW1iZXJcbiAgKSB7XG4gICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgdGhpcy5yaW5mbyA9IHJpbmZvO1xuICAgIHRoaXMuZ3VpZCA9IGd1aWQ7XG4gICAgdGhpcy5tdHUgPSBtdHU7XG5cbiAgICAvLyBJbnB1dHNcbiAgICB0aGlzLmlucHV0T3JkZXJJbmRleCA9IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogMzIgfSkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgMzI7IGluZGV4KyspIHtcbiAgICAgIHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLnNldChpbmRleCwgbmV3IE1hcCgpKTtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXggPSBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IDMyIH0pLmZpbGwoMCk7XG5cbiAgICAvLyBPdXRwdXRzXG4gICAgdGhpcy5vdXRwdXRPcmRlckluZGV4ID0gQXJyYXkuZnJvbTxudW1iZXI+KHsgbGVuZ3RoOiAzMiB9KS5maWxsKDApO1xuICAgIHRoaXMub3V0cHV0U2VxdWVuY2VJbmRleCA9IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogMzIgfSkuZmlsbCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaWNrcyB0aGUgY29ubmVjdGlvblxuICAgKi9cbiAgcHVibGljIHRpY2soKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCBpcyBzdGFsZVxuICAgIGlmICh0aGlzLmxhc3RVcGRhdGUgKyAxNV8wMDAgPCBEYXRlLm5vdygpKSB7XG4gICAgICAvLyBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHN0YWxlIGNvbm5lY3Rpb25zXG4gICAgICB0aGlzLnNlcnZlci5sb2dnZXIud2FybihcbiAgICAgICAgYERldGVjdGVkIHN0YWxlIGNvbm5lY3Rpb24gZnJvbSDCp2Mke3RoaXMucmluZm8uYWRkcmVzc33Cp3I6wqdjJHt0aGlzLnJpbmZvLnBvcnR9wqdyLCBkaXNjb25uZWN0aW5nLi4uYFxuICAgICAgKTtcblxuICAgICAgLy8gRGlzY29ubmVjdCB0aGUgY2xpZW50XG4gICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNsaWVudCBpcyBkaXNjb25uZWN0aW5nIG9yIGRpc2Nvbm5lY3RlZFxuICAgIGlmIChcbiAgICAgIHRoaXMuc3RhdHVzID09PSBTdGF0dXMuRGlzY29ubmVjdGluZyB8fFxuICAgICAgdGhpcy5zdGF0dXMgPT09IFN0YXR1cy5EaXNjb25uZWN0ZWRcbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIHJlY2VpdmVkIGFueSBBQ0tzIG9yIE5BQ0tzXG4gICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSByZWNlaXZlZCBhbnkgcGFja2V0cyB0byBzZW5kIGFuIEFDSyBmb3JcbiAgICBpZiAodGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLnNpemUgPiAwKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgQUNLIGluc3RhbmNlXG4gICAgICBjb25zdCBhY2sgPSBuZXcgQWNrKCk7XG4gICAgICBhY2suc2VxdWVuY2VzID0gWy4uLnRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlc107XG5cbiAgICAgIC8vIERlbGV0ZSB0aGUgc2VxdWVuY2VzIGZyb20gdGhlIHJlY2VpdmVkIGZyYW1lIHNlcXVlbmNlc1xuICAgICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiB0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMpXG4gICAgICAgIHRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlcy5kZWxldGUoc2VxdWVuY2UpO1xuXG4gICAgICAvLyBTZW5kIHRoZSBBQ0sgdG8gdGhlIHJlbW90ZSBjbGllbnRcbiAgICAgIHRoaXMuc2VydmVyLnNlbmQoYWNrLnNlcmlhbGl6ZSgpLCB0aGlzLnJpbmZvKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGFueSBsb3N0IHBhY2tldHMgdG8gc2VuZCBhIE5BQ0sgZm9yXG4gICAgaWYgKHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLnNpemUgPiAwKSB7XG4gICAgICBjb25zdCBuYWNrID0gbmV3IE5hY2soKTtcbiAgICAgIG5hY2suc2VxdWVuY2VzID0gWy4uLnRoaXMubG9zdEZyYW1lU2VxdWVuY2VzXTtcblxuICAgICAgLy8gRGVsZXRlIHRoZSBzZXF1ZW5jZXMgZnJvbSB0aGUgbG9zdCBmcmFtZSBzZXF1ZW5jZXNcbiAgICAgIGZvciAoY29uc3Qgc2VxdWVuY2Ugb2YgdGhpcy5sb3N0RnJhbWVTZXF1ZW5jZXMpXG4gICAgICAgIHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLmRlbGV0ZShzZXF1ZW5jZSk7XG5cbiAgICAgIC8vIFNlbmQgdGhlIE5BQ0sgdG8gdGhlIHJlbW90ZSBjbGllbnRcbiAgICAgIHRoaXMuc2VydmVyLnNlbmQobmFjay5zZXJpYWxpemUoKSwgdGhpcy5yaW5mbyk7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgb3V0cHV0IHF1ZXVlXG4gICAgcmV0dXJuIHRoaXMuc2VuZFF1ZXVlKHRoaXMub3V0cHV0RnJhbWVzLnNpemUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBjb25uZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgZGlzY29ubmVjdCgpOiB2b2lkIHtcbiAgICAvLyBTZXQgdGhlIHN0YXR1cyB0byBkaXNjb25uZWN0aW5nXG4gICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGluZztcblxuICAgIC8vIENyZWF0ZSBhIG5ldyBEaXNjb25uZWN0IGluc3RhbmNlXG4gICAgY29uc3QgZGlzY29ubmVjdCA9IG5ldyBEaXNjb25uZWN0KCk7XG5cbiAgICAvLyBDb25zdHJ1Y3QgdGhlIGZyYW1lXG4gICAgY29uc3QgZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICBmcmFtZS5yZWxpYWJpbGl0eSA9IFJlbGlhYmlsaXR5LlJlbGlhYmxlT3JkZXJlZDtcbiAgICBmcmFtZS5vcmRlckNoYW5uZWwgPSAwO1xuICAgIGZyYW1lLnBheWxvYWQgPSBkaXNjb25uZWN0LnNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gU2VuZCB0aGUgZnJhbWVcbiAgICB0aGlzLnNlbmRGcmFtZShmcmFtZSwgUHJpb3JpdHkuSW1tZWRpYXRlKTtcblxuICAgIC8vIEVtaXQgdGhlIGRpc2Nvbm5lY3QgZXZlbnQsIGFuZCBkZWxldGUgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgY29ubmVjdGlvbnMgbWFwXG4gICAgdm9pZCB0aGlzLnNlcnZlci5lbWl0KFwiZGlzY29ubmVjdFwiLCB0aGlzKTtcbiAgICB0aGlzLnNlcnZlci5jb25uZWN0aW9ucy5kZWxldGUodGhpcyk7XG5cbiAgICAvLyBTZXQgdGhlIHN0YXR1cyB0byBkaXNjb25uZWN0ZWRcbiAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpbmNvbWluZyBwYWNrZXRzXG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXJcbiAgICovXG4gIHB1YmxpYyBpbmNvbWluZyhidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCB1cGRhdGUgdGltZVxuICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG5cbiAgICAvLyBSZWFkcyB0aGUgaGVhZGVyIG9mIHRoZSBwYWNrZXQgKHU4KVxuICAgIC8vIEFuZCBtYXNrcyBpdCB3aXRoIDB4ZjAgdG8gZ2V0IHRoZSBoZWFkZXJcbiAgICBjb25zdCBoZWFkZXIgPSAoYnVmZmVyWzBdIGFzIG51bWJlcikgJiAweGYwO1xuXG4gICAgLy8gU3dpdGNoZXMgdGhlIGhlYWRlciBvZiB0aGUgcGFja2V0XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gY2FzZSBmb3IgdGhlIGhlYWRlciwgaXQgd2lsbCBsb2cgdGhlIHBhY2tldCBpZCBhcyB1bmtub3duXG4gICAgc3dpdGNoIChoZWFkZXIpIHtcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRm9ybWF0IHRoZSBwYWNrZXQgaWQgdG8gYSBoZXggc3RyaW5nXG4gICAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgICBoZWFkZXIudG9TdHJpbmcoMTYpLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBcIjBcIiArIGhlYWRlci50b1N0cmluZygxNilcbiAgICAgICAgICAgIDogaGVhZGVyLnRvU3RyaW5nKDE2KTtcblxuICAgICAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB1bmtub3duIHBhY2tldCBoZWFkZXJzXG4gICAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgUmVjZWl2ZWQgdW5rbm93biBvbmxpbmUgcGFja2V0IDB4JHtpZH0gZnJvbSAke3RoaXMucmluZm8uYWRkcmVzc306JHt0aGlzLnJpbmZvLnBvcnR9IWBcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBFbWl0IGFuIGVycm9yIGZvciB1bmtub3duIHBhY2tldCBoZWFkZXJzXG4gICAgICAgIHJldHVybiB2b2lkIHRoaXMuc2VydmVyLmVtaXQoXG4gICAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG9ubGluZSBwYWNrZXQgMHgke2lkfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGluY29taW5nIGFja3NcbiAgICAgIGNhc2UgUGFja2V0LkFjazoge1xuICAgICAgICB0aGlzLmFjayhidWZmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGluY29taW5nIG5hY2tzXG4gICAgICBjYXNlIFBhY2tldC5OYWNrOiB7XG4gICAgICAgIHRoaXMubmFjayhidWZmZXIpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGluY29taW5nIGZyYW1lc2V0c1xuICAgICAgY2FzZSBCaXRmbGFncy5WYWxpZDoge1xuICAgICAgICB0aGlzLmhhbmRsZUluY29taW5nRnJhbWVTZXQoYnVmZmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgYmF0Y2ggcGFja2V0c1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5jb21pbmdCYXRjaChidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIFJlYWRzIHRoZSBoZWFkZXIgb2YgdGhlIHBhY2tldCAodTgpXG4gICAgY29uc3QgaGVhZGVyID0gYnVmZmVyWzBdIGFzIG51bWJlcjtcblxuICAgIC8vIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGNvbm5lY3RpbmdcbiAgICBpZiAodGhpcy5zdGF0dXMgPT09IFN0YXR1cy5Db25uZWN0aW5nKSB7XG4gICAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRm9ybWF0IHRoZSBwYWNrZXQgaWQgdG8gYSBoZXggc3RyaW5nXG4gICAgICAgICAgY29uc3QgaWQgPVxuICAgICAgICAgICAgaGVhZGVyLnRvU3RyaW5nKDE2KS5sZW5ndGggPT09IDFcbiAgICAgICAgICAgICAgPyBcIjBcIiArIGhlYWRlci50b1N0cmluZygxNilcbiAgICAgICAgICAgICAgOiBoZWFkZXIudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBmb3IgdW5rbm93biBwYWNrZXQgaGVhZGVyc1xuICAgICAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG9ubGluZSBwYWNrZXQgMHgke2lkfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBFbWl0IGFuIGVycm9yIGZvciB1bmtub3duIHBhY2tldCBoZWFkZXJzXG4gICAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgICAgIFwiZXJyb3JcIixcbiAgICAgICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFJlY2VpdmVkIHVua25vd24gb25saW5lIHBhY2tldCAweCR7aWR9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgYSBkaXNjb25uZWN0IHBhY2tldFxuICAgICAgICBjYXNlIFBhY2tldC5EaXNjb25uZWN0OiB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGluZztcbiAgICAgICAgICB0aGlzLnNlcnZlci5jb25uZWN0aW9ucy5kZWxldGUodGhpcyk7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGVkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBhIGNvbm5lY3Rpb24gcmVxdWVzdCBwYWNrZXRcbiAgICAgICAgY2FzZSBQYWNrZXQuQ29ubmVjdGlvblJlcXVlc3Q6IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZUluY29taW5nQ29ubmVjdGlvblJlcXVlc3QoYnVmZmVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgYSBuZXcgaW5jb21pbmcgY29ubmVjdGlvbiBwYWNrZXRcbiAgICAgICAgLy8gSWYgc28sIGVtaXQgdGhlIGNvbm5lY3QgZXZlbnRcbiAgICAgICAgY2FzZSBQYWNrZXQuTmV3SW5jb21pbmdDb25uZWN0aW9uOiB7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuQ29ubmVjdGVkO1xuICAgICAgICAgIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcImNvbm5lY3RcIiwgdGhpcyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB0aGUgY29ubmVjdGVkIHBhY2tldHNcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBGb3JtYXQgdGhlIHBhY2tldCBpZCB0byBhIGhleCBzdHJpbmdcbiAgICAgICAgY29uc3QgaWQgPVxuICAgICAgICAgIGhlYWRlci50b1N0cmluZygxNikubGVuZ3RoID09PSAxXG4gICAgICAgICAgICA/IFwiMFwiICsgaGVhZGVyLnRvU3RyaW5nKDE2KVxuICAgICAgICAgICAgOiBoZWFkZXIudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgZm9yIHVua25vd24gcGFja2V0IGhlYWRlcnNcbiAgICAgICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgICAgIGBSZWNlaXZlZCB1bmtub3duIG9ubGluZSBwYWNrZXQgMHgke2lkfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgYW4gZXJyb3IgZm9yIHVua25vd24gcGFja2V0IGhlYWRlcnNcbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFJlY2VpdmVkIHVua25vd24gb25saW5lIHBhY2tldCAweCR7aWR9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGEgZGlzY29ubmVjdCBwYWNrZXRcbiAgICAgIGNhc2UgUGFja2V0LkRpc2Nvbm5lY3Q6IHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXMuRGlzY29ubmVjdGluZztcbiAgICAgICAgdm9pZCB0aGlzLnNlcnZlci5lbWl0KFwiZGlzY29ubmVjdFwiLCB0aGlzKTtcbiAgICAgICAgdGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMuZGVsZXRlKHRoaXMpO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1cy5EaXNjb25uZWN0ZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGEgcGluZyBwYWNrZXRcbiAgICAgIGNhc2UgUGFja2V0LkNvbm5lY3RlZFBpbmc6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlSW5jb21pbmdDb25uZWN0ZWRQaW5nKGJ1ZmZlcik7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBhIGdhbWUgcGFja2V0XG4gICAgICBjYXNlIDB4ZmU6IHtcbiAgICAgICAgdm9pZCB0aGlzLnNlcnZlci5lbWl0KFwiZW5jYXBzdWxhdGVkXCIsIHRoaXMsIGJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgYWNrc1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgYWNrKGJ1ZmZlcjogQnVmZmVyKTogdm9pZCB7XG4gICAgLy8gRGVzZXJpYWxpemUgdGhlIGFjayBwYWNrZXRcbiAgICBjb25zdCBhY2sgPSBuZXcgQWNrKGJ1ZmZlcikuZGVzZXJpYWxpemUoKTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgc2VxdWVuY2VzIGluIHRoZSBhY2sgcGFja2V0XG4gICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBhY2suc2VxdWVuY2VzKSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGUgYWNrIGlzIG5vdCBmb3VuZFxuICAgICAgaWYgKCF0aGlzLm91dHB1dEJhY2t1cC5oYXMoc2VxdWVuY2UpKVxuICAgICAgICB0aGlzLnNlcnZlci5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFJlY2VpdmVkIGFjayBmb3IgdW5rbm93biBzZXF1ZW5jZSAke3NlcXVlbmNlfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0uYFxuICAgICAgICApO1xuXG4gICAgICAvLyBSZW1vdmUgdGhlIGFjayBmcm9tIHRoZSBzZXRcbiAgICAgIHRoaXMub3V0cHV0QmFja3VwLmRlbGV0ZShzZXF1ZW5jZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgaW5jb21pbmcgbmFja3NcbiAgICogQHBhcmFtIGJ1ZmZlciBUaGUgcGFja2V0IGJ1ZmZlclxuICAgKi9cbiAgcHJvdGVjdGVkIG5hY2soYnVmZmVyOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgbmFjayBwYWNrZXRcbiAgICBjb25zdCBuYWNrID0gbmV3IE5hY2soYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBzZXF1ZW5jZXMgaW4gdGhlIG5hY2sgcGFja2V0XG4gICAgZm9yIChjb25zdCBzZXF1ZW5jZSBvZiBuYWNrLnNlcXVlbmNlcykge1xuICAgICAgLy8gR2V0IHRoZSBmcmFtZXMgZnJvbSB0aGUgb3V0cHV0IGJhY2t1cFxuICAgICAgY29uc3QgZnJhbWVzID0gdGhpcy5vdXRwdXRCYWNrdXAuZ2V0KHNlcXVlbmNlKSA/PyBbXTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBmcmFtZXNcbiAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzKSB7XG4gICAgICAgIC8vIFNlbmQgdGhlIGZyYW1lIHRvIHRoZSBjb25uZWN0aW9uXG4gICAgICAgIHRoaXMuc2VuZEZyYW1lKGZyYW1lLCBQcmlvcml0eS5JbW1lZGlhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIGZyYW1lc2V0c1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlSW5jb21pbmdGcmFtZVNldChidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBGcmFtZVNldCBpbnN0YW5jZSBhbmQgZGVzZXJpYWxpemUgdGhlIGJ1ZmZlclxuICAgIGNvbnN0IGZyYW1lc2V0ID0gbmV3IEZyYW1lU2V0KGJ1ZmZlcikuZGVzZXJpYWxpemUoKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgc2VxdWVuY2Ugb2YgdGhlIGZyYW1lc2V0IGhhcyBhbHJlYWR5IGJlZW4gcmVjaWV2ZWRcbiAgICBpZiAodGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLmhhcyhmcmFtZXNldC5zZXF1ZW5jZSkpIHtcbiAgICAgIC8vIExvZyBhIGRlYnVnIG1lc3NhZ2UgZm9yIGR1cGxpY2F0ZSBmcmFtZXNldHNcbiAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgYFJlY2VpdmVkIGR1cGxpY2F0ZSBmcmFtZXNldCAke2ZyYW1lc2V0LnNlcXVlbmNlfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgXCJlcnJvclwiLFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYFJlY2lldmVkIGR1cGxpY2F0ZSBmcmFtZXNldCAke2ZyYW1lc2V0LnNlcXVlbmNlfSBmcm9tICR7dGhpcy5yaW5mby5hZGRyZXNzfToke3RoaXMucmluZm8ucG9ydH0hYFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZXMgdGhlIHNlcXVlbmNlIGZyb20gdGhlIGxvc3QgZnJhbWUgc2VxdWVuY2VzXG4gICAgdGhpcy5sb3N0RnJhbWVTZXF1ZW5jZXMuZGVsZXRlKGZyYW1lc2V0LnNlcXVlbmNlKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgc2VxdWVuY2UgaXMgb3V0IG9mIG9yZGVyXG4gICAgaWYgKFxuICAgICAgZnJhbWVzZXQuc2VxdWVuY2UgPCB0aGlzLmxhc3RJbnB1dFNlcXVlbmNlIHx8XG4gICAgICBmcmFtZXNldC5zZXF1ZW5jZSA9PT0gdGhpcy5sYXN0SW5wdXRTZXF1ZW5jZVxuICAgICkge1xuICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBmb3Igb3V0IG9mIG9yZGVyIGZyYW1lc2V0c1xuICAgICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgICBgUmVjZWl2ZWQgb3V0IG9mIG9yZGVyIGZyYW1lc2V0ICR7ZnJhbWVzZXQuc2VxdWVuY2V9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gdm9pZCB0aGlzLnNlcnZlci5lbWl0KFxuICAgICAgICBcImVycm9yXCIsXG4gICAgICAgIG5ldyBFcnJvcihcbiAgICAgICAgICBgUmVjaWV2ZWQgb3V0IG9mIG9yZGVyIGZyYW1lc2V0ICR7ZnJhbWVzZXQuc2VxdWVuY2V9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkcyB0aGUgc2VxdWVuY2UgdG8gdGhlIHJlY2lldmVkIGZyYW1lIHNlcXVlbmNlcywgQWNrIHdpbGwgYmUgc2VudCBvbiBuZXh0IHRpY2tcbiAgICB0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMuYWRkKGZyYW1lc2V0LnNlcXVlbmNlKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGVyZSBhcmUgYW55IG1pc3NpbmdzIGZyYW1lc2V0cyxcbiAgICAvLyBpbiB0aGUgcmFuZ2Ugb2YgdGhlIGxhc3QgaW5wdXQgc2VxdWVuY2UgYW5kIHRoZSBjdXJyZW50IHNlcXVlbmNlXG4gICAgLy8gYWRkIHRoZSBtaXNzaW5nIGZyYW1lIHNlcXVlbmNlcyB0byB0aGUgbG9zdCBxdWV1ZVxuICAgIGlmIChmcmFtZXNldC5zZXF1ZW5jZSAtIHRoaXMubGFzdElucHV0U2VxdWVuY2UgPiAxKSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmxhc3RJbnB1dFNlcXVlbmNlICsgMTtcbiAgICAgICAgaW5kZXggPCBmcmFtZXNldC5zZXF1ZW5jZTtcbiAgICAgICAgaW5kZXgrK1xuICAgICAgKVxuICAgICAgICB0aGlzLmxvc3RGcmFtZVNlcXVlbmNlcy5hZGQoaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbGFzdCBpbnB1dCBzZXF1ZW5jZSB0byB0aGUgY3VycmVudCBzZXF1ZW5jZVxuICAgIHRoaXMubGFzdElucHV0U2VxdWVuY2UgPSBmcmFtZXNldC5zZXF1ZW5jZTtcblxuICAgIC8vIEhhbmRsZSB0aGUgZnJhbWVzXG4gICAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZXNldC5mcmFtZXMpIHtcbiAgICAgIHRoaXMuaGFuZGxlRnJhbWUoZnJhbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGluY29taW5nIGZyYW1lc1xuICAgKiBAcGFyYW0gZnJhbWUgVGhlIGZyYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlRnJhbWUoZnJhbWU6IEZyYW1lKTogdm9pZCB7XG4gICAgLy8gQ2hlY2tzIGlmIHRoZSBwYWNrZXQgaXMgZnJhZ21lbnRlZFxuICAgIGlmIChmcmFtZS5pc1NwbGl0KCkpIHJldHVybiB0aGlzLmhhbmRsZUZyYWdtZW50KGZyYW1lKTtcblxuICAgIC8vIENoZWNrcyBpZiB0aGUgcGFja2V0IGlzIHNlcXVlbmNlZFxuICAgIGlmIChmcmFtZS5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZyYW1lLnNlcXVlbmNlSW5kZXggPFxuICAgICAgICAgICh0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXIpIHx8XG4gICAgICAgIGZyYW1lLm9yZGVySW5kZXggPCAodGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXIpXG4gICAgICApIHtcbiAgICAgICAgLy8gTG9nIGEgZGVidWcgbWVzc2FnZSBmb3Igb3V0IG9mIG9yZGVyIGZyYW1lc1xuICAgICAgICB0aGlzLnNlcnZlci5sb2dnZXIuZGVidWcoXG4gICAgICAgICAgYFJlY2lldmVkIG91dCBvZiBvcmRlciBmcmFtZSAke2ZyYW1lLnNlcXVlbmNlSW5kZXh9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHZvaWQgdGhpcy5zZXJ2ZXIuZW1pdChcbiAgICAgICAgICBcImVycm9yXCIsXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFJlY2lldmVkIG91dCBvZiBvcmRlciBmcmFtZSAke2ZyYW1lLnNlcXVlbmNlSW5kZXh9IGZyb20gJHt0aGlzLnJpbmZvLmFkZHJlc3N9OiR7dGhpcy5yaW5mby5wb3J0fSFgXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdGhlIG5ldyBoaWdoZXN0IHNlcXVlbmNlIGluZGV4XG4gICAgICB0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSA9XG4gICAgICAgIGZyYW1lLnNlcXVlbmNlSW5kZXggKyAxO1xuICAgICAgLy8gSGFuZGxlIHRoZSBwYWNrZXRcbiAgICAgIHJldHVybiB0aGlzLmluY29taW5nQmF0Y2goZnJhbWUucGF5bG9hZCk7XG4gICAgfSBlbHNlIGlmIChmcmFtZS5pc09yZGVyZWQoKSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIHBhY2tldCBpcyBvdXQgb2Ygb3JkZXJcbiAgICAgIGlmIChmcmFtZS5vcmRlckluZGV4ID09PSB0aGlzLmlucHV0T3JkZXJJbmRleFtmcmFtZS5vcmRlckNoYW5uZWxdKSB7XG4gICAgICAgIHRoaXMuaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleFtmcmFtZS5vcmRlckNoYW5uZWxdID0gMDtcbiAgICAgICAgdGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSA9IGZyYW1lLm9yZGVySW5kZXggKyAxO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgcGFja2V0XG4gICAgICAgIHRoaXMuaW5jb21pbmdCYXRjaChmcmFtZS5wYXlsb2FkKTtcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IG91dE9mT3JkZXJRdWV1ZSA9IHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLmdldChcbiAgICAgICAgICBmcmFtZS5vcmRlckNoYW5uZWxcbiAgICAgICAgKSBhcyBNYXA8bnVtYmVyLCBGcmFtZT47XG4gICAgICAgIGZvciAoOyBvdXRPZk9yZGVyUXVldWUuaGFzKGluZGV4KTsgaW5kZXgrKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgZnJhbWUgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgICBjb25zdCBmcmFtZSA9IG91dE9mT3JkZXJRdWV1ZS5nZXQoaW5kZXgpO1xuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIG51bGxcbiAgICAgICAgICBpZiAoIWZyYW1lKSBicmVhaztcblxuICAgICAgICAgIC8vIEhhbmRsZSB0aGUgcGFja2V0IGFuZCBkZWxldGUgaXQgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgICB0aGlzLmluY29taW5nQmF0Y2goZnJhbWUucGF5bG9hZCk7XG4gICAgICAgICAgb3V0T2ZPcmRlclF1ZXVlLmRlbGV0ZShpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHF1ZXVlXG4gICAgICAgIHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLnNldChmcmFtZS5vcmRlckNoYW5uZWwsIG91dE9mT3JkZXJRdWV1ZSk7XG4gICAgICAgIHRoaXMuaW5wdXRPcmRlckluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0gPSBpbmRleDtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIGZyYW1lLm9yZGVySW5kZXggPiAodGhpcy5pbnB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSBhcyBudW1iZXIpXG4gICAgICApIHtcbiAgICAgICAgLy8gR2V0IHRoZSB1bm9yZGVyZWQgcXVldWVcbiAgICAgICAgY29uc3QgdW5vcmRlcmVkID0gdGhpcy5pbnB1dE9yZGVyaW5nUXVldWUuZ2V0KGZyYW1lLm9yZGVyQ2hhbm5lbCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXVlIGlzIG51bGxcbiAgICAgICAgaWYgKCF1bm9yZGVyZWQpIHJldHVybjtcblxuICAgICAgICAvLyBBZGQgdGhlIGZyYW1lIHRvIHRoZSBxdWV1ZVxuICAgICAgICB1bm9yZGVyZWQuc2V0KGZyYW1lLm9yZGVySW5kZXgsIGZyYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSGFuZGxlIHRoZSBwYWNrZXQsIG5vIG5lZWQgdG8gZm9ybWF0IGl0XG4gICAgICByZXR1cm4gdGhpcy5pbmNvbWluZ0JhdGNoKGZyYW1lLnBheWxvYWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGZyYWdtZW50ZWQgZnJhbWVzXG4gICAqIEBwYXJhbSBmcmFtZSBUaGUgZnJhbWVcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVGcmFnbWVudChmcmFtZTogRnJhbWUpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGZyYWdtZW50IGlkXG4gICAgaWYgKHRoaXMuZnJhZ21lbnRzUXVldWUuaGFzKGZyYW1lLnNwbGl0SWQpKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IHRoaXMuZnJhZ21lbnRzUXVldWUuZ2V0KGZyYW1lLnNwbGl0SWQpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgZnJhZ21lbnQgaXMgbnVsbFxuICAgICAgaWYgKCFmcmFnbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBTZXQgdGhlIHNwbGl0IGZyYW1lIHRvIHRoZSBmcmFnbWVudFxuICAgICAgZnJhZ21lbnQuc2V0KGZyYW1lLnNwbGl0SW5kZXgsIGZyYW1lKTtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgdGhlIGZyYWdtZW50c1xuICAgICAgLy8gVGhlbiB3ZSBjYW4gcmVidWlsZCB0aGUgcGFja2V0XG4gICAgICBpZiAoZnJhZ21lbnQuc2l6ZSA9PT0gZnJhbWUuc3BsaXRTaXplKSB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBmcmFnbWVudHMgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN0cmVhbVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZnJhZ21lbnQuc2l6ZTsgaW5kZXgrKykge1xuICAgICAgICAgIC8vIEdldCB0aGUgc3BsaXQgZnJhbWUgZnJvbSB0aGUgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBzZnJhbWUgPSBmcmFnbWVudC5nZXQoaW5kZXgpIGFzIEZyYW1lO1xuXG4gICAgICAgICAgLy8gV3JpdGUgdGhlIHBheWxvYWQgdG8gdGhlIHN0cmVhbVxuICAgICAgICAgIHN0cmVhbS53cml0ZUJ1ZmZlcihzZnJhbWUucGF5bG9hZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIG5ldyBmcmFtZVxuICAgICAgICAvLyBBc3NpZ24gdGhlIHZhbHVlcyBmcm9tIHRoZSBvcmlnaW5hbCBmcmFtZVxuICAgICAgICBjb25zdCBuZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICAgICAgbmZyYW1lLnJlbGlhYmlsaXR5ID0gZnJhbWUucmVsaWFiaWxpdHk7XG4gICAgICAgIG5mcmFtZS5yZWxpYWJsZUluZGV4ID0gZnJhbWUucmVsaWFibGVJbmRleDtcbiAgICAgICAgbmZyYW1lLnNlcXVlbmNlSW5kZXggPSBmcmFtZS5zZXF1ZW5jZUluZGV4O1xuICAgICAgICBuZnJhbWUub3JkZXJJbmRleCA9IGZyYW1lLm9yZGVySW5kZXg7XG4gICAgICAgIG5mcmFtZS5vcmRlckNoYW5uZWwgPSBmcmFtZS5vcmRlckNoYW5uZWw7XG4gICAgICAgIG5mcmFtZS5wYXlsb2FkID0gc3RyZWFtLmdldEJ1ZmZlcigpO1xuXG4gICAgICAgIC8vIERlbGV0ZSB0aGUgZnJhZ21lbnQgaWQgZnJvbSB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5mcmFnbWVudHNRdWV1ZS5kZWxldGUoZnJhbWUuc3BsaXRJZCk7XG5cbiAgICAgICAgLy8gU2VuZCB0aGUgbmV3IGZyYW1lIHRvIHRoZSBoYW5kbGVGcmFtZSBmdW5jdGlvblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGcmFtZShuZnJhbWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdGhlIGZyYWdtZW50IGlkIHRvIHRoZSBxdWV1ZVxuICAgICAgdGhpcy5mcmFnbWVudHNRdWV1ZS5zZXQoXG4gICAgICAgIGZyYW1lLnNwbGl0SWQsXG4gICAgICAgIG5ldyBNYXAoW1tmcmFtZS5zcGxpdEluZGV4LCBmcmFtZV1dKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBmcmFtZSB0byB0aGUgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGZyYW1lIC0gVGhlIGZyYW1lIHRvIHNlbmRcbiAgICogQHBhcmFtIHByaW9yaXR5IC0gVGhlIHByaW9yaXR5IG9mIHRoZSBmcmFtZVxuICAgKi9cbiAgcHVibGljIHNlbmRGcmFtZShmcmFtZTogRnJhbWUsIHByaW9yaXR5OiBQcmlvcml0eSk6IHZvaWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXQgaXMgc2VxdWVuY2VkIG9yIG9yZGVyZWRcbiAgICBpZiAoZnJhbWUuaXNTZXF1ZW5jZWQoKSkge1xuICAgICAgLy8gU2V0IHRoZSBvcmRlciBpbmRleCBhbmQgdGhlIHNlcXVlbmNlIGluZGV4XG4gICAgICBmcmFtZS5vcmRlckluZGV4ID0gdGhpcy5vdXRwdXRPcmRlckluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0gYXMgbnVtYmVyO1xuICAgICAgZnJhbWUuc2VxdWVuY2VJbmRleCA9ICh0aGlzLm91dHB1dFNlcXVlbmNlSW5kZXhbXG4gICAgICAgIGZyYW1lLm9yZGVyQ2hhbm5lbFxuICAgICAgXSBhcyBudW1iZXIpKys7XG4gICAgfSBlbHNlIGlmIChmcmFtZS5pc09yZGVyRXhjbHVzaXZlKCkpIHtcbiAgICAgIC8vIFNldCB0aGUgb3JkZXIgaW5kZXggYW5kIHRoZSBzZXF1ZW5jZSBpbmRleFxuICAgICAgZnJhbWUub3JkZXJJbmRleCA9ICh0aGlzLm91dHB1dE9yZGVySW5kZXhbXG4gICAgICAgIGZyYW1lLm9yZGVyQ2hhbm5lbFxuICAgICAgXSBhcyBudW1iZXIpKys7XG4gICAgICB0aGlzLm91dHB1dFNlcXVlbmNlSW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gU3BsaXQgcGFja2V0IGlmIGJpZ2dlciB0aGFuIE1UVSBzaXplXG4gICAgY29uc3QgbWF4U2l6ZSA9IHRoaXMubXR1IC0gMzY7XG4gICAgY29uc3Qgc3BsaXRTaXplID0gTWF0aC5jZWlsKGZyYW1lLnBheWxvYWQuYnl0ZUxlbmd0aCAvIG1heFNpemUpO1xuXG4gICAgLy8gSW5jcmVtZW50IHRoZSByZWxpYWJsZSBpbmRleFxuICAgIGZyYW1lLnJlbGlhYmxlSW5kZXggPSB0aGlzLm91dHB1dFJlbGlhYmxlSW5kZXgrKztcblxuICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBpcyBiaWdnZXIgdGhhbiB0aGUgTVRVXG4gICAgaWYgKGZyYW1lLnBheWxvYWQuYnl0ZUxlbmd0aCA+IG1heFNpemUpIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBidWZmZXIgZnJvbSB0aGUgcGF5bG9hZCBhbmQgZ2VuZXJhdGUgYSBmcmFnbWVudCBpZFxuICAgICAgLy8gY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZnJhbWUucGF5bG9hZCk7XG4gICAgICBjb25zdCBzcGxpdElkID0gdGhpcy5vdXRwdXRzcGxpdEluZGV4KysgJSA2NV81MzY7XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgYnVmZmVyIGFuZCBzcGxpdCBpdCBpbnRvIGZyYWdtZW50cyBiYXNlZCBvbiB0aGUgTVRVIHNpemVcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBmcmFtZS5wYXlsb2FkLmJ5dGVMZW5ndGg7IGluZGV4ICs9IG1heFNpemUpIHtcbiAgICAgICAgY29uc3QgbmZyYW1lID0gbmV3IEZyYW1lKCk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSByZWxpYWJpbGl0eSBhbmQgdGhlIHJlbGlhYmxlIGluZGV4XG4gICAgICAgIG5mcmFtZS5yZWxpYWJsZUluZGV4ID0gZnJhbWUucmVsaWFibGVJbmRleDtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAwKSBuZnJhbWUucmVsaWFibGVJbmRleCA9IHRoaXMub3V0cHV0UmVsaWFibGVJbmRleCsrO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBmcmFtZSBhbmQgYXNzaWduIHRoZSB2YWx1ZXNcbiAgICAgICAgbmZyYW1lLnNlcXVlbmNlSW5kZXggPSBmcmFtZS5zZXF1ZW5jZUluZGV4O1xuICAgICAgICBuZnJhbWUub3JkZXJJbmRleCA9IGZyYW1lLm9yZGVySW5kZXg7XG4gICAgICAgIG5mcmFtZS5vcmRlckNoYW5uZWwgPSBmcmFtZS5vcmRlckNoYW5uZWw7XG4gICAgICAgIG5mcmFtZS5yZWxpYWJpbGl0eSA9IGZyYW1lLnJlbGlhYmlsaXR5O1xuICAgICAgICBuZnJhbWUucGF5bG9hZCA9IGZyYW1lLnBheWxvYWQuc3ViYXJyYXkoaW5kZXgsIGluZGV4ICsgbWF4U2l6ZSk7XG4gICAgICAgIG5mcmFtZS5zcGxpdEluZGV4ID0gaW5kZXggLyBtYXhTaXplO1xuICAgICAgICBuZnJhbWUuc3BsaXRJZCA9IHNwbGl0SWQ7XG4gICAgICAgIG5mcmFtZS5zcGxpdFNpemUgPSBzcGxpdFNpemU7XG5cbiAgICAgICAgLy8gQWRkIHRoZSBmcmFtZSB0byB0aGUgcXVldWVcbiAgICAgICAgdGhpcy5xdWV1ZUZyYW1lKG5mcmFtZSwgcHJpb3JpdHkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWV1ZUZyYW1lKGZyYW1lLCBwcmlvcml0eSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBmcmFtZSB0byB0aGUgb3V0cHV0IHF1ZXVlXG4gICAqIEBwYXJhbSBmcmFtZSBUaGUgZnJhbWVcbiAgICogQHBhcmFtIHByaW9yaXR5IFRoZSBwcmlvcml0eVxuICAgKi9cbiAgcHJpdmF0ZSBxdWV1ZUZyYW1lKGZyYW1lOiBGcmFtZSwgcHJpb3JpdHk6IFByaW9yaXR5KTogdm9pZCB7XG4gICAgbGV0IGxlbmd0aCA9IERHUkFNX0hFQURFUl9TSVpFO1xuXG4gICAgLy8gQWRkIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHRvIHRoZSBsZW5ndGhcbiAgICBmb3IgKGNvbnN0IGZyYW1lIG9mIHRoaXMub3V0cHV0RnJhbWVzKSBsZW5ndGggKz0gZnJhbWUuZ2V0Qnl0ZUxlbmd0aCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZyYW1lIGlzIGJpZ2dlciB0aGFuIHRoZSBNVFUsIGlmIHNvLCBzZW5kIHRoZSBxdWV1ZVxuICAgIGlmIChsZW5ndGggKyBmcmFtZS5nZXRCeXRlTGVuZ3RoKCkgPiB0aGlzLm10dSAtIERHUkFNX01UVV9PVkVSSEVBRClcbiAgICAgIC8vIFNlbmQgdGhlIHF1ZXVlIGFzIHVwY29taW5nIGZyYW1lcyB3aWxsIGJlIHRvbyBiaWdcbiAgICAgIHRoaXMuc2VuZFF1ZXVlKHRoaXMub3V0cHV0RnJhbWVzLnNpemUpO1xuXG4gICAgLy8gQWRkIHRoZSBmcmFtZSB0byB0aGUgcXVldWVcbiAgICB0aGlzLm91dHB1dEZyYW1lcy5hZGQoZnJhbWUpO1xuXG4gICAgLy8gSWYgdGhlIHByaW9yaXR5IGlzIGltbWVkaWF0ZSwgc2VuZCB0aGUgcXVldWVcbiAgICBpZiAocHJpb3JpdHkgPT09IFByaW9yaXR5LkltbWVkaWF0ZSkgcmV0dXJuIHRoaXMuc2VuZFF1ZXVlKDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBvdXRwdXQgZnJhbWUgcXVldWVcbiAgICovXG4gIHB1YmxpYyBzZW5kUXVldWUoYW1vdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcXVldWUgaXMgZW1wdHlcbiAgICBpZiAodGhpcy5vdXRwdXRGcmFtZXMuc2l6ZSA9PT0gMCkgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IGZyYW1lIHNldFxuICAgIGNvbnN0IGZyYW1lc2V0ID0gbmV3IEZyYW1lU2V0KCk7XG5cbiAgICAvLyBBc3NpZ24gdGhlIGZyYW1lIHNldCBwcm9wZXJ0aWVzXG4gICAgZnJhbWVzZXQuc2VxdWVuY2UgPSB0aGlzLm91dHB1dFNlcXVlbmNlKys7XG4gICAgZnJhbWVzZXQuZnJhbWVzID0gWy4uLnRoaXMub3V0cHV0RnJhbWVzXS5zbGljZSgwLCBhbW91bnQpO1xuXG4gICAgLy8gQWRkIHRoZSBmcmFtZSBzZXQgdG8gdGhlIGJhY2t1cCBtYXBcbiAgICB0aGlzLm91dHB1dEJhY2t1cC5zZXQoZnJhbWVzZXQuc2VxdWVuY2UsIGZyYW1lc2V0LmZyYW1lcyk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIGZyYW1lcyBmcm9tIHRoZSBxdWV1ZVxuICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVzZXQuZnJhbWVzKSB0aGlzLm91dHB1dEZyYW1lcy5kZWxldGUoZnJhbWUpO1xuXG4gICAgLy8gU2VuZCB0aGUgZnJhbWUgc2V0IHRvIHRoZSByZW1vdGUgY2xpZW50XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQoZnJhbWVzZXQuc2VyaWFsaXplKCksIHRoaXMucmluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29ubmVjdGlvbiByZXF1ZXN0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXJcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlSW5jb21pbmdDb25uZWN0aW9uUmVxdWVzdChidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgIC8vIENyZWF0ZSBhIG5ldyBDb25uZWN0aW9uUmVxdWVzdCBpbnN0YW5jZSBhbmQgZGVzZXJpYWxpemUgdGhlIGJ1ZmZlclxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgQ29ubmVjdGlvblJlcXVlc3QoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQgaW5zdGFuY2VcbiAgICBjb25zdCBhY2NlcHRlZCA9IG5ldyBDb25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkKCk7XG5cbiAgICAvLyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGFjY2VwdGVkIHBhY2tldFxuICAgIGFjY2VwdGVkLmFkZHJlc3MgPSBBZGRyZXNzLmZyb21JZGVudGlmaWVyKHRoaXMucmluZm8pO1xuICAgIGFjY2VwdGVkLnN5c3RlbUluZGV4ID0gMDtcbiAgICBhY2NlcHRlZC5zeXN0ZW1BZGRyZXNzID0gW107XG4gICAgYWNjZXB0ZWQucmVxdWVzdFRpbWVzdGFtcCA9IHJlcXVlc3QudGltZXN0YW1wO1xuICAgIGFjY2VwdGVkLnRpbWVzdGFtcCA9IEJpZ0ludChEYXRlLm5vdygpKTtcblxuICAgIC8vIFNldCB0aGUgYWNjZXB0ZWQgcGFja2V0IHRvIGEgbmV3IGZyYW1lXG4gICAgY29uc3QgZnJhbWUgPSBuZXcgRnJhbWUoKTtcbiAgICBmcmFtZS5yZWxpYWJpbGl0eSA9IFJlbGlhYmlsaXR5LlJlbGlhYmxlT3JkZXJlZDtcbiAgICBmcmFtZS5vcmRlckNoYW5uZWwgPSAwO1xuICAgIGZyYW1lLnBheWxvYWQgPSBhY2NlcHRlZC5zZXJpYWxpemUoKTtcblxuICAgIC8vIFNlbmQgdGhlIGZyYW1lXG4gICAgcmV0dXJuIHRoaXMuc2VuZEZyYW1lKGZyYW1lLCBQcmlvcml0eS5Ob3JtYWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgYW4gaW5jb21pbmcgY29ubmVjdGVkIHBpbmdcbiAgICogQHBhcmFtIGJ1ZmZlciBUaGUgcGFja2V0IGJ1ZmZlclxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVJbmNvbWluZ0Nvbm5lY3RlZFBpbmcoYnVmZmVyOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgYSBuZXcgQ29ubmVjdGVkUGluZyBpbnN0YW5jZSBhbmQgZGVzZXJpYWxpemUgdGhlIGJ1ZmZlclxuICAgIGNvbnN0IHBpbmcgPSBuZXcgQ29ubmVjdGVkUGluZyhidWZmZXIpLmRlc2VyaWFsaXplKCk7XG4gICAgY29uc3QgcG9uZyA9IG5ldyBDb25uZWN0ZWRQb25nKCk7XG4gICAgcG9uZy50aW1lc3RhbXAgPSBwaW5nLnRpbWVzdGFtcDtcbiAgICBwb25nLnBpbmdUaW1lc3RhbXAgPSBwaW5nLnRpbWVzdGFtcDtcbiAgICBwb25nLnRpbWVzdGFtcCA9IEJpZ0ludChEYXRlLm5vdygpKTtcblxuICAgIGNvbnN0IGZyYW1lID0gbmV3IEZyYW1lKCk7XG4gICAgZnJhbWUucmVsaWFiaWxpdHkgPSBSZWxpYWJpbGl0eS5SZWxpYWJsZU9yZGVyZWQ7XG4gICAgZnJhbWUub3JkZXJDaGFubmVsID0gMDtcbiAgICBmcmFtZS5wYXlsb2FkID0gcG9uZy5zZXJpYWxpemUoKTtcblxuICAgIHRoaXMuc2VuZEZyYW1lKGZyYW1lLCBQcmlvcml0eS5Ob3JtYWwpO1xuICB9XG59XG5cbmV4cG9ydCB7IENvbm5lY3Rpb24gfTtcbiIsICJpbXBvcnQgeyBQYWNrZXQgfSBmcm9tIFwiLi4vZW51bXNcIjtcbmltcG9ydCB7XG4gIEFkZHJlc3MsXG4gIEluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbixcbiAgT3BlbkNvbm5lY3Rpb25SZXBseTEsXG4gIE9wZW5Db25uZWN0aW9uUmVwbHkyLFxuICBPcGVuQ29ubmVjdGlvblJlcXVlc3QxLFxuICBPcGVuQ29ubmVjdGlvblJlcXVlc3QyLFxuICBVbmNvbm5lY3RlZFBpbmcsXG4gIFVuY29ubmVjdGVkUG9uZ1xufSBmcm9tIFwiLi4vcHJvdG9cIjtcbmltcG9ydCB7IFJBS05FVF9QUk9UT0NPTCwgVURQX0hFQURFUl9TSVpFIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5pbXBvcnQgeyBDb25uZWN0aW9uIH0gZnJvbSBcIi4vY29ubmVjdGlvblwiO1xuXG5pbXBvcnQgdHlwZSB7IFJlbW90ZUluZm8gfSBmcm9tIFwibm9kZTpkZ3JhbVwiO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXIgfSBmcm9tIFwiLi9yYWtuZXRcIjtcblxuY2xhc3MgT2ZmbGluZSB7XG4gIC8qKlxuICAgKiBUaGUgcmFrbmV0IHNlcnZlciBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJ2ZXI6IFNlcnZlcjtcblxuICAvKipcbiAgICogSGFuZGxlcyBhbGwgaW5jb21pbmcgb2ZmbGluZSBkYXRhZ3JhbXMgZnJvbSByZW1vdGUgY2xpZW50c1xuICAgKiBAcGFyYW0gYnVmZmVyIFRoZSBwYWNrZXQgYnVmZmVyIGZyb20gdGhlIHJlbW90ZSBjbGllbnRcbiAgICogQHBhcmFtIHJpbmZvIFRoZSByZW1vdGUgY2xpZW50IGluZm9ybWF0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGhhbmRsZShidWZmZXI6IEJ1ZmZlciwgcmluZm86IFJlbW90ZUluZm8pOiB2b2lkIHtcbiAgICAvLyBHZXQgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJ1ZmZlciwgdGhpcyBpcyB0aGUgcGFja2V0IGhlYWRlci5cbiAgICAvLyBUaGUgcGFja2V0IGhlYWRlciBjb250YWlucyB0aGUgcGFja2V0IGlkZW50aWZpZXIuXG4gICAgY29uc3QgaGVhZGVyID0gYnVmZmVyWzBdO1xuXG4gICAgLy8gU2FuaXR5IGNoZWNrIGZvciB0aGUgcGFja2V0IGhlYWRlclxuICAgIGlmICghaGVhZGVyKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIG9mZmxpbmUgcGFja2V0IGhlYWRlclwiKTtcblxuICAgIC8vIEhhbmQgb2ZmIHRoZSBwYWNrZXQgdG8gdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXIgYmFzZWQgb24gdGhlIHBhY2tldCBoZWFkZXJcbiAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgY2FzZSBQYWNrZXQuVW5jb25uZWN0ZWRQaW5nOiB7XG4gICAgICAgIC8vIFRoaXMgaGFuZHNoYWtlIGRpc3BsYXlzIHRoZSBzZXJ2ZXIgaW5mb3JtYXRpb24gdG8gdGhlIGNsaWVudCAobW90ZCwgcGluZywgZXRjLilcbiAgICAgICAgdGhpcy51bmNvbm5lY3RlZFBpbmcoYnVmZmVyLCByaW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFBhY2tldC5PcGVuQ29ubmVjdGlvblJlcXVlc3QxOiB7XG4gICAgICAgIC8vIFRoaXMgaGFuZHNoYWtlIGlzIHRoZSBmaXJzdCBzdGVwIGluIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyXG4gICAgICAgIHRoaXMub3BlbkNvbm5lY3Rpb25SZXF1ZXN0MShidWZmZXIsIHJpbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgUGFja2V0Lk9wZW5Db25uZWN0aW9uUmVxdWVzdDI6IHtcbiAgICAgICAgLy8gVGhpcyBoYW5kc2hha2UgaXMgdGhlIHNlY29uZCBzdGVwIGluIGVzdGFibGlzaGluZyBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgc2VydmVyXG4gICAgICAgIHRoaXMub3BlbkNvbm5lY3Rpb25SZXF1ZXN0MihidWZmZXIsIHJpbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRm9ybWF0IHRoZSBwYWNrZXQgaWQgdG8gYSBoZXggc3RyaW5nXG4gICAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgICBoZWFkZXIudG9TdHJpbmcoMTYpLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBcIjBcIiArIGhlYWRlci50b1N0cmluZygxNilcbiAgICAgICAgICAgIDogaGVhZGVyLnRvU3RyaW5nKDE2KTtcblxuICAgICAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB0aGUgdW5rbm93biBwYWNrZXQgaGVhZGVyXG4gICAgICAgIHRoaXMuc2VydmVyLmxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICBgUmVjZWl2ZWQgYW4gdW5rbm93biBvZmZsaW5lIHBhY2tldCBpZGVudGlmaWVyIFwiMHgke2lkfVwiIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIHVuY29ubmVjdGVkIHBpbmcgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdW5jb25uZWN0ZWRQaW5nKGJ1ZmZlcjogQnVmZmVyLCByaW5mbzogUmVtb3RlSW5mbyk6IHZvaWQge1xuICAgIC8vIERlc2VyaWFsaXplIHRoZSB1bmNvbm5lY3RlZCBwaW5nXG4gICAgY29uc3QgcGluZyA9IG5ldyBVbmNvbm5lY3RlZFBpbmcoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHVuY29ubmVjdGVkIHBvbmcgcGFja2V0XG4gICAgY29uc3QgcG9uZyA9IG5ldyBVbmNvbm5lY3RlZFBvbmcoKTtcbiAgICBwb25nLnRpbWVzdGFtcCA9IHBpbmcudGltZXN0YW1wO1xuICAgIHBvbmcuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcG9uZy5tZXNzYWdlID1cbiAgICAgIFtcbiAgICAgICAgXCJNQ1BFXCIsIC8vIE1DRUUgPSBNaW5lY3JhZnQ6IEVkdWNhdGlvbiBFZGl0aW9uXG4gICAgICAgIHRoaXMuc2VydmVyLm1lc3NhZ2UgPz8gXCJSYWtuZXQgU2VydmVyXCIsXG4gICAgICAgIHRoaXMuc2VydmVyLnByb3RvY29sID8/IDEwMCxcbiAgICAgICAgdGhpcy5zZXJ2ZXIudmVyc2lvbiA/PyBcIjEuMC4wXCIsXG4gICAgICAgIHRoaXMuc2VydmVyLmNvbm5lY3Rpb25zLnNpemUsXG4gICAgICAgIHRoaXMuc2VydmVyLm1heENvbm5lY3Rpb25zID8/IDEwLFxuICAgICAgICB0aGlzLnNlcnZlci5ndWlkLFxuICAgICAgICBcIlNlcmVuaXR5SlNcIixcbiAgICAgICAgXCJTdXJ2aXZhbFwiLFxuICAgICAgICAxLFxuICAgICAgICB0aGlzLnNlcnZlci5wb3J0LFxuICAgICAgICB0aGlzLnNlcnZlci5wb3J0ICsgMVxuICAgICAgXS5qb2luKFwiO1wiKSArIFwiO1wiO1xuXG4gICAgLy8gU2VuZCB0aGUgdW5jb25uZWN0ZWQgcG9uZyBwYWNrZXQgdG8gdGhlIHJlbW90ZSBjbGllbnRcbiAgICB0aGlzLnNlcnZlci5zZW5kKHBvbmcuc2VyaWFsaXplKCksIHJpbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIG9wZW4gY29ubmVjdGlvbiByZXF1ZXN0IDEgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkNvbm5lY3Rpb25SZXF1ZXN0MShcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mb1xuICApOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMSBwYWNrZXRcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVxdWVzdDEoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJha25ldCBwcm90b2NvbCB2ZXJzaW9ucyBhcmUgbWlzbWF0Y2hlZFxuICAgIC8vIFRoZSByYWtuZXQgcHJvdG9jb2wgdmVyc2lvbiB2YXJpZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGdhbWVcbiAgICAvLyBUaGVyZSBzZWVtcyB0byBiZSBtaW5vciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2ZXJzaW9ucy5cbiAgICBpZiAocmVxdWVzdC5wcm90b2NvbCAhPT0gUkFLTkVUX1BST1RPQ09MKSB7XG4gICAgICAvLyBDcmVhdGUgYSBuZXcgaW5jb21wYXRpYmxlIHByb3RvY29sIHZlcnNpb24gcGFja2V0XG4gICAgICBjb25zdCBpbmNvbXBhdGlibGUgPSBuZXcgSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uKCk7XG4gICAgICBpbmNvbXBhdGlibGUucHJvdG9jb2wgPSBSQUtORVRfUFJPVE9DT0w7XG4gICAgICBpbmNvbXBhdGlibGUuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG5cbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIGluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uXG4gICAgICB0aGlzLnNlcnZlci5sb2dnZXIud2FybihcbiAgICAgICAgYFJlZnVzaW5nIGNvbm5lY3Rpb24gZnJvbSAke3JpbmZvLmFkZHJlc3N9OiR7cmluZm8ucG9ydH0gZHVlIHRvIGluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uIHYke3JlcXVlc3QucHJvdG9jb2x9LCBleHBlY3RlZCB2JHtSQUtORVRfUFJPVE9DT0x9LmBcbiAgICAgICk7XG5cbiAgICAgIC8vIFNlbmQgdGhlIGluY29tcGF0aWJsZSBwcm90b2NvbCB2ZXJzaW9uIHBhY2tldCB0byB0aGUgcmVtb3RlIGNsaWVudFxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQoaW5jb21wYXRpYmxlLnNlcmlhbGl6ZSgpLCByaW5mbyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9wZW4gY29ubmVjdGlvbiByZXBseSAxIHBhY2tldFxuICAgIGNvbnN0IHJlcGx5ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVwbHkxKCk7XG4gICAgcmVwbHkuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcmVwbHkuc2VjdXJpdHkgPSBmYWxzZTsgLy8gV2UgYXJlIG5vdCB1c2luZyBzZWN1cml0eVxuICAgIHJlcGx5Lm10dSA9XG4gICAgICAvLyBDaGVjayBpZiB0aGUgcmVxdWVzdGVkIG10dSArIHRoZSB1ZHAgaGVhZGVyIHNpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG10dSBzaXplXG4gICAgICByZXF1ZXN0Lm10dSArIFVEUF9IRUFERVJfU0laRSA+IHRoaXMuc2VydmVyLm1heE10dVNpemVcbiAgICAgICAgPyB0aGlzLnNlcnZlci5tYXhNdHVTaXplIC8vIEFzc2lnbiB0aGUgbWF4aW11bSB0cmFuc2ZlciB1bml0IHNpemVcbiAgICAgICAgOiByZXF1ZXN0Lm10dSArIFVEUF9IRUFERVJfU0laRTsgLy8gQXNzaWduIHRoZSByZXF1ZXN0ZWQgdHJhbnNmZXIgdW5pdCBzaXplICsgdGhlIHVkcCBoZWFkZXIgc2l6ZVxuXG4gICAgLy8gU2VuZCB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcGx5IDEgcGFja2V0IHRvIHRoZSByZW1vdGUgY2xpZW50XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQocmVwbHkuc2VyaWFsaXplKCksIHJpbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIG9wZW4gY29ubmVjdGlvbiByZXF1ZXN0IDIgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkNvbm5lY3Rpb25SZXF1ZXN0MihcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mb1xuICApOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMiBwYWNrZXRcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVxdWVzdDIoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBwb3J0IG1hdGNoZXMgdGhlIHNlcnZlciBwb3J0XG4gICAgLy8gVGhpcyBpcyBhIHVubGlrZWx5IHNjZW5hcmlvLCBidXQgaXQgaXMgcG9zc2libGVcbiAgICBpZiAocmVxdWVzdC5hZGRyZXNzLnBvcnQgIT09IHRoaXMuc2VydmVyLnBvcnQpIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIG1pc21hdGNoZWQgcG9ydFxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gbWlzbWF0Y2hlZCBwb3J0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG10dSBzaXplIGlzIGJldHdlZW4gdGhlIGFsbG93ZWQgbWluaW11bSBhbmQgbWF4aW11bSBtdHUgc2l6ZS5cbiAgICAvLyBJZiBub3QsIHdlIHdpbGwgcmVmdXNlIHRoZSBjb25uZWN0aW9uLlxuICAgIGlmIChcbiAgICAgIHJlcXVlc3QubXR1IDwgdGhpcy5zZXJ2ZXIubWluTXR1U2l6ZSB8fFxuICAgICAgcmVxdWVzdC5tdHUgPiB0aGlzLnNlcnZlci5tYXhNdHVTaXplXG4gICAgKSB7XG4gICAgICAvLyBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBpbnZhbGlkIG10dSBzaXplXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXIubG9nZ2VyLndhcm4oXG4gICAgICAgIGBSZWZ1c2luZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IGR1ZSB0byBpbnZhbGlkIG10dSBzaXplLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBlc3RhYmxpc2hlZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBbLi4udGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMudmFsdWVzKCldLmZpbmQoXG4gICAgICAoeCkgPT4geC5yaW5mby5hZGRyZXNzID09PSByaW5mby5hZGRyZXNzICYmIHgucmluZm8ucG9ydCA9PT0gcmluZm8ucG9ydFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkXG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIGFscmVhZHkgZXN0YWJsaXNoZWQgY29ubmVjdGlvblxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gYWxyZWFkeSBlc3RhYmxpc2hlZCBjb25uZWN0aW9uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldFxuICAgIGNvbnN0IHJlcGx5ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVwbHkyKCk7XG4gICAgcmVwbHkuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcmVwbHkuYWRkcmVzcyA9IEFkZHJlc3MuZnJvbUlkZW50aWZpZXIocmluZm8pO1xuICAgIHJlcGx5Lm10dSA9IHJlcXVlc3QubXR1O1xuICAgIHJlcGx5LmVuY3J5cHRpb24gPSBmYWxzZTsgLy8gV2UgYXJlIG5vdCB1c2luZyBlbmNyeXB0aW9uXG5cbiAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB0aGUgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG4gICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgYEVzdGFibGlzaGluZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IHdpdGggbXR1IHNpemUgb2YgJHtyZXF1ZXN0Lm10dX0uYFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiwgYW5kIGFkZCBpdCB0byB0aGUgY29ubmVjdGlvbnMgc2V0XG4gICAgdGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMuYWRkKFxuICAgICAgLy8gQnVpbGQgYSBuZXcgY29ubmVjdGlvbiBpbnN0YW5jZVxuICAgICAgbmV3IENvbm5lY3Rpb24odGhpcy5zZXJ2ZXIsIHJpbmZvLCByZXF1ZXN0LmNsaWVudCwgcmVxdWVzdC5tdHUpXG4gICAgKTtcblxuICAgIC8vIFNlbmQgdGhlIG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldCB0byB0aGUgcmVtb3RlIGNsaWVudFxuICAgIHJldHVybiB0aGlzLnNlcnZlci5zZW5kKHJlcGx5LnNlcmlhbGl6ZSgpLCByaW5mbyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgT2ZmbGluZSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogIjJlQUFBLElBQUFBLEdBQUEs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LElBQUEsQ0FFVCxHQUFJLEdBQUMsS0FBS1gsT0FBUyxDQUFDLEtBQUtsQixVQUd6QixTQUFXOEIsS0FBYyxLQUFLdEIsWUFBYXNCLEVBQVdILEtBQUksRUFHMUQsT0FBT0EsRUFBQUEsRUFDVCxFQUFHSSxHQUFBQSxFQVZRLFFBYVRMLElBQVksS0FBSzFCLFNBQVcyQixFQUFBQSxFQUNsQyxDQUtPSyxNQUFPLENBQ1osR0FBSSxDQUVGLEtBQUtkLE1BQVEsR0FHYixRQUFXWSxLQUFjLEtBQUt0QixZQUFhc0IsRUFBV0csV0FBVSxFQUc1RCxLQUFLakMsV0FBVSxLQUFLQSxTQUFXLE1BR25DLEtBQUtNLE9BQU80QixNQUFLLENBQ25CLE1BQVEsQ0FDRCxLQUFLQyxLQUFLLFFBQVMsSUFBSUMsTUFBTSw0QkFBQSxDQUFBLENBQ3BDLENBQ0YsQ0FFVWhCLE9BQU9pQixFQUFnQkMsRUFBeUIsQ0FHeEQsSUFBTUMsRUFBU0YsRUFBTyxDQUFBLEVBR3RCLEdBQUksQ0FBQ0UsRUFBUSxNQUFNLElBQUlILE1BQU0sdUJBQUEsRUFHN0IsSUFBTUksR0FBV0QsRUFBU0UsRUFBU0MsU0FBVyxFQUd4Q1osRUFBYSxJQUFJLEtBQUt0QixZQUFZbUMsT0FBTSxHQUFJQyxLQUMvQ0MsR0FBTUEsRUFBRVAsTUFBTW5ELFVBQVltRCxFQUFNbkQsU0FBVzBELEVBQUVQLE1BQU1sRCxPQUFTa0QsRUFBTWxELElBQUksRUFLekUsR0FBSW9ELEVBRUYsT0FBT2pCLEdBQVFILE9BQU9pQixFQUFRQyxDQUFBQSxFQUloQyxHQUFJLENBQUNFLEdBQVdWLEVBRWQsT0FBT0EsRUFBV2dCLFNBQVNULENBQUFBLENBQy9CLENBRU9VLEtBQUtWLEVBQWdCQyxFQUF5QixDQUNuRCxLQUFLaEMsT0FBT3lDLEtBQUtWLEVBQVFDLEVBQU1sRCxLQUFNa0QsRUFBTW5ELE9BQU8sQ0FDcEQsQ0FDRiIsCiAgIm5hbWVzIjogWyJpbmRleF9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkFjayIsICJBZGRyZXNzIiwgIkJhc2VQYWNrZXQiLCAiQml0ZmxhZ3MiLCAiQ29ubmVjdGVkUGluZyIsICJDb25uZWN0ZWRQb25nIiwgIkNvbm5lY3Rpb24iLCAiQ29ubmVjdGlvblJlcXVlc3QiLCAiQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCIsICJER1JBTV9IRUFERVJfU0laRSIsICJER1JBTV9NVFVfT1ZFUkhFQUQiLCAiRGF0YVR5cGUiLCAiRGlzY29ubmVjdCIsICJGcmFtZSIsICJGcmFtZVNldCIsICJJbmNvbXBhdGlibGVQcm90b2NvbFZlcnNpb24iLCAiTUFYX01UVV9TSVpFIiwgIk1JTl9NVFVfU0laRSIsICJNVFUiLCAiTWFnaWMiLCAiTmFjayIsICJOZXdJbmNvbWluZ0Nvbm5lY3Rpb24iLCAiT2ZmbGluZSIsICJPcGVuQ29ubmVjdGlvblJlcGx5MSIsICJPcGVuQ29ubmVjdGlvblJlcGx5MiIsICJPcGVuQ29ubmVjdGlvblJlcXVlc3QxIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDIiLCAiUGFja2V0IiwgIlByaW9yaXR5IiwgIlByb3RvIiwgIlJBS05FVF9QUk9UT0NPTCIsICJSQUtORVRfVElDS19MRU4iLCAiUkFLTkVUX1RQUyIsICJSZWxpYWJpbGl0eSIsICJTZXJpYWxpemUiLCAiU2VydmVyIiwgIlN0YXR1cyIsICJTeXN0ZW1BZGRyZXNzIiwgIlVEUF9IRUFERVJfU0laRSIsICJVbmNvbm5lY3RlZFBpbmciLCAiVW5jb25uZWN0ZWRQb25nIiwgIl9fdG9Db21tb25KUyIsICJpbXBvcnRfcmVmbGVjdF9tZXRhZGF0YSIsICJpbXBvcnRfbmJ0IiwgIlByb3RvIiwgImlkIiwgInRhcmdldCIsICJtZXRhZGF0YSIsICJSZWZsZWN0IiwgImdldE93bk1ldGFkYXRhIiwgInByb3RvdHlwZSIsICJwcm9wZXJ0aWVzIiwgIk9iamVjdCIsICJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwgImluY2x1ZGVzIiwgInNlcmlhbGl6ZSIsICJmbHVzaCIsICJpZF90eXBlIiwgIndyaXRlIiwgImdldEJ1ZmZlciIsICJuYW1lIiwgInR5cGUiLCAiZW5kaWFuIiwgInBhcmFtZXRlciIsICJDb21wb3VuZFRhZyIsICJFcnJvciIsICJ2YWx1ZSIsICJkdHlwZSIsICJkYXRhIiwgImN0eXBlIiwgInRhZyIsICJ2YXJpbnQiLCAiZGVzZXJpYWxpemUiLCAiYmluYXJ5IiwgImxlbmd0aCIsICJyZWFkIiwgImdldElkIiwgImdldElkVHlwZSIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIlNlcmlhbGl6ZSIsICJ0eXBlIiwgImVuZGlhbiIsICJFbmRpYW5uZXNzIiwgIkJpZyIsICJwYXJhbWV0ZXIiLCAiRXJyb3IiLCAidGFyZ2V0IiwgIm5hbWUiLCAicHJvcGVydGllcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgInB1c2giLCAiZGVmaW5lTWV0YWRhdGEiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJEYXRhVHlwZSIsICJfYXJndW1lbnRzXyIsICJyZWFkIiwgIl9zdHJlYW0iLCAiX2VuZGlhbiIsICJFbmRpYW5uZXNzIiwgIkJpZyIsICJfcGFyYW1ldGVyIiwgIndyaXRlIiwgIl92YWx1ZSIsICJNYWdpY0J1ZmZlciIsICJCdWZmZXIiLCAiZnJvbSIsICJNYWdpYyIsICJEYXRhVHlwZSIsICJyZWFkIiwgInN0cmVhbSIsICJyZWFkQnVmZmVyIiwgImxlbmd0aCIsICJ3cml0ZSIsICJ3cml0ZUJ1ZmZlciIsICJNVFUiLCAiRGF0YVR5cGUiLCAicmVhZCIsICJzdHJlYW0iLCAiZ2V0QnVmZmVyIiwgImJ5dGVMZW5ndGgiLCAid3JpdGUiLCAidmFsdWUiLCAid3JpdGVCdWZmZXIiLCAiQnVmZmVyIiwgImFsbG9jIiwgImxlbmd0aCIsICJBZGRyZXNzIiwgIkRhdGFUeXBlIiwgImFkZHJlc3MiLCAicG9ydCIsICJ2ZXJzaW9uIiwgImZyb21JZGVudGlmaWVyIiwgImlkZW50aWZpZXIiLCAiZmFtaWx5IiwgIndyaXRlIiwgInN0cmVhbSIsICJ2YWx1ZSIsICJ3cml0ZVVpbnQ4IiwgImFkZHJlc3NCaXRzIiwgInNwbGl0IiwgImJpdCIsICJOdW1iZXIiLCAicGFyc2VJbnQiLCAid3JpdGVVU2hvcnQiLCAid3JpdGVVaW50MzIiLCAiYWRkcmVzc1BhcnRzIiwgInBhcnQiLCAibnVtIiwgInJlYWQiLCAicmVhZFVpbnQ4IiwgIm1hcCIsICJieXRlIiwgInRvU3RyaW5nIiwgImpvaW4iLCAicmVhZFVTaG9ydCIsICJza2lwIiwgImkiLCAicHVzaCIsICJwYWRTdGFydCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIlBhY2tldCIsICJCaXRmbGFncyIsICJQcmlvcml0eSIsICJTdGF0dXMiLCAiUmVsaWFiaWxpdHkiLCAiRnJhbWUiLCAiRGF0YVR5cGUiLCAicmVsaWFiaWxpdHkiLCAicmVsaWFibGVJbmRleCIsICJzZXF1ZW5jZUluZGV4IiwgIm9yZGVySW5kZXgiLCAib3JkZXJDaGFubmVsIiwgInNwbGl0U2l6ZSIsICJzcGxpdElkIiwgInNwbGl0SW5kZXgiLCAicGF5bG9hZCIsICJpc1NwbGl0IiwgImlzUmVsaWFibGUiLCAiUmVsaWFiaWxpdHkiLCAiUmVsaWFibGUiLCAiUmVsaWFibGVPcmRlcmVkIiwgIlJlbGlhYmxlU2VxdWVuY2VkIiwgIlJlbGlhYmxlV2l0aEFja1JlY2VpcHQiLCAiUmVsaWFibGVPcmRlcmVkV2l0aEFja1JlY2VpcHQiLCAiaW5jbHVkZXMiLCAiaXNTZXF1ZW5jZWQiLCAiVW5yZWxpYWJsZVNlcXVlbmNlZCIsICJpc09yZGVyZWQiLCAiaXNPcmRlckV4Y2x1c2l2ZSIsICJnZXRCeXRlTGVuZ3RoIiwgImJ5dGVMZW5ndGgiLCAicmVhZCIsICJzdHJlYW0iLCAiZnJhbWVzIiwgImZyYW1lIiwgImhlYWRlciIsICJyZWFkVWludDgiLCAic3BsaXQiLCAiQml0ZmxhZ3MiLCAiU3BsaXQiLCAibGVuZ3RoIiwgIk1hdGgiLCAiY2VpbCIsICJyZWFkVWludDE2IiwgInJlYWRVaW50MjQiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAicmVhZFVpbnQzMiIsICJyZWFkQnVmZmVyIiwgInB1c2giLCAiY3Vyc29yQXRFbmQiLCAid3JpdGUiLCAidmFsdWUiLCAid3JpdGVVaW50OCIsICJ3cml0ZVVpbnQxNiIsICJ3cml0ZVVpbnQyNCIsICJ3cml0ZVVpbnQzMiIsICJ3cml0ZUJ1ZmZlciIsICJTeXN0ZW1BZGRyZXNzIiwgIkRhdGFUeXBlIiwgImZyb21JZGVudGlmaWVyIiwgImlkZW50aWZpZXIiLCAiQWRkcmVzcyIsICJhZGRyZXNzIiwgInBvcnQiLCAidmVyc2lvbiIsICJyZWFkIiwgInN0cmVhbSIsICJhZGRyZXNzZXMiLCAiaW5kZXgiLCAicHVzaCIsICJ3cml0ZSIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkJhc2VQYWNrZXQiLCAiQmluYXJ5U3RyZWFtIiwgImlkIiwgImlkX3R5cGUiLCAiVWludDgiLCAiZmx1c2giLCAiYmluYXJ5IiwgImdldElkIiwgIkVycm9yIiwgImdldElkVHlwZSIsICJzZXJpYWxpemUiLCAiZGVzZXJpYWxpemUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJVbmNvbm5lY3RlZFBpbmciLCAiQmFzZVBhY2tldCIsICJ0aW1lc3RhbXAiLCAibWFnaWMiLCAiY2xpZW50IiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiVW5jb25uZWN0ZWRQb25nIiwgIkJhc2VQYWNrZXQiLCAidGltZXN0YW1wIiwgImd1aWQiLCAibWFnaWMiLCAibWVzc2FnZSIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDEiLCAiQmFzZVBhY2tldCIsICJtYWdpYyIsICJwcm90b2NvbCIsICJtdHUiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJPcGVuQ29ubmVjdGlvblJlcGx5MSIsICJCYXNlUGFja2V0IiwgIm1hZ2ljIiwgImd1aWQiLCAic2VjdXJpdHkiLCAibXR1IiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MiIsICJCYXNlUGFja2V0IiwgIm1hZ2ljIiwgImFkZHJlc3MiLCAibXR1IiwgImNsaWVudCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIk9wZW5Db25uZWN0aW9uUmVwbHkyIiwgIkJhc2VQYWNrZXQiLCAibWFnaWMiLCAiZ3VpZCIsICJhZGRyZXNzIiwgIm10dSIsICJlbmNyeXB0aW9uIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiQ29ubmVjdGVkUG9uZyIsICJCYXNlUGFja2V0IiwgInBpbmdUaW1lc3RhbXAiLCAidGltZXN0YW1wIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiQ29ubmVjdGVkUGluZyIsICJCYXNlUGFja2V0IiwgInRpbWVzdGFtcCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkNvbm5lY3Rpb25SZXF1ZXN0IiwgIkJhc2VQYWNrZXQiLCAiY2xpZW50IiwgInRpbWVzdGFtcCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkZyYW1lU2V0IiwgIkJhc2VQYWNrZXQiLCAic2VxdWVuY2UiLCAiZnJhbWVzIiwgIkxpdHRsZSIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIkFjayIsICJCYXNlUGFja2V0IiwgInNlcXVlbmNlcyIsICJzZXJpYWxpemUiLCAid3JpdGVVaW50OCIsICJpZCIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgImNvdW50IiwgImxlbmd0aCIsICJyZWNvcmRzIiwgImN1cnNvciIsICJzdGFydCIsICJsYXN0IiwgImN1cnJlbnQiLCAiZGlmZiIsICJ3cml0ZUJvb2wiLCAid3JpdGVVaW50MjQiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAid3JpdGVVU2hvcnQiLCAid3JpdGVCdWZmZXIiLCAiZ2V0QnVmZmVyIiwgImRlc2VyaWFsaXplIiwgInJlYWRVaW50OCIsICJyZWNvcmRDb3VudCIsICJyZWFkVVNob3J0IiwgImluZGV4IiwgInJlYWRCb29sIiwgInB1c2giLCAicmVhZFVpbnQyNCIsICJlbmQiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJOYWNrIiwgIkJhc2VQYWNrZXQiLCAic2VxdWVuY2VzIiwgInNlcmlhbGl6ZSIsICJ3cml0ZVVpbnQ4IiwgImlkIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAiY291bnQiLCAibGVuZ3RoIiwgInJlY29yZHMiLCAiY3Vyc29yIiwgInN0YXJ0IiwgImxhc3QiLCAiY3VycmVudCIsICJkaWZmIiwgIndyaXRlQm9vbCIsICJ3cml0ZVVpbnQyNCIsICJFbmRpYW5uZXNzIiwgIkxpdHRsZSIsICJ3cml0ZVVTaG9ydCIsICJ3cml0ZUJ1ZmZlciIsICJnZXRCdWZmZXIiLCAiZGVzZXJpYWxpemUiLCAicmVhZFVpbnQ4IiwgInJlY29yZENvdW50IiwgInJlYWRVU2hvcnQiLCAiaW5kZXgiLCAicmVhZEJvb2wiLCAicHVzaCIsICJyZWFkVWludDI0IiwgImVuZCIsICJEaXNjb25uZWN0IiwgIkJhc2VQYWNrZXQiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJJbmNvbXBhdGlibGVQcm90b2NvbFZlcnNpb24iLCAiQmFzZVBhY2tldCIsICJwcm90b2NvbCIsICJtYWdpYyIsICJndWlkIiwgImltcG9ydF9iaW5hcnlzdHJlYW0iLCAiQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCIsICJCYXNlUGFja2V0IiwgImFkZHJlc3MiLCAic3lzdGVtSW5kZXgiLCAic3lzdGVtQWRkcmVzcyIsICJyZXF1ZXN0VGltZXN0YW1wIiwgInRpbWVzdGFtcCIsICJpbXBvcnRfYmluYXJ5c3RyZWFtIiwgIk5ld0luY29taW5nQ29ubmVjdGlvbiIsICJCYXNlUGFja2V0IiwgInNlcnZlckFkZHJlc3MiLCAiaW50ZXJuYWxBZGRyZXNzIiwgImluY29taW5nVGltZXN0YW1wIiwgInNlcnZlclRpbWVzdGFtcCIsICJpbXBvcnRfbm9kZV9kZ3JhbSIsICJpbXBvcnRfZW1pdHRlciIsICJpbXBvcnRfbG9nZ2VyIiwgIlJBS05FVF9QUk9UT0NPTCIsICJSQUtORVRfVFBTIiwgIlJBS05FVF9USUNLX0xFTiIsICJVRFBfSEVBREVSX1NJWkUiLCAiTUlOX01UVV9TSVpFIiwgIk1BWF9NVFVfU0laRSIsICJER1JBTV9IRUFERVJfU0laRSIsICJER1JBTV9NVFVfT1ZFUkhFQUQiLCAiaW1wb3J0X2JpbmFyeXN0cmVhbSIsICJDb25uZWN0aW9uIiwgInNlcnZlciIsICJzdGF0dXMiLCAiU3RhdHVzIiwgIkNvbm5lY3RpbmciLCAibGFzdFVwZGF0ZSIsICJEYXRlIiwgIm5vdyIsICJyaW5mbyIsICJndWlkIiwgIm10dSIsICJyZWNlaXZlZEZyYW1lU2VxdWVuY2VzIiwgIlNldCIsICJsb3N0RnJhbWVTZXF1ZW5jZXMiLCAiaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleCIsICJmcmFnbWVudHNRdWV1ZSIsICJNYXAiLCAiaW5wdXRPcmRlckluZGV4IiwgImlucHV0T3JkZXJpbmdRdWV1ZSIsICJsYXN0SW5wdXRTZXF1ZW5jZSIsICJvdXRwdXRPcmRlckluZGV4IiwgIm91dHB1dFNlcXVlbmNlSW5kZXgiLCAib3V0cHV0RnJhbWVzIiwgIm91dHB1dEJhY2t1cCIsICJvdXRwdXRTZXF1ZW5jZSIsICJvdXRwdXRzcGxpdEluZGV4IiwgIm91dHB1dFJlbGlhYmxlSW5kZXgiLCAiQXJyYXkiLCAiZnJvbSIsICJsZW5ndGgiLCAiZmlsbCIsICJpbmRleCIsICJzZXQiLCAidGljayIsICJsb2dnZXIiLCAid2FybiIsICJhZGRyZXNzIiwgInBvcnQiLCAiZGlzY29ubmVjdCIsICJEaXNjb25uZWN0aW5nIiwgIkRpc2Nvbm5lY3RlZCIsICJzaXplIiwgImFjayIsICJBY2siLCAic2VxdWVuY2VzIiwgInNlcXVlbmNlIiwgImRlbGV0ZSIsICJzZW5kIiwgInNlcmlhbGl6ZSIsICJuYWNrIiwgIk5hY2siLCAic2VuZFF1ZXVlIiwgIkRpc2Nvbm5lY3QiLCAiZnJhbWUiLCAiRnJhbWUiLCAicmVsaWFiaWxpdHkiLCAiUmVsaWFiaWxpdHkiLCAiUmVsaWFibGVPcmRlcmVkIiwgIm9yZGVyQ2hhbm5lbCIsICJwYXlsb2FkIiwgInNlbmRGcmFtZSIsICJQcmlvcml0eSIsICJJbW1lZGlhdGUiLCAiZW1pdCIsICJjb25uZWN0aW9ucyIsICJpbmNvbWluZyIsICJidWZmZXIiLCAiaGVhZGVyIiwgImlkIiwgInRvU3RyaW5nIiwgImRlYnVnIiwgIkVycm9yIiwgIlBhY2tldCIsICJCaXRmbGFncyIsICJWYWxpZCIsICJoYW5kbGVJbmNvbWluZ0ZyYW1lU2V0IiwgImluY29taW5nQmF0Y2giLCAiQ29ubmVjdGlvblJlcXVlc3QiLCAiaGFuZGxlSW5jb21pbmdDb25uZWN0aW9uUmVxdWVzdCIsICJOZXdJbmNvbWluZ0Nvbm5lY3Rpb24iLCAiQ29ubmVjdGVkIiwgIkNvbm5lY3RlZFBpbmciLCAiaGFuZGxlSW5jb21pbmdDb25uZWN0ZWRQaW5nIiwgImRlc2VyaWFsaXplIiwgImhhcyIsICJmcmFtZXMiLCAiZ2V0IiwgImZyYW1lc2V0IiwgIkZyYW1lU2V0IiwgImFkZCIsICJoYW5kbGVGcmFtZSIsICJpc1NwbGl0IiwgImhhbmRsZUZyYWdtZW50IiwgImlzU2VxdWVuY2VkIiwgInNlcXVlbmNlSW5kZXgiLCAib3JkZXJJbmRleCIsICJpc09yZGVyZWQiLCAib3V0T2ZPcmRlclF1ZXVlIiwgInVub3JkZXJlZCIsICJzcGxpdElkIiwgImZyYWdtZW50IiwgInNwbGl0SW5kZXgiLCAic3BsaXRTaXplIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAic2ZyYW1lIiwgIndyaXRlQnVmZmVyIiwgIm5mcmFtZSIsICJyZWxpYWJsZUluZGV4IiwgImdldEJ1ZmZlciIsICJwcmlvcml0eSIsICJpc09yZGVyRXhjbHVzaXZlIiwgIm1heFNpemUiLCAiTWF0aCIsICJjZWlsIiwgImJ5dGVMZW5ndGgiLCAic3ViYXJyYXkiLCAicXVldWVGcmFtZSIsICJER1JBTV9IRUFERVJfU0laRSIsICJnZXRCeXRlTGVuZ3RoIiwgIkRHUkFNX01UVV9PVkVSSEVBRCIsICJhbW91bnQiLCAic2xpY2UiLCAicmVxdWVzdCIsICJhY2NlcHRlZCIsICJDb25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkIiwgIkFkZHJlc3MiLCAiZnJvbUlkZW50aWZpZXIiLCAic3lzdGVtSW5kZXgiLCAic3lzdGVtQWRkcmVzcyIsICJyZXF1ZXN0VGltZXN0YW1wIiwgInRpbWVzdGFtcCIsICJCaWdJbnQiLCAiTm9ybWFsIiwgInBpbmciLCAicG9uZyIsICJDb25uZWN0ZWRQb25nIiwgInBpbmdUaW1lc3RhbXAiLCAiT2ZmbGluZSIsICJzZXJ2ZXIiLCAiaGFuZGxlIiwgImJ1ZmZlciIsICJyaW5mbyIsICJoZWFkZXIiLCAiRXJyb3IiLCAiUGFja2V0IiwgIlVuY29ubmVjdGVkUGluZyIsICJ1bmNvbm5lY3RlZFBpbmciLCAiT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSIsICJvcGVuQ29ubmVjdGlvblJlcXVlc3QxIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDIiLCAib3BlbkNvbm5lY3Rpb25SZXF1ZXN0MiIsICJpZCIsICJ0b1N0cmluZyIsICJsZW5ndGgiLCAibG9nZ2VyIiwgImRlYnVnIiwgImFkZHJlc3MiLCAicG9ydCIsICJwaW5nIiwgImRlc2VyaWFsaXplIiwgInBvbmciLCAiVW5jb25uZWN0ZWRQb25nIiwgInRpbWVzdGFtcCIsICJndWlkIiwgIm1lc3NhZ2UiLCAicHJvdG9jb2wiLCAidmVyc2lvbiIsICJjb25uZWN0aW9ucyIsICJzaXplIiwgIm1heENvbm5lY3Rpb25zIiwgImpvaW4iLCAic2VuZCIsICJzZXJpYWxpemUiLCAicmVxdWVzdCIsICJSQUtORVRfUFJPVE9DT0wiLCAiaW5jb21wYXRpYmxlIiwgIkluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbiIsICJ3YXJuIiwgInJlcGx5IiwgIk9wZW5Db25uZWN0aW9uUmVwbHkxIiwgInNlY3VyaXR5IiwgIm10dSIsICJVRFBfSEVBREVSX1NJWkUiLCAibWF4TXR1U2l6ZSIsICJtaW5NdHVTaXplIiwgInZhbHVlcyIsICJmaW5kIiwgIngiLCAiT3BlbkNvbm5lY3Rpb25SZXBseTIiLCAiQWRkcmVzcyIsICJmcm9tSWRlbnRpZmllciIsICJlbmNyeXB0aW9uIiwgImFkZCIsICJDb25uZWN0aW9uIiwgImNsaWVudCIsICJEZWZhdWx0UmFrbmV0U2VydmVyUHJvcGVydGllcyIsICJhZGRyZXNzIiwgInBvcnQiLCAicHJvdG9jb2wiLCAiUkFLTkVUX1BST1RPQ09MIiwgInZlcnNpb24iLCAibWVzc2FnZSIsICJtYXhDb25uZWN0aW9ucyIsICJtdHVNYXhTaXplIiwgIk1BWF9NVFVfU0laRSIsICJtdHVNaW5TaXplIiwgIk1JTl9NVFVfU0laRSIsICJTZXJ2ZXIiLCAiRW1pdHRlciIsICJpbnRlcnZhbCIsICJwcm9wZXJ0aWVzIiwgImxvZ2dlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIkRhcmtBcXVhIiwgInNvY2tldCIsICJjcmVhdGVTb2NrZXQiLCAiY29ubmVjdGlvbnMiLCAiU2V0IiwgImd1aWQiLCAiQmlnSW50IiwgIk1hdGgiLCAiZmxvb3IiLCAicmFuZG9tIiwgInZhbHVlIiwgIm1heE10dVNpemUiLCAibWluTXR1U2l6ZSIsICJhbGl2ZSIsICJvbiIsICJoYW5kbGUiLCAiYmluZCIsICJ1bnJlZiIsICJPZmZsaW5lIiwgInNlcnZlciIsICJzdGFydCIsICJzaG91bGRUaWNrIiwgInRpY2siLCAiX19uYW1lIiwgInNldFRpbWVvdXQiLCAiY29ubmVjdGlvbiIsICJSQUtORVRfVElDS19MRU4iLCAic3RvcCIsICJkaXNjb25uZWN0IiwgImNsb3NlIiwgImVtaXQiLCAiRXJyb3IiLCAiYnVmZmVyIiwgInJpbmZvIiwgImhlYWRlciIsICJvZmZsaW5lIiwgIkJpdGZsYWdzIiwgIlZhbGlkIiwgInZhbHVlcyIsICJmaW5kIiwgIngiLCAiaW5jb21pbmciLCAic2VuZCJdCn0K