@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/CHANGELOG.md +11 -0
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var Fe=Object.defineProperty;var d=(o,e)=>Fe(o,"name",{value:e,configurable:!0});import"reflect-metadata";import{CompoundTag as G}from"@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===G.prototype)throw new Error("Parameters are not supported for CompoundTag serialization.");let h=this[c],C=r,Ee=this[i];C.write(this,Ee,s,h)}else if(r.prototype===G.prototype){let h=r,C=this[i];h.write(this,C,s)}else{let h=r,C=this[i];h.write(this,C,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===G.prototype)throw new Error("Parameters are not supported for CompoundTag deserialization.");let h=this[c],C=r;this[i]=C.read(this,s,h)}else if(r.prototype===G.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");import{Endianness as $e}from"@serenityjs/binarystream";function p(o,e=$e.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");import{Endianness as ue}from"@serenityjs/binarystream";var x=class{static{d(this,"DataType")}constructor(...e){}static read(e,t=ue.Big,n){}static write(e,t,n=ue.Big,i){}};var me=Buffer.from("\0\xFF\xFF\0\xFE\xFE\xFE\xFE\xFD\xFD\xFD\xFD4Vx","binary"),g=class extends x{static{d(this,"Magic")}static read(e){return e.readBuffer(me.length)}static write(e){e.writeBuffer(me)}};var he=class extends x{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 x{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)}};import{Endianness as A}from"@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 P=function(o){return o[o.Normal=0]="Normal",o[o.Immediate=1]="Immediate",o}(P||{});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 ge extends x{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 ge,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.Little)),n.isSequenced()&&(n.sequenceIndex=e.readUint24(A.Little)),n.isOrdered()&&(n.orderIndex=e.readUint24(A.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.Little),n.isSequenced()&&e.writeUint24(n.sequenceIndex,A.Little),n.isOrdered()&&(e.writeUint24(n.orderIndex,A.Little),e.writeUint8(n.orderChannel)),n.isSplit()&&(e.writeUint32(n.splitSize),e.writeUint16(n.splitId),e.writeUint32(n.splitIndex)),e.writeBuffer(n.payload)}};var ye=class extends x{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})}};import{BinaryStream as Me,Uint8 as Le}from"@serenityjs/binarystream";var l=class extends Me{static{d(this,"BasePacket")}static id;static id_type=Le;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.")}};import{Long as xe}from"@serenityjs/binarystream";function X(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(X,"_ts_decorate");function ie(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ie,"_ts_metadata");var U=class extends l{static{d(this,"UnconnectedPing")}timestamp;magic;client};X([p(xe),ie("design:type",typeof BigInt>"u"?Object:BigInt)],U.prototype,"timestamp",void 0);X([p(g),ie("design:type",typeof Buffer>"u"?Object:Buffer)],U.prototype,"magic",void 0);X([p(xe),ie("design:type",typeof BigInt>"u"?Object:BigInt)],U.prototype,"client",void 0);U=X([f(a.UnconnectedPing)],U);import{Long as ve,String16 as Te}from"@serenityjs/binarystream";function T(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(T,"_ts_decorate");function J(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(J,"_ts_metadata");var S=class extends l{static{d(this,"UnconnectedPong")}timestamp;guid;magic;message};T([p(ve),J("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"timestamp",void 0);T([p(ve),J("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"guid",void 0);T([p(g),J("design:type",typeof Buffer>"u"?Object:Buffer)],S.prototype,"magic",void 0);T([p(Te),J("design:type",String)],S.prototype,"message",void 0);S=T([f(a.UnconnectedPong)],S);import{Uint8 as Ne}from"@serenityjs/binarystream";function Y(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(Y,"_ts_decorate");function se(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(se,"_ts_metadata");var _=class extends l{static{d(this,"OpenConnectionRequest1")}magic;protocol;mtu};Y([p(g),se("design:type",typeof Buffer>"u"?Object:Buffer)],_.prototype,"magic",void 0);Y([p(Ne),se("design:type",Number)],_.prototype,"protocol",void 0);Y([p(he),se("design:type",Number)],_.prototype,"mtu",void 0);_=Y([f(a.OpenConnectionRequest1)],_);import{Long as ke,Bool as Qe,Short as Ve}from"@serenityjs/binarystream";function N(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(N,"_ts_decorate");function ee(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ee,"_ts_metadata");var q=class extends l{static{d(this,"OpenConnectionReply1")}magic;guid;security;mtu};N([p(g),ee("design:type",typeof Buffer>"u"?Object:Buffer)],q.prototype,"magic",void 0);N([p(ke),ee("design:type",typeof BigInt>"u"?Object:BigInt)],q.prototype,"guid",void 0);N([p(Qe),ee("design:type",Boolean)],q.prototype,"security",void 0);N([p(Ve),ee("design:type",Number)],q.prototype,"mtu",void 0);q=N([f(a.OpenConnectionReply1)],q);import{Long as He,Short as We}from"@serenityjs/binarystream";function k(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(k,"_ts_decorate");function te(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(te,"_ts_metadata");var B=class extends l{static{d(this,"OpenConnectionRequest2")}magic;address;mtu;client};k([p(g),te("design:type",typeof Buffer>"u"?Object:Buffer)],B.prototype,"magic",void 0);k([p(u),te("design:type",typeof u>"u"?Object:u)],B.prototype,"address",void 0);k([p(We),te("design:type",Number)],B.prototype,"mtu",void 0);k([p(He),te("design:type",typeof BigInt>"u"?Object:BigInt)],B.prototype,"client",void 0);B=k([f(a.OpenConnectionRequest2)],B);import{Long as Ke,Bool as Ze,Short as Ge}from"@serenityjs/binarystream";function D(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(D,"_ts_decorate");function Q(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Q,"_ts_metadata");var v=class extends l{static{d(this,"OpenConnectionReply2")}magic;guid;address;mtu;encryption};D([p(g),Q("design:type",typeof Buffer>"u"?Object:Buffer)],v.prototype,"magic",void 0);D([p(Ke),Q("design:type",typeof BigInt>"u"?Object:BigInt)],v.prototype,"guid",void 0);D([p(u),Q("design:type",typeof u>"u"?Object:u)],v.prototype,"address",void 0);D([p(Ge),Q("design:type",Number)],v.prototype,"mtu",void 0);D([p(Ze),Q("design:type",Boolean)],v.prototype,"encryption",void 0);v=D([f(a.OpenConnectionReply2)],v);import{Long as be}from"@serenityjs/binarystream";function ce(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(ce,"_ts_decorate");function Re(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Re,"_ts_metadata");var E=class extends l{static{d(this,"ConnectedPong")}pingTimestamp;timestamp};ce([p(be),Re("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"pingTimestamp",void 0);ce([p(be),Re("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"timestamp",void 0);E=ce([f(a.ConnectedPong)],E);import{Long as Je}from"@serenityjs/binarystream";function we(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(we,"_ts_decorate");function Xe(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Xe,"_ts_metadata");var V=class extends l{static{d(this,"ConnectedPing")}timestamp};we([p(Je),Xe("design:type",typeof BigInt>"u"?Object:BigInt)],V.prototype,"timestamp",void 0);V=we([f(a.ConnectedPing)],V);import{Long as Oe}from"@serenityjs/binarystream";function de(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(de,"_ts_decorate");function Ie(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Ie,"_ts_metadata");var F=class extends l{static{d(this,"ConnectionRequest")}client;timestamp};de([p(Oe),Ie("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"client",void 0);de([p(Oe),Ie("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"timestamp",void 0);F=de([f(a.ConnectionRequest)],F);import{Endianness as Ye,Uint24 as et}from"@serenityjs/binarystream";function pe(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(pe,"_ts_decorate");function Se(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Se,"_ts_metadata");var j=class extends l{static{d(this,"FrameSet")}sequence;frames};pe([p(et,Ye.Little),Se("design:type",Number)],j.prototype,"sequence",void 0);pe([p(O),Se("design:type",typeof Array>"u"?Object:Array)],j.prototype,"frames",void 0);j=pe([f(a.FrameSet)],j);import{BinaryStream as nt,Endianness as R}from"@serenityjs/binarystream";function tt(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(tt,"_ts_decorate");var H=class qe extends l{static{d(this,"Ack")}sequences=[];serialize(){this.writeUint8(qe.id);let e=new nt,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,R.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,R.Little),e.writeUint24(s,R.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,R.Little)):(e.writeBool(!1),e.writeUint24(r,R.Little),e.writeUint24(s,R.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(R.Little));else{let i=this.readUint24(R.Little),r=this.readUint24(R.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};H=tt([f(a.Ack)],H);import{BinaryStream as ot,Endianness as b}from"@serenityjs/binarystream";function rt(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(rt,"_ts_decorate");var W=class Be extends l{static{d(this,"Nack")}sequences=[];serialize(){this.writeUint8(Be.id);let e=new ot,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,b.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,b.Little),e.writeUint24(s,b.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,b.Little)):(e.writeBool(!1),e.writeUint24(r,b.Little),e.writeUint24(s,b.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(b.Little));else{let i=this.readUint24(b.Little),r=this.readUint24(b.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};W=rt([f(a.Nack)],W);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 ne=class extends l{static{d(this,"Disconnect")}};ne=it([f(a.Disconnect)],ne);import{Uint8 as st,Uint64 as ct}from"@serenityjs/binarystream";function re(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(re,"_ts_decorate");function ae(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ae,"_ts_metadata");var z=class extends l{static{d(this,"IncompatibleProtocolVersion")}protocol;magic;guid};re([p(st),ae("design:type",Number)],z.prototype,"protocol",void 0);re([p(g),ae("design:type",typeof Buffer>"u"?Object:Buffer)],z.prototype,"magic",void 0);re([p(ct),ae("design:type",typeof BigInt>"u"?Object:BigInt)],z.prototype,"guid",void 0);z=re([f(a.IncompatibleProtocolVersion)],z);import{Long as Ce,Short as dt}from"@serenityjs/binarystream";function $(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($,"_ts_decorate");function K(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(K,"_ts_metadata");var w=class extends l{static{d(this,"ConnectionRequestAccepted")}address;systemIndex;systemAddress;requestTimestamp;timestamp};$([p(u),K("design:type",typeof u>"u"?Object:u)],w.prototype,"address",void 0);$([p(dt),K("design:type",Number)],w.prototype,"systemIndex",void 0);$([p(ye),K("design:type",typeof Array>"u"?Object:Array)],w.prototype,"systemAddress",void 0);$([p(Ce),K("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"requestTimestamp",void 0);$([p(Ce),K("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"timestamp",void 0);w=$([f(a.ConnectionRequestAccepted)],w);import{Long as Pe}from"@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 oe(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(oe,"_ts_metadata");var M=class extends l{static{d(this,"NewIncomingConnection")}serverAddress;internalAddress;incomingTimestamp;serverTimestamp};Z([p(u),oe("design:type",String)],M.prototype,"serverAddress",void 0);Z([p(u),oe("design:type",String)],M.prototype,"internalAddress",void 0);Z([p(Pe),oe("design:type",typeof BigInt>"u"?Object:BigInt)],M.prototype,"incomingTimestamp",void 0);Z([p(Pe),oe("design:type",typeof BigInt>"u"?Object:BigInt)],M.prototype,"serverTimestamp",void 0);M=Z([f(a.NewIncomingConnection)],M);import{createSocket as at}from"node:dgram";import{Emitter as ft}from"@serenityjs/emitter";import{Logger as lt,LoggerColors as ut}from"@serenityjs/logger";var L=11,Jo=100,Ue=.01,fe=28,_e=400,je=1492,ze=4,Ae=36;import{BinaryStream as pt}from"@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 H;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 W;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 ne,t=new O;t.reliability=m.ReliableOrdered,t.orderChannel=0,t.payload=e.serialize(),this.sendFrame(t,P.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 H(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 W(e).deserialize();for(let n of t.sequences){let i=this.outputBackup.get(n)??[];for(let r of i)this.sendFrame(r,P.Immediate)}}handleIncomingFrameSet(e){let t=new j(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 pt;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===P.Immediate)return this.sendQueue(1)}sendQueue(e){if(this.outputFrames.size===0)return;let t=new j;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 F(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,P.Normal)}handleIncomingConnectedPing(e){let t=new V(e).deserialize(),n=new E;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,P.Normal)}};var le=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 U(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 _(e).deserialize();if(n.protocol!==11){let r=new z;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 v;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 mt={address:"0.0.0.0",port:19132,protocol:11,version:"1.0.0",message:"Raknet Server",maxConnections:40,mtuMaxSize:1492,mtuMinSize:400},wi=class extends ft{static{d(this,"Server")}interval=null;properties;logger=new lt("Raknet",ut.DarkAqua);socket=at("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={...mt,...e},this.socket.on("message",this.handle.bind(this)),this.socket.unref(),le.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 le.handle(e,t);if(!i&&r)return r.incoming(e)}send(e,t){this.socket.send(e,t.port,t.address)}};export{H as Ack,u as Address,l as BasePacket,I as Bitflags,V as ConnectedPing,E as ConnectedPong,De as Connection,F as ConnectionRequest,w as ConnectionRequestAccepted,ze as DGRAM_HEADER_SIZE,Ae as DGRAM_MTU_OVERHEAD,x as DataType,ne as Disconnect,O as Frame,j as FrameSet,z as IncompatibleProtocolVersion,je as MAX_MTU_SIZE,_e as MIN_MTU_SIZE,he as MTU,g as Magic,W as Nack,M as NewIncomingConnection,le as Offline,q as OpenConnectionReply1,v as OpenConnectionReply2,_ as OpenConnectionRequest1,B as OpenConnectionRequest2,a as Packet,P as Priority,f as Proto,L as RAKNET_PROTOCOL,Ue as RAKNET_TICK_LEN,Jo as RAKNET_TPS,m as Reliability,p as Serialize,wi as Server,y as Status,ye as SystemAddress,fe as UDP_HEADER_SIZE,U as UnconnectedPing,S as 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+IHRoaXMuc2VydmVyLm1heE10dVNpemVcbiAgICAgICAgPyB0aGlzLnNlcnZlci5tYXhNdHVTaXplIC8vIEFzc2lnbiB0aGUgbWF4aW11bSB0cmFuc2ZlciB1bml0IHNpemVcbiAgICAgICAgOiByZXF1ZXN0Lm10dSArIFVEUF9IRUFERVJfU0laRTsgLy8gQXNzaWduIHRoZSByZXF1ZXN0ZWQgdHJhbnNmZXIgdW5pdCBzaXplICsgdGhlIHVkcCBoZWFkZXIgc2l6ZVxuXG4gICAgLy8gU2VuZCB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcGx5IDEgcGFja2V0IHRvIHRoZSByZW1vdGUgY2xpZW50XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQocmVwbHkuc2VyaWFsaXplKCksIHJpbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIG9wZW4gY29ubmVjdGlvbiByZXF1ZXN0IDIgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkNvbm5lY3Rpb25SZXF1ZXN0MihcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mb1xuICApOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMiBwYWNrZXRcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVxdWVzdDIoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBwb3J0IG1hdGNoZXMgdGhlIHNlcnZlciBwb3J0XG4gICAgLy8gVGhpcyBpcyBhIHVubGlrZWx5IHNjZW5hcmlvLCBidXQgaXQgaXMgcG9zc2libGVcbiAgICBpZiAocmVxdWVzdC5hZGRyZXNzLnBvcnQgIT09IHRoaXMuc2VydmVyLnBvcnQpIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIG1pc21hdGNoZWQgcG9ydFxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gbWlzbWF0Y2hlZCBwb3J0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG10dSBzaXplIGlzIGJldHdlZW4gdGhlIGFsbG93ZWQgbWluaW11bSBhbmQgbWF4aW11bSBtdHUgc2l6ZS5cbiAgICAvLyBJZiBub3QsIHdlIHdpbGwgcmVmdXNlIHRoZSBjb25uZWN0aW9uLlxuICAgIGlmIChcbiAgICAgIHJlcXVlc3QubXR1IDwgdGhpcy5zZXJ2ZXIubWluTXR1U2l6ZSB8fFxuICAgICAgcmVxdWVzdC5tdHUgPiB0aGlzLnNlcnZlci5tYXhNdHVTaXplXG4gICAgKSB7XG4gICAgICAvLyBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBpbnZhbGlkIG10dSBzaXplXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXIubG9nZ2VyLndhcm4oXG4gICAgICAgIGBSZWZ1c2luZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IGR1ZSB0byBpbnZhbGlkIG10dSBzaXplLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBlc3RhYmxpc2hlZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBbLi4udGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMudmFsdWVzKCldLmZpbmQoXG4gICAgICAoeCkgPT4geC5yaW5mby5hZGRyZXNzID09PSByaW5mby5hZGRyZXNzICYmIHgucmluZm8ucG9ydCA9PT0gcmluZm8ucG9ydFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkXG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIGFscmVhZHkgZXN0YWJsaXNoZWQgY29ubmVjdGlvblxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gYWxyZWFkeSBlc3RhYmxpc2hlZCBjb25uZWN0aW9uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldFxuICAgIGNvbnN0IHJlcGx5ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVwbHkyKCk7XG4gICAgcmVwbHkuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcmVwbHkuYWRkcmVzcyA9IEFkZHJlc3MuZnJvbUlkZW50aWZpZXIocmluZm8pO1xuICAgIHJlcGx5Lm10dSA9IHJlcXVlc3QubXR1O1xuICAgIHJlcGx5LmVuY3J5cHRpb24gPSBmYWxzZTsgLy8gV2UgYXJlIG5vdCB1c2luZyBlbmNyeXB0aW9uXG5cbiAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB0aGUgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG4gICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgYEVzdGFibGlzaGluZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IHdpdGggbXR1IHNpemUgb2YgJHtyZXF1ZXN0Lm10dX0uYFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiwgYW5kIGFkZCBpdCB0byB0aGUgY29ubmVjdGlvbnMgc2V0XG4gICAgdGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMuYWRkKFxuICAgICAgLy8gQnVpbGQgYSBuZXcgY29ubmVjdGlvbiBpbnN0YW5jZVxuICAgICAgbmV3IENvbm5lY3Rpb24odGhpcy5zZXJ2ZXIsIHJpbmZvLCByZXF1ZXN0LmNsaWVudCwgcmVxdWVzdC5tdHUpXG4gICAgKTtcblxuICAgIC8vIFNlbmQgdGhlIG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldCB0byB0aGUgcmVtb3RlIGNsaWVudFxuICAgIHJldHVybiB0aGlzLnNlcnZlci5zZW5kKHJlcGx5LnNlcmlhbGl6ZSgpLCByaW5mbyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgT2ZmbGluZSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogImlGQUFBLE1BQU8sbUJDQVAsT0FBU0EsZUFBQUEsTUFBbUIsa0JBWTVCLFNBQVNDLEVBQU1DLEVBQVUsQ0FDdkIsT0FBTyxTQUFVQyxFQUF5QixDQUV4Q0EsRUFBT0QsR0FBS0EsRUFHWixJQUFN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LE9BQU9pQixFQUFnQkMsRUFBeUIsQ0FHeEQsSUFBTUMsRUFBU0YsRUFBTyxDQUFBLEVBR3RCLEdBQUksQ0FBQ0UsRUFBUSxNQUFNLElBQUlILE1BQU0sdUJBQUEsRUFHN0IsSUFBTUksR0FBV0QsRUFBU0UsRUFBU0MsU0FBVyxFQUd4Q1osRUFBYSxJQUFJLEtBQUt0QixZQUFZbUMsT0FBTSxHQUFJQyxLQUMvQ0MsR0FBTUEsRUFBRVAsTUFBTW5ELFVBQVltRCxFQUFNbkQsU0FBVzBELEVBQUVQLE1BQU1sRCxPQUFTa0QsRUFBTWxELElBQUksRUFLekUsR0FBSW9ELEVBRUYsT0FBT2pCLEdBQVFILE9BQU9pQixFQUFRQyxDQUFBQSxFQUloQyxHQUFJLENBQUNFLEdBQVdWLEVBRWQsT0FBT0EsRUFBV2dCLFNBQVNULENBQUFBLENBQy9CLENBRU9VLEtBQUtWLEVBQWdCQyxFQUF5QixDQUNuRCxLQUFLaEMsT0FBT3lDLEtBQUtWLEVBQVFDLEVBQU1sRCxLQUFNa0QsRUFBTW5ELE9BQU8sQ0FDcEQsQ0FDRiIsCiAgIm5hbWVzIjogWyJDb21wb3VuZFRhZyIsICJQcm90byIsICJpZCIsICJ0YXJnZXQiLCAibWV0YWRhdGEiLCAiUmVmbGVjdCIsICJnZXRPd25NZXRhZGF0YSIsICJwcm90b3R5cGUiLCAicHJvcGVydGllcyIsICJPYmplY3QiLCAiZ2V0T3duUHJvcGVydHlOYW1lcyIsICJpbmNsdWRlcyIsICJzZXJpYWxpemUiLCAiZmx1c2giLCAiaWRfdHlwZSIsICJ3cml0ZSIsICJnZXRCdWZmZXIiLCAibmFtZSIsICJ0eXBlIiwgImVuZGlhbiIsICJwYXJhbWV0ZXIiLCAiQ29tcG91bmRUYWciLCAiRXJyb3IiLCAidmFsdWUiLCAiZHR5cGUiLCAiZGF0YSIsICJjdHlwZSIsICJ0YWciLCAiZGVzZXJpYWxpemUiLCAiYmluYXJ5IiwgImxlbmd0aCIsICJyZWFkIiwgImdldElkIiwgImdldElkVHlwZSIsICJFbmRpYW5uZXNzIiwgIlNlcmlhbGl6ZSIsICJ0eXBlIiwgImVuZGlhbiIsICJFbmRpYW5uZXNzIiwgIkJpZyIsICJwYXJhbWV0ZXIiLCAiRXJyb3IiLCAidGFyZ2V0IiwgIm5hbWUiLCAicHJvcGVydGllcyIsICJSZWZsZWN0IiwgImdldE1ldGFkYXRhIiwgInB1c2giLCAiZGVmaW5lTWV0YWRhdGEiLCAiRW5kaWFubmVzcyIsICJEYXRhVHlwZSIsICJfYXJndW1lbnRzXyIsICJyZWFkIiwgIl9zdHJlYW0iLCAiX2VuZGlhbiIsICJFbmRpYW5uZXNzIiwgIkJpZyIsICJfcGFyYW1ldGVyIiwgIndyaXRlIiwgIl92YWx1ZSIsICJNYWdpY0J1ZmZlciIsICJCdWZmZXIiLCAiZnJvbSIsICJNYWdpYyIsICJEYXRhVHlwZSIsICJyZWFkIiwgInN0cmVhbSIsICJyZWFkQnVmZmVyIiwgImxlbmd0aCIsICJ3cml0ZSIsICJ3cml0ZUJ1ZmZlciIsICJNVFUiLCAiRGF0YVR5cGUiLCAicmVhZCIsICJzdHJlYW0iLCAiZ2V0QnVmZmVyIiwgImJ5dGVMZW5ndGgiLCAid3JpdGUiLCAidmFsdWUiLCAid3JpdGVCdWZmZXIiLCAiQnVmZmVyIiwgImFsbG9jIiwgImxlbmd0aCIsICJBZGRyZXNzIiwgIkRhdGFUeXBlIiwgImFkZHJlc3MiLCAicG9ydCIsICJ2ZXJzaW9uIiwgImZyb21JZGVudGlmaWVyIiwgImlkZW50aWZpZXIiLCAiZmFtaWx5IiwgIndyaXRlIiwgInN0cmVhbSIsICJ2YWx1ZSIsICJ3cml0ZVVpbnQ4IiwgImFkZHJlc3NCaXRzIiwgInNwbGl0IiwgImJpdCIsICJOdW1iZXIiLCAicGFyc2VJbnQiLCAid3JpdGVVU2hvcnQiLCAid3JpdGVVaW50MzIiLCAiYWRkcmVzc1BhcnRzIiwgInBhcnQiLCAibnVtIiwgInJlYWQiLCAicmVhZFVpbnQ4IiwgIm1hcCIsICJieXRlIiwgInRvU3RyaW5nIiwgImpvaW4iLCAicmVhZFVTaG9ydCIsICJza2lwIiwgImkiLCAicHVzaCIsICJwYWRTdGFydCIsICJFbmRpYW5uZXNzIiwgIlBhY2tldCIsICJCaXRmbGFncyIsICJQcmlvcml0eSIsICJTdGF0dXMiLCAiUmVsaWFiaWxpdHkiLCAiRnJhbWUiLCAiRGF0YVR5cGUiLCAicmVsaWFiaWxpdHkiLCAicmVsaWFibGVJbmRleCIsICJzZXF1ZW5jZUluZGV4IiwgIm9yZGVySW5kZXgiLCAib3JkZXJDaGFubmVsIiwgInNwbGl0U2l6ZSIsICJzcGxpdElkIiwgInNwbGl0SW5kZXgiLCAicGF5bG9hZCIsICJpc1NwbGl0IiwgImlzUmVsaWFibGUiLCAiUmVsaWFiaWxpdHkiLCAiUmVsaWFibGUiLCAiUmVsaWFibGVPcmRlcmVkIiwgIlJlbGlhYmxlU2VxdWVuY2VkIiwgIlJlbGlhYmxlV2l0aEFja1JlY2VpcHQiLCAiUmVsaWFibGVPcmRlcmVkV2l0aEFja1JlY2VpcHQiLCAiaW5jbHVkZXMiLCAiaXNTZXF1ZW5jZWQiLCAiVW5yZWxpYWJsZVNlcXVlbmNlZCIsICJpc09yZGVyZWQiLCAiaXNPcmRlckV4Y2x1c2l2ZSIsICJnZXRCeXRlTGVuZ3RoIiwgImJ5dGVMZW5ndGgiLCAicmVhZCIsICJzdHJlYW0iLCAiZnJhbWVzIiwgImZyYW1lIiwgImhlYWRlciIsICJyZWFkVWludDgiLCAic3BsaXQiLCAiQml0ZmxhZ3MiLCAiU3BsaXQiLCAibGVuZ3RoIiwgIk1hdGgiLCAiY2VpbCIsICJyZWFkVWludDE2IiwgInJlYWRVaW50MjQiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAicmVhZFVpbnQzMiIsICJyZWFkQnVmZmVyIiwgInB1c2giLCAiY3Vyc29yQXRFbmQiLCAid3JpdGUiLCAidmFsdWUiLCAid3JpdGVVaW50OCIsICJ3cml0ZVVpbnQxNiIsICJ3cml0ZVVpbnQyNCIsICJ3cml0ZVVpbnQzMiIsICJ3cml0ZUJ1ZmZlciIsICJTeXN0ZW1BZGRyZXNzIiwgIkRhdGFUeXBlIiwgImZyb21JZGVudGlmaWVyIiwgImlkZW50aWZpZXIiLCAiQWRkcmVzcyIsICJhZGRyZXNzIiwgInBvcnQiLCAidmVyc2lvbiIsICJyZWFkIiwgInN0cmVhbSIsICJhZGRyZXNzZXMiLCAiaW5kZXgiLCAicHVzaCIsICJ3cml0ZSIsICJCaW5hcnlTdHJlYW0iLCAiVWludDgiLCAiQmFzZVBhY2tldCIsICJCaW5hcnlTdHJlYW0iLCAiaWQiLCAiaWRfdHlwZSIsICJVaW50OCIsICJmbHVzaCIsICJiaW5hcnkiLCAiZ2V0SWQiLCAiRXJyb3IiLCAiZ2V0SWRUeXBlIiwgInNlcmlhbGl6ZSIsICJkZXNlcmlhbGl6ZSIsICJMb25nIiwgIlVuY29ubmVjdGVkUGluZyIsICJCYXNlUGFja2V0IiwgInRpbWVzdGFtcCIsICJtYWdpYyIsICJjbGllbnQiLCAiTG9uZyIsICJTdHJpbmcxNiIsICJVbmNvbm5lY3RlZFBvbmciLCAiQmFzZVBhY2tldCIsICJ0aW1lc3RhbXAiLCAiZ3VpZCIsICJtYWdpYyIsICJtZXNzYWdlIiwgIlVpbnQ4IiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDEiLCAiQmFzZVBhY2tldCIsICJtYWdpYyIsICJwcm90b2NvbCIsICJtdHUiLCAiTG9uZyIsICJCb29sIiwgIlNob3J0IiwgIk9wZW5Db25uZWN0aW9uUmVwbHkxIiwgIkJhc2VQYWNrZXQiLCAibWFnaWMiLCAiZ3VpZCIsICJzZWN1cml0eSIsICJtdHUiLCAiTG9uZyIsICJTaG9ydCIsICJPcGVuQ29ubmVjdGlvblJlcXVlc3QyIiwgIkJhc2VQYWNrZXQiLCAibWFnaWMiLCAiYWRkcmVzcyIsICJtdHUiLCAiY2xpZW50IiwgIkxvbmciLCAiQm9vbCIsICJTaG9ydCIsICJPcGVuQ29ubmVjdGlvblJlcGx5MiIsICJCYXNlUGFja2V0IiwgIm1hZ2ljIiwgImd1aWQiLCAiYWRkcmVzcyIsICJtdHUiLCAiZW5jcnlwdGlvbiIsICJMb25nIiwgIkNvbm5lY3RlZFBvbmciLCAiQmFzZVBhY2tldCIsICJwaW5nVGltZXN0YW1wIiwgInRpbWVzdGFtcCIsICJMb25nIiwgIkNvbm5lY3RlZFBpbmciLCAiQmFzZVBhY2tldCIsICJ0aW1lc3RhbXAiLCAiTG9uZyIsICJDb25uZWN0aW9uUmVxdWVzdCIsICJCYXNlUGFja2V0IiwgImNsaWVudCIsICJ0aW1lc3RhbXAiLCAiRW5kaWFubmVzcyIsICJVaW50MjQiLCAiRnJhbWVTZXQiLCAiQmFzZVBhY2tldCIsICJzZXF1ZW5jZSIsICJmcmFtZXMiLCAiTGl0dGxlIiwgIkJpbmFyeVN0cmVhbSIsICJFbmRpYW5uZXNzIiwgIkFjayIsICJCYXNlUGFja2V0IiwgInNlcXVlbmNlcyIsICJzZXJpYWxpemUiLCAid3JpdGVVaW50OCIsICJpZCIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgImNvdW50IiwgImxlbmd0aCIsICJyZWNvcmRzIiwgImN1cnNvciIsICJzdGFydCIsICJsYXN0IiwgImN1cnJlbnQiLCAiZGlmZiIsICJ3cml0ZUJvb2wiLCAid3JpdGVVaW50MjQiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAid3JpdGVVU2hvcnQiLCAid3JpdGVCdWZmZXIiLCAiZ2V0QnVmZmVyIiwgImRlc2VyaWFsaXplIiwgInJlYWRVaW50OCIsICJyZWNvcmRDb3VudCIsICJyZWFkVVNob3J0IiwgImluZGV4IiwgInJlYWRCb29sIiwgInB1c2giLCAicmVhZFVpbnQyNCIsICJlbmQiLCAiQmluYXJ5U3RyZWFtIiwgIkVuZGlhbm5lc3MiLCAiTmFjayIsICJCYXNlUGFja2V0IiwgInNlcXVlbmNlcyIsICJzZXJpYWxpemUiLCAid3JpdGVVaW50OCIsICJpZCIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgImNvdW50IiwgImxlbmd0aCIsICJyZWNvcmRzIiwgImN1cnNvciIsICJzdGFydCIsICJsYXN0IiwgImN1cnJlbnQiLCAiZGlmZiIsICJ3cml0ZUJvb2wiLCAid3JpdGVVaW50MjQiLCAiRW5kaWFubmVzcyIsICJMaXR0bGUiLCAid3JpdGVVU2hvcnQiLCAid3JpdGVCdWZmZXIiLCAiZ2V0QnVmZmVyIiwgImRlc2VyaWFsaXplIiwgInJlYWRVaW50OCIsICJyZWNvcmRDb3VudCIsICJyZWFkVVNob3J0IiwgImluZGV4IiwgInJlYWRCb29sIiwgInB1c2giLCAicmVhZFVpbnQyNCIsICJlbmQiLCAiRGlzY29ubmVjdCIsICJCYXNlUGFja2V0IiwgIlVpbnQ4IiwgIlVpbnQ2NCIsICJJbmNvbXBhdGlibGVQcm90b2NvbFZlcnNpb24iLCAiQmFzZVBhY2tldCIsICJwcm90b2NvbCIsICJtYWdpYyIsICJndWlkIiwgIkxvbmciLCAiU2hvcnQiLCAiQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCIsICJCYXNlUGFja2V0IiwgImFkZHJlc3MiLCAic3lzdGVtSW5kZXgiLCAic3lzdGVtQWRkcmVzcyIsICJyZXF1ZXN0VGltZXN0YW1wIiwgInRpbWVzdGFtcCIsICJMb25nIiwgIk5ld0luY29taW5nQ29ubmVjdGlvbiIsICJCYXNlUGFja2V0IiwgInNlcnZlckFkZHJlc3MiLCAiaW50ZXJuYWxBZGRyZXNzIiwgImluY29taW5nVGltZXN0YW1wIiwgInNlcnZlclRpbWVzdGFtcCIsICJjcmVhdGVTb2NrZXQiLCAiRW1pdHRlciIsICJMb2dnZXIiLCAiTG9nZ2VyQ29sb3JzIiwgIlJBS05FVF9QUk9UT0NPTCIsICJSQUtORVRfVFBTIiwgIlJBS05FVF9USUNLX0xFTiIsICJVRFBfSEVBREVSX1NJWkUiLCAiTUlOX01UVV9TSVpFIiwgIk1BWF9NVFVfU0laRSIsICJER1JBTV9IRUFERVJfU0laRSIsICJER1JBTV9NVFVfT1ZFUkhFQUQiLCAiQmluYXJ5U3RyZWFtIiwgIkNvbm5lY3Rpb24iLCAic2VydmVyIiwgInN0YXR1cyIsICJTdGF0dXMiLCAiQ29ubmVjdGluZyIsICJsYXN0VXBkYXRlIiwgIkRhdGUiLCAibm93IiwgInJpbmZvIiwgImd1aWQiLCAibXR1IiwgInJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMiLCAiU2V0IiwgImxvc3RGcmFtZVNlcXVlbmNlcyIsICJpbnB1dEhpZ2hlc3RTZXF1ZW5jZUluZGV4IiwgImZyYWdtZW50c1F1ZXVlIiwgIk1hcCIsICJpbnB1dE9yZGVySW5kZXgiLCAiaW5wdXRPcmRlcmluZ1F1ZXVlIiwgImxhc3RJbnB1dFNlcXVlbmNlIiwgIm91dHB1dE9yZGVySW5kZXgiLCAib3V0cHV0U2VxdWVuY2VJbmRleCIsICJvdXRwdXRGcmFtZXMiLCAib3V0cHV0QmFja3VwIiwgIm91dHB1dFNlcXVlbmNlIiwgIm91dHB1dHNwbGl0SW5kZXgiLCAib3V0cHV0UmVsaWFibGVJbmRleCIsICJBcnJheSIsICJmcm9tIiwgImxlbmd0aCIsICJmaWxsIiwgImluZGV4IiwgInNldCIsICJ0aWNrIiwgImxvZ2dlciIsICJ3YXJuIiwgImFkZHJlc3MiLCAicG9ydCIsICJkaXNjb25uZWN0IiwgIkRpc2Nvbm5lY3RpbmciLCAiRGlzY29ubmVjdGVkIiwgInNpemUiLCAiYWNrIiwgIkFjayIsICJzZXF1ZW5jZXMiLCAic2VxdWVuY2UiLCAiZGVsZXRlIiwgInNlbmQiLCAic2VyaWFsaXplIiwgIm5hY2siLCAiTmFjayIsICJzZW5kUXVldWUiLCAiRGlzY29ubmVjdCIsICJmcmFtZSIsICJGcmFtZSIsICJyZWxpYWJpbGl0eSIsICJSZWxpYWJpbGl0eSIsICJSZWxpYWJsZU9yZGVyZWQiLCAib3JkZXJDaGFubmVsIiwgInBheWxvYWQiLCAic2VuZEZyYW1lIiwgIlByaW9yaXR5IiwgIkltbWVkaWF0ZSIsICJlbWl0IiwgImNvbm5lY3Rpb25zIiwgImluY29taW5nIiwgImJ1ZmZlciIsICJoZWFkZXIiLCAiaWQiLCAidG9TdHJpbmciLCAiZGVidWciLCAiRXJyb3IiLCAiUGFja2V0IiwgIkJpdGZsYWdzIiwgIlZhbGlkIiwgImhhbmRsZUluY29taW5nRnJhbWVTZXQiLCAiaW5jb21pbmdCYXRjaCIsICJDb25uZWN0aW9uUmVxdWVzdCIsICJoYW5kbGVJbmNvbWluZ0Nvbm5lY3Rpb25SZXF1ZXN0IiwgIk5ld0luY29taW5nQ29ubmVjdGlvbiIsICJDb25uZWN0ZWQiLCAiQ29ubmVjdGVkUGluZyIsICJoYW5kbGVJbmNvbWluZ0Nvbm5lY3RlZFBpbmciLCAiZGVzZXJpYWxpemUiLCAiaGFzIiwgImZyYW1lcyIsICJnZXQiLCAiZnJhbWVzZXQiLCAiRnJhbWVTZXQiLCAiYWRkIiwgImhhbmRsZUZyYW1lIiwgImlzU3BsaXQiLCAiaGFuZGxlRnJhZ21lbnQiLCAiaXNTZXF1ZW5jZWQiLCAic2VxdWVuY2VJbmRleCIsICJvcmRlckluZGV4IiwgImlzT3JkZXJlZCIsICJvdXRPZk9yZGVyUXVldWUiLCAidW5vcmRlcmVkIiwgInNwbGl0SWQiLCAiZnJhZ21lbnQiLCAic3BsaXRJbmRleCIsICJzcGxpdFNpemUiLCAic3RyZWFtIiwgIkJpbmFyeVN0cmVhbSIsICJzZnJhbWUiLCAid3JpdGVCdWZmZXIiLCAibmZyYW1lIiwgInJlbGlhYmxlSW5kZXgiLCAiZ2V0QnVmZmVyIiwgInByaW9yaXR5IiwgImlzT3JkZXJFeGNsdXNpdmUiLCAibWF4U2l6ZSIsICJNYXRoIiwgImNlaWwiLCAiYnl0ZUxlbmd0aCIsICJzdWJhcnJheSIsICJxdWV1ZUZyYW1lIiwgIkRHUkFNX0hFQURFUl9TSVpFIiwgImdldEJ5dGVMZW5ndGgiLCAiREdSQU1fTVRVX09WRVJIRUFEIiwgImFtb3VudCIsICJzbGljZSIsICJyZXF1ZXN0IiwgImFjY2VwdGVkIiwgIkNvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQiLCAiQWRkcmVzcyIsICJmcm9tSWRlbnRpZmllciIsICJzeXN0ZW1JbmRleCIsICJzeXN0ZW1BZGRyZXNzIiwgInJlcXVlc3RUaW1lc3RhbXAiLCAidGltZXN0YW1wIiwgIkJpZ0ludCIsICJOb3JtYWwiLCAicGluZyIsICJwb25nIiwgIkNvbm5lY3RlZFBvbmciLCAicGluZ1RpbWVzdGFtcCIsICJPZmZsaW5lIiwgInNlcnZlciIsICJoYW5kbGUiLCAiYnVmZmVyIiwgInJpbmZvIiwgImhlYWRlciIsICJFcnJvciIsICJQYWNrZXQiLCAiVW5jb25uZWN0ZWRQaW5nIiwgInVuY29ubmVjdGVkUGluZyIsICJPcGVuQ29ubmVjdGlvblJlcXVlc3QxIiwgIm9wZW5Db25uZWN0aW9uUmVxdWVzdDEiLCAiT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MiIsICJvcGVuQ29ubmVjdGlvblJlcXVlc3QyIiwgImlkIiwgInRvU3RyaW5nIiwgImxlbmd0aCIsICJsb2dnZXIiLCAiZGVidWciLCAiYWRkcmVzcyIsICJwb3J0IiwgInBpbmciLCAiZGVzZXJpYWxpemUiLCAicG9uZyIsICJVbmNvbm5lY3RlZFBvbmciLCAidGltZXN0YW1wIiwgImd1aWQiLCAibWVzc2FnZSIsICJwcm90b2NvbCIsICJ2ZXJzaW9uIiwgImNvbm5lY3Rpb25zIiwgInNpemUiLCAibWF4Q29ubmVjdGlvbnMiLCAiam9pbiIsICJzZW5kIiwgInNlcmlhbGl6ZSIsICJyZXF1ZXN0IiwgIlJBS05FVF9QUk9UT0NPTCIsICJpbmNvbXBhdGlibGUiLCAiSW5jb21wYXRpYmxlUHJvdG9jb2xWZXJzaW9uIiwgIndhcm4iLCAicmVwbHkiLCAiT3BlbkNvbm5lY3Rpb25SZXBseTEiLCAic2VjdXJpdHkiLCAibXR1IiwgIlVEUF9IRUFERVJfU0laRSIsICJtYXhNdHVTaXplIiwgIm1pbk10dVNpemUiLCAidmFsdWVzIiwgImZpbmQiLCAieCIsICJPcGVuQ29ubmVjdGlvblJlcGx5MiIsICJBZGRyZXNzIiwgImZyb21JZGVudGlmaWVyIiwgImVuY3J5cHRpb24iLCAiYWRkIiwgIkNvbm5lY3Rpb24iLCAiY2xpZW50IiwgIkRlZmF1bHRSYWtuZXRTZXJ2ZXJQcm9wZXJ0aWVzIiwgImFkZHJlc3MiLCAicG9ydCIsICJwcm90b2NvbCIsICJSQUtORVRfUFJPVE9DT0wiLCAidmVyc2lvbiIsICJtZXNzYWdlIiwgIm1heENvbm5lY3Rpb25zIiwgIm10dU1heFNpemUiLCAiTUFYX01UVV9TSVpFIiwgIm10dU1pblNpemUiLCAiTUlOX01UVV9TSVpFIiwgIlNlcnZlciIsICJFbWl0dGVyIiwgImludGVydmFsIiwgInByb3BlcnRpZXMiLCAibG9nZ2VyIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiRGFya0FxdWEiLCAic29ja2V0IiwgImNyZWF0ZVNvY2tldCIsICJjb25uZWN0aW9ucyIsICJTZXQiLCAiZ3VpZCIsICJCaWdJbnQiLCAiTWF0aCIsICJmbG9vciIsICJyYW5kb20iLCAidmFsdWUiLCAibWF4TXR1U2l6ZSIsICJtaW5NdHVTaXplIiwgImFsaXZlIiwgIm9uIiwgImhhbmRsZSIsICJiaW5kIiwgInVucmVmIiwgIk9mZmxpbmUiLCAic2VydmVyIiwgInN0YXJ0IiwgInNob3VsZFRpY2siLCAidGljayIsICJfX25hbWUiLCAic2V0VGltZW91dCIsICJjb25uZWN0aW9uIiwgIlJBS05FVF9USUNLX0xFTiIsICJzdG9wIiwgImRpc2Nvbm5lY3QiLCAiY2xvc2UiLCAiZW1pdCIsICJFcnJvciIsICJidWZmZXIiLCAicmluZm8iLCAiaGVhZGVyIiwgIm9mZmxpbmUiLCAiQml0ZmxhZ3MiLCAiVmFsaWQiLCAidmFsdWVzIiwgImZpbmQiLCAieCIsICJpbmNvbWluZyIsICJzZW5kIl0KfQo=
|
|
1
|
+
var Fe=Object.defineProperty;var d=(o,e)=>Fe(o,"name",{value:e,configurable:!0});import"reflect-metadata";import{CompoundTag as G}from"@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===G.prototype)throw new Error("Parameters are not supported for CompoundTag serialization.");let h=this[c],C=r,Ee=this[i];C.write(this,Ee,s,h)}else if(r.prototype===G.prototype){let h=r,C=this[i];h.write(this,C,{name:!0,type:!0,varint:s})}else{let h=r,C=this[i];h.write(this,C,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===G.prototype)throw new Error("Parameters are not supported for CompoundTag deserialization.");let h=this[c],C=r;this[i]=C.read(this,s,h)}else if(r.prototype===G.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");import{Endianness as $e}from"@serenityjs/binarystream";function p(o,e=$e.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");import{Endianness as ue}from"@serenityjs/binarystream";var v=class{static{d(this,"DataType")}constructor(...e){}static read(e,t=ue.Big,n){}static write(e,t,n=ue.Big,i){}};var me=Buffer.from("\0\xFF\xFF\0\xFE\xFE\xFE\xFE\xFD\xFD\xFD\xFD4Vx","binary"),g=class extends v{static{d(this,"Magic")}static read(e){return e.readBuffer(me.length)}static write(e){e.writeBuffer(me)}};var he=class extends v{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 v{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)}};import{Endianness as A}from"@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 P=function(o){return o[o.Normal=0]="Normal",o[o.Immediate=1]="Immediate",o}(P||{});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 ge extends v{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 ge,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.Little)),n.isSequenced()&&(n.sequenceIndex=e.readUint24(A.Little)),n.isOrdered()&&(n.orderIndex=e.readUint24(A.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.Little),n.isSequenced()&&e.writeUint24(n.sequenceIndex,A.Little),n.isOrdered()&&(e.writeUint24(n.orderIndex,A.Little),e.writeUint8(n.orderChannel)),n.isSplit()&&(e.writeUint32(n.splitSize),e.writeUint16(n.splitId),e.writeUint32(n.splitIndex)),e.writeBuffer(n.payload)}};var ye=class extends v{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})}};import{BinaryStream as Me,Uint8 as Le}from"@serenityjs/binarystream";var l=class extends Me{static{d(this,"BasePacket")}static id;static id_type=Le;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.")}};import{Long as ve}from"@serenityjs/binarystream";function X(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(X,"_ts_decorate");function ie(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ie,"_ts_metadata");var U=class extends l{static{d(this,"UnconnectedPing")}timestamp;magic;client};X([p(ve),ie("design:type",typeof BigInt>"u"?Object:BigInt)],U.prototype,"timestamp",void 0);X([p(g),ie("design:type",typeof Buffer>"u"?Object:Buffer)],U.prototype,"magic",void 0);X([p(ve),ie("design:type",typeof BigInt>"u"?Object:BigInt)],U.prototype,"client",void 0);U=X([f(a.UnconnectedPing)],U);import{Long as xe,String16 as Te}from"@serenityjs/binarystream";function T(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(T,"_ts_decorate");function J(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(J,"_ts_metadata");var S=class extends l{static{d(this,"UnconnectedPong")}timestamp;guid;magic;message};T([p(xe),J("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"timestamp",void 0);T([p(xe),J("design:type",typeof BigInt>"u"?Object:BigInt)],S.prototype,"guid",void 0);T([p(g),J("design:type",typeof Buffer>"u"?Object:Buffer)],S.prototype,"magic",void 0);T([p(Te),J("design:type",String)],S.prototype,"message",void 0);S=T([f(a.UnconnectedPong)],S);import{Uint8 as Ne}from"@serenityjs/binarystream";function Y(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(Y,"_ts_decorate");function se(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(se,"_ts_metadata");var _=class extends l{static{d(this,"OpenConnectionRequest1")}magic;protocol;mtu};Y([p(g),se("design:type",typeof Buffer>"u"?Object:Buffer)],_.prototype,"magic",void 0);Y([p(Ne),se("design:type",Number)],_.prototype,"protocol",void 0);Y([p(he),se("design:type",Number)],_.prototype,"mtu",void 0);_=Y([f(a.OpenConnectionRequest1)],_);import{Long as ke,Bool as Qe,Short as Ve}from"@serenityjs/binarystream";function N(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(N,"_ts_decorate");function ee(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ee,"_ts_metadata");var q=class extends l{static{d(this,"OpenConnectionReply1")}magic;guid;security;mtu};N([p(g),ee("design:type",typeof Buffer>"u"?Object:Buffer)],q.prototype,"magic",void 0);N([p(ke),ee("design:type",typeof BigInt>"u"?Object:BigInt)],q.prototype,"guid",void 0);N([p(Qe),ee("design:type",Boolean)],q.prototype,"security",void 0);N([p(Ve),ee("design:type",Number)],q.prototype,"mtu",void 0);q=N([f(a.OpenConnectionReply1)],q);import{Long as He,Short as We}from"@serenityjs/binarystream";function k(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(k,"_ts_decorate");function te(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(te,"_ts_metadata");var B=class extends l{static{d(this,"OpenConnectionRequest2")}magic;address;mtu;client};k([p(g),te("design:type",typeof Buffer>"u"?Object:Buffer)],B.prototype,"magic",void 0);k([p(u),te("design:type",typeof u>"u"?Object:u)],B.prototype,"address",void 0);k([p(We),te("design:type",Number)],B.prototype,"mtu",void 0);k([p(He),te("design:type",typeof BigInt>"u"?Object:BigInt)],B.prototype,"client",void 0);B=k([f(a.OpenConnectionRequest2)],B);import{Long as Ke,Bool as Ze,Short as Ge}from"@serenityjs/binarystream";function D(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(D,"_ts_decorate");function Q(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Q,"_ts_metadata");var x=class extends l{static{d(this,"OpenConnectionReply2")}magic;guid;address;mtu;encryption};D([p(g),Q("design:type",typeof Buffer>"u"?Object:Buffer)],x.prototype,"magic",void 0);D([p(Ke),Q("design:type",typeof BigInt>"u"?Object:BigInt)],x.prototype,"guid",void 0);D([p(u),Q("design:type",typeof u>"u"?Object:u)],x.prototype,"address",void 0);D([p(Ge),Q("design:type",Number)],x.prototype,"mtu",void 0);D([p(Ze),Q("design:type",Boolean)],x.prototype,"encryption",void 0);x=D([f(a.OpenConnectionReply2)],x);import{Long as be}from"@serenityjs/binarystream";function ce(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(ce,"_ts_decorate");function Re(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Re,"_ts_metadata");var E=class extends l{static{d(this,"ConnectedPong")}pingTimestamp;timestamp};ce([p(be),Re("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"pingTimestamp",void 0);ce([p(be),Re("design:type",typeof BigInt>"u"?Object:BigInt)],E.prototype,"timestamp",void 0);E=ce([f(a.ConnectedPong)],E);import{Long as Je}from"@serenityjs/binarystream";function we(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(we,"_ts_decorate");function Xe(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Xe,"_ts_metadata");var V=class extends l{static{d(this,"ConnectedPing")}timestamp};we([p(Je),Xe("design:type",typeof BigInt>"u"?Object:BigInt)],V.prototype,"timestamp",void 0);V=we([f(a.ConnectedPing)],V);import{Long as Oe}from"@serenityjs/binarystream";function de(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(de,"_ts_decorate");function Ie(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Ie,"_ts_metadata");var F=class extends l{static{d(this,"ConnectionRequest")}client;timestamp};de([p(Oe),Ie("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"client",void 0);de([p(Oe),Ie("design:type",typeof BigInt>"u"?Object:BigInt)],F.prototype,"timestamp",void 0);F=de([f(a.ConnectionRequest)],F);import{Endianness as Ye,Uint24 as et}from"@serenityjs/binarystream";function pe(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(pe,"_ts_decorate");function Se(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(Se,"_ts_metadata");var j=class extends l{static{d(this,"FrameSet")}sequence;frames};pe([p(et,Ye.Little),Se("design:type",Number)],j.prototype,"sequence",void 0);pe([p(O),Se("design:type",typeof Array>"u"?Object:Array)],j.prototype,"frames",void 0);j=pe([f(a.FrameSet)],j);import{BinaryStream as nt,Endianness as R}from"@serenityjs/binarystream";function tt(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(tt,"_ts_decorate");var H=class qe extends l{static{d(this,"Ack")}sequences=[];serialize(){this.writeUint8(qe.id);let e=new nt,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,R.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,R.Little),e.writeUint24(s,R.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,R.Little)):(e.writeBool(!1),e.writeUint24(r,R.Little),e.writeUint24(s,R.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(R.Little));else{let i=this.readUint24(R.Little),r=this.readUint24(R.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};H=tt([f(a.Ack)],H);import{BinaryStream as ot,Endianness as b}from"@serenityjs/binarystream";function rt(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(rt,"_ts_decorate");var W=class Be extends l{static{d(this,"Nack")}sequences=[];serialize(){this.writeUint8(Be.id);let e=new ot,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,b.Little),r=s=c):(e.writeBool(!1),e.writeUint24(r,b.Little),e.writeUint24(s,b.Little),r=s=c),++n)}r===s?(e.writeBool(!0),e.writeUint24(r,b.Little)):(e.writeBool(!1),e.writeUint24(r,b.Little),e.writeUint24(s,b.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(b.Little));else{let i=this.readUint24(b.Little),r=this.readUint24(b.Little);for(let s=i;s<=r;s++)this.sequences.push(s)}return this}};W=rt([f(a.Nack)],W);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 ne=class extends l{static{d(this,"Disconnect")}};ne=it([f(a.Disconnect)],ne);import{Uint8 as st,Uint64 as ct}from"@serenityjs/binarystream";function re(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(re,"_ts_decorate");function ae(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(ae,"_ts_metadata");var z=class extends l{static{d(this,"IncompatibleProtocolVersion")}protocol;magic;guid};re([p(st),ae("design:type",Number)],z.prototype,"protocol",void 0);re([p(g),ae("design:type",typeof Buffer>"u"?Object:Buffer)],z.prototype,"magic",void 0);re([p(ct),ae("design:type",typeof BigInt>"u"?Object:BigInt)],z.prototype,"guid",void 0);z=re([f(a.IncompatibleProtocolVersion)],z);import{Long as Ce,Short as dt}from"@serenityjs/binarystream";function $(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($,"_ts_decorate");function K(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(K,"_ts_metadata");var w=class extends l{static{d(this,"ConnectionRequestAccepted")}address;systemIndex;systemAddress;requestTimestamp;timestamp};$([p(u),K("design:type",typeof u>"u"?Object:u)],w.prototype,"address",void 0);$([p(dt),K("design:type",Number)],w.prototype,"systemIndex",void 0);$([p(ye),K("design:type",typeof Array>"u"?Object:Array)],w.prototype,"systemAddress",void 0);$([p(Ce),K("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"requestTimestamp",void 0);$([p(Ce),K("design:type",typeof BigInt>"u"?Object:BigInt)],w.prototype,"timestamp",void 0);w=$([f(a.ConnectionRequestAccepted)],w);import{Long as Pe}from"@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 oe(o,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(o,e)}d(oe,"_ts_metadata");var M=class extends l{static{d(this,"NewIncomingConnection")}serverAddress;internalAddress;incomingTimestamp;serverTimestamp};Z([p(u),oe("design:type",String)],M.prototype,"serverAddress",void 0);Z([p(u),oe("design:type",String)],M.prototype,"internalAddress",void 0);Z([p(Pe),oe("design:type",typeof BigInt>"u"?Object:BigInt)],M.prototype,"incomingTimestamp",void 0);Z([p(Pe),oe("design:type",typeof BigInt>"u"?Object:BigInt)],M.prototype,"serverTimestamp",void 0);M=Z([f(a.NewIncomingConnection)],M);import{createSocket as at}from"node:dgram";import{Emitter as ft}from"@serenityjs/emitter";import{Logger as lt,LoggerColors as ut}from"@serenityjs/logger";var L=11,Jo=100,Ue=.01,fe=28,_e=400,je=1492,ze=4,Ae=36;import{BinaryStream as pt}from"@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 H;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 W;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 ne,t=new O;t.reliability=m.ReliableOrdered,t.orderChannel=0,t.payload=e.serialize(),this.sendFrame(t,P.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 H(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 W(e).deserialize();for(let n of t.sequences){let i=this.outputBackup.get(n)??[];for(let r of i)this.sendFrame(r,P.Immediate)}}handleIncomingFrameSet(e){let t=new j(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 pt;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===P.Immediate)return this.sendQueue(1)}sendQueue(e){if(this.outputFrames.size===0)return;let t=new j;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 F(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,P.Normal)}handleIncomingConnectedPing(e){let t=new V(e).deserialize(),n=new E;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,P.Normal)}};var le=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 U(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 _(e).deserialize();if(n.protocol!==11){let r=new z;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 x;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 mt={address:"0.0.0.0",port:19132,protocol:11,version:"1.0.0",message:"Raknet Server",maxConnections:40,mtuMaxSize:1492,mtuMinSize:400},wi=class extends ft{static{d(this,"Server")}interval=null;properties;logger=new lt("Raknet",ut.DarkAqua);socket=at("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={...mt,...e},this.socket.on("message",this.handle.bind(this)),this.socket.unref(),le.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 le.handle(e,t);if(!i&&r)return r.incoming(e)}send(e,t){this.socket.send(e,t.port,t.address)}};export{H as Ack,u as Address,l as BasePacket,I as Bitflags,V as ConnectedPing,E as ConnectedPong,De as Connection,F as ConnectionRequest,w as ConnectionRequestAccepted,ze as DGRAM_HEADER_SIZE,Ae as DGRAM_MTU_OVERHEAD,v as DataType,ne as Disconnect,O as Frame,j as FrameSet,z as IncompatibleProtocolVersion,je as MAX_MTU_SIZE,_e as MIN_MTU_SIZE,he as MTU,g as Magic,W as Nack,M as NewIncomingConnection,le as Offline,q as OpenConnectionReply1,x as OpenConnectionReply2,_ as OpenConnectionRequest1,B as OpenConnectionRequest2,a as Packet,P as Priority,f as Proto,L as RAKNET_PROTOCOL,Ue as RAKNET_TICK_LEN,Jo as RAKNET_TPS,m as Reliability,p as Serialize,wi as Server,y as Status,ye as SystemAddress,fe as UDP_HEADER_SIZE,U as UnconnectedPing,S as 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+IHRoaXMuc2VydmVyLm1heE10dVNpemVcbiAgICAgICAgPyB0aGlzLnNlcnZlci5tYXhNdHVTaXplIC8vIEFzc2lnbiB0aGUgbWF4aW11bSB0cmFuc2ZlciB1bml0IHNpemVcbiAgICAgICAgOiByZXF1ZXN0Lm10dSArIFVEUF9IRUFERVJfU0laRTsgLy8gQXNzaWduIHRoZSByZXF1ZXN0ZWQgdHJhbnNmZXIgdW5pdCBzaXplICsgdGhlIHVkcCBoZWFkZXIgc2l6ZVxuXG4gICAgLy8gU2VuZCB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcGx5IDEgcGFja2V0IHRvIHRoZSByZW1vdGUgY2xpZW50XG4gICAgcmV0dXJuIHRoaXMuc2VydmVyLnNlbmQocmVwbHkuc2VyaWFsaXplKCksIHJpbmZvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGFuIG9wZW4gY29ubmVjdGlvbiByZXF1ZXN0IDIgcGFja2V0XG4gICAqIEBwYXJhbSBidWZmZXIgVGhlIHBhY2tldCBidWZmZXIgZnJvbSB0aGUgcmVtb3RlIGNsaWVudFxuICAgKiBAcGFyYW0gcmluZm8gVGhlIHJlbW90ZSBjbGllbnQgaW5mb3JtYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb3BlbkNvbm5lY3Rpb25SZXF1ZXN0MihcbiAgICBidWZmZXI6IEJ1ZmZlcixcbiAgICByaW5mbzogUmVtb3RlSW5mb1xuICApOiB2b2lkIHtcbiAgICAvLyBEZXNlcmlhbGl6ZSB0aGUgb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgMiBwYWNrZXRcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVxdWVzdDIoYnVmZmVyKS5kZXNlcmlhbGl6ZSgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHJlcXVlc3RlZCBwb3J0IG1hdGNoZXMgdGhlIHNlcnZlciBwb3J0XG4gICAgLy8gVGhpcyBpcyBhIHVubGlrZWx5IHNjZW5hcmlvLCBidXQgaXQgaXMgcG9zc2libGVcbiAgICBpZiAocmVxdWVzdC5hZGRyZXNzLnBvcnQgIT09IHRoaXMuc2VydmVyLnBvcnQpIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIG1pc21hdGNoZWQgcG9ydFxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gbWlzbWF0Y2hlZCBwb3J0LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG10dSBzaXplIGlzIGJldHdlZW4gdGhlIGFsbG93ZWQgbWluaW11bSBhbmQgbWF4aW11bSBtdHUgc2l6ZS5cbiAgICAvLyBJZiBub3QsIHdlIHdpbGwgcmVmdXNlIHRoZSBjb25uZWN0aW9uLlxuICAgIGlmIChcbiAgICAgIHJlcXVlc3QubXR1IDwgdGhpcy5zZXJ2ZXIubWluTXR1U2l6ZSB8fFxuICAgICAgcmVxdWVzdC5tdHUgPiB0aGlzLnNlcnZlci5tYXhNdHVTaXplXG4gICAgKSB7XG4gICAgICAvLyBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UgZm9yIHRoZSBpbnZhbGlkIG10dSBzaXplXG4gICAgICByZXR1cm4gdGhpcy5zZXJ2ZXIubG9nZ2VyLndhcm4oXG4gICAgICAgIGBSZWZ1c2luZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IGR1ZSB0byBpbnZhbGlkIG10dSBzaXplLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBlc3RhYmxpc2hlZFxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBbLi4udGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMudmFsdWVzKCldLmZpbmQoXG4gICAgICAoeCkgPT4geC5yaW5mby5hZGRyZXNzID09PSByaW5mby5hZGRyZXNzICYmIHgucmluZm8ucG9ydCA9PT0gcmluZm8ucG9ydFxuICAgICk7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IGVzdGFibGlzaGVkXG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcbiAgICAgIC8vIExvZyBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIGFscmVhZHkgZXN0YWJsaXNoZWQgY29ubmVjdGlvblxuICAgICAgcmV0dXJuIHRoaXMuc2VydmVyLmxvZ2dlci53YXJuKFxuICAgICAgICBgUmVmdXNpbmcgY29ubmVjdGlvbiBmcm9tICR7cmluZm8uYWRkcmVzc306JHtyaW5mby5wb3J0fSBkdWUgdG8gYWxyZWFkeSBlc3RhYmxpc2hlZCBjb25uZWN0aW9uLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldFxuICAgIGNvbnN0IHJlcGx5ID0gbmV3IE9wZW5Db25uZWN0aW9uUmVwbHkyKCk7XG4gICAgcmVwbHkuZ3VpZCA9IHRoaXMuc2VydmVyLmd1aWQ7XG4gICAgcmVwbHkuYWRkcmVzcyA9IEFkZHJlc3MuZnJvbUlkZW50aWZpZXIocmluZm8pO1xuICAgIHJlcGx5Lm10dSA9IHJlcXVlc3QubXR1O1xuICAgIHJlcGx5LmVuY3J5cHRpb24gPSBmYWxzZTsgLy8gV2UgYXJlIG5vdCB1c2luZyBlbmNyeXB0aW9uXG5cbiAgICAvLyBMb2cgYSBkZWJ1ZyBtZXNzYWdlIGZvciB0aGUgc3VjY2Vzc2Z1bCBjb25uZWN0aW9uXG4gICAgdGhpcy5zZXJ2ZXIubG9nZ2VyLmRlYnVnKFxuICAgICAgYEVzdGFibGlzaGluZyBjb25uZWN0aW9uIGZyb20gJHtyaW5mby5hZGRyZXNzfToke3JpbmZvLnBvcnR9IHdpdGggbXR1IHNpemUgb2YgJHtyZXF1ZXN0Lm10dX0uYFxuICAgICk7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiwgYW5kIGFkZCBpdCB0byB0aGUgY29ubmVjdGlvbnMgc2V0XG4gICAgdGhpcy5zZXJ2ZXIuY29ubmVjdGlvbnMuYWRkKFxuICAgICAgLy8gQnVpbGQgYSBuZXcgY29ubmVjdGlvbiBpbnN0YW5jZVxuICAgICAgbmV3IENvbm5lY3Rpb24odGhpcy5zZXJ2ZXIsIHJpbmZvLCByZXF1ZXN0LmNsaWVudCwgcmVxdWVzdC5tdHUpXG4gICAgKTtcblxuICAgIC8vIFNlbmQgdGhlIG9wZW4gY29ubmVjdGlvbiByZXBseSAyIHBhY2tldCB0byB0aGUgcmVtb3RlIGNsaWVudFxuICAgIHJldHVybiB0aGlzLnNlcnZlci5zZW5kKHJlcGx5LnNlcmlhbGl6ZSgpLCByaW5mbyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgT2ZmbGluZSB9O1xuIl0sCiAgIm1hcHBpbmdzIjogImlGQUFBLE1BQU8sbUJDQVAs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LFdBQVUsRUFHNUQsS0FBS2pDLFdBQVUsS0FBS0EsU0FBVyxNQUduQyxLQUFLTSxPQUFPNEIsTUFBSyxDQUNuQixNQUFRLENBQ0QsS0FBS0MsS0FBSyxRQUFTLElBQUlDLE1BQU0sNEJBQUEsQ0FBQSxDQUNwQyxDQUNGLENBRVVoQixPQUFPaUIsRUFBZ0JDLEVBQXlCLENBR3hELElBQU1DLEVBQVNGLEVBQU8sQ0FBQSxFQUd0QixHQUFJLENBQUNFLEVBQVEsTUFBTSxJQUFJSCxNQUFNLHVCQUFBLEVBRzdCLElBQU1JLEdBQVdELEVBQVNFLEVBQVNDLFNBQVcsRUFHeENaLEVBQWEsSUFBSSxLQUFLdEIsWUFBWW1DLE9BQU0sR0FBSUMsS0FDL0NDLEdBQU1BLEVBQUVQLE1BQU1uRCxVQUFZbUQsRUFBTW5ELFNBQVcwRCxFQUFFUCxNQUFNbEQsT0FBU2tELEVBQU1sRCxJQUFJLEVBS3pFLEdBQUlvRCxFQUVGLE9BQU9qQixHQUFRSCxPQUFPaUIsRUFBUUMsQ0FBQUEsRUFJaEMsR0FBSSxDQUFDRSxHQUFXVixFQUVkLE9BQU9BLEVBQVdnQixTQUFTVCxDQUFBQSxDQUMvQixDQUVPVSxLQUFLVixFQUFnQkMsRUFBeUIsQ0FDbkQsS0FBS2hDLE9BQU95QyxLQUFLVixFQUFRQyxFQUFNbEQsS0FBTWtELEVBQU1uRCxPQUFPLENBQ3BELENBQ0YiLAogICJuYW1lcyI6IFsiQ29tcG91bmRUYWciLCAiUHJvdG8iLCAiaWQiLCAidGFyZ2V0IiwgIm1ldGFkYXRhIiwgIlJlZmxlY3QiLCAiZ2V0T3duTWV0YWRhdGEiLCAicHJvdG90eXBlIiwgInByb3BlcnRpZXMiLCAiT2JqZWN0IiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiaW5jbHVkZXMiLCAic2VyaWFsaXplIiwgImZsdXNoIiwgImlkX3R5cGUiLCAid3JpdGUiLCAiZ2V0QnVmZmVyIiwgIm5hbWUiLCAidHlwZSIsICJlbmRpYW4iLCAicGFyYW1ldGVyIiwgIkNvbXBvdW5kVGFnIiwgIkVycm9yIiwgInZhbHVlIiwgImR0eXBlIiwgImRhdGEiLCAiY3R5cGUiLCAidGFnIiwgInZhcmludCIsICJkZXNlcmlhbGl6ZSIsICJiaW5hcnkiLCAibGVuZ3RoIiwgInJlYWQiLCAiZ2V0SWQiLCAiZ2V0SWRUeXBlIiwgIkVuZGlhbm5lc3MiLCAiU2VyaWFsaXplIiwgInR5cGUiLCAiZW5kaWFuIiwgIkVuZGlhbm5lc3MiLCAiQmlnIiwgInBhcmFtZXRlciIsICJFcnJvciIsICJ0YXJnZXQiLCAibmFtZSIsICJwcm9wZXJ0aWVzIiwgIlJlZmxlY3QiLCAiZ2V0TWV0YWRhdGEiLCAicHVzaCIsICJkZWZpbmVNZXRhZGF0YSIsICJFbmRpYW5uZXNzIiwgIkRhdGFUeXBlIiwgIl9hcmd1bWVudHNfIiwgInJlYWQiLCAiX3N0cmVhbSIsICJfZW5kaWFuIiwgIkVuZGlhbm5lc3MiLCAiQmlnIiwgIl9wYXJhbWV0ZXIiLCAid3JpdGUiLCAiX3ZhbHVlIiwgIk1hZ2ljQnVmZmVyIiwgIkJ1ZmZlciIsICJmcm9tIiwgIk1hZ2ljIiwgIkRhdGFUeXBlIiwgInJlYWQiLCAic3RyZWFtIiwgInJlYWRCdWZmZXIiLCAibGVuZ3RoIiwgIndyaXRlIiwgIndyaXRlQnVmZmVyIiwgIk1UVSIsICJEYXRhVHlwZSIsICJyZWFkIiwgInN0cmVhbSIsICJnZXRCdWZmZXIiLCAiYnl0ZUxlbmd0aCIsICJ3cml0ZSIsICJ2YWx1ZSIsICJ3cml0ZUJ1ZmZlciIsICJCdWZmZXIiLCAiYWxsb2MiLCAibGVuZ3RoIiwgIkFkZHJlc3MiLCAiRGF0YVR5cGUiLCAiYWRkcmVzcyIsICJwb3J0IiwgInZlcnNpb24iLCAiZnJvbUlkZW50aWZpZXIiLCAiaWRlbnRpZmllciIsICJmYW1pbHkiLCAid3JpdGUiLCAic3RyZWFtIiwgInZhbHVlIiwgIndyaXRlVWludDgiLCAiYWRkcmVzc0JpdHMiLCAic3BsaXQiLCAiYml0IiwgIk51bWJlciIsICJwYXJzZUludCIsICJ3cml0ZVVTaG9ydCIsICJ3cml0ZVVpbnQzMiIsICJhZGRyZXNzUGFydHMiLCAicGFydCIsICJudW0iLCAicmVhZCIsICJyZWFkVWludDgiLCAibWFwIiwgImJ5dGUiLCAidG9TdHJpbmciLCAiam9pbiIsICJyZWFkVVNob3J0IiwgInNraXAiLCAiaSIsICJwdXNoIiwgInBhZFN0YXJ0IiwgIkVuZGlhbm5lc3MiLCAiUGFja2V0IiwgIkJpdGZsYWdzIiwgIlByaW9yaXR5IiwgIlN0YXR1cyIsICJSZWxpYWJpbGl0eSIsICJGcmFtZSIsICJEYXRhVHlwZSIsICJyZWxpYWJpbGl0eSIsICJyZWxpYWJsZUluZGV4IiwgInNlcXVlbmNlSW5kZXgiLCAib3JkZXJJbmRleCIsICJvcmRlckNoYW5uZWwiLCAic3BsaXRTaXplIiwgInNwbGl0SWQiLCAic3BsaXRJbmRleCIsICJwYXlsb2FkIiwgImlzU3BsaXQiLCAiaXNSZWxpYWJsZSIsICJSZWxpYWJpbGl0eSIsICJSZWxpYWJsZSIsICJSZWxpYWJsZU9yZGVyZWQiLCAiUmVsaWFibGVTZXF1ZW5jZWQiLCAiUmVsaWFibGVXaXRoQWNrUmVjZWlwdCIsICJSZWxpYWJsZU9yZGVyZWRXaXRoQWNrUmVjZWlwdCIsICJpbmNsdWRlcyIsICJpc1NlcXVlbmNlZCIsICJVbnJlbGlhYmxlU2VxdWVuY2VkIiwgImlzT3JkZXJlZCIsICJpc09yZGVyRXhjbHVzaXZlIiwgImdldEJ5dGVMZW5ndGgiLCAiYnl0ZUxlbmd0aCIsICJyZWFkIiwgInN0cmVhbSIsICJmcmFtZXMiLCAiZnJhbWUiLCAiaGVhZGVyIiwgInJlYWRVaW50OCIsICJzcGxpdCIsICJCaXRmbGFncyIsICJTcGxpdCIsICJsZW5ndGgiLCAiTWF0aCIsICJjZWlsIiwgInJlYWRVaW50MTYiLCAicmVhZFVpbnQyNCIsICJFbmRpYW5uZXNzIiwgIkxpdHRsZSIsICJyZWFkVWludDMyIiwgInJlYWRCdWZmZXIiLCAicHVzaCIsICJjdXJzb3JBdEVuZCIsICJ3cml0ZSIsICJ2YWx1ZSIsICJ3cml0ZVVpbnQ4IiwgIndyaXRlVWludDE2IiwgIndyaXRlVWludDI0IiwgIndyaXRlVWludDMyIiwgIndyaXRlQnVmZmVyIiwgIlN5c3RlbUFkZHJlc3MiLCAiRGF0YVR5cGUiLCAiZnJvbUlkZW50aWZpZXIiLCAiaWRlbnRpZmllciIsICJBZGRyZXNzIiwgImFkZHJlc3MiLCAicG9ydCIsICJ2ZXJzaW9uIiwgInJlYWQiLCAic3RyZWFtIiwgImFkZHJlc3NlcyIsICJpbmRleCIsICJwdXNoIiwgIndyaXRlIiwgIkJpbmFyeVN0cmVhbSIsICJVaW50OCIsICJCYXNlUGFja2V0IiwgIkJpbmFyeVN0cmVhbSIsICJpZCIsICJpZF90eXBlIiwgIlVpbnQ4IiwgImZsdXNoIiwgImJpbmFyeSIsICJnZXRJZCIsICJFcnJvciIsICJnZXRJZFR5cGUiLCAic2VyaWFsaXplIiwgImRlc2VyaWFsaXplIiwgIkxvbmciLCAiVW5jb25uZWN0ZWRQaW5nIiwgIkJhc2VQYWNrZXQiLCAidGltZXN0YW1wIiwgIm1hZ2ljIiwgImNsaWVudCIsICJMb25nIiwgIlN0cmluZzE2IiwgIlVuY29ubmVjdGVkUG9uZyIsICJCYXNlUGFja2V0IiwgInRpbWVzdGFtcCIsICJndWlkIiwgIm1hZ2ljIiwgIm1lc3NhZ2UiLCAiVWludDgiLCAiT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSIsICJCYXNlUGFja2V0IiwgIm1hZ2ljIiwgInByb3RvY29sIiwgIm10dSIsICJMb25nIiwgIkJvb2wiLCAiU2hvcnQiLCAiT3BlbkNvbm5lY3Rpb25SZXBseTEiLCAiQmFzZVBhY2tldCIsICJtYWdpYyIsICJndWlkIiwgInNlY3VyaXR5IiwgIm10dSIsICJMb25nIiwgIlNob3J0IiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDIiLCAiQmFzZVBhY2tldCIsICJtYWdpYyIsICJhZGRyZXNzIiwgIm10dSIsICJjbGllbnQiLCAiTG9uZyIsICJCb29sIiwgIlNob3J0IiwgIk9wZW5Db25uZWN0aW9uUmVwbHkyIiwgIkJhc2VQYWNrZXQiLCAibWFnaWMiLCAiZ3VpZCIsICJhZGRyZXNzIiwgIm10dSIsICJlbmNyeXB0aW9uIiwgIkxvbmciLCAiQ29ubmVjdGVkUG9uZyIsICJCYXNlUGFja2V0IiwgInBpbmdUaW1lc3RhbXAiLCAidGltZXN0YW1wIiwgIkxvbmciLCAiQ29ubmVjdGVkUGluZyIsICJCYXNlUGFja2V0IiwgInRpbWVzdGFtcCIsICJMb25nIiwgIkNvbm5lY3Rpb25SZXF1ZXN0IiwgIkJhc2VQYWNrZXQiLCAiY2xpZW50IiwgInRpbWVzdGFtcCIsICJFbmRpYW5uZXNzIiwgIlVpbnQyNCIsICJGcmFtZVNldCIsICJCYXNlUGFja2V0IiwgInNlcXVlbmNlIiwgImZyYW1lcyIsICJMaXR0bGUiLCAiQmluYXJ5U3RyZWFtIiwgIkVuZGlhbm5lc3MiLCAiQWNrIiwgIkJhc2VQYWNrZXQiLCAic2VxdWVuY2VzIiwgInNlcmlhbGl6ZSIsICJ3cml0ZVVpbnQ4IiwgImlkIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAiY291bnQiLCAibGVuZ3RoIiwgInJlY29yZHMiLCAiY3Vyc29yIiwgInN0YXJ0IiwgImxhc3QiLCAiY3VycmVudCIsICJkaWZmIiwgIndyaXRlQm9vbCIsICJ3cml0ZVVpbnQyNCIsICJFbmRpYW5uZXNzIiwgIkxpdHRsZSIsICJ3cml0ZVVTaG9ydCIsICJ3cml0ZUJ1ZmZlciIsICJnZXRCdWZmZXIiLCAiZGVzZXJpYWxpemUiLCAicmVhZFVpbnQ4IiwgInJlY29yZENvdW50IiwgInJlYWRVU2hvcnQiLCAiaW5kZXgiLCAicmVhZEJvb2wiLCAicHVzaCIsICJyZWFkVWludDI0IiwgImVuZCIsICJCaW5hcnlTdHJlYW0iLCAiRW5kaWFubmVzcyIsICJOYWNrIiwgIkJhc2VQYWNrZXQiLCAic2VxdWVuY2VzIiwgInNlcmlhbGl6ZSIsICJ3cml0ZVVpbnQ4IiwgImlkIiwgInN0cmVhbSIsICJCaW5hcnlTdHJlYW0iLCAiY291bnQiLCAibGVuZ3RoIiwgInJlY29yZHMiLCAiY3Vyc29yIiwgInN0YXJ0IiwgImxhc3QiLCAiY3VycmVudCIsICJkaWZmIiwgIndyaXRlQm9vbCIsICJ3cml0ZVVpbnQyNCIsICJFbmRpYW5uZXNzIiwgIkxpdHRsZSIsICJ3cml0ZVVTaG9ydCIsICJ3cml0ZUJ1ZmZlciIsICJnZXRCdWZmZXIiLCAiZGVzZXJpYWxpemUiLCAicmVhZFVpbnQ4IiwgInJlY29yZENvdW50IiwgInJlYWRVU2hvcnQiLCAiaW5kZXgiLCAicmVhZEJvb2wiLCAicHVzaCIsICJyZWFkVWludDI0IiwgImVuZCIsICJEaXNjb25uZWN0IiwgIkJhc2VQYWNrZXQiLCAiVWludDgiLCAiVWludDY0IiwgIkluY29tcGF0aWJsZVByb3RvY29sVmVyc2lvbiIsICJCYXNlUGFja2V0IiwgInByb3RvY29sIiwgIm1hZ2ljIiwgImd1aWQiLCAiTG9uZyIsICJTaG9ydCIsICJDb25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkIiwgIkJhc2VQYWNrZXQiLCAiYWRkcmVzcyIsICJzeXN0ZW1JbmRleCIsICJzeXN0ZW1BZGRyZXNzIiwgInJlcXVlc3RUaW1lc3RhbXAiLCAidGltZXN0YW1wIiwgIkxvbmciLCAiTmV3SW5jb21pbmdDb25uZWN0aW9uIiwgIkJhc2VQYWNrZXQiLCAic2VydmVyQWRkcmVzcyIsICJpbnRlcm5hbEFkZHJlc3MiLCAiaW5jb21pbmdUaW1lc3RhbXAiLCAic2VydmVyVGltZXN0YW1wIiwgImNyZWF0ZVNvY2tldCIsICJFbWl0dGVyIiwgIkxvZ2dlciIsICJMb2dnZXJDb2xvcnMiLCAiUkFLTkVUX1BST1RPQ09MIiwgIlJBS05FVF9UUFMiLCAiUkFLTkVUX1RJQ0tfTEVOIiwgIlVEUF9IRUFERVJfU0laRSIsICJNSU5fTVRVX1NJWkUiLCAiTUFYX01UVV9TSVpFIiwgIkRHUkFNX0hFQURFUl9TSVpFIiwgIkRHUkFNX01UVV9PVkVSSEVBRCIsICJCaW5hcnlTdHJlYW0iLCAiQ29ubmVjdGlvbiIsICJzZXJ2ZXIiLCAic3RhdHVzIiwgIlN0YXR1cyIsICJDb25uZWN0aW5nIiwgImxhc3RVcGRhdGUiLCAiRGF0ZSIsICJub3ciLCAicmluZm8iLCAiZ3VpZCIsICJtdHUiLCAicmVjZWl2ZWRGcmFtZVNlcXVlbmNlcyIsICJTZXQiLCAibG9zdEZyYW1lU2VxdWVuY2VzIiwgImlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXgiLCAiZnJhZ21lbnRzUXVldWUiLCAiTWFwIiwgImlucHV0T3JkZXJJbmRleCIsICJpbnB1dE9yZGVyaW5nUXVldWUiLCAibGFzdElucHV0U2VxdWVuY2UiLCAib3V0cHV0T3JkZXJJbmRleCIsICJvdXRwdXRTZXF1ZW5jZUluZGV4IiwgIm91dHB1dEZyYW1lcyIsICJvdXRwdXRCYWNrdXAiLCAib3V0cHV0U2VxdWVuY2UiLCAib3V0cHV0c3BsaXRJbmRleCIsICJvdXRwdXRSZWxpYWJsZUluZGV4IiwgIkFycmF5IiwgImZyb20iLCAibGVuZ3RoIiwgImZpbGwiLCAiaW5kZXgiLCAic2V0IiwgInRpY2siLCAibG9nZ2VyIiwgIndhcm4iLCAiYWRkcmVzcyIsICJwb3J0IiwgImRpc2Nvbm5lY3QiLCAiRGlzY29ubmVjdGluZyIsICJEaXNjb25uZWN0ZWQiLCAic2l6ZSIsICJhY2siLCAiQWNrIiwgInNlcXVlbmNlcyIsICJzZXF1ZW5jZSIsICJkZWxldGUiLCAic2VuZCIsICJzZXJpYWxpemUiLCAibmFjayIsICJOYWNrIiwgInNlbmRRdWV1ZSIsICJEaXNjb25uZWN0IiwgImZyYW1lIiwgIkZyYW1lIiwgInJlbGlhYmlsaXR5IiwgIlJlbGlhYmlsaXR5IiwgIlJlbGlhYmxlT3JkZXJlZCIsICJvcmRlckNoYW5uZWwiLCAicGF5bG9hZCIsICJzZW5kRnJhbWUiLCAiUHJpb3JpdHkiLCAiSW1tZWRpYXRlIiwgImVtaXQiLCAiY29ubmVjdGlvbnMiLCAiaW5jb21pbmciLCAiYnVmZmVyIiwgImhlYWRlciIsICJpZCIsICJ0b1N0cmluZyIsICJkZWJ1ZyIsICJFcnJvciIsICJQYWNrZXQiLCAiQml0ZmxhZ3MiLCAiVmFsaWQiLCAiaGFuZGxlSW5jb21pbmdGcmFtZVNldCIsICJpbmNvbWluZ0JhdGNoIiwgIkNvbm5lY3Rpb25SZXF1ZXN0IiwgImhhbmRsZUluY29taW5nQ29ubmVjdGlvblJlcXVlc3QiLCAiTmV3SW5jb21pbmdDb25uZWN0aW9uIiwgIkNvbm5lY3RlZCIsICJDb25uZWN0ZWRQaW5nIiwgImhhbmRsZUluY29taW5nQ29ubmVjdGVkUGluZyIsICJkZXNlcmlhbGl6ZSIsICJoYXMiLCAiZnJhbWVzIiwgImdldCIsICJmcmFtZXNldCIsICJGcmFtZVNldCIsICJhZGQiLCAiaGFuZGxlRnJhbWUiLCAiaXNTcGxpdCIsICJoYW5kbGVGcmFnbWVudCIsICJpc1NlcXVlbmNlZCIsICJzZXF1ZW5jZUluZGV4IiwgIm9yZGVySW5kZXgiLCAiaXNPcmRlcmVkIiwgIm91dE9mT3JkZXJRdWV1ZSIsICJ1bm9yZGVyZWQiLCAic3BsaXRJZCIsICJmcmFnbWVudCIsICJzcGxpdEluZGV4IiwgInNwbGl0U2l6ZSIsICJzdHJlYW0iLCAiQmluYXJ5U3RyZWFtIiwgInNmcmFtZSIsICJ3cml0ZUJ1ZmZlciIsICJuZnJhbWUiLCAicmVsaWFibGVJbmRleCIsICJnZXRCdWZmZXIiLCAicHJpb3JpdHkiLCAiaXNPcmRlckV4Y2x1c2l2ZSIsICJtYXhTaXplIiwgIk1hdGgiLCAiY2VpbCIsICJieXRlTGVuZ3RoIiwgInN1YmFycmF5IiwgInF1ZXVlRnJhbWUiLCAiREdSQU1fSEVBREVSX1NJWkUiLCAiZ2V0Qnl0ZUxlbmd0aCIsICJER1JBTV9NVFVfT1ZFUkhFQUQiLCAiYW1vdW50IiwgInNsaWNlIiwgInJlcXVlc3QiLCAiYWNjZXB0ZWQiLCAiQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCIsICJBZGRyZXNzIiwgImZyb21JZGVudGlmaWVyIiwgInN5c3RlbUluZGV4IiwgInN5c3RlbUFkZHJlc3MiLCAicmVxdWVzdFRpbWVzdGFtcCIsICJ0aW1lc3RhbXAiLCAiQmlnSW50IiwgIk5vcm1hbCIsICJwaW5nIiwgInBvbmciLCAiQ29ubmVjdGVkUG9uZyIsICJwaW5nVGltZXN0YW1wIiwgIk9mZmxpbmUiLCAic2VydmVyIiwgImhhbmRsZSIsICJidWZmZXIiLCAicmluZm8iLCAiaGVhZGVyIiwgIkVycm9yIiwgIlBhY2tldCIsICJVbmNvbm5lY3RlZFBpbmciLCAidW5jb25uZWN0ZWRQaW5nIiwgIk9wZW5Db25uZWN0aW9uUmVxdWVzdDEiLCAib3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSIsICJPcGVuQ29ubmVjdGlvblJlcXVlc3QyIiwgIm9wZW5Db25uZWN0aW9uUmVxdWVzdDIiLCAiaWQiLCAidG9TdHJpbmciLCAibGVuZ3RoIiwgImxvZ2dlciIsICJkZWJ1ZyIsICJhZGRyZXNzIiwgInBvcnQiLCAicGluZyIsICJkZXNlcmlhbGl6ZSIsICJwb25nIiwgIlVuY29ubmVjdGVkUG9uZyIsICJ0aW1lc3RhbXAiLCAiZ3VpZCIsICJtZXNzYWdlIiwgInByb3RvY29sIiwgInZlcnNpb24iLCAiY29ubmVjdGlvbnMiLCAic2l6ZSIsICJtYXhDb25uZWN0aW9ucyIsICJqb2luIiwgInNlbmQiLCAic2VyaWFsaXplIiwgInJlcXVlc3QiLCAiUkFLTkVUX1BST1RPQ09MIiwgImluY29tcGF0aWJsZSIsICJJbmNvbXBhdGlibGVQcm90b2NvbFZlcnNpb24iLCAid2FybiIsICJyZXBseSIsICJPcGVuQ29ubmVjdGlvblJlcGx5MSIsICJzZWN1cml0eSIsICJtdHUiLCAiVURQX0hFQURFUl9TSVpFIiwgIm1heE10dVNpemUiLCAibWluTXR1U2l6ZSIsICJ2YWx1ZXMiLCAiZmluZCIsICJ4IiwgIk9wZW5Db25uZWN0aW9uUmVwbHkyIiwgIkFkZHJlc3MiLCAiZnJvbUlkZW50aWZpZXIiLCAiZW5jcnlwdGlvbiIsICJhZGQiLCAiQ29ubmVjdGlvbiIsICJjbGllbnQiLCAiRGVmYXVsdFJha25ldFNlcnZlclByb3BlcnRpZXMiLCAiYWRkcmVzcyIsICJwb3J0IiwgInByb3RvY29sIiwgIlJBS05FVF9QUk9UT0NPTCIsICJ2ZXJzaW9uIiwgIm1lc3NhZ2UiLCAibWF4Q29ubmVjdGlvbnMiLCAibXR1TWF4U2l6ZSIsICJNQVhfTVRVX1NJWkUiLCAibXR1TWluU2l6ZSIsICJNSU5fTVRVX1NJWkUiLCAiU2VydmVyIiwgIkVtaXR0ZXIiLCAiaW50ZXJ2YWwiLCAicHJvcGVydGllcyIsICJsb2dnZXIiLCAiTG9nZ2VyIiwgIkxvZ2dlckNvbG9ycyIsICJEYXJrQXF1YSIsICJzb2NrZXQiLCAiY3JlYXRlU29ja2V0IiwgImNvbm5lY3Rpb25zIiwgIlNldCIsICJndWlkIiwgIkJpZ0ludCIsICJNYXRoIiwgImZsb29yIiwgInJhbmRvbSIsICJ2YWx1ZSIsICJtYXhNdHVTaXplIiwgIm1pbk10dVNpemUiLCAiYWxpdmUiLCAib24iLCAiaGFuZGxlIiwgImJpbmQiLCAidW5yZWYiLCAiT2ZmbGluZSIsICJzZXJ2ZXIiLCAic3RhcnQiLCAic2hvdWxkVGljayIsICJ0aWNrIiwgIl9fbmFtZSIsICJzZXRUaW1lb3V0IiwgImNvbm5lY3Rpb24iLCAiUkFLTkVUX1RJQ0tfTEVOIiwgInN0b3AiLCAiZGlzY29ubmVjdCIsICJjbG9zZSIsICJlbWl0IiwgIkVycm9yIiwgImJ1ZmZlciIsICJyaW5mbyIsICJoZWFkZXIiLCAib2ZmbGluZSIsICJCaXRmbGFncyIsICJWYWxpZCIsICJ2YWx1ZXMiLCAiZmluZCIsICJ4IiwgImluY29taW5nIiwgInNlbmQiXQp9Cg==
|