@cloudflare/realtimekit 1.5.2-staging.1 → 1.5.2-staging.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ClientMock.cjs.js +2 -2
- package/dist/EncryptionManager.cjs.js +1 -1
- package/dist/EncryptionManager.d.ts +139 -356
- package/dist/EncryptionManager.es.js +58 -58
- package/dist/browser.js +12 -14
- package/dist/dependencies.txt +10 -10
- package/dist/index.cjs.js +8 -10
- package/dist/index.d.ts +148 -364
- package/dist/index.es.js +6630 -7380
- package/dist/index.es5.js +14641 -16256
- package/dist/index.rn.js +8 -10
- package/dist/ts3.4/dist/EncryptionManager.d.ts +135 -352
- package/dist/ts3.4/dist/index.d.ts +142 -359
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Gl=Object.defineProperty,ml=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var e=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,Yl=Object.prototype.propertyIsEnumerable;var z=(Z,d,l)=>d in Z?Gl(Z,d,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[d]=l,n=(Z,d)=>{for(var l in d||(d={}))pl.call(d,l)&&z(Z,l,d[l]);if(e)for(var l of e(d))Yl.call(d,l)&&z(Z,l,d[l]);return Z},Q=(Z,d)=>ml(Z,Rl(d));var R=(Z,d,l)=>(z(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var w=(Z,d,l)=>(B(Z,d,"read from private field"),l?l.call(Z):d.get(Z)),p=(Z,d,l)=>{if(d.has(Z))throw TypeError("Cannot add the same private member more than once");d instanceof WeakSet?d.add(Z):d.set(Z,l)};var Y=(Z,d,l)=>(B(Z,d,"access private method"),l);var J=(Z,d,l)=>new Promise((c,b)=>{var V=m=>{try{X(l.next(m))}catch(u){b(u)}},W=m=>{try{X(l.throw(m))}catch(u){b(u)}},X=m=>m.done?c(m.value):Promise.resolve(m.value).then(V,W);X((l=l.apply(Z,d)).next())});var L={},ul={get exports(){return L},set exports(Z){L=Z}},h=typeof Reflect=="object"?Reflect:null,M=h&&typeof h.apply=="function"?h.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},s;h&&typeof h.ownKeys=="function"?s=h.ownKeys:Object.getOwnPropertySymbols?s=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:s=function(d){return Object.getOwnPropertyNames(d)};function yl(Z){console&&console.warn&&console.warn(Z)}var P=Number.isNaN||function(d){return d!==d};function G(){G.init.call(this)}ul.exports=G;L.once=Nl;G.EventEmitter=G;G.prototype._events=void 0;G.prototype._eventsCount=0;G.prototype._maxListeners=void 0;var j=10;function K(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return j},set:function(Z){if(typeof Z!="number"||Z<0||P(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");j=Z}});G.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};G.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||P(d))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+d+".");return this._maxListeners=d,this};function O(Z){return Z._maxListeners===void 0?G.defaultMaxListeners:Z._maxListeners}G.prototype.getMaxListeners=function(){return O(this)};G.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",V=this._events;if(V!==void 0)b=b&&V.error===void 0;else if(!b)return!1;if(b){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var X=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw X.context=W,X}var m=V[d];if(m===void 0)return!1;if(typeof m=="function")M(m,this,l);else for(var u=m.length,y=_(m,u),c=0;c<u;++c)M(y[c],this,l);return!0};function f(Z,d,l,c){var b,V,W;if(K(l),V=Z._events,V===void 0?(V=Z._events=Object.create(null),Z._eventsCount=0):(V.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),V=Z._events),W=V[d]),W===void 0)W=V[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=V[d]=c?[l,W]:[W,l]:c?W.unshift(l):W.push(l),b=O(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=Z,X.type=d,X.count=W.length,yl(X)}return Z}G.prototype.addListener=function(d,l){return f(this,d,l,!1)};G.prototype.on=G.prototype.addListener;G.prototype.prependListener=function(d,l){return f(this,d,l,!0)};function hl(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function r(Z,d,l){var c={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},b=hl.bind(c);return b.listener=l,c.wrapFn=b,b}G.prototype.once=function(d,l){return K(l),this.on(d,r(this,d,l)),this};G.prototype.prependOnceListener=function(d,l){return K(l),this.prependListener(d,r(this,d,l)),this};G.prototype.removeListener=function(d,l){var c,b,V,W,X;if(K(l),b=this._events,b===void 0)return this;if(c=b[d],c===void 0)return this;if(c===l||c.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[d],b.removeListener&&this.emit("removeListener",d,c.listener||l));else if(typeof c!="function"){for(V=-1,W=c.length-1;W>=0;W--)if(c[W]===l||c[W].listener===l){X=c[W].listener,V=W;break}if(V<0)return this;V===0?c.shift():Jl(c,V),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,X||l)}return this};G.prototype.off=G.prototype.removeListener;G.prototype.removeAllListeners=function(d){var l,c,b;if(c=this._events,c===void 0)return this;if(c.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):c[d]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete c[d]),this;if(arguments.length===0){var V=Object.keys(c),W;for(b=0;b<V.length;++b)W=V[b],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=c[d],typeof l=="function")this.removeListener(d,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(d,l[b]);return this};function D(Z,d,l){var c=Z._events;if(c===void 0)return[];var b=c[d];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?il(b):_(b,b.length)}G.prototype.listeners=function(d){return D(this,d,!0)};G.prototype.rawListeners=function(d){return D(this,d,!1)};G.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};G.prototype.listenerCount=A;function A(Z){var d=this._events;if(d!==void 0){var l=d[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}G.prototype.eventNames=function(){return this._eventsCount>0?s(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function Jl(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function il(Z){for(var d=new Array(Z.length),l=0;l<d.length;++l)d[l]=Z[l].listener||Z[l];return d}function Nl(Z,d){return new Promise(function(l,c){function b(W){Z.removeListener(d,V),c(W)}function V(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,V,{once:!0}),d!=="error"&&al(Z,b,{once:!0})})}function al(Z,d,l){typeof Z.on=="function"&&q(Z,"error",d,l)}function q(Z,d,l,c){if(typeof Z.on=="function")c.once?Z.once(d,l):Z.on(d,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(d,function b(V){c.once&&Z.removeEventListener(d,b),l(V)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends L.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...c){return super.emit("*",l,...c),super.emit(l,...c)}on(l,c){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.on(l,c)}addListener(l,c){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.addListener(l,c)}off(l,c){return super.off(l,c)}once(l,c){return super.once(l,c)}prependListener(l,c){return super.prependListener(l,c)}prependOnceListener(l,c){return super.prependOnceListener(l,c)}removeListener(l,c){return super.removeListener(l,c)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function x(){return typeof window.RTCRtpScriptTransform!="undefined"}function sl(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function Ll(Z){return J(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function kl(){return sl()||x()}class Ul extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,c)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,c,b){const V={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,V),this.emit("setKey",V)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Il extends Ul{constructor(l={}){const c=Q(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield Ll(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var i=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(i||{});const ll="dmFyIHNhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuYT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgaWE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLG9hPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksY2E9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxkYT1SZWZsZWN0LmdldDt2YXIgRHQ9KF8sQSxNKT0+QSBpbiBfP3NhKF8sQSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6TX0pOl9bQV09TSxHPShfLEEpPT57Zm9yKHZhciBNIGluIEF8fChBPXt9KSlvYS5jYWxsKEEsTSkmJkR0KF8sTSxBW01dKTtpZihlcylmb3IodmFyIE0gb2YgZXMoQSkpY2EuY2FsbChBLE0pJiZEdChfLE0sQVtNXSk7cmV0dXJuIF99LFFlPShfLEEpPT5uYShfLGlhKEEpKTt2YXIgdT0oXyxBLE0pPT4oRHQoXyx0eXBlb2YgQSE9InN5bWJvbCI/QSsiIjpBLE0pLE0pLHRzPShfLEEsTSk9PntpZighQS5oYXMoXykpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitNKX07dmFyIFE9KF8sQSxNKT0+KHRzKF8sQSwicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxNP00uY2FsbChfKTpBLmdldChfKSksbHQ9KF8sQSxNKT0+e2lmKEEuaGFzKF8pKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO0EgaW5zdGFuY2VvZiBXZWFrU2V0P0EuYWRkKF8pOkEuc2V0KF8sTSl9LGZlPShfLEEsTSxvZSk9Pih0cyhfLEEsIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxvZT9vZS5jYWxsKF8sTSk6QS5zZXQoXyxNKSxNKTt2YXIgcnM9KF8sQSxNKT0+ZGEoYWEoXyksTSxBKTt2YXIgdz0oXyxBLE0pPT5uZXcgUHJvbWlzZSgob2UsdXQpPT57dmFyIHB0PXo9Pnt0cnl7Z2UoTS5uZXh0KHopKX1jYXRjaChtZSl7dXQobWUpfX0sVz16PT57dHJ5e2dlKE0udGhyb3coeikpfWNhdGNoKG1lKXt1dChtZSl9fSxnZT16PT56LmRvbmU/b2Uoei52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKHoudmFsdWUpLnRoZW4ocHQsVyk7Z2UoKE09TS5hcHBseShfLEEpKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7dmFyIFBlLFosZWU7InVzZSBzdHJpY3QiO2NvbnN0IF89IkFFUy1HQ00iLE09e2tleToxMCxkZWx0YTozLGF1ZGlvOjEsZW1wdHk6MH0sb2U9MTIscHQ9e3NoYXJlZEtleTohMSxyYXRjaGV0U2FsdDoiUmVhbHRpbWVLaXRGcmFtZUVuY3J5cHRpb25LZXkiLHJhdGNoZXRXaW5kb3dTaXplOjh9O3ZhciBXPXt9LGdlPXtnZXQgZXhwb3J0cygpe3JldHVybiBXfSxzZXQgZXhwb3J0cyhyKXtXPXJ9fSx6PXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0Ij9SZWZsZWN0Om51bGwsbWU9eiYmdHlwZW9mIHouYXBwbHk9PSJmdW5jdGlvbiI/ei5hcHBseTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxzKX0sSmU7eiYmdHlwZW9mIHoub3duS2V5cz09ImZ1bmN0aW9uIj9KZT16Lm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9KZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpfTpKZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCl9O2Z1bmN0aW9uIHNzKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBOdD1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT09dH07ZnVuY3Rpb24gTCgpe0wuaW5pdC5jYWxsKHRoaXMpfWdlLmV4cG9ydHM9TCxXLm9uY2U9b3MsTC5FdmVudEVtaXR0ZXI9TCxMLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxMLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxMLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgVnQ9MTA7ZnVuY3Rpb24gWGUocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShMLCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVnR9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im51bWJlciJ8fHI8MHx8TnQocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyKyIuIik7VnQ9cn19KSxMLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEwucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8TnQodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAibiIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyt0KyIuIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9O2Z1bmN0aW9uIEJ0KHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TC5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31MLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQnQodGhpcyl9LEwucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHM9MTtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWUucHVzaChhcmd1bWVudHNbc10pO3ZhciBuPXQ9PT0iZXJyb3IiLGk9dGhpcy5fZXZlbnRzO2lmKGkhPT12b2lkIDApbj1uJiZpLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIW4pcmV0dXJuITE7aWYobil7dmFyIGE7aWYoZS5sZW5ndGg+MCYmKGE9ZVswXSksYSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGE7dmFyIGQ9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoYT8iICgiK2EubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBkLmNvbnRleHQ9YSxkfXZhciBvPWlbdF07aWYobz09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIiltZShvLHRoaXMsZSk7ZWxzZSBmb3IodmFyIGg9by5sZW5ndGgsZz1IdChvLGgpLHM9MDtzPGg7KytzKW1lKGdbc10sdGhpcyxlKTtyZXR1cm4hMH07ZnVuY3Rpb24gRnQocix0LGUscyl7dmFyIG4saSxhO2lmKFhlKGUpLGk9ci5fZXZlbnRzLGk9PT12b2lkIDA/KGk9ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KGkubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoIm5ld0xpc3RlbmVyIix0LGUubGlzdGVuZXI/ZS5saXN0ZW5lcjplKSxpPXIuX2V2ZW50cyksYT1pW3RdKSxhPT09dm9pZCAwKWE9aVt0XT1lLCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2YgYT09ImZ1bmN0aW9uIj9hPWlbdF09cz9bZSxhXTpbYSxlXTpzP2EudW5zaGlmdChlKTphLnB1c2goZSksbj1CdChyKSxuPjAmJmEubGVuZ3RoPm4mJiFhLndhcm5lZCl7YS53YXJuZWQ9ITA7dmFyIGQ9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK1N0cmluZyh0KSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtkLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsZC5lbWl0dGVyPXIsZC50eXBlPXQsZC5jb3VudD1hLmxlbmd0aCxzcyhkKX1yZXR1cm4gcn1MLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMSl9LEwucHJvdG90eXBlLm9uPUwucHJvdG90eXBlLmFkZExpc3RlbmVyLEwucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMCl9O2Z1bmN0aW9uIG5zKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiB4dChyLHQsZSl7dmFyIHM9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTp0LGxpc3RlbmVyOmV9LG49bnMuYmluZChzKTtyZXR1cm4gbi5saXN0ZW5lcj1lLHMud3JhcEZuPW4sbn1MLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhlKGUpLHRoaXMub24odCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWGUoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCx4dCh0aGlzLHQsZSkpLHRoaXN9LEwucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHMsbixpLGEsZDtpZihYZShlKSxuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9blt0XSxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9PT1lfHxzLmxpc3RlbmVyPT09ZSktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxzLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil7Zm9yKGk9LTEsYT1zLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHNbYV09PT1lfHxzW2FdLmxpc3RlbmVyPT09ZSl7ZD1zW2FdLmxpc3RlbmVyLGk9YTticmVha31pZihpPDApcmV0dXJuIHRoaXM7aT09PTA/cy5zaGlmdCgpOmlzKHMsaSkscy5sZW5ndGg9PT0xJiYoblt0XT1zWzBdKSxuLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGR8fGUpfXJldHVybiB0aGlzfSxMLnByb3RvdHlwZS5vZmY9TC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsTC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHMsbjtpZihzPXRoaXMuX2V2ZW50cyxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHMucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpzW3RdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIHNbdF0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBpPU9iamVjdC5rZXlzKHMpLGE7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilhPWlbbl0sYSE9PSJyZW1vdmVMaXN0ZW5lciImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGEpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoZT1zW3RdLHR5cGVvZiBlPT0iZnVuY3Rpb24iKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUhPT12b2lkIDApZm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtuXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGp0KHIsdCxlKXt2YXIgcz1yLl9ldmVudHM7aWYocz09PXZvaWQgMClyZXR1cm5bXTt2YXIgbj1zW3RdO3JldHVybiBuPT09dm9pZCAwP1tdOnR5cGVvZiBuPT0iZnVuY3Rpb24iP2U/W24ubGlzdGVuZXJ8fG5dOltuXTplP2FzKG4pOkh0KG4sbi5sZW5ndGgpfUwucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4ganQodGhpcyx0LCEwKX0sTC5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBqdCh0aGlzLHQsITEpfSxMLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocix0KXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09ImZ1bmN0aW9uIj9yLmxpc3RlbmVyQ291bnQodCk6VXQuY2FsbChyLHQpfSxMLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVV0O2Z1bmN0aW9uIFV0KHIpe3ZhciB0PXRoaXMuX2V2ZW50cztpZih0IT09dm9pZCAwKXt2YXIgZT10W3JdO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiAxO2lmKGUhPT12b2lkIDApcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfUwucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9KZSh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBIdChyLHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscz0wO3M8dDsrK3MpZVtzXT1yW3NdO3JldHVybiBlfWZ1bmN0aW9uIGlzKHIsdCl7Zm9yKDt0KzE8ci5sZW5ndGg7dCsrKXJbdF09clt0KzFdO3IucG9wKCl9ZnVuY3Rpb24gYXMocil7Zm9yKHZhciB0PW5ldyBBcnJheShyLmxlbmd0aCksZT0wO2U8dC5sZW5ndGg7KytlKXRbZV09cltlXS5saXN0ZW5lcnx8cltlXTtyZXR1cm4gdH1mdW5jdGlvbiBvcyhyLHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHMpe2Z1bmN0aW9uIG4oYSl7ci5yZW1vdmVMaXN0ZW5lcih0LGkpLHMoYSl9ZnVuY3Rpb24gaSgpe3R5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT0iZnVuY3Rpb24iJiZyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbiksZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfUt0KHIsdCxpLHtvbmNlOiEwfSksdCE9PSJlcnJvciImJmNzKHIsbix7b25jZTohMH0pfSl9ZnVuY3Rpb24gY3Mocix0LGUpe3R5cGVvZiByLm9uPT0iZnVuY3Rpb24iJiZLdChyLCJlcnJvciIsdCxlKX1mdW5jdGlvbiBLdChyLHQsZSxzKXtpZih0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIilzLm9uY2U/ci5vbmNlKHQsZSk6ci5vbih0LGUpO2Vsc2UgaWYodHlwZW9mIHIuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIilyLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbiBuKGkpe3Mub25jZSYmci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiksZShpKX0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfXZhciBSOyhmdW5jdGlvbihyKXtyW3IuTUFKT1JfRVZFTlQ9MF09Ik1BSk9SX0VWRU5UIixyW3IuTUlOT1JfRVZFTlQ9MV09Ik1JTk9SX0VWRU5UIn0pKFJ8fChSPXt9KSk7dmFyIFM7KGZ1bmN0aW9uKHIpe3IuUFJFQ0FMTF9URVNUX0JFR0lOPSJwcmVjYWxsX2JlZ2luIixyLlBSRUNBTExfVEVTVF9DT01QTEVURT0icHJlY2FsbF9lbmQiLHIuQ0FMTF9KT0lOX0JFR0lOPSJjYWxsX2pvaW4iLHIuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTj0ibmV0X3F1YWxpdHlfdGVzdF9iZWdpbiIsci5ORVRfUVVBTElUWV9URVNUX0VORD0ibmV0X3F1YWxpdHlfdGVzdF9lbmQiLHIuV0VCU09DS0VUX0NPTk5FQ1RFRD0id2Vic29ja2V0X2Nvbm5lY3RlZCIsci5UUkFOU1BPUlRfQ09OTkVDVEVEPSJ0cmFuc3BvcnRfY29ubmVjdGVkIixyLkFVRElPX09OPSJhdWRpb19vbiIsci5BVURJT19PRkY9ImF1ZGlvX29mZiIsci5WSURFT19PTj0idmlkZW9fb24iLHIuVklERU9fT0ZGPSJ2aWRlb19vZmYiLHIuUEFSVElDSVBBTlRfUk9MRT0icGFydGljaXBhbnRfcm9sZSIsci5QSU5HX1NUQVQ9InBpbmdfc3RhdCIsci5ESVNDT05ORUNUPSJkaXNjb25uZWN0IixyLlJFQ09OTkVDVF9BVFRFTVBUPSJyZWNvbm5lY3RfYXR0ZW1wdCIsci5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQ9InNjcmVlbnNoYXJlX3N0YXJ0X3JlcXVlc3RlZCIsci5TQ1JFRU5TSEFSRV9TVEFSVEVEPSJzY3JlZW5zaGFyZV9zdGFydGVkIixyLlNDUkVFTlNIQVJFX1NUT1BQRUQ9InNjcmVlbnNoYXJlX3N0b3BwZWQiLHIuVEFCX0NIQU5HRT0idGFiX2NoYW5nZSIsci5CUk9XU0VSX0JBQ0tHUk9VTkRFRD0iYnJvd3Nlcl9iYWNrZ3JvdW5kZWQiLHIuQlJPV1NFUl9GT1JFR1JPVU5ERUQ9ImJyb3dzZXJfZm9yZWdyb3VuZGVkIixyLkRPTUlOQU5UX1NQRUFLRVI9ImRvbWluYW50X3NwZWFrZXIiLHIuQVVESU9fREVWSUNFU19VUERBVEVTPSJhdWRpb19kZXZpY2VzX3VwZGF0ZXMiLHIuVklERU9fREVWSUNFU19VUERBVEVTPSJ2aWRlb19kZXZpY2VzX3VwZGF0ZXMiLHIuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVM9InNwZWFrZXJfZGV2aWNlc191cGRhdGVzIixyLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFPSJzZWxlY3RlZF9taWNyb3Bob25lX3VwZGF0ZSIsci5TRUxFQ1RFRF9DQU1FUkFfVVBEQVRFPSJzZWxlY3RlZF9jYW1lcmFfdXBkYXRlIixyLlNFTEVDVEVEX1NQRUFLRVJfVVBEQVRFPSJzZWxlY3RlZF9zcGVha2VyX3VwZGF0ZSIsci5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OPSJleHBlY3RlZF92aWRlb19yZXNvbHV0aW9uIixyLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT049ImV4cGVjdGVkX3NjcmVlbnNoYXJlX3Jlc29sdXRpb24iLHIuTUVESUFfUEVSTUlTU0lPTj0ibWVkaWFfcGVybWlzc2lvbiIsci5MRUdBQ1lfU1dJVENIPSJsZWdhY3lfc3dpdGNoIixyLkFVRElPX1BMQVlfRkFJTEVEPSJhdWRpb19wbGF5X2ZhaWxlZCIsci5WSURFT19QTEFZX0ZBSUxFRD0idmlkZW9fcGxheV9mYWlsZWQiLHIuQVVESU9fVFJBQ0tfTVVURUQ9ImF1ZGlvX3RyYWNrX211dGVkIixyLlZJREVPX1RSQUNLX01VVEVEPSJ2aWRlb190cmFja19tdXRlZCIsci5JVlNfUExBWUVSX1JFQlVGRkVSSU5HPSJpdnNfcGxheWVyX3JlYnVmZmVyaW5nIixyLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRD0iaXZzX3BsYXllcl9hdWRpb19ibG9ja2VkIixyLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRD0iaXZzX3BsYXllcl9wbGF5YmFja19ibG9ja2VkIixyLklWU19QTEFZRVJfRVJST1I9Iml2c19wbGF5ZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUj0iaXZzX3BsYXllcl9yZWNvdmVyYWJsZV9lcnJvciIsci5JVlNfUExBWUVSX1dPUktFUl9FUlJPUj0iaXZzX3BsYXllcl93b3JrZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFPSJpdnNfcGxheWVyX25ldHdvcmtfdW5hdmFpbGFibGUiLHIuTElWRVNUUkVBTV9MQVRFTkNZPSJsaXZlc3RyZWFtX2xhdGVuY3kiLHIuSVZTX1BMQVlFUl9BTkFMWVRJQ1NfRVZFTlQ9Iml2c19wbGF5ZXJfYW5hbHl0aWNzX2V2ZW50IixyLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX3JhdGVfY2hhbmdlZCIsci5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRD0iaXZzX3BsYXllcl9xdWFsaXR5X2NoYW5nZWQiLHIuSVZTX1BMQVlFUl9JTklUSUFMSVpFRD0iaXZzX3BsYXllcl9pbml0aWFsaXplZCJ9KShTfHwoUz17fSkpO2NvbnN0IGRzPW5ldyBNYXAoW1tTLlBSRUNBTExfVEVTVF9CRUdJTixSLk1JTk9SX0VWRU5UXSxbUy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsUi5NSU5PUl9FVkVOVF0sW1MuQ0FMTF9KT0lOX0JFR0lOLFIuTUFKT1JfRVZFTlRdLFtTLk5FVF9RVUFMSVRZX1RFU1RfQkVHSU4sUi5NSU5PUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9FTkQsUi5NSU5PUl9FVkVOVF0sW1MuV0VCU09DS0VUX0NPTk5FQ1RFRCxSLk1JTk9SX0VWRU5UXSxbUy5UUkFOU1BPUlRfQ09OTkVDVEVELFIuTUFKT1JfRVZFTlRdLFtTLkFVRElPX09OLFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX09GRixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PTixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PRkYsUi5NSU5PUl9FVkVOVF0sW1MuUEFSVElDSVBBTlRfUk9MRSxSLk1JTk9SX0VWRU5UXSxbUy5QSU5HX1NUQVQsUi5NQUpPUl9FVkVOVF0sW1MuRElTQ09OTkVDVCxSLk1BSk9SX0VWRU5UXSxbUy5SRUNPTk5FQ1RfQVRURU1QVCxSLk1BSk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQsUi5NSU5PUl9FVkVOVF0sW1MuU0NSRUVOU0hBUkVfU1RBUlRFRCxSLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVE9QUEVELFIuTUlOT1JfRVZFTlRdLFtTLlRBQl9DSEFOR0UsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9CQUNLR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9GT1JFR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuRE9NSU5BTlRfU1BFQUtFUixSLk1JTk9SX0VWRU5UXSxbUy5BVURJT19ERVZJQ0VTX1VQREFURVMsUi5NSU5PUl9FVkVOVF0sW1MuVklERU9fREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuTUVESUFfUEVSTUlTU0lPTixSLk1JTk9SX0VWRU5UXSxbUy5MRUdBQ1lfU1dJVENILFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VELFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0VSUk9SLFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLFIuTUFKT1JfRVZFTlRdLFtTLkxJVkVTVFJFQU1fTEFURU5DWSxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0lOSVRJQUxJWkVELFIuTUlOT1JfRVZFTlRdLFtTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sUi5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTixSLk1JTk9SX0VWRU5UXV0pO2NsYXNzIGxze2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJldmVudHMiKTt0aGlzLmV2ZW50cz1bXX1hZGQodCl7dGhpcy5ldmVudHMucHVzaCh0KX1mbHVzaCgpe3JldHVybntlbnRyaWVzOnRoaXMuZXZlbnRzLnNwbGljZSgwLDI1KX19fWNsYXNzIHVzIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcih7bG9nZ2VyOmUscGVlcklkOnMsYXBpSG9zdG5hbWVzOm4sYXV0aFRva2VuOml9KXtzdXBlcigpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJwZWVySWQiKTt1KHRoaXMsImV2ZW50U3RvcmUiKTt1KHRoaXMsImFwaUVuZHBvaW50Iik7dSh0aGlzLCJhdXRoVG9rZW4iKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hdXRoVG9rZW49aSx0aGlzLmFwaUVuZHBvaW50PWBodHRwczovLyR7bi5kYUNvbGxlY3Rvcn0vYXBpL3YxL21lc3NhZ2VgLHRoaXMuZXZlbnRTdG9yZT1uZXcgbHN9c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9e3BheWxvYWQ6ZSxwZWVySWQ6dGhpcy5wZWVySWR9LG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoKSwzZTMpO3RyeXtyZXR1cm4geWllbGQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YH0sYm9keTpKU09OLnN0cmluZ2lmeShzKSxzaWduYWw6bi5zaWduYWx9KSwhMH1jYXRjaChhKXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXI6OmNhdGNoIix7cGVlcklkOnRoaXMucGVlcklkLGVuZHBvaW50OnRoaXMuYXBpRW5kcG9pbnQsZXJyb3I6YSBpbnN0YW5jZW9mIEVycm9yP2EubWVzc2FnZTpTdHJpbmcoYSksc3RhY2s6YSBpbnN0YW5jZW9mIEVycm9yP2Euc3RhY2s6dm9pZCAwfSksITF9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZHMuZ2V0KGUuZXZlbnQpPT09Ui5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7aWYoKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGgpe2NvbnN0IG49eWllbGQgdGhpcy5zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKTtyZXR1cm4gbnx8ZS5lbnRyaWVzLmZvckVhY2goaT0+e3RoaXMuZXZlbnRTdG9yZS5hZGQoaSl9KSxufXJldHVybiExfSl9fXZhciBXdDsoZnVuY3Rpb24ocil7ci5DSFJPTUlVTT0iY2hyb211bSIsci5GSVJFRk9YPSJmaXJlZm94IixyLlNBRkFSST0ic2FmYXJpIn0pKFd0fHwoV3Q9e30pKTtjb25zdCB6dD17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIFk7KGZ1bmN0aW9uKHIpe3IuQVVESU89IkFVRElPIixyLlZJREVPPSJWSURFTyIsci5TUEVBS0VSPSJTUEVBS0VSIixyLlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShZfHwoWT17fSkpO3ZhciAkdDsoZnVuY3Rpb24ocil7cltyLklOSVQ9MF09IklOSVQiLHJbci5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHJbci5ERU5JRUQ9Ml09IkRFTklFRCIscltyLlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHJbci5GQUlMRUQ9NF09IkZBSUxFRCIscltyLk5PVEZPVU5EPTVdPSJOT1RGT1VORCIscltyLk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KSgkdHx8KCR0PXt9KSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuIHI/ci5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIFplKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnR9KXtyZXR1cm4gdD4wP3IqMTAwL3Q6MH1mdW5jdGlvbiBldCh7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWNvbnN0IEd0PTI0MCxxdD03MjAsWXQ9OCxRdD0zLHR0PTEwLHJ0PS4wMixzdD0uMDM7ZnVuY3Rpb24gSih7c3RhdDpyLHdlaWdodDp0LHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiByPT1udWxsP3Q6ZT09PXM/bj09PSJVUCI/cjw9ZT90OjA6cj49cz90OjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyhyKSktZSwwKS8ocy1lKSkqdDpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnMocikpLWUsMCkvKHMtZSkqdDp0fWZ1bmN0aW9uIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpyLGlzVmlkZW9TdHVjazp0LGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHI/Ljg1OjEpKihlPy43OjEpKih0Py41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gWHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pe3JldHVybiB0PjA/cioxMDAvdDowfWZ1bmN0aW9uIFp0KHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnQsaml0dGVyOmV9KXtjb25zdCBuPUooe3N0YXQ6WHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pLHdlaWdodDouNyxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT1KKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBocyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTp0fSl7cmV0dXJuIHI8KHQ/UXQ6WXQpfWZ1bmN0aW9uIG1zKHtmcmFtZXNFbmNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZXIoe2ZyYW1lV2lkdGg6cixmcmFtZXNQZXJTZWNvbmQ6dCxwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDpYdCh7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDp0dCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89Sih7c3RhdDpuLHdlaWdodDoxLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1wcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6aX0pLGc9aHMoe2ZyYW1lc1BlclNlY29uZDp0LGlzU2NyZWVuU2hhcmU6aX0pLGI9bXMoe2ZyYW1lc0VuY29kZWQ6YSxpc1NjcmVlblNoYXJlOml9KTtyZXR1cm4gSnQoe2lzTG93UXVhbGl0eVZpZGVvOmgsaXNWaWRlb0xhZ2dpbmc6Zyxpc1ZpZGVvU3R1Y2s6YixqaXR0ZXJRdWFsaXR5Om8scGFja2V0c0xvc3RRdWFsaXR5OmR9KX1mdW5jdGlvbiB0cih7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWZ1bmN0aW9uIHJyKHtjb25jZWFsbWVudEV2ZW50czpyLHBhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmUsaml0dGVyOnN9KXtjb25zdCBpPUooe3N0YXQ6cix3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxkPUooe3N0YXQ6dHIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksaD1KKHtzdGF0OnMsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIGkrZCtofWZ1bmN0aW9uIGZzKHtmcmFtZXNEZWNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZ3Moe2ZyYW1lc1BlclNlY29uZDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1F0Oll0KX1mdW5jdGlvbiBTcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P3F0Okd0KX1mdW5jdGlvbiBzcih7ZnJhbWVXaWR0aDpyLGZyYW1lc1BlclNlY29uZDp0LHBhY2tldHNMb3N0OmUscGFja2V0c1JlY2VpdmVkOnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0RlY29kZWQ6YX0pe2NvbnN0IGQ9Sih7c3RhdDp0cih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6dHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPUooe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpydCxyYW5nZU1heDpzdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLGg9U3Moe2ZyYW1lV2lkdGg6cixpc1NjcmVlblNoYXJlOml9KSxnPWdzKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOml9KSxiPWZzKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpoLGlzVmlkZW9MYWdnaW5nOmcsaXNWaWRlb1N0dWNrOmIsaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpkfSl9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0KXt1KHRoaXMsInBjMSIpO3UodGhpcywicGMyIik7dSh0aGlzLCJjb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzIik7dSh0aGlzLCJjb25zdHJhaW5PZmZlclRvUmVtb3ZlVmlkZW9GZWMiLCExKTt1KHRoaXMsImljZUNhbmRpZGF0ZUZpbHRlciIpO2NvbnN0IGU9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpLHM9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpO3RoaXMucGMxPWUsdGhpcy5wYzI9cyx0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1YLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHQpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9dC5pbmRleE9mKGUpK2UubGVuZ3RoLG49dC5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHQpe3JldHVybiB0LnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdCh0KXtyZXR1cm4gdC50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHQpe3JldHVybiB0LnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZSh0KXtyZXR1cm4gdC50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIodCl7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUodCxlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1YLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnQuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHQpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXR9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz10fWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHQpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYodC5zZHA9dC5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksdC5zZHA9dC5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24odCksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24odCl9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbCh0KXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHQpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbdCxlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZih0LmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIG5yIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3UodGhpcywiY2FsbCIpO3UodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgWChlKX1zdGFydChlPTFlNCl7dGhpcy5jYWxsLmVzdGFibGlzaENvbm5lY3Rpb24oKSx0aGlzLnRpbWVPdXQ9c2V0VGltZW91dCh0aGlzLnRlc3RGYWlsZWQuYmluZCh0aGlzKSxlKX10ZXN0Q29tcGxldGUoZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCksdGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJkb25lIixlKX10ZXN0RmFpbGVkKGUpe3RoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZmFpbGVkIixlKX19Y29uc3QgeXM9OCx2cz0xLzFlMztjbGFzcyBicyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3UodGhpcywic2VuZGVyQ2hhbm5lbCIpO3UodGhpcywicmVjaWV2ZUNoYW5uZWwiKTt1KHRoaXMsInN0YXJ0VGltZSIpO3UodGhpcywibGFzdEJpdHJhdGVNZWFzdXJlVGltZSIpO3UodGhpcywic2VudFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJyZWNpZXZlZFBheWxvYWRCeXRlcyIsMCk7dSh0aGlzLCJsYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXMiLDApO3UodGhpcywic3RvcFNlbmRpbmciLCExKTt1KHRoaXMsInRlc3RQcm9ncmVzcyIsMCk7dSh0aGlzLCJzYW1wbGVQYWNrZXQiLCIiKTt1KHRoaXMsImZpbmFsQml0cmF0ZVN1bSIsMCk7dSh0aGlzLCJiaXRSYXRlU2FtcGVscyIsMCk7dSh0aGlzLCJtYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQiLDApO3UodGhpcywiYnl0ZXNUb0tlZXBCdWZmZXJlZCIsMCk7dSh0aGlzLCJ0ZXN0RHVyYXRpb25TZWNvbmRzIiw1KTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKFguaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqeXMvKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp2cyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGh0IGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IoZSxzPVgubm9GaWx0ZXIpe3N1cGVyKGUpO3UodGhpcywiY2gxIik7dSh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRXMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNIb3N0KX19Y2xhc3MgVHMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNSZWxheSl9fWNsYXNzIFJzIGV4dGVuZHMgaHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCxYLmlzUmVmbGV4aXZlKX19Y2xhc3MgUHN7Y29uc3RydWN0b3IoKXt1KHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDp0LGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxkO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGc9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zy5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWcsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD10ZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxnO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7dH1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChkPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmQuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9dGUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IGlyPW5ldyBQcyxhcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gb3Iocil7Y29uc3RbdCxlXT1yLnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHQpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcigpe3UodGhpcywidHJhbnNwb3J0Iik7dSh0aGlzLCJjYW5kaWRhdGVQYWlyIik7dSh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7dSh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTt1KHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTt1KHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTt1KHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgZHIgZXh0ZW5kcyBXe2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt1KHRoaXMsIm9ic2VydmVyIik7dSh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTt1KHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7dSh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7dSh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTt1KHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3UodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTt1KHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7dSh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3UodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTt1KHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3UodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7dSh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7dSh0aGlzLCJpcERldGFpbHMiKTt1KHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgV31yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsZDtjb25zdCBpPSgoZD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6ZC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGQ7Y29uc3QgaT0oKGQ9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmQuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGc7Y29uc3QgaT0oKGc9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmcuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmQsc2NyZWVuOm99PWksaD1hfHxkfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaCYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZoJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGQsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGQ9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmQuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChoLGcpPT5ofHxnLmF1ZGlvfHxnLnZpZGVvfHxnLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsZD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhZH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgcSwkLGllLGFlLENlLEllLHdlLGtlLE1lLF9lLEFlLExlLE9lO2NvbnN0IGQ9ZSxvPW5ldyBjcixoPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLGc9W10sYj1bXSxUPVtdLFY9bmV3IE1hcCxVPW5ldyBNYXA7Zm9yKGNvbnN0IG0gb2YgZC52YWx1ZXMoKSl7aWYoaCl7aWYoaC5zaXplPT09MClicmVhaztpZihoLmhhcyhtLnR5cGUpKW4mJmguZGVsZXRlKG0udHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2gobS50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e2cucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKG0pKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOntiLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1tLHtzZWxlY3RlZDpsfT1tLHY9bSxCPXtub21pbmF0ZWQ6YyE9bnVsbD9jOmwsY3VycmVudFJvdW5kVHJpcFRpbWU6di5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6di50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDp2LmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OnYuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTp2LmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6di5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOnYubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOnYubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDp2LmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6di5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDp2LmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OnYucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOnYucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6di5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtULnB1c2goQiksKG0ubm9taW5hdGVkPT09ITB8fG0uc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9Qik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPW07YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IGw9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PWwsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX1pZihhLmNvbnN1bWluZyl7Y29uc3Qgdj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCx2LGwpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9bSxsPXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCxsKTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQobS5pZCksdj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldChsKTtpZih2KXtpZih2Lmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQobCx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IHg9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KGwpO2lmKCgocT14PT1udWxsP3ZvaWQgMDp4LnRyYWNrKT09bnVsbD92b2lkIDA6cS5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXMobCl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KGwse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB5PXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBwPWMsSD1HKHtmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6cC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6cC5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZCxmcmFtZXNTZW50OnAuZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOnAua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpwLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpwLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpwLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OnAucGxpQ291bnQscXBTdW06cC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOnAucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpwLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOnAudGFyZ2V0Qml0cmF0ZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsUGFja2V0U2VuZERlbGF5LHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6cC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpwLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6cC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOnAucG93ZXJFZmZpY2llbnRFbmNvZGVyfSx5KTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHMobCxCLEgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBwPWMsSD1HKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LHkpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQobS5pZCxIKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldChsKS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhsLEIsSCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpYnJlYWs7Y29uc3QgYz1tLGw9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW2xdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3QgQj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMobS5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyhsKXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQobCx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB4PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IHk9YyxwPUcoe2ZyYW1lSGVpZ2h0OnkuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDp5LmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDp5LmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDp5LmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1JlY2VpdmVkOnkuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDp5LmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6eS5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246eS5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6eS5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTp5LnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOnkucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6eS50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6eS50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246eS50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTp5LnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246eS50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTp5LnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDp5LmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6eS5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2Rlcjp5LnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0seCk7cC5zY29yZT1zcih7ZnJhbWVXaWR0aDpwLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDoocC5mcmFtZXNEZWNvZGVkfHwwKS0oKCgkPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6JC5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChpZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoYWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDphZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKX0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OnAuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOnAuZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKENlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6Q2UucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChJZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkllLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgod2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDp3ZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKGwsQixwKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgeT1jLHA9Ryh7YXVkaW9MZXZlbDp5LmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczp5LmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6eS5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OnkudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjp5LnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOnkudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDp5LmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOnkuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjp5Lmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjp5LnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6eS5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDp5LnBsYXlvdXRJZH0seCk7cC5zY29yZT1ycih7Y29uY2VhbG1lbnRFdmVudHM6KHAuY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKGtlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6a2UuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoTWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpNZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKF9lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6X2UucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwfSksVS5zZXQobCx7c2NvcmU6KyhwLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOmV0KHtwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoQWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpBZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKExlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6cC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyhsKSxiaXRyYXRlOigocC5ieXRlc1JlY2VpdmVkfHwwKS0oKChPZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOk9lLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQobCxwKSxvLmluYm91bmRBdWRpb1J0cC5zZXQobS5pZCxwKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldChsKS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMobCxCLHApfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG0sYyk9Pnt2YXIgbCx2LEIseCx5LHAsSCxEZSxOZSxWZSxCZSxGZSx4ZSxqZSxVZSxIZSxLZSxXZSx6ZSwkZSxHZSxxZSxZZTtpZihtLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgRD1bXTttLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKE90PT57RC5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQoT3QpKX0pO2NvbnN0IGs9dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhEKTtrLnNjb3JlPWVyKHtmcmFtZVdpZHRoOmsuZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigobD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpsLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgodj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnYucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChCPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkIucGFja2V0c0xvc3QpfHwwKS0oKCh5PSh4PXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6eS5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KGsuZnJhbWVzRW5jb2RlZHx8MCktKCgocD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnAuZnJhbWVzRW5jb2RlZCl8fDApfSksVi5zZXQoYyx7c2NvcmU6KyhrLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6ay5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6ay5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoSD1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpILmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihrLnBhY2tldHNTZW50fHwwKS0oKChEZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkRlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoTmU9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6TmUucGFja2V0c0xvc3QpfHwwKS0oKChCZT0oVmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpWZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6QmUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChrLmJ5dGVzU2VudHx8MCktKCgoRmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpGZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOmsucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLGspfWVsc2UgaWYobS5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9by5vdXRib3VuZEF1ZGlvUnRwLmdldChtLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7RC5zY29yZT1adCh7cGFja2V0c1NlbnQ6KEQucGFja2V0c1NlbnR8fDApLSgoKHhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eGUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLSgoKEhlPShVZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlVlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKEtlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOktlLmppdHRlcil8fDB9KSxWLnNldChjLHtzY29yZTorKEQuc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoRC5ieXRlc1NlbnR8fDApLSgoKFdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6V2UuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh6ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoJGU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKS0oKChxZT0oR2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6cWUucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKFllPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlllLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsRCl9fSksVC5mb3JFYWNoKG09Pntjb25zdCBjPWcuZmluZCh2PT52LmlkPT09bS5sb2NhbENhbmRpZGF0ZUlkPyhtLmxvY2FsQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKSxsPWIuZmluZCh2PT52LmlkPT09bS5yZW1vdGVDYW5kaWRhdGVJZD8obS5yZW1vdGVDYW5kaWRhdGVJZD12LmlkLHYpOm51bGwpO2MmJihtLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsbS5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9dGUoYy5hZGRyZXNzKSxtLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsbS5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsbS5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxtLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxtLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9dGUoYy5yZWxhdGVkQWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLGwmJihtLnJlbW90ZUNhbmRpZGF0ZVR5cGU9bC50eXBlLG0ucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz10ZShsLmFkZHJlc3MpLG0ucmVtb3RlQ2FuZGlkYXRlUG9ydD1sLnBvcnQsbS5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD1sLnByb3RvY29sLG0ucmVtb3RlQ2FuZGlkYXRlVXJsPWwudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxkPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGQsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgaD17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZz1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobyksYj1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDpoLHByb2R1Y2VyUmVwb3J0OmcsY29uc3VtZXJSZXBvcnQ6Yn19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxkO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChkPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpkLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAoaD0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KGgpKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKGg9PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChoKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8YXJ9LG49bmV3IFByb21pc2UoKGcsYik9Pnt0cnl7Y29uc3QgVD1uZXcgRXMocyk7VC5hZGRMaXN0ZW5lcigiZG9uZSIsZyksVC5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2coe2Nvbm5lY3Rpdml0eTohMX0pfSksVC5zdGFydCgyZTMpfWNhdGNoKFQpe2IoVCl9fSksaT1uZXcgUHJvbWlzZSgoZyxiKT0+e3RyeXtjb25zdCBUPW5ldyBUcyhzKTtULmFkZExpc3RlbmVyKCJkb25lIixnKSxULmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zyh7Y29ubmVjdGl2aXR5OiExfSl9KSxULnN0YXJ0KDJlMyl9Y2F0Y2goVCl7YihUKX19KSxhPW5ldyBQcm9taXNlKChnLGIpPT57dHJ5e2NvbnN0IFQ9bmV3IFJzKHMpO1QuYWRkTGlzdGVuZXIoImRvbmUiLGcpLFQuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntnKHtjb25uZWN0aXZpdHk6ITF9KX0pLFQuc3RhcnQoMmUzKX1jYXRjaChUKXtiKFQpfX0pLFtkLG8saF09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6ZD09bnVsbD92b2lkIDA6ZC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOmg9PW51bGw/dm9pZCAwOmguY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGQ9e2ljZVNlcnZlcnM6ZXx8YXJ9LG89bmV3IGJzKGQpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGQpe2EoZCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIGlyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztpZihzKXtjb25zdCBoPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczpoLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihkPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6ZC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOmghPW51bGwmJmgubG9jP29yKGg9PW51bGw/dm9pZCAwOmgubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/b3IoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENzIGV4dGVuZHMgZHJ7fWNsYXNzIGxyIGV4dGVuZHMgZHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3UodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxkPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGR9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIHEsJCxpZSxhZSxDZSxJZSx3ZSxrZSxNZSxfZSxBZSxMZSxPZTtjb25zdCBkPWUsbz1uZXcgY3IsaD1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxnPVtdLGI9W10sVD1bXSxWPW5ldyBNYXAsVT1uZXcgTWFwO2Zvcihjb25zdCBtIG9mIGQudmFsdWVzKCkpe2lmKGgpe2lmKGguc2l6ZT09PTApYnJlYWs7aWYoaC5oYXMobS50eXBlKSluJiZoLmRlbGV0ZShtLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKG0udHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntnLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhtKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7Yi5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMobSkpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309bSx7c2VsZWN0ZWQ6bH09bSx2PW0sQj17bm9taW5hdGVkOmMhPW51bGw/YzpsLGN1cnJlbnRSb3VuZFRyaXBUaW1lOnYuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOnYudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6di5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDp2LmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6di5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOnYuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6di5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOnYucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6di5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDp2LnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDp2LnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOnYucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07VC5wdXNoKEIpLChtLm5vbWluYXRlZD09PSEwfHxtLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPUIpO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1tO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCBsPXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD1sLGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCB2PXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLHYsbCl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdixsKX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPW0sbD17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsbCk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhtLmlkKSlicmVhaztjb25zdCBjPW0sbD1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KG0uaWQpLHY9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQobCk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KGwse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBCPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW2xdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMobS5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCB4PXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldChsKTtpZigoKHE9eD09bnVsbD92b2lkIDA6eC50cmFjayk9PW51bGw/dm9pZCAwOnEucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKGwpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldChsLHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeT17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgcD1jLEg9Ryh7ZnJhbWVIZWlnaHQ6cC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOnAuZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOnAuZnJhbWVzRHJvcHBlZD9wLmZyYW1lc0Ryb3BwZWQ6cC5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZD9wLmZyYW1lc1BlclNlY29uZDpwLmZyYW1lcmF0ZU1lYW4sZnJhbWVzU2VudDpwLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpwLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6cC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246cC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6cC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpwLnBsaUNvdW50LHFwU3VtOnAucXBTdW0scXVhbGl0eUxpbWl0YXRpb25SZWFzb246cC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpwLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6cC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpwLnRvdGFsRW5jb2RlVGltZSx0b3RhbFBhY2tldFNlbmREZWxheTpwLnRvdGFsRW5jb2RlVGltZSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OnAucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6cC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOnAuc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpwLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0seSk7by5vdXRib3VuZFZpZGVvUnRwLnNldChtLmlkLEgpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KGwpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKG0uaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKGwsQixIKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgcD1jLEg9Ryh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpwLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OnAucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSx5KTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KG0uaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQobCkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHMobCxCLEgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKWJyZWFrO2NvbnN0IGM9bSxsPWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChtLmlkKSx2PXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KGwpO2lmKHYpe2lmKHYubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChsLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFtsXT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IEI9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbbF07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKG0uaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXMobCl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KGwse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeD17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCB5PWMscD1HKHtmcmFtZUhlaWdodDp5LmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6eS5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6eS5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6eS5mcmFtZXNEcm9wcGVkP3kuZnJhbWVzRHJvcHBlZDp5LmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVzUGVyU2Vjb25kP3kuZnJhbWVzUGVyU2Vjb25kOnkuZnJhbWVyYXRlTWVhbixmcmFtZXNSZWNlaXZlZDp5LmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6eS5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OnkuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOnkuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OnkucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6eS50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTp5LnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOnkudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOnkudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOnkudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6eS50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOnkudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6eS50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6eS5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OnkucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6eS5wb3dlckVmZmljaWVudERlY29kZXJ9LHgpO3Auc2NvcmU9c3Ioe2ZyYW1lV2lkdGg6cC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KHAuZnJhbWVzRGVjb2RlZHx8MCktKCgoJD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOiQuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDoocC5wYWNrZXRzTG9zdHx8MCktKCgoaWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDppZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDoocC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKGFlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6YWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCl9KSxVLnNldChsLHtzY29yZTorKHAuc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOnAuZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpwLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpwLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6ZXQoe3BhY2tldHNMb3N0OihwLnBhY2tldHNMb3N0fHwwKS0oKChDZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkNlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihwLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoSWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpJZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpwLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKGwpLGJpdHJhdGU6KChwLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKHdlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6d2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldChsLHApLG8uaW5ib3VuZFZpZGVvUnRwLnNldChtLmlkLHApLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KGwpLmluYm91bmRWaWRlb1J0cElkLnB1c2gobS5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhsLEIscCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IHk9YyxwPUcoe2F1ZGlvTGV2ZWw6eS5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6eS5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOnkuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTp5LnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246eS50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDp5LnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6eS5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDp5LmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246eS5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246eS5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOnkuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6eS5wbGF5b3V0SWR9LHgpO3Auc2NvcmU9cnIoe2NvbmNlYWxtZW50RXZlbnRzOihwLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKChrZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOmtlLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKE1lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6TWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChfZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOl9lLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpwLmppdHRlcnx8MH0pLFUuc2V0KGwse3Njb3JlOisocC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KHAucGFja2V0c0xvc3R8fDApLSgoKEFlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KGwpKT09bnVsbD92b2lkIDA6QWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KHAucGFja2V0c1JlY2VpdmVkfHwwKS0oKChMZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldChsKSk9PW51bGw/dm9pZCAwOkxlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOnAuaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXMobCksYml0cmF0ZTooKHAuYnl0ZXNSZWNlaXZlZHx8MCktKCgoT2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQobCkpPT1udWxsP3ZvaWQgMDpPZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KGwscCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KG0uaWQscCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQobCkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChtLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKGwsQixwKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChtLGMpPT57dmFyIGwsdixCLHgseSxwLEgsRGUsTmUsVmUsQmUsRmUseGUsamUsVWUsSGUsS2UsV2UsemUsJGUsR2UscWUsWWU7aWYobS5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IEQ9W107bS5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChPdD0+e0QucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KE90KSl9KTtjb25zdCBrPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoRCk7ay5zY29yZT1lcih7ZnJhbWVXaWR0aDprLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKGw9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6bC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KGsucGFja2V0c1NlbnR8fDApLSgoKHY9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp2LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoQj1rLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpCLnBhY2tldHNMb3N0KXx8MCktKCgoeT0oeD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOngucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnkucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihrLmZyYW1lc0VuY29kZWR8fDApLSgoKHA9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpwLmZyYW1lc0VuY29kZWQpfHwwKX0pLFYuc2V0KGMse3Njb3JlOisoay5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6ay5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmsuZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmsuZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKEg9ay5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooay5wYWNrZXRzU2VudHx8MCktKCgoRGU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpEZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKE5lPWsucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOk5lLnBhY2tldHNMb3N0KXx8MCktKCgoQmU9KFZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6VmUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkJlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoay5ieXRlc1NlbnR8fDApLSgoKEZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6RmUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczprLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6ay5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxrKX1lbHNlIGlmKG0ub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBEPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQobS5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO0Quc2NvcmU9WnQoe3BhY2tldHNTZW50OihELnBhY2tldHNTZW50fHwwKS0oKCh4ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnhlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoamU9RC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKS0oKChIZT0oVWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpVZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChLZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpLZS5qaXR0ZXIpfHwwfSksVi5zZXQoYyx7c2NvcmU6KyhELnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKEQuYnl0ZXNTZW50fHwwKS0oKChXZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooRC5wYWNrZXRzU2VudHx8MCktKCgoemU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp6ZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKCRlPUQucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCktKCgocWU9KEdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChZZT1ELnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpZZS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLEQpfX0pLFQuZm9yRWFjaChtPT57Y29uc3QgYz1nLmZpbmQodj0+di5pZD09PW0ubG9jYWxDYW5kaWRhdGVJZD8obS5sb2NhbENhbmRpZGF0ZUlkPXYuaWQsdik6bnVsbCksbD1iLmZpbmQodj0+di5pZD09PW0ucmVtb3RlQ2FuZGlkYXRlSWQ/KG0ucmVtb3RlQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKTtjJiYobS5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLG0ubG9jYWxDYW5kaWRhdGVBZGRyZXNzPXRlKGMuYWRkcmVzcyksbS5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LG0ubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLG0ubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsbS5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsbS5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPXRlKGMucmVsYXRlZEFkZHJlc3MpLG0ubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSxsJiYobS5yZW1vdGVDYW5kaWRhdGVUeXBlPWwudHlwZSxtLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9dGUobC5hZGRyZXNzKSxtLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9bC5wb3J0LG0ucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9bC5wcm90b2NvbCxtLnJlbW90ZUNhbmRpZGF0ZVVybD1sLnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IG09MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKGwsdik9PntsLnJvdW5kVHJpcFRpbWUmJmwucm91bmRUcmlwVGltZT5tJiYobT1sLnJvdW5kVHJpcFRpbWUsYz1sLnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW0sby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKG0pe31pZihWLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsVil9Y2F0Y2gobSl7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksZD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZz0+e2NvbnN0IGI9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChnKTtyZXR1cm4gYi5mcmFtZUhlaWdodHx8KGIuZnJhbWVIZWlnaHQ9ZC5oZWlnaHQsYi5mcmFtZVdpZHRoPWQud2lkdGgsYi5mcmFtZXNQZXJTZWNvbmQ9ZC5mcmFtZVJhdGUpLGJ9KSxoPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGc9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZykpfTtzLnB1c2goaCl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmQsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxoPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGc9Pntjb25zdCBUPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksVj1lLmluYm91bmRWaWRlb1J0cC5nZXQoZyk7cmV0dXJuIFYuZnJhbWVIZWlnaHR8fChWLmZyYW1lSGVpZ2h0PVQuaGVpZ2h0LFYuZnJhbWVXaWR0aD1ULndpZHRoLFYuZnJhbWVzUGVyU2Vjb25kPVQuZnJhbWVSYXRlKSxWfSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6ZCxhcHBEYXRhOm8sdmlkZW9TdGF0czpoLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZz0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGcpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyBJcyBleHRlbmRzIGxye31mdW5jdGlvbiBudChyLHQsZSxzKXtpZihyIT1udWxsJiZyLmxvZ2dlciYmci5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiB0KWUuY2FsbChudWxsLHMscik7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIHVyKHIsdCxlKXtjb25zdCBzPXIudmFsdWU7cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PntudCh0aGlzLHQsZSxhKX0pOml9Y2F0Y2goaSl7bnQodGhpcyx0LGUsaSl9cmV0dXJuIG51bGx9LHJ9Y29uc3QgST0ocix0KT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgZD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGQmJmQgaW5zdGFuY2VvZiBQcm9taXNlP2QuY2F0Y2gobz0+e250KHRoaXMscix0LG8pfSk6ZH1jYXRjaChkKXtudCh0aGlzLHIsdCxkKX1yZXR1cm4gbnVsbH0sbn0sd3M9KHIsdCk9PihlLHMsbik9PntpZihuKXJldHVybiB1cihuLHIsdCk7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSx1cihhLHIsdCkpfX07dmFyIFA9ZnVuY3Rpb24ocix0LGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz90OnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZShyLHQsZSxzKTtlbHNlIGZvcih2YXIgZD1yLmxlbmd0aC0xO2Q+PTA7ZC0tKShhPXJbZF0pJiYoaT0objwzP2EoaSk6bj4zP2EodCxlLGkpOmEodCxlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksaX07Y29uc3QgQz1jb25zb2xlO2xldCBFPWNsYXNzIGV4dGVuZHMgV3tjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49enQuUFJPRCxpLGEsZCxvLGgpe3N1cGVyKCk7dSh0aGlzLCJvYnNlcnZlciIpO3UodGhpcywiZXZlbnRIYW5kbGVyIik7dSh0aGlzLCJtZWFzdXJlbWVudHMiKTt1KHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3UodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7dSh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3UodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTt1KHRoaXMsImljZVNlcnZlcnMiKTt1KHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3UodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3UodGhpcywibG9nZ2VyIik7dSh0aGlzLCJlbnYiKTt1KHRoaXMsImFwaUhvc3RuYW1lcyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTt1KHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighaCl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1kLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1cyh7bG9nZ2VyOmEscGVlcklkOmQsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOmh9KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IGxyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgSXM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IFcsdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGcpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGcpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1ZLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PVkuVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09WS5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1ZLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1ZLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PVkuQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1ZLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09WS5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PVkuVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPVFlKEcoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89UWUoRyh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBkPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2QucHVzaChRZShHKHt9LG8pLHtuZXR3b3JrUmVzdWx0czpofSkpfX1jYXRjaChoKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsaCl9aSh7cmVnaW9uRGF0YTpkfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGQsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGQ9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmQubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBoPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZoP24ucHJvZHVjZXJSZXBvcnQ9aDoobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgaD15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmaD9pLmNvbnN1bWVyUmVwb3J0PWg6KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFAoW0koVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxQKFtJKFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUChbSShUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksRT1QKFt3cyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUpO3ZhciBrcz1FO2NsYXNzIHByIGV4dGVuZHMgV3tjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7dSh0aGlzLCJzdGF0cyIpO3UodGhpcywicGVlcklkIik7dSh0aGlzLCJiYWNrZW5kIik7dSh0aGlzLCJpY2VTZXJ2ZXJzIik7dSh0aGlzLCJpbml0aWFsaXplZCIsITEpO3UodGhpcywic3RhbGxlZCIsITEpO3UodGhpcywiaXBJbmZvcm1hdGlvbiIpO3UodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShUKXtyZXR1cm4gdyh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj16dC5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6ZCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczpoLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zz0hMSxhdXRoVG9rZW46Yn0pe3ZhciBWLFUscTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCFiKXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgaXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6aCxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcga3MoYSxzLG4sZCxvLGUsaCxiKSx0aGlzLmljZVNlcnZlcnM9aSwoVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKHE9KFU9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6VS5ldmVudEhhbmRsZXIpPT1udWxsfHxxLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGcpfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOiQgaW5zdGFuY2VvZiBFcnJvcj8kLm1lc3NhZ2U6U3RyaW5nKCQpLHN0YWNrOiQgaW5zdGFuY2VvZiBFcnJvcj8kLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsZCxvLGgsZyxiLFQsVixVLHE7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGQ9dGhpcy5iYWNrZW5kKT09bnVsbHx8ZC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihoPXRoaXMuYmFja2VuZCk9PW51bGx8fGguc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGc9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zy5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooYj10aGlzLmJhY2tlbmQpPT1udWxsfHxiLnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooVD10aGlzLmJhY2tlbmQpPT1udWxsfHxULnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooVj10aGlzLmJhY2tlbmQpPT1udWxsfHxWLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KHE9dGhpcy5iYWNrZW5kKT09bnVsbHx8cS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IHByKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtjbGFzcyBNc3tjb25zdHJ1Y3Rvcigpe2x0KHRoaXMsUGUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHQ7cmV0dXJuKHQ9USh0aGlzLFBlKSk9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQodCl7ZmUodGhpcyxQZSx0KX1pbmZvKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsdCxlLHMpfWVycm9yKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHQsZSxzKX1kZWJ1Zyh0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIix0LGUscyl9bG9nKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIix0LGUscyl9d2Fybih0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHQsZSxzKX19UGU9bmV3IFdlYWtNYXA7Y29uc3QgTHQ9Y2xhc3MgZXh0ZW5kcyBXLkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO2x0KHRoaXMsWix2b2lkIDApO2x0KHRoaXMsZWUsdm9pZCAwKTt1KHRoaXMsImFzeW5jUHJvbWlzZVRpbWVvdXQiKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7USh0aGlzLFopLnNldChlLFtdKTtjb25zdCBuPVEodGhpcyxlZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e1EodGhpcyxaKS5nZXQoZSkucHVzaChpKX0pKTtycyhMdC5wcm90b3R5cGUsdGhpcywiZW1pdCIpLmNhbGwodGhpcyxlLC4uLnMpLHlpZWxkIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwobiksbmV3IFByb21pc2UoKGksYSk9PnNldFRpbWVvdXQoKCk9PmEobmV3IEVycm9yKGBlbWl0QXN5bmMgZmFpbGVkIHRvIHJlc29sdmUgZm9yIGV2ZW50ICR7ZX0uYCkpLHRoaXMuYXN5bmNQcm9taXNlVGltZW91dCkpXSksUSh0aGlzLFopLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPVEodGhpcyxaKSxpPSguLi5hKT0+dyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2goaCl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOmh9KX1jb25zdCBkPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2Q9PW51bGx8fGQoKX0pO3JldHVybiBRKHRoaXMsZWUpLmdldChlKXx8USh0aGlzLGVlKS5zZXQoZSxbXSksUSh0aGlzLGVlKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7ZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgbXQ9THQ7Wj1uZXcgV2Vha01hcCxlZT1uZXcgV2Vha01hcDt2YXIgaXQsX3M9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIEFzKCl7aWYoIWl0JiYoaXQ9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWl0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGl0KF9zKX12YXIgTHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIE9zKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJkxzLnRlc3Qocil9Zm9yKHZhciBqPVtdLGZ0PTA7ZnQ8MjU2OysrZnQpai5wdXNoKChmdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIERzKHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLGU9KGpbclt0KzBdXStqW3JbdCsxXV0raltyW3QrMl1dK2pbclt0KzNdXSsiLSIraltyW3QrNF1dK2pbclt0KzVdXSsiLSIraltyW3QrNl1dK2pbclt0KzddXSsiLSIraltyW3QrOF1dK2pbclt0KzldXSsiLSIraltyW3QrMTBdXStqW3JbdCsxMV1dK2pbclt0KzEyXV0raltyW3QrMTNdXStqW3JbdCsxNF1dK2pbclt0KzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIU9zKGUpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIGV9ZnVuY3Rpb24gTnMocix0LGUpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8QXMpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsdCl7ZT1lfHwwO2Zvcih2YXIgbj0wO248MTY7KytuKXRbZStuXT1zW25dO3JldHVybiB0fXJldHVybiBEcyhzKX12YXIgVnM9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLGhyPVZzLEJzPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRnM9aHJ8fEJzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJlPUZzLHhzPXJlLlN5bWJvbCxhdD14cyxtcj1PYmplY3QucHJvdG90eXBlLGpzPW1yLmhhc093blByb3BlcnR5LFVzPW1yLnRvU3RyaW5nLFNlPWF0P2F0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBIcyhyKXt2YXIgdD1qcy5jYWxsKHIsU2UpLGU9cltTZV07dHJ5e3JbU2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49VXMuY2FsbChyKTtyZXR1cm4gcyYmKHQ/cltTZV09ZTpkZWxldGUgcltTZV0pLG59dmFyIEtzPU9iamVjdC5wcm90b3R5cGUsV3M9S3MudG9TdHJpbmc7ZnVuY3Rpb24genMocil7cmV0dXJuIFdzLmNhbGwocil9dmFyICRzPSJbb2JqZWN0IE51bGxdIixHcz0iW29iamVjdCBVbmRlZmluZWRdIixmcj1hdD9hdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24geWUocil7cmV0dXJuIHI9PW51bGw/cj09PXZvaWQgMD9HczokczpmciYmZnIgaW4gT2JqZWN0KHIpP0hzKHIpOnpzKHIpfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIHFzPUFycmF5LmlzQXJyYXksWXM9cXM7ZnVuY3Rpb24gZ3Iocil7dmFyIHQ9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJih0PT0ib2JqZWN0Inx8dD09ImZ1bmN0aW9uIil9dmFyIFFzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixKcz0iW29iamVjdCBGdW5jdGlvbl0iLFhzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBTcihyKXtpZighZ3IocikpcmV0dXJuITE7dmFyIHQ9eWUocik7cmV0dXJuIHQ9PUpzfHx0PT1Yc3x8dD09UXN8fHQ9PVpzfXZhciBlbj1yZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sU3Q9ZW4seXI9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKFN0JiZTdC5rZXlzJiZTdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIHRuKHIpe3JldHVybiEheXImJnlyIGluIHJ9dmFyIHJuPUZ1bmN0aW9uLnByb3RvdHlwZSxzbj1ybi50b1N0cmluZztmdW5jdGlvbiBjZShyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIHNuLmNhbGwocil9Y2F0Y2godCl7fXRyeXtyZXR1cm4gcisiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBubj0vW1xcXiQuKis/KClbXF17fXxdL2csYW49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sb249RnVuY3Rpb24ucHJvdG90eXBlLGNuPU9iamVjdC5wcm90b3R5cGUsZG49b24udG9TdHJpbmcsbG49Y24uaGFzT3duUHJvcGVydHksdW49UmVnRXhwKCJeIitkbi5jYWxsKGxuKS5yZXBsYWNlKG5uLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHBuKHIpe2lmKCFncihyKXx8dG4ocikpcmV0dXJuITE7dmFyIHQ9U3Iocik/dW46YW47cmV0dXJuIHQudGVzdChjZShyKSl9ZnVuY3Rpb24gaG4ocix0KXtyZXR1cm4gcj09bnVsbD92b2lkIDA6clt0XX1mdW5jdGlvbiB2ZShyLHQpe3ZhciBlPWhuKHIsdCk7cmV0dXJuIHBuKGUpP2U6dm9pZCAwfXZhciBtbj12ZShyZSwiV2Vha01hcCIpLHl0PW1uLGZuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gdnIocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIiYmcj4tMSYmciUxPT0wJiZyPD1mbn1mdW5jdGlvbiBnbihyKXtyZXR1cm4gciE9bnVsbCYmdnIoci5sZW5ndGgpJiYhU3Iocil9dmFyIFNuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24gYnIocil7dmFyIHQ9ciYmci5jb25zdHJ1Y3RvcixlPXR5cGVvZiB0PT0iZnVuY3Rpb24iJiZ0LnByb3RvdHlwZXx8U247cmV0dXJuIHI9PT1lfXZhciB5bj0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBFcihyKXtyZXR1cm4gZ3QocikmJnllKHIpPT15bn12YXIgVHI9T2JqZWN0LnByb3RvdHlwZSx2bj1Uci5oYXNPd25Qcm9wZXJ0eSxibj1Uci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFbj1FcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP0VyOmZ1bmN0aW9uKHIpe3JldHVybiBndChyKSYmdm4uY2FsbChyLCJjYWxsZWUiKSYmIWJuLmNhbGwociwiY2FsbGVlIil9LFRuPUVuO2Z1bmN0aW9uIFJuKCl7cmV0dXJuITF9dmFyIFJyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsUHI9UnImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQbj1QciYmUHIuZXhwb3J0cz09PVJyLENyPVBuP3JlLkJ1ZmZlcjp2b2lkIDAsQ249Q3I/Q3IuaXNCdWZmZXI6dm9pZCAwLEluPUNufHxSbix3bj1Jbixrbj0iW29iamVjdCBBcmd1bWVudHNdIixNbj0iW29iamVjdCBBcnJheV0iLF9uPSJbb2JqZWN0IEJvb2xlYW5dIixBbj0iW29iamVjdCBEYXRlXSIsTG49IltvYmplY3QgRXJyb3JdIixPbj0iW29iamVjdCBGdW5jdGlvbl0iLERuPSJbb2JqZWN0IE1hcF0iLE5uPSJbb2JqZWN0IE51bWJlcl0iLFZuPSJbb2JqZWN0IE9iamVjdF0iLEJuPSJbb2JqZWN0IFJlZ0V4cF0iLEZuPSJbb2JqZWN0IFNldF0iLHhuPSJbb2JqZWN0IFN0cmluZ10iLGpuPSJbb2JqZWN0IFdlYWtNYXBdIixVbj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEhuPSJbb2JqZWN0IERhdGFWaWV3XSIsS249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsV249IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsem49IltvYmplY3QgSW50OEFycmF5XSIsJG49IltvYmplY3QgSW50MTZBcnJheV0iLEduPSJbb2JqZWN0IEludDMyQXJyYXldIixxbj0iW29iamVjdCBVaW50OEFycmF5XSIsWW49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixRbj0iW29iamVjdCBVaW50MTZBcnJheV0iLEpuPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsTj17fTtOW0tuXT1OW1duXT1OW3puXT1OWyRuXT1OW0duXT1OW3FuXT1OW1luXT1OW1FuXT1OW0puXT0hMCxOW2tuXT1OW01uXT1OW1VuXT1OW19uXT1OW0huXT1OW0FuXT1OW0xuXT1OW09uXT1OW0RuXT1OW05uXT1OW1ZuXT1OW0JuXT1OW0ZuXT1OW3huXT1OW2puXT0hMTtmdW5jdGlvbiBYbihyKXtyZXR1cm4gZ3QocikmJnZyKHIubGVuZ3RoKSYmISFOW3llKHIpXX1mdW5jdGlvbiBabihyKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCl9fXZhciBJcj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLGJlPUlyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsZWk9YmUmJmJlLmV4cG9ydHM9PT1Jcix2dD1laSYmaHIucHJvY2Vzcyx0aT1mdW5jdGlvbigpe3RyeXt2YXIgcj1iZSYmYmUucmVxdWlyZSYmYmUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiByfHx2dCYmdnQuYmluZGluZyYmdnQuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksd3I9dGksa3I9d3ImJndyLmlzVHlwZWRBcnJheSxyaT1rcj9abihrcik6WG4sc2k9cmk7ZnVuY3Rpb24gbmkocix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIodChlKSl9fXZhciBpaT1uaShPYmplY3Qua2V5cyxPYmplY3QpLGFpPWlpLG9pPU9iamVjdC5wcm90b3R5cGUsY2k9b2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZGkocil7aWYoIWJyKHIpKXJldHVybiBhaShyKTt2YXIgdD1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHIpKWNpLmNhbGwocixlKSYmZSE9ImNvbnN0cnVjdG9yIiYmdC5wdXNoKGUpO3JldHVybiB0fXZhciBsaT12ZShyZSwiTWFwIiksYnQ9bGksdWk9dmUocmUsIkRhdGFWaWV3IiksRXQ9dWkscGk9dmUocmUsIlByb21pc2UiKSxUdD1waSxoaT12ZShyZSwiU2V0IiksUnQ9aGksTXI9IltvYmplY3QgTWFwXSIsbWk9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLEFyPSJbb2JqZWN0IFNldF0iLExyPSJbb2JqZWN0IFdlYWtNYXBdIixPcj0iW29iamVjdCBEYXRhVmlld10iLGZpPWNlKEV0KSxnaT1jZShidCksU2k9Y2UoVHQpLHlpPWNlKFJ0KSx2aT1jZSh5dCksZGU9eWU7KEV0JiZkZShuZXcgRXQobmV3IEFycmF5QnVmZmVyKDEpKSkhPU9yfHxidCYmZGUobmV3IGJ0KSE9TXJ8fFR0JiZkZShUdC5yZXNvbHZlKCkpIT1fcnx8UnQmJmRlKG5ldyBSdCkhPUFyfHx5dCYmZGUobmV3IHl0KSE9THIpJiYoZGU9ZnVuY3Rpb24ocil7dmFyIHQ9eWUociksZT10PT1taT9yLmNvbnN0cnVjdG9yOnZvaWQgMCxzPWU/Y2UoZSk6IiI7aWYocylzd2l0Y2gocyl7Y2FzZSBmaTpyZXR1cm4gT3I7Y2FzZSBnaTpyZXR1cm4gTXI7Y2FzZSBTaTpyZXR1cm4gX3I7Y2FzZSB5aTpyZXR1cm4gQXI7Y2FzZSB2aTpyZXR1cm4gTHJ9cmV0dXJuIHR9KTt2YXIgYmk9ZGUsRWk9IltvYmplY3QgTWFwXSIsVGk9IltvYmplY3QgU2V0XSIsUmk9T2JqZWN0LnByb3RvdHlwZSxQaT1SaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDaShyKXtpZihyPT1udWxsKXJldHVybiEwO2lmKGduKHIpJiYoWXMocil8fHR5cGVvZiByPT0ic3RyaW5nInx8dHlwZW9mIHIuc3BsaWNlPT0iZnVuY3Rpb24ifHx3bihyKXx8c2kocil8fFRuKHIpKSlyZXR1cm4hci5sZW5ndGg7dmFyIHQ9Ymkocik7aWYodD09RWl8fHQ9PVRpKXJldHVybiFyLnNpemU7aWYoYnIocikpcmV0dXJuIWRpKHIpLmxlbmd0aDtmb3IodmFyIGUgaW4gcilpZihQaS5jYWxsKHIsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb3Qocil7Y29uc3QgdD17fTtyZXR1cm4gdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJudW1iZXIiJiYodC5jb2RlPXIuY29kZSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJzdHJpbmciJiYodC5jb2RlPXIuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5uYW1lKT09InN0cmluZyImJih0Lm5hbWU9ci5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZihyPT1udWxsP3ZvaWQgMDpyLm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHQubWVzc2FnZT1yLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIucmVhc29uKT09InN0cmluZyImJih0LnJlYXNvbj1yLnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5zdGFjayk9PSJzdHJpbmciJiYodC5zdGFjaz1yLnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHR9ZnVuY3Rpb24gSWkoe3NlcnZpY2VQcmVmaXg6cixiYXNlVVJJOnR9KXtyZXR1cm5gJHtyfS4ke3R9YH1jb25zdCB3aT17bG9nczoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbG9ncy9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbW9jayIsZG9tYWluOiJtb2NrLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixhcHA6Imh0dHBzOi8vZXhhbXBsZXMucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9leGFtcGxlcy5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifSxiYXNlVVJJOntwcm9kOiJyZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoic3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9fTtmdW5jdGlvbiBEcihyKXt2YXIgcyxuLGk7Y29uc3QgdD10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChzPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6cy5pbmNsdWRlcyh3aS5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShuPXI9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOm4uZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiB0fHxlfWZ1bmN0aW9uIGtpKHIsdCl7dmFyIHM7Y29uc3QgZT0ocz1yPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKSk9PW51bGw/dm9pZCAwOnMubG9nTGV2ZWw7aWYoZT09PSJvZmYiKXJldHVybiExO2lmKGUhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHQudG9Mb3dlckNhc2UoKSksYT1uLmluZGV4T2YoZSk7aWYoaTxhKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE5yKHIsdCxlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXMocltzXSl8fHQmJigoKGk9dC5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj10P2Ake3R9LiR7c31gOnM7dHlwZW9mIHJbc109PSJvYmplY3QiP05yKHJbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgcltzXSkmJihlW25dPXJbc10pfSksZX1mdW5jdGlvbiBWcihyLHQsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxkPU5yKGEscyksbz1KU09OLnN0cmluZ2lmeShkKTtpZighKHQ9PW51bGw/dm9pZCAwOnQuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZz1gTG9nIG5hbWVkOiAiJHt0fSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBEcihyKSYmY29uc29sZS5lcnJvcihnLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihnKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPW90KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBNaT17IkFtYXpvbiBTaWxrIjoiYW1hem9uX3NpbGsiLCJBbmRyb2lkIEJyb3dzZXIiOiJhbmRyb2lkIixCYWRhOiJiYWRhIixCbGFja0JlcnJ5OiJibGFja2JlcnJ5IixDaHJvbWU6ImNocm9tZSIsQ2hyb21pdW06ImNocm9taXVtIixFbGVjdHJvbjoiZWxlY3Ryb24iLEVwaXBoYW55OiJlcGlwaGFueSIsRmlyZWZveDoiZmlyZWZveCIsRm9jdXM6ImZvY3VzIixHZW5lcmljOiJnZW5lcmljIiwiR29vZ2xlIFNlYXJjaCI6Imdvb2dsZV9zZWFyY2giLEdvb2dsZWJvdDoiZ29vZ2xlYm90IiwiSW50ZXJuZXQgRXhwbG9yZXIiOiJpZSIsIkstTWVsZW9uIjoia19tZWxlb24iLE1heHRob246Im1heHRob24iLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLFBoYW50b21KUzoicGhhbnRvbWpzIixQdWZmaW46InB1ZmZpbiIsUXVwWmlsbGE6InF1cHppbGxhIixRUToicXEiLFFRTGl0ZToicXFsaXRlIixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNlYU1vbmtleToic2VhbW9ua2V5IixTbGVpcG5pcjoic2xlaXBuaXIiLFN3aW5nOiJzd2luZyIsVGl6ZW46InRpemVuIiwiVUMgQnJvd3NlciI6InVjIixWaXZhbGRpOiJ2aXZhbGRpIiwiV2ViT1MgQnJvd3NlciI6IndlYm9zIixXZUNoYXQ6IndlY2hhdCIsIllhbmRleCBCcm93c2VyIjoieWFuZGV4IixSb2t1OiJyb2t1In0sQnI9e2FtYXpvbl9zaWxrOiJBbWF6b24gU2lsayIsYW5kcm9pZDoiQW5kcm9pZCBCcm93c2VyIixiYWRhOiJCYWRhIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixjaHJvbWU6IkNocm9tZSIsY2hyb21pdW06IkNocm9taXVtIixlbGVjdHJvbjoiRWxlY3Ryb24iLGVwaXBoYW55OiJFcGlwaGFueSIsZmlyZWZveDoiRmlyZWZveCIsZm9jdXM6IkZvY3VzIixnZW5lcmljOiJHZW5lcmljIixnb29nbGVib3Q6Ikdvb2dsZWJvdCIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsaWU6IkludGVybmV0IEV4cGxvcmVyIixrX21lbGVvbjoiSy1NZWxlb24iLG1heHRob246Ik1heHRob24iLGVkZ2U6Ik1pY3Jvc29mdCBFZGdlIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9wZXJhOiJPcGVyYSIsb3BlcmFfY29hc3Q6Ik9wZXJhIENvYXN0IixwaGFudG9tanM6IlBoYW50b21KUyIscHVmZmluOiJQdWZmaW4iLHF1cHppbGxhOiJRdXBaaWxsYSIscXE6IlFRIEJyb3dzZXIiLHFxbGl0ZToiUVEgQnJvd3NlciBMaXRlIixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xlaXBuaXI6IlNsZWlwbmlyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciJ9LEY9e3RhYmxldDoidGFibGV0Iixtb2JpbGU6Im1vYmlsZSIsZGVza3RvcDoiZGVza3RvcCIsdHY6InR2In0sSz17V2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIixXaW5kb3dzOiJXaW5kb3dzIixNYWNPUzoibWFjT1MiLGlPUzoiaU9TIixBbmRyb2lkOiJBbmRyb2lkIixXZWJPUzoiV2ViT1MiLEJsYWNrQmVycnk6IkJsYWNrQmVycnkiLEJhZGE6IkJhZGEiLFRpemVuOiJUaXplbiIsTGludXg6IkxpbnV4IixDaHJvbWVPUzoiQ2hyb21lIE9TIixQbGF5U3RhdGlvbjQ6IlBsYXlTdGF0aW9uIDQiLFJva3U6IlJva3UifSxzZT17RWRnZUhUTUw6IkVkZ2VIVE1MIixCbGluazoiQmxpbmsiLFRyaWRlbnQ6IlRyaWRlbnQiLFByZXN0bzoiUHJlc3RvIixHZWNrbzoiR2Vja28iLFdlYktpdDoiV2ViS2l0In07Y2xhc3MgZntzdGF0aWMgZ2V0Rmlyc3RNYXRjaCh0LGUpe2NvbnN0IHM9ZS5tYXRjaCh0KTtyZXR1cm4gcyYmcy5sZW5ndGg+MCYmc1sxXXx8IiJ9c3RhdGljIGdldFNlY29uZE1hdGNoKHQsZSl7Y29uc3Qgcz1lLm1hdGNoKHQpO3JldHVybiBzJiZzLmxlbmd0aD4xJiZzWzJdfHwiIn1zdGF0aWMgbWF0Y2hBbmRSZXR1cm5Db25zdCh0LGUscyl7aWYodC50ZXN0KGUpKXJldHVybiBzfXN0YXRpYyBnZXRXaW5kb3dzVmVyc2lvbk5hbWUodCl7c3dpdGNoKHQpe2Nhc2UiTlQiOnJldHVybiJOVCI7Y2FzZSJYUCI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMCI6cmV0dXJuIjIwMDAiO2Nhc2UiTlQgNS4xIjpyZXR1cm4iWFAiO2Nhc2UiTlQgNS4yIjpyZXR1cm4iMjAwMyI7Y2FzZSJOVCA2LjAiOnJldHVybiJWaXN0YSI7Y2FzZSJOVCA2LjEiOnJldHVybiI3IjtjYXNlIk5UIDYuMiI6cmV0dXJuIjgiO2Nhc2UiTlQgNi4zIjpyZXR1cm4iOC4xIjtjYXNlIk5UIDEwLjAiOnJldHVybiIxMCI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRNYWNPU1ZlcnNpb25OYW1lKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLGVbMF09PT0xMClzd2l0Y2goZVsxXSl7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59fXN0YXRpYyBnZXRBbmRyb2lkVmVyc2lvbk5hbWUodCl7Y29uc3QgZT10LnNwbGl0KCIuIikuc3BsaWNlKDAsMikubWFwKHM9PnBhcnNlSW50KHMsMTApfHwwKTtpZihlLnB1c2goMCksIShlWzBdPT09MSYmZVsxXTw1KSl7aWYoZVswXT09PTEmJmVbMV08NilyZXR1cm4iQ3VwY2FrZSI7aWYoZVswXT09PTEmJmVbMV0+PTYpcmV0dXJuIkRvbnV0IjtpZihlWzBdPT09MiYmZVsxXTwyKXJldHVybiJFY2xhaXIiO2lmKGVbMF09PT0yJiZlWzFdPT09MilyZXR1cm4iRnJveW8iO2lmKGVbMF09PT0yJiZlWzFdPjIpcmV0dXJuIkdpbmdlcmJyZWFkIjtpZihlWzBdPT09MylyZXR1cm4iSG9uZXljb21iIjtpZihlWzBdPT09NCYmZVsxXTwxKXJldHVybiJJY2UgQ3JlYW0gU2FuZHdpY2giO2lmKGVbMF09PT00JiZlWzFdPDQpcmV0dXJuIkplbGx5IEJlYW4iO2lmKGVbMF09PT00JiZlWzFdPj00KXJldHVybiJLaXRLYXQiO2lmKGVbMF09PT01KXJldHVybiJMb2xsaXBvcCI7aWYoZVswXT09PTYpcmV0dXJuIk1hcnNobWFsbG93IjtpZihlWzBdPT09NylyZXR1cm4iTm91Z2F0IjtpZihlWzBdPT09OClyZXR1cm4iT3JlbyI7aWYoZVswXT09PTkpcmV0dXJuIlBpZSJ9fXN0YXRpYyBnZXRWZXJzaW9uUHJlY2lzaW9uKHQpe3JldHVybiB0LnNwbGl0KCIuIikubGVuZ3RofXN0YXRpYyBjb21wYXJlVmVyc2lvbnModCxlLHM9ITEpe2NvbnN0IG49Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKHQpLGk9Zi5nZXRWZXJzaW9uUHJlY2lzaW9uKGUpO2xldCBhPU1hdGgubWF4KG4saSksZD0wO2NvbnN0IG89Zi5tYXAoW3QsZV0saD0+e2NvbnN0IGc9YS1mLmdldFZlcnNpb25QcmVjaXNpb24oaCksYj1oK25ldyBBcnJheShnKzEpLmpvaW4oIi4wIik7cmV0dXJuIGYubWFwKGIuc3BsaXQoIi4iKSxUPT5uZXcgQXJyYXkoMjAtVC5sZW5ndGgpLmpvaW4oIjAiKStUKS5yZXZlcnNlKCl9KTtmb3IocyYmKGQ9YS1NYXRoLm1pbihuLGkpKSxhLT0xO2E+PWQ7KXtpZihvWzBdW2FdPm9bMV1bYV0pcmV0dXJuIDE7aWYob1swXVthXT09PW9bMV1bYV0pe2lmKGE9PT1kKXJldHVybiAwO2EtPTF9ZWxzZSBpZihvWzBdW2FdPG9bMV1bYV0pcmV0dXJuLTF9fXN0YXRpYyBtYXAodCxlKXtjb25zdCBzPVtdO2xldCBuO2lmKEFycmF5LnByb3RvdHlwZS5tYXApcmV0dXJuIEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0LGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKz0xKXMucHVzaChlKHRbbl0pKTtyZXR1cm4gc31zdGF0aWMgZmluZCh0LGUpe2xldCBzLG47aWYoQXJyYXkucHJvdG90eXBlLmZpbmQpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kLmNhbGwodCxlKTtmb3Iocz0wLG49dC5sZW5ndGg7czxuO3MrPTEpe2NvbnN0IGk9dFtzXTtpZihlKGkscykpcmV0dXJuIGl9fXN0YXRpYyBhc3NpZ24odCwuLi5lKXtjb25zdCBzPXQ7bGV0IG4saTtpZihPYmplY3QuYXNzaWduKXJldHVybiBPYmplY3QuYXNzaWduKHQsLi4uZSk7Zm9yKG49MCxpPWUubGVuZ3RoO248aTtuKz0xKXtjb25zdCBhPWVbbl07dHlwZW9mIGE9PSJvYmplY3QiJiZhIT09bnVsbCYmT2JqZWN0LmtleXMoYSkuZm9yRWFjaChvPT57c1tvXT1hW29dfSl9cmV0dXJuIHR9c3RhdGljIGdldEJyb3dzZXJBbGlhcyh0KXtyZXR1cm4gTWlbdF19c3RhdGljIGdldEJyb3dzZXJUeXBlQnlBbGlhcyh0KXtyZXR1cm4gQnJbdF18fCIifX1jb25zdCBPPS92ZXJzaW9uXC8oXGQrKFwuP18/XGQrKSspL2ksX2k9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ikdvb2dsZWJvdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9nb29nbGVib3RcLyhcZCsoXC5cZCspKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NWkJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTVogQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNWkJyb3dzZXIpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZm9jdXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRm9jdXMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86Zm9jdXMpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc3dpbmcvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU3dpbmcifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86c3dpbmcpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY29hc3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEgQ29hc3QifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmNvYXN0KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29wdFwvXGQrKD86Lj9fP1xkKykrL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik9wZXJhIFRvdWNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om9wdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsveWFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IllhbmRleCBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnlhYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdWNicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlVDIEJyb3dzZXIifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnVjYnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9NYXh0aG9ufG14aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1heHRob24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/Ok1heHRob258bXhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZXBpcGhhbnkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRXBpcGhhbnkifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmVwaXBoYW55KVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3B1ZmZpbi9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQdWZmaW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OnB1ZmZpbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zbGVpcG5pci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTbGVpcG5pciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvKD86c2xlaXBuaXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvay1tZWxlb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiSy1NZWxlb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaChPLHIpfHxmLmdldEZpcnN0TWF0Y2goLyg/OmstbWVsZW9uKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21pY3JvbWVzc2VuZ2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IldlQ2hhdCJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzptaWNyb21lc3NlbmdlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXFicm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6L3FxYnJvd3NlcmxpdGUvaS50ZXN0KHIpPyJRUSBCcm93c2VyIExpdGUiOiJRUSBCcm93c2VyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OnFxYnJvd3NlcmxpdGV8cXFicm93c2VyKVsvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvbXNpZXx0cmlkZW50L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkludGVybmV0IEV4cGxvcmVyIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/Om1zaWUgfHJ2OikoXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvXHNlZGdcLy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNaWNyb3NvZnQgRWRnZSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9cc2VkZ1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VkZyhbZWFdfGlvcykvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWYuZ2V0U2Vjb25kTWF0Y2goL2VkZyhbZWFdfGlvcylcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy92aXZhbGRpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlZpdmFsZGkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvdml2YWxkaVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NlYW1vbmtleS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTZWFNb25rZXkifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2VhbW9ua2V5XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2FpbGZpc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FpbGZpc2gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2FpbGZpc2hccz9icm93c2VyXC8oXGQrKFwuXGQrKT8pL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2lsay9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJBbWF6b24gU2lsayJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC9zaWxrXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGhhbnRvbS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQaGFudG9tSlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvcGhhbnRvbWpzXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2xpbWVyanMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xpbWVySlMifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvc2xpbWVyanNcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9ibGFja2JlcnJ5fFxiYmJcZCsvaSwvcmltXHN0YWJsZXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQmxhY2tCZXJyeSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVtcZF0rXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKHdlYnxocHcpW28wXXMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiV2ViT1MgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scil8fGYuZ2V0Rmlyc3RNYXRjaCgvdyg/OmViKT9bbzBdc2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkJhZGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvZG9sZmluXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvdGl6ZW4vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiVGl6ZW4ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86dGl6ZW5ccz8pP2Jyb3dzZXJcLyhcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcXVwemlsbGEvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUXVwWmlsbGEifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86cXVwemlsbGEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGYuZ2V0Rmlyc3RNYXRjaChPLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkZpcmVmb3gifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZmlyZWZveHxpY2V3ZWFzZWx8Znhpb3MpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvZWxlY3Ryb24vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRWxlY3Ryb24ifSxlPWYuZ2V0Rmlyc3RNYXRjaCgvKD86ZWxlY3Ryb24pXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTWl1aUJyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWl1aSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpNaXVpQnJvd3NlcilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9jaHJvbWl1bS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaHJvbWl1bSJ9LGU9Zi5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWl1bSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKXx8Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvY2hyb21lfGNyaW9zfGNybW8vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQ2hyb21lIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OmNocm9tZXxjcmlvc3xjcm1vKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL0dTQS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHb29nbGUgU2VhcmNoIn0sZT1mLmdldEZpcnN0TWF0Y2goLyg/OkdTQSlcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD0hci50ZXN0KC9saWtlIGFuZHJvaWQvaSksZT1yLnRlc3QoL2FuZHJvaWQvaSk7cmV0dXJuIHQmJmV9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkFuZHJvaWQgQnJvd3NlciJ9LGU9Zi5nZXRGaXJzdE1hdGNoKE8scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvcGxheXN0YXRpb24gNC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQbGF5U3RhdGlvbiA0In0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zYWZhcml8YXBwbGV3ZWJraXQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2FmYXJpIn0sZT1mLmdldEZpcnN0TWF0Y2goTyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy8uKi9pXSxkZXNjcmliZShyKXtjb25zdCB0PS9eKC4qKVwvKC4qKSAvLGU9L14oLiopXC8oLiopWyBcdF1cKCguKikvLG49ci5zZWFyY2goIlxcKCIpIT09LTE/ZTp0O3JldHVybntuYW1lOmYuZ2V0Rmlyc3RNYXRjaChuLHIpLHZlcnNpb246Zi5nZXRTZWNvbmRNYXRjaChuLHIpfX19XTt2YXIgQWk9W3t0ZXN0OlsvUm9rdVwvRFZQL10sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL1Jva3VcL0RWUC0oXGQrXC5cZCspL2kscik7cmV0dXJue25hbWU6Sy5Sb2t1LHZlcnNpb246dH19fSx7dGVzdDpbL3dpbmRvd3MgcGhvbmUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL3dpbmRvd3MgcGhvbmUgKD86b3MpP1xzPyhcZCsoXC5cZCspKikvaSxyKTtyZXR1cm57bmFtZTpLLldpbmRvd3NQaG9uZSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy93aW5kb3dzIC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvV2luZG93cyAoKE5UfFhQKSggXGRcZD8uXGQpPykvaSxyKSxlPWYuZ2V0V2luZG93c1ZlcnNpb25OYW1lKHQpO3JldHVybntuYW1lOksuV2luZG93cyx2ZXJzaW9uOnQsdmVyc2lvbk5hbWU6ZX19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Sy5pT1N9LGU9Zi5nZXRTZWNvbmRNYXRjaCgvKFZlcnNpb25cLykoXGRbXGQuXSspLyxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9tYWNpbnRvc2gvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL21hYyBvcyB4IChcZCsoXC4/Xz9cZCspKykvaSxyKS5yZXBsYWNlKC9bX1xzXS9nLCIuIiksZT1mLmdldE1hY09TVmVyc2lvbk5hbWUodCkscz17bmFtZTpLLk1hY09TLHZlcnNpb246dH07cmV0dXJuIGUmJihzLnZlcnNpb25OYW1lPWUpLHN9fSx7dGVzdDpbLyhpcG9kfGlwaG9uZXxpcGFkKS9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvb3MgKFxkKyhbX1xzXVxkKykqKSBsaWtlIG1hYyBvcyB4L2kscikucmVwbGFjZSgvW19cc10vZywiLiIpO3JldHVybntuYW1lOksuaU9TLHZlcnNpb246dH19fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksciksZT1mLmdldEFuZHJvaWRWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuQW5kcm9pZCx2ZXJzaW9uOnR9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHIpLGU9e25hbWU6Sy5XZWJPU307cmV0dXJuIHQmJnQubGVuZ3RoJiYoZS52ZXJzaW9uPXQpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kscil8fGYuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHIpfHxmLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHIpO3JldHVybntuYW1lOksuQmxhY2tCZXJyeSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2kscik7cmV0dXJue25hbWU6Sy5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuVGl6ZW4sdmVyc2lvbjp0fX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpLLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Sy5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZShyKXtjb25zdCB0PWYuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuUGxheVN0YXRpb240LHZlcnNpb246dH19fV0sTGk9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ImJvdCIsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9Zi5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSxyKSYmIk5vdmEiLGU9e3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gdCYmKGUubW9kZWw9dCksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudGFibGV0fX19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXIudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD1mLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxyKTtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDp0fX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvW14tXW1vYmkvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmxhY2tiZXJyeSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGUsdmVuZG9yOiJCbGFja0JlcnJ5In19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0iYmFkYSJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5tb2JpbGV9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0QnJvd3Nlck5hbWUoKT09PSJ3aW5kb3dzIHBob25lIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZSx2ZW5kb3I6Ik1pY3Jvc29mdCJ9fX0se3Rlc3Qocil7Y29uc3QgdD1OdW1iZXIoU3RyaW5nKHIuZ2V0T1NWZXJzaW9uKCkpLnNwbGl0KCIuIilbMF0pO3JldHVybiByLmdldE9TTmFtZSghMCk9PT0iYW5kcm9pZCImJnQ+PTN9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50YWJsZXR9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09Im1hY29zIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3AsdmVuZG9yOiJBcHBsZSJ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJ3aW5kb3dzIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTpGLmRlc2t0b3B9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJsaW51eCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri5kZXNrdG9wfX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0icGxheXN0YXRpb24gNCJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6Ri50dn19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09InJva3UifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOkYudHZ9fX1dLE9pPVt7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSghMCk9PT0ibWljcm9zb2Z0IGVkZ2UifSxkZXNjcmliZShyKXtpZigvXHNlZGdcLy9pLnRlc3QocikpcmV0dXJue25hbWU6c2UuQmxpbmt9O2NvbnN0IGU9Zi5nZXRGaXJzdE1hdGNoKC9lZGdlXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJue25hbWU6c2UuRWRnZUhUTUwsdmVyc2lvbjplfX19LHt0ZXN0OlsvdHJpZGVudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOnNlLlRyaWRlbnR9LGU9Zi5nZXRGaXJzdE1hdGNoKC90cmlkZW50XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe3JldHVybiByLnRlc3QoL3ByZXN0by9pKX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5QcmVzdG99LGU9Zi5nZXRGaXJzdE1hdGNoKC9wcmVzdG9cLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Qocil7Y29uc3QgdD1yLnRlc3QoL2dlY2tvL2kpLGU9ci50ZXN0KC9saWtlIGdlY2tvL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5HZWNrb30sZT1mLmdldEZpcnN0TWF0Y2goL2dlY2tvXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvKGFwcGxlKT93ZWJraXRcLzUzN1wuMzYvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpzZS5CbGlua319fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuV2ViS2l0fSxlPWYuZ2V0Rmlyc3RNYXRjaCgvd2Via2l0XC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19XTtjbGFzcyBGcntjb25zdHJ1Y3Rvcih0LGU9ITEpe2lmKHQ9PW51bGx8fHQ9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlVzZXJBZ2VudCBwYXJhbWV0ZXIgY2FuJ3QgYmUgZW1wdHkiKTt0aGlzLl91YT10LHRoaXMucGFyc2VkUmVzdWx0PXt9LGUhPT0hMCYmdGhpcy5wYXJzZSgpfWdldFVBKCl7cmV0dXJuIHRoaXMuX3VhfXRlc3QodCl7cmV0dXJuIHQudGVzdCh0aGlzLl91YSl9cGFyc2VCcm93c2VyKCl7dGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj17fTtjb25zdCB0PWYuZmluZChfaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyfWdldEJyb3dzZXIoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQuYnJvd3Nlcj90aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyOnRoaXMucGFyc2VCcm93c2VyKCl9Z2V0QnJvd3Nlck5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0QnJvd3NlcigpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0QnJvd3NlcigpLm5hbWV8fCIifWdldEJyb3dzZXJWZXJzaW9uKCl7cmV0dXJuIHRoaXMuZ2V0QnJvd3NlcigpLnZlcnNpb259Z2V0T1MoKXtyZXR1cm4gdGhpcy5wYXJzZWRSZXN1bHQub3M/dGhpcy5wYXJzZWRSZXN1bHQub3M6dGhpcy5wYXJzZU9TKCl9cGFyc2VPUygpe3RoaXMucGFyc2VkUmVzdWx0Lm9zPXt9O2NvbnN0IHQ9Zi5maW5kKEFpLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoZS50ZXN0IGluc3RhbmNlb2YgQXJyYXkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQub3M9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUodCl7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUodD0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCB0PWYuZmluZChMaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQucGxhdGZvcm19Z2V0RW5naW5lKCl7cmV0dXJuIHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT90aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU6dGhpcy5wYXJzZUVuZ2luZSgpfWdldEVuZ2luZU5hbWUodCl7cmV0dXJuIHQ/U3RyaW5nKHRoaXMuZ2V0RW5naW5lKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRFbmdpbmUoKS5uYW1lfHwiIn1wYXJzZUVuZ2luZSgpe3RoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT17fTtjb25zdCB0PWYuZmluZChPaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKGUudGVzdCBpbnN0YW5jZW9mIEFycmF5KXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZT10LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LmVuZ2luZX1wYXJzZSgpe3JldHVybiB0aGlzLnBhcnNlQnJvd3NlcigpLHRoaXMucGFyc2VPUygpLHRoaXMucGFyc2VQbGF0Zm9ybSgpLHRoaXMucGFyc2VFbmdpbmUoKSx0aGlzfWdldFJlc3VsdCgpe3JldHVybiBmLmFzc2lnbih7fSx0aGlzLnBhcnNlZFJlc3VsdCl9c2F0aXNmaWVzKHQpe2NvbnN0IGU9e307bGV0IHM9MDtjb25zdCBuPXt9O2xldCBpPTA7aWYoT2JqZWN0LmtleXModCkuZm9yRWFjaChkPT57Y29uc3Qgbz10W2RdO3R5cGVvZiBvPT0ic3RyaW5nIj8obltkXT1vLGkrPTEpOnR5cGVvZiBvPT0ib2JqZWN0IiYmKGVbZF09byxzKz0xKX0pLHM+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhlKSxvPWYuZmluZChkLGc9PnRoaXMuaXNPUyhnKSk7aWYobyl7Y29uc3QgZz10aGlzLnNhdGlzZmllcyhlW29dKTtpZihnIT09dm9pZCAwKXJldHVybiBnfWNvbnN0IGg9Zi5maW5kKGQsZz0+dGhpcy5pc1BsYXRmb3JtKGcpKTtpZihoKXtjb25zdCBnPXRoaXMuc2F0aXNmaWVzKGVbaF0pO2lmKGchPT12b2lkIDApcmV0dXJuIGd9fWlmKGk+MCl7Y29uc3QgZD1PYmplY3Qua2V5cyhuKSxvPWYuZmluZChkLGg9PnRoaXMuaXNCcm93c2VyKGgsITApKTtpZihvIT09dm9pZCAwKXJldHVybiB0aGlzLmNvbXBhcmVWZXJzaW9uKG5bb10pfX1pc0Jyb3dzZXIodCxlPSExKXtjb25zdCBzPXRoaXMuZ2V0QnJvd3Nlck5hbWUoKS50b0xvd2VyQ2FzZSgpO2xldCBuPXQudG9Mb3dlckNhc2UoKTtjb25zdCBpPWYuZ2V0QnJvd3NlclR5cGVCeUFsaWFzKG4pO3JldHVybiBlJiZpJiYobj1pLnRvTG93ZXJDYXNlKCkpLG49PT1zfWNvbXBhcmVWZXJzaW9uKHQpe2xldCBlPVswXSxzPXQsbj0hMTtjb25zdCBpPXRoaXMuZ2V0QnJvd3NlclZlcnNpb24oKTtpZih0eXBlb2YgaT09InN0cmluZyIpcmV0dXJuIHRbMF09PT0iPiJ8fHRbMF09PT0iPCI/KHM9dC5zdWJzdHIoMSksdFsxXT09PSI9Ij8obj0hMCxzPXQuc3Vic3RyKDIpKTplPVtdLHRbMF09PT0iPiI/ZS5wdXNoKDEpOmUucHVzaCgtMSkpOnRbMF09PT0iPSI/cz10LnN1YnN0cigxKTp0WzBdPT09In4iJiYobj0hMCxzPXQuc3Vic3RyKDEpKSxlLmluZGV4T2YoZi5jb21wYXJlVmVyc2lvbnMoaSxzLG4pKT4tMX1pc09TKHQpe3JldHVybiB0aGlzLmdldE9TTmFtZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc1BsYXRmb3JtKHQpe3JldHVybiB0aGlzLmdldFBsYXRmb3JtVHlwZSghMCk9PT1TdHJpbmcodCkudG9Mb3dlckNhc2UoKX1pc0VuZ2luZSh0KXtyZXR1cm4gdGhpcy5nZXRFbmdpbmVOYW1lKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzKHQsZT0hMSl7cmV0dXJuIHRoaXMuaXNCcm93c2VyKHQsZSl8fHRoaXMuaXNPUyh0KXx8dGhpcy5pc1BsYXRmb3JtKHQpfXNvbWUodD1bXSl7cmV0dXJuIHQuc29tZShlPT50aGlzLmlzKGUpKX19LyohCiAqIEJvd3NlciAtIGEgYnJvd3NlciBkZXRlY3RvcgogKiBodHRwczovL2dpdGh1Yi5jb20vbGFuY2VkaWtzb24vYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIERpe3N0YXRpYyBnZXRQYXJzZXIodCxlPSExKXtpZih0eXBlb2YgdCE9InN0cmluZyIpdGhyb3cgbmV3IEVycm9yKCJVc2VyQWdlbnQgc2hvdWxkIGJlIGEgc3RyaW5nIik7cmV0dXJuIG5ldyBGcih0LGUpfXN0YXRpYyBwYXJzZSh0KXtyZXR1cm4gbmV3IEZyKHQpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQnJ9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIHNlfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEt9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIEZ9fWNvbnN0IEVlPSJjaHJvbWUiLHhyPSJvcGVyYSIsanI9ImZpcmVmb3giLFVyPSJpZXhwbG9yZXIiLEhyPSJzYWZhcmkiLEtyPSJud2pzIixXcj0iZWxlY3Ryb24iLHpyPSJyZWFjdC1uYXRpdmUiLFB0PSJ1bmtub3duIixjdD17Q2hyb21lOkVlLENocm9taXVtOkVlLE9wZXJhOnhyLEZpcmVmb3g6anIsIkludGVybmV0IEV4cGxvcmVyIjpVcixTYWZhcmk6SHJ9O2Z1bmN0aW9uIE5pKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcix0PXtuYW1lOlB0LHZlcnNpb246dm9pZCAwfTtpZihyLm1hdGNoKC9DaHJvbWUvKSYmIXIubWF0Y2goL0VkZ2UvKSlpZihyLm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9ci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHQubmFtZT1FZSx0LnZlcnNpb249ZSl9ZWxzZSB0Lm5hbWU9RWUsdC52ZXJzaW9uPXIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gdH1mdW5jdGlvbiBWaSgpe2NvbnN0e3VzZXJBZ2VudDpyfT1uYXZpZ2F0b3I7aWYoci5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3QgdD1yLm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTpXcix2ZXJzaW9uOnR9fXJldHVybiBudWxsfWZ1bmN0aW9uIEJpKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcjtpZihyLm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCB0PXIubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOktyLHZlcnNpb246dH19fWZ1bmN0aW9uIEZpKCl7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgdDtpZihyfHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHImJnIubGVuZ3RoPjImJihyWzFdLHQ9clsyXSksdHx8KHQ9InVua25vd24iKSx7bmFtZTp6cix2ZXJzaW9uOnR9fWZ1bmN0aW9uIHhpKHIpe2xldCB0O2NvbnN0IGU9W0ZpLFZpLEJpXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYodD1lW25dKCksdClyZXR1cm4gdDtjb25zdCBzPXIuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBjdD97bmFtZTpjdFtzXSx2ZXJzaW9uOnIuZ2V0QnJvd3NlclZlcnNpb24oKX06KHQ9TmkoKSx0fHx7bmFtZTpQdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIGppe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJfYm93c2VyIik7dSh0aGlzLCJfbmFtZSIpO3UodGhpcywiX3ZlcnNpb24iKTt1KHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHQpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPURpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2YgdD09InVuZGVmaW5lZCIpe2NvbnN0IG49eGkodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHQubmFtZSBpbiBjdD8oZT1jdFt0Lm5hbWVdLHM9dC52ZXJzaW9uKTooZT1QdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUVlfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhyfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09anJ9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVyfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Icn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtyfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdyfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpyfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24odCl7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyh0KX1pc1ZlcnNpb25HcmVhdGVyVGhhbih0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7dH1gfSl9aXNWZXJzaW9uTGVzc1RoYW4odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3R9YH0pfWlzVmVyc2lvbkVxdWFsVG8odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3R9YH0pfX1jbGFzcyBVaSBleHRlbmRzIGppe2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3QgdD1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCwiKiIsW3RdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZSh0PT50Lm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUodD0+dC5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHQubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQodC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgSGk9bmV3IFVpO2NsYXNzIEtpe2NvbnN0cnVjdG9yKCl7dSh0aGlzLCJsb2dzQ2FjaGUiLFtdKTt1KHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3UodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3UodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTt1KHRoaXMsImluaXRpYWxpemVkIiwhMSk7dSh0aGlzLCJsb2dMZXZlbCIsImxvZyIpO3UodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTt1KHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3UodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9aXNDb21wcmVzc2lvblN1cHBvcnRlZCgpe2lmKHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9PT1udWxsKXRyeXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSE9InVuZGVmaW5lZCImJnR5cGVvZiBCbG9iIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IucHJvdG90eXBlLnN0cmVhbT09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlc3BvbnNlIT0idW5kZWZpbmVkIn1jYXRjaCh0KXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPSExLHRoaXMuYWRkTG9nSW5DdXJyZW50U3Bhbigid2FybiIsIkNvbXByZXNzaW9uIGZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxlZCwgdXNpbmcgdW5jb21wcmVzc2VkIGxvZ3MiLHtlcnJvcjp0fSl9cmV0dXJuIHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWR9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHQ9VGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7SWkoe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTp0LmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1nZXQgbG9nc0JhdGNoU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKT81MDoyNX1yZXNldFBlZXJJZCh0KXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9dH1pbml0KHQsZSxzLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSxuJiYodGhpcy5sb2dMZXZlbD1uKSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBpPXQuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1pLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249dC5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6YX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/YT09bnVsbD92b2lkIDA6YS5nZXREZXZpY2VJbmZvKCk6SGkuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZSh0LGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe2NvbnN0IGg9dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIWh8fCFoLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IWgudHJhY2luZ0VuYWJsZWQpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHQsZSk7Y29uc3QgZz1wZXJmb3JtYW5jZS5ub3coKSxiPWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpLnRoZW4oKCk9Pntjb25zdCBUPXBlcmZvcm1hbmNlLm5vdygpO1QtZz4xMCYmaC5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHt0fV90aW1pbmdgLHtleGVjVGltZTpULWd9KX0pLmNhdGNoKCgpPT57Y29uc3QgVD1wZXJmb3JtYW5jZS5ub3coKTtoLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3R9X3RpbWluZ2Ase2V4ZWNUaW1lOlQtZ30pfSksYn0saX19aW5qZWN0Q29udGV4dCh0KXt2YXIgbjtjb25zdCBlPU5zKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7dC5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHQsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6b3Qocy5lcnJvcil9KTtjb25zdCBpPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihEcihpKSYmKENpKHMpP2NvbnNvbGVbdF0oIkludGVybmFsTG9nczo6ICIsdCxlKTpjb25zb2xlW3RdKCJJbnRlcm5hbExvZ3M6OiAiLHQsZSxzKSksISFraShpLHQpKXRyeXtjb25zdCBkPVZyKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsaD1RZShHKHttZXNzYWdlOmUsbGV2ZWw6dH0sZCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFtoXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChoKX1jYXRjaChkKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpvdChkKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxkPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6VnIoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnR9KTtsZXQgbztjb25zdCBoPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZz1uZXcgQmxvYihbZF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShnKS5hcnJheUJ1ZmZlcigpLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixoWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1kLGhbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOmgsYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6b3QoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnQpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTp0PSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnR9KSl9KX1kZXN0cnVjdCgpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gV2kocil7Y29uc3QgdD1HKHt9LHIpLGU9bmV3IE1hcCxzPShoLGcpPT4oZS5oYXMoaCl8fGUuc2V0KGgsbmV3IFNldCksZS5nZXQoaCkuYWRkKGcpLCgpPT57dmFyIGI7cmV0dXJuKGI9ZS5nZXQoaCkpPT1udWxsP3ZvaWQgMDpiLmRlbGV0ZShnKX0pLG49KGgsZyk9Pnt2YXIgYjsoYj1lLmdldChoKSk9PW51bGx8fGIuZGVsZXRlKGcpfSxpPWg9Pnt2YXIgZzsoZz1lLmdldChoKSk9PW51bGx8fGcuZm9yRWFjaChiPT57dHJ5e2IodFtoXSl9Y2F0Y2goVCl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZTooaCxnLGI9ITApPT57dFtoXT1nLGImJmkoaCl9LGdldFZhbHVlOmg9PnRbaF0sZ2V0QWxsVmFsdWVzOigpPT50fX1jbGFzcyB6aXtjb25zdHJ1Y3Rvcigpe3UodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3UodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dCh0LGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHQpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KTtjb25zdCBzPW5ldyBLaSxuPW5ldyBNczt0aGlzLmNvbnRleHRzLnNldCh0LFdpKGUpKSx0aGlzLmNvbnRleHRzLmdldCh0KS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IG10KG4pKTtjb25zdCBpPW5ldyBwcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuZ2V0KHQpfXJlbWFwQ29udGV4dCh0LGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXQmJihlLnNldFZhbHVlKCJwZWVySWQiLHQpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuc2V0KHQsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQodCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgVGU9bmV3IHppO2NvbnN0ICRpPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LGR0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMDE0IjoiRmFpbGVkIHRvIGVzdGFibGlzaCBtZWRpYSBjb25uZWN0aW9uLiIsIjAxMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwMTAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwMTAyIjoiUHJlcmVxdWlzaXRlIG1vZHVsZSBtaXNzaW5nIiwiMDIwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDQiOiJNaXNzaW5nIHByZXJlcXVpc2l0ZXMgdG8gZXN0YWJsaXNoIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24iLCIwNTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDUwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA1MDIiOiJJbnZhbGlkIG1lc3NhZ2UgYm9keS4iLCIwNTAzIjoiVGV4dCBNZXNzYWdlIGlzIHRvbyBsYXJnZSIsIjA1MDQiOiJNZXNzYWdlIG5vdCBmb3VuZCBieSB0aGUgZ2l2ZW4gaWQiLCIwNTA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwNTA2IjoiTWVzc2FnZSBzZWFyY2ggaXMgZGlzYWJsZWQiLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhkdCkuZm9yRWFjaChyPT57ZHRbcl09YHskeyRpW3Iuc2xpY2UoMCwyKV19fSAke2R0W3JdfWB9KTtjbGFzcyBHaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUscyxuPXZvaWQgMCxpPSExKXtzdXBlcihlKTt1KHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9cyx0aGlzLm5hbWU9IkNsaWVudEVycm9yIjtjb25zdCBhPXRoaXMuY29kZT9gW0VSUiR7dGhpcy5jb2RlfV1gOiJbRVJSXSIsZD10aGlzLmNvZGU/ZHRbdGhpcy5jb2RlXToiIjt0aGlzLm1lc3NhZ2U9YCR7YX06ICR7ZH0KJHt0aGlzLm1lc3NhZ2V9YDt0cnl7bGV0IG89aSYmISFuO3MmJnMuZW5kc1dpdGgoIjAwIikmJm4mJihvPSEwKSxvJiZuLmVycm9yKCJDbGllbnRFcnJvciIse2Vycm9yOnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxjb2RlOnN9fSk7Y29uc3QgaD1UZS5nZXRDb250ZXh0KFRlLmdldE1vc3RSZWNlbnRQZWVySWQoKSk7aWYoaCl7Y29uc3QgZz1oLmdldFZhbHVlKCJvbkVycm9yIik7dHJ5e2codGhpcyl9Y2F0Y2goYil7fX10eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJDbGllbnRFcnJvciIse2RldGFpbDp0aGlzfSkpfWNhdGNoKG8pe319fXZhciBsZT0ocj0+KHJbci5JbnZhbGlkS2V5PTBdPSJJbnZhbGlkS2V5IixyW3IuTWlzc2luZ0tleT0xXT0iTWlzc2luZ0tleSIscltyLkludGVybmFsRXJyb3I9Ml09IkludGVybmFsRXJyb3IiLHIpKShsZXx8e30pO2NsYXNzIHVlIGV4dGVuZHMgR2l7Y29uc3RydWN0b3IoZSxzPTIpe3N1cGVyKGUsIjE3MDEiKTt1KHRoaXMsInJlYXNvbiIpO3RoaXMucmVhc29uPXN9fWNsYXNzICRyIGV4dGVuZHMgVy5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt1KHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsc3VwZXIuc2V0TWF4TGlzdGVuZXJzKDI1KX1lbWl0KGUsLi4ucyl7cmV0dXJuIHN1cGVyLmVtaXQoIioiLGUsLi4ucyksc3VwZXIuZW1pdChlLC4uLnMpfW9uKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLm9uKGUscyl9YWRkTGlzdGVuZXIoZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIoZSxzKX1vZmYoZSxzKXtyZXR1cm4gc3VwZXIub2ZmKGUscyl9b25jZShlLHMpe3JldHVybiBzdXBlci5vbmNlKGUscyl9cHJlcGVuZExpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRMaXN0ZW5lcihlLHMpfXByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpfXJlbW92ZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKGUscyl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSl9bGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5saXN0ZW5lcnMoZSl9bGlzdGVuZXJDb3VudChlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJDb3VudChlKX19Y29uc3QgQ3Q9e0Vycm9yOiJjcnlwdG9yRXJyb3IifTtmdW5jdGlvbiBxaShyKXtyZXR1cm4idHlwZSJpbiByfWZ1bmN0aW9uIFlpKHMpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihyLHQ9e25hbWU6X30sZT0iZW5jcnlwdCIpe3JldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixyLHQsITEsZT09PSJkZXJpdmUiP1siZGVyaXZlQml0cyIsImRlcml2ZUtleSJdOlsiZW5jcnlwdCIsImRlY3J5cHQiXSl9KX1mdW5jdGlvbiBHcihyLHQpe2NvbnN0IHM9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpO3N3aXRjaChyKXtjYXNlIkhLREYiOnJldHVybntuYW1lOiJIS0RGIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaW5mbzpuZXcgQXJyYXlCdWZmZXIoMTI4KX07Y2FzZSJQQktERjIiOnJldHVybntuYW1lOiJQQktERjIiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpdGVyYXRpb25zOjFlNX07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGFsZ29yaXRobSAke3J9IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZGApfX1mdW5jdGlvbiBxcihyLHQpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCkscz15aWVsZCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShlLHIse25hbWU6XyxsZW5ndGg6MTI4fSwhMSxbImVuY3J5cHQiLCJkZWNyeXB0Il0pO3JldHVybnttYXRlcmlhbDpyLGVuY3J5cHRpb25LZXk6c319KX1mdW5jdGlvbiBRaShyLHQpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCk7cmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhlLHIsMjU2KX0pfWNsYXNzIEppIGV4dGVuZHMgJHJ7fWNsYXNzIFlyIGV4dGVuZHMgSml7Y29uc3RydWN0b3IoZSl7dmFyIHM7c3VwZXIodm9pZCAwKTt1KHRoaXMsInNlbmRDb3VudHMiKTt1KHRoaXMsImlzS2V5SW52YWxpZCIsITEpO3UodGhpcywicGFydGljaXBhbnRJZCIpO3UodGhpcywidHJhY2tJZCIpO3UodGhpcywia2V5cyIpO3UodGhpcywidmlkZW9Db2RlYyIpO3UodGhpcywicnRwTWFwIik7dSh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTt1KHRoaXMsInVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlciIpO3RoaXMuc2VuZENvdW50cz1uZXcgTWFwLHRoaXMua2V5cz1lLmtleXMsdGhpcy5wYXJ0aWNpcGFudElkPWUucGFydGljaXBhbnRJZCx0aGlzLnJ0cE1hcD1uZXcgTWFwLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPWUua2V5UHJvdmlkZXJPcHRpb25zLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyPShzPWUudW5lbmNyeXB0ZWRGcmFtZUJ5dGVzKSE9bnVsbD9zOm5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiTEtST0NLUyIpfXNldFBhcnRpY2lwYW50KGUscyl7dGhpcy5wYXJ0aWNpcGFudElkPWUsdGhpcy5rZXlzPXN9dW5zZXRQYXJ0aWNpcGFudCgpe3RoaXMucGFydGljaXBhbnRJZD12b2lkIDB9Z2V0UGFydGljaXBhbnRJZCgpe3JldHVybiB0aGlzLnBhcnRpY2lwYW50SWR9Z2V0VHJhY2tJZCgpe3JldHVybiB0aGlzLnRyYWNrSWR9c2V0VmlkZW9Db2RlYyhlKXt0aGlzLnZpZGVvQ29kZWM9ZX1zZXRSdHBNYXAoZSl7dGhpcy5ydHBNYXA9ZX1zZXR1cFRyYW5zZm9ybShlLHMsbixpLGEpe2EmJih0aGlzLnZpZGVvQ29kZWM9YSk7Y29uc3QgZD1lPT09ImVuY29kZSI/dGhpcy5lbmNvZGVGdW5jdGlvbjp0aGlzLmRlY29kZUZ1bmN0aW9uLG89bmV3IFRyYW5zZm9ybVN0cmVhbSh7dHJhbnNmb3JtOmQuYmluZCh0aGlzKX0pO3MucGlwZVRocm91Z2gobykucGlwZVRvKG4pLmNhdGNoKGg9Pnt0aGlzLmVtaXQoImNyeXB0b3JFcnJvciIsaCBpbnN0YW5jZW9mIHVlP2g6bmV3IHVlKGgubWVzc2FnZSkpfSksdGhpcy50cmFja0lkPWl9ZW5jb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGE7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3R7ZW5jcnlwdGlvbktleTpufT10aGlzLmtleXMuZ2V0S2V5U2V0KCksaT10aGlzLmtleXMuZ2V0Q3VycmVudEtleUluZGV4KCk7aWYobil7Y29uc3QgZD10aGlzLm1ha2VJVigoYT1lLmdldE1ldGFkYXRhKCkuc3luY2hyb25pemF0aW9uU291cmNlKSE9bnVsbD9hOi0xLGUudGltZXN0YW1wKSxvPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksaD1uZXcgVWludDhBcnJheSgyKTtoWzBdPW9lLGhbMV09aTt0cnl7Y29uc3QgZz15aWVsZCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6XyxpdjpkLGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLG8uYnl0ZUxlbmd0aCl9LG4sbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSkpLGI9bmV3IEFycmF5QnVmZmVyKG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoK2guYnl0ZUxlbmd0aCksVD1uZXcgVWludDhBcnJheShiKTtyZXR1cm4gVC5zZXQobyksVC5zZXQobmV3IFVpbnQ4QXJyYXkoZyksby5ieXRlTGVuZ3RoKSxULnNldChuZXcgVWludDhBcnJheShkKSxvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoKSxULnNldChoLG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrZC5ieXRlTGVuZ3RoKSxlLmRhdGE9YixzLmVucXVldWUoZSl9Y2F0Y2goZyl7fX1lbHNlIHRoaXMuZW1pdChDdC5FcnJvcixuZXcgdWUoImVuY3J5cHRpb24ga2V5IG1pc3NpbmcgZm9yIGVuY29kaW5nIixsZS5NaXNzaW5nS2V5KSl9KX1kZWNvZGVGdW5jdGlvbihlLHMpe3JldHVybiB3KHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTB8fFhpKGUuZGF0YSx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcikpcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUuZGF0YSlbZS5kYXRhLmJ5dGVMZW5ndGgtMV07aWYodGhpcy5rZXlzLmdldEtleVNldChpKSl0cnl7Y29uc3QgYT15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLGkpO2lmKGEpcmV0dXJuIHMuZW5xdWV1ZShhKTt0aGlzLmlzS2V5SW52YWxpZD0hMX1jYXRjaChhKXthIGluc3RhbmNlb2YgdWUmJmEucmVhc29uPT09bGUuSW52YWxpZEtleSYmKHRoaXMuaXNLZXlJbnZhbGlkfHwodGhpcy5lbWl0KEN0LkVycm9yLG5ldyB1ZShgaW52YWxpZCBrZXkgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsbGUuSW52YWxpZEtleSkpLHRoaXMuaXNLZXlJbnZhbGlkPSEwKSl9ZWxzZSB0aGlzLmVtaXQoQ3QuRXJyb3IsbmV3IHVlKGBrZXkgbWlzc2luZyBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxsZS5NaXNzaW5nS2V5KSk7cmV0dXJuIHMuZW5xdWV1ZShlKX0pfWRlY3J5cHRGcmFtZShhLGQpe3JldHVybiB3KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihlLHMsbj12b2lkIDAsaT17cmF0Y2hldENvdW50OjB9KXt2YXIgaDtjb25zdCBvPXRoaXMua2V5cy5nZXRLZXlTZXQocyk7dHJ5e2NvbnN0IGc9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSxiPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC0yLDIpLFQ9YlswXSxWPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC1ULWIuYnl0ZUxlbmd0aCxUKSxVPWcuYnl0ZUxlbmd0aCxxPWUuZGF0YS5ieXRlTGVuZ3RoLShnLmJ5dGVMZW5ndGgrVCtiLmJ5dGVMZW5ndGgpLCQ9eWllbGQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOl8saXY6VixhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxnLmJ5dGVMZW5ndGgpfSwoaD1pLmVuY3J5cHRpb25LZXkpIT1udWxsP2g6by5lbmNyeXB0aW9uS2V5LG5ldyBVaW50OEFycmF5KGUuZGF0YSxVLHEpKSxpZT1uZXcgQXJyYXlCdWZmZXIoZy5ieXRlTGVuZ3RoKyQuYnl0ZUxlbmd0aCksYWU9bmV3IFVpbnQ4QXJyYXkoaWUpO3JldHVybiBhZS5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZy5ieXRlTGVuZ3RoKSksYWUuc2V0KG5ldyBVaW50OEFycmF5KCQpLGcuYnl0ZUxlbmd0aCksZS5kYXRhPWllLGV9Y2F0Y2goZyl7aWYodGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemU+MCl7aWYoaS5yYXRjaGV0Q291bnQ8dGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemUpe2xldCBiO2lmKG89PT10aGlzLmtleXMuZ2V0S2V5U2V0KHMpKXtjb25zdCBWPXlpZWxkIHRoaXMua2V5cy5yYXRjaGV0S2V5KHMsITEpO2I9eWllbGQgcXIoVix0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCl9Y29uc3QgVD15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLHMsbnx8byx7cmF0Y2hldENvdW50OmkucmF0Y2hldENvdW50KzEsZW5jcnlwdGlvbktleTpiPT1udWxsP3ZvaWQgMDpiLmVuY3J5cHRpb25LZXl9KTtyZXR1cm4gVCYmYiYmKHRoaXMua2V5cy5zZXRLZXlTZXQoYixzLCEwKSx0aGlzLmtleXMuc2V0Q3VycmVudEtleUluZGV4KHMpKSxUfW4mJnRoaXMua2V5cy5zZXRLZXlGcm9tTWF0ZXJpYWwobi5tYXRlcmlhbCxzKX1lbHNlIHRocm93IG5ldyB1ZSgiRGVjcnlwdGlvbiBmYWlsZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBrZXkiLGxlLkludmFsaWRLZXkpfX0pfW1ha2VJVihlLHMpe3ZhciBkO2NvbnN0IG49bmV3IEFycmF5QnVmZmVyKG9lKSxpPW5ldyBEYXRhVmlldyhuKTt0aGlzLnNlbmRDb3VudHMuaGFzKGUpfHx0aGlzLnNlbmRDb3VudHMuc2V0KGUsTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjY1NTM1KSk7Y29uc3QgYT0oZD10aGlzLnNlbmRDb3VudHMuZ2V0KGUpKSE9bnVsbD9kOjA7cmV0dXJuIGkuc2V0VWludDMyKDAsZSksaS5zZXRVaW50MzIoNCxzKSxpLnNldFVpbnQzMig4LHMtYSU2NTUzNSksdGhpcy5zZW5kQ291bnRzLnNldChlLGErMSksbn1nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpe3ZhciBzO2lmKHFpKGUpKXtjb25zdCBuPShzPXRoaXMuZ2V0VmlkZW9Db2RlYyhlKSkhPW51bGw/czp0aGlzLnZpZGVvQ29kZWM7aWYobj09PSJhdjEifHxuPT09InZwOSIpdGhyb3cgbmV3IEVycm9yKGAke259IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBlbmQgdG8gZW5kIGVuY3J5cHRpb25gKTtyZXR1cm4gTVtlLnR5cGVdfXJldHVybiBNLmF1ZGlvfWdldFZpZGVvQ29kZWMoZSl7aWYodGhpcy5ydHBNYXAuc2l6ZT09PTApcmV0dXJuO2NvbnN0e3BheWxvYWRUeXBlOnN9PWUuZ2V0TWV0YWRhdGEoKTtyZXR1cm4gcz90aGlzLnJ0cE1hcC5nZXQocyk6dm9pZCAwfX1mdW5jdGlvbiBYaShyLHQpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoci5zbGljZShyLmJ5dGVMZW5ndGgtdC5ieXRlTGVuZ3RoKSk7cmV0dXJuIHQuZXZlcnkoKHMsbik9PnM9PT1lW25dKX1jbGFzcyBRciBleHRlbmRzICRye2NvbnN0cnVjdG9yKGUscyxuKXtzdXBlcih2b2lkIDApO3UodGhpcywiY3VycmVudEtleUluZGV4Iik7dSh0aGlzLCJjcnlwdG9LZXlSaW5nIik7dSh0aGlzLCJlbmFibGVkIik7dSh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTt1KHRoaXMsInJhdGNoZXRQcm9taXNlTWFwIik7dSh0aGlzLCJwYXJ0aWNpcGFudElkIik7dGhpcy5jdXJyZW50S2V5SW5kZXg9MCx0aGlzLmNyeXB0b0tleVJpbmc9bmV3IEFycmF5KDE2KSx0aGlzLmVuYWJsZWQ9cyx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1uLHRoaXMucmF0Y2hldFByb21pc2VNYXA9bmV3IE1hcCx0aGlzLnBhcnRpY2lwYW50SWQ9ZX1zZXRFbmFibGVkKGUpe3RoaXMuZW5hYmxlZD1lfXJhdGNoZXRLZXkoZSxzPSEwKXtjb25zdCBuPWUhPW51bGw/ZTp0aGlzLmdldEN1cnJlbnRLZXlJbmRleCgpLGk9bixhPXRoaXMucmF0Y2hldFByb21pc2VNYXAuZ2V0KGkpO2lmKHR5cGVvZiBhIT0idW5kZWZpbmVkIilyZXR1cm4gYTtjb25zdCBkPW5ldyBQcm9taXNlKChvLGgpPT53KHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3QgZz10aGlzLmdldEtleVNldChpKS5tYXRlcmlhbCxiPXlpZWxkIFlpKHlpZWxkIFFpKGcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpLGcuYWxnb3JpdGhtLm5hbWUsImRlcml2ZSIpO3MmJnRoaXMuc2V0S2V5RnJvbU1hdGVyaWFsKGIsaSwhMCksdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLGIsbix0aGlzLnBhcnRpY2lwYW50SWQpLG8oYil9Y2F0Y2goZyl7aChnKX1maW5hbGx5e3RoaXMucmF0Y2hldFByb21pc2VNYXAuZGVsZXRlKGkpfX0pKTtyZXR1cm4gdGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5zZXQoaSxkKSxkfXNldEtleUZyb21NYXRlcmlhbChlLHM9MCxuPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cz49MCYmKHRoaXMuY3VycmVudEtleUluZGV4PXMldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aCk7Y29uc3QgaT15aWVsZCBxcihlLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KTt0aGlzLnNldEtleVNldChpLHRoaXMuY3VycmVudEtleUluZGV4LG4pfSl9c2V0S2V5U2V0KGUscyxuPSExKXtyZXR1cm4gdyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jcnlwdG9LZXlSaW5nW3MldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aF09ZSxuJiZ0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIsZS5tYXRlcmlhbCxzLHRoaXMucGFydGljaXBhbnRJZCl9KX1zZXRDdXJyZW50S2V5SW5kZXgoZSl7cmV0dXJuIHcodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3VycmVudEtleUluZGV4PWUldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aH0pfWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLmVuYWJsZWR9Z2V0Q3VycmVudEtleUluZGV4KCl7cmV0dXJuIHRoaXMuY3VycmVudEtleUluZGV4fWdldEtleVNldChlKXtyZXR1cm4gdGhpcy5jcnlwdG9LZXlSaW5nW2UhPW51bGw/ZTp0aGlzLmN1cnJlbnRLZXlJbmRleF19fWNvbnN0IEl0PVtdLHd0PW5ldyBNYXAsa3Q9W107bGV0IG5lLE10PSExLEpyPSExLF90LHBlPXB0O2Z1bmN0aW9uIGhlKHIsdCl7cG9zdE1lc3NhZ2Uoe2tpbmQ6ImxvZyIsZGF0YTp7bGV2ZWw6cixzdHI6dH19KX1mdW5jdGlvbiBaaShyLHQpe3Bvc3RNZXNzYWdlKHtraW5kOiJyYXRjaGV0S2V5IixkYXRhOntrZXlJbmRleDp0LG1hdGVyaWFsOnJ9fSl9ZnVuY3Rpb24gUmUocil7aWYoIXIpcmV0dXJuIG5lO2xldCB0PXd0LmdldChyKTtyZXR1cm4gdHx8KHQ9bmV3IFFyKHIsITAscGUpLF90JiZ0LnNldEtleUZyb21NYXRlcmlhbChfdCksd3Quc2V0KHIsdCkpLHR9ZnVuY3Rpb24gZWEocix0KXt0P1JlKHQpLnNldEVuYWJsZWQocik6KE10PXIsbmUuc2V0RW5hYmxlZChyKSl9ZnVuY3Rpb24gWHIocil7ci5vbigiY3J5cHRvckVycm9yIix0PT57Y29uc3QgZT17a2luZDoiZXJyb3IiLGRhdGE6e2Vycm9yOm5ldyBFcnJvcihgJHtsZVt0LnJlYXNvbl19OiAke3QubWVzc2FnZX1gKX19O3Bvc3RNZXNzYWdlKGUpfSl9ZnVuY3Rpb24gQXQocix0KXtsZXQgZT1JdC5maW5kKHM9PnMuZ2V0VHJhY2tJZCgpPT09dCk7aWYoZSlyIT09ZS5nZXRQYXJ0aWNpcGFudElkKCkmJmUuc2V0UGFydGljaXBhbnQocixSZShyKSk7ZWxzZXtpZihoZSgiaW5mbyIsYGNyZWF0aW5nIG5ldyBjcnlwdG9yIGZvciAke3J9YCksIXBlKXRocm93IEVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTtlPW5ldyBZcih7cGFydGljaXBhbnRJZDpyLGtleXM6UmUociksa2V5UHJvdmlkZXJPcHRpb25zOnBlfSksWHIoZSksSXQucHVzaChlKX1yZXR1cm4gZX1mdW5jdGlvbiBacihyKXtsZXQgdD1rdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09cik7aWYoIXQpe2lmKCFwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTt0PW5ldyBZcih7a2V5czpuZSxwYXJ0aWNpcGFudElkOiJwdWJsaXNoZXIiLGtleVByb3ZpZGVyT3B0aW9uczpwZX0pLFhyKHQpLGt0LnB1c2godCl9cmV0dXJuIHR9ZnVuY3Rpb24gdGEocil7dmFyIHQ7KHQ9SXQuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXIpKT09bnVsbHx8dC51bnNldFBhcnRpY2lwYW50KCl9ZnVuY3Rpb24gcmEocix0KXtoZSgiZGVidWciLCJzZXR0aW5nIHNoYXJlZCBrZXkiKSxfdD1yLG5lPT1udWxsfHxuZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KTtmb3IoY29uc3RbLGVdb2Ygd3QpZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KX1vbm1lc3NhZ2U9cj0+e2NvbnN0e2tpbmQ6dCxkYXRhOmV9PXIuZGF0YTtzd2l0Y2godCl7Y2FzZSJpbml0IjpoZSgiaW5mbyIsIndvcmtlciBpbml0aWFsaXplZCIpLHBlPWUua2V5UHJvdmlkZXJPcHRpb25zLEpyPSEhZS5rZXlQcm92aWRlck9wdGlvbnMuc2hhcmVkS2V5O2NvbnN0IHM9e2tpbmQ6ImVuYWJsZSIsZGF0YTp7ZW5hYmxlZDpNdH19O25lPW5ldyBRcih2b2lkIDAsTXQscGUpLG5lLm9uKCJrZXlSYXRjaGV0ZWQiLFppKSxwb3N0TWVzc2FnZShzKTticmVhaztjYXNlImVuYWJsZSI6ZWEoZS5lbmFibGVkLGUucGFydGljaXBhbnRJZCksaGUoImluZm8iLCJ1cGRhdGVkIGUyZWUgZW5hYmxlZCBzdGF0dXMiKSxwb3N0TWVzc2FnZShyLmRhdGEpO2JyZWFrO2Nhc2UiZGVjb2RlIjpBdChlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybSh0LGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJlbmNvZGUiOlpyKGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0odCxlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0S2V5IjpKcj8oaGUoImRlYnVnIiwic2V0IHNoYXJlZCBrZXkiKSxyYShlLmtleSxlLmtleUluZGV4KSk6ZS5wYXJ0aWNpcGFudElkP1JlKGUucGFydGljaXBhbnRJZCkuc2V0S2V5RnJvbU1hdGVyaWFsKGUua2V5LGUua2V5SW5kZXgpOmhlKCJlcnJvciIsIm5vIHBhcnRpY2lwYW50IElkIHdhcyBwcm92aWRlZCBhbmQgc2hhcmVkIGtleSB1c2FnZSBpcyBkaXNhYmxlZCIpO2JyZWFrO2Nhc2UicmVtb3ZlVHJhbnNmb3JtIjp0YShlLnRyYWNrSWQpO2JyZWFrO2Nhc2UidXBkYXRlQ29kZWMiOkF0KGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldFZpZGVvQ29kZWMoZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRSVFBNYXAiOmt0LmZvckVhY2goYT0+e2Euc2V0UnRwTWFwKGUubWFwKX0pO2JyZWFrO2Nhc2UicmF0Y2hldFJlcXVlc3QiOlJlKGUucGFydGljaXBhbnRJZCkucmF0Y2hldEtleShlLmtleUluZGV4KTticmVha319LHNlbGYuUlRDVHJhbnNmb3JtRXZlbnQmJihoZSgiZGVidWciLCJzZXR1cCB0cmFuc2Zvcm0gZXZlbnQiKSxzZWxmLm9ucnRjdHJhbnNmb3JtPXI9Pntjb25zdHt0cmFuc2Zvcm1lcjp0fT1yO3QuaGFuZGxlZD0hMDtjb25zdHtraW5kOmUscGFydGljaXBhbnRJZDpzLHRyYWNrSWQ6bixjb2RlYzppfT10Lm9wdGlvbnM7KGU9PT0iZW5jb2RlIj9acihuKTpBdChzLG4pKS5zZXR1cFRyYW5zZm9ybShlLHQucmVhZGFibGUsdC53cml0YWJsZSxuLGkpfSl9KSgpOwo=",g=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Hl(){const Z=g&&(window.URL||window.webkitURL).createObjectURL(g);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,C,k,U,dl,I,cl,a,T,v,Sl,H,bl,S,Vl,t,Wl,o,Xl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,U);p(this,I);p(this,a);p(this,v);p(this,H);p(this,S);p(this,t);p(this,o);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:c,data:b}=l.data;switch(c){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(V=>{Y(this,a,T).call(this,V)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,k,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Hl,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!kl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),Y(this,U,dl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=w(this,k),this.worker.postMessage(l)),Y(this,N,C).call(this,!0)}}N=new WeakSet,C=function(l,c){return J(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${c||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:c}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},k=new WeakMap,U=new WeakSet,dl=function(l){this.peerSessionStore.on(i.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&Y(this,N,C).call(this,c.e2ee,b)}),this.peerSessionStore.on(i.E2EE_INACTIVE_CONSUMER,({peerId:c,trackId:b})=>{var W;const V={kind:"removeTransform",data:{participantId:c,trackId:b}};(W=this.worker)==null||W.postMessage(V)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:V})=>Y(this,H,bl).call(this,c,b,V)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:V})=>Y(this,S,Vl).call(this,c,b,V.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,I,cl).call(this,c,b))},I=new WeakSet,cl=function(l,c){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:c}};this.worker.postMessage(b)},a=new WeakSet,T=function({key:l,participantId:c,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const V={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(V)},v=new WeakSet,Sl=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const c={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(c)},H=new WeakSet,bl=function(l,c,b){Y(this,t,Wl).call(this,c,l.id,b)},S=new WeakSet,Vl=function(l,c,b){Y(this,o,Xl).call(this,c,l.id,b)},t=new WeakSet,Wl=function(l,c,b,V){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const X={kind:"decode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{if(F in W&&V){const y={kind:"updateCodec",data:{trackId:c,codec:V,participantId:b}};this.worker.postMessage(y);return}let X=W.writableStream,m=W.readableStream;if(!X||!m){const y=W.createEncodedStreams();W.writableStream=y.writable,X=y.writable,W.readableStream=y.readable,m=y.readable}const u={kind:"decode",data:{readableStream:m,writableStream:X,trackId:c,codec:V,participantId:b}};this.worker.postMessage(u,[m,X])}W[F]=!0})},o=new WeakSet,Xl=function(l,c,b,V){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const X={kind:"encode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{this.logger.warn("initialize encoded streams");const X=W.createEncodedStreams(),m={kind:"encode",data:{readableStream:X.readable,writableStream:X.writable,codec:V,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(m,[X.readable,X.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Il);module.exports=Zl;
|
|
1
|
+
"use strict";var Gl=Object.defineProperty,ml=Object.defineProperties;var Rl=Object.getOwnPropertyDescriptors;var Q=Object.getOwnPropertySymbols;var pl=Object.prototype.hasOwnProperty,Yl=Object.prototype.propertyIsEnumerable;var z=(Z,d,l)=>d in Z?Gl(Z,d,{enumerable:!0,configurable:!0,writable:!0,value:l}):Z[d]=l,n=(Z,d)=>{for(var l in d||(d={}))pl.call(d,l)&&z(Z,l,d[l]);if(Q)for(var l of Q(d))Yl.call(d,l)&&z(Z,l,d[l]);return Z},e=(Z,d)=>ml(Z,Rl(d));var R=(Z,d,l)=>(z(Z,typeof d!="symbol"?d+"":d,l),l),B=(Z,d,l)=>{if(!d.has(Z))throw TypeError("Cannot "+l)};var w=(Z,d,l)=>(B(Z,d,"read from private field"),l?l.call(Z):d.get(Z)),p=(Z,d,l)=>{if(d.has(Z))throw TypeError("Cannot add the same private member more than once");d instanceof WeakSet?d.add(Z):d.set(Z,l)};var Y=(Z,d,l)=>(B(Z,d,"access private method"),l);var J=(Z,d,l)=>new Promise((c,b)=>{var V=m=>{try{X(l.next(m))}catch(y){b(y)}},W=m=>{try{X(l.throw(m))}catch(y){b(y)}},X=m=>m.done?c(m.value):Promise.resolve(m.value).then(V,W);X((l=l.apply(Z,d)).next())});var s={},yl={get exports(){return s},set exports(Z){s=Z}},h=typeof Reflect=="object"?Reflect:null,j=h&&typeof h.apply=="function"?h.apply:function(d,l,c){return Function.prototype.apply.call(d,l,c)},L;h&&typeof h.ownKeys=="function"?L=h.ownKeys:Object.getOwnPropertySymbols?L=function(d){return Object.getOwnPropertyNames(d).concat(Object.getOwnPropertySymbols(d))}:L=function(d){return Object.getOwnPropertyNames(d)};function ul(Z){console&&console.warn&&console.warn(Z)}var g=Number.isNaN||function(d){return d!==d};function G(){G.init.call(this)}yl.exports=G;s.once=Nl;G.EventEmitter=G;G.prototype._events=void 0;G.prototype._eventsCount=0;G.prototype._maxListeners=void 0;var M=10;function K(Z){if(typeof Z!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof Z)}Object.defineProperty(G,"defaultMaxListeners",{enumerable:!0,get:function(){return M},set:function(Z){if(typeof Z!="number"||Z<0||g(Z))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+Z+".");M=Z}});G.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};G.prototype.setMaxListeners=function(d){if(typeof d!="number"||d<0||g(d))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+d+".");return this._maxListeners=d,this};function O(Z){return Z._maxListeners===void 0?G.defaultMaxListeners:Z._maxListeners}G.prototype.getMaxListeners=function(){return O(this)};G.prototype.emit=function(d){for(var l=[],c=1;c<arguments.length;c++)l.push(arguments[c]);var b=d==="error",V=this._events;if(V!==void 0)b=b&&V.error===void 0;else if(!b)return!1;if(b){var W;if(l.length>0&&(W=l[0]),W instanceof Error)throw W;var X=new Error("Unhandled error."+(W?" ("+W.message+")":""));throw X.context=W,X}var m=V[d];if(m===void 0)return!1;if(typeof m=="function")j(m,this,l);else for(var y=m.length,u=_(m,y),c=0;c<y;++c)j(u[c],this,l);return!0};function f(Z,d,l,c){var b,V,W;if(K(l),V=Z._events,V===void 0?(V=Z._events=Object.create(null),Z._eventsCount=0):(V.newListener!==void 0&&(Z.emit("newListener",d,l.listener?l.listener:l),V=Z._events),W=V[d]),W===void 0)W=V[d]=l,++Z._eventsCount;else if(typeof W=="function"?W=V[d]=c?[l,W]:[W,l]:c?W.unshift(l):W.push(l),b=O(Z),b>0&&W.length>b&&!W.warned){W.warned=!0;var X=new Error("Possible EventEmitter memory leak detected. "+W.length+" "+String(d)+" listeners added. Use emitter.setMaxListeners() to increase limit");X.name="MaxListenersExceededWarning",X.emitter=Z,X.type=d,X.count=W.length,ul(X)}return Z}G.prototype.addListener=function(d,l){return f(this,d,l,!1)};G.prototype.on=G.prototype.addListener;G.prototype.prependListener=function(d,l){return f(this,d,l,!0)};function hl(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function r(Z,d,l){var c={fired:!1,wrapFn:void 0,target:Z,type:d,listener:l},b=hl.bind(c);return b.listener=l,c.wrapFn=b,b}G.prototype.once=function(d,l){return K(l),this.on(d,r(this,d,l)),this};G.prototype.prependOnceListener=function(d,l){return K(l),this.prependListener(d,r(this,d,l)),this};G.prototype.removeListener=function(d,l){var c,b,V,W,X;if(K(l),b=this._events,b===void 0)return this;if(c=b[d],c===void 0)return this;if(c===l||c.listener===l)--this._eventsCount===0?this._events=Object.create(null):(delete b[d],b.removeListener&&this.emit("removeListener",d,c.listener||l));else if(typeof c!="function"){for(V=-1,W=c.length-1;W>=0;W--)if(c[W]===l||c[W].listener===l){X=c[W].listener,V=W;break}if(V<0)return this;V===0?c.shift():Jl(c,V),c.length===1&&(b[d]=c[0]),b.removeListener!==void 0&&this.emit("removeListener",d,X||l)}return this};G.prototype.off=G.prototype.removeListener;G.prototype.removeAllListeners=function(d){var l,c,b;if(c=this._events,c===void 0)return this;if(c.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):c[d]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete c[d]),this;if(arguments.length===0){var V=Object.keys(c),W;for(b=0;b<V.length;++b)W=V[b],W!=="removeListener"&&this.removeAllListeners(W);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(l=c[d],typeof l=="function")this.removeListener(d,l);else if(l!==void 0)for(b=l.length-1;b>=0;b--)this.removeListener(d,l[b]);return this};function D(Z,d,l){var c=Z._events;if(c===void 0)return[];var b=c[d];return b===void 0?[]:typeof b=="function"?l?[b.listener||b]:[b]:l?il(b):_(b,b.length)}G.prototype.listeners=function(d){return D(this,d,!0)};G.prototype.rawListeners=function(d){return D(this,d,!1)};G.listenerCount=function(Z,d){return typeof Z.listenerCount=="function"?Z.listenerCount(d):A.call(Z,d)};G.prototype.listenerCount=A;function A(Z){var d=this._events;if(d!==void 0){var l=d[Z];if(typeof l=="function")return 1;if(l!==void 0)return l.length}return 0}G.prototype.eventNames=function(){return this._eventsCount>0?L(this._events):[]};function _(Z,d){for(var l=new Array(d),c=0;c<d;++c)l[c]=Z[c];return l}function Jl(Z,d){for(;d+1<Z.length;d++)Z[d]=Z[d+1];Z.pop()}function il(Z){for(var d=new Array(Z.length),l=0;l<d.length;++l)d[l]=Z[l].listener||Z[l];return d}function Nl(Z,d){return new Promise(function(l,c){function b(W){Z.removeListener(d,V),c(W)}function V(){typeof Z.removeListener=="function"&&Z.removeListener("error",b),l([].slice.call(arguments))}q(Z,d,V,{once:!0}),d!=="error"&&al(Z,b,{once:!0})})}function al(Z,d,l){typeof Z.on=="function"&&q(Z,"error",d,l)}function q(Z,d,l,c){if(typeof Z.on=="function")c.once?Z.once(d,l):Z.on(d,l);else if(typeof Z.addEventListener=="function")Z.addEventListener(d,function b(V){c.once&&Z.removeEventListener(d,b),l(V)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof Z)}class $ extends s.EventEmitter{constructor(l){super();R(this,"logger");this.logger=l,super.setMaxListeners(25)}emit(l,...c){return super.emit("*",l,...c),super.emit(l,...c)}on(l,c){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.on(l,c)}addListener(l,c){var b;try{const V=this.listenerCount(l);V>25&&V%25===0&&((b=this.logger)==null||b.warn("CustomEventEmitter::maxListenersExceeded",{eventListener:{eventName:l.toString(),listenerCount:this.listenerCount(l)}}))}catch(V){}return super.addListener(l,c)}off(l,c){return super.off(l,c)}once(l,c){return super.once(l,c)}prependListener(l,c){return super.prependListener(l,c)}prependOnceListener(l,c){return super.prependOnceListener(l,c)}removeListener(l,c){return super.removeListener(l,c)}removeAllListeners(l){return super.removeAllListeners(l)}listeners(l){return super.listeners(l)}listenerCount(l){return super.listenerCount(l)}}const F="realtimekit_e2ee",nl="RealtimeKitFrameEncryptionKey",Fl={sharedKey:!1,ratchetSalt:nl,ratchetWindowSize:8};function x(){return typeof window.RTCRtpScriptTransform!="undefined"}function Ll(){return typeof window.RTCRtpSender!="undefined"&&typeof window.RTCRtpSender.prototype.createEncodedStreams!="undefined"}function sl(Z){return J(this,null,function*(){const d=new TextEncoder;return yield crypto.subtle.importKey("raw",d.encode(Z),{name:"PBKDF2"},!1,["deriveBits","deriveKey"])})}function kl(){return Ll()||x()}class Hl extends ${constructor(l={}){super(void 0);R(this,"keyInfoMap");R(this,"options");R(this,"onKeyRatcheted",(l,c)=>{});this.keyInfoMap=new Map,this.options=n(n({},Fl),l),this.on("keyRatcheted",this.onKeyRatcheted)}onSetEncryptionKey(l,c,b){const V={key:l,participantId:c,keyIndex:b};this.keyInfoMap.set(`${c!=null?c:"shared"}-${b!=null?b:0}`,V),this.emit("setKey",V)}getKeys(){return Array.from(this.keyInfoMap.values())}getOptions(){return this.options}ratchetKey(l,c){this.emit("ratchetRequest",l,c)}}class Il extends Hl{constructor(l={}){const c=e(n({},l),{sharedKey:!0});super(c);R(this,"ratchetInterval")}setKey(l){return J(this,null,function*(){const c=yield sl(l);this.onSetEncryptionKey(c)})}}const E={ParticipantEncryptionStatusChanged:"participantEncryptionStatusChanged",Error:"encryptionError"};var i=(Z=>(Z.NEW_PRODUCER="NEW_PRODUCER",Z.ROOM_NODE_CONNECTION_ERROR="ROOM_NODE_CONNECTION_ERROR",Z.SOCKET_SERVICE_ROOM_JOINED="SOCKET_SERVICE_ROOM_JOINED",Z.SOCKET_SERVICE_RECONNECTED="SOCKET_SERVICE_RECONNECTED",Z.SOCKET_SERVICE_DISCONNECTED="SOCKET_SERVICE_DISCONNECTED",Z.SOCKET_SERVICE_FAILED="SOCKET_SERVICE_FAILED",Z.SOCKET_STATE_UPDATE="SOCKET_STATE_UPDATE",Z.ROOM_NODE_RECONNECTED="ROOM_NODE_RECONNECTED",Z.ROOM_NODE_DISCONNECTED="ROOM_NODE_DISCONNECTED",Z.ROOM_NODE_FAILED="ROOM_NODE_FAILED",Z.TRANSPORT_STATE_UPDATE="TRANSPORT_STATE_UPDATE",Z.PRODUCER_SCORE_UPDATE="PRODUCER_SCORE_UPDATE",Z.CONSUMER_SCORE_UPDATE="CONSUMER_SCORE_UPDATE",Z.PRODUCER_STATUS_UPDATE="PRODUCER_STATUS_UPDATE",Z.CONSUMER_STATUS_UPDATE="CONSUMER_STATUS_UPDATE",Z.LOW_CONSUMER_SCORE="LOW_CONSUMER_SCORE",Z.MEDIA_PERMISSION_ERROR="MEDIA_PERMISSION_ERROR",Z.MEDIA_PERMISSION_UPDATE="MEDIA_PERMISSION_UPDATE",Z.MESSAGE="websocket/message",Z.ROOM_MESSAGE="websocket/room-message",Z.PEER_JOINED_INTERNAL="peer/joined-internal",Z.PEER_CLOSED="websocket/peer-closed",Z.CONSUMER_CLOSED="websocket/consumer-closed",Z.CONSUMER_PAUSED="websocket/consumer-paused",Z.CONSUMER_RESUMED="websocket/consumer-resumed",Z.PRODUCER_CLOSED="websocket/producer-closed",Z.NEW_CONSUMER="websocket/new-consumer",Z.PRODUCER_SCORE="websocket/producer-score",Z.CONSUMER_SCORE="websocket/consumer-score",Z.PRODUCER_TOGGLE="cf/producer-toggle",Z.UPDATE_ACTIVE="media/update-active",Z.RESET_PRODUCER_STATE="cf/reset-producer-state",Z.ROOM_STATE="sockethub/room-state",Z.GET_STAGE_REQUESTS="GET_STAGE_REQUESTS",Z.UPDATE_STAGE_REQUESTS="UPDATE_STAGE_REQUESTS",Z.KICK_PEER="KICK_PEER",Z.UPDATE_PEER_STAGE_STATUS="UPDATE_PEER_STAGE_STATUS",Z.JOIN_MEDIA_ROOM="JOIN_MEDIA_ROOM",Z.LEAVE_MEDIA_ROOM="LEAVE_MEDIA_ROOM",Z.PIP_HANGUP="PIP_HANGUP",Z.E2EE_ACTIVE_PRODUCER="E2EE_ACTIVE_PRODUCER",Z.E2EE_INACTIVE_PRODUCER="E2EE_INACTIVE_PRODUCER",Z.E2EE_ACTIVE_CONSUMER="E2EE_ACTIVE_CONSUMER",Z.E2EE_INACTIVE_CONSUMER="E2EE_INACTIVE_CONSUMER",Z.SOCKET_PEERS="SOCKET_PEERS",Z.UPDATE_PERMISSIONS="UPDATE_PERMISSIONS",Z.MAX_SPATIAL_LAYER_CHANGE="MAX_SPATIAL_LAYER_CHANGE",Z.MUTE_SELF="MUTE_SELF",Z.MUTE_SELF_VIDEO="MUTE_SELF_VIDEO",Z))(i||{});const ll="dmFyIHNhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxuYT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgaWE9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIGVzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsYWE9T2JqZWN0LmdldFByb3RvdHlwZU9mLG9hPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksY2E9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxkYT1SZWZsZWN0LmdldDt2YXIgRHQ9KEwsTyxBKT0+TyBpbiBMP3NhKEwsTyx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6QX0pOkxbT109QSxHPShMLE8pPT57Zm9yKHZhciBBIGluIE98fChPPXt9KSlvYS5jYWxsKE8sQSkmJkR0KEwsQSxPW0FdKTtpZihlcylmb3IodmFyIEEgb2YgZXMoTykpY2EuY2FsbChPLEEpJiZEdChMLEEsT1tBXSk7cmV0dXJuIEx9LFFlPShMLE8pPT5uYShMLGlhKE8pKTt2YXIgcD0oTCxPLEEpPT4oRHQoTCx0eXBlb2YgTyE9InN5bWJvbCI/TysiIjpPLEEpLEEpLHRzPShMLE8sQSk9PntpZighTy5oYXMoTCkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgIitBKX07dmFyIFE9KEwsTyxBKT0+KHRzKEwsTywicmVhZCBmcm9tIHByaXZhdGUgZmllbGQiKSxBP0EuY2FsbChMKTpPLmdldChMKSksbHQ9KEwsTyxBKT0+e2lmKE8uaGFzKEwpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpO08gaW5zdGFuY2VvZiBXZWFrU2V0P08uYWRkKEwpOk8uc2V0KEwsQSl9LGZlPShMLE8sQSxvZSk9Pih0cyhMLE8sIndyaXRlIHRvIHByaXZhdGUgZmllbGQiKSxvZT9vZS5jYWxsKEwsQSk6Ty5zZXQoTCxBKSxBKTt2YXIgcnM9KEwsTyxBKT0+ZGEoYWEoTCksQSxPKTt2YXIgST0oTCxPLEEpPT5uZXcgUHJvbWlzZSgob2UsdXQpPT57dmFyIHB0PVc9Pnt0cnl7Z2UoQS5uZXh0KFcpKX1jYXRjaChtZSl7dXQobWUpfX0sej1XPT57dHJ5e2dlKEEudGhyb3coVykpfWNhdGNoKG1lKXt1dChtZSl9fSxnZT1XPT5XLmRvbmU/b2UoVy52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKFcudmFsdWUpLnRoZW4ocHQseik7Z2UoKEE9QS5hcHBseShMLE8pKS5uZXh0KCkpfSk7KGZ1bmN0aW9uKCl7dmFyIFBlLFosZWU7InVzZSBzdHJpY3QiO2NvbnN0IEw9IkFFUy1HQ00iLEE9e2tleToxMCxkZWx0YTozLGF1ZGlvOjEsZW1wdHk6MH0sb2U9MTIscHQ9e3NoYXJlZEtleTohMSxyYXRjaGV0U2FsdDoiUmVhbHRpbWVLaXRGcmFtZUVuY3J5cHRpb25LZXkiLHJhdGNoZXRXaW5kb3dTaXplOjh9O3ZhciB6PXt9LGdlPXtnZXQgZXhwb3J0cygpe3JldHVybiB6fSxzZXQgZXhwb3J0cyhyKXt6PXJ9fSxXPXR5cGVvZiBSZWZsZWN0PT0ib2JqZWN0Ij9SZWZsZWN0Om51bGwsbWU9VyYmdHlwZW9mIFcuYXBwbHk9PSJmdW5jdGlvbiI/Vy5hcHBseTpmdW5jdGlvbih0LGUscyl7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxzKX0sSmU7VyYmdHlwZW9mIFcub3duS2V5cz09ImZ1bmN0aW9uIj9KZT1XLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9KZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkpfTpKZT1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCl9O2Z1bmN0aW9uIHNzKHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBOdD1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKHQpe3JldHVybiB0IT09dH07ZnVuY3Rpb24gRCgpe0QuaW5pdC5jYWxsKHRoaXMpfWdlLmV4cG9ydHM9RCx6Lm9uY2U9b3MsRC5FdmVudEVtaXR0ZXI9RCxELnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxELnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxELnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgVnQ9MTA7ZnVuY3Rpb24gWGUocil7aWYodHlwZW9mIHIhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShELCJkZWZhdWx0TWF4TGlzdGVuZXJzIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gVnR9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9Im51bWJlciJ8fHI8MHx8TnQocikpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyKyIuIik7VnQ9cn19KSxELmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LEQucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZih0eXBlb2YgdCE9Im51bWJlciJ8fHQ8MHx8TnQodCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAibiIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJyt0KyIuIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9O2Z1bmN0aW9uIEJ0KHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/RC5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31ELnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gQnQodGhpcyl9LEQucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLHM9MTtzPGFyZ3VtZW50cy5sZW5ndGg7cysrKWUucHVzaChhcmd1bWVudHNbc10pO3ZhciBuPXQ9PT0iZXJyb3IiLGk9dGhpcy5fZXZlbnRzO2lmKGkhPT12b2lkIDApbj1uJiZpLmVycm9yPT09dm9pZCAwO2Vsc2UgaWYoIW4pcmV0dXJuITE7aWYobil7dmFyIGE7aWYoZS5sZW5ndGg+MCYmKGE9ZVswXSksYSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGE7dmFyIGw9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoYT8iICgiK2EubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBsLmNvbnRleHQ9YSxsfXZhciBvPWlbdF07aWYobz09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIiltZShvLHRoaXMsZSk7ZWxzZSBmb3IodmFyIG09by5sZW5ndGgsZz1IdChvLG0pLHM9MDtzPG07KytzKW1lKGdbc10sdGhpcyxlKTtyZXR1cm4hMH07ZnVuY3Rpb24gRnQocix0LGUscyl7dmFyIG4saSxhO2lmKFhlKGUpLGk9ci5fZXZlbnRzLGk9PT12b2lkIDA/KGk9ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KGkubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoIm5ld0xpc3RlbmVyIix0LGUubGlzdGVuZXI/ZS5saXN0ZW5lcjplKSxpPXIuX2V2ZW50cyksYT1pW3RdKSxhPT09dm9pZCAwKWE9aVt0XT1lLCsrci5fZXZlbnRzQ291bnQ7ZWxzZSBpZih0eXBlb2YgYT09ImZ1bmN0aW9uIj9hPWlbdF09cz9bZSxhXTpbYSxlXTpzP2EudW5zaGlmdChlKTphLnB1c2goZSksbj1CdChyKSxuPjAmJmEubGVuZ3RoPm4mJiFhLndhcm5lZCl7YS53YXJuZWQ9ITA7dmFyIGw9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrYS5sZW5ndGgrIiAiK1N0cmluZyh0KSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTtsLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsbC5lbWl0dGVyPXIsbC50eXBlPXQsbC5jb3VudD1hLmxlbmd0aCxzcyhsKX1yZXR1cm4gcn1ELnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMSl9LEQucHJvdG90eXBlLm9uPUQucHJvdG90eXBlLmFkZExpc3RlbmVyLEQucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBGdCh0aGlzLHQsZSwhMCl9O2Z1bmN0aW9uIG5zKCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiB4dChyLHQsZSl7dmFyIHM9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTp0LGxpc3RlbmVyOmV9LG49bnMuYmluZChzKTtyZXR1cm4gbi5saXN0ZW5lcj1lLHMud3JhcEZuPW4sbn1ELnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFhlKGUpLHRoaXMub24odCx4dCh0aGlzLHQsZSkpLHRoaXN9LEQucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWGUoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCx4dCh0aGlzLHQsZSkpLHRoaXN9LEQucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHMsbixpLGEsbDtpZihYZShlKSxuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9blt0XSxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHM9PT1lfHxzLmxpc3RlbmVyPT09ZSktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIG5bdF0sbi5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxzLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil7Zm9yKGk9LTEsYT1zLmxlbmd0aC0xO2E+PTA7YS0tKWlmKHNbYV09PT1lfHxzW2FdLmxpc3RlbmVyPT09ZSl7bD1zW2FdLmxpc3RlbmVyLGk9YTticmVha31pZihpPDApcmV0dXJuIHRoaXM7aT09PTA/cy5zaGlmdCgpOmlzKHMsaSkscy5sZW5ndGg9PT0xJiYoblt0XT1zWzBdKSxuLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGx8fGUpfXJldHVybiB0aGlzfSxELnByb3RvdHlwZS5vZmY9RC5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsRC5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHMsbjtpZihzPXRoaXMuX2V2ZW50cyxzPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKHMucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpzW3RdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIHNbdF0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBpPU9iamVjdC5rZXlzKHMpLGE7Zm9yKG49MDtuPGkubGVuZ3RoOysrbilhPWlbbl0sYSE9PSJyZW1vdmVMaXN0ZW5lciImJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGEpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoZT1zW3RdLHR5cGVvZiBlPT0iZnVuY3Rpb24iKXRoaXMucmVtb3ZlTGlzdGVuZXIodCxlKTtlbHNlIGlmKGUhPT12b2lkIDApZm9yKG49ZS5sZW5ndGgtMTtuPj0wO24tLSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZVtuXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIGp0KHIsdCxlKXt2YXIgcz1yLl9ldmVudHM7aWYocz09PXZvaWQgMClyZXR1cm5bXTt2YXIgbj1zW3RdO3JldHVybiBuPT09dm9pZCAwP1tdOnR5cGVvZiBuPT0iZnVuY3Rpb24iP2U/W24ubGlzdGVuZXJ8fG5dOltuXTplP2FzKG4pOkh0KG4sbi5sZW5ndGgpfUQucHJvdG90eXBlLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm4ganQodGhpcyx0LCEwKX0sRC5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBqdCh0aGlzLHQsITEpfSxELmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24ocix0KXtyZXR1cm4gdHlwZW9mIHIubGlzdGVuZXJDb3VudD09ImZ1bmN0aW9uIj9yLmxpc3RlbmVyQ291bnQodCk6VXQuY2FsbChyLHQpfSxELnByb3RvdHlwZS5saXN0ZW5lckNvdW50PVV0O2Z1bmN0aW9uIFV0KHIpe3ZhciB0PXRoaXMuX2V2ZW50cztpZih0IT09dm9pZCAwKXt2YXIgZT10W3JdO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iKXJldHVybiAxO2lmKGUhPT12b2lkIDApcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfUQucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9KZSh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBIdChyLHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscz0wO3M8dDsrK3MpZVtzXT1yW3NdO3JldHVybiBlfWZ1bmN0aW9uIGlzKHIsdCl7Zm9yKDt0KzE8ci5sZW5ndGg7dCsrKXJbdF09clt0KzFdO3IucG9wKCl9ZnVuY3Rpb24gYXMocil7Zm9yKHZhciB0PW5ldyBBcnJheShyLmxlbmd0aCksZT0wO2U8dC5sZW5ndGg7KytlKXRbZV09cltlXS5saXN0ZW5lcnx8cltlXTtyZXR1cm4gdH1mdW5jdGlvbiBvcyhyLHQpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlLHMpe2Z1bmN0aW9uIG4oYSl7ci5yZW1vdmVMaXN0ZW5lcih0LGkpLHMoYSl9ZnVuY3Rpb24gaSgpe3R5cGVvZiByLnJlbW92ZUxpc3RlbmVyPT0iZnVuY3Rpb24iJiZyLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbiksZShbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfUt0KHIsdCxpLHtvbmNlOiEwfSksdCE9PSJlcnJvciImJmNzKHIsbix7b25jZTohMH0pfSl9ZnVuY3Rpb24gY3Mocix0LGUpe3R5cGVvZiByLm9uPT0iZnVuY3Rpb24iJiZLdChyLCJlcnJvciIsdCxlKX1mdW5jdGlvbiBLdChyLHQsZSxzKXtpZih0eXBlb2Ygci5vbj09ImZ1bmN0aW9uIilzLm9uY2U/ci5vbmNlKHQsZSk6ci5vbih0LGUpO2Vsc2UgaWYodHlwZW9mIHIuYWRkRXZlbnRMaXN0ZW5lcj09ImZ1bmN0aW9uIilyLmFkZEV2ZW50TGlzdGVuZXIodCxmdW5jdGlvbiBuKGkpe3Mub25jZSYmci5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiksZShpKX0pO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJlbWl0dGVyIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgRXZlbnRFbWl0dGVyLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfXZhciBSOyhmdW5jdGlvbihyKXtyW3IuTUFKT1JfRVZFTlQ9MF09Ik1BSk9SX0VWRU5UIixyW3IuTUlOT1JfRVZFTlQ9MV09Ik1JTk9SX0VWRU5UIn0pKFJ8fChSPXt9KSk7dmFyIFM7KGZ1bmN0aW9uKHIpe3IuUFJFQ0FMTF9URVNUX0JFR0lOPSJwcmVjYWxsX2JlZ2luIixyLlBSRUNBTExfVEVTVF9DT01QTEVURT0icHJlY2FsbF9lbmQiLHIuQ0FMTF9KT0lOX0JFR0lOPSJjYWxsX2pvaW4iLHIuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTj0ibmV0X3F1YWxpdHlfdGVzdF9iZWdpbiIsci5ORVRfUVVBTElUWV9URVNUX0VORD0ibmV0X3F1YWxpdHlfdGVzdF9lbmQiLHIuV0VCU09DS0VUX0NPTk5FQ1RFRD0id2Vic29ja2V0X2Nvbm5lY3RlZCIsci5UUkFOU1BPUlRfQ09OTkVDVEVEPSJ0cmFuc3BvcnRfY29ubmVjdGVkIixyLkFVRElPX09OPSJhdWRpb19vbiIsci5BVURJT19PRkY9ImF1ZGlvX29mZiIsci5WSURFT19PTj0idmlkZW9fb24iLHIuVklERU9fT0ZGPSJ2aWRlb19vZmYiLHIuUEFSVElDSVBBTlRfUk9MRT0icGFydGljaXBhbnRfcm9sZSIsci5QSU5HX1NUQVQ9InBpbmdfc3RhdCIsci5ESVNDT05ORUNUPSJkaXNjb25uZWN0IixyLlJFQ09OTkVDVF9BVFRFTVBUPSJyZWNvbm5lY3RfYXR0ZW1wdCIsci5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQ9InNjcmVlbnNoYXJlX3N0YXJ0X3JlcXVlc3RlZCIsci5TQ1JFRU5TSEFSRV9TVEFSVEVEPSJzY3JlZW5zaGFyZV9zdGFydGVkIixyLlNDUkVFTlNIQVJFX1NUT1BQRUQ9InNjcmVlbnNoYXJlX3N0b3BwZWQiLHIuVEFCX0NIQU5HRT0idGFiX2NoYW5nZSIsci5CUk9XU0VSX0JBQ0tHUk9VTkRFRD0iYnJvd3Nlcl9iYWNrZ3JvdW5kZWQiLHIuQlJPV1NFUl9GT1JFR1JPVU5ERUQ9ImJyb3dzZXJfZm9yZWdyb3VuZGVkIixyLkRPTUlOQU5UX1NQRUFLRVI9ImRvbWluYW50X3NwZWFrZXIiLHIuQVVESU9fREVWSUNFU19VUERBVEVTPSJhdWRpb19kZXZpY2VzX3VwZGF0ZXMiLHIuVklERU9fREVWSUNFU19VUERBVEVTPSJ2aWRlb19kZXZpY2VzX3VwZGF0ZXMiLHIuU1BFQUtFUl9ERVZJQ0VTX1VQREFURVM9InNwZWFrZXJfZGV2aWNlc191cGRhdGVzIixyLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFPSJzZWxlY3RlZF9taWNyb3Bob25lX3VwZGF0ZSIsci5TRUxFQ1RFRF9DQU1FUkFfVVBEQVRFPSJzZWxlY3RlZF9jYW1lcmFfdXBkYXRlIixyLlNFTEVDVEVEX1NQRUFLRVJfVVBEQVRFPSJzZWxlY3RlZF9zcGVha2VyX3VwZGF0ZSIsci5FWFBFQ1RFRF9WSURFT19SRVNPTFVUSU9OPSJleHBlY3RlZF92aWRlb19yZXNvbHV0aW9uIixyLkVYUEVDVEVEX1NDUkVFTlNIQVJFX1JFU09MVVRJT049ImV4cGVjdGVkX3NjcmVlbnNoYXJlX3Jlc29sdXRpb24iLHIuTUVESUFfUEVSTUlTU0lPTj0ibWVkaWFfcGVybWlzc2lvbiIsci5MRUdBQ1lfU1dJVENIPSJsZWdhY3lfc3dpdGNoIixyLkFVRElPX1BMQVlfRkFJTEVEPSJhdWRpb19wbGF5X2ZhaWxlZCIsci5WSURFT19QTEFZX0ZBSUxFRD0idmlkZW9fcGxheV9mYWlsZWQiLHIuQVVESU9fVFJBQ0tfTVVURUQ9ImF1ZGlvX3RyYWNrX211dGVkIixyLlZJREVPX1RSQUNLX01VVEVEPSJ2aWRlb190cmFja19tdXRlZCIsci5JVlNfUExBWUVSX1JFQlVGRkVSSU5HPSJpdnNfcGxheWVyX3JlYnVmZmVyaW5nIixyLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRD0iaXZzX3BsYXllcl9hdWRpb19ibG9ja2VkIixyLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRD0iaXZzX3BsYXllcl9wbGF5YmFja19ibG9ja2VkIixyLklWU19QTEFZRVJfRVJST1I9Iml2c19wbGF5ZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUj0iaXZzX3BsYXllcl9yZWNvdmVyYWJsZV9lcnJvciIsci5JVlNfUExBWUVSX1dPUktFUl9FUlJPUj0iaXZzX3BsYXllcl93b3JrZXJfZXJyb3IiLHIuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFPSJpdnNfcGxheWVyX25ldHdvcmtfdW5hdmFpbGFibGUiLHIuTElWRVNUUkVBTV9MQVRFTkNZPSJsaXZlc3RyZWFtX2xhdGVuY3kiLHIuSVZTX1BMQVlFUl9BTkFMWVRJQ1NfRVZFTlQ9Iml2c19wbGF5ZXJfYW5hbHl0aWNzX2V2ZW50IixyLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VEPSJpdnNfcGxheWVyX3BsYXliYWNrX3JhdGVfY2hhbmdlZCIsci5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRD0iaXZzX3BsYXllcl9xdWFsaXR5X2NoYW5nZWQiLHIuSVZTX1BMQVlFUl9JTklUSUFMSVpFRD0iaXZzX3BsYXllcl9pbml0aWFsaXplZCJ9KShTfHwoUz17fSkpO2NvbnN0IGRzPW5ldyBNYXAoW1tTLlBSRUNBTExfVEVTVF9CRUdJTixSLk1JTk9SX0VWRU5UXSxbUy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsUi5NSU5PUl9FVkVOVF0sW1MuQ0FMTF9KT0lOX0JFR0lOLFIuTUFKT1JfRVZFTlRdLFtTLk5FVF9RVUFMSVRZX1RFU1RfQkVHSU4sUi5NSU5PUl9FVkVOVF0sW1MuTkVUX1FVQUxJVFlfVEVTVF9FTkQsUi5NSU5PUl9FVkVOVF0sW1MuV0VCU09DS0VUX0NPTk5FQ1RFRCxSLk1JTk9SX0VWRU5UXSxbUy5UUkFOU1BPUlRfQ09OTkVDVEVELFIuTUFKT1JfRVZFTlRdLFtTLkFVRElPX09OLFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX09GRixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PTixSLk1JTk9SX0VWRU5UXSxbUy5WSURFT19PRkYsUi5NSU5PUl9FVkVOVF0sW1MuUEFSVElDSVBBTlRfUk9MRSxSLk1JTk9SX0VWRU5UXSxbUy5QSU5HX1NUQVQsUi5NQUpPUl9FVkVOVF0sW1MuRElTQ09OTkVDVCxSLk1BSk9SX0VWRU5UXSxbUy5SRUNPTk5FQ1RfQVRURU1QVCxSLk1BSk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVEFSVF9SRVFVRVNURUQsUi5NSU5PUl9FVkVOVF0sW1MuU0NSRUVOU0hBUkVfU1RBUlRFRCxSLk1JTk9SX0VWRU5UXSxbUy5TQ1JFRU5TSEFSRV9TVE9QUEVELFIuTUlOT1JfRVZFTlRdLFtTLlRBQl9DSEFOR0UsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9CQUNLR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuQlJPV1NFUl9GT1JFR1JPVU5ERUQsUi5NSU5PUl9FVkVOVF0sW1MuRE9NSU5BTlRfU1BFQUtFUixSLk1JTk9SX0VWRU5UXSxbUy5BVURJT19ERVZJQ0VTX1VQREFURVMsUi5NSU5PUl9FVkVOVF0sW1MuVklERU9fREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX01JQ1JPSFBPTkVfVVBEQVRFLFIuTUlOT1JfRVZFTlRdLFtTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsUi5NSU5PUl9FVkVOVF0sW1MuTUVESUFfUEVSTUlTU0lPTixSLk1JTk9SX0VWRU5UXSxbUy5MRUdBQ1lfU1dJVENILFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1BMQVlfRkFJTEVELFIuTUlOT1JfRVZFTlRdLFtTLkFVRElPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLlZJREVPX1RSQUNLX01VVEVELFIuTUlOT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVCVUZGRVJJTkcsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9BVURJT19CTE9DS0VELFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUExBWUJBQ0tfQkxPQ0tFRCxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0VSUk9SLFIuTUFKT1JfRVZFTlRdLFtTLklWU19QTEFZRVJfUkVDT1ZFUkFCTEVfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9XT1JLRVJfRVJST1IsUi5NQUpPUl9FVkVOVF0sW1MuSVZTX1BMQVlFUl9ORVRXT1JLX1VOQVZBSUxBQkxFLFIuTUFKT1JfRVZFTlRdLFtTLkxJVkVTVFJFQU1fTEFURU5DWSxSLk1BSk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0FOQUxZVElDU19FVkVOVCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1BMQVlCQUNLX1JBVEVfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX1FVQUxJVFlfQ0hBTkdFRCxSLk1JTk9SX0VWRU5UXSxbUy5JVlNfUExBWUVSX0lOSVRJQUxJWkVELFIuTUlOT1JfRVZFTlRdLFtTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sUi5NSU5PUl9FVkVOVF0sW1MuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTixSLk1JTk9SX0VWRU5UXV0pO2NsYXNzIGxze2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJldmVudHMiKTt0aGlzLmV2ZW50cz1bXX1hZGQodCl7dGhpcy5ldmVudHMucHVzaCh0KX1mbHVzaCgpe3JldHVybntlbnRyaWVzOnRoaXMuZXZlbnRzLnNwbGljZSgwLDI1KX19fWNsYXNzIHVzIGV4dGVuZHMgentjb25zdHJ1Y3Rvcih7bG9nZ2VyOmUscGVlcklkOnMsYXBpSG9zdG5hbWVzOm4sYXV0aFRva2VuOml9KXtzdXBlcigpO3AodGhpcywibG9nZ2VyIik7cCh0aGlzLCJwZWVySWQiKTtwKHRoaXMsImV2ZW50U3RvcmUiKTtwKHRoaXMsImFwaUVuZHBvaW50Iik7cCh0aGlzLCJhdXRoVG9rZW4iKTt0aGlzLmxvZ2dlcj1lLHRoaXMucGVlcklkPXMsdGhpcy5hdXRoVG9rZW49aSx0aGlzLmFwaUVuZHBvaW50PWBodHRwczovLyR7bi5kYUNvbGxlY3Rvcn0vYXBpL3YxL21lc3NhZ2VgLHRoaXMuZXZlbnRTdG9yZT1uZXcgbHN9c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXIoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9e3BheWxvYWQ6ZSxwZWVySWQ6dGhpcy5wZWVySWR9LG49bmV3IEFib3J0Q29udHJvbGxlcixpPXNldFRpbWVvdXQoKCk9Pm4uYWJvcnQoKSwzZTMpO3RyeXtyZXR1cm4geWllbGQgZmV0Y2godGhpcy5hcGlFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOnsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsQXV0aG9yaXphdGlvbjpgQmVhcmVyICR7dGhpcy5hdXRoVG9rZW59YH0sYm9keTpKU09OLnN0cmluZ2lmeShzKSxzaWduYWw6bi5zaWduYWx9KSwhMH1jYXRjaChhKXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoImNhbGxTdGF0czo6c2VuZEV2ZW50c0NodW5rVG9TZXJ2ZXI6OmNhdGNoIix7cGVlcklkOnRoaXMucGVlcklkLGVuZHBvaW50OnRoaXMuYXBpRW5kcG9pbnQsZXJyb3I6YSBpbnN0YW5jZW9mIEVycm9yP2EubWVzc2FnZTpTdHJpbmcoYSksc3RhY2s6YSBpbnN0YW5jZW9mIEVycm9yP2Euc3RhY2s6dm9pZCAwfSksITF9ZmluYWxseXtjbGVhclRpbWVvdXQoaSl9fSl9Y2FsbEV2ZW50KGUpe2UudGltZXN0YW1wPW5ldyBEYXRlLHRoaXMuZXZlbnRTdG9yZS5hZGQoZSksdGhpcy5lbWl0KGUuZXZlbnQsZS5tZXRhRGF0YSksZHMuZ2V0KGUuZXZlbnQpPT09Ui5NQUpPUl9FVkVOVCYmdGhpcy5mbHVzaCgpfWZsdXNoKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBzO2NvbnN0IGU9dGhpcy5ldmVudFN0b3JlLmZsdXNoKCk7aWYoKHM9ZT09bnVsbD92b2lkIDA6ZS5lbnRyaWVzKSE9bnVsbCYmcy5sZW5ndGgpe2NvbnN0IG49eWllbGQgdGhpcy5zZW5kRXZlbnRzQ2h1bmtUb1NlcnZlcihlKTtyZXR1cm4gbnx8ZS5lbnRyaWVzLmZvckVhY2goaT0+e3RoaXMuZXZlbnRTdG9yZS5hZGQoaSl9KSxufXJldHVybiExfSl9fXZhciB6dDsoZnVuY3Rpb24ocil7ci5DSFJPTUlVTT0iY2hyb211bSIsci5GSVJFRk9YPSJmaXJlZm94IixyLlNBRkFSST0ic2FmYXJpIn0pKHp0fHwoenQ9e30pKTtjb25zdCBXdD17REVWRUw6ImRldmVsIixQUkVQUk9EOiJwcmVwcm9kIixQUk9EOiJwcm9kIn07dmFyIHE7KGZ1bmN0aW9uKHIpe3IuQVVESU89IkFVRElPIixyLlZJREVPPSJWSURFTyIsci5TUEVBS0VSPSJTUEVBS0VSIixyLlNDUkVFTlNIQVJFPSJTQ1JFRU5TSEFSRSJ9KShxfHwocT17fSkpO3ZhciAkdDsoZnVuY3Rpb24ocil7cltyLklOSVQ9MF09IklOSVQiLHJbci5BQ0NFUFRFRD0xXT0iQUNDRVBURUQiLHJbci5ERU5JRUQ9Ml09IkRFTklFRCIscltyLlNZU19ERU5JRUQ9M109IlNZU19ERU5JRUQiLHJbci5GQUlMRUQ9NF09IkZBSUxFRCIscltyLk5PVEZPVU5EPTVdPSJOT1RGT1VORCIscltyLk5PVF9BUFBMSUNBQkxFPTZdPSJOT1RfQVBQTElDQUJMRSJ9KSgkdHx8KCR0PXt9KSk7ZnVuY3Rpb24gdGUocil7cmV0dXJuIHI/ci5zcGxpdCgiLiIpLnNsaWNlKDAsMikuY29uY2F0KFsiMCIsIjAiXSkuam9pbigiLiIpOiIifWZ1bmN0aW9uIFplKHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnR9KXtyZXR1cm4gdD4wP3IqMTAwL3Q6MH1mdW5jdGlvbiBldCh7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWNvbnN0IEd0PTI0MCxZdD03MjAscXQ9OCxRdD0zLHR0PTEwLHJ0PS4wMixzdD0uMDM7ZnVuY3Rpb24gSih7c3RhdDpyLHdlaWdodDp0LHJhbmdlTWluOmUscmFuZ2VNYXg6cyxyYW5nZVJhbmtpbmdEaXJlY3Rpb246bn0pe3JldHVybiByPT1udWxsP3Q6ZT09PXM/bj09PSJVUCI/cjw9ZT90OjA6cj49cz90OjA6bj09PSJVUCI/KDEtTWF0aC5tYXgoTWF0aC5taW4ocyxNYXRoLmFicyhyKSktZSwwKS8ocy1lKSkqdDpuPT09IkRPV04iP01hdGgubWF4KE1hdGgubWluKHMsTWF0aC5hYnMocikpLWUsMCkvKHMtZSkqdDp0fWZ1bmN0aW9uIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzpyLGlzVmlkZW9TdHVjazp0LGlzVmlkZW9MYWdnaW5nOmUsaml0dGVyUXVhbGl0eTpzLHBhY2tldHNMb3N0UXVhbGl0eTpufSl7Y29uc3QgaT0uOCooKHI/Ljg1OjEpKihlPy43OjEpKih0Py41OjEpKSsuMioocypuKTtyZXR1cm4gTWF0aC5yb3VuZCgoaStOdW1iZXIuRVBTSUxPTikqMTAwKS8xMDB9ZnVuY3Rpb24gWHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pe3JldHVybiB0PjA/cioxMDAvdDowfWZ1bmN0aW9uIFp0KHtwYWNrZXRzTG9zdDpyLHBhY2tldHNTZW50OnQsaml0dGVyOmV9KXtjb25zdCBuPUooe3N0YXQ6WHQoe3BhY2tldHNMb3N0OnIscGFja2V0c1NlbnQ6dH0pLHdlaWdodDouNyxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT1KKHtzdGF0OmUsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIG4rYX1mdW5jdGlvbiBwcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1l0Okd0KX1mdW5jdGlvbiBocyh7ZnJhbWVzUGVyU2Vjb25kOnIsaXNTY3JlZW5TaGFyZTp0fSl7cmV0dXJuIHI8KHQ/UXQ6cXQpfWZ1bmN0aW9uIG1zKHtmcmFtZXNFbmNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZXIoe2ZyYW1lV2lkdGg6cixmcmFtZXNQZXJTZWNvbmQ6dCxwYWNrZXRzTG9zdDplLHBhY2tldHNTZW50OnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0VuY29kZWQ6YX0pe2NvbnN0IGw9Sih7c3RhdDpYdCh7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzU2VudDpzfSksd2VpZ2h0OjEscmFuZ2VNaW46MCxyYW5nZU1heDp0dCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG89Sih7c3RhdDpuLHdlaWdodDoxLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksbT1wcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6aX0pLGc9aHMoe2ZyYW1lc1BlclNlY29uZDp0LGlzU2NyZWVuU2hhcmU6aX0pLHk9bXMoe2ZyYW1lc0VuY29kZWQ6YSxpc1NjcmVlblNoYXJlOml9KTtyZXR1cm4gSnQoe2lzTG93UXVhbGl0eVZpZGVvOm0saXNWaWRlb0xhZ2dpbmc6Zyxpc1ZpZGVvU3R1Y2s6eSxqaXR0ZXJRdWFsaXR5Om8scGFja2V0c0xvc3RRdWFsaXR5Omx9KX1mdW5jdGlvbiB0cih7cGFja2V0c0xvc3Q6cixwYWNrZXRzUmVjZWl2ZWQ6dH0pe3JldHVybiB0K3I+MD9yKjEwMC8odCtyKTowfWZ1bmN0aW9uIHJyKHtjb25jZWFsbWVudEV2ZW50czpyLHBhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmUsaml0dGVyOnN9KXtjb25zdCBpPUooe3N0YXQ6cix3ZWlnaHQ6LjIscmFuZ2VNaW46MCxyYW5nZU1heDozLHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksYT0uNSxsPUooe3N0YXQ6dHIoe3BhY2tldHNMb3N0OnQscGFja2V0c1JlY2VpdmVkOmV9KSx3ZWlnaHQ6YSxyYW5nZU1pbjowLHJhbmdlTWF4OnR0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSksbT1KKHtzdGF0OnMsd2VpZ2h0Oi4zLHJhbmdlTWluOnJ0LHJhbmdlTWF4OnN0LHJhbmdlUmFua2luZ0RpcmVjdGlvbjoiVVAifSk7cmV0dXJuIGkrbCttfWZ1bmN0aW9uIGZzKHtmcmFtZXNEZWNvZGVkOnJ9KXtyZXR1cm4gcj09PTB9ZnVuY3Rpb24gZ3Moe2ZyYW1lc1BlclNlY29uZDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1F0OnF0KX1mdW5jdGlvbiBTcyh7ZnJhbWVXaWR0aDpyLGlzU2NyZWVuU2hhcmU6dH0pe3JldHVybiByPCh0P1l0Okd0KX1mdW5jdGlvbiBzcih7ZnJhbWVXaWR0aDpyLGZyYW1lc1BlclNlY29uZDp0LHBhY2tldHNMb3N0OmUscGFja2V0c1JlY2VpdmVkOnMsaml0dGVyOm4saXNTY3JlZW5TaGFyZTppLGZyYW1lc0RlY29kZWQ6YX0pe2NvbnN0IGw9Sih7c3RhdDp0cih7cGFja2V0c0xvc3Q6ZSxwYWNrZXRzUmVjZWl2ZWQ6c30pLHdlaWdodDoxLHJhbmdlTWluOjAscmFuZ2VNYXg6dHQscmFuZ2VSYW5raW5nRGlyZWN0aW9uOiJVUCJ9KSxvPUooe3N0YXQ6bix3ZWlnaHQ6MSxyYW5nZU1pbjpydCxyYW5nZU1heDpzdCxyYW5nZVJhbmtpbmdEaXJlY3Rpb246IlVQIn0pLG09U3Moe2ZyYW1lV2lkdGg6cixpc1NjcmVlblNoYXJlOml9KSxnPWdzKHtmcmFtZXNQZXJTZWNvbmQ6dCxpc1NjcmVlblNoYXJlOml9KSx5PWZzKHtmcmFtZXNEZWNvZGVkOmEsaXNTY3JlZW5TaGFyZTppfSk7cmV0dXJuIEp0KHtpc0xvd1F1YWxpdHlWaWRlbzptLGlzVmlkZW9MYWdnaW5nOmcsaXNWaWRlb1N0dWNrOnksaml0dGVyUXVhbGl0eTpvLHBhY2tldHNMb3N0UXVhbGl0eTpsfSl9Y2xhc3MgWHtjb25zdHJ1Y3Rvcih0KXtwKHRoaXMsInBjMSIpO3AodGhpcywicGMyIik7cCh0aGlzLCJjb25zdHJhaW5WaWRlb0JpdHJhdGVLYnBzIik7cCh0aGlzLCJjb25zdHJhaW5PZmZlclRvUmVtb3ZlVmlkZW9GZWMiLCExKTtwKHRoaXMsImljZUNhbmRpZGF0ZUZpbHRlciIpO2NvbnN0IGU9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpLHM9bmV3IFJUQ1BlZXJDb25uZWN0aW9uKHQpO3RoaXMucGMxPWUsdGhpcy5wYzI9cyx0aGlzLmljZUNhbmRpZGF0ZUZpbHRlcj1YLm5vRmlsdGVyLHRoaXMucGMxLmFkZEV2ZW50TGlzdGVuZXIoImljZWNhbmRpZGF0ZSIsdGhpcy5vbkljZUNhbmRpZGF0ZS5iaW5kKHRoaXMsdGhpcy5wYzIpKSx0aGlzLnBjMi5hZGRFdmVudExpc3RlbmVyKCJpY2VjYW5kaWRhdGUiLHRoaXMub25JY2VDYW5kaWRhdGUuYmluZCh0aGlzLHRoaXMucGMxKSl9c3RhdGljIHBhcnNlQ2FuZGlkYXRlKHQpe2NvbnN0IGU9ImNhbmRpZGF0ZToiLHM9dC5pbmRleE9mKGUpK2UubGVuZ3RoLG49dC5zdWJzdHIocykuc3BsaXQoIiAiKTtyZXR1cm57dHlwZTpuWzddLHByb3RvY29sOm5bMl0sYWRkcmVzczpuWzRdfX1zdGF0aWMgaXNOb3RIb3N0Q2FuZGlkYXRlKHQpe3JldHVybiB0LnR5cGUhPT0iaG9zdCJ9c3RhdGljIGlzSG9zdCh0KXtyZXR1cm4gdC50eXBlPT09Imhvc3QifXN0YXRpYyBpc1JlbGF5KHQpe3JldHVybiB0LnR5cGU9PT0icmVsYXkifXN0YXRpYyBpc1JlZmxleGl2ZSh0KXtyZXR1cm4gdC50eXBlPT09InNyZmx4In1zdGF0aWMgbm9GaWx0ZXIodCl7cmV0dXJuITB9b25JY2VDYW5kaWRhdGUodCxlKXtpZihlLmNhbmRpZGF0ZSl7Y29uc3Qgcz1YLnBhcnNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlLmNhbmRpZGF0ZSk7dGhpcy5pY2VDYW5kaWRhdGVGaWx0ZXIocykmJnQuYWRkSWNlQ2FuZGlkYXRlKGUuY2FuZGlkYXRlKX19c2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHQpe3RoaXMuaWNlQ2FuZGlkYXRlRmlsdGVyPXR9Y29uc3RyYWluVmlkZW9CaXRyYXRlKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2Jwcz10fWRpc2FibGVWaWRlb0ZlYygpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjPSEwfWdvdE9mZmVyKHQpe3RoaXMuY29uc3RyYWluT2ZmZXJUb1JlbW92ZVZpZGVvRmVjJiYodC5zZHA9dC5zZHAucmVwbGFjZSgvKG09dmlkZW8gMSBbXlxyXSspKDExNiAxMTcpKFxyXG4pL2csYCQxXHIKYCksdC5zZHA9dC5zZHAucmVwbGFjZSgvYT1ydHBtYXA6MTE2IHJlZFwvOTAwMDBcclxuL2csIiIpLHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9cnRwbWFwOjExNyB1bHBmZWNcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPXJ0cG1hcDo5OCBydHhcLzkwMDAwXHJcbi9nLCIiKSx0LnNkcD10LnNkcC5yZXBsYWNlKC9hPWZtdHA6OTggYXB0PTExNlxyXG4vZywiIikpLHRoaXMucGMxLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzIuc2V0UmVtb3RlRGVzY3JpcHRpb24odCksdGhpcy5wYzIuY3JlYXRlQW5zd2VyKCkudGhlbih0aGlzLmdvdEFuc3dlci5iaW5kKHRoaXMpLHRoaXMucmVwb3J0RmF0YWwuYmluZCh0aGlzKSl9Z290QW5zd2VyKHQpe3RoaXMuY29uc3RyYWluVmlkZW9CaXRyYXRlS2JwcyYmKHQuc2RwPXQuc2RwLnJlcGxhY2UoL2E9bWlkOnZpZGVvXHJcbi9nLGBhPW1pZDp2aWRlb1xyCmI9QVM6JHt0aGlzLmNvbnN0cmFpblZpZGVvQml0cmF0ZUticHN9XHIKYCkpLHRoaXMucGMyLnNldExvY2FsRGVzY3JpcHRpb24odCksdGhpcy5wYzEuc2V0UmVtb3RlRGVzY3JpcHRpb24odCl9ZXN0YWJsaXNoQ29ubmVjdGlvbigpe3RoaXMucGMxLmNyZWF0ZU9mZmVyKCkudGhlbih0aGlzLmdvdE9mZmVyLmJpbmQodGhpcyksdGhpcy5yZXBvcnRGYXRhbC5iaW5kKHRoaXMpKX1yZXBvcnRGYXRhbCh0KXtjb25zb2xlLmVycm9yKCJFcnJvcjoiLHQpfWdldFJvdW5kVHJpcFRpbWUoKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3RbdCxlXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5wYzEuZ2V0U3RhdHMoKSx0aGlzLnBjMi5nZXRTdGF0cygpXSk7bGV0IHMsbjtpZih0LmZvckVhY2goaT0+e2kudHlwZT09PSJjYW5kaWRhdGUtcGFpciImJmkubm9taW5hdGVkPT09ITAmJmkuYnl0ZXNTZW50PjAmJihzPWkpfSksZS5mb3JFYWNoKGk9PntpLnR5cGU9PT0iY2FuZGlkYXRlLXBhaXIiJiZpLm5vbWluYXRlZD09PSEwJiZpLmJ5dGVzUmVjZWl2ZWQ+MCYmKG49aSl9KSxzJiZuKXRyeXtpZihzLmN1cnJlbnRSb3VuZFRyaXBUaW1lJiZuLmN1cnJlbnRSb3VuZFRyaXBUaW1lKXJldHVybntydHQ6cy5jdXJyZW50Um91bmRUcmlwVGltZSxiYWNrZW5kUlRUOm4uY3VycmVudFJvdW5kVHJpcFRpbWV9O2NvbnN0IGk9KG4ubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLXMubGFzdFBhY2tldFNlbnRUaW1lc3RhbXApLzFlMztyZXR1cm57cnR0OmksYmFja2VuZFJUVDppfX1jYXRjaChpKXtyZXR1cm59fSl9Y2xvc2UoKXt0aGlzLnBjMS5jbG9zZSgpLHRoaXMucGMyLmNsb3NlKCl9fWNsYXNzIG5yIGV4dGVuZHMgentjb25zdHJ1Y3RvcihlKXtzdXBlcigpO3AodGhpcywiY2FsbCIpO3AodGhpcywidGltZU91dCIpO3RoaXMuY2FsbD1uZXcgWChlKX1zdGFydChlPTFlNCl7dGhpcy5jYWxsLmVzdGFibGlzaENvbm5lY3Rpb24oKSx0aGlzLnRpbWVPdXQ9c2V0VGltZW91dCh0aGlzLnRlc3RGYWlsZWQuYmluZCh0aGlzKSxlKX10ZXN0Q29tcGxldGUoZSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCksdGhpcy5jYWxsLmNsb3NlKCksdGhpcy5lbWl0KCJkb25lIixlKX10ZXN0RmFpbGVkKGUpe3RoaXMuY2FsbC5jbG9zZSgpLHRoaXMuZW1pdCgiZmFpbGVkIixlKX19Y29uc3QgYnM9OCx2cz0xLzFlMztjbGFzcyB5cyBleHRlbmRzIG5ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpO3AodGhpcywic2VuZGVyQ2hhbm5lbCIpO3AodGhpcywicmVjaWV2ZUNoYW5uZWwiKTtwKHRoaXMsInN0YXJ0VGltZSIpO3AodGhpcywibGFzdEJpdHJhdGVNZWFzdXJlVGltZSIpO3AodGhpcywic2VudFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJyZWNpZXZlZFBheWxvYWRCeXRlcyIsMCk7cCh0aGlzLCJsYXN0UmVjZWl2ZWRQYXlsb2FkQnl0ZXMiLDApO3AodGhpcywic3RvcFNlbmRpbmciLCExKTtwKHRoaXMsInRlc3RQcm9ncmVzcyIsMCk7cCh0aGlzLCJzYW1wbGVQYWNrZXQiLCIiKTtwKHRoaXMsImZpbmFsQml0cmF0ZVN1bSIsMCk7cCh0aGlzLCJiaXRSYXRlU2FtcGVscyIsMCk7cCh0aGlzLCJtYXhOdW1iZXJPZlBhY2tldHNUb1NlbmQiLDApO3AodGhpcywiYnl0ZXNUb0tlZXBCdWZmZXJlZCIsMCk7cCh0aGlzLCJ0ZXN0RHVyYXRpb25TZWNvbmRzIiw1KTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKFguaXNOb3RIb3N0Q2FuZGlkYXRlKSx0aGlzLnNlbmRlckNoYW5uZWw9dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTtmb3IobGV0IHM9MDtzPDEwMjQqMjU2O3MrPTEpdGhpcy5zYW1wbGVQYWNrZXQrPSJoIjt0aGlzLm1heE51bWJlck9mUGFja2V0c1RvU2VuZD0xLHRoaXMuYnl0ZXNUb0tlZXBCdWZmZXJlZD0xMDI0KnRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kLHRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz00LHRoaXMuc2VuZGVyQ2hhbm5lbC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIix0aGlzLnNlbmRpbmdTdGVwLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMub25SZWNpZXZlckNoYW5uZWwuYmluZCh0aGlzKSl9c2VuZGluZ1N0ZXAoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMuc3RhcnRUaW1lfHwodGhpcy5zdGFydFRpbWU9ZSx0aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWU9ZSk7Zm9yKGxldCBuPTA7biE9PXRoaXMubWF4TnVtYmVyT2ZQYWNrZXRzVG9TZW5kJiYhKHRoaXMuc2VuZGVyQ2hhbm5lbC5idWZmZXJlZEFtb3VudD49dGhpcy5ieXRlc1RvS2VlcEJ1ZmZlcmVkKTtuKz0xKXt0aGlzLnNlbnRQYXlsb2FkQnl0ZXMrPXRoaXMuc2FtcGxlUGFja2V0Lmxlbmd0aDt0cnl7dGhpcy5zZW5kZXJDaGFubmVsLnNlbmQodGhpcy5zYW1wbGVQYWNrZXQpfWNhdGNoKGkpe319Y29uc3Qgcz1lLmdldFRpbWUoKS10aGlzLnN0YXJ0VGltZS5nZXRUaW1lKCk7cz49MWUzKnRoaXMudGVzdER1cmF0aW9uU2Vjb25kcz8odGhpcy5zdG9wU2VuZGluZz0hMCx0aGlzLnRlc3RQcm9ncmVzcz0xMDApOih0aGlzLnRlc3RQcm9ncmVzcz1zLygxMCp0aGlzLnRlc3REdXJhdGlvblNlY29uZHMpLHNldFRpbWVvdXQodGhpcy5zZW5kaW5nU3RlcC5iaW5kKHRoaXMpLDEpKX1vbk1lc3NhZ2VSZWNpZXZlZChlKXt0aGlzLnJlY2lldmVkUGF5bG9hZEJ5dGVzKz1lLmRhdGEubGVuZ3RoO2NvbnN0IHM9bmV3IERhdGUsbj1zLmdldFRpbWUoKS10aGlzLmxhc3RCaXRyYXRlTWVhc3VyZVRpbWUuZ2V0VGltZSgpO2lmKG4+PTFlMyl7Y29uc3QgYT0odGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcy10aGlzLmxhc3RSZWNlaXZlZFBheWxvYWRCeXRlcykqYnMvKG4vMWUzKTt0aGlzLmZpbmFsQml0cmF0ZVN1bSs9YSx0aGlzLmJpdFJhdGVTYW1wZWxzKz0xLHRoaXMubGFzdFJlY2VpdmVkUGF5bG9hZEJ5dGVzPXRoaXMucmVjaWV2ZWRQYXlsb2FkQnl0ZXMsdGhpcy5sYXN0Qml0cmF0ZU1lYXN1cmVUaW1lPXN9aWYodGhpcy5zdG9wU2VuZGluZyYmdGhpcy5zZW50UGF5bG9hZEJ5dGVzPT09dGhpcy5yZWNpZXZlZFBheWxvYWRCeXRlcyl7Y29uc3QgaT10aGlzLmZpbmFsQml0cmF0ZVN1bS90aGlzLmJpdFJhdGVTYW1wZWxzO3RoaXMudGVzdENvbXBsZXRlKHt0aHJvdWdocHV0Ok1hdGgucm91bmQoaSp2cyl9KX19dGVzdENvbXBsZXRlKGUpe3RoaXMuY2FsbC5nZXRSb3VuZFRyaXBUaW1lKCkudGhlbigoe3J0dDpzLGJhY2tlbmRSVFQ6bn0pPT5zdXBlci50ZXN0Q29tcGxldGUoe1JUVDpzLGJhY2tlbmRSVFQ6bix0aHJvdWdocHV0OmUudGhyb3VnaHB1dH0pKX1vblJlY2lldmVyQ2hhbm5lbChlKXt0aGlzLnJlY2lldmVDaGFubmVsPWUuY2hhbm5lbCx0aGlzLnJlY2lldmVDaGFubmVsLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25NZXNzYWdlUmVjaWV2ZWQuYmluZCh0aGlzKSl9fWNsYXNzIGh0IGV4dGVuZHMgbnJ7Y29uc3RydWN0b3IoZSxzPVgubm9GaWx0ZXIpe3N1cGVyKGUpO3AodGhpcywiY2gxIik7cCh0aGlzLCJjaDIiKTt0aGlzLmNhbGwuc2V0SWNlQ2FuZGlkYXRlRmlsdGVyKHMpO2NvbnN0IG49dGhpcy5jYWxsLnBjMS5jcmVhdGVEYXRhQ2hhbm5lbChudWxsKTt0aGlzLmNoMT1uLG4uYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsKCk9PntuLnNlbmQoImhlbGxvIil9KSxuLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMub25DaDFSZWNpZXZlLmJpbmQodGhpcykpLHRoaXMuY2FsbC5wYzIuYWRkRXZlbnRMaXN0ZW5lcigiZGF0YWNoYW5uZWwiLHRoaXMuZGF0YUNoYW5uZWxIYW5kbGVyLmJpbmQodGhpcykpfW9uQ2gxUmVjaWV2ZShlKXtlLmRhdGEhPT0id29ybGQiP3RoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik6dGhpcy50ZXN0Q29tcGxldGUoe2Nvbm5lY3Rpdml0eTohMH0pfW9uQ2gyUmVjaWV2ZShlKXtpZihlLmRhdGEhPT0iaGVsbG8iKXRoaXMuaGFuZ3VwKCJJbnZhbGlkIGRhdGEgdHJhbnNtaXR0ZWQuIik7ZWxzZSB0cnl7dGhpcy5jaDIuc2VuZCgid29ybGQiKX1jYXRjaChzKXt9fWRhdGFDaGFubmVsSGFuZGxlcihlKXtjb25zdCBzPWUuY2hhbm5lbDt0aGlzLmNoMj1zLHMuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5vbkNoMlJlY2lldmUuYmluZCh0aGlzKSl9aGFuZ3VwKGUpe3RoaXMudGVzdEZhaWxlZChlKX19Y2xhc3MgRXMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNIb3N0KX19Y2xhc3MgVHMgZXh0ZW5kcyBodHtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0LFguaXNSZWxheSl9fWNsYXNzIFJzIGV4dGVuZHMgaHR7Y29uc3RydWN0b3IodCl7c3VwZXIodCxYLmlzUmVmbGV4aXZlKX19Y2xhc3MgUHN7Y29uc3RydWN0b3IoKXtwKHRoaXMsImlwSW5mb3JtYXRpb24iLG51bGwpfWdldElQRGV0YWlscyhuKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDp0LGFwaUhvc3RuYW1lczplLGxvZ2dlcjpzfSl7dmFyIGksYSxsO2lmKCF0aGlzLmlwSW5mb3JtYXRpb24pe3RyeXtjb25zdCBvPWBodHRwczovLyR7ZS5sb2NhdGlvbn1gLGc9eWllbGQoeWllbGQgZmV0Y2gobykpLmpzb24oKTtpZigoKGk9Zy5sb2MpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCk+NSlyZXR1cm4gdGhpcy5pcEluZm9ybWF0aW9uPWcsKGE9dGhpcy5pcEluZm9ybWF0aW9uKSE9bnVsbCYmYS5pcCYmKHRoaXMuaXBJbmZvcm1hdGlvbi5pcD10ZSh0aGlzLmlwSW5mb3JtYXRpb24uaXApKSxnO3Rocm93IEVycm9yKCJJbnN1ZmZpY2llbnQgZGF0YSIpfWNhdGNoKG8pe3MuZXJyb3IoImNhbGxzdGF0czo6aXBEZXRhaWxzOjogZmFpbGVkIHRvIGZldGNoIGlwIHVzaW5nIGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9dHJ5e2NvbnN0IG89eWllbGQgZmV0Y2goYGh0dHBzOi8vJHtlLmxvY2F0aW9uTGVnYWN5fS8/dG9rZW49M2M0OTM5MzJiMDYyNGMmcGVlcklkPSR7dH1gLHttZXRob2Q6IlBPU1QifSk7dGhpcy5pcEluZm9ybWF0aW9uPXlpZWxkIG8uanNvbigpLChsPXRoaXMuaXBJbmZvcm1hdGlvbikhPW51bGwmJmwuaXAmJih0aGlzLmlwSW5mb3JtYXRpb24uaXA9dGUodGhpcy5pcEluZm9ybWF0aW9uLmlwKSl9Y2F0Y2gobyl7cy5lcnJvcigiY2FsbHN0YXRzOjppcERldGFpbHM6OiBmYWlsZWQgdG8gZmV0Y2ggaXAgdXNpbmcgbGVnYWN5IGxvY2F0aW9uIHNlcnZpY2UiLHtlcnJvcjpvfSl9fXJldHVybiB0aGlzLmlwSW5mb3JtYXRpb259KX1yZXNldENhY2hlKCl7dGhpcy5pcEluZm9ybWF0aW9uPW51bGx9fWNvbnN0IGlyPW5ldyBQcyxhcj1be3VybHM6InR1cm46dHVybi5keXRlLmluOjQ0Mz90cmFuc3BvcnQ9dGNwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifSx7dXJsczoidHVybjp0dXJuLmR5dGUuaW46MzQ3OD90cmFuc3BvcnQ9dWRwIix1c2VybmFtZToiZHl0ZSIsY3JlZGVudGlhbDoiZHl0ZWluIixjcmVkZW50aWFsVHlwZToicGFzc3dvcmQifV07ZnVuY3Rpb24gb3Iocil7Y29uc3RbdCxlXT1yLnNwbGl0KCIsIik7cmV0dXJue2Nvb3Jkczp7bGF0aXR1ZGU6TnVtYmVyKHQpLGxvbmdpdHVkZTpOdW1iZXIoZSl9fX1jbGFzcyBjcntjb25zdHJ1Y3Rvcigpe3AodGhpcywidHJhbnNwb3J0Iik7cCh0aGlzLCJjYW5kaWRhdGVQYWlyIik7cCh0aGlzLCJvdXRib3VuZFZpZGVvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRWaWRlb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJvdXRib3VuZEF1ZGlvUnRwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRBdWRpb1J0cCIsbmV3IE1hcCk7cCh0aGlzLCJyZW1vdGVJbmJvdW5kUnRwIixuZXcgTWFwKTtwKHRoaXMsInByb2R1Y2VyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsImNvbnN1bWVyU3RyZWFtTWFwIixuZXcgTWFwKTtwKHRoaXMsInN0YWxlUHJvZHVjZXJTdHJlYW1NYXAiLCExKTtwKHRoaXMsInN0YWxlQ29uc3VtZXJTdHJlYW1NYXAiLCExKX19Y2xhc3MgZHIgZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKCl7c3VwZXIoKTtwKHRoaXMsIm9ic2VydmVyIik7cCh0aGlzLCJvdXRib3VuZFByb2R1Y2VyTWFwIixuZXcgTWFwKTtwKHRoaXMsImluYm91bmRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJjb25zdW1lclBlZXJJZE1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRDb25zdW1lck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJwYXVzZWRQcm9kdWNlck1hcCIsbmV3IE1hcCk7cCh0aGlzLCJvdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwIix7fSk7cCh0aGlzLCJvdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXAiLHt9KTtwKHRoaXMsIm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcCIse30pO3AodGhpcywidmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywidmlkZW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiYXVkaW9Db25zdW1lclRvU3RhdHNNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJJZHNXaXRoRnJlZXplZFZpZGVvIixuZXcgU2V0KTtwKHRoaXMsImNvbnN1bWVySWRzV2l0aEZyZWV6ZWRBdWRpbyIsbmV3IFNldCk7cCh0aGlzLCJwcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8iLG5ldyBTZXQpO3AodGhpcywicHJvZHVjZXJJZHNXaXRoRnJlZXplZEF1ZGlvIixuZXcgU2V0KTtwKHRoaXMsImZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMiLG5ldyBTZXQpO3AodGhpcywiZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZVByb2R1Y2VycyIsbmV3IFNldCk7cCh0aGlzLCJzY3JlZW5TaGFyZUNvbnN1bWVycyIsbmV3IFNldCk7cCh0aGlzLCJpcERldGFpbHMiKTtwKHRoaXMsImNhbGxTdGF0c0luc3RhbmNlIik7dGhpcy5vYnNlcnZlcj1uZXcgen1yZWdpc3RlclByb2R1Y2VyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSksZS5vbigiY2xvc2UiLHRoaXMuZGVyZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSksZS5vbigicGF1c2UiLHRoaXMucGF1c2VQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUub24oInJlc3VtZSIsdGhpcy5yZXN1bWVQcm9kdWNlci5iaW5kKHRoaXMsZS5pZCkpLGUuYXBwRGF0YS5zY3JlZW5TaGFyZT09PSEwJiZ0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmFkZChlLmlkKX0pfXBhdXNlUHJvZHVjZXIoZSl7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQoZSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITF9KX1yZXN1bWVQcm9kdWNlcihlKXt0aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmRlbGV0ZShlKX1wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGEsbDtjb25zdCBpPSgobD0oYT10aGlzPT1udWxsP3ZvaWQgMDp0aGlzLmNhbGxTdGF0c0luc3RhbmNlKT09bnVsbD92b2lkIDA6YS5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwKT09bnVsbD92b2lkIDA6bC5nZXQoZSkpfHx7fTtzLnRvdGFsVmlkZW9QYWNrZXRzUmVjZWl2ZWQ9PT1uLnBhY2tldHNSZWNlaXZlZD8odGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbHN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyVmlkZW9GcmVlemVkIix7Y29uc3VtZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZD1uLnBhY2tldHNSZWNlaXZlZCx0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5oYXMoZSkmJih0aGlzLmNvbnN1bWVySWRzV2l0aEZyZWV6ZWRWaWRlby5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmaS52aWRlbyYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsc3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtZXJWaWRlb0RlZnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsInJlc3VtZSIsZSkpKSl9cHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHMoZSxzLG4pe3ZhciBhLGw7Y29uc3QgaT0oKGw9KGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOmwuZ2V0KGUpKXx8e307cy50b3RhbEF1ZGlvUGFja2V0c1JlY2VpdmVkPT09bi5wYWNrZXRzUmVjZWl2ZWQ/KHRoaXMuY29uc3VtZXJJZHNXaXRoRnJlZXplZEF1ZGlvLmFkZChlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZpLmF1ZGlvJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpjb25zdW1lckF1ZGlvRnJlZXplZCIse2NvbnN1bWVySWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWVyX2F1ZGlvX3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ9bi5wYWNrZXRzUmVjZWl2ZWQsdGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5jb25zdW1lcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmNvbnN1bWVyQXVkaW9EZWZyZWV6ZWQiLHtjb25zdW1lcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1lcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyVmlkZW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxWaWRlb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfdmlkZW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxWaWRlb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkVmlkZW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkudmlkZW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyVmlkZW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl92aWRlb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyhlLHMsbil7dmFyIGE7Y29uc3QgaT0oKGE9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmEuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9O3MudG90YWxBdWRpb1BhY2tldHNTZW50PT09bi5wYWNrZXRzU2VudD8odGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uYWRkKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9GcmVlemVkIix7cHJvZHVjZXJJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfYXVkaW9fc3RhdHVzIiwicGF1c2UiLGUpKSk6KHMudG90YWxBdWRpb1BhY2tldHNTZW50PW4ucGFja2V0c1NlbnQsdGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uaGFzKGUpJiYodGhpcy5wcm9kdWNlcklkc1dpdGhGcmVlemVkQXVkaW8uZGVsZXRlKGUpLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UmJmkuYXVkaW8mJih0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OnByb2R1Y2VyQXVkaW9EZWZyZWV6ZWQiLHtwcm9kdWNlcklkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGc7Y29uc3QgaT0oKGc9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmcuY3VycmVudFVzZXJNZWRpYVN0YXRlcyl8fHt9LHthdWRpbzphLHZpZGVvOmwsc2NyZWVuOm99PWksbT1hfHxsfHxvO3MudG90YWxQYWNrZXRzU2VudD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZFByb2R1Y2luZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmbSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6cHJvZHVjaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJwcm9kdWNpbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1NlbnQ9bi5wYWNrZXRzU2VudCx0aGlzLmZyZWV6ZWRQcm9kdWNpbmdUcmFuc3BvcnRJZHMuaGFzKGUpJiYodGhpcy5mcmVlemVkUHJvZHVjaW5nVHJhbnNwb3J0SWRzLmRlbGV0ZShlKSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlJiZtJiYodGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6bWVhc3VyZW1lbnRzOjpwcm9kdWNpbmdUcmFuc3BvcnREZWZyZWV6ZWQiLHt0cmFuc3BvcnRJZDplfSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLCJyZXN1bWUiLGUpKSkpfXByb2Nlc3NDb25zdW1pbmdUcmFuc3BvcnRTdGF0cyhlLHMsbil7dmFyIGwsbztjb25zdCBhPSEhQXJyYXkuZnJvbSgoKG89KGw9dGhpcz09bnVsbD92b2lkIDA6dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOmwuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcCk9PW51bGw/dm9pZCAwOm8udmFsdWVzKCkpfHxbXSkucmVkdWNlKChtLGcpPT5tfHxnLmF1ZGlvfHxnLnZpZGVvfHxnLnNjcmVlbiwhMSk7cy50b3RhbFBhY2tldHNSZWNlaXZlZD09PW4ucGFja2V0c1NlbnQ/KHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5hZGQoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RnJlZXplZCIse3RyYW5zcG9ydElkOmV9KSx0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmV2ZW50SGFuZGxlci5lbWl0KCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsInBhdXNlIixlKSkpOihzLnRvdGFsUGFja2V0c1JlY2VpdmVkPW4ucGFja2V0c1NlbnQsdGhpcy5mcmVlemVkQ29uc3VtaW5nVHJhbnNwb3J0SWRzLmhhcyhlKSYmKHRoaXMuZnJlZXplZENvbnN1bWluZ1RyYW5zcG9ydElkcy5kZWxldGUoZSksdGhpcy5jYWxsU3RhdHNJbnN0YW5jZSYmYSYmKHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6Om1lYXN1cmVtZW50czo6Y29uc3VtaW5nVHJhbnNwb3J0RGVmcmVlemVkIix7dHJhbnNwb3J0SWQ6ZX0pLHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UuZXZlbnRIYW5kbGVyLmVtaXQoImNvbnN1bWluZ190cmFuc3BvcnRfc3RhdHVzIiwicmVzdW1lIixlKSkpKX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt5aWVsZCB0aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5zZXQoZS5pZCx7cHJvZHVjZXJJZDplLnByb2R1Y2VySWQscGVlcklkOmUuYXBwRGF0YS5wZWVySWQsYXBwRGF0YTplLmFwcERhdGF9KSxlLm9uKCJjbG9zZSIsdGhpcy5kZXJlZ2lzdGVyQ29uc3VtZXIuYmluZCh0aGlzLGUpKSxlLm9uKCJwYXVzZSIsdGhpcy5wYXVzZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5vbigicmVzdW1lIix0aGlzLnJlc3VtZUNvbnN1bWVyLmJpbmQodGhpcyxlLmlkKSksZS5hcHBEYXRhLnNjcmVlblNoYXJlPT09ITAmJnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuYWRkKGUuaWQpfSl9cGF1c2VDb25zdW1lcihlKXt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldChlLHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMX0pfXJlc3VtZUNvbnN1bWVyKGUpe3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUpfWdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIl0sITEsZS5pZCkpWzBdOnZvaWQgMDtmb3IoY29uc3QgYSBvZiBuLnZhbHVlcygpKXN3aXRjaChhLnR5cGUpe2Nhc2Uib3V0Ym91bmQtcnRwIjp7dGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAoZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgbj15aWVsZCBlLmdldFN0YXRzKCksaT1zP3RoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQodGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSlbMF06dm9pZCAwO2Zvcihjb25zdCBhIG9mIG4udmFsdWVzKCkpc3dpdGNoKGEudHlwZSl7Y2FzZSJpbmJvdW5kLXJ0cCI6e3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLnNldChhLmlkLGUuaWQpO2JyZWFrfX1yZXR1cm4gaX0pfWRlcmVnaXN0ZXJQcm9kdWNlcihlKXt0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZm9yRWFjaCgocyxuKT0+e3M9PT1lLmlkJiZ0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5wYXVzZWRQcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5kZWxldGUoZS5pZCl9ZGVyZWdpc3RlckNvbnN1bWVyKGUpe3RoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZGVsZXRlKG4pfSksdGhpcy5jb25zdW1lclBlZXJJZE1hcC5kZWxldGUoZS5pZCksdGhpcy5wYXVzZWRDb25zdW1lck1hcC5kZWxldGUoZS5pZCksdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5kZWxldGUoZS5pZCl9Z2V0SWNlQ2FuZGlkYXRlU3RhdHMoZSl7dmFyIHM7cmV0dXJue2lkOmUuaWQsdHlwZTplLmNhbmRpZGF0ZVR5cGV8fGUudHlwZSxhZGRyZXNzOmUuYWRkcmVzcyxwb3J0OmUucG9ydCx1cmw6ZS51cmwscHJvdG9jb2w6KHM9ZS5yZWxheVByb3RvY29sKSE9bnVsbD9zOmUucHJvdG9jb2wsbmV0d29ya1R5cGU6ZS5uZXR3b3JrVHlwZSxyZWxhdGVkQWRkcmVzczplLnJlbGF0ZWRBZGRyZXNzLHJlbGF0ZWRQb3J0OmUucmVsYXRlZFBvcnR9fWdldFdvcmtpbmdTaW11bGNhc3RWaWRlb1N0YXRzKGUpe3JldHVybiBlLmZpbmQobj0+e2NvbnN0IGk9bi5mcmFtZXNFbmNvZGVkPjAsYT1uLnBhY2tldHNTZW50PjAsbD1uLmZyYW1lV2lkdGgmJm4uZnJhbWVIZWlnaHQ7cmV0dXJuIGkmJmEmJiEhbH0pfHxlW2UubGVuZ3RoLTFdfXBhcnNlUlRDUmVwb3J0KGUscz1bXSxuPSExLGk9dm9pZCAwLGE9dm9pZCAwKXt2YXIgWSwkLGllLGFlLENlLHdlLGtlLE1lLEllLF9lLEFlLExlLE9lO2NvbnN0IGw9ZSxvPW5ldyBjcixtPXMubGVuZ3RoP25ldyBTZXQocyk6dm9pZCAwLGc9W10seT1bXSxUPVtdLEI9bmV3IE1hcCxVPW5ldyBNYXA7Zm9yKGNvbnN0IGYgb2YgbC52YWx1ZXMoKSl7aWYobSl7aWYobS5zaXplPT09MClicmVhaztpZihtLmhhcyhmLnR5cGUpKW4mJm0uZGVsZXRlKGYudHlwZSk7ZWxzZSBjb250aW51ZX1zd2l0Y2goZi50eXBlKXtjYXNlImxvY2FsLWNhbmRpZGF0ZSI6e2cucHVzaCh0aGlzLmdldEljZUNhbmRpZGF0ZVN0YXRzKGYpKTticmVha31jYXNlInJlbW90ZS1jYW5kaWRhdGUiOnt5LnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJjYW5kaWRhdGUtcGFpciI6e2NvbnN0e25vbWluYXRlZDpjfT1mLHtzZWxlY3RlZDp1fT1mLHY9ZixGPXtub21pbmF0ZWQ6YyE9bnVsbD9jOnUsY3VycmVudFJvdW5kVHJpcFRpbWU6di5jdXJyZW50Um91bmRUcmlwVGltZSx0b3RhbFJvdW5kVHJpcFRpbWU6di50b3RhbFJvdW5kVHJpcFRpbWUsYnl0ZXNSZWNlaXZlZDp2LmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50OnYuYnl0ZXNTZW50LGF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZTp2LmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxhdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU6di5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOnYubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLGxhc3RQYWNrZXRTZW50VGltZXN0YW1wOnYubGFzdFBhY2tldFNlbnRUaW1lc3RhbXAsbG9jYWxDYW5kaWRhdGVJZDp2LmxvY2FsQ2FuZGlkYXRlSWQscmVtb3RlQ2FuZGlkYXRlSWQ6di5yZW1vdGVDYW5kaWRhdGVJZCxieXRlc0Rpc2NhcmRlZE9uU2VuZDp2LmJ5dGVzRGlzY2FyZGVkT25TZW5kLHBhY2tldHNTZW50OnYucGFja2V0c1NlbnQscGFja2V0c1JlY2VpdmVkOnYucGFja2V0c1JlY2VpdmVkLHBhY2tldHNEaXNjYXJkZWRPblNlbmQ6di5wYWNrZXRzRGlzY2FyZGVkT25TZW5kfTtULnB1c2goRiksKGYubm9taW5hdGVkPT09ITB8fGYuc2VsZWN0ZWQ9PT0hMCkmJihvLmNhbmRpZGF0ZVBhaXI9Rik7YnJlYWt9Y2FzZSJ0cmFuc3BvcnQiOntjb25zdCBjPWY7YSYmKGEucHJvZHVjaW5nJiYodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNTZW50OjB9KSksYS5jb25zdW1pbmcmJih0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF18fCh0aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF09e3RvdGFsUGFja2V0c1JlY2VpdmVkOjB9KSkpO2NvbnN0IHU9e2J5dGVzUmVjZWl2ZWQ6Yy5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDpjLmJ5dGVzU2VudCxwYWNrZXRzU2VudDpjLnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDpjLnBhY2tldHNSZWNlaXZlZCxkdGxzQ2lwaGVyOmMuZHRsc0NpcGhlcixkdGxzU3RhdGU6Yy5kdGxzU3RhdGUsaWNlUm9sZTpjLmljZVJvbGV9O2lmKG8udHJhbnNwb3J0PXUsYSl7aWYoYS5wcm9kdWNpbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsUHJvZHVjaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc1Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdix1KX1pZihhLmNvbnN1bWluZyl7Y29uc3Qgdj10aGlzLm92ZXJhbGxDb25zdW1pbmdUcmFuc3BvcnRzU3RhdHNNYXBbYS5pZF07dGhpcy5wcm9jZXNzQ29uc3VtaW5nVHJhbnNwb3J0U3RhdHMoYS5pZCx2LHUpfX1icmVha31jYXNlInJlbW90ZS1pbmJvdW5kLXJ0cCI6e2NvbnN0IGM9Zix1PXtqaXR0ZXI6Yy5qaXR0ZXIsZnJhY3Rpb25Mb3N0OmMuZnJhY3Rpb25Mb3N0LHJvdW5kVHJpcFRpbWU6Yy5yb3VuZFRyaXBUaW1lLHJvdW5kVHJpcFRpbWVNZWFzdXJlbWVudHM6Yy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzLHRvdGFsUm91bmRUcmlwVGltZTpjLnRvdGFsUm91bmRUcmlwVGltZSxwYWNrZXRzTG9zdDpjLnBhY2tldHNMb3N0fTtvLnJlbW90ZUluYm91bmRSdHAuc2V0KGMubG9jYWxJZCx1KTticmVha31jYXNlIm91dGJvdW5kLXJ0cCI6e2lmKCF0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5nZXQoZi5pZCksdj10aGlzLnBhdXNlZFByb2R1Y2VyTWFwLmdldCh1KTtpZih2KXtpZih2Lmxhc3RSZXBvcnRDYWxjdWxhdGVkPT09ITApYnJlYWs7dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5zZXQodSx7bGFzdFJlcG9ydENhbGN1bGF0ZWQ6ITB9KX10aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1NlbnQ6MCx0b3RhbEF1ZGlvUGFja2V0c1NlbnQ6MH0pO2NvbnN0IEY9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSl7by5zdGFsZVByb2R1Y2VyU3RyZWFtTWFwPSEwO2JyZWFrfWNvbnN0IHg9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5wcm9kdWNlcnMuZ2V0KHUpO2lmKCgoWT14PT1udWxsP3ZvaWQgMDp4LnRyYWNrKT09bnVsbD92b2lkIDA6WS5yZWFkeVN0YXRlKT09PSJlbmRlZCIpYnJlYWs7by5wcm9kdWNlclN0cmVhbU1hcC5oYXModSl8fG8ucHJvZHVjZXJTdHJlYW1NYXAuc2V0KHUse291dGJvdW5kVmlkZW9SdHBJZDpbXSxvdXRib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCBiPXtieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxuYWNrQ291bnQ6Yy5uYWNrQ291bnQsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGFjdGl2ZTpjLmFjdGl2ZSxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1NlbnQ6Yy5oZWFkZXJCeXRlc1NlbnR8fDAsdG90YWxQYWNrZXRTZW5kRGVsYXk6Yy50b3RhbFBhY2tldFNlbmREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBoPWMsSD1HKHtmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRoLGZyYW1lc0VuY29kZWQ6aC5mcmFtZXNFbmNvZGVkLGZyYW1lc0Ryb3BwZWQ6aC5mcmFtZXNEcm9wcGVkLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZCxmcmFtZXNTZW50OmguZnJhbWVzU2VudCxrZXlGcmFtZXNFbmNvZGVkOmgua2V5RnJhbWVzRW5jb2RlZCxmaXJDb3VudDpoLmZpckNvdW50LGVuY29kZXJJbXBsZW1lbnRhdGlvbjpoLmVuY29kZXJJbXBsZW1lbnRhdGlvbixodWdlRnJhbWVzU2VudDpoLmh1Z2VGcmFtZXNTZW50LHBsaUNvdW50OmgucGxpQ291bnQscXBTdW06aC5xcFN1bSxxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpoLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVhc29uOmgucXVhbGl0eUxpbWl0YXRpb25SZWFzb24scXVhbGl0eUxpbWl0YXRpb25SZXNvbHV0aW9uQ2hhbmdlczpoLnF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXMsdG90YWxFbmNvZGVUaW1lOmgudGFyZ2V0Qml0cmF0ZSx0b3RhbFBhY2tldFNlbmREZWxheTpoLnRvdGFsUGFja2V0U2VuZERlbGF5LHJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ6aC5yZXRyYW5zbWl0dGVkQnl0ZXNTZW50LHJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudDpoLnJldHJhbnNtaXR0ZWRQYWNrZXRzU2VudCxzY2FsYWJpbGl0eU1vZGU6aC5zY2FsYWJpbGl0eU1vZGUscG93ZXJFZmZpY2llbnRFbmNvZGVyOmgucG93ZXJFZmZpY2llbnRFbmNvZGVyfSxiKTtvLm91dGJvdW5kVmlkZW9SdHAuc2V0KGYuaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlclZpZGVvU3RhdHModSxGLEgpfWVsc2UgaWYoYy5tZWRpYVR5cGU9PT0iYXVkaW8ifHxjLmtpbmQ9PT0iYXVkaW8iKXtjb25zdCBoPWMsSD1HKHtyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnR9LGIpO28ub3V0Ym91bmRBdWRpb1J0cC5zZXQoZi5pZCxIKSxvLnByb2R1Y2VyU3RyZWFtTWFwLmdldCh1KS5vdXRib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NPdXRib3VuZFByb2R1Y2VyQXVkaW9TdGF0cyh1LEYsSCl9fWVsc2UgdGhpcy5jYWxsU3RhdHNJbnN0YW5jZS5sb2dnZXIuZXJyb3IoYENhbGxzdGF0czogVW5rbm93biBPdXRib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9Y2FzZSJpbmJvdW5kLXJ0cCI6e2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpYnJlYWs7Y29uc3QgYz1mLHU9aXx8dGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuZ2V0KGYuaWQpLHY9dGhpcy5wYXVzZWRDb25zdW1lck1hcC5nZXQodSk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkQ29uc3VtZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9aWYoYy5zc3JjPT09MTIzNClicmVhazt0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XXx8KHRoaXMub3ZlcmFsbENvbnN1bWVyc1N0YXRzTWFwW3VdPXt0b3RhbFZpZGVvUGFja2V0c1JlY2VpdmVkOjAsdG90YWxBdWRpb1BhY2tldHNSZWNlaXZlZDowfSk7Y29uc3QgRj10aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XTtpZihbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLm1lZGlhVHlwZSl8fFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMua2luZCkpe2lmKCF0aGlzLmluYm91bmRDb25zdW1lck1hcC5oYXMoZi5pZCkpe28uc3RhbGVDb25zdW1lclN0cmVhbU1hcD0hMDticmVha31vLmNvbnN1bWVyU3RyZWFtTWFwLmhhcyh1KXx8by5jb25zdW1lclN0cmVhbU1hcC5zZXQodSx7aW5ib3VuZFZpZGVvUnRwSWQ6W10saW5ib3VuZEF1ZGlvUnRwSWQ6W119KTtjb25zdCB4PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdD49MD9jLnBhY2tldHNMb3N0OjAsaml0dGVyOmMuaml0dGVyLG5hY2tDb3VudDpjLm5hY2tDb3VudCxqaXR0ZXJCdWZmZXJEZWxheTpjLmppdHRlckJ1ZmZlckRlbGF5LGppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudDpjLmppdHRlckJ1ZmZlckVtaXR0ZWRDb3VudCxsYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXA6Yy5sYXN0UGFja2V0UmVjZWl2ZWRUaW1lc3RhbXAsc3NyYzpjLnNzcmMsbWlkOmMubWlkLGNvZGVjSWQ6Yy5jb2RlY0lkLGhlYWRlckJ5dGVzUmVjZWl2ZWQ6Yy5oZWFkZXJCeXRlc1JlY2VpdmVkfHwwLHBhY2tldHNEaXNjYXJkZWQ6Yy5wYWNrZXRzRGlzY2FyZGVkfHwwLGppdHRlckJ1ZmZlck1pbmltdW1EZWxheTpjLmppdHRlckJ1ZmZlck1pbmltdW1EZWxheXx8MCxqaXR0ZXJCdWZmZXJUYXJnZXREZWxheTpjLmppdHRlckJ1ZmZlclRhcmdldERlbGF5fHwwfTtpZihjLm1lZGlhVHlwZT09PSJ2aWRlbyJ8fGMua2luZD09PSJ2aWRlbyIpe2NvbnN0IGI9YyxoPUcoe2ZyYW1lSGVpZ2h0OmIuZnJhbWVIZWlnaHQsZnJhbWVXaWR0aDpiLmZyYW1lV2lkdGgsZnJhbWVzRGVjb2RlZDpiLmZyYW1lc0RlY29kZWQsZnJhbWVzRHJvcHBlZDpiLmZyYW1lc0Ryb3BwZWQsZnJhbWVzUGVyU2Vjb25kOmIuZnJhbWVzUGVyU2Vjb25kLGZyYW1lc1JlY2VpdmVkOmIuZnJhbWVzUmVjZWl2ZWQsa2V5RnJhbWVzRGVjb2RlZDpiLmtleUZyYW1lc0RlY29kZWQsZmlyQ291bnQ6Yi5maXJDb3VudCxkZWNvZGVySW1wbGVtZW50YXRpb246Yi5kZWNvZGVySW1wbGVtZW50YXRpb24scGxpQ291bnQ6Yi5wbGlDb3VudCx0b3RhbFByb2Nlc3NpbmdEZWxheTpiLnRvdGFsUHJvY2Vzc2luZ0RlbGF5LHFwU3VtOmIucXBTdW18fDAsdG90YWxBc3NlbWJseVRpbWU6Yi50b3RhbEFzc2VtYmx5VGltZXx8MCx0b3RhbERlY29kZVRpbWU6Yi50b3RhbERlY29kZVRpbWV8fDAsdG90YWxGcmVlemVzRHVyYXRpb246Yi50b3RhbEZyZWV6ZXNEdXJhdGlvbnx8MCx0b3RhbEludGVyRnJhbWVEZWxheTpiLnRvdGFsSW50ZXJGcmFtZURlbGF5fHwwLHRvdGFsUGF1c2VzRHVyYXRpb246Yi50b3RhbFBhdXNlc0R1cmF0aW9ufHwwLHRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheTpiLnRvdGFsU3F1YXJlZEludGVyRnJhbWVEZWxheXx8MCxmcmVlemVDb3VudDpiLmZyZWV6ZUNvdW50fHwwLHBhdXNlQ291bnQ6Yi5wYXVzZUNvdW50fHwwLHBvd2VyRWZmaWNpZW50RGVjb2RlcjpiLnBvd2VyRWZmaWNpZW50RGVjb2Rlcn0seCk7aC5zY29yZT1zcih7ZnJhbWVXaWR0aDpoLmZyYW1lV2lkdGh8fDAsZnJhbWVzRGVjb2RlZDooaC5mcmFtZXNEZWNvZGVkfHwwKS0oKCgkPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6JC5mcmFtZXNEZWNvZGVkKXx8MCksZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChpZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOmllLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgoYWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDphZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KX0pLFUuc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0OmguZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOmguZnJhbWVzUGVyU2Vjb25kfHwwLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKENlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6Q2UucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKCh3ZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOndlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoa2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDprZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kVmlkZW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZFZpZGVvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJWaWRlb1N0YXRzKHUsRixoKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgYj1jLGg9Ryh7YXVkaW9MZXZlbDpiLmF1ZGlvTGV2ZWwsY29uY2VhbGVkU2FtcGxlczpiLmNvbmNlYWxlZFNhbXBsZXMsY29uY2VhbG1lbnRFdmVudHM6Yi5jb25jZWFsbWVudEV2ZW50cyx0b3RhbEF1ZGlvRW5lcmd5OmIudG90YWxBdWRpb0VuZXJneSx0b3RhbFNhbXBsZXNEdXJhdGlvbjpiLnRvdGFsU2FtcGxlc0R1cmF0aW9uLHRvdGFsU2FtcGxlc1JlY2VpdmVkOmIudG90YWxTYW1wbGVzUmVjZWl2ZWQsZmVjUGFja2V0c0Rpc2NhcmRlZDpiLmZlY1BhY2tldHNEaXNjYXJkZWR8fDAsZmVjUGFja2V0c1JlY2VpdmVkOmIuZmVjUGFja2V0c1JlY2VpdmVkfHwwLGluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbjpiLmluc2VydGVkU2FtcGxlc0ZvckRlY2VsZXJhdGlvbnx8MCxyZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbjpiLnJlbW92ZWRTYW1wbGVzRm9yQWNjZWxlcmF0aW9ufHwwLHNpbGVudENvbmNlYWxlZFNhbXBsZXM6Yi5zaWxlbnRDb25jZWFsZWRTYW1wbGVzfHwwLHBsYXlvdXRJZDpiLnBsYXlvdXRJZH0seCk7aC5zY29yZT1ycih7Y29uY2VhbG1lbnRFdmVudHM6KGguY29uY2VhbG1lbnRFdmVudHN8fDApLSgoKE1lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6TWUuY29uY2VhbG1lbnRFdmVudHMpfHwwKSxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoSWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpJZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKF9lPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6X2UucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwfSksVS5zZXQodSx7c2NvcmU6KyhoLnNjb3JlKjEwKS50b0ZpeGVkKCkscGFja2V0c0xvc3RQZXJjZW50YWdlOmV0KHtwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoQWU9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpBZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKExlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6TGUucGFja2V0c1JlY2VpdmVkKXx8MCl9KSxqaXR0ZXI6aC5qaXR0ZXJ8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlQ29uc3VtZXJzLmhhcyh1KSxiaXRyYXRlOigoaC5ieXRlc1JlY2VpdmVkfHwwKS0oKChPZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOk9lLmJ5dGVzUmVjZWl2ZWQpfHwwKSkqOC83fSksdGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5zZXQodSxoKSxvLmluYm91bmRBdWRpb1J0cC5zZXQoZi5pZCxoKSxvLmNvbnN1bWVyU3RyZWFtTWFwLmdldCh1KS5pbmJvdW5kQXVkaW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc0luYm91bmRDb25zdW1lckF1ZGlvU3RhdHModSxGLGgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gSW5ib3VuZC1ydHAuIG1lZGlhdHlwZTogJHtjLm1lZGlhVHlwZX0ga2luZDogJHtjLmtpbmR9YCk7YnJlYWt9fX1pZihvLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKGYsYyk9Pnt2YXIgdSx2LEYseCxiLGgsSCxEZSxOZSxWZSxCZSxGZSx4ZSxqZSxVZSxIZSxLZSx6ZSxXZSwkZSxHZSxZZSxxZTtpZihmLm91dGJvdW5kVmlkZW9SdHBJZC5sZW5ndGg+MCl7Y29uc3QgTj1bXTtmLm91dGJvdW5kVmlkZW9SdHBJZC5mb3JFYWNoKE90PT57Ti5wdXNoKG8ub3V0Ym91bmRWaWRlb1J0cC5nZXQoT3QpKX0pO2NvbnN0IF89dGhpcy5nZXRXb3JraW5nU2ltdWxjYXN0VmlkZW9TdGF0cyhOKTtfLnNjb3JlPWVyKHtmcmFtZVdpZHRoOl8uZnJhbWVXaWR0aHx8MCxmcmFtZXNQZXJTZWNvbmQ6Xy5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigodT1fLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDp1LmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzU2VudDooXy5wYWNrZXRzU2VudHx8MCktKCgodj10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnYucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChGPV8ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkYucGFja2V0c0xvc3QpfHwwKS0oKChiPSh4PXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eC5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6Yi5wYWNrZXRzTG9zdCl8fDApLGZyYW1lc0VuY29kZWQ6KF8uZnJhbWVzRW5jb2RlZHx8MCktKCgoaD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOmguZnJhbWVzRW5jb2RlZCl8fDApfSksQi5zZXQoYyx7c2NvcmU6KyhfLnNjb3JlKjEwKS50b0ZpeGVkKCksZnJhbWVXaWR0aDpfLmZyYW1lV2lkdGh8fDAsZnJhbWVIZWlnaHQ6Xy5mcmFtZUhlaWdodHx8MCxmcmFtZXNQZXJTZWNvbmQ6Xy5mcmFtZXNQZXJTZWNvbmR8fDAsaml0dGVyOigoSD1fLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpILmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKSxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihfLnBhY2tldHNTZW50fHwwKS0oKChEZT10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOkRlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoTmU9Xy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6TmUucGFja2V0c0xvc3QpfHwwKS0oKChCZT0oVmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpWZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6QmUucGFja2V0c0xvc3QpfHwwKX0pLGJpdHJhdGU6KChfLmJ5dGVzU2VudHx8MCktKCgoRmU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpGZS5ieXRlc1NlbnQpfHwwKSkqOC83LGNwdUxpbWl0YXRpb25zOl8ucXVhbGl0eUxpbWl0YXRpb25SZWFzb249PT0iY3B1IixiYW5kd2lkdGhMaW1pdGF0aW9uczpfLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImJhbmR3aWR0aCJ9KSx0aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLF8pfWVsc2UgaWYoZi5vdXRib3VuZEF1ZGlvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49by5vdXRib3VuZEF1ZGlvUnRwLmdldChmLm91dGJvdW5kQXVkaW9SdHBJZFswXSk7Ti5zY29yZT1adCh7cGFja2V0c1NlbnQ6KE4ucGFja2V0c1NlbnR8fDApLSgoKHhlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6eGUucGFja2V0c1NlbnQpfHwwKSxwYWNrZXRzTG9zdDooKChqZT1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpqZS5wYWNrZXRzTG9zdCl8fDApLSgoKEhlPShVZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOlVlLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpIZS5wYWNrZXRzTG9zdCl8fDApLGppdHRlcjooKEtlPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOktlLmppdHRlcil8fDB9KSxCLnNldChjLHtzY29yZTorKE4uc2NvcmUqMTApLnRvRml4ZWQoKSxiaXRyYXRlOigoTi5ieXRlc1NlbnR8fDApLSgoKHplPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6emUuYnl0ZXNTZW50KXx8MCkpKjgvNyxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6WmUoe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKChXZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOldlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoJGU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6JGUucGFja2V0c0xvc3QpfHwwKS0oKChZZT0oR2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpHZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6WWUucGFja2V0c0xvc3QpfHwwKX0pLGppdHRlcjooKHFlPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOnFlLmppdHRlcil8fDAsaXNTY3JlZW5TaGFyZTp0aGlzLnNjcmVlblNoYXJlUHJvZHVjZXJzLmhhcyhjKX0pLHRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuc2V0KGMsTil9fSksVC5mb3JFYWNoKGY9Pntjb25zdCBjPWcuZmluZCh2PT52LmlkPT09Zi5sb2NhbENhbmRpZGF0ZUlkPyhmLmxvY2FsQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKSx1PXkuZmluZCh2PT52LmlkPT09Zi5yZW1vdGVDYW5kaWRhdGVJZD8oZi5yZW1vdGVDYW5kaWRhdGVJZD12LmlkLHYpOm51bGwpO2MmJihmLmxvY2FsQ2FuZGlkYXRlVHlwZT1jLnR5cGUsZi5sb2NhbENhbmRpZGF0ZUFkZHJlc3M9dGUoYy5hZGRyZXNzKSxmLmxvY2FsQ2FuZGlkYXRlUG9ydD1jLnBvcnQsZi5sb2NhbENhbmRpZGF0ZVByb3RvY29sPWMucHJvdG9jb2wsZi5sb2NhbENhbmRpZGF0ZVVybD1jLnVybCxmLmxvY2FsQ2FuZGlkYXRlTmV0d29ya1R5cGU9Yy5uZXR3b3JrVHlwZSxmLmxvY2FsQ2FuZGlkYXRlUmVsYXRlZEFkZHJlc3M9dGUoYy5yZWxhdGVkQWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRQb3J0PWMucmVsYXRlZFBvcnQpLHUmJihmLnJlbW90ZUNhbmRpZGF0ZVR5cGU9dS50eXBlLGYucmVtb3RlQ2FuZGlkYXRlQWRkcmVzcz10ZSh1LmFkZHJlc3MpLGYucmVtb3RlQ2FuZGlkYXRlUG9ydD11LnBvcnQsZi5yZW1vdGVDYW5kaWRhdGVQcm90b2NvbD11LnByb3RvY29sLGYucmVtb3RlQ2FuZGlkYXRlVXJsPXUudXJsKX0pLG8uY2FuZGlkYXRlUGFpciYmKG8udHJhbnNwb3J0PyhvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IGY9MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsdik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5mJiYoZj11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPWYsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKGYpe31pZihCLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsQil9Y2F0Y2goZil7fXJldHVybiBvfWdldFByb2R1Y2Vyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlUHJvZHVjZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldENvbnN1bWVyc1JlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3Qgcz1lLm1hcChuPT50aGlzLmdlbmVyYXRlQ29uc3VtZXJTdHJlYW1NYXAobiwhMCkpO3JldHVybiBzLmxlbmd0aD4wP1Byb21pc2UuYWxsKHMpOnZvaWQgMH0pfWdldFRyYW5zcG9ydFJlcG9ydChlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cmV0dXJuIGUuZ2V0U3RhdHMoKX0pfWdldFByb2Nlc3NlZFN0YXRzKGUscyxuKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7Y29uc3QgaT15aWVsZCB0aGlzLmdldFRyYW5zcG9ydFJlcG9ydChlKSxhPXtwcm9kdWNpbmc6bixjb25zdW1pbmc6cyxpZDplLmlkfSxsPWksbz10aGlzLnBhcnNlUlRDUmVwb3J0KGwsWyJ0cmFuc3BvcnQiLCJjYW5kaWRhdGUtcGFpciIsImluYm91bmQtcnRwIiwib3V0Ym91bmQtcnRwIiwicmVtb3RlLWluYm91bmQtcnRwIiwibG9jYWwtY2FuZGlkYXRlIiwicmVtb3RlLWNhbmRpZGF0ZSJdLCExLHZvaWQgMCxhKTtpZighbylyZXR1cm47Y29uc3QgbT17c3RhdHM6by50cmFuc3BvcnQsdHJhbnNwb3J0SWQ6ZS5pZCxjb25zdW1pbmc6cyxwcm9kdWNpbmc6bn0sZz1vLnN0YWxlUHJvZHVjZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0UHJvZHVjZXJTdGF0c0Zyb21SZXBvcnQobykseT1vLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA/dm9pZCAwOnRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQobyk7cmV0dXJue3RyYW5zcG9ydFJlcG9ydDptLHByb2R1Y2VyUmVwb3J0OmcsY29uc3VtZXJSZXBvcnQ6eX19KX1nZXRQcm9kdWNlclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLnByb2R1Y2VyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pnt2YXIgYSxsO3MucHVzaCh7cHJvZHVjZXJJZDppLHZpZGVvU3RhdHM6bi5vdXRib3VuZFZpZGVvUnRwSWQubWFwKG89PmUub3V0Ym91bmRWaWRlb1J0cC5nZXQobykpLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKG89PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQobykpLGFwcERhdGE6KChsPShhPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzKT09bnVsbD92b2lkIDA6YS5nZXQoaSkpPT1udWxsP3ZvaWQgMDpsLmFwcERhdGEpfHxudWxsfSl9KX1jYXRjaChuKXt0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjptZWFzdXJlbWVudHM6OmdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0Iix7ZXJyb3I6e3JlYXNvbjpuLnJlYXNvbixtZXNzYWdlOm4ubWVzc2FnZX19KX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydChlKXtjb25zdCBzPVtdO3RyeXtlLmNvbnN1bWVyU3RyZWFtTWFwLmZvckVhY2goKG4saSk9Pntjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmwsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChpKTtzLnB1c2goe2NvbnN1bWVySWQ6aSxwZWVySWQ6YSxwcm9kdWNlcklkOmwsYXBwRGF0YTpvLHZpZGVvU3RhdHM6bi5pbmJvdW5kVmlkZW9SdHBJZC5tYXAobT0+ZS5pbmJvdW5kVmlkZW9SdHAuZ2V0KG0pKSxhdWRpb1N0YXRzOm4uaW5ib3VuZEF1ZGlvUnRwSWQubWFwKG09PmUuaW5ib3VuZEF1ZGlvUnRwLmdldChtKSl9KX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3IoImdldENvbnN1bWVyc1JlcG9ydDogIixuLGUpfXJldHVybiBzfWdldFVzZXJMb2NhdGlvbigpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtyZXR1cm4gbmV3IFByb21pc2UoKGUscyk9Pnt0cnl7bmF2aWdhdG9yLmdlb2xvY2F0aW9uP25hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24obj0+e2Uobil9KTpzKCl9Y2F0Y2gobil7cyhuKX19KX0pfWdldENvbm5lY3Rpdml0eShlKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dHJ5e2NvbnN0IHM9e2ljZVNlcnZlcnM6ZXx8YXJ9LG49bmV3IFByb21pc2UoKGcseSk9Pnt0cnl7Y29uc3QgVD1uZXcgRXMocyk7VC5hZGRMaXN0ZW5lcigiZG9uZSIsZyksVC5hZGRMaXN0ZW5lcigiZmFpbGVkIiwoKT0+e2coe2Nvbm5lY3Rpdml0eTohMX0pfSksVC5zdGFydCgyZTMpfWNhdGNoKFQpe3koVCl9fSksaT1uZXcgUHJvbWlzZSgoZyx5KT0+e3RyeXtjb25zdCBUPW5ldyBUcyhzKTtULmFkZExpc3RlbmVyKCJkb25lIixnKSxULmFkZExpc3RlbmVyKCJmYWlsZWQiLCgpPT57Zyh7Y29ubmVjdGl2aXR5OiExfSl9KSxULnN0YXJ0KDJlMyl9Y2F0Y2goVCl7eShUKX19KSxhPW5ldyBQcm9taXNlKChnLHkpPT57dHJ5e2NvbnN0IFQ9bmV3IFJzKHMpO1QuYWRkTGlzdGVuZXIoImRvbmUiLGcpLFQuYWRkTGlzdGVuZXIoImZhaWxlZCIsKCk9PntnKHtjb25uZWN0aXZpdHk6ITF9KX0pLFQuc3RhcnQoMmUzKX1jYXRjaChUKXt5KFQpfX0pLFtsLG8sbV09eWllbGQgUHJvbWlzZS5hbGwoW24saSxhXSk7cmV0dXJue2hvc3Q6bD09bnVsbD92b2lkIDA6bC5jb25uZWN0aXZpdHkscmVsYXk6bz09bnVsbD92b2lkIDA6by5jb25uZWN0aXZpdHkscmVmbGV4aXZlOm09PW51bGw/dm9pZCAwOm0uY29ubmVjdGl2aXR5fX1jYXRjaChzKXtyZXR1cm57aG9zdDohMSxyZWxheTohMSxyZWZsZXhpdmU6ITF9fX0pfWdldFRocm91Z2hwdXQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RyeXtjb25zdCBuPXlpZWxkIG5ldyBQcm9taXNlKChpLGEpPT57dHJ5e2NvbnN0IGw9e2ljZVNlcnZlcnM6ZXx8YXJ9LG89bmV3IHlzKGwpO28uYWRkTGlzdGVuZXIoImRvbmUiLGkpLG8uYWRkTGlzdGVuZXIoImZhaWxlZCIsYSksby5zdGFydCgxZTQpfWNhdGNoKGwpe2EobCl9fSk7cmV0dXJue3Rocm91Z2hwdXQ6bi50aHJvdWdocHV0LGZyYWN0aW9uYWxMb3NzOjAsUlRUOm4uUlRULGppdHRlcjowLGJhY2tlbmRSVFQ6bi5iYWNrZW5kUlRUfX1jYXRjaChzKXtyZXR1cm59fSl9Z2V0SVBEZXRhaWxzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3ZhciBlLHM7dHJ5e3JldHVybiB0aGlzLmlwRGV0YWlsc3x8KHRoaXMuaXBEZXRhaWxzPXlpZWxkIGlyLmdldElQRGV0YWlscyh7cGVlcklkOihlPXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UpPT1udWxsP3ZvaWQgMDplLnBlZXJJZCxhcGlIb3N0bmFtZXM6KHM9dGhpcy5jYWxsU3RhdHNJbnN0YW5jZSk9PW51bGw/dm9pZCAwOnMuYXBpSG9zdG5hbWVzLGxvZ2dlcjp0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlcn0pKSx0aGlzLmlwRGV0YWlsc31jYXRjaChuKXtyZXR1cm59fSl9Z2V0TmV0d29ya1F1YWxpdHkoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0W3Msbl09eWllbGQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0Q29ubmVjdGl2aXR5KGUpLHRoaXMuZ2V0VGhyb3VnaHB1dChlKV0pO3JldHVybntjb25uZWN0aXZpdHk6cyx0aHJvdWdocHV0Om49PW51bGw/dm9pZCAwOm4udGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczpuPT1udWxsP3ZvaWQgMDpuLmZyYWN0aW9uYWxMb3NzLFJUVDpuPT1udWxsP3ZvaWQgMDpuLlJUVCxqaXR0ZXI6bj09bnVsbD92b2lkIDA6bi5qaXR0ZXIsYmFja2VuZFJUVDpuPT1udWxsP3ZvaWQgMDpuLmJhY2tlbmRSVFR9fSl9Z2V0TmV0d29ya0luZm8oZSxzPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGwsbztpZihzKXtjb25zdCBtPXlpZWxkIHRoaXMuZ2V0SVBEZXRhaWxzKCk7cmV0dXJue2lwRGV0YWlsczptLGVmZmVjdGl2ZU5ldHdvcmtUeXBlOihsPW5hdmlnYXRvci5jb25uZWN0aW9uKT09bnVsbD92b2lkIDA6bC5lZmZlY3RpdmVUeXBlLGxvY2F0aW9uOm0hPW51bGwmJm0ubG9jP29yKG09PW51bGw/dm9pZCAwOm0ubG9jKTp2b2lkIDB9fWNvbnN0W24saSxhXT15aWVsZCBQcm9taXNlLmFsbChbdGhpcy5nZXRDb25uZWN0aXZpdHkoZSksdGhpcy5nZXRUaHJvdWdocHV0KGUpLHRoaXMuZ2V0SVBEZXRhaWxzKCldKTtyZXR1cm57aXBEZXRhaWxzOmEsZWZmZWN0aXZlTmV0d29ya1R5cGU6KG89bmF2aWdhdG9yLmNvbm5lY3Rpb24pPT1udWxsP3ZvaWQgMDpvLmVmZmVjdGl2ZVR5cGUsbG9jYXRpb246YSE9bnVsbCYmYS5sb2M/b3IoYT09bnVsbD92b2lkIDA6YS5sb2MpOnZvaWQgMCx0dXJuQ29ubmVjdGl2aXR5Om4/bi5ob3N0fHxuLnJlbGF5fHxuLnJlZmxleGl2ZTohMSxjb25uZWN0aXZpdHk6bix0aHJvdWdocHV0Omk9PW51bGw/dm9pZCAwOmkudGhyb3VnaHB1dCxmcmFjdGlvbmFsTG9zczppPT1udWxsP3ZvaWQgMDppLmZyYWN0aW9uYWxMb3NzLFJUVDppPT1udWxsP3ZvaWQgMDppLlJUVCxqaXR0ZXI6aT09bnVsbD92b2lkIDA6aS5qaXR0ZXIsYmFja2VuZFJUVDppPT1udWxsP3ZvaWQgMDppLmJhY2tlbmRSVFR9fSl9fWNsYXNzIENzIGV4dGVuZHMgZHJ7fWNsYXNzIGxyIGV4dGVuZHMgZHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3AodGhpcywicHJvZHVjZXJNYXAiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJNYXAiLG5ldyBNYXApfXJlZ2lzdGVyUHJvZHVjZXIoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMucHJvZHVjZXJNYXAuc2V0KGUuaWQsZSkseWllbGQgdGhpcy5nZW5lcmF0ZVByb2R1Y2VyU3RyZWFtTWFwKGUpLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJQcm9kdWNlci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lUHJvZHVjZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5hZGQoZS5pZCl9KX1yZWdpc3RlckNvbnN1bWVyKGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0aGlzLmNvbnN1bWVyTWFwLnNldChlLmlkLGUpLHlpZWxkIHRoaXMuZ2VuZXJhdGVDb25zdW1lclN0cmVhbU1hcChlKSx0aGlzLmNvbnN1bWVyUGVlcklkTWFwLnNldChlLmlkLHtwcm9kdWNlcklkOmUucHJvZHVjZXJJZCxwZWVySWQ6ZS5hcHBEYXRhLnBlZXJJZCxhcHBEYXRhOmUuYXBwRGF0YX0pLGUub24oImNsb3NlIix0aGlzLmRlcmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMsZSkpLGUub24oInBhdXNlIix0aGlzLnBhdXNlQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLm9uKCJyZXN1bWUiLHRoaXMucmVzdW1lQ29uc3VtZXIuYmluZCh0aGlzLGUuaWQpKSxlLmFwcERhdGEuc2NyZWVuU2hhcmU9PT0hMCYmdGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5hZGQoZS5pZCl9KX1nZW5lcmF0ZUNvbnN1bWVyU3RyZWFtTWFwKGUscz0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgZS5nZXRTdGF0cygpLGk9dGhpcy5wYXJzZVJUQ1JlcG9ydChuLFsiaW5ib3VuZC1ydHAiXSwhMSxlLmlkKSxhPVsuLi5pLmNvbnN1bWVyU3RyZWFtTWFwLnZhbHVlcygpXVswXSxsPXM/dGhpcy5nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoaSxhLGUuaWQpOnZvaWQgMDtmb3IoY29uc3QgbyBvZiBuLnZhbHVlcygpKXN3aXRjaChvLnR5cGUpe2Nhc2UiaW5ib3VuZC1ydHAiOnt0aGlzLmluYm91bmRDb25zdW1lck1hcC5zZXQoby5pZCxlLmlkKTticmVha319cmV0dXJuIGx9KX1kZXJlZ2lzdGVyUHJvZHVjZXIoZSl7dGhpcy5wcm9kdWNlck1hcC5kZWxldGUoZS5pZCksdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmZvckVhY2goKHMsbik9PntzPT09ZS5pZCYmdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmRlbGV0ZShuKX0pLHRoaXMucGF1c2VkUHJvZHVjZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVQcm9kdWNlcnMuZGVsZXRlKGUuaWQpfWRlcmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVyTWFwLmRlbGV0ZShlLmlkKSx0aGlzLmluYm91bmRDb25zdW1lck1hcC5mb3JFYWNoKChzLG4pPT57cz09PWUuaWQmJnRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmRlbGV0ZShuKX0pLHRoaXMuY29uc3VtZXJQZWVySWRNYXAuZGVsZXRlKGUuaWQpLHRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZGVsZXRlKGUuaWQpLHRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuZGVsZXRlKGUuaWQpfWdldEljZUNhbmRpZGF0ZVN0YXRzKGUpe3ZhciBzO3JldHVybntpZDplLmlkLHR5cGU6ZS5jYW5kaWRhdGVUeXBlfHxlLnR5cGUsYWRkcmVzczplLmFkZHJlc3MscG9ydDplLnBvcnQsdXJsOmUudXJsLHByb3RvY29sOihzPWUucmVsYXlQcm90b2NvbCkhPW51bGw/czplLnByb3RvY29sLG5ldHdvcmtUeXBlOmUubmV0d29ya1R5cGUscmVsYXRlZEFkZHJlc3M6ZS5yZWxhdGVkQWRkcmVzcyxyZWxhdGVkUG9ydDplLnJlbGF0ZWRQb3J0fX1wYXJzZVJUQ1JlcG9ydChlLHM9W10sbj0hMSxpPXZvaWQgMCxhPXZvaWQgMCl7dmFyIFksJCxpZSxhZSxDZSx3ZSxrZSxNZSxJZSxfZSxBZSxMZSxPZTtjb25zdCBsPWUsbz1uZXcgY3IsbT1zLmxlbmd0aD9uZXcgU2V0KHMpOnZvaWQgMCxnPVtdLHk9W10sVD1bXSxCPW5ldyBNYXAsVT1uZXcgTWFwO2Zvcihjb25zdCBmIG9mIGwudmFsdWVzKCkpe2lmKG0pe2lmKG0uc2l6ZT09PTApYnJlYWs7aWYobS5oYXMoZi50eXBlKSluJiZtLmRlbGV0ZShmLnR5cGUpO2Vsc2UgY29udGludWV9c3dpdGNoKGYudHlwZSl7Y2FzZSJsb2NhbC1jYW5kaWRhdGUiOntnLnB1c2godGhpcy5nZXRJY2VDYW5kaWRhdGVTdGF0cyhmKSk7YnJlYWt9Y2FzZSJyZW1vdGUtY2FuZGlkYXRlIjp7eS5wdXNoKHRoaXMuZ2V0SWNlQ2FuZGlkYXRlU3RhdHMoZikpO2JyZWFrfWNhc2UiY2FuZGlkYXRlLXBhaXIiOntjb25zdHtub21pbmF0ZWQ6Y309Zix7c2VsZWN0ZWQ6dX09Zix2PWYsRj17bm9taW5hdGVkOmMhPW51bGw/Yzp1LGN1cnJlbnRSb3VuZFRyaXBUaW1lOnYuY3VycmVudFJvdW5kVHJpcFRpbWUsdG90YWxSb3VuZFRyaXBUaW1lOnYudG90YWxSb3VuZFRyaXBUaW1lLGJ5dGVzUmVjZWl2ZWQ6di5ieXRlc1JlY2VpdmVkLGJ5dGVzU2VudDp2LmJ5dGVzU2VudCxhdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU6di5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOnYuYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlLGxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRSZWNlaXZlZFRpbWVzdGFtcCxsYXN0UGFja2V0U2VudFRpbWVzdGFtcDp2Lmxhc3RQYWNrZXRTZW50VGltZXN0YW1wLGxvY2FsQ2FuZGlkYXRlSWQ6di5sb2NhbENhbmRpZGF0ZUlkLHJlbW90ZUNhbmRpZGF0ZUlkOnYucmVtb3RlQ2FuZGlkYXRlSWQsYnl0ZXNEaXNjYXJkZWRPblNlbmQ6di5ieXRlc0Rpc2NhcmRlZE9uU2VuZCxwYWNrZXRzU2VudDp2LnBhY2tldHNTZW50LHBhY2tldHNSZWNlaXZlZDp2LnBhY2tldHNSZWNlaXZlZCxwYWNrZXRzRGlzY2FyZGVkT25TZW5kOnYucGFja2V0c0Rpc2NhcmRlZE9uU2VuZH07VC5wdXNoKEYpLChmLm5vbWluYXRlZD09PSEwfHxmLnNlbGVjdGVkPT09ITApJiYoby5jYW5kaWRhdGVQYWlyPUYpO2JyZWFrfWNhc2UidHJhbnNwb3J0Ijp7Y29uc3QgYz1mO2EmJihhLnByb2R1Y2luZyYmKHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXXx8KHRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXT17dG90YWxQYWNrZXRzU2VudDowfSkpLGEuY29uc3VtaW5nJiYodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdfHwodGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdPXt0b3RhbFBhY2tldHNSZWNlaXZlZDowfSkpKTtjb25zdCB1PXtieXRlc1JlY2VpdmVkOmMuYnl0ZXNSZWNlaXZlZCxieXRlc1NlbnQ6Yy5ieXRlc1NlbnQscGFja2V0c1NlbnQ6Yy5wYWNrZXRzU2VudCxwYWNrZXRzUmVjZWl2ZWQ6Yy5wYWNrZXRzUmVjZWl2ZWQsZHRsc0NpcGhlcjpjLmR0bHNDaXBoZXIsZHRsc1N0YXRlOmMuZHRsc1N0YXRlLGljZVJvbGU6Yy5pY2VSb2xlfTtpZihvLnRyYW5zcG9ydD11LGEpe2lmKGEucHJvZHVjaW5nKXtjb25zdCB2PXRoaXMub3ZlcmFsbFByb2R1Y2luZ1RyYW5zcG9ydHNTdGF0c01hcFthLmlkXTt0aGlzLnByb2Nlc3NQcm9kdWNpbmdUcmFuc3BvcnRTdGF0cyhhLmlkLHYsdSl9aWYoYS5jb25zdW1pbmcpe2NvbnN0IHY9dGhpcy5vdmVyYWxsQ29uc3VtaW5nVHJhbnNwb3J0c1N0YXRzTWFwW2EuaWRdO3RoaXMucHJvY2Vzc0NvbnN1bWluZ1RyYW5zcG9ydFN0YXRzKGEuaWQsdix1KX19YnJlYWt9Y2FzZSJyZW1vdGUtaW5ib3VuZC1ydHAiOntjb25zdCBjPWYsdT17aml0dGVyOmMuaml0dGVyLGZyYWN0aW9uTG9zdDpjLmZyYWN0aW9uTG9zdCxyb3VuZFRyaXBUaW1lOmMucm91bmRUcmlwVGltZSxyb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzOmMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyx0b3RhbFJvdW5kVHJpcFRpbWU6Yy50b3RhbFJvdW5kVHJpcFRpbWUscGFja2V0c0xvc3Q6Yy5wYWNrZXRzTG9zdH07by5yZW1vdGVJbmJvdW5kUnRwLnNldChjLmxvY2FsSWQsdSk7YnJlYWt9Y2FzZSJvdXRib3VuZC1ydHAiOntpZighdGhpcy5vdXRib3VuZFByb2R1Y2VyTWFwLmhhcyhmLmlkKSlicmVhaztjb25zdCBjPWYsdT1pfHx0aGlzLm91dGJvdW5kUHJvZHVjZXJNYXAuZ2V0KGYuaWQpLHY9dGhpcy5wYXVzZWRQcm9kdWNlck1hcC5nZXQodSk7aWYodil7aWYodi5sYXN0UmVwb3J0Q2FsY3VsYXRlZD09PSEwKWJyZWFrO3RoaXMucGF1c2VkUHJvZHVjZXJNYXAuc2V0KHUse2xhc3RSZXBvcnRDYWxjdWxhdGVkOiEwfSl9dGhpcy5vdmVyYWxsUHJvZHVjZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxQcm9kdWNlcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNTZW50OjAsdG90YWxBdWRpb1BhY2tldHNTZW50OjB9KTtjb25zdCBGPXRoaXMub3ZlcmFsbFByb2R1Y2Vyc1N0YXRzTWFwW3VdO2lmKFsidmlkZW8iLCJhdWRpbyJdLmluY2x1ZGVzKGMubWVkaWFUeXBlKXx8WyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5raW5kKSl7aWYoIXRoaXMub3V0Ym91bmRQcm9kdWNlck1hcC5oYXMoZi5pZCkpe28uc3RhbGVQcm9kdWNlclN0cmVhbU1hcD0hMDticmVha31jb25zdCB4PXRoaXMuY2FsbFN0YXRzSW5zdGFuY2UucHJvZHVjZXJzLmdldCh1KTtpZigoKFk9eD09bnVsbD92b2lkIDA6eC50cmFjayk9PW51bGw/dm9pZCAwOlkucmVhZHlTdGF0ZSk9PT0iZW5kZWQiKWJyZWFrO28ucHJvZHVjZXJTdHJlYW1NYXAuaGFzKHUpfHxvLnByb2R1Y2VyU3RyZWFtTWFwLnNldCh1LHtvdXRib3VuZFZpZGVvUnRwSWQ6W10sb3V0Ym91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgYj17Ynl0ZXNTZW50OmMuYnl0ZXNTZW50LHBhY2tldHNTZW50OmMucGFja2V0c1NlbnQsbmFja0NvdW50OmMubmFja0NvdW50LHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxhY3RpdmU6Yy5hY3RpdmUsY29kZWNJZDpjLmNvZGVjSWQsaGVhZGVyQnl0ZXNTZW50OmMuaGVhZGVyQnl0ZXNTZW50fHwwLHRvdGFsUGFja2V0U2VuZERlbGF5OmMudG90YWxQYWNrZXRTZW5kRGVsYXl8fDB9O2lmKGMubWVkaWFUeXBlPT09InZpZGVvInx8Yy5raW5kPT09InZpZGVvIil7Y29uc3QgaD1jLEg9Ryh7ZnJhbWVIZWlnaHQ6aC5mcmFtZUhlaWdodCxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aCxmcmFtZXNFbmNvZGVkOmguZnJhbWVzRW5jb2RlZCxmcmFtZXNEcm9wcGVkOmguZnJhbWVzRHJvcHBlZD9oLmZyYW1lc0Ryb3BwZWQ6aC5kcm9wcGVkRnJhbWVzLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZD9oLmZyYW1lc1BlclNlY29uZDpoLmZyYW1lcmF0ZU1lYW4sZnJhbWVzU2VudDpoLmZyYW1lc1NlbnQsa2V5RnJhbWVzRW5jb2RlZDpoLmtleUZyYW1lc0VuY29kZWQsZmlyQ291bnQ6aC5maXJDb3VudCxlbmNvZGVySW1wbGVtZW50YXRpb246aC5lbmNvZGVySW1wbGVtZW50YXRpb24saHVnZUZyYW1lc1NlbnQ6aC5odWdlRnJhbWVzU2VudCxwbGlDb3VudDpoLnBsaUNvdW50LHFwU3VtOmgucXBTdW0scXVhbGl0eUxpbWl0YXRpb25SZWFzb246aC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbixxdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9uczpoLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zLHF1YWxpdHlMaW1pdGF0aW9uUmVzb2x1dGlvbkNoYW5nZXM6aC5xdWFsaXR5TGltaXRhdGlvblJlc29sdXRpb25DaGFuZ2VzLHRvdGFsRW5jb2RlVGltZTpoLnRvdGFsRW5jb2RlVGltZSx0b3RhbFBhY2tldFNlbmREZWxheTpoLnRvdGFsRW5jb2RlVGltZSxyZXRyYW5zbWl0dGVkQnl0ZXNTZW50OmgucmV0cmFuc21pdHRlZEJ5dGVzU2VudCxyZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQ6aC5yZXRyYW5zbWl0dGVkUGFja2V0c1NlbnQsc2NhbGFiaWxpdHlNb2RlOmguc2NhbGFiaWxpdHlNb2RlLHBvd2VyRWZmaWNpZW50RW5jb2RlcjpoLnBvd2VyRWZmaWNpZW50RW5jb2Rlcn0sYik7by5vdXRib3VuZFZpZGVvUnRwLnNldChmLmlkLEgpLG8ucHJvZHVjZXJTdHJlYW1NYXAuZ2V0KHUpLm91dGJvdW5kVmlkZW9SdHBJZC5wdXNoKGYuaWQpLHRoaXMucHJvY2Vzc091dGJvdW5kUHJvZHVjZXJWaWRlb1N0YXRzKHUsRixIKX1lbHNlIGlmKGMubWVkaWFUeXBlPT09ImF1ZGlvInx8Yy5raW5kPT09ImF1ZGlvIil7Y29uc3QgaD1jLEg9Ryh7cmV0cmFuc21pdHRlZEJ5dGVzU2VudDpoLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQscmV0cmFuc21pdHRlZFBhY2tldHNTZW50OmgucmV0cmFuc21pdHRlZFBhY2tldHNTZW50fSxiKTtvLm91dGJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsSCksby5wcm9kdWNlclN0cmVhbU1hcC5nZXQodSkub3V0Ym91bmRBdWRpb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzT3V0Ym91bmRQcm9kdWNlckF1ZGlvU3RhdHModSxGLEgpfX1lbHNlIHRoaXMuY2FsbFN0YXRzSW5zdGFuY2UubG9nZ2VyLmVycm9yKGBDYWxsc3RhdHM6IFVua25vd24gT3V0Ym91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfWNhc2UiaW5ib3VuZC1ydHAiOntpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKGYuaWQpKWJyZWFrO2NvbnN0IGM9Zix1PWl8fHRoaXMuaW5ib3VuZENvbnN1bWVyTWFwLmdldChmLmlkKSx2PXRoaXMucGF1c2VkQ29uc3VtZXJNYXAuZ2V0KHUpO2lmKHYpe2lmKHYubGFzdFJlcG9ydENhbGN1bGF0ZWQ9PT0hMClicmVhazt0aGlzLnBhdXNlZENvbnN1bWVyTWFwLnNldCh1LHtsYXN0UmVwb3J0Q2FsY3VsYXRlZDohMH0pfWlmKGMuc3NyYz09PTEyMzQpYnJlYWs7dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV18fCh0aGlzLm92ZXJhbGxDb25zdW1lcnNTdGF0c01hcFt1XT17dG90YWxWaWRlb1BhY2tldHNSZWNlaXZlZDowLHRvdGFsQXVkaW9QYWNrZXRzUmVjZWl2ZWQ6MH0pO2NvbnN0IEY9dGhpcy5vdmVyYWxsQ29uc3VtZXJzU3RhdHNNYXBbdV07aWYoWyJ2aWRlbyIsImF1ZGlvIl0uaW5jbHVkZXMoYy5tZWRpYVR5cGUpfHxbInZpZGVvIiwiYXVkaW8iXS5pbmNsdWRlcyhjLmtpbmQpKXtpZighdGhpcy5pbmJvdW5kQ29uc3VtZXJNYXAuaGFzKGYuaWQpKXtvLnN0YWxlQ29uc3VtZXJTdHJlYW1NYXA9ITA7YnJlYWt9by5jb25zdW1lclN0cmVhbU1hcC5oYXModSl8fG8uY29uc3VtZXJTdHJlYW1NYXAuc2V0KHUse2luYm91bmRWaWRlb1J0cElkOltdLGluYm91bmRBdWRpb1J0cElkOltdfSk7Y29uc3QgeD17Ynl0ZXNSZWNlaXZlZDpjLmJ5dGVzUmVjZWl2ZWQscGFja2V0c1JlY2VpdmVkOmMucGFja2V0c1JlY2VpdmVkLHBhY2tldHNMb3N0OmMucGFja2V0c0xvc3Q+PTA/Yy5wYWNrZXRzTG9zdDowLGppdHRlcjpjLmppdHRlcixuYWNrQ291bnQ6Yy5uYWNrQ291bnQsaml0dGVyQnVmZmVyRGVsYXk6Yy5qaXR0ZXJCdWZmZXJEZWxheSxqaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQ6Yy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQsbGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wOmMubGFzdFBhY2tldFJlY2VpdmVkVGltZXN0YW1wLHNzcmM6Yy5zc3JjLG1pZDpjLm1pZCxjb2RlY0lkOmMuY29kZWNJZCxoZWFkZXJCeXRlc1JlY2VpdmVkOmMuaGVhZGVyQnl0ZXNSZWNlaXZlZHx8MCxwYWNrZXRzRGlzY2FyZGVkOmMucGFja2V0c0Rpc2NhcmRlZHx8MCxqaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXk6Yy5qaXR0ZXJCdWZmZXJNaW5pbXVtRGVsYXl8fDAsaml0dGVyQnVmZmVyVGFyZ2V0RGVsYXk6Yy5qaXR0ZXJCdWZmZXJUYXJnZXREZWxheXx8MH07aWYoYy5tZWRpYVR5cGU9PT0idmlkZW8ifHxjLmtpbmQ9PT0idmlkZW8iKXtjb25zdCBiPWMsaD1HKHtmcmFtZUhlaWdodDpiLmZyYW1lSGVpZ2h0LGZyYW1lV2lkdGg6Yi5mcmFtZVdpZHRoLGZyYW1lc0RlY29kZWQ6Yi5mcmFtZXNEZWNvZGVkLGZyYW1lc0Ryb3BwZWQ6Yi5mcmFtZXNEcm9wcGVkP2IuZnJhbWVzRHJvcHBlZDpiLmRyb3BwZWRGcmFtZXMsZnJhbWVzUGVyU2Vjb25kOmIuZnJhbWVzUGVyU2Vjb25kP2IuZnJhbWVzUGVyU2Vjb25kOmIuZnJhbWVyYXRlTWVhbixmcmFtZXNSZWNlaXZlZDpiLmZyYW1lc1JlY2VpdmVkLGtleUZyYW1lc0RlY29kZWQ6Yi5rZXlGcmFtZXNEZWNvZGVkLGZpckNvdW50OmIuZmlyQ291bnQsZGVjb2RlckltcGxlbWVudGF0aW9uOmIuZGVjb2RlckltcGxlbWVudGF0aW9uLHBsaUNvdW50OmIucGxpQ291bnQsdG90YWxQcm9jZXNzaW5nRGVsYXk6Yi50b3RhbFByb2Nlc3NpbmdEZWxheSxxcFN1bTpiLnFwU3VtfHwwLHRvdGFsQXNzZW1ibHlUaW1lOmIudG90YWxBc3NlbWJseVRpbWV8fDAsdG90YWxEZWNvZGVUaW1lOmIudG90YWxEZWNvZGVUaW1lfHwwLHRvdGFsRnJlZXplc0R1cmF0aW9uOmIudG90YWxGcmVlemVzRHVyYXRpb258fDAsdG90YWxJbnRlckZyYW1lRGVsYXk6Yi50b3RhbEludGVyRnJhbWVEZWxheXx8MCx0b3RhbFBhdXNlc0R1cmF0aW9uOmIudG90YWxQYXVzZXNEdXJhdGlvbnx8MCx0b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXk6Yi50b3RhbFNxdWFyZWRJbnRlckZyYW1lRGVsYXl8fDAsZnJlZXplQ291bnQ6Yi5mcmVlemVDb3VudHx8MCxwYXVzZUNvdW50OmIucGF1c2VDb3VudHx8MCxwb3dlckVmZmljaWVudERlY29kZXI6Yi5wb3dlckVmZmljaWVudERlY29kZXJ9LHgpO2guc2NvcmU9c3Ioe2ZyYW1lV2lkdGg6aC5mcmFtZVdpZHRofHwwLGZyYW1lc0RlY29kZWQ6KGguZnJhbWVzRGVjb2RlZHx8MCktKCgoJD10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOiQuZnJhbWVzRGVjb2RlZCl8fDApLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdDooaC5wYWNrZXRzTG9zdHx8MCktKCgoaWU9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDppZS5wYWNrZXRzTG9zdCl8fDApLHBhY2tldHNSZWNlaXZlZDooaC5wYWNrZXRzUmVjZWl2ZWR8fDApLSgoKGFlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6YWUucGFja2V0c1JlY2VpdmVkKXx8MCksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSl9KSxVLnNldCh1LHtzY29yZTorKGguc2NvcmUqMTApLnRvRml4ZWQoKSxmcmFtZVdpZHRoOmguZnJhbWVXaWR0aHx8MCxmcmFtZUhlaWdodDpoLmZyYW1lSGVpZ2h0fHwwLGZyYW1lc1BlclNlY29uZDpoLmZyYW1lc1BlclNlY29uZHx8MCxwYWNrZXRzTG9zdFBlcmNlbnRhZ2U6ZXQoe3BhY2tldHNMb3N0OihoLnBhY2tldHNMb3N0fHwwKS0oKChDZT10aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkNlLnBhY2tldHNMb3N0KXx8MCkscGFja2V0c1JlY2VpdmVkOihoLnBhY2tldHNSZWNlaXZlZHx8MCktKCgod2U9dGhpcy52aWRlb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDp3ZS5wYWNrZXRzUmVjZWl2ZWQpfHwwKX0pLGppdHRlcjpoLmppdHRlcnx8MCxpc1NjcmVlblNoYXJlOnRoaXMuc2NyZWVuU2hhcmVDb25zdW1lcnMuaGFzKHUpLGJpdHJhdGU6KChoLmJ5dGVzUmVjZWl2ZWR8fDApLSgoKGtlPXRoaXMudmlkZW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6a2UuYnl0ZXNSZWNlaXZlZCl8fDApKSo4Lzd9KSx0aGlzLnZpZGVvQ29uc3VtZXJUb1N0YXRzTWFwLnNldCh1LGgpLG8uaW5ib3VuZFZpZGVvUnRwLnNldChmLmlkLGgpLG8uY29uc3VtZXJTdHJlYW1NYXAuZ2V0KHUpLmluYm91bmRWaWRlb1J0cElkLnB1c2goZi5pZCksdGhpcy5wcm9jZXNzSW5ib3VuZENvbnN1bWVyVmlkZW9TdGF0cyh1LEYsaCl9ZWxzZSBpZihjLm1lZGlhVHlwZT09PSJhdWRpbyJ8fGMua2luZD09PSJhdWRpbyIpe2NvbnN0IGI9YyxoPUcoe2F1ZGlvTGV2ZWw6Yi5hdWRpb0xldmVsLGNvbmNlYWxlZFNhbXBsZXM6Yi5jb25jZWFsZWRTYW1wbGVzLGNvbmNlYWxtZW50RXZlbnRzOmIuY29uY2VhbG1lbnRFdmVudHMsdG90YWxBdWRpb0VuZXJneTpiLnRvdGFsQXVkaW9FbmVyZ3ksdG90YWxTYW1wbGVzRHVyYXRpb246Yi50b3RhbFNhbXBsZXNEdXJhdGlvbix0b3RhbFNhbXBsZXNSZWNlaXZlZDpiLnRvdGFsU2FtcGxlc1JlY2VpdmVkLGZlY1BhY2tldHNEaXNjYXJkZWQ6Yi5mZWNQYWNrZXRzRGlzY2FyZGVkfHwwLGZlY1BhY2tldHNSZWNlaXZlZDpiLmZlY1BhY2tldHNSZWNlaXZlZHx8MCxpbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb246Yi5pbnNlcnRlZFNhbXBsZXNGb3JEZWNlbGVyYXRpb258fDAscmVtb3ZlZFNhbXBsZXNGb3JBY2NlbGVyYXRpb246Yi5yZW1vdmVkU2FtcGxlc0ZvckFjY2VsZXJhdGlvbnx8MCxzaWxlbnRDb25jZWFsZWRTYW1wbGVzOmIuc2lsZW50Q29uY2VhbGVkU2FtcGxlc3x8MCxwbGF5b3V0SWQ6Yi5wbGF5b3V0SWR9LHgpO2guc2NvcmU9cnIoe2NvbmNlYWxtZW50RXZlbnRzOihoLmNvbmNlYWxtZW50RXZlbnRzfHwwKS0oKChNZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOk1lLmNvbmNlYWxtZW50RXZlbnRzKXx8MCkscGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEllPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6SWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChfZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOl9lLnBhY2tldHNSZWNlaXZlZCl8fDApLGppdHRlcjpoLmppdHRlcnx8MH0pLFUuc2V0KHUse3Njb3JlOisoaC5zY29yZSoxMCkudG9GaXhlZCgpLHBhY2tldHNMb3N0UGVyY2VudGFnZTpldCh7cGFja2V0c0xvc3Q6KGgucGFja2V0c0xvc3R8fDApLSgoKEFlPXRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuZ2V0KHUpKT09bnVsbD92b2lkIDA6QWUucGFja2V0c0xvc3QpfHwwKSxwYWNrZXRzUmVjZWl2ZWQ6KGgucGFja2V0c1JlY2VpdmVkfHwwKS0oKChMZT10aGlzLmF1ZGlvQ29uc3VtZXJUb1N0YXRzTWFwLmdldCh1KSk9PW51bGw/dm9pZCAwOkxlLnBhY2tldHNSZWNlaXZlZCl8fDApfSksaml0dGVyOmguaml0dGVyfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZUNvbnN1bWVycy5oYXModSksYml0cmF0ZTooKGguYnl0ZXNSZWNlaXZlZHx8MCktKCgoT2U9dGhpcy5hdWRpb0NvbnN1bWVyVG9TdGF0c01hcC5nZXQodSkpPT1udWxsP3ZvaWQgMDpPZS5ieXRlc1JlY2VpdmVkKXx8MCkpKjgvN30pLHRoaXMuYXVkaW9Db25zdW1lclRvU3RhdHNNYXAuc2V0KHUsaCksby5pbmJvdW5kQXVkaW9SdHAuc2V0KGYuaWQsaCksby5jb25zdW1lclN0cmVhbU1hcC5nZXQodSkuaW5ib3VuZEF1ZGlvUnRwSWQucHVzaChmLmlkKSx0aGlzLnByb2Nlc3NJbmJvdW5kQ29uc3VtZXJBdWRpb1N0YXRzKHUsRixoKX19ZWxzZSB0aGlzLmNhbGxTdGF0c0luc3RhbmNlLmxvZ2dlci5lcnJvcihgQ2FsbHN0YXRzOiBVbmtub3duIEluYm91bmQtcnRwLiBtZWRpYXR5cGU6ICR7Yy5tZWRpYVR5cGV9IGtpbmQ6ICR7Yy5raW5kfWApO2JyZWFrfX19aWYoby5wcm9kdWNlclN0cmVhbU1hcC5mb3JFYWNoKChmLGMpPT57dmFyIHUsdixGLHgsYixoLEgsRGUsTmUsVmUsQmUsRmUseGUsamUsVWUsSGUsS2UsemUsV2UsJGUsR2UsWWUscWU7aWYoZi5vdXRib3VuZFZpZGVvUnRwSWQubGVuZ3RoPjApe2NvbnN0IE49W107Zi5vdXRib3VuZFZpZGVvUnRwSWQuZm9yRWFjaChPdD0+e04ucHVzaChvLm91dGJvdW5kVmlkZW9SdHAuZ2V0KE90KSl9KTtjb25zdCBfPXRoaXMuZ2V0V29ya2luZ1NpbXVsY2FzdFZpZGVvU3RhdHMoTik7Xy5zY29yZT1lcih7ZnJhbWVXaWR0aDpfLmZyYW1lV2lkdGh8fDAsZnJhbWVzUGVyU2Vjb25kOl8uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKHU9Xy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6dS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c1NlbnQ6KF8ucGFja2V0c1NlbnR8fDApLSgoKHY9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDp2LnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoRj1fLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpGLnBhY2tldHNMb3N0KXx8MCktKCgoYj0oeD10aGlzLnZpZGVvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOngucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOmIucGFja2V0c0xvc3QpfHwwKSxmcmFtZXNFbmNvZGVkOihfLmZyYW1lc0VuY29kZWR8fDApLSgoKGg9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpoLmZyYW1lc0VuY29kZWQpfHwwKX0pLEIuc2V0KGMse3Njb3JlOisoXy5zY29yZSoxMCkudG9GaXhlZCgpLGZyYW1lV2lkdGg6Xy5mcmFtZVdpZHRofHwwLGZyYW1lSGVpZ2h0Ol8uZnJhbWVIZWlnaHR8fDAsZnJhbWVzUGVyU2Vjb25kOl8uZnJhbWVzUGVyU2Vjb25kfHwwLGppdHRlcjooKEg9Xy5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SC5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYykscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooXy5wYWNrZXRzU2VudHx8MCktKCgoRGU9dGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpEZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKE5lPV8ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOk5lLnBhY2tldHNMb3N0KXx8MCktKCgoQmU9KFZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6VmUucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOkJlLnBhY2tldHNMb3N0KXx8MCl9KSxiaXRyYXRlOigoXy5ieXRlc1NlbnR8fDApLSgoKEZlPXRoaXMudmlkZW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6RmUuYnl0ZXNTZW50KXx8MCkpKjgvNyxjcHVMaW1pdGF0aW9uczpfLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uPT09ImNwdSIsYmFuZHdpZHRoTGltaXRhdGlvbnM6Xy5xdWFsaXR5TGltaXRhdGlvblJlYXNvbj09PSJiYW5kd2lkdGgifSksdGhpcy52aWRlb1Byb2R1Y2VyVG9TdGF0c01hcC5zZXQoYyxfKX1lbHNlIGlmKGYub3V0Ym91bmRBdWRpb1J0cElkLmxlbmd0aD4wKXtjb25zdCBOPW8ub3V0Ym91bmRBdWRpb1J0cC5nZXQoZi5vdXRib3VuZEF1ZGlvUnRwSWRbMF0pO04uc2NvcmU9WnQoe3BhY2tldHNTZW50OihOLnBhY2tldHNTZW50fHwwKS0oKCh4ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnhlLnBhY2tldHNTZW50KXx8MCkscGFja2V0c0xvc3Q6KCgoamU9Ti5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6amUucGFja2V0c0xvc3QpfHwwKS0oKChIZT0oVWU9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpVZS5yZW1vdGVEYXRhKT09bnVsbD92b2lkIDA6SGUucGFja2V0c0xvc3QpfHwwKSxqaXR0ZXI6KChLZT1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpLZS5qaXR0ZXIpfHwwfSksQi5zZXQoYyx7c2NvcmU6KyhOLnNjb3JlKjEwKS50b0ZpeGVkKCksYml0cmF0ZTooKE4uYnl0ZXNTZW50fHwwKS0oKCh6ZT10aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLmdldChjKSk9PW51bGw/dm9pZCAwOnplLmJ5dGVzU2VudCl8fDApKSo4LzcscGFja2V0c0xvc3RQZXJjZW50YWdlOlplKHtwYWNrZXRzU2VudDooTi5wYWNrZXRzU2VudHx8MCktKCgoV2U9dGhpcy5hdWRpb1Byb2R1Y2VyVG9TdGF0c01hcC5nZXQoYykpPT1udWxsP3ZvaWQgMDpXZS5wYWNrZXRzU2VudCl8fDApLHBhY2tldHNMb3N0OigoKCRlPU4ucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOiRlLnBhY2tldHNMb3N0KXx8MCktKCgoWWU9KEdlPXRoaXMuYXVkaW9Qcm9kdWNlclRvU3RhdHNNYXAuZ2V0KGMpKT09bnVsbD92b2lkIDA6R2UucmVtb3RlRGF0YSk9PW51bGw/dm9pZCAwOlllLnBhY2tldHNMb3N0KXx8MCl9KSxqaXR0ZXI6KChxZT1OLnJlbW90ZURhdGEpPT1udWxsP3ZvaWQgMDpxZS5qaXR0ZXIpfHwwLGlzU2NyZWVuU2hhcmU6dGhpcy5zY3JlZW5TaGFyZVByb2R1Y2Vycy5oYXMoYyl9KSx0aGlzLmF1ZGlvUHJvZHVjZXJUb1N0YXRzTWFwLnNldChjLE4pfX0pLFQuZm9yRWFjaChmPT57Y29uc3QgYz1nLmZpbmQodj0+di5pZD09PWYubG9jYWxDYW5kaWRhdGVJZD8oZi5sb2NhbENhbmRpZGF0ZUlkPXYuaWQsdik6bnVsbCksdT15LmZpbmQodj0+di5pZD09PWYucmVtb3RlQ2FuZGlkYXRlSWQ/KGYucmVtb3RlQ2FuZGlkYXRlSWQ9di5pZCx2KTpudWxsKTtjJiYoZi5sb2NhbENhbmRpZGF0ZVR5cGU9Yy50eXBlLGYubG9jYWxDYW5kaWRhdGVBZGRyZXNzPXRlKGMuYWRkcmVzcyksZi5sb2NhbENhbmRpZGF0ZVBvcnQ9Yy5wb3J0LGYubG9jYWxDYW5kaWRhdGVQcm90b2NvbD1jLnByb3RvY29sLGYubG9jYWxDYW5kaWRhdGVVcmw9Yy51cmwsZi5sb2NhbENhbmRpZGF0ZU5ldHdvcmtUeXBlPWMubmV0d29ya1R5cGUsZi5sb2NhbENhbmRpZGF0ZVJlbGF0ZWRBZGRyZXNzPXRlKGMucmVsYXRlZEFkZHJlc3MpLGYubG9jYWxDYW5kaWRhdGVSZWxhdGVkUG9ydD1jLnJlbGF0ZWRQb3J0KSx1JiYoZi5yZW1vdGVDYW5kaWRhdGVUeXBlPXUudHlwZSxmLnJlbW90ZUNhbmRpZGF0ZUFkZHJlc3M9dGUodS5hZGRyZXNzKSxmLnJlbW90ZUNhbmRpZGF0ZVBvcnQ9dS5wb3J0LGYucmVtb3RlQ2FuZGlkYXRlUHJvdG9jb2w9dS5wcm90b2NvbCxmLnJlbW90ZUNhbmRpZGF0ZVVybD11LnVybCl9KSxvLmNhbmRpZGF0ZVBhaXImJihvLnRyYW5zcG9ydD8oby50cmFuc3BvcnQuYnl0ZXNSZWNlaXZlZD1vLmNhbmRpZGF0ZVBhaXIuYnl0ZXNSZWNlaXZlZCxvLnRyYW5zcG9ydC5ieXRlc1NlbnQ9by5jYW5kaWRhdGVQYWlyLmJ5dGVzU2VudCxvLnRyYW5zcG9ydC50b3RhbFJvdW5kVHJpcFRpbWU9by5jYW5kaWRhdGVQYWlyLnRvdGFsUm91bmRUcmlwVGltZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZU91dGdvaW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGU9by5jYW5kaWRhdGVQYWlyLmF2YWlsYWJsZUluY29taW5nQml0cmF0ZSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPW8uY2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSk6by50cmFuc3BvcnQ9e2J5dGVzUmVjZWl2ZWQ6by5jYW5kaWRhdGVQYWlyLmJ5dGVzUmVjZWl2ZWQsYnl0ZXNTZW50Om8uY2FuZGlkYXRlUGFpci5ieXRlc1NlbnQsdG90YWxSb3VuZFRyaXBUaW1lOm8uY2FuZGlkYXRlUGFpci50b3RhbFJvdW5kVHJpcFRpbWUsYXZhaWxhYmxlT3V0Z29pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVPdXRnb2luZ0JpdHJhdGUsYXZhaWxhYmxlSW5jb21pbmdCaXRyYXRlOm8uY2FuZGlkYXRlUGFpci5hdmFpbGFibGVJbmNvbWluZ0JpdHJhdGUscm91bmRUcmlwVGltZTpvLmNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWV9KSxvLnRyYW5zcG9ydCYmKG8udHJhbnNwb3J0LmNhbmRpZGF0ZVBhaXJzPVQpLG8udHJhbnNwb3J0JiYhby50cmFuc3BvcnQucm91bmRUcmlwVGltZSl7bGV0IGY9MCxjPTA7by5yZW1vdGVJbmJvdW5kUnRwLmZvckVhY2goKHUsdik9Pnt1LnJvdW5kVHJpcFRpbWUmJnUucm91bmRUcmlwVGltZT5mJiYoZj11LnJvdW5kVHJpcFRpbWUsYz11LnRvdGFsUm91bmRUcmlwVGltZSl9KSxvLnRyYW5zcG9ydC5yb3VuZFRyaXBUaW1lPWYsby50cmFuc3BvcnQudG90YWxSb3VuZFRyaXBUaW1lPWN9aWYoVS5zaXplPjApdHJ5e3RoaXMub2JzZXJ2ZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLFUpfWNhdGNoKGYpe31pZihCLnNpemU+MCl0cnl7dGhpcy5vYnNlcnZlci5lbWl0KCJwcm9kdWNlcl9zY29yZSIsQil9Y2F0Y2goZil7fXJldHVybiBvfWdldFByb2R1Y2VyU3RhdHNGcm9tUmVwb3J0KGUpe2NvbnN0IHM9W107dHJ5e2UucHJvZHVjZXJTdHJlYW1NYXAuZm9yRWFjaCgobixpKT0+e2NvbnN0IGE9dGhpcy5wcm9kdWNlck1hcC5nZXQoaSksbD1hLnRyYWNrLmdldFNldHRpbmdzKCksbz1uLm91dGJvdW5kVmlkZW9SdHBJZC5tYXAoZz0+e2NvbnN0IHk9ZS5vdXRib3VuZFZpZGVvUnRwLmdldChnKTtyZXR1cm4geS5mcmFtZUhlaWdodHx8KHkuZnJhbWVIZWlnaHQ9bC5oZWlnaHQseS5mcmFtZVdpZHRoPWwud2lkdGgseS5mcmFtZXNQZXJTZWNvbmQ9bC5mcmFtZVJhdGUpLHl9KSxtPXtwcm9kdWNlcklkOmksYXBwRGF0YTphLmFwcERhdGEsdmlkZW9TdGF0czpvLGF1ZGlvU3RhdHM6bi5vdXRib3VuZEF1ZGlvUnRwSWQubWFwKGc9PmUub3V0Ym91bmRBdWRpb1J0cC5nZXQoZykpfTtzLnB1c2gobSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRQcm9kdWNlcnNSZXBvcnQ6ICIsbixlKX1yZXR1cm4gc31nZXRDb25zdW1lclN0YXRzRnJvbVBhcnNlZENvbnN1bWVyU3RhdHMoZSxzLG4pe2xldCBpO3RyeXtjb25zdHtwZWVySWQ6YSxwcm9kdWNlcklkOmwsYXBwRGF0YTpvfT10aGlzLmNvbnN1bWVyUGVlcklkTWFwLmdldChuKSxtPXM9PW51bGw/dm9pZCAwOnMuaW5ib3VuZFZpZGVvUnRwSWQubWFwKGc9Pntjb25zdCBUPXRoaXMuY29uc3VtZXJNYXAuZ2V0KG4pLnRyYWNrLmdldFNldHRpbmdzKCksQj1lLmluYm91bmRWaWRlb1J0cC5nZXQoZyk7cmV0dXJuIEIuZnJhbWVIZWlnaHR8fChCLmZyYW1lSGVpZ2h0PVQuaGVpZ2h0LEIuZnJhbWVXaWR0aD1ULndpZHRoLEIuZnJhbWVzUGVyU2Vjb25kPVQuZnJhbWVSYXRlKSxCfSk7aT17Y29uc3VtZXJJZDpuLHBlZXJJZDphLHByb2R1Y2VySWQ6bCxhcHBEYXRhOm8sdmlkZW9TdGF0czptLGF1ZGlvU3RhdHM6cz09bnVsbD92b2lkIDA6cy5pbmJvdW5kQXVkaW9SdHBJZC5tYXAoZz0+ZS5pbmJvdW5kQXVkaW9SdHAuZ2V0KGcpKX19Y2F0Y2goYSl7Y29uc29sZS5lcnJvcigiZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzOiAiLGEsZSl9cmV0dXJuIGl9Z2V0Q29uc3VtZXJTdGF0c0Zyb21SZXBvcnQoZSl7Y29uc3Qgcz1bXTt0cnl7ZS5jb25zdW1lclN0cmVhbU1hcC5mb3JFYWNoKChuLGkpPT57cy5wdXNoKHRoaXMuZ2V0Q29uc3VtZXJTdGF0c0Zyb21QYXJzZWRDb25zdW1lclN0YXRzKGUsbixpKSl9KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKCJnZXRDb25zdW1lclN0YXRzRnJvbVJlcG9ydDogIixuLGUpfXJldHVybiBzfX1jbGFzcyB3cyBleHRlbmRzIGxye31mdW5jdGlvbiBudChyLHQsZSxzKXtpZihyIT1udWxsJiZyLmxvZ2dlciYmci5sb2dnZXIuZXJyb3IoIkNhbGxzdGF0czo6aGFuZGxlRXJyb3IiLHtlcnJvcjpzfSksdHlwZW9mIGU9PSJmdW5jdGlvbiImJnMgaW5zdGFuY2VvZiB0KWUuY2FsbChudWxsLHMscik7ZWxzZSB0aHJvdyBzfWZ1bmN0aW9uIHVyKHIsdCxlKXtjb25zdCBzPXIudmFsdWU7cmV0dXJuIHIudmFsdWU9ZnVuY3Rpb24oLi4ubil7dHJ5e2NvbnN0IGk9cy5hcHBseSh0aGlzLG4pO3JldHVybiBpJiZpIGluc3RhbmNlb2YgUHJvbWlzZT9pLmNhdGNoKGE9PntudCh0aGlzLHQsZSxhKX0pOml9Y2F0Y2goaSl7bnQodGhpcyx0LGUsaSl9cmV0dXJuIG51bGx9LHJ9Y29uc3Qgdz0ocix0KT0+KGUscyxuKT0+e2NvbnN0IGk9bi52YWx1ZTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbiguLi5hKXt0cnl7Y29uc3QgbD1pLmFwcGx5KHRoaXMsYSk7cmV0dXJuIGwmJmwgaW5zdGFuY2VvZiBQcm9taXNlP2wuY2F0Y2gobz0+e250KHRoaXMscix0LG8pfSk6bH1jYXRjaChsKXtudCh0aGlzLHIsdCxsKX1yZXR1cm4gbnVsbH0sbn0sa3M9KHIsdCk9PihlLHMsbik9PntpZihuKXJldHVybiB1cihuLHIsdCk7Zm9yKGNvbnN0IGkgb2YgUmVmbGVjdC5vd25LZXlzKGUucHJvdG90eXBlKS5maWx0ZXIoYT0+YSE9PSJjb25zdHJ1Y3RvciIpKXtjb25zdCBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZS5wcm90b3R5cGUsaSk7YS52YWx1ZSBpbnN0YW5jZW9mIEZ1bmN0aW9uJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsaSx1cihhLHIsdCkpfX07dmFyIFA9ZnVuY3Rpb24ocix0LGUscyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aCxpPW48Mz90OnM9PT1udWxsP3M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LGUpOnMsYTtpZih0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJnR5cGVvZiBSZWZsZWN0LmRlY29yYXRlPT0iZnVuY3Rpb24iKWk9UmVmbGVjdC5kZWNvcmF0ZShyLHQsZSxzKTtlbHNlIGZvcih2YXIgbD1yLmxlbmd0aC0xO2w+PTA7bC0tKShhPXJbbF0pJiYoaT0objwzP2EoaSk6bj4zP2EodCxlLGkpOmEodCxlKSl8fGkpO3JldHVybiBuPjMmJmkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUsaSksaX07Y29uc3QgQz1jb25zb2xlO2xldCBFPWNsYXNzIGV4dGVuZHMgentjb25zdHJ1Y3RvcihlPSJodHRwczovL2FwaS50ZXN0aW5ndjMuZHl0ZS5pbiIscz0iQmxpbmsiLG49V3QuUFJPRCxpLGEsbCxvLG0pe3N1cGVyKCk7cCh0aGlzLCJvYnNlcnZlciIpO3AodGhpcywiZXZlbnRIYW5kbGVyIik7cCh0aGlzLCJtZWFzdXJlbWVudHMiKTtwKHRoaXMsInByb2R1Y2luZ1RyYW5zcG9ydCIpO3AodGhpcywiY29uc3VtaW5nVHJhbnNwb3J0Iik7cCh0aGlzLCJwcm9kdWNlcnMiLG5ldyBNYXApO3AodGhpcywiY29uc3VtZXJzIixuZXcgTWFwKTtwKHRoaXMsImljZVNlcnZlcnMiKTtwKHRoaXMsImNvbm5lY3Rpb25JbmZvUHJvbWlzZSIpO3AodGhpcywicGluZ1N0YXRzVGltZW91dCIpO3AodGhpcywibG9nZ2VyIik7cCh0aGlzLCJlbnYiKTtwKHRoaXMsImFwaUhvc3RuYW1lcyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJjb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwIixuZXcgTWFwKTtwKHRoaXMsImN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMiLHt9KTtpZighbSl0aHJvdyBFcnJvcigiYXV0aFRva2VuIGlzIG1pc3NpbmcgYnV0IHJlcXVpcmVkIHRvIGluaXRpYWxpemUgQ2FsbFN0YXRzISIpO3N3aXRjaCh0aGlzLmVudj1uLHRoaXMuYXBpSG9zdG5hbWVzPW8sdGhpcy5sb2dnZXI9YSx0aGlzLnBlZXJJZD1sLHRoaXMuZXZlbnRIYW5kbGVyPW5ldyB1cyh7bG9nZ2VyOmEscGVlcklkOmwsYXBpSG9zdG5hbWVzOm8sYXV0aFRva2VuOm19KSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjplbmdpbmVOYW1lOiAiLHtlbmdpbmVOYW1lOnN9KSxzKXtjYXNlIkJsaW5rIjp0aGlzLm1lYXN1cmVtZW50cz1uZXcgQ3M7YnJlYWs7Y2FzZSJHZWNrbyI6dGhpcy5tZWFzdXJlbWVudHM9bmV3IGxyO2JyZWFrO2Nhc2UiV2ViS2l0Ijp0aGlzLm1lYXN1cmVtZW50cz1uZXcgd3M7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihgVW5rbm93biBlbmdpbmVOYW1lISAke3N9YCl9dGhpcy5tZWFzdXJlbWVudHMuY2FsbFN0YXRzSW5zdGFuY2U9dGhpcyx0aGlzLnJlZ2lzdGVyUHJvZHVjZXI9dGhpcy5yZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyksdGhpcy5yZWdpc3RlckNvbnN1bWVyPXRoaXMucmVnaXN0ZXJDb25zdW1lci5iaW5kKHRoaXMpLHRoaXMub2JzZXJ2ZXI9bmV3IHosdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oImNvbnN1bWVyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpjb25zdW1lcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgiY29uc3VtZXJfc2NvcmUiLGcpfSksdGhpcy5tZWFzdXJlbWVudHMub2JzZXJ2ZXIub24oInByb2R1Y2VyX3Njb3JlIixnPT57YS5kZWJ1ZyhgY2FsbFN0YXRzOjpwcm9kdWNlcl9zY29yZSAke1suLi5nLmVudHJpZXMoKV19YCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdCgicHJvZHVjZXJfc2NvcmUiLGcpfSl9cmVnaXN0ZXJJY2VTZXJ2ZXJzKGUpe3RoaXMuaWNlU2VydmVycz1lfXJlZ2lzdGVyQ29uc3VtZXIoZSl7dmFyIHM7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlLmlkKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLmlkLHt9KSx0aGlzLmNvbnN1bWVycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlckNvbnN1bWVyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyQ29uc3VtZXIiLHtjb25zdW1lcklkOmUuaWQsY29uc3VtZXJraW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlckNvbnN1bWVyLmJpbmQodGhpcyxlKSl9cmVnaXN0ZXJQcm9kdWNlcihlKXt2YXIgczt0aGlzLnByb2R1Y2Vycy5zZXQoZS5pZCxlKSx0aGlzLm1lYXN1cmVtZW50cy5yZWdpc3RlclByb2R1Y2VyKGUpLHRoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSksZS5vbigiY2xvc2UiLHRoaXMuZGVSZWdpc3RlclByb2R1Y2VyLmJpbmQodGhpcyxlKSl9c2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50KGUscyl7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLmhhcyhlKXx8dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLHt9KTtjb25zdCBuPXRoaXMuY29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlc01hcC5nZXQoZSk7dGhpcy5jb25zdW1lclNoYXJlZE1lZGlhU3RhdGVzTWFwLnNldChlLE9iamVjdC5hc3NpZ24obixzKSl9cmVnaXN0ZXJQcm9kdWNpbmdUcmFuc3BvcnQoZSl7dmFyIG47dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9ZSxlLm9uKCJjbG9zZSIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksZS5vbigiZGlzY29ubmVjdCIsdGhpcy5kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0LmJpbmQodGhpcyxlKSksQXJyYXkuZnJvbSgoKG49ZS5fcHJvZHVjZXJzKT09bnVsbD92b2lkIDA6bi52YWx1ZXMoKSl8fFtdKS5mb3JFYWNoKGk9Pnt0aGlzLnJlZ2lzdGVyUHJvZHVjZXIoaSl9KSxlLm9uKCJuZXdwcm9kdWNlciIsdGhpcy5yZWdpc3RlclByb2R1Y2VyKX1yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKXt2YXIgbjt0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydD1lLGUub24oImNsb3NlIix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxlLm9uKCJkaXNjb25uZWN0Iix0aGlzLmRpc2Nvbm5lY3RDb25zdW1pbmdUcmFuc3BvcnQuYmluZCh0aGlzLGUpKSxBcnJheS5mcm9tKCgobj1lLl9jb25zdW1lcnMpPT1udWxsP3ZvaWQgMDpuLnZhbHVlcygpKXx8W10pLmZvckVhY2goaT0+e3RoaXMucmVnaXN0ZXJDb25zdW1lcihpKX0pLGUub24oIm5ld2NvbnN1bWVyIix0aGlzLnJlZ2lzdGVyQ29uc3VtZXIpfWRlUmVnaXN0ZXJDb25zdW1lcihlKXt0aGlzLmNvbnN1bWVycy5kZWxldGUoZS5pZCl9ZGVSZWdpc3RlclByb2R1Y2VyKGUpe3ZhciBzO3RoaXMucHJvZHVjZXJzLmRlbGV0ZShlLmlkKSx0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpkZVJlZ2lzdGVyUHJvZHVjZXIiLHtwcm9kdWNlcklkOmUuaWQscHJvZHVjZXJLaW5kOmUua2luZCxpc1NjcmVlblNoYXJlOiEhKChzPWUuYXBwRGF0YSkhPW51bGwmJnMuc2NyZWVuU2hhcmUpfSl9ZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCgpe3RoaXMuY29uc3VtaW5nVHJhbnNwb3J0PXZvaWQgMH1kaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0KCl7dGhpcy5wcm9kdWNpbmdUcmFuc3BvcnQ9dm9pZCAwfWNhbGxFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoZSl9c2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlPSExLHMpe3RoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlPXRoaXMubWVhc3VyZW1lbnRzLmdldE5ldHdvcmtJbmZvKHRoaXMuaWNlU2VydmVycyxlKSx0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUFJFQ0FMTF9URVNUX0JFR0lOLHRpbWVzdGFtcDpzfSksdGhpcy5jb25uZWN0aW9uSW5mb1Byb21pc2UmJnRoaXMuY29ubmVjdGlvbkluZm9Qcm9taXNlLnRoZW4obj0+e3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5QUkVDQUxMX1RFU1RfQ09NUExFVEUsbWV0YURhdGE6e2Nvbm5lY3Rpb25JbmZvOm59LHRpbWVzdGFtcDpzfSl9KX1zZW5kU2NyZWVuU2hhcmVUb2dnbGVFdmVudChlLHM9bnVsbCxuKXt0aGlzLmN1cnJlbnRVc2VyTWVkaWFTdGF0ZXMuc2NyZWVuPWUsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplP1MuU0NSRUVOU0hBUkVfU1RBUlRFRDpTLlNDUkVFTlNIQVJFX1NUT1BQRUQsbWV0YURhdGE6e3NzcmM6c30sdGltZXN0YW1wOm59KX1zZW5kU2NyZWVuU2hhcmVSZXF1ZXN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuU0NSRUVOU0hBUkVfU1RBUlRfUkVRVUVTVEVELHRpbWVzdGFtcDplfSl9c2VuZEFjdGl2ZVNwZWFrZXJFdmVudChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5ET01JTkFOVF9TUEVBS0VSLG1ldGFEYXRhOntwZWVySWQ6ZX0sdGltZXN0YW1wOnN9KX1kZXZpY2VzKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OmU9PT1xLkFVRElPJiZTLkFVRElPX0RFVklDRVNfVVBEQVRFU3x8ZT09PXEuVklERU8mJlMuVklERU9fREVWSUNFU19VUERBVEVTfHxlPT09cS5TUEVBS0VSJiZTLlNQRUFLRVJfREVWSUNFU19VUERBVEVTLG1ldGFEYXRhOntkZXZpY2VMaXN0OnN9LHRpbWVzdGFtcDpufSl9c2VsZWN0ZWREZXZpY2UoZSxzLG4pe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PXEuQVVESU8mJlMuU0VMRUNURURfTUlDUk9IUE9ORV9VUERBVEV8fGU9PT1xLlZJREVPJiZTLlNFTEVDVEVEX0NBTUVSQV9VUERBVEV8fGU9PT1xLlNQRUFLRVImJlMuU0VMRUNURURfU1BFQUtFUl9VUERBVEUsbWV0YURhdGE6e2RldmljZTpzfSx0aW1lc3RhbXA6bn0pfW1lZGlhUGVybWlzc2lvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk1FRElBX1BFUk1JU1NJT04sbWV0YURhdGE6e2RldmljZVR5cGU6ZSxwZXJtaXNzaW9uOnN9LHRpbWVzdGFtcDpufSl9bWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6ZT09PXEuQVVESU8mJlMuQVVESU9fUExBWV9GQUlMRUR8fGU9PT1xLlZJREVPJiZTLlZJREVPX1BMQVlfRkFJTEVELG1ldGFEYXRhOntkZXZpY2VUeXBlOmV9LHRpbWVzdGFtcDpzfSl9bWVkaWFUcmFja011dGVkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDplPT09cS5BVURJTyYmUy5BVURJT19UUkFDS19NVVRFRHx8ZT09PXEuVklERU8mJlMuVklERU9fVFJBQ0tfTVVURUQsbWV0YURhdGE6e2RldmljZVR5cGU6ZX0sdGltZXN0YW1wOnN9KX10YWJDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlRBQl9DSEFOR0UsbWV0YURhdGE6e2lzTWVldGluZ3NUYWJBY3RpdmU6ZX0sdGltZXN0YW1wOnN9KX1icm93c2VyQmFja2dyb3VuZGVkKGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5CUk9XU0VSX0JBQ0tHUk9VTkRFRCx0aW1lc3RhbXA6ZX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkJST1dTRVJfRk9SRUdST1VOREVELHRpbWVzdGFtcDplfSl9bGVnYWN5U3dpdGNoKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkxFR0FDWV9TV0lUQ0gsbWV0YWRhdGE6e29uOmV9LHRpbWVzdGFtcDpzfSl9Z2V0UHJlQ2FsbFRlc3RSZXN1bHRzKCl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JbmZvUHJvbWlzZX0pfXNlbmRDYWxsSm9pbkJlZ2luRXZlbnQoZSxzKXtlPVFlKEcoe30sZSkse21lZXRpbmdFbnY6dGhpcy5lbnZ9KSxlLmRldmljZUluZm89UWUoRyh7fSxlLmRldmljZUluZm8pLHt1c2VyQWdlbnQ6bmF2aWdhdG9yLnVzZXJBZ2VudCxjcHVzOm5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5LG1lbW9yeTpuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5fSksdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkNBTExfSk9JTl9CRUdJTixtZXRhRGF0YTp7cGVlck1ldGFEYXRhOmV9LHRpbWVzdGFtcDpzfSl9c2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTkVUX1FVQUxJVFlfVEVTVF9CRUdJTix0aW1lc3RhbXA6c30pLG5ldyBQcm9taXNlKChpLGEpPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBsPVtdO3RyeXtmb3IoY29uc3QgbyBvZiBlKXRyeXtpZihvLmljZVNlcnZlcnMmJm8uaWNlU2VydmVycy5sZW5ndGg+MCl7Y29uc3QgbT15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXROZXR3b3JrUXVhbGl0eShvLmljZVNlcnZlcnMpO2wucHVzaChRZShHKHt9LG8pLHtuZXR3b3JrUmVzdWx0czptfSkpfX1jYXRjaChtKXtjb25zb2xlLndhcm4oIkVycm9yIGhhbmRsaW5nICIsbSl9aSh7cmVnaW9uRGF0YTpsfSl9Y2F0Y2gobyl7Y29uc29sZS53YXJuKCJFcnJvciBpbiBjYWxsc3RhdHMsICIsbyksYShvKX19KSkudGhlbihpPT57dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLk5FVF9RVUFMSVRZX1RFU1RfRU5ELHRpbWVzdGFtcDpzLG1ldGFEYXRhOml9KX0pfXNlbmRXZWJTb2NrZXRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuV0VCU09DS0VUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuVFJBTlNQT1JUX0NPTk5FQ1RFRCx0aW1lc3RhbXA6ZX0pfXNlbmRBdWRpb1RvZ2dsZUV2ZW50KGUscyl7dGhpcy5jdXJyZW50VXNlck1lZGlhU3RhdGVzLmF1ZGlvPWU7bGV0IG47ZT9uPVMuQVVESU9fT046bj1TLkFVRElPX09GRix0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50Om4sdGltZXN0YW1wOnN9KX1zZW5kVmlkZW9Ub2dnbGVFdmVudChlLHMpe3RoaXMuY3VycmVudFVzZXJNZWRpYVN0YXRlcy52aWRlbz1lO2xldCBuO2U/bj1TLlZJREVPX09OOm49Uy5WSURFT19PRkYsdGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpuLHRpbWVzdGFtcDpzfSl9c2VuZFBhcnRpY2lwYW50Um9sZVRvZ2dsZUV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBBUlRJQ0lQQU5UX1JPTEUsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXN0YXJ0UGluZ1N0YXRzKGU9N2UzKXt0aGlzLnNlbmRQaW5nU3RhdHNFdmVudCghMSxuZXcgRGF0ZSksdGhpcy5waW5nU3RhdHNUaW1lb3V0PXNldEludGVydmFsKHRoaXMuc2VuZFBpbmdTdGF0c0V2ZW50LmJpbmQodGhpcyksZSl9c3RvcFBpbmdTdGF0cygpe2NsZWFySW50ZXJ2YWwodGhpcy5waW5nU3RhdHNUaW1lb3V0KX1zZW5kUGluZ1N0YXRzRXZlbnQoZT0hMCxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGwsbztsZXQgbixpO2lmKHRoaXMucHJvZHVjaW5nVHJhbnNwb3J0JiYobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksIW58fCEoKGw9bj09bnVsbD92b2lkIDA6bi5wcm9kdWNlclJlcG9ydCkhPW51bGwmJmwubGVuZ3RoKSkpe3RoaXMubG9nZ2VyLmRlYnVnKCJjYWxsU3RhdHM6OnNlbmRQaW5nU3RhdHNFdmVudDo6c3RhbGVQcm9kdWNpbmdUcmFuc3BvcnQiLHtkaXNjbGFpbWVyOiJTdGFsZSBwcm9kdWNlcj8gUmVnZW5lcmF0aW5nIFN0cmVhbSBNYXBzISJ9KTtjb25zdCBtPXlpZWxkIHRoaXMubWVhc3VyZW1lbnRzLmdldFByb2R1Y2Vyc1JlcG9ydChbLi4udGhpcy5wcm9kdWNlcnMudmFsdWVzKCldKTtuJiZtP24ucHJvZHVjZXJSZXBvcnQ9bToobj15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRQcm9jZXNzZWRTdGF0cyh0aGlzLnByb2R1Y2luZ1RyYW5zcG9ydCwhMSwhMCksKCFufHwhKG4hPW51bGwmJm4ucHJvZHVjZXJSZXBvcnQpKSYmdGhpcy5sb2dnZXIuZGVidWcoImNhbGxTdGF0czo6c2VuZFBpbmdTdGF0c0V2ZW50Ojpub1Byb2R1Y2luZ1RyYW5zcG9ydFJlcG9ydCIse2Rpc2NsYWltZXI6IlN0cmVhbSBtYXBzIGludmFsaWQgZGVzcGl0ZSByZWdlbmVyYXRpbmchIn0pKX1pZih0aGlzLmNvbnN1bWluZ1RyYW5zcG9ydCYmKGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCFpfHwhKChvPWkuY29uc3VtZXJSZXBvcnQpIT1udWxsJiZvLmxlbmd0aCkpKXt0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6OnN0YWxlQ29uc3VtaW5nVHJhbnNwb3J0Iix7ZGlzY2xhaW1lcjoiU3RhbGUgY29uc3VtZXI/IFJlZ2VuZXJhdGluZyBTdHJlYW0gTWFwcyEifSk7Y29uc3QgbT15aWVsZCB0aGlzLm1lYXN1cmVtZW50cy5nZXRDb25zdW1lcnNSZXBvcnQoWy4uLnRoaXMuY29uc3VtZXJzLnZhbHVlcygpXSk7aSYmbT9pLmNvbnN1bWVyUmVwb3J0PW06KGk9eWllbGQgdGhpcy5tZWFzdXJlbWVudHMuZ2V0UHJvY2Vzc2VkU3RhdHModGhpcy5jb25zdW1pbmdUcmFuc3BvcnQsITAsITEpLCghaXx8IWkuY29uc3VtZXJSZXBvcnQpJiZ0aGlzLmxvZ2dlci5kZWJ1ZygiY2FsbFN0YXRzOjpzZW5kUGluZ1N0YXRzRXZlbnQ6Om5vQ29uc3VtaW5nVHJhbnNwb3J0UmVwb3J0Iix7ZGlzY2xhaW1lcjoiU3RyZWFtIG1hcHMgaW52YWxpZCBkZXNwaXRlIHJlZ2VuZXJhdGluZyEifSkpfWNvbnN0IGE9e3Byb2R1Y2luZ1RyYW5zcG9ydFN0YXRzOm4/bj09bnVsbD92b2lkIDA6bi50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLGNvbnN1bWluZ1RyYW5zcG9ydFN0YXRzOmk/aT09bnVsbD92b2lkIDA6aS50cmFuc3BvcnRSZXBvcnQ6dm9pZCAwLHByb2R1Y2VyU3RhdHM6W10uY29uY2F0KChuPT1udWxsP3ZvaWQgMDpuLnByb2R1Y2VyUmVwb3J0KXx8W10pLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5wcm9kdWNlclJlcG9ydCl8fFtdKSxjb25zdW1lclN0YXRzOltdLmNvbmNhdCgoaT09bnVsbD92b2lkIDA6aS5jb25zdW1lclJlcG9ydCl8fFtdKS5jb25jYXQoKG49PW51bGw/dm9pZCAwOm4uY29uc3VtZXJSZXBvcnQpfHxbXSl9O2lmKGUmJmEucHJvZHVjZXJTdGF0cy5sZW5ndGg9PT0wJiZhLmNvbnN1bWVyU3RhdHMubGVuZ3RoPT09MCl7eWllbGQgdGhpcy5ldmVudEhhbmRsZXIuZmx1c2goKTtyZXR1cm59dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLlBJTkdfU1RBVCxtZXRhRGF0YTphLHRpbWVzdGFtcDpzfSl9KX1zZW5kSVZTUGxheWVyUmVidWZmZXJFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUJVRkZFUklORyx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJBdWRpb0Jsb2NrRXZlbnQoZSl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQVVESU9fQkxPQ0tFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJQbGF5YmFja0Jsb2NrZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9QTEFZQkFDS19CTE9DS0VELHRpbWVzdGFtcDplfSl9c2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX05FVFdPUktfVU5BVkFJTEFCTEUsdGltZXN0YW1wOmV9KX1zZW5kSVZTUGxheWVySW5pdGlhbGl6ZWRFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9JTklUSUFMSVpFRCx0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50KGUpe3RoaXMuZXZlbnRIYW5kbGVyLmNhbGxFdmVudCh7ZXZlbnQ6Uy5JVlNfUExBWUVSX1dPUktFUl9FUlJPUix0aW1lc3RhbXA6ZX0pfXNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfRVJST1IsdGltZXN0YW1wOnMsbWV0YURhdGE6ZX0pfXNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQoZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuSVZTX1BMQVlFUl9SRUNPVkVSQUJMRV9FUlJPUix0aW1lc3RhbXA6cyxtZXRhRGF0YTplfSl9c2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfQU5BTFlUSUNTX0VWRU5ULHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUExBWUJBQ0tfUkFURV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOnt1cGRhdGVkUGxheWJhY2tSYXRlOmV9fSl9c2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkKGUscyl7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLklWU19QTEFZRVJfUVVBTElUWV9DSEFOR0VELHRpbWVzdGFtcDpzLG1ldGFEYXRhOmV9KX1zZW5kUGxheWVyTGl2ZUxhdGVuY3koZSxzKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuTElWRVNUUkVBTV9MQVRFTkNZLHRpbWVzdGFtcDpzLG1ldGFEYXRhOntsYXRlbmN5OmV9fSl9c2VuZERpc2Nvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRElTQ09OTkVDVCx0aW1lc3RhbXA6ZX0pfXNlbmRSZWNvbm5lY3RFdmVudChlKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuUkVDT05ORUNUX0FUVEVNUFQsdGltZXN0YW1wOmV9KX1leHBlY3RlZFZpZGVvUmVzb2x1dGlvbihlLHMsbil7dGhpcy5ldmVudEhhbmRsZXIuY2FsbEV2ZW50KHtldmVudDpTLkVYUEVDVEVEX1ZJREVPX1JFU09MVVRJT04sdGltZXN0YW1wOm4sbWV0YURhdGE6e2ZyYW1lV2lkdGg6ZSxmcmFtZUhlaWdodDpzfX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyxuKXt0aGlzLmV2ZW50SGFuZGxlci5jYWxsRXZlbnQoe2V2ZW50OlMuRVhQRUNURURfU0NSRUVOU0hBUkVfUkVTT0xVVElPTix0aW1lc3RhbXA6bixtZXRhRGF0YTp7ZnJhbWVXaWR0aDplLGZyYW1lSGVpZ2h0OnN9fSl9fTtQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVySWNlU2VydmVycyIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJyZWdpc3RlckNvbnN1bWVyIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZENvbnN1bWVyU2hhcmVkTWVkaWFTdGF0ZUV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInJlZ2lzdGVyQ29uc3VtaW5nVHJhbnNwb3J0IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImRlUmVnaXN0ZXJDb25zdW1lciIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZVJlZ2lzdGVyUHJvZHVjZXIiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZGlzY29ubmVjdENvbnN1bWluZ1RyYW5zcG9ydCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkaXNjb25uZWN0UHJvZHVjaW5nVHJhbnNwb3J0IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQcmVDYWxsVGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZEFjdGl2ZVNwZWFrZXJFdmVudCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJkZXZpY2VzIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbGVjdGVkRGV2aWNlIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhUGVybWlzc2lvbiIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJtZWRpYVBsYXliYWNrRmFpbGVkIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsIm1lZGlhVHJhY2tNdXRlZCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJ0YWJDaGFuZ2VkIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsImJyb3dzZXJCYWNrZ3JvdW5kZWQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiYnJvd3NlckZvcmVncm91bmRlZCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJsZWdhY3lTd2l0Y2giLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwiZ2V0UHJlQ2FsbFRlc3RSZXN1bHRzIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRDYWxsSm9pbkJlZ2luRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZE5ldHdvcmtRdWFsaXR5VGVzdEJlZ2luRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZFdlYlNvY2tldENvbm5lY3RlZEV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRUcmFuc3BvcnRDb25uZWN0ZWRFdmVudCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kQXVkaW9Ub2dnbGVFdmVudCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kVmlkZW9Ub2dnbGVFdmVudCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGFydGljaXBhbnRSb2xlVG9nZ2xlRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RhcnRQaW5nU3RhdHMiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic3RvcFBpbmdTdGF0cyIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kUGluZ1N0YXRzRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJJbml0aWFsaXplZEV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJXb3JrZXJFcnJvckV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllckFuYWx5dGljc0V2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRJVlNQbGF5ZXJQbGF5YmFja1JhdGVDaGFuZ2VkRXZlbnQiLG51bGwpLFAoW3coVHlwZUVycm9yLChyLHQpPT5DLmVycm9yKHQscikpXSxFLnByb3RvdHlwZSwic2VuZElWU1BsYXllclF1YWxpdHlDaGFuZ2VkIixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRQbGF5ZXJMaXZlTGF0ZW5jeSIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJzZW5kRGlzY29ubmVjdEV2ZW50IixudWxsKSxQKFt3KFR5cGVFcnJvciwocix0KT0+Qy5lcnJvcih0LHIpKV0sRS5wcm90b3R5cGUsInNlbmRSZWNvbm5lY3RFdmVudCIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFZpZGVvUmVzb2x1dGlvbiIsbnVsbCksUChbdyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUucHJvdG90eXBlLCJleHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbiIsbnVsbCksRT1QKFtrcyhUeXBlRXJyb3IsKHIsdCk9PkMuZXJyb3IodCxyKSldLEUpO3ZhciBNcz1FO2NsYXNzIHByIGV4dGVuZHMgentjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7cCh0aGlzLCJzdGF0cyIpO3AodGhpcywicGVlcklkIik7cCh0aGlzLCJiYWNrZW5kIik7cCh0aGlzLCJpY2VTZXJ2ZXJzIik7cCh0aGlzLCJpbml0aWFsaXplZCIsITEpO3AodGhpcywic3RhbGxlZCIsITEpO3AodGhpcywiaXBJbmZvcm1hdGlvbiIpO3AodGhpcywibG9nZ2VyIil9aW5pdGlhbGl6ZShUKXtyZXR1cm4gSSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbiooe3BlZXJJZDplLGVuZ2luZU5hbWU6cyxlbnY6bj1XdC5QUk9ELGljZVNlcnZlcnM6aSxhcGlCYXNlOmE9Imh0dHBzOi8vYXBpLmNsdXN0ZXIuZHl0ZS5pbiIsZmxhZ3M6bCxsb2dnZXI6bz1jb25zb2xlLGFwaUhvc3RuYW1lczptLHNraXBDb25uZWN0aXZpdHlDaGVja3M6Zz0hMSxhdXRoVG9rZW46eX0pe3ZhciBCLFUsWTt0cnl7aWYodGhpcy5wZWVySWQ9ZSx0aGlzLmxvZ2dlcj1vLCF5KXt0aGlzLmxvZ2dlci5lcnJvcigiY2FsbFN0YXRzOjppbml0aWFsaXplIix7ZXZlbnQ6ImF1dGhfdG9rZW5fbWlzc2luZyIscGVlcklkOnRoaXMucGVlcklkfSksdGhpcy5zdGFsbENhbGxTdGF0cygpO3JldHVybn10aGlzLmlwSW5mb3JtYXRpb249eWllbGQgaXIuZ2V0SVBEZXRhaWxzKHtwZWVySWQ6ZSxhcGlIb3N0bmFtZXM6bSxsb2dnZXI6b30pLHRoaXMuYmFja2VuZD1uZXcgTXMoYSxzLG4sbCxvLGUsbSx5KSx0aGlzLmljZVNlcnZlcnM9aSwoQj10aGlzLmJhY2tlbmQpPT1udWxsfHxCLnJlZ2lzdGVySWNlU2VydmVycyh0aGlzLmljZVNlcnZlcnMpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsKFk9KFU9dGhpcy5iYWNrZW5kKT09bnVsbD92b2lkIDA6VS5ldmVudEhhbmRsZXIpPT1udWxsfHxZLmVtaXQoImluaXRpYWxpemVkIix0aGlzLmlwSW5mb3JtYXRpb24pLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMuaXBJbmZvcm1hdGlvbiksdGhpcy5zdGFydFByZUNhbGxUZXN0KGcpfWNhdGNoKCQpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OkNhbGxTdGF0c0ludGVncmF0aW9uIix7cGVlcklkOnRoaXMucGVlcklkLGVycm9yOiQgaW5zdGFuY2VvZiBFcnJvcj8kLm1lc3NhZ2U6U3RyaW5nKCQpLHN0YWNrOiQgaW5zdGFuY2VvZiBFcnJvcj8kLnN0YWNrOnZvaWQgMH0pLHRoaXMuc3RhbGxDYWxsU3RhdHMoKX19KX1jb25maWd1cmVTZW5kVHJhbnNwb3J0KGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnJlZ2lzdGVyUHJvZHVjaW5nVHJhbnNwb3J0KGUpfSl9Y29uZmlndXJlUmVjdlRyYW5zcG9ydChlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5yZWdpc3RlckNvbnN1bWluZ1RyYW5zcG9ydChlKX0pfWNhbmRpZGF0ZVJlZ2lvbmFsTmV0d29ya1F1YWxpdHlUZXN0KGUpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjt0cnl7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kTmV0d29ya1F1YWxpdHlUZXN0QmVnaW5FdmVudChlLHMpfWNhdGNoKGkpe3RoaXMubG9nZ2VyLmVycm9yKCJjYWxsU3RhdHM6OnNlbmROZXR3b3JrUXVhbGl0eVRlc3RCZWdpbkV2ZW50Iix7ZXJyb3I6e3JlYXNvbjppLnJlYXNvbn19KX19KX0pfXJvb21Kb2luZWQoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuLGk7KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ2FsbEpvaW5CZWdpbkV2ZW50KGUscyksdGhpcy5iYWNrZW5kLChpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc3RhcnRQaW5nU3RhdHMoKX0pfSl9YXVkaW9PZmYoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLnNlbmRBdWRpb1RvZ2dsZUV2ZW50KCExLGUpfSl9YXVkaW9Pbigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZEF1ZGlvVG9nZ2xlRXZlbnQoITAsZSl9KX12aWRlb09mZigpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFZpZGVvVG9nZ2xlRXZlbnQoITEsZSl9KX12aWRlb09uKCl7Y29uc3QgZT1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zZW5kVmlkZW9Ub2dnbGVFdmVudCghMCxlKX0pfWNhbGxFbmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzLG47KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5zdG9wUGluZ1N0YXRzKCksKG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kRGlzY29ubmVjdEV2ZW50KGUpfSl9c2NyZWVuU2hhcmVTdGFydChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCEwLGUscyl9KX1jb25zdW1lclNoYXJlZE1lZGlhU3RhdGUoZSxzKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQ29uc3VtZXJTaGFyZWRNZWRpYVN0YXRlRXZlbnQoZSxzKX0pfXNjcmVlblNoYXJlU3RvcChlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRTY3JlZW5TaGFyZVRvZ2dsZUV2ZW50KCExLGUscyl9KX1zY3JlZW5TaGFyZVJlcXVlc3RlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuc2VuZFNjcmVlblNoYXJlUmVxdWVzdGVkRXZlbnQoZSl9KX1hY3RpdmVTcGVha2VyKGUpe2lmKGUhPT10aGlzLnBlZXJJZClyZXR1cm47Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5zZW5kQWN0aXZlU3BlYWtlckV2ZW50KGUscyl9KX1kZXZpY2VzKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5kZXZpY2VzKGUscyxuKX0pfXNlbGVjdGVkRGV2aWNlKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5zZWxlY3RlZERldmljZShlLHMsbil9KX1tZWRpYVBlcm1pc3Npb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLm1lZGlhUGVybWlzc2lvbihlLHMsbil9KX1tZWRpYVBsYXliYWNrRmFpbGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFQbGF5YmFja0ZhaWxlZChlLHMpfSl9bWVkaWFUcmFja011dGVkKGUpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4ubWVkaWFUcmFja011dGVkKGUscyl9KX10YWJDaGFuZ2VkKGU9ITEpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4udGFiQ2hhbmdlZChlLHMpfSl9YnJvd3NlckJhY2tncm91bmRlZCgpe2NvbnN0IGU9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuYnJvd3NlckJhY2tncm91bmRlZChlKX0pfWJyb3dzZXJGb3JlZ3JvdW5kZWQoKXtjb25zdCBlPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmJyb3dzZXJGb3JlZ3JvdW5kZWQoZSl9KX1sZWdhY3lTd2l0Y2goZSl7Y29uc3Qgcz1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIG47KG49dGhpcy5iYWNrZW5kKT09bnVsbHx8bi5sZWdhY3lTd2l0Y2goZSxzKX0pfXN0YXJ0UHJlQ2FsbFRlc3QoZT0hMSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHM9bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBuOyhuPXRoaXMuYmFja2VuZCk9PW51bGx8fG4uc2VuZFByZUNhbGxUZXN0QmVnaW5FdmVudChlLHMpfSl9KX1vblByZUNhbGxUZXN0UmVzdWx0cyhlKXtyZXR1cm4gdGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uY2UoInByZWNhbGxfZW5kIixlKX0pLGV9b25SZWNlaXZpbmdDb25zdW1lckF1ZGlvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigiY29uc3VtZXJfYXVkaW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nQ29uc3VtZXJWaWRlb1N0YXR1cyhlKXt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIHM7KHM9dGhpcy5iYWNrZW5kKT09bnVsbHx8cy5ldmVudEhhbmRsZXIub24oImNvbnN1bWVyX3ZpZGVvX3N0YXR1cyIsZSl9KX1vblJlY2VpdmluZ1Byb2R1Y2VyQXVkaW9TdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9hdWRpb19zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdQcm9kdWNlclZpZGVvU3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjZXJfdmlkZW9fc3RhdHVzIixlKX0pfW9uUmVjZWl2aW5nUHJvZHVjaW5nVHJhbnNwb3J0U3RhdHVzKGUpe3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgczsocz10aGlzLmJhY2tlbmQpPT1udWxsfHxzLmV2ZW50SGFuZGxlci5vbigicHJvZHVjaW5nX3RyYW5zcG9ydF9zdGF0dXMiLGUpfSl9b25SZWNlaXZpbmdDb25zdW1pbmdUcmFuc3BvcnRTdGF0dXMoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1pbmdfdHJhbnNwb3J0X3N0YXR1cyIsZSl9KX1vblByb2R1Y2VyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJwcm9kdWNlcl9zY29yZSIsZSl9KX1vbkNvbnN1bWVyU2NvcmUoZSl7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBzOyhzPXRoaXMuYmFja2VuZCk9PW51bGx8fHMuZXZlbnRIYW5kbGVyLm9uKCJjb25zdW1lcl9zY29yZSIsZSl9KX1vblNhZmVJbml0aWFsaXphdGlvbihlKXtpZih0aGlzLmluaXRpYWxpemVkKWUodGhpcy5pcEluZm9ybWF0aW9uLCExKTtlbHNlIGlmKCF0aGlzLnN0YWxsZWQpe2NvbnN0IHM9bj0+e2UobiwhMCl9O3JldHVybiB0aGlzLm9uY2UoImluaXRpYWxpemVkIixzKSxzfXJldHVybigpPT57fX1yZW1vdmVJbml0aWFsaXphdGlvbkxpc3RlbmVyKGUpe3RoaXMucmVtb3ZlTGlzdGVuZXIoImluaXRpYWxpemVkIixlKX1zdGFsbENhbGxTdGF0cygpe3RoaXMuc3RhbGxlZD0hMCx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiaW5pdGlhbGl6ZWQiKX1pdnNQbGF5ZXJFdmVudChlLHMpe2NvbnN0IG49bmV3IERhdGU7dGhpcy5vblNhZmVJbml0aWFsaXphdGlvbigoKT0+e3ZhciBpLGEsbCxvLG0sZyx5LFQsQixVLFk7c3dpdGNoKGUpe2Nhc2UiUGxheWVyUmVidWZmZXJpbmciOihpPXRoaXMuYmFja2VuZCk9PW51bGx8fGkuc2VuZElWU1BsYXllclJlYnVmZmVyRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJBdWRpb0Jsb2NrZWQiOihhPXRoaXMuYmFja2VuZCk9PW51bGx8fGEuc2VuZElWU1BsYXllckF1ZGlvQmxvY2tFdmVudChuKTticmVhaztjYXNlIlBsYXllclBsYXliYWNrQmxvY2tlZCI6KGw9dGhpcy5iYWNrZW5kKT09bnVsbHx8bC5zZW5kSVZTUGxheWVyUGxheWJhY2tCbG9ja2VkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJOZXR3b3JrVW5hdmFpbGFibGUiOihvPXRoaXMuYmFja2VuZCk9PW51bGx8fG8uc2VuZElWU1BsYXllck5ldHdvcmtVbmF2YWlsYWJsZUV2ZW50KG4pO2JyZWFrO2Nhc2UiUGxheWVySW5pdGlhbGl6ZWQiOihtPXRoaXMuYmFja2VuZCk9PW51bGx8fG0uc2VuZElWU1BsYXllckluaXRpYWxpemVkRXZlbnQobik7YnJlYWs7Y2FzZSJQbGF5ZXJXb3JrZXJFcnJvciI6KGc9dGhpcy5iYWNrZW5kKT09bnVsbHx8Zy5zZW5kSVZTUGxheWVyV29ya2VyRXJyb3JFdmVudChuKTticmVhaztjYXNlIlBsYXllckVycm9yIjooeT10aGlzLmJhY2tlbmQpPT1udWxsfHx5LnNlbmRJVlNQbGF5ZXJFcnJvckV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJSZWNvdmVyYWJsZUVycm9yIjooVD10aGlzLmJhY2tlbmQpPT1udWxsfHxULnNlbmRJVlNQbGF5ZXJSZWNvdmVyYWJsZUVycm9yRXZlbnQocyxuKTticmVhaztjYXNlIlBsYXllckFuYWx5dGljc0V2ZW50IjooQj10aGlzLmJhY2tlbmQpPT1udWxsfHxCLnNlbmRJVlNQbGF5ZXJBbmFseXRpY3NFdmVudChzLG4pO2JyZWFrO2Nhc2UiUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZCI6KFU9dGhpcy5iYWNrZW5kKT09bnVsbHx8VS5zZW5kSVZTUGxheWVyUGxheWJhY2tSYXRlQ2hhbmdlZEV2ZW50KHMsbik7YnJlYWs7Y2FzZSJQbGF5ZXJRdWFsaXR5Q2hhbmdlZCI6KFk9dGhpcy5iYWNrZW5kKT09bnVsbHx8WS5zZW5kSVZTUGxheWVyUXVhbGl0eUNoYW5nZWQocyxuKTticmVha319KX1saXZlc3RyZWFtTGF0ZW5jeShlKXtjb25zdCBzPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgbjsobj10aGlzLmJhY2tlbmQpPT1udWxsfHxuLnNlbmRQbGF5ZXJMaXZlTGF0ZW5jeShlLHMpfSl9ZXhwZWN0ZWRWaWRlb1Jlc29sdXRpb24oZSxzKXtjb25zdCBuPW5ldyBEYXRlO3RoaXMub25TYWZlSW5pdGlhbGl6YXRpb24oKCk9Pnt2YXIgaTsoaT10aGlzLmJhY2tlbmQpPT1udWxsfHxpLmV4cGVjdGVkVmlkZW9SZXNvbHV0aW9uKGUscyxuKX0pfWV4cGVjdGVkU2NyZWVuc2hhcmVSZXNvbHV0aW9uKGUscyl7Y29uc3Qgbj1uZXcgRGF0ZTt0aGlzLm9uU2FmZUluaXRpYWxpemF0aW9uKCgpPT57dmFyIGk7KGk9dGhpcy5iYWNrZW5kKT09bnVsbHx8aS5leHBlY3RlZFNjcmVlbnNoYXJlUmVzb2x1dGlvbihlLHMsbil9KX19bmV3IHByKCkuc2V0TWF4TGlzdGVuZXJzKDMwKTtjbGFzcyBJc3tjb25zdHJ1Y3Rvcigpe2x0KHRoaXMsUGUsdm9pZCAwKX1nZXQgdGVsZW1ldHJ5KCl7dmFyIHQ7cmV0dXJuKHQ9USh0aGlzLFBlKSk9PW51bGw/dm9pZCAwOnQuZ2V0VmFsdWUoInRlbGVtZXRyeSIpfWluaXQodCl7ZmUodGhpcyxQZSx0KX1pbmZvKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiaW5mbyIsdCxlLHMpfWVycm9yKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLHQsZSxzKX1kZWJ1Zyh0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oImRlYnVnIix0LGUscyl9bG9nKHQsZSxzKXt2YXIgbjsobj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fG4uYWRkTG9nSW5DdXJyZW50U3BhbigibG9nIix0LGUscyl9d2Fybih0LGUscyl7dmFyIG47KG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLmFkZExvZ0luQ3VycmVudFNwYW4oIndhcm4iLHQsZSxzKX19UGU9bmV3IFdlYWtNYXA7Y29uc3QgTHQ9Y2xhc3MgZXh0ZW5kcyB6LkV2ZW50RW1pdHRlcntjb25zdHJ1Y3RvcihlKXtzdXBlcigpO2x0KHRoaXMsWix2b2lkIDApO2x0KHRoaXMsZWUsdm9pZCAwKTtwKHRoaXMsImFzeW5jUHJvbWlzZVRpbWVvdXQiKTtwKHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksdGhpcy5hc3luY1Byb21pc2VUaW1lb3V0PThlM31lbWl0QXN5bmMoZSwuLi5zKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7USh0aGlzLFopLnNldChlLFtdKTtjb25zdCBuPVEodGhpcyxlZSkuZ2V0KGUpLm1hcCgoKT0+bmV3IFByb21pc2UoaT0+e1EodGhpcyxaKS5nZXQoZSkucHVzaChpKX0pKTtycyhMdC5wcm90b3R5cGUsdGhpcywiZW1pdCIpLmNhbGwodGhpcyxlLC4uLnMpLHlpZWxkIFByb21pc2UucmFjZShbUHJvbWlzZS5hbGwobiksbmV3IFByb21pc2UoKGksYSk9PnNldFRpbWVvdXQoKCk9PmEobmV3IEVycm9yKGBlbWl0QXN5bmMgZmFpbGVkIHRvIHJlc29sdmUgZm9yIGV2ZW50ICR7ZX0uYCkpLHRoaXMuYXN5bmNQcm9taXNlVGltZW91dCkpXSksUSh0aGlzLFopLmRlbGV0ZShlKX0pfW9uQXN5bmMoZSxzKXtjb25zdCBuPVEodGhpcyxaKSxpPSguLi5hKT0+SSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIG87dHJ5e3lpZWxkIHMoLi4uYSl9Y2F0Y2gobSl7dGhpcy5sb2dnZXIuZXJyb3IoIltvbkFzeW5jXSIse2Vycm9yOm19KX1jb25zdCBsPShvPW4uZ2V0KGUpKT09bnVsbD92b2lkIDA6by5zaGlmdCgpO2w9PW51bGx8fGwoKX0pO3JldHVybiBRKHRoaXMsZWUpLmdldChlKXx8USh0aGlzLGVlKS5zZXQoZSxbXSksUSh0aGlzLGVlKS5nZXQoZSkucHVzaChpKSxzdXBlci5vbihlLGkpfXJlc2V0KCl7ZmUodGhpcyxaLG5ldyBNYXApLGZlKHRoaXMsZWUsbmV3IE1hcCksc3VwZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCl9fTtsZXQgbXQ9THQ7Wj1uZXcgV2Vha01hcCxlZT1uZXcgV2Vha01hcDt2YXIgaXQsX3M9bmV3IFVpbnQ4QXJyYXkoMTYpO2Z1bmN0aW9uIEFzKCl7aWYoIWl0JiYoaXQ9dHlwZW9mIGNyeXB0byE9InVuZGVmaW5lZCImJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMmJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChjcnlwdG8pfHx0eXBlb2YgbXNDcnlwdG8hPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzPT0iZnVuY3Rpb24iJiZtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksIWl0KSl0aHJvdyBuZXcgRXJyb3IoImNyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkIik7cmV0dXJuIGl0KF9zKX12YXIgTHM9L14oPzpbMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO2Z1bmN0aW9uIE9zKHIpe3JldHVybiB0eXBlb2Ygcj09InN0cmluZyImJkxzLnRlc3Qocil9Zm9yKHZhciBqPVtdLGZ0PTA7ZnQ8MjU2OysrZnQpai5wdXNoKChmdCsyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO2Z1bmN0aW9uIERzKHIpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTowLGU9KGpbclt0KzBdXStqW3JbdCsxXV0raltyW3QrMl1dK2pbclt0KzNdXSsiLSIraltyW3QrNF1dK2pbclt0KzVdXSsiLSIraltyW3QrNl1dK2pbclt0KzddXSsiLSIraltyW3QrOF1dK2pbclt0KzldXSsiLSIraltyW3QrMTBdXStqW3JbdCsxMV1dK2pbclt0KzEyXV0raltyW3QrMTNdXStqW3JbdCsxNF1dK2pbclt0KzE1XV0pLnRvTG93ZXJDYXNlKCk7aWYoIU9zKGUpKXRocm93IFR5cGVFcnJvcigiU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkIik7cmV0dXJuIGV9ZnVuY3Rpb24gTnMocix0LGUpe3I9cnx8e307dmFyIHM9ci5yYW5kb218fChyLnJuZ3x8QXMpKCk7aWYoc1s2XT1zWzZdJjE1fDY0LHNbOF09c1s4XSY2M3wxMjgsdCl7ZT1lfHwwO2Zvcih2YXIgbj0wO248MTY7KytuKXRbZStuXT1zW25dO3JldHVybiB0fXJldHVybiBEcyhzKX12YXIgVnM9dHlwZW9mIGdsb2JhbD09Im9iamVjdCImJmdsb2JhbCYmZ2xvYmFsLk9iamVjdD09PU9iamVjdCYmZ2xvYmFsLGhyPVZzLEJzPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsRnM9aHJ8fEJzfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHJlPUZzLHhzPXJlLlN5bWJvbCxhdD14cyxtcj1PYmplY3QucHJvdG90eXBlLGpzPW1yLmhhc093blByb3BlcnR5LFVzPW1yLnRvU3RyaW5nLFNlPWF0P2F0LnRvU3RyaW5nVGFnOnZvaWQgMDtmdW5jdGlvbiBIcyhyKXt2YXIgdD1qcy5jYWxsKHIsU2UpLGU9cltTZV07dHJ5e3JbU2VdPXZvaWQgMDt2YXIgcz0hMH1jYXRjaChpKXt9dmFyIG49VXMuY2FsbChyKTtyZXR1cm4gcyYmKHQ/cltTZV09ZTpkZWxldGUgcltTZV0pLG59dmFyIEtzPU9iamVjdC5wcm90b3R5cGUsenM9S3MudG9TdHJpbmc7ZnVuY3Rpb24gV3Mocil7cmV0dXJuIHpzLmNhbGwocil9dmFyICRzPSJbb2JqZWN0IE51bGxdIixHcz0iW29iamVjdCBVbmRlZmluZWRdIixmcj1hdD9hdC50b1N0cmluZ1RhZzp2b2lkIDA7ZnVuY3Rpb24gYmUocil7cmV0dXJuIHI9PW51bGw/cj09PXZvaWQgMD9HczokczpmciYmZnIgaW4gT2JqZWN0KHIpP0hzKHIpOldzKHIpfWZ1bmN0aW9uIGd0KHIpe3JldHVybiByIT1udWxsJiZ0eXBlb2Ygcj09Im9iamVjdCJ9dmFyIFlzPUFycmF5LmlzQXJyYXkscXM9WXM7ZnVuY3Rpb24gZ3Iocil7dmFyIHQ9dHlwZW9mIHI7cmV0dXJuIHIhPW51bGwmJih0PT0ib2JqZWN0Inx8dD09ImZ1bmN0aW9uIil9dmFyIFFzPSJbb2JqZWN0IEFzeW5jRnVuY3Rpb25dIixKcz0iW29iamVjdCBGdW5jdGlvbl0iLFhzPSJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSIsWnM9IltvYmplY3QgUHJveHldIjtmdW5jdGlvbiBTcihyKXtpZighZ3IocikpcmV0dXJuITE7dmFyIHQ9YmUocik7cmV0dXJuIHQ9PUpzfHx0PT1Yc3x8dD09UXN8fHQ9PVpzfXZhciBlbj1yZVsiX19jb3JlLWpzX3NoYXJlZF9fIl0sU3Q9ZW4sYnI9ZnVuY3Rpb24oKXt2YXIgcj0vW14uXSskLy5leGVjKFN0JiZTdC5rZXlzJiZTdC5rZXlzLklFX1BST1RPfHwiIik7cmV0dXJuIHI/IlN5bWJvbChzcmMpXzEuIityOiIifSgpO2Z1bmN0aW9uIHRuKHIpe3JldHVybiEhYnImJmJyIGluIHJ9dmFyIHJuPUZ1bmN0aW9uLnByb3RvdHlwZSxzbj1ybi50b1N0cmluZztmdW5jdGlvbiBjZShyKXtpZihyIT1udWxsKXt0cnl7cmV0dXJuIHNuLmNhbGwocil9Y2F0Y2godCl7fXRyeXtyZXR1cm4gcisiIn1jYXRjaCh0KXt9fXJldHVybiIifXZhciBubj0vW1xcXiQuKis/KClbXF17fXxdL2csYW49L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sb249RnVuY3Rpb24ucHJvdG90eXBlLGNuPU9iamVjdC5wcm90b3R5cGUsZG49b24udG9TdHJpbmcsbG49Y24uaGFzT3duUHJvcGVydHksdW49UmVnRXhwKCJeIitkbi5jYWxsKGxuKS5yZXBsYWNlKG5uLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO2Z1bmN0aW9uIHBuKHIpe2lmKCFncihyKXx8dG4ocikpcmV0dXJuITE7dmFyIHQ9U3Iocik/dW46YW47cmV0dXJuIHQudGVzdChjZShyKSl9ZnVuY3Rpb24gaG4ocix0KXtyZXR1cm4gcj09bnVsbD92b2lkIDA6clt0XX1mdW5jdGlvbiB2ZShyLHQpe3ZhciBlPWhuKHIsdCk7cmV0dXJuIHBuKGUpP2U6dm9pZCAwfXZhciBtbj12ZShyZSwiV2Vha01hcCIpLGJ0PW1uLGZuPTkwMDcxOTkyNTQ3NDA5OTE7ZnVuY3Rpb24gdnIocil7cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIiYmcj4tMSYmciUxPT0wJiZyPD1mbn1mdW5jdGlvbiBnbihyKXtyZXR1cm4gciE9bnVsbCYmdnIoci5sZW5ndGgpJiYhU3Iocil9dmFyIFNuPU9iamVjdC5wcm90b3R5cGU7ZnVuY3Rpb24geXIocil7dmFyIHQ9ciYmci5jb25zdHJ1Y3RvcixlPXR5cGVvZiB0PT0iZnVuY3Rpb24iJiZ0LnByb3RvdHlwZXx8U247cmV0dXJuIHI9PT1lfXZhciBibj0iW29iamVjdCBBcmd1bWVudHNdIjtmdW5jdGlvbiBFcihyKXtyZXR1cm4gZ3QocikmJmJlKHIpPT1ibn12YXIgVHI9T2JqZWN0LnByb3RvdHlwZSx2bj1Uci5oYXNPd25Qcm9wZXJ0eSx5bj1Uci5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFbj1FcihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP0VyOmZ1bmN0aW9uKHIpe3JldHVybiBndChyKSYmdm4uY2FsbChyLCJjYWxsZWUiKSYmIXluLmNhbGwociwiY2FsbGVlIil9LFRuPUVuO2Z1bmN0aW9uIFJuKCl7cmV0dXJuITF9dmFyIFJyPXR5cGVvZiBleHBvcnRzPT0ib2JqZWN0IiYmZXhwb3J0cyYmIWV4cG9ydHMubm9kZVR5cGUmJmV4cG9ydHMsUHI9UnImJnR5cGVvZiBtb2R1bGU9PSJvYmplY3QiJiZtb2R1bGUmJiFtb2R1bGUubm9kZVR5cGUmJm1vZHVsZSxQbj1QciYmUHIuZXhwb3J0cz09PVJyLENyPVBuP3JlLkJ1ZmZlcjp2b2lkIDAsQ249Q3I/Q3IuaXNCdWZmZXI6dm9pZCAwLHduPUNufHxSbixrbj13bixNbj0iW29iamVjdCBBcmd1bWVudHNdIixJbj0iW29iamVjdCBBcnJheV0iLF9uPSJbb2JqZWN0IEJvb2xlYW5dIixBbj0iW29iamVjdCBEYXRlXSIsTG49IltvYmplY3QgRXJyb3JdIixPbj0iW29iamVjdCBGdW5jdGlvbl0iLERuPSJbb2JqZWN0IE1hcF0iLE5uPSJbb2JqZWN0IE51bWJlcl0iLFZuPSJbb2JqZWN0IE9iamVjdF0iLEJuPSJbb2JqZWN0IFJlZ0V4cF0iLEZuPSJbb2JqZWN0IFNldF0iLHhuPSJbb2JqZWN0IFN0cmluZ10iLGpuPSJbb2JqZWN0IFdlYWtNYXBdIixVbj0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLEhuPSJbb2JqZWN0IERhdGFWaWV3XSIsS249IltvYmplY3QgRmxvYXQzMkFycmF5XSIsem49IltvYmplY3QgRmxvYXQ2NEFycmF5XSIsV249IltvYmplY3QgSW50OEFycmF5XSIsJG49IltvYmplY3QgSW50MTZBcnJheV0iLEduPSJbb2JqZWN0IEludDMyQXJyYXldIixZbj0iW29iamVjdCBVaW50OEFycmF5XSIscW49IltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIixRbj0iW29iamVjdCBVaW50MTZBcnJheV0iLEpuPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsVj17fTtWW0tuXT1WW3puXT1WW1duXT1WWyRuXT1WW0duXT1WW1luXT1WW3FuXT1WW1FuXT1WW0puXT0hMCxWW01uXT1WW0luXT1WW1VuXT1WW19uXT1WW0huXT1WW0FuXT1WW0xuXT1WW09uXT1WW0RuXT1WW05uXT1WW1ZuXT1WW0JuXT1WW0ZuXT1WW3huXT1WW2puXT0hMTtmdW5jdGlvbiBYbihyKXtyZXR1cm4gZ3QocikmJnZyKHIubGVuZ3RoKSYmISFWW2JlKHIpXX1mdW5jdGlvbiBabihyKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCl9fXZhciB3cj10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzLHllPXdyJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGUsZWk9eWUmJnllLmV4cG9ydHM9PT13cix2dD1laSYmaHIucHJvY2Vzcyx0aT1mdW5jdGlvbigpe3RyeXt2YXIgcj15ZSYmeWUucmVxdWlyZSYmeWUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiByfHx2dCYmdnQuYmluZGluZyYmdnQuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KCksa3I9dGksTXI9a3ImJmtyLmlzVHlwZWRBcnJheSxyaT1Ncj9abihNcik6WG4sc2k9cmk7ZnVuY3Rpb24gbmkocix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIodChlKSl9fXZhciBpaT1uaShPYmplY3Qua2V5cyxPYmplY3QpLGFpPWlpLG9pPU9iamVjdC5wcm90b3R5cGUsY2k9b2kuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gZGkocil7aWYoIXlyKHIpKXJldHVybiBhaShyKTt2YXIgdD1bXTtmb3IodmFyIGUgaW4gT2JqZWN0KHIpKWNpLmNhbGwocixlKSYmZSE9ImNvbnN0cnVjdG9yIiYmdC5wdXNoKGUpO3JldHVybiB0fXZhciBsaT12ZShyZSwiTWFwIikseXQ9bGksdWk9dmUocmUsIkRhdGFWaWV3IiksRXQ9dWkscGk9dmUocmUsIlByb21pc2UiKSxUdD1waSxoaT12ZShyZSwiU2V0IiksUnQ9aGksSXI9IltvYmplY3QgTWFwXSIsbWk9IltvYmplY3QgT2JqZWN0XSIsX3I9IltvYmplY3QgUHJvbWlzZV0iLEFyPSJbb2JqZWN0IFNldF0iLExyPSJbb2JqZWN0IFdlYWtNYXBdIixPcj0iW29iamVjdCBEYXRhVmlld10iLGZpPWNlKEV0KSxnaT1jZSh5dCksU2k9Y2UoVHQpLGJpPWNlKFJ0KSx2aT1jZShidCksZGU9YmU7KEV0JiZkZShuZXcgRXQobmV3IEFycmF5QnVmZmVyKDEpKSkhPU9yfHx5dCYmZGUobmV3IHl0KSE9SXJ8fFR0JiZkZShUdC5yZXNvbHZlKCkpIT1fcnx8UnQmJmRlKG5ldyBSdCkhPUFyfHxidCYmZGUobmV3IGJ0KSE9THIpJiYoZGU9ZnVuY3Rpb24ocil7dmFyIHQ9YmUociksZT10PT1taT9yLmNvbnN0cnVjdG9yOnZvaWQgMCxzPWU/Y2UoZSk6IiI7aWYocylzd2l0Y2gocyl7Y2FzZSBmaTpyZXR1cm4gT3I7Y2FzZSBnaTpyZXR1cm4gSXI7Y2FzZSBTaTpyZXR1cm4gX3I7Y2FzZSBiaTpyZXR1cm4gQXI7Y2FzZSB2aTpyZXR1cm4gTHJ9cmV0dXJuIHR9KTt2YXIgeWk9ZGUsRWk9IltvYmplY3QgTWFwXSIsVGk9IltvYmplY3QgU2V0XSIsUmk9T2JqZWN0LnByb3RvdHlwZSxQaT1SaS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBDaShyKXtpZihyPT1udWxsKXJldHVybiEwO2lmKGduKHIpJiYocXMocil8fHR5cGVvZiByPT0ic3RyaW5nInx8dHlwZW9mIHIuc3BsaWNlPT0iZnVuY3Rpb24ifHxrbihyKXx8c2kocil8fFRuKHIpKSlyZXR1cm4hci5sZW5ndGg7dmFyIHQ9eWkocik7aWYodD09RWl8fHQ9PVRpKXJldHVybiFyLnNpemU7aWYoeXIocikpcmV0dXJuIWRpKHIpLmxlbmd0aDtmb3IodmFyIGUgaW4gcilpZihQaS5jYWxsKHIsZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gb3Qocil7Y29uc3QgdD17fTtyZXR1cm4gdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJudW1iZXIiJiYodC5jb2RlPXIuY29kZSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIuY29kZSk9PSJzdHJpbmciJiYodC5jb2RlPXIuY29kZS5zdWJzdHJpbmcoMCwxMDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5uYW1lKT09InN0cmluZyImJih0Lm5hbWU9ci5uYW1lLnN1YnN0cmluZygwLDUwMCkpLHR5cGVvZihyPT1udWxsP3ZvaWQgMDpyLm1lc3NhZ2UpPT0ic3RyaW5nIiYmKHQubWVzc2FnZT1yLm1lc3NhZ2Uuc3Vic3RyaW5nKDAsNTAwKSksdHlwZW9mKHI9PW51bGw/dm9pZCAwOnIucmVhc29uKT09InN0cmluZyImJih0LnJlYXNvbj1yLnJlYXNvbi5zdWJzdHJpbmcoMCw1MDApKSx0eXBlb2Yocj09bnVsbD92b2lkIDA6ci5zdGFjayk9PSJzdHJpbmciJiYodC5zdGFjaz1yLnN0YWNrLnN1YnN0cmluZygwLDUwMCkpLHR9ZnVuY3Rpb24gd2koe3NlcnZpY2VQcmVmaXg6cixiYXNlVVJJOnR9KXtyZXR1cm5gJHtyfS4ke3R9YH1jb25zdCBraT17bG9nczoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbG9ncy9vdGVsL2xvZ3MiLG1vY2s6e3VybDoiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbW9jayIsZG9tYWluOiJtb2NrLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tIixhcHA6Imh0dHBzOi8vZXhhbXBsZXMucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20vbWVldGluZyIsc3RhZ2luZ0FwcDoiaHR0cHM6Ly9leGFtcGxlcy5zdGFnaW5nLnJlYWx0aW1lLmNsb3VkZmxhcmUuY29tL21lZXRpbmcifSxhcGlCYXNlOntwcm9kOiJodHRwczovL2FwaS5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoiaHR0cHM6Ly9hcGkuc3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIscHJvZEFsdGVybmF0ZToiaHR0cHM6Ly9hcGkucmVhbHRpbWUuY2xvdWRmbGFyZS5jb20ifSxiYXNlVVJJOntwcm9kOiJyZWFsdGltZS5jbG91ZGZsYXJlLmNvbSIsc3RhZ2luZzoic3RhZ2luZy5yZWFsdGltZS5jbG91ZGZsYXJlLmNvbSJ9fTtmdW5jdGlvbiBEcihyKXt2YXIgcyxuLGk7Y29uc3QgdD10eXBlb2YgbmF2aWdhdG9yIT0idW5kZWZpbmVkIiYmIW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKChzPXdpbmRvdy5sb2NhdGlvbi5ob3N0KT09bnVsbD92b2lkIDA6cy5pbmNsdWRlcyhraS5iYXNlVVJJLnN0YWdpbmcpKSxlPSEhKChpPShuPXI9PW51bGw/dm9pZCAwOnIuZ2V0VmFsdWUoIm1vZHVsZXMiKSk9PW51bGw/dm9pZCAwOm4uZGV2VG9vbHMpIT1udWxsJiZpLmxvZ3MpO3JldHVybiB0fHxlfWZ1bmN0aW9uIE1pKHIsdCl7dmFyIHM7Y29uc3QgZT0ocz1yPT1udWxsP3ZvaWQgMDpyLmdldFZhbHVlKCJ0ZWxlbWV0cnkiKSk9PW51bGw/dm9pZCAwOnMubG9nTGV2ZWw7aWYoZT09PSJvZmYiKXJldHVybiExO2lmKGUhPT0iYWxsIil7Y29uc3Qgbj1bImRlYnVnIiwibG9nIiwiaW5mbyIsIndhcm4iLCJlcnJvciJdLGk9bi5pbmRleE9mKHQudG9Mb3dlckNhc2UoKSksYT1uLmluZGV4T2YoZSk7aWYoaTxhKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIE5yKHIsdCxlPXt9KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocikuZm9yRWFjaChzPT57dmFyIGk7aWYoW251bGwsdm9pZCAwLE5hTl0uaW5jbHVkZXMocltzXSl8fHQmJigoKGk9dC5tYXRjaCgvXC4vZykpPT1udWxsP3ZvaWQgMDppLmxlbmd0aCl8fDApPj0xMClyZXR1cm47Y29uc3Qgbj10P2Ake3R9LiR7c31gOnM7dHlwZW9mIHJbc109PSJvYmplY3QiP05yKHJbc10sbixlKTpbIm51bWJlciIsInN0cmluZyIsImJvb2xlYW4iXS5pbmNsdWRlcyh0eXBlb2YgcltzXSkmJihlW25dPXJbc10pfSksZX1mdW5jdGlvbiBWcihyLHQsZT17fSxzPSIiKXtjb25zdCBuPXt9O3RyeXtjb25zdCBpPUpTT04uc3RyaW5naWZ5KGUpLGE9SlNPTi5wYXJzZShpKSxsPU5yKGEscyksbz1KU09OLnN0cmluZ2lmeShsKTtpZighKHQ9PW51bGw/dm9pZCAwOnQuc3RhcnRzV2l0aCgiW1NEUF0iKSkmJm8ubGVuZ3RoPjVlMyl7Y29uc3QgZz1gTG9nIG5hbWVkOiAiJHt0fSIgaXMgdHJ5aW5nIHRvIGxvZyBhbiBmbGF0dGVuZWQgb2JqZWN0IG9mIHNpemUgCgkJCSR7by5sZW5ndGh9IGNoYXJzIHRoYXQgaXMgYmV5b25kIHBlcm1pdHRlZCBsaW1pdCBvZiA1MDAwIGNoYXJzLiBQbGVhc2Ugb3B0aW1pemUuYDt0aHJvdyBEcihyKSYmY29uc29sZS5lcnJvcihnLHtsb2c6ZSxmbGF0dGVuZWQ6b30pLG5ldyBFcnJvcihnKX1yZXR1cm4gSlNPTi5wYXJzZShvKX1jYXRjaChpKXtjb25zdCBhPW90KGkpO25bYCR7c30uZXJyb3IubWVzc2FnZWBdPWEubWVzc2FnZXx8IiIsbltgJHtzfS5lcnJvci5zdGFja2BdPWEuc3RhY2t8fCIiLG5bYCR7c30uZXJyb3IucmVhc29uYF09YS5yZWFzb258fCIiLG5bYCR7c30uZXJyb3Iuc291cmNlYF09InNhZmVseUZsYXR0ZW5PYmpGb3JPcGVuVGVsZW1ldHJ5In1yZXR1cm4gbn1jb25zdCBJaT17QW1hem9uQm90OiJhbWF6b25ib3QiLCJBbWF6b24gU2lsayI6ImFtYXpvbl9zaWxrIiwiQW5kcm9pZCBCcm93c2VyIjoiYW5kcm9pZCIsQmFpZHVTcGlkZXI6ImJhaWR1c3BpZGVyIixCYWRhOiJiYWRhIixCaW5nQ3Jhd2xlcjoiYmluZ2NyYXdsZXIiLEJyYXZlOiJicmF2ZSIsQmxhY2tCZXJyeToiYmxhY2tiZXJyeSIsIkNoYXRHUFQtVXNlciI6ImNoYXRncHRfdXNlciIsQ2hyb21lOiJjaHJvbWUiLENsYXVkZUJvdDoiY2xhdWRlYm90IixDaHJvbWl1bToiY2hyb21pdW0iLERpZmZib3Q6ImRpZmZib3QiLER1Y2tEdWNrQm90OiJkdWNrZHVja2JvdCIsRHVja0R1Y2tHbzoiZHVja2R1Y2tnbyIsRWxlY3Ryb246ImVsZWN0cm9uIixFcGlwaGFueToiZXBpcGhhbnkiLEZhY2Vib29rRXh0ZXJuYWxIaXQ6ImZhY2Vib29rZXh0ZXJuYWxoaXQiLEZpcmVmb3g6ImZpcmVmb3giLEZvY3VzOiJmb2N1cyIsR2VuZXJpYzoiZ2VuZXJpYyIsIkdvb2dsZSBTZWFyY2giOiJnb29nbGVfc2VhcmNoIixHb29nbGVib3Q6Imdvb2dsZWJvdCIsR1BUQm90OiJncHRib3QiLCJJbnRlcm5ldCBFeHBsb3JlciI6ImllIixJbnRlcm5ldEFyY2hpdmVDcmF3bGVyOiJpbnRlcm5ldGFyY2hpdmVjcmF3bGVyIiwiSy1NZWxlb24iOiJrX21lbGVvbiIsTGlicmVXb2xmOiJsaWJyZXdvbGYiLExpbmVzcGlkZXI6ImxpbmVzcGlkZXIiLE1heHRob246Im1heHRob24iLCJNZXRhLUV4dGVybmFsQWRzIjoibWV0YV9leHRlcm5hbGFkcyIsIk1ldGEtRXh0ZXJuYWxBZ2VudCI6Im1ldGFfZXh0ZXJuYWxhZ2VudCIsIk1ldGEtRXh0ZXJuYWxGZXRjaGVyIjoibWV0YV9leHRlcm5hbGZldGNoZXIiLCJNZXRhLVdlYkluZGV4ZXIiOiJtZXRhX3dlYmluZGV4ZXIiLCJNaWNyb3NvZnQgRWRnZSI6ImVkZ2UiLCJNWiBCcm93c2VyIjoibXoiLCJOQVZFUiBXaGFsZSBCcm93c2VyIjoibmF2ZXIiLCJPQUktU2VhcmNoQm90Ijoib2FpX3NlYXJjaGJvdCIsT21naWxpYm90OiJvbWdpbGlib3QiLE9wZXJhOiJvcGVyYSIsIk9wZXJhIENvYXN0Ijoib3BlcmFfY29hc3QiLCJQYWxlIE1vb24iOiJwYWxlX21vb24iLFBlcnBsZXhpdHlCb3Q6InBlcnBsZXhpdHlib3QiLCJQZXJwbGV4aXR5LVVzZXIiOiJwZXJwbGV4aXR5X3VzZXIiLFBoYW50b21KUzoicGhhbnRvbWpzIixQaW5nZG9tQm90OiJwaW5nZG9tYm90IixQdWZmaW46InB1ZmZpbiIsUVE6InFxIixRUUxpdGU6InFxbGl0ZSIsUXVwWmlsbGE6InF1cHppbGxhIixSb2t1OiJyb2t1IixTYWZhcmk6InNhZmFyaSIsU2FpbGZpc2g6InNhaWxmaXNoIiwiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCI6InNhbXN1bmdfaW50ZXJuZXQiLFNsYWNrQm90OiJzbGFja2JvdCIsU2VhTW9ua2V5OiJzZWFtb25rZXkiLFNsZWlwbmlyOiJzbGVpcG5pciIsIlNvZ291IEJyb3dzZXIiOiJzb2dvdSIsU3dpbmc6InN3aW5nIixUaXplbjoidGl6ZW4iLCJVQyBCcm93c2VyIjoidWMiLFZpdmFsZGk6InZpdmFsZGkiLCJXZWJPUyBCcm93c2VyIjoid2Vib3MiLFdlQ2hhdDoid2VjaGF0IixZYWhvb1NsdXJwOiJ5YWhvb3NsdXJwIiwiWWFuZGV4IEJyb3dzZXIiOiJ5YW5kZXgiLFlhbmRleEJvdDoieWFuZGV4Ym90IixZb3VCb3Q6InlvdWJvdCJ9LEJyPXthbWF6b25ib3Q6IkFtYXpvbkJvdCIsYW1hem9uX3NpbGs6IkFtYXpvbiBTaWxrIixhbmRyb2lkOiJBbmRyb2lkIEJyb3dzZXIiLGJhaWR1c3BpZGVyOiJCYWlkdVNwaWRlciIsYmFkYToiQmFkYSIsYmluZ2NyYXdsZXI6IkJpbmdDcmF3bGVyIixibGFja2JlcnJ5OiJCbGFja0JlcnJ5IixicmF2ZToiQnJhdmUiLGNoYXRncHRfdXNlcjoiQ2hhdEdQVC1Vc2VyIixjaHJvbWU6IkNocm9tZSIsY2xhdWRlYm90OiJDbGF1ZGVCb3QiLGNocm9taXVtOiJDaHJvbWl1bSIsZGlmZmJvdDoiRGlmZmJvdCIsZHVja2R1Y2tib3Q6IkR1Y2tEdWNrQm90IixkdWNrZHVja2dvOiJEdWNrRHVja0dvIixlZGdlOiJNaWNyb3NvZnQgRWRnZSIsZWxlY3Ryb246IkVsZWN0cm9uIixlcGlwaGFueToiRXBpcGhhbnkiLGZhY2Vib29rZXh0ZXJuYWxoaXQ6IkZhY2Vib29rRXh0ZXJuYWxIaXQiLGZpcmVmb3g6IkZpcmVmb3giLGZvY3VzOiJGb2N1cyIsZ2VuZXJpYzoiR2VuZXJpYyIsZ29vZ2xlX3NlYXJjaDoiR29vZ2xlIFNlYXJjaCIsZ29vZ2xlYm90OiJHb29nbGVib3QiLGdwdGJvdDoiR1BUQm90IixpZToiSW50ZXJuZXQgRXhwbG9yZXIiLGludGVybmV0YXJjaGl2ZWNyYXdsZXI6IkludGVybmV0QXJjaGl2ZUNyYXdsZXIiLGtfbWVsZW9uOiJLLU1lbGVvbiIsbGlicmV3b2xmOiJMaWJyZVdvbGYiLGxpbmVzcGlkZXI6IkxpbmVzcGlkZXIiLG1heHRob246Ik1heHRob24iLG1ldGFfZXh0ZXJuYWxhZHM6Ik1ldGEtRXh0ZXJuYWxBZHMiLG1ldGFfZXh0ZXJuYWxhZ2VudDoiTWV0YS1FeHRlcm5hbEFnZW50IixtZXRhX2V4dGVybmFsZmV0Y2hlcjoiTWV0YS1FeHRlcm5hbEZldGNoZXIiLG1ldGFfd2ViaW5kZXhlcjoiTWV0YS1XZWJJbmRleGVyIixtejoiTVogQnJvd3NlciIsbmF2ZXI6Ik5BVkVSIFdoYWxlIEJyb3dzZXIiLG9haV9zZWFyY2hib3Q6Ik9BSS1TZWFyY2hCb3QiLG9tZ2lsaWJvdDoiT21naWxpYm90IixvcGVyYToiT3BlcmEiLG9wZXJhX2NvYXN0OiJPcGVyYSBDb2FzdCIscGFsZV9tb29uOiJQYWxlIE1vb24iLHBlcnBsZXhpdHlib3Q6IlBlcnBsZXhpdHlCb3QiLHBlcnBsZXhpdHlfdXNlcjoiUGVycGxleGl0eS1Vc2VyIixwaGFudG9tanM6IlBoYW50b21KUyIscGluZ2RvbWJvdDoiUGluZ2RvbUJvdCIscHVmZmluOiJQdWZmaW4iLHFxOiJRUSBCcm93c2VyIixxcWxpdGU6IlFRIEJyb3dzZXIgTGl0ZSIscXVwemlsbGE6IlF1cFppbGxhIixyb2t1OiJSb2t1IixzYWZhcmk6IlNhZmFyaSIsc2FpbGZpc2g6IlNhaWxmaXNoIixzYW1zdW5nX2ludGVybmV0OiJTYW1zdW5nIEludGVybmV0IGZvciBBbmRyb2lkIixzZWFtb25rZXk6IlNlYU1vbmtleSIsc2xhY2tib3Q6IlNsYWNrQm90IixzbGVpcG5pcjoiU2xlaXBuaXIiLHNvZ291OiJTb2dvdSBCcm93c2VyIixzd2luZzoiU3dpbmciLHRpemVuOiJUaXplbiIsdWM6IlVDIEJyb3dzZXIiLHZpdmFsZGk6IlZpdmFsZGkiLHdlYm9zOiJXZWJPUyBCcm93c2VyIix3ZWNoYXQ6IldlQ2hhdCIseWFob29zbHVycDoiWWFob29TbHVycCIseWFuZGV4OiJZYW5kZXggQnJvd3NlciIseWFuZGV4Ym90OiJZYW5kZXhCb3QiLHlvdWJvdDoiWW91Qm90In0saz17Ym90OiJib3QiLGRlc2t0b3A6ImRlc2t0b3AiLG1vYmlsZToibW9iaWxlIix0YWJsZXQ6InRhYmxldCIsdHY6InR2In0sSz17QW5kcm9pZDoiQW5kcm9pZCIsQmFkYToiQmFkYSIsQmxhY2tCZXJyeToiQmxhY2tCZXJyeSIsQ2hyb21lT1M6IkNocm9tZSBPUyIsSGFybW9ueU9TOiJIYXJtb255T1MiLGlPUzoiaU9TIixMaW51eDoiTGludXgiLE1hY09TOiJtYWNPUyIsUGxheVN0YXRpb240OiJQbGF5U3RhdGlvbiA0IixSb2t1OiJSb2t1IixUaXplbjoiVGl6ZW4iLFdlYk9TOiJXZWJPUyIsV2luZG93czoiV2luZG93cyIsV2luZG93c1Bob25lOiJXaW5kb3dzIFBob25lIn0sc2U9e0JsaW5rOiJCbGluayIsRWRnZUhUTUw6IkVkZ2VIVE1MIixHZWNrbzoiR2Vja28iLFByZXN0bzoiUHJlc3RvIixUcmlkZW50OiJUcmlkZW50IixXZWJLaXQ6IldlYktpdCJ9O2NsYXNzIGR7c3RhdGljIGdldEZpcnN0TWF0Y2godCxlKXtjb25zdCBzPWUubWF0Y2godCk7cmV0dXJuIHMmJnMubGVuZ3RoPjAmJnNbMV18fCIifXN0YXRpYyBnZXRTZWNvbmRNYXRjaCh0LGUpe2NvbnN0IHM9ZS5tYXRjaCh0KTtyZXR1cm4gcyYmcy5sZW5ndGg+MSYmc1syXXx8IiJ9c3RhdGljIG1hdGNoQW5kUmV0dXJuQ29uc3QodCxlLHMpe2lmKHQudGVzdChlKSlyZXR1cm4gc31zdGF0aWMgZ2V0V2luZG93c1ZlcnNpb25OYW1lKHQpe3N3aXRjaCh0KXtjYXNlIk5UIjpyZXR1cm4iTlQiO2Nhc2UiWFAiOnJldHVybiJYUCI7Y2FzZSJOVCA1LjAiOnJldHVybiIyMDAwIjtjYXNlIk5UIDUuMSI6cmV0dXJuIlhQIjtjYXNlIk5UIDUuMiI6cmV0dXJuIjIwMDMiO2Nhc2UiTlQgNi4wIjpyZXR1cm4iVmlzdGEiO2Nhc2UiTlQgNi4xIjpyZXR1cm4iNyI7Y2FzZSJOVCA2LjIiOnJldHVybiI4IjtjYXNlIk5UIDYuMyI6cmV0dXJuIjguMSI7Y2FzZSJOVCAxMC4wIjpyZXR1cm4iMTAiO2RlZmF1bHQ6cmV0dXJufX1zdGF0aWMgZ2V0TWFjT1NWZXJzaW9uTmFtZSh0KXtjb25zdCBlPXQuc3BsaXQoIi4iKS5zcGxpY2UoMCwyKS5tYXAoaT0+cGFyc2VJbnQoaSwxMCl8fDApO2UucHVzaCgwKTtjb25zdCBzPWVbMF0sbj1lWzFdO2lmKHM9PT0xMClzd2l0Y2gobil7Y2FzZSA1OnJldHVybiJMZW9wYXJkIjtjYXNlIDY6cmV0dXJuIlNub3cgTGVvcGFyZCI7Y2FzZSA3OnJldHVybiJMaW9uIjtjYXNlIDg6cmV0dXJuIk1vdW50YWluIExpb24iO2Nhc2UgOTpyZXR1cm4iTWF2ZXJpY2tzIjtjYXNlIDEwOnJldHVybiJZb3NlbWl0ZSI7Y2FzZSAxMTpyZXR1cm4iRWwgQ2FwaXRhbiI7Y2FzZSAxMjpyZXR1cm4iU2llcnJhIjtjYXNlIDEzOnJldHVybiJIaWdoIFNpZXJyYSI7Y2FzZSAxNDpyZXR1cm4iTW9qYXZlIjtjYXNlIDE1OnJldHVybiJDYXRhbGluYSI7ZGVmYXVsdDpyZXR1cm59c3dpdGNoKHMpe2Nhc2UgMTE6cmV0dXJuIkJpZyBTdXIiO2Nhc2UgMTI6cmV0dXJuIk1vbnRlcmV5IjtjYXNlIDEzOnJldHVybiJWZW50dXJhIjtjYXNlIDE0OnJldHVybiJTb25vbWEiO2Nhc2UgMTU6cmV0dXJuIlNlcXVvaWEiO2RlZmF1bHQ6cmV0dXJufX1zdGF0aWMgZ2V0QW5kcm9pZFZlcnNpb25OYW1lKHQpe2NvbnN0IGU9dC5zcGxpdCgiLiIpLnNwbGljZSgwLDIpLm1hcChzPT5wYXJzZUludChzLDEwKXx8MCk7aWYoZS5wdXNoKDApLCEoZVswXT09PTEmJmVbMV08NSkpe2lmKGVbMF09PT0xJiZlWzFdPDYpcmV0dXJuIkN1cGNha2UiO2lmKGVbMF09PT0xJiZlWzFdPj02KXJldHVybiJEb251dCI7aWYoZVswXT09PTImJmVbMV08MilyZXR1cm4iRWNsYWlyIjtpZihlWzBdPT09MiYmZVsxXT09PTIpcmV0dXJuIkZyb3lvIjtpZihlWzBdPT09MiYmZVsxXT4yKXJldHVybiJHaW5nZXJicmVhZCI7aWYoZVswXT09PTMpcmV0dXJuIkhvbmV5Y29tYiI7aWYoZVswXT09PTQmJmVbMV08MSlyZXR1cm4iSWNlIENyZWFtIFNhbmR3aWNoIjtpZihlWzBdPT09NCYmZVsxXTw0KXJldHVybiJKZWxseSBCZWFuIjtpZihlWzBdPT09NCYmZVsxXT49NClyZXR1cm4iS2l0S2F0IjtpZihlWzBdPT09NSlyZXR1cm4iTG9sbGlwb3AiO2lmKGVbMF09PT02KXJldHVybiJNYXJzaG1hbGxvdyI7aWYoZVswXT09PTcpcmV0dXJuIk5vdWdhdCI7aWYoZVswXT09PTgpcmV0dXJuIk9yZW8iO2lmKGVbMF09PT05KXJldHVybiJQaWUifX1zdGF0aWMgZ2V0VmVyc2lvblByZWNpc2lvbih0KXtyZXR1cm4gdC5zcGxpdCgiLiIpLmxlbmd0aH1zdGF0aWMgY29tcGFyZVZlcnNpb25zKHQsZSxzPSExKXtjb25zdCBuPWQuZ2V0VmVyc2lvblByZWNpc2lvbih0KSxpPWQuZ2V0VmVyc2lvblByZWNpc2lvbihlKTtsZXQgYT1NYXRoLm1heChuLGkpLGw9MDtjb25zdCBvPWQubWFwKFt0LGVdLG09Pntjb25zdCBnPWEtZC5nZXRWZXJzaW9uUHJlY2lzaW9uKG0pLHk9bStuZXcgQXJyYXkoZysxKS5qb2luKCIuMCIpO3JldHVybiBkLm1hcCh5LnNwbGl0KCIuIiksVD0+bmV3IEFycmF5KDIwLVQubGVuZ3RoKS5qb2luKCIwIikrVCkucmV2ZXJzZSgpfSk7Zm9yKHMmJihsPWEtTWF0aC5taW4obixpKSksYS09MTthPj1sOyl7aWYob1swXVthXT5vWzFdW2FdKXJldHVybiAxO2lmKG9bMF1bYV09PT1vWzFdW2FdKXtpZihhPT09bClyZXR1cm4gMDthLT0xfWVsc2UgaWYob1swXVthXTxvWzFdW2FdKXJldHVybi0xfX1zdGF0aWMgbWFwKHQsZSl7Y29uc3Qgcz1bXTtsZXQgbjtpZihBcnJheS5wcm90b3R5cGUubWFwKXJldHVybiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodCxlKTtmb3Iobj0wO248dC5sZW5ndGg7bis9MSlzLnB1c2goZSh0W25dKSk7cmV0dXJuIHN9c3RhdGljIGZpbmQodCxlKXtsZXQgcyxuO2lmKEFycmF5LnByb3RvdHlwZS5maW5kKXJldHVybiBBcnJheS5wcm90b3R5cGUuZmluZC5jYWxsKHQsZSk7Zm9yKHM9MCxuPXQubGVuZ3RoO3M8bjtzKz0xKXtjb25zdCBpPXRbc107aWYoZShpLHMpKXJldHVybiBpfX1zdGF0aWMgYXNzaWduKHQsLi4uZSl7Y29uc3Qgcz10O2xldCBuLGk7aWYoT2JqZWN0LmFzc2lnbilyZXR1cm4gT2JqZWN0LmFzc2lnbih0LC4uLmUpO2ZvcihuPTAsaT1lLmxlbmd0aDtuPGk7bis9MSl7Y29uc3QgYT1lW25dO3R5cGVvZiBhPT0ib2JqZWN0IiYmYSE9PW51bGwmJk9iamVjdC5rZXlzKGEpLmZvckVhY2gobz0+e3Nbb109YVtvXX0pfXJldHVybiB0fXN0YXRpYyBnZXRCcm93c2VyQWxpYXModCl7cmV0dXJuIElpW3RdfXN0YXRpYyBnZXRCcm93c2VyVHlwZUJ5QWxpYXModCl7cmV0dXJuIEJyW3RdfHwiIn19Y29uc3QgTT0vdmVyc2lvblwvKFxkKyhcLj9fP1xkKykrKS9pLF9pPVt7dGVzdDpbL2dwdGJvdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHUFRCb3QifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvZ3B0Ym90XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2NoYXRncHQtdXNlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaGF0R1BULVVzZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvY2hhdGdwdC11c2VyXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29haS1zZWFyY2hib3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT0FJLVNlYXJjaEJvdCJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC9vYWktc2VhcmNoYm90XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2NsYXVkZWJvdC9pLC9jbGF1ZGUtd2ViL2ksL2NsYXVkZS11c2VyL2ksL2NsYXVkZS1zZWFyY2hib3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQ2xhdWRlQm90In0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmNsYXVkZWJvdHxjbGF1ZGUtd2VifGNsYXVkZS11c2VyfGNsYXVkZS1zZWFyY2hib3QpXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL29tZ2lsaWJvdC9pLC93ZWJ6aW8tZXh0ZW5kZWQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT21naWxpYm90In0sZT1kLmdldEZpcnN0TWF0Y2goLyg/Om9tZ2lsaWJvdHx3ZWJ6aW8tZXh0ZW5kZWQpXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2RpZmZib3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiRGlmZmJvdCJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC9kaWZmYm90XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3BlcnBsZXhpdHlib3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUGVycGxleGl0eUJvdCJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC9wZXJwbGV4aXR5Ym90XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3BlcnBsZXhpdHktdXNlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQZXJwbGV4aXR5LVVzZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvcGVycGxleGl0eS11c2VyXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3lvdWJvdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJZb3VCb3QifSxlPWQuZ2V0Rmlyc3RNYXRjaCgveW91Ym90XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21ldGEtd2ViaW5kZXhlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNZXRhLVdlYkluZGV4ZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvbWV0YS13ZWJpbmRleGVyXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxhZHMvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWV0YS1FeHRlcm5hbEFkcyJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC9tZXRhLWV4dGVybmFsYWRzXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxhZ2VudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNZXRhLUV4dGVybmFsQWdlbnQifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvbWV0YS1leHRlcm5hbGFnZW50XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxmZXRjaGVyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1ldGEtRXh0ZXJuYWxGZXRjaGVyIn0sZT1kLmdldEZpcnN0TWF0Y2goL21ldGEtZXh0ZXJuYWxmZXRjaGVyXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2dvb2dsZWJvdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJHb29nbGVib3QifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvZ29vZ2xlYm90XC8oXGQrKFwuXGQrKSkvaSxyKXx8ZC5nZXRGaXJzdE1hdGNoKE0scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvbGluZXNwaWRlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJMaW5lc3BpZGVyIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmxpbmVzcGlkZXIpKD86LVstXHddKyk/W1xzL10oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2FtYXpvbmJvdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJBbWF6b25Cb3QifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvYW1hem9uYm90XC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2Jpbmdib3QvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQmluZ0NyYXdsZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvYmluZ2JvdFwvKFxkKyhcLlxkKykrKS9pLHIpfHxkLmdldEZpcnN0TWF0Y2goTSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9iYWlkdXNwaWRlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJCYWlkdVNwaWRlciJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC9iYWlkdXNwaWRlclwvKFxkKyhcLlxkKykrKS9pLHIpfHxkLmdldEZpcnN0TWF0Y2goTSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9kdWNrZHVja2JvdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJEdWNrRHVja0JvdCJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC9kdWNrZHVja2JvdFwvKFxkKyhcLlxkKykrKS9pLHIpfHxkLmdldEZpcnN0TWF0Y2goTSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9pYV9hcmNoaXZlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJJbnRlcm5ldEFyY2hpdmVDcmF3bGVyIn0sZT1kLmdldEZpcnN0TWF0Y2goL2lhX2FyY2hpdmVyXC8oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZhY2Vib29rZXh0ZXJuYWxoaXQvaSwvZmFjZWJvb2tjYXRhbG9nL2ldLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6IkZhY2Vib29rRXh0ZXJuYWxIaXQifX19LHt0ZXN0Olsvc2xhY2tib3QvaSwvc2xhY2staW1nUHJveHkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xhY2tCb3QifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86c2xhY2tib3R8c2xhY2staW1ncHJveHkpKD86LVstXHddKyk/W1xzL10oXGQrKFwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3lhaG9vIT9bXHMvXSpzbHVycC9pXSxkZXNjcmliZSgpe3JldHVybntuYW1lOiJZYWhvb1NsdXJwIn19fSx7dGVzdDpbL3lhbmRleGJvdC9pLC95YW5kZXhtb2JpbGVib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZToiWWFuZGV4Qm90In19fSx7dGVzdDpbL3Bpbmdkb20vaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZToiUGluZ2RvbUJvdCJ9fX0se3Rlc3Q6Wy9vcGVyYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSJ9LGU9ZC5nZXRGaXJzdE1hdGNoKE0scil8fGQuZ2V0Rmlyc3RNYXRjaCgvKD86b3BlcmEpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvb3ByXC98b3Bpb3MvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiT3BlcmEifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86b3ByfG9waW9zKVtccy9dKFxTKykvaSxyKXx8ZC5nZXRGaXJzdE1hdGNoKE0scik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvU2Ftc3VuZ0Jyb3dzZXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2Ftc3VuZyBJbnRlcm5ldCBmb3IgQW5kcm9pZCJ9LGU9ZC5nZXRGaXJzdE1hdGNoKE0scil8fGQuZ2V0Rmlyc3RNYXRjaCgvKD86U2Ftc3VuZ0Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvV2hhbGUvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTkFWRVIgV2hhbGUgQnJvd3NlciJ9LGU9ZC5nZXRGaXJzdE1hdGNoKE0scil8fGQuZ2V0Rmlyc3RNYXRjaCgvKD86d2hhbGUpW1xzL10oXGQrKD86XC5cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9QYWxlTW9vbi9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJQYWxlIE1vb24ifSxlPWQuZ2V0Rmlyc3RNYXRjaChNLHIpfHxkLmdldEZpcnN0TWF0Y2goLyg/OlBhbGVNb29uKVtccy9dKFxkKyg/OlwuXGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTVpCcm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1aIEJyb3dzZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86TVpCcm93c2VyKVtccy9dKFxkKyg/OlwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2ZvY3VzL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkZvY3VzIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmZvY3VzKVtccy9dKFxkKyg/OlwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3N3aW5nL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlN3aW5nIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OnN3aW5nKVtccy9dKFxkKyg/OlwuXGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2NvYXN0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik9wZXJhIENvYXN0In0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKXx8ZC5nZXRGaXJzdE1hdGNoKC8oPzpjb2FzdClbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9vcHRcL1xkKyg/Oi4/Xz9cZCspKy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJPcGVyYSBUb3VjaCJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC8oPzpvcHQpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3lhYnJvd3Nlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJZYW5kZXggQnJvd3NlciJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC8oPzp5YWJyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3VjYnJvd3Nlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJVQyBCcm93c2VyIn0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKXx8ZC5nZXRGaXJzdE1hdGNoKC8oPzp1Y2Jyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvTWF4dGhvbnxteGlvcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJNYXh0aG9uIn0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKXx8ZC5nZXRGaXJzdE1hdGNoKC8oPzpNYXh0aG9ufG14aW9zKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VwaXBoYW55L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkVwaXBoYW55In0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKXx8ZC5nZXRGaXJzdE1hdGNoKC8oPzplcGlwaGFueSlbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9wdWZmaW4vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUHVmZmluIn0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKXx8ZC5nZXRGaXJzdE1hdGNoKC8oPzpwdWZmaW4pW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvc2xlaXBuaXIvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2xlaXBuaXIifSxlPWQuZ2V0Rmlyc3RNYXRjaChNLHIpfHxkLmdldEZpcnN0TWF0Y2goLyg/OnNsZWlwbmlyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2stbWVsZW9uL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkstTWVsZW9uIn0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKXx8ZC5nZXRGaXJzdE1hdGNoKC8oPzprLW1lbGVvbilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9taWNyb21lc3Nlbmdlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJXZUNoYXQifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86bWljcm9tZXNzZW5nZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3FxYnJvd3Nlci9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOi9xcWJyb3dzZXJsaXRlL2kudGVzdChyKT8iUVEgQnJvd3NlciBMaXRlIjoiUVEgQnJvd3NlciJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC8oPzpxcWJyb3dzZXJsaXRlfHFxYnJvd3NlcilbL10oXGQrKFwuP18/XGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21zaWV8dHJpZGVudC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJJbnRlcm5ldCBFeHBsb3JlciJ9LGU9ZC5nZXRGaXJzdE1hdGNoKC8oPzptc2llIHxydjopKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL1xzZWRnXC8vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTWljcm9zb2Z0IEVkZ2UifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvXHNlZGdcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9lZGcoW2VhXXxpb3MpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1pY3Jvc29mdCBFZGdlIn0sZT1kLmdldFNlY29uZE1hdGNoKC9lZGcoW2VhXXxpb3MpXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0Olsvdml2YWxkaS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJWaXZhbGRpIn0sZT1kLmdldEZpcnN0TWF0Y2goL3ZpdmFsZGlcLyhcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9zZWFtb25rZXkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiU2VhTW9ua2V5In0sZT1kLmdldEZpcnN0TWF0Y2goL3NlYW1vbmtleVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NhaWxmaXNoL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlNhaWxmaXNoIn0sZT1kLmdldEZpcnN0TWF0Y2goL3NhaWxmaXNoXHM/YnJvd3NlclwvKFxkKyhcLlxkKyk/KS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NpbGsvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQW1hem9uIFNpbGsifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvc2lsa1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3BoYW50b20vaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiUGhhbnRvbUpTIn0sZT1kLmdldEZpcnN0TWF0Y2goL3BoYW50b21qc1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NsaW1lcmpzL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlNsaW1lckpTIn0sZT1kLmdldEZpcnN0TWF0Y2goL3NsaW1lcmpzXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvYmxhY2tiZXJyeXxcYmJiXGQrL2ksL3JpbVxzdGFibGV0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkJsYWNrQmVycnkifSxlPWQuZ2V0Rmlyc3RNYXRjaChNLHIpfHxkLmdldEZpcnN0TWF0Y2goL2JsYWNrYmVycnlbXGRdK1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbLyh3ZWJ8aHB3KVtvMF1zL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IldlYk9TIEJyb3dzZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaChNLHIpfHxkLmdldEZpcnN0TWF0Y2goL3coPzplYik/W28wXXNicm93c2VyXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvYmFkYS9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJCYWRhIn0sZT1kLmdldEZpcnN0TWF0Y2goL2RvbGZpblwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlRpemVuIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OnRpemVuXHM/KT9icm93c2VyXC8oXGQrKFwuP18/XGQrKSspL2kscil8fGQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3F1cHppbGxhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlF1cFppbGxhIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OnF1cHppbGxhKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpfHxkLmdldEZpcnN0TWF0Y2goTSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9saWJyZXdvbGYvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiTGlicmVXb2xmIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmxpYnJld29sZilbXHMvXShcZCsoXC4/Xz9cZCspKykvaSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9maXJlZm94fGljZXdlYXNlbHxmeGlvcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJGaXJlZm94In0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmZpcmVmb3h8aWNld2Vhc2VsfGZ4aW9zKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL2VsZWN0cm9uL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkVsZWN0cm9uIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmVsZWN0cm9uKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NvZ291bW9iaWxlYnJvd3Nlci9pLC9tZXRhc3IvaSwvc2UgMlwuW3hdL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlNvZ291IEJyb3dzZXIifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86c29nb3Vtb2JpbGVicm93c2VyKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpLHM9ZC5nZXRGaXJzdE1hdGNoKC8oPzpjaHJvbWV8Y3Jpb3N8Y3JtbylcLyhcZCsoXC4/Xz9cZCspKykvaSxyKSxuPWQuZ2V0Rmlyc3RNYXRjaCgvc2UgKFtcZC5dKyl4L2ksciksaT1lfHxzfHxuO3JldHVybiBpJiYodC52ZXJzaW9uPWkpLHR9fSx7dGVzdDpbL01pdWlCcm93c2VyL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ik1pdWkifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86TWl1aUJyb3dzZXIpW1xzL10oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe3JldHVybiByLmhhc0JyYW5kKCJEdWNrRHVja0dvIik/ITA6ci50ZXN0KC9cc0RkZ1wvW1xkLl0rJC9pKX0sZGVzY3JpYmUocix0KXtjb25zdCBlPXtuYW1lOiJEdWNrRHVja0dvIn07aWYodCl7Y29uc3Qgbj10LmdldEJyYW5kVmVyc2lvbigiRHVja0R1Y2tHbyIpO2lmKG4pcmV0dXJuIGUudmVyc2lvbj1uLGV9Y29uc3Qgcz1kLmdldEZpcnN0TWF0Y2goL1xzRGRnXC8oW1xkLl0rKSQvaSxyKTtyZXR1cm4gcyYmKGUudmVyc2lvbj1zKSxlfX0se3Rlc3Qocil7cmV0dXJuIHIuaGFzQnJhbmQoIkJyYXZlIil9LGRlc2NyaWJlKHIsdCl7Y29uc3QgZT17bmFtZToiQnJhdmUifTtpZih0KXtjb25zdCBzPXQuZ2V0QnJhbmRWZXJzaW9uKCJCcmF2ZSIpO2lmKHMpcmV0dXJuIGUudmVyc2lvbj1zLGV9cmV0dXJuIGV9fSx7dGVzdDpbL2Nocm9taXVtL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IkNocm9taXVtIn0sZT1kLmdldEZpcnN0TWF0Y2goLyg/OmNocm9taXVtKVtccy9dKFxkKyhcLj9fP1xkKykrKS9pLHIpfHxkLmdldEZpcnN0TWF0Y2goTSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9jaHJvbWV8Y3Jpb3N8Y3Jtby9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJDaHJvbWUifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86Y2hyb21lfGNyaW9zfGNybW8pXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0OlsvR1NBL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6Ikdvb2dsZSBTZWFyY2gifSxlPWQuZ2V0Rmlyc3RNYXRjaCgvKD86R1NBKVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZToiQW5kcm9pZCBCcm93c2VyIn0sZT1kLmdldEZpcnN0TWF0Y2goTSxyKTtyZXR1cm4gZSYmKHQudmVyc2lvbj1lKSx0fX0se3Rlc3Q6Wy9wbGF5c3RhdGlvbiA0L2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6IlBsYXlTdGF0aW9uIDQifSxlPWQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL3NhZmFyaXxhcHBsZXdlYmtpdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOiJTYWZhcmkifSxlPWQuZ2V0Rmlyc3RNYXRjaChNLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbLy4qL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9L14oLiopXC8oLiopIC8sZT0vXiguKilcLyguKilbIFx0XVwoKC4qKS8sbj1yLnNlYXJjaCgiXFwoIikhPT0tMT9lOnQ7cmV0dXJue25hbWU6ZC5nZXRGaXJzdE1hdGNoKG4sciksdmVyc2lvbjpkLmdldFNlY29uZE1hdGNoKG4scil9fX1dO3ZhciBBaT1be3Rlc3Q6Wy9Sb2t1XC9EVlAvXSxkZXNjcmliZShyKXtjb25zdCB0PWQuZ2V0Rmlyc3RNYXRjaCgvUm9rdVwvRFZQLShcZCtcLlxkKykvaSxyKTtyZXR1cm57bmFtZTpLLlJva3UsdmVyc2lvbjp0fX19LHt0ZXN0Olsvd2luZG93cyBwaG9uZS9pXSxkZXNjcmliZShyKXtjb25zdCB0PWQuZ2V0Rmlyc3RNYXRjaCgvd2luZG93cyBwaG9uZSAoPzpvcyk/XHM/KFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuV2luZG93c1Bob25lLHZlcnNpb246dH19fSx7dGVzdDpbL3dpbmRvd3MgL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9ZC5nZXRGaXJzdE1hdGNoKC9XaW5kb3dzICgoTlR8WFApKCBcZFxkPy5cZCk/KS9pLHIpLGU9ZC5nZXRXaW5kb3dzVmVyc2lvbk5hbWUodCk7cmV0dXJue25hbWU6Sy5XaW5kb3dzLHZlcnNpb246dCx2ZXJzaW9uTmFtZTplfX19LHt0ZXN0OlsvTWFjaW50b3NoKC4qPykgRnhpT1MoLio/KVwvL10sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpLLmlPU30sZT1kLmdldFNlY29uZE1hdGNoKC8oVmVyc2lvblwvKShcZFtcZC5dKykvLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbL21hY2ludG9zaC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWQuZ2V0Rmlyc3RNYXRjaCgvbWFjIG9zIHggKFxkKyhcLj9fP1xkKykrKS9pLHIpLnJlcGxhY2UoL1tfXHNdL2csIi4iKSxlPWQuZ2V0TWFjT1NWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuTWFjT1MsdmVyc2lvbjp0fTtyZXR1cm4gZSYmKHMudmVyc2lvbk5hbWU9ZSksc319LHt0ZXN0OlsvKGlwb2R8aXBob25lfGlwYWQpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9ZC5nZXRGaXJzdE1hdGNoKC9vcyAoXGQrKFtfXHNdXGQrKSopIGxpa2UgbWFjIG9zIHgvaSxyKS5yZXBsYWNlKC9bX1xzXS9nLCIuIik7cmV0dXJue25hbWU6Sy5pT1MsdmVyc2lvbjp0fX19LHt0ZXN0OlsvT3Blbkhhcm1vbnkvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1kLmdldEZpcnN0TWF0Y2goL09wZW5IYXJtb255XHMrKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuSGFybW9ueU9TLHZlcnNpb246dH19fSx7dGVzdChyKXtjb25zdCB0PSFyLnRlc3QoL2xpa2UgYW5kcm9pZC9pKSxlPXIudGVzdCgvYW5kcm9pZC9pKTtyZXR1cm4gdCYmZX0sZGVzY3JpYmUocil7Y29uc3QgdD1kLmdldEZpcnN0TWF0Y2goL2FuZHJvaWRbXHMvLV0oXGQrKFwuXGQrKSopL2ksciksZT1kLmdldEFuZHJvaWRWZXJzaW9uTmFtZSh0KSxzPXtuYW1lOksuQW5kcm9pZCx2ZXJzaW9uOnR9O3JldHVybiBlJiYocy52ZXJzaW9uTmFtZT1lKSxzfX0se3Rlc3Q6Wy8od2VifGhwdylbbzBdcy9pXSxkZXNjcmliZShyKXtjb25zdCB0PWQuZ2V0Rmlyc3RNYXRjaCgvKD86d2VifGhwdylbbzBdc1wvKFxkKyhcLlxkKykqKS9pLHIpLGU9e25hbWU6Sy5XZWJPU307cmV0dXJuIHQmJnQubGVuZ3RoJiYoZS52ZXJzaW9uPXQpLGV9fSx7dGVzdDpbL2JsYWNrYmVycnl8XGJiYlxkKy9pLC9yaW1cc3RhYmxldC9pXSxkZXNjcmliZShyKXtjb25zdCB0PWQuZ2V0Rmlyc3RNYXRjaCgvcmltXHN0YWJsZXRcc29zXHMoXGQrKFwuXGQrKSopL2kscil8fGQuZ2V0Rmlyc3RNYXRjaCgvYmxhY2tiZXJyeVxkK1wvKFxkKyhbX1xzXVxkKykqKS9pLHIpfHxkLmdldEZpcnN0TWF0Y2goL1xiYmIoXGQrKS9pLHIpO3JldHVybntuYW1lOksuQmxhY2tCZXJyeSx2ZXJzaW9uOnR9fX0se3Rlc3Q6Wy9iYWRhL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9ZC5nZXRGaXJzdE1hdGNoKC9iYWRhXC8oXGQrKFwuXGQrKSopL2kscik7cmV0dXJue25hbWU6Sy5CYWRhLHZlcnNpb246dH19fSx7dGVzdDpbL3RpemVuL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9ZC5nZXRGaXJzdE1hdGNoKC90aXplblsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuVGl6ZW4sdmVyc2lvbjp0fX19LHt0ZXN0OlsvbGludXgvaV0sZGVzY3JpYmUoKXtyZXR1cm57bmFtZTpLLkxpbnV4fX19LHt0ZXN0OlsvQ3JPUy9dLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6Sy5DaHJvbWVPU319fSx7dGVzdDpbL1BsYXlTdGF0aW9uIDQvXSxkZXNjcmliZShyKXtjb25zdCB0PWQuZ2V0Rmlyc3RNYXRjaCgvUGxheVN0YXRpb24gNFsvXHNdKFxkKyhcLlxkKykqKS9pLHIpO3JldHVybntuYW1lOksuUGxheVN0YXRpb240LHZlcnNpb246dH19fV0sTGk9W3t0ZXN0OlsvZ29vZ2xlYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJHb29nbGUifX19LHt0ZXN0OlsvbGluZXNwaWRlci9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuYm90LHZlbmRvcjoiTGluZSJ9fX0se3Rlc3Q6Wy9hbWF6b25ib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IkFtYXpvbiJ9fX0se3Rlc3Q6Wy9ncHRib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6Ik9wZW5BSSJ9fX0se3Rlc3Q6Wy9jaGF0Z3B0LXVzZXIvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6Ik9wZW5BSSJ9fX0se3Rlc3Q6Wy9vYWktc2VhcmNoYm90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJPcGVuQUkifX19LHt0ZXN0OlsvYmFpZHVzcGlkZXIvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IkJhaWR1In19fSx7dGVzdDpbL2Jpbmdib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IkJpbmcifX19LHt0ZXN0OlsvZHVja2R1Y2tib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IkR1Y2tEdWNrR28ifX19LHt0ZXN0OlsvY2xhdWRlYm90L2ksL2NsYXVkZS13ZWIvaSwvY2xhdWRlLXVzZXIvaSwvY2xhdWRlLXNlYXJjaGJvdC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuYm90LHZlbmRvcjoiQW50aHJvcGljIn19fSx7dGVzdDpbL29tZ2lsaWJvdC9pLC93ZWJ6aW8tZXh0ZW5kZWQvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IldlYnouaW8ifX19LHt0ZXN0OlsvZGlmZmJvdC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuYm90LHZlbmRvcjoiRGlmZmJvdCJ9fX0se3Rlc3Q6Wy9wZXJwbGV4aXR5Ym90L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJQZXJwbGV4aXR5IEFJIn19fSx7dGVzdDpbL3BlcnBsZXhpdHktdXNlci9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuYm90LHZlbmRvcjoiUGVycGxleGl0eSBBSSJ9fX0se3Rlc3Q6Wy95b3Vib3QvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IllvdS5jb20ifX19LHt0ZXN0OlsvaWFfYXJjaGl2ZXIvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IkludGVybmV0IEFyY2hpdmUifX19LHt0ZXN0OlsvbWV0YS13ZWJpbmRleGVyL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJNZXRhIn19fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxhZHMvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6Ik1ldGEifX19LHt0ZXN0OlsvbWV0YS1leHRlcm5hbGFnZW50L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJNZXRhIn19fSx7dGVzdDpbL21ldGEtZXh0ZXJuYWxmZXRjaGVyL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJNZXRhIn19fSx7dGVzdDpbL2ZhY2Vib29rZXh0ZXJuYWxoaXQvaSwvZmFjZWJvb2tjYXRhbG9nL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJNZXRhIn19fSx7dGVzdDpbL3NsYWNrYm90L2ksL3NsYWNrLWltZ1Byb3h5L2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5ib3QsdmVuZG9yOiJTbGFjayJ9fX0se3Rlc3Q6Wy95YWhvby9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuYm90LHZlbmRvcjoiWWFob28ifX19LHt0ZXN0OlsveWFuZGV4Ym90L2ksL3lhbmRleG1vYmlsZWJvdC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuYm90LHZlbmRvcjoiWWFuZGV4In19fSx7dGVzdDpbL3Bpbmdkb20vaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLmJvdCx2ZW5kb3I6IlBpbmdkb20ifX19LHt0ZXN0OlsvaHVhd2VpL2ldLGRlc2NyaWJlKHIpe2NvbnN0IHQ9ZC5nZXRGaXJzdE1hdGNoKC8oY2FuLWwwMSkvaSxyKSYmIk5vdmEiLGU9e3R5cGU6ay5tb2JpbGUsdmVuZG9yOiJIdWF3ZWkifTtyZXR1cm4gdCYmKGUubW9kZWw9dCksZX19LHt0ZXN0OlsvbmV4dXNccyooPzo3fDh8OXwxMCkuKi9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsudGFibGV0LHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvaXBhZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsudGFibGV0LHZlbmRvcjoiQXBwbGUiLG1vZGVsOiJpUGFkIn19fSx7dGVzdDpbL01hY2ludG9zaCguKj8pIEZ4aU9TKC4qPylcLy9dLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay50YWJsZXQsdmVuZG9yOiJBcHBsZSIsbW9kZWw6ImlQYWQifX19LHt0ZXN0Olsva2Z0dCBidWlsZC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsudGFibGV0LHZlbmRvcjoiQW1hem9uIixtb2RlbDoiS2luZGxlIEZpcmUgSEQgNyJ9fX0se3Rlc3Q6Wy9zaWxrL2ldLGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay50YWJsZXQsdmVuZG9yOiJBbWF6b24ifX19LHt0ZXN0OlsvdGFibGV0KD8hIHBjKS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsudGFibGV0fX19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9pcG9kfGlwaG9uZS9pKSxlPXIudGVzdCgvbGlrZSAoaXBvZHxpcGhvbmUpL2kpO3JldHVybiB0JiYhZX0sZGVzY3JpYmUocil7Y29uc3QgdD1kLmdldEZpcnN0TWF0Y2goLyhpcG9kfGlwaG9uZSkvaSxyKTtyZXR1cm57dHlwZTprLm1vYmlsZSx2ZW5kb3I6IkFwcGxlIixtb2RlbDp0fX19LHt0ZXN0OlsvbmV4dXNccypbMC02XS4qL2ksL2dhbGF4eSBuZXh1cy9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsubW9iaWxlLHZlbmRvcjoiTmV4dXMifX19LHt0ZXN0OlsvTm9raWEvaV0sZGVzY3JpYmUocil7Y29uc3QgdD1kLmdldEZpcnN0TWF0Y2goL05va2lhXHMrKFswLTldKyhcLlswLTldKyk/KS9pLHIpLGU9e3R5cGU6ay5tb2JpbGUsdmVuZG9yOiJOb2tpYSJ9O3JldHVybiB0JiYoZS5tb2RlbD10KSxlfX0se3Rlc3Q6Wy9bXi1dbW9iaS9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsubW9iaWxlfX19LHt0ZXN0KHIpe3JldHVybiByLmdldEJyb3dzZXJOYW1lKCEwKT09PSJibGFja2JlcnJ5In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLm1vYmlsZSx2ZW5kb3I6IkJsYWNrQmVycnkifX19LHt0ZXN0KHIpe3JldHVybiByLmdldEJyb3dzZXJOYW1lKCEwKT09PSJiYWRhIn0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLm1vYmlsZX19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRCcm93c2VyTmFtZSgpPT09IndpbmRvd3MgcGhvbmUifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsubW9iaWxlLHZlbmRvcjoiTWljcm9zb2Z0In19fSx7dGVzdChyKXtjb25zdCB0PU51bWJlcihTdHJpbmcoci5nZXRPU1ZlcnNpb24oKSkuc3BsaXQoIi4iKVswXSk7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJhbmRyb2lkIiYmdD49M30sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLnRhYmxldH19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09ImFuZHJvaWQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsubW9iaWxlfX19LHt0ZXN0Olsvc21hcnQtP3R2fHNtYXJ0dHYvaV0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLnR2fX19LHt0ZXN0OlsvbmV0Y2FzdC9pXSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsudHZ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJtYWNvcyJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5kZXNrdG9wLHZlbmRvcjoiQXBwbGUifX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0id2luZG93cyJ9LGRlc2NyaWJlKCl7cmV0dXJue3R5cGU6ay5kZXNrdG9wfX19LHt0ZXN0KHIpe3JldHVybiByLmdldE9TTmFtZSghMCk9PT0ibGludXgifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsuZGVza3RvcH19fSx7dGVzdChyKXtyZXR1cm4gci5nZXRPU05hbWUoITApPT09InBsYXlzdGF0aW9uIDQifSxkZXNjcmliZSgpe3JldHVybnt0eXBlOmsudHZ9fX0se3Rlc3Qocil7cmV0dXJuIHIuZ2V0T1NOYW1lKCEwKT09PSJyb2t1In0sZGVzY3JpYmUoKXtyZXR1cm57dHlwZTprLnR2fX19XSxPaT1be3Rlc3Qocil7cmV0dXJuIHIuZ2V0QnJvd3Nlck5hbWUoITApPT09Im1pY3Jvc29mdCBlZGdlIn0sZGVzY3JpYmUocil7aWYoL1xzZWRnXC8vaS50ZXN0KHIpKXJldHVybntuYW1lOnNlLkJsaW5rfTtjb25zdCBlPWQuZ2V0Rmlyc3RNYXRjaCgvZWRnZVwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybntuYW1lOnNlLkVkZ2VIVE1MLHZlcnNpb246ZX19fSx7dGVzdDpbL3RyaWRlbnQvaV0sZGVzY3JpYmUocil7Y29uc3QgdD17bmFtZTpzZS5UcmlkZW50fSxlPWQuZ2V0Rmlyc3RNYXRjaCgvdHJpZGVudFwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdChyKXtyZXR1cm4gci50ZXN0KC9wcmVzdG8vaSl9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuUHJlc3RvfSxlPWQuZ2V0Rmlyc3RNYXRjaCgvcHJlc3RvXC8oXGQrKFwuP18/XGQrKSspL2kscik7cmV0dXJuIGUmJih0LnZlcnNpb249ZSksdH19LHt0ZXN0KHIpe2NvbnN0IHQ9ci50ZXN0KC9nZWNrby9pKSxlPXIudGVzdCgvbGlrZSBnZWNrby9pKTtyZXR1cm4gdCYmIWV9LGRlc2NyaWJlKHIpe2NvbnN0IHQ9e25hbWU6c2UuR2Vja299LGU9ZC5nZXRGaXJzdE1hdGNoKC9nZWNrb1wvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fSx7dGVzdDpbLyhhcHBsZSk/d2Via2l0XC81MzdcLjM2L2ldLGRlc2NyaWJlKCl7cmV0dXJue25hbWU6c2UuQmxpbmt9fX0se3Rlc3Q6Wy8oYXBwbGUpP3dlYmtpdC9pXSxkZXNjcmliZShyKXtjb25zdCB0PXtuYW1lOnNlLldlYktpdH0sZT1kLmdldEZpcnN0TWF0Y2goL3dlYmtpdFwvKFxkKyhcLj9fP1xkKykrKS9pLHIpO3JldHVybiBlJiYodC52ZXJzaW9uPWUpLHR9fV07Y2xhc3MgRnJ7Y29uc3RydWN0b3IodCxlPSExLHM9bnVsbCl7aWYodD09bnVsbHx8dD09PSIiKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHBhcmFtZXRlciBjYW4ndCBiZSBlbXB0eSIpO3RoaXMuX3VhPXQ7bGV0IG49ITE7dHlwZW9mIGU9PSJib29sZWFuIj8obj1lLHRoaXMuX2hpbnRzPXMpOmUhPW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0Ij90aGlzLl9oaW50cz1lOnRoaXMuX2hpbnRzPW51bGwsdGhpcy5wYXJzZWRSZXN1bHQ9e30sbiE9PSEwJiZ0aGlzLnBhcnNlKCl9Z2V0SGludHMoKXtyZXR1cm4gdGhpcy5faGludHN9aGFzQnJhbmQodCl7aWYoIXRoaXMuX2hpbnRzfHwhQXJyYXkuaXNBcnJheSh0aGlzLl9oaW50cy5icmFuZHMpKXJldHVybiExO2NvbnN0IGU9dC50b0xvd2VyQ2FzZSgpO3JldHVybiB0aGlzLl9oaW50cy5icmFuZHMuc29tZShzPT5zLmJyYW5kJiZzLmJyYW5kLnRvTG93ZXJDYXNlKCk9PT1lKX1nZXRCcmFuZFZlcnNpb24odCl7aWYoIXRoaXMuX2hpbnRzfHwhQXJyYXkuaXNBcnJheSh0aGlzLl9oaW50cy5icmFuZHMpKXJldHVybjtjb25zdCBlPXQudG9Mb3dlckNhc2UoKSxzPXRoaXMuX2hpbnRzLmJyYW5kcy5maW5kKG49Pm4uYnJhbmQmJm4uYnJhbmQudG9Mb3dlckNhc2UoKT09PWUpO3JldHVybiBzP3MudmVyc2lvbjp2b2lkIDB9Z2V0VUEoKXtyZXR1cm4gdGhpcy5fdWF9dGVzdCh0KXtyZXR1cm4gdC50ZXN0KHRoaXMuX3VhKX1wYXJzZUJyb3dzZXIoKXt0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyPXt9O2NvbnN0IHQ9ZC5maW5kKF9pLGU9PntpZih0eXBlb2YgZS50ZXN0PT0iZnVuY3Rpb24iKXJldHVybiBlLnRlc3QodGhpcyk7aWYoQXJyYXkuaXNBcnJheShlLnRlc3QpKXJldHVybiBlLnRlc3Quc29tZShzPT50aGlzLnRlc3QocykpO3Rocm93IG5ldyBFcnJvcigiQnJvd3NlcidzIHRlc3QgZnVuY3Rpb24gaXMgbm90IHZhbGlkIil9KTtyZXR1cm4gdCYmKHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI9dC5kZXNjcmliZSh0aGlzLmdldFVBKCksdGhpcykpLHRoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXJ9Z2V0QnJvd3Nlcigpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5icm93c2VyP3RoaXMucGFyc2VkUmVzdWx0LmJyb3dzZXI6dGhpcy5wYXJzZUJyb3dzZXIoKX1nZXRCcm93c2VyTmFtZSh0KXtyZXR1cm4gdD9TdHJpbmcodGhpcy5nZXRCcm93c2VyKCkubmFtZSkudG9Mb3dlckNhc2UoKXx8IiI6dGhpcy5nZXRCcm93c2VyKCkubmFtZXx8IiJ9Z2V0QnJvd3NlclZlcnNpb24oKXtyZXR1cm4gdGhpcy5nZXRCcm93c2VyKCkudmVyc2lvbn1nZXRPUygpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5vcz90aGlzLnBhcnNlZFJlc3VsdC5vczp0aGlzLnBhcnNlT1MoKX1wYXJzZU9TKCl7dGhpcy5wYXJzZWRSZXN1bHQub3M9e307Y29uc3QgdD1kLmZpbmQoQWksZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihBcnJheS5pc0FycmF5KGUudGVzdCkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQub3M9dC5kZXNjcmliZSh0aGlzLmdldFVBKCkpKSx0aGlzLnBhcnNlZFJlc3VsdC5vc31nZXRPU05hbWUodCl7Y29uc3R7bmFtZTplfT10aGlzLmdldE9TKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifWdldE9TVmVyc2lvbigpe3JldHVybiB0aGlzLmdldE9TKCkudmVyc2lvbn1nZXRQbGF0Zm9ybSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT90aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybTp0aGlzLnBhcnNlUGxhdGZvcm0oKX1nZXRQbGF0Zm9ybVR5cGUodD0hMSl7Y29uc3R7dHlwZTplfT10aGlzLmdldFBsYXRmb3JtKCk7cmV0dXJuIHQ/U3RyaW5nKGUpLnRvTG93ZXJDYXNlKCl8fCIiOmV8fCIifXBhcnNlUGxhdGZvcm0oKXt0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT17fTtjb25zdCB0PWQuZmluZChMaSxlPT57aWYodHlwZW9mIGUudGVzdD09ImZ1bmN0aW9uIilyZXR1cm4gZS50ZXN0KHRoaXMpO2lmKEFycmF5LmlzQXJyYXkoZS50ZXN0KSlyZXR1cm4gZS50ZXN0LnNvbWUocz0+dGhpcy50ZXN0KHMpKTt0aHJvdyBuZXcgRXJyb3IoIkJyb3dzZXIncyB0ZXN0IGZ1bmN0aW9uIGlzIG5vdCB2YWxpZCIpfSk7cmV0dXJuIHQmJih0aGlzLnBhcnNlZFJlc3VsdC5wbGF0Zm9ybT10LmRlc2NyaWJlKHRoaXMuZ2V0VUEoKSkpLHRoaXMucGFyc2VkUmVzdWx0LnBsYXRmb3JtfWdldEVuZ2luZSgpe3JldHVybiB0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU/dGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lOnRoaXMucGFyc2VFbmdpbmUoKX1nZXRFbmdpbmVOYW1lKHQpe3JldHVybiB0P1N0cmluZyh0aGlzLmdldEVuZ2luZSgpLm5hbWUpLnRvTG93ZXJDYXNlKCl8fCIiOnRoaXMuZ2V0RW5naW5lKCkubmFtZXx8IiJ9cGFyc2VFbmdpbmUoKXt0aGlzLnBhcnNlZFJlc3VsdC5lbmdpbmU9e307Y29uc3QgdD1kLmZpbmQoT2ksZT0+e2lmKHR5cGVvZiBlLnRlc3Q9PSJmdW5jdGlvbiIpcmV0dXJuIGUudGVzdCh0aGlzKTtpZihBcnJheS5pc0FycmF5KGUudGVzdCkpcmV0dXJuIGUudGVzdC5zb21lKHM9PnRoaXMudGVzdChzKSk7dGhyb3cgbmV3IEVycm9yKCJCcm93c2VyJ3MgdGVzdCBmdW5jdGlvbiBpcyBub3QgdmFsaWQiKX0pO3JldHVybiB0JiYodGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lPXQuZGVzY3JpYmUodGhpcy5nZXRVQSgpKSksdGhpcy5wYXJzZWRSZXN1bHQuZW5naW5lfXBhcnNlKCl7cmV0dXJuIHRoaXMucGFyc2VCcm93c2VyKCksdGhpcy5wYXJzZU9TKCksdGhpcy5wYXJzZVBsYXRmb3JtKCksdGhpcy5wYXJzZUVuZ2luZSgpLHRoaXN9Z2V0UmVzdWx0KCl7cmV0dXJuIGQuYXNzaWduKHt9LHRoaXMucGFyc2VkUmVzdWx0KX1zYXRpc2ZpZXModCl7Y29uc3QgZT17fTtsZXQgcz0wO2NvbnN0IG49e307bGV0IGk9MDtpZihPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGw9Pntjb25zdCBvPXRbbF07dHlwZW9mIG89PSJzdHJpbmciPyhuW2xdPW8saSs9MSk6dHlwZW9mIG89PSJvYmplY3QiJiYoZVtsXT1vLHMrPTEpfSkscz4wKXtjb25zdCBsPU9iamVjdC5rZXlzKGUpLG89ZC5maW5kKGwsZz0+dGhpcy5pc09TKGcpKTtpZihvKXtjb25zdCBnPXRoaXMuc2F0aXNmaWVzKGVbb10pO2lmKGchPT12b2lkIDApcmV0dXJuIGd9Y29uc3QgbT1kLmZpbmQobCxnPT50aGlzLmlzUGxhdGZvcm0oZykpO2lmKG0pe2NvbnN0IGc9dGhpcy5zYXRpc2ZpZXMoZVttXSk7aWYoZyE9PXZvaWQgMClyZXR1cm4gZ319aWYoaT4wKXtjb25zdCBsPU9iamVjdC5rZXlzKG4pLG89ZC5maW5kKGwsbT0+dGhpcy5pc0Jyb3dzZXIobSwhMCkpO2lmKG8hPT12b2lkIDApcmV0dXJuIHRoaXMuY29tcGFyZVZlcnNpb24obltvXSl9fWlzQnJvd3Nlcih0LGU9ITEpe2NvbnN0IHM9dGhpcy5nZXRCcm93c2VyTmFtZSgpLnRvTG93ZXJDYXNlKCk7bGV0IG49dC50b0xvd2VyQ2FzZSgpO2NvbnN0IGk9ZC5nZXRCcm93c2VyVHlwZUJ5QWxpYXMobik7cmV0dXJuIGUmJmkmJihuPWkudG9Mb3dlckNhc2UoKSksbj09PXN9Y29tcGFyZVZlcnNpb24odCl7bGV0IGU9WzBdLHM9dCxuPSExO2NvbnN0IGk9dGhpcy5nZXRCcm93c2VyVmVyc2lvbigpO2lmKHR5cGVvZiBpPT0ic3RyaW5nIilyZXR1cm4gdFswXT09PSI+Inx8dFswXT09PSI8Ij8ocz10LnN1YnN0cigxKSx0WzFdPT09Ij0iPyhuPSEwLHM9dC5zdWJzdHIoMikpOmU9W10sdFswXT09PSI+Ij9lLnB1c2goMSk6ZS5wdXNoKC0xKSk6dFswXT09PSI9Ij9zPXQuc3Vic3RyKDEpOnRbMF09PT0ifiImJihuPSEwLHM9dC5zdWJzdHIoMSkpLGUuaW5kZXhPZihkLmNvbXBhcmVWZXJzaW9ucyhpLHMsbikpPi0xfWlzT1ModCl7cmV0dXJuIHRoaXMuZ2V0T1NOYW1lKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzUGxhdGZvcm0odCl7cmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1UeXBlKCEwKT09PVN0cmluZyh0KS50b0xvd2VyQ2FzZSgpfWlzRW5naW5lKHQpe3JldHVybiB0aGlzLmdldEVuZ2luZU5hbWUoITApPT09U3RyaW5nKHQpLnRvTG93ZXJDYXNlKCl9aXModCxlPSExKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXIodCxlKXx8dGhpcy5pc09TKHQpfHx0aGlzLmlzUGxhdGZvcm0odCl9c29tZSh0PVtdKXtyZXR1cm4gdC5zb21lKGU9PnRoaXMuaXMoZSkpfX0vKiEKICogQm93c2VyIC0gYSBicm93c2VyIGRldGVjdG9yCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ib3dzZXItanMvYm93c2VyCiAqIE1JVCBMaWNlbnNlIHwgKGMpIER1c3RpbiBEaWF6IDIwMTItMjAxNQogKiBNSVQgTGljZW5zZSB8IChjKSBEZW5pcyBEZW1jaGVua28gMjAxNS0yMDE5CiAqL2NsYXNzIERpe3N0YXRpYyBnZXRQYXJzZXIodCxlPSExLHM9bnVsbCl7aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IG5ldyBFcnJvcigiVXNlckFnZW50IHNob3VsZCBiZSBhIHN0cmluZyIpO3JldHVybiBuZXcgRnIodCxlLHMpfXN0YXRpYyBwYXJzZSh0LGU9bnVsbCl7cmV0dXJuIG5ldyBGcih0LGUpLmdldFJlc3VsdCgpfXN0YXRpYyBnZXQgQlJPV1NFUl9NQVAoKXtyZXR1cm4gQnJ9c3RhdGljIGdldCBFTkdJTkVfTUFQKCl7cmV0dXJuIHNlfXN0YXRpYyBnZXQgT1NfTUFQKCl7cmV0dXJuIEt9c3RhdGljIGdldCBQTEFURk9STVNfTUFQKCl7cmV0dXJuIGt9fWNvbnN0IEVlPSJjaHJvbWUiLHhyPSJvcGVyYSIsanI9ImZpcmVmb3giLFVyPSJpZXhwbG9yZXIiLEhyPSJzYWZhcmkiLEtyPSJud2pzIix6cj0iZWxlY3Ryb24iLFdyPSJyZWFjdC1uYXRpdmUiLFB0PSJ1bmtub3duIixjdD17Q2hyb21lOkVlLENocm9taXVtOkVlLE9wZXJhOnhyLEZpcmVmb3g6anIsIkludGVybmV0IEV4cGxvcmVyIjpVcixTYWZhcmk6SHJ9O2Z1bmN0aW9uIE5pKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcix0PXtuYW1lOlB0LHZlcnNpb246dm9pZCAwfTtpZihyLm1hdGNoKC9DaHJvbWUvKSYmIXIubWF0Y2goL0VkZ2UvKSlpZihyLm1hdGNoKC9FZGcoQT8pLykpe2NvbnN0IGU9ci5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdO051bWJlci5wYXJzZUludChlLDEwKT43MiYmKHQubmFtZT1FZSx0LnZlcnNpb249ZSl9ZWxzZSB0Lm5hbWU9RWUsdC52ZXJzaW9uPXIubWF0Y2goL0Nocm9tZVwvKFtcZC5dKykvKVsxXTtyZXR1cm4gdH1mdW5jdGlvbiBWaSgpe2NvbnN0e3VzZXJBZ2VudDpyfT1uYXZpZ2F0b3I7aWYoci5tYXRjaCgvRWxlY3Ryb24vKSl7Y29uc3QgdD1yLm1hdGNoKC9FbGVjdHJvblwvKFtcZC5dKykvKVsxXTtyZXR1cm57bmFtZTp6cix2ZXJzaW9uOnR9fXJldHVybiBudWxsfWZ1bmN0aW9uIEJpKCl7Y29uc3R7dXNlckFnZW50OnJ9PW5hdmlnYXRvcjtpZihyLm1hdGNoKC9KaXRzaU1lZXROVy8pKXtjb25zdCB0PXIubWF0Y2goL0ppdHNpTWVldE5XXC8oW1xkLl0rKS8pWzFdO3JldHVybntuYW1lOktyLHZlcnNpb246dH19fWZ1bmN0aW9uIEZpKCl7Y29uc3Qgcj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9cYihyZWFjdFsgXHRfLV0qbmF0aXZlKSg/OlwvKFxTKykpPy9pKTtsZXQgdDtpZihyfHxuYXZpZ2F0b3IucHJvZHVjdD09PSJSZWFjdE5hdGl2ZSIpcmV0dXJuIHImJnIubGVuZ3RoPjImJihyWzFdLHQ9clsyXSksdHx8KHQ9InVua25vd24iKSx7bmFtZTpXcix2ZXJzaW9uOnR9fWZ1bmN0aW9uIHhpKHIpe2xldCB0O2NvbnN0IGU9W0ZpLFZpLEJpXTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTEpaWYodD1lW25dKCksdClyZXR1cm4gdDtjb25zdCBzPXIuZ2V0QnJvd3Nlck5hbWUoKTtyZXR1cm4gcyBpbiBjdD97bmFtZTpjdFtzXSx2ZXJzaW9uOnIuZ2V0QnJvd3NlclZlcnNpb24oKX06KHQ9TmkoKSx0fHx7bmFtZTpQdCx2ZXJzaW9uOnZvaWQgMH0pfWNsYXNzIGppe2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJfYm93c2VyIik7cCh0aGlzLCJfbmFtZSIpO3AodGhpcywiX3ZlcnNpb24iKTtwKHRoaXMsImdldERldmljZUluZm8iLCgpPT4oe2lzTW9iaWxlOnRoaXMuaXNNb2JpbGUoKSxicm93c2VyTmFtZTp0aGlzLl9ib3dzZXIuZ2V0QnJvd3Nlck5hbWUoKSxvc05hbWU6dGhpcy5fYm93c2VyLmdldE9TTmFtZSgpLGJyb3dzZXJWZXJzaW9uOnRoaXMuX2Jvd3Nlci5nZXRCcm93c2VyVmVyc2lvbigpLG9zVmVyc2lvbk5hbWU6dGhpcy5fYm93c2VyLmdldE9TVmVyc2lvbigpLGVuZ2luZU5hbWU6dGhpcy5fYm93c2VyLmdldEVuZ2luZU5hbWUoKX0pKX1pbml0KHQpe2xldCBlLHM7aWYodGhpcy5fYm93c2VyPURpLmdldFBhcnNlcihuYXZpZ2F0b3IudXNlckFnZW50KSx0eXBlb2YgdD09InVuZGVmaW5lZCIpe2NvbnN0IG49eGkodGhpcy5fYm93c2VyKTtlPW4ubmFtZSxzPW4udmVyc2lvbn1lbHNlIHQubmFtZSBpbiBjdD8oZT1jdFt0Lm5hbWVdLHM9dC52ZXJzaW9uKTooZT1QdCxzPXZvaWQgMCk7dGhpcy5fbmFtZT1lLHRoaXMuX3ZlcnNpb249c31nZXROYW1lKCl7cmV0dXJuIHRoaXMuX25hbWV9aXNDaHJvbWUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUVlfWlzT3BlcmEoKXtyZXR1cm4gdGhpcy5fbmFtZT09PXhyfWlzRmlyZWZveCgpe3JldHVybiB0aGlzLl9uYW1lPT09anJ9aXNJRXhwbG9yZXIoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVVyfWlzU2FmYXJpKCl7cmV0dXJuIHRoaXMuX25hbWU9PT1Icn1pc05XSlMoKXtyZXR1cm4gdGhpcy5fbmFtZT09PUtyfWlzRWxlY3Ryb24oKXtyZXR1cm4gdGhpcy5fbmFtZT09PXpyfWlzUmVhY3ROYXRpdmUoKXtyZXR1cm4gdGhpcy5fbmFtZT09PVdyfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZT09PSEwfWdldFZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1pc01vYmlsZSgpe3JldHVybiB0aGlzLl9ib3dzZXIuZ2V0UGxhdGZvcm1UeXBlKCk9PT0ibW9iaWxlIn1fY2hlY2tDb25kaXRpb24odCl7aWYodGhpcy5fdmVyc2lvbilyZXR1cm4gdGhpcy5fYm93c2VyLnNhdGlzZmllcyh0KX1pc1ZlcnNpb25HcmVhdGVyVGhhbih0KXtyZXR1cm4gdGhpcy5fY2hlY2tDb25kaXRpb24oe1t0aGlzLl9uYW1lXTpgPiR7dH1gfSl9aXNWZXJzaW9uTGVzc1RoYW4odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YDwke3R9YH0pfWlzVmVyc2lvbkVxdWFsVG8odCl7cmV0dXJuIHRoaXMuX2NoZWNrQ29uZGl0aW9uKHtbdGhpcy5fbmFtZV06YH4ke3R9YH0pfX1jbGFzcyBVaSBleHRlbmRzIGppe2RvZXNWaWRlb011dGVCeVN0cmVhbVJlbW92ZSgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1AyUCgpe3JldHVybiF0aGlzLnVzZXNVbmlmaWVkUGxhbigpfWlzQ2hyb21pdW1CYXNlZCgpe3JldHVybiB0aGlzLmlzQ2hyb21lKCl8fHRoaXMuaXNFbGVjdHJvbigpfHx0aGlzLmlzTldKUygpfHx0aGlzLmlzT3BlcmEoKX1pc1dlYktpdEJhc2VkKCl7cmV0dXJuIHRoaXMuX2Jvd3Nlci5pc0VuZ2luZSgid2Via2l0IikmJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIT0idW5kZWZpbmVkIiYmdHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhIT0idW5kZWZpbmVkIiYmdHlwZW9mIHdpbmRvdy5SVENSdHBUcmFuc2NlaXZlciE9InVuZGVmaW5lZCImJk9iamVjdC5rZXlzKFJUQ1J0cFRyYW5zY2VpdmVyLnByb3RvdHlwZSkuaW5kZXhPZigiY3VycmVudERpcmVjdGlvbiIpPi0xfWlzU3VwcG9ydGVkKCl7cmV0dXJuIHR5cGVvZiBSVENQZWVyQ29ubmVjdGlvbiE9InVuZGVmaW5lZCJ9aXNVc2VySW50ZXJhY3Rpb25SZXF1aXJlZEZvclVubXV0ZSgpe3JldHVybiB0aGlzLmlzRmlyZWZveCgpJiZ0aGlzLmlzVmVyc2lvbkxlc3NUaGFuKCI2OCIpfXN1cHBvcnRzVmlkZW9NdXRlT25Db25uSW50ZXJydXB0ZWQoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc1JlYWN0TmF0aXZlKCl8fHRoaXMuaXNXZWJLaXRCYXNlZCgpfXN1cHBvcnRzQmFuZHdpZHRoU3RhdGlzdGljcygpe3JldHVybiF0aGlzLmlzRmlyZWZveCgpJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNDb2RlY1ByZWZlcmVuY2VzKCl7cmV0dXJuIHRoaXMudXNlc1VuaWZpZWRQbGFuKCkmJnR5cGVvZiB3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyh3aW5kb3cuUlRDUnRwVHJhbnNjZWl2ZXIucHJvdG90eXBlKS5pbmRleE9mKCJzZXRDb2RlY1ByZWZlcmVuY2VzIik+LTEmJk9iamVjdC5rZXlzKFJUQ1J0cFNlbmRlci5wcm90b3R5cGUpLmluZGV4T2YoImdldENhcGFiaWxpdGllcyIpPi0xJiYhdGhpcy5pc1dlYktpdEJhc2VkKCl9c3VwcG9ydHNEZXZpY2VDaGFuZ2VFdmVudCgpe3JldHVybiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5vbmRldmljZWNoYW5nZSE9InVuZGVmaW5lZCImJnR5cGVvZiBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmFkZEV2ZW50TGlzdGVuZXIhPSJ1bmRlZmluZWQifXN1cHBvcnRzTG9jYWxDYW5kaWRhdGVSdHRTdGF0aXN0aWNzKCl7cmV0dXJuIHRoaXMuaXNDaHJvbWl1bUJhc2VkKCl8fHRoaXMuaXNSZWFjdE5hdGl2ZSgpfHx0aGlzLmlzV2ViS2l0QmFzZWQoKX1zdXBwb3J0c1BlcmZvcm1hbmNlT2JzZXJ2ZXIoKXtyZXR1cm4gdHlwZW9mIHdpbmRvdy5QZXJmb3JtYW5jZU9ic2VydmVyIT0idW5kZWZpbmVkIiYmUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YoImxvbmd0YXNrIik+LTF9c3VwcG9ydHNSZWNlaXZlclN0YXRzKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3cuUlRDUnRwUmVjZWl2ZXIhPSJ1bmRlZmluZWQiJiZPYmplY3Qua2V5cyhSVENSdHBSZWNlaXZlci5wcm90b3R5cGUpLmluZGV4T2YoImdldFN5bmNocm9uaXphdGlvblNvdXJjZXMiKT4tMX1zdXBwb3J0c1JUVFN0YXRpc3RpY3MoKXtyZXR1cm4hdGhpcy5pc0ZpcmVmb3goKX11c2VzUGxhbkIoKXtyZXR1cm4hdGhpcy51c2VzVW5pZmllZFBsYW4oKX11c2VzU2RwTXVuZ2luZ0ZvclNpbXVsY2FzdCgpe3JldHVybiB0aGlzLmlzQ2hyb21pdW1CYXNlZCgpfHx0aGlzLmlzUmVhY3ROYXRpdmUoKXx8dGhpcy5pc1dlYktpdEJhc2VkKCl9dXNlc1VuaWZpZWRQbGFuKCl7cmV0dXJuISEodGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNOZXdHdW1GbG93KCl7cmV0dXJuISEodGhpcy5pc0Nocm9taXVtQmFzZWQoKXx8dGhpcy5pc0ZpcmVmb3goKXx8dGhpcy5pc1dlYktpdEJhc2VkKCkpfXVzZXNBZGFwdGVyKCl7cmV0dXJuIHRoaXMudXNlc05ld0d1bUZsb3coKX11c2VzUmlkc0ZvclNpbXVsY2FzdCgpe3JldHVybiExfXN1cHBvcnRzR2V0RGlzcGxheU1lZGlhKCl7cmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IuZ2V0RGlzcGxheU1lZGlhIT0idW5kZWZpbmVkInx8dHlwZW9mIG5hdmlnYXRvci5tZWRpYURldmljZXMhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXREaXNwbGF5TWVkaWEhPSJ1bmRlZmluZWQifXN1cHBvcnRzSW5zZXJ0YWJsZVN0cmVhbXMoKXtpZighKHR5cGVvZiB3aW5kb3cuUlRDUnRwU2VuZGVyIT0idW5kZWZpbmVkIiYmKHdpbmRvdy5SVENSdHBTZW5kZXIucHJvdG90eXBlLmNyZWF0ZUVuY29kZWRTdHJlYW1zfHx3aW5kb3cuUlRDUnRwU2VuZGVyLnByb3RvdHlwZS5jcmVhdGVFbmNvZGVkVmlkZW9TdHJlYW1zKSkpcmV0dXJuITE7Y29uc3QgdD1uZXcgUmVhZGFibGVTdHJlYW07dHJ5e3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCwiKiIsW3RdKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19c3VwcG9ydHNBdWRpb1JlZCgpe3JldHVybiBCb29sZWFuKHdpbmRvdy5SVENSdHBTZW5kZXImJndpbmRvdy5SVENSdHBTZW5kZXIuZ2V0Q2FwYWJpbGl0aWVzJiZ3aW5kb3cuUlRDUnRwU2VuZGVyLmdldENhcGFiaWxpdGllcygiYXVkaW8iKS5jb2RlY3Muc29tZSh0PT50Lm1pbWVUeXBlPT09ImF1ZGlvL3JlZCIpJiZ3aW5kb3cuUlRDUnRwUmVjZWl2ZXImJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMmJndpbmRvdy5SVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMoImF1ZGlvIikuY29kZWNzLnNvbWUodD0+dC5taW1lVHlwZT09PSJhdWRpby9yZWQiKSl9c3VwcG9ydHNTZHBTZW1hbnRpY3MoKXtyZXR1cm4gdGhpcy5pc0Nocm9taXVtQmFzZWQoKX1fZ2V0Q2hyb21pdW1CYXNlZFZlcnNpb24oKXtpZih0aGlzLmlzQ2hyb21pdW1CYXNlZCgpKXtpZih0aGlzLmlzTldKUygpKXJldHVybiBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5jaHJvbWl1bSwxMCk7Y29uc3QgdD1uYXZpZ2F0b3IudXNlckFnZW50O2lmKHQubWF0Y2goL0Nocm9tZS8pKXJldHVybiBOdW1iZXIucGFyc2VJbnQodC5tYXRjaCgvQ2hyb21lXC8oW1xkLl0rKS8pWzFdLDEwKX1yZXR1cm4tMX1pc0lPU01vYmlsZSgpe3JldHVybiB0aGlzLmlzTW9iaWxlJiZ0aGlzLl9ib3dzZXIuZ2V0T1NOYW1lKCk9PT0iaU9TIn19Y29uc3QgSGk9bmV3IFVpO2NsYXNzIEtpe2NvbnN0cnVjdG9yKCl7cCh0aGlzLCJsb2dzQ2FjaGUiLFtdKTtwKHRoaXMsImxvZ3NQcm9jZXNzb3JUaW1lciIpO3AodGhpcywiY29tcHJlc3Npb25TdXBwb3J0ZWQiLG51bGwpO3AodGhpcywidHJhY2luZ0VuYWJsZWQiLCEwKTtwKHRoaXMsImluaXRpYWxpemVkIiwhMSk7cCh0aGlzLCJsb2dMZXZlbCIsImxvZyIpO3AodGhpcywibG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCIsN2UzKTtwKHRoaXMsImxvZ0V4Y2x1c2lvbkxpc3QiLFsibWVzc2FnZSIsIndlYnNvY2tldC9tZXNzYWdlIiwicm9vbU1lc3NhZ2UiLCJ3ZWJzb2NrZXQvcm9vbS1tZXNzYWdlIiwid2Vic29ja2V0L3Jvb20tbGVnYWN5LW1vZGUiLCJjaGF0TWVzc2FnZSIsIndlYnNvY2tldC9uZXctY2hhdC1tZXNzYWdlIiwid2Vic29ja2V0L25vLWFjdGl2ZS1zcGVha2VyIiwid2Vic29ja2V0L3NlbGVjdGVkLXBlZXJzIiwid2Vic29ja2V0L2FjdGl2ZS1zcGVha2VyIiwicGluZyIsIndlYnNvY2tldC9uZXctY29uc3VtZXIiLCJ3ZWJzb2NrZXQvcHJvZHVjZXItc2NvcmUiLCJ3ZWJzb2NrZXQvY29uc3VtZXItc2NvcmUiLCJ3ZWJzb2NrZXQvcGx1Z2luLWV2ZW50Iiwid2Vic29ja2V0L3BsdWdpbi1kYXRhIiwid2Vic29ja2V0L3BsdWdpbi1pbnRlcm5hbC1kYXRhIl0pO3AodGhpcywibWVldGluZ01ldGFkYXRhIix7fSl9aXNDb21wcmVzc2lvblN1cHBvcnRlZCgpe2lmKHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWQ9PT1udWxsKXRyeXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPXR5cGVvZiBDb21wcmVzc2lvblN0cmVhbSE9InVuZGVmaW5lZCImJnR5cGVvZiBCbG9iIT0idW5kZWZpbmVkIiYmdHlwZW9mIEJsb2IucHJvdG90eXBlLnN0cmVhbT09ImZ1bmN0aW9uIiYmdHlwZW9mIFJlc3BvbnNlIT0idW5kZWZpbmVkIn1jYXRjaCh0KXt0aGlzLmNvbXByZXNzaW9uU3VwcG9ydGVkPSExLHRoaXMuYWRkTG9nSW5DdXJyZW50U3Bhbigid2FybiIsIkNvbXByZXNzaW9uIGZlYXR1cmUgZGV0ZWN0aW9uIGZhaWxlZCwgdXNpbmcgdW5jb21wcmVzc2VkIGxvZ3MiLHtlcnJvcjp0fSl9cmV0dXJuIHRoaXMuY29tcHJlc3Npb25TdXBwb3J0ZWR9Z2V0IGxvZ3NFbmRwb2ludCgpe2NvbnN0IHQ9VGUuZ2V0Q29udGV4dCh0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpO3JldHVybmBodHRwczovLyR7d2koe3NlcnZpY2VQcmVmaXg6ImFwaS1zaWxvcyIsYmFzZVVSSTp0LmdldFZhbHVlKCJiYXNlVVJJIil9KX0vb3RlbC9sb2dzYH1nZXQgbG9nc0JhdGNoU2l6ZSgpe3JldHVybiB0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKT81MDoyNX1yZXNldFBlZXJJZCh0KXt0aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQ9dH1pbml0KHQsZSxzLG4pe3RoaXMudHJhY2luZ0VuYWJsZWQ9ITAsdGhpcy5pbml0aWFsaXplZD0hMSxuJiYodGhpcy5sb2dMZXZlbD1uKSx0aGlzLmxvZ3NDYWNoZT1bXTtjb25zdCBpPXQuZ2V0VmFsdWUoInBlZXJJZCIpO3RoaXMubWVldGluZ01ldGFkYXRhPWUsdGhpcy50cmFjaW5nRW5hYmxlZD1zLHRoaXMubWVldGluZ01ldGFkYXRhLnBlZXJJZD1pLHRoaXMubWVldGluZ01ldGFkYXRhLnNka1ZlcnNpb249dC5nZXRWYWx1ZSgic2RrVmVyc2lvbiIpO2NvbnN0e1JORGV2aWNlSW5mb0ltcGw6YX09bmF2aWdhdG9yO3RoaXMubWVldGluZ01ldGFkYXRhLmRldmljZUluZm89bmF2aWdhdG9yLmlzUmVhY3ROYXRpdmU/YT09bnVsbD92b2lkIDA6YS5nZXREZXZpY2VJbmZvKCk6SGkuZ2V0RGV2aWNlSW5mbygpLHRoaXMubWVldGluZ01ldGFkYXRhLnZpc2l0ZWRVcmw9IW5hdmlnYXRvci5pc1JlYWN0TmF0aXZlJiZ0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmxvY2F0aW9uLmhyZWYsdGhpcy5sb2dzUHJvY2Vzc29yVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnRoaXMucHJvY2Vzc0NhY2hlZExvZ3MoKS5jYXRjaCgoKT0+e30pLHRoaXMubG9nc1Byb2Nlc3NpbmdJbnRlcnZhbCkscyYmKHRoaXMuaW5pdGlhbGl6ZWQ9ITApfXN0YXRpYyB0cmFjZSh0LGU9dm9pZCAwKXtyZXR1cm4ocyxuLGkpPT57Y29uc3QgYT1pLnZhbHVlO3JldHVybiBpLnZhbHVlPWZ1bmN0aW9uKC4uLm8pe2NvbnN0IG09dGhpcz09bnVsbD92b2lkIDA6dGhpcy50ZWxlbWV0cnk7aWYoIW18fCFtLmluaXRpYWxpemVkfHxuYXZpZ2F0b3IuaXNSZWFjdE5hdGl2ZXx8IW0udHJhY2luZ0VuYWJsZWQpcmV0dXJuIGEuYXBwbHkodGhpcyxvKTttLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLHQsZSk7Y29uc3QgZz1wZXJmb3JtYW5jZS5ub3coKSx5PWEuYXBwbHkodGhpcyxvKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHkpLnRoZW4oKCk9Pntjb25zdCBUPXBlcmZvcm1hbmNlLm5vdygpO1QtZz4xMCYmbS5hZGRMb2dJbkN1cnJlbnRTcGFuKCJpbmZvIixgJHt0fV90aW1pbmdgLHtleGVjVGltZTpULWd9KX0pLmNhdGNoKCgpPT57Y29uc3QgVD1wZXJmb3JtYW5jZS5ub3coKTttLmFkZExvZ0luQ3VycmVudFNwYW4oImluZm8iLGAke3R9X3RpbWluZ2Ase2V4ZWNUaW1lOlQtZ30pfSkseX0saX19aW5qZWN0Q29udGV4dCh0KXt2YXIgbjtjb25zdCBlPU5zKCkucmVwbGFjZSgvLS9nLCIiKS5zdWJzdHJpbmcoMCwxNikscz0obj10aGlzLm1lZXRpbmdNZXRhZGF0YS5wZWVySWQpPT1udWxsP3ZvaWQgMDpuLnJlcGxhY2UoLy0vZywiIik7dC5UUkFDRVBBUkVOVD1gMDAtJHtzfS0ke2V9LTAxYH1hZGRMb2dJbkN1cnJlbnRTcGFuKHQsZSxzPXt9LG49ITEpe3MhPW51bGwmJnMuZXJyb3ImJk9iamVjdC5hc3NpZ24ocyx7ZXJyb3I6b3Qocy5lcnJvcil9KTtjb25zdCBpPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKTtpZihEcihpKSYmKENpKHMpP2NvbnNvbGVbdF0oIkludGVybmFsTG9nczo6ICIsdCxlKTpjb25zb2xlW3RdKCJJbnRlcm5hbExvZ3M6OiAiLHQsZSxzKSksISFNaShpLHQpKXRyeXtjb25zdCBsPVZyKGksZSxzLCJtZXRhZGF0YSIpLG89bmV3IERhdGUsbT1RZShHKHttZXNzYWdlOmUsbGV2ZWw6dH0sbCkse2xvZ2dlZEF0Om8udG9JU09TdHJpbmcoKSxsb2dnZWRBdFR6T2Zmc2V0Om8uZ2V0VGltZXpvbmVPZmZzZXQoKX0pO24/dGhpcy5zZW5kT3RlbExvZ3NUb05ld1JlbGljKFttXSx7aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pLmNhdGNoKCgpPT57fSk6dGhpcy5sb2dzQ2FjaGUucHVzaChtKX1jYXRjaChsKXt0aGlzLmFkZExvZ0luQ3VycmVudFNwYW4oImVycm9yIiwib3BlbnRlbGVtZXRyeTo6YWRkTG9nSW5DdXJyZW50U3Bhbl9mYWlsZWQiLHtlcnJvcjpvdChsKX0pfX1zZW5kT3RlbExvZ3NUb05ld1JlbGljKHMpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih0LHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOmU9ITF9PXtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiExfSl7Y29uc3Qgbj1uZXcgQWJvcnRDb250cm9sbGVyLGk9c2V0VGltZW91dCgoKT0+bi5hYm9ydCgiTG9ncyByZXF1ZXN0IHRpbWVkIG91dCBhZnRlciA4IHNlY29uZHMiKSw4ZTMpO3RyeXtjb25zdCBhPVRlLmdldENvbnRleHQodGhpcy5tZWV0aW5nTWV0YWRhdGEucGVlcklkKSxsPUpTT04uc3RyaW5naWZ5KHttZWV0aW5nTWV0YWRhdGE6VnIoYSwic2VuZE90ZWxMb2dzVG9OZXdSZWxpYyIsdGhpcy5tZWV0aW5nTWV0YWRhdGEsIm1lZXRpbmdNZXRhZGF0YSIpLHNlcnZpY2VOYW1lOmEuZ2V0VmFsdWUoInNka05hbWUiKSxsb2dzOnR9KTtsZXQgbztjb25zdCBtPXtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHthLmdldFZhbHVlKCJhdXRoVG9rZW4iKX1gfTtpZih0aGlzLmlzQ29tcHJlc3Npb25TdXBwb3J0ZWQoKSl7Y29uc3QgZz1uZXcgQmxvYihbbF0pLnN0cmVhbSgpLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSgiZ3ppcCIpKTtvPXlpZWxkIG5ldyBSZXNwb25zZShnKS5hcnJheUJ1ZmZlcigpLG1bIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9nemlwIixtWyJDb250ZW50LUVuY29kaW5nIl09Imd6aXAifWVsc2Ugbz1sLG1bIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi9qc29uIjt5aWVsZCBmZXRjaCh0aGlzLmxvZ3NFbmRwb2ludCx7bWV0aG9kOiJQT1NUIixoZWFkZXJzOm0sYm9keTpvLHNpZ25hbDpuLnNpZ25hbCxrZWVwYWxpdmU6ISFlfSl9Y2F0Y2goYSl7ZXx8KHRoaXMuYWRkTG9nSW5DdXJyZW50U3BhbigiZXJyb3IiLCJvcGVudGVsZW1ldHJ5OjpzZW5kT3RlbExvZ1RvTmV3UmVsaWNfZmFpbGVkIix7ZXJyb3I6b3QoYSl9KSx0aGlzLmxvZ3NDYWNoZS5wdXNoKC4uLnQpKX1maW5hbGx5e2NsZWFyVGltZW91dChpKX19KX1wcm9jZXNzQ2FjaGVkTG9ncygpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKih7aXNJbkRlc3RydWN0aW9uTW9kZTp0PSExfT17aXNJbkRlc3RydWN0aW9uTW9kZTohMX0pe2NvbnN0IGU9dGhpcy5sb2dzQ2FjaGUuc3BsaWNlKDAsdGhpcy5sb2dzQmF0Y2hTaXplKTtlIT1udWxsJiZlLmxlbmd0aCYmKHlpZWxkIHRoaXMuc2VuZE90ZWxMb2dzVG9OZXdSZWxpYyhlLHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOnR9KSl9KX1kZXN0cnVjdCgpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtmb3IoY2xlYXJJbnRlcnZhbCh0aGlzLmxvZ3NQcm9jZXNzb3JUaW1lcik7dGhpcy5sb2dzQ2FjaGUubGVuZ3RoOyl5aWVsZCB0aGlzLnByb2Nlc3NDYWNoZWRMb2dzKHtpc0luRGVzdHJ1Y3Rpb25Nb2RlOiEwfSl9KX19ZnVuY3Rpb24gemkocil7Y29uc3QgdD1HKHt9LHIpLGU9bmV3IE1hcCxzPShtLGcpPT4oZS5oYXMobSl8fGUuc2V0KG0sbmV3IFNldCksZS5nZXQobSkuYWRkKGcpLCgpPT57dmFyIHk7cmV0dXJuKHk9ZS5nZXQobSkpPT1udWxsP3ZvaWQgMDp5LmRlbGV0ZShnKX0pLG49KG0sZyk9Pnt2YXIgeTsoeT1lLmdldChtKSk9PW51bGx8fHkuZGVsZXRlKGcpfSxpPW09Pnt2YXIgZzsoZz1lLmdldChtKSk9PW51bGx8fGcuZm9yRWFjaCh5PT57dHJ5e3kodFttXSl9Y2F0Y2goVCl7fX0pfTtyZXR1cm57c3Vic2NyaWJlOnMsdW5zdWJzY3JpYmU6bixub3RpZnk6aSxzZXRWYWx1ZToobSxnLHk9ITApPT57dFttXT1nLHkmJmkobSl9LGdldFZhbHVlOm09PnRbbV0sZ2V0QWxsVmFsdWVzOigpPT50fX1jbGFzcyBXaXtjb25zdHJ1Y3Rvcigpe3AodGhpcywiY29udGV4dHMiLG5ldyBNYXApO3AodGhpcywibW9zdFJlY2VudFBlZXJJZCIsbnVsbCl9Y3JlYXRlQ29udGV4dCh0LGUpe2lmKHRoaXMuY29udGV4dHMuaGFzKHQpKXJldHVybiB0aGlzLmNvbnRleHRzLmdldCh0KTtjb25zdCBzPW5ldyBLaSxuPW5ldyBJczt0aGlzLmNvbnRleHRzLnNldCh0LHppKGUpKSx0aGlzLmNvbnRleHRzLmdldCh0KS5zZXRWYWx1ZSgicGVlclNlc3Npb25TdG9yZSIsbmV3IG10KG4pKTtjb25zdCBpPW5ldyBwcjtyZXR1cm4gaS5zZXRNYXhMaXN0ZW5lcnMoNTApLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJsb2dnZXIiLG4pLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJ0ZWxlbWV0cnkiLHMpLHRoaXMuY29udGV4dHMuZ2V0KHQpLnNldFZhbHVlKCJjYWxsc3RhdHMiLGkpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuZ2V0KHQpfXJlbWFwQ29udGV4dCh0LGUpe2NvbnN0IHM9ZS5nZXRWYWx1ZSgicGVlcklkIik7cyE9PXQmJihlLnNldFZhbHVlKCJwZWVySWQiLHQpLHRoaXMubW9zdFJlY2VudFBlZXJJZD10LHRoaXMuY29udGV4dHMuc2V0KHQsZSksdGhpcy5jb250ZXh0cy5kZWxldGUocykpfWdldENvbnRleHQodCl7cmV0dXJuIHRoaXMuY29udGV4dHMuZ2V0KHQpfWdldE1vc3RSZWNlbnRQZWVySWQoKXtyZXR1cm4gdGhpcy5tb3N0UmVjZW50UGVlcklkfX12YXIgVGU9bmV3IFdpO2NvbnN0ICRpPXsiMDAiOiJDbGllbnQiLCIwMSI6IkNvbnRyb2xsZXIiLCIwMiI6IlJvb21Ob2RlQ2xpZW50IiwiMDMiOiJIaXZlTm9kZUNsaWVudCIsIjA0IjoiU29ja2V0U2VydmljZSIsIjA1IjoiQ2hhdCIsIjA2IjoiUGx1Z2luIiwiMDciOiJQb2xscyIsIjA4IjoiTWV0YSIsIjA5IjoiUHJlc2V0IiwxMDoiUmVjb3JkaW5nIiwxMToiU2VsZiIsMTI6IlBhcnRpY2lwYW50IiwxMzoiU3BvdGxpZ2h0IiwxNDoiUmVtb3RlIFJlcXVlc3QiLDE1OiJXZWJpbmFyIiwxNjoiTG9jYWxNZWRpYUhhbmRsZXIiLDE3OiJFbmQtRW5kIEVuY3J5cHRpb24iLDE4OiJBSSIsMTk6IkxpdmVzdHJlYW0iLDIwOiJTdGFnZSJ9LGR0PXsiMDAwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMDAxIjoiRmFpbGVkIHRvIGluaXRpYWxpemUuIiwiMDAwMiI6IkZhaWxlZCB0byBqb2luIHJvb20uIiwiMDAwMyI6IkZhaWxlZCB0byBsZWF2ZSByb29tLiIsIjAwMDQiOiJJbnZhbGlkIGF1dGggdG9rZW4iLCIwMDEwIjoiQnJvd3NlciBub3Qgc3VwcG9ydGVkIiwiMDAxMSI6IkhUVFAgTmV0d29yayBFcnJvciIsIjAwMTIiOiJXZWJzb2NrZXQgTmV0d29yayBFcnJvciIsIjAwMTMiOiJSYXRlIExpbWl0ZWQiLCIwMDE0IjoiRmFpbGVkIHRvIGVzdGFibGlzaCBtZWRpYSBjb25uZWN0aW9uLiIsIjAxMDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwMTAxIjoiUGVybWlzc2lvbiBkZW5pZWQiLCIwMTAyIjoiUHJlcmVxdWlzaXRlIG1vZHVsZSBtaXNzaW5nIiwiMDIwMCI6IkludGVybmFsIGV4Y2VwdGlvbi4iLCIwMzAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDQwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA0MDQiOiJNaXNzaW5nIHByZXJlcXVpc2l0ZXMgdG8gZXN0YWJsaXNoIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24iLCIwNTAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDUwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA1MDIiOiJJbnZhbGlkIG1lc3NhZ2UgYm9keS4iLCIwNTAzIjoiVGV4dCBNZXNzYWdlIGlzIHRvbyBsYXJnZSIsIjA1MDQiOiJNZXNzYWdlIG5vdCBmb3VuZCBieSB0aGUgZ2l2ZW4gaWQiLCIwNTA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwNTA2IjoiTWVzc2FnZSBzZWFyY2ggaXMgZGlzYWJsZWQiLCIwNjAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDYwMSI6IlBlcm1pc3Npb24gZGVuaWVkLiIsIjA2MDIiOiJBdXRoIHRva2VuIG5vdCBzZXQgZm9yIHBsdWdpbiIsIjA2MDMiOiJJZnJhbWUgd2FzIG5vdCBwcm92aWRlZCIsIjA3MDAiOiJJbnRlcm5hbCBleGNlcHRpb24iLCIwNzA1IjoiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLCIwODAwIjoiSW50ZXJuYWwgZXhjZXB0aW9uIiwiMDgwMSI6IlBlcm1pc3Npb24gZGVuaWVkIiwiMDkwMCI6IkludGVybmFsIGV4Y2VwdGlvbiIsIjA5MDQiOiJDb3VsZCBub3QgbG9hZCBwcmVzZXQiLDFlMzoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxMDAxOiJQZXJtaXNzaW9uIGRlbmllZCIsMTAwNDoiQ291bGQgbm90IGZpbmQgc3BlY2lmaWVkIHJlY29yZGluZyIsMTAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgaW4gZ2l2ZW4gcmVjb3JkaW5nIHN0YXRlIiwxMTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDExMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMTAyOiJVbnN1cHBvcnRlZCIsMTEwMzoiTmFtZSBjYW5ub3QgYmUgZW1wdHkiLDExMDQ6Ik5vIGRldmljZSBzZWxlY3RlZCB3aGlsZSBjYWxsaW5nIG1lZXRpbmcuc2VsZi5zZXREZXZpY2UiLDExMDU6IkFjdGlvbiBub3QgcGVybWl0dGVkIHdpdGhvdXQgam9pbmluZyByb29tIiwxMTA2OiJDYW4ndCBzZXQgY3VycmVudGx5IHVzZWQgZGV2aWNlIiwxMjAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDEyMDE6IlBlcm1pc3Npb24gZGVuaWVkIiwxMjAyOiJJbnZhbGlkIHBhZ2UgbnVtYmVyIHdhcyByZXF1ZXN0ZWQiLDEyMDM6IkludmFsaWQgcGFydGljaXBhbnQgY291bnQgcGVyIHBhZ2Ugd2FzIHJlcXVlc3RlZCIsMTIwNDoiTm8gcGFydGljaXBhbnRzIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBVc2VySWRzIiwxMjA1OiJBY3Rpb24gbm90IHBlcm1pdHRlZCB3aXRob3V0IGpvaW5pbmcgcm9vbSIsMTIwNjoiTWFudWFsIFN1YnNjcmlwdGlvbiBNb2RlIHdhcyBub3QgQUNUSVZBVEVEIiwxMjA3OiJJbnZhbGlkIHZpZXcgbW9kZSIsMTIwODoiTWFudWFsIFN1YnNjcmlwdGlvbiBub3QgZW5hYmxlZCBmb3Igb3JnYW5pemF0aW9uIiwxMjA5OiJCcm9hZGNhc3QgbWVzc2FnZSB0eXBlIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nIiwxMzAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE0MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTQwMjoiTm8gZXhpc3RpbmcgcmVtb3RlIHJlcXVlc3RzIiwxNDAzOiJObyBwZWVyIGV4aXN0cyB3aXRoIGdpdmVuIGlkIiwxNTAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE2MDA6IkludGVybmFsIGV4Y2VwdGlvbiIsMTYwMToiRmFpbGVkIHRvIGdldCBhdWRpbyB0cmFjayIsMTYwMjoiRmFpbGVkIHRvIGdldCB2aWRlbyB0cmFjayIsMTYwMzoiSW5jb3JyZWN0IGRldmljZSIsMTYwNDoiRmFpbGVkIHRvIGNoYW5nZSBkZXZpY2UiLDE2MDU6IkZhaWxlZCB0byBnZXQgYXVkaW8gJiB2aWRlbyB0cmFjayIsMTYwNjoiTm8gYXVkaW8gaW5wdXQgZGV2aWNlcyBhcmUgYXZhaWxhYmxlIiwxNjA3OiJObyB2aWRlbyBpbnB1dCBkZXZpY2VzIGFyZSBhdmFpbGFibGUiLDE2MDg6Ik5vIGF1ZGlvIG91dHB1dCBkZXZpY2VzIChzcGVha2VycykgYXJlIGF2YWlsYWJsZSIsMTYwOToiRmFpbGVkIHRvIGZldGNoIGxpc3Qgb2YgbWVkaWEgZGV2aWNlcyIsMTYxMDoiTm8gbWVkaWEgdHJhY2sgZXhpc3RzIiwxNjExOiJGYWlsZWQgdG8gdW5tdXRlIHRyYWNrIiwxNjEyOiJGYWlsZWQgdG8gZ2V0IHNjcmVlbnNoYXJlIHRyYWNrcyIsMTcwMToiQ3J5cHRvIGVycm9yIiwxODAwOiJJbnRlcm5hbCBleGNlcHRpb24iLDE4MDE6IkNhbid0IGZldGNoIHRyYW5zY3JpcHQgZmlsZSIsMTkwMDoiSW50ZXJuYWwgZXhjZXB0aW9uIiwxOTAxOiJQZXJtaXNzaW9uIGRlbmllZC4iLDE5MDI6IkxpdmVzdHJlYW0gdGhhdCBoYXMgbm90IHlldCBzdGFydGVkLCBjYW4ndCBiZSBzdG9wcGVkIiwyZTM6IkludGVybmFsIGV4Y2VwdGlvbiIsMjAwMToiUGVybWlzc2lvbiBkZW5pZWQiLDIwMDI6IlVuc3VwcG9ydGVkIiwyMDAzOiJTdGFnZSBpcyBkaXNhYmxlZCIsMjAwNDoiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZCIsMjAwNToiQWN0aW9uIG5vdCBwZXJtaXR0ZWQgd2l0aG91dCBqb2luaW5nIHJvb20iLDIwMDY6IkFjdGlvbiBub3QgcGVybWl0dGVkIGluIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIiw5OTAwOiJJbnRlcm5hbCBleGNlcHRpb24ifTtPYmplY3Qua2V5cyhkdCkuZm9yRWFjaChyPT57ZHRbcl09YHskeyRpW3Iuc2xpY2UoMCwyKV19fSAke2R0W3JdfWB9KTtjbGFzcyBHaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUscyxuPXZvaWQgMCxpPSExKXtzdXBlcihlKTtwKHRoaXMsImNvZGUiKTt0aGlzLmNvZGU9cyx0aGlzLm5hbWU9IkNsaWVudEVycm9yIjtjb25zdCBhPXRoaXMuY29kZT9gW0VSUiR7dGhpcy5jb2RlfV1gOiJbRVJSXSIsbD10aGlzLmNvZGU/ZHRbdGhpcy5jb2RlXToiIjt0aGlzLm1lc3NhZ2U9YCR7YX06ICR7bH0KJHt0aGlzLm1lc3NhZ2V9YDt0cnl7bGV0IG89aSYmISFuO3MmJnMuZW5kc1dpdGgoIjAwIikmJm4mJihvPSEwKSxvJiZuLmVycm9yKCJDbGllbnRFcnJvciIse2Vycm9yOnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxjb2RlOnN9fSk7Y29uc3QgbT1UZS5nZXRDb250ZXh0KFRlLmdldE1vc3RSZWNlbnRQZWVySWQoKSk7aWYobSl7Y29uc3QgZz1tLmdldFZhbHVlKCJvbkVycm9yIik7dHJ5e2codGhpcyl9Y2F0Y2goeSl7fX10eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJDbGllbnRFcnJvciIse2RldGFpbDp0aGlzfSkpfWNhdGNoKG8pe319fXZhciBsZT0ocj0+KHJbci5JbnZhbGlkS2V5PTBdPSJJbnZhbGlkS2V5IixyW3IuTWlzc2luZ0tleT0xXT0iTWlzc2luZ0tleSIscltyLkludGVybmFsRXJyb3I9Ml09IkludGVybmFsRXJyb3IiLHIpKShsZXx8e30pO2NsYXNzIHVlIGV4dGVuZHMgR2l7Y29uc3RydWN0b3IoZSxzPTIpe3N1cGVyKGUsIjE3MDEiKTtwKHRoaXMsInJlYXNvbiIpO3RoaXMucmVhc29uPXN9fWNsYXNzICRyIGV4dGVuZHMgei5FdmVudEVtaXR0ZXJ7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTtwKHRoaXMsImxvZ2dlciIpO3RoaXMubG9nZ2VyPWUsc3VwZXIuc2V0TWF4TGlzdGVuZXJzKDI1KX1lbWl0KGUsLi4ucyl7cmV0dXJuIHN1cGVyLmVtaXQoIioiLGUsLi4ucyksc3VwZXIuZW1pdChlLC4uLnMpfW9uKGUscyl7dmFyIG47dHJ5e2NvbnN0IGk9dGhpcy5saXN0ZW5lckNvdW50KGUpO2k+MjUmJmklMjU9PT0wJiYoKG49dGhpcy5sb2dnZXIpPT1udWxsfHxuLndhcm4oIkN1c3RvbUV2ZW50RW1pdHRlcjo6bWF4TGlzdGVuZXJzRXhjZWVkZWQiLHtldmVudExpc3RlbmVyOntldmVudE5hbWU6ZS50b1N0cmluZygpLGxpc3RlbmVyQ291bnQ6dGhpcy5saXN0ZW5lckNvdW50KGUpfX0pKX1jYXRjaChpKXt9cmV0dXJuIHN1cGVyLm9uKGUscyl9YWRkTGlzdGVuZXIoZSxzKXt2YXIgbjt0cnl7Y29uc3QgaT10aGlzLmxpc3RlbmVyQ291bnQoZSk7aT4yNSYmaSUyNT09PTAmJigobj10aGlzLmxvZ2dlcik9PW51bGx8fG4ud2FybigiQ3VzdG9tRXZlbnRFbWl0dGVyOjptYXhMaXN0ZW5lcnNFeGNlZWRlZCIse2V2ZW50TGlzdGVuZXI6e2V2ZW50TmFtZTplLnRvU3RyaW5nKCksbGlzdGVuZXJDb3VudDp0aGlzLmxpc3RlbmVyQ291bnQoZSl9fSkpfWNhdGNoKGkpe31yZXR1cm4gc3VwZXIuYWRkTGlzdGVuZXIoZSxzKX1vZmYoZSxzKXtyZXR1cm4gc3VwZXIub2ZmKGUscyl9b25jZShlLHMpe3JldHVybiBzdXBlci5vbmNlKGUscyl9cHJlcGVuZExpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnByZXBlbmRMaXN0ZW5lcihlLHMpfXByZXBlbmRPbmNlTGlzdGVuZXIoZSxzKXtyZXR1cm4gc3VwZXIucHJlcGVuZE9uY2VMaXN0ZW5lcihlLHMpfXJlbW92ZUxpc3RlbmVyKGUscyl7cmV0dXJuIHN1cGVyLnJlbW92ZUxpc3RlbmVyKGUscyl9cmVtb3ZlQWxsTGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSl9bGlzdGVuZXJzKGUpe3JldHVybiBzdXBlci5saXN0ZW5lcnMoZSl9bGlzdGVuZXJDb3VudChlKXtyZXR1cm4gc3VwZXIubGlzdGVuZXJDb3VudChlKX19Y29uc3QgQ3Q9e0Vycm9yOiJjcnlwdG9yRXJyb3IifTtmdW5jdGlvbiBZaShyKXtyZXR1cm4idHlwZSJpbiByfWZ1bmN0aW9uIHFpKHMpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihyLHQ9e25hbWU6TH0sZT0iZW5jcnlwdCIpe3JldHVybiBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IixyLHQsITEsZT09PSJkZXJpdmUiP1siZGVyaXZlQml0cyIsImRlcml2ZUtleSJdOlsiZW5jcnlwdCIsImRlY3J5cHQiXSl9KX1mdW5jdGlvbiBHcihyLHQpe2NvbnN0IHM9bmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQpO3N3aXRjaChyKXtjYXNlIkhLREYiOnJldHVybntuYW1lOiJIS0RGIixzYWx0OnMsaGFzaDoiU0hBLTI1NiIsaW5mbzpuZXcgQXJyYXlCdWZmZXIoMTI4KX07Y2FzZSJQQktERjIiOnJldHVybntuYW1lOiJQQktERjIiLHNhbHQ6cyxoYXNoOiJTSEEtMjU2IixpdGVyYXRpb25zOjFlNX07ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYGFsZ29yaXRobSAke3J9IGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZGApfX1mdW5jdGlvbiBZcihyLHQpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCkscz15aWVsZCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleShlLHIse25hbWU6TCxsZW5ndGg6MTI4fSwhMSxbImVuY3J5cHQiLCJkZWNyeXB0Il0pO3JldHVybnttYXRlcmlhbDpyLGVuY3J5cHRpb25LZXk6c319KX1mdW5jdGlvbiBRaShyLHQpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCBlPUdyKHIuYWxnb3JpdGhtLm5hbWUsdCk7cmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVyaXZlQml0cyhlLHIsMjU2KX0pfWNsYXNzIEppIGV4dGVuZHMgJHJ7fWNsYXNzIHFyIGV4dGVuZHMgSml7Y29uc3RydWN0b3IoZSl7dmFyIHM7c3VwZXIodm9pZCAwKTtwKHRoaXMsInNlbmRDb3VudHMiKTtwKHRoaXMsImlzS2V5SW52YWxpZCIsITEpO3AodGhpcywicGFydGljaXBhbnRJZCIpO3AodGhpcywidHJhY2tJZCIpO3AodGhpcywia2V5cyIpO3AodGhpcywidmlkZW9Db2RlYyIpO3AodGhpcywicnRwTWFwIik7cCh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTtwKHRoaXMsInVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlciIpO3RoaXMuc2VuZENvdW50cz1uZXcgTWFwLHRoaXMua2V5cz1lLmtleXMsdGhpcy5wYXJ0aWNpcGFudElkPWUucGFydGljaXBhbnRJZCx0aGlzLnJ0cE1hcD1uZXcgTWFwLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zPWUua2V5UHJvdmlkZXJPcHRpb25zLHRoaXMudW5lbmNyeXB0ZWRGcmFtZUJ5dGVUcmFpbGVyPShzPWUudW5lbmNyeXB0ZWRGcmFtZUJ5dGVzKSE9bnVsbD9zOm5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSgiTEtST0NLUyIpfXNldFBhcnRpY2lwYW50KGUscyl7dGhpcy5wYXJ0aWNpcGFudElkPWUsdGhpcy5rZXlzPXN9dW5zZXRQYXJ0aWNpcGFudCgpe3RoaXMucGFydGljaXBhbnRJZD12b2lkIDB9Z2V0UGFydGljaXBhbnRJZCgpe3JldHVybiB0aGlzLnBhcnRpY2lwYW50SWR9Z2V0VHJhY2tJZCgpe3JldHVybiB0aGlzLnRyYWNrSWR9c2V0VmlkZW9Db2RlYyhlKXt0aGlzLnZpZGVvQ29kZWM9ZX1zZXRSdHBNYXAoZSl7dGhpcy5ydHBNYXA9ZX1zZXR1cFRyYW5zZm9ybShlLHMsbixpLGEpe2EmJih0aGlzLnZpZGVvQ29kZWM9YSk7Y29uc3QgbD1lPT09ImVuY29kZSI/dGhpcy5lbmNvZGVGdW5jdGlvbjp0aGlzLmRlY29kZUZ1bmN0aW9uLG89bmV3IFRyYW5zZm9ybVN0cmVhbSh7dHJhbnNmb3JtOmwuYmluZCh0aGlzKX0pO3MucGlwZVRocm91Z2gobykucGlwZVRvKG4pLmNhdGNoKG09Pnt0aGlzLmVtaXQoImNyeXB0b3JFcnJvciIsbSBpbnN0YW5jZW9mIHVlP206bmV3IHVlKG0ubWVzc2FnZSkpfSksdGhpcy50cmFja0lkPWl9ZW5jb2RlRnVuY3Rpb24oZSxzKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dmFyIGE7aWYoIXRoaXMua2V5cy5pc0VuYWJsZWQoKXx8ZS5kYXRhLmJ5dGVMZW5ndGg9PT0wKXJldHVybiBzLmVucXVldWUoZSk7Y29uc3R7ZW5jcnlwdGlvbktleTpufT10aGlzLmtleXMuZ2V0S2V5U2V0KCksaT10aGlzLmtleXMuZ2V0Q3VycmVudEtleUluZGV4KCk7aWYobil7Y29uc3QgbD10aGlzLm1ha2VJVigoYT1lLmdldE1ldGFkYXRhKCkuc3luY2hyb25pemF0aW9uU291cmNlKSE9bnVsbD9hOi0xLGUudGltZXN0YW1wKSxvPW5ldyBVaW50OEFycmF5KGUuZGF0YSwwLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSksbT1uZXcgVWludDhBcnJheSgyKTttWzBdPW9lLG1bMV09aTt0cnl7Y29uc3QgZz15aWVsZCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6TCxpdjpsLGFkZGl0aW9uYWxEYXRhOm5ldyBVaW50OEFycmF5KGUuZGF0YSwwLG8uYnl0ZUxlbmd0aCl9LG4sbmV3IFVpbnQ4QXJyYXkoZS5kYXRhLHRoaXMuZ2V0VW5lbmNyeXB0ZWRCeXRlcyhlKSkpLHk9bmV3IEFycmF5QnVmZmVyKG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrbC5ieXRlTGVuZ3RoK20uYnl0ZUxlbmd0aCksVD1uZXcgVWludDhBcnJheSh5KTtyZXR1cm4gVC5zZXQobyksVC5zZXQobmV3IFVpbnQ4QXJyYXkoZyksby5ieXRlTGVuZ3RoKSxULnNldChuZXcgVWludDhBcnJheShsKSxvLmJ5dGVMZW5ndGgrZy5ieXRlTGVuZ3RoKSxULnNldChtLG8uYnl0ZUxlbmd0aCtnLmJ5dGVMZW5ndGgrbC5ieXRlTGVuZ3RoKSxlLmRhdGE9eSxzLmVucXVldWUoZSl9Y2F0Y2goZyl7fX1lbHNlIHRoaXMuZW1pdChDdC5FcnJvcixuZXcgdWUoImVuY3J5cHRpb24ga2V5IG1pc3NpbmcgZm9yIGVuY29kaW5nIixsZS5NaXNzaW5nS2V5KSl9KX1kZWNvZGVGdW5jdGlvbihlLHMpe3JldHVybiBJKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtpZighdGhpcy5rZXlzLmlzRW5hYmxlZCgpfHxlLmRhdGEuYnl0ZUxlbmd0aD09PTB8fFhpKGUuZGF0YSx0aGlzLnVuZW5jcnlwdGVkRnJhbWVCeXRlVHJhaWxlcikpcmV0dXJuIHMuZW5xdWV1ZShlKTtjb25zdCBpPW5ldyBVaW50OEFycmF5KGUuZGF0YSlbZS5kYXRhLmJ5dGVMZW5ndGgtMV07aWYodGhpcy5rZXlzLmdldEtleVNldChpKSl0cnl7Y29uc3QgYT15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLGkpO2lmKGEpcmV0dXJuIHMuZW5xdWV1ZShhKTt0aGlzLmlzS2V5SW52YWxpZD0hMX1jYXRjaChhKXthIGluc3RhbmNlb2YgdWUmJmEucmVhc29uPT09bGUuSW52YWxpZEtleSYmKHRoaXMuaXNLZXlJbnZhbGlkfHwodGhpcy5lbWl0KEN0LkVycm9yLG5ldyB1ZShgaW52YWxpZCBrZXkgZm9yIHBhcnRpY2lwYW50ICR7dGhpcy5wYXJ0aWNpcGFudElkfWAsbGUuSW52YWxpZEtleSkpLHRoaXMuaXNLZXlJbnZhbGlkPSEwKSl9ZWxzZSB0aGlzLmVtaXQoQ3QuRXJyb3IsbmV3IHVlKGBrZXkgbWlzc2luZyBmb3IgcGFydGljaXBhbnQgJHt0aGlzLnBhcnRpY2lwYW50SWR9YCxsZS5NaXNzaW5nS2V5KSk7cmV0dXJuIHMuZW5xdWV1ZShlKX0pfWRlY3J5cHRGcmFtZShhLGwpe3JldHVybiBJKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKihlLHMsbj12b2lkIDAsaT17cmF0Y2hldENvdW50OjB9KXt2YXIgbTtjb25zdCBvPXRoaXMua2V5cy5nZXRLZXlTZXQocyk7dHJ5e2NvbnN0IGc9bmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsdGhpcy5nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpKSx5PW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC0yLDIpLFQ9eVswXSxCPW5ldyBVaW50OEFycmF5KGUuZGF0YSxlLmRhdGEuYnl0ZUxlbmd0aC1ULXkuYnl0ZUxlbmd0aCxUKSxVPWcuYnl0ZUxlbmd0aCxZPWUuZGF0YS5ieXRlTGVuZ3RoLShnLmJ5dGVMZW5ndGgrVCt5LmJ5dGVMZW5ndGgpLCQ9eWllbGQgY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOkwsaXY6QixhZGRpdGlvbmFsRGF0YTpuZXcgVWludDhBcnJheShlLmRhdGEsMCxnLmJ5dGVMZW5ndGgpfSwobT1pLmVuY3J5cHRpb25LZXkpIT1udWxsP206by5lbmNyeXB0aW9uS2V5LG5ldyBVaW50OEFycmF5KGUuZGF0YSxVLFkpKSxpZT1uZXcgQXJyYXlCdWZmZXIoZy5ieXRlTGVuZ3RoKyQuYnl0ZUxlbmd0aCksYWU9bmV3IFVpbnQ4QXJyYXkoaWUpO3JldHVybiBhZS5zZXQobmV3IFVpbnQ4QXJyYXkoZS5kYXRhLDAsZy5ieXRlTGVuZ3RoKSksYWUuc2V0KG5ldyBVaW50OEFycmF5KCQpLGcuYnl0ZUxlbmd0aCksZS5kYXRhPWllLGV9Y2F0Y2goZyl7aWYodGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemU+MCl7aWYoaS5yYXRjaGV0Q291bnQ8dGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFdpbmRvd1NpemUpe2xldCB5O2lmKG89PT10aGlzLmtleXMuZ2V0S2V5U2V0KHMpKXtjb25zdCBCPXlpZWxkIHRoaXMua2V5cy5yYXRjaGV0S2V5KHMsITEpO3k9eWllbGQgWXIoQix0aGlzLmtleVByb3ZpZGVyT3B0aW9ucy5yYXRjaGV0U2FsdCl9Y29uc3QgVD15aWVsZCB0aGlzLmRlY3J5cHRGcmFtZShlLHMsbnx8byx7cmF0Y2hldENvdW50OmkucmF0Y2hldENvdW50KzEsZW5jcnlwdGlvbktleTp5PT1udWxsP3ZvaWQgMDp5LmVuY3J5cHRpb25LZXl9KTtyZXR1cm4gVCYmeSYmKHRoaXMua2V5cy5zZXRLZXlTZXQoeSxzLCEwKSx0aGlzLmtleXMuc2V0Q3VycmVudEtleUluZGV4KHMpKSxUfW4mJnRoaXMua2V5cy5zZXRLZXlGcm9tTWF0ZXJpYWwobi5tYXRlcmlhbCxzKX1lbHNlIHRocm93IG5ldyB1ZSgiRGVjcnlwdGlvbiBmYWlsZWQsIG1vc3QgbGlrZWx5IGJlY2F1c2Ugb2YgYW4gaW52YWxpZCBrZXkiLGxlLkludmFsaWRLZXkpfX0pfW1ha2VJVihlLHMpe3ZhciBsO2NvbnN0IG49bmV3IEFycmF5QnVmZmVyKG9lKSxpPW5ldyBEYXRhVmlldyhuKTt0aGlzLnNlbmRDb3VudHMuaGFzKGUpfHx0aGlzLnNlbmRDb3VudHMuc2V0KGUsTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjY1NTM1KSk7Y29uc3QgYT0obD10aGlzLnNlbmRDb3VudHMuZ2V0KGUpKSE9bnVsbD9sOjA7cmV0dXJuIGkuc2V0VWludDMyKDAsZSksaS5zZXRVaW50MzIoNCxzKSxpLnNldFVpbnQzMig4LHMtYSU2NTUzNSksdGhpcy5zZW5kQ291bnRzLnNldChlLGErMSksbn1nZXRVbmVuY3J5cHRlZEJ5dGVzKGUpe3ZhciBzO2lmKFlpKGUpKXtjb25zdCBuPShzPXRoaXMuZ2V0VmlkZW9Db2RlYyhlKSkhPW51bGw/czp0aGlzLnZpZGVvQ29kZWM7aWYobj09PSJhdjEifHxuPT09InZwOSIpdGhyb3cgbmV3IEVycm9yKGAke259IGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGZvciBlbmQgdG8gZW5kIGVuY3J5cHRpb25gKTtyZXR1cm4gQVtlLnR5cGVdfXJldHVybiBBLmF1ZGlvfWdldFZpZGVvQ29kZWMoZSl7aWYodGhpcy5ydHBNYXAuc2l6ZT09PTApcmV0dXJuO2NvbnN0e3BheWxvYWRUeXBlOnN9PWUuZ2V0TWV0YWRhdGEoKTtyZXR1cm4gcz90aGlzLnJ0cE1hcC5nZXQocyk6dm9pZCAwfX1mdW5jdGlvbiBYaShyLHQpe2NvbnN0IGU9bmV3IFVpbnQ4QXJyYXkoci5zbGljZShyLmJ5dGVMZW5ndGgtdC5ieXRlTGVuZ3RoKSk7cmV0dXJuIHQuZXZlcnkoKHMsbik9PnM9PT1lW25dKX1jbGFzcyBRciBleHRlbmRzICRye2NvbnN0cnVjdG9yKGUscyxuKXtzdXBlcih2b2lkIDApO3AodGhpcywiY3VycmVudEtleUluZGV4Iik7cCh0aGlzLCJjcnlwdG9LZXlSaW5nIik7cCh0aGlzLCJlbmFibGVkIik7cCh0aGlzLCJrZXlQcm92aWRlck9wdGlvbnMiKTtwKHRoaXMsInJhdGNoZXRQcm9taXNlTWFwIik7cCh0aGlzLCJwYXJ0aWNpcGFudElkIik7dGhpcy5jdXJyZW50S2V5SW5kZXg9MCx0aGlzLmNyeXB0b0tleVJpbmc9bmV3IEFycmF5KDE2KSx0aGlzLmVuYWJsZWQ9cyx0aGlzLmtleVByb3ZpZGVyT3B0aW9ucz1uLHRoaXMucmF0Y2hldFByb21pc2VNYXA9bmV3IE1hcCx0aGlzLnBhcnRpY2lwYW50SWQ9ZX1zZXRFbmFibGVkKGUpe3RoaXMuZW5hYmxlZD1lfXJhdGNoZXRLZXkoZSxzPSEwKXtjb25zdCBuPWUhPW51bGw/ZTp0aGlzLmdldEN1cnJlbnRLZXlJbmRleCgpLGk9bixhPXRoaXMucmF0Y2hldFByb21pc2VNYXAuZ2V0KGkpO2lmKHR5cGVvZiBhIT0idW5kZWZpbmVkIilyZXR1cm4gYTtjb25zdCBsPW5ldyBQcm9taXNlKChvLG0pPT5JKHRoaXMsbnVsbCxmdW5jdGlvbiooKXt0cnl7Y29uc3QgZz10aGlzLmdldEtleVNldChpKS5tYXRlcmlhbCx5PXlpZWxkIHFpKHlpZWxkIFFpKGcsdGhpcy5rZXlQcm92aWRlck9wdGlvbnMucmF0Y2hldFNhbHQpLGcuYWxnb3JpdGhtLm5hbWUsImRlcml2ZSIpO3MmJnRoaXMuc2V0S2V5RnJvbU1hdGVyaWFsKHksaSwhMCksdGhpcy5lbWl0KCJrZXlSYXRjaGV0ZWQiLHksbix0aGlzLnBhcnRpY2lwYW50SWQpLG8oeSl9Y2F0Y2goZyl7bShnKX1maW5hbGx5e3RoaXMucmF0Y2hldFByb21pc2VNYXAuZGVsZXRlKGkpfX0pKTtyZXR1cm4gdGhpcy5yYXRjaGV0UHJvbWlzZU1hcC5zZXQoaSxsKSxsfXNldEtleUZyb21NYXRlcmlhbChlLHM9MCxuPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7cz49MCYmKHRoaXMuY3VycmVudEtleUluZGV4PXMldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aCk7Y29uc3QgaT15aWVsZCBZcihlLHRoaXMua2V5UHJvdmlkZXJPcHRpb25zLnJhdGNoZXRTYWx0KTt0aGlzLnNldEtleVNldChpLHRoaXMuY3VycmVudEtleUluZGV4LG4pfSl9c2V0S2V5U2V0KGUscyxuPSExKXtyZXR1cm4gSSh0aGlzLG51bGwsZnVuY3Rpb24qKCl7dGhpcy5jcnlwdG9LZXlSaW5nW3MldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aF09ZSxuJiZ0aGlzLmVtaXQoImtleVJhdGNoZXRlZCIsZS5tYXRlcmlhbCxzLHRoaXMucGFydGljaXBhbnRJZCl9KX1zZXRDdXJyZW50S2V5SW5kZXgoZSl7cmV0dXJuIEkodGhpcyxudWxsLGZ1bmN0aW9uKigpe3RoaXMuY3VycmVudEtleUluZGV4PWUldGhpcy5jcnlwdG9LZXlSaW5nLmxlbmd0aH0pfWlzRW5hYmxlZCgpe3JldHVybiB0aGlzLmVuYWJsZWR9Z2V0Q3VycmVudEtleUluZGV4KCl7cmV0dXJuIHRoaXMuY3VycmVudEtleUluZGV4fWdldEtleVNldChlKXtyZXR1cm4gdGhpcy5jcnlwdG9LZXlSaW5nW2UhPW51bGw/ZTp0aGlzLmN1cnJlbnRLZXlJbmRleF19fWNvbnN0IHd0PVtdLGt0PW5ldyBNYXAsTXQ9W107bGV0IG5lLEl0PSExLEpyPSExLF90LHBlPXB0O2Z1bmN0aW9uIGhlKHIsdCl7cG9zdE1lc3NhZ2Uoe2tpbmQ6ImxvZyIsZGF0YTp7bGV2ZWw6cixzdHI6dH19KX1mdW5jdGlvbiBaaShyLHQpe3Bvc3RNZXNzYWdlKHtraW5kOiJyYXRjaGV0S2V5IixkYXRhOntrZXlJbmRleDp0LG1hdGVyaWFsOnJ9fSl9ZnVuY3Rpb24gUmUocil7aWYoIXIpcmV0dXJuIG5lO2xldCB0PWt0LmdldChyKTtyZXR1cm4gdHx8KHQ9bmV3IFFyKHIsITAscGUpLF90JiZ0LnNldEtleUZyb21NYXRlcmlhbChfdCksa3Quc2V0KHIsdCkpLHR9ZnVuY3Rpb24gZWEocix0KXt0P1JlKHQpLnNldEVuYWJsZWQocik6KEl0PXIsbmUuc2V0RW5hYmxlZChyKSl9ZnVuY3Rpb24gWHIocil7ci5vbigiY3J5cHRvckVycm9yIix0PT57Y29uc3QgZT17a2luZDoiZXJyb3IiLGRhdGE6e2Vycm9yOm5ldyBFcnJvcihgJHtsZVt0LnJlYXNvbl19OiAke3QubWVzc2FnZX1gKX19O3Bvc3RNZXNzYWdlKGUpfSl9ZnVuY3Rpb24gQXQocix0KXtsZXQgZT13dC5maW5kKHM9PnMuZ2V0VHJhY2tJZCgpPT09dCk7aWYoZSlyIT09ZS5nZXRQYXJ0aWNpcGFudElkKCkmJmUuc2V0UGFydGljaXBhbnQocixSZShyKSk7ZWxzZXtpZihoZSgiaW5mbyIsYGNyZWF0aW5nIG5ldyBjcnlwdG9yIGZvciAke3J9YCksIXBlKXRocm93IEVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTtlPW5ldyBxcih7cGFydGljaXBhbnRJZDpyLGtleXM6UmUociksa2V5UHJvdmlkZXJPcHRpb25zOnBlfSksWHIoZSksd3QucHVzaChlKX1yZXR1cm4gZX1mdW5jdGlvbiBacihyKXtsZXQgdD1NdC5maW5kKGU9PmUuZ2V0VHJhY2tJZCgpPT09cik7aWYoIXQpe2lmKCFwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJNaXNzaW5nIGtleVByb3ZpZGVyIG9wdGlvbnMiKTt0PW5ldyBxcih7a2V5czpuZSxwYXJ0aWNpcGFudElkOiJwdWJsaXNoZXIiLGtleVByb3ZpZGVyT3B0aW9uczpwZX0pLFhyKHQpLE10LnB1c2godCl9cmV0dXJuIHR9ZnVuY3Rpb24gdGEocil7dmFyIHQ7KHQ9d3QuZmluZChlPT5lLmdldFRyYWNrSWQoKT09PXIpKT09bnVsbHx8dC51bnNldFBhcnRpY2lwYW50KCl9ZnVuY3Rpb24gcmEocix0KXtoZSgiZGVidWciLCJzZXR0aW5nIHNoYXJlZCBrZXkiKSxfdD1yLG5lPT1udWxsfHxuZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KTtmb3IoY29uc3RbLGVdb2Yga3QpZS5zZXRLZXlGcm9tTWF0ZXJpYWwocix0KX1vbm1lc3NhZ2U9cj0+e2NvbnN0e2tpbmQ6dCxkYXRhOmV9PXIuZGF0YTtzd2l0Y2godCl7Y2FzZSJpbml0IjpoZSgiaW5mbyIsIndvcmtlciBpbml0aWFsaXplZCIpLHBlPWUua2V5UHJvdmlkZXJPcHRpb25zLEpyPSEhZS5rZXlQcm92aWRlck9wdGlvbnMuc2hhcmVkS2V5O2NvbnN0IHM9e2tpbmQ6ImVuYWJsZSIsZGF0YTp7ZW5hYmxlZDpJdH19O25lPW5ldyBRcih2b2lkIDAsSXQscGUpLG5lLm9uKCJrZXlSYXRjaGV0ZWQiLFppKSxwb3N0TWVzc2FnZShzKTticmVhaztjYXNlImVuYWJsZSI6ZWEoZS5lbmFibGVkLGUucGFydGljaXBhbnRJZCksaGUoImluZm8iLCJ1cGRhdGVkIGUyZWUgZW5hYmxlZCBzdGF0dXMiKSxwb3N0TWVzc2FnZShyLmRhdGEpO2JyZWFrO2Nhc2UiZGVjb2RlIjpBdChlLnBhcnRpY2lwYW50SWQsZS50cmFja0lkKS5zZXR1cFRyYW5zZm9ybSh0LGUucmVhZGFibGVTdHJlYW0sZS53cml0YWJsZVN0cmVhbSxlLnRyYWNrSWQsZS5jb2RlYyk7YnJlYWs7Y2FzZSJlbmNvZGUiOlpyKGUudHJhY2tJZCkuc2V0dXBUcmFuc2Zvcm0odCxlLnJlYWRhYmxlU3RyZWFtLGUud3JpdGFibGVTdHJlYW0sZS50cmFja0lkLGUuY29kZWMpO2JyZWFrO2Nhc2Uic2V0S2V5IjpKcj8oaGUoImRlYnVnIiwic2V0IHNoYXJlZCBrZXkiKSxyYShlLmtleSxlLmtleUluZGV4KSk6ZS5wYXJ0aWNpcGFudElkP1JlKGUucGFydGljaXBhbnRJZCkuc2V0S2V5RnJvbU1hdGVyaWFsKGUua2V5LGUua2V5SW5kZXgpOmhlKCJlcnJvciIsIm5vIHBhcnRpY2lwYW50IElkIHdhcyBwcm92aWRlZCBhbmQgc2hhcmVkIGtleSB1c2FnZSBpcyBkaXNhYmxlZCIpO2JyZWFrO2Nhc2UicmVtb3ZlVHJhbnNmb3JtIjp0YShlLnRyYWNrSWQpO2JyZWFrO2Nhc2UidXBkYXRlQ29kZWMiOkF0KGUucGFydGljaXBhbnRJZCxlLnRyYWNrSWQpLnNldFZpZGVvQ29kZWMoZS5jb2RlYyk7YnJlYWs7Y2FzZSJzZXRSVFBNYXAiOk10LmZvckVhY2goYT0+e2Euc2V0UnRwTWFwKGUubWFwKX0pO2JyZWFrO2Nhc2UicmF0Y2hldFJlcXVlc3QiOlJlKGUucGFydGljaXBhbnRJZCkucmF0Y2hldEtleShlLmtleUluZGV4KTticmVha319LHNlbGYuUlRDVHJhbnNmb3JtRXZlbnQmJihoZSgiZGVidWciLCJzZXR1cCB0cmFuc2Zvcm0gZXZlbnQiKSxzZWxmLm9ucnRjdHJhbnNmb3JtPXI9Pntjb25zdHt0cmFuc2Zvcm1lcjp0fT1yO3QuaGFuZGxlZD0hMDtjb25zdHtraW5kOmUscGFydGljaXBhbnRJZDpzLHRyYWNrSWQ6bixjb2RlYzppfT10Lm9wdGlvbnM7KGU9PT0iZW5jb2RlIj9acihuKTpBdChzLG4pKS5zZXR1cFRyYW5zZm9ybShlLHQucmVhZGFibGUsdC53cml0YWJsZSxuLGkpfSl9KSgpOwo=",P=typeof window!="undefined"&&window.Blob&&new Blob([atob(ll)],{type:"text/javascript;charset=utf-8"});function Sl(){const Z=P&&(window.URL||window.webkitURL).createObjectURL(P);try{return Z?new Worker(Z):new Worker("data:application/javascript;base64,"+ll)}finally{Z&&(window.URL||window.webkitURL).revokeObjectURL(Z)}}var N,C,k,H,dl,I,cl,a,T,v,Ul,S,bl,U,Vl,t,Wl,o,Xl;class Zl extends ${constructor(l){super(void 0);p(this,N);p(this,H);p(this,I);p(this,a);p(this,v);p(this,S);p(this,U);p(this,t);p(this,o);R(this,"worker");R(this,"encryptionEnabled");R(this,"keyProvider");R(this,"peerSessionStore");R(this,"onWorkerMessage",l=>{const{kind:c,data:b}=l.data;switch(c){case"error":this.logger.error("error in worker",{error:b.error}),this.emit(E.Error,b.error);break;case"enable":this.encryptionEnabled!==b.enabled&&!b.participantId?this.encryptionEnabled=b.enabled:b.participantId,this.encryptionEnabled&&this.keyProvider.getKeys().forEach(V=>{Y(this,a,T).call(this,V)});break;case"ratchetKey":this.keyProvider.emit("keyRatcheted",b.material,b.keyIndex);break;case"log":this.logger&&this.logger[b.level](b.str);break}});p(this,k,l=>{this.logger.error("e2ee worker encountered an error:",{error:l.error}),this.emit(E.Error,l.error)});this.keyProvider=l.keyProvider,this.worker=new Sl,this.encryptionEnabled=!1}get isEnabled(){return this.encryptionEnabled}init(l,c){this.logger=l,this.peerSessionStore=c,this.setup()}setup(){if(!kl())throw new Error("tried to setup end-to-end encryption on an unsupported browser");this.logger.info("setting up e2ee"),Y(this,H,dl).call(this,this.keyProvider);const l={kind:"init",data:{keyProviderOptions:this.keyProvider.getOptions()}};this.worker&&(this.logger.info("initializing worker"),this.worker.onmessage=this.onWorkerMessage,this.worker.onerror=w(this,k),this.worker.postMessage(l)),Y(this,N,C).call(this,!0)}}N=new WeakSet,C=function(l,c){return J(this,null,function*(){if(this.logger.info(`set e2ee to ${l} for ${c||"self"}`),this.worker){const b={kind:"enable",data:{enabled:l,participantId:c}};this.worker.postMessage(b)}else throw new ReferenceError("failed to enable e2ee, worker is not ready")})},k=new WeakMap,H=new WeakSet,dl=function(l){this.peerSessionStore.on(i.NEW_CONSUMER,({appData:c,peerId:b})=>{c.e2ee&&Y(this,N,C).call(this,c.e2ee,b)}),this.peerSessionStore.on(i.E2EE_INACTIVE_CONSUMER,({peerId:c,trackId:b})=>{var W;const V={kind:"removeTransform",data:{participantId:c,trackId:b}};(W=this.worker)==null||W.postMessage(V)}),this.peerSessionStore.on(i.E2EE_ACTIVE_CONSUMER,({track:c,rtpReceiver:b,peerId:V})=>Y(this,S,bl).call(this,c,b,V)),this.peerSessionStore.on(i.E2EE_ACTIVE_PRODUCER,({track:c,rtpSender:b,appData:V})=>Y(this,U,Vl).call(this,c,b,V.peerId)),l.on("setKey",c=>Y(this,a,T).call(this,c)).on("ratchetRequest",(c,b)=>Y(this,I,cl).call(this,c,b))},I=new WeakSet,cl=function(l,c){if(!this.worker)throw Error("could not ratchet key, worker is missing");const b={kind:"ratchetRequest",data:{participantId:l,keyIndex:c}};this.worker.postMessage(b)},a=new WeakSet,T=function({key:l,participantId:c,keyIndex:b}){if(!this.worker)throw Error("could not set key, worker is missing");const V={kind:"setKey",data:{participantId:c,key:l,keyIndex:b}};this.worker.postMessage(V)},v=new WeakSet,Ul=function(l){if(!this.worker)throw Error("could not post rtp map, worker is missing");const c={kind:"setRTPMap",data:{map:l}};this.worker.postMessage(c)},S=new WeakSet,bl=function(l,c,b){Y(this,t,Wl).call(this,c,l.id,b)},U=new WeakSet,Vl=function(l,c,b){Y(this,o,Xl).call(this,c,l.id,b)},t=new WeakSet,Wl=function(l,c,b,V){return J(this,null,function*(){if(!this.worker)return;const W=l;if(x()){const X={kind:"decode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{if(F in W&&V){const u={kind:"updateCodec",data:{trackId:c,codec:V,participantId:b}};this.worker.postMessage(u);return}let X=W.writableStream,m=W.readableStream;if(!X||!m){const u=W.createEncodedStreams();W.writableStream=u.writable,X=u.writable,W.readableStream=u.readable,m=u.readable}const y={kind:"decode",data:{readableStream:m,writableStream:X,trackId:c,codec:V,participantId:b}};this.worker.postMessage(y,[m,X])}W[F]=!0})},o=new WeakSet,Xl=function(l,c,b,V){if(F in l||!this.worker)return;const W=l;if(x()){this.logger.warn("initialize script transform");const X={kind:"encode",participantId:b,trackId:c,codec:V};W.transform=new RTCRtpScriptTransform(this.worker,X)}else{this.logger.warn("initialize encoded streams");const X=W.createEncodedStreams(),m={kind:"encode",data:{readableStream:X.readable,writableStream:X.writable,codec:V,trackId:c,participantId:b||"publisher"}};this.worker.postMessage(m,[X.readable,X.writable])}W[F]=!0},R(Zl,"SharedKeyProvider",Il);module.exports=Zl;
|